From 4e236a15226b5341cebc480c4798069b9f90919a Mon Sep 17 00:00:00 2001 From: 闫增涛 <1829501689@qq.com> Date: 星期三, 06 十一月 2024 17:04:40 +0800 Subject: [PATCH] Merge branch 'master' of http://182.92.203.7:2001/r/testbookLayout --- public/static/modelView/js/Detector.js | 78 src/books/artAndDrama/view/components/chapter004.vue | 2 src/books/civilAviation/assets/images/fengdi.png | 0 public/static/modelView/fonts/fontawesome-webfont.eot | 0 public/static/modelView/images/colour_pick.png | 0 public/static/modelView/js/three.js | 39472 ++++++++++++++++++++++ src/books/civilAviation/view/components/chapter004.vue | 463 public/static/modelView/css/spectrum.css | 507 src/books/civilAviation/assets/images/0080-02.jpg | 0 src/books/civilAviation/assets/images/0075-01.jpg | 0 public/static/modelView/images/glow_icon.png | 0 public/static/modelView/images/ambient_icon.png | 0 public/static/modelView/js/TransformControls.js | 1147 public/static/modelView/images/phong_icon.png | 0 src/books/civilAviation/assets/images/0123-01.jpg | 0 src/books/civilAviation/assets/images/0071-01.jpg | 0 public/static/modelView/fonts/fontawesome-webfont.ttf | 0 public/static/modelView/fonts/FontAwesome_Regular.json | 1 public/static/modelView/js/loaders/inflate.min.js | 28 public/static/modelView/images/fullscreen.png | 0 public/static/modelView/js/jquery.nicescroll.js | 3471 + src/books/civilAviation/assets/images/0071-04.jpg | 0 public/static/modelView/images/rotation.png | 0 src/books/civilAviation/view/components/index.vue | 24 public/static/modelView/images/grid.png | 0 src/books/civilAviation/view/components/chapter001.vue | 1162 src/components/choice/choice.vue | 14 public/static/modelView/LICENSE | 21 public/static/modelView/images/folder_icon.png | 0 public/static/modelView/js/screenfull.min.js | 7 src/books/civilAviation/assets/images/0118-02.jpg | 0 public/static/modelView/images/XRay.png | 0 public/static/modelView/js/effects/EffectComposer.js | 189 public/static/modelView/images/glowing.png | 0 public/static/modelView/js/jquery.min.js | 4 src/books/artAndDrama/view/components/chapter003.vue | 10 public/static/modelView/favicon.ico | 0 src/components/pdfview/index.vue | 175 public/static/modelView/fonts/FontAwesome.otf | 0 public/static/modelView/js/loaders/STLLoader.js | 323 src/books/civilAviation/assets/images/0092-02.jpg | 0 public/static/modelView/js/three.min.js | 838 src/books/civilAviation/view/components/chapter003.vue | 1143 public/static/modelView/fonts/fontawesome-webfont.woff2 | 0 public/static/modelView/js/userModelTextures.js | 387 public/static/modelView/js/effects/CopyShader.js | 46 src/books/artAndDrama/view/components/chapter001.vue | 4 src/books/civilAviation/assets/images/0078-02.jpg | 0 public/static/modelView/images/wireframe_cube.png | 0 src/books/civilAviation/assets/images/0194-02.jpg | 0 public/static/modelView/js/THREEx.FullScreen.js | 107 src/books/civilAviation/assets/images/0111-01.jpg | 0 public/static/modelView/js/effects/SSAARenderPass.js | 180 src/books/civilAviation/assets/images/0123-02.jpg | 0 public/static/modelView/css/font-awesome.min.css | 2336 + public/static/modelView/index.html | 617 public/static/modelView/js/loaders/DDSLoader.js | 269 public/static/modelView/js/jqueryUI.js | 19046 ++++++++++ src/books/civilAviation/view/components/chapter005.vue | 2070 + public/static/modelView/fonts/fontawesome-webfont.woff | 0 src/books/civilAviation/assets/images/0120-02.jpg | 0 public/static/modelView/js/loaders/MTLLoader.js | 533 src/books/civilAviation/assets/images/0194-04.jpg | 0 public/static/modelView/js/Projector.js | 1028 src/books/civilAviation/assets/images/0071-02.jpg | 0 public/static/modelView/js/DDSLoader.js | 269 public/static/modelView/js/ColourTheme.js | 162 public/static/modelView/js/THREEx.WindowResize.js | 45 public/static/modelView/README.md | 31 src/books/civilAviation/assets/images/0099-01.jpg | 0 public/static/modelView/css/jquery-ui.css | 1656 public/static/modelView/images/dir_light_icon.png | 0 src/books/civilAviation/assets/images/0075-02.jpg | 0 src/books/civilAviation/assets/images/0080-01.jpg | 0 public/static/modelView/fonts/fontawesome-webfont.svg | 2671 + public/static/modelView/js/menu.js | 115 public/static/modelView/js/effects/FXAAShader.js | 1115 src/books/civilAviation/assets/images/0118-01.jpg | 0 public/static/modelView/js/OrbitControls.js | 1037 src/books/civilAviation/assets/images/0078-03.jpg | 0 src/books/civilAviation/assets/images/0111-02.jpg | 0 public/static/modelView/js/utils.js | 579 src/books/civilAviation/assets/images/0099-02.jpg | 0 src/books/civilAviation/assets/images/0071-05.jpg | 0 public/static/modelView/js/effects/OutlinePass.js | 571 public/static/modelView/js/effects/RenderPass.js | 63 src/books/civilAviation/assets/main.less | 318 src/books/civilAviation/assets/images/0071-03.jpg | 0 public/static/modelView/js/loaders/ColladaLoader.js | 3889 ++ src/books/artAndDrama/assets/main.less | 44 src/books/civilAviation/assets/images/0194-01.jpg | 0 public/static/modelView/images/scale.png | 0 public/static/modelView/js/loaders/GLTFLoader.js | 3166 + public/static/modelView/js/loaders/OBJLoader.js | 670 public/static/modelView/css/main_style.css | 618 src/books/civilAviation/assets/images/0092-03.jpg | 0 public/static/modelView/js/CanvasRenderer.js | 1158 public/static/modelView/js/main.js | 573 src/books/civilAviation/assets/images/0092-01.jpg | 0 public/static/modelView/images/smoothed.png | 0 src/books/civilAviation/assets/images/0078-01.jpg | 0 src/books/civilAviation/assets/images/0194-03.jpg | 0 public/static/modelView/js/spectrum.js | 2255 + src/books/civilAviation/assets/images/0120-01.jpg | 0 src/books/artAndDrama/view/components/chapter002.vue | 4 public/static/modelView/js/loaders/FBXLoader.js | 4015 ++ public/static/modelView/js/effects/ShaderPass.js | 67 public/static/modelView/js/userModel.js | 448 src/App.vue | 2 src/books/civilAviation/view/components/chapter002.vue | 4485 ++ 110 files changed, 105,474 insertions(+), 254 deletions(-) diff --git a/public/static/modelView/LICENSE b/public/static/modelView/LICENSE new file mode 100644 index 0000000..1f1aa54 --- /dev/null +++ b/public/static/modelView/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Adam James + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/public/static/modelView/README.md b/public/static/modelView/README.md new file mode 100644 index 0000000..476d955 --- /dev/null +++ b/public/static/modelView/README.md @@ -0,0 +1,31 @@ +# Three.js-Model-Viewer +An application using the Three.js library to allow user to load model files and view them online with multiple viewing options. + +<b>Loading Models:</b> +- Choice of inputs, either load model or load model + textures +- Models and textures can be dragged and dropped onto the viewer +- Current formats supported: <b>.obj</b> or obj+mtl(and textures), <b>.dae</b> or dae (+textures), <b>.stl</b>, + <b>GLTF (+textures)</b> and <b>FBX (+textures)</b> + +- If loading a model and textures, make sure the model file and texture files are in the same folder on your system + +<b>Features:</b> +- View sample models from dropdown list +- View model information (name of model, number of vertices and faces) +- Add ambient light and alter the colour +- Alter the colour of the directional Ligt +- View model in wireframe model and model+wireframe mode +- Apply phong shading mode and increase/decrease the shininess level +- View model in x-ray +- Apply glow outline pass to the model and set the edge colour of the glow +- Set background colour of the renderer +- Auto-rotate the model and adjust the rotation speed +- Add transform controls (when selected, press S:scale, T:translate and R:rotate) +- Scale the model up and down +- Add view helpers such as bounding box, square/circular grid underneath model and an axis + +<b>Potential Features:</b> +- Support morph targets +- ZIP file support + +<h2><a href="https://adjam93.github.io/threejs-model-viewer/" target="_blank">View the Project Online</a></h2> diff --git a/public/static/modelView/css/font-awesome.min.css b/public/static/modelView/css/font-awesome.min.css new file mode 100644 index 0000000..8d8cc86 --- /dev/null +++ b/public/static/modelView/css/font-awesome.min.css @@ -0,0 +1,2336 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: + url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), + url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), + url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), + url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), + url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: 0.2em 0.25em 0.15em; + border: solid 0.08em #eee; + border-radius: 0.1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: 0.3em; +} +.fa.fa-pull-right { + margin-left: 0.3em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: 0.3em; +} +.fa.pull-right { + margin-left: 0.3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=1)'; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2)'; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)'; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)'; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)'; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #fff; +} +.fa-glass:before { + content: '\f000'; +} +.fa-music:before { + content: '\f001'; +} +.fa-search:before { + content: '\f002'; +} +.fa-envelope-o:before { + content: '\f003'; +} +.fa-heart:before { + content: '\f004'; +} +.fa-star:before { + content: '\f005'; +} +.fa-star-o:before { + content: '\f006'; +} +.fa-user:before { + content: '\f007'; +} +.fa-film:before { + content: '\f008'; +} +.fa-th-large:before { + content: '\f009'; +} +.fa-th:before { + content: '\f00a'; +} +.fa-th-list:before { + content: '\f00b'; +} +.fa-check:before { + content: '\f00c'; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: '\f00d'; +} +.fa-search-plus:before { + content: '\f00e'; +} +.fa-search-minus:before { + content: '\f010'; +} +.fa-power-off:before { + content: '\f011'; +} +.fa-signal:before { + content: '\f012'; +} +.fa-gear:before, +.fa-cog:before { + content: '\f013'; +} +.fa-trash-o:before { + content: '\f014'; +} +.fa-home:before { + content: '\f015'; +} +.fa-file-o:before { + content: '\f016'; +} +.fa-clock-o:before { + content: '\f017'; +} +.fa-road:before { + content: '\f018'; +} +.fa-download:before { + content: '\f019'; +} +.fa-arrow-circle-o-down:before { + content: '\f01a'; +} +.fa-arrow-circle-o-up:before { + content: '\f01b'; +} +.fa-inbox:before { + content: '\f01c'; +} +.fa-play-circle-o:before { + content: '\f01d'; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: '\f01e'; +} +.fa-refresh:before { + content: '\f021'; +} +.fa-list-alt:before { + content: '\f022'; +} +.fa-lock:before { + content: '\f023'; +} +.fa-flag:before { + content: '\f024'; +} +.fa-headphones:before { + content: '\f025'; +} +.fa-volume-off:before { + content: '\f026'; +} +.fa-volume-down:before { + content: '\f027'; +} +.fa-volume-up:before { + content: '\f028'; +} +.fa-qrcode:before { + content: '\f029'; +} +.fa-barcode:before { + content: '\f02a'; +} +.fa-tag:before { + content: '\f02b'; +} +.fa-tags:before { + content: '\f02c'; +} +.fa-book:before { + content: '\f02d'; +} +.fa-bookmark:before { + content: '\f02e'; +} +.fa-print:before { + content: '\f02f'; +} +.fa-camera:before { + content: '\f030'; +} +.fa-font:before { + content: '\f031'; +} +.fa-bold:before { + content: '\f032'; +} +.fa-italic:before { + content: '\f033'; +} +.fa-text-height:before { + content: '\f034'; +} +.fa-text-width:before { + content: '\f035'; +} +.fa-align-left:before { + content: '\f036'; +} +.fa-align-center:before { + content: '\f037'; +} +.fa-align-right:before { + content: '\f038'; +} +.fa-align-justify:before { + content: '\f039'; +} +.fa-list:before { + content: '\f03a'; +} +.fa-dedent:before, +.fa-outdent:before { + content: '\f03b'; +} +.fa-indent:before { + content: '\f03c'; +} +.fa-video-camera:before { + content: '\f03d'; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: '\f03e'; +} +.fa-pencil:before { + content: '\f040'; +} +.fa-map-marker:before { + content: '\f041'; +} +.fa-adjust:before { + content: '\f042'; +} +.fa-tint:before { + content: '\f043'; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: '\f044'; +} +.fa-share-square-o:before { + content: '\f045'; +} +.fa-check-square-o:before { + content: '\f046'; +} +.fa-arrows:before { + content: '\f047'; +} +.fa-step-backward:before { + content: '\f048'; +} +.fa-fast-backward:before { + content: '\f049'; +} +.fa-backward:before { + content: '\f04a'; +} +.fa-play:before { + content: '\f04b'; +} +.fa-pause:before { + content: '\f04c'; +} +.fa-stop:before { + content: '\f04d'; +} +.fa-forward:before { + content: '\f04e'; +} +.fa-fast-forward:before { + content: '\f050'; +} +.fa-step-forward:before { + content: '\f051'; +} +.fa-eject:before { + content: '\f052'; +} +.fa-chevron-left:before { + content: '\f053'; +} +.fa-chevron-right:before { + content: '\f054'; +} +.fa-plus-circle:before { + content: '\f055'; +} +.fa-minus-circle:before { + content: '\f056'; +} +.fa-times-circle:before { + content: '\f057'; +} +.fa-check-circle:before { + content: '\f058'; +} +.fa-question-circle:before { + content: '\f059'; +} +.fa-info-circle:before { + content: '\f05a'; +} +.fa-crosshairs:before { + content: '\f05b'; +} +.fa-times-circle-o:before { + content: '\f05c'; +} +.fa-check-circle-o:before { + content: '\f05d'; +} +.fa-ban:before { + content: '\f05e'; +} +.fa-arrow-left:before { + content: '\f060'; +} +.fa-arrow-right:before { + content: '\f061'; +} +.fa-arrow-up:before { + content: '\f062'; +} +.fa-arrow-down:before { + content: '\f063'; +} +.fa-mail-forward:before, +.fa-share:before { + content: '\f064'; +} +.fa-expand:before { + content: '\f065'; +} +.fa-compress:before { + content: '\f066'; +} +.fa-plus:before { + content: '\f067'; +} +.fa-minus:before { + content: '\f068'; +} +.fa-asterisk:before { + content: '\f069'; +} +.fa-exclamation-circle:before { + content: '\f06a'; +} +.fa-gift:before { + content: '\f06b'; +} +.fa-leaf:before { + content: '\f06c'; +} +.fa-fire:before { + content: '\f06d'; +} +.fa-eye:before { + content: '\f06e'; +} +.fa-eye-slash:before { + content: '\f070'; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: '\f071'; +} +.fa-plane:before { + content: '\f072'; +} +.fa-calendar:before { + content: '\f073'; +} +.fa-random:before { + content: '\f074'; +} +.fa-comment:before { + content: '\f075'; +} +.fa-magnet:before { + content: '\f076'; +} +.fa-chevron-up:before { + content: '\f077'; +} +.fa-chevron-down:before { + content: '\f078'; +} +.fa-retweet:before { + content: '\f079'; +} +.fa-shopping-cart:before { + content: '\f07a'; +} +.fa-folder:before { + content: '\f07b'; +} +.fa-folder-open:before { + content: '\f07c'; +} +.fa-arrows-v:before { + content: '\f07d'; +} +.fa-arrows-h:before { + content: '\f07e'; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: '\f080'; +} +.fa-twitter-square:before { + content: '\f081'; +} +.fa-facebook-square:before { + content: '\f082'; +} +.fa-camera-retro:before { + content: '\f083'; +} +.fa-key:before { + content: '\f084'; +} +.fa-gears:before, +.fa-cogs:before { + content: '\f085'; +} +.fa-comments:before { + content: '\f086'; +} +.fa-thumbs-o-up:before { + content: '\f087'; +} +.fa-thumbs-o-down:before { + content: '\f088'; +} +.fa-star-half:before { + content: '\f089'; +} +.fa-heart-o:before { + content: '\f08a'; +} +.fa-sign-out:before { + content: '\f08b'; +} +.fa-linkedin-square:before { + content: '\f08c'; +} +.fa-thumb-tack:before { + content: '\f08d'; +} +.fa-external-link:before { + content: '\f08e'; +} +.fa-sign-in:before { + content: '\f090'; +} +.fa-trophy:before { + content: '\f091'; +} +.fa-github-square:before { + content: '\f092'; +} +.fa-upload:before { + content: '\f093'; +} +.fa-lemon-o:before { + content: '\f094'; +} +.fa-phone:before { + content: '\f095'; +} +.fa-square-o:before { + content: '\f096'; +} +.fa-bookmark-o:before { + content: '\f097'; +} +.fa-phone-square:before { + content: '\f098'; +} +.fa-twitter:before { + content: '\f099'; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: '\f09a'; +} +.fa-github:before { + content: '\f09b'; +} +.fa-unlock:before { + content: '\f09c'; +} +.fa-credit-card:before { + content: '\f09d'; +} +.fa-feed:before, +.fa-rss:before { + content: '\f09e'; +} +.fa-hdd-o:before { + content: '\f0a0'; +} +.fa-bullhorn:before { + content: '\f0a1'; +} +.fa-bell:before { + content: '\f0f3'; +} +.fa-certificate:before { + content: '\f0a3'; +} +.fa-hand-o-right:before { + content: '\f0a4'; +} +.fa-hand-o-left:before { + content: '\f0a5'; +} +.fa-hand-o-up:before { + content: '\f0a6'; +} +.fa-hand-o-down:before { + content: '\f0a7'; +} +.fa-arrow-circle-left:before { + content: '\f0a8'; +} +.fa-arrow-circle-right:before { + content: '\f0a9'; +} +.fa-arrow-circle-up:before { + content: '\f0aa'; +} +.fa-arrow-circle-down:before { + content: '\f0ab'; +} +.fa-globe:before { + content: '\f0ac'; +} +.fa-wrench:before { + content: '\f0ad'; +} +.fa-tasks:before { + content: '\f0ae'; +} +.fa-filter:before { + content: '\f0b0'; +} +.fa-briefcase:before { + content: '\f0b1'; +} +.fa-arrows-alt:before { + content: '\f0b2'; +} +.fa-group:before, +.fa-users:before { + content: '\f0c0'; +} +.fa-chain:before, +.fa-link:before { + content: '\f0c1'; +} +.fa-cloud:before { + content: '\f0c2'; +} +.fa-flask:before { + content: '\f0c3'; +} +.fa-cut:before, +.fa-scissors:before { + content: '\f0c4'; +} +.fa-copy:before, +.fa-files-o:before { + content: '\f0c5'; +} +.fa-paperclip:before { + content: '\f0c6'; +} +.fa-save:before, +.fa-floppy-o:before { + content: '\f0c7'; +} +.fa-square:before { + content: '\f0c8'; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: '\f0c9'; +} +.fa-list-ul:before { + content: '\f0ca'; +} +.fa-list-ol:before { + content: '\f0cb'; +} +.fa-strikethrough:before { + content: '\f0cc'; +} +.fa-underline:before { + content: '\f0cd'; +} +.fa-table:before { + content: '\f0ce'; +} +.fa-magic:before { + content: '\f0d0'; +} +.fa-truck:before { + content: '\f0d1'; +} +.fa-pinterest:before { + content: '\f0d2'; +} +.fa-pinterest-square:before { + content: '\f0d3'; +} +.fa-google-plus-square:before { + content: '\f0d4'; +} +.fa-google-plus:before { + content: '\f0d5'; +} +.fa-money:before { + content: '\f0d6'; +} +.fa-caret-down:before { + content: '\f0d7'; +} +.fa-caret-up:before { + content: '\f0d8'; +} +.fa-caret-left:before { + content: '\f0d9'; +} +.fa-caret-right:before { + content: '\f0da'; +} +.fa-columns:before { + content: '\f0db'; +} +.fa-unsorted:before, +.fa-sort:before { + content: '\f0dc'; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: '\f0dd'; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: '\f0de'; +} +.fa-envelope:before { + content: '\f0e0'; +} +.fa-linkedin:before { + content: '\f0e1'; +} +.fa-rotate-left:before, +.fa-undo:before { + content: '\f0e2'; +} +.fa-legal:before, +.fa-gavel:before { + content: '\f0e3'; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: '\f0e4'; +} +.fa-comment-o:before { + content: '\f0e5'; +} +.fa-comments-o:before { + content: '\f0e6'; +} +.fa-flash:before, +.fa-bolt:before { + content: '\f0e7'; +} +.fa-sitemap:before { + content: '\f0e8'; +} +.fa-umbrella:before { + content: '\f0e9'; +} +.fa-paste:before, +.fa-clipboard:before { + content: '\f0ea'; +} +.fa-lightbulb-o:before { + content: '\f0eb'; +} +.fa-exchange:before { + content: '\f0ec'; +} +.fa-cloud-download:before { + content: '\f0ed'; +} +.fa-cloud-upload:before { + content: '\f0ee'; +} +.fa-user-md:before { + content: '\f0f0'; +} +.fa-stethoscope:before { + content: '\f0f1'; +} +.fa-suitcase:before { + content: '\f0f2'; +} +.fa-bell-o:before { + content: '\f0a2'; +} +.fa-coffee:before { + content: '\f0f4'; +} +.fa-cutlery:before { + content: '\f0f5'; +} +.fa-file-text-o:before { + content: '\f0f6'; +} +.fa-building-o:before { + content: '\f0f7'; +} +.fa-hospital-o:before { + content: '\f0f8'; +} +.fa-ambulance:before { + content: '\f0f9'; +} +.fa-medkit:before { + content: '\f0fa'; +} +.fa-fighter-jet:before { + content: '\f0fb'; +} +.fa-beer:before { + content: '\f0fc'; +} +.fa-h-square:before { + content: '\f0fd'; +} +.fa-plus-square:before { + content: '\f0fe'; +} +.fa-angle-double-left:before { + content: '\f100'; +} +.fa-angle-double-right:before { + content: '\f101'; +} +.fa-angle-double-up:before { + content: '\f102'; +} +.fa-angle-double-down:before { + content: '\f103'; +} +.fa-angle-left:before { + content: '\f104'; +} +.fa-angle-right:before { + content: '\f105'; +} +.fa-angle-up:before { + content: '\f106'; +} +.fa-angle-down:before { + content: '\f107'; +} +.fa-desktop:before { + content: '\f108'; +} +.fa-laptop:before { + content: '\f109'; +} +.fa-tablet:before { + content: '\f10a'; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: '\f10b'; +} +.fa-circle-o:before { + content: '\f10c'; +} +.fa-quote-left:before { + content: '\f10d'; +} +.fa-quote-right:before { + content: '\f10e'; +} +.fa-spinner:before { + content: '\f110'; +} +.fa-circle:before { + content: '\f111'; +} +.fa-mail-reply:before, +.fa-reply:before { + content: '\f112'; +} +.fa-github-alt:before { + content: '\f113'; +} +.fa-folder-o:before { + content: '\f114'; +} +.fa-folder-open-o:before { + content: '\f115'; +} +.fa-smile-o:before { + content: '\f118'; +} +.fa-frown-o:before { + content: '\f119'; +} +.fa-meh-o:before { + content: '\f11a'; +} +.fa-gamepad:before { + content: '\f11b'; +} +.fa-keyboard-o:before { + content: '\f11c'; +} +.fa-flag-o:before { + content: '\f11d'; +} +.fa-flag-checkered:before { + content: '\f11e'; +} +.fa-terminal:before { + content: '\f120'; +} +.fa-code:before { + content: '\f121'; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: '\f122'; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: '\f123'; +} +.fa-location-arrow:before { + content: '\f124'; +} +.fa-crop:before { + content: '\f125'; +} +.fa-code-fork:before { + content: '\f126'; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: '\f127'; +} +.fa-question:before { + content: '\f128'; +} +.fa-info:before { + content: '\f129'; +} +.fa-exclamation:before { + content: '\f12a'; +} +.fa-superscript:before { + content: '\f12b'; +} +.fa-subscript:before { + content: '\f12c'; +} +.fa-eraser:before { + content: '\f12d'; +} +.fa-puzzle-piece:before { + content: '\f12e'; +} +.fa-microphone:before { + content: '\f130'; +} +.fa-microphone-slash:before { + content: '\f131'; +} +.fa-shield:before { + content: '\f132'; +} +.fa-calendar-o:before { + content: '\f133'; +} +.fa-fire-extinguisher:before { + content: '\f134'; +} +.fa-rocket:before { + content: '\f135'; +} +.fa-maxcdn:before { + content: '\f136'; +} +.fa-chevron-circle-left:before { + content: '\f137'; +} +.fa-chevron-circle-right:before { + content: '\f138'; +} +.fa-chevron-circle-up:before { + content: '\f139'; +} +.fa-chevron-circle-down:before { + content: '\f13a'; +} +.fa-html5:before { + content: '\f13b'; +} +.fa-css3:before { + content: '\f13c'; +} +.fa-anchor:before { + content: '\f13d'; +} +.fa-unlock-alt:before { + content: '\f13e'; +} +.fa-bullseye:before { + content: '\f140'; +} +.fa-ellipsis-h:before { + content: '\f141'; +} +.fa-ellipsis-v:before { + content: '\f142'; +} +.fa-rss-square:before { + content: '\f143'; +} +.fa-play-circle:before { + content: '\f144'; +} +.fa-ticket:before { + content: '\f145'; +} +.fa-minus-square:before { + content: '\f146'; +} +.fa-minus-square-o:before { + content: '\f147'; +} +.fa-level-up:before { + content: '\f148'; +} +.fa-level-down:before { + content: '\f149'; +} +.fa-check-square:before { + content: '\f14a'; +} +.fa-pencil-square:before { + content: '\f14b'; +} +.fa-external-link-square:before { + content: '\f14c'; +} +.fa-share-square:before { + content: '\f14d'; +} +.fa-compass:before { + content: '\f14e'; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: '\f150'; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: '\f151'; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: '\f152'; +} +.fa-euro:before, +.fa-eur:before { + content: '\f153'; +} +.fa-gbp:before { + content: '\f154'; +} +.fa-dollar:before, +.fa-usd:before { + content: '\f155'; +} +.fa-rupee:before, +.fa-inr:before { + content: '\f156'; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: '\f157'; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: '\f158'; +} +.fa-won:before, +.fa-krw:before { + content: '\f159'; +} +.fa-bitcoin:before, +.fa-btc:before { + content: '\f15a'; +} +.fa-file:before { + content: '\f15b'; +} +.fa-file-text:before { + content: '\f15c'; +} +.fa-sort-alpha-asc:before { + content: '\f15d'; +} +.fa-sort-alpha-desc:before { + content: '\f15e'; +} +.fa-sort-amount-asc:before { + content: '\f160'; +} +.fa-sort-amount-desc:before { + content: '\f161'; +} +.fa-sort-numeric-asc:before { + content: '\f162'; +} +.fa-sort-numeric-desc:before { + content: '\f163'; +} +.fa-thumbs-up:before { + content: '\f164'; +} +.fa-thumbs-down:before { + content: '\f165'; +} +.fa-youtube-square:before { + content: '\f166'; +} +.fa-youtube:before { + content: '\f167'; +} +.fa-xing:before { + content: '\f168'; +} +.fa-xing-square:before { + content: '\f169'; +} +.fa-youtube-play:before { + content: '\f16a'; +} +.fa-dropbox:before { + content: '\f16b'; +} +.fa-stack-overflow:before { + content: '\f16c'; +} +.fa-instagram:before { + content: '\f16d'; +} +.fa-flickr:before { + content: '\f16e'; +} +.fa-adn:before { + content: '\f170'; +} +.fa-bitbucket:before { + content: '\f171'; +} +.fa-bitbucket-square:before { + content: '\f172'; +} +.fa-tumblr:before { + content: '\f173'; +} +.fa-tumblr-square:before { + content: '\f174'; +} +.fa-long-arrow-down:before { + content: '\f175'; +} +.fa-long-arrow-up:before { + content: '\f176'; +} +.fa-long-arrow-left:before { + content: '\f177'; +} +.fa-long-arrow-right:before { + content: '\f178'; +} +.fa-apple:before { + content: '\f179'; +} +.fa-windows:before { + content: '\f17a'; +} +.fa-android:before { + content: '\f17b'; +} +.fa-linux:before { + content: '\f17c'; +} +.fa-dribbble:before { + content: '\f17d'; +} +.fa-skype:before { + content: '\f17e'; +} +.fa-foursquare:before { + content: '\f180'; +} +.fa-trello:before { + content: '\f181'; +} +.fa-female:before { + content: '\f182'; +} +.fa-male:before { + content: '\f183'; +} +.fa-gittip:before, +.fa-gratipay:before { + content: '\f184'; +} +.fa-sun-o:before { + content: '\f185'; +} +.fa-moon-o:before { + content: '\f186'; +} +.fa-archive:before { + content: '\f187'; +} +.fa-bug:before { + content: '\f188'; +} +.fa-vk:before { + content: '\f189'; +} +.fa-weibo:before { + content: '\f18a'; +} +.fa-renren:before { + content: '\f18b'; +} +.fa-pagelines:before { + content: '\f18c'; +} +.fa-stack-exchange:before { + content: '\f18d'; +} +.fa-arrow-circle-o-right:before { + content: '\f18e'; +} +.fa-arrow-circle-o-left:before { + content: '\f190'; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: '\f191'; +} +.fa-dot-circle-o:before { + content: '\f192'; +} +.fa-wheelchair:before { + content: '\f193'; +} +.fa-vimeo-square:before { + content: '\f194'; +} +.fa-turkish-lira:before, +.fa-try:before { + content: '\f195'; +} +.fa-plus-square-o:before { + content: '\f196'; +} +.fa-space-shuttle:before { + content: '\f197'; +} +.fa-slack:before { + content: '\f198'; +} +.fa-envelope-square:before { + content: '\f199'; +} +.fa-wordpress:before { + content: '\f19a'; +} +.fa-openid:before { + content: '\f19b'; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: '\f19c'; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: '\f19d'; +} +.fa-yahoo:before { + content: '\f19e'; +} +.fa-google:before { + content: '\f1a0'; +} +.fa-reddit:before { + content: '\f1a1'; +} +.fa-reddit-square:before { + content: '\f1a2'; +} +.fa-stumbleupon-circle:before { + content: '\f1a3'; +} +.fa-stumbleupon:before { + content: '\f1a4'; +} +.fa-delicious:before { + content: '\f1a5'; +} +.fa-digg:before { + content: '\f1a6'; +} +.fa-pied-piper-pp:before { + content: '\f1a7'; +} +.fa-pied-piper-alt:before { + content: '\f1a8'; +} +.fa-drupal:before { + content: '\f1a9'; +} +.fa-joomla:before { + content: '\f1aa'; +} +.fa-language:before { + content: '\f1ab'; +} +.fa-fax:before { + content: '\f1ac'; +} +.fa-building:before { + content: '\f1ad'; +} +.fa-child:before { + content: '\f1ae'; +} +.fa-paw:before { + content: '\f1b0'; +} +.fa-spoon:before { + content: '\f1b1'; +} +.fa-cube:before { + content: '\f1b2'; +} +.fa-cubes:before { + content: '\f1b3'; +} +.fa-behance:before { + content: '\f1b4'; +} +.fa-behance-square:before { + content: '\f1b5'; +} +.fa-steam:before { + content: '\f1b6'; +} +.fa-steam-square:before { + content: '\f1b7'; +} +.fa-recycle:before { + content: '\f1b8'; +} +.fa-automobile:before, +.fa-car:before { + content: '\f1b9'; +} +.fa-cab:before, +.fa-taxi:before { + content: '\f1ba'; +} +.fa-tree:before { + content: '\f1bb'; +} +.fa-spotify:before { + content: '\f1bc'; +} +.fa-deviantart:before { + content: '\f1bd'; +} +.fa-soundcloud:before { + content: '\f1be'; +} +.fa-database:before { + content: '\f1c0'; +} +.fa-file-pdf-o:before { + content: '\f1c1'; +} +.fa-file-word-o:before { + content: '\f1c2'; +} +.fa-file-excel-o:before { + content: '\f1c3'; +} +.fa-file-powerpoint-o:before { + content: '\f1c4'; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: '\f1c5'; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: '\f1c6'; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: '\f1c7'; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: '\f1c8'; +} +.fa-file-code-o:before { + content: '\f1c9'; +} +.fa-vine:before { + content: '\f1ca'; +} +.fa-codepen:before { + content: '\f1cb'; +} +.fa-jsfiddle:before { + content: '\f1cc'; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: '\f1cd'; +} +.fa-circle-o-notch:before { + content: '\f1ce'; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: '\f1d0'; +} +.fa-ge:before, +.fa-empire:before { + content: '\f1d1'; +} +.fa-git-square:before { + content: '\f1d2'; +} +.fa-git:before { + content: '\f1d3'; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: '\f1d4'; +} +.fa-tencent-weibo:before { + content: '\f1d5'; +} +.fa-qq:before { + content: '\f1d6'; +} +.fa-wechat:before, +.fa-weixin:before { + content: '\f1d7'; +} +.fa-send:before, +.fa-paper-plane:before { + content: '\f1d8'; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: '\f1d9'; +} +.fa-history:before { + content: '\f1da'; +} +.fa-circle-thin:before { + content: '\f1db'; +} +.fa-header:before { + content: '\f1dc'; +} +.fa-paragraph:before { + content: '\f1dd'; +} +.fa-sliders:before { + content: '\f1de'; +} +.fa-share-alt:before { + content: '\f1e0'; +} +.fa-share-alt-square:before { + content: '\f1e1'; +} +.fa-bomb:before { + content: '\f1e2'; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: '\f1e3'; +} +.fa-tty:before { + content: '\f1e4'; +} +.fa-binoculars:before { + content: '\f1e5'; +} +.fa-plug:before { + content: '\f1e6'; +} +.fa-slideshare:before { + content: '\f1e7'; +} +.fa-twitch:before { + content: '\f1e8'; +} +.fa-yelp:before { + content: '\f1e9'; +} +.fa-newspaper-o:before { + content: '\f1ea'; +} +.fa-wifi:before { + content: '\f1eb'; +} +.fa-calculator:before { + content: '\f1ec'; +} +.fa-paypal:before { + content: '\f1ed'; +} +.fa-google-wallet:before { + content: '\f1ee'; +} +.fa-cc-visa:before { + content: '\f1f0'; +} +.fa-cc-mastercard:before { + content: '\f1f1'; +} +.fa-cc-discover:before { + content: '\f1f2'; +} +.fa-cc-amex:before { + content: '\f1f3'; +} +.fa-cc-paypal:before { + content: '\f1f4'; +} +.fa-cc-stripe:before { + content: '\f1f5'; +} +.fa-bell-slash:before { + content: '\f1f6'; +} +.fa-bell-slash-o:before { + content: '\f1f7'; +} +.fa-trash:before { + content: '\f1f8'; +} +.fa-copyright:before { + content: '\f1f9'; +} +.fa-at:before { + content: '\f1fa'; +} +.fa-eyedropper:before { + content: '\f1fb'; +} +.fa-paint-brush:before { + content: '\f1fc'; +} +.fa-birthday-cake:before { + content: '\f1fd'; +} +.fa-area-chart:before { + content: '\f1fe'; +} +.fa-pie-chart:before { + content: '\f200'; +} +.fa-line-chart:before { + content: '\f201'; +} +.fa-lastfm:before { + content: '\f202'; +} +.fa-lastfm-square:before { + content: '\f203'; +} +.fa-toggle-off:before { + content: '\f204'; +} +.fa-toggle-on:before { + content: '\f205'; +} +.fa-bicycle:before { + content: '\f206'; +} +.fa-bus:before { + content: '\f207'; +} +.fa-ioxhost:before { + content: '\f208'; +} +.fa-angellist:before { + content: '\f209'; +} +.fa-cc:before { + content: '\f20a'; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: '\f20b'; +} +.fa-meanpath:before { + content: '\f20c'; +} +.fa-buysellads:before { + content: '\f20d'; +} +.fa-connectdevelop:before { + content: '\f20e'; +} +.fa-dashcube:before { + content: '\f210'; +} +.fa-forumbee:before { + content: '\f211'; +} +.fa-leanpub:before { + content: '\f212'; +} +.fa-sellsy:before { + content: '\f213'; +} +.fa-shirtsinbulk:before { + content: '\f214'; +} +.fa-simplybuilt:before { + content: '\f215'; +} +.fa-skyatlas:before { + content: '\f216'; +} +.fa-cart-plus:before { + content: '\f217'; +} +.fa-cart-arrow-down:before { + content: '\f218'; +} +.fa-diamond:before { + content: '\f219'; +} +.fa-ship:before { + content: '\f21a'; +} +.fa-user-secret:before { + content: '\f21b'; +} +.fa-motorcycle:before { + content: '\f21c'; +} +.fa-street-view:before { + content: '\f21d'; +} +.fa-heartbeat:before { + content: '\f21e'; +} +.fa-venus:before { + content: '\f221'; +} +.fa-mars:before { + content: '\f222'; +} +.fa-mercury:before { + content: '\f223'; +} +.fa-intersex:before, +.fa-transgender:before { + content: '\f224'; +} +.fa-transgender-alt:before { + content: '\f225'; +} +.fa-venus-double:before { + content: '\f226'; +} +.fa-mars-double:before { + content: '\f227'; +} +.fa-venus-mars:before { + content: '\f228'; +} +.fa-mars-stroke:before { + content: '\f229'; +} +.fa-mars-stroke-v:before { + content: '\f22a'; +} +.fa-mars-stroke-h:before { + content: '\f22b'; +} +.fa-neuter:before { + content: '\f22c'; +} +.fa-genderless:before { + content: '\f22d'; +} +.fa-facebook-official:before { + content: '\f230'; +} +.fa-pinterest-p:before { + content: '\f231'; +} +.fa-whatsapp:before { + content: '\f232'; +} +.fa-server:before { + content: '\f233'; +} +.fa-user-plus:before { + content: '\f234'; +} +.fa-user-times:before { + content: '\f235'; +} +.fa-hotel:before, +.fa-bed:before { + content: '\f236'; +} +.fa-viacoin:before { + content: '\f237'; +} +.fa-train:before { + content: '\f238'; +} +.fa-subway:before { + content: '\f239'; +} +.fa-medium:before { + content: '\f23a'; +} +.fa-yc:before, +.fa-y-combinator:before { + content: '\f23b'; +} +.fa-optin-monster:before { + content: '\f23c'; +} +.fa-opencart:before { + content: '\f23d'; +} +.fa-expeditedssl:before { + content: '\f23e'; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: '\f240'; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: '\f241'; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: '\f242'; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: '\f243'; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: '\f244'; +} +.fa-mouse-pointer:before { + content: '\f245'; +} +.fa-i-cursor:before { + content: '\f246'; +} +.fa-object-group:before { + content: '\f247'; +} +.fa-object-ungroup:before { + content: '\f248'; +} +.fa-sticky-note:before { + content: '\f249'; +} +.fa-sticky-note-o:before { + content: '\f24a'; +} +.fa-cc-jcb:before { + content: '\f24b'; +} +.fa-cc-diners-club:before { + content: '\f24c'; +} +.fa-clone:before { + content: '\f24d'; +} +.fa-balance-scale:before { + content: '\f24e'; +} +.fa-hourglass-o:before { + content: '\f250'; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: '\f251'; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: '\f252'; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: '\f253'; +} +.fa-hourglass:before { + content: '\f254'; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: '\f255'; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: '\f256'; +} +.fa-hand-scissors-o:before { + content: '\f257'; +} +.fa-hand-lizard-o:before { + content: '\f258'; +} +.fa-hand-spock-o:before { + content: '\f259'; +} +.fa-hand-pointer-o:before { + content: '\f25a'; +} +.fa-hand-peace-o:before { + content: '\f25b'; +} +.fa-trademark:before { + content: '\f25c'; +} +.fa-registered:before { + content: '\f25d'; +} +.fa-creative-commons:before { + content: '\f25e'; +} +.fa-gg:before { + content: '\f260'; +} +.fa-gg-circle:before { + content: '\f261'; +} +.fa-tripadvisor:before { + content: '\f262'; +} +.fa-odnoklassniki:before { + content: '\f263'; +} +.fa-odnoklassniki-square:before { + content: '\f264'; +} +.fa-get-pocket:before { + content: '\f265'; +} +.fa-wikipedia-w:before { + content: '\f266'; +} +.fa-safari:before { + content: '\f267'; +} +.fa-chrome:before { + content: '\f268'; +} +.fa-firefox:before { + content: '\f269'; +} +.fa-opera:before { + content: '\f26a'; +} +.fa-internet-explorer:before { + content: '\f26b'; +} +.fa-tv:before, +.fa-television:before { + content: '\f26c'; +} +.fa-contao:before { + content: '\f26d'; +} +.fa-500px:before { + content: '\f26e'; +} +.fa-amazon:before { + content: '\f270'; +} +.fa-calendar-plus-o:before { + content: '\f271'; +} +.fa-calendar-minus-o:before { + content: '\f272'; +} +.fa-calendar-times-o:before { + content: '\f273'; +} +.fa-calendar-check-o:before { + content: '\f274'; +} +.fa-industry:before { + content: '\f275'; +} +.fa-map-pin:before { + content: '\f276'; +} +.fa-map-signs:before { + content: '\f277'; +} +.fa-map-o:before { + content: '\f278'; +} +.fa-map:before { + content: '\f279'; +} +.fa-commenting:before { + content: '\f27a'; +} +.fa-commenting-o:before { + content: '\f27b'; +} +.fa-houzz:before { + content: '\f27c'; +} +.fa-vimeo:before { + content: '\f27d'; +} +.fa-black-tie:before { + content: '\f27e'; +} +.fa-fonticons:before { + content: '\f280'; +} +.fa-reddit-alien:before { + content: '\f281'; +} +.fa-edge:before { + content: '\f282'; +} +.fa-credit-card-alt:before { + content: '\f283'; +} +.fa-codiepie:before { + content: '\f284'; +} +.fa-modx:before { + content: '\f285'; +} +.fa-fort-awesome:before { + content: '\f286'; +} +.fa-usb:before { + content: '\f287'; +} +.fa-product-hunt:before { + content: '\f288'; +} +.fa-mixcloud:before { + content: '\f289'; +} +.fa-scribd:before { + content: '\f28a'; +} +.fa-pause-circle:before { + content: '\f28b'; +} +.fa-pause-circle-o:before { + content: '\f28c'; +} +.fa-stop-circle:before { + content: '\f28d'; +} +.fa-stop-circle-o:before { + content: '\f28e'; +} +.fa-shopping-bag:before { + content: '\f290'; +} +.fa-shopping-basket:before { + content: '\f291'; +} +.fa-hashtag:before { + content: '\f292'; +} +.fa-bluetooth:before { + content: '\f293'; +} +.fa-bluetooth-b:before { + content: '\f294'; +} +.fa-percent:before { + content: '\f295'; +} +.fa-gitlab:before { + content: '\f296'; +} +.fa-wpbeginner:before { + content: '\f297'; +} +.fa-wpforms:before { + content: '\f298'; +} +.fa-envira:before { + content: '\f299'; +} +.fa-universal-access:before { + content: '\f29a'; +} +.fa-wheelchair-alt:before { + content: '\f29b'; +} +.fa-question-circle-o:before { + content: '\f29c'; +} +.fa-blind:before { + content: '\f29d'; +} +.fa-audio-description:before { + content: '\f29e'; +} +.fa-volume-control-phone:before { + content: '\f2a0'; +} +.fa-braille:before { + content: '\f2a1'; +} +.fa-assistive-listening-systems:before { + content: '\f2a2'; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: '\f2a3'; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: '\f2a4'; +} +.fa-glide:before { + content: '\f2a5'; +} +.fa-glide-g:before { + content: '\f2a6'; +} +.fa-signing:before, +.fa-sign-language:before { + content: '\f2a7'; +} +.fa-low-vision:before { + content: '\f2a8'; +} +.fa-viadeo:before { + content: '\f2a9'; +} +.fa-viadeo-square:before { + content: '\f2aa'; +} +.fa-snapchat:before { + content: '\f2ab'; +} +.fa-snapchat-ghost:before { + content: '\f2ac'; +} +.fa-snapchat-square:before { + content: '\f2ad'; +} +.fa-pied-piper:before { + content: '\f2ae'; +} +.fa-first-order:before { + content: '\f2b0'; +} +.fa-yoast:before { + content: '\f2b1'; +} +.fa-themeisle:before { + content: '\f2b2'; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: '\f2b3'; +} +.fa-fa:before, +.fa-font-awesome:before { + content: '\f2b4'; +} +.fa-handshake-o:before { + content: '\f2b5'; +} +.fa-envelope-open:before { + content: '\f2b6'; +} +.fa-envelope-open-o:before { + content: '\f2b7'; +} +.fa-linode:before { + content: '\f2b8'; +} +.fa-address-book:before { + content: '\f2b9'; +} +.fa-address-book-o:before { + content: '\f2ba'; +} +.fa-vcard:before, +.fa-address-card:before { + content: '\f2bb'; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: '\f2bc'; +} +.fa-user-circle:before { + content: '\f2bd'; +} +.fa-user-circle-o:before { + content: '\f2be'; +} +.fa-user-o:before { + content: '\f2c0'; +} +.fa-id-badge:before { + content: '\f2c1'; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: '\f2c2'; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: '\f2c3'; +} +.fa-quora:before { + content: '\f2c4'; +} +.fa-free-code-camp:before { + content: '\f2c5'; +} +.fa-telegram:before { + content: '\f2c6'; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: '\f2c7'; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: '\f2c8'; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: '\f2c9'; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: '\f2ca'; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: '\f2cb'; +} +.fa-shower:before { + content: '\f2cc'; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: '\f2cd'; +} +.fa-podcast:before { + content: '\f2ce'; +} +.fa-window-maximize:before { + content: '\f2d0'; +} +.fa-window-minimize:before { + content: '\f2d1'; +} +.fa-window-restore:before { + content: '\f2d2'; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: '\f2d3'; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: '\f2d4'; +} +.fa-bandcamp:before { + content: '\f2d5'; +} +.fa-grav:before { + content: '\f2d6'; +} +.fa-etsy:before { + content: '\f2d7'; +} +.fa-imdb:before { + content: '\f2d8'; +} +.fa-ravelry:before { + content: '\f2d9'; +} +.fa-eercast:before { + content: '\f2da'; +} +.fa-microchip:before { + content: '\f2db'; +} +.fa-snowflake-o:before { + content: '\f2dc'; +} +.fa-superpowers:before { + content: '\f2dd'; +} +.fa-wpexplorer:before { + content: '\f2de'; +} +.fa-meetup:before { + content: '\f2e0'; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/public/static/modelView/css/jquery-ui.css b/public/static/modelView/css/jquery-ui.css new file mode 100644 index 0000000..b5e9949 --- /dev/null +++ b/public/static/modelView/css/jquery-ui.css @@ -0,0 +1,1656 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ''; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter: Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -0.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: 0.5em 0.5em 0.5em 0.7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url('data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'); +} +.ui-menu .ui-menu-item-wrapper { + position: relative; + padding: 3px 1em 3px 0.4em; +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item-wrapper { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: 0.2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-button { + padding: 0.4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: 0.1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + /* Support: IE <= 11 */ + overflow: visible; +} + +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} + +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} + +/* no icon support for input elements */ +input.ui-button.ui-button-icon-only { + text-indent: 0; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} + +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; +} + +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: 0.4em 1em; +} + +/* workarounds */ +/* Support: Firefox 5 - 40 */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: 0.4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} + +/* Spinner specific style fixes */ +.ui-controlgroup-vertical .ui-spinner-input { + /* Support: IE8 only, Android < 4.4 only */ + width: 75%; + width: calc(100% - 2.4em); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} + +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: 0.12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-datepicker { + width: 17em; + padding: 0.2em 0.2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: 0.2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: 0.9em; + border-collapse: collapse; + margin: 0 0 0.4em; +} +.ui-datepicker th { + padding: 0.7em 0.3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: 0.2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: 0.7em 0 0 0; + padding: 0 0.2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: 0.5em 0.2em 0.4em; + cursor: pointer; + padding: 0.2em 0.6em 0.3em 0.6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto 0.4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: 0.5em; + top: 0.3em; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: 0.2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: 0.4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: 0.1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: 0.3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: 0.5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: 0.5em; + padding: 0.3em 1em 0.5em 0.4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: 0.5em 0.4em 0.5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url('data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=='); + height: 100%; + filter: alpha(opacity=25); /* support: IE8 */ + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-selectable { + -ms-touch-action: none; + touch-action: none; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} +.ui-selectmenu-menu .ui-menu { + overflow: auto; + overflow-x: hidden; + padding-bottom: 1px; +} +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 1.5; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} +.ui-selectmenu-open { + display: block; +} +.ui-selectmenu-text { + display: block; + margin-right: 20px; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-selectmenu-button.ui-button { + text-align: left; + white-space: nowrap; + width: 14em; +} +.ui-selectmenu-icon.ui-icon { + float: right; + margin-top: 0; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; + -ms-touch-action: none; + touch-action: none; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: 0.7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* support: IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: 0.8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -0.3em; + margin-left: -0.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: 0.8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -0.3em; + margin-left: 0; + margin-bottom: -0.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: 0.222em 0; + margin: 0.2em 0; + vertical-align: middle; + margin-left: 0.4em; + margin-right: 2em; +} +.ui-spinner-button { + width: 1.6em; + height: 50%; + font-size: 0.5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top-style: none; + border-bottom-style: none; + border-right-style: none; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} +.ui-tabs { + position: relative; /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: 0.2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: 0.2em 0.2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px 0.2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: 0.5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; +} +body .ui-tooltip { + border-width: 2px; +} +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #ffffff; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #dddddd; + background: #e9e9e9; + color: #333333; + font-weight: bold; +} +.ui-widget-header a { + color: #333333; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #cccccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #ffffff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #ffffff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #ffffff; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: 0.7; + filter: Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: 0.35; + filter: Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter: Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url('images/ui-icons_444444_256x240.png'); +} +.ui-widget-header .ui-icon { + background-image: url('images/ui-icons_444444_256x240.png'); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url('images/ui-icons_555555_256x240.png'); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url('images/ui-icons_ffffff_256x240.png'); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url('images/ui-icons_777620_256x240.png'); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url('images/ui-icons_cc0000_256x240.png'); +} +.ui-button .ui-icon { + background-image: url('images/ui-icons_777777_256x240.png'); +} + +/* positioning */ +.ui-icon-blank { + background-position: 16px 16px; +} +.ui-icon-caret-1-n { + background-position: 0 0; +} +.ui-icon-caret-1-ne { + background-position: -16px 0; +} +.ui-icon-caret-1-e { + background-position: -32px 0; +} +.ui-icon-caret-1-se { + background-position: -48px 0; +} +.ui-icon-caret-1-s { + background-position: -65px 0; +} +.ui-icon-caret-1-sw { + background-position: -80px 0; +} +.ui-icon-caret-1-w { + background-position: -96px 0; +} +.ui-icon-caret-1-nw { + background-position: -112px 0; +} +.ui-icon-caret-2-n-s { + background-position: -128px 0; +} +.ui-icon-caret-2-e-w { + background-position: -144px 0; +} +.ui-icon-triangle-1-n { + background-position: 0 -16px; +} +.ui-icon-triangle-1-ne { + background-position: -16px -16px; +} +.ui-icon-triangle-1-e { + background-position: -32px -16px; +} +.ui-icon-triangle-1-se { + background-position: -48px -16px; +} +.ui-icon-triangle-1-s { + background-position: -65px -16px; +} +.ui-icon-triangle-1-sw { + background-position: -80px -16px; +} +.ui-icon-triangle-1-w { + background-position: -96px -16px; +} +.ui-icon-triangle-1-nw { + background-position: -112px -16px; +} +.ui-icon-triangle-2-n-s { + background-position: -128px -16px; +} +.ui-icon-triangle-2-e-w { + background-position: -144px -16px; +} +.ui-icon-arrow-1-n { + background-position: 0 -32px; +} +.ui-icon-arrow-1-ne { + background-position: -16px -32px; +} +.ui-icon-arrow-1-e { + background-position: -32px -32px; +} +.ui-icon-arrow-1-se { + background-position: -48px -32px; +} +.ui-icon-arrow-1-s { + background-position: -65px -32px; +} +.ui-icon-arrow-1-sw { + background-position: -80px -32px; +} +.ui-icon-arrow-1-w { + background-position: -96px -32px; +} +.ui-icon-arrow-1-nw { + background-position: -112px -32px; +} +.ui-icon-arrow-2-n-s { + background-position: -128px -32px; +} +.ui-icon-arrow-2-ne-sw { + background-position: -144px -32px; +} +.ui-icon-arrow-2-e-w { + background-position: -160px -32px; +} +.ui-icon-arrow-2-se-nw { + background-position: -176px -32px; +} +.ui-icon-arrowstop-1-n { + background-position: -192px -32px; +} +.ui-icon-arrowstop-1-e { + background-position: -208px -32px; +} +.ui-icon-arrowstop-1-s { + background-position: -224px -32px; +} +.ui-icon-arrowstop-1-w { + background-position: -240px -32px; +} +.ui-icon-arrowthick-1-n { + background-position: 1px -48px; +} +.ui-icon-arrowthick-1-ne { + background-position: -16px -48px; +} +.ui-icon-arrowthick-1-e { + background-position: -32px -48px; +} +.ui-icon-arrowthick-1-se { + background-position: -48px -48px; +} +.ui-icon-arrowthick-1-s { + background-position: -64px -48px; +} +.ui-icon-arrowthick-1-sw { + background-position: -80px -48px; +} +.ui-icon-arrowthick-1-w { + background-position: -96px -48px; +} +.ui-icon-arrowthick-1-nw { + background-position: -112px -48px; +} +.ui-icon-arrowthick-2-n-s { + background-position: -128px -48px; +} +.ui-icon-arrowthick-2-ne-sw { + background-position: -144px -48px; +} +.ui-icon-arrowthick-2-e-w { + background-position: -160px -48px; +} +.ui-icon-arrowthick-2-se-nw { + background-position: -176px -48px; +} +.ui-icon-arrowthickstop-1-n { + background-position: -192px -48px; +} +.ui-icon-arrowthickstop-1-e { + background-position: -208px -48px; +} +.ui-icon-arrowthickstop-1-s { + background-position: -224px -48px; +} +.ui-icon-arrowthickstop-1-w { + background-position: -240px -48px; +} +.ui-icon-arrowreturnthick-1-w { + background-position: 0 -64px; +} +.ui-icon-arrowreturnthick-1-n { + background-position: -16px -64px; +} +.ui-icon-arrowreturnthick-1-e { + background-position: -32px -64px; +} +.ui-icon-arrowreturnthick-1-s { + background-position: -48px -64px; +} +.ui-icon-arrowreturn-1-w { + background-position: -64px -64px; +} +.ui-icon-arrowreturn-1-n { + background-position: -80px -64px; +} +.ui-icon-arrowreturn-1-e { + background-position: -96px -64px; +} +.ui-icon-arrowreturn-1-s { + background-position: -112px -64px; +} +.ui-icon-arrowrefresh-1-w { + background-position: -128px -64px; +} +.ui-icon-arrowrefresh-1-n { + background-position: -144px -64px; +} +.ui-icon-arrowrefresh-1-e { + background-position: -160px -64px; +} +.ui-icon-arrowrefresh-1-s { + background-position: -176px -64px; +} +.ui-icon-arrow-4 { + background-position: 0 -80px; +} +.ui-icon-arrow-4-diag { + background-position: -16px -80px; +} +.ui-icon-extlink { + background-position: -32px -80px; +} +.ui-icon-newwin { + background-position: -48px -80px; +} +.ui-icon-refresh { + background-position: -64px -80px; +} +.ui-icon-shuffle { + background-position: -80px -80px; +} +.ui-icon-transfer-e-w { + background-position: -96px -80px; +} +.ui-icon-transferthick-e-w { + background-position: -112px -80px; +} +.ui-icon-folder-collapsed { + background-position: 0 -96px; +} +.ui-icon-folder-open { + background-position: -16px -96px; +} +.ui-icon-document { + background-position: -32px -96px; +} +.ui-icon-document-b { + background-position: -48px -96px; +} +.ui-icon-note { + background-position: -64px -96px; +} +.ui-icon-mail-closed { + background-position: -80px -96px; +} +.ui-icon-mail-open { + background-position: -96px -96px; +} +.ui-icon-suitcase { + background-position: -112px -96px; +} +.ui-icon-comment { + background-position: -128px -96px; +} +.ui-icon-person { + background-position: -144px -96px; +} +.ui-icon-print { + background-position: -160px -96px; +} +.ui-icon-trash { + background-position: -176px -96px; +} +.ui-icon-locked { + background-position: -192px -96px; +} +.ui-icon-unlocked { + background-position: -208px -96px; +} +.ui-icon-bookmark { + background-position: -224px -96px; +} +.ui-icon-tag { + background-position: -240px -96px; +} +.ui-icon-home { + background-position: 0 -112px; +} +.ui-icon-flag { + background-position: -16px -112px; +} +.ui-icon-calendar { + background-position: -32px -112px; +} +.ui-icon-cart { + background-position: -48px -112px; +} +.ui-icon-pencil { + background-position: -64px -112px; +} +.ui-icon-clock { + background-position: -80px -112px; +} +.ui-icon-disk { + background-position: -96px -112px; +} +.ui-icon-calculator { + background-position: -112px -112px; +} +.ui-icon-zoomin { + background-position: -128px -112px; +} +.ui-icon-zoomout { + background-position: -144px -112px; +} +.ui-icon-search { + background-position: -160px -112px; +} +.ui-icon-wrench { + background-position: -176px -112px; +} +.ui-icon-gear { + background-position: -192px -112px; +} +.ui-icon-heart { + background-position: -208px -112px; +} +.ui-icon-star { + background-position: -224px -112px; +} +.ui-icon-link { + background-position: -240px -112px; +} +.ui-icon-cancel { + background-position: 0 -128px; +} +.ui-icon-plus { + background-position: -16px -128px; +} +.ui-icon-plusthick { + background-position: -32px -128px; +} +.ui-icon-minus { + background-position: -48px -128px; +} +.ui-icon-minusthick { + background-position: -64px -128px; +} +.ui-icon-close { + background-position: -80px -128px; +} +.ui-icon-closethick { + background-position: -96px -128px; +} +.ui-icon-key { + background-position: -112px -128px; +} +.ui-icon-lightbulb { + background-position: -128px -128px; +} +.ui-icon-scissors { + background-position: -144px -128px; +} +.ui-icon-clipboard { + background-position: -160px -128px; +} +.ui-icon-copy { + background-position: -176px -128px; +} +.ui-icon-contact { + background-position: -192px -128px; +} +.ui-icon-image { + background-position: -208px -128px; +} +.ui-icon-video { + background-position: -224px -128px; +} +.ui-icon-script { + background-position: -240px -128px; +} +.ui-icon-alert { + background-position: 0 -144px; +} +.ui-icon-info { + background-position: -16px -144px; +} +.ui-icon-notice { + background-position: -32px -144px; +} +.ui-icon-help { + background-position: -48px -144px; +} +.ui-icon-check { + background-position: -64px -144px; +} +.ui-icon-bullet { + background-position: -80px -144px; +} +.ui-icon-radio-on { + background-position: -96px -144px; +} +.ui-icon-radio-off { + background-position: -112px -144px; +} +.ui-icon-pin-w { + background-position: -128px -144px; +} +.ui-icon-pin-s { + background-position: -144px -144px; +} +.ui-icon-play { + background-position: 0 -160px; +} +.ui-icon-pause { + background-position: -16px -160px; +} +.ui-icon-seek-next { + background-position: -32px -160px; +} +.ui-icon-seek-prev { + background-position: -48px -160px; +} +.ui-icon-seek-end { + background-position: -64px -160px; +} +.ui-icon-seek-start { + background-position: -80px -160px; +} +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { + background-position: -80px -160px; +} +.ui-icon-stop { + background-position: -96px -160px; +} +.ui-icon-eject { + background-position: -112px -160px; +} +.ui-icon-volume-off { + background-position: -128px -160px; +} +.ui-icon-volume-on { + background-position: -144px -160px; +} +.ui-icon-power { + background-position: 0 -176px; +} +.ui-icon-signal-diag { + background-position: -16px -176px; +} +.ui-icon-signal { + background-position: -32px -176px; +} +.ui-icon-battery-0 { + background-position: -48px -176px; +} +.ui-icon-battery-1 { + background-position: -64px -176px; +} +.ui-icon-battery-2 { + background-position: -80px -176px; +} +.ui-icon-battery-3 { + background-position: -96px -176px; +} +.ui-icon-circle-plus { + background-position: 0 -192px; +} +.ui-icon-circle-minus { + background-position: -16px -192px; +} +.ui-icon-circle-close { + background-position: -32px -192px; +} +.ui-icon-circle-triangle-e { + background-position: -48px -192px; +} +.ui-icon-circle-triangle-s { + background-position: -64px -192px; +} +.ui-icon-circle-triangle-w { + background-position: -80px -192px; +} +.ui-icon-circle-triangle-n { + background-position: -96px -192px; +} +.ui-icon-circle-arrow-e { + background-position: -112px -192px; +} +.ui-icon-circle-arrow-s { + background-position: -128px -192px; +} +.ui-icon-circle-arrow-w { + background-position: -144px -192px; +} +.ui-icon-circle-arrow-n { + background-position: -160px -192px; +} +.ui-icon-circle-zoomin { + background-position: -176px -192px; +} +.ui-icon-circle-zoomout { + background-position: -192px -192px; +} +.ui-icon-circle-check { + background-position: -208px -192px; +} +.ui-icon-circlesmall-plus { + background-position: 0 -208px; +} +.ui-icon-circlesmall-minus { + background-position: -16px -208px; +} +.ui-icon-circlesmall-close { + background-position: -32px -208px; +} +.ui-icon-squaresmall-plus { + background-position: -48px -208px; +} +.ui-icon-squaresmall-minus { + background-position: -64px -208px; +} +.ui-icon-squaresmall-close { + background-position: -80px -208px; +} +.ui-icon-grip-dotted-vertical { + background-position: 0 -224px; +} +.ui-icon-grip-dotted-horizontal { + background-position: -16px -224px; +} +.ui-icon-grip-solid-vertical { + background-position: -32px -224px; +} +.ui-icon-grip-solid-horizontal { + background-position: -48px -224px; +} +.ui-icon-gripsmall-diagonal-se { + background-position: -64px -224px; +} +.ui-icon-grip-diagonal-se { + background-position: -80px -224px; +} + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: 0.3; + filter: Alpha(Opacity=30); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: 0px 0px 5px #666666; + box-shadow: 0px 0px 5px #666666; +} diff --git a/public/static/modelView/css/main_style.css b/public/static/modelView/css/main_style.css new file mode 100644 index 0000000..77bcafe --- /dev/null +++ b/public/static/modelView/css/main_style.css @@ -0,0 +1,618 @@ +/* latin-ext */ +@font-face { + font-family: 'Titillium Web'; + font-style: normal; + font-weight: 400; + src: url('/static/modelView/fonts/fontawesome-webfont.woff2') format('woff2'); + unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Titillium Web'; + font-style: normal; + font-weight: 400; + src: url('/static/modelView/fonts/fontawesome-webfont.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +body { + font-family: Helvetica, Arial, sans-serif; + font-size: 10px; + background-color: #292121; /*565646*/ + margin: 0; + padding: 0; +} + +.loading{ + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + color: red; + position: absolute; + top: 0; + left: 0; + z-index: 9999; +} + +#stats { + position: absolute; + right: 10px; + top: 5px; + color: #fff; + text-align: left; + background: rgba(0, 0, 0, 0.5); + padding: 10px; + width: 200px; + height: 80px; + border: solid 1px black; + border-radius: 5px; + font-family: 'Titillium Web', sans-serif; + font-size: 14px; + overflow-x: hidden; +} + +.statsText { + color: #fff27f; +} + +#sampleMods { + position: absolute; + right: 10px; + top: 5px; + margin-top: 108px; + font-family: 'Titillium Web', sans-serif; + font-size: 14px; + color: white; +} + +#anims { + position: absolute; + right: 10px; + top: 5px; + margin-top: 200px; + font-family: 'Titillium Web', sans-serif; + font-size: 14px; + color: white; + display: none; +} + +.animBtn { + box-shadow: inset 0px 1px 0px 0px #030100; + background-color: #2c3e50; + border-radius: 3px; + border: 1px solid #ffffff; + font-family: 'Titillium Web', sans-serif; + cursor: pointer; + color: #ffffff; + font-size: 14.5px; + padding: 10px; + margin-right: 15px; +} + +.animBtn:hover { + background-color: #527aa3; +} + +#stop { + background-color: #e23636; +} +#stop:hover { + background-color: #ad2626; +} + +/* Reset Select */ +select { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + appearance: none; + outline: 0; + box-shadow: none; + border: 0 !important; + background: #2c3e50; + background-image: none; +} + +.select { + position: relative; + display: block; + width: 15.7em; + height: 3em; + line-height: 3; + background: #2c3e50; + overflow: hidden; + border-radius: 0.25em; +} + +select { + width: 100%; + height: 100%; + margin: 0; + padding: 0 0 0 0.5em; + color: #fff; + cursor: pointer; +} + +select::-ms-expand { + display: none; +} + +/* Arrow */ +.select::after { + content: '\25BC'; + position: absolute; + top: 0; + right: 0; + bottom: 0; + padding: 0 1em; + background: #34495e; + pointer-events: none; +} + +/* Transition */ +.select:hover::after { + color: #fff27f; +} +.select::after { + -webkit-transition: 0.25s all ease; + -o-transition: 0.25s all ease; + transition: 0.25s all ease; +} + +#collapse_side { + position: absolute; + left: 20%; + top: 5px; + color: #fff; + background: rgba(0, 0, 0, 0); + padding: 3px; + border: none; + outline: none; + border-radius: 5px; + font-size: 30px; +} + +#collapse_btm { + position: absolute; + left: 20%; + top: 73%; + color: #fff; + background: rgba(0, 0, 0, 0); + padding: 3px; + border: none; + outline: none; + border-radius: 5px; + font-size: 30px; +} + +#fullscreen { + position: absolute; + right: 0; + bottom: 0; +} + +button:focus { + outline: none; /*Remove blue border when clicking buttons*/ +} +button:hover { + cursor: pointer; +} + +#container { + display: block; + margin: 0 auto; + float: right; +} + +#red, +#green, +#blue, +#ambient_red, +#ambient_green, +#ambient_blue, +#shine, +#point_light, +#edgeStrength { + width: 98%; + margin-top: 4px; + font-size: 7.5px; +} + +#rot_slider { + width: 100%; + float: right; + font-size: 7.5px; +} + +#shine .ui-slider-handle, +#point_light .ui-slider-handle, +#edgeStrength .ui-slider-handle { + font-size: 10px; + border-radius: 34px; + outline: none; +} + +#red .ui-slider-range { + background: #ef2929; +} +#red .ui-slider-handle { + border-color: #ef2929; + border-radius: 34px; + outline: none; +} + +#ambient_red .ui-slider-range { + background: #ef2929; +} +#ambient_red .ui-slider-handle { + border-color: #ef2929; + border-radius: 34px; + outline: none; +} + +#green .ui-slider-range { + background: #8ae234; +} +#green .ui-slider-handle { + border-color: #8ae234; + border-radius: 34px; + outline: none; +} + +#ambient_green .ui-slider-range { + background: #8ae234; +} +#ambient_green .ui-slider-handle { + border-color: #8ae234; + border-radius: 34px; + outline: none; +} + +#blue .ui-slider-range { + background: #729fcf; +} +#blue .ui-slider-handle { + border-color: #729fcf; + border-radius: 34px; + outline: none; +} + +#ambient_blue .ui-slider-range { + background: #729fcf; +} +#ambient_blue .ui-slider-handle { + border-color: #729fcf; + border-radius: 34px; + outline: none; +} + +.switch { + position: relative; + display: inline-block; + width: 90px; + height: 34px; +} + +.switch.helper { + position: relative; + display: inline-block; + width: 55px; + height: 24px; + margin-left: 10px; +} + +.switch input { + display: none; +} + +.toggle { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ca2222; + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 34px; +} + +.toggle:before { + position: absolute; + content: ''; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 50%; +} + +.grid:before { + height: 16px; + width: 16px; +} + +.toggle:after { + content: 'OFF'; + color: white; + display: block; + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 70%; + font-size: 12px; + font-family: Verdana, sans-serif; +} + +input:checked + .toggle:after { + content: 'ON'; + left: 30%; +} + +input:checked + .toggle { + background-color: #2ab934; +} + +input:focus + .toggle { + box-shadow: 0 0 1px #2196f3; +} + +input:checked + .toggle:before { + -webkit-transform: translateX(55px); + -ms-transform: translateX(55px); + transform: translateX(55px); +} + +input:checked + .grid:before { + -webkit-transform: translateX(30px); + -ms-transform: translateX(30px); + transform: translateX(30px); +} + +.side_menu { + width: 19%; + height: 100%; + position: absolute; + border: 3px groove #e5e5e5; + background-color: #494a4c; + bottom: 0; + top: 0; + left: 0; + overflow: auto; + overflow-x: hidden; + box-sizing: border-box; +} + +.menu_item { + width: 100%; + margin: 0; + margin-top: 5px; + padding: 0; + list-style: none; + font-family: "Titillium Web",sans-serif; + font-size: 15px; +} + +.menu_item li#header { + color: #fff; + background-color: #3d5c5c; + padding: 4px 12px; + border: 3px double #bbb; + text-align: center; +} + +#lightSkin, +#darkSkin { + color: #fff; + background-color: #3d5c5c; + outline: none; + /* border-style: ridge; */ +} +#lightSkin:hover, +#darkSkin:hover { + background: #494a4c; + text-decoration: none; +} + +.menu_item li.dropdown { + color: #fff; + padding: 4px 12px; + border: 3px solid #bbb; +} + +.customMenu { + display: flex; + justify-content: space-between; + align-items: center; +} + +.menu_item li, +.bottom_menu_item li { + border-top: 0; + margin: 0; + /* background: #1d1e1e; */ + margin-top: 8px; +} +.menu_item li a, +.bottom_menu_item li a { + text-decoration: none; + color: #fff; + display: inline-block; + padding: 5px 12px; + width: 93%; + display: flex; + align-items: center; +} +.menu_item li a:hover, +.bottom_menu_item li a:hover { + background: #494a4c; + text-decoration: none; +} +.menu_item li ul, +.bottom_menu_item li ul { + list-style: none; + display: none; + margin: 0; + padding: 0; +} + +.menu_item li ul li, +.bottom_menu_item li ul li { + /* background: #1d1e1e; */ + margin: 0; + border: 0; +} + +.image { + float: left; + padding-right: 25px; +} + +#bottom_menu { + width: 80%; + height: 15%; + font-size: 15px; + color: #fff; + position: absolute; + border: 3px groove #e5e5e5; + background-color: #494a4c; + bottom: 0; + left: 19.5%; + overflow: auto; +} + +.bottom_menu_item { + width: 100%; + margin: 0; + margin-top: 0.5px; + padding: 0; + list-style: none; + font-family: 'Titillium Web', sans-serif; + font-size: 15px; +} + +.bottom_menu_item li.dropdown { + color: #fff; + padding: 4px 12px; + border: 3px solid #bbb; + display: inline-block; + float: left; + width: 30%; +} + +.resetRotateButton { + -moz-box-shadow: inset 0px 1px 0px 0px #030100; + -webkit-box-shadow: inset 0px 1px 0px 0px #030100; + box-shadow: inset 0px 1px 0px 0px #030100; + background-color: #28ad57; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border: 1px solid #ffffff; + display: inline-block; + cursor: pointer; + color: #ffffff; + font-family: Arial; + font-size: 13px; + padding: 6px 24px; + text-decoration: none; + text-shadow: 0px 1px 0px #9e5351; + margin-right: 5px; +} + +.radioBtn { + display: inline-block; + margin-right: 11px; + background-color: #28ad57; + padding: 6px; + border: 2px solid #ffffff; +} + +.resetRotateButton { + background-color: #dd3d0c; + margin-top: 5px; + width: 97%; + font-size: 15px; +} + +.resetRotateButton:hover { + background-color: #b43008; +} + +#transformKey { + display: none; + margin-left: 25px; + font-size: 15px; +} + +#scale_up, +#scale_down { + background-color: #000099; + border-radius: 7px; + text-shadow: 0px 1px 3px #666666; + font-family: Arial; + color: #ffffff; + font-size: 17px; + padding: 4px 12px 4px 12px; + border: solid #000033 4px; + text-decoration: none; +} + +#scale_up:hover, +#scale_down:hover { + background-color: #4d4dff; +} + +#obj_file, +#modelPlusTexture { + display: none; +} +.model-upload, +#remove { + border: 1px solid #ccc; + display: inline-block; + padding: 6px 12px; + cursor: pointer; + color: #fff; + background: #4b5f83; +} + +.model-upload:hover { + background: #009999; +} + +#remove { + padding: 9px 12.5px; + font-size: 14px; + background: #b90a0a; +} +#remove:hover { + background: #e23636; +} + +.qBtn { + background: #1d1e1e; + border: none; + outline: none; + margin-left: 16px; +} + +.q_mark { + background-color: #fff; + border-radius: 50%; + color: #76bdd5; + font-size: 25px; + height: 17px; + line-height: 17px; + width: 19px; +} + +.ui-dialog-title { + font-size: 20px; +} diff --git a/public/static/modelView/css/spectrum.css b/public/static/modelView/css/spectrum.css new file mode 100644 index 0000000..876c486 --- /dev/null +++ b/public/static/modelView/css/spectrum.css @@ -0,0 +1,507 @@ +/*** +Spectrum Colorpicker v1.5.1 +https://github.com/bgrins/spectrum +Author: Brian Grinstead +License: MIT +***/ + +.sp-container { + position:absolute; + top:0; + left:0; + display:inline-block; + *display: inline; + *zoom: 1; + /* https://github.com/bgrins/spectrum/issues/40 */ + z-index: 9999994; + overflow: hidden; +} +.sp-container.sp-flat { + position: relative; +} + +/* Fix for * { box-sizing: border-box; } */ +.sp-container, +.sp-container * { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ +.sp-top { + position:relative; + width: 100%; + display:inline-block; +} +.sp-top-inner { + position:absolute; + top:0; + left:0; + bottom:0; + right:0; +} +.sp-color { + position: absolute; + top:0; + left:0; + bottom:0; + right:20%; +} +.sp-hue { + position: absolute; + top:0; + right:0; + bottom:0; + left:84%; + height: 100%; +} + +.sp-clear-enabled .sp-hue { + top:33px; + height: 77.5%; +} + +.sp-fill { + padding-top: 80%; +} +.sp-sat, .sp-val { + position: absolute; + top:0; + left:0; + right:0; + bottom:0; +} + +.sp-alpha-enabled .sp-top { + margin-bottom: 18px; +} +.sp-alpha-enabled .sp-alpha { + display: block; +} +.sp-alpha-handle { + position:absolute; + top:-4px; + bottom: -4px; + width: 6px; + left: 50%; + cursor: pointer; + border: 1px solid black; + background: white; + opacity: .8; +} +.sp-alpha { + display: none; + position: absolute; + bottom: -14px; + right: 0; + left: 0; + height: 8px; +} +.sp-alpha-inner { + border: solid 1px #333; +} + +.sp-clear { + display: none; +} + +.sp-clear.sp-clear-display { + background-position: center; +} + +.sp-clear-enabled .sp-clear { + display: block; + position:absolute; + top:0px; + right:0; + bottom:0; + left:84%; + height: 28px; +} + +/* Don't allow text selection */ +.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { + -webkit-user-select:none; + -moz-user-select: -moz-none; + -o-user-select:none; + user-select: none; +} + +.sp-container.sp-input-disabled .sp-input-container { + display: none; +} +.sp-container.sp-buttons-disabled .sp-button-container { + display: none; +} +.sp-container.sp-palette-buttons-disabled .sp-palette-button-container { + display: none; +} +.sp-palette-only .sp-picker-container { + display: none; +} +.sp-palette-disabled .sp-palette-container { + display: none; +} + +.sp-initial-disabled .sp-initial { + display: none; +} + + +/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ +.sp-sat { + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; + filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); +} +.sp-val { + background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; + filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); +} + +.sp-hue { + background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); + background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); +} + +/* IE filters do not support multiple color stops. + Generate 6 divs, line them up, and do two color gradients for each. + Yes, really. + */ +.sp-1 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); +} +.sp-2 { + height:16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); +} +.sp-3 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); +} +.sp-4 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); +} +.sp-5 { + height:16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); +} +.sp-6 { + height:17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); +} + +.sp-hidden { + display: none !important; +} + +/* Clearfix hack */ +.sp-cf:before, .sp-cf:after { content: ""; display: table; } +.sp-cf:after { clear: both; } +.sp-cf { *zoom: 1; } + +/* Mobile devices, make hue slider bigger so it is easier to slide */ +@media (max-device-width: 480px) { + .sp-color { right: 40%; } + .sp-hue { left: 63%; } + .sp-fill { padding-top: 60%; } +} +.sp-dragger { + border-radius: 5px; + height: 5px; + width: 5px; + border: 1px solid #fff; + background: #000; + cursor: pointer; + position:absolute; + top:0; + left: 0; +} +.sp-slider { + position: absolute; + top:0; + cursor:pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid #000; + background: white; + opacity: .8; +} + +/* +Theme authors: +Here are the basic themeable display options (colors, fonts, global widths). +See http://bgrins.github.io/spectrum/themes/ for instructions. +*/ + +.sp-container { + border-radius: 0; + background-color: #ECECEC; + border: solid 1px #f0c49B; + padding: 0; +} +.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear { + font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} +.sp-top { + margin-bottom: 3px; +} +.sp-color, .sp-hue, .sp-clear { + border: solid 1px #666; +} + +/* Input */ +.sp-input-container { + float:right; + width: 100px; + margin-bottom: 4px; +} +.sp-initial-disabled .sp-input-container { + width: 100%; +} +.sp-input { + font-size: 12px !important; + border: 1px inset; + padding: 4px 5px; + margin: 0; + width: 100%; + background:transparent; + border-radius: 3px; + color: #222; +} +.sp-input:focus { + border: 1px solid orange; +} +.sp-input.sp-validation-error { + border: 1px solid red; + background: #fdd; +} +.sp-picker-container , .sp-palette-container { + float:left; + position: relative; + padding: 10px; + padding-bottom: 300px; + margin-bottom: -290px; +} +.sp-picker-container { + width: 172px; + border-left: solid 1px #fff; +} + +/* Palettes */ +.sp-palette-container { + border-right: solid 1px #ccc; +} + +.sp-palette-only .sp-palette-container { + border: 0; +} + +.sp-palette .sp-thumb-el { + display: block; + position:relative; + float:left; + width: 24px; + height: 15px; + margin: 3px; + cursor: pointer; + border:solid 2px transparent; +} +.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { + border-color: orange; +} +.sp-thumb-el { + position:relative; +} + +/* Initial */ +.sp-initial { + float: left; + border: solid 1px #333; +} +.sp-initial span { + width: 30px; + height: 25px; + border:none; + display:block; + float:left; + margin:0; +} + +.sp-initial .sp-clear-display { + background-position: center; +} + +/* Buttons */ +.sp-palette-button-container, +.sp-button-container { + float: right; +} + +/* Replacer (the little preview div that shows up instead of the <input>) */ +.sp-replacer { + margin:0; + overflow:hidden; + cursor:pointer; + padding: 4px; + display:inline-block; + *zoom: 1; + *display: inline; + border: solid 1px #91765d; + background: #eee; + color: #333; + vertical-align: middle; +} +.sp-replacer:hover, .sp-replacer.sp-active { + border-color: #F0C49B; + color: #111; +} +.sp-replacer.sp-disabled { + cursor:default; + border-color: silver; + color: silver; +} +.sp-dd { + padding: 2px 0; + height: 16px; + line-height: 16px; + float:left; + font-size:10px; +} +.sp-preview { + position:relative; + width:25px; + height: 20px; + border: solid 1px #222; + margin-right: 5px; + float:left; + z-index: 0; +} + +.sp-palette { + *width: 220px; + max-width: 220px; +} +.sp-palette .sp-thumb-el { + width:16px; + height: 16px; + margin:2px 1px; + border: solid 1px #d0d0d0; +} + +.sp-container { + padding-bottom:0; +} + + +/* Buttons: http://hellohappy.org/css3-buttons/ */ +.sp-container button { + background-color: #eeeeee; + background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); + background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); + background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); + background-image: -o-linear-gradient(top, #eeeeee, #cccccc); + background-image: linear-gradient(to bottom, #eeeeee, #cccccc); + border: 1px solid #ccc; + border-bottom: 1px solid #bbb; + border-radius: 3px; + color: #333; + font-size: 14px; + line-height: 1; + padding: 5px 4px; + text-align: center; + text-shadow: 0 1px 0 #eee; + vertical-align: middle; +} +.sp-container button:hover { + background-color: #dddddd; + background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); + background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); + background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); + background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); + background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); + border: 1px solid #bbb; + border-bottom: 1px solid #999; + cursor: pointer; + text-shadow: 0 1px 0 #ddd; +} +.sp-container button:active { + border: 1px solid #aaa; + border-bottom: 1px solid #888; + -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; +} +.sp-cancel { + font-size: 11px; + color: #d93f3f !important; + margin:0; + padding:2px; + margin-right: 5px; + vertical-align: middle; + text-decoration:none; + +} +.sp-cancel:hover { + color: #d93f3f !important; + text-decoration: underline; +} + + +.sp-palette span:hover, .sp-palette span.sp-thumb-active { + border-color: #000; +} + +.sp-preview, .sp-alpha, .sp-thumb-el { + position:relative; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); +} +.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner { + display:block; + position:absolute; + top:0;left:0;bottom:0;right:0; +} + +.sp-palette .sp-thumb-inner { + background-position: 50% 50%; + background-repeat: no-repeat; +} + +.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); +} + +.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); +} + +.sp-clear-display { + background-repeat:no-repeat; + background-position: center; + background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); +} diff --git a/public/static/modelView/favicon.ico b/public/static/modelView/favicon.ico new file mode 100644 index 0000000..c731006 --- /dev/null +++ b/public/static/modelView/favicon.ico Binary files differ diff --git a/public/static/modelView/fonts/FontAwesome.otf b/public/static/modelView/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f --- /dev/null +++ b/public/static/modelView/fonts/FontAwesome.otf Binary files differ diff --git a/public/static/modelView/fonts/FontAwesome_Regular.json b/public/static/modelView/fonts/FontAwesome_Regular.json new file mode 100644 index 0000000..ca470f3 --- /dev/null +++ b/public/static/modelView/fonts/FontAwesome_Regular.json @@ -0,0 +1 @@ +{"glyphs":{" ":{"ha":347,"x_min":0,"x_max":0,"o":""},"篓":{"ha":1389,"x_min":0,"x_max":0,"o":""},"漏":{"ha":1389,"x_min":0,"x_max":0,"o":""},"庐":{"ha":1389,"x_min":0,"x_max":0,"o":""},"麓":{"ha":1389,"x_min":0,"x_max":0,"o":""},"脝":{"ha":1389,"x_min":0,"x_max":0,"o":""},"脴":{"ha":1389,"x_min":0,"x_max":0,"o":""},"鈩�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"鈭�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"鈮�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飥�":{"ha":1389,"x_min":72,"x_max":1317,"o":"m 1317 1046 q 1283 986 1317 1019 l 794 496 l 794 -99 l 1042 -99 q 1077 -114 1062 -99 q 1091 -149 1091 -129 q 1077 -184 1091 -169 q 1042 -198 1062 -198 l 347 -198 q 312 -184 327 -198 q 298 -149 298 -169 q 312 -114 298 -129 q 347 -99 327 -99 l 595 -99 l 595 496 l 105 986 q 72 1046 72 1019 q 86 1075 72 1064 q 115 1088 100 1085 q 149 1091 131 1091 l 1240 1091 q 1273 1088 1258 1091 q 1303 1075 1289 1085 q 1317 1046 1317 1064 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 1017 l 1190 149 q 1164 80 1190 110 q 1097 33 1138 50 q 1017 8 1057 16 q 942 0 977 0 q 868 8 908 0 q 787 33 828 16 q 721 80 747 50 q 694 149 694 110 q 721 218 694 188 q 787 265 747 248 q 868 289 828 281 q 942 298 908 298 q 1091 267 1024 298 l 1091 684 l 496 500 l 496 -50 q 470 -119 496 -88 q 403 -165 443 -149 q 323 -190 363 -182 q 248 -198 283 -198 q 173 -190 213 -198 q 93 -165 133 -182 q 26 -119 53 -149 q 0 -50 0 -88 q 26 19 0 -11 q 93 66 53 50 q 173 91 133 83 q 248 99 213 99 q 397 69 329 99 l 397 818 q 412 862 397 842 q 450 890 426 882 l 1094 1088 q 1116 1091 1104 1091 q 1169 1070 1147 1091 q 1190 1017 1190 1048 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 791 300 q 842 351 791 300 q 893 546 893 402 q 791 791 893 689 q 546 893 689 893 q 300 791 402 893 q 198 546 198 689 q 300 300 198 402 q 546 198 402 198 q 791 300 689 198 m 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 q 1121 -169 1149 -198 l 855 96 q 546 0 716 0 q 334 43 435 0 q 159 159 233 86 q 43 334 86 233 q 0 546 0 435 q 43 758 0 656 q 159 932 86 859 q 334 1048 233 1005 q 546 1091 435 1091 q 758 1048 656 1091 q 932 932 859 1005 q 1048 758 1005 859 q 1091 546 1091 656 q 995 236 1091 375 l 1261 -29 q 1290 -99 1290 -58 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1290 25 l 1290 620 q 1236 569 1265 592 q 906 307 1028 409 q 842 255 867 274 q 775 217 817 236 q 695 198 732 198 l 694 198 l 694 198 q 614 217 656 198 q 547 255 572 236 q 483 307 522 274 q 153 569 360 409 q 99 620 124 592 l 99 25 q 107 7 99 15 q 124 0 114 0 l 1265 0 q 1282 7 1275 0 q 1290 25 1290 15 m 1290 839 q 1290 848 1290 841 q 1290 858 1290 855 q 1289 868 1290 862 q 1287 878 1289 875 q 1283 885 1285 881 q 1276 891 1280 889 q 1265 893 1271 893 l 124 893 q 107 885 114 893 q 99 868 99 878 q 213 648 99 738 q 524 402 363 530 q 551 379 529 398 q 587 350 574 360 q 621 326 600 340 q 660 305 643 312 q 694 298 678 298 l 694 298 l 695 298 q 729 305 711 298 q 768 326 746 312 q 802 350 789 340 q 838 379 815 360 q 865 402 860 398 q 1176 648 1026 530 q 1254 737 1218 681 q 1290 839 1290 794 m 1389 868 l 1389 25 q 1352 -63 1389 -26 q 1265 -99 1316 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 868 q 36 956 0 919 q 124 992 73 992 l 1265 992 q 1352 956 1316 992 q 1389 868 1389 919 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 729 -85 q 694 -99 715 -99 q 660 -85 674 -99 l 177 381 q 155 401 169 388 q 112 452 142 415 q 60 528 83 489 q 18 622 36 567 q 0 729 0 677 q 98 995 0 899 q 370 1091 197 1091 q 469 1075 419 1091 q 562 1030 519 1058 q 636 977 605 1001 q 694 924 667 952 q 753 977 722 952 q 827 1030 784 1001 q 920 1075 870 1058 q 1018 1091 970 1091 q 1290 995 1192 1091 q 1389 729 1389 899 q 1211 380 1389 557 l 729 -85 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1290 689 q 1270 652 1290 672 l 988 377 l 1055 -10 q 1056 -26 1056 -16 q 1047 -53 1056 -42 q 1024 -64 1039 -64 q 993 -55 1009 -64 l 645 128 l 297 -55 q 266 -64 280 -64 q 241 -53 250 -64 q 233 -26 233 -42 q 235 -10 233 -21 l 301 377 l 19 652 q 0 689 0 673 q 43 725 0 718 l 432 781 l 607 1134 q 645 1166 622 1166 q 683 1134 668 1166 l 857 781 l 1246 725 q 1290 689 1290 718 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 881 412 l 1118 643 l 791 691 l 645 987 l 498 691 l 171 643 l 408 412 l 352 86 l 645 240 l 937 86 l 881 412 m 1290 689 q 1270 652 1290 672 l 988 377 l 1055 -10 q 1056 -26 1056 -16 q 1024 -64 1056 -64 q 993 -55 1009 -64 l 645 128 l 297 -55 q 266 -64 280 -64 q 241 -53 250 -64 q 233 -26 233 -42 q 235 -10 233 -21 l 301 377 l 19 652 q 0 689 0 673 q 43 725 0 718 l 432 781 l 607 1134 q 645 1166 622 1166 q 683 1134 668 1166 l 857 781 l 1246 725 q 1290 689 1290 718 z "},"飥�":{"ha":992,"x_min":0,"x_max":992,"o":"m 992 106 q 944 -39 992 22 q 827 -99 895 -99 l 165 -99 q 48 -39 97 -99 q 0 106 0 22 q 7 231 0 172 q 31 348 13 289 q 76 450 49 408 q 149 519 104 492 q 253 546 195 546 q 496 446 355 446 q 739 546 637 446 q 843 519 798 546 q 916 450 888 492 q 961 348 943 408 q 985 231 979 289 q 992 106 992 172 m 706 1004 q 750 960 706 1004 q 794 794 794 917 q 706 583 794 670 q 496 496 619 496 q 286 583 373 496 q 198 794 198 670 q 286 1004 198 917 q 496 1091 373 1091 q 706 1004 619 1091 z "},"飥�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 298 -50 l 298 50 q 283 84 298 70 q 248 99 268 99 l 149 99 q 114 84 129 99 q 99 50 99 70 l 99 -50 q 114 -84 99 -70 q 149 -99 129 -99 l 248 -99 q 283 -84 268 -99 q 298 -50 298 -70 m 298 248 l 298 347 q 283 382 298 367 q 248 397 268 397 l 149 397 q 114 382 129 397 q 99 347 99 367 l 99 248 q 114 213 99 228 q 149 198 129 198 l 248 198 q 283 213 268 198 q 298 248 298 228 m 298 546 l 298 645 q 283 680 298 665 q 248 694 268 694 l 149 694 q 114 680 129 694 q 99 645 99 665 l 99 546 q 114 511 99 525 q 149 496 129 496 l 248 496 q 283 511 268 496 q 298 546 298 525 m 1091 -50 l 1091 347 q 1077 382 1091 367 q 1042 397 1062 397 l 446 397 q 412 382 426 397 q 397 347 397 367 l 397 -50 q 412 -84 397 -70 q 446 -99 426 -99 l 1042 -99 q 1077 -84 1062 -99 q 1091 -50 1091 -70 m 298 843 l 298 942 q 283 977 298 963 q 248 992 268 992 l 149 992 q 114 977 129 992 q 99 942 99 963 l 99 843 q 114 808 99 823 q 149 794 129 794 l 248 794 q 283 808 268 794 q 298 843 298 823 m 1389 -50 l 1389 50 q 1374 84 1389 70 q 1339 99 1359 99 l 1240 99 q 1205 84 1220 99 q 1190 50 1190 70 l 1190 -50 q 1205 -84 1190 -70 q 1240 -99 1220 -99 l 1339 -99 q 1374 -84 1359 -99 q 1389 -50 1389 -70 m 1091 546 l 1091 942 q 1077 977 1091 963 q 1042 992 1062 992 l 446 992 q 412 977 426 992 q 397 942 397 963 l 397 546 q 412 511 397 525 q 446 496 426 496 l 1042 496 q 1077 511 1062 496 q 1091 546 1091 525 m 1389 248 l 1389 347 q 1374 382 1389 367 q 1339 397 1359 397 l 1240 397 q 1205 382 1220 397 q 1190 347 1190 367 l 1190 248 q 1205 213 1190 228 q 1240 198 1220 198 l 1339 198 q 1374 213 1359 198 q 1389 248 1389 228 m 1389 546 l 1389 645 q 1374 680 1389 665 q 1339 694 1359 694 l 1240 694 q 1205 680 1220 694 q 1190 645 1190 665 l 1190 546 q 1205 511 1190 525 q 1240 496 1220 496 l 1339 496 q 1374 511 1359 496 q 1389 546 1389 525 m 1389 843 l 1389 942 q 1374 977 1389 963 q 1339 992 1359 992 l 1240 992 q 1205 977 1220 992 q 1190 942 1190 963 l 1190 843 q 1205 808 1190 823 q 1240 794 1220 794 l 1339 794 q 1374 808 1359 794 q 1389 843 1389 823 m 1488 967 l 1488 -74 q 1452 -162 1488 -126 q 1364 -198 1415 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1364 1091 q 1452 1055 1415 1091 q 1488 967 1488 1018 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 595 397 l 595 99 q 566 29 595 59 q 496 0 536 0 l 99 0 q 29 29 59 0 q 0 99 0 59 l 0 397 q 29 467 0 437 q 99 496 59 496 l 496 496 q 566 467 536 496 q 595 397 595 437 m 595 992 l 595 694 q 566 625 595 654 q 496 595 536 595 l 99 595 q 29 625 59 595 q 0 694 0 654 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 496 1091 q 566 1062 536 1091 q 595 992 595 1032 m 1290 397 l 1290 99 q 1260 29 1290 59 q 1190 0 1231 0 l 794 0 q 724 29 753 0 q 694 99 694 59 l 694 397 q 724 467 694 437 q 794 496 753 496 l 1190 496 q 1260 467 1231 496 q 1290 397 1290 437 m 1290 992 l 1290 694 q 1260 625 1290 654 q 1190 595 1231 595 l 794 595 q 724 625 753 595 q 694 694 694 654 l 694 992 q 724 1062 694 1032 q 794 1091 753 1091 l 1190 1091 q 1260 1062 1231 1091 q 1290 992 1290 1032 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 397 223 l 397 74 q 375 22 397 43 q 322 0 353 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 223 q 22 276 0 254 q 74 298 43 298 l 322 298 q 375 276 353 298 q 397 223 397 254 m 397 620 l 397 471 q 375 419 397 440 q 322 397 353 397 l 74 397 q 22 419 43 397 q 0 471 0 440 l 0 620 q 22 673 0 651 q 74 694 43 694 l 322 694 q 375 673 353 694 q 397 620 397 651 m 893 223 l 893 74 q 871 22 893 43 q 818 0 849 0 l 570 0 q 518 22 539 0 q 496 74 496 43 l 496 223 q 518 276 496 254 q 570 298 539 298 l 818 298 q 871 276 849 298 q 893 223 893 254 m 397 1017 l 397 868 q 375 815 397 837 q 322 794 353 794 l 74 794 q 22 815 43 794 q 0 868 0 837 l 0 1017 q 22 1070 0 1048 q 74 1091 43 1091 l 322 1091 q 375 1070 353 1091 q 397 1017 397 1048 m 893 620 l 893 471 q 871 419 893 440 q 818 397 849 397 l 570 397 q 518 419 539 397 q 496 471 496 440 l 496 620 q 518 673 496 651 q 570 694 539 694 l 818 694 q 871 673 849 694 q 893 620 893 651 m 1389 223 l 1389 74 q 1367 22 1389 43 q 1314 0 1345 0 l 1066 0 q 1014 22 1035 0 q 992 74 992 43 l 992 223 q 1014 276 992 254 q 1066 298 1035 298 l 1314 298 q 1367 276 1345 298 q 1389 223 1389 254 m 893 1017 l 893 868 q 871 815 893 837 q 818 794 849 794 l 570 794 q 518 815 539 794 q 496 868 496 837 l 496 1017 q 518 1070 496 1048 q 570 1091 539 1091 l 818 1091 q 871 1070 849 1091 q 893 1017 893 1048 m 1389 620 l 1389 471 q 1367 419 1389 440 q 1314 397 1345 397 l 1066 397 q 1014 419 1035 397 q 992 471 992 440 l 992 620 q 1014 673 992 651 q 1066 694 1035 694 l 1314 694 q 1367 673 1345 694 q 1389 620 1389 651 m 1389 1017 l 1389 868 q 1367 815 1389 837 q 1314 794 1345 794 l 1066 794 q 1014 815 1035 794 q 992 868 992 837 l 992 1017 q 1014 1070 992 1048 q 1066 1091 1035 1091 l 1314 1091 q 1367 1070 1345 1091 q 1389 1017 1389 1048 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 397 223 l 397 74 q 375 22 397 43 q 322 0 353 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 223 q 22 276 0 254 q 74 298 43 298 l 322 298 q 375 276 353 298 q 397 223 397 254 m 397 620 l 397 471 q 375 419 397 440 q 322 397 353 397 l 74 397 q 22 419 43 397 q 0 471 0 440 l 0 620 q 22 673 0 651 q 74 694 43 694 l 322 694 q 375 673 353 694 q 397 620 397 651 m 1389 223 l 1389 74 q 1367 22 1389 43 q 1314 0 1345 0 l 570 0 q 518 22 539 0 q 496 74 496 43 l 496 223 q 518 276 496 254 q 570 298 539 298 l 1314 298 q 1367 276 1345 298 q 1389 223 1389 254 m 397 1017 l 397 868 q 375 815 397 837 q 322 794 353 794 l 74 794 q 22 815 43 794 q 0 868 0 837 l 0 1017 q 22 1070 0 1048 q 74 1091 43 1091 l 322 1091 q 375 1070 353 1091 q 397 1017 397 1048 m 1389 620 l 1389 471 q 1367 419 1389 440 q 1314 397 1345 397 l 570 397 q 518 419 539 397 q 496 471 496 440 l 496 620 q 518 673 496 651 q 570 694 539 694 l 1314 694 q 1367 673 1345 694 q 1389 620 1389 651 m 1389 1017 l 1389 868 q 1367 815 1389 837 q 1314 794 1345 794 l 570 794 q 518 815 539 794 q 496 868 496 837 l 496 1017 q 518 1070 496 1048 q 570 1091 539 1091 l 1314 1091 q 1367 1070 1345 1091 q 1389 1017 1389 1048 z "},"飥�":{"ha":1389,"x_min":94,"x_max":1295,"o":"m 1273 805 q 1295 752 1295 783 q 1273 699 1295 721 l 712 138 l 607 33 q 554 11 585 11 q 501 33 523 11 l 396 138 l 115 419 q 94 471 94 440 q 115 524 94 502 l 221 629 q 274 651 243 651 q 326 629 305 651 l 554 401 l 1063 910 q 1115 932 1084 932 q 1168 910 1146 932 l 1273 805 z "},"飥�":{"ha":1091,"x_min":85,"x_max":1006,"o":"m 984 219 q 1006 166 1006 197 q 984 113 1006 135 l 879 8 q 826 -14 857 -14 q 773 8 795 -14 l 546 236 l 318 8 q 265 -14 296 -14 q 212 8 234 -14 l 107 113 q 85 166 85 135 q 107 219 85 197 l 335 446 l 107 674 q 85 727 85 696 q 107 780 85 758 l 212 885 q 265 907 234 907 q 318 885 296 907 l 546 657 l 773 885 q 826 907 795 907 q 879 885 857 907 l 984 780 q 1006 727 1006 758 q 984 674 1006 696 l 756 446 l 984 219 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 794 570 l 794 521 q 786 503 794 511 q 769 496 779 496 l 595 496 l 595 322 q 588 305 595 312 q 570 298 581 298 l 521 298 q 503 305 511 298 q 496 322 496 312 l 496 496 l 322 496 q 305 503 312 496 q 298 521 298 511 l 298 570 q 305 588 298 581 q 322 595 312 595 l 496 595 l 496 769 q 503 786 496 779 q 521 794 511 794 l 570 794 q 588 786 581 794 q 595 769 595 779 l 595 595 l 769 595 q 786 588 779 595 q 794 570 794 581 m 791 300 q 842 351 791 300 q 893 546 893 402 q 791 791 893 689 q 546 893 689 893 q 300 791 402 893 q 198 546 198 689 q 300 300 198 402 q 546 198 402 198 q 791 300 689 198 m 1261 -29 q 1290 -99 1290 -58 q 1261 -169 1290 -140 q 1190 -198 1232 -198 q 1121 -169 1149 -198 l 855 96 q 546 0 716 0 q 334 43 435 0 q 159 159 233 86 q 43 334 86 233 q 0 546 0 435 q 43 758 0 656 q 159 932 86 859 q 334 1048 233 1005 q 546 1091 435 1091 q 758 1048 656 1091 q 932 932 859 1005 q 1048 758 1005 859 q 1091 546 1091 656 q 995 236 1091 375 l 1261 -29 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 794 570 l 794 521 q 786 503 794 511 q 769 496 779 496 l 322 496 q 305 503 312 496 q 298 521 298 511 l 298 570 q 305 588 298 581 q 322 595 312 595 l 769 595 q 786 588 779 595 q 794 570 794 581 m 791 300 q 842 351 791 300 q 893 546 893 402 q 791 791 893 689 q 546 893 689 893 q 300 791 402 893 q 198 546 198 689 q 300 300 198 402 q 546 198 402 198 q 791 300 689 198 m 1261 -29 q 1290 -99 1290 -58 q 1261 -169 1290 -140 q 1190 -198 1232 -198 q 1121 -169 1149 -198 l 855 96 q 546 0 716 0 q 334 43 435 0 q 159 159 233 86 q 43 334 86 233 q 0 546 0 435 q 43 758 0 656 q 159 932 86 859 q 334 1048 233 1005 q 546 1091 435 1091 q 758 1048 656 1091 q 932 932 859 1005 q 1048 758 1005 859 q 1091 546 1091 656 q 995 236 1091 375 l 1261 -29 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 496 q 1143 265 1190 375 q 1016 75 1096 155 q 826 -52 936 -5 q 595 -99 716 -99 q 364 -52 474 -99 q 174 75 254 -5 q 47 265 95 155 q 0 496 0 375 q 62 762 0 637 q 238 971 125 887 q 312 991 271 996 q 377 952 353 985 q 396 879 401 919 q 357 813 390 838 q 240 673 281 756 q 198 496 198 590 q 230 342 198 415 q 315 215 261 269 q 441 131 368 162 q 595 99 515 99 q 749 131 676 99 q 876 215 822 162 q 961 342 929 269 q 992 496 992 415 q 951 673 992 590 q 833 813 909 756 q 795 879 801 838 q 814 952 789 919 q 879 991 838 985 q 953 971 920 996 q 1128 762 1066 887 q 1190 496 1190 637 m 694 1091 l 694 595 q 665 525 694 555 q 595 496 636 496 q 525 525 555 496 q 496 595 496 555 l 496 1091 q 525 1161 496 1132 q 595 1190 555 1190 q 665 1161 636 1190 q 694 1091 694 1132 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 198 74 l 198 -74 q 191 -92 198 -85 q 174 -99 184 -99 l 25 -99 q 7 -92 14 -99 q 0 -74 0 -85 l 0 74 q 7 92 0 85 q 25 99 14 99 l 174 99 q 191 92 184 99 q 198 74 198 85 m 496 174 l 496 -74 q 489 -92 496 -85 q 471 -99 482 -99 l 322 -99 q 305 -92 312 -99 q 298 -74 298 -85 l 298 174 q 305 191 298 184 q 322 198 312 198 l 471 198 q 489 191 482 198 q 496 174 496 184 m 794 372 l 794 -74 q 787 -92 794 -85 q 769 -99 780 -99 l 620 -99 q 602 -92 609 -99 q 595 -74 595 -85 l 595 372 q 602 390 595 383 q 620 397 609 397 l 769 397 q 787 390 780 397 q 794 372 794 383 m 1091 670 l 1091 -74 q 1084 -92 1091 -85 q 1066 -99 1077 -99 l 918 -99 q 900 -92 907 -99 q 893 -74 893 -85 l 893 670 q 900 687 893 680 q 918 694 907 694 l 1066 694 q 1084 687 1077 694 q 1091 670 1091 680 m 1389 1066 l 1389 -74 q 1382 -92 1389 -85 q 1364 -99 1375 -99 l 1215 -99 q 1197 -92 1204 -99 q 1190 -74 1190 -85 l 1190 1066 q 1197 1084 1190 1077 q 1215 1091 1204 1091 l 1364 1091 q 1382 1084 1375 1091 q 1389 1066 1389 1077 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 736 356 q 765 385 736 356 q 794 496 794 414 q 736 636 794 578 q 595 694 677 694 q 455 636 513 694 q 397 496 397 578 q 455 356 397 414 q 595 298 513 298 q 736 356 677 298 m 1190 581 l 1190 408 q 1184 391 1190 399 q 1169 381 1178 382 l 1025 359 q 995 288 1011 317 q 1078 181 1022 250 q 1086 162 1086 172 q 1079 144 1086 152 q 1002 60 1058 115 q 929 5 946 5 q 909 12 920 5 l 802 96 q 732 67 768 78 q 709 -78 719 -39 q 681 -99 704 -99 l 509 -99 q 490 -93 498 -99 q 481 -76 482 -86 l 460 67 q 390 95 422 79 l 281 12 q 261 5 273 5 q 242 14 250 5 q 114 144 144 102 q 109 162 109 152 q 115 180 109 171 q 154 231 126 196 q 196 286 182 267 q 164 363 175 325 l 22 384 q 6 393 12 385 q 0 412 0 401 l 0 584 q 6 601 0 593 q 21 612 12 610 l 165 633 q 195 705 176 669 q 112 811 164 749 q 105 830 105 821 q 112 848 105 838 q 188 931 132 876 q 261 987 244 987 q 281 979 271 987 l 388 896 q 459 925 422 914 q 481 1070 471 1031 q 509 1091 487 1091 l 681 1091 q 700 1085 692 1091 q 709 1068 708 1078 l 731 925 q 801 897 769 913 l 911 980 q 929 987 918 987 q 949 979 939 987 q 1077 847 1049 887 q 1082 830 1082 841 q 1076 812 1082 821 q 1036 761 1064 796 q 994 706 1008 725 q 1026 630 1015 667 l 1168 608 q 1184 599 1178 607 q 1190 581 1190 591 z "},"飥�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 397 620 l 397 174 q 390 156 397 163 q 372 149 383 149 l 322 149 q 305 156 312 149 q 298 174 298 163 l 298 620 q 305 638 298 631 q 322 645 312 645 l 372 645 q 390 638 383 645 q 397 620 397 631 m 595 620 l 595 174 q 588 156 595 163 q 570 149 581 149 l 521 149 q 503 156 510 149 q 496 174 496 163 l 496 620 q 503 638 496 631 q 521 645 510 645 l 570 645 q 588 638 581 645 q 595 620 595 631 m 794 620 l 794 174 q 787 156 794 163 q 769 149 780 149 l 719 149 q 701 156 708 149 q 694 174 694 163 l 694 620 q 701 638 694 631 q 719 645 708 645 l 769 645 q 787 638 780 645 q 794 620 794 631 m 893 59 l 893 794 l 198 794 l 198 59 q 204 28 198 42 q 215 7 209 13 q 223 0 221 0 l 868 0 q 876 7 870 0 q 887 28 882 13 q 893 59 893 42 m 372 893 l 719 893 l 682 984 q 669 992 677 991 l 423 992 q 410 984 415 991 l 372 893 m 1091 868 l 1091 818 q 1084 801 1091 808 q 1066 794 1077 794 l 992 794 l 992 59 q 956 -52 992 -5 q 868 -99 919 -99 l 223 -99 q 136 -54 172 -99 q 99 56 99 -9 l 99 794 l 25 794 q 7 801 14 794 q 0 818 0 808 l 0 868 q 7 886 0 879 q 25 893 14 893 l 264 893 l 319 1022 q 360 1071 330 1051 q 422 1091 391 1091 l 670 1091 q 731 1071 701 1091 q 773 1022 761 1051 l 827 893 l 1066 893 q 1084 886 1077 893 q 1091 868 1091 879 z "},"飥�":{"ha":1290,"x_min":20,"x_max":1270,"o":"m 1091 422 l 1091 50 q 1077 15 1091 29 q 1042 0 1062 0 l 744 0 l 744 298 l 546 298 l 546 0 l 248 0 q 213 15 228 0 q 198 50 198 29 l 198 422 q 199 424 198 422 q 199 426 199 426 l 645 794 l 1090 426 q 1091 422 1091 425 m 1264 475 l 1216 418 q 1200 409 1210 411 l 1197 409 q 1181 415 1187 409 l 645 862 l 109 415 q 90 409 99 408 q 74 418 80 411 l 26 475 q 20 493 19 483 q 29 510 21 504 l 586 974 q 645 994 611 994 q 704 974 679 994 l 893 816 l 893 967 q 900 985 893 978 q 918 992 907 992 l 1066 992 q 1084 985 1077 992 q 1091 967 1091 978 l 1091 651 l 1261 510 q 1270 493 1269 504 q 1264 475 1270 483 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 694 769 l 694 422 q 687 404 694 411 q 670 397 680 397 l 422 397 q 404 404 411 397 q 397 422 397 411 l 397 471 q 404 489 397 482 q 422 496 411 496 l 595 496 l 595 769 q 602 787 595 780 q 620 794 609 794 l 670 794 q 687 787 680 794 q 694 769 694 780 m 960 284 q 989 333 960 284 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飥�":{"ha":1488,"x_min":39,"x_max":1449,"o":"m 861 419 l 861 422 l 842 670 q 834 687 842 680 q 816 694 826 694 l 672 694 q 654 687 662 694 q 646 670 646 680 l 627 422 l 627 419 q 633 403 626 409 q 649 397 640 397 l 839 397 q 855 403 848 397 q 861 419 862 409 m 1449 57 q 1414 0 1449 0 l 868 0 q 885 7 878 0 q 891 25 892 15 l 876 223 q 867 241 875 233 q 849 248 860 248 l 639 248 q 621 241 629 248 q 612 223 613 233 l 597 25 q 603 7 596 15 q 620 0 610 0 l 74 0 q 39 57 39 0 q 59 146 39 98 l 382 956 q 402 981 388 970 q 432 992 416 992 l 694 992 q 677 985 684 992 q 668 967 669 977 l 656 818 q 663 801 656 808 q 680 794 670 794 l 808 794 q 825 801 818 794 q 832 818 832 808 l 820 967 q 811 985 819 977 q 794 992 804 992 l 1056 992 q 1086 981 1072 992 q 1106 956 1100 970 l 1429 146 q 1449 57 1449 98 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 977 114 q 985 121 977 114 q 992 149 992 129 q 977 184 992 169 q 942 198 963 198 q 908 184 922 198 q 893 149 893 169 q 908 114 893 129 q 942 99 922 99 q 977 114 963 99 m 1176 114 q 1183 121 1176 114 q 1190 149 1190 129 q 1176 184 1190 169 q 1141 198 1161 198 q 1106 184 1121 198 q 1091 149 1091 169 q 1106 114 1091 129 q 1141 99 1121 99 q 1176 114 1161 99 m 1290 322 l 1290 74 q 1268 22 1290 43 q 1215 0 1246 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 322 q 22 375 0 353 q 74 397 43 397 l 435 397 l 539 291 q 645 248 584 248 q 750 291 705 248 l 856 397 l 1215 397 q 1268 375 1246 397 q 1290 322 1290 353 m 1038 763 q 1027 709 1051 732 l 680 362 q 645 347 666 347 q 610 362 624 347 l 263 709 q 252 763 239 732 q 298 794 265 794 l 496 794 l 496 1141 q 511 1176 496 1161 q 546 1190 525 1190 l 744 1190 q 779 1176 764 1190 q 794 1141 794 1161 l 794 794 l 992 794 q 1038 763 1025 794 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 868 471 q 860 453 868 462 l 613 205 q 595 198 605 198 q 577 205 586 198 l 329 453 q 324 481 318 466 q 347 496 330 496 l 496 496 l 496 769 q 503 787 496 780 q 521 794 510 794 l 670 794 q 687 787 680 794 q 694 769 694 780 l 694 496 l 843 496 q 861 489 854 496 q 868 471 868 482 m 807 861 q 758 889 807 861 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 867 512 q 843 496 860 496 l 694 496 l 694 223 q 687 205 694 212 q 670 198 680 198 l 521 198 q 503 205 510 198 q 496 223 496 212 l 496 496 l 347 496 q 329 503 336 496 q 322 521 322 510 q 330 539 322 530 l 577 787 q 595 794 586 794 q 613 787 605 794 l 861 539 q 867 512 873 526 m 807 861 q 758 889 807 861 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 793 446 l 1038 446 q 1036 453 1037 449 q 1034 459 1035 457 l 870 843 l 321 843 l 157 459 q 155 452 156 457 q 153 446 153 448 l 398 446 l 471 298 l 719 298 l 793 446 m 1190 423 l 1190 50 q 1176 15 1190 29 q 1141 0 1161 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 423 q 19 519 0 471 l 204 946 q 232 979 212 966 q 273 992 253 992 l 918 992 q 958 979 938 992 q 987 946 979 966 l 1171 519 q 1190 423 1190 471 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 893 539 q 918 496 918 525 q 893 453 918 467 l 471 205 q 446 198 460 198 q 422 205 434 198 q 397 248 397 219 l 397 744 q 422 787 397 773 q 471 787 447 801 l 893 539 m 960 284 q 989 333 960 284 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 992 l 1190 645 q 1176 610 1190 625 q 1141 595 1161 595 l 794 595 q 748 626 761 595 q 759 680 735 656 l 866 787 q 595 893 751 893 q 441 861 515 893 q 315 777 368 830 q 230 650 261 723 q 198 496 198 577 q 230 342 198 415 q 315 215 261 269 q 441 131 368 162 q 595 99 515 99 q 770 140 687 99 q 908 253 852 180 q 926 263 914 261 q 946 256 938 263 l 1052 149 q 1059 133 1059 143 q 1053 115 1059 123 q 849 -43 969 13 q 595 -99 729 -99 q 364 -52 474 -99 q 174 75 254 -5 q 47 265 95 155 q 0 496 0 375 q 47 727 0 617 q 174 917 95 837 q 364 1044 254 997 q 595 1091 474 1091 q 816 1048 709 1091 q 1005 927 922 1005 l 1106 1027 q 1160 1038 1128 1051 q 1190 992 1190 1025 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1171 372 q 1170 367 1171 368 q 963 30 1121 159 q 592 -99 805 -99 q 373 -57 479 -99 q 184 65 267 -14 l 84 -35 q 50 -50 70 -50 q 15 -35 29 -50 q 0 0 0 -20 l 0 347 q 15 382 0 367 q 50 397 29 397 l 397 397 q 432 382 417 397 q 446 347 446 367 q 432 312 446 327 l 326 206 q 450 127 381 155 q 595 99 520 99 q 789 150 699 99 q 933 288 879 200 q 974 379 942 301 q 997 397 980 397 l 1146 397 q 1164 389 1156 397 q 1171 372 1171 382 m 1190 992 l 1190 645 q 1176 610 1190 625 q 1141 595 1161 595 l 794 595 q 759 610 773 595 q 744 645 744 625 q 759 680 744 665 l 866 787 q 595 893 751 893 q 401 842 491 893 q 257 704 312 792 q 216 613 249 691 q 193 595 210 595 l 39 595 q 21 603 29 595 q 14 620 14 610 l 14 625 q 223 962 64 833 q 595 1091 382 1091 q 815 1048 708 1091 q 1005 927 922 1005 l 1106 1027 q 1141 1042 1121 1042 q 1176 1027 1161 1042 q 1190 992 1190 1012 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 298 273 l 298 223 q 290 206 298 213 q 273 198 283 198 l 223 198 q 206 206 213 198 q 198 223 198 213 l 198 273 q 206 290 198 283 q 223 298 213 298 l 273 298 q 290 290 283 298 q 298 273 298 283 m 298 471 l 298 422 q 290 404 298 412 q 273 397 283 397 l 223 397 q 206 404 213 397 q 198 422 198 412 l 198 471 q 206 489 198 481 q 223 496 213 496 l 273 496 q 290 489 283 496 q 298 471 298 481 m 298 670 l 298 620 q 290 603 298 610 q 273 595 283 595 l 223 595 q 206 603 213 595 q 198 620 198 610 l 198 670 q 206 687 198 680 q 223 694 213 694 l 273 694 q 290 687 283 694 q 298 670 298 680 m 1190 273 l 1190 223 q 1183 206 1190 213 q 1166 198 1176 198 l 422 198 q 404 206 412 198 q 397 223 397 213 l 397 273 q 404 290 397 283 q 422 298 412 298 l 1166 298 q 1183 290 1176 298 q 1190 273 1190 283 m 1190 471 l 1190 422 q 1183 404 1190 412 q 1166 397 1176 397 l 422 397 q 404 404 412 397 q 397 422 397 412 l 397 471 q 404 489 397 481 q 422 496 412 496 l 1166 496 q 1183 489 1176 496 q 1190 471 1190 481 m 1190 670 l 1190 620 q 1183 603 1190 610 q 1166 595 1176 595 l 422 595 q 404 603 412 595 q 397 620 397 610 l 397 670 q 404 687 397 680 q 422 694 412 694 l 1166 694 q 1183 687 1176 694 q 1190 670 1190 680 m 1290 124 l 1290 769 q 1282 786 1290 779 q 1265 794 1275 794 l 124 794 q 107 786 114 794 q 99 769 99 779 l 99 124 q 107 107 99 114 q 124 99 114 99 l 1265 99 q 1282 107 1275 99 q 1290 124 1290 114 m 1389 967 l 1389 124 q 1352 36 1389 73 q 1265 0 1316 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1265 1091 q 1352 1055 1316 1091 q 1389 967 1389 1018 z "},"飥�":{"ha":893,"x_min":0,"x_max":893,"o":"m 248 595 l 645 595 l 645 744 q 587 884 645 826 q 446 942 529 942 q 306 884 364 942 q 248 744 248 826 l 248 595 m 893 521 l 893 74 q 871 22 893 43 q 818 0 849 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 521 q 22 574 0 552 q 74 595 43 595 l 99 595 l 99 744 q 202 989 99 887 q 446 1091 304 1091 q 691 989 589 1091 q 794 744 794 887 l 794 595 l 818 595 q 871 574 849 595 q 893 521 893 552 z "},"飥�":{"ha":1389,"x_min":50,"x_max":1389,"o":"m 248 992 q 198 907 248 936 l 198 -74 q 191 -92 198 -84 q 174 -99 184 -99 l 124 -99 q 107 -92 114 -99 q 99 -74 99 -84 l 99 907 q 50 992 50 936 q 79 1062 50 1033 q 149 1091 108 1091 q 219 1062 190 1091 q 248 992 248 1033 m 1389 942 l 1389 351 q 1379 321 1389 332 q 1349 300 1370 311 q 1063 210 1182 210 q 967 227 1015 210 q 883 264 918 244 q 793 301 847 284 q 683 319 739 319 q 323 205 534 319 q 298 198 310 198 q 263 213 277 198 q 248 248 248 228 l 248 823 q 272 866 248 848 q 333 899 288 877 q 660 992 516 992 q 815 970 742 992 q 984 901 887 947 q 1053 887 1014 887 q 1144 903 1094 887 q 1229 939 1193 919 q 1297 976 1265 960 q 1339 992 1329 992 q 1374 977 1359 992 q 1389 942 1389 963 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1290 504 q 1243 260 1290 375 l 1228 222 l 1084 197 q 1014 91 1067 133 q 893 50 961 50 l 893 25 q 886 7 893 14 q 868 0 879 0 l 818 0 q 801 7 808 0 q 794 25 794 14 l 794 471 q 801 489 794 482 q 818 496 808 496 l 868 496 q 886 489 879 496 q 893 471 893 482 l 893 446 q 994 419 948 446 q 1066 345 1039 391 l 1118 354 q 1141 504 1141 428 q 1073 720 1141 618 q 889 882 1004 822 q 645 942 774 942 q 400 882 515 942 q 217 720 285 822 q 149 504 149 618 q 171 354 149 428 l 224 345 q 296 419 250 391 q 397 446 342 446 l 397 471 q 404 489 397 482 q 422 496 411 496 l 471 496 q 489 489 482 496 q 496 471 496 482 l 496 25 q 489 7 496 14 q 471 0 482 0 l 422 0 q 404 7 411 0 q 397 25 397 14 l 397 50 q 276 91 329 50 q 205 197 222 133 l 62 222 l 47 260 q 0 504 0 375 q 52 729 0 621 q 191 917 104 838 q 397 1044 277 997 q 645 1091 516 1091 q 893 1044 773 1091 q 1099 917 1012 997 q 1238 729 1186 838 q 1290 504 1290 621 z "},"飥�":{"ha":595,"x_min":0,"x_max":595,"o":"m 595 918 l 595 74 q 581 40 595 54 q 546 25 566 25 q 511 40 525 25 l 253 298 l 50 298 q 15 312 29 298 q 0 347 0 327 l 0 645 q 15 680 0 665 q 50 694 29 694 l 253 694 l 511 953 q 546 967 525 967 q 581 953 566 967 q 595 918 595 938 z "},"飥�":{"ha":893,"x_min":0,"x_max":893,"o":"m 595 918 l 595 74 q 581 40 595 54 q 546 25 566 25 q 511 40 525 25 l 253 298 l 50 298 q 15 312 29 298 q 0 347 0 327 l 0 645 q 15 680 0 665 q 50 694 29 694 l 253 694 l 511 953 q 546 967 525 967 q 581 953 566 967 q 595 918 595 938 m 860 606 q 876 581 860 606 q 893 496 893 555 q 860 386 893 437 q 773 314 827 336 q 753 310 765 310 q 718 324 733 310 q 704 360 704 339 q 713 387 704 376 q 736 407 722 398 q 762 424 749 415 q 784 452 775 434 q 794 496 794 470 q 784 540 794 522 q 762 568 775 558 q 736 586 749 577 q 713 605 722 594 q 704 632 704 616 q 718 668 704 653 q 753 682 733 682 q 773 678 765 682 q 860 606 827 657 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 595 918 l 595 74 q 581 40 595 54 q 546 25 566 25 q 511 40 525 25 l 253 298 l 50 298 q 15 312 29 298 q 0 347 0 327 l 0 645 q 15 680 0 665 q 50 694 29 694 l 253 694 l 511 953 q 546 967 525 967 q 581 953 566 967 q 595 918 595 938 m 860 606 q 876 581 860 606 q 893 496 893 555 q 860 386 893 437 q 773 314 827 336 q 753 310 765 310 q 718 324 733 310 q 704 360 704 339 q 713 387 704 376 q 736 407 722 398 q 762 424 749 415 q 784 452 775 434 q 794 496 794 470 q 784 540 794 522 q 762 568 775 558 q 736 586 749 577 q 713 605 722 594 q 704 632 704 616 q 718 668 704 653 q 753 682 733 682 q 773 678 765 682 q 860 606 827 657 m 1025 715 q 1058 665 1025 715 q 1091 496 1091 615 q 1025 277 1091 377 q 851 131 960 177 q 832 127 841 127 q 796 142 811 127 q 781 177 781 157 q 811 222 781 207 q 870 257 855 245 q 960 362 928 298 q 992 496 992 425 q 960 631 992 567 q 870 736 928 694 q 811 770 855 747 q 781 815 781 785 q 796 850 781 836 q 831 865 811 865 q 851 861 841 865 q 1025 715 960 815 m 1191 823 q 1240 749 1191 823 q 1290 496 1290 674 q 1191 169 1290 318 q 929 -51 1093 19 q 909 -55 919 -55 q 874 -40 889 -55 q 860 -5 860 -26 q 890 40 860 22 q 907 48 895 43 q 925 57 919 53 q 988 96 960 76 q 1137 272 1084 167 q 1190 496 1190 377 q 1137 720 1190 615 q 988 896 1084 825 q 925 935 960 916 q 907 944 919 939 q 890 952 895 949 q 860 997 860 970 q 874 1032 860 1018 q 909 1047 889 1047 q 929 1043 919 1047 q 1191 823 1093 973 z "},"飥�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 298 298 l 298 198 l 198 198 l 198 298 l 298 298 m 298 893 l 298 794 l 198 794 l 198 893 l 298 893 m 893 893 l 893 794 l 794 794 l 794 893 l 893 893 m 99 100 l 397 100 l 397 397 l 99 397 l 99 100 m 99 694 l 397 694 l 397 992 l 99 992 l 99 694 m 694 694 l 992 694 l 992 992 l 694 992 l 694 694 m 496 496 l 496 0 l 0 0 l 0 496 l 496 496 m 893 99 l 893 0 l 794 0 l 794 99 l 893 99 m 1091 99 l 1091 0 l 992 0 l 992 99 l 1091 99 m 1091 496 l 1091 198 l 794 198 l 794 298 l 694 298 l 694 0 l 595 0 l 595 496 l 893 496 l 893 397 l 992 397 l 992 496 l 1091 496 m 496 1091 l 496 595 l 0 595 l 0 1091 l 496 1091 m 1091 1091 l 1091 595 l 595 595 l 595 1091 l 1091 1091 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 49 0 l 0 0 l 0 1091 l 49 1091 l 49 0 m 98 1 l 73 1 l 73 1091 l 98 1091 l 98 1 m 171 1 l 146 1 l 146 1091 l 171 1091 l 171 1 m 292 1 l 268 1 l 268 1091 l 292 1091 l 292 1 m 414 1 l 366 1 l 366 1091 l 414 1091 l 414 1 m 512 1 l 488 1 l 488 1091 l 512 1091 l 512 1 m 560 1 l 536 1 l 536 1091 l 560 1091 l 560 1 m 609 1 l 585 1 l 585 1091 l 609 1091 l 609 1 m 731 1 l 682 1 l 682 1091 l 731 1091 l 731 1 m 853 1 l 804 1 l 804 1091 l 853 1091 l 853 1 m 950 1 l 901 1 l 901 1091 l 950 1091 l 950 1 m 1048 1 l 999 1 l 999 1091 l 1048 1091 l 1048 1 m 1121 1 l 1072 1 l 1072 1091 l 1121 1091 l 1121 1 m 1267 1 l 1194 1 l 1194 1091 l 1267 1091 l 1267 1 m 1316 1 l 1291 1 l 1291 1091 l 1316 1091 l 1316 1 m 1389 0 l 1340 0 l 1340 1091 l 1389 1091 l 1389 0 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1174,"o":"m 318 773 q 333 788 318 773 q 347 843 347 802 q 318 913 347 884 q 248 942 289 942 q 178 913 207 942 q 149 843 149 884 q 178 773 149 802 q 248 744 207 744 q 318 773 289 744 m 1174 397 q 1146 327 1174 356 l 765 -54 q 694 -83 735 -83 q 625 -54 653 -83 l 71 501 q 21 579 41 529 q 0 670 0 629 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 422 1091 q 512 1071 463 1091 q 591 1021 562 1050 l 1146 467 q 1174 397 1174 437 z "},"飥�":{"ha":1488,"x_min":0,"x_max":1472,"o":"m 318 773 q 333 788 318 773 q 347 843 347 802 q 318 913 347 884 q 248 942 289 942 q 178 913 207 942 q 149 843 149 884 q 178 773 149 802 q 248 744 207 744 q 318 773 289 744 m 1174 397 q 1146 327 1174 356 l 765 -54 q 694 -83 735 -83 q 625 -54 653 -83 l 71 501 q 21 579 41 529 q 0 670 0 629 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 422 1091 q 512 1071 463 1091 q 591 1021 562 1050 l 1146 467 q 1174 397 1174 437 m 1472 397 q 1443 327 1472 356 l 1063 -54 q 992 -83 1032 -83 q 946 -72 964 -83 q 905 -37 929 -61 l 1270 327 q 1298 397 1298 356 q 1270 467 1298 437 l 715 1021 q 636 1071 686 1050 q 546 1091 587 1091 l 719 1091 q 810 1071 760 1091 q 889 1021 860 1050 l 1443 467 q 1472 397 1472 437 z "},"飥�":{"ha":1290,"x_min":8,"x_max":1284,"o":"m 1270 820 q 1284 720 1301 776 l 1071 18 q 1012 -65 1056 -32 q 917 -99 967 -99 l 202 -99 q 86 -58 142 -99 q 9 44 31 -16 q 8 143 -9 96 q 10 164 8 146 q 13 192 12 181 q 11 209 14 198 q 9 224 8 219 q 15 240 10 233 q 28 258 19 248 q 40 277 36 269 q 75 348 58 306 q 98 419 92 389 q 99 442 101 426 q 98 463 97 457 q 112 485 101 472 q 125 503 122 498 q 157 574 141 531 q 177 644 174 618 q 175 669 177 651 q 175 691 172 687 q 192 714 178 701 q 209 732 206 728 q 242 797 224 752 q 264 872 260 842 q 261 892 264 878 q 260 912 258 905 q 267 926 261 918 q 281 944 272 934 q 294 960 289 954 q 307 984 300 970 q 318 1011 313 998 q 331 1039 323 1024 q 346 1064 338 1054 q 366 1082 353 1073 q 394 1091 379 1090 q 431 1087 409 1091 l 430 1084 q 470 1091 460 1091 l 1059 1091 q 1148 1048 1117 1091 q 1162 947 1179 1004 l 949 245 q 894 126 922 153 q 794 99 867 99 l 121 99 q 91 88 100 99 q 91 54 83 75 q 202 0 109 0 l 918 0 q 961 12 940 0 q 988 44 982 24 l 1221 809 q 1225 853 1226 826 q 1270 820 1254 842 m 446 818 q 447 801 443 808 q 463 794 452 794 l 934 794 q 954 801 944 794 q 966 818 963 808 l 983 868 q 981 885 986 878 q 966 893 977 893 l 494 893 q 475 885 484 893 q 462 868 465 878 l 446 818 m 381 620 q 383 603 378 610 q 398 595 388 595 l 870 595 q 889 603 880 595 q 902 620 899 610 l 918 670 q 917 687 922 680 q 901 694 912 694 l 430 694 q 410 687 420 694 q 398 670 401 680 l 381 620 z "},"飥�":{"ha":992,"x_min":0,"x_max":992,"o":"m 902 1091 q 936 1084 920 1091 q 977 1053 962 1074 q 992 1004 992 1031 l 992 5 q 977 -43 992 -21 q 936 -74 962 -64 q 902 -81 922 -81 q 838 -56 865 -81 l 496 273 l 154 -56 q 90 -81 126 -81 q 56 -74 72 -81 q 15 -43 30 -64 q 0 5 0 -21 l 0 1004 q 15 1053 0 1031 q 56 1084 30 1074 q 90 1091 72 1091 l 902 1091 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 298 0 l 992 0 l 992 198 l 298 198 l 298 0 m 298 496 l 992 496 l 992 794 l 868 794 q 815 815 837 794 q 794 868 794 837 l 794 992 l 298 992 l 298 496 m 1176 412 q 1183 419 1176 412 q 1190 446 1190 426 q 1176 481 1190 467 q 1141 496 1161 496 q 1106 481 1121 496 q 1091 446 1091 467 q 1106 412 1091 426 q 1141 397 1121 397 q 1176 412 1161 397 m 1290 446 l 1290 124 q 1282 107 1290 114 q 1265 99 1275 99 l 1091 99 l 1091 -25 q 1070 -78 1091 -56 q 1017 -99 1048 -99 l 273 -99 q 220 -78 242 -99 q 198 -25 198 -56 l 198 99 l 25 99 q 7 107 15 99 q 0 124 0 114 l 0 446 q 44 551 0 508 q 149 595 88 595 l 198 595 l 198 1017 q 220 1070 198 1048 q 273 1091 242 1091 l 794 1091 q 862 1076 825 1091 q 921 1039 899 1060 l 1039 921 q 1076 862 1060 899 q 1091 794 1091 825 l 1091 595 l 1141 595 q 1246 551 1202 595 q 1290 446 1290 508 z "},"飥�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 586 604 q 619 637 586 604 q 744 670 652 670 q 902 604 836 670 q 967 446 967 539 q 902 289 967 354 q 744 223 836 223 q 586 289 652 223 q 521 446 521 354 q 586 604 521 539 m 1290 992 q 1430 934 1372 992 q 1488 794 1488 876 l 1488 99 q 1430 -41 1488 17 q 1290 -99 1372 -99 l 198 -99 q 58 -41 116 -99 q 0 99 0 17 l 0 794 q 58 934 0 876 q 198 992 116 992 l 372 992 l 412 1097 q 465 1163 426 1135 q 546 1190 505 1190 l 942 1190 q 1023 1163 984 1190 q 1077 1097 1062 1135 l 1116 992 l 1290 992 m 499 201 q 550 150 499 201 q 744 99 601 99 q 989 201 887 99 q 1091 446 1091 303 q 989 692 1091 590 q 744 794 887 794 q 499 692 601 794 q 397 446 397 590 q 499 201 397 303 z "},"飥�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 562 757 l 430 408 q 536 407 456 408 q 660 405 616 405 q 705 407 675 405 q 562 757 637 603 m 0 -99 l 2 -38 q 45 -28 19 -33 q 89 -20 71 -24 q 127 -9 108 -16 q 162 14 147 -2 q 186 53 177 29 l 370 530 l 587 1091 l 645 1091 l 686 1091 q 694 1075 692 1080 l 853 703 q 935 503 879 643 q 1024 291 992 364 q 1069 179 1035 264 q 1125 48 1102 93 q 1152 4 1140 13 q 1220 -19 1166 -8 q 1285 -35 1273 -30 q 1290 -79 1290 -64 q 1289 -90 1290 -83 q 1289 -99 1289 -96 q 1142 -93 1240 -99 q 994 -87 1043 -87 q 827 -92 935 -87 q 689 -98 719 -98 q 692 -38 689 -65 l 794 -16 q 803 -14 794 -16 q 815 -12 812 -12 q 827 -8 818 -11 q 838 -3 835 -5 q 847 3 842 -1 q 854 12 852 7 q 856 22 856 16 q 832 97 856 35 q 776 235 808 160 q 743 312 744 310 l 395 314 q 335 162 374 269 q 296 36 296 56 q 307 7 296 19 q 341 -12 318 -5 q 378 -22 363 -19 q 422 -29 393 -26 q 454 -32 452 -32 q 455 -77 455 -47 q 453 -98 455 -84 q 318 -90 408 -98 q 183 -82 228 -82 q 162 -85 177 -82 q 146 -88 148 -88 q 0 -99 84 -99 z "},"飥�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 430 12 q 539 -13 488 -13 q 830 246 830 -13 q 798 386 830 335 q 751 443 777 420 q 698 479 724 467 q 636 499 673 492 q 571 507 599 505 q 498 508 543 508 q 419 501 441 508 q 419 377 419 460 q 419 255 419 295 q 418 203 419 249 q 417 128 417 157 q 421 63 418 99 q 430 12 424 27 m 419 590 q 504 584 452 584 q 615 594 567 584 q 700 629 662 605 q 758 698 738 653 q 777 808 777 743 q 755 903 777 863 q 694 967 732 944 q 610 1001 655 990 q 514 1011 565 1011 q 413 1001 475 1011 q 416 884 413 963 q 419 767 419 806 q 419 705 419 746 q 419 643 419 663 q 419 590 419 608 m 0 -99 l 2 -26 q 67 -14 13 -23 q 150 7 122 -5 q 159 28 155 16 q 166 54 164 40 q 170 79 168 68 q 172 108 172 90 q 173 134 173 126 q 173 162 173 143 q 173 185 173 181 q 156 980 173 946 q 139 991 153 986 q 104 999 125 996 q 66 1005 84 1003 q 28 1008 48 1007 q 5 1011 9 1010 l 2 1075 q 265 1084 78 1077 q 554 1091 453 1091 q 607 1091 572 1091 q 660 1090 642 1090 q 765 1080 714 1090 q 865 1048 817 1070 q 949 993 913 1025 q 1006 912 984 960 q 1028 805 1028 863 q 1015 731 1028 765 q 985 675 1002 698 q 935 631 967 653 q 878 596 902 608 q 813 565 854 584 q 1012 461 932 538 q 1091 269 1091 384 q 1064 130 1091 191 q 992 29 1037 68 q 885 -38 946 -11 q 758 -75 823 -64 q 622 -86 693 -86 q 519 -84 587 -86 q 417 -81 451 -81 q 179 -90 335 -81 q 0 -99 23 -98 z "},"飥�":{"ha":794,"x_min":0,"x_max":794,"o":"m 0 -98 l 13 -32 q 61 -19 30 -26 q 117 -4 91 -12 q 163 14 142 3 q 195 92 184 41 q 243 316 195 98 q 331 737 290 535 q 371 967 372 940 l 371 987 q 329 1001 353 997 q 275 1007 305 1005 q 230 1011 245 1009 l 245 1091 q 338 1086 270 1090 q 454 1081 405 1083 q 547 1079 502 1079 q 624 1081 584 1079 q 717 1086 663 1083 q 794 1091 772 1090 q 779 1022 790 1061 q 700 1000 756 1015 q 616 974 645 986 q 605 941 610 960 q 598 910 601 923 q 593 875 596 898 q 587 842 589 853 q 520 517 567 728 q 460 242 473 307 q 450 197 458 235 q 434 127 441 159 q 422 62 427 95 q 417 18 416 29 l 418 4 q 561 -20 431 1 q 549 -97 559 -54 q 524 -98 540 -97 q 498 -99 507 -99 q 431 -91 476 -99 q 364 -84 386 -84 q 205 -82 257 -82 q 94 -89 165 -82 q 0 -98 22 -96 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1384,"o":"m 1352 99 q 1384 85 1377 99 q 1376 50 1391 71 l 1278 -75 q 1240 -95 1263 -95 q 1202 -75 1218 -95 l 1104 50 q 1096 85 1089 71 q 1128 99 1103 99 l 1190 99 l 1190 893 l 1128 893 q 1096 907 1103 893 q 1104 942 1089 922 l 1202 1067 q 1240 1087 1218 1087 q 1278 1067 1263 1087 l 1376 942 q 1384 907 1391 922 q 1352 893 1377 893 l 1290 893 l 1290 99 l 1352 99 m 63 1090 l 105 1070 q 268 1066 114 1066 q 370 1067 302 1066 q 473 1069 439 1069 q 556 1068 501 1069 q 639 1068 612 1068 l 867 1068 q 883 1068 871 1068 q 899 1068 894 1067 q 911 1070 903 1068 q 925 1077 919 1072 q 936 1090 930 1082 l 969 1091 q 980 1091 972 1091 q 991 1090 987 1090 q 992 830 992 1004 q 988 746 992 768 q 935 732 958 735 q 894 831 916 766 q 885 868 891 838 q 874 925 879 898 q 868 953 869 952 q 859 962 863 959 q 847 967 854 966 q 837 969 839 968 q 823 969 834 970 q 810 969 811 969 q 758 969 797 969 q 701 970 720 970 q 651 968 681 970 q 596 963 621 966 q 590 858 589 901 q 591 557 590 785 q 593 205 593 329 q 591 149 593 192 q 591 78 589 106 q 601 25 593 50 q 697 -8 632 9 q 790 -37 762 -25 q 794 -76 794 -68 q 791 -98 794 -87 l 765 -99 q 596 -93 706 -101 q 436 -85 486 -85 q 319 -92 397 -85 q 201 -99 240 -99 q 198 -59 198 -60 l 198 -52 q 246 -19 212 -31 q 322 4 281 -6 q 383 25 364 14 q 398 322 398 57 q 395 556 398 400 q 393 791 393 713 l 393 882 q 393 894 393 884 q 394 913 394 904 q 393 933 394 922 q 391 952 392 944 q 387 963 389 960 q 261 972 378 972 q 189 963 236 972 q 127 942 143 953 q 101 886 112 932 q 76 800 89 840 q 43 759 64 760 q 0 793 11 779 l 0 1090 l 63 1090 z "},"飥�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 63 1090 l 105 1070 q 268 1066 114 1066 q 370 1067 302 1066 q 473 1069 439 1069 q 664 1070 527 1069 q 900 1070 801 1070 q 1091 1066 999 1070 q 1135 1090 1117 1066 l 1167 1091 q 1178 1091 1170 1091 q 1189 1090 1186 1090 q 1190 830 1190 1004 q 1187 746 1190 768 q 1134 732 1156 735 q 1092 831 1115 766 q 1084 868 1090 838 q 1072 925 1077 898 q 1066 953 1066 952 q 1046 967 1059 963 q 994 969 1042 969 q 922 970 971 969 q 842 970 873 970 q 770 969 811 970 q 695 963 728 967 q 689 858 688 901 l 690 740 l 690 780 q 691 661 690 738 q 692 522 691 584 q 692 403 692 459 q 690 348 692 391 q 690 277 688 305 q 700 223 692 249 q 796 190 731 207 q 889 161 861 174 q 893 122 893 130 q 891 100 893 112 l 864 99 q 695 105 805 98 q 535 113 585 113 q 418 106 496 113 q 300 99 339 99 q 298 140 298 139 l 298 146 q 345 180 311 167 q 422 202 380 192 q 482 223 463 212 q 491 281 488 236 q 496 393 494 326 q 497 513 497 461 q 496 632 497 566 q 496 701 496 699 q 494 718 496 707 q 492 736 492 729 q 493 770 492 741 q 493 826 493 798 q 493 885 494 854 q 491 938 493 917 q 486 963 489 959 q 360 972 477 972 q 234 961 329 972 q 127 942 140 951 q 101 887 112 933 q 76 801 89 841 q 43 759 64 760 q 0 793 11 779 l 0 1090 l 63 1090 m 1015 97 q 1048 82 1025 97 q 1092 50 1071 67 q 1139 12 1114 33 q 1166 -12 1163 -9 q 1187 -50 1187 -28 q 1166 -88 1187 -71 q 1139 -111 1163 -90 q 1092 -149 1114 -132 q 1048 -181 1071 -166 q 1015 -196 1025 -196 q 999 -188 1005 -196 q 992 -166 994 -180 q 990 -140 990 -152 q 991 -114 990 -128 q 992 -99 992 -101 l 198 -99 q 200 -114 198 -101 q 201 -140 201 -128 q 199 -166 201 -152 q 191 -188 197 -180 q 175 -196 185 -196 q 143 -181 166 -196 q 98 -149 119 -166 q 52 -111 77 -132 q 24 -88 27 -90 q 4 -50 4 -71 q 24 -12 4 -28 q 52 12 27 -9 q 98 50 77 33 q 143 82 119 67 q 175 97 166 97 q 191 89 185 97 q 199 67 197 81 q 201 41 201 53 q 200 15 201 29 q 198 0 198 2 l 992 0 q 991 15 992 2 q 990 41 990 29 q 992 67 990 53 q 999 89 994 81 q 1015 97 1005 97 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 149 l 1389 50 q 1374 15 1389 29 q 1339 0 1359 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 149 q 15 184 0 169 q 50 198 29 198 l 1339 198 q 1374 184 1359 198 q 1389 149 1389 169 m 1091 446 l 1091 347 q 1077 312 1091 327 q 1042 298 1062 298 l 50 298 q 15 312 29 298 q 0 347 0 327 l 0 446 q 15 481 0 467 q 50 496 29 496 l 1042 496 q 1077 481 1062 496 q 1091 446 1091 467 m 1290 744 l 1290 645 q 1275 610 1290 625 q 1240 595 1260 595 l 50 595 q 15 610 29 595 q 0 645 0 625 l 0 744 q 15 779 0 764 q 50 794 29 794 l 1240 794 q 1275 779 1260 794 q 1290 744 1290 764 m 992 1042 l 992 942 q 977 908 992 922 q 942 893 963 893 l 50 893 q 15 908 29 893 q 0 942 0 922 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 942 1091 q 977 1077 963 1091 q 992 1042 992 1062 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 149 l 1389 50 q 1374 15 1389 29 q 1339 0 1359 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 149 q 15 184 0 169 q 50 198 29 198 l 1339 198 q 1374 184 1359 198 q 1389 149 1389 169 m 1091 446 l 1091 347 q 1077 312 1091 327 q 1042 298 1062 298 l 347 298 q 312 312 327 298 q 298 347 298 327 l 298 446 q 312 481 298 467 q 347 496 327 496 l 1042 496 q 1077 481 1062 496 q 1091 446 1091 467 m 1290 744 l 1290 645 q 1275 610 1290 625 q 1240 595 1260 595 l 149 595 q 114 610 129 595 q 99 645 99 625 l 99 744 q 114 779 99 764 q 149 794 129 794 l 1240 794 q 1275 779 1260 794 q 1290 744 1290 764 m 992 1042 l 992 942 q 977 908 992 922 q 942 893 963 893 l 446 893 q 412 908 426 893 q 397 942 397 922 l 397 1042 q 412 1077 397 1062 q 446 1091 426 1091 l 942 1091 q 977 1077 963 1091 q 992 1042 992 1062 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 149 l 1389 50 q 1374 15 1389 29 q 1339 0 1359 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 149 q 15 184 0 169 q 50 198 29 198 l 1339 198 q 1374 184 1359 198 q 1389 149 1389 169 m 1389 446 l 1389 347 q 1374 312 1389 327 q 1339 298 1359 298 l 347 298 q 312 312 327 298 q 298 347 298 327 l 298 446 q 312 481 298 467 q 347 496 327 496 l 1339 496 q 1374 481 1359 496 q 1389 446 1389 467 m 1389 744 l 1389 645 q 1374 610 1389 625 q 1339 595 1359 595 l 149 595 q 114 610 129 595 q 99 645 99 625 l 99 744 q 114 779 99 764 q 149 794 129 794 l 1339 794 q 1374 779 1359 794 q 1389 744 1389 764 m 1389 1042 l 1389 942 q 1374 908 1389 922 q 1339 893 1359 893 l 446 893 q 412 908 426 893 q 397 942 397 922 l 397 1042 q 412 1077 397 1062 q 446 1091 426 1091 l 1339 1091 q 1374 1077 1359 1091 q 1389 1042 1389 1062 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 149 l 1389 50 q 1374 15 1389 29 q 1339 0 1359 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 149 q 15 184 0 169 q 50 198 29 198 l 1339 198 q 1374 184 1359 198 q 1389 149 1389 169 m 1389 446 l 1389 347 q 1374 312 1389 327 q 1339 298 1359 298 l 50 298 q 15 312 29 298 q 0 347 0 327 l 0 446 q 15 481 0 467 q 50 496 29 496 l 1339 496 q 1374 481 1359 496 q 1389 446 1389 467 m 1389 744 l 1389 645 q 1374 610 1389 625 q 1339 595 1359 595 l 50 595 q 15 610 29 595 q 0 645 0 625 l 0 744 q 15 779 0 764 q 50 794 29 794 l 1339 794 q 1374 779 1359 794 q 1389 744 1389 764 m 1389 1042 l 1389 942 q 1374 908 1389 922 q 1339 893 1359 893 l 50 893 q 15 908 29 893 q 0 942 0 922 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 1339 1091 q 1374 1077 1359 1091 q 1389 1042 1389 1062 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 198 174 l 198 25 q 191 7 198 15 q 174 0 184 0 l 25 0 q 7 7 15 0 q 0 25 0 15 l 0 174 q 7 191 0 184 q 25 198 15 198 l 174 198 q 191 191 184 198 q 198 174 198 184 m 198 471 l 198 322 q 191 305 198 312 q 174 298 184 298 l 25 298 q 7 305 15 298 q 0 322 0 312 l 0 471 q 7 489 0 481 q 25 496 15 496 l 174 496 q 191 489 184 496 q 198 471 198 481 m 198 769 l 198 620 q 191 603 198 610 q 174 595 184 595 l 25 595 q 7 603 15 595 q 0 620 0 610 l 0 769 q 7 786 0 779 q 25 794 15 794 l 174 794 q 191 786 184 794 q 198 769 198 779 m 1389 174 l 1389 25 q 1382 7 1389 15 q 1364 0 1374 0 l 322 0 q 305 7 312 0 q 298 25 298 15 l 298 174 q 305 191 298 184 q 322 198 312 198 l 1364 198 q 1382 191 1374 198 q 1389 174 1389 184 m 198 1066 l 198 918 q 191 900 198 908 q 174 893 184 893 l 25 893 q 7 900 15 893 q 0 918 0 908 l 0 1066 q 7 1084 0 1077 q 25 1091 15 1091 l 174 1091 q 191 1084 184 1091 q 198 1066 198 1077 m 1389 471 l 1389 322 q 1382 305 1389 312 q 1364 298 1374 298 l 322 298 q 305 305 312 298 q 298 322 298 312 l 298 471 q 305 489 298 481 q 322 496 312 496 l 1364 496 q 1382 489 1374 496 q 1389 471 1389 481 m 1389 769 l 1389 620 q 1382 603 1389 610 q 1364 595 1374 595 l 322 595 q 305 603 312 595 q 298 620 298 610 l 298 769 q 305 786 298 779 q 322 794 312 794 l 1364 794 q 1382 786 1374 794 q 1389 769 1389 779 m 1389 1066 l 1389 918 q 1382 900 1389 908 q 1364 893 1374 893 l 322 893 q 305 900 312 893 q 298 918 298 908 l 298 1066 q 305 1084 298 1077 q 322 1091 312 1091 l 1364 1091 q 1382 1084 1374 1091 q 1389 1066 1389 1077 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 298 769 l 298 322 q 290 305 298 312 q 273 298 283 298 q 255 305 262 298 l 32 528 q 25 546 25 535 q 32 563 25 556 l 255 787 q 273 794 262 794 q 290 786 283 794 q 298 769 298 779 m 1389 174 l 1389 25 q 1382 7 1389 15 q 1364 0 1374 0 l 25 0 q 7 7 15 0 q 0 25 0 15 l 0 174 q 7 191 0 184 q 25 198 15 198 l 1364 198 q 1382 191 1374 198 q 1389 174 1389 184 m 1389 471 l 1389 322 q 1382 305 1389 312 q 1364 298 1374 298 l 521 298 q 503 305 511 298 q 496 322 496 312 l 496 471 q 503 489 496 481 q 521 496 511 496 l 1364 496 q 1382 489 1374 496 q 1389 471 1389 481 m 1389 769 l 1389 620 q 1382 603 1389 610 q 1364 595 1374 595 l 521 595 q 503 603 511 595 q 496 620 496 610 l 496 769 q 503 786 496 779 q 521 794 511 794 l 1364 794 q 1382 786 1374 794 q 1389 769 1389 779 m 1389 1066 l 1389 918 q 1382 900 1389 908 q 1364 893 1374 893 l 25 893 q 7 900 15 893 q 0 918 0 908 l 0 1066 q 7 1084 0 1077 q 25 1091 15 1091 l 1364 1091 q 1382 1084 1374 1091 q 1389 1066 1389 1077 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 266 563 q 273 546 273 556 q 266 528 273 535 l 43 305 q 25 298 36 298 q 7 305 15 298 q 0 322 0 312 l 0 769 q 7 786 0 779 q 25 794 15 794 q 43 787 36 794 l 266 563 m 1389 174 l 1389 25 q 1382 7 1389 15 q 1364 0 1374 0 l 25 0 q 7 7 15 0 q 0 25 0 15 l 0 174 q 7 191 0 184 q 25 198 15 198 l 1364 198 q 1382 191 1374 198 q 1389 174 1389 184 m 1389 471 l 1389 322 q 1382 305 1389 312 q 1364 298 1374 298 l 521 298 q 503 305 511 298 q 496 322 496 312 l 496 471 q 503 489 496 481 q 521 496 511 496 l 1364 496 q 1382 489 1374 496 q 1389 471 1389 481 m 1389 769 l 1389 620 q 1382 603 1389 610 q 1364 595 1374 595 l 521 595 q 503 603 511 595 q 496 620 496 610 l 496 769 q 503 786 496 779 q 521 794 511 794 l 1364 794 q 1382 786 1374 794 q 1389 769 1389 779 m 1389 1066 l 1389 918 q 1382 900 1389 908 q 1364 893 1374 893 l 25 893 q 7 900 15 893 q 0 918 0 908 l 0 1066 q 7 1084 0 1077 q 25 1091 15 1091 l 1364 1091 q 1382 1084 1374 1091 q 1389 1066 1389 1077 z "},"飥�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 918 l 1389 74 q 1359 29 1389 42 q 1339 25 1349 25 q 1304 40 1318 25 l 992 352 l 992 223 q 927 65 992 131 q 769 0 861 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 769 q 65 927 0 861 q 223 992 131 992 l 769 992 q 927 927 861 992 q 992 769 992 861 l 992 641 l 1304 953 q 1339 967 1318 967 q 1359 963 1349 967 q 1389 918 1389 950 z "},"飥�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 453 849 q 474 828 453 849 q 496 744 496 806 q 453 639 496 682 q 347 595 409 595 q 242 639 285 595 q 198 744 198 682 q 242 849 198 806 q 347 893 285 893 q 453 849 409 893 m 1290 446 l 1290 99 l 198 99 l 198 248 l 446 496 l 570 372 l 967 769 l 1290 446 m 1364 992 l 124 992 q 107 985 114 992 q 99 967 99 977 l 99 25 q 107 7 99 15 q 124 0 114 0 l 1364 0 q 1382 7 1374 0 q 1389 25 1389 15 l 1389 967 q 1382 985 1389 977 q 1364 992 1374 992 m 1488 967 l 1488 25 q 1452 -63 1488 -26 q 1364 -99 1415 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1364 1091 q 1452 1055 1415 1091 q 1488 967 1488 1018 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1174,"o":"m 281 0 l 352 71 l 170 253 l 99 182 l 99 99 l 198 99 l 198 0 l 281 0 m 687 719 q 670 736 687 736 q 656 731 662 736 l 236 311 q 231 298 231 305 q 248 281 231 281 q 261 286 256 281 l 681 706 q 687 719 687 711 m 645 868 l 967 546 l 322 -99 l 0 -99 l 0 223 l 645 868 m 1174 794 q 1146 724 1174 753 l 1017 595 l 694 918 l 823 1046 q 893 1075 851 1075 q 963 1046 934 1075 l 1146 864 q 1174 794 1174 834 z "},"飦�":{"ha":794,"x_min":0,"x_max":794,"o":"m 537 554 q 566 583 537 554 q 595 694 595 612 q 537 835 595 777 q 397 893 479 893 q 257 835 315 893 q 198 694 198 777 q 257 554 198 612 q 397 496 315 496 q 537 554 479 496 m 794 694 q 768 556 794 610 l 486 -44 q 449 -84 474 -70 q 397 -99 425 -99 q 345 -84 369 -99 q 308 -44 320 -70 l 26 556 q 0 694 0 610 q 116 975 0 859 q 397 1091 233 1091 q 677 975 561 1091 q 794 694 794 859 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 595 74 l 595 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":794,"x_min":0,"x_max":794,"o":"m 397 298 q 381 351 397 326 q 369 369 381 352 q 350 398 358 385 q 330 432 341 411 q 314 471 319 453 q 298 484 311 484 q 281 471 284 484 q 265 432 276 453 q 246 398 254 411 q 226 369 237 385 q 214 351 215 352 q 198 298 198 326 q 227 227 198 257 q 298 198 257 198 q 368 227 339 198 q 397 298 397 257 m 794 397 q 677 116 794 233 q 397 0 561 0 q 116 116 233 0 q 0 397 0 233 q 63 610 0 509 q 111 680 67 617 q 189 797 155 743 q 267 935 224 851 q 331 1091 309 1019 q 357 1128 338 1115 q 397 1141 377 1141 q 437 1128 417 1141 q 463 1091 457 1115 q 527 935 484 1019 q 604 797 570 851 q 682 680 639 743 q 731 610 726 617 q 794 397 794 512 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1383,"o":"m 688 273 l 778 363 l 660 481 l 570 391 l 570 347 l 645 347 l 645 273 l 688 273 m 1028 805 q 1029 831 1042 818 q 1004 830 1017 843 l 732 559 q 732 533 719 546 q 757 534 744 521 l 1028 805 m 1091 370 l 1091 223 q 1026 65 1091 131 q 868 0 960 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 868 1091 q 959 1072 917 1091 q 973 1054 970 1066 q 966 1032 975 1041 l 928 994 q 903 987 917 983 q 868 992 885 992 l 223 992 q 136 956 172 992 q 99 868 99 919 l 99 223 q 136 136 99 172 q 223 99 172 99 l 868 99 q 956 136 919 99 q 992 223 992 172 l 992 321 q 999 338 992 331 l 1049 388 q 1076 393 1060 399 q 1091 370 1091 387 m 1017 942 l 1240 719 l 719 198 l 496 198 l 496 422 l 1017 942 m 1361 840 l 1290 769 l 1066 992 l 1138 1063 q 1190 1085 1159 1085 q 1243 1063 1221 1085 l 1361 946 q 1383 893 1383 924 q 1361 840 1383 862 z "},"飦�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1091 424 l 1091 223 q 1026 65 1091 131 q 868 0 960 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 421 1091 l 421 1091 q 438 1084 431 1091 q 446 1066 446 1077 q 426 1042 446 1046 q 322 995 366 1022 q 310 992 315 992 l 223 992 q 136 956 172 992 q 99 868 99 919 l 99 223 q 136 136 99 172 q 223 99 172 99 l 868 99 q 956 136 919 99 q 992 223 992 172 l 992 389 q 1006 412 992 404 q 1048 440 1028 422 q 1075 446 1060 453 q 1091 424 1091 439 m 1275 808 l 977 511 q 942 496 963 496 q 923 500 933 496 q 893 546 893 513 l 893 694 l 769 694 q 429 593 519 694 q 372 226 337 487 q 357 200 374 208 q 347 198 350 198 q 327 208 335 198 q 311 233 319 219 q 280 286 302 246 q 242 363 258 326 q 212 451 226 400 q 198 546 198 502 q 201 616 198 584 q 212 686 204 649 q 234 754 220 723 q 270 817 247 785 q 323 875 293 849 q 396 922 353 900 q 493 960 439 945 q 617 984 546 975 q 769 992 687 992 l 893 992 l 893 1141 q 923 1187 893 1173 q 942 1190 933 1190 q 977 1176 963 1190 l 1275 878 q 1290 843 1290 863 q 1275 808 1290 823 z "},"飦�":{"ha":1290,"x_min":0,"x_max":1289,"o":"m 1091 470 l 1091 223 q 1026 65 1091 131 q 868 0 960 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 868 1091 q 959 1072 917 1091 q 973 1054 970 1066 q 966 1032 975 1041 l 928 994 q 910 986 920 986 q 903 987 908 986 q 868 992 885 992 l 223 992 q 136 956 172 992 q 99 868 99 919 l 99 223 q 136 136 99 172 q 223 99 172 99 l 868 99 q 956 136 919 99 q 992 223 992 172 l 992 420 q 999 437 992 430 l 1049 487 q 1066 494 1056 494 q 1076 492 1071 494 q 1091 470 1091 486 m 1270 849 l 639 218 q 595 199 621 199 q 551 218 570 199 l 218 551 q 199 595 199 570 q 218 639 199 621 l 303 725 q 347 743 322 743 q 391 725 373 743 l 595 521 l 1097 1022 q 1141 1041 1115 1041 q 1185 1022 1166 1041 l 1270 937 q 1289 893 1289 918 q 1270 849 1289 867 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1374 531 q 1389 496 1389 516 q 1374 461 1389 476 l 1176 263 q 1141 248 1161 248 q 1106 263 1121 248 q 1091 298 1091 277 l 1091 397 l 794 397 l 794 99 l 893 99 q 928 84 913 99 q 942 50 942 70 q 928 15 942 29 l 729 -184 q 694 -198 715 -198 q 660 -184 674 -198 l 461 15 q 446 50 446 29 q 461 84 446 70 q 496 99 476 99 l 595 99 l 595 397 l 298 397 l 298 298 q 283 263 298 277 q 248 248 268 248 q 213 263 228 248 l 15 461 q 0 496 0 476 q 15 531 0 516 l 213 729 q 248 744 228 744 q 283 729 268 744 q 298 694 298 715 l 298 595 l 595 595 l 595 893 l 496 893 q 461 908 476 893 q 446 942 446 922 q 461 977 446 963 l 660 1176 q 694 1190 674 1190 q 729 1176 715 1190 l 928 977 q 942 942 942 963 q 928 908 942 922 q 893 893 913 893 l 794 893 l 794 595 l 1091 595 l 1091 694 q 1106 729 1091 715 q 1141 744 1121 744 q 1176 729 1161 744 l 1374 531 z "},"飦�":{"ha":794,"x_min":0,"x_max":794,"o":"m 759 1081 q 784 1091 773 1096 q 794 1066 794 1087 l 794 -74 q 784 -99 794 -95 q 759 -89 773 -104 l 208 461 q 198 476 202 468 l 198 -50 q 184 -84 198 -70 q 149 -99 169 -99 l 50 -99 q 15 -84 29 -99 q 0 -50 0 -70 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 149 1091 q 184 1077 169 1091 q 198 1042 198 1062 l 198 516 q 208 531 202 524 l 759 1081 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1354 1081 q 1379 1091 1369 1096 q 1389 1066 1389 1087 l 1389 -74 q 1379 -99 1389 -95 q 1354 -89 1369 -104 l 804 461 q 794 476 797 468 l 794 -74 q 784 -99 794 -95 q 759 -89 773 -104 l 208 461 q 198 476 202 468 l 198 -50 q 184 -84 198 -70 q 149 -99 169 -99 l 50 -99 q 15 -84 29 -99 q 0 -50 0 -70 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 149 1091 q 184 1077 169 1091 q 198 1042 198 1062 l 198 516 q 208 531 202 524 l 759 1081 q 784 1091 773 1096 q 794 1066 794 1087 l 794 516 q 804 531 797 524 l 1354 1081 z "},"飦�":{"ha":1290,"x_min":95,"x_max":1290,"o":"m 1255 1081 q 1280 1091 1270 1096 q 1290 1066 1290 1087 l 1290 -74 q 1280 -99 1290 -95 q 1255 -89 1270 -104 l 705 461 q 694 476 698 468 l 694 -74 q 684 -99 694 -95 q 660 -89 674 -104 l 109 461 q 95 496 95 476 q 109 531 95 516 l 660 1081 q 684 1091 674 1096 q 694 1066 694 1087 l 694 516 q 705 531 698 524 l 1255 1081 z "},"飦�":{"ha":1091,"x_min":0,"x_max":1090,"o":"m 1073 472 l 43 -100 q 13 -102 26 -110 q 0 -74 0 -95 l 0 1066 q 13 1094 0 1087 q 43 1092 26 1102 l 1073 520 q 1090 496 1090 510 q 1073 472 1090 482 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 1042 l 1190 -50 q 1176 -84 1190 -70 q 1141 -99 1161 -99 l 744 -99 q 709 -84 724 -99 q 694 -50 694 -70 l 694 1042 q 709 1077 694 1062 q 744 1091 724 1091 l 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 m 496 1042 l 496 -50 q 481 -84 496 -70 q 446 -99 467 -99 l 50 -99 q 15 -84 29 -99 q 0 -50 0 -70 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 446 1091 q 481 1077 467 1091 q 496 1042 496 1062 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 1042 l 1190 -50 q 1176 -84 1190 -70 q 1141 -99 1161 -99 l 50 -99 q 15 -84 29 -99 q 0 -50 0 -70 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 z "},"飦�":{"ha":1290,"x_min":0,"x_max":1195,"o":"m 35 -89 q 10 -99 20 -104 q 0 -74 0 -95 l 0 1066 q 10 1091 0 1087 q 35 1081 20 1096 l 585 531 q 595 516 592 524 l 595 1066 q 605 1091 595 1087 q 630 1081 615 1096 l 1180 531 q 1195 496 1195 516 q 1180 461 1195 476 l 630 -89 q 605 -99 615 -104 q 595 -74 595 -95 l 595 476 q 585 461 592 468 l 35 -89 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 35 -89 q 10 -99 20 -104 q 0 -74 0 -95 l 0 1066 q 10 1091 0 1087 q 35 1081 20 1096 l 585 531 q 595 516 592 524 l 595 1066 q 605 1091 595 1087 q 630 1081 615 1096 l 1180 531 q 1190 516 1187 524 l 1190 1042 q 1205 1077 1190 1062 q 1240 1091 1220 1091 l 1339 1091 q 1374 1077 1359 1091 q 1389 1042 1389 1062 l 1389 -50 q 1374 -84 1389 -70 q 1339 -99 1359 -99 l 1240 -99 q 1205 -84 1220 -99 q 1190 -50 1190 -70 l 1190 476 q 1180 461 1187 468 l 630 -89 q 605 -99 615 -104 q 595 -74 595 -95 l 595 476 q 585 461 592 468 l 35 -89 z "},"飦�":{"ha":794,"x_min":0,"x_max":794,"o":"m 35 -89 q 10 -99 20 -104 q 0 -74 0 -95 l 0 1066 q 10 1091 0 1087 q 35 1081 20 1096 l 585 531 q 595 516 592 524 l 595 1042 q 610 1077 595 1062 q 645 1091 625 1091 l 744 1091 q 779 1077 764 1091 q 794 1042 794 1062 l 794 -50 q 779 -84 794 -70 q 744 -99 764 -99 l 645 -99 q 610 -84 625 -99 q 595 -50 595 -70 l 595 476 q 585 461 592 468 l 35 -89 z "},"飦�":{"ha":1192,"x_min":1,"x_max":1191,"o":"m 11 432 l 561 982 q 596 997 576 997 q 631 982 616 997 l 1181 432 q 1191 407 1196 417 q 1166 397 1187 397 l 26 397 q 1 407 5 397 q 11 432 -4 417 m 1142 0 l 50 0 q 16 15 30 0 q 1 50 1 29 l 1 248 q 16 283 1 268 q 50 298 30 298 l 1142 298 q 1177 283 1162 298 q 1191 248 1191 268 l 1191 50 q 1177 15 1191 29 q 1142 0 1162 0 z "},"飦�":{"ha":992,"x_min":119,"x_max":922,"o":"m 908 957 l 496 546 l 908 134 q 922 99 922 119 q 908 64 922 79 l 779 -64 q 744 -79 764 -79 q 709 -64 724 -79 l 134 511 q 119 546 119 525 q 134 581 119 566 l 709 1156 q 744 1170 724 1170 q 779 1156 764 1170 l 908 1027 q 922 992 922 1012 q 908 957 922 972 z "},"飦�":{"ha":992,"x_min":70,"x_max":873,"o":"m 858 511 l 283 -64 q 248 -79 268 -79 q 213 -64 228 -79 l 84 64 q 70 99 70 79 q 84 134 70 119 l 496 546 l 84 957 q 70 992 70 972 q 84 1027 70 1012 l 213 1156 q 248 1170 228 1170 q 283 1156 268 1170 l 858 581 q 873 546 873 566 q 858 511 873 525 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 942 446 l 942 546 q 928 581 942 566 q 893 595 913 595 l 694 595 l 694 794 q 680 829 694 814 q 645 843 665 843 l 546 843 q 511 829 525 843 q 496 794 496 814 l 496 595 l 298 595 q 263 581 277 595 q 248 546 248 566 l 248 446 q 263 412 248 426 q 298 397 277 397 l 496 397 l 496 198 q 511 164 496 178 q 546 149 525 149 l 645 149 q 680 164 665 149 q 694 198 694 178 l 694 397 l 893 397 q 928 412 913 397 q 942 446 942 426 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 942 446 l 942 546 q 928 581 942 566 q 893 595 913 595 l 298 595 q 263 581 277 595 q 248 546 248 566 l 248 446 q 263 412 248 426 q 298 397 277 397 l 893 397 q 928 412 913 397 q 942 446 942 426 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 891 321 q 876 356 891 341 l 736 496 l 876 636 q 891 671 891 651 q 876 707 891 692 l 806 777 q 770 791 791 791 q 736 777 750 791 l 595 636 l 455 777 q 420 791 440 791 q 384 777 399 791 l 315 707 q 300 671 300 692 q 315 636 300 651 l 455 496 l 315 356 q 300 321 300 341 q 315 285 300 300 l 384 215 q 420 201 399 201 q 455 215 440 201 l 595 356 l 736 215 q 770 201 750 201 q 806 215 791 201 l 876 285 q 891 321 891 300 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 995 622 q 981 657 995 643 l 911 727 q 876 742 896 742 q 841 727 856 742 l 525 412 l 350 587 q 315 601 335 601 q 280 587 295 601 l 209 517 q 195 481 195 503 q 209 446 195 460 l 490 166 q 525 151 505 151 q 560 166 546 151 l 981 587 q 995 622 995 601 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 694 124 l 694 273 q 687 291 694 284 q 670 298 680 298 l 521 298 q 503 291 510 298 q 496 273 496 284 l 496 124 q 503 106 496 113 q 521 99 510 99 l 670 99 q 687 106 680 99 q 694 124 694 113 m 893 645 q 850 771 893 713 q 742 861 807 829 q 611 893 678 893 q 323 728 422 893 q 329 695 312 709 l 432 618 q 446 613 437 613 q 466 622 459 613 q 532 694 507 675 q 599 712 559 712 q 665 692 636 712 q 694 646 694 672 q 679 599 694 617 q 626 564 663 581 q 537 497 577 543 q 496 400 496 452 l 496 372 q 503 354 496 361 q 521 347 510 347 l 670 347 q 687 354 680 347 q 694 372 694 361 q 711 410 694 387 q 753 449 728 434 q 791 471 778 463 q 827 498 805 479 q 861 535 849 517 q 883 582 873 553 q 893 645 893 611 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 794 124 l 794 248 q 787 266 794 259 q 769 273 780 273 l 694 273 l 694 670 q 687 687 694 680 q 670 694 680 694 l 422 694 q 404 687 411 694 q 397 670 397 680 l 397 546 q 404 528 397 535 q 422 521 411 521 l 496 521 l 496 273 l 422 273 q 404 266 411 273 q 397 248 397 259 l 397 124 q 404 106 397 113 q 422 99 411 99 l 769 99 q 787 106 780 99 q 794 124 794 113 m 694 818 l 694 942 q 687 960 694 953 q 670 967 680 967 l 521 967 q 503 960 510 967 q 496 942 496 953 l 496 818 q 503 801 496 808 q 521 794 510 794 l 670 794 q 687 801 680 794 q 694 818 694 808 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 928 397 l 843 397 q 808 412 823 397 q 794 446 794 426 l 794 546 q 808 581 794 566 q 843 595 823 595 l 928 595 q 841 741 903 679 q 694 829 778 804 l 694 744 q 680 709 694 724 q 645 694 665 694 l 546 694 q 511 709 525 694 q 496 744 496 724 l 496 829 q 350 741 412 804 q 263 595 288 679 l 347 595 q 382 581 367 595 q 397 546 397 566 l 397 446 q 382 412 397 426 q 347 397 367 397 l 263 397 q 350 251 288 313 q 496 164 412 188 l 496 248 q 511 283 496 268 q 546 298 525 298 l 645 298 q 680 283 665 298 q 694 248 694 268 l 694 164 q 841 251 778 188 q 928 397 903 313 m 1190 546 l 1190 446 q 1176 412 1190 426 q 1141 397 1161 397 l 1030 397 q 910 181 1001 272 q 694 61 819 90 l 694 -50 q 680 -84 694 -70 q 645 -99 665 -99 l 546 -99 q 511 -84 525 -99 q 496 -50 496 -70 l 496 61 q 280 181 371 90 q 160 397 189 272 l 50 397 q 15 412 29 397 q 0 446 0 426 l 0 546 q 15 581 0 566 q 50 595 29 595 l 160 595 q 280 811 189 720 q 496 931 371 902 l 496 1042 q 511 1077 496 1062 q 546 1091 525 1091 l 645 1091 q 680 1077 665 1091 q 694 1042 694 1062 l 694 931 q 910 811 819 902 q 1030 595 1001 720 l 1141 595 q 1176 581 1161 595 q 1190 546 1190 566 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 850 354 l 737 241 q 719 233 729 233 q 701 241 709 233 l 595 347 l 489 241 q 471 233 481 233 q 453 241 461 233 l 340 354 q 332 372 332 362 q 340 390 332 382 l 446 496 l 340 602 q 332 620 332 610 q 340 638 332 630 l 453 751 q 471 759 461 759 q 489 751 481 759 l 595 645 l 701 751 q 719 759 709 759 q 737 751 729 759 l 850 638 q 858 620 858 630 q 850 602 858 610 l 744 496 l 850 390 q 858 372 858 382 q 850 354 858 362 m 960 284 q 989 333 960 284 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 908 560 l 581 233 q 546 219 566 219 q 511 233 525 219 l 283 461 q 268 496 268 476 q 283 531 268 516 l 362 610 q 397 625 377 625 q 432 610 417 625 l 546 496 l 759 709 q 794 724 773 724 q 829 709 814 724 l 908 630 q 922 595 922 615 q 908 560 922 575 m 960 284 q 989 333 960 284 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1017 498 q 949 727 1017 623 l 365 143 q 595 74 471 74 q 759 108 681 74 q 894 198 837 142 q 984 334 950 255 q 1017 498 1017 412 m 243 267 l 828 851 q 595 922 723 922 q 384 865 481 922 q 230 711 287 808 q 174 498 174 613 q 243 267 174 373 m 1143 730 q 1167 675 1143 730 q 1190 498 1190 620 q 1143 266 1190 377 q 1016 75 1096 155 q 827 -52 937 -5 q 595 -99 716 -99 q 364 -52 474 -99 q 174 75 253 -5 q 47 266 95 155 q 0 498 0 377 q 47 730 0 620 q 174 921 95 841 q 364 1048 253 1001 q 595 1095 474 1095 q 827 1048 716 1095 q 1016 921 937 1001 q 1143 730 1096 841 z "},"飦�":{"ha":1190,"x_min":50,"x_max":1190,"o":"m 1190 496 l 1190 397 q 1165 327 1190 356 q 1100 298 1140 298 l 554 298 l 781 70 q 811 0 811 42 q 781 -70 811 -42 l 723 -129 q 653 -157 694 -157 q 583 -129 613 -157 l 78 377 q 50 446 50 405 q 78 517 50 487 l 583 1021 q 653 1050 612 1050 q 723 1021 694 1050 l 781 963 q 811 893 811 934 q 781 822 811 852 l 554 595 l 1100 595 q 1165 566 1140 595 q 1190 496 1190 537 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1141,"o":"m 1141 446 q 1112 376 1141 405 l 608 -129 q 537 -157 577 -157 q 467 -129 498 -157 l 409 -71 q 380 0 380 -41 q 409 71 380 41 l 636 298 l 91 298 q 25 327 50 298 q 0 397 0 356 l 0 496 q 25 566 0 537 q 91 595 50 595 l 636 595 l 409 823 q 380 893 380 851 q 409 963 380 935 l 467 1021 q 537 1050 497 1050 q 608 1021 578 1050 l 1112 516 q 1141 446 1141 489 z "},"飦�":{"ha":1290,"x_min":41,"x_max":1249,"o":"m 1249 438 q 1220 368 1249 398 l 1162 310 q 1091 281 1132 281 q 1022 310 1049 281 l 794 537 l 794 -9 q 765 -74 794 -49 q 694 -99 736 -99 l 595 -99 q 525 -74 554 -99 q 496 -9 496 -49 l 496 537 l 268 310 q 198 281 240 281 q 129 310 157 281 l 71 368 q 41 438 41 398 q 71 508 41 479 l 575 1013 q 645 1042 602 1042 q 715 1013 687 1042 l 1220 508 q 1249 438 1249 478 z "},"飦�":{"ha":1290,"x_min":41,"x_max":1249,"o":"m 1249 546 q 1220 476 1249 505 l 715 -29 q 645 -58 685 -58 q 575 -29 604 -58 l 71 476 q 41 546 41 504 q 71 616 41 587 l 128 674 q 198 703 158 703 q 268 674 239 703 l 496 446 l 496 992 q 525 1062 496 1032 q 595 1091 555 1091 l 694 1091 q 764 1062 735 1091 q 794 992 794 1032 l 794 446 l 1022 674 q 1091 703 1050 703 q 1162 674 1132 703 l 1220 616 q 1249 546 1249 586 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1374 729 q 1389 694 1389 715 q 1374 660 1389 674 l 977 263 q 942 248 963 248 q 908 263 922 248 q 893 298 893 277 l 893 496 l 719 496 q 583 491 643 496 q 464 475 523 487 q 361 442 405 463 q 279 388 317 421 q 217 310 241 355 q 179 202 193 264 q 166 62 166 140 q 170 -33 166 19 q 172 -52 170 -38 q 174 -72 174 -65 q 167 -91 174 -84 q 149 -99 160 -99 q 127 -86 136 -99 q 117 -69 122 -79 q 107 -46 112 -59 q 98 -27 101 -33 q 0 322 0 194 q 41 581 0 477 q 719 893 167 893 l 893 893 l 893 1091 q 908 1126 893 1111 q 942 1141 922 1141 q 977 1126 963 1141 l 1374 729 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 577 390 q 585 372 585 382 q 577 354 585 362 l 320 97 l 432 -15 q 446 -50 446 -29 q 432 -84 446 -70 q 397 -99 417 -99 l 50 -99 q 15 -84 29 -99 q 0 -50 0 -70 l 0 298 q 15 332 0 318 q 50 347 29 347 q 84 332 70 347 l 196 221 l 453 478 q 471 486 461 486 q 489 478 481 486 l 577 390 m 1190 1042 l 1190 694 q 1176 660 1190 674 q 1141 645 1161 645 q 1106 660 1121 645 l 994 771 l 737 514 q 719 506 729 506 q 701 514 709 506 l 613 602 q 605 620 605 610 q 613 638 605 630 l 870 895 l 759 1007 q 744 1042 744 1022 q 759 1077 744 1062 q 794 1091 773 1091 l 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 z "},"飦�":{"ha":1190,"x_min":10,"x_max":1180,"o":"m 595 446 l 595 99 q 581 64 595 79 q 546 50 566 50 q 511 64 525 50 l 399 176 l 142 -81 q 124 -89 134 -89 q 106 -81 114 -89 l 18 7 q 10 25 10 15 q 18 43 10 35 l 275 300 l 164 412 q 149 446 149 426 q 164 481 149 467 q 198 496 178 496 l 546 496 q 581 481 566 496 q 595 446 595 467 m 1173 985 q 1180 967 1180 977 q 1173 949 1180 957 l 915 692 l 1027 581 q 1042 546 1042 566 q 1027 511 1042 525 q 992 496 1012 496 l 645 496 q 610 511 625 496 q 595 546 595 525 l 595 893 q 610 928 595 913 q 645 942 625 942 q 680 928 665 942 l 791 816 l 1049 1073 q 1066 1081 1056 1081 q 1084 1073 1077 1081 l 1173 985 z "},"飦�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 1091 620 l 1091 471 q 1070 419 1091 440 q 1017 397 1048 397 l 694 397 l 694 74 q 673 22 694 43 q 620 0 651 0 l 471 0 q 419 22 440 0 q 397 74 397 43 l 397 397 l 74 397 q 22 419 43 397 q 0 471 0 440 l 0 620 q 22 673 0 651 q 74 694 43 694 l 397 694 l 397 1017 q 419 1070 397 1048 q 471 1091 440 1091 l 620 1091 q 673 1070 651 1091 q 694 1017 694 1048 l 694 694 l 1017 694 q 1070 673 1048 694 q 1091 620 1091 651 z "},"飦�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 1091 620 l 1091 471 q 1070 419 1091 440 q 1017 397 1048 397 l 74 397 q 22 419 43 397 q 0 471 0 440 l 0 620 q 22 673 0 651 q 74 694 43 694 l 1017 694 q 1070 673 1048 694 q 1091 620 1091 651 z "},"飦�":{"ha":1290,"x_min":95,"x_max":1195,"o":"m 1149 377 q 1195 317 1184 357 q 1185 241 1205 277 l 1135 156 q 1075 110 1115 120 q 1000 119 1035 99 l 794 238 l 794 0 q 764 -70 794 -40 q 694 -99 735 -99 l 595 -99 q 525 -70 555 -99 q 496 0 496 -40 l 496 238 l 290 119 q 214 110 254 99 q 154 156 174 120 l 105 241 q 95 317 84 277 q 141 377 105 357 l 347 496 l 141 615 q 95 675 105 636 q 105 751 84 715 l 154 836 q 214 882 174 872 q 290 873 254 893 l 496 754 l 496 992 q 525 1062 496 1032 q 595 1091 555 1091 l 694 1091 q 764 1062 735 1091 q 794 992 794 1032 l 794 754 l 1000 873 q 1075 882 1035 893 q 1135 836 1115 872 l 1185 751 q 1195 675 1205 715 q 1149 615 1184 636 l 942 496 l 1149 377 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 296 1011 q 365 1051 296 1011 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 m 694 125 l 694 272 q 687 290 694 283 q 670 298 680 298 l 522 298 q 504 290 512 298 q 496 272 496 282 l 496 125 q 504 107 496 115 q 522 99 512 99 l 670 99 q 687 107 680 99 q 694 125 694 114 m 693 391 l 707 873 q 699 887 707 882 q 680 893 691 893 l 510 893 q 491 887 499 893 q 484 873 484 882 l 497 391 q 505 378 497 384 q 523 372 512 372 l 667 372 q 685 378 677 372 q 693 391 692 384 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 719 140 l 719 183 l 719 546 l 719 694 l 471 694 l 471 546 l 471 183 l 471 140 q 485 110 471 120 q 521 99 499 99 l 670 99 q 705 110 691 99 q 719 140 719 120 m 366 794 l 517 794 l 419 918 q 366 942 399 942 q 313 921 335 942 q 291 868 291 899 q 313 815 291 837 q 366 794 335 794 m 877 815 q 888 826 877 815 q 899 868 899 837 q 877 921 899 899 q 825 942 856 942 q 771 918 791 942 l 674 794 l 825 794 q 877 815 856 794 m 1190 670 l 1190 422 q 1184 404 1190 411 q 1166 397 1177 397 l 1091 397 l 1091 74 q 1070 22 1091 43 q 1017 0 1048 0 l 174 0 q 121 22 143 0 q 99 74 99 43 l 99 397 l 25 397 q 7 404 14 397 q 0 422 0 411 l 0 670 q 7 687 0 680 q 25 694 14 694 l 366 694 q 243 745 294 694 q 192 868 192 796 q 243 991 192 940 q 366 1042 294 1042 q 496 982 449 1042 l 595 854 l 694 982 q 825 1042 742 1042 q 947 991 897 1042 q 998 868 998 940 q 947 745 998 796 q 825 694 897 694 l 1166 694 q 1184 687 1177 694 q 1190 670 1190 680 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 977 610 q 985 617 977 610 q 992 645 992 625 q 977 680 992 665 q 942 694 963 694 q 696 656 809 694 q 495 552 583 618 q 312 382 407 487 q 298 347 298 366 q 312 312 298 327 q 347 298 327 298 q 382 312 366 298 q 439 367 403 331 q 491 419 476 404 q 699 555 598 515 q 942 595 801 595 q 977 610 963 595 m 1389 798 q 1373 649 1389 725 q 1230 352 1338 475 q 953 144 1123 229 q 614 60 787 60 q 392 97 499 60 q 324 129 381 101 q 250 158 267 158 q 219 133 237 158 q 184 79 201 109 q 143 25 167 50 q 97 0 119 0 q 48 14 64 0 q 12 60 32 27 q 8 68 11 63 q 3 76 5 74 q 1 83 2 78 q 0 94 0 88 q 24 151 0 121 q 77 202 48 181 q 129 245 105 222 q 153 282 153 267 q 143 312 153 285 q 130 346 132 338 q 123 426 123 385 q 157 597 123 515 q 249 740 191 678 q 381 848 308 801 q 539 922 455 894 q 652 941 582 935 q 791 948 722 947 q 929 953 860 949 q 1056 972 998 956 q 1144 1015 1114 987 q 1167 1038 1152 1023 q 1190 1060 1182 1053 q 1211 1075 1197 1066 q 1239 1088 1224 1084 q 1273 1091 1254 1091 q 1327 1056 1303 1091 q 1364 969 1352 1020 q 1383 873 1376 918 q 1389 798 1389 828 z "},"飦�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 1091 -124 l 1091 -174 q 1084 -191 1091 -184 q 1066 -198 1077 -198 l 25 -198 q 7 -191 15 -198 q 0 -174 0 -184 l 0 -124 q 7 -107 0 -114 q 25 -99 15 -99 l 1066 -99 q 1084 -107 1077 -99 q 1091 -124 1091 -114 m 893 694 q 874 583 893 634 q 824 496 855 532 q 756 427 794 460 q 682 367 719 395 q 614 312 645 339 q 565 248 584 284 q 546 174 546 213 q 598 0 546 99 l 594 1 l 595 0 q 471 64 525 32 q 364 142 417 97 q 276 237 311 187 q 220 353 241 287 q 198 496 198 420 q 217 608 198 556 q 267 695 236 659 q 335 763 298 731 q 409 823 372 795 q 477 879 446 851 q 527 942 508 907 q 546 1017 546 977 q 494 1190 546 1090 l 497 1190 l 496 1190 q 620 1126 566 1159 q 727 1049 674 1094 q 815 954 780 1004 q 872 837 850 904 q 893 694 893 770 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1290 446 q 994 720 1172 629 q 1042 546 1042 639 q 940 300 1042 402 q 694 198 838 198 q 449 300 551 198 q 347 546 347 402 q 395 720 347 639 q 99 446 217 629 q 358 193 202 288 q 694 99 513 99 q 1031 193 876 99 q 1290 446 1187 288 m 721 718 q 726 723 721 718 q 732 744 732 729 q 721 770 732 760 q 694 781 710 781 q 528 712 598 781 q 459 546 459 643 q 470 519 459 530 q 496 508 481 508 q 522 519 512 508 q 533 546 533 530 q 581 660 533 612 q 694 707 628 707 q 721 718 710 707 m 1373 500 q 1389 446 1389 473 q 1373 393 1389 420 q 1082 107 1265 215 q 694 0 898 0 q 307 108 491 0 q 16 393 124 215 q 0 446 0 420 q 16 500 0 473 q 307 785 124 677 q 694 893 491 893 q 1082 785 898 893 q 1373 500 1265 677 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 430 156 l 491 265 q 385 388 423 314 q 347 546 347 463 q 395 720 347 639 q 99 446 217 629 q 430 156 229 246 m 721 718 q 726 723 721 718 q 732 744 732 729 q 721 770 732 760 q 694 781 710 781 q 528 712 598 781 q 459 546 459 643 q 470 519 459 530 q 496 508 481 508 q 522 519 512 508 q 533 546 533 530 q 581 660 533 612 q 694 707 628 707 q 721 718 710 707 m 1013 892 q 1012 885 1013 887 q 767 446 930 739 q 523 7 605 153 l 485 -62 q 463 -74 477 -74 q 360 -20 454 -74 q 347 2 347 -12 q 381 69 347 11 q 177 203 270 119 q 16 393 84 287 q 0 446 0 417 q 16 500 0 476 q 310 787 134 682 q 694 893 486 893 q 834 880 763 893 l 876 955 q 898 967 884 967 q 911 963 901 967 q 935 951 922 958 q 961 936 949 943 q 985 922 973 929 q 1001 913 998 915 q 1013 892 1013 905 m 1042 546 q 980 349 1042 438 q 818 222 919 260 l 1035 611 q 1042 546 1042 576 m 1373 500 q 1389 446 1389 474 q 1373 393 1389 419 q 1289 281 1343 343 q 1020 74 1173 147 q 694 0 867 0 l 752 102 q 1056 208 916 116 q 1290 446 1196 301 q 1071 674 1201 585 l 1120 761 q 1261 643 1194 711 q 1373 500 1329 574 z "},"飦�":{"ha":1389,"x_min":12,"x_max":1376,"o":"m 794 125 l 794 272 q 786 290 794 283 q 769 298 779 298 l 620 298 q 603 290 610 298 q 595 272 595 283 l 595 125 q 603 107 595 114 q 620 99 610 99 l 769 99 q 786 107 779 99 q 794 125 794 114 m 792 415 l 806 770 q 798 785 806 780 q 780 794 788 794 l 609 794 q 591 785 601 794 q 583 769 583 780 l 596 415 q 604 402 596 407 q 622 397 612 397 l 766 397 q 784 402 777 397 q 792 415 791 407 m 781 1139 l 1376 47 q 1375 -50 1404 -2 q 1339 -86 1362 -73 q 1290 -99 1316 -99 l 99 -99 q 50 -86 73 -99 q 14 -50 27 -73 q 12 47 -15 -2 l 608 1139 q 644 1177 621 1163 q 694 1190 667 1190 q 745 1177 722 1190 q 781 1139 768 1163 z "},"飦�":{"ha":1091,"x_min":0,"x_max":1076,"o":"m 1066 1066 q 1076 952 1101 1026 q 992 818 1051 877 l 867 694 l 991 154 q 982 129 995 140 l 883 54 q 868 50 877 50 q 863 50 865 50 q 846 63 851 53 l 630 457 l 429 256 l 470 105 q 464 81 474 92 l 390 7 q 372 0 383 0 l 370 0 q 352 10 359 2 l 205 205 l 10 352 q 0 370 2 357 q 7 389 -1 380 l 81 464 q 99 471 88 471 q 105 470 104 471 l 256 429 l 457 630 l 63 846 q 50 865 52 853 q 57 886 48 877 l 156 985 q 179 991 167 995 l 694 868 l 818 992 q 952 1076 877 1051 q 1066 1066 1026 1101 z "},"飦�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 99 -99 l 322 -99 l 322 124 l 99 124 l 99 -99 m 372 -99 l 620 -99 l 620 124 l 372 124 l 372 -99 m 99 174 l 322 174 l 322 422 l 99 422 l 99 174 m 372 174 l 620 174 l 620 422 l 372 422 l 372 174 m 99 471 l 322 471 l 322 694 l 99 694 l 99 471 m 670 -99 l 918 -99 l 918 124 l 670 124 l 670 -99 m 372 471 l 620 471 l 620 694 l 372 694 l 372 471 m 967 -99 l 1190 -99 l 1190 124 l 967 124 l 967 -99 m 670 174 l 918 174 l 918 422 l 670 422 l 670 174 m 397 843 l 397 1066 q 389 1084 397 1077 q 372 1091 382 1091 l 322 1091 q 305 1084 312 1091 q 298 1066 298 1077 l 298 843 q 305 826 298 833 q 322 818 312 818 l 372 818 q 389 826 382 818 q 397 843 397 833 m 967 174 l 1190 174 l 1190 422 l 967 422 l 967 174 m 670 471 l 918 471 l 918 694 l 670 694 l 670 471 m 967 471 l 1190 471 l 1190 694 l 967 694 l 967 471 m 992 843 l 992 1066 q 985 1084 992 1077 q 967 1091 977 1091 l 918 1091 q 900 1084 908 1091 q 893 1066 893 1077 l 893 843 q 900 826 893 833 q 918 818 908 818 l 967 818 q 985 826 977 818 q 992 843 992 833 m 1290 893 l 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 l 99 -198 q 29 -169 59 -198 q 0 -99 0 -140 l 0 893 q 29 963 0 933 q 99 992 59 992 l 198 992 l 198 1066 q 235 1154 198 1118 q 322 1190 271 1190 l 372 1190 q 460 1154 423 1190 q 496 1066 496 1118 l 496 992 l 794 992 l 794 1066 q 830 1154 794 1118 q 918 1190 867 1190 l 967 1190 q 1055 1154 1018 1190 q 1091 1066 1091 1118 l 1091 992 l 1190 992 q 1260 963 1231 992 q 1290 893 1290 933 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 516 818 q 410 606 470 746 q 381 662 393 641 q 350 711 370 684 q 310 755 330 739 q 262 782 291 771 q 198 794 233 794 l 25 794 q 7 801 14 794 q 0 818 0 808 l 0 967 q 7 985 0 978 q 25 992 14 992 l 198 992 q 516 818 392 992 m 1382 216 q 1389 198 1389 209 q 1382 181 1389 188 l 1134 -67 q 1116 -74 1127 -74 q 1099 -67 1106 -74 q 1091 -50 1091 -60 l 1091 99 q 1025 99 1066 99 q 963 98 984 98 q 906 99 941 98 q 851 103 871 100 q 801 111 831 105 q 753 125 772 116 q 708 147 733 134 q 662 178 682 160 q 619 220 642 196 q 576 274 597 243 q 681 485 622 346 q 710 429 698 450 q 741 380 722 408 q 781 336 761 352 q 830 309 801 320 q 893 298 859 298 l 1091 298 l 1091 446 q 1098 464 1091 457 q 1116 471 1105 471 q 1135 463 1125 471 l 1382 216 m 1382 911 q 1389 893 1389 904 q 1382 875 1389 882 l 1134 627 q 1116 620 1127 620 q 1099 627 1106 620 q 1091 645 1091 635 l 1091 794 l 893 794 q 825 782 856 794 q 772 747 795 770 q 732 699 749 724 q 698 639 716 675 q 637 507 673 591 q 599 421 615 456 q 557 339 583 386 q 507 262 531 293 q 450 198 484 231 q 380 145 416 164 q 298 112 344 125 q 198 99 251 99 l 25 99 q 7 106 14 99 q 0 124 0 113 l 0 273 q 7 291 0 284 q 25 298 14 298 l 198 298 q 266 309 236 298 q 319 344 296 321 q 359 392 343 367 q 394 452 375 416 q 454 584 419 500 q 493 670 477 636 q 534 752 508 705 q 584 829 560 798 q 641 894 608 860 q 711 947 675 927 q 794 979 747 966 q 893 992 840 992 l 1091 992 l 1091 1141 q 1098 1159 1091 1152 q 1116 1166 1105 1166 q 1135 1158 1125 1166 l 1382 911 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1296 745 q 1342 688 1296 745 q 1389 496 1389 631 q 1296 247 1389 361 q 1043 66 1203 133 q 694 0 884 0 q 582 6 640 0 q 226 -181 429 -129 q 137 -198 188 -192 q 114 -191 124 -200 q 100 -169 103 -183 l 100 -168 q 100 -159 98 -165 q 101 -151 102 -153 q 105 -144 101 -150 q 109 -137 109 -138 q 115 -130 110 -136 q 121 -123 119 -125 q 145 -96 126 -117 q 172 -67 164 -76 q 196 -36 180 -58 q 221 3 212 -15 q 242 49 230 21 q 262 108 253 77 q 70 278 140 177 q 0 496 0 380 q 55 689 0 597 q 203 847 110 780 q 425 953 296 914 q 694 992 553 992 q 1043 926 884 992 q 1296 745 1203 860 z "},"飦�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 546 l 1190 446 q 1114 166 1190 291 q 902 -29 1038 41 q 595 -99 766 -99 q 289 -29 425 -99 q 76 166 153 41 q 0 446 0 291 l 0 546 q 15 581 0 566 q 50 595 29 595 l 347 595 q 382 581 367 595 q 397 546 397 566 l 397 446 q 415 377 397 406 q 457 332 433 347 q 512 309 480 318 q 561 299 543 301 q 595 298 579 298 q 629 299 612 298 q 679 309 647 301 q 734 332 711 318 q 775 377 757 347 q 794 446 794 406 l 794 546 q 808 581 794 566 q 843 595 823 595 l 1141 595 q 1176 581 1161 595 q 1190 546 1190 566 m 397 1042 l 397 744 q 382 709 397 724 q 347 694 367 694 l 50 694 q 15 709 29 694 q 0 744 0 724 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 347 1091 q 382 1077 367 1091 q 397 1042 397 1062 m 1190 1042 l 1190 744 q 1176 709 1190 724 q 1141 694 1161 694 l 843 694 q 808 709 823 694 q 794 744 794 724 l 794 1042 q 808 1077 794 1062 q 843 1091 823 1091 l 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 z "},"飦�":{"ha":1389,"x_min":70,"x_max":1319,"o":"m 1304 159 l 1176 31 q 1141 16 1161 16 q 1106 31 1121 16 l 694 443 l 283 31 q 248 16 268 16 q 213 31 228 16 l 84 159 q 70 194 70 174 q 84 229 70 215 l 660 804 q 694 818 674 818 q 729 804 715 818 l 1304 229 q 1319 194 1319 215 q 1304 159 1319 174 z "},"飦�":{"ha":1389,"x_min":70,"x_max":1319,"o":"m 1304 564 l 729 -10 q 694 -25 715 -25 q 660 -10 674 -25 l 84 564 q 70 600 70 579 q 84 635 70 620 l 213 763 q 248 777 228 777 q 283 763 268 777 l 694 351 l 1106 763 q 1141 777 1121 777 q 1176 763 1161 777 l 1304 635 q 1319 600 1319 620 q 1304 564 1319 579 z "},"飦�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 992 25 q 985 7 992 15 q 967 0 977 0 l 223 0 q 213 2 217 0 q 206 7 208 3 q 202 13 203 11 q 199 22 200 16 q 198 31 198 29 q 198 41 198 33 q 198 50 198 49 l 198 174 l 198 496 l 50 496 q 15 511 29 496 q 0 546 0 525 q 12 577 0 564 l 260 875 q 298 892 274 892 q 336 875 321 892 l 584 577 q 595 546 595 564 q 581 511 595 525 q 546 496 566 496 l 397 496 l 397 198 l 843 198 q 863 190 856 198 l 987 41 q 992 25 992 33 m 1488 347 q 1476 315 1488 329 l 1228 18 q 1190 0 1213 0 q 1152 18 1168 0 l 904 315 q 893 347 893 329 q 908 382 893 367 q 942 397 922 397 l 1091 397 l 1091 694 l 645 694 q 625 704 632 694 l 501 853 q 496 868 496 860 q 503 885 496 878 q 521 893 511 893 l 1265 893 q 1275 891 1271 893 q 1282 886 1280 890 q 1287 880 1285 882 q 1289 871 1288 877 q 1290 862 1290 864 q 1290 852 1290 860 q 1290 843 1290 844 l 1290 719 l 1290 397 l 1438 397 q 1473 382 1459 397 q 1488 347 1488 367 z "},"飦�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 467 70 q 481 55 467 70 q 496 0 496 40 q 467 -70 496 -40 q 397 -99 437 -99 q 327 -70 357 -99 q 298 0 298 -40 q 327 70 298 40 q 397 99 357 99 q 467 70 437 99 m 1161 70 q 1176 55 1161 70 q 1190 0 1190 40 q 1161 -70 1190 -40 q 1091 -99 1132 -99 q 1022 -70 1051 -99 q 992 0 992 -40 q 1022 70 992 40 q 1091 99 1051 99 q 1161 70 1132 99 m 1290 843 l 1290 446 q 1277 413 1290 428 q 1246 397 1264 399 l 436 302 q 446 248 446 256 q 428 198 446 236 l 1141 198 q 1176 184 1161 198 q 1190 149 1190 169 q 1176 114 1190 129 q 1141 99 1161 99 l 347 99 q 312 114 327 99 q 298 149 298 129 q 304 173 298 157 q 316 201 310 189 q 333 232 322 213 q 345 255 343 251 l 208 893 l 50 893 q 15 908 29 893 q 0 942 0 922 q 15 977 0 963 q 50 992 29 992 l 248 992 q 270 987 260 992 q 285 975 280 982 q 295 956 291 968 q 301 936 300 944 q 306 913 303 928 q 309 893 308 898 l 1240 893 q 1275 878 1260 893 q 1290 843 1290 863 z "},"飦�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1290 719 l 1290 174 q 1239 51 1290 102 q 1116 0 1187 0 l 174 0 q 51 51 102 0 q 0 174 0 102 l 0 918 q 51 1040 0 989 q 174 1091 102 1091 l 422 1091 q 544 1040 493 1091 q 595 918 595 989 l 595 893 l 1116 893 q 1239 842 1187 893 q 1290 719 1290 791 z "},"飦�":{"ha":1488,"x_min":0,"x_max":1456,"o":"m 1456 453 q 1432 401 1456 429 l 1172 95 q 1078 28 1139 55 q 967 0 1018 0 l 124 0 q 77 10 98 0 q 57 43 57 20 q 81 95 57 67 l 341 401 q 434 469 374 441 q 546 496 494 496 l 1389 496 q 1436 486 1415 496 q 1456 453 1456 476 m 1190 719 l 1190 595 l 546 595 q 393 558 473 595 q 266 466 313 522 l 5 159 l 1 154 q 0 164 1 157 q 0 174 0 171 l 0 918 q 51 1040 0 989 q 174 1091 102 1091 l 422 1091 q 544 1040 493 1091 q 595 918 595 989 l 595 893 l 1017 893 q 1139 842 1088 893 q 1190 719 1190 791 z "},"飦�":{"ha":595,"x_min":50,"x_max":546,"o":"m 531 977 q 546 942 546 963 q 531 908 546 922 q 496 893 516 893 l 397 893 l 397 99 l 496 99 q 531 84 516 99 q 546 50 546 70 q 531 15 546 29 l 332 -184 q 298 -198 318 -198 q 263 -184 277 -198 l 64 15 q 50 50 50 29 q 64 84 50 70 q 99 99 79 99 l 198 99 l 198 893 l 99 893 q 64 908 79 893 q 50 942 50 922 q 64 977 50 963 l 263 1176 q 298 1190 277 1190 q 332 1176 318 1190 l 531 977 z "},"飦�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1374 531 q 1389 496 1389 516 q 1374 461 1389 476 l 1176 263 q 1141 248 1161 248 q 1106 263 1121 248 q 1091 298 1091 277 l 1091 397 l 298 397 l 298 298 q 283 263 298 277 q 248 248 268 248 q 213 263 228 248 l 15 461 q 0 496 0 476 q 15 531 0 516 l 213 729 q 248 744 228 744 q 283 729 268 744 q 298 694 298 715 l 298 595 l 1091 595 l 1091 694 q 1106 729 1091 715 q 1141 744 1121 744 q 1176 729 1161 744 l 1374 531 z "},"飩�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 496 496 l 496 99 l 298 99 l 298 496 l 496 496 m 794 893 l 794 99 l 595 99 l 595 893 l 794 893 m 1587 0 l 1587 -99 l 0 -99 l 0 1091 l 99 1091 l 99 0 l 1587 0 m 1091 694 l 1091 99 l 893 99 l 893 694 l 1091 694 m 1389 992 l 1389 99 l 1190 99 l 1190 992 l 1389 992 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 718 q 898 691 949 698 q 970 782 951 722 q 867 742 920 753 q 748 794 819 794 q 633 746 680 794 q 585 631 585 698 q 589 594 585 608 q 401 644 489 599 q 253 764 314 689 q 230 682 230 725 q 301 546 230 594 q 223 567 264 547 l 223 565 q 262 462 223 507 q 357 405 301 416 q 318 399 335 399 q 288 402 308 399 q 345 322 304 353 q 439 289 387 290 q 237 219 350 219 q 198 222 217 219 q 448 149 313 149 q 611 176 535 149 q 741 250 687 204 q 834 356 795 296 q 892 482 873 416 q 911 612 911 547 q 911 633 911 626 q 992 718 960 668 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 822 -99 l 822 362 l 976 362 l 999 542 l 822 542 l 822 656 q 840 722 822 700 q 911 743 858 743 l 1005 744 l 1005 904 q 867 911 956 911 q 699 849 762 911 q 636 674 636 787 l 636 542 l 481 542 l 481 362 l 636 362 l 636 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 712 528 q 716 531 712 528 q 719 546 719 535 q 712 563 719 556 q 694 570 705 570 q 607 534 643 570 q 570 446 570 498 q 577 429 570 436 q 595 422 584 422 q 613 429 606 422 q 620 446 620 436 q 642 499 620 477 q 694 521 663 521 q 712 528 705 521 m 835 585 q 864 556 835 585 q 893 445 893 527 q 835 305 893 363 q 694 246 777 246 q 554 305 612 246 q 496 445 496 363 q 554 585 496 527 q 694 643 612 643 q 835 585 777 643 m 99 0 l 1290 0 l 1290 99 l 99 99 l 99 0 m 905 234 q 948 278 905 234 q 992 445 992 322 q 905 655 992 568 q 694 742 818 742 q 484 655 571 742 q 397 445 397 568 q 484 234 397 322 q 694 147 571 147 q 905 234 818 147 m 198 942 l 496 942 l 496 1042 l 198 1042 l 198 942 m 99 794 l 1290 794 l 1290 885 l 1290 992 l 648 992 l 598 893 l 99 893 l 99 794 m 1389 992 l 1389 0 q 1360 -70 1389 -41 q 1290 -99 1331 -99 l 99 -99 q 29 -70 58 -99 q 0 0 0 -41 l 0 992 q 29 1062 0 1033 q 99 1091 58 1091 l 1290 1091 q 1360 1062 1331 1091 q 1389 992 1389 1033 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1304,"o":"m 601 688 q 623 710 601 688 q 645 794 645 732 q 601 899 645 856 q 496 942 558 942 q 391 899 434 942 q 347 794 347 856 q 362 729 347 761 q 298 744 330 744 q 192 701 236 744 q 149 595 149 657 q 192 490 149 533 q 298 446 236 446 q 403 490 360 446 q 446 595 446 533 q 432 660 446 628 q 496 645 463 645 q 601 688 558 645 m 1304 248 q 1266 197 1304 235 q 1215 159 1228 159 q 1193 171 1208 159 q 1165 197 1178 184 q 1135 228 1152 210 q 1116 248 1118 246 l 1042 174 l 1212 3 q 1234 -50 1234 -19 q 1204 -112 1234 -82 q 1141 -143 1173 -143 q 1088 -121 1110 -143 l 568 399 q 285 298 432 298 q 79 377 159 298 q 0 583 0 457 q 74 825 0 707 q 266 1018 147 944 q 508 1091 384 1091 q 714 1012 635 1091 q 794 806 794 932 q 692 523 794 660 l 967 248 l 1042 322 q 1022 341 1039 325 q 991 371 1004 358 q 965 400 977 384 q 953 422 953 415 q 991 473 953 435 q 1042 511 1028 511 q 1059 503 1052 511 q 1095 469 1064 498 q 1159 407 1126 439 q 1226 340 1191 375 q 1282 280 1260 305 q 1304 248 1304 254 z "},"飩�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 636 356 q 665 385 636 356 q 694 496 694 414 q 636 636 694 578 q 496 694 578 694 q 356 636 414 694 q 298 496 298 578 q 356 356 298 414 q 496 298 414 298 q 636 356 578 298 m 1290 99 q 1260 169 1290 140 q 1190 198 1231 198 q 1121 169 1150 198 q 1091 99 1091 140 q 1120 29 1091 58 q 1190 0 1149 0 q 1261 29 1232 0 q 1290 99 1290 58 m 1290 893 q 1260 963 1290 933 q 1190 992 1231 992 q 1121 963 1150 992 q 1091 893 1091 933 q 1120 823 1091 852 q 1190 794 1149 794 q 1261 823 1232 794 q 1290 893 1290 852 m 992 567 l 992 423 q 987 408 992 415 q 974 400 981 401 l 854 381 q 829 322 846 354 q 899 233 856 285 q 904 218 904 225 q 899 203 904 208 q 835 134 881 180 q 774 88 789 88 q 758 93 766 88 l 669 163 q 609 139 640 148 q 591 19 601 55 q 568 0 586 0 l 424 0 q 408 6 415 0 q 401 19 401 12 l 383 138 q 325 162 357 146 l 233 93 q 218 88 228 88 q 202 94 209 88 q 90 218 90 197 q 95 233 90 225 q 127 274 103 243 q 164 321 151 304 q 136 384 146 355 l 19 403 q 5 410 11 404 q 0 426 0 417 l 0 569 q 5 584 0 577 q 18 592 11 591 l 138 611 q 163 670 146 638 q 93 759 136 707 q 88 774 88 767 q 93 790 88 784 q 157 859 110 813 q 218 904 203 904 q 234 899 226 904 l 323 829 q 383 854 350 843 q 401 973 391 938 q 424 992 406 992 l 568 992 q 584 986 577 992 q 591 973 591 980 l 609 854 q 667 830 636 846 l 759 899 q 774 904 765 904 q 791 898 783 904 q 902 774 902 795 q 897 760 902 768 q 864 718 887 747 q 829 671 841 688 q 856 608 847 634 l 973 590 q 987 582 981 588 q 992 567 992 575 m 1488 153 l 1488 45 q 1373 21 1488 33 q 1349 -19 1363 0 q 1389 -126 1389 -107 q 1386 -132 1389 -129 q 1290 -187 1291 -187 q 1254 -150 1283 -187 q 1214 -98 1225 -114 q 1190 -99 1198 -99 q 1167 -98 1183 -99 q 1127 -150 1156 -114 q 1091 -187 1097 -187 q 995 -132 1090 -187 q 992 -126 992 -129 q 1032 -19 992 -107 q 1008 21 1018 0 q 893 45 893 33 l 893 153 q 1008 177 893 166 q 1032 218 1018 200 q 992 325 992 305 q 995 330 992 328 q 1022 346 998 332 q 1068 372 1046 360 q 1091 384 1090 384 q 1127 348 1097 384 q 1167 296 1156 312 q 1190 298 1183 298 q 1214 296 1198 298 q 1285 383 1253 351 l 1290 384 q 1386 330 1293 384 q 1389 325 1389 328 q 1349 218 1389 305 q 1373 177 1363 200 q 1488 153 1488 166 m 1488 947 l 1488 839 q 1373 815 1488 826 q 1349 774 1363 794 q 1389 667 1389 687 q 1386 662 1389 664 q 1290 607 1291 607 q 1254 643 1283 607 q 1214 696 1225 680 q 1190 694 1198 694 q 1167 696 1183 694 q 1127 643 1156 680 q 1091 607 1097 607 q 995 662 1090 607 q 992 667 992 664 q 1032 774 992 687 q 1008 815 1018 794 q 893 839 893 826 l 893 947 q 1008 971 893 960 q 1032 1011 1018 994 q 992 1118 992 1099 q 995 1124 992 1121 q 1022 1139 998 1125 q 1068 1166 1046 1153 q 1091 1178 1090 1178 q 1127 1142 1097 1178 q 1167 1090 1156 1106 q 1190 1091 1183 1091 q 1214 1090 1198 1091 q 1285 1177 1253 1145 l 1290 1178 q 1386 1124 1293 1178 q 1389 1118 1389 1121 q 1349 1011 1389 1099 q 1373 971 1363 994 q 1488 947 1488 960 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1018 794 q 1055 749 1018 794 q 1091 595 1091 703 q 1018 396 1091 488 q 820 252 946 305 q 546 198 694 198 q 409 211 479 198 q 194 112 313 143 q 127 99 166 105 l 125 99 q 109 105 116 99 q 100 122 102 112 q 99 127 99 124 q 100 132 99 129 q 101 136 100 134 q 103 140 102 139 q 106 145 104 142 q 109 148 108 147 q 112 152 110 150 q 115 156 115 155 q 133 175 119 160 q 153 198 147 190 q 171 221 160 206 q 190 250 182 235 q 206 284 198 266 q 55 422 110 340 q 0 595 0 503 q 73 794 0 703 q 272 939 146 886 q 546 992 398 992 q 820 939 694 992 q 1018 794 946 886 m 1389 397 q 1334 223 1389 304 q 1183 86 1279 142 q 1199 52 1190 67 q 1218 22 1207 36 q 1235 0 1229 8 q 1256 -23 1242 -9 q 1273 -43 1270 -38 q 1277 -46 1274 -43 q 1280 -50 1279 -49 q 1283 -54 1281 -51 q 1286 -58 1285 -57 q 1288 -62 1287 -60 q 1289 -67 1289 -64 q 1290 -72 1290 -69 q 1289 -77 1290 -74 q 1279 -94 1287 -88 q 1262 -99 1271 -100 q 1195 -87 1223 -94 q 980 12 1076 -56 q 843 0 910 0 q 477 102 633 0 q 546 99 522 99 q 785 134 670 99 q 990 234 900 169 q 1139 398 1087 305 q 1190 595 1190 491 q 1173 713 1190 655 q 1331 575 1273 658 q 1389 397 1389 492 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 184 114 q 191 121 184 114 q 198 149 198 129 q 184 184 198 169 q 149 198 169 198 q 114 184 129 198 q 99 149 99 169 q 114 114 99 129 q 149 99 129 99 q 184 114 169 99 m 1091 595 q 1061 665 1091 635 q 992 694 1031 694 l 719 694 q 756 818 719 739 q 794 942 794 897 q 769 1055 794 1018 q 670 1091 744 1091 q 640 1025 649 1071 q 617 928 631 980 q 570 843 602 877 q 511 773 553 825 q 493 749 508 769 q 469 718 478 730 q 442 685 459 705 q 411 651 425 664 q 381 623 397 637 q 350 602 365 609 q 322 595 335 595 l 298 595 l 298 99 l 322 99 q 347 97 332 99 q 372 92 361 95 q 402 83 384 89 q 429 74 420 78 q 457 65 438 71 q 479 57 475 58 q 744 0 643 0 l 838 0 q 987 129 987 0 q 983 173 987 150 q 1020 214 1006 185 q 1033 270 1033 242 q 1019 324 1033 299 q 1060 416 1060 363 q 1053 459 1060 436 q 1033 496 1045 483 q 1075 532 1058 497 q 1091 595 1091 568 m 1190 596 q 1152 470 1190 527 q 1159 416 1159 444 q 1130 305 1159 357 q 1132 271 1132 288 q 1086 133 1132 193 q 1020 -37 1087 26 q 844 -99 953 -99 l 816 -99 l 744 -99 q 597 -82 670 -99 q 429 -31 525 -64 q 322 0 339 0 l 99 0 q 29 29 58 0 q 0 99 0 58 l 0 595 q 29 665 0 636 q 99 694 58 694 l 312 694 q 418 815 339 713 q 501 914 463 873 q 528 980 519 933 q 552 1078 537 1027 q 600 1162 567 1129 q 670 1190 630 1190 q 787 1165 735 1190 q 866 1087 839 1140 q 893 942 893 1033 q 856 794 893 870 l 992 794 q 1132 735 1073 794 q 1190 596 1190 676 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 184 808 q 191 816 184 808 q 198 843 198 823 q 184 878 198 863 q 149 893 169 893 q 114 878 129 893 q 99 843 99 863 q 114 808 99 823 q 149 794 129 794 q 184 808 169 794 m 1091 397 q 1075 460 1091 424 q 1033 496 1058 495 q 1053 533 1045 509 q 1060 576 1060 556 q 1019 668 1060 629 q 1033 722 1033 692 q 1020 779 1033 750 q 983 819 1006 807 q 987 863 987 842 q 949 960 987 929 q 843 992 911 992 l 744 992 q 479 935 643 992 q 457 927 475 934 q 429 918 438 921 q 402 909 420 915 q 372 900 384 903 q 347 895 361 898 q 322 893 332 893 l 298 893 l 298 397 l 322 397 q 350 390 335 397 q 381 369 365 383 q 411 341 397 355 q 442 307 425 328 q 469 274 459 287 q 493 243 478 262 q 511 219 508 223 q 570 149 553 167 q 617 64 602 115 q 640 -33 631 12 q 670 -99 649 -79 q 769 -63 744 -99 q 794 50 794 -26 q 756 174 794 95 q 719 298 719 253 l 992 298 q 1061 327 1031 298 q 1091 397 1091 357 m 1190 396 q 1132 257 1190 316 q 992 198 1073 198 l 856 198 q 893 50 893 122 q 866 -95 893 -42 q 787 -173 839 -148 q 670 -198 735 -198 q 600 -170 630 -198 q 558 -106 574 -144 q 538 -36 543 -68 q 525 29 534 -4 q 501 79 515 63 q 418 177 463 118 q 312 298 339 279 l 99 298 q 29 327 58 298 q 0 397 0 356 l 0 893 q 29 963 0 934 q 99 992 58 992 l 322 992 q 429 1023 339 992 q 602 1074 529 1057 q 757 1091 676 1091 l 844 1091 q 1020 1030 953 1091 q 1086 863 1087 969 l 1086 859 q 1132 721 1132 799 q 1130 687 1132 704 q 1159 576 1159 636 q 1152 522 1159 548 q 1190 396 1190 466 z "},"飩�":{"ha":694,"x_min":0,"x_max":645,"o":"m 645 1166 l 645 128 l 297 -55 q 266 -64 280 -64 q 241 -53 250 -64 q 233 -26 233 -42 q 235 -10 233 -21 l 301 377 l 19 652 q 0 689 0 673 q 43 725 0 718 l 432 781 l 607 1134 q 645 1166 622 1166 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1290 729 q 1273 839 1290 791 q 1230 916 1256 887 q 1167 962 1204 944 q 1094 986 1130 980 q 1018 992 1059 992 q 932 972 978 992 q 846 923 885 953 q 779 867 807 893 q 732 819 751 841 q 694 802 718 802 q 656 819 670 802 q 610 867 638 841 q 543 923 582 893 q 457 972 504 953 q 370 992 411 992 q 295 986 330 992 q 222 962 259 980 q 158 916 184 944 q 116 839 133 887 q 99 729 99 791 q 244 453 99 598 l 694 19 l 1144 453 q 1290 729 1290 598 m 1389 729 q 1211 380 1389 557 l 729 -85 q 694 -99 715 -99 q 660 -85 674 -99 l 177 381 q 155 401 169 388 q 112 452 142 415 q 60 528 83 489 q 18 622 36 567 q 0 729 0 677 q 98 995 0 899 q 370 1091 197 1091 q 469 1075 419 1091 q 562 1030 519 1058 q 636 977 605 1001 q 694 924 667 952 q 753 977 722 952 q 827 1030 784 1001 q 920 1075 870 1058 q 1018 1091 970 1091 q 1290 995 1192 1091 q 1389 729 1389 899 z "},"飩�":{"ha":1290,"x_min":0,"x_max":1215,"o":"m 496 74 q 497 59 496 71 q 497 38 498 47 q 495 20 497 30 q 487 5 493 10 q 471 0 481 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 769 q 65 927 0 861 q 223 992 131 992 l 471 992 q 489 985 481 992 q 496 967 496 977 q 497 952 496 964 q 497 931 498 939 q 495 913 497 923 q 487 898 493 903 q 471 893 481 893 l 223 893 q 136 856 172 893 q 99 769 99 820 l 99 223 q 136 136 99 172 q 223 99 172 99 l 446 99 q 455 99 447 99 q 465 99 463 99 q 474 98 467 99 q 483 96 481 98 q 489 92 485 95 q 494 85 493 89 q 496 74 496 81 m 1201 531 q 1215 496 1215 516 q 1201 461 1215 476 l 779 40 q 744 25 764 25 q 709 40 724 25 q 694 74 694 54 l 694 298 l 347 298 q 312 312 327 298 q 298 347 298 327 l 298 645 q 312 680 298 665 q 347 694 327 694 l 694 694 l 694 918 q 709 953 694 938 q 744 967 724 967 q 779 953 764 967 l 1201 531 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 184 95 l 363 95 l 363 632 l 184 632 l 184 95 m 374 798 q 346 865 374 839 q 274 891 319 891 q 201 865 229 891 q 173 798 173 839 q 200 732 173 759 q 272 705 228 705 l 273 705 q 346 732 319 705 q 374 798 374 759 m 828 95 l 1007 95 l 1007 403 q 950 584 1007 522 q 801 645 894 645 q 639 554 695 645 l 640 554 l 640 632 l 461 632 q 461 95 463 581 l 640 95 l 640 395 q 646 439 640 425 q 680 485 657 466 q 738 504 704 504 q 828 382 828 504 l 828 95 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飩�":{"ha":893,"x_min":0,"x_max":893,"o":"m 372 521 l 372 868 q 365 886 372 879 q 347 893 358 893 q 329 886 336 893 q 322 868 322 879 l 322 521 q 329 503 322 510 q 347 496 336 496 q 365 503 358 496 q 372 521 372 510 m 893 248 q 878 213 893 228 q 843 198 863 198 l 511 198 l 471 -176 q 463 -192 470 -185 q 447 -198 457 -198 l 446 -198 q 422 -177 426 -198 l 363 198 l 50 198 q 15 213 29 198 q 0 248 0 228 q 61 420 0 343 q 198 496 122 496 l 198 893 q 129 922 158 893 q 99 992 99 952 q 129 1062 99 1032 q 198 1091 158 1091 l 694 1091 q 764 1062 735 1091 q 794 992 794 1032 q 764 922 794 952 q 694 893 735 893 l 694 496 q 832 420 771 496 q 893 248 893 343 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1091 471 l 1091 223 q 1026 65 1091 131 q 868 0 960 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 769 1091 q 787 1084 780 1091 q 794 1066 794 1077 l 794 1017 q 787 999 794 1006 q 769 992 780 992 l 223 992 q 136 956 172 992 q 99 868 99 919 l 99 223 q 136 136 99 172 q 223 99 172 99 l 868 99 q 956 136 919 99 q 992 223 992 172 l 992 471 q 999 489 992 482 q 1017 496 1006 496 l 1066 496 q 1084 489 1077 496 q 1091 471 1091 482 m 1389 1141 l 1389 744 q 1374 709 1389 724 q 1339 694 1359 694 q 1304 709 1319 694 l 1168 846 l 663 340 q 645 332 655 332 q 627 340 635 332 l 539 429 q 531 446 531 436 q 539 464 531 457 l 1044 970 l 908 1106 q 893 1141 893 1121 q 908 1176 893 1161 q 942 1190 922 1190 l 1339 1190 q 1374 1176 1359 1190 q 1389 1141 1389 1161 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 903 531 q 918 496 918 516 q 903 461 918 476 l 481 40 q 446 25 467 25 q 412 40 426 25 q 397 74 397 54 l 397 298 l 50 298 q 15 312 29 298 q 0 347 0 327 l 0 645 q 15 680 0 665 q 50 694 29 694 l 397 694 l 397 918 q 412 953 397 938 q 446 967 426 967 q 481 953 467 967 l 903 531 m 1190 769 l 1190 223 q 1125 65 1190 131 q 967 0 1059 0 l 719 0 q 702 7 709 0 q 694 25 694 15 q 694 40 694 28 q 693 61 693 53 q 696 79 694 69 q 703 94 698 89 q 719 99 709 99 l 967 99 q 1055 136 1018 99 q 1091 223 1091 172 l 1091 769 q 1055 856 1091 820 q 967 893 1018 893 l 744 893 q 736 893 743 893 q 725 893 728 893 q 717 894 723 893 q 708 896 710 894 q 701 900 705 898 q 696 907 698 903 q 694 918 694 911 q 694 933 694 921 q 693 954 693 946 q 696 972 694 962 q 703 987 698 982 q 719 992 709 992 l 967 992 q 1125 927 1059 992 q 1190 769 1190 861 z "},"飩�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 355 506 q 298 794 298 632 l 99 794 l 99 719 q 172 594 99 659 q 355 506 246 529 m 1190 719 l 1190 794 l 992 794 q 935 506 992 632 q 1117 594 1044 529 q 1190 719 1190 659 m 1290 818 l 1290 719 q 1258 608 1290 664 q 1171 508 1225 553 q 1037 432 1116 463 q 870 398 957 401 q 796 324 837 356 q 755 268 767 298 q 744 198 744 238 q 768 128 744 157 q 843 99 791 99 q 947 64 901 99 q 992 -25 992 29 l 992 -74 q 985 -92 992 -85 q 967 -99 978 -99 l 322 -99 q 305 -92 312 -99 q 298 -74 298 -85 l 298 -25 q 343 64 298 29 q 446 99 388 99 q 522 128 498 99 q 546 198 546 157 q 534 268 546 238 q 494 324 523 298 q 420 398 453 356 q 253 432 332 401 q 119 508 174 463 q 32 608 64 553 q 0 719 0 664 l 0 818 q 22 871 0 849 q 74 893 43 893 l 298 893 l 298 967 q 334 1055 298 1018 q 422 1091 370 1091 l 868 1091 q 956 1055 919 1091 q 992 967 992 1018 l 992 893 l 1215 893 q 1268 871 1246 893 q 1290 818 1290 849 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 402 260 q 400 270 405 265 q 389 272 393 276 q 391 262 386 267 q 402 260 398 257 m 381 292 q 371 295 377 298 q 371 286 367 292 q 381 282 377 280 q 381 292 385 285 m 349 323 q 345 329 350 326 q 339 328 339 331 q 342 322 336 324 q 349 323 348 320 m 365 305 q 366 309 367 306 q 363 313 366 312 q 356 315 359 319 q 357 307 353 312 q 365 305 361 302 m 432 247 q 425 256 433 253 q 415 253 418 258 q 422 244 413 247 q 432 247 429 242 m 456 239 q 460 239 456 239 q 464 245 464 239 q 455 251 464 251 q 447 245 447 251 q 456 239 447 239 m 494 250 q 484 254 493 256 q 477 247 476 253 q 487 243 479 241 q 494 250 494 244 m 992 496 q 876 777 992 660 q 595 893 760 893 q 315 777 431 893 q 198 496 198 660 q 274 263 198 367 q 470 119 350 160 q 490 123 484 117 q 497 139 497 129 q 496 212 497 179 q 484 210 491 212 q 457 209 477 209 q 419 212 436 208 q 386 227 402 215 q 363 260 369 239 q 319 317 345 305 q 315 320 317 318 q 309 326 313 322 q 303 333 305 330 q 307 339 302 336 q 322 342 311 342 q 333 340 326 342 q 357 328 340 339 q 382 301 373 318 q 411 268 395 279 q 445 257 428 257 q 474 260 462 257 q 498 267 487 263 q 523 321 503 304 q 457 335 485 326 q 400 365 428 345 q 357 424 372 386 q 342 517 342 463 q 383 623 342 578 q 387 729 364 671 q 429 723 401 733 q 476 700 457 712 l 496 687 q 595 701 541 701 q 694 687 649 701 q 717 701 703 693 q 760 722 730 710 q 804 729 789 733 q 808 623 826 671 q 849 517 849 578 q 838 439 849 473 q 810 385 827 405 q 769 350 794 364 q 720 330 744 336 q 667 321 697 324 q 694 247 694 297 q 694 178 694 216 q 694 139 694 140 q 700 123 694 129 q 721 119 707 117 q 916 263 840 160 q 992 496 992 367 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飩�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 977 15 q 985 22 977 15 q 992 50 992 29 q 977 84 992 70 q 942 99 963 99 q 908 84 922 99 q 893 50 893 70 q 908 15 893 29 q 942 0 922 0 q 977 15 963 0 m 1176 15 q 1183 22 1176 15 q 1190 50 1190 29 q 1176 84 1190 70 q 1141 99 1161 99 q 1106 84 1121 99 q 1091 50 1091 70 q 1106 15 1091 29 q 1141 0 1121 0 q 1176 15 1161 0 m 1290 223 l 1290 -25 q 1268 -78 1290 -56 q 1215 -99 1246 -99 l 74 -99 q 22 -78 43 -99 q 0 -25 0 -56 l 0 223 q 22 276 0 254 q 74 298 43 298 l 405 298 q 460 226 422 254 q 546 198 498 198 l 744 198 q 830 226 791 198 q 884 298 868 254 l 1215 298 q 1268 276 1246 298 q 1290 223 1290 254 m 1038 725 q 992 694 1025 694 l 794 694 l 794 347 q 779 312 794 327 q 744 298 764 298 l 546 298 q 511 312 525 298 q 496 347 496 327 l 496 694 l 298 694 q 252 725 265 694 q 263 779 239 756 l 610 1126 q 645 1141 624 1141 q 680 1126 666 1141 l 1027 779 q 1038 725 1051 756 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1090 550 q 1085 638 1090 584 q 1071 713 1080 692 q 1058 747 1062 736 q 1051 775 1054 758 q 1048 813 1048 793 q 1052 866 1048 831 q 1056 918 1056 901 q 1048 961 1056 947 q 1038 962 1045 962 q 993 958 1023 962 q 947 955 963 955 q 811 973 901 955 q 675 992 721 992 q 602 983 642 992 q 536 965 562 974 q 467 939 510 956 q 310 859 360 897 q 186 712 236 802 q 118 529 137 622 q 99 336 99 436 q 109 243 99 305 q 119 150 119 181 q 110 98 119 132 q 102 47 102 64 q 111 19 102 30 q 137 8 120 8 q 193 16 156 8 q 250 25 231 25 q 382 13 295 25 q 513 1 469 1 q 733 29 653 1 q 916 147 833 64 q 1044 337 998 230 q 1090 550 1090 444 m 1190 552 q 1135 298 1190 424 q 984 75 1081 172 q 766 -65 886 -22 q 513 -99 670 -99 q 381 -88 469 -99 q 250 -77 294 -77 q 194 -88 232 -77 q 137 -99 157 -99 q 41 -56 81 -99 q 2 43 2 -13 q 11 96 2 62 q 19 148 19 130 q 10 241 19 179 q 0 336 0 304 q 14 504 0 422 q 56 667 28 587 q 134 817 84 746 q 250 938 184 887 q 430 1031 311 984 q 675 1091 581 1091 q 811 1073 722 1091 q 946 1054 901 1054 q 990 1058 960 1054 q 1035 1062 1019 1062 q 1126 1023 1097 1062 q 1155 918 1155 984 q 1151 866 1155 901 q 1147 813 1147 831 q 1149 794 1147 803 q 1151 781 1150 784 q 1157 765 1152 777 q 1163 749 1162 753 q 1183 658 1176 718 q 1190 552 1190 597 z "},"飩�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 1091 229 q 1084 175 1091 208 q 1067 122 1076 141 q 973 40 1051 83 q 829 0 900 0 q 787 3 808 0 q 743 12 767 5 q 706 24 718 19 q 663 40 694 28 q 625 53 632 51 q 490 118 550 81 q 285 285 391 179 q 118 490 179 391 q 53 625 81 550 q 40 663 51 632 q 24 706 28 694 q 12 743 19 718 q 3 787 5 767 q 0 829 0 808 q 40 973 0 900 q 122 1067 83 1051 q 175 1084 141 1076 q 229 1091 208 1091 q 246 1089 240 1091 q 287 1030 260 1084 q 310 988 295 1015 q 337 939 325 961 q 361 898 350 917 q 375 878 363 894 q 391 851 386 862 q 397 829 397 839 q 375 790 397 813 q 327 747 353 767 q 279 706 301 728 q 257 670 257 684 q 260 653 257 663 q 267 637 264 643 q 278 618 270 632 q 287 604 286 605 q 422 422 346 498 q 604 287 498 346 q 618 278 605 286 q 637 267 632 270 q 653 260 643 264 q 670 257 663 257 q 706 279 684 257 q 747 327 728 301 q 790 375 767 353 q 829 397 813 397 q 851 391 839 397 q 878 375 862 386 q 898 361 894 363 q 939 337 917 350 q 988 310 961 325 q 1030 287 1015 295 q 1089 246 1084 260 q 1091 229 1091 240 z "},"飩�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 868 992 l 223 992 q 136 956 172 992 q 99 868 99 919 l 99 223 q 136 136 99 172 q 223 99 172 99 l 868 99 q 956 136 919 99 q 992 223 992 172 l 992 868 q 956 956 992 919 q 868 992 919 992 m 1091 868 l 1091 223 q 1026 65 1091 131 q 868 0 960 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 868 1091 q 1026 1026 960 1091 q 1091 868 1091 960 z "},"飩�":{"ha":992,"x_min":0,"x_max":992,"o":"m 893 992 l 99 992 l 99 29 l 427 344 l 496 410 l 565 344 l 893 29 l 893 992 m 902 1091 q 936 1084 920 1091 q 977 1053 962 1074 q 992 1004 992 1031 l 992 5 q 977 -43 992 -21 q 936 -74 962 -64 q 902 -81 922 -81 q 838 -56 865 -81 l 496 273 l 154 -56 q 90 -81 126 -81 q 56 -74 72 -81 q 15 -43 30 -64 q 0 5 0 -21 l 0 1004 q 15 1053 0 1031 q 56 1084 30 1074 q 90 1091 72 1091 l 902 1091 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 266 q 991 278 992 274 q 977 291 989 282 q 945 310 964 300 q 908 331 926 321 q 873 350 891 341 q 851 362 856 360 q 836 372 847 364 q 817 384 825 380 q 801 388 808 388 q 772 372 789 388 q 742 337 756 356 q 712 302 728 318 q 686 286 696 286 q 673 289 680 286 q 661 294 666 291 q 648 301 656 296 q 637 308 639 306 q 505 406 560 350 q 407 538 450 461 q 400 549 405 540 q 393 562 395 557 q 388 574 391 567 q 385 587 385 581 q 401 613 385 597 q 436 643 417 629 q 471 673 455 656 q 487 701 487 690 q 483 718 487 709 q 471 737 479 726 q 461 752 463 748 q 450 774 459 756 q 430 809 440 791 q 410 846 420 827 q 390 877 399 865 q 377 891 381 890 q 365 893 374 893 q 287 876 328 893 q 225 803 251 860 q 198 701 198 746 q 200 675 198 689 q 204 651 202 661 q 211 626 206 642 q 219 603 216 610 q 229 577 222 596 q 237 554 236 559 q 405 306 284 427 q 653 138 526 184 q 677 129 658 136 q 702 120 695 122 q 725 112 709 117 q 751 105 741 107 q 774 101 760 103 q 801 99 788 99 q 902 126 845 99 q 975 188 959 152 q 992 266 992 229 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飩�":{"ha":1290,"x_min":34,"x_max":1256,"o":"m 1256 874 q 1130 745 1204 798 q 1131 712 1131 734 q 1101 511 1131 612 q 1012 319 1072 411 q 869 155 952 226 q 669 42 786 84 q 419 0 552 0 q 34 112 208 0 q 95 109 61 109 q 405 216 269 109 q 260 266 324 218 q 171 390 195 315 q 219 386 197 386 q 284 395 252 386 q 141 481 198 412 q 84 640 84 550 l 84 643 q 197 612 136 614 q 115 701 146 646 q 85 820 85 756 q 119 946 85 888 q 348 761 213 831 q 636 684 482 692 q 629 742 629 714 q 703 919 629 846 q 880 992 776 992 q 1063 913 988 992 q 1221 973 1147 929 q 1111 836 1193 884 q 1256 874 1184 843 z "},"飩�":{"ha":794,"x_min":74,"x_max":743,"o":"m 743 1181 l 743 977 l 622 977 q 532 949 555 977 q 508 865 508 921 l 508 718 l 736 718 l 705 489 l 508 489 l 508 -99 l 271 -99 l 271 489 l 74 489 l 74 718 l 271 718 l 271 887 q 352 1111 271 1032 q 567 1190 432 1190 q 743 1181 680 1190 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 296 1011 q 365 1051 296 1011 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 q 1190 496 1190 658 q 1077 146 1190 301 q 784 -69 963 -9 q 753 -64 763 -73 q 742 -40 742 -54 q 743 19 742 -38 q 743 123 743 76 q 703 233 743 198 q 782 247 747 238 q 855 277 818 257 q 918 329 893 298 q 959 410 943 360 q 975 527 975 461 q 914 687 975 619 q 908 845 942 757 q 845 836 886 852 q 773 802 804 821 l 744 784 q 595 804 672 804 q 446 784 519 804 q 413 805 434 792 q 349 834 393 817 q 283 845 305 852 q 277 687 248 757 q 215 527 215 619 q 231 411 215 461 q 272 329 247 360 q 334 277 297 298 q 407 247 372 257 q 487 233 443 238 q 449 153 457 205 q 414 142 432 146 q 370 138 395 138 q 319 155 344 138 q 276 203 294 171 q 238 243 261 228 q 200 262 215 259 l 184 264 q 162 261 168 264 q 158 252 156 257 q 165 241 160 246 q 175 232 170 236 l 181 228 q 214 198 198 220 q 239 159 231 177 l 246 141 q 281 93 257 112 q 332 70 305 75 q 386 65 360 65 q 429 67 412 64 l 447 71 q 448 2 447 41 q 448 -40 448 -37 q 438 -64 448 -54 q 407 -69 428 -73 q 114 146 227 -9 q 0 496 0 301 q 80 795 0 658 q 296 1011 160 932 m 226 236 q 220 246 228 242 q 210 244 212 248 q 215 235 208 239 q 226 236 222 230 m 250 210 q 248 222 255 214 q 236 225 240 229 q 237 212 230 221 q 250 210 245 205 m 273 175 q 273 190 280 181 q 260 195 267 200 q 260 181 253 191 q 273 175 267 171 m 305 143 q 302 157 312 149 q 287 160 293 167 q 290 145 280 153 q 305 143 299 136 m 350 123 q 339 136 352 132 q 325 130 328 139 q 335 119 322 122 q 350 123 346 114 m 398 119 q 385 128 398 129 q 373 119 373 128 q 386 111 373 109 q 398 119 398 111 m 443 127 q 429 134 442 136 q 419 122 417 132 q 432 116 420 113 q 443 127 445 119 z "},"飩�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1290 744 l 1290 546 q 1275 511 1290 525 q 1240 496 1260 496 l 1190 496 q 1156 511 1170 496 q 1141 546 1141 525 l 1141 744 q 1083 884 1141 826 q 942 942 1025 942 q 802 884 860 942 q 744 744 744 826 l 744 595 l 818 595 q 871 574 849 595 q 893 521 893 552 l 893 74 q 871 22 893 43 q 818 0 849 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 521 q 22 574 0 552 q 74 595 43 595 l 595 595 l 595 744 q 697 989 595 887 q 942 1091 799 1091 q 1188 989 1086 1091 q 1290 744 1290 887 z "},"飩�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 1364 1091 q 1452 1055 1415 1091 q 1488 967 1488 1018 l 1488 25 q 1452 -63 1488 -26 q 1364 -99 1415 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1364 1091 m 124 992 q 107 985 114 992 q 99 967 99 977 l 99 794 l 1389 794 l 1389 967 q 1382 985 1389 977 q 1364 992 1374 992 l 124 992 m 1364 0 q 1382 7 1374 0 q 1389 25 1389 15 l 1389 496 l 99 496 l 99 25 q 107 7 99 15 q 124 0 114 0 l 1364 0 m 198 99 l 198 198 l 397 198 l 397 99 l 198 99 m 496 99 l 496 198 l 794 198 l 794 99 l 496 99 z "},"飩�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 254 254 q 276 233 254 254 q 298 149 298 211 q 254 43 298 87 q 149 0 211 0 q 43 43 87 0 q 0 149 0 87 q 43 254 0 211 q 149 298 87 298 q 254 254 211 298 m 694 53 q 681 16 696 32 q 645 0 667 0 l 540 0 q 507 13 521 0 q 491 45 493 26 q 348 348 474 222 q 45 491 222 474 q 13 507 26 493 q 0 540 0 521 l 0 645 q 16 681 0 667 q 50 694 29 694 l 53 694 q 291 632 177 684 q 491 491 404 580 q 632 291 580 404 q 694 53 684 177 m 1091 52 q 1077 16 1093 31 q 1042 0 1063 0 l 931 0 q 896 14 911 0 q 881 47 882 27 q 803 363 872 213 q 624 624 734 513 q 363 803 513 734 q 47 882 213 872 q 14 897 27 883 q 0 931 0 911 l 0 1042 q 16 1077 0 1063 q 50 1091 29 1091 l 52 1091 q 441 998 255 1081 q 770 770 626 915 q 998 441 915 626 q 1091 52 1081 255 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 788 292 q 797 283 788 292 q 806 248 806 274 q 788 204 806 222 q 744 186 770 186 q 700 204 718 186 q 682 248 682 222 q 700 292 682 274 q 744 310 718 310 q 788 292 770 310 m 986 292 q 995 283 986 292 q 1004 248 1004 274 q 986 204 1004 222 q 942 186 968 186 q 899 204 917 186 q 880 248 880 222 q 899 292 880 274 q 942 310 917 310 q 986 292 968 310 m 1091 124 l 1091 372 q 1084 389 1091 382 q 1066 397 1077 397 l 124 397 q 107 389 114 397 q 99 372 99 382 l 99 124 q 107 107 99 114 q 124 99 114 99 l 1066 99 q 1084 107 1077 99 q 1091 124 1091 114 m 138 496 l 1053 496 l 931 870 q 918 886 928 880 q 898 893 909 893 l 292 893 q 272 886 281 893 q 260 870 263 880 l 138 496 m 1190 372 l 1190 124 q 1154 36 1190 73 q 1066 0 1118 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 372 q 12 430 0 391 l 165 900 q 214 966 178 941 q 292 992 250 992 l 898 992 q 977 966 941 992 q 1025 900 1012 941 l 1178 430 q 1190 372 1190 391 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1290 694 q 1360 665 1331 694 q 1389 595 1389 636 q 1360 525 1389 554 q 1290 496 1331 496 l 1290 198 q 1260 129 1290 158 q 1190 99 1231 99 q 561 394 867 368 q 491 343 516 379 q 467 265 465 306 q 498 193 468 223 q 480 142 482 167 q 484 97 477 117 q 510 55 491 78 q 548 16 529 32 q 595 -23 566 0 q 509 -88 573 -68 q 378 -96 445 -107 q 276 -53 312 -86 q 253 14 270 -36 q 228 88 236 64 q 210 157 221 111 q 199 235 200 202 q 202 311 198 267 q 219 397 205 355 l 124 397 q 36 433 73 397 q 0 521 0 470 l 0 670 q 36 757 0 721 q 124 794 73 794 l 496 794 q 1190 1091 833 794 q 1260 1062 1231 1091 q 1290 992 1290 1032 l 1290 694 m 1190 226 l 1190 966 q 595 700 885 732 l 595 491 q 1190 226 887 458 z "},"飩�":{"ha":1389,"x_min":50,"x_max":1339,"o":"m 694 -136 q 707 -124 707 -136 q 694 -112 707 -112 q 616 -79 649 -112 q 583 0 583 -46 q 570 12 583 12 q 558 0 558 12 q 598 -96 558 -57 q 694 -136 638 -136 m 191 99 l 1198 99 q 992 744 992 332 q 973 825 992 784 q 920 905 955 867 q 826 968 885 943 q 694 992 767 992 q 563 968 622 992 q 469 905 504 943 q 415 825 434 867 q 397 744 397 784 q 191 99 397 332 m 1339 99 q 1310 29 1339 59 q 1240 0 1280 0 l 893 0 q 835 -140 893 -82 q 694 -198 777 -198 q 554 -140 612 -198 q 496 0 496 -82 l 149 0 q 79 29 109 0 q 50 99 50 59 q 120 167 88 132 q 186 260 152 203 q 244 383 220 317 q 283 543 267 449 q 298 744 298 636 q 388 963 298 862 q 626 1086 479 1064 q 620 1116 620 1101 q 642 1169 620 1147 q 694 1190 663 1190 q 747 1169 725 1190 q 769 1116 769 1147 q 763 1086 769 1101 q 1001 963 910 1064 q 1091 744 1091 862 q 1106 543 1091 636 q 1145 383 1121 449 q 1203 260 1169 317 q 1269 167 1237 203 q 1339 99 1301 132 z "},"飩�":{"ha":1190,"x_min":2,"x_max":1189,"o":"m 1066 496 l 1173 391 q 1189 337 1197 370 q 1149 298 1180 305 l 1003 260 l 1044 116 q 1029 62 1053 84 q 975 47 1007 38 l 831 88 l 794 -57 q 754 -98 786 -88 q 739 -99 745 -99 q 700 -82 715 -99 l 595 25 l 491 -82 q 436 -98 469 -105 q 397 -57 405 -89 l 360 88 l 215 47 q 161 62 184 38 q 146 116 137 84 l 188 260 l 42 298 q 2 337 11 305 q 17 391 -6 370 l 124 496 l 17 601 q 2 655 -6 622 q 42 694 11 687 l 188 732 l 146 876 q 161 930 137 908 q 215 945 184 954 l 360 904 l 397 1049 q 436 1089 405 1081 q 491 1074 468 1098 l 595 966 l 700 1074 q 754 1089 722 1097 q 794 1049 786 1081 l 831 904 l 975 945 q 1029 930 1007 954 q 1044 876 1053 908 l 1003 732 l 1149 694 q 1189 655 1180 687 q 1173 601 1197 622 l 1066 496 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 184 114 q 191 121 184 114 q 198 149 198 129 q 184 184 198 169 q 149 198 169 198 q 114 184 129 198 q 99 149 99 169 q 114 114 99 129 q 149 99 129 99 q 184 114 169 99 m 1290 595 q 1259 665 1290 635 q 1190 694 1229 694 l 744 694 q 756 732 744 710 q 781 775 767 754 q 807 827 795 795 q 818 893 818 860 q 784 968 818 945 q 694 992 749 992 q 625 884 676 992 q 596 834 606 850 q 509 722 565 784 q 431 639 454 659 q 322 595 377 595 l 298 595 l 298 99 l 322 99 q 452 74 378 99 q 602 25 525 50 q 741 0 678 0 q 887 129 887 0 q 884 173 887 150 q 920 214 907 185 q 934 270 934 242 q 920 324 934 299 q 961 416 961 363 q 953 459 961 436 q 934 496 946 483 l 1190 496 q 1260 525 1231 496 q 1290 595 1290 555 m 1389 596 q 1330 456 1389 515 q 1190 397 1272 397 l 1059 397 q 1031 305 1056 349 q 1033 271 1033 288 q 987 133 1033 193 q 921 -37 987 26 q 745 -99 854 -99 q 495 -46 642 -99 q 322 0 368 0 l 99 0 q 29 29 58 0 q 0 99 0 58 l 0 595 q 29 665 0 636 q 99 694 58 694 l 322 694 q 339 698 330 694 q 357 709 348 701 q 375 723 367 716 q 393 740 383 729 q 409 757 404 751 q 424 773 415 763 q 435 787 433 784 q 512 887 485 844 q 538 935 522 903 q 567 991 553 966 q 598 1039 580 1015 q 641 1078 616 1064 q 694 1091 665 1091 q 854 1039 791 1091 q 918 893 918 987 q 901 794 918 840 l 1190 794 q 1330 735 1271 794 q 1389 596 1389 676 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1066 99 l 1091 99 l 1091 595 l 1066 595 q 1014 605 1039 595 q 966 633 989 614 q 927 669 942 653 q 889 711 911 685 q 880 722 883 718 q 793 834 824 784 q 763 887 782 851 q 755 904 763 889 q 741 932 748 919 q 725 960 734 945 q 709 983 717 974 q 694 992 701 992 q 605 968 639 992 q 570 893 570 945 q 582 827 570 860 q 608 775 594 795 q 633 732 622 754 q 645 694 645 710 l 198 694 q 129 665 160 694 q 99 595 99 635 q 129 525 99 555 q 198 496 158 496 l 455 496 q 436 459 443 483 q 428 416 428 436 q 469 324 428 363 q 455 270 455 299 q 469 214 455 242 q 505 173 482 185 q 502 129 502 154 q 540 32 502 64 q 645 0 577 0 q 787 25 710 0 q 937 74 863 50 q 1066 99 1011 99 m 1275 114 q 1282 121 1275 114 q 1290 149 1290 129 q 1275 184 1290 169 q 1240 198 1260 198 q 1205 184 1220 198 q 1190 149 1190 169 q 1205 114 1190 129 q 1240 99 1220 99 q 1275 114 1260 99 m 1389 595 l 1389 99 q 1360 29 1389 58 q 1290 0 1331 0 l 1066 0 q 894 -46 1021 0 q 648 -99 746 -99 q 470 -39 538 -99 q 402 129 401 21 l 403 133 q 356 271 356 192 q 358 305 356 288 q 329 397 332 349 l 198 397 q 59 456 117 397 q 0 596 0 515 q 59 735 0 676 q 198 794 118 794 l 488 794 q 471 893 471 840 q 534 1039 471 987 q 694 1091 598 1091 q 748 1078 724 1091 q 791 1039 773 1064 q 822 991 809 1015 q 851 935 836 966 q 877 887 867 903 q 954 787 904 844 q 965 773 956 784 q 980 757 974 763 q 996 740 985 751 q 1014 723 1006 729 q 1032 709 1022 716 q 1050 698 1041 701 q 1066 694 1059 694 l 1290 694 q 1360 665 1331 694 q 1389 595 1389 636 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 977 -84 q 985 -77 977 -84 q 992 -50 992 -70 q 977 -15 992 -29 q 942 0 963 0 q 908 -15 922 0 q 893 -50 893 -29 q 908 -84 893 -70 q 942 -99 922 -99 q 977 -84 963 -99 m 1091 543 q 962 689 1091 689 q 918 685 942 689 q 878 722 906 708 q 821 736 849 736 q 767 722 792 736 q 675 763 729 763 q 632 755 656 763 q 595 736 608 747 l 595 992 q 566 1062 595 1032 q 496 1091 536 1091 q 427 1061 457 1091 q 397 992 397 1031 l 397 546 q 359 557 381 546 q 317 583 337 569 q 264 608 296 597 q 198 620 232 620 q 123 586 146 620 q 99 496 99 551 q 207 426 99 477 q 257 398 241 408 q 370 311 307 367 q 452 233 432 256 q 496 124 496 179 l 496 99 l 992 99 l 992 124 q 1017 253 992 180 q 1066 403 1042 327 q 1091 543 1091 480 m 1190 546 q 1137 297 1190 443 q 1091 124 1091 170 l 1091 -99 q 1062 -169 1091 -140 q 992 -198 1033 -198 l 496 -198 q 426 -169 455 -198 q 397 -99 397 -140 l 397 124 q 393 141 397 132 q 382 159 390 150 q 369 176 375 168 q 351 195 362 184 q 334 211 340 205 q 318 226 329 216 q 305 236 307 235 q 205 314 247 287 q 157 339 188 324 q 101 368 125 355 q 52 400 77 381 q 14 442 27 418 q 0 496 0 467 q 52 656 0 593 q 198 719 104 719 q 298 702 251 719 l 298 992 q 357 1132 298 1073 q 495 1190 415 1190 q 636 1132 577 1190 q 694 992 694 1073 l 694 861 q 787 832 742 858 q 820 835 803 835 q 958 788 898 835 q 1128 722 1066 789 q 1190 546 1190 656 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1091 446 q 1066 588 1091 512 q 1017 739 1042 665 q 992 868 992 812 l 992 893 l 496 893 l 496 868 q 487 816 496 841 q 458 767 477 791 q 422 729 439 744 q 381 691 406 713 q 370 681 374 684 q 257 594 307 625 q 205 565 240 584 q 187 557 202 564 q 159 543 172 550 q 132 527 146 536 q 108 510 117 519 q 99 496 99 502 q 123 407 99 441 q 198 372 146 372 q 264 384 232 372 q 317 409 296 395 q 359 435 337 423 q 397 446 381 446 l 397 0 q 427 -69 397 -39 q 496 -99 457 -99 q 566 -70 536 -99 q 595 0 595 -40 l 595 257 q 675 229 631 229 q 767 270 729 229 q 821 257 792 257 q 878 270 849 257 q 918 307 906 284 q 962 304 937 304 q 1059 341 1028 304 q 1091 446 1091 379 m 977 1007 q 985 1014 977 1007 q 992 1042 992 1022 q 977 1077 992 1062 q 942 1091 963 1091 q 908 1077 922 1091 q 893 1042 893 1062 q 908 1007 893 1022 q 942 992 922 992 q 977 1007 963 992 m 1190 450 q 1130 271 1190 339 q 962 204 1070 203 l 958 205 q 820 157 899 157 q 787 160 803 157 q 694 131 745 136 l 694 0 q 636 -140 694 -81 q 495 -198 577 -198 q 357 -140 415 -198 q 298 0 298 -81 l 298 290 q 198 273 256 273 q 52 336 105 273 q 0 496 0 399 q 14 550 0 525 q 52 593 27 574 q 101 624 77 611 q 157 653 125 637 q 205 678 188 668 q 305 756 247 705 q 318 767 307 757 q 334 781 329 776 q 351 797 340 787 q 369 816 362 808 q 382 833 375 824 q 393 851 390 842 q 397 868 397 860 l 397 1091 q 426 1161 397 1132 q 496 1190 455 1190 l 992 1190 q 1062 1161 1033 1190 q 1091 1091 1091 1132 l 1091 868 q 1137 695 1091 822 q 1190 450 1190 548 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 446 l 992 546 q 977 581 992 566 q 942 595 963 595 l 553 595 l 700 742 q 715 777 715 756 q 700 811 715 797 l 629 882 q 594 896 615 896 q 560 882 574 896 l 279 601 l 208 531 q 195 496 195 517 q 208 461 195 475 l 279 391 l 560 110 q 594 96 574 96 q 629 110 615 96 l 700 181 q 714 215 714 195 q 700 250 714 236 l 553 397 l 942 397 q 977 412 963 397 q 992 446 992 426 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 982 461 q 996 496 996 475 q 982 531 996 517 l 911 601 l 631 882 q 596 896 617 896 q 561 882 575 896 l 491 811 q 477 777 477 798 q 491 742 477 756 l 637 595 l 248 595 q 213 581 228 595 q 198 546 198 566 l 198 446 q 213 412 198 426 q 248 397 228 397 l 637 397 l 491 250 q 476 215 476 236 q 491 181 476 195 l 561 110 q 596 96 575 96 q 631 110 617 96 l 911 391 l 982 461 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 981 462 q 995 497 995 476 q 981 532 995 518 l 701 812 l 630 883 q 595 897 616 897 q 560 883 574 897 l 490 812 l 209 532 q 195 497 195 518 q 209 462 195 476 l 280 391 q 315 377 294 377 q 350 391 336 377 l 496 538 l 496 149 q 511 114 496 129 q 546 99 525 99 l 645 99 q 680 114 665 99 q 694 149 694 129 l 694 538 l 841 391 q 876 377 856 377 q 911 391 896 377 l 981 462 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 981 460 q 995 495 995 474 q 981 530 995 516 l 911 601 q 876 615 897 615 q 841 601 855 615 l 694 454 l 694 843 q 680 878 694 863 q 645 893 665 893 l 546 893 q 511 878 525 893 q 496 843 496 863 l 496 454 l 350 601 q 315 615 335 615 q 280 601 295 615 l 209 530 q 195 495 195 516 q 209 460 195 474 l 490 180 l 560 109 q 595 95 574 95 q 630 109 616 95 l 701 180 l 981 460 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 296 1011 q 365 1051 296 1011 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 m 808 687 q 800 680 806 687 q 790 673 794 674 q 793 677 791 673 q 797 685 795 680 q 800 691 799 690 q 817 702 805 696 q 857 711 828 707 q 897 703 884 718 q 904 713 895 705 q 915 722 913 722 q 927 726 918 724 q 939 732 936 728 l 940 749 q 927 754 931 748 q 922 770 922 760 q 917 764 922 769 q 913 770 917 770 q 904 770 910 771 q 898 769 899 768 q 886 775 890 771 q 880 787 882 778 q 877 799 877 797 q 869 808 875 803 q 862 815 863 812 q 860 820 861 817 q 858 825 859 822 q 854 829 856 827 q 850 831 853 831 q 845 827 848 831 q 839 819 842 823 q 836 815 836 815 q 831 817 833 817 q 827 816 829 816 q 824 813 826 815 q 820 811 822 811 q 813 808 818 809 q 807 807 809 808 q 806 815 818 811 q 794 818 798 818 q 799 827 801 821 q 793 838 798 833 l 797 838 q 790 844 796 841 q 777 851 784 848 q 767 856 769 854 q 740 863 760 860 q 715 863 720 867 q 711 855 711 859 q 714 844 711 852 q 717 835 717 837 q 713 825 718 830 q 708 815 708 819 q 718 803 708 810 q 726 787 729 797 q 714 774 724 780 q 701 765 704 768 q 700 751 698 759 q 708 738 703 742 q 710 735 710 736 q 707 731 709 733 q 703 728 705 729 q 698 725 701 727 l 695 724 q 679 729 687 720 q 669 749 672 737 q 656 772 663 768 q 634 771 639 778 q 602 791 630 781 q 557 794 583 798 q 557 806 562 795 q 543 815 552 818 q 546 829 545 820 q 546 839 546 838 q 556 857 549 849 q 561 864 556 858 q 568 874 566 870 q 569 879 571 879 q 608 887 596 876 q 617 901 612 891 q 625 914 622 910 q 636 918 632 918 q 647 914 639 918 q 658 910 654 910 q 670 918 669 909 q 664 934 671 928 q 667 947 674 933 q 660 954 663 953 q 639 950 651 957 q 641 944 633 947 q 634 936 640 945 q 621 922 627 927 q 608 926 615 918 q 604 937 608 927 q 597 947 601 946 q 584 935 591 947 q 576 947 587 942 q 557 953 565 953 q 551 974 572 963 q 535 978 546 977 q 520 975 525 979 q 516 966 516 970 q 520 960 515 963 q 528 956 524 957 q 537 953 532 954 q 543 950 542 951 q 550 939 554 942 q 543 937 548 939 q 534 933 538 935 q 529 930 530 932 q 529 919 527 927 q 528 908 532 911 q 521 922 524 912 q 515 935 518 932 q 496 930 521 928 l 488 931 q 476 929 485 931 q 460 929 467 928 q 450 935 453 929 q 450 950 446 941 q 453 952 450 953 q 444 959 450 954 q 436 966 439 964 q 363 934 401 954 q 373 935 368 933 q 383 940 377 936 q 391 944 389 943 q 423 949 417 955 l 427 953 q 443 934 438 941 q 419 935 437 937 q 402 925 404 930 q 406 911 408 916 q 397 919 403 914 q 386 928 391 925 q 374 932 381 931 q 357 931 362 932 q 175 759 244 869 q 184 753 181 753 q 188 746 188 752 q 190 737 189 739 q 199 739 191 735 q 202 725 206 733 q 236 704 202 725 q 252 687 250 691 q 244 674 254 679 q 237 680 243 675 q 230 684 231 686 q 231 669 228 680 q 239 660 233 659 q 231 647 233 660 q 229 620 229 635 q 229 601 229 605 l 230 601 q 234 574 228 591 q 251 559 241 556 q 267 525 241 556 q 273 519 271 519 q 282 513 275 517 q 294 505 289 508 q 301 497 298 501 q 309 479 305 493 q 320 461 314 466 q 327 446 319 457 q 336 428 336 435 q 334 427 335 428 q 332 426 332 426 q 344 415 334 421 q 356 405 353 410 q 357 398 357 403 q 360 389 358 392 q 366 388 361 386 q 347 436 367 403 q 334 458 336 455 q 330 470 332 462 q 326 481 328 478 q 331 480 328 481 q 338 477 334 479 q 343 474 341 476 q 345 472 346 473 q 346 458 343 467 q 356 444 350 450 q 369 429 361 438 q 378 419 377 421 q 389 404 383 415 q 389 394 395 394 q 405 386 396 394 q 418 370 413 377 q 424 350 422 364 q 428 332 426 336 q 434 321 429 326 q 444 314 439 316 q 457 308 449 312 q 467 302 464 304 q 481 294 470 301 q 498 285 491 288 q 510 282 505 282 q 521 284 515 282 q 532 287 528 286 q 554 275 543 288 q 570 259 565 262 q 613 250 598 244 q 613 245 612 250 q 620 233 615 239 q 627 221 624 226 q 631 215 629 217 q 645 203 635 210 q 659 191 655 196 q 664 198 663 195 q 670 183 662 192 q 684 175 677 174 q 694 200 694 177 q 656 214 670 188 q 655 218 656 215 q 651 225 653 222 q 649 231 650 228 q 649 237 649 235 q 653 239 650 239 q 661 242 660 239 q 660 252 662 245 q 656 262 657 259 q 648 277 656 268 q 639 289 640 287 q 626 283 635 282 q 614 290 618 284 q 613 286 614 289 q 612 281 612 282 q 600 281 601 281 q 602 295 601 284 q 605 312 603 306 q 609 322 605 315 q 615 333 612 328 q 618 343 617 338 q 614 350 618 347 q 601 352 610 353 q 581 336 586 351 q 578 328 580 334 q 574 319 577 322 q 567 314 572 316 q 549 312 562 312 q 530 316 536 313 q 513 339 520 322 q 505 367 505 355 q 507 388 505 375 q 510 407 509 401 q 505 426 510 414 q 512 434 508 428 q 520 442 517 439 q 524 443 522 443 q 527 443 525 443 q 530 444 529 443 q 532 449 532 446 q 529 451 532 450 q 526 453 527 453 q 548 455 532 451 q 570 453 565 458 q 587 455 581 445 q 585 462 587 456 q 584 473 583 469 q 607 466 588 452 q 619 462 609 463 q 632 458 629 460 q 638 454 635 457 q 642 450 641 451 q 646 451 643 450 q 653 456 649 452 q 662 437 660 445 q 677 403 670 406 q 685 401 682 401 q 689 409 688 402 q 689 420 689 415 q 687 429 688 424 l 687 436 q 687 450 687 443 l 686 456 q 672 465 674 458 q 673 479 669 472 q 684 494 677 487 q 691 496 685 494 q 703 501 696 498 q 712 508 709 505 q 724 535 729 522 q 732 542 729 535 q 729 544 732 542 q 723 548 725 546 q 719 550 720 550 q 721 562 726 553 q 727 570 725 564 q 732 578 729 577 q 749 577 739 569 q 749 589 755 583 q 765 597 753 594 q 780 605 777 600 q 786 606 785 603 q 787 615 787 609 q 789 625 787 622 q 801 632 792 629 q 811 636 809 635 l 824 644 q 824 647 826 647 q 848 656 838 646 q 843 671 856 664 q 841 679 846 676 q 829 683 836 681 q 838 683 832 684 q 846 684 845 683 q 841 697 858 692 q 808 687 828 701 m 681 8 q 953 154 841 36 q 944 158 951 157 q 934 160 936 159 q 915 167 920 166 q 913 177 916 172 q 907 184 911 181 q 898 190 904 186 q 889 195 891 194 q 884 200 887 197 q 878 204 880 203 q 872 208 877 205 q 866 209 868 210 q 858 208 863 208 l 856 208 q 851 206 853 207 q 847 203 849 205 q 844 201 845 202 q 844 199 843 200 q 816 216 828 212 q 808 221 812 217 q 799 226 803 224 q 792 227 796 228 q 783 222 787 226 q 778 210 779 218 q 777 200 777 202 q 777 214 771 204 q 778 228 782 223 q 770 231 776 233 q 761 228 764 230 q 752 221 757 226 q 745 216 746 217 q 738 212 743 215 q 732 206 733 208 q 727 197 729 203 q 723 188 725 191 q 714 193 722 191 q 707 198 707 195 q 710 171 708 190 q 714 141 711 151 q 705 104 719 117 q 682 73 684 84 q 691 53 679 56 q 685 37 691 47 q 680 20 679 26 q 681 8 680 16 z "},"飩�":{"ha":1290,"x_min":16,"x_max":1288,"o":"m 283 15 q 290 22 283 15 q 298 50 298 29 q 283 84 298 70 q 248 99 268 99 q 213 84 228 99 q 198 50 198 70 q 213 15 198 29 q 248 0 228 0 q 283 15 268 0 m 797 375 l 268 -153 q 198 -182 239 -182 q 128 -153 158 -182 l 46 -70 q 16 0 16 -42 q 46 71 16 41 l 574 598 q 662 464 604 522 q 797 375 721 405 m 1288 712 q 1270 630 1288 682 q 1143 462 1234 526 q 942 397 1052 397 q 697 499 799 397 q 595 744 595 601 q 697 989 595 887 q 942 1091 799 1091 q 1037 1078 987 1091 q 1120 1042 1086 1066 q 1132 1021 1132 1034 q 1120 999 1132 1008 l 893 868 l 893 694 l 1042 612 q 1104 649 1046 614 q 1209 712 1161 684 q 1263 739 1256 739 q 1282 732 1275 739 q 1288 712 1288 724 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 794 99 l 1290 99 l 1290 198 l 794 198 l 794 99 m 496 496 l 1290 496 l 1290 595 l 496 595 l 496 496 m 992 893 l 1290 893 l 1290 992 l 992 992 l 992 893 m 1389 248 l 1389 50 q 1374 15 1389 29 q 1339 0 1359 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 248 q 15 283 0 268 q 50 298 29 298 l 1339 298 q 1374 283 1359 298 q 1389 248 1389 268 m 1389 645 l 1389 446 q 1374 412 1389 426 q 1339 397 1359 397 l 50 397 q 15 412 29 397 q 0 446 0 426 l 0 645 q 15 680 0 665 q 50 694 29 694 l 1339 694 q 1374 680 1359 694 q 1389 645 1389 665 m 1389 1042 l 1389 843 q 1374 808 1389 823 q 1339 794 1359 794 l 50 794 q 15 808 29 794 q 0 843 0 823 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 1339 1091 q 1374 1077 1359 1091 q 1389 1042 1389 1062 z "},"飩�":{"ha":1091,"x_min":4,"x_max":1087,"o":"m 1087 962 q 1077 908 1101 930 l 694 525 l 694 -50 q 664 -95 694 -82 q 645 -99 654 -99 q 610 -84 624 -99 l 412 114 q 397 149 397 129 l 397 525 l 15 908 q 4 962 -9 930 q 50 992 17 992 l 1042 992 q 1087 962 1074 992 z "},"飩�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 496 992 l 893 992 l 893 1091 l 496 1091 l 496 992 m 1389 496 l 1389 124 q 1352 36 1389 73 q 1265 0 1316 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 496 l 521 496 l 521 372 q 536 337 521 352 q 570 322 550 322 l 818 322 q 853 337 839 322 q 868 372 868 352 l 868 496 l 1389 496 m 794 496 l 794 397 l 595 397 l 595 496 l 794 496 m 1389 868 l 1389 570 l 0 570 l 0 868 q 36 956 0 919 q 124 992 73 992 l 397 992 l 397 1116 q 419 1169 397 1147 q 471 1190 440 1190 l 918 1190 q 970 1169 949 1190 q 992 1116 992 1147 l 992 992 l 1265 992 q 1352 956 1316 992 q 1389 868 1389 919 z "},"飩�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 994 771 l 719 496 l 994 221 l 1106 332 q 1160 343 1128 357 q 1190 298 1190 330 l 1190 -50 q 1176 -84 1190 -70 q 1141 -99 1161 -99 l 794 -99 q 748 -68 761 -99 q 759 -15 735 -38 l 870 97 l 595 372 l 320 97 l 432 -15 q 443 -68 456 -38 q 397 -99 429 -99 l 50 -99 q 15 -84 29 -99 q 0 -50 0 -70 l 0 298 q 31 343 0 330 q 84 332 61 357 l 196 221 l 471 496 l 196 771 l 84 660 q 50 645 70 645 q 31 649 40 645 q 0 694 0 662 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 397 1091 q 443 1060 429 1091 q 432 1007 456 1030 l 320 895 l 595 620 l 870 895 l 759 1007 q 748 1060 735 1030 q 794 1091 761 1091 l 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 l 1190 694 q 1160 649 1190 662 q 1141 645 1150 645 q 1106 660 1121 645 l 994 771 z "},"飪�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 460 496 q 254 397 334 492 l 150 397 q 43 428 87 397 q 0 520 0 460 q 96 794 0 794 q 130 777 101 794 q 205 744 159 761 q 298 728 252 728 q 401 746 350 728 q 397 694 397 717 q 460 496 397 587 m 1290 2 q 1233 -145 1290 -91 q 1083 -198 1177 -198 l 405 -198 q 255 -145 312 -198 q 198 2 198 -91 q 201 83 198 43 q 212 167 204 122 q 233 251 220 212 q 266 327 245 290 q 314 389 287 363 q 380 431 341 415 q 467 446 419 446 q 500 430 474 446 q 556 393 525 413 q 639 355 587 372 q 744 339 691 339 q 849 355 797 339 q 932 393 901 372 q 988 430 963 413 q 1022 446 1014 446 q 1108 431 1069 446 q 1174 389 1147 415 q 1222 327 1201 363 q 1256 251 1243 290 q 1276 167 1268 212 q 1287 83 1284 122 q 1290 2 1290 43 m 438 1132 q 467 1103 438 1132 q 496 992 496 1074 q 438 852 496 910 q 298 794 380 794 q 157 852 215 794 q 99 992 99 910 q 157 1132 99 1074 q 298 1190 215 1190 q 438 1132 380 1190 m 954 905 q 998 861 954 905 q 1042 694 1042 818 q 954 484 1042 571 q 744 397 867 397 q 534 484 621 397 q 446 694 446 571 q 534 905 446 818 q 744 992 621 992 q 954 905 867 992 m 1488 520 q 1445 428 1488 460 q 1338 397 1401 397 l 1234 397 q 1028 496 1154 492 q 1091 694 1091 587 q 1087 746 1091 717 q 1190 728 1139 728 q 1283 744 1236 728 q 1358 777 1329 761 q 1392 794 1387 794 q 1488 520 1488 794 m 1331 1132 q 1360 1103 1331 1132 q 1389 992 1389 1074 q 1331 852 1389 910 q 1190 794 1273 794 q 1050 852 1108 794 q 992 992 992 910 q 1050 1132 992 1074 q 1190 1190 1108 1190 q 1331 1132 1273 1190 z "},"飪�":{"ha":1290,"x_min":12,"x_max":1277,"o":"m 1128 248 q 1107 301 1128 279 l 946 462 q 893 484 924 484 q 837 459 860 484 q 852 444 839 457 q 868 428 864 432 q 880 413 873 423 q 890 393 887 403 q 893 372 893 384 q 871 319 893 341 q 818 298 849 298 q 797 300 807 298 q 777 310 787 303 q 763 322 767 318 q 746 339 758 326 q 732 353 734 351 q 706 297 706 329 q 728 244 706 266 l 887 84 q 940 63 908 63 q 993 83 971 63 l 1107 196 q 1128 248 1128 218 m 584 794 q 562 847 584 825 l 402 1008 q 350 1029 381 1029 q 297 1008 319 1029 l 183 895 q 161 843 161 873 q 183 791 161 812 l 344 629 q 397 608 365 608 q 453 632 429 608 q 438 647 450 635 q 421 663 426 659 q 410 678 417 668 q 400 698 402 688 q 397 719 397 708 q 419 772 397 750 q 471 794 440 794 q 493 791 483 794 q 512 781 502 788 q 527 769 522 773 q 544 753 532 765 q 558 738 556 740 q 584 794 584 762 m 1212 406 q 1277 248 1277 341 q 1211 91 1277 155 l 1097 -22 q 940 -87 1033 -87 q 782 -21 846 -87 l 622 140 q 558 297 558 204 q 626 459 558 392 l 558 527 q 397 459 491 459 q 239 524 304 459 l 78 685 q 12 843 12 750 q 78 1001 12 936 l 192 1114 q 350 1178 257 1178 q 508 1112 443 1178 l 667 952 q 732 794 732 887 q 663 632 732 699 l 732 564 q 893 632 798 632 q 1051 567 986 632 l 1212 406 z "},"飪�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 1488 298 q 1401 87 1488 174 q 1190 0 1314 0 l 347 0 q 102 102 204 0 q 0 347 0 204 q 55 534 0 450 q 200 661 110 619 q 198 694 198 683 q 315 975 198 859 q 595 1091 431 1091 q 817 1023 718 1091 q 963 845 917 955 q 1091 893 1017 893 q 1232 835 1173 893 q 1290 694 1290 777 q 1258 587 1290 636 q 1423 483 1358 564 q 1488 298 1488 402 z "},"飪�":{"ha":1290,"x_min":89,"x_max":1201,"o":"m 1184 68 q 1200 -50 1227 -1 q 1091 -99 1173 -99 l 198 -99 q 90 -50 116 -99 q 106 68 63 -1 l 496 683 l 496 992 l 446 992 q 412 1007 426 992 q 397 1042 397 1022 q 412 1077 397 1062 q 446 1091 426 1091 l 843 1091 q 878 1077 863 1091 q 893 1042 893 1062 q 878 1007 893 1022 q 843 992 863 992 l 794 992 l 794 683 l 1184 68 m 580 630 l 369 298 l 921 298 l 710 630 l 694 654 l 694 683 l 694 992 l 595 992 l 595 683 l 595 654 l 580 630 z "},"飪�":{"ha":1389,"x_min":1,"x_max":1389,"o":"m 709 481 q 717 489 709 481 q 744 496 724 496 q 779 481 764 496 q 794 446 794 467 q 779 412 794 426 q 744 397 764 397 q 709 412 724 397 q 694 446 694 426 q 709 481 694 467 m 977 446 l 1370 138 q 1389 95 1391 122 q 1362 55 1385 67 l 1263 5 q 1240 0 1252 0 q 1216 6 1227 0 l 681 306 l 596 255 q 587 251 590 252 q 594 176 598 213 q 551 62 589 116 q 449 -34 513 7 q 234 -99 346 -99 q 62 -39 129 -99 q 1 122 -8 26 q 44 236 6 181 q 146 332 82 291 q 361 397 248 397 q 478 373 426 397 q 495 390 485 383 l 590 446 l 495 503 q 478 520 485 510 q 361 496 426 496 q 146 561 248 496 q 44 657 82 602 q 1 771 6 712 q 13 859 -3 817 q 62 931 29 901 q 234 992 128 992 q 449 927 346 992 q 551 832 513 887 q 594 717 589 777 q 587 642 598 680 q 596 638 590 641 l 681 587 l 1216 887 q 1240 893 1227 893 q 1263 887 1252 893 l 1362 838 q 1389 798 1385 825 q 1370 755 1391 770 l 977 446 m 449 648 q 465 732 484 680 q 383 822 446 783 q 234 868 312 868 q 146 840 177 868 q 130 756 111 808 q 212 666 150 705 q 361 620 284 620 q 449 648 419 620 m 383 71 q 465 161 446 110 q 449 245 484 212 q 361 273 419 273 q 212 227 284 273 q 130 136 150 188 q 146 53 111 85 q 234 25 177 25 q 383 71 312 25 m 521 546 l 595 501 l 595 509 q 621 553 595 537 l 632 559 l 570 595 l 550 575 q 543 567 548 573 q 533 557 537 560 q 530 555 532 556 q 528 553 529 553 l 521 546 m 694 372 l 769 347 l 1339 794 l 1240 843 l 645 509 l 645 422 l 521 347 l 528 341 q 533 336 529 339 q 542 327 536 333 q 550 318 547 321 l 570 298 l 694 372 m 1240 50 l 1339 99 l 936 415 l 799 308 q 789 303 798 306 l 1240 50 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1314 893 q 1367 871 1345 893 q 1389 818 1389 849 l 1389 -124 q 1367 -177 1389 -155 q 1314 -198 1345 -198 l 570 -198 q 518 -177 539 -198 q 496 -124 496 -155 l 496 99 l 74 99 q 22 121 43 99 q 0 174 0 143 l 0 694 q 16 763 0 725 q 53 822 31 800 l 369 1138 q 428 1175 391 1159 q 496 1190 465 1190 l 818 1190 q 871 1169 849 1190 q 893 1116 893 1147 l 893 862 q 992 893 946 893 l 1314 893 m 893 728 l 661 496 l 893 496 l 893 728 m 397 1025 l 165 794 l 397 794 l 397 1025 m 549 524 l 794 769 l 794 1091 l 496 1091 l 496 769 q 474 716 496 738 q 422 694 453 694 l 99 694 l 99 198 l 496 198 l 496 397 q 512 465 496 428 q 549 524 527 502 m 1290 -99 l 1290 794 l 992 794 l 992 471 q 970 419 992 440 q 918 397 949 397 l 595 397 l 595 -99 l 1290 -99 z "},"飪�":{"ha":1091,"x_min":3,"x_max":1088,"o":"m 1088 117 q 1027 -35 1088 26 q 875 -96 966 -96 q 693 -19 770 -96 l 91 583 q 3 793 3 672 q 88 1002 3 916 q 297 1088 174 1088 q 508 1001 419 1088 l 977 531 q 985 514 985 523 q 961 478 985 501 q 925 454 938 454 q 908 462 915 454 l 438 932 q 298 992 377 992 q 159 934 215 992 q 102 794 102 876 q 161 653 102 712 l 763 51 q 875 2 811 2 q 957 35 925 2 q 990 117 990 67 q 941 229 990 181 l 491 680 q 444 698 470 698 q 407 684 422 698 q 392 646 392 669 q 412 601 392 622 l 729 283 q 737 266 737 275 q 713 229 737 253 q 677 205 689 205 q 660 213 667 205 l 342 531 q 293 646 293 578 q 337 754 293 710 q 445 798 381 798 q 560 749 513 798 l 1011 299 q 1088 117 1088 223 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 298 0 l 893 0 l 893 298 l 298 298 l 298 0 m 992 0 l 1091 0 l 1091 694 q 1084 724 1091 705 q 1068 751 1076 743 l 850 969 q 824 984 842 977 q 794 992 805 992 l 794 670 q 772 617 794 639 q 719 595 750 595 l 273 595 q 220 617 242 595 q 198 670 198 639 l 198 992 l 99 992 l 99 0 l 198 0 l 198 322 q 220 375 198 353 q 273 397 242 397 l 918 397 q 970 375 949 397 q 992 322 992 353 l 992 0 m 694 719 l 694 967 q 687 985 694 977 q 670 992 680 992 l 521 992 q 503 985 511 992 q 496 967 496 977 l 496 719 q 503 702 496 709 q 521 694 511 694 l 670 694 q 687 702 680 694 q 694 719 694 709 m 1190 694 l 1190 -25 q 1169 -78 1190 -56 q 1116 -99 1147 -99 l 74 -99 q 22 -78 43 -99 q 0 -25 0 -56 l 0 1017 q 22 1070 0 1048 q 74 1091 43 1091 l 794 1091 q 862 1076 825 1091 q 921 1039 899 1060 l 1138 822 q 1175 763 1159 800 q 1190 694 1190 725 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 149 l 1190 50 q 1176 15 1190 29 q 1141 0 1161 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 149 q 15 184 0 169 q 50 198 29 198 l 1141 198 q 1176 184 1161 198 q 1190 149 1190 169 m 1190 546 l 1190 446 q 1176 412 1190 426 q 1141 397 1161 397 l 50 397 q 15 412 29 397 q 0 446 0 426 l 0 546 q 15 581 0 566 q 50 595 29 595 l 1141 595 q 1176 581 1161 595 q 1190 546 1190 566 m 1190 942 l 1190 843 q 1176 808 1190 823 q 1141 794 1161 794 l 50 794 q 15 808 29 794 q 0 843 0 823 l 0 942 q 15 977 0 963 q 50 992 29 992 l 1141 992 q 1176 977 1161 992 q 1190 942 1190 963 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 254 205 q 276 183 254 205 q 298 99 298 161 q 254 -6 298 37 q 149 -50 211 -50 q 43 -6 87 -50 q 0 99 0 37 q 43 205 0 161 q 149 248 87 248 q 254 205 211 248 m 254 601 q 276 580 254 601 q 298 496 298 558 q 254 391 298 434 q 149 347 211 347 q 43 391 87 347 q 0 496 0 434 q 43 601 0 558 q 149 645 87 645 q 254 601 211 645 m 1389 174 l 1389 25 q 1382 7 1389 15 q 1364 0 1374 0 l 422 0 q 404 7 412 0 q 397 25 397 15 l 397 174 q 404 191 397 184 q 422 198 412 198 l 1364 198 q 1382 191 1374 198 q 1389 174 1389 184 m 254 998 q 276 977 254 998 q 298 893 298 955 q 254 787 298 831 q 149 744 211 744 q 43 787 87 744 q 0 893 0 831 q 43 998 0 955 q 149 1042 87 1042 q 254 998 211 1042 m 1389 570 l 1389 422 q 1382 404 1389 412 q 1364 397 1374 397 l 422 397 q 404 404 412 397 q 397 422 397 412 l 397 570 q 404 588 397 581 q 422 595 412 595 l 1364 595 q 1382 588 1374 595 q 1389 570 1389 581 m 1389 967 l 1389 818 q 1382 801 1389 808 q 1364 794 1374 794 l 422 794 q 404 801 412 794 q 397 818 397 808 l 397 967 q 404 985 397 977 q 422 992 412 992 l 1364 992 q 1382 985 1374 992 q 1389 967 1389 977 z "},"飪�":{"ha":1389,"x_min":12,"x_max":1389,"o":"m 295 -65 q 253 -163 295 -127 q 148 -198 211 -198 q 15 -147 66 -198 l 59 -79 q 141 -114 97 -114 q 180 -103 164 -114 q 197 -70 197 -91 q 115 -26 197 -20 l 95 17 q 121 51 102 25 q 153 93 140 77 q 182 122 167 109 l 182 123 q 145 122 170 123 q 107 122 119 122 l 107 81 l 25 81 l 25 198 l 283 198 l 283 130 l 209 41 q 272 3 249 32 q 295 -65 295 -26 m 297 421 l 297 298 l 16 298 q 12 339 12 326 q 30 412 12 379 q 74 464 48 444 q 125 501 99 484 q 169 535 150 518 q 187 570 187 552 q 176 600 187 589 q 145 610 164 610 q 82 565 109 610 l 16 611 q 72 672 35 650 q 153 694 109 694 q 249 662 210 694 q 288 575 288 630 q 261 504 288 536 q 203 454 235 472 q 145 415 171 436 q 117 374 118 394 l 215 374 l 215 421 l 297 421 m 1389 174 l 1389 25 q 1382 7 1389 15 q 1364 0 1374 0 l 422 0 q 404 7 412 0 q 397 25 397 15 l 397 174 q 404 191 397 184 q 422 198 411 198 l 1364 198 q 1382 191 1374 198 q 1389 174 1389 184 m 298 870 l 298 794 l 38 794 l 38 870 l 121 870 q 121 965 121 902 q 122 1059 122 1027 l 122 1068 l 120 1068 q 81 1026 114 1055 l 26 1085 l 132 1184 l 214 1184 l 214 870 l 298 870 m 1389 570 l 1389 422 q 1382 404 1389 412 q 1364 397 1374 397 l 422 397 q 404 404 412 397 q 397 422 397 412 l 397 570 q 404 588 397 581 q 422 595 411 595 l 1364 595 q 1382 588 1374 595 q 1389 570 1389 581 m 1389 967 l 1389 818 q 1382 801 1389 808 q 1364 794 1374 794 l 422 794 q 404 801 412 794 q 397 818 397 808 l 397 967 q 404 985 397 977 q 422 992 412 992 l 1364 992 q 1382 985 1374 992 q 1389 967 1389 977 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1364 496 q 1382 489 1375 496 q 1389 471 1389 482 l 1389 422 q 1382 404 1389 411 q 1364 397 1375 397 l 25 397 q 7 404 14 397 q 0 422 0 411 l 0 471 q 7 489 0 482 q 25 496 14 496 l 1364 496 m 374 546 q 335 608 353 573 q 298 753 298 684 q 401 993 298 894 q 706 1091 505 1091 q 836 1077 745 1091 q 973 1039 887 1067 q 989 948 980 1010 q 1000 806 1000 853 q 996 771 1000 792 l 987 769 l 922 773 l 911 775 q 831 934 872 891 q 668 1004 763 1004 q 527 959 580 1004 q 475 846 475 914 q 526 737 475 789 q 742 637 577 685 q 877 586 796 622 q 950 546 922 564 l 374 546 m 767 347 l 1086 347 q 1091 276 1091 317 q 1059 112 1091 190 q 1004 31 1042 68 q 920 -32 976 4 q 801 -83 858 -69 q 644 -99 739 -99 q 493 -81 556 -99 l 384 -50 q 329 -29 340 -38 q 322 -12 322 -22 l 322 -2 q 321 119 322 82 q 321 172 320 143 l 322 201 l 322 235 l 401 236 q 425 181 413 210 q 442 138 436 153 q 452 117 448 123 q 514 44 479 73 q 595 0 547 16 q 698 -17 641 -17 q 805 4 747 -17 q 900 71 865 24 q 936 171 936 118 q 873 292 936 236 q 767 347 847 315 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 37 1018 q 2 1021 9 1019 l 0 1089 q 31 1090 10 1090 q 118 1087 78 1090 q 246 1081 220 1081 q 377 1084 313 1081 q 490 1087 467 1087 q 556 1089 533 1087 l 556 1078 l 557 1028 l 557 1022 q 461 1015 511 1015 q 400 995 415 1015 q 390 893 390 984 q 390 868 390 883 q 391 848 391 853 l 391 670 l 402 453 q 442 297 407 357 q 516 226 469 251 q 653 189 584 189 q 801 211 734 189 q 878 250 845 225 q 929 300 915 278 q 970 388 956 343 q 986 566 986 445 q 983 665 986 627 q 975 760 980 703 q 964 884 969 817 l 961 929 q 942 997 957 981 q 883 1024 916 1025 l 805 1022 l 794 1025 l 796 1091 l 861 1091 l 1020 1084 q 1172 1091 1079 1081 l 1186 1090 q 1190 1050 1190 1060 q 1187 1026 1190 1045 q 1122 1016 1152 1017 q 1061 1003 1066 1008 q 1049 971 1049 991 q 1051 950 1049 966 q 1052 926 1052 935 q 1069 619 1058 911 q 1057 384 1073 468 q 1025 289 1046 325 q 939 194 996 239 q 798 125 880 150 q 600 99 713 99 q 380 135 470 99 q 241 229 288 171 q 177 381 194 288 q 164 564 164 443 l 164 822 q 151 987 164 968 q 37 1018 132 1015 m 1190 -74 l 1190 -25 q 1184 -7 1190 -14 q 1166 0 1177 0 l 25 0 q 7 -7 14 0 q 0 -25 0 -14 l 0 -74 q 7 -92 0 -85 q 25 -99 14 -99 l 1166 -99 q 1184 -92 1177 -99 q 1190 -74 1190 -85 z "},"飪�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 397 124 l 397 273 q 390 291 397 284 q 372 298 383 298 l 124 298 q 106 291 113 298 q 99 273 99 284 l 99 124 q 106 106 99 113 q 124 99 113 99 l 372 99 q 390 106 383 99 q 397 124 397 113 m 397 422 l 397 570 q 390 588 397 581 q 372 595 383 595 l 124 595 q 106 588 113 595 q 99 570 99 581 l 99 422 q 106 404 99 411 q 124 397 113 397 l 372 397 q 390 404 383 397 q 397 422 397 411 m 794 124 l 794 273 q 787 291 794 284 q 769 298 780 298 l 521 298 q 503 291 510 298 q 496 273 496 284 l 496 124 q 503 106 496 113 q 521 99 510 99 l 769 99 q 787 106 780 99 q 794 124 794 113 m 397 719 l 397 868 q 390 886 397 879 q 372 893 383 893 l 124 893 q 106 886 113 893 q 99 868 99 879 l 99 719 q 106 701 99 708 q 124 694 113 694 l 372 694 q 390 701 383 694 q 397 719 397 708 m 794 422 l 794 570 q 787 588 794 581 q 769 595 780 595 l 521 595 q 503 588 510 595 q 496 570 496 581 l 496 422 q 503 404 496 411 q 521 397 510 397 l 769 397 q 787 404 780 397 q 794 422 794 411 m 1190 124 l 1190 273 q 1184 291 1190 284 q 1166 298 1177 298 l 918 298 q 900 291 907 298 q 893 273 893 284 l 893 124 q 900 106 893 113 q 918 99 907 99 l 1166 99 q 1184 106 1177 99 q 1190 124 1190 113 m 794 719 l 794 868 q 787 886 794 879 q 769 893 780 893 l 521 893 q 503 886 510 893 q 496 868 496 879 l 496 719 q 503 701 496 708 q 521 694 510 694 l 769 694 q 787 701 780 694 q 794 719 794 708 m 1190 422 l 1190 570 q 1184 588 1190 581 q 1166 595 1177 595 l 918 595 q 900 588 907 595 q 893 570 893 581 l 893 422 q 900 404 893 411 q 918 397 907 397 l 1166 397 q 1184 404 1177 397 q 1190 422 1190 411 m 1190 719 l 1190 868 q 1184 886 1190 879 q 1166 893 1177 893 l 918 893 q 900 886 907 893 q 893 868 893 879 l 893 719 q 900 701 893 708 q 918 694 907 694 l 1166 694 q 1184 701 1177 694 q 1190 719 1190 708 m 1290 967 l 1290 124 q 1253 36 1290 73 q 1166 0 1217 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1166 1091 q 1253 1055 1217 1091 q 1290 967 1290 1018 z "},"飪�":{"ha":1290,"x_min":21,"x_max":1290,"o":"m 922 740 l 1149 967 l 1066 1050 l 839 823 l 922 740 m 1255 1002 q 1269 967 1269 988 q 1255 932 1269 946 l 258 -64 q 223 -78 244 -78 q 188 -64 202 -78 l 35 89 q 21 124 21 103 q 35 159 21 145 l 1032 1156 q 1066 1170 1046 1170 q 1101 1156 1087 1170 l 1255 1002 m 222 1115 l 298 1091 l 222 1068 l 198 992 l 175 1068 l 99 1091 l 175 1115 l 198 1190 l 222 1115 m 493 989 l 645 942 l 493 896 l 446 744 l 400 896 l 248 942 l 400 989 l 446 1141 l 493 989 m 1214 618 l 1290 595 l 1214 572 l 1190 496 l 1167 572 l 1091 595 l 1167 618 l 1190 694 l 1214 618 m 718 1115 l 794 1091 l 718 1068 l 694 992 l 671 1068 l 595 1091 l 671 1115 l 694 1190 l 718 1115 z "},"飪�":{"ha":1389,"x_min":50,"x_max":1389,"o":"m 467 29 q 481 44 467 29 q 496 99 496 59 q 467 169 496 140 q 397 198 437 198 q 327 169 357 198 q 298 99 298 140 q 327 29 298 59 q 397 0 357 0 q 467 29 437 0 m 198 496 l 496 496 l 496 694 l 374 694 q 357 687 363 694 l 205 536 q 198 519 198 529 l 198 496 m 1161 29 q 1176 44 1161 29 q 1190 99 1190 59 q 1161 169 1190 140 q 1091 198 1132 198 q 1022 169 1051 198 q 992 99 992 140 q 1022 29 992 59 q 1091 0 1051 0 q 1161 29 1132 0 m 1389 942 l 1389 149 q 1386 128 1389 137 q 1375 114 1383 119 q 1363 105 1368 109 q 1344 100 1357 102 q 1327 99 1332 99 q 1307 99 1322 98 q 1290 99 1292 99 q 1232 -41 1290 17 q 1091 -99 1173 -99 q 951 -41 1009 -99 q 893 99 893 17 l 595 99 q 537 -41 595 17 q 397 -99 479 -99 q 257 -41 315 -99 q 198 99 198 17 l 149 99 q 131 99 146 99 q 112 99 116 98 q 94 100 107 99 q 76 105 81 102 q 63 114 71 109 q 53 128 56 119 q 50 149 50 137 q 64 184 50 169 q 99 198 79 198 l 99 446 q 99 474 99 453 q 99 503 98 494 q 101 530 99 512 q 106 558 102 548 q 117 582 109 569 q 134 605 124 595 l 288 759 q 327 784 302 773 q 372 794 351 794 l 496 794 l 496 942 q 511 977 496 963 q 546 992 525 992 l 1339 992 q 1374 977 1359 992 q 1389 942 1389 963 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 426 -74 509 -99 q 487 53 472 -2 q 529 216 494 79 q 585 164 544 186 q 674 142 626 142 q 841 195 767 142 q 955 341 915 248 q 995 550 995 434 q 949 716 995 639 q 815 842 903 794 q 618 891 728 891 q 466 869 536 891 q 346 809 395 846 q 262 724 297 772 q 210 623 226 675 q 193 519 193 571 q 224 377 193 439 q 315 291 255 316 q 344 307 338 282 q 350 331 346 312 q 357 354 355 350 q 348 388 361 372 q 308 505 308 435 q 389 706 308 622 q 601 790 470 790 q 784 726 718 790 q 849 561 849 663 q 796 337 849 429 q 660 245 743 245 q 584 279 613 245 q 567 360 556 312 q 587 432 573 387 q 610 512 601 477 q 619 570 619 546 q 598 635 619 609 q 539 660 577 660 q 457 616 491 660 q 424 506 424 572 q 443 412 424 450 l 367 88 q 357 -50 353 33 q 98 168 197 21 q 0 496 0 315 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 405 -99 q 489 64 471 -5 q 530 226 496 90 q 587 174 546 195 q 674 152 628 152 q 903 266 815 152 q 992 556 992 381 q 965 682 992 621 q 890 789 938 742 q 772 865 842 836 q 619 893 701 893 q 469 871 539 893 q 350 811 398 849 q 267 727 301 774 q 215 627 232 679 q 198 525 198 576 q 229 385 198 446 q 319 300 260 325 q 338 300 329 296 q 349 315 346 304 q 360 362 357 349 q 352 395 365 380 q 313 511 313 443 q 393 710 313 627 q 603 792 474 792 q 783 729 718 792 q 848 567 848 667 q 796 345 848 436 q 661 253 743 253 q 586 287 615 253 q 568 367 557 321 q 589 439 574 394 q 612 518 603 484 q 620 576 620 552 q 600 639 620 614 q 541 664 579 664 q 461 620 494 664 q 428 512 428 577 q 446 419 428 457 l 370 98 q 365 -99 352 20 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 711 489 q 706 539 711 509 l 426 539 l 426 436 l 594 436 q 581 398 591 418 q 552 357 570 377 q 500 322 533 336 q 426 308 467 308 q 295 363 349 308 q 240 496 240 419 q 295 629 240 574 q 426 684 349 684 q 544 638 497 684 l 625 716 q 426 794 541 794 q 215 706 301 794 q 128 496 128 619 q 215 286 128 373 q 426 198 301 198 q 632 280 553 198 q 711 489 711 361 m 978 453 l 1063 453 l 1063 539 l 978 539 l 978 624 l 893 624 l 893 539 l 808 539 l 808 453 l 893 453 l 893 368 l 978 368 l 978 453 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飪�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1114 483 q 1046 196 1114 322 q 854 -1 979 70 q 568 -72 729 -72 q 347 -27 453 -72 q 166 94 242 18 q 45 275 90 170 q 0 496 0 381 q 45 717 0 612 q 166 898 90 822 q 347 1019 242 974 q 568 1064 453 1064 q 949 915 790 1064 l 794 767 q 568 855 704 855 q 392 807 473 855 q 264 676 311 759 q 216 496 216 594 q 264 316 216 398 q 392 185 311 233 q 568 137 473 137 q 686 155 632 137 q 775 200 740 173 q 836 260 810 226 q 874 325 862 295 q 891 382 886 355 l 568 382 l 568 577 l 1104 577 q 1114 483 1114 529 m 1786 577 l 1786 415 l 1624 415 l 1624 253 l 1461 253 l 1461 415 l 1299 415 l 1299 577 l 1461 577 l 1461 739 l 1624 739 l 1624 577 l 1786 577 z "},"飪�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 595 298 l 893 298 l 893 372 l 794 372 l 794 719 l 705 719 l 591 613 l 650 551 q 693 595 683 580 l 694 595 l 694 372 l 595 372 l 595 298 m 976 606 q 984 578 976 606 q 992 496 992 550 q 976 386 992 442 q 930 282 960 330 q 851 204 900 234 q 744 174 802 174 q 637 204 686 174 q 558 282 588 234 q 512 386 529 330 q 496 496 496 442 q 512 606 496 550 q 558 710 529 662 q 637 788 588 758 q 744 818 686 818 q 851 788 802 818 q 930 710 900 758 q 976 606 960 662 m 1389 298 l 1389 694 q 1249 753 1307 694 q 1190 893 1190 811 l 298 893 q 239 753 298 811 q 99 694 181 694 l 99 298 q 239 239 181 298 q 298 99 298 181 l 1190 99 q 1249 239 1190 181 q 1389 298 1307 298 m 1488 942 l 1488 50 q 1473 15 1488 29 q 1438 0 1459 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 942 q 15 977 0 963 q 50 992 29 992 l 1438 992 q 1473 977 1459 992 q 1488 942 1488 963 z "},"飪�":{"ha":794,"x_min":0,"x_max":794,"o":"m 779 680 q 786 672 779 680 q 794 645 794 665 q 779 610 794 625 l 432 263 q 397 248 417 248 q 362 263 377 248 l 15 610 q 0 645 0 625 q 15 680 0 665 q 50 694 29 694 l 744 694 q 779 680 764 694 z "},"飪�":{"ha":794,"x_min":0,"x_max":794,"o":"m 779 283 q 794 248 794 268 q 779 213 794 228 q 744 198 764 198 l 50 198 q 15 213 29 198 q 0 248 0 228 q 15 283 0 268 l 362 630 q 397 645 377 645 q 432 630 417 645 l 779 283 z "},"飪�":{"ha":496,"x_min":50,"x_max":496,"o":"m 496 843 l 496 149 q 481 114 496 129 q 446 99 467 99 q 412 114 426 99 l 64 461 q 50 496 50 476 q 64 531 50 516 l 412 878 q 446 893 426 893 q 481 878 467 893 q 496 843 496 863 z "},"飪�":{"ha":496,"x_min":0,"x_max":446,"o":"m 432 531 q 446 496 446 516 q 432 461 446 476 l 84 114 q 50 99 70 99 q 15 114 29 99 q 0 149 0 129 l 0 843 q 15 878 0 863 q 50 893 29 893 q 84 878 70 893 l 432 531 z "},"飪�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 124 0 l 595 0 l 595 893 l 99 893 l 99 25 q 107 7 99 15 q 124 0 114 0 m 1190 25 l 1190 893 l 694 893 l 694 0 l 1166 0 q 1183 7 1176 0 q 1190 25 1190 15 m 1290 967 l 1290 25 q 1253 -63 1290 -26 q 1166 -99 1217 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1166 1091 q 1253 1055 1217 1091 q 1290 967 1290 1018 z "},"飪�":{"ha":794,"x_min":0,"x_max":794,"o":"m 779 382 q 786 375 779 382 q 794 347 794 367 q 779 312 794 327 l 432 -35 q 397 -50 417 -50 q 362 -35 377 -50 l 15 312 q 0 347 0 327 q 15 382 0 367 q 50 397 29 397 l 744 397 q 779 382 764 397 m 779 680 q 794 645 794 665 q 779 610 794 625 q 744 595 764 595 l 50 595 q 15 610 29 595 q 0 645 0 625 q 15 680 0 665 l 362 1027 q 397 1042 377 1042 q 432 1027 417 1042 l 779 680 z "},"飪�":{"ha":794,"x_min":0,"x_max":794,"o":"m 779 382 q 786 375 779 382 q 794 347 794 367 q 779 312 794 327 l 432 -35 q 397 -50 417 -50 q 362 -35 377 -50 l 15 312 q 0 347 0 327 q 15 382 0 367 q 50 397 29 397 l 744 397 q 779 382 764 397 z "},"飪�":{"ha":794,"x_min":0,"x_max":794,"o":"m 779 680 q 794 645 794 665 q 779 610 794 625 q 744 595 764 595 l 50 595 q 15 610 29 595 q 0 645 0 625 q 15 680 0 665 l 362 1027 q 397 1042 377 1042 q 432 1027 417 1042 l 779 680 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 640 l 1389 25 q 1352 -63 1389 -26 q 1265 -99 1316 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 640 q 78 573 34 602 q 463 305 359 382 q 535 255 508 273 q 608 217 563 236 q 694 198 654 198 l 694 198 l 695 198 q 780 217 735 198 q 854 255 826 236 q 925 305 881 273 q 1311 573 1057 401 q 1389 640 1356 603 m 1389 868 q 1351 751 1389 807 q 1256 656 1313 695 q 894 404 965 453 q 861 380 886 398 q 819 351 836 362 q 779 326 802 339 q 734 305 755 312 q 695 298 713 298 l 694 298 l 694 298 q 655 305 676 298 q 610 326 634 312 q 570 351 587 339 q 528 380 553 362 q 495 404 503 398 q 292 545 425 453 q 133 656 160 637 q 43 745 85 688 q 0 851 0 802 q 32 952 0 911 q 124 992 64 992 l 1265 992 q 1352 956 1315 992 q 1389 868 1389 919 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 270 706 l 270 -62 l 15 -62 l 15 706 l 270 706 m 287 943 q 248 849 288 887 q 143 811 208 811 l 141 811 q 39 849 78 811 q 0 943 0 887 q 40 1038 0 1001 q 144 1076 80 1076 q 247 1038 208 1076 q 287 943 286 1001 m 1190 378 l 1190 -62 l 935 -62 l 935 349 q 904 476 935 430 q 806 522 873 522 q 724 496 757 522 q 675 429 691 469 q 667 367 667 406 l 667 -62 l 412 -62 q 413 439 413 247 q 412 669 413 632 l 412 706 l 667 706 l 667 594 l 665 594 q 697 638 680 619 q 741 678 713 656 q 808 712 768 700 q 897 724 848 724 q 1110 636 1029 724 q 1190 378 1190 548 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1143 727 q 1167 672 1143 727 q 1190 496 1190 617 q 1143 265 1190 375 q 1016 75 1096 155 q 826 -52 936 -5 q 595 -99 716 -99 q 342 -43 462 -99 q 137 115 222 13 q 132 133 132 123 q 139 149 133 143 l 245 256 q 264 263 253 263 q 282 253 277 261 q 421 140 339 180 q 595 99 503 99 q 749 131 676 99 q 876 215 822 162 q 961 342 929 269 q 992 496 992 415 q 961 650 992 577 q 876 777 929 723 q 749 861 822 830 q 595 893 676 893 q 450 865 519 893 q 326 787 380 838 l 432 680 q 443 626 456 656 q 397 595 429 595 l 50 595 q 15 610 29 595 q 0 645 0 625 l 0 992 q 31 1038 0 1025 q 84 1027 61 1051 l 185 927 q 375 1048 268 1005 q 595 1091 481 1091 q 826 1044 716 1091 q 1016 917 936 997 q 1143 727 1096 837 z "},"飪�":{"ha":1389,"x_min":31,"x_max":1373,"o":"m 1373 0 q 1344 -70 1373 -41 l 1261 -153 q 1190 -182 1231 -182 q 1121 -153 1149 -182 l 839 129 q 810 198 810 157 q 843 273 810 239 l 645 471 l 547 374 q 521 363 536 363 q 494 374 505 363 q 504 364 496 372 q 514 354 512 357 q 522 345 515 352 q 529 335 528 339 q 534 324 531 331 q 538 312 537 318 q 539 298 539 305 q 518 245 539 268 q 505 231 515 243 q 490 215 494 219 q 476 202 486 211 q 459 190 466 194 q 442 183 452 187 q 422 180 432 180 q 369 202 391 180 l 53 518 q 31 570 31 539 q 34 591 31 581 q 41 608 38 601 q 53 625 45 615 q 66 639 62 635 q 82 654 71 643 q 96 667 94 664 q 149 688 119 688 q 163 687 157 688 q 176 683 169 686 q 186 678 182 680 q 196 670 190 677 q 205 663 203 664 q 215 653 208 661 q 225 643 223 645 q 214 670 214 654 q 225 696 214 685 l 494 966 q 521 977 505 977 q 547 966 536 977 q 537 975 546 967 q 528 985 529 983 q 520 994 526 987 q 512 1004 514 1001 q 508 1015 511 1008 q 503 1028 505 1022 q 502 1042 502 1034 q 524 1094 502 1071 q 537 1108 526 1097 q 551 1124 547 1120 q 566 1137 556 1128 q 583 1149 576 1146 q 600 1156 590 1152 q 620 1159 610 1159 q 673 1138 651 1159 l 989 822 q 1011 769 1011 800 q 1007 749 1011 759 q 1000 732 1004 739 q 988 715 997 725 q 975 700 980 705 q 960 686 971 696 q 946 673 948 675 q 893 651 922 651 q 879 652 885 651 q 866 656 873 653 q 856 661 860 660 q 845 669 852 663 q 836 677 839 675 q 826 686 834 678 q 817 696 818 694 q 828 670 828 685 q 817 643 828 654 l 719 546 l 918 347 q 992 381 951 381 q 1063 352 1032 381 l 1344 71 q 1373 0 1373 40 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 269 227 q 283 242 269 227 q 298 298 298 257 q 269 368 298 339 q 198 397 239 397 q 128 368 157 397 q 99 298 99 339 q 128 227 99 257 q 198 198 157 198 q 269 227 239 198 m 417 575 q 432 589 417 575 q 446 645 446 604 q 417 715 446 686 q 347 744 388 744 q 277 715 306 744 q 248 645 248 686 q 277 575 248 604 q 347 546 306 546 q 417 575 388 546 m 778 272 l 856 568 q 851 606 861 588 q 821 629 840 623 q 784 624 801 634 q 760 593 766 613 l 682 297 q 599 263 636 293 q 550 187 563 233 q 566 74 535 127 q 656 5 597 20 q 770 20 716 -11 q 839 111 823 51 q 834 202 851 157 q 778 272 817 246 m 1261 227 q 1275 242 1261 227 q 1290 298 1290 257 q 1261 368 1290 339 q 1190 397 1232 397 q 1120 368 1149 397 q 1091 298 1091 339 q 1120 227 1091 257 q 1190 198 1149 198 q 1261 227 1232 198 m 765 724 q 779 738 765 724 q 794 794 794 753 q 765 864 794 835 q 694 893 736 893 q 624 864 653 893 q 595 794 595 835 q 624 724 595 753 q 694 694 653 694 q 765 724 736 694 m 1112 575 q 1126 589 1112 575 q 1141 645 1141 604 q 1112 715 1141 686 q 1042 744 1083 744 q 972 715 1001 744 q 942 645 942 686 q 972 575 942 604 q 1042 546 1001 546 q 1112 575 1083 546 m 1389 298 q 1280 -77 1389 95 q 1238 -99 1265 -99 l 151 -99 q 109 -77 124 -99 q 0 298 0 95 q 55 567 0 439 q 203 789 110 696 q 425 937 296 882 q 694 992 553 992 q 964 937 836 992 q 1186 789 1093 882 q 1334 567 1279 696 q 1389 298 1389 439 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 990 839 q 921 866 990 839 q 694 893 853 893 q 399 839 536 893 q 180 694 261 785 q 99 496 99 602 q 155 331 99 409 q 311 195 210 252 l 378 156 l 357 81 q 303 -52 339 11 q 516 81 421 -3 l 550 110 l 594 105 q 694 99 647 99 q 990 153 853 99 q 1209 298 1128 207 q 1290 496 1290 390 q 1209 694 1290 602 q 990 839 1128 785 m 1296 745 q 1342 688 1296 745 q 1389 496 1389 631 q 1296 247 1389 361 q 1043 66 1203 133 q 694 0 884 0 q 582 6 640 0 q 226 -181 429 -129 q 137 -198 188 -192 l 133 -198 q 112 -190 122 -198 q 100 -169 103 -182 l 100 -168 q 100 -159 98 -165 q 101 -151 102 -153 q 105 -144 101 -150 q 109 -137 109 -138 q 115 -130 110 -136 q 121 -123 119 -125 q 145 -96 126 -117 q 172 -67 164 -76 q 196 -36 180 -58 q 221 3 212 -15 q 242 49 230 21 q 262 108 253 77 q 70 278 140 177 q 0 496 0 380 q 93 745 0 631 q 346 926 186 860 q 694 992 505 992 q 1043 926 884 992 q 1296 745 1203 860 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 767 853 q 716 873 767 853 q 546 893 664 893 q 324 853 427 893 q 160 743 221 812 q 99 595 99 674 q 140 473 99 532 q 256 370 181 414 l 331 327 l 304 262 q 352 292 330 277 l 386 316 l 427 308 q 546 298 488 298 q 767 338 664 298 q 931 447 870 378 q 992 595 992 516 q 931 743 992 674 q 767 853 870 812 m 272 939 q 335 966 272 939 q 546 992 398 992 q 820 939 694 992 q 1018 794 946 886 q 1091 595 1091 703 q 1018 396 1091 488 q 820 252 946 305 q 546 198 694 198 q 409 211 479 198 q 194 112 313 143 q 127 99 166 105 l 125 99 q 109 105 116 99 q 100 122 102 112 q 99 127 99 124 q 100 132 99 129 q 101 136 100 134 q 103 140 102 139 q 106 145 104 142 q 109 148 108 147 q 112 152 110 150 q 115 156 115 155 q 133 175 119 160 q 153 198 147 190 q 171 221 160 206 q 190 250 182 235 q 206 284 198 266 q 55 422 110 340 q 0 595 0 503 q 73 794 0 703 q 272 939 146 886 m 1183 86 q 1199 52 1190 67 q 1218 22 1207 36 q 1235 0 1229 8 q 1256 -23 1242 -9 q 1273 -43 1270 -38 q 1277 -46 1274 -43 q 1280 -50 1279 -49 q 1283 -54 1281 -51 q 1286 -58 1285 -57 q 1288 -62 1287 -60 q 1289 -67 1289 -64 q 1290 -72 1290 -69 q 1289 -77 1290 -74 q 1279 -94 1287 -88 q 1262 -99 1271 -100 q 1195 -87 1223 -94 q 980 12 1076 -56 q 843 0 910 0 q 477 102 633 0 q 546 99 522 99 q 785 134 670 99 q 990 234 900 169 q 1139 398 1087 305 q 1190 595 1190 491 q 1173 713 1190 655 q 1331 575 1273 658 q 1389 397 1389 492 q 1334 223 1389 304 q 1183 86 1279 142 z "},"飪�":{"ha":694,"x_min":1,"x_max":691,"o":"m 686 752 q 691 718 700 736 l 273 -179 q 240 -198 263 -198 q 229 -197 237 -198 q 210 -182 216 -193 q 206 -159 203 -171 l 359 467 l 44 389 q 35 388 41 388 q 11 397 21 388 q 1 427 -3 408 l 157 1066 q 169 1084 160 1077 q 191 1091 178 1091 l 445 1091 q 470 1082 460 1091 q 480 1059 480 1072 q 476 1045 480 1053 l 343 686 l 650 762 q 660 763 656 763 q 686 752 674 763 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 223 l 1389 -25 q 1367 -78 1389 -56 q 1314 -99 1345 -99 l 1066 -99 q 1014 -78 1035 -99 q 992 -25 992 -56 l 992 223 q 1014 276 992 254 q 1066 298 1035 298 l 1141 298 l 1141 446 l 744 446 l 744 298 l 818 298 q 871 276 849 298 q 893 223 893 254 l 893 -25 q 871 -78 893 -56 q 818 -99 849 -99 l 570 -99 q 518 -78 539 -99 q 496 -25 496 -56 l 496 223 q 518 276 496 254 q 570 298 539 298 l 645 298 l 645 446 l 248 446 l 248 298 l 322 298 q 375 276 353 298 q 397 223 397 254 l 397 -25 q 375 -78 397 -56 q 322 -99 353 -99 l 74 -99 q 22 -78 43 -99 q 0 -25 0 -56 l 0 223 q 22 276 0 254 q 74 298 43 298 l 149 298 l 149 446 q 178 516 149 487 q 248 546 208 546 l 645 546 l 645 694 l 570 694 q 518 716 539 694 q 496 769 496 738 l 496 1017 q 518 1070 496 1048 q 570 1091 539 1091 l 818 1091 q 871 1070 849 1091 q 893 1017 893 1048 l 893 769 q 871 716 893 738 q 818 694 849 694 l 744 694 l 744 546 l 1141 546 q 1211 516 1181 546 q 1240 446 1240 487 l 1240 298 l 1314 298 q 1367 276 1345 298 q 1389 223 1389 254 z "},"飪�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 694 549 l 694 99 q 636 -40 694 19 q 496 -99 577 -99 q 357 -40 415 -99 q 298 99 298 19 q 312 134 298 119 q 347 149 327 149 q 382 134 367 149 q 397 99 397 119 q 427 30 397 60 q 496 0 457 0 q 565 30 535 0 q 595 99 595 60 l 595 549 q 645 557 621 557 q 694 549 669 557 m 1290 528 q 1282 510 1290 518 q 1265 503 1275 503 q 1247 511 1256 503 q 1175 564 1209 546 q 1096 582 1141 582 q 997 553 1043 582 q 917 478 950 525 q 903 457 911 470 q 892 438 895 443 q 870 425 884 425 q 848 438 856 425 q 837 457 845 443 q 823 478 829 470 q 744 553 790 525 q 645 582 698 582 q 546 553 592 582 q 467 478 500 525 q 453 457 461 470 q 442 438 445 443 q 419 425 433 425 q 398 438 406 425 q 386 457 395 443 q 373 478 378 470 q 293 553 339 525 q 194 582 246 582 q 115 564 149 582 q 43 511 81 546 q 25 503 33 503 q 7 510 15 503 q 0 528 0 518 q 1 533 0 532 q 134 781 36 675 q 365 939 233 887 q 645 992 498 992 q 858 961 753 992 q 1049 873 962 930 q 1199 728 1135 816 q 1289 533 1263 640 q 1290 528 1290 532 m 694 1091 l 694 1015 q 645 1017 662 1017 q 595 1015 628 1017 l 595 1091 q 610 1126 595 1111 q 645 1141 625 1141 q 680 1126 665 1141 q 694 1091 694 1111 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 595 -99 l 1290 -99 l 1290 397 l 967 397 q 915 419 936 397 q 893 471 893 440 l 893 794 l 595 794 l 595 -99 m 794 1017 l 794 1066 q 786 1084 794 1077 q 769 1091 779 1091 l 223 1091 q 206 1084 213 1091 q 198 1066 198 1077 l 198 1017 q 206 999 198 1007 q 223 992 213 992 l 769 992 q 786 999 779 992 q 794 1017 794 1007 m 992 496 l 1224 496 l 992 728 l 992 496 m 1389 397 l 1389 -124 q 1367 -177 1389 -155 q 1314 -198 1345 -198 l 570 -198 q 518 -177 539 -198 q 496 -124 496 -155 l 496 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 918 1190 q 970 1169 949 1190 q 992 1116 992 1147 l 992 862 q 1020 840 1008 852 l 1336 524 q 1373 465 1358 502 q 1389 397 1389 428 z "},"飪�":{"ha":794,"x_min":0,"x_max":794,"o":"m 570 744 q 563 727 570 734 q 546 719 556 719 q 528 727 536 719 q 521 744 521 734 q 479 799 521 780 q 397 818 437 818 q 379 826 387 818 q 372 843 372 833 q 379 861 372 853 q 397 868 387 868 q 474 856 436 868 q 541 814 512 843 q 570 744 570 784 m 694 744 q 668 848 694 800 q 598 927 641 896 q 503 975 555 957 q 397 992 450 992 q 291 975 343 992 q 196 927 239 957 q 126 848 153 896 q 99 744 99 800 q 152 605 99 666 q 176 579 160 596 q 199 553 191 562 q 308 322 298 435 l 485 322 q 594 553 495 435 q 618 579 602 562 q 642 605 634 596 q 694 744 694 666 m 794 744 q 714 536 794 624 q 656 469 679 498 q 610 395 633 439 q 584 312 587 350 q 620 248 620 290 q 601 198 620 219 q 620 149 620 177 q 585 86 620 109 q 595 50 595 68 q 571 -5 595 14 q 511 -25 546 -25 q 464 -79 495 -59 q 397 -99 433 -99 q 329 -79 360 -99 q 283 -25 298 -59 q 223 -5 247 -25 q 198 50 198 14 q 208 86 198 68 q 174 149 174 109 q 193 198 174 177 q 174 248 174 219 q 210 312 174 290 q 184 395 207 350 q 138 469 160 439 q 80 536 115 498 q 0 744 0 624 q 34 887 0 821 q 125 997 69 953 q 252 1066 181 1041 q 397 1091 323 1091 q 541 1066 470 1091 q 668 997 612 1041 q 759 887 725 953 q 794 744 794 821 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 273 l 1389 124 q 1382 107 1389 114 q 1364 99 1374 99 l 298 99 l 298 -50 q 290 -67 298 -60 q 273 -74 283 -74 q 254 -67 264 -74 l 7 181 q 0 198 0 188 q 7 216 0 209 l 255 464 q 273 471 262 471 q 290 464 283 471 q 298 446 298 457 l 298 298 l 1364 298 q 1382 290 1374 298 q 1389 273 1389 283 m 1382 712 q 1389 694 1389 705 q 1382 677 1389 684 l 1134 429 q 1116 422 1127 422 q 1099 429 1106 422 q 1091 446 1091 436 l 1091 595 l 25 595 q 7 603 15 595 q 0 620 0 610 l 0 769 q 7 786 0 779 q 25 794 15 794 l 1091 794 l 1091 942 q 1098 960 1091 953 q 1116 967 1105 967 q 1135 960 1125 967 l 1382 712 z "},"飪�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 992 471 q 985 489 992 482 q 967 496 978 496 l 794 496 l 794 769 q 786 786 794 779 q 769 794 779 794 l 620 794 q 603 786 610 794 q 595 769 595 779 l 595 496 l 422 496 q 404 489 412 496 q 397 471 397 481 q 404 453 397 460 l 677 181 q 694 174 684 174 q 712 181 705 174 l 984 453 q 992 471 992 462 m 1488 298 q 1401 87 1488 174 q 1190 0 1314 0 l 347 0 q 102 102 204 0 q 0 347 0 204 q 54 533 0 448 q 200 661 109 618 q 198 694 198 684 q 315 975 198 859 q 595 1091 431 1091 q 817 1024 716 1091 q 963 845 917 956 q 1091 893 1018 893 q 1232 835 1173 893 q 1290 694 1290 777 q 1258 587 1290 636 q 1423 482 1359 563 q 1488 298 1488 401 z "},"飪�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 992 521 q 985 539 992 532 l 712 811 q 694 818 705 818 q 677 811 684 818 l 405 539 q 397 521 397 530 q 404 503 397 510 q 422 496 411 496 l 595 496 l 595 223 q 603 206 595 213 q 620 198 610 198 l 769 198 q 786 206 779 198 q 794 223 794 213 l 794 496 l 967 496 q 985 503 977 496 q 992 521 992 511 m 1488 298 q 1401 87 1488 174 q 1190 0 1314 0 l 347 0 q 102 102 204 0 q 0 347 0 204 q 54 533 0 448 q 200 661 109 618 q 198 694 198 684 q 315 975 198 859 q 595 1091 431 1091 q 817 1024 716 1091 q 963 845 917 956 q 1091 893 1018 893 q 1232 835 1173 893 q 1290 694 1290 777 q 1258 587 1290 636 q 1423 482 1359 563 q 1488 298 1488 401 z "},"飪�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 283 184 q 290 176 283 184 q 298 149 298 169 q 283 114 298 129 q 248 99 268 99 q 213 114 228 99 q 198 149 198 129 q 213 184 198 169 q 248 198 228 198 q 283 184 268 198 m 1091 102 q 1035 -46 1091 8 q 884 -99 978 -99 l 207 -99 q 57 -46 113 -99 q 0 102 0 8 q 4 203 0 154 q 23 310 9 252 q 60 413 37 368 q 122 493 82 457 q 215 539 163 528 q 198 446 198 499 l 198 289 q 126 235 153 274 q 99 149 99 196 q 143 43 99 87 q 248 0 186 0 q 353 43 310 0 q 397 149 397 87 q 369 235 397 196 q 298 289 342 274 l 298 446 q 317 519 298 494 q 546 438 419 438 q 774 519 672 438 q 794 446 794 494 l 794 397 q 653 339 711 397 q 595 198 595 281 l 595 129 q 570 74 570 107 q 592 22 570 43 q 645 0 614 0 q 698 22 676 0 q 719 74 719 43 q 694 129 719 107 l 694 198 q 724 268 694 239 q 794 298 753 298 q 863 268 834 298 q 893 198 893 239 l 893 129 q 868 74 868 107 q 890 22 868 43 q 942 0 911 0 q 995 22 973 0 q 1017 74 1017 43 q 992 129 1017 107 l 992 198 q 965 297 992 251 q 893 370 939 343 q 893 403 893 377 q 893 440 894 428 q 891 472 893 452 q 886 508 890 492 q 876 539 882 525 q 969 493 929 528 q 1032 413 1009 457 q 1068 310 1054 368 q 1087 203 1083 252 q 1091 102 1091 154 m 756 1004 q 800 960 756 1004 q 843 794 843 917 q 756 583 843 670 q 546 496 669 496 q 335 583 422 496 q 248 794 248 670 q 335 1004 248 917 q 546 1091 422 1091 q 756 1004 669 1091 z "},"飪�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 977 610 q 985 617 977 610 q 992 645 992 625 q 977 680 992 665 q 942 694 963 694 q 908 680 922 694 q 893 645 893 665 q 908 610 893 625 q 942 595 922 595 q 977 610 963 595 m 1091 645 q 1064 559 1091 597 q 992 505 1036 521 l 992 198 q 890 -12 992 75 q 645 -99 788 -99 q 400 -12 501 -99 q 298 198 298 75 l 298 301 q 85 400 171 316 q 0 595 0 484 l 0 992 q 15 1027 0 1012 q 50 1042 29 1042 q 62 1040 54 1042 q 98 1077 75 1063 q 149 1091 122 1091 q 219 1062 190 1091 q 248 992 248 1033 q 219 922 248 951 q 149 893 190 893 q 99 907 123 893 l 99 595 q 172 455 99 513 q 347 397 245 397 q 522 455 450 397 q 595 595 595 513 l 595 907 q 546 893 571 893 q 475 922 505 893 q 446 992 446 951 q 475 1062 446 1033 q 546 1091 505 1091 q 596 1077 573 1091 q 632 1040 619 1063 q 645 1042 640 1042 q 680 1027 665 1042 q 694 992 694 1012 l 694 595 q 609 400 694 484 q 397 301 524 316 l 397 198 q 470 58 397 116 q 645 0 543 0 q 820 58 747 0 q 893 198 893 116 l 893 505 q 821 559 849 521 q 794 645 794 597 q 837 750 794 707 q 942 794 880 794 q 1048 750 1004 794 q 1091 645 1091 707 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 496 893 l 893 893 l 893 992 l 496 992 l 496 893 m 223 893 l 223 -99 l 174 -99 q 51 -48 102 -99 q 0 74 0 3 l 0 719 q 51 842 0 791 q 174 893 102 893 l 223 893 m 1091 893 l 1091 -99 l 298 -99 l 298 893 l 397 893 l 397 1017 q 419 1070 397 1048 q 471 1091 440 1091 l 918 1091 q 970 1070 949 1091 q 992 1017 992 1048 l 992 893 l 1091 893 m 1389 719 l 1389 74 q 1338 -48 1389 3 q 1215 -99 1287 -99 l 1166 -99 l 1166 893 l 1215 893 q 1338 842 1287 893 q 1389 719 1389 791 z "},"飪�":{"ha":1389,"x_min":50,"x_max":1339,"o":"m 694 -136 q 707 -124 707 -136 q 694 -112 707 -112 q 616 -79 649 -112 q 583 0 583 -46 q 570 12 583 12 q 558 0 558 12 q 598 -96 558 -57 q 694 -136 638 -136 m 1339 99 q 1310 29 1339 59 q 1240 0 1280 0 l 893 0 q 835 -140 893 -82 q 694 -198 777 -198 q 554 -140 612 -198 q 496 0 496 -82 l 149 0 q 79 29 109 0 q 50 99 50 59 q 120 167 88 132 q 186 260 152 203 q 244 383 220 317 q 283 543 267 449 q 298 744 298 636 q 388 963 298 862 q 626 1086 479 1064 q 620 1116 620 1101 q 642 1169 620 1147 q 694 1190 663 1190 q 747 1169 725 1190 q 769 1116 769 1147 q 763 1086 769 1101 q 1001 963 910 1064 q 1091 744 1091 862 q 1106 543 1091 636 q 1145 383 1121 449 q 1203 260 1169 317 q 1269 167 1237 203 q 1339 99 1301 132 z "},"飪�":{"ha":1488,"x_min":0,"x_max":1438,"o":"m 1246 589 q 1268 611 1246 589 q 1290 694 1290 632 q 1246 800 1290 756 q 1141 843 1203 843 l 1091 843 l 1091 546 l 1141 546 q 1246 589 1203 546 m 0 99 l 1389 99 q 1331 -41 1389 17 q 1190 -99 1273 -99 l 198 -99 q 58 -41 116 -99 q 0 99 0 17 m 1351 905 q 1395 861 1351 905 q 1438 694 1438 818 q 1351 484 1438 571 q 1141 397 1264 397 l 1091 397 l 1091 372 q 1040 250 1091 301 q 918 198 989 198 l 372 198 q 250 250 301 198 q 198 372 198 301 l 198 942 q 213 977 198 963 q 248 992 228 992 l 1141 992 q 1351 905 1264 992 z "},"飪�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 496 1141 l 496 645 q 469 559 496 598 q 397 505 441 520 l 397 -99 q 367 -169 397 -140 q 298 -198 338 -198 l 198 -198 q 129 -169 158 -198 q 99 -99 99 -140 l 99 505 q 28 559 55 520 q 0 645 0 598 l 0 1141 q 15 1176 0 1161 q 50 1190 29 1190 q 84 1176 70 1190 q 99 1141 99 1161 l 99 818 q 114 784 99 798 q 149 769 129 769 q 184 784 169 769 q 198 818 198 798 l 198 1141 q 213 1176 198 1161 q 248 1190 228 1190 q 283 1176 268 1190 q 298 1141 298 1161 l 298 818 q 312 784 298 798 q 347 769 327 769 q 382 784 367 769 q 397 818 397 798 l 397 1141 q 412 1176 397 1161 q 446 1190 426 1190 q 481 1176 467 1190 q 496 1141 496 1161 m 1091 1141 l 1091 -99 q 1062 -169 1091 -140 q 992 -198 1032 -198 l 893 -198 q 823 -169 853 -198 q 794 -99 794 -140 l 794 298 l 620 298 q 603 305 610 298 q 595 322 595 312 l 595 942 q 668 1118 595 1045 q 843 1190 741 1190 l 1042 1190 q 1077 1176 1062 1190 q 1091 1141 1091 1161 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 298 570 q 305 588 298 581 q 322 595 312 595 l 868 595 q 886 588 879 595 q 893 570 893 581 l 893 521 q 886 503 893 510 q 868 496 879 496 l 322 496 q 305 503 312 496 q 298 521 298 510 l 298 570 m 868 397 q 886 390 879 397 q 893 372 893 383 l 893 322 q 886 305 893 312 q 868 298 879 298 l 322 298 q 305 305 312 298 q 298 322 298 312 l 298 372 q 305 390 298 383 q 322 397 312 397 l 868 397 m 868 198 q 886 191 879 198 q 893 174 893 184 l 893 124 q 886 106 893 113 q 868 99 879 99 l 322 99 q 305 106 312 99 q 298 124 298 113 l 298 174 q 305 191 298 184 q 322 198 312 198 l 868 198 z "},"飪�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 298 174 l 298 124 q 290 107 298 114 q 273 99 283 99 l 223 99 q 206 107 213 99 q 198 124 198 114 l 198 174 q 206 191 198 184 q 223 198 213 198 l 273 198 q 290 191 283 198 q 298 174 298 184 m 298 372 l 298 322 q 290 305 298 312 q 273 298 283 298 l 223 298 q 206 305 213 298 q 198 322 198 312 l 198 372 q 206 389 198 382 q 223 397 213 397 l 273 397 q 290 389 283 397 q 298 372 298 382 m 496 372 l 496 322 q 489 305 496 312 q 471 298 481 298 l 422 298 q 404 305 412 298 q 397 322 397 312 l 397 372 q 404 389 397 382 q 422 397 412 397 l 471 397 q 489 389 481 397 q 496 372 496 382 m 298 570 l 298 521 q 290 503 298 511 q 273 496 283 496 l 223 496 q 206 503 213 496 q 198 521 198 511 l 198 570 q 206 588 198 581 q 223 595 213 595 l 273 595 q 290 588 283 595 q 298 570 298 581 m 893 174 l 893 124 q 885 107 893 114 q 868 99 878 99 l 818 99 q 801 107 808 99 q 794 124 794 114 l 794 174 q 801 191 794 184 q 818 198 808 198 l 868 198 q 885 191 878 198 q 893 174 893 184 m 694 372 l 694 322 q 687 305 694 312 q 670 298 680 298 l 620 298 q 603 305 610 298 q 595 322 595 312 l 595 372 q 603 389 595 382 q 620 397 610 397 l 670 397 q 687 389 680 397 q 694 372 694 382 m 496 570 l 496 521 q 489 503 496 511 q 471 496 481 496 l 422 496 q 404 503 412 496 q 397 521 397 511 l 397 570 q 404 588 397 581 q 422 595 412 595 l 471 595 q 489 588 481 595 q 496 570 496 581 m 298 769 l 298 719 q 290 702 298 709 q 273 694 283 694 l 223 694 q 206 702 213 694 q 198 719 198 709 l 198 769 q 206 786 198 779 q 223 794 213 794 l 273 794 q 290 786 283 794 q 298 769 298 779 m 893 372 l 893 322 q 885 305 893 312 q 868 298 878 298 l 818 298 q 801 305 808 298 q 794 322 794 312 l 794 372 q 801 389 794 382 q 818 397 808 397 l 868 397 q 885 389 878 397 q 893 372 893 382 m 694 570 l 694 521 q 687 503 694 511 q 670 496 680 496 l 620 496 q 603 503 610 496 q 595 521 595 511 l 595 570 q 603 588 595 581 q 620 595 610 595 l 670 595 q 687 588 680 595 q 694 570 694 581 m 496 769 l 496 719 q 489 702 496 709 q 471 694 481 694 l 422 694 q 404 702 412 694 q 397 719 397 709 l 397 769 q 404 786 397 779 q 422 794 412 794 l 471 794 q 489 786 481 794 q 496 769 496 779 m 298 967 l 298 918 q 290 900 298 908 q 273 893 283 893 l 223 893 q 206 900 213 893 q 198 918 198 908 l 198 967 q 206 985 198 977 q 223 992 213 992 l 273 992 q 290 985 283 992 q 298 967 298 977 m 893 570 l 893 521 q 885 503 893 511 q 868 496 878 496 l 818 496 q 801 503 808 496 q 794 521 794 511 l 794 570 q 801 588 794 581 q 818 595 808 595 l 868 595 q 885 588 878 595 q 893 570 893 581 m 694 769 l 694 719 q 687 702 694 709 q 670 694 680 694 l 620 694 q 603 702 610 694 q 595 719 595 709 l 595 769 q 603 786 595 779 q 620 794 610 794 l 670 794 q 687 786 680 794 q 694 769 694 779 m 496 967 l 496 918 q 489 900 496 908 q 471 893 481 893 l 422 893 q 404 900 412 893 q 397 918 397 908 l 397 967 q 404 985 397 977 q 422 992 412 992 l 471 992 q 489 985 481 992 q 496 967 496 977 m 893 769 l 893 719 q 885 702 893 709 q 868 694 878 694 l 818 694 q 801 702 808 694 q 794 719 794 709 l 794 769 q 801 786 794 779 q 818 794 808 794 l 868 794 q 885 786 878 794 q 893 769 893 779 m 694 967 l 694 918 q 687 900 694 908 q 670 893 680 893 l 620 893 q 603 900 610 893 q 595 918 595 908 l 595 967 q 603 985 595 977 q 620 992 610 992 l 670 992 q 687 985 680 992 q 694 967 694 977 m 893 967 l 893 918 q 885 900 893 908 q 868 893 878 893 l 818 893 q 801 900 808 893 q 794 918 794 908 l 794 967 q 801 985 794 977 q 818 992 808 992 l 868 992 q 885 985 878 992 q 893 967 893 977 m 694 -99 l 992 -99 l 992 1091 l 99 1091 l 99 -99 l 397 -99 l 397 74 q 404 92 397 84 q 422 99 412 99 l 670 99 q 687 92 680 99 q 694 74 694 84 l 694 -99 m 1091 1141 l 1091 -149 q 1077 -184 1091 -169 q 1042 -198 1062 -198 l 50 -198 q 15 -184 29 -198 q 0 -149 0 -169 l 0 1141 q 15 1176 0 1161 q 50 1190 29 1190 l 1042 1190 q 1077 1176 1062 1190 q 1091 1141 1091 1161 z "},"飪�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 298 174 l 298 124 q 290 107 298 114 q 273 99 283 99 l 223 99 q 206 107 213 99 q 198 124 198 114 l 198 174 q 206 191 198 184 q 223 198 213 198 l 273 198 q 290 191 283 198 q 298 174 298 184 m 298 372 l 298 322 q 290 305 298 312 q 273 298 283 298 l 223 298 q 206 305 213 298 q 198 322 198 312 l 198 372 q 206 389 198 382 q 223 397 213 397 l 273 397 q 290 389 283 397 q 298 372 298 382 m 496 372 l 496 322 q 489 305 496 312 q 471 298 481 298 l 422 298 q 404 305 412 298 q 397 322 397 312 l 397 372 q 404 389 397 382 q 422 397 412 397 l 471 397 q 489 389 481 397 q 496 372 496 382 m 298 570 l 298 521 q 290 503 298 511 q 273 496 283 496 l 223 496 q 206 503 213 496 q 198 521 198 511 l 198 570 q 206 588 198 581 q 223 595 213 595 l 273 595 q 290 588 283 595 q 298 570 298 581 m 893 174 l 893 124 q 885 107 893 114 q 868 99 878 99 l 818 99 q 801 107 808 99 q 794 124 794 114 l 794 174 q 801 191 794 184 q 818 198 808 198 l 868 198 q 885 191 878 198 q 893 174 893 184 m 694 372 l 694 322 q 687 305 694 312 q 670 298 680 298 l 620 298 q 603 305 610 298 q 595 322 595 312 l 595 372 q 603 389 595 382 q 620 397 610 397 l 670 397 q 687 389 680 397 q 694 372 694 382 m 496 570 l 496 521 q 489 503 496 511 q 471 496 481 496 l 422 496 q 404 503 412 496 q 397 521 397 511 l 397 570 q 404 588 397 581 q 422 595 412 595 l 471 595 q 489 588 481 595 q 496 570 496 581 m 893 372 l 893 322 q 885 305 893 312 q 868 298 878 298 l 818 298 q 801 305 808 298 q 794 322 794 312 l 794 372 q 801 389 794 382 q 818 397 808 397 l 868 397 q 885 389 878 397 q 893 372 893 382 m 694 570 l 694 521 q 687 503 694 511 q 670 496 680 496 l 620 496 q 603 503 610 496 q 595 521 595 511 l 595 570 q 603 588 595 581 q 620 595 610 595 l 670 595 q 687 588 680 595 q 694 570 694 581 m 893 570 l 893 521 q 885 503 893 511 q 868 496 878 496 l 818 496 q 801 503 808 496 q 794 521 794 511 l 794 570 q 801 588 794 581 q 818 595 808 595 l 868 595 q 885 588 878 595 q 893 570 893 581 m 694 -99 l 992 -99 l 992 794 l 794 794 l 794 769 q 772 716 794 738 q 719 694 750 694 l 372 694 q 319 716 341 694 q 298 769 298 738 l 298 794 l 99 794 l 99 -99 l 397 -99 l 397 74 q 404 92 397 84 q 422 99 412 99 l 670 99 q 687 92 680 99 q 694 74 694 84 l 694 -99 m 694 818 l 694 1066 q 687 1084 694 1077 q 670 1091 680 1091 l 620 1091 q 603 1084 610 1091 q 595 1066 595 1077 l 595 992 l 496 992 l 496 1066 q 489 1084 496 1077 q 471 1091 481 1091 l 422 1091 q 404 1084 412 1091 q 397 1066 397 1077 l 397 818 q 404 801 397 808 q 422 794 412 794 l 471 794 q 489 801 481 794 q 496 818 496 808 l 496 893 l 595 893 l 595 818 q 603 801 595 808 q 620 794 610 794 l 670 794 q 687 801 680 794 q 694 818 694 808 m 1091 843 l 1091 -149 q 1077 -184 1091 -169 q 1042 -198 1062 -198 l 50 -198 q 15 -184 29 -198 q 0 -149 0 -169 l 0 843 q 15 878 0 863 q 50 893 29 893 l 298 893 l 298 1116 q 319 1169 298 1147 q 372 1190 341 1190 l 719 1190 q 772 1169 750 1190 q 794 1116 794 1147 l 794 893 l 1042 893 q 1077 878 1062 893 q 1091 843 1091 863 z "},"飪�":{"ha":1488,"x_min":50,"x_max":1488,"o":"m 467 29 q 481 44 467 29 q 496 99 496 58 q 467 169 496 140 q 397 198 438 198 q 327 169 356 198 q 298 99 298 140 q 327 29 298 58 q 397 0 356 0 q 467 29 438 0 m 198 496 l 496 496 l 496 694 l 374 694 q 357 687 363 693 l 205 536 q 198 519 200 527 l 198 496 m 1161 29 q 1176 44 1161 29 q 1190 99 1190 58 q 1161 169 1190 140 q 1091 198 1132 198 q 1021 169 1050 198 q 992 99 992 140 q 1021 29 992 58 q 1091 0 1050 0 q 1161 29 1132 0 m 1290 620 l 1290 769 q 1283 787 1290 780 q 1265 794 1276 794 l 1091 794 l 1091 967 q 1084 985 1091 978 q 1066 992 1077 992 l 918 992 q 900 985 907 992 q 893 967 893 978 l 893 794 l 719 794 q 701 787 708 794 q 694 769 694 780 l 694 620 q 701 602 694 609 q 719 595 708 595 l 893 595 l 893 422 q 900 404 893 411 q 918 397 907 397 l 1066 397 q 1084 404 1077 397 q 1091 422 1091 411 l 1091 595 l 1265 595 q 1283 602 1276 595 q 1290 620 1290 609 m 1488 1042 l 1488 149 q 1473 114 1488 129 q 1438 99 1459 99 l 1290 99 q 1232 -41 1290 17 q 1091 -99 1173 -99 q 951 -41 1009 -99 q 893 99 893 17 l 595 99 q 537 -41 595 17 q 397 -99 479 -99 q 257 -41 315 -99 q 198 99 198 17 l 99 99 q 64 114 79 99 q 50 149 50 129 q 64 184 50 169 q 99 198 79 198 l 99 521 q 109 566 99 541 q 134 605 119 591 l 288 759 q 327 784 302 773 q 372 794 352 794 l 496 794 l 496 1042 q 511 1077 496 1062 q 546 1091 525 1091 l 1438 1091 q 1473 1077 1459 1091 q 1488 1042 1488 1062 z "},"飪�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 992 322 l 992 471 q 985 489 992 482 q 967 496 978 496 l 794 496 l 794 670 q 787 687 794 680 q 769 694 780 694 l 620 694 q 602 687 609 694 q 595 670 595 680 l 595 496 l 422 496 q 404 489 411 496 q 397 471 397 482 l 397 322 q 404 305 397 312 q 422 298 411 298 l 595 298 l 595 124 q 602 106 595 113 q 620 99 609 99 l 769 99 q 787 106 780 99 q 794 124 794 113 l 794 298 l 967 298 q 985 305 978 298 q 992 322 992 312 m 496 893 l 893 893 l 893 992 l 496 992 l 496 893 m 198 893 l 198 -99 l 174 -99 q 51 -48 102 -99 q 0 74 0 3 l 0 719 q 51 842 0 791 q 174 893 102 893 l 198 893 m 1116 893 l 1116 -99 l 273 -99 l 273 893 l 397 893 l 397 1017 q 419 1070 397 1048 q 471 1091 440 1091 l 918 1091 q 970 1070 949 1091 q 992 1017 992 1048 l 992 893 l 1116 893 m 1389 719 l 1389 74 q 1338 -48 1389 3 q 1215 -99 1287 -99 l 1190 -99 l 1190 893 l 1215 893 q 1338 842 1287 893 q 1389 719 1389 791 z "},"飪�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 1488 446 q 1265 372 1487 422 l 992 347 l 818 298 l 769 298 l 542 25 l 595 25 q 630 21 615 25 q 645 12 645 18 q 630 3 645 7 q 595 0 615 0 l 521 0 l 397 0 l 347 0 l 347 25 l 397 25 l 397 347 l 273 347 l 124 174 l 50 174 l 25 198 l 25 347 l 50 347 l 50 372 l 149 372 l 149 378 l 0 397 l 0 496 l 149 515 l 149 521 l 50 521 l 50 546 l 25 546 l 25 694 l 50 719 l 124 719 l 273 546 l 397 546 l 397 868 l 347 868 l 347 893 l 397 893 l 521 893 l 595 893 q 630 889 615 893 q 645 880 645 886 q 630 872 645 875 q 595 868 615 868 l 542 868 l 769 595 l 818 595 l 992 546 l 1265 521 q 1420 481 1364 499 q 1482 454 1476 462 l 1488 446 z "},"飪�":{"ha":1290,"x_min":50,"x_max":1290,"o":"m 496 496 l 496 794 l 298 794 l 298 595 q 327 525 298 554 q 397 496 356 496 l 496 496 m 1290 149 l 1290 0 l 397 0 l 397 149 l 496 298 l 397 298 q 186 385 274 298 q 99 595 99 472 l 99 843 l 50 893 l 74 992 l 446 992 l 471 1091 l 1215 1091 l 1240 942 l 1190 918 l 1190 298 l 1290 149 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 149 l 992 843 q 977 878 992 863 q 942 893 963 893 l 843 893 q 808 878 823 893 q 794 843 794 863 l 794 595 l 397 595 l 397 843 q 382 878 397 863 q 347 893 367 893 l 248 893 q 213 878 228 893 q 198 843 198 863 l 198 149 q 213 114 198 129 q 248 99 228 99 l 347 99 q 382 114 367 99 q 397 149 397 129 l 397 397 l 794 397 l 794 149 q 808 114 794 129 q 843 99 823 99 l 942 99 q 977 114 963 99 q 992 149 992 129 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飪�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 446 l 992 546 q 977 581 992 566 q 942 595 963 595 l 694 595 l 694 843 q 680 878 694 863 q 645 893 665 893 l 546 893 q 511 878 525 893 q 496 843 496 863 l 496 595 l 248 595 q 213 581 228 595 q 198 546 198 566 l 198 446 q 213 412 198 426 q 248 397 228 397 l 496 397 l 496 149 q 511 114 496 129 q 546 99 525 99 l 645 99 q 680 114 665 99 q 694 149 694 129 l 694 397 l 942 397 q 977 412 963 397 q 992 446 992 426 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飫�":{"ha":794,"x_min":35,"x_max":784,"o":"m 478 142 q 486 124 486 134 q 478 106 486 114 l 439 67 q 422 60 432 60 q 404 67 412 60 l 43 429 q 35 446 35 436 q 43 464 35 457 l 404 825 q 422 833 412 833 q 439 825 432 833 l 478 787 q 486 769 486 779 q 478 751 486 759 l 174 446 l 478 142 m 776 142 q 784 124 784 134 q 776 106 784 114 l 737 67 q 719 60 729 60 q 701 67 709 60 l 340 429 q 332 446 332 436 q 340 464 332 457 l 701 825 q 719 833 709 833 q 737 825 729 833 l 776 787 q 784 769 784 779 q 776 751 784 759 l 471 446 l 776 142 z "},"飫�":{"ha":794,"x_min":10,"x_max":759,"o":"m 453 464 q 461 446 461 457 q 453 429 461 436 l 92 67 q 74 60 84 60 q 57 67 64 60 l 18 106 q 10 124 10 114 q 18 142 10 134 l 322 446 l 18 751 q 10 769 10 759 q 18 787 10 779 l 57 825 q 74 833 64 833 q 92 825 84 833 l 453 464 m 751 464 q 759 446 759 457 q 751 429 759 436 l 390 67 q 372 60 382 60 q 354 67 362 60 l 315 106 q 308 124 308 114 q 315 142 308 134 l 620 446 l 315 751 q 308 769 308 759 q 315 787 308 779 l 354 825 q 372 833 362 833 q 390 825 382 833 l 751 464 z "},"飫�":{"ha":893,"x_min":60,"x_max":833,"o":"m 825 191 q 833 174 833 184 q 825 156 833 164 l 787 117 q 769 109 779 109 q 751 117 759 109 l 446 422 l 142 117 q 124 109 134 109 q 106 117 114 109 l 67 156 q 60 174 60 164 q 67 191 60 184 l 429 553 q 446 560 436 560 q 464 553 457 560 l 825 191 m 825 489 q 833 471 833 481 q 825 453 833 461 l 787 415 q 769 407 779 407 q 751 415 759 407 l 446 719 l 142 415 q 124 407 134 407 q 106 415 114 407 l 67 453 q 60 471 60 461 q 67 489 60 481 l 429 850 q 446 858 436 858 q 464 850 457 858 l 825 489 z "},"飫�":{"ha":893,"x_min":60,"x_max":833,"o":"m 825 539 q 833 521 833 531 q 825 503 833 511 l 464 142 q 446 134 457 134 q 429 142 436 134 l 67 503 q 60 521 60 511 q 67 539 60 531 l 106 577 q 124 585 114 585 q 142 577 134 585 l 446 273 l 751 577 q 769 585 759 585 q 787 577 779 585 l 825 539 m 825 836 q 833 818 833 829 q 825 801 833 808 l 464 439 q 446 432 457 432 q 429 439 436 432 l 67 801 q 60 818 60 808 q 67 836 60 829 l 106 875 q 124 883 114 883 q 142 875 134 883 l 446 570 l 751 875 q 769 883 759 883 q 787 875 779 883 l 825 836 z "},"飫�":{"ha":496,"x_min":35,"x_max":486,"o":"m 478 787 q 486 769 486 779 q 478 751 486 759 l 174 446 l 478 142 q 486 124 486 134 q 478 106 486 114 l 439 67 q 422 60 432 60 q 404 67 412 60 l 43 429 q 35 446 35 436 q 43 464 35 457 l 404 825 q 422 833 412 833 q 439 825 432 833 l 478 787 z "},"飫�":{"ha":496,"x_min":10,"x_max":461,"o":"m 453 464 q 461 446 461 457 q 453 429 461 436 l 92 67 q 74 60 84 60 q 57 67 64 60 l 18 106 q 10 124 10 114 q 18 142 10 134 l 322 446 l 18 751 q 10 769 10 759 q 18 787 10 779 l 57 825 q 74 833 64 833 q 92 825 84 833 l 453 464 z "},"飫�":{"ha":893,"x_min":60,"x_max":833,"o":"m 825 291 q 833 273 833 283 q 825 255 833 263 l 787 216 q 769 208 779 208 q 751 216 759 208 l 446 521 l 142 216 q 124 208 134 208 q 106 216 114 208 l 67 255 q 60 273 60 263 q 67 291 60 283 l 429 652 q 446 660 436 660 q 464 652 457 660 l 825 291 z "},"飫�":{"ha":893,"x_min":60,"x_max":833,"o":"m 825 638 q 833 620 833 630 q 825 602 833 610 l 464 241 q 446 233 457 233 q 429 241 436 233 l 67 602 q 60 620 60 610 q 67 638 60 630 l 106 677 q 124 684 114 684 q 142 677 134 684 l 446 372 l 751 677 q 769 684 759 684 q 787 677 779 684 l 825 638 z "},"飫�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 1389 422 l 1389 1066 q 1382 1084 1389 1077 q 1364 1091 1374 1091 l 124 1091 q 107 1084 114 1091 q 99 1066 99 1077 l 99 422 q 107 404 99 412 q 124 397 114 397 l 1364 397 q 1382 404 1374 397 q 1389 422 1389 412 m 1488 1066 l 1488 223 q 1452 136 1488 172 q 1364 99 1415 99 l 942 99 q 955 39 942 71 q 980 -16 967 8 q 992 -50 992 -40 q 977 -84 992 -70 q 942 -99 963 -99 l 546 -99 q 511 -84 525 -99 q 496 -50 496 -70 q 508 -16 496 -39 q 533 39 521 8 q 546 99 546 70 l 124 99 q 36 136 73 99 q 0 223 0 172 l 0 1066 q 36 1154 0 1118 q 124 1190 73 1190 l 1364 1190 q 1452 1154 1415 1190 q 1488 1066 1488 1118 z "},"飫�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 322 198 q 235 235 271 198 q 198 322 198 271 l 198 868 q 235 956 198 919 q 322 992 271 992 l 1166 992 q 1253 956 1217 992 q 1290 868 1290 919 l 1290 322 q 1253 235 1290 271 q 1166 198 1217 198 l 322 198 m 298 868 l 298 322 q 305 305 298 312 q 322 298 312 298 l 1166 298 q 1183 305 1176 298 q 1190 322 1190 312 l 1190 868 q 1183 885 1190 878 q 1166 893 1176 893 l 322 893 q 305 885 312 893 q 298 868 298 878 m 1364 149 l 1488 149 l 1488 74 q 1452 22 1488 43 q 1364 0 1415 0 l 124 0 q 36 22 73 0 q 0 74 0 43 l 0 149 l 124 149 l 1364 149 m 806 74 q 818 87 818 74 q 806 99 818 99 l 682 99 q 670 87 670 99 q 682 74 670 74 l 806 74 z "},"飫�":{"ha":893,"x_min":0,"x_max":893,"o":"m 481 64 q 489 72 481 64 q 496 99 496 79 q 481 134 496 119 q 446 149 467 149 q 412 134 426 149 q 397 99 397 119 q 412 64 397 79 q 446 50 426 50 q 481 64 467 50 m 794 223 l 794 967 q 786 985 794 977 q 769 992 779 992 l 124 992 q 107 985 114 992 q 99 967 99 977 l 99 223 q 107 206 99 213 q 124 198 114 198 l 769 198 q 786 206 779 198 q 794 223 794 213 m 893 967 l 893 124 q 856 36 893 73 q 769 0 820 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 769 1091 q 856 1055 820 1091 q 893 967 893 1018 z "},"飫�":{"ha":595,"x_min":0,"x_max":595,"o":"m 341 55 q 351 65 341 55 q 360 99 360 74 q 341 143 360 125 q 298 161 323 161 q 254 143 272 161 q 236 99 236 125 q 254 55 236 74 q 298 37 272 37 q 341 55 323 37 m 521 223 l 521 769 q 513 786 521 779 q 496 794 506 794 l 99 794 q 82 786 89 794 q 74 769 74 779 l 74 223 q 82 206 74 213 q 99 198 89 198 l 496 198 q 513 206 506 198 q 521 223 521 213 m 360 868 q 372 880 372 868 q 360 893 372 893 l 236 893 q 223 880 223 893 q 236 868 223 868 l 360 868 m 595 893 l 595 99 q 566 29 595 59 q 496 0 536 0 l 99 0 q 29 29 59 0 q 0 99 0 59 l 0 893 q 29 963 0 933 q 99 992 59 992 l 496 992 q 566 963 536 992 q 595 893 595 933 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 807 861 q 758 889 807 861 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 595 446 l 595 149 q 552 43 595 87 q 446 0 508 0 l 149 0 q 43 43 87 0 q 0 149 0 87 l 0 694 q 31 848 0 775 q 116 975 63 922 q 243 1060 170 1028 q 397 1091 316 1091 l 446 1091 q 481 1077 467 1091 q 496 1042 496 1062 l 496 942 q 481 908 496 922 q 446 893 467 893 l 397 893 q 257 835 315 893 q 198 694 198 777 l 198 670 q 220 617 198 639 q 273 595 242 595 l 446 595 q 552 552 508 595 q 595 446 595 508 m 1290 446 l 1290 149 q 1246 43 1290 87 q 1141 0 1203 0 l 843 0 q 738 43 781 0 q 694 149 694 87 l 694 694 q 726 848 694 775 q 811 975 757 922 q 937 1060 864 1028 q 1091 1091 1011 1091 l 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 l 1190 942 q 1176 908 1190 922 q 1141 893 1161 893 l 1091 893 q 951 835 1009 893 q 893 694 893 777 l 893 670 q 915 617 893 639 q 967 595 936 595 l 1141 595 q 1246 552 1203 595 q 1290 446 1290 508 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 595 942 l 595 397 q 564 243 595 316 q 479 116 532 170 q 352 31 426 63 q 198 0 279 0 l 149 0 q 114 15 129 0 q 99 50 99 29 l 99 149 q 114 184 99 169 q 149 198 129 198 l 198 198 q 339 257 281 198 q 397 397 397 315 l 397 422 q 375 474 397 453 q 322 496 353 496 l 149 496 q 43 539 87 496 q 0 645 0 583 l 0 942 q 43 1048 0 1004 q 149 1091 87 1091 l 446 1091 q 552 1048 508 1091 q 595 942 595 1004 m 1290 942 l 1290 397 q 1258 243 1290 316 q 1173 116 1227 170 q 1047 31 1120 63 q 893 0 973 0 l 843 0 q 808 15 823 0 q 794 50 794 29 l 794 149 q 808 184 794 169 q 843 198 823 198 l 893 198 q 1033 257 975 198 q 1091 397 1091 315 l 1091 422 q 1070 474 1091 453 q 1017 496 1048 496 l 843 496 q 738 539 781 496 q 694 645 694 583 l 694 942 q 738 1048 694 1004 q 843 1091 781 1091 l 1141 1091 q 1246 1048 1203 1091 q 1290 942 1290 1004 z "},"飫�":{"ha":1389,"x_min":50,"x_max":1339,"o":"m 379 180 q 393 166 379 180 q 408 110 408 151 q 379 40 408 69 q 308 11 350 11 q 239 40 268 11 q 209 110 209 70 q 238 180 209 151 q 308 209 267 209 q 379 180 350 209 m 765 21 q 779 6 765 21 q 794 -50 794 -9 q 765 -120 794 -91 q 694 -149 736 -149 q 624 -120 653 -149 q 595 -50 595 -91 q 624 21 595 -9 q 694 50 653 50 q 765 21 736 50 m 219 566 q 233 552 219 566 q 248 496 248 537 q 219 426 248 455 q 149 397 190 397 q 79 426 108 397 q 50 496 50 455 q 79 566 50 537 q 149 595 108 595 q 219 566 190 595 m 1180 110 q 1150 40 1180 70 q 1080 11 1121 11 q 1010 40 1039 11 q 981 110 981 69 q 1010 180 981 151 q 1080 209 1039 209 q 1151 180 1121 209 q 1180 110 1180 151 m 396 970 q 414 951 396 970 q 432 882 432 933 q 396 794 432 831 q 308 758 360 758 q 221 794 257 758 q 184 882 184 831 q 221 970 184 933 q 308 1006 257 1006 q 396 970 360 1006 m 1310 566 q 1325 552 1310 566 q 1339 496 1339 537 q 1310 426 1339 455 q 1240 397 1281 397 q 1170 426 1199 397 q 1141 496 1141 455 q 1170 566 1141 537 q 1240 595 1199 595 q 1310 566 1281 595 m 800 1147 q 822 1125 800 1147 q 843 1042 843 1104 q 800 936 843 980 q 694 893 756 893 q 589 936 632 893 q 546 1042 546 980 q 589 1147 546 1104 q 694 1190 632 1190 q 800 1147 756 1190 m 1254 882 q 1203 759 1254 810 q 1080 708 1152 708 q 958 759 1008 708 q 907 882 907 810 q 958 1004 907 953 q 1080 1056 1008 1056 q 1203 1004 1152 1056 q 1254 882 1254 953 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 322 q 1290 -27 1389 194 q 1282 -46 1288 -33 q 1272 -69 1277 -59 q 1262 -86 1267 -79 q 1240 -99 1252 -99 q 1222 -91 1228 -99 q 1215 -72 1215 -84 q 1217 -52 1215 -65 q 1219 -33 1219 -38 q 1223 62 1223 19 q 1209 202 1223 140 q 1172 310 1196 264 q 1110 388 1148 355 q 1028 442 1072 421 q 925 475 984 463 q 806 491 866 487 q 670 496 746 496 l 496 496 l 496 298 q 481 263 496 277 q 446 248 467 248 q 412 263 426 248 l 15 660 q 0 694 0 674 q 15 729 0 715 l 412 1126 q 446 1141 426 1141 q 481 1126 467 1141 q 496 1091 496 1111 l 496 893 l 670 893 q 1348 581 1222 893 q 1389 322 1389 477 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 486 312 q 491 295 486 312 q 496 248 496 279 q 486 184 496 217 q 453 126 477 152 q 397 99 429 99 q 341 126 364 99 q 307 184 317 152 q 298 248 298 217 q 307 312 298 279 q 341 370 317 344 q 397 397 364 397 q 453 370 429 397 q 486 312 477 344 m 982 312 q 987 295 982 312 q 992 248 992 279 q 982 184 992 217 q 949 126 973 152 q 893 99 925 99 q 837 126 860 99 q 803 184 813 152 q 794 248 794 217 q 803 312 794 279 q 837 370 813 344 q 893 397 860 397 q 949 370 925 397 q 982 312 973 344 m 1116 248 q 1063 406 1116 341 q 918 471 1009 471 q 767 455 886 471 q 645 446 711 446 q 523 455 578 446 q 372 471 405 471 q 227 406 281 471 q 174 248 174 341 q 198 129 174 180 q 261 49 223 78 q 356 3 299 20 q 464 -20 412 -15 q 580 -26 516 -26 l 710 -26 q 825 -20 773 -26 q 934 3 877 -15 q 1028 49 991 20 q 1091 129 1066 78 q 1116 248 1116 180 m 1290 384 q 1242 128 1290 224 q 1161 25 1213 68 q 1051 -42 1108 -19 q 920 -79 994 -65 q 787 -96 845 -92 q 657 -99 729 -99 q 547 -97 597 -99 q 433 -87 498 -95 q 315 -64 368 -80 q 208 -24 261 -48 q 115 39 156 0 q 48 128 74 78 q 0 384 0 223 q 105 691 0 568 q 84 823 84 755 q 124 992 84 913 q 271 961 208 992 q 418 866 335 931 q 657 893 532 893 q 874 868 772 893 q 1019 962 956 932 q 1166 992 1083 992 q 1205 823 1205 913 q 1184 693 1205 756 q 1290 384 1290 569 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1190 174 l 1190 719 q 1169 772 1190 750 q 1116 794 1147 794 l 570 794 q 518 815 539 794 q 496 868 496 837 l 496 918 q 474 970 496 949 q 422 992 453 992 l 174 992 q 121 970 143 992 q 99 918 99 949 l 99 174 q 121 121 99 143 q 174 99 143 99 l 1116 99 q 1169 121 1147 99 q 1190 174 1190 143 m 1290 719 l 1290 174 q 1239 51 1290 102 q 1116 0 1187 0 l 174 0 q 51 51 102 0 q 0 174 0 102 l 0 918 q 51 1040 0 989 q 174 1091 102 1091 l 422 1091 q 544 1040 493 1091 q 595 918 595 989 l 595 893 l 1116 893 q 1239 842 1187 893 q 1290 719 1290 791 z "},"飫�":{"ha":1488,"x_min":0,"x_max":1480,"o":"m 1380 469 q 1339 496 1380 496 l 496 496 q 430 479 465 496 q 374 439 395 463 l 146 157 q 133 126 133 139 q 174 99 133 99 l 1017 99 q 1084 116 1048 99 q 1139 157 1119 133 l 1366 439 q 1380 469 1380 456 m 496 595 l 1091 595 l 1091 719 q 1070 772 1091 750 q 1017 794 1048 794 l 570 794 q 518 815 539 794 q 496 868 496 837 l 496 918 q 474 970 496 949 q 422 992 453 992 l 174 992 q 121 970 143 992 q 99 918 99 949 l 99 257 l 298 501 q 388 568 332 542 q 496 595 443 595 m 1480 469 q 1444 376 1480 421 l 1215 95 q 1125 27 1182 53 q 1017 0 1069 0 l 174 0 q 51 51 102 0 q 0 174 0 102 l 0 918 q 51 1040 0 989 q 174 1091 102 1091 l 422 1091 q 544 1040 493 1091 q 595 918 595 989 l 595 893 l 1017 893 q 1139 842 1088 893 q 1190 719 1190 791 l 1190 595 l 1339 595 q 1416 576 1381 595 q 1468 522 1451 557 q 1480 469 1480 497 z "},"飫�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飫�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 879 357 q 772 206 850 264 q 595 149 694 149 q 419 206 497 149 q 312 357 340 264 q 315 395 305 377 q 344 419 324 413 q 382 416 363 426 q 406 387 400 407 q 478 286 426 325 q 595 248 530 248 q 713 286 660 248 q 784 387 765 325 q 809 416 791 407 q 847 419 828 426 q 876 395 867 413 q 879 357 885 377 m 467 765 q 481 750 467 765 q 496 694 496 736 q 467 624 496 653 q 397 595 438 595 q 327 624 356 595 q 298 694 298 653 q 327 765 298 736 q 397 794 356 794 q 467 765 438 794 m 864 765 q 878 750 864 765 q 893 694 893 736 q 864 624 893 653 q 794 595 835 595 q 724 624 753 595 q 694 694 694 653 q 724 765 694 736 q 794 794 753 794 q 864 765 835 794 m 1052 303 q 1072 349 1052 303 q 1091 496 1091 395 q 1052 689 1091 597 q 946 847 1012 780 q 788 953 880 913 q 595 992 696 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 788 40 696 0 q 946 145 880 79 q 1052 303 1012 212 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 879 238 q 876 200 885 219 q 847 176 867 182 q 809 179 828 170 q 784 208 791 188 q 713 309 765 270 q 595 347 660 347 q 478 309 530 347 q 406 208 426 270 q 382 179 400 188 q 344 176 363 170 q 315 200 324 182 q 312 238 305 219 q 419 389 340 332 q 595 446 497 446 q 772 389 694 446 q 879 238 850 332 m 467 765 q 481 750 467 765 q 496 694 496 736 q 467 624 496 653 q 397 595 438 595 q 327 624 356 595 q 298 694 298 653 q 327 765 298 736 q 397 794 356 794 q 467 765 438 794 m 864 765 q 878 750 864 765 q 893 694 893 736 q 864 624 893 653 q 794 595 835 595 q 724 624 753 595 q 694 694 694 653 q 724 765 694 736 q 794 794 753 794 q 864 765 835 794 m 1052 303 q 1072 349 1052 303 q 1091 496 1091 395 q 1052 689 1091 597 q 946 847 1012 780 q 788 953 880 913 q 595 992 696 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 788 40 696 0 q 946 145 880 79 q 1052 303 1012 212 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 878 382 q 885 375 878 382 q 893 347 893 367 q 878 312 893 327 q 843 298 863 298 l 347 298 q 312 312 327 298 q 298 347 298 327 q 312 382 298 367 q 347 397 327 397 l 843 397 q 878 382 863 397 m 467 765 q 481 750 467 765 q 496 694 496 736 q 467 624 496 653 q 397 595 438 595 q 327 624 356 595 q 298 694 298 653 q 327 765 298 736 q 397 794 356 794 q 467 765 438 794 m 864 765 q 878 750 864 765 q 893 694 893 736 q 864 624 893 653 q 794 595 835 595 q 724 624 753 595 q 694 694 694 653 q 724 765 694 736 q 794 794 753 794 q 864 765 835 794 m 1052 303 q 1072 349 1052 303 q 1091 496 1091 395 q 1052 689 1091 597 q 946 847 1012 780 q 788 953 880 913 q 595 992 696 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 788 40 696 0 q 946 145 880 79 q 1052 303 1012 212 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 645 347 l 645 446 q 638 464 645 457 q 620 471 631 471 l 471 471 l 471 620 q 464 638 471 631 q 446 645 457 645 l 347 645 q 329 638 336 645 q 322 620 322 631 l 322 471 l 174 471 q 156 464 163 471 q 149 446 149 457 l 149 347 q 156 329 149 336 q 174 322 163 322 l 322 322 l 322 174 q 329 156 322 163 q 347 149 336 149 l 446 149 q 464 156 457 149 q 471 174 471 163 l 471 322 l 620 322 q 638 329 631 322 q 645 347 645 336 m 1062 227 q 1077 242 1062 227 q 1091 298 1091 257 q 1062 368 1091 339 q 992 397 1033 397 q 922 368 951 397 q 893 298 893 339 q 922 227 893 257 q 992 198 951 198 q 1062 227 1033 198 m 1261 426 q 1275 440 1261 426 q 1290 496 1290 455 q 1261 566 1290 537 q 1190 595 1232 595 q 1120 566 1149 595 q 1091 496 1091 537 q 1120 426 1091 455 q 1190 397 1149 397 q 1261 426 1232 397 m 1372 677 q 1430 619 1372 677 q 1488 397 1488 561 q 1372 116 1488 233 q 1091 0 1256 0 q 829 99 942 0 l 659 99 q 397 0 546 0 q 116 116 233 0 q 0 397 0 233 q 116 677 0 561 q 397 794 233 794 l 1091 794 q 1372 677 1256 794 z "},"飫�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 298 285 l 298 211 q 285 198 298 198 l 211 198 q 198 211 198 198 l 198 285 q 211 298 198 298 l 285 298 q 298 285 298 298 m 397 484 l 397 409 q 384 397 397 397 l 211 397 q 198 409 198 397 l 198 484 q 211 496 198 496 l 384 496 q 397 484 397 496 m 298 682 l 298 608 q 285 595 298 595 l 211 595 q 198 608 198 595 l 198 682 q 211 694 198 694 l 285 694 q 298 682 298 694 m 1091 285 l 1091 211 q 1079 198 1091 198 l 409 198 q 397 211 397 198 l 397 285 q 409 298 397 298 l 1079 298 q 1091 285 1091 298 m 595 484 l 595 409 q 583 397 595 397 l 508 397 q 496 409 496 397 l 496 484 q 508 496 496 496 l 583 496 q 595 484 595 496 m 496 682 l 496 608 q 484 595 496 595 l 409 595 q 397 608 397 595 l 397 682 q 409 694 397 694 l 484 694 q 496 682 496 694 m 794 484 l 794 409 q 781 397 794 397 l 707 397 q 694 409 694 397 l 694 484 q 707 496 694 496 l 781 496 q 794 484 794 496 m 694 682 l 694 608 q 682 595 694 595 l 608 595 q 595 608 595 595 l 595 682 q 608 694 595 694 l 682 694 q 694 682 694 694 m 992 484 l 992 409 q 980 397 992 397 l 905 397 q 893 409 893 397 l 893 484 q 905 496 893 496 l 980 496 q 992 484 992 496 m 1290 285 l 1290 211 q 1277 198 1290 198 l 1203 198 q 1190 211 1190 198 l 1190 285 q 1203 298 1190 298 l 1277 298 q 1290 285 1290 298 m 893 682 l 893 608 q 880 595 893 595 l 806 595 q 794 608 794 595 l 794 682 q 806 694 794 694 l 880 694 q 893 682 893 694 m 1091 682 l 1091 608 q 1079 595 1091 595 l 1004 595 q 992 608 992 595 l 992 682 q 1004 694 992 694 l 1079 694 q 1091 682 1091 694 m 1290 682 l 1290 409 q 1277 397 1290 397 l 1104 397 q 1091 409 1091 397 l 1091 484 q 1104 496 1091 496 l 1190 496 l 1190 682 q 1203 694 1190 694 l 1277 694 q 1290 682 1290 694 m 1389 99 l 1389 794 l 99 794 l 99 99 l 1389 99 m 1488 794 l 1488 99 q 1459 29 1488 58 q 1389 0 1430 0 l 99 0 q 29 29 58 0 q 0 99 0 58 l 0 794 q 29 864 0 835 q 99 893 58 893 l 1389 893 q 1459 864 1430 893 q 1488 794 1488 835 z "},"飫�":{"ha":1389,"x_min":50,"x_max":1389,"o":"m 1290 381 l 1290 858 q 1053 787 1159 787 q 940 812 989 787 q 798 872 863 850 q 660 893 732 893 q 347 794 525 893 l 347 330 q 683 418 537 418 q 763 412 725 418 q 839 392 801 406 q 899 368 877 377 q 963 337 920 358 l 984 326 q 1063 309 1018 309 q 1290 381 1156 309 m 248 992 q 234 942 248 965 q 198 907 221 920 l 198 -74 q 191 -92 198 -85 q 174 -99 184 -99 l 124 -99 q 106 -92 113 -99 q 99 -74 99 -85 l 99 907 q 63 942 77 920 q 50 992 50 965 q 79 1062 50 1033 q 149 1091 108 1091 q 219 1062 190 1091 q 248 992 248 1033 m 1389 942 l 1389 351 q 1362 307 1389 321 q 1349 300 1354 303 q 1063 210 1180 210 q 940 237 994 210 l 918 248 q 842 285 869 274 q 771 308 815 297 q 683 319 728 319 q 500 284 604 319 q 323 205 397 250 q 298 198 312 198 q 273 205 285 198 q 248 248 248 219 l 248 823 q 272 866 248 850 q 333 899 299 882 q 421 939 367 915 q 539 977 476 963 q 660 992 603 992 q 822 968 746 992 q 984 901 897 944 q 1053 887 1013 887 q 1293 973 1147 887 q 1317 987 1310 983 q 1365 985 1341 999 q 1389 942 1389 970 z "},"飫�":{"ha":1389,"x_min":50,"x_max":1389,"o":"m 645 415 l 645 564 q 347 474 505 552 l 347 330 q 645 415 506 405 m 645 739 l 645 892 q 347 794 512 886 l 347 648 q 645 739 514 734 m 1290 381 l 1290 523 q 992 468 1108 433 l 992 642 q 962 653 977 646 q 936 667 958 656 q 910 680 915 677 q 885 691 904 682 q 858 703 866 701 q 833 713 851 706 q 805 723 815 721 q 778 730 795 725 q 748 736 761 734 q 717 739 734 737 q 683 740 700 740 q 645 738 665 740 l 645 566 l 660 566 q 809 543 739 566 q 962 480 879 521 q 992 468 977 473 l 992 322 q 1063 309 1025 309 q 1290 381 1156 309 m 1290 711 l 1290 858 q 1053 787 1159 787 q 992 794 1018 787 l 992 642 q 1290 711 1107 609 m 248 992 q 234 942 248 965 q 198 907 221 920 l 198 -74 q 191 -92 198 -85 q 174 -99 184 -99 l 124 -99 q 106 -92 113 -99 q 99 -74 99 -85 l 99 907 q 63 942 77 920 q 50 992 50 965 q 79 1062 50 1033 q 149 1091 108 1091 q 219 1062 190 1091 q 248 992 248 1033 m 1389 942 l 1389 351 q 1362 307 1389 321 q 1349 300 1354 303 q 1063 210 1180 210 q 940 237 994 210 l 918 248 q 842 285 869 274 q 771 308 815 297 q 683 319 728 319 q 500 284 604 319 q 323 205 397 250 q 298 198 312 198 q 273 205 285 198 q 248 248 248 219 l 248 823 q 272 866 248 850 q 333 899 299 882 q 421 939 367 915 q 539 977 476 963 q 660 992 603 992 q 822 968 746 992 q 984 901 897 944 q 1053 887 1013 887 q 1293 973 1147 887 q 1317 987 1310 983 q 1365 985 1341 999 q 1389 942 1389 970 z "},"飫�":{"ha":1290,"x_min":10,"x_max":1290,"o":"m 453 429 l 92 67 q 74 60 84 60 q 57 67 64 60 l 18 106 q 10 124 10 114 q 18 142 10 134 l 322 446 l 18 751 q 10 769 10 759 q 18 787 10 779 l 57 825 q 74 833 64 833 q 92 825 84 833 l 453 464 q 461 446 461 457 q 453 429 461 436 m 1290 74 l 1290 25 q 1283 7 1290 14 q 1265 0 1276 0 l 521 0 q 503 7 510 0 q 496 25 496 14 l 496 74 q 503 92 496 85 q 521 99 510 99 l 1265 99 q 1283 92 1276 99 q 1290 74 1290 85 z "},"飫�":{"ha":1488,"x_min":35,"x_max":1453,"o":"m 478 106 l 439 67 q 422 60 432 60 q 404 67 412 60 l 43 429 q 35 446 35 436 q 43 464 35 457 l 404 825 q 422 833 412 833 q 439 825 432 833 l 478 787 q 486 769 486 779 q 478 751 486 759 l 174 446 l 478 142 q 486 124 486 134 q 478 106 486 114 m 936 933 l 647 -67 q 635 -83 644 -78 q 617 -84 626 -88 l 569 -71 q 554 -59 559 -68 q 552 -40 549 -50 l 841 960 q 853 975 844 970 q 871 977 862 980 l 919 964 q 934 952 929 961 q 936 933 939 943 m 1445 429 l 1084 67 q 1066 60 1077 60 q 1049 67 1056 60 l 1010 106 q 1002 124 1002 114 q 1010 142 1002 134 l 1314 446 l 1010 751 q 1002 769 1002 759 q 1010 787 1002 779 l 1049 825 q 1066 833 1056 833 q 1084 825 1077 833 l 1445 464 q 1453 446 1453 457 q 1445 429 1453 436 z "},"飫�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 496 352 l 496 298 q 466 252 496 265 q 446 248 456 248 q 412 263 426 248 l 15 660 q 0 694 0 674 q 15 729 0 715 l 412 1126 q 466 1137 434 1150 q 496 1091 496 1124 l 496 1038 l 188 729 q 174 694 174 715 q 188 660 174 674 l 496 352 m 1389 322 q 1376 219 1389 277 q 1346 112 1363 160 q 1309 15 1329 64 q 1277 -55 1288 -33 q 1262 -86 1266 -77 q 1240 -99 1256 -99 q 1233 -98 1235 -99 q 1215 -72 1214 -92 q 1133 366 1249 238 q 1001 451 1084 421 q 794 492 918 482 l 794 298 q 763 252 794 265 q 744 248 753 248 q 709 263 723 248 l 312 660 q 298 694 298 674 q 312 729 298 715 l 709 1126 q 763 1137 732 1150 q 794 1091 794 1124 l 794 888 q 1258 717 1112 867 q 1389 322 1389 583 z "},"飫�":{"ha":1290,"x_min":2,"x_max":1288,"o":"m 919 449 l 1118 643 l 842 683 l 791 691 l 768 737 l 645 987 l 645 240 l 691 216 l 937 86 l 891 361 l 881 412 l 919 449 m 1270 652 l 988 377 l 1055 -10 q 1050 -50 1059 -36 q 1024 -64 1042 -64 q 993 -55 1011 -64 l 645 128 l 297 -55 q 266 -64 279 -64 q 239 -50 248 -64 q 235 -10 231 -36 l 301 377 l 19 652 q 2 698 -5 677 q 43 725 9 719 l 432 781 l 607 1134 q 645 1166 622 1166 q 683 1134 667 1166 l 857 781 l 1246 725 q 1288 698 1281 719 q 1270 652 1295 677 z "},"飫�":{"ha":1091,"x_min":2,"x_max":1091,"o":"m 1086 920 l 590 -72 q 546 -99 577 -99 q 534 -98 542 -99 q 506 -80 517 -94 q 496 -50 496 -67 l 496 397 l 50 397 q 19 407 33 397 q 2 435 5 418 q 5 467 -2 452 q 27 491 12 483 l 1019 987 q 1042 992 1029 992 q 1077 977 1063 992 q 1091 951 1088 966 q 1086 920 1094 935 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 432 198 l 893 198 l 893 660 l 432 198 m 397 233 l 858 694 l 397 694 l 397 233 m 1290 174 l 1290 25 q 1283 7 1290 14 q 1265 0 1276 0 l 1091 0 l 1091 -174 q 1084 -191 1091 -184 q 1066 -198 1077 -198 l 918 -198 q 900 -191 907 -198 q 893 -174 893 -184 l 893 0 l 223 0 q 205 7 212 0 q 198 25 198 14 l 198 694 l 25 694 q 7 701 14 694 q 0 719 0 708 l 0 868 q 7 886 0 879 q 25 893 14 893 l 198 893 l 198 1066 q 205 1084 198 1077 q 223 1091 212 1091 l 372 1091 q 390 1084 383 1091 q 397 1066 397 1077 l 397 893 l 1056 893 l 1247 1084 q 1265 1091 1255 1091 q 1283 1084 1275 1091 q 1290 1066 1290 1077 q 1283 1049 1290 1056 l 1091 858 l 1091 198 l 1265 198 q 1283 191 1276 198 q 1290 174 1290 184 z "},"飫�":{"ha":794,"x_min":0,"x_max":794,"o":"m 202 -3 q 212 8 202 -3 q 223 50 223 19 q 202 102 223 81 q 149 124 180 124 q 96 102 118 124 q 74 50 74 81 q 96 -3 74 19 q 149 -25 118 -25 q 202 -3 180 -25 m 202 890 q 212 901 202 890 q 223 942 223 911 q 202 995 223 973 q 149 1017 180 1017 q 96 995 118 1017 q 74 942 74 973 q 96 890 74 911 q 149 868 118 868 q 202 890 180 868 m 698 791 q 708 801 698 791 q 719 843 719 812 q 698 896 719 874 q 645 918 676 918 q 592 896 614 918 q 570 843 570 874 q 592 791 570 812 q 645 769 614 769 q 698 791 676 769 m 794 843 q 773 768 794 803 q 719 715 753 734 q 544 394 718 492 q 387 331 492 364 q 255 276 288 300 q 223 198 223 252 l 223 178 q 277 124 257 159 q 298 50 298 90 q 254 -56 298 -12 q 149 -99 211 -99 q 43 -56 87 -99 q 0 50 0 -12 q 20 124 0 90 q 74 178 40 159 l 74 814 q 20 868 40 833 q 0 942 0 902 q 43 1048 0 1004 q 149 1091 87 1091 q 254 1048 211 1091 q 298 942 298 1004 q 277 868 298 902 q 223 814 257 833 l 223 429 q 343 473 265 449 q 410 496 385 486 q 465 520 436 505 q 511 550 494 534 q 542 590 527 567 q 564 644 557 613 q 570 715 570 674 q 516 768 536 734 q 496 843 496 803 q 539 949 496 905 q 645 992 583 992 q 750 949 707 992 q 794 843 794 905 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 340 205 l 142 7 q 124 0 133 0 q 106 7 115 0 q 99 25 99 15 q 106 43 99 35 l 305 241 q 322 248 312 248 q 340 241 332 248 q 347 223 347 233 q 340 205 347 213 m 471 174 l 471 -74 q 464 -92 471 -85 q 446 -99 457 -99 q 429 -92 436 -99 q 422 -74 422 -85 l 422 174 q 429 191 422 184 q 446 198 436 198 q 464 191 457 198 q 471 174 471 184 m 291 365 q 294 362 291 365 q 298 347 298 358 q 291 329 298 336 q 273 322 284 322 l 25 322 q 7 329 14 322 q 0 347 0 336 q 7 365 0 358 q 25 372 14 372 l 273 372 q 291 365 284 372 m 1277 248 q 1211 91 1277 155 l 1097 -22 q 940 -87 1033 -87 q 782 -21 846 -87 l 523 239 q 491 282 507 255 l 676 296 l 887 84 q 940 62 908 63 q 993 83 972 62 l 1107 196 q 1128 248 1128 218 q 1107 301 1128 279 l 894 514 l 908 699 q 952 667 935 683 l 1212 406 q 1277 248 1277 339 m 799 809 l 614 795 l 402 1008 q 350 1029 381 1029 q 297 1008 319 1029 l 183 895 q 161 843 161 873 q 183 791 161 812 l 395 578 l 381 392 q 338 425 354 408 l 78 685 q 12 843 12 752 q 78 1001 12 936 l 192 1114 q 350 1178 257 1178 q 508 1112 443 1178 l 767 853 q 799 809 783 836 m 1283 762 q 1286 758 1283 762 q 1290 744 1290 755 q 1283 726 1290 733 q 1265 719 1276 719 l 1017 719 q 999 726 1006 719 q 992 744 992 733 q 999 762 992 755 q 1017 769 1006 769 l 1265 769 q 1283 762 1276 769 m 868 1166 l 868 918 q 861 900 868 907 q 843 893 854 893 q 825 900 832 893 q 818 918 818 907 l 818 1166 q 825 1184 818 1177 q 843 1190 832 1190 q 861 1184 854 1190 q 868 1166 868 1177 m 1184 1049 l 985 850 q 967 843 977 843 q 949 850 958 843 q 942 868 942 858 q 949 886 942 878 l 1148 1084 q 1166 1091 1156 1091 q 1184 1084 1176 1091 q 1190 1066 1190 1077 q 1184 1049 1190 1056 z "},"飫�":{"ha":794,"x_min":74,"x_max":791,"o":"m 546 217 l 546 31 q 536 9 546 19 q 515 0 527 0 l 329 0 q 307 9 316 0 q 298 31 298 19 l 298 217 q 307 239 298 229 q 329 248 316 248 l 515 248 q 536 239 527 248 q 546 217 546 229 m 791 682 q 779 604 791 640 q 751 544 767 567 q 709 498 736 522 q 664 465 681 475 q 617 437 647 454 q 564 387 585 419 q 543 335 543 354 q 533 310 543 322 q 512 298 524 298 l 326 298 q 306 312 314 298 q 298 341 298 326 l 298 376 q 348 497 298 440 q 459 581 398 554 q 524 625 505 602 q 543 684 543 647 q 507 741 543 716 q 424 766 471 766 q 340 743 374 766 q 257 654 313 724 q 233 642 247 642 q 214 648 224 642 l 87 745 q 75 764 77 753 q 79 786 73 776 q 439 992 203 992 q 563 968 501 992 q 677 904 626 944 q 759 805 727 863 q 791 682 791 746 z "},"飫�":{"ha":496,"x_min":0,"x_max":496,"o":"m 496 149 l 496 50 q 481 15 496 29 q 446 0 467 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 149 q 15 184 0 169 q 50 198 29 198 l 99 198 l 99 496 l 50 496 q 15 511 29 496 q 0 546 0 525 l 0 645 q 15 680 0 665 q 50 694 29 694 l 347 694 q 382 680 367 694 q 397 645 397 665 l 397 198 l 446 198 q 481 184 467 198 q 496 149 496 169 m 397 1042 l 397 893 q 382 858 397 873 q 347 843 367 843 l 149 843 q 114 858 129 843 q 99 893 99 873 l 99 1042 q 114 1077 99 1062 q 149 1091 129 1091 l 347 1091 q 382 1077 367 1091 q 397 1042 397 1062 z "},"飫�":{"ha":496,"x_min":76,"x_max":420,"o":"m 397 223 l 397 50 q 382 15 397 29 q 347 0 367 0 l 149 0 q 114 15 129 0 q 99 50 99 29 l 99 223 q 114 258 99 243 q 149 273 129 273 l 347 273 q 382 258 367 273 q 397 223 397 243 m 420 1042 l 398 446 q 382 412 398 426 q 347 397 367 397 l 149 397 q 114 412 129 397 q 98 446 98 426 l 76 1042 q 90 1077 75 1062 q 124 1091 104 1091 l 372 1091 q 407 1077 392 1091 q 420 1042 421 1062 z "},"飫�":{"ha":1190,"x_min":4,"x_max":1189,"o":"m 695 129 l 695 0 l 503 0 l 380 195 l 361 228 q 353 244 355 235 l 350 244 q 348 239 350 242 q 346 233 347 236 q 343 228 344 229 q 324 194 336 212 l 204 0 l 4 0 l 4 129 l 103 129 l 256 355 l 112 566 l 6 566 l 6 696 l 220 696 l 328 519 q 346 487 329 516 q 354 470 352 480 l 357 470 q 365 487 359 477 l 384 519 l 493 696 l 692 696 l 692 566 l 595 566 l 453 359 l 611 129 l 695 129 m 1189 656 l 1189 496 l 791 496 l 788 517 q 785 553 785 539 q 805 643 785 602 q 856 710 825 684 q 921 761 886 736 q 986 803 956 785 q 1036 845 1016 821 q 1056 894 1056 869 q 1034 943 1056 924 q 979 962 1011 962 q 904 932 939 962 q 876 902 893 923 l 794 973 q 843 1025 815 1002 q 989 1075 908 1075 q 1127 1029 1074 1075 q 1180 906 1180 983 q 1161 826 1180 863 q 1113 767 1142 790 q 1049 722 1084 744 q 986 682 1015 699 q 935 643 956 666 q 911 594 914 619 l 1091 594 l 1091 656 l 1189 656 z "},"飫�":{"ha":1190,"x_min":4,"x_max":1190,"o":"m 695 129 l 695 0 l 503 0 l 380 195 l 361 228 q 353 244 355 235 l 350 244 q 348 239 350 242 q 346 233 347 236 q 343 228 344 229 q 324 194 336 212 l 204 0 l 4 0 l 4 129 l 103 129 l 256 355 l 112 566 l 6 566 l 6 696 l 220 696 l 328 519 q 346 487 329 516 q 354 470 352 480 l 357 470 q 365 487 359 477 l 384 519 l 493 696 l 692 696 l 692 566 l 595 566 l 453 359 l 611 129 l 695 129 m 1190 -39 l 1190 -198 l 792 -198 l 789 -177 q 787 -142 787 -143 q 807 -51 787 -92 q 857 16 827 -10 q 922 66 887 42 q 987 109 957 91 q 1038 150 1018 126 q 1058 200 1058 174 q 1035 248 1058 229 q 980 267 1012 267 q 905 237 941 267 q 877 208 894 229 l 796 279 q 845 330 816 308 q 991 381 907 381 q 1128 334 1076 381 q 1181 212 1181 288 q 1154 120 1181 160 q 1089 53 1128 79 q 1012 5 1051 27 q 945 -44 973 -18 q 913 -101 916 -71 l 1093 -101 l 1093 -39 l 1190 -39 z "},"飫�":{"ha":1488,"x_min":1,"x_max":1487,"o":"m 694 99 l 955 397 l 360 397 l 99 99 l 694 99 m 1480 934 q 1487 879 1491 908 q 1463 828 1483 849 l 769 34 q 694 0 739 0 l 99 0 q 45 16 70 0 q 9 58 21 32 q 1 114 -3 84 q 25 164 5 143 l 719 958 q 794 992 749 992 l 1389 992 q 1443 976 1418 992 q 1480 934 1467 960 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1290 339 q 1255 235 1290 277 q 1159 193 1221 193 q 1099 207 1128 193 q 1054 236 1071 220 q 1010 265 1036 252 q 955 279 984 279 q 870 183 870 279 q 882 94 870 153 q 894 5 894 35 l 894 1 q 868 0 877 1 q 792 -9 842 -2 q 703 -19 743 -16 q 627 -23 663 -23 q 547 -3 580 -23 q 515 62 515 18 q 528 117 515 91 q 558 161 542 143 q 587 207 574 178 q 601 267 601 235 q 559 362 601 328 q 454 397 517 397 q 343 362 389 397 q 298 263 298 326 q 309 198 298 229 q 335 148 321 167 q 361 107 350 129 q 373 68 373 85 q 337 -1 373 33 q 246 -28 308 -28 q 57 -9 173 -28 q 35 -6 50 -8 q 14 -3 21 -5 l 4 -2 q 2 -1 3 -2 q 0 0 0 -1 l 0 794 q 14 791 2 793 q 40 787 26 789 q 57 784 54 785 q 246 766 173 766 q 337 793 308 766 q 373 862 373 827 q 361 901 373 879 q 335 942 350 923 q 309 992 321 961 q 298 1056 298 1023 q 343 1155 298 1120 q 455 1190 389 1190 q 559 1156 517 1190 q 601 1060 601 1121 q 587 1000 601 1028 q 558 954 574 972 q 528 911 542 937 q 515 856 515 884 q 547 791 515 811 q 627 770 580 770 q 767 782 677 770 q 893 795 856 794 l 893 794 q 890 780 892 792 q 886 754 888 768 q 884 737 884 739 q 865 547 865 621 q 892 457 865 485 q 961 421 926 421 q 1000 432 978 421 q 1041 458 1022 444 q 1091 484 1060 473 q 1156 496 1122 496 q 1254 450 1219 496 q 1290 339 1290 405 z "},"飫�":{"ha":893,"x_min":0,"x_max":893,"o":"m 893 645 l 893 546 q 779 248 893 374 q 496 102 664 121 l 496 0 l 694 0 q 729 -15 715 0 q 744 -50 744 -29 q 729 -84 744 -70 q 694 -99 715 -99 l 198 -99 q 164 -84 178 -99 q 149 -50 149 -70 q 164 -15 149 -29 q 198 0 178 0 l 397 0 l 397 102 q 114 248 229 121 q 0 546 0 374 l 0 645 q 15 680 0 665 q 50 694 29 694 q 84 680 70 694 q 99 645 99 665 l 99 546 q 201 300 99 402 q 446 198 303 198 q 692 300 590 198 q 794 546 794 402 l 794 645 q 808 680 794 665 q 843 694 823 694 q 878 680 863 694 q 893 645 893 665 m 694 942 l 694 546 q 622 370 694 443 q 446 298 549 298 q 271 370 344 298 q 198 546 198 443 l 198 942 q 271 1118 198 1045 q 446 1190 344 1190 q 622 1118 549 1190 q 694 942 694 1045 z "},"飫�":{"ha":1091,"x_min":10,"x_max":1081,"o":"m 210 458 l 132 380 q 99 546 99 460 l 99 645 q 114 680 99 665 q 149 694 129 694 q 184 680 169 694 q 198 645 198 665 l 198 546 q 210 458 198 505 m 1073 925 l 794 645 l 794 546 q 721 370 794 443 q 546 298 648 298 q 461 312 503 298 l 387 238 q 546 198 462 198 q 791 300 689 198 q 893 546 893 402 l 893 645 q 908 680 893 665 q 942 694 922 694 q 977 680 963 694 q 992 645 992 665 l 992 546 q 878 248 992 374 q 595 102 763 121 l 595 0 l 794 0 q 829 -15 814 0 q 843 -50 843 -29 q 829 -84 843 -70 q 794 -99 814 -99 l 298 -99 q 263 -84 277 -99 q 248 -50 248 -70 q 263 -15 248 -29 q 298 0 277 0 l 496 0 l 496 102 q 314 165 399 112 l 117 -32 q 99 -40 109 -40 q 81 -32 89 -40 l 18 32 q 10 50 10 40 q 18 67 10 60 l 974 1024 q 992 1032 982 1032 q 1010 1024 1002 1032 l 1073 960 q 1081 942 1081 953 q 1073 925 1081 932 m 779 1027 l 298 546 l 298 942 q 370 1118 298 1045 q 546 1190 443 1190 q 689 1145 625 1190 q 779 1027 753 1099 z "},"飫�":{"ha":992,"x_min":0,"x_max":992,"o":"m 843 446 l 843 942 l 496 942 l 496 61 q 661 167 588 110 q 843 446 843 310 m 992 1042 l 992 446 q 966 314 992 380 q 902 198 940 249 q 810 99 863 147 q 712 19 757 51 q 618 -41 667 -12 q 549 -79 570 -69 q 516 -95 529 -89 q 496 -99 507 -99 q 476 -95 485 -99 q 443 -79 463 -89 q 374 -41 422 -69 q 280 19 325 -12 q 182 99 235 51 q 90 198 129 147 q 26 314 52 249 q 0 446 0 380 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 942 1091 q 977 1077 963 1091 q 992 1042 992 1062 z "},"飫�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 99 -99 l 1190 -99 l 1190 694 l 99 694 l 99 -99 m 397 843 l 397 1066 q 390 1084 397 1077 q 372 1091 383 1091 l 322 1091 q 305 1084 312 1091 q 298 1066 298 1077 l 298 843 q 305 825 298 832 q 322 818 312 818 l 372 818 q 390 825 383 818 q 397 843 397 832 m 992 843 l 992 1066 q 985 1084 992 1077 q 967 1091 978 1091 l 918 1091 q 900 1084 907 1091 q 893 1066 893 1077 l 893 843 q 900 825 893 832 q 918 818 907 818 l 967 818 q 985 825 978 818 q 992 843 992 832 m 1290 893 l 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 l 99 -198 q 29 -169 59 -198 q 0 -99 0 -140 l 0 893 q 29 963 0 933 q 99 992 59 992 l 198 992 l 198 1066 q 235 1154 198 1118 q 322 1190 271 1190 l 372 1190 q 460 1154 423 1190 q 496 1066 496 1118 l 496 992 l 794 992 l 794 1066 q 830 1154 794 1118 q 918 1190 867 1190 l 967 1190 q 1055 1154 1018 1190 q 1091 1066 1091 1118 l 1091 992 l 1190 992 q 1260 963 1231 992 q 1290 893 1290 933 z "},"飫�":{"ha":1091,"x_min":2,"x_max":1091,"o":"m 382 1007 q 389 1014 382 1007 q 397 1042 397 1022 q 382 1077 397 1062 q 347 1091 367 1091 q 312 1077 327 1091 q 298 1042 298 1062 q 312 1007 298 1022 q 347 992 327 992 q 382 1007 367 992 m 1091 1066 l 1091 818 q 1082 799 1091 806 q 1066 794 1076 794 q 1061 794 1063 794 l 714 869 q 700 877 705 870 q 694 893 694 884 l 496 893 l 496 814 q 638 728 582 796 q 694 570 694 660 l 694 -50 q 680 -84 694 -70 q 645 -99 665 -99 l 248 -99 q 213 -84 228 -99 q 198 -50 198 -70 l 198 570 q 247 718 198 653 q 372 807 295 784 l 372 893 l 347 893 q 258 875 301 893 q 187 834 215 856 q 136 782 160 811 q 105 741 112 753 q 94 722 97 728 q 50 694 81 694 q 27 700 37 694 q 3 729 9 709 q 5 767 -4 748 q 17 787 9 774 q 46 828 24 799 q 93 882 67 857 q 158 934 118 908 q 243 975 199 961 q 223 1042 223 1008 q 260 1129 223 1093 q 347 1166 296 1166 q 435 1129 398 1166 q 471 1042 471 1093 q 460 992 471 1016 l 694 992 q 700 1008 694 1001 q 714 1016 705 1015 l 1061 1090 q 1066 1091 1063 1091 q 1082 1086 1076 1091 q 1091 1066 1091 1079 z "},"飫�":{"ha":1290,"x_min":28,"x_max":1290,"o":"m 1094 791 q 1105 801 1094 791 q 1116 843 1116 812 q 1094 896 1116 874 q 1042 918 1073 918 q 989 896 1011 918 q 967 843 967 874 q 989 791 967 812 q 1042 769 1011 769 q 1094 791 1073 769 m 1290 1066 q 1231 733 1290 873 q 1035 453 1173 592 q 884 317 972 391 l 868 23 q 856 3 867 11 l 558 -171 q 546 -174 553 -174 q 528 -167 536 -174 l 478 -117 q 472 -92 468 -106 l 538 122 l 320 339 l 106 274 q 99 273 104 273 q 81 280 88 273 l 32 329 q 28 360 19 344 l 202 657 q 222 670 209 668 l 515 685 q 652 836 590 773 q 929 1036 798 981 q 1263 1091 1061 1091 q 1282 1084 1274 1091 q 1290 1066 1290 1077 z "},"飫�":{"ha":1389,"x_min":0,"x_max":1352,"o":"m 1352 591 l 1225 0 l 966 0 l 1104 645 q 1093 713 1115 688 q 1028 739 1072 739 l 898 739 l 739 0 l 481 0 l 639 739 l 417 739 l 259 0 l 0 0 l 158 739 l 40 992 l 1028 992 q 1175 961 1107 992 q 1290 873 1244 929 q 1352 742 1336 816 q 1352 591 1369 668 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 705 109 l 784 188 q 798 223 798 203 q 784 258 798 243 l 546 496 l 784 734 q 798 769 798 749 q 784 804 798 789 l 705 883 q 670 898 690 898 q 635 883 649 898 l 283 531 q 268 496 268 516 q 283 461 268 476 l 635 109 q 670 95 649 95 q 705 109 690 95 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 556 109 l 908 461 q 922 496 922 476 q 908 531 922 516 l 556 883 q 521 898 541 898 q 486 883 501 898 l 407 804 q 392 769 392 789 q 407 734 392 749 l 645 496 l 407 258 q 392 223 392 243 q 407 188 392 203 l 486 109 q 521 95 501 95 q 556 109 541 95 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 903 308 l 982 387 q 997 422 997 401 q 982 457 997 442 l 630 808 q 595 823 615 823 q 560 808 575 823 l 208 457 q 194 422 194 442 q 208 387 194 401 l 288 308 q 322 293 302 293 q 357 308 343 293 l 595 546 l 833 308 q 868 293 848 293 q 903 308 888 293 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 630 184 l 982 536 q 997 570 997 550 q 982 605 997 591 l 903 684 q 868 699 888 699 q 833 684 848 699 l 595 446 l 357 684 q 322 699 343 699 q 288 684 302 699 l 208 605 q 194 570 194 591 q 208 536 194 550 l 560 184 q 595 169 575 169 q 630 184 615 169 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飫�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 876 728 l 888 863 l 203 863 l 239 450 l 714 450 l 697 273 l 544 232 l 392 273 l 382 381 l 246 381 l 264 166 l 544 88 l 547 88 l 547 89 l 825 166 l 864 587 l 365 587 l 353 728 l 876 728 m 0 1091 l 1091 1091 l 992 -23 l 544 -149 l 99 -23 l 0 1091 z "},"飫�":{"ha":1389,"x_min":9,"x_max":1380,"o":"m 213 1091 l 1380 1091 l 1173 58 l 550 -149 l 9 58 l 64 334 l 295 334 l 272 220 l 599 95 l 976 220 l 1028 483 l 92 483 l 137 713 l 1074 713 l 1104 861 l 167 861 l 213 1091 z "},"飫�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 729 957 q 737 965 729 957 q 744 992 744 972 q 729 1027 744 1012 q 694 1042 715 1042 q 660 1027 674 1042 q 645 992 645 1012 q 660 957 645 972 q 694 942 674 942 q 729 957 715 942 m 1389 273 l 1389 0 q 1373 -23 1389 -17 q 1364 -25 1367 -25 q 1346 -18 1355 -25 l 1274 54 q 1027 -121 1182 -57 q 694 -186 873 -186 q 362 -121 516 -186 q 115 54 207 -57 l 43 -18 q 25 -25 36 -25 q 16 -23 22 -25 q 0 0 0 -17 l 0 273 q 7 291 0 284 q 25 298 14 298 l 298 298 q 321 282 315 298 q 315 255 327 267 l 238 177 q 385 59 290 107 q 595 -5 480 10 l 595 496 l 446 496 q 412 511 426 496 q 397 546 397 525 l 397 645 q 412 680 397 665 q 446 694 426 694 l 595 694 l 595 821 q 523 892 550 847 q 496 992 496 938 q 554 1132 496 1074 q 694 1190 612 1190 q 835 1132 777 1190 q 893 992 893 1074 q 866 892 893 938 q 794 821 839 847 l 794 694 l 942 694 q 977 680 963 694 q 992 645 992 665 l 992 546 q 977 511 992 525 q 942 496 963 496 l 794 496 l 794 -5 q 1004 59 909 10 q 1151 177 1099 107 l 1073 255 q 1068 282 1062 267 q 1091 298 1074 298 l 1364 298 q 1382 291 1375 298 q 1389 273 1389 284 z "},"飫�":{"ha":893,"x_min":0,"x_max":893,"o":"m 818 595 q 871 574 849 595 q 893 521 893 552 l 893 74 q 871 22 893 43 q 818 0 849 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 521 q 22 574 0 552 q 74 595 43 595 l 99 595 l 99 843 q 201 1089 99 987 q 446 1190 303 1190 q 692 1089 590 1190 q 794 843 794 987 q 779 808 794 823 q 744 794 764 794 l 694 794 q 660 808 674 794 q 645 843 645 823 q 587 984 645 925 q 446 1042 529 1042 q 306 984 364 1042 q 248 843 248 925 l 248 595 l 818 595 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 736 636 q 765 607 736 636 q 794 496 794 578 q 736 356 794 414 q 595 298 677 298 q 455 356 513 298 q 397 496 397 414 q 455 636 397 578 q 595 694 513 694 q 736 636 677 694 m 806 286 q 849 329 806 286 q 893 496 893 373 q 806 706 893 619 q 595 794 718 794 q 385 706 472 794 q 298 496 298 619 q 385 286 298 373 q 595 198 472 198 q 806 286 718 198 m 876 777 q 934 718 876 777 q 992 496 992 660 q 876 215 992 332 q 595 99 760 99 q 315 215 431 99 q 198 496 198 332 q 315 777 198 660 q 595 893 431 893 q 876 777 760 893 m 1052 303 q 1072 349 1052 303 q 1091 496 1091 395 q 1052 689 1091 597 q 946 847 1012 780 q 788 953 880 913 q 595 992 696 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 788 40 696 0 q 946 145 880 79 q 1052 303 1012 212 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飬�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 298 620 l 298 471 q 276 419 298 440 q 223 397 254 397 l 74 397 q 22 419 43 397 q 0 471 0 440 l 0 620 q 22 673 0 651 q 74 694 43 694 l 223 694 q 276 673 254 694 q 298 620 298 651 m 694 620 l 694 471 q 673 419 694 440 q 620 397 651 397 l 471 397 q 419 419 440 397 q 397 471 397 440 l 397 620 q 419 673 397 651 q 471 694 440 694 l 620 694 q 673 673 651 694 q 694 620 694 651 m 1091 620 l 1091 471 q 1070 419 1091 440 q 1017 397 1048 397 l 868 397 q 815 419 837 397 q 794 471 794 440 l 794 620 q 815 673 794 651 q 868 694 837 694 l 1017 694 q 1070 673 1048 694 q 1091 620 1091 651 z "},"飬�":{"ha":298,"x_min":0,"x_max":298,"o":"m 298 223 l 298 74 q 276 22 298 43 q 223 0 254 0 l 74 0 q 22 22 43 0 q 0 74 0 43 l 0 223 q 22 276 0 254 q 74 298 43 298 l 223 298 q 276 276 254 298 q 298 223 298 254 m 298 620 l 298 471 q 276 419 298 440 q 223 397 254 397 l 74 397 q 22 419 43 397 q 0 471 0 440 l 0 620 q 22 673 0 651 q 74 694 43 694 l 223 694 q 276 673 254 694 q 298 620 298 651 m 298 1017 l 298 868 q 276 815 298 837 q 223 794 254 794 l 74 794 q 22 815 43 794 q 0 868 0 837 l 0 1017 q 22 1070 0 1048 q 74 1091 43 1091 l 223 1091 q 276 1070 254 1091 q 298 1017 298 1048 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 368 128 q 382 143 368 128 q 397 198 397 157 q 368 269 397 239 q 298 298 339 298 q 227 269 257 298 q 198 198 198 239 q 227 128 198 157 q 298 99 257 99 q 368 128 339 99 m 669 126 q 532 433 659 306 q 225 570 405 560 q 206 563 214 570 q 198 545 198 555 l 198 446 q 205 429 198 436 q 222 421 212 422 q 426 327 341 412 q 520 122 512 242 q 528 106 521 112 q 545 99 535 99 l 644 99 q 662 107 654 99 q 669 126 670 115 m 966 125 q 923 355 963 244 q 815 557 884 467 q 656 716 746 647 q 455 824 566 784 q 224 867 343 863 q 206 860 213 868 q 198 842 198 853 l 198 743 q 205 726 198 733 q 222 718 212 719 q 515 632 381 713 q 731 416 650 551 q 818 123 812 281 q 825 106 818 113 q 842 99 832 99 l 942 99 q 960 107 952 99 q 966 125 968 114 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 296 1011 q 365 1051 296 1011 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 m 893 453 q 918 496 918 467 q 893 539 918 525 l 471 787 q 422 787 447 801 q 397 744 397 773 l 397 248 q 422 205 397 219 q 446 198 434 198 q 471 205 460 198 l 893 453 z "},"飬�":{"ha":1389,"x_min":42,"x_max":1348,"o":"m 794 840 l 1039 595 l 595 152 l 350 397 l 794 840 m 630 81 l 1109 560 q 1124 595 1124 575 q 1109 630 1124 615 l 829 911 q 794 925 815 925 q 759 911 773 925 l 280 432 q 265 397 265 417 q 280 362 265 377 l 560 81 q 595 67 574 67 q 630 81 616 67 m 1319 575 l 616 -129 q 546 -157 587 -157 q 476 -129 505 -157 l 378 -31 q 422 74 422 12 q 378 180 422 136 q 273 223 335 223 q 167 180 211 223 l 71 277 q 42 348 42 306 q 71 418 42 389 l 773 1120 q 844 1149 802 1149 q 914 1120 885 1149 l 1011 1023 q 967 918 967 980 q 1011 812 967 856 q 1116 769 1054 769 q 1221 812 1178 769 l 1319 715 q 1348 645 1348 687 q 1319 575 1348 604 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 446 l 992 546 q 977 581 992 566 q 942 595 963 595 l 248 595 q 213 581 228 595 q 198 546 198 566 l 198 446 q 213 412 198 426 q 248 397 228 397 l 942 397 q 977 412 963 397 q 992 446 992 426 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 893 570 l 893 521 q 886 503 893 510 q 868 496 879 496 l 223 496 q 205 503 212 496 q 198 521 198 510 l 198 570 q 205 588 198 581 q 223 595 212 595 l 868 595 q 886 588 879 595 q 893 570 893 581 m 992 223 l 992 868 q 956 956 992 919 q 868 992 919 992 l 223 992 q 136 956 172 992 q 99 868 99 919 l 99 223 q 136 136 99 172 q 223 99 172 99 l 868 99 q 956 136 919 99 q 992 223 992 172 m 1091 868 l 1091 223 q 1026 65 1091 131 q 868 0 960 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 868 1091 q 1026 1026 960 1091 q 1091 868 1091 960 z "},"飬�":{"ha":794,"x_min":2,"x_max":789,"o":"m 789 723 q 744 694 775 694 l 595 694 l 595 25 q 588 7 595 14 q 570 0 581 0 l 25 0 q 2 14 9 0 q 5 41 -4 29 l 129 190 q 149 198 136 198 l 397 198 l 397 694 l 248 694 q 203 723 217 694 q 210 776 190 752 l 458 1073 q 496 1090 472 1090 q 534 1073 520 1090 l 782 776 q 789 723 803 751 z "},"飬�":{"ha":794,"x_min":2,"x_max":789,"o":"m 25 992 l 570 992 q 588 985 581 992 q 595 966 595 977 l 595 298 l 744 298 q 789 269 775 298 q 782 215 803 240 l 534 -82 q 496 -99 520 -99 q 458 -82 472 -99 l 210 215 q 203 269 190 239 q 248 298 217 298 l 397 298 l 397 794 l 149 794 q 129 802 138 794 l 5 951 q 2 977 -5 962 q 25 992 9 992 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 531 184 l 1007 660 q 1022 694 1022 674 q 1007 729 1022 715 l 928 808 q 893 823 913 823 q 858 808 873 823 l 496 446 l 332 610 q 298 625 318 625 q 263 610 277 625 l 184 531 q 169 496 169 516 q 184 461 169 476 l 461 184 q 496 169 476 169 q 531 184 516 169 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 313 332 l 431 214 l 391 174 l 347 174 l 347 248 l 273 248 l 273 291 l 313 332 m 634 634 q 632 611 645 624 l 406 385 q 383 383 393 372 q 385 406 372 393 l 611 632 q 634 634 624 645 m 422 99 l 843 521 l 620 744 l 198 322 l 198 99 l 422 99 m 893 570 l 964 642 q 986 694 986 663 q 964 747 986 725 l 846 865 q 794 887 825 887 q 741 865 763 887 l 670 794 l 893 570 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 471 l 992 843 q 977 878 992 863 q 942 893 963 893 l 570 893 q 525 863 538 893 q 536 808 512 831 l 647 697 l 233 283 q 219 248 219 268 q 233 213 219 228 l 312 134 q 347 119 327 119 q 382 134 367 119 l 796 548 l 908 436 q 942 422 922 422 q 962 426 952 422 q 992 471 992 439 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 779 337 l 1052 610 q 1066 645 1066 625 q 1052 680 1066 665 l 779 953 q 725 963 756 977 q 694 918 694 950 l 694 794 q 527 779 602 794 q 401 739 452 763 q 313 678 350 715 q 253 604 275 641 q 219 519 232 567 q 202 433 206 472 q 198 347 198 394 q 328 34 198 207 q 347 25 336 25 q 357 27 353 25 q 372 53 374 34 q 420 419 338 327 q 521 478 456 460 q 694 496 586 496 l 694 372 q 725 326 694 339 q 744 322 735 322 q 779 337 764 322 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 496 347 l 694 446 l 496 546 l 496 347 m 794 805 l 794 385 l 397 187 l 397 607 l 794 805 m 960 284 q 989 333 960 284 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 887 667 q 884 616 901 640 l 636 269 q 595 248 621 248 q 555 269 570 248 l 307 616 q 303 667 289 640 q 347 694 316 694 l 843 694 q 887 667 874 694 m 992 124 l 992 868 q 985 885 992 878 q 967 893 977 893 l 223 893 q 206 885 213 893 q 198 868 198 878 l 198 124 q 206 107 198 114 q 223 99 213 99 l 967 99 q 985 107 977 99 q 992 124 992 114 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 887 325 q 843 298 874 298 l 347 298 q 303 325 316 298 q 307 376 289 352 l 555 723 q 595 744 570 744 q 636 723 621 744 l 884 376 q 887 325 901 352 m 992 124 l 992 868 q 985 885 992 878 q 967 893 977 893 l 223 893 q 206 885 213 893 q 198 868 198 878 l 198 124 q 206 107 198 114 q 223 99 213 99 l 967 99 q 985 107 977 99 q 992 124 992 114 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 822 536 q 843 496 843 522 q 822 456 843 470 l 475 208 q 424 204 451 190 q 397 248 397 217 l 397 744 q 424 788 397 775 q 475 784 451 802 l 822 536 m 992 124 l 992 868 q 985 886 992 879 q 967 893 978 893 l 223 893 q 205 886 212 893 q 198 868 198 879 l 198 124 q 205 106 198 113 q 223 99 212 99 l 967 99 q 985 106 978 99 q 992 124 992 113 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":794,"x_min":0,"x_max":784,"o":"m 756 177 l 784 54 q 781 37 786 45 q 768 26 777 29 l 764 25 q 756 22 761 23 q 744 19 751 21 q 727 14 736 16 q 707 10 718 12 q 684 7 697 9 q 658 3 671 5 q 630 1 645 2 q 600 0 615 0 q 283 101 419 0 q 98 374 147 202 l 25 374 q 7 381 15 374 q 0 398 0 388 l 0 486 q 7 503 0 496 q 25 511 15 511 l 76 511 q 77 592 74 555 l 25 592 q 7 599 14 592 q 0 617 0 606 l 0 705 q 7 723 0 716 q 25 730 14 730 l 101 730 q 289 992 153 893 q 600 1091 426 1091 q 750 1073 679 1091 q 766 1062 759 1071 q 768 1043 770 1053 l 735 920 q 724 905 732 910 q 705 903 715 900 l 702 904 q 693 906 699 904 q 680 908 687 907 q 662 911 672 910 q 642 913 653 912 q 620 915 632 915 q 597 916 608 916 q 422 867 499 916 q 305 730 344 817 l 668 730 q 687 721 680 730 q 693 701 695 711 l 674 612 q 649 592 670 592 l 271 592 q 271 511 269 563 l 627 511 q 646 501 639 511 q 651 481 653 492 l 632 394 q 624 379 631 385 q 608 374 617 374 l 308 374 q 424 230 346 283 q 601 177 503 177 q 629 178 615 177 q 655 181 643 179 q 678 184 667 182 q 697 188 689 186 q 711 191 705 190 q 721 194 718 193 l 725 195 q 745 194 735 199 q 756 177 754 188 z "},"飬�":{"ha":794,"x_min":0,"x_max":791,"o":"m 791 309 l 791 25 q 784 7 791 14 q 766 0 777 0 l 25 0 q 7 7 14 0 q 0 25 0 14 l 0 141 q 7 158 0 151 q 25 166 15 166 l 100 166 l 100 463 l 26 463 q 9 470 16 463 q 2 488 2 477 l 2 589 q 9 607 2 600 q 26 614 16 614 l 100 614 l 100 787 q 196 1005 100 919 q 439 1091 291 1091 q 699 994 583 1091 q 707 979 706 988 q 701 961 708 969 l 622 863 q 605 853 615 854 q 587 859 594 852 q 567 873 583 863 q 513 898 550 884 q 441 912 476 912 q 335 876 375 912 q 295 780 295 839 l 295 614 l 531 614 q 548 607 541 614 q 556 589 556 600 l 556 488 q 548 470 556 477 q 531 463 541 463 l 295 463 l 295 169 l 615 169 l 615 309 q 622 327 615 319 q 640 334 629 334 l 766 334 q 784 327 777 334 q 791 309 791 319 z "},"飬�":{"ha":794,"x_min":40,"x_max":758,"o":"m 758 272 q 681 68 758 153 q 481 -38 604 -18 l 481 -174 q 474 -191 481 -184 q 456 -198 467 -198 l 351 -198 q 334 -191 341 -198 q 326 -174 326 -184 l 326 -38 q 227 -14 275 -31 q 149 21 180 3 q 91 58 118 38 q 55 87 65 78 q 42 101 46 96 q 40 133 29 117 l 120 237 q 138 246 126 245 q 157 239 150 248 q 158 238 157 239 q 346 141 246 161 q 404 135 375 135 q 514 168 467 135 q 562 263 562 202 q 550 304 562 284 q 524 336 539 323 q 479 365 510 350 q 428 390 448 381 q 366 415 408 399 q 318 435 336 428 q 270 455 301 442 q 222 479 240 469 q 178 507 204 490 q 137 540 153 524 q 103 578 121 556 q 76 623 85 600 q 59 674 66 646 q 53 735 53 703 q 129 922 53 842 q 326 1026 205 1003 l 326 1166 q 334 1183 326 1176 q 351 1190 341 1190 l 456 1190 q 474 1184 467 1190 q 481 1166 481 1177 l 481 1029 q 566 1011 525 1025 q 634 985 608 998 q 683 956 660 973 q 713 934 706 940 q 725 923 720 928 q 729 894 738 909 l 666 780 q 648 768 660 769 q 627 773 637 766 q 616 783 625 776 q 586 803 607 790 q 540 828 564 817 q 482 848 516 839 q 416 857 449 857 q 296 824 343 857 q 250 738 250 791 q 256 701 250 718 q 279 668 263 684 q 310 643 295 653 q 353 619 324 632 q 400 598 382 605 q 454 577 418 591 q 517 552 495 561 q 576 525 539 543 q 634 492 613 507 q 682 453 656 477 q 724 404 709 429 q 748 345 738 379 q 758 272 758 311 z "},"飬�":{"ha":696,"x_min":0,"x_max":696,"o":"m 696 826 l 696 747 q 689 729 696 736 q 671 722 682 722 l 541 722 q 441 541 523 611 q 227 456 359 471 q 583 40 357 318 q 586 14 594 28 q 563 0 580 0 l 412 0 q 393 9 400 0 q 7 452 156 294 q 0 469 0 459 l 0 567 q 7 585 0 577 q 25 592 15 592 l 112 592 q 276 625 214 592 q 356 722 339 659 l 25 722 q 7 729 14 722 q 0 747 0 736 l 0 826 q 7 844 0 837 q 25 851 14 851 l 345 851 q 137 939 301 939 l 25 939 q 7 946 15 939 q 0 963 0 953 l 0 1066 q 7 1084 0 1077 q 25 1091 14 1091 l 670 1091 q 687 1084 680 1091 q 694 1066 694 1077 l 694 987 q 687 970 694 977 q 670 963 680 963 l 489 963 q 539 851 525 915 l 671 851 q 689 844 682 851 q 696 826 696 837 z "},"飬�":{"ha":796,"x_min":3,"x_max":793,"o":"m 467 0 l 334 0 q 317 7 324 0 q 309 25 309 14 l 309 281 l 86 281 q 69 288 76 281 q 61 305 61 295 l 61 385 q 69 403 61 395 q 86 410 76 410 l 309 410 l 309 476 l 86 476 q 69 483 76 476 q 61 501 61 490 l 61 581 q 69 599 61 591 q 86 606 76 606 l 252 606 l 3 1054 q 3 1079 -3 1066 q 25 1091 11 1091 l 175 1091 q 198 1077 190 1091 l 364 748 q 408 651 379 718 q 431 704 415 670 q 453 751 447 738 l 601 1077 q 623 1091 607 1091 l 771 1091 q 792 1079 784 1091 q 793 1055 799 1068 l 550 606 l 717 606 q 734 599 727 606 q 742 581 742 591 l 742 501 q 734 483 742 490 q 717 476 727 476 l 492 476 l 492 410 l 717 410 q 734 403 727 410 q 742 385 742 395 l 742 305 q 734 288 742 295 q 717 281 727 281 l 492 281 l 492 25 q 485 7 492 15 q 467 0 477 0 z "},"飬�":{"ha":992,"x_min":0,"x_max":992,"o":"m 758 627 q 783 651 758 627 q 808 753 808 675 q 758 878 808 830 q 625 926 708 926 l 377 926 l 377 579 l 625 579 q 758 627 708 579 m 894 997 q 943 949 894 997 q 992 753 992 902 q 894 508 992 603 q 641 414 796 414 l 377 414 l 377 322 l 769 322 q 787 315 780 322 q 794 298 794 308 l 794 198 q 787 181 794 188 q 769 174 780 174 l 377 174 l 377 25 q 370 7 377 14 q 353 0 363 0 l 223 0 q 205 7 212 0 q 198 25 198 14 l 198 174 l 25 174 q 7 181 14 174 q 0 198 0 188 l 0 298 q 7 315 0 308 q 25 322 14 322 l 198 322 l 198 414 l 25 414 q 7 421 14 414 q 0 439 0 428 l 0 554 q 7 572 0 564 q 25 579 14 579 l 198 579 l 198 1066 q 205 1084 198 1077 q 223 1091 212 1091 l 641 1091 q 894 997 796 1091 z "},"飬�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 398 264 l 461 496 l 338 496 l 396 264 q 397 261 397 263 q 398 259 397 260 q 398 262 398 260 q 398 264 398 264 m 488 595 l 515 694 l 289 694 l 314 595 l 488 595 m 637 595 l 745 595 l 718 694 l 663 694 l 637 595 m 985 264 l 1046 496 l 920 496 l 983 264 q 983 262 983 264 q 984 259 984 260 q 985 261 984 260 q 985 264 985 263 m 1071 595 l 1097 694 l 867 694 l 893 595 l 1071 595 m 1389 570 l 1389 521 q 1382 503 1389 510 q 1364 496 1375 496 l 1199 496 l 1072 19 q 1048 0 1066 0 l 925 0 q 901 19 906 0 l 772 496 l 610 496 l 481 19 q 457 0 475 0 l 333 0 q 318 5 325 0 q 310 19 312 11 l 186 496 l 25 496 q 7 503 14 496 q 0 521 0 510 l 0 570 q 7 588 0 581 q 25 595 14 595 l 160 595 l 135 694 l 25 694 q 7 701 14 694 q 0 719 0 708 l 0 769 q 7 787 0 780 q 25 794 14 794 l 109 794 l 40 1060 q 44 1082 36 1072 q 64 1091 52 1091 l 171 1091 q 195 1073 191 1091 l 264 794 l 543 794 l 618 1073 q 642 1091 623 1091 l 739 1091 q 763 1073 758 1091 l 839 794 l 1122 794 l 1194 1073 q 1218 1091 1198 1091 l 1325 1091 q 1345 1082 1337 1091 q 1349 1060 1352 1072 l 1278 794 l 1364 794 q 1382 787 1375 794 q 1389 769 1389 780 l 1389 719 q 1382 701 1389 708 q 1364 694 1375 694 l 1252 694 l 1225 595 l 1364 595 q 1382 588 1375 595 q 1389 570 1389 581 z "},"飬�":{"ha":992,"x_min":43,"x_max":973,"o":"m 904 694 q 803 494 918 553 q 939 415 894 473 q 973 249 984 357 q 948 152 968 194 q 898 83 929 110 q 823 38 868 56 q 729 11 778 19 q 616 -1 680 2 l 616 -198 l 497 -198 l 497 -4 q 402 -3 435 -4 l 402 -198 l 283 -198 l 283 -1 q 241 0 269 -1 q 198 0 213 0 l 43 0 l 67 142 l 153 142 q 198 181 192 142 l 198 493 l 211 493 q 198 494 206 494 l 198 716 q 129 769 188 769 l 43 769 l 43 896 l 208 895 q 283 896 257 895 l 283 1091 l 402 1091 l 402 900 q 497 901 466 901 l 497 1091 l 616 1091 l 616 896 q 725 879 677 891 q 812 844 772 867 q 876 783 853 821 q 904 694 900 746 m 738 272 q 726 322 738 300 q 698 357 715 343 q 653 381 680 371 q 602 395 625 391 q 545 402 579 400 q 491 405 511 405 q 441 404 472 405 q 405 403 411 403 l 405 141 q 433 141 411 141 q 470 140 456 140 q 512 141 485 140 q 557 145 538 143 q 601 151 576 146 q 644 162 626 156 q 681 178 662 168 q 711 202 700 188 q 730 233 723 215 q 738 272 738 250 m 683 641 q 673 686 683 667 q 649 719 663 706 q 612 741 636 732 q 570 753 589 749 q 522 760 550 757 q 477 761 494 762 q 435 761 460 761 q 405 760 410 760 l 405 522 q 431 522 408 522 q 467 522 454 522 q 506 524 481 522 q 549 528 532 525 q 589 536 566 531 q 626 551 612 542 q 655 572 641 560 q 676 601 669 584 q 683 641 683 619 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 794 794 l 794 1159 q 822 1138 811 1149 l 1138 822 q 1159 794 1149 811 l 794 794 m 694 769 q 716 716 694 738 q 769 694 738 694 l 1190 694 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 694 1190 l 694 769 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 822 q 1159 794 1149 811 l 794 794 l 794 1159 q 822 1138 811 1149 l 1138 822 m 769 694 l 1190 694 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 694 1190 l 694 769 q 716 716 694 738 q 769 694 738 694 m 893 124 l 893 174 q 886 191 893 184 q 868 198 879 198 l 322 198 q 305 191 312 198 q 298 174 298 184 l 298 124 q 305 106 298 113 q 322 99 312 99 l 868 99 q 886 106 879 99 q 893 124 893 113 m 893 322 l 893 372 q 886 390 893 383 q 868 397 879 397 l 322 397 q 305 390 312 397 q 298 372 298 383 l 298 322 q 305 305 298 312 q 322 298 312 298 l 868 298 q 886 305 879 298 q 893 322 893 312 m 893 521 l 893 570 q 886 588 893 581 q 868 595 879 595 l 322 595 q 305 588 312 595 q 298 570 298 581 l 298 521 q 305 503 298 510 q 322 496 312 496 l 868 496 q 886 503 879 496 q 893 521 893 510 z "},"飬�":{"ha":1290,"x_min":26,"x_max":1287,"o":"m 923 874 l 1060 874 l 1004 1043 l 995 1080 q 994 1095 994 1092 l 991 1095 l 988 1080 q 985 1066 988 1079 q 980 1043 983 1053 l 923 874 m 570 74 q 563 56 570 65 l 315 -191 q 298 -198 308 -198 q 280 -191 288 -198 l 32 57 q 26 84 20 69 q 50 99 33 99 l 198 99 l 198 1166 q 205 1184 198 1177 q 223 1190 212 1190 l 372 1190 q 390 1184 383 1190 q 397 1166 397 1177 l 397 99 l 546 99 q 563 92 556 99 q 570 74 570 85 m 1218 -18 l 1218 -198 l 766 -198 l 766 -129 l 1052 281 q 1068 302 1061 295 l 1077 309 l 1077 312 q 1072 311 1075 312 q 1066 311 1068 311 q 1042 308 1056 308 l 863 308 l 863 219 l 770 219 l 770 397 l 1209 397 l 1209 328 l 923 -83 q 907 -103 918 -89 l 898 -112 l 898 -113 l 909 -112 q 932 -110 916 -110 l 1125 -110 l 1125 -18 l 1218 -18 m 1287 677 l 1287 595 l 1064 595 l 1064 677 l 1122 677 l 1086 789 l 898 789 l 861 677 l 919 677 l 919 595 l 697 595 l 697 677 l 751 677 l 929 1190 l 1055 1190 l 1233 677 l 1287 677 z "},"飬�":{"ha":1290,"x_min":26,"x_max":1287,"o":"m 923 81 l 1060 81 l 1004 250 l 995 286 q 994 301 994 298 l 991 301 l 988 286 q 985 272 988 285 q 980 250 983 259 l 923 81 m 570 74 q 563 56 570 65 l 315 -191 q 298 -198 308 -198 q 280 -191 288 -198 l 32 57 q 26 84 20 69 q 50 99 33 99 l 198 99 l 198 1166 q 205 1184 198 1177 q 223 1190 212 1190 l 372 1190 q 390 1184 383 1190 q 397 1166 397 1177 l 397 99 l 546 99 q 563 92 556 99 q 570 74 570 85 m 1287 -116 l 1287 -198 l 1064 -198 l 1064 -116 l 1122 -116 l 1086 -5 l 898 -5 l 861 -116 l 919 -116 l 919 -198 l 697 -198 l 697 -116 l 751 -116 l 929 397 l 1055 397 l 1233 -116 l 1287 -116 m 1218 776 l 1218 595 l 766 595 l 766 665 l 1052 1075 q 1068 1096 1061 1089 l 1077 1103 l 1077 1105 q 1072 1105 1075 1105 q 1066 1104 1068 1104 q 1042 1102 1056 1102 l 863 1102 l 863 1013 l 770 1013 l 770 1190 l 1209 1190 l 1209 1121 l 923 711 q 907 691 918 705 l 898 683 l 898 680 l 909 683 q 932 684 916 684 l 1125 684 l 1125 776 l 1218 776 z "},"飬�":{"ha":1389,"x_min":26,"x_max":1389,"o":"m 570 74 q 563 56 570 65 l 315 -191 q 298 -198 308 -198 q 280 -191 288 -198 l 32 57 q 26 84 20 69 q 50 99 33 99 l 198 99 l 198 1166 q 205 1184 198 1177 q 223 1190 212 1190 l 372 1190 q 390 1184 383 1190 q 397 1166 397 1177 l 397 99 l 546 99 q 563 92 556 99 q 570 74 570 85 m 1389 -25 l 1389 -174 q 1382 -191 1389 -184 q 1364 -198 1375 -198 l 719 -198 q 701 -191 708 -198 q 694 -174 694 -184 l 694 -25 q 701 -7 694 -14 q 719 0 708 0 l 1364 0 q 1382 -7 1375 0 q 1389 -25 1389 -14 m 1240 372 l 1240 223 q 1233 205 1240 212 q 1215 198 1226 198 l 719 198 q 701 205 708 198 q 694 223 694 212 l 694 372 q 701 390 694 383 q 719 397 708 397 l 1215 397 q 1233 390 1226 397 q 1240 372 1240 383 m 1091 769 l 1091 620 q 1084 602 1091 609 q 1066 595 1077 595 l 719 595 q 701 602 708 595 q 694 620 694 609 l 694 769 q 701 787 694 780 q 719 794 708 794 l 1066 794 q 1084 787 1077 794 q 1091 769 1091 780 m 942 1166 l 942 1017 q 935 999 942 1006 q 918 992 929 992 l 719 992 q 701 999 708 992 q 694 1017 694 1006 l 694 1166 q 701 1184 694 1177 q 719 1190 708 1190 l 918 1190 q 935 1184 929 1190 q 942 1166 942 1177 z "},"飬�":{"ha":1389,"x_min":26,"x_max":1389,"o":"m 942 -25 l 942 -174 q 935 -191 942 -184 q 918 -198 929 -198 l 719 -198 q 701 -191 708 -198 q 694 -174 694 -184 l 694 -25 q 701 -7 694 -14 q 719 0 708 0 l 918 0 q 935 -7 929 0 q 942 -25 942 -14 m 570 74 q 563 56 570 65 l 315 -191 q 298 -198 308 -198 q 280 -191 288 -198 l 32 57 q 26 84 20 69 q 50 99 33 99 l 198 99 l 198 1166 q 205 1184 198 1177 q 223 1190 212 1190 l 372 1190 q 390 1184 383 1190 q 397 1166 397 1177 l 397 99 l 546 99 q 563 92 556 99 q 570 74 570 85 m 1091 372 l 1091 223 q 1084 205 1091 212 q 1066 198 1077 198 l 719 198 q 701 205 708 198 q 694 223 694 212 l 694 372 q 701 390 694 383 q 719 397 708 397 l 1066 397 q 1084 390 1077 397 q 1091 372 1091 383 m 1240 769 l 1240 620 q 1233 602 1240 609 q 1215 595 1226 595 l 719 595 q 701 602 708 595 q 694 620 694 609 l 694 769 q 701 787 694 780 q 719 794 708 794 l 1215 794 q 1233 787 1226 794 q 1240 769 1240 780 m 1389 1166 l 1389 1017 q 1382 999 1389 1006 q 1364 992 1375 992 l 719 992 q 701 999 708 992 q 694 1017 694 1006 l 694 1166 q 701 1184 694 1177 q 719 1190 708 1190 l 1364 1190 q 1382 1184 1375 1190 q 1389 1166 1389 1177 z "},"飬�":{"ha":1190,"x_min":26,"x_max":1152,"o":"m 1043 173 q 1009 263 1043 222 q 929 304 975 304 q 865 275 889 304 q 841 202 841 246 q 869 129 841 158 q 950 99 898 99 q 1016 120 989 99 q 1043 173 1043 141 m 570 74 q 563 56 570 65 l 315 -191 q 298 -198 308 -198 q 280 -191 288 -198 l 32 57 q 26 84 20 69 q 50 99 33 99 l 198 99 l 198 1166 q 205 1184 198 1177 q 223 1190 212 1190 l 372 1190 q 390 1184 383 1190 q 397 1166 397 1177 l 397 99 l 546 99 q 563 92 556 99 q 570 74 570 85 m 1152 128 q 1142 34 1152 80 q 1110 -55 1132 -12 q 1057 -129 1088 -97 q 981 -179 1026 -160 q 882 -198 935 -198 q 798 -186 834 -198 q 766 -174 780 -180 l 796 -87 q 820 -95 808 -92 q 878 -105 849 -105 q 982 -60 943 -105 q 1034 53 1022 -15 l 1032 53 q 985 24 1016 35 q 919 13 953 13 q 785 69 837 13 q 733 202 733 124 q 789 340 733 284 q 929 397 845 397 q 1088 324 1025 397 q 1152 128 1152 250 m 1128 684 l 1128 595 l 765 595 l 765 684 l 894 684 l 894 1018 q 895 1033 894 1024 q 895 1046 895 1042 l 895 1059 l 894 1059 l 888 1049 q 868 1025 882 1039 l 820 980 l 756 1047 l 905 1190 l 1001 1190 l 1001 684 l 1128 684 z "},"飬�":{"ha":1190,"x_min":26,"x_max":1152,"o":"m 1043 966 q 1009 1056 1043 1015 q 929 1097 975 1097 q 865 1069 889 1097 q 841 996 841 1040 q 869 922 841 952 q 950 893 898 893 q 1016 914 989 893 q 1043 966 1043 935 m 570 74 q 563 56 570 65 l 315 -191 q 298 -198 308 -198 q 280 -191 288 -198 l 32 57 q 26 84 20 69 q 50 99 33 99 l 198 99 l 198 1166 q 205 1184 198 1177 q 223 1190 212 1190 l 372 1190 q 390 1184 383 1190 q 397 1166 397 1177 l 397 99 l 546 99 q 563 92 556 99 q 570 74 570 85 m 1128 -110 l 1128 -198 l 765 -198 l 765 -110 l 894 -110 l 894 225 q 895 239 894 230 q 895 253 895 249 l 895 265 l 894 265 l 888 256 q 868 232 882 246 l 820 187 l 756 253 l 905 397 l 1001 397 l 1001 -110 l 1128 -110 m 1152 922 q 1142 827 1152 873 q 1110 739 1132 781 q 1057 665 1088 697 q 981 614 1026 633 q 882 595 935 595 q 798 608 834 595 q 766 619 780 614 l 796 707 q 820 698 808 701 q 878 688 849 688 q 982 734 943 688 q 1034 846 1022 779 l 1032 846 q 985 818 1016 829 q 919 807 953 807 q 785 862 837 807 q 733 996 733 918 q 789 1134 733 1077 q 929 1190 845 1190 q 1088 1117 1025 1190 q 1152 922 1152 1044 z "},"飬�":{"ha":1290,"x_min":0,"x_max":1240,"o":"m 198 149 q 184 184 198 169 q 149 198 169 198 q 114 184 128 198 q 99 149 99 169 q 114 114 99 128 q 149 99 128 99 q 184 114 169 99 q 198 149 198 128 m 322 546 l 322 50 q 308 15 322 29 q 273 0 293 0 l 50 0 q 15 15 29 0 q 0 50 0 29 l 0 546 q 15 581 0 566 q 50 595 29 595 l 273 595 q 308 581 293 595 q 322 546 322 566 m 1240 546 q 1197 430 1240 479 q 1209 371 1209 396 q 1176 265 1211 312 q 1176 174 1189 222 q 1134 102 1164 130 q 1096 -39 1141 15 q 943 -99 1046 -98 l 915 -99 l 856 -99 l 843 -99 q 732 -87 792 -99 q 637 -65 671 -75 q 544 -34 604 -54 q 422 0 449 -1 q 387 15 401 1 q 372 50 372 29 l 372 546 q 386 580 372 566 q 419 596 400 594 q 478 642 438 598 q 556 736 519 686 q 635 829 609 803 q 659 866 649 842 q 672 903 669 889 q 683 950 676 918 q 693 997 688 980 q 708 1038 697 1015 q 734 1077 718 1061 q 769 1091 749 1091 q 833 1083 805 1091 q 879 1063 861 1075 q 910 1032 898 1051 q 929 997 923 1012 q 938 958 935 981 q 942 923 942 935 q 942 893 942 911 q 935 834 942 863 q 920 787 928 805 q 899 744 913 770 q 891 730 897 739 q 883 713 886 721 q 877 694 880 705 l 1091 694 q 1196 650 1152 694 q 1240 546 1240 606 z "},"飬�":{"ha":1290,"x_min":0,"x_max":1240,"o":"m 198 744 q 184 709 198 724 q 149 694 169 694 q 114 709 128 694 q 99 744 99 724 q 114 779 99 765 q 149 794 128 794 q 184 779 169 794 q 198 744 198 765 m 322 347 l 322 843 q 308 878 322 863 q 273 893 293 893 l 50 893 q 15 878 29 893 q 0 843 0 863 l 0 347 q 15 312 0 327 q 50 298 29 298 l 273 298 q 308 312 293 298 q 322 347 322 327 m 1197 463 q 1240 347 1240 415 q 1196 243 1239 287 q 1091 198 1152 198 l 877 198 q 883 180 880 188 q 891 163 886 172 q 899 149 897 153 q 920 105 913 120 q 935 59 927 89 q 942 0 942 29 q 942 -30 942 -19 q 938 -65 942 -42 q 929 -104 935 -88 q 910 -139 923 -119 q 879 -170 898 -158 q 833 -190 861 -182 q 769 -198 805 -198 q 734 -184 749 -198 q 708 -145 718 -168 q 693 -105 697 -122 q 683 -57 688 -88 q 672 -10 676 -25 q 659 27 669 4 q 635 64 649 50 q 556 157 609 90 q 478 251 519 207 q 419 297 438 295 q 386 313 400 298 q 372 346 372 327 l 372 843 q 387 878 372 863 q 422 893 401 892 q 544 927 449 894 q 637 958 604 947 q 732 980 671 968 q 843 992 792 992 l 856 992 l 915 992 l 943 992 q 1096 932 1046 991 q 1134 791 1141 878 q 1176 718 1164 763 q 1176 628 1189 671 q 1209 522 1211 581 q 1197 463 1209 497 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 712 181 l 712 302 q 690 341 712 341 q 664 329 677 341 l 664 155 q 690 143 677 143 q 712 181 712 143 m 855 275 l 906 275 l 906 301 q 880 341 906 341 q 855 301 855 341 l 855 275 m 412 481 l 412 427 l 350 427 l 350 99 l 293 99 l 293 427 l 233 427 l 233 481 l 412 481 m 568 384 l 568 99 l 516 99 l 516 130 q 457 95 486 95 q 425 117 432 95 q 420 159 420 130 l 420 384 l 471 384 l 471 174 q 472 154 471 156 q 484 143 473 143 q 516 167 499 143 l 516 384 l 568 384 m 763 298 l 763 184 q 758 128 763 144 q 717 95 749 95 q 664 127 690 95 l 664 99 l 612 99 l 612 481 l 664 481 l 664 357 q 717 388 689 388 q 758 355 749 388 q 763 298 763 339 m 958 198 l 958 191 q 956 157 958 168 q 945 126 954 140 q 883 95 924 95 q 820 125 842 95 q 804 191 804 146 l 804 291 q 819 358 804 337 q 881 388 842 388 q 942 358 921 388 q 958 291 958 336 l 958 233 l 855 233 l 855 182 q 881 143 855 143 q 904 163 900 143 q 905 168 904 164 q 905 181 905 173 q 905 198 905 189 l 958 198 m 608 836 l 608 715 q 584 676 608 676 q 559 715 559 676 l 559 836 q 584 877 559 877 q 608 836 608 877 m 1022 284 q 1007 485 1022 421 q 973 542 999 519 q 915 569 948 565 q 595 581 809 581 q 277 569 382 581 q 217 542 243 565 q 184 485 192 519 q 169 284 169 418 q 184 82 169 147 q 217 26 192 49 q 276 -2 243 2 q 595 -13 382 -13 q 915 -2 808 -13 q 973 26 948 2 q 1006 82 998 49 q 1022 284 1022 147 m 436 788 l 506 1018 l 448 1018 l 408 867 l 367 1018 l 307 1018 q 325 964 312 1000 q 343 911 337 929 q 379 788 370 831 l 379 632 l 436 632 l 436 788 m 660 725 l 660 826 q 644 894 660 871 q 584 923 622 923 q 523 894 544 923 q 507 826 507 871 l 507 725 q 523 658 507 680 q 584 629 544 629 q 644 658 622 629 q 660 725 660 679 m 801 632 l 853 632 l 853 919 l 801 919 l 801 700 q 768 676 784 676 q 756 688 756 676 q 755 708 755 690 l 755 919 l 703 919 l 703 692 q 708 649 703 663 q 741 629 716 629 q 801 663 769 629 l 801 632 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1190,"x_min":21,"x_max":1170,"o":"m 753 226 l 753 63 q 722 11 753 11 q 687 28 705 11 l 687 261 q 722 278 705 278 q 753 226 753 278 m 1015 226 l 1015 190 l 945 190 l 945 226 q 980 278 945 278 q 1015 226 1015 278 m 266 395 l 349 395 l 349 467 l 107 467 l 107 395 l 188 395 l 188 -47 l 266 -47 l 266 395 m 489 -47 l 558 -47 l 558 336 l 489 336 l 489 43 q 445 11 466 11 q 429 27 431 11 q 428 54 428 29 l 428 336 l 359 336 l 359 33 q 365 -23 359 -5 q 410 -52 374 -52 q 489 -5 447 -52 l 489 -47 m 822 68 l 822 221 q 815 298 822 277 q 760 341 801 341 q 687 299 721 341 l 687 467 l 618 467 l 618 -47 l 687 -47 l 687 -9 q 760 -52 722 -52 q 815 -9 801 -52 q 822 68 822 12 m 1084 76 l 1084 86 l 1013 86 q 1011 39 1013 47 q 980 11 1006 11 q 945 64 945 11 l 945 132 l 1084 132 l 1084 212 q 1063 301 1084 273 q 980 341 1032 341 q 898 301 928 341 q 876 212 876 273 l 876 78 q 898 -12 876 16 q 982 -52 929 -52 q 1066 -11 1038 -52 q 1082 31 1080 10 q 1084 76 1084 38 m 612 784 l 612 946 q 579 1000 612 1000 q 546 946 546 1000 l 546 784 q 579 729 546 729 q 612 784 612 729 m 1170 202 q 1149 -70 1170 20 q 1104 -146 1139 -115 q 1025 -182 1070 -177 q 595 -198 883 -198 q 165 -182 308 -198 q 86 -146 120 -177 q 41 -70 51 -115 q 21 202 21 17 q 41 473 21 383 q 86 550 52 519 q 166 586 120 581 q 595 601 308 601 q 1025 586 883 601 q 1105 550 1070 581 q 1149 473 1139 519 q 1170 202 1170 386 m 396 1190 l 475 1190 l 381 881 l 381 671 l 304 671 l 304 881 q 257 1046 293 939 q 206 1190 228 1125 l 288 1190 l 343 987 l 396 1190 m 683 932 l 683 797 q 661 705 683 734 q 579 666 632 666 q 498 705 527 666 q 476 797 476 735 l 476 932 q 498 1023 476 994 q 579 1063 527 1063 q 661 1023 632 1063 q 683 932 683 994 m 942 1058 l 942 671 l 872 671 l 872 714 q 792 666 831 666 q 746 694 756 666 q 740 753 740 713 l 740 1058 l 811 1058 l 811 773 q 811 746 811 748 q 828 729 814 729 q 872 763 849 729 l 872 1058 l 942 1058 z "},"飬�":{"ha":1091,"x_min":4,"x_max":1087,"o":"m 463 674 q 264 320 455 660 q 213 284 243 284 l 28 284 q 4 298 12 284 q 4 326 -4 311 l 200 673 q 200 674 201 673 l 75 890 q 74 918 66 907 q 99 930 81 930 l 284 930 q 336 895 315 930 l 463 674 m 1087 1171 q 1087 1142 1096 1159 l 678 419 l 678 418 l 939 -59 q 939 -88 947 -74 q 915 -99 932 -99 l 729 -99 q 678 -64 697 -99 l 415 418 q 827 1148 429 443 q 877 1183 846 1183 l 1063 1183 q 1087 1171 1080 1183 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 531 598 q 433 770 531 598 q 393 796 417 796 l 250 796 q 230 787 236 796 q 231 765 225 778 l 328 598 l 328 597 l 176 329 q 176 307 169 318 q 195 297 182 297 l 338 297 q 377 325 362 297 l 531 598 m 1015 983 q 996 992 1009 992 l 851 992 q 813 965 828 992 l 494 400 q 698 27 495 398 q 738 0 713 0 l 880 0 q 900 9 894 0 q 899 31 906 19 l 698 400 l 698 401 l 1015 961 q 1015 983 1021 973 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 551 316 l 926 510 l 551 706 l 551 316 m 694 984 q 946 981 825 984 q 1124 973 1067 977 l 1180 970 q 1194 969 1181 970 q 1211 967 1206 968 q 1230 963 1217 966 q 1252 957 1242 961 q 1273 947 1261 953 q 1297 932 1286 941 q 1320 911 1309 923 q 1332 897 1325 907 q 1354 852 1339 887 q 1375 773 1370 816 q 1385 668 1381 724 q 1389 580 1388 612 l 1389 549 l 1389 443 q 1375 219 1390 331 q 1356 141 1370 176 q 1331 94 1342 107 l 1320 81 q 1297 60 1309 69 q 1273 45 1286 51 q 1252 36 1261 40 q 1230 29 1242 32 q 1211 26 1217 27 q 1193 24 1205 25 q 1180 22 1181 22 q 694 8 986 8 q 416 13 534 9 q 260 19 298 16 l 222 22 l 195 25 q 152 33 167 29 q 113 49 138 36 q 69 81 88 61 q 57 95 64 85 q 34 140 50 105 q 14 219 19 176 q 4 324 8 268 q 0 412 1 381 l 0 443 l 0 549 q 14 773 -1 661 q 33 851 19 816 q 58 898 47 885 l 69 911 q 91 932 80 923 q 115 947 103 941 q 137 957 128 953 q 159 963 146 961 q 177 967 172 966 q 195 969 183 968 q 208 970 208 970 q 694 984 403 984 z "},"飬�":{"ha":1389,"x_min":50,"x_max":1339,"o":"m 312 643 l 694 406 l 429 185 l 50 432 l 312 643 m 1076 212 l 1076 129 l 696 -98 l 696 -99 l 695 -98 l 694 -99 l 694 -98 l 315 129 l 315 212 l 429 138 l 694 358 l 694 360 l 695 359 l 696 360 l 696 358 l 962 138 l 1076 212 m 429 1099 l 694 878 l 312 643 l 50 852 l 429 1099 m 1077 643 l 1339 432 l 960 185 l 694 406 l 1077 643 m 960 1099 l 1339 852 l 1077 643 l 694 878 l 960 1099 z "},"飬�":{"ha":1190,"x_min":9,"x_max":1182,"o":"m 999 -74 l 133 -74 l 133 298 l 9 298 l 9 -198 l 1123 -198 l 1123 298 l 999 298 l 999 -74 m 269 332 l 295 453 l 901 326 l 876 205 l 269 332 m 349 622 l 401 735 l 963 472 l 911 360 l 349 622 m 505 898 l 584 993 l 1059 595 l 980 500 l 505 898 m 812 1190 l 1182 694 l 1083 619 l 713 1116 l 812 1190 m 256 50 l 256 174 l 876 174 l 876 50 l 256 50 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 736 356 q 765 385 736 356 q 794 496 794 414 q 736 636 794 578 q 595 694 677 694 q 455 636 513 694 q 397 496 397 578 q 455 356 397 414 q 595 298 513 298 q 736 356 677 298 m 811 712 q 856 668 811 712 q 901 496 901 623 q 811 280 901 369 q 595 191 722 191 q 379 280 468 191 q 290 496 290 369 q 379 712 290 623 q 595 801 468 801 q 811 712 722 801 m 963 864 q 974 854 963 864 q 984 814 984 843 q 963 763 984 784 q 913 742 942 742 q 863 763 884 742 q 842 814 842 784 q 863 864 842 843 q 913 885 884 885 q 963 864 942 885 m 655 985 q 628 985 655 985 q 595 984 601 984 q 536 985 590 984 q 454 985 482 985 q 379 982 426 984 q 300 975 332 980 q 244 960 267 969 q 176 915 205 945 q 131 847 146 886 q 117 792 122 825 q 109 712 111 759 q 107 637 107 665 q 107 555 106 609 q 107 496 107 501 q 107 437 107 491 q 107 355 106 383 q 109 280 107 327 q 117 200 111 233 q 131 145 122 167 q 176 77 146 106 q 244 32 205 47 q 300 17 267 23 q 379 10 332 12 q 454 7 426 8 q 536 7 482 7 q 595 8 590 8 q 655 7 601 8 q 736 7 708 7 q 811 10 764 8 q 891 17 858 12 q 946 32 924 23 q 1015 77 985 47 q 1059 145 1044 106 q 1074 200 1068 167 q 1082 280 1080 233 q 1084 355 1084 327 q 1084 437 1084 383 q 1084 496 1084 491 q 1084 555 1084 501 q 1084 637 1084 609 q 1082 712 1084 665 q 1074 792 1080 759 q 1059 847 1068 825 q 1015 915 1044 886 q 946 960 985 945 q 891 975 924 969 q 811 982 858 980 q 736 985 764 984 q 655 985 708 985 m 1187 742 q 1190 496 1190 674 q 1187 250 1190 319 q 1090 1 1179 89 q 841 -95 1002 -88 q 595 -99 773 -99 q 350 -95 418 -99 q 100 1 188 -88 q 4 250 12 89 q 0 496 0 319 q 4 742 0 674 q 100 991 12 903 q 350 1087 188 1080 q 595 1091 418 1091 q 841 1087 773 1091 q 1090 991 1002 1080 q 1187 742 1179 903 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 m 493 380 q 517 404 493 380 q 541 496 541 428 q 493 612 541 564 q 377 660 445 660 q 260 612 308 660 q 212 496 212 564 q 260 380 212 428 q 377 332 308 332 q 493 380 445 332 m 930 380 q 954 404 930 380 q 978 496 978 428 q 930 612 978 564 q 814 660 882 660 q 698 612 746 660 q 649 496 649 564 q 698 380 649 428 q 814 332 746 332 q 930 380 882 332 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 595 708 l 751 471 l 439 471 l 595 708 m 878 298 l 951 298 l 595 833 l 239 298 l 312 298 l 393 422 l 798 422 l 878 298 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飬�":{"ha":1091,"x_min":0,"x_max":1092,"o":"m 632 525 q 593 446 638 476 q 506 442 547 417 q 465 487 476 455 q 464 550 453 519 q 505 595 475 582 q 561 605 532 609 q 610 577 589 600 q 632 525 632 554 m 718 541 q 630 668 707 624 q 477 678 553 712 q 400 610 429 656 q 373 509 370 563 q 433 389 376 439 q 561 346 490 339 q 679 411 632 352 q 718 541 726 470 m 903 961 q 860 996 887 982 q 815 1013 832 1009 q 760 1022 798 1016 q 321 1021 534 1059 q 270 1011 288 1015 q 227 994 252 1008 q 188 961 202 981 q 247 926 212 939 q 304 909 283 912 q 372 900 326 905 q 719 899 549 877 q 789 908 768 905 q 845 925 809 911 q 903 961 880 939 m 947 159 q 935 100 941 139 q 924 34 929 60 q 902 -20 919 9 q 857 -64 885 -48 q 710 -119 791 -101 q 554 -136 630 -137 q 398 -122 477 -135 q 334 -108 362 -115 q 275 -87 307 -100 q 219 -53 243 -74 q 178 -5 194 -33 q 134 221 159 69 l 139 233 l 153 240 q 545 126 326 126 q 939 240 765 126 q 957 222 955 236 q 953 188 960 209 q 947 159 947 166 m 1087 904 q 1001 396 1067 774 q 980 353 997 373 q 947 322 963 332 q 904 298 930 311 q 432 229 709 200 q 126 337 239 250 q 107 358 115 346 q 93 385 98 369 q 86 411 88 401 q 82 442 84 422 q 78 469 79 462 q 57 585 71 508 q 35 710 43 663 q 17 825 27 758 q 0 947 7 891 q 14 985 2 967 q 38 1014 25 1002 q 73 1037 51 1025 q 109 1054 95 1049 q 146 1069 122 1060 q 388 1118 243 1104 q 912 1080 682 1147 q 1079 985 1032 1044 q 1092 946 1091 970 q 1087 904 1092 922 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 657 516 q 625 567 657 550 q 566 568 594 585 q 533 512 532 553 q 567 457 533 471 q 629 460 597 439 q 657 516 662 481 m 719 529 q 691 435 725 477 q 606 388 657 392 q 514 419 555 383 q 470 506 473 454 q 490 578 469 544 q 546 628 512 612 q 656 620 601 652 q 719 529 711 588 m 853 832 q 811 805 837 815 q 770 793 785 795 q 721 787 755 791 q 470 787 601 771 q 421 794 436 791 q 380 806 406 797 q 338 832 354 816 q 366 856 348 846 q 397 868 384 865 q 433 874 410 870 q 749 875 587 901 q 789 868 775 871 q 822 856 803 866 q 853 832 842 846 m 885 253 q 889 274 885 259 q 892 299 894 289 q 878 312 890 308 q 595 229 753 229 q 312 312 437 229 l 302 307 l 298 298 q 330 135 319 178 q 488 51 367 72 q 820 92 681 16 q 858 132 846 107 q 875 198 870 157 q 885 253 881 239 m 986 791 q 980 849 993 832 q 860 917 946 891 q 482 945 692 966 q 307 909 380 935 q 261 890 277 898 q 224 863 244 882 q 202 822 205 845 q 216 715 208 769 q 239 582 225 660 q 257 476 253 504 q 261 452 258 472 q 267 424 264 432 q 276 403 269 416 q 293 381 283 390 q 513 304 374 319 q 854 353 714 282 q 885 370 873 363 q 909 393 897 378 q 924 424 921 408 q 986 791 961 631 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":794,"x_min":53,"x_max":794,"o":"m 732 160 l 794 -23 q 708 -74 776 -50 q 570 -99 639 -98 q 423 -79 490 -101 q 312 -22 356 -57 q 239 60 269 14 q 196 153 208 107 q 183 245 183 200 l 183 667 l 53 667 l 53 833 q 153 887 109 853 q 223 957 197 921 q 268 1036 250 993 q 295 1113 287 1079 q 306 1181 302 1146 q 310 1188 307 1185 q 315 1190 312 1190 l 505 1190 l 505 862 l 763 862 l 763 667 l 504 667 l 504 265 q 509 222 504 242 q 526 181 514 202 q 565 149 539 160 q 628 138 591 137 q 732 160 688 140 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 880 58 l 832 200 q 753 183 798 183 q 705 191 725 182 q 675 215 684 200 q 661 247 665 231 q 657 281 657 263 l 657 589 l 856 589 l 856 739 l 658 739 l 658 992 l 512 992 q 505 984 506 992 q 492 917 501 950 q 462 843 482 884 q 402 770 441 803 q 310 717 363 736 l 310 589 l 411 589 l 411 265 q 427 176 411 221 q 478 90 444 131 q 572 24 512 49 q 708 0 632 -2 q 814 19 762 1 q 880 58 867 38 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飬�":{"ha":595,"x_min":2,"x_max":593,"o":"m 570 198 q 593 184 587 198 q 589 157 599 169 l 318 -141 q 300 -149 310 -149 q 281 -141 289 -149 l 6 157 q 2 184 -4 169 q 25 198 9 198 l 198 198 l 198 1166 q 205 1184 198 1177 q 223 1190 212 1190 l 372 1190 q 390 1184 383 1190 q 397 1166 397 1177 l 397 198 l 570 198 z "},"飬�":{"ha":595,"x_min":2,"x_max":593,"o":"m 593 808 q 570 794 586 794 l 397 794 l 397 -174 q 390 -191 397 -184 q 372 -198 383 -198 l 223 -198 q 205 -191 212 -198 q 198 -174 198 -184 l 198 794 l 25 794 q 2 808 9 794 q 6 836 -4 823 l 277 1133 q 295 1141 285 1141 q 314 1133 306 1141 l 589 836 q 593 808 599 823 z "},"飬�":{"ha":1389,"x_min":50,"x_max":1389,"o":"m 1389 570 l 1389 422 q 1382 404 1389 411 q 1364 397 1375 397 l 397 397 l 397 223 q 382 201 397 207 q 355 205 367 195 l 57 476 q 50 494 50 484 q 57 512 50 505 l 355 787 q 382 791 367 798 q 397 769 397 784 l 397 595 l 1364 595 q 1382 588 1375 595 q 1389 570 1389 581 z "},"飬�":{"ha":1389,"x_min":0,"x_max":1339,"o":"m 1339 498 q 1332 480 1339 488 l 1034 205 q 1007 201 1022 195 q 992 223 992 208 l 992 397 l 25 397 q 7 404 14 397 q 0 422 0 411 l 0 570 q 7 588 0 581 q 25 595 14 595 l 992 595 l 992 769 q 1007 791 992 785 q 1034 787 1022 798 l 1332 516 q 1339 498 1339 508 z "},"飬�":{"ha":1091,"x_min":0,"x_max":1080,"o":"m 1080 249 q 984 55 1049 152 q 785 -97 884 -97 q 677 -72 747 -97 q 560 -47 610 -47 q 450 -73 512 -47 q 347 -99 387 -99 q 114 102 229 -99 q 0 491 0 304 q 88 781 0 668 q 308 893 175 893 q 445 870 363 893 q 552 846 525 846 q 663 873 587 846 q 797 899 742 899 q 962 849 889 899 q 1042 771 1002 821 q 954 680 981 719 q 904 519 904 607 q 957 346 904 423 q 1080 249 1011 270 m 788 1158 q 766 1053 788 1111 q 694 946 742 994 q 610 890 652 904 q 529 877 581 881 q 590 1076 532 992 q 784 1190 647 1159 q 786 1182 784 1188 q 787 1173 787 1176 q 788 1166 787 1170 q 788 1158 788 1161 z "},"飬�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 529 411 l 529 -94 l 0 -21 l 0 411 l 529 411 m 529 987 l 529 476 l 0 476 l 0 914 l 529 987 m 1290 411 l 1290 -198 l 587 -102 l 587 411 l 1290 411 m 1290 1091 l 1290 476 l 587 476 l 587 994 l 1290 1091 z "},"飬�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 361 825 q 365 821 361 825 q 382 816 370 816 q 403 825 395 816 q 412 846 412 834 q 403 868 412 859 q 382 877 395 877 q 361 868 370 877 q 353 846 353 859 q 361 825 353 834 m 688 825 q 692 821 688 825 q 709 816 697 816 q 730 825 722 816 q 739 846 739 834 q 730 868 739 859 q 709 877 722 877 q 688 868 697 877 q 679 846 679 859 q 688 825 679 834 m 80 674 q 136 650 112 674 q 159 594 159 627 l 159 261 q 136 205 159 228 q 80 181 113 181 q 23 205 47 181 q 0 261 0 228 l 0 594 q 23 650 0 627 q 80 674 47 674 m 901 659 l 901 143 q 877 82 901 107 q 817 57 852 57 l 759 57 l 759 -119 q 736 -175 759 -152 q 679 -198 712 -198 q 622 -175 646 -198 q 599 -119 599 -152 l 599 57 l 492 57 l 492 -119 q 469 -175 492 -152 q 412 -198 446 -198 q 357 -175 380 -198 q 333 -119 333 -152 l 332 57 l 275 57 q 215 82 239 57 q 190 143 190 107 l 190 659 l 901 659 m 722 973 q 854 854 805 930 q 904 687 904 777 l 187 687 q 236 854 187 777 q 370 973 286 930 l 315 1074 q 319 1090 309 1084 q 334 1085 329 1094 l 390 983 q 546 1015 463 1015 q 701 983 628 1015 l 757 1085 q 773 1090 763 1094 q 777 1074 782 1084 l 722 973 m 1091 594 l 1091 261 q 1068 205 1091 228 q 1011 181 1045 181 q 956 205 979 181 q 932 261 932 228 l 932 594 q 956 651 932 628 q 1011 674 979 674 q 1068 651 1045 674 q 1091 594 1091 628 z "},"飬�":{"ha":1190,"x_min":9,"x_max":1185,"o":"m 514 872 q 502 864 505 871 q 495 856 498 856 q 491 860 491 856 q 506 872 491 870 q 514 872 510 872 m 581 861 q 572 866 578 860 q 559 870 567 872 q 584 868 577 878 q 581 861 586 863 m 309 530 q 305 528 306 531 q 301 518 303 525 q 297 508 299 512 q 289 498 295 504 q 288 488 281 489 q 298 494 291 488 q 308 508 305 500 q 309 513 308 510 q 311 518 310 516 q 312 521 312 519 q 312 524 312 523 q 312 527 312 525 q 312 529 312 528 q 309 530 311 529 m 972 252 q 929 284 972 266 q 935 306 932 296 q 939 326 938 315 q 941 343 940 336 q 942 360 942 349 q 941 375 941 371 q 938 392 941 379 q 935 408 935 405 q 931 427 935 411 q 927 448 928 444 q 891 528 919 485 q 835 586 862 570 q 879 522 853 570 q 921 306 946 396 q 882 274 912 275 q 852 288 858 270 q 846 353 846 305 q 837 436 846 400 q 822 489 830 466 q 807 524 814 512 q 795 543 800 536 q 785 555 790 550 q 779 560 780 560 q 755 640 768 608 q 732 684 742 672 q 714 709 722 695 q 702 740 705 723 q 707 782 699 756 q 710 820 715 807 q 676 839 706 833 q 641 853 664 842 q 614 866 618 865 q 605 886 608 867 q 612 925 603 905 q 639 946 620 946 q 679 923 668 949 q 682 878 690 898 q 680 858 674 863 q 704 857 687 852 q 714 885 714 860 q 714 914 714 910 q 703 953 710 937 q 687 976 697 968 q 669 988 677 984 q 648 994 660 991 q 579 890 565 987 q 578 878 579 878 q 555 886 571 885 q 530 886 539 887 q 518 890 520 884 q 505 960 519 934 q 470 986 492 985 q 438 965 450 987 q 426 918 427 942 q 428 890 425 907 q 438 861 432 873 q 450 850 445 849 q 463 861 458 853 q 457 867 466 868 q 445 879 452 867 q 438 904 439 890 q 445 933 437 922 q 471 944 453 945 q 492 928 484 944 q 500 898 500 911 q 498 880 499 884 q 474 858 481 869 q 453 840 468 849 q 437 830 438 831 q 425 809 427 819 q 431 795 423 799 q 450 780 442 789 q 463 765 459 771 q 477 755 467 760 q 505 750 488 751 q 584 762 541 749 q 601 767 585 763 q 628 775 618 772 q 651 786 639 779 q 667 799 663 792 q 683 805 674 810 q 688 799 687 803 q 686 789 689 794 q 673 782 682 784 q 629 765 657 777 q 594 750 601 753 q 539 732 560 736 q 478 734 520 729 q 471 732 470 736 q 484 718 472 729 q 536 701 504 700 q 564 706 550 701 q 592 717 579 711 q 618 730 605 723 q 641 744 631 738 q 660 753 652 749 q 674 755 669 756 q 680 746 679 753 q 680 743 680 745 q 677 739 679 741 q 672 736 674 737 q 665 732 670 734 q 658 728 661 729 q 651 724 656 727 q 643 721 646 722 q 591 687 622 710 q 539 653 560 663 q 501 653 519 643 q 453 709 485 661 q 433 726 436 733 q 432 718 432 724 q 421 675 432 699 q 398 632 409 650 q 382 587 387 613 q 391 538 377 560 q 342 468 373 533 q 305 359 312 403 q 304 305 304 345 q 300 260 305 266 q 277 257 294 241 q 250 330 253 281 q 253 374 248 352 q 252 388 256 388 q 249 384 250 387 q 257 255 221 333 q 276 233 260 246 q 295 218 291 221 q 375 148 310 200 q 447 88 440 95 q 461 59 460 77 q 450 26 462 41 q 415 8 438 10 q 437 -27 421 -4 q 459 -69 453 -50 q 464 -123 464 -88 q 470 -52 500 -105 q 462 -40 467 -46 q 454 -30 457 -33 q 453 -26 452 -27 q 463 -18 455 -22 q 478 -20 470 -15 q 607 -48 514 -60 q 744 19 710 -36 q 770 43 762 49 q 778 2 780 38 q 760 -69 777 -17 q 756 -98 753 -87 q 774 -110 758 -109 q 786 -50 777 -95 q 796 19 794 -5 q 791 76 798 36 q 785 152 784 117 q 803 206 786 186 q 842 220 815 220 q 869 261 843 249 q 925 269 895 274 q 972 252 956 265 m 485 893 q 483 916 488 906 q 474 928 479 926 q 467 922 467 929 q 471 918 469 918 q 477 906 479 918 q 483 891 474 891 q 485 893 485 891 m 810 740 q 805 749 808 746 q 795 753 801 752 q 784 757 788 754 q 776 763 780 760 q 771 770 773 767 q 767 775 769 772 q 763 778 764 777 q 760 777 763 778 q 766 743 749 764 q 796 718 782 722 q 807 725 803 718 q 810 740 811 732 m 672 905 q 668 920 672 914 q 660 930 664 927 q 653 932 655 933 q 646 931 648 932 q 646 928 645 929 q 650 925 648 926 q 664 901 661 922 q 670 903 664 899 q 672 905 672 904 m 714 1086 q 712 1090 714 1087 q 705 1095 710 1092 q 698 1100 700 1098 q 679 1111 686 1111 q 670 1106 672 1111 q 669 1096 668 1101 q 669 1086 670 1090 q 664 1078 668 1083 q 660 1071 660 1073 q 662 1064 659 1069 q 668 1064 665 1062 q 677 1071 671 1066 q 688 1078 682 1076 q 695 1079 689 1079 q 707 1080 701 1079 q 714 1086 712 1082 m 1152 47 q 1176 28 1167 37 q 1185 9 1184 18 q 1183 -9 1186 0 q 1171 -26 1180 -17 q 1153 -41 1162 -34 q 1130 -55 1144 -47 q 1105 -68 1115 -63 q 1080 -80 1095 -73 q 1059 -90 1066 -87 q 993 -133 1030 -105 q 935 -183 956 -162 q 882 -198 922 -195 q 813 -187 842 -201 q 790 -169 799 -180 q 777 -149 781 -157 q 760 -134 773 -140 q 724 -126 747 -127 q 623 -126 690 -126 q 579 -127 608 -126 q 534 -129 550 -128 q 472 -140 500 -129 q 431 -164 445 -151 q 397 -186 417 -176 q 356 -195 377 -195 q 270 -171 333 -194 q 157 -137 206 -147 q 117 -130 142 -134 q 78 -123 92 -126 q 48 -115 64 -120 q 22 -104 31 -111 q 9 -89 12 -98 q 14 -38 1 -71 q 28 5 27 -4 q 25 36 29 17 q 17 69 21 54 q 14 97 13 83 q 22 118 14 111 q 66 129 33 127 q 112 138 99 130 q 145 165 136 152 q 154 205 154 178 q 129 122 171 148 q 65 111 105 107 q 32 103 39 113 q 36 59 22 91 q 42 45 37 54 q 48 31 47 36 q 52 18 50 26 q 53 1 53 9 q 40 -37 53 -11 q 29 -74 26 -64 q 57 -95 31 -88 q 123 -109 73 -99 q 200 -125 173 -119 q 257 -142 219 -129 q 321 -160 296 -154 q 364 -163 346 -165 q 414 -141 398 -158 q 432 -104 431 -124 q 426 -59 433 -84 q 412 -18 419 -33 q 396 10 404 -3 q 265 198 302 157 q 177 229 212 255 q 166 240 169 222 q 164 270 164 253 q 172 310 165 292 q 191 346 179 328 q 208 379 202 365 q 228 435 214 395 q 251 495 243 474 q 274 543 260 516 q 305 584 289 569 q 401 736 390 695 q 388 976 391 822 q 407 1093 387 1046 q 489 1174 427 1141 q 570 1190 519 1190 q 652 1180 611 1191 q 721 1148 693 1169 q 792 1054 765 1115 q 815 939 818 992 q 838 773 811 866 q 941 605 864 686 q 1018 478 984 559 q 1064 330 1053 398 q 1068 265 1070 292 q 1059 222 1066 237 q 1043 205 1052 206 q 1025 190 1035 203 q 1004 162 1015 177 q 973 136 994 148 q 925 126 952 125 q 901 129 911 126 q 884 140 891 133 q 873 152 877 147 q 864 168 870 157 q 857 183 859 179 q 825 206 840 212 q 804 168 811 201 q 809 93 797 136 q 810 -58 825 39 q 824 -136 802 -109 q 880 -162 846 -164 q 946 -134 915 -160 q 1016 -83 992 -96 q 1096 -50 1039 -69 q 1156 -21 1137 -36 q 1170 5 1174 -7 q 1151 28 1166 18 q 1111 46 1135 37 q 1072 83 1085 54 q 1061 139 1059 112 q 1073 176 1062 167 q 1079 132 1073 152 q 1090 101 1084 112 q 1106 79 1096 89 q 1122 64 1116 68 q 1139 54 1128 60 q 1152 47 1149 48 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 794 28 q 685 414 761 215 l 684 414 l 682 413 q 649 400 670 408 q 570 362 628 392 q 464 299 513 332 q 363 210 415 265 q 283 95 310 155 l 271 104 q 595 -12 414 -12 q 794 28 698 -12 m 650 498 q 609 584 634 536 q 88 512 368 512 q 87 496 87 507 q 121 313 87 400 q 217 157 155 226 q 313 286 256 226 q 423 382 370 346 q 524 445 477 419 q 601 482 572 471 l 630 492 q 640 495 633 493 q 650 498 647 497 m 567 663 q 378 956 474 828 q 197 811 271 905 q 98 601 122 718 q 567 663 332 601 m 1097 415 q 780 438 935 462 q 880 74 848 253 q 1023 221 966 133 q 1097 415 1080 310 m 474 990 q 472 989 473 990 q 474 990 473 990 m 931 877 q 595 1004 787 1004 q 475 990 536 1004 q 666 694 577 858 q 767 741 719 714 q 841 788 814 767 q 892 832 869 809 q 921 864 915 856 q 931 877 927 872 m 1104 501 q 988 819 1101 681 l 987 818 q 973 799 980 809 q 939 765 965 790 q 884 718 913 740 q 806 668 855 696 q 705 618 758 639 q 739 544 724 577 q 744 531 740 540 q 749 518 747 522 q 807 523 777 522 q 864 525 837 525 q 918 524 891 525 q 967 520 944 522 q 1011 516 991 519 q 1048 511 1032 514 q 1077 506 1065 508 q 1096 503 1088 505 l 1104 501 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飬�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 909 367 q 894 438 909 405 q 856 491 879 470 q 800 529 834 512 q 736 555 766 546 q 668 573 706 564 l 587 591 q 553 600 564 597 q 526 608 543 602 q 503 621 510 615 q 490 637 496 627 q 484 660 484 647 q 596 720 484 720 q 656 711 629 720 q 698 689 682 701 q 727 663 713 676 q 758 640 741 649 q 795 631 775 631 q 854 656 832 631 q 876 715 876 680 q 832 792 876 758 q 722 845 789 827 q 581 863 656 863 q 479 851 529 863 q 386 814 429 839 q 317 747 343 790 q 291 647 291 704 q 306 565 291 600 q 350 506 321 529 q 412 469 378 483 q 491 443 445 454 l 605 415 q 691 388 674 398 q 716 341 716 372 q 685 291 716 311 q 604 271 654 271 q 533 284 564 271 q 482 314 501 296 q 447 348 463 331 q 412 378 431 366 q 370 391 392 391 q 311 367 331 391 q 291 309 291 344 q 386 187 291 238 q 612 136 481 136 q 720 151 668 136 q 815 192 772 165 q 884 265 858 219 q 909 367 909 310 m 1190 198 q 1103 -12 1190 75 q 893 -99 1016 -99 q 711 -37 792 -99 q 595 -50 652 -50 q 383 -7 484 -50 q 209 110 282 36 q 93 284 136 183 q 50 496 50 385 q 62 612 50 553 q 0 794 0 693 q 87 1004 0 917 q 298 1091 174 1091 q 479 1029 398 1091 q 595 1042 539 1042 q 807 999 706 1042 q 982 882 908 956 q 1098 708 1055 809 q 1141 496 1141 607 q 1128 380 1141 439 q 1190 198 1190 299 z "},"飭�":{"ha":992,"x_min":34,"x_max":951,"o":"m 775 854 l 804 1004 q 797 1035 808 1022 q 770 1049 786 1049 l 218 1049 q 188 1035 200 1049 q 176 1007 176 1022 l 176 153 q 181 153 176 148 l 406 426 q 436 451 424 446 q 473 457 447 457 l 658 457 q 687 469 675 457 q 701 491 698 480 q 729 639 719 592 q 720 670 732 656 q 692 685 708 685 l 464 685 q 427 700 442 685 q 412 737 412 715 l 412 770 q 427 806 412 792 q 464 821 442 821 l 732 821 q 760 831 746 821 q 775 854 773 842 m 951 1026 q 910 820 939 970 q 856 548 880 670 q 829 414 832 427 q 822 389 824 397 q 811 363 819 381 q 792 338 802 346 q 762 322 781 329 q 717 314 742 314 l 507 314 q 490 306 497 314 q 160 -77 484 299 q 114 -99 143 -96 q 77 -95 86 -102 q 34 -19 34 -78 l 34 1074 q 64 1154 34 1117 q 157 1190 93 1190 l 845 1190 q 943 1149 918 1190 q 951 1026 968 1108 m 951 1026 l 829 414 q 856 548 832 427 q 910 820 880 670 q 951 1026 939 970 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 546 149 l 546 942 q 539 960 546 953 q 521 967 532 967 l 149 967 q 131 960 138 967 q 124 942 124 953 l 124 149 q 131 131 124 138 q 149 124 138 124 l 521 124 q 539 131 532 124 q 546 149 546 138 m 1066 446 l 1066 942 q 1059 960 1066 953 q 1042 967 1053 967 l 670 967 q 652 960 659 967 q 645 942 645 953 l 645 446 q 652 429 645 436 q 670 422 659 422 l 1042 422 q 1059 429 1053 422 q 1066 446 1066 436 m 1190 1042 l 1190 -50 q 1176 -84 1190 -70 q 1141 -99 1161 -99 l 50 -99 q 15 -84 29 -99 q 0 -50 0 -70 l 0 1042 q 15 1077 0 1062 q 50 1091 29 1091 l 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 z "},"飭�":{"ha":992,"x_min":0,"x_max":992,"o":"m 992 372 q 970 319 992 341 q 918 298 949 298 q 856 331 878 298 l 680 595 l 645 595 l 645 493 l 836 174 q 843 149 843 163 q 829 114 843 129 q 794 99 814 99 l 645 99 l 645 -112 q 619 -173 645 -147 q 558 -198 594 -198 l 434 -198 q 373 -173 398 -198 q 347 -112 347 -147 l 347 99 l 198 99 q 164 114 178 99 q 149 149 149 129 q 156 174 149 163 l 347 493 l 347 595 l 312 595 l 136 331 q 74 298 114 298 q 22 319 43 298 q 0 372 0 341 q 12 413 0 395 l 211 711 q 347 794 267 794 l 645 794 q 781 711 725 794 l 980 413 q 992 372 992 395 m 619 1115 q 644 1090 619 1115 q 670 992 670 1064 q 619 869 670 920 q 496 818 568 818 q 373 869 424 818 q 322 992 322 920 q 373 1115 322 1064 q 496 1166 424 1166 q 619 1115 568 1166 z "},"飭�":{"ha":794,"x_min":0,"x_max":794,"o":"m 794 645 l 794 322 q 772 270 794 291 q 719 248 750 248 q 667 270 688 248 q 645 322 645 291 l 645 595 l 595 595 l 595 -112 q 570 -173 595 -147 q 508 -198 544 -198 q 447 -173 473 -198 q 422 -112 422 -147 l 422 248 l 372 248 l 372 -112 q 346 -173 372 -147 q 285 -198 321 -198 q 224 -173 250 -198 q 198 -112 198 -147 l 198 595 l 149 595 l 149 322 q 127 270 149 291 q 74 248 105 248 q 22 270 43 248 q 0 322 0 291 l 0 645 q 43 750 0 707 q 149 794 87 794 l 645 794 q 750 750 707 794 q 794 645 794 707 m 520 1115 q 545 1090 520 1115 q 570 992 570 1064 q 520 869 570 920 q 397 818 469 818 q 274 869 325 818 q 223 992 223 920 q 274 1115 223 1064 q 397 1166 325 1166 q 520 1115 469 1166 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 599 181 l 870 548 q 889 594 883 565 q 885 660 896 622 q 837 721 873 697 q 773 741 806 741 q 716 727 739 740 q 674 692 692 714 q 599 661 646 661 q 525 692 553 661 q 483 727 507 714 q 426 741 460 740 q 361 721 393 741 q 314 660 326 697 q 310 594 303 622 q 329 548 316 565 l 599 181 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飭�":{"ha":1389,"x_min":34,"x_max":1355,"o":"m 1106 323 q 1123 364 1106 323 q 1141 496 1141 405 q 1106 669 1141 587 q 1010 812 1070 752 q 868 907 950 872 q 694 942 785 942 q 521 907 604 942 q 379 812 439 872 q 283 669 319 752 q 248 496 248 587 q 283 323 248 405 q 379 180 319 240 q 521 85 439 120 q 694 50 604 50 q 868 85 785 50 q 1010 180 950 120 q 1106 323 1070 240 m 1355 281 q 1339 266 1352 270 l 1113 191 l 1113 -46 q 1103 -66 1113 -58 q 1080 -69 1091 -74 l 854 4 l 715 -188 q 694 -198 707 -198 q 674 -188 682 -198 l 535 4 l 308 -69 q 286 -66 298 -74 q 276 -46 276 -58 l 276 191 l 50 266 q 34 281 37 270 q 37 304 30 295 l 177 496 l 37 688 q 34 711 30 698 q 50 726 37 722 l 276 801 l 276 1038 q 286 1058 276 1050 q 308 1061 298 1066 l 535 988 l 674 1180 q 694 1190 681 1190 q 715 1180 708 1190 l 854 988 l 1080 1061 q 1103 1058 1091 1066 q 1113 1038 1113 1050 l 1113 801 l 1339 726 q 1355 711 1352 722 q 1352 688 1359 698 l 1212 496 l 1352 304 q 1355 281 1359 295 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1139,"o":"m 978 181 q 893 174 936 174 q 632 243 752 174 q 442 433 512 313 q 372 694 372 553 q 453 971 372 843 q 198 794 297 925 q 99 496 99 663 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 807 48 707 0 q 978 181 908 95 m 1135 246 q 916 -5 1063 89 q 595 -99 769 -99 q 364 -52 474 -99 q 174 75 254 -5 q 47 265 95 155 q 0 496 0 375 q 45 723 0 615 q 165 910 89 831 q 348 1037 242 989 q 573 1090 454 1086 q 620 1060 607 1092 q 608 1004 634 1028 q 506 864 542 944 q 471 694 471 784 q 528 483 471 580 q 681 329 584 386 q 893 273 778 273 q 1070 312 984 273 q 1125 302 1101 326 q 1139 276 1136 291 q 1135 246 1142 260 z "},"飭�":{"ha":1389,"x_min":50,"x_max":1339,"o":"m 829 511 q 836 518 829 511 q 843 546 843 525 q 829 581 843 566 q 794 595 814 595 l 595 595 q 560 581 575 595 q 546 546 546 566 q 560 511 546 525 q 595 496 575 496 l 794 496 q 829 511 814 496 m 1290 694 l 1290 -50 q 1275 -84 1290 -70 q 1240 -99 1260 -99 l 149 -99 q 114 -84 129 -99 q 99 -50 99 -70 l 99 694 q 114 729 99 715 q 149 744 129 744 l 1240 744 q 1275 729 1260 744 q 1290 694 1290 715 m 1339 1042 l 1339 843 q 1325 808 1339 823 q 1290 794 1310 794 l 99 794 q 64 808 79 794 q 50 843 50 823 l 50 1042 q 64 1077 50 1062 q 99 1091 79 1091 l 1290 1091 q 1325 1077 1310 1091 q 1339 1042 1339 1062 z "},"飭�":{"ha":1290,"x_min":25,"x_max":1265,"o":"m 1250 481 q 1258 474 1250 481 q 1265 446 1265 467 q 1250 412 1265 426 q 1215 397 1235 397 l 1042 397 q 990 172 1042 264 l 1151 10 q 1166 -25 1166 -5 q 1151 -60 1166 -45 q 1116 -74 1137 -74 q 1081 -60 1095 -74 l 928 93 q 916 83 924 89 q 884 61 908 77 q 833 33 859 45 q 770 10 808 20 q 694 0 732 0 l 694 694 l 595 694 l 595 0 q 517 10 556 0 q 449 36 477 21 q 398 66 421 51 q 364 91 375 81 l 353 102 l 211 -58 q 174 -74 195 -74 q 140 -62 155 -74 q 124 -28 126 -48 q 136 9 123 -7 l 293 184 q 248 397 248 273 l 74 397 q 40 412 54 397 q 25 446 25 426 q 40 481 25 467 q 74 496 54 496 l 248 496 l 248 724 l 114 858 q 99 893 99 873 q 114 928 99 913 q 149 942 129 942 q 184 928 169 942 l 318 794 l 972 794 l 1106 928 q 1141 942 1121 942 q 1176 928 1161 942 q 1190 893 1190 913 q 1176 858 1190 873 l 1042 724 l 1042 496 l 1215 496 q 1250 481 1235 496 m 893 893 l 397 893 q 469 1068 397 996 q 645 1141 542 1141 q 820 1068 748 1141 q 893 893 893 996 z "},"飭�":{"ha":1488,"x_min":-1,"x_max":1486,"o":"m 1486 787 q 1370 560 1504 738 q 1319 494 1351 535 q 1277 438 1288 454 q 1253 400 1265 422 q 1244 367 1241 377 q 1254 340 1246 357 q 1279 307 1261 324 q 1323 266 1297 290 q 1327 263 1326 264 q 1475 91 1436 161 q 1480 82 1477 88 q 1485 61 1483 76 q 1485 35 1488 47 q 1466 14 1482 23 q 1420 4 1449 4 l 1221 1 q 1178 5 1203 -3 q 1138 22 1153 12 l 1122 31 q 1068 81 1099 47 q 1015 141 1037 114 q 968 186 993 167 q 924 198 942 204 q 918 195 922 197 q 904 184 914 193 q 888 161 895 174 q 875 121 880 147 q 870 60 869 94 q 867 39 870 49 q 861 25 864 29 l 858 21 q 817 4 844 6 l 728 4 q 615 17 673 1 q 513 58 556 33 q 433 109 469 83 q 378 153 397 135 l 359 172 q 338 195 351 180 q 282 266 324 211 q 200 383 240 321 q 105 546 160 445 q 4 757 50 648 q -1 778 -1 770 q 2 791 -1 787 l 5 795 q 49 810 16 810 l 261 811 q 279 806 270 810 q 291 800 288 803 l 295 798 q 314 773 308 789 q 350 693 329 734 q 381 629 370 651 l 394 607 q 437 526 416 560 q 475 473 458 492 q 507 443 491 454 q 533 432 522 432 q 554 436 544 432 q 558 440 556 437 q 567 457 560 443 q 578 494 574 471 q 585 556 581 516 q 585 653 589 597 q 578 710 584 684 q 567 746 573 736 l 563 755 q 497 788 543 781 q 501 807 487 790 q 530 830 513 822 q 715 849 571 850 q 820 839 779 848 q 846 828 836 835 q 862 810 856 822 q 870 785 867 798 q 873 749 873 772 q 872 707 873 727 q 870 652 871 687 q 869 588 869 618 q 868 556 869 580 q 868 519 867 532 q 870 487 868 505 q 879 457 873 469 q 897 438 886 445 q 910 435 903 436 q 930 443 917 433 q 960 470 943 453 q 1000 522 976 487 q 1053 605 1024 557 q 1135 780 1099 686 q 1143 793 1139 787 q 1152 801 1148 799 l 1155 804 q 1159 806 1156 805 q 1169 808 1161 807 q 1184 808 1177 809 l 1407 810 q 1457 808 1438 814 q 1481 795 1476 802 l 1486 787 z "},"飭�":{"ha":1389,"x_min":0,"x_max":1382,"o":"m 523 195 q 532 249 539 222 q 497 288 524 276 q 440 288 470 298 q 394 253 410 278 q 384 200 377 226 q 417 160 391 173 q 475 158 443 148 q 523 195 506 169 m 596 289 q 599 310 602 299 q 585 324 595 320 q 563 324 574 328 q 546 309 552 319 q 556 274 533 285 q 579 275 567 270 q 596 289 591 279 m 731 206 q 608 90 696 127 q 435 81 521 53 q 320 179 352 107 q 326 324 289 250 q 443 432 362 396 q 606 446 524 467 q 729 354 692 424 q 731 206 766 284 m 973 330 q 904 462 966 405 q 742 546 842 519 q 529 563 643 574 q 243 453 357 545 q 140 248 129 361 q 209 116 147 174 q 371 32 271 59 q 584 16 470 5 q 870 125 756 33 q 973 330 984 217 m 1211 327 q 1183 219 1211 274 q 1098 113 1154 164 q 968 22 1042 62 q 792 -43 893 -19 q 583 -67 692 -67 q 370 -41 474 -67 q 183 31 266 -15 q 50 148 101 78 q 0 303 0 219 q 54 493 0 392 q 207 693 108 594 q 472 876 338 824 q 663 870 605 928 q 678 708 713 821 q 677 693 675 698 q 685 687 680 688 q 696 688 691 687 q 707 691 702 689 l 711 692 q 902 738 819 738 q 1021 691 985 738 q 1021 553 1056 642 q 1017 537 1019 543 q 1021 527 1015 532 q 1030 522 1026 523 q 1043 517 1034 520 q 1123 481 1087 503 q 1185 417 1159 458 q 1211 327 1211 377 m 1076 861 q 1099 854 1076 861 q 1154 811 1121 847 q 1196 727 1187 774 q 1191 636 1206 679 q 1168 609 1185 618 q 1134 606 1152 601 q 1108 629 1116 612 q 1104 663 1099 646 q 1086 749 1120 712 q 1003 777 1052 787 q 968 783 984 773 q 949 811 952 793 q 955 846 945 830 q 984 866 965 862 q 1076 861 1030 876 m 1294 937 q 1382 765 1362 863 q 1371 577 1401 667 q 1345 546 1364 556 q 1304 543 1325 536 q 1273 570 1283 550 q 1270 610 1263 589 q 1277 743 1291 674 q 1215 866 1263 813 q 1101 940 1167 919 q 966 946 1034 960 q 926 954 945 942 q 903 987 908 966 q 910 1027 898 1009 q 944 1050 922 1046 q 1133 1041 1039 1070 q 1294 937 1227 1012 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 878 -26 q 593 -99 746 -99 q 308 -26 441 -99 q 491 137 415 41 q 593 345 567 233 q 696 137 620 233 q 878 -26 771 41 m 494 1080 l 494 705 q 396 348 494 509 q 140 111 298 188 q 0 494 0 277 q 65 765 0 639 q 243 974 129 891 q 494 1080 356 1057 m 1190 494 q 1050 111 1190 277 q 794 348 892 188 q 696 705 696 509 l 696 1080 q 948 974 835 1057 q 1126 765 1061 891 q 1190 494 1190 639 z "},"飭�":{"ha":1091,"x_min":0,"x_max":1087,"o":"m 1087 336 q 1028 229 1062 274 q 957 160 994 184 q 880 124 921 136 q 802 113 840 112 q 727 119 763 114 q 660 136 691 125 q 606 158 629 148 q 570 175 583 167 l 557 183 q 333 -96 470 6 q 35 -198 196 -198 q 10 -188 20 -198 q 0 -164 0 -178 q 10 -139 0 -149 q 35 -129 20 -129 q 285 -46 169 -129 q 480 182 401 36 q 424 164 452 171 q 360 154 396 157 q 289 156 323 151 q 217 178 255 161 q 146 224 179 195 q 80 301 112 253 q 22 415 48 350 q 188 459 111 451 q 318 453 266 467 q 415 409 370 439 q 483 350 459 379 q 527 286 508 320 q 588 512 568 388 q 574 510 583 511 q 538 508 566 508 q 484 508 511 507 q 421 516 458 509 q 353 534 384 522 q 288 567 321 545 q 229 617 254 588 q 187 690 205 646 q 165 789 170 735 q 269 817 219 811 q 356 817 318 824 q 427 793 394 809 q 484 755 460 777 q 527 707 508 732 q 560 658 547 683 q 581 615 573 634 q 594 584 590 596 l 597 572 q 606 723 606 667 q 589 736 600 728 q 551 770 579 743 q 502 825 524 797 q 460 898 481 854 q 435 985 440 941 q 444 1083 429 1028 q 498 1190 459 1138 q 597 1143 555 1171 q 663 1084 639 1115 q 700 1018 686 1053 q 716 949 714 983 q 715 882 718 915 q 705 823 713 850 q 691 775 698 796 q 677 742 684 754 l 672 731 q 673 692 673 728 q 672 636 673 656 q 680 651 674 642 q 703 684 685 660 q 742 729 722 708 q 798 772 763 749 q 868 806 832 794 q 955 818 905 818 q 1058 799 1005 817 q 1041 689 1056 739 q 1003 608 1026 640 q 949 553 979 577 q 885 518 918 529 q 820 499 853 506 q 758 492 787 492 q 706 493 729 491 q 670 496 683 494 l 656 498 q 600 279 639 384 q 614 293 605 284 q 652 325 623 302 q 712 366 681 348 q 789 398 743 384 q 880 414 836 413 q 980 396 925 415 q 1087 336 1035 377 z "},"飭�":{"ha":992,"x_min":16,"x_max":976,"o":"m 976 219 l 976 168 q 931 56 976 102 q 824 10 887 10 l 780 10 l 578 -198 l 578 10 l 168 10 q 61 56 105 10 q 16 168 16 102 l 16 219 l 976 219 m 976 472 l 976 274 l 16 274 l 16 472 l 976 472 m 976 726 l 976 529 l 16 529 l 16 726 l 976 726 m 976 835 l 976 783 l 16 783 l 16 835 q 61 946 16 900 q 168 992 105 992 l 824 992 q 931 946 887 992 q 976 835 976 900 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 886 514 q 893 496 893 507 q 886 478 893 485 l 638 230 q 620 223 631 223 q 603 231 610 223 q 595 248 595 238 l 595 397 l 322 397 q 305 404 312 397 q 298 422 298 412 l 298 570 q 305 588 298 581 q 322 595 312 595 l 595 595 l 595 744 q 602 762 595 755 q 620 769 609 769 q 639 761 629 769 l 886 514 m 960 284 q 989 333 960 284 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 893 570 l 893 422 q 885 404 893 412 q 868 397 878 397 l 595 397 l 595 248 q 588 230 595 237 q 570 223 581 223 q 552 231 561 223 l 305 478 q 298 496 298 485 q 305 514 298 507 l 553 762 q 570 769 560 769 q 588 761 581 769 q 595 744 595 754 l 595 595 l 868 595 q 885 588 878 595 q 893 570 893 581 m 960 284 q 989 333 960 284 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 794 744 l 794 248 q 779 213 794 228 q 744 198 764 198 q 715 208 729 198 l 368 456 q 347 496 347 470 q 368 536 347 522 l 715 784 q 744 794 729 794 q 779 779 764 794 q 794 744 794 764 m 992 124 l 992 868 q 985 885 992 878 q 967 893 977 893 l 223 893 q 206 885 213 893 q 198 868 198 878 l 198 124 q 206 107 198 114 q 223 99 213 99 l 967 99 q 985 107 977 99 q 992 124 992 114 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 736 636 q 765 607 736 636 q 794 496 794 578 q 736 356 794 414 q 595 298 677 298 q 455 356 513 298 q 397 496 397 414 q 455 636 397 578 q 595 694 513 694 q 736 636 677 694 m 807 861 q 758 889 807 861 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飭�":{"ha":1290,"x_min":0,"x_max":1263,"o":"m 793 270 l 872 112 q 709 -112 827 -26 q 446 -198 591 -198 q 223 -138 326 -198 q 60 24 120 -78 q 0 248 0 127 q 81 504 0 388 q 294 667 162 619 l 307 566 q 156 438 212 524 q 99 248 99 351 q 201 3 99 105 q 446 -99 303 -99 q 627 -49 544 -99 q 755 87 709 2 q 793 270 800 173 m 1218 193 l 1263 105 l 1064 5 q 1042 0 1054 0 q 997 27 1011 0 l 812 397 l 446 397 q 413 410 428 397 q 397 441 399 422 l 322 1045 q 327 1077 321 1058 q 371 1141 338 1117 q 446 1166 405 1166 q 534 1129 498 1166 q 570 1042 570 1093 q 530 951 570 988 q 437 918 490 913 l 466 694 l 794 694 l 794 595 l 478 595 l 491 496 l 843 496 q 887 469 874 496 l 1064 116 l 1218 193 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1001 696 q 877 868 1009 863 q 635 666 698 874 q 698 680 669 680 q 756 606 764 680 q 698 477 753 562 q 617 391 644 391 q 553 522 584 391 q 519 720 543 564 q 395 857 495 867 q 267 780 349 852 q 205 724 246 761 q 142 668 163 687 l 182 616 q 250 656 241 656 q 332 518 294 656 q 367 390 344 475 q 402 263 391 305 q 529 124 455 124 q 826 352 651 124 q 1001 696 997 571 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飭�":{"ha":893,"x_min":0,"x_max":893,"o":"m 893 546 q 820 272 893 398 q 621 73 746 146 q 347 0 495 0 l 223 0 q 205 7 212 0 q 198 25 198 14 l 198 498 l 32 447 q 25 446 29 446 q 10 451 17 446 q 0 471 0 459 l 0 570 q 18 594 0 588 l 198 649 l 198 722 l 32 670 q 25 670 29 670 q 10 674 17 670 q 0 694 0 682 l 0 794 q 18 818 0 811 l 198 873 l 198 1066 q 205 1084 198 1077 q 223 1091 212 1091 l 347 1091 q 365 1084 358 1091 q 372 1066 372 1077 l 372 926 l 663 1016 q 684 1012 674 1020 q 694 992 694 1004 l 694 893 q 677 869 694 875 l 372 775 l 372 703 l 663 793 q 684 789 674 797 q 694 769 694 781 l 694 670 q 677 646 694 652 l 372 552 l 372 174 q 618 291 518 184 q 719 546 719 398 q 726 563 719 556 q 744 570 733 570 l 868 570 q 886 563 879 570 q 893 546 893 556 z "},"飭�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 893 570 l 893 521 q 886 503 893 510 q 868 496 879 496 l 595 496 l 595 223 q 588 205 595 212 q 570 198 581 198 l 521 198 q 503 205 510 198 q 496 223 496 212 l 496 496 l 223 496 q 205 503 212 496 q 198 521 198 510 l 198 570 q 205 588 198 581 q 223 595 212 595 l 496 595 l 496 868 q 503 886 496 879 q 521 893 510 893 l 570 893 q 588 886 581 893 q 595 868 595 879 l 595 595 l 868 595 q 886 588 879 595 q 893 570 893 581 m 992 223 l 992 868 q 956 956 992 919 q 868 992 919 992 l 223 992 q 136 956 172 992 q 99 868 99 919 l 99 223 q 136 136 99 172 q 223 99 172 99 l 868 99 q 956 136 919 99 q 992 223 992 172 m 1091 868 l 1091 223 q 1026 65 1091 131 q 868 0 960 0 l 223 0 q 65 65 131 0 q 0 223 0 131 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 868 1091 q 1026 1026 960 1091 q 1091 868 1091 960 z "},"飭�":{"ha":1687,"x_min":0,"x_max":1687,"o":"m 481 322 q 273 273 395 273 l 174 273 l 174 322 l 124 322 q 107 341 114 322 q 99 384 99 359 q 105 422 99 403 q 30 431 60 424 q 0 446 0 437 q 30 462 0 456 q 105 470 60 469 q 99 508 99 490 q 107 552 99 534 q 124 570 114 570 l 174 570 l 174 620 l 273 620 q 481 570 395 620 l 1343 570 q 1426 556 1376 565 q 1488 546 1476 548 q 1604 514 1557 534 q 1669 477 1652 494 q 1687 446 1687 460 q 1669 415 1687 432 q 1604 379 1652 398 q 1488 347 1557 359 q 1426 336 1476 345 q 1343 322 1376 328 l 481 322 m 1348 518 q 1389 446 1389 490 q 1348 375 1389 403 l 1411 352 q 1463 446 1463 389 q 1411 541 1463 504 l 1348 518 m 484 310 l 1271 310 q 918 248 1103 281 q 830 229 873 248 q 766 192 787 211 l 744 174 l 521 -50 q 466 -84 501 -70 q 397 -99 432 -99 l 322 -99 l 250 260 l 273 260 q 484 310 395 260 m 273 632 l 250 632 l 322 992 l 397 992 q 467 977 432 992 q 521 942 501 963 l 744 719 q 753 711 747 716 q 776 693 758 706 q 814 671 794 680 q 861 653 833 661 q 918 645 890 645 l 1271 583 l 484 583 q 273 632 395 632 z "},"飭�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 1177 589 q 1258 558 1225 589 q 1290 479 1290 526 q 1218 378 1290 404 l 1084 332 l 1128 203 q 1133 167 1133 187 q 1101 88 1133 121 q 1022 54 1068 54 q 956 75 986 54 q 915 131 926 96 l 872 259 l 632 177 l 674 50 q 680 13 680 31 q 648 -66 680 -33 q 569 -99 615 -99 q 503 -78 532 -99 q 462 -22 474 -57 l 419 104 l 301 63 q 262 56 278 56 q 183 87 215 56 q 152 165 152 118 q 173 231 152 202 q 229 272 195 260 l 350 313 l 268 556 l 147 514 q 110 508 127 508 q 32 539 64 508 q 0 617 0 570 q 21 683 0 653 q 77 724 43 712 l 198 765 l 157 888 q 151 925 151 907 q 184 1004 151 971 q 263 1037 216 1037 q 329 1016 299 1037 q 370 960 358 995 l 412 836 l 652 918 l 610 1042 q 604 1078 604 1060 q 637 1157 604 1124 q 715 1190 670 1190 q 782 1169 752 1190 q 823 1114 811 1148 l 864 989 l 990 1032 q 1023 1036 1006 1036 q 1103 1006 1070 1036 q 1135 929 1135 975 q 1112 866 1135 894 q 1055 826 1089 838 l 933 784 l 1015 539 l 1142 583 q 1177 589 1160 589 m 562 386 l 802 467 l 721 711 l 481 629 l 562 386 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 m 992 273 l 992 611 q 942 568 968 584 q 840 502 916 551 q 722 426 763 453 q 595 372 646 372 l 595 372 l 595 372 q 468 426 544 372 q 358 497 432 450 q 248 569 284 544 q 222 590 239 575 q 198 611 206 605 l 198 273 q 220 220 198 242 q 273 198 242 198 l 918 198 q 970 220 949 198 q 992 273 992 242 m 992 717 q 971 771 992 749 q 918 794 949 794 l 273 794 q 220 772 242 794 q 198 719 198 750 q 222 660 198 691 q 274 610 246 629 q 381 541 311 585 q 481 477 451 497 q 494 468 484 475 q 511 457 505 460 q 527 447 516 453 q 545 437 538 440 q 562 429 553 433 q 579 424 571 426 q 595 422 587 422 q 611 424 603 422 q 629 429 619 426 q 645 437 638 433 q 663 447 653 440 q 680 457 674 453 q 696 468 685 460 q 709 477 707 475 l 916 612 q 968 660 943 629 q 992 717 992 691 z "},"飭�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 98 496 q 150 739 98 622 l 435 -40 q 191 177 283 33 q 98 496 98 322 m 1097 526 q 1095 496 1097 512 q 1087 458 1093 481 q 1078 424 1081 435 q 1065 378 1075 413 q 1051 333 1054 343 l 992 135 l 777 775 q 845 781 812 777 q 865 796 860 783 q 863 820 870 808 q 841 830 856 831 l 682 822 q 525 830 624 823 q 510 826 516 831 q 501 815 503 822 q 500 800 498 808 q 506 787 501 793 q 522 781 512 782 l 584 775 l 677 521 l 546 130 l 329 775 q 398 781 365 777 q 418 796 412 783 q 416 820 423 808 q 394 830 408 831 l 235 822 q 217 823 229 822 q 197 823 205 823 q 410 1020 278 947 q 694 1092 541 1092 q 912 1051 808 1092 q 1097 935 1015 1010 l 1089 935 q 1018 904 1046 935 q 989 830 989 873 q 991 811 989 821 q 994 795 992 802 q 1000 777 995 787 q 1007 761 1004 767 q 1016 743 1009 755 q 1026 727 1023 732 q 1037 708 1028 722 q 1048 691 1046 694 q 1097 526 1097 608 m 705 444 l 888 -57 q 892 -66 889 -62 q 694 -100 794 -100 q 526 -75 608 -100 l 705 444 m 1217 782 q 1290 496 1290 647 q 1210 197 1290 334 q 994 -19 1129 60 l 1176 507 q 1221 721 1221 638 q 1217 782 1221 753 m 425 1135 q 489 1163 425 1135 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 m 438 -114 q 499 -140 438 -114 q 694 -167 560 -167 q 951 -114 829 -167 q 1163 28 1074 -61 q 1304 239 1252 116 q 1357 496 1357 362 q 1304 753 1357 630 q 1163 965 1252 876 q 951 1106 1074 1053 q 694 1159 829 1159 q 438 1106 560 1159 q 226 965 315 1053 q 84 753 137 876 q 32 496 32 630 q 84 239 32 362 q 226 28 137 116 q 438 -114 315 -61 z "},"飭�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 842 1190 l 842 0 l 631 -99 q 310 -20 454 -84 q 83 141 166 43 q 0 353 0 239 q 78 557 0 461 q 291 716 156 653 q 594 800 426 780 l 594 667 q 318 550 426 637 q 210 353 210 463 q 330 146 210 235 q 631 33 450 57 l 631 1087 l 842 1190 m 1360 739 l 1389 437 l 982 525 l 1096 590 q 879 667 1004 644 l 879 800 q 1252 678 1094 774 l 1360 739 z "},"飭�":{"ha":1587,"x_min":0,"x_max":1488,"o":"m 744 1190 l 1488 893 l 1488 794 l 1389 794 q 1373 759 1389 773 q 1335 744 1357 744 l 153 744 q 115 759 131 744 q 99 794 99 773 l 0 794 l 0 893 l 744 1190 m 198 694 l 397 694 l 397 99 l 496 99 l 496 694 l 694 694 l 694 99 l 794 99 l 794 694 l 992 694 l 992 99 l 1091 99 l 1091 694 l 1290 694 l 1290 99 l 1335 99 q 1373 84 1357 99 q 1389 50 1389 70 l 1389 0 l 99 0 l 99 50 q 115 84 99 70 q 153 99 131 99 l 198 99 l 198 694 m 1435 -50 q 1472 -64 1456 -50 q 1488 -99 1488 -79 l 1488 -198 l 0 -198 l 0 -99 q 16 -64 0 -79 q 53 -50 32 -50 l 1435 -50 z "},"飭�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1375 543 l 1389 298 q 1325 198 1392 244 q 1143 126 1259 153 q 893 99 1028 99 q 643 126 758 99 q 460 198 527 153 q 397 298 394 244 l 411 543 l 856 402 q 893 397 873 397 q 930 402 913 397 l 1375 543 m 1769 818 q 1786 794 1786 811 q 1769 770 1786 776 l 901 497 q 893 496 898 496 q 885 497 888 496 l 380 656 q 325 570 346 630 q 298 432 303 510 q 347 347 347 404 q 302 264 347 294 l 347 -71 q 341 -91 349 -82 q 322 -99 334 -99 l 174 -99 q 155 -91 162 -99 q 149 -71 147 -82 l 194 264 q 149 347 149 294 q 199 433 149 404 q 275 689 208 594 l 17 770 q 0 794 0 776 q 17 818 0 811 l 885 1090 q 893 1091 888 1091 q 901 1090 898 1091 l 1769 818 z "},"飭�":{"ha":1190,"x_min":84,"x_max":1106,"o":"m 666 449 l 676 -99 q 594 -91 628 -91 q 513 -99 563 -91 l 523 449 q 393 678 492 502 q 225 968 293 853 q 84 1190 157 1083 q 168 1179 129 1179 q 254 1190 202 1179 q 358 1013 303 1104 q 487 798 412 921 q 594 622 562 676 q 679 760 623 670 q 770 907 736 850 q 852 1044 805 964 q 935 1190 898 1123 q 1018 1180 977 1180 q 1106 1190 1061 1180 l 1106 1190 q 1059 1122 1084 1160 q 1021 1061 1035 1084 q 977 987 1008 1039 q 939 922 947 935 q 666 449 826 729 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1166,"o":"m 595 581 l 1157 581 q 1166 482 1166 529 q 1096 182 1166 314 q 895 -25 1025 50 q 595 -99 764 -99 q 363 -52 474 -99 q 174 74 253 -5 q 47 264 94 154 q 0 496 0 374 q 47 728 0 618 q 174 918 94 838 q 363 1044 253 997 q 595 1091 474 1091 q 994 935 828 1091 l 832 780 q 595 872 737 872 q 410 822 495 872 q 276 685 326 771 q 226 496 226 598 q 276 307 226 394 q 410 171 326 221 q 595 120 495 120 q 719 139 663 120 q 812 185 776 157 q 876 249 849 213 q 916 316 903 284 q 933 377 929 348 l 595 377 l 595 581 z "},"飭�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 849 286 q 849 262 861 274 q 694 214 801 214 q 540 262 588 214 q 540 286 528 274 q 552 291 545 291 q 563 286 559 291 q 694 248 601 248 q 825 286 787 248 q 837 291 830 291 q 849 286 844 291 m 591 475 q 601 465 591 475 q 611 426 611 455 q 591 377 611 398 q 542 357 570 357 q 493 377 513 357 q 472 426 472 398 q 493 476 472 456 q 542 496 513 496 q 591 475 570 496 m 917 426 q 896 377 917 398 q 847 357 876 357 q 798 377 818 357 q 778 426 778 398 q 798 475 778 455 q 847 496 818 496 q 896 476 876 496 q 917 426 917 456 m 1111 519 q 1084 584 1111 557 q 1018 612 1057 612 q 952 584 980 612 q 711 658 851 653 l 760 877 l 915 842 q 935 794 915 814 q 984 773 955 773 q 1033 794 1012 773 q 1053 843 1053 815 q 1033 892 1053 872 q 984 913 1012 913 q 922 874 942 913 l 750 912 q 731 900 736 916 l 677 658 q 438 583 538 653 q 370 612 411 612 q 305 584 332 612 q 277 519 277 557 q 292 470 277 492 q 330 436 306 447 q 326 392 326 415 q 434 204 326 282 q 695 126 543 126 q 957 204 849 126 q 1066 392 1066 282 q 1060 436 1066 417 q 1097 470 1084 448 q 1111 519 1111 492 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 728 315 q 728 295 738 305 q 595 254 687 254 q 463 295 504 254 q 463 315 453 305 q 473 320 467 320 q 483 315 479 320 q 595 283 515 283 q 708 315 675 283 q 718 320 711 320 q 728 315 724 320 m 524 436 q 506 395 524 412 q 464 377 488 377 q 422 395 440 377 q 405 436 405 412 q 422 479 405 461 q 464 496 439 496 q 506 479 489 496 q 524 436 524 461 m 786 436 q 768 395 786 412 q 726 377 750 377 q 684 395 702 377 q 667 436 667 412 q 684 479 667 461 q 726 496 701 496 q 768 479 751 496 q 786 436 786 461 m 953 516 q 929 572 953 549 q 873 595 906 595 q 816 571 840 595 q 609 635 729 632 l 651 823 l 784 793 q 802 751 784 768 q 843 734 819 734 q 885 751 868 734 q 903 794 903 769 q 885 836 903 818 q 843 853 868 853 q 790 820 806 853 l 643 853 q 627 842 630 856 l 581 635 q 375 570 461 630 q 318 595 352 595 q 261 572 284 595 q 238 516 238 549 q 250 474 238 493 q 283 444 263 454 q 279 407 279 425 q 372 245 279 312 q 596 178 465 178 q 821 245 728 178 q 914 407 914 312 q 909 445 914 426 q 941 474 929 455 q 953 516 953 493 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 671 540 l 741 561 l 741 609 q 696 714 741 670 q 589 757 651 757 q 482 714 527 757 q 437 610 437 671 l 437 391 q 426 365 437 375 q 401 354 415 354 q 376 365 386 354 q 365 391 365 375 l 365 484 l 248 484 l 248 389 q 293 281 248 326 q 401 237 337 237 q 508 281 463 237 q 553 387 553 325 l 553 604 q 563 629 553 618 q 589 640 574 640 q 614 629 604 640 q 625 604 625 618 l 625 562 l 671 540 m 929 389 l 929 484 l 813 484 l 813 386 q 803 360 813 370 q 777 350 792 350 q 751 360 762 350 q 741 386 741 371 l 741 481 l 671 461 l 625 483 l 625 388 q 670 281 625 326 q 777 237 715 237 q 885 281 840 237 q 929 389 929 326 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飭�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 823 639 l 823 730 q 800 786 823 763 q 744 809 777 809 q 688 786 711 809 q 665 730 665 763 l 665 256 q 567 24 665 120 q 332 -72 470 -72 q 97 25 195 -72 q 0 260 0 122 l 0 467 l 254 467 l 254 264 q 277 207 254 230 q 333 184 301 184 q 389 207 366 184 q 412 264 412 230 l 412 744 q 510 970 412 877 q 744 1064 608 1064 q 978 970 880 1064 q 1076 742 1076 875 l 1076 636 l 925 591 l 823 639 m 1234 467 l 1488 467 l 1488 260 q 1391 25 1488 122 q 1156 -72 1294 -72 q 921 24 1018 -72 q 823 257 823 121 l 823 465 l 925 418 l 1076 463 l 1076 253 q 1099 198 1076 221 q 1155 175 1122 175 q 1211 198 1187 175 q 1234 253 1234 221 l 1234 467 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1141 124 l 1141 496 l 595 496 l 595 1042 l 223 1042 q 100 991 151 1042 q 50 868 50 940 l 50 496 l 595 496 l 595 -50 l 967 -50 q 1090 1 1039 -50 q 1141 124 1141 52 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飭�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 254 972 l 412 972 l 412 210 l 0 210 l 0 750 l 254 750 l 254 972 m 254 337 l 254 623 l 159 623 l 159 337 l 254 337 m 476 750 l 476 210 l 635 210 l 635 750 l 476 750 m 476 972 l 476 814 l 635 814 l 635 972 l 476 972 m 698 750 l 1111 750 l 1111 20 l 698 20 l 698 146 l 953 146 l 953 210 l 698 210 l 698 750 m 953 337 l 953 623 l 857 623 l 857 337 l 953 337 m 1175 750 l 1587 750 l 1587 20 l 1175 20 l 1175 146 l 1428 146 l 1428 210 l 1175 210 l 1175 750 m 1428 337 l 1428 623 l 1333 623 l 1333 337 l 1428 337 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 781 485 q 796 467 781 485 q 811 400 811 450 q 781 315 811 350 q 711 281 752 281 q 656 292 677 281 l 656 507 q 711 520 678 520 q 781 485 752 520 m 515 816 q 530 799 515 816 q 545 732 545 781 q 515 647 545 682 q 445 612 486 612 q 391 623 412 612 l 391 838 q 445 851 412 851 q 515 816 486 851 m 912 220 q 946 257 912 220 q 980 398 980 294 q 912 575 980 501 q 747 649 844 649 q 717 646 732 649 q 656 541 699 586 q 493 463 589 467 l 493 -30 l 656 2 l 656 161 q 747 146 696 146 q 912 220 844 146 m 646 551 q 680 588 646 551 q 715 729 715 625 q 646 906 715 832 q 481 980 577 980 q 371 952 423 980 l 227 952 l 227 301 l 391 332 l 391 492 q 481 477 433 477 q 646 551 577 477 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飭�":{"ha":1580,"x_min":32,"x_max":1548,"o":"m 947 470 q 1058 455 1005 473 q 1150 409 1111 436 q 1228 336 1188 382 q 1293 252 1268 290 q 1352 159 1318 215 q 1413 74 1377 115 q 1471 12 1448 33 q 1548 -57 1494 -9 q 1464 -101 1511 -80 q 1356 -147 1417 -122 q 1268 -184 1296 -171 q 1211 -95 1234 -155 q 1177 33 1187 -34 q 1151 173 1166 100 q 1118 303 1136 246 q 1062 399 1101 361 q 967 436 1024 436 l 960 435 l 955 432 q 965 421 958 428 q 987 403 970 417 q 1006 386 1004 388 q 1021 372 1009 383 q 1035 356 1033 360 q 1044 339 1037 351 q 1052 318 1051 328 q 1056 294 1053 308 q 1059 263 1058 280 l 1059 237 q 1058 193 1060 217 q 1052 152 1055 168 q 1042 107 1049 136 q 1033 66 1035 78 q 955 59 1006 67 q 879 50 904 50 q 823 58 849 50 q 822 95 822 71 q 824 169 822 152 q 848 201 825 179 q 892 247 871 223 q 913 287 914 270 q 880 268 894 288 q 793 191 852 227 q 687 155 735 155 q 629 204 668 155 q 546 312 590 253 q 481 387 503 371 q 460 410 477 390 q 63 323 87 323 q 41 332 50 323 q 32 353 32 340 q 38 373 32 364 q 56 384 45 382 l 432 467 q 426 486 426 477 q 431 500 426 494 q 443 508 435 505 q 458 514 451 512 q 476 517 466 515 q 491 521 487 519 q 503 527 494 522 q 516 532 512 532 q 538 519 528 532 q 553 494 548 507 q 687 522 680 522 q 710 514 700 522 q 719 492 719 505 q 713 472 719 481 q 694 461 706 463 l 553 430 l 553 418 q 616 327 552 398 q 697 256 680 256 q 789 318 733 256 q 845 418 845 380 q 827 459 845 446 q 787 473 808 472 q 748 482 766 474 q 729 508 729 490 q 737 535 729 521 l 684 550 q 718 640 718 584 q 714 685 718 660 q 825 698 777 698 q 881 696 860 698 q 918 690 902 695 q 942 679 935 684 q 958 660 950 674 q 970 634 966 646 q 984 598 974 622 q 1002 551 993 573 l 1041 570 q 1023 524 1039 539 q 990 508 1008 508 q 959 503 973 507 q 946 487 946 498 l 947 470 m 994 653 q 983 665 990 656 q 974 676 977 673 q 966 685 971 679 q 958 693 960 691 q 952 699 956 695 q 945 705 948 703 q 939 709 942 707 q 932 712 935 711 q 921 716 927 715 q 905 718 915 718 q 888 718 895 718 q 863 718 881 718 q 834 718 845 718 q 666 685 736 718 q 694 721 678 708 q 736 744 709 734 q 786 772 762 754 q 822 800 811 790 q 861 843 833 811 q 894 882 888 875 q 916 858 904 875 q 941 829 929 840 q 970 819 953 818 l 980 820 l 980 761 l 997 760 q 1284 908 1188 834 q 1323 938 1306 924 q 1356 967 1340 952 q 1382 991 1372 982 q 1404 1017 1391 1000 q 1423 1041 1418 1035 q 1442 1070 1428 1048 q 1460 1099 1456 1092 q 1481 1136 1464 1107 q 1504 1177 1497 1166 l 1509 1184 q 1476 1077 1507 1143 q 1317 872 1414 949 q 1080 762 1219 795 q 1047 756 1069 760 q 1008 749 1025 753 q 978 738 991 745 q 997 702 980 723 q 1014 676 1014 681 q 994 653 1014 667 m 822 -61 q 924 -24 853 -41 q 1038 -8 996 -8 q 1055 -20 1045 -8 q 1077 -53 1066 -32 q 1097 -91 1088 -74 q 1116 -131 1106 -109 q 1127 -157 1125 -153 q 938 -191 1033 -191 q 841 -183 891 -191 l 822 -61 m 637 440 l 674 450 l 759 312 l 702 275 l 637 440 m 1025 40 q 1028 27 1028 28 q 1014 16 1028 22 q 979 6 1001 10 q 937 -2 956 2 q 895 -7 917 -5 q 870 -11 873 -10 l 865 22 q 912 29 881 24 q 968 37 942 34 q 1015 40 993 40 l 1025 40 m 671 526 l 597 511 l 592 524 q 617 529 600 525 q 644 534 635 534 q 671 526 659 534 m 822 35 l 846 35 l 854 -29 l 822 -39 l 822 35 m 1511 1190 l 1511 1190 l 1511 1190 m 1511 1190 l 1511 1186 l 1509 1184 l 1510 1187 l 1511 1190 m 1511 1190 l 1512 1190 l 1511 1190 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 904 -39 q 886 -35 901 -24 q 818 -65 863 -52 q 717 -78 774 -78 q 567 -40 617 -78 q 557 -37 563 -37 q 537 -47 549 -37 q 531 -59 532 -51 q 537 -74 531 -67 q 605 -110 563 -99 q 684 -120 646 -121 q 761 -116 722 -119 q 827 -100 793 -113 q 877 -77 860 -88 q 899 -61 894 -67 q 904 -39 908 -52 m 874 50 q 844 98 860 87 q 785 109 826 109 q 730 102 749 109 q 670 58 708 92 q 660 24 649 40 q 674 21 667 18 q 698 39 680 23 q 706 45 701 40 q 715 52 712 50 q 722 57 717 53 q 731 63 728 61 q 741 67 735 64 q 753 70 747 69 q 765 72 758 71 q 781 73 773 73 q 816 67 802 73 q 834 56 829 61 q 844 39 838 50 q 854 23 852 26 q 863 24 856 21 q 874 50 881 33 m 1149 268 q 1146 303 1149 285 q 1133 338 1142 320 q 1106 366 1124 355 q 1066 377 1089 377 q 991 345 1040 377 q 891 280 941 312 q 812 247 840 247 q 763 262 791 246 q 704 300 735 277 q 639 345 674 322 q 562 383 605 367 q 476 398 519 398 q 323 337 387 397 q 258 198 260 277 q 315 71 257 112 q 364 49 338 56 q 444 43 390 43 q 546 68 488 43 q 650 123 605 93 q 743 177 696 153 q 815 202 791 202 q 866 177 836 201 q 921 125 896 153 q 974 73 946 97 q 1017 48 1001 49 q 1062 59 1044 46 q 1105 108 1080 72 q 1138 186 1127 140 q 1149 268 1149 233 m 1190 392 q 1142 156 1190 265 q 1014 -27 1094 47 q 826 -143 933 -101 q 601 -184 718 -184 q 374 -140 483 -184 q 182 -18 264 -95 q 50 169 99 59 q 0 403 0 279 q 15 537 0 472 q 53 649 30 601 q 108 741 76 698 q 169 814 140 785 q 229 868 198 843 q 279 904 261 893 q 312 923 298 915 q 352 944 323 929 q 394 966 381 958 q 431 989 408 973 q 478 1023 455 1004 q 523 1079 506 1045 q 546 1177 540 1114 q 691 1027 646 1056 q 791 974 725 1004 q 891 923 858 944 q 922 904 908 913 q 968 868 935 894 q 1027 813 1001 841 q 1085 739 1053 785 q 1139 645 1118 694 q 1175 530 1160 596 q 1190 392 1190 463 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 829 359 l 705 235 l 588 117 l 565 94 q 448 26 515 44 q 315 25 381 9 q 259 -64 302 -29 q 159 -99 215 -99 q 47 -52 93 -99 q 0 60 0 -5 q 34 160 0 116 q 122 215 69 203 q 123 350 105 282 q 191 467 141 417 l 201 477 l 318 359 l 309 350 q 281 281 281 322 q 309 212 281 241 q 378 183 338 183 q 447 212 419 183 l 470 235 l 587 353 l 712 477 l 829 359 m 565 887 l 574 878 l 457 760 l 447 770 q 378 798 419 798 q 309 770 338 798 q 281 700 281 741 q 309 631 281 660 l 332 608 l 450 491 l 574 367 l 457 249 l 332 373 l 215 491 l 191 514 q 122 637 139 566 q 126 777 105 709 q 36 832 71 788 q 2 932 2 875 q 48 1044 2 997 q 160 1091 95 1091 q 264 1053 219 1091 q 318 958 308 1015 q 449 955 383 973 q 565 887 515 937 m 1190 60 q 1144 -52 1190 -5 q 1032 -99 1097 -99 q 930 -63 974 -99 q 875 29 886 -26 q 736 24 808 7 q 611 94 663 41 l 602 103 l 719 221 l 729 212 q 798 183 757 183 q 867 212 838 183 q 895 281 895 240 q 867 350 895 321 l 843 373 l 725 491 l 601 615 l 719 732 l 843 608 l 961 491 l 984 467 q 1051 351 1033 418 q 1053 218 1070 284 q 1151 165 1112 209 q 1190 60 1190 120 m 1189 932 q 1149 827 1189 872 q 1051 773 1110 782 q 1053 637 1071 708 q 984 514 1035 566 l 974 505 l 857 622 l 867 632 q 895 701 895 660 q 867 770 895 741 q 798 798 838 798 q 729 770 757 798 l 705 746 l 587 629 l 463 505 l 346 622 l 470 746 l 588 864 l 611 887 q 734 957 663 939 q 872 954 805 974 q 925 1052 880 1012 q 1030 1091 970 1091 q 1142 1044 1096 1091 q 1189 932 1189 997 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 507 355 q 497 355 506 353 q 473 364 488 358 l 457 371 q 390 409 423 387 q 358 434 384 413 q 329 456 332 454 q 225 315 277 376 q 143 230 162 242 q 128 227 140 229 q 114 227 116 226 q 177 298 119 230 q 244 388 194 317 q 305 479 294 458 q 344 555 318 502 q 372 615 370 608 q 287 590 366 616 q 265 584 281 588 q 239 577 250 580 q 226 573 227 574 q 224 565 224 571 q 223 557 224 558 q 199 546 219 550 q 163 546 181 540 q 141 562 149 549 q 137 580 138 567 q 156 584 142 581 q 179 588 171 586 q 260 613 224 601 q 339 640 338 640 q 373 655 347 642 q 407 672 398 669 q 424 678 414 674 q 435 682 433 682 q 439 682 436 683 q 439 656 441 673 q 429 636 439 655 q 408 594 419 616 q 395 568 398 572 q 336 467 376 529 l 385 445 q 443 420 395 440 q 495 398 491 400 q 503 379 498 398 q 507 355 508 360 m 348 732 q 345 710 350 720 q 306 680 336 692 q 260 671 283 671 q 222 691 239 674 q 208 723 211 703 l 208 725 q 224 722 211 723 q 244 722 236 720 q 289 734 252 723 q 332 745 317 743 q 348 732 345 745 m 889 632 l 938 456 l 830 488 l 889 632 m 30 12 l 568 191 l 568 991 l 30 811 l 30 12 m 992 257 l 1071 233 l 931 742 l 853 767 l 686 351 l 765 327 l 800 412 l 963 362 l 992 257 m 602 1003 l 1046 860 l 1046 1155 l 602 1003 m 843 -22 l 966 -33 l 924 -157 l 893 -105 q 679 -189 792 -170 q 608 -198 634 -198 l 543 -198 q 389 -168 482 -198 q 246 -102 295 -138 q 240 -90 240 -97 q 244 -79 240 -84 q 254 -75 248 -75 q 268 -81 257 -75 q 292 -94 279 -87 q 308 -102 305 -101 q 431 -150 364 -131 q 553 -169 498 -169 q 683 -158 627 -169 q 805 -119 739 -146 q 828 -107 816 -113 q 854 -92 840 -100 q 877 -79 869 -84 l 843 -22 m 1190 814 l 1190 -22 l 591 168 q 300 69 580 164 q 15 -25 20 -25 q 1 -15 5 -25 q 0 -12 1 -14 l 0 823 q 3 831 2 830 q 19 839 7 836 q 134 878 102 867 l 134 1176 l 567 1022 q 691 1065 568 1022 q 936 1149 814 1108 q 1061 1190 1058 1190 q 1077 1174 1077 1190 l 1077 850 l 1190 814 z "},"飭�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 223 893 q 311 856 274 893 q 347 769 347 820 l 347 -74 q 311 -162 347 -126 q 223 -198 274 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 769 q 36 856 0 820 q 124 893 73 893 l 223 893 m 1290 767 q 1362 694 1335 740 q 1389 595 1389 649 l 1389 0 q 1331 -140 1389 -82 q 1190 -198 1273 -198 l 521 -198 q 433 -162 470 -198 q 397 -74 397 -126 l 397 1116 q 419 1169 397 1147 q 471 1190 440 1190 l 992 1190 q 1060 1175 1023 1190 q 1119 1138 1097 1159 l 1237 1020 q 1274 961 1259 998 q 1290 893 1290 924 l 1290 767 m 719 0 l 719 99 q 712 117 719 110 q 694 124 705 124 l 595 124 q 577 117 584 124 q 570 99 570 110 l 570 0 q 577 -18 570 -11 q 595 -25 584 -25 l 694 -25 q 712 -18 705 -25 q 719 0 719 -11 m 719 198 l 719 298 q 712 315 719 308 q 694 322 705 322 l 595 322 q 577 315 584 322 q 570 298 570 308 l 570 198 q 577 181 570 188 q 595 174 584 174 l 694 174 q 712 181 705 174 q 719 198 719 188 m 719 397 l 719 496 q 712 514 719 507 q 694 521 705 521 l 595 521 q 577 514 584 521 q 570 496 570 507 l 570 397 q 577 379 570 386 q 595 372 584 372 l 694 372 q 712 379 705 372 q 719 397 719 386 m 918 0 l 918 99 q 911 117 918 110 q 893 124 904 124 l 794 124 q 776 117 783 124 q 769 99 769 110 l 769 0 q 776 -18 769 -11 q 794 -25 783 -25 l 893 -25 q 911 -18 904 -25 q 918 0 918 -11 m 918 198 l 918 298 q 911 315 918 308 q 893 322 904 322 l 794 322 q 776 315 783 322 q 769 298 769 308 l 769 198 q 776 181 769 188 q 794 174 783 174 l 893 174 q 911 181 904 174 q 918 198 918 188 m 918 397 l 918 496 q 911 514 918 507 q 893 521 904 521 l 794 521 q 776 514 783 521 q 769 496 769 507 l 769 397 q 776 379 769 386 q 794 372 783 372 l 893 372 q 911 379 904 372 q 918 397 918 386 m 1116 0 l 1116 99 q 1109 117 1116 110 q 1091 124 1102 124 l 992 124 q 974 117 981 124 q 967 99 967 110 l 967 0 q 974 -18 967 -11 q 992 -25 981 -25 l 1091 -25 q 1109 -18 1102 -25 q 1116 0 1116 -11 m 1116 198 l 1116 298 q 1109 315 1116 308 q 1091 322 1102 322 l 992 322 q 974 315 981 322 q 967 298 967 308 l 967 198 q 974 181 967 188 q 992 174 981 174 l 1091 174 q 1109 181 1102 174 q 1116 198 1116 188 m 1116 397 l 1116 496 q 1109 514 1116 507 q 1091 521 1102 521 l 992 521 q 974 514 981 521 q 967 496 967 507 l 967 397 q 974 379 967 386 q 992 372 981 372 l 1091 372 q 1109 379 1102 372 q 1116 397 1116 386 m 1190 694 l 1190 893 l 1066 893 q 1014 915 1035 893 q 992 967 992 936 l 992 1091 l 496 1091 l 496 694 l 1190 694 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1091,"o":"m 1042 1190 q 1077 1176 1062 1190 q 1091 1141 1091 1161 l 1091 -149 q 1077 -184 1091 -169 q 1042 -198 1062 -198 l 50 -198 q 15 -184 29 -198 q 0 -149 0 -169 l 0 1141 q 15 1176 0 1161 q 50 1190 29 1190 l 1042 1190 m 397 967 l 397 918 q 404 900 397 907 q 422 893 411 893 l 471 893 q 489 900 482 893 q 496 918 496 907 l 496 967 q 489 985 496 978 q 471 992 482 992 l 422 992 q 404 985 411 992 q 397 967 397 978 m 397 769 l 397 719 q 404 701 397 708 q 422 694 411 694 l 471 694 q 489 701 482 694 q 496 719 496 708 l 496 769 q 489 787 496 780 q 471 794 482 794 l 422 794 q 404 787 411 794 q 397 769 397 780 m 397 570 l 397 521 q 404 503 397 510 q 422 496 411 496 l 471 496 q 489 503 482 496 q 496 521 496 510 l 496 570 q 489 588 496 581 q 471 595 482 595 l 422 595 q 404 588 411 595 q 397 570 397 581 m 397 372 l 397 322 q 404 305 397 312 q 422 298 411 298 l 471 298 q 489 305 482 298 q 496 322 496 312 l 496 372 q 489 390 496 383 q 471 397 482 397 l 422 397 q 404 390 411 397 q 397 372 397 383 m 298 124 l 298 174 q 291 191 298 184 q 273 198 284 198 l 223 198 q 205 191 212 198 q 198 174 198 184 l 198 124 q 205 106 198 113 q 223 99 212 99 l 273 99 q 291 106 284 99 q 298 124 298 113 m 298 322 l 298 372 q 291 390 298 383 q 273 397 284 397 l 223 397 q 205 390 212 397 q 198 372 198 383 l 198 322 q 205 305 198 312 q 223 298 212 298 l 273 298 q 291 305 284 298 q 298 322 298 312 m 298 521 l 298 570 q 291 588 298 581 q 273 595 284 595 l 223 595 q 205 588 212 595 q 198 570 198 581 l 198 521 q 205 503 198 510 q 223 496 212 496 l 273 496 q 291 503 284 496 q 298 521 298 510 m 298 719 l 298 769 q 291 787 298 780 q 273 794 284 794 l 223 794 q 205 787 212 794 q 198 769 198 780 l 198 719 q 205 701 198 708 q 223 694 212 694 l 273 694 q 291 701 284 694 q 298 719 298 708 m 298 918 l 298 967 q 291 985 298 978 q 273 992 284 992 l 223 992 q 205 985 212 992 q 198 967 198 978 l 198 918 q 205 900 198 907 q 223 893 212 893 l 273 893 q 291 900 284 893 q 298 918 298 907 m 694 -74 l 694 74 q 687 92 694 85 q 670 99 680 99 l 422 99 q 404 92 411 99 q 397 74 397 85 l 397 -74 q 404 -92 397 -85 q 422 -99 411 -99 l 670 -99 q 687 -92 680 -99 q 694 -74 694 -85 m 694 322 l 694 372 q 687 390 694 383 q 670 397 680 397 l 620 397 q 602 390 609 397 q 595 372 595 383 l 595 322 q 602 305 595 312 q 620 298 609 298 l 670 298 q 687 305 680 298 q 694 322 694 312 m 694 521 l 694 570 q 687 588 694 581 q 670 595 680 595 l 620 595 q 602 588 609 595 q 595 570 595 581 l 595 521 q 602 503 595 510 q 620 496 609 496 l 670 496 q 687 503 680 496 q 694 521 694 510 m 694 719 l 694 769 q 687 787 694 780 q 670 794 680 794 l 620 794 q 602 787 609 794 q 595 769 595 780 l 595 719 q 602 701 595 708 q 620 694 609 694 l 670 694 q 687 701 680 694 q 694 719 694 708 m 694 918 l 694 967 q 687 985 694 978 q 670 992 680 992 l 620 992 q 602 985 609 992 q 595 967 595 978 l 595 918 q 602 900 595 907 q 620 893 609 893 l 670 893 q 687 900 680 893 q 694 918 694 907 m 893 124 l 893 174 q 886 191 893 184 q 868 198 879 198 l 818 198 q 801 191 808 198 q 794 174 794 184 l 794 124 q 801 106 794 113 q 818 99 808 99 l 868 99 q 886 106 879 99 q 893 124 893 113 m 893 322 l 893 372 q 886 390 893 383 q 868 397 879 397 l 818 397 q 801 390 808 397 q 794 372 794 383 l 794 322 q 801 305 794 312 q 818 298 808 298 l 868 298 q 886 305 879 298 q 893 322 893 312 m 893 521 l 893 570 q 886 588 893 581 q 868 595 879 595 l 818 595 q 801 588 808 595 q 794 570 794 581 l 794 521 q 801 503 794 510 q 818 496 808 496 l 868 496 q 886 503 879 496 q 893 521 893 510 m 893 719 l 893 769 q 886 787 893 780 q 868 794 879 794 l 818 794 q 801 787 808 794 q 794 769 794 780 l 794 719 q 801 701 794 708 q 818 694 808 694 l 868 694 q 886 701 879 694 q 893 719 893 708 m 893 918 l 893 967 q 886 985 893 978 q 868 992 879 992 l 818 992 q 801 985 808 992 q 794 967 794 978 l 794 918 q 801 900 794 907 q 818 893 808 893 l 868 893 q 886 900 879 893 q 893 918 893 907 z "},"飭�":{"ha":992,"x_min":50,"x_max":942,"o":"m 921 766 l 694 539 l 694 -99 q 669 -160 694 -135 q 608 -186 643 -186 q 546 -160 572 -186 q 521 -99 521 -135 l 521 198 l 471 198 l 471 -99 q 446 -160 471 -135 q 384 -186 420 -186 q 323 -160 349 -186 q 298 -99 298 -135 l 298 539 l 71 766 q 50 818 50 787 q 71 871 50 849 q 124 893 94 893 q 177 871 155 893 l 353 694 l 639 694 l 815 871 q 868 893 837 893 q 921 871 899 893 q 942 818 942 849 q 921 766 942 787 m 619 1016 q 644 990 619 1016 q 670 893 670 965 q 619 770 670 821 q 496 719 568 719 q 373 770 424 719 q 322 893 322 821 q 373 1016 322 965 q 496 1066 424 1066 q 619 1016 568 1066 z "},"飭�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 605 825 q 590 737 605 778 q 541 665 575 695 q 460 635 507 635 q 353 679 401 635 q 281 784 305 724 q 258 901 258 845 q 273 989 258 948 q 322 1061 288 1031 q 403 1091 356 1091 q 510 1047 463 1091 q 581 942 558 1002 q 605 825 605 882 m 339 450 q 307 343 339 388 q 215 297 274 297 q 105 340 156 297 q 27 443 54 383 q 0 561 0 504 q 33 669 0 623 q 125 715 65 715 q 234 672 184 715 q 312 568 285 629 q 339 450 339 508 m 645 471 q 842 396 736 471 q 1020 212 949 320 q 1091 15 1091 104 q 1078 -45 1091 -21 q 1041 -79 1065 -68 q 991 -95 1016 -91 q 932 -99 965 -99 q 786 -64 879 -99 q 645 -29 694 -29 q 496 -64 594 -29 q 340 -98 398 -98 q 198 15 198 -98 q 242 163 198 81 q 350 312 285 245 q 495 426 415 380 q 645 471 576 471 m 830 635 q 749 665 783 635 q 700 737 715 695 q 685 825 685 778 q 708 942 685 882 q 779 1047 732 1002 q 887 1091 827 1091 q 968 1061 934 1091 q 1017 989 1002 1031 q 1032 901 1032 948 q 1008 784 1032 845 q 937 679 985 724 q 830 635 889 635 m 1165 715 q 1257 669 1225 715 q 1290 561 1290 623 q 1263 443 1290 504 q 1185 340 1235 383 q 1075 297 1134 297 q 983 343 1015 297 q 950 450 950 388 q 977 568 950 508 q 1055 672 1004 629 q 1165 715 1106 715 z "},"飭�":{"ha":595,"x_min":50,"x_max":546,"o":"m 546 781 q 501 593 546 669 q 384 488 457 516 l 419 -149 q 406 -184 420 -169 q 372 -198 392 -198 l 223 -198 q 189 -184 203 -198 q 177 -149 175 -169 l 212 488 q 94 593 138 516 q 50 781 50 669 q 83 975 50 880 q 174 1130 115 1069 q 298 1190 232 1190 q 422 1130 363 1190 q 513 975 480 1069 q 546 781 546 880 z "},"飭�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 694 -72 l 1190 198 l 1190 691 l 694 511 l 694 -72 m 645 598 l 1186 795 l 645 992 l 104 795 l 645 598 m 1290 794 l 1290 198 q 1276 148 1290 171 q 1238 112 1262 125 l 692 -186 q 645 -198 670 -198 q 598 -186 619 -198 l 52 112 q 14 148 28 125 q 0 198 0 171 l 0 794 q 18 850 0 825 q 65 887 36 876 l 611 1085 q 645 1091 628 1091 q 679 1085 662 1091 l 1225 887 q 1272 850 1254 876 q 1290 794 1290 825 z "},"飭�":{"ha":1786,"x_min":0,"x_max":1687,"o":"m 496 -74 l 794 74 l 794 318 l 496 191 l 496 -74 m 446 277 l 760 412 l 446 546 l 133 412 l 446 277 m 1290 -74 l 1587 74 l 1587 318 l 1290 191 l 1290 -74 m 1240 277 l 1553 412 l 1240 546 l 927 412 l 1240 277 m 893 505 l 1190 632 l 1190 839 l 893 711 l 893 505 m 843 798 l 1185 945 l 843 1091 l 501 945 l 843 798 m 1687 397 l 1687 74 q 1672 22 1687 47 q 1631 -14 1657 -2 l 1284 -188 q 1240 -198 1265 -198 q 1196 -188 1215 -198 l 849 -14 q 843 -11 846 -12 q 838 -14 842 -12 l 491 -188 q 446 -198 471 -198 q 402 -188 422 -198 l 55 -14 q 15 22 29 -2 q 0 74 0 47 l 0 397 q 17 451 0 426 q 60 488 33 476 l 397 632 l 397 942 q 413 997 397 972 q 457 1034 430 1022 l 805 1183 q 843 1190 822 1190 q 882 1183 864 1190 l 1229 1034 q 1273 997 1256 1022 q 1290 942 1290 972 l 1290 632 l 1626 488 q 1670 451 1654 476 q 1687 397 1687 426 z "},"飭�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1432 928 l 1036 928 l 1036 832 l 1432 832 l 1432 928 m 1237 598 q 1124 557 1167 598 q 1076 446 1080 516 l 1392 446 q 1237 598 1378 598 m 1249 144 q 1344 169 1298 144 q 1403 236 1390 194 l 1574 236 q 1243 -2 1497 -2 q 979 101 1077 -2 q 881 370 881 203 q 982 637 881 531 q 1243 744 1084 744 q 1430 691 1350 744 q 1548 553 1509 639 q 1587 360 1587 467 q 1586 324 1587 347 l 1076 324 q 1120 191 1076 238 q 1249 144 1165 144 m 215 183 l 444 183 q 603 312 603 183 q 449 452 603 452 l 215 452 l 215 183 m 215 599 l 432 599 q 528 627 493 599 q 563 715 563 656 q 416 827 563 827 l 215 827 l 215 599 m 0 994 l 460 994 q 581 983 528 994 q 679 946 633 972 q 748 871 724 920 q 773 752 773 822 q 639 548 773 612 q 773 459 728 523 q 818 301 818 395 q 799 195 818 243 q 748 115 780 147 q 671 60 715 82 q 577 27 627 37 q 474 17 528 17 l 0 17 l 0 994 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 m 387 807 l 99 807 l 99 197 l 395 197 q 548 241 486 197 q 610 374 610 286 q 499 529 610 496 q 582 656 582 569 q 567 730 582 700 q 523 777 552 761 q 462 800 494 794 q 387 807 429 807 m 370 560 l 233 560 l 233 703 l 360 703 q 452 633 452 703 q 370 560 452 560 m 377 301 l 233 301 l 233 469 l 380 469 q 476 381 476 469 q 377 301 476 301 m 880 276 q 800 305 828 276 q 772 388 772 335 l 1090 388 q 1091 412 1091 396 q 1034 582 1091 514 q 876 651 976 651 q 713 584 777 651 q 649 417 649 518 q 711 249 649 312 q 876 185 772 185 q 1083 333 1035 185 l 976 333 q 939 291 967 307 q 880 276 911 276 m 873 560 q 969 465 960 560 l 772 465 q 802 534 775 508 q 873 560 829 560 m 747 766 l 994 766 l 994 706 l 747 706 l 747 766 z "},"飭�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1171 873 q 1198 845 1171 873 q 1226 739 1226 818 q 1171 606 1226 661 q 1037 550 1115 550 q 903 606 959 550 q 848 739 848 661 q 903 873 848 818 q 1037 929 959 929 q 1171 873 1115 929 m 573 27 q 601 55 573 27 q 629 164 629 84 q 573 301 629 245 q 436 358 516 358 q 394 353 415 358 l 474 321 q 559 238 534 297 q 560 121 584 180 q 477 36 536 61 q 360 36 419 12 q 312 55 343 42 q 264 74 280 67 q 335 -1 289 27 q 436 -29 381 -29 q 573 27 516 -29 m 1273 739 q 1203 906 1273 836 q 1036 975 1134 975 q 868 906 938 975 q 799 739 799 836 q 868 571 799 640 q 1036 502 938 502 q 1203 571 1134 502 q 1273 739 1273 640 m 1389 739 q 1285 489 1389 592 q 1036 386 1182 386 l 698 139 q 613 -30 688 39 q 436 -99 538 -99 q 270 -40 342 -99 q 178 109 198 19 l 0 180 l 0 512 l 301 391 q 436 428 363 428 q 463 426 446 428 l 683 742 q 788 989 684 887 q 1036 1091 891 1091 q 1285 988 1182 1091 q 1389 739 1389 884 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 918 583 q 941 605 918 583 q 963 689 963 627 q 918 795 963 751 q 812 839 874 839 q 706 794 750 839 q 663 689 663 750 q 706 583 663 627 q 812 539 750 539 q 918 583 874 539 m 445 342 q 467 320 445 342 q 490 233 490 298 q 445 124 490 169 q 336 80 400 80 q 257 102 293 80 q 201 162 220 125 q 277 131 241 146 q 370 132 323 112 q 436 199 416 152 q 434 292 454 246 q 367 357 415 339 l 304 383 q 336 387 321 387 q 445 342 400 387 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 243 l 133 189 q 206 71 149 118 q 336 25 263 25 q 477 79 417 25 q 544 213 536 133 l 811 408 q 1010 490 928 408 q 1091 687 1091 572 q 1010 885 1091 804 q 811 967 928 967 q 615 886 697 967 q 532 691 534 805 l 358 441 q 336 442 351 442 q 230 413 278 442 l 0 505 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 m 999 687 q 944 555 999 610 q 811 501 889 501 q 679 555 734 501 q 625 687 625 610 q 679 820 625 765 q 811 875 734 875 q 944 820 890 875 q 999 687 999 766 z "},"飭�":{"ha":1389,"x_min":12,"x_max":1376,"o":"m 648 284 l 636 -1 l 635 -18 l 309 5 q 257 29 281 7 q 221 80 233 51 q 210 122 212 101 q 213 173 207 144 q 222 215 219 202 q 239 265 226 229 q 253 306 252 301 q 648 284 314 297 m 348 739 l 488 445 l 374 516 q 287 404 325 460 q 231 307 250 348 q 200 234 212 267 q 186 185 188 202 l 183 169 l 36 446 q 22 489 22 466 q 26 525 21 512 l 33 539 q 121 685 60 588 l 12 752 l 348 739 m 1302 338 l 1156 60 q 1128 24 1147 37 q 1094 8 1109 10 l 1080 5 q 911 -5 1025 -1 l 917 -132 l 739 153 l 902 433 l 908 299 q 1127 295 1039 287 q 1259 321 1215 304 l 1302 338 m 694 1054 q 488 717 657 1005 l 243 862 l 228 871 l 402 1147 q 449 1182 418 1171 q 511 1190 480 1193 q 548 1180 529 1188 q 581 1164 567 1173 q 613 1139 594 1156 q 641 1112 632 1121 q 669 1081 650 1102 q 694 1054 687 1060 m 1201 816 l 1366 535 q 1375 476 1380 506 q 1354 419 1371 446 q 1328 390 1344 403 q 1299 368 1313 377 q 1261 351 1285 360 q 1225 339 1238 343 q 1185 328 1212 335 q 1149 319 1158 321 q 944 656 1123 374 l 1187 808 l 1201 816 m 1090 991 l 1201 1056 l 1030 767 l 705 782 l 822 849 q 764 977 796 918 q 706 1073 732 1037 q 656 1135 679 1109 q 619 1171 632 1161 l 606 1181 l 920 1180 q 965 1172 944 1183 q 995 1150 986 1162 l 1004 1139 q 1090 991 1034 1091 z "},"飭�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 336 260 q 354 278 336 260 q 372 347 372 296 q 336 435 372 398 q 248 471 299 471 q 160 435 197 471 q 124 347 124 398 q 160 260 124 296 q 248 223 197 223 q 336 260 299 223 m 400 595 l 1187 595 l 1118 872 q 1108 885 1117 878 q 1091 893 1098 893 l 496 893 q 480 885 489 893 q 469 872 470 878 l 400 595 m 1427 260 q 1445 278 1427 260 q 1463 347 1463 296 q 1427 435 1463 398 q 1339 471 1390 471 q 1252 435 1288 471 q 1215 347 1215 398 q 1252 260 1215 296 q 1339 223 1288 223 q 1427 260 1390 223 m 1587 422 l 1587 124 q 1580 106 1587 113 q 1563 99 1573 99 l 1488 99 l 1488 0 q 1445 -105 1488 -62 q 1339 -149 1401 -149 q 1234 -105 1277 -149 q 1190 0 1190 -62 l 1190 99 l 397 99 l 397 0 q 353 -105 397 -62 q 248 -149 310 -149 q 143 -105 186 -149 q 99 0 99 -62 l 99 99 l 25 99 q 7 106 14 99 q 0 124 0 113 l 0 422 q 51 544 0 494 q 174 595 102 595 l 195 595 l 277 920 q 357 1042 295 993 q 496 1091 420 1091 l 1091 1091 q 1230 1042 1167 1091 q 1311 920 1293 993 l 1392 595 l 1414 595 q 1537 544 1486 595 q 1587 422 1587 494 z "},"飭�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1414 496 q 1537 445 1486 496 q 1587 322 1587 395 l 1587 25 q 1580 7 1587 14 q 1563 0 1573 0 l 1488 0 l 1488 -50 q 1445 -155 1488 -112 q 1339 -198 1401 -198 q 1234 -155 1277 -198 q 1190 -50 1190 -112 l 1190 0 l 397 0 l 397 -50 q 353 -155 397 -112 q 248 -198 310 -198 q 143 -155 186 -198 q 99 -50 99 -112 l 99 0 l 25 0 q 7 7 14 0 q 0 25 0 14 l 0 322 q 51 445 0 395 q 174 496 102 496 l 195 496 l 277 821 q 357 943 295 894 q 496 992 420 992 l 595 992 l 595 1166 q 602 1184 595 1177 q 620 1190 609 1190 l 967 1190 q 985 1184 978 1190 q 992 1166 992 1177 l 992 992 l 1091 992 q 1230 943 1167 992 q 1311 821 1293 894 l 1392 496 l 1414 496 m 160 160 q 179 142 160 160 q 248 124 197 124 q 336 160 299 124 q 372 248 372 197 q 336 336 372 299 q 248 372 299 372 q 160 336 197 372 q 124 248 124 299 q 160 160 124 197 m 400 496 l 1187 496 l 1118 773 q 1108 786 1117 779 q 1091 794 1098 794 l 496 794 q 480 786 489 794 q 469 773 470 779 l 400 496 m 1252 160 q 1270 142 1252 160 q 1339 124 1288 124 q 1427 160 1390 124 q 1463 248 1463 197 q 1427 336 1463 299 q 1339 372 1390 372 q 1252 336 1288 372 q 1215 248 1215 299 q 1252 160 1215 197 z "},"飭�":{"ha":1190,"x_min":25,"x_max":1166,"o":"m 1151 84 q 1166 50 1166 70 q 1151 15 1166 29 q 1116 0 1136 0 l 758 0 q 763 -68 759 -13 q 767 -152 767 -122 q 753 -185 767 -171 q 719 -198 739 -198 l 471 -198 q 438 -185 452 -198 q 424 -152 424 -171 q 428 -68 424 -122 q 432 0 432 -13 l 74 0 q 40 15 54 0 q 25 50 25 29 q 40 84 25 70 l 351 397 l 174 397 q 139 412 153 397 q 124 446 124 426 q 139 481 124 467 l 450 794 l 298 794 q 263 808 277 794 q 248 843 248 823 q 263 878 248 863 l 560 1176 q 595 1190 575 1190 q 630 1176 615 1190 l 928 878 q 942 843 942 863 q 928 808 942 823 q 893 794 913 794 l 740 794 l 1052 481 q 1066 446 1066 467 q 1052 412 1066 426 q 1017 397 1037 397 l 839 397 l 1151 84 z "},"飭�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 873 253 q 850 292 873 277 q 504 381 701 381 q 281 355 401 381 q 249 315 249 348 q 259 288 249 299 q 287 277 270 277 q 315 283 291 277 q 504 304 418 304 q 811 224 679 304 q 837 215 826 215 q 863 226 852 215 q 873 253 873 236 m 948 419 q 921 467 948 450 q 496 576 737 576 q 261 543 377 576 q 224 494 224 533 q 238 461 224 474 q 270 447 251 447 q 299 453 276 447 q 494 479 394 479 q 872 383 710 479 q 901 373 891 373 q 934 386 921 373 q 948 419 948 400 m 1032 612 q 1001 666 1032 648 q 773 751 903 722 q 508 780 644 780 q 226 744 350 780 q 196 724 208 739 q 184 687 184 710 q 200 646 184 663 q 239 630 215 630 q 270 636 248 630 q 508 665 374 665 q 748 639 632 665 q 945 565 865 612 q 976 556 961 556 q 1015 572 998 556 q 1032 612 1032 587 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飭�":{"ha":794,"x_min":0,"x_max":794,"o":"m 794 956 l 559 505 l 577 481 l 794 481 l 794 159 l 401 159 l 367 136 l 257 -76 l 233 -99 l 0 -99 l 0 136 l 235 587 l 216 611 l 0 611 l 0 932 l 393 932 l 427 956 l 537 1167 l 560 1190 l 794 1190 l 794 956 z "},"飭�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 608 127 l 620 314 l 608 719 q 602 732 607 727 q 589 738 597 738 q 577 732 582 738 q 571 719 571 727 l 560 314 l 571 127 q 577 114 572 119 q 589 109 582 109 q 608 127 606 109 m 837 150 l 846 313 l 836 767 q 826 786 836 780 q 814 790 820 790 q 801 786 808 790 q 791 767 791 780 l 791 763 l 783 314 q 791 131 783 313 l 791 130 q 796 117 791 122 q 814 109 803 109 q 829 115 822 109 q 836 131 836 121 l 837 150 m 27 413 l 43 314 l 27 216 q 20 209 26 209 q 13 216 15 209 l 0 314 l 13 413 q 20 420 15 420 q 27 413 26 420 m 94 474 l 114 314 l 94 157 q 86 150 92 150 q 79 157 79 150 l 61 314 l 79 474 q 86 481 79 481 q 94 474 92 481 m 311 123 m 165 504 l 184 314 l 165 130 q 157 122 165 122 q 147 130 149 122 l 131 314 l 147 504 q 157 513 149 513 q 165 504 165 513 m 238 509 l 256 314 l 238 125 q 227 115 236 115 q 217 125 217 115 l 201 314 l 217 509 q 227 519 217 519 q 238 509 236 519 m 311 495 l 327 314 l 311 123 q 298 111 309 111 q 290 114 294 111 q 287 123 287 118 l 271 314 l 287 495 q 290 503 287 500 q 298 507 294 507 q 311 495 309 507 m 608 127 m 384 608 l 400 314 l 384 123 q 380 114 384 118 q 370 109 376 109 q 357 123 358 109 l 343 314 l 357 608 q 370 622 358 622 q 380 618 376 622 q 384 608 384 614 m 457 675 l 471 312 l 457 123 q 452 113 457 117 q 442 109 448 109 q 426 123 428 109 l 414 312 l 426 675 q 442 690 428 690 q 452 686 448 690 q 457 675 457 681 m 532 706 l 546 314 l 532 126 q 515 110 531 110 q 499 126 501 110 l 487 314 l 499 706 q 504 718 499 713 q 515 723 509 723 q 527 718 522 723 q 532 706 532 713 m 836 131 l 836 131 l 836 131 l 836 131 m 683 709 l 694 314 l 683 129 q 677 115 683 121 q 663 109 671 109 q 650 115 656 109 q 644 129 645 120 l 633 314 l 644 709 q 650 723 644 718 q 663 729 656 729 q 677 723 671 729 q 683 709 683 718 m 760 694 l 770 313 l 760 130 q 753 115 760 122 q 739 109 747 109 q 724 115 730 109 q 717 130 718 122 l 708 313 l 717 694 q 724 710 718 704 q 739 716 730 716 q 753 710 747 716 q 760 694 759 704 m 924 313 l 913 134 l 913 134 q 906 117 913 124 q 889 110 899 110 q 872 117 879 110 q 864 134 865 124 l 860 222 l 855 313 l 864 806 l 864 808 q 873 827 866 820 q 889 832 880 832 q 901 829 895 832 q 913 808 911 822 l 924 313 m 1786 328 q 1721 173 1786 237 q 1566 109 1657 109 l 957 109 q 940 118 947 111 q 933 135 933 125 l 933 832 q 955 857 933 849 q 1095 884 1021 884 q 1357 782 1246 884 q 1481 531 1468 680 q 1566 548 1522 548 q 1721 484 1657 548 q 1786 328 1786 419 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 252 629 q 332 612 252 629 q 595 595 412 595 q 939 629 779 595 q 1190 727 1098 662 l 1190 595 q 1111 496 1190 542 q 894 424 1031 450 q 595 397 756 397 q 297 424 434 397 q 80 496 160 450 q 0 595 0 542 l 0 727 q 252 629 92 662 m 252 33 q 332 17 252 33 q 595 0 412 0 q 939 33 779 0 q 1190 132 1098 67 l 1190 0 q 1111 -99 1190 -53 q 894 -172 1031 -145 q 595 -198 756 -198 q 297 -172 434 -198 q 80 -99 160 -145 q 0 0 0 -53 l 0 132 q 252 33 92 67 m 252 331 q 332 314 252 331 q 595 298 412 298 q 939 331 779 298 q 1190 429 1098 364 l 1190 298 q 1111 198 1190 244 q 894 126 1031 153 q 595 99 756 99 q 297 126 434 99 q 80 198 160 153 q 0 298 0 244 l 0 429 q 252 331 92 364 m 297 1164 q 365 1177 297 1164 q 595 1190 434 1190 q 894 1164 756 1190 q 1111 1091 1031 1137 q 1190 992 1190 1046 l 1190 893 q 1111 794 1190 839 q 894 721 1031 748 q 595 694 756 694 q 297 721 434 694 q 80 794 160 748 q 0 893 0 839 l 0 992 q 80 1091 0 1046 q 297 1164 160 1137 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 693 360 q 758 317 718 340 q 849 322 804 322 q 986 284 963 322 q 987 244 998 267 q 987 243 987 243 q 985 241 986 242 l 985 240 q 930 211 980 211 q 841 226 893 211 q 740 267 789 242 q 436 203 569 249 q 249 0 318 0 q 227 5 237 0 l 208 15 q 204 19 208 16 q 199 47 196 26 q 243 117 206 78 q 345 192 279 157 q 363 188 356 199 q 364 184 364 186 q 447 337 405 250 q 528 540 500 443 q 504 664 509 604 q 509 763 499 724 q 542 794 518 794 l 558 794 l 559 794 q 586 782 577 794 q 593 729 600 766 q 590 723 591 725 q 591 717 591 721 l 591 694 q 580 545 589 598 q 693 360 622 418 m 246 42 q 353 164 287 60 q 285 99 313 133 q 246 42 257 65 m 555 755 q 553 653 543 722 q 559 687 554 658 q 564 720 559 689 q 567 726 565 723 q 567 728 567 727 q 566 730 566 729 q 556 758 565 747 q 555 756 556 757 l 555 755 m 459 243 q 679 305 563 284 q 669 313 677 306 q 656 323 660 319 q 558 460 598 375 q 494 307 537 393 q 459 243 470 264 m 960 255 q 851 274 941 274 q 947 252 910 252 q 961 253 958 252 q 960 255 961 253 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 181 595 l 181 512 l 235 512 l 362 0 l 485 0 l 584 376 q 592 412 590 391 q 594 430 594 424 l 597 430 l 599 412 q 602 396 600 409 q 606 376 604 383 l 705 0 l 829 0 l 956 512 l 1010 512 l 1010 595 l 777 595 l 777 512 l 847 512 l 770 173 q 765 137 767 157 l 763 121 l 760 121 q 760 126 760 123 q 759 132 760 129 q 758 137 758 136 q 755 153 757 141 q 751 173 753 166 l 639 595 l 551 595 l 439 173 q 436 154 438 166 q 433 137 434 142 l 430 121 l 427 121 l 426 137 q 420 173 424 157 l 343 512 l 413 512 l 413 595 l 181 595 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 332 82 l 332 0 l 550 0 l 550 82 l 492 82 l 572 207 q 580 220 576 212 q 586 230 584 227 q 588 233 587 233 l 590 233 q 594 226 591 230 q 597 220 595 222 q 602 214 599 217 q 607 207 605 210 l 690 82 l 631 82 l 631 0 l 856 0 l 856 82 l 804 82 l 655 294 l 806 512 l 858 512 l 858 595 l 642 595 l 642 512 l 699 512 l 619 389 q 612 376 616 384 q 605 366 607 369 l 603 363 l 601 363 q 598 371 601 367 q 584 389 593 380 l 502 512 l 561 512 l 561 595 l 336 595 l 336 512 l 389 512 l 536 301 l 385 82 l 332 82 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 322 82 l 322 0 l 576 0 l 576 82 l 504 82 l 504 212 l 610 212 q 701 223 669 212 q 784 291 753 241 q 815 404 815 340 q 786 513 815 467 q 708 581 757 560 q 608 595 671 595 l 322 595 l 322 512 l 394 512 l 394 82 l 322 82 m 596 299 l 504 299 l 504 507 l 597 507 q 661 493 637 507 q 705 404 705 467 q 656 311 705 335 q 596 299 632 299 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 992 248 l 992 0 l 198 0 l 198 149 l 347 298 l 446 198 l 744 496 l 992 248 m 453 440 q 431 419 453 440 q 347 397 409 397 q 242 440 285 397 q 198 546 198 484 q 242 651 198 608 q 347 694 285 694 q 453 651 409 694 q 496 546 496 608 q 453 440 496 484 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 496 893 l 496 992 l 397 992 l 397 893 l 496 893 m 595 794 l 595 893 l 496 893 l 496 794 l 595 794 m 496 694 l 496 794 l 397 794 l 397 694 l 496 694 m 595 595 l 595 694 l 496 694 l 496 595 l 595 595 m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 595 1091 l 595 992 l 496 992 l 496 1091 l 99 1091 l 99 -99 l 1091 -99 m 605 460 l 688 189 q 694 149 694 168 q 638 42 694 84 q 496 0 582 0 q 354 42 410 0 q 298 149 298 84 q 304 189 298 168 q 397 496 320 238 l 397 595 l 496 595 l 496 496 l 557 496 q 587 486 574 496 q 605 460 601 476 m 426 114 q 440 107 426 114 q 496 99 455 99 q 566 114 537 99 q 595 149 595 129 q 566 184 595 169 q 496 198 537 198 q 426 184 455 198 q 397 149 397 169 q 426 114 397 129 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 481 532 q 496 508 496 525 l 496 87 q 481 64 496 70 q 471 62 474 62 q 453 69 462 62 l 325 198 l 223 198 q 205 205 212 198 q 198 223 198 212 l 198 372 q 205 390 198 383 q 223 397 212 397 l 325 397 l 453 526 q 481 532 466 538 m 804 -2 q 842 16 828 -2 q 942 298 942 140 q 842 579 942 456 q 809 598 830 595 q 773 587 788 600 q 755 553 756 574 q 766 516 753 532 q 843 298 843 421 q 766 79 843 174 q 755 42 753 63 q 773 9 756 22 q 804 -2 787 -2 m 640 112 q 677 128 661 112 q 744 298 744 200 q 677 467 744 395 q 642 483 663 482 q 606 470 621 484 q 591 435 591 456 q 605 399 590 415 q 645 298 645 355 q 605 196 645 240 q 591 160 590 181 q 606 126 591 140 q 640 112 622 112 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 595 595 q 665 566 636 595 q 694 496 694 536 l 694 198 q 665 129 694 158 q 595 99 636 99 l 298 99 q 228 129 257 99 q 198 198 198 158 l 198 496 q 228 566 198 536 q 298 595 257 595 l 595 595 m 977 594 q 992 570 992 587 l 992 124 q 977 101 992 107 q 967 99 970 99 q 949 106 956 99 l 744 312 l 744 382 l 949 588 q 967 595 956 595 q 977 594 970 595 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1138 896 q 1175 837 1159 874 q 1190 769 1190 800 l 1190 -124 q 1169 -177 1190 -155 q 1116 -198 1147 -198 l 74 -198 q 22 -177 43 -198 q 0 -124 0 -155 l 0 1116 q 22 1169 0 1147 q 74 1190 43 1190 l 769 1190 q 837 1175 800 1190 q 896 1138 874 1159 l 1138 896 m 794 1085 l 794 794 l 1085 794 q 1068 825 1077 816 l 825 1068 q 794 1085 816 1077 m 1091 -99 l 1091 694 l 769 694 q 716 716 738 694 q 694 769 694 738 l 694 1091 l 99 1091 l 99 -99 l 1091 -99 m 372 595 q 388 605 378 604 q 407 600 398 606 l 446 570 q 456 554 455 564 q 451 536 457 544 l 310 347 l 451 159 q 456 140 457 150 q 446 124 455 130 l 407 95 q 388 90 398 88 q 372 99 378 91 l 197 332 q 197 362 186 347 l 372 595 m 994 362 q 994 332 1004 347 l 818 99 q 802 90 812 91 q 784 95 792 88 l 744 124 q 734 140 736 130 q 739 159 733 150 l 880 347 l 739 536 q 734 554 733 544 q 744 570 736 564 l 784 600 q 802 605 792 606 q 818 595 812 604 l 994 362 m 513 5 q 497 15 503 6 q 493 33 491 23 l 600 677 q 610 693 601 687 q 629 698 618 699 l 677 690 q 693 680 687 688 q 698 661 699 671 l 591 17 q 581 1 589 7 q 562 -3 572 -5 l 513 5 z "},"飮�":{"ha":1190,"x_min":30,"x_max":1160,"o":"m 1160 550 l 1160 396 q 1007 378 1082 378 q 879 168 956 273 q 738 1 801 64 q 639 -81 675 -61 q 513 -79 577 -116 q 466 -45 491 -66 q 400 19 441 -25 q 321 119 360 64 q 238 262 282 174 q 156 451 193 349 q 85 694 119 553 q 30 997 51 836 l 250 997 q 304 688 270 828 q 385 442 338 548 q 479 260 432 336 q 587 109 526 183 q 810 423 718 239 q 637 594 700 479 q 574 852 574 708 q 655 1096 574 1001 q 875 1190 736 1190 q 1087 1109 1013 1190 q 1160 878 1160 1027 q 1115 656 1160 755 q 1100 654 1110 656 q 1065 653 1090 653 q 1016 657 1039 653 q 968 677 993 662 q 929 717 942 692 q 953 860 953 797 q 930 962 953 927 q 869 997 908 997 q 803 958 828 997 q 778 849 778 920 q 860 622 778 705 q 1066 539 941 539 q 1160 550 1115 539 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 167 284 l 635 -27 l 635 251 l 376 424 l 167 284 m 119 396 l 269 496 l 119 596 l 119 396 m 754 -27 l 1221 284 l 1013 424 l 754 251 l 754 -27 m 694 355 l 905 496 l 694 637 l 484 496 l 694 355 m 376 568 l 635 741 l 635 1019 l 167 708 l 376 568 m 1120 496 l 1270 396 l 1270 596 l 1120 496 m 1013 568 l 1221 708 l 754 1019 l 754 741 l 1013 568 m 1389 708 l 1389 284 q 1363 235 1389 253 l 728 -188 q 694 -198 711 -198 q 661 -188 677 -198 l 26 235 q 0 284 0 253 l 0 708 q 26 757 0 739 l 661 1180 q 694 1190 677 1190 q 728 1180 711 1190 l 1363 757 q 1389 708 1389 739 z "},"飮�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1395 592 q 1534 479 1481 556 q 1587 308 1587 402 q 1496 90 1587 181 q 1275 0 1404 0 q 1266 0 1272 0 q 1258 1 1260 1 l 321 1 l 320 1 l 319 1 l 315 1 q 91 98 183 9 q 0 315 0 188 q 43 473 0 401 q 157 587 85 545 q 147 650 147 617 q 211 802 147 739 q 365 865 274 865 q 498 820 439 865 q 671 1012 556 939 q 924 1085 785 1085 q 1161 1023 1053 1085 q 1333 853 1270 960 q 1396 620 1396 746 q 1395 606 1396 615 q 1395 592 1395 597 m 363 386 q 428 236 363 291 q 589 181 493 181 q 775 258 695 181 q 738 302 763 274 q 705 341 714 330 q 593 291 653 291 q 520 317 550 291 q 491 384 491 343 q 520 452 491 426 q 591 478 550 478 q 657 462 625 478 q 713 419 688 446 q 764 361 739 393 q 817 298 789 329 q 877 239 846 266 q 952 197 908 213 q 1046 181 996 181 q 1205 236 1140 181 q 1270 384 1270 291 q 1204 532 1270 477 q 1044 587 1139 587 q 857 512 933 587 l 929 429 q 1039 478 980 478 q 1111 453 1080 478 q 1142 388 1142 427 q 1113 317 1142 343 q 1040 290 1084 290 q 976 306 1007 290 q 920 349 946 322 q 870 407 895 375 q 816 470 844 439 q 756 529 787 502 q 681 571 724 555 q 589 587 638 587 q 429 533 494 587 q 363 386 363 478 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 425 1135 q 489 1163 425 1135 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 m 974 1022 q 694 1091 842 1091 q 415 1022 547 1091 l 565 871 q 694 893 629 893 q 824 871 760 893 l 974 1022 m 169 216 l 319 367 q 298 496 298 430 q 319 625 298 562 l 169 776 q 99 496 99 643 q 169 216 99 349 m 415 -29 q 694 -99 547 -99 q 974 -29 842 -99 l 824 121 q 694 99 760 99 q 565 121 629 99 l 415 -29 m 484 286 q 528 242 484 286 q 694 198 571 198 q 905 286 818 198 q 992 496 992 373 q 905 706 992 619 q 694 794 818 794 q 484 706 571 794 q 397 496 397 619 q 484 286 397 373 m 1070 367 l 1220 216 q 1290 496 1290 349 q 1220 776 1290 643 l 1070 625 q 1091 496 1091 562 q 1070 367 1091 430 z "},"飮�":{"ha":1389,"x_min":25,"x_max":1364,"o":"m 1364 496 q 1311 236 1364 360 q 1168 22 1258 112 q 955 -121 1079 -67 q 694 -174 831 -174 q 434 -121 558 -174 q 221 22 310 -67 q 78 236 131 112 q 25 496 25 360 q 100 805 25 661 q 305 1042 175 949 q 595 1159 436 1135 l 595 982 q 311 811 424 947 q 198 496 198 674 q 238 303 198 395 q 344 145 277 212 q 502 40 410 79 q 694 0 594 0 q 887 40 795 0 q 1045 145 979 79 q 1151 303 1111 212 q 1190 496 1190 395 q 1078 811 1190 674 q 794 982 965 947 l 794 1159 q 1084 1042 953 1135 q 1289 805 1214 949 q 1364 496 1364 661 z "},"飮�":{"ha":1389,"x_min":15,"x_max":1375,"o":"m 15 513 q 105 828 21 681 q 341 1074 188 974 q 345 1074 345 1074 q 344 1072 345 1073 q 322 1046 338 1066 q 282 987 307 1026 q 236 901 257 947 q 201 796 214 855 q 190 679 188 737 q 221 557 192 622 q 305 438 249 493 q 384 384 343 399 q 454 375 424 369 q 508 393 484 381 q 544 419 532 405 l 556 431 q 598 521 587 470 q 603 616 608 572 q 586 699 597 660 q 566 761 576 738 l 555 784 q 531 822 547 803 q 498 854 515 841 q 464 877 481 867 q 437 891 448 887 l 427 896 l 508 985 q 568 945 538 972 q 614 898 598 918 l 629 877 q 614 957 629 914 q 583 1025 599 1000 l 567 1049 l 692 1190 l 816 1050 q 775 971 791 1015 q 758 901 760 927 l 755 875 q 803 931 772 904 q 855 972 833 959 l 877 985 l 956 896 q 891 857 922 885 q 844 807 859 829 l 829 784 q 792 681 805 741 q 787 549 779 621 q 831 428 794 477 q 891 381 856 393 q 957 377 925 369 q 1016 397 988 384 q 1060 423 1043 410 l 1077 436 q 1151 525 1123 477 q 1189 619 1180 573 q 1197 713 1198 665 q 1183 805 1195 761 q 1154 888 1170 848 q 1119 960 1138 928 q 1084 1016 1100 992 q 1057 1053 1068 1039 l 1047 1066 q 1042 1076 1036 1076 q 1049 1073 1049 1073 q 1098 1038 1080 1051 q 1146 999 1115 1025 q 1196 954 1177 973 q 1241 904 1215 935 q 1284 844 1267 873 q 1319 776 1301 815 q 1349 696 1338 736 q 1367 605 1359 656 q 1375 500 1374 555 q 1291 140 1377 299 q 1049 -109 1205 -20 q 696 -198 894 -198 q 424 -141 553 -198 q 204 12 295 -84 q 62 239 113 109 q 15 513 10 370 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 677 -79 l 677 -130 q 379 -45 516 -126 q 160 168 242 35 l 205 195 q 261 118 227 157 l 312 162 q 597 -2 426 32 l 584 -69 q 677 -79 634 -78 m 214 332 l 150 310 q 188 223 167 264 l 143 198 q 67 496 67 337 q 143 794 67 655 l 188 769 q 150 682 164 725 l 213 660 q 186 496 186 583 q 214 332 186 412 m 1184 195 l 1229 168 q 1010 -45 1147 35 q 711 -130 873 -126 l 711 -79 q 805 -69 755 -78 l 792 -2 q 1077 162 963 32 l 1128 118 q 1184 195 1162 157 m 1067 624 l 887 562 q 898 496 898 529 q 887 430 898 463 l 1066 368 q 991 237 1042 297 l 847 363 q 733 297 803 311 l 770 110 q 694 102 730 102 q 618 110 659 102 l 656 297 q 542 363 586 311 l 398 237 q 322 368 346 297 l 502 430 q 491 496 491 463 q 502 562 491 529 l 322 624 q 398 755 347 696 l 542 629 q 656 696 587 682 l 618 882 q 694 890 653 890 q 770 882 736 890 l 733 696 q 847 629 801 682 l 991 755 q 1067 624 1042 696 m 677 1122 l 677 1071 q 584 1061 627 1070 l 597 994 q 312 831 426 962 l 261 874 q 205 798 232 842 l 160 824 q 379 1037 243 957 q 677 1122 515 1118 m 1246 794 q 1321 496 1321 655 q 1246 198 1321 337 l 1201 223 q 1239 310 1222 264 l 1175 332 q 1203 496 1203 412 q 1176 660 1203 583 l 1239 682 q 1201 769 1225 725 l 1246 794 m 1228 824 l 1184 798 q 1128 874 1157 842 l 1077 831 q 792 994 963 962 l 805 1061 q 711 1071 762 1070 l 711 1122 q 1010 1037 873 1118 q 1228 824 1146 957 m 1302 239 q 1329 301 1302 239 q 1355 496 1355 362 q 1302 753 1355 630 q 1162 963 1250 875 q 951 1104 1073 1052 q 694 1156 829 1156 q 438 1104 560 1156 q 227 963 315 1052 q 86 753 139 875 q 34 496 34 630 q 86 239 34 362 q 227 29 139 117 q 438 -112 315 -60 q 694 -164 560 -164 q 951 -112 829 -164 q 1162 29 1073 -60 q 1302 239 1250 117 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 451 177 q 379 126 451 126 q 296 174 296 126 q 372 224 296 224 q 451 177 451 224 m 423 538 q 366 472 423 472 q 306 537 306 472 q 366 607 306 607 q 408 587 394 607 q 423 538 423 567 m 552 596 l 552 693 q 447 670 491 670 q 362 693 408 693 q 250 649 295 693 q 204 538 204 605 q 227 459 204 499 q 284 407 250 419 l 284 405 q 254 339 254 391 q 286 279 254 298 l 286 277 q 198 169 198 248 q 214 108 198 134 q 256 69 229 82 q 312 49 282 55 q 374 43 341 43 q 548 188 548 43 q 511 265 548 240 q 413 301 474 290 q 373 317 392 305 q 354 347 354 329 q 392 388 354 381 q 487 442 452 399 q 522 546 522 484 q 514 586 522 564 q 552 596 543 593 m 598 271 l 704 271 q 702 335 702 292 l 702 635 q 704 688 702 670 l 598 688 q 600 633 600 670 l 600 329 q 598 271 600 291 m 992 284 l 992 377 q 939 361 969 361 q 898 425 898 361 l 898 599 l 939 599 q 959 598 946 599 q 980 598 973 598 l 980 688 l 898 688 q 901 767 898 752 l 792 767 q 795 725 795 749 l 795 688 l 749 688 l 749 598 q 777 600 777 600 q 786 600 780 600 q 795 599 792 599 l 795 598 l 794 598 l 794 429 q 796 380 794 401 q 805 336 798 359 q 823 298 811 313 q 857 274 836 284 q 908 265 879 265 q 992 284 958 265 m 716 831 q 698 880 716 859 q 651 901 679 901 q 604 880 623 901 q 585 831 585 860 q 605 782 585 803 q 651 762 624 762 q 697 783 678 762 q 716 831 716 804 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飮�":{"ha":1389,"x_min":53,"x_max":1336,"o":"m 461 17 q 333 95 461 95 q 211 14 211 95 q 344 -64 211 -64 q 461 17 461 -64 m 415 602 q 392 681 415 649 q 323 713 369 713 q 227 601 227 713 q 323 496 227 496 q 415 602 415 496 m 624 853 l 624 697 q 563 680 596 687 q 575 615 575 646 q 519 447 575 516 q 366 360 462 377 q 320 339 335 353 q 305 294 305 324 q 322 254 305 270 q 367 229 339 238 q 428 212 395 220 q 494 192 461 204 q 555 163 528 181 q 600 114 583 146 q 618 37 618 81 q 336 -198 618 -198 q 236 -189 283 -198 q 146 -157 188 -179 q 78 -93 103 -135 q 53 5 53 -52 q 194 180 53 133 l 194 183 q 142 281 142 215 q 191 387 142 365 l 191 390 q 98 474 135 408 q 61 602 61 539 q 135 782 61 710 q 317 853 208 853 q 455 817 391 853 q 624 853 531 817 m 870 171 l 698 171 q 701 274 701 205 l 701 746 q 698 846 701 819 l 870 846 q 867 749 867 820 l 867 274 q 870 171 867 205 m 1336 343 l 1336 191 q 1201 160 1281 160 q 1118 176 1153 160 q 1064 215 1084 191 q 1034 275 1045 238 q 1019 346 1022 312 q 1016 426 1016 381 l 1016 698 l 1018 698 l 1018 701 q 1003 702 1012 701 q 989 703 994 703 q 943 698 973 703 l 943 846 l 1018 846 l 1018 904 q 1013 973 1018 946 l 1189 973 q 1184 846 1184 942 l 1317 846 l 1317 698 q 1283 700 1305 698 q 1250 701 1261 701 l 1184 701 l 1184 419 q 1252 317 1184 317 q 1336 343 1299 317 m 860 1156 q 875 1139 860 1156 q 890 1077 890 1121 q 860 998 890 1032 q 785 964 829 964 q 709 998 740 964 q 678 1077 678 1032 q 709 1156 678 1122 q 785 1190 739 1190 q 860 1156 830 1190 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 627 412 l 833 799 l 746 799 l 625 557 q 591 486 606 520 l 558 557 l 438 799 l 345 799 l 549 417 l 549 166 l 627 166 l 627 412 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飮�":{"ha":992,"x_min":44,"x_max":948,"o":"m 609 853 q 631 831 609 853 q 653 747 653 809 q 608 641 653 685 q 503 598 564 598 q 417 625 457 598 q 328 512 369 573 q 171 -154 136 224 q 162 -184 172 -171 q 135 -198 151 -197 l 131 -198 q 104 -188 115 -198 q 91 -162 92 -177 q 88 30 80 -64 q 111 198 96 124 q 153 342 126 272 q 206 463 180 412 q 264 560 233 513 q 366 687 311 629 q 353 747 353 715 q 397 853 353 809 q 503 897 441 897 q 609 853 565 897 m 887 965 q 918 913 887 965 q 948 739 948 861 q 887 512 948 616 q 723 348 827 408 q 496 288 618 288 q 395 298 446 288 q 369 317 378 302 q 364 347 360 331 q 382 372 368 363 q 412 377 396 381 q 496 367 452 367 q 640 397 571 367 q 759 476 709 426 q 838 594 808 525 q 867 739 867 663 q 838 883 867 814 q 759 1001 808 952 q 640 1080 709 1051 q 496 1110 571 1110 q 352 1080 421 1110 q 233 1001 283 1051 q 154 883 184 952 q 125 739 125 814 q 165 570 125 650 q 168 539 173 554 q 148 515 163 523 q 117 513 133 508 q 94 533 102 519 q 44 739 44 629 q 80 915 44 831 q 177 1059 116 998 q 321 1155 237 1119 q 496 1190 405 1190 q 723 1130 618 1190 q 887 965 827 1070 z "},"飮�":{"ha":1389,"x_min":14,"x_max":1375,"o":"m 209 566 q 203 606 203 581 q 212 644 203 622 q 230 679 220 667 q 236 720 229 696 q 253 753 243 744 q 325 977 253 861 q 494 1139 397 1093 q 745 1190 601 1190 q 951 1148 848 1190 q 1021 1111 989 1132 q 1076 1067 1053 1090 q 1118 1015 1099 1045 q 1151 957 1138 984 q 1176 892 1164 930 q 1196 822 1188 853 q 1213 746 1204 791 l 1214 742 q 1256 626 1256 678 q 1249 595 1256 615 q 1242 566 1242 575 q 1244 563 1242 565 q 1246 559 1245 561 q 1248 556 1248 557 q 1341 390 1308 468 q 1375 229 1375 312 q 1360 151 1375 195 q 1317 107 1345 107 q 1302 113 1310 107 q 1287 126 1294 119 q 1272 146 1280 134 q 1260 167 1264 159 q 1249 187 1256 175 q 1242 201 1243 199 q 1240 202 1242 202 l 1236 198 q 1134 26 1190 79 q 1182 -4 1149 10 q 1235 -36 1214 -19 q 1263 -87 1256 -54 q 1259 -99 1261 -90 q 1254 -113 1258 -109 q 1020 -188 1204 -188 q 934 -181 979 -188 q 858 -166 890 -174 q 777 -143 827 -157 q 760 -137 766 -139 q 724 -134 749 -134 q 693 -133 699 -133 q 594 -183 661 -167 q 463 -198 527 -198 q 410 -197 436 -198 q 338 -190 384 -196 q 260 -174 292 -184 q 202 -143 227 -164 q 177 -94 177 -122 q 184 -48 177 -63 q 216 -10 192 -33 q 248 0 225 -9 q 286 9 270 9 q 297 11 289 9 q 298 14 298 12 l 297 16 q 213 98 260 25 q 157 219 167 171 l 153 222 q 143 206 150 222 q 101 148 129 174 q 41 119 73 122 l 40 119 q 36 123 37 119 q 32 127 34 126 q 14 205 14 169 q 209 566 14 418 z "},"飮�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 430 782 q 440 792 430 782 q 450 833 450 801 q 430 884 450 865 q 379 904 411 904 q 320 884 346 904 q 295 833 295 864 q 320 783 295 803 q 379 763 346 763 q 430 782 411 763 m 1025 440 q 1006 479 1025 462 q 955 496 986 496 q 916 479 934 496 q 899 440 899 461 q 916 401 899 419 q 955 384 934 384 q 1006 401 986 384 q 1025 440 1025 418 m 823 782 q 833 792 823 782 q 842 833 842 801 q 823 884 842 865 q 773 904 805 904 q 714 884 739 904 q 688 833 688 864 q 714 783 688 803 q 773 763 739 763 q 823 782 805 763 m 1335 440 q 1314 479 1335 462 q 1264 496 1294 496 q 1226 479 1243 496 q 1208 440 1208 461 q 1226 401 1208 419 q 1264 384 1243 384 q 1314 401 1294 384 q 1335 440 1335 418 m 1128 748 q 1074 751 1104 751 q 833 691 943 751 q 660 530 723 632 q 597 307 597 428 q 615 189 597 246 q 562 187 587 187 q 523 188 542 187 q 481 193 505 189 q 446 198 457 197 q 404 207 436 200 q 365 215 372 213 l 169 116 l 225 285 q 0 665 0 443 q 76 906 0 796 q 280 1079 151 1016 q 562 1142 409 1142 q 820 1091 698 1142 q 1023 950 941 1040 q 1128 748 1104 860 m 1587 313 q 1534 140 1587 222 q 1390 -10 1481 57 l 1433 -150 l 1279 -66 q 1110 -95 1163 -95 q 869 -40 979 -95 q 696 109 759 15 q 632 313 632 202 q 696 518 632 424 q 869 666 759 612 q 1110 721 979 721 q 1345 666 1235 721 q 1521 517 1455 612 q 1587 313 1587 423 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1388,"o":"m 1367 1182 q 1388 1132 1393 1163 l 1190 -58 q 1165 -93 1186 -81 q 1141 -99 1154 -99 q 1122 -95 1132 -99 l 771 48 l 584 -181 q 546 -198 570 -198 q 529 -195 536 -198 q 505 -177 514 -190 q 496 -149 496 -164 l 496 122 l 1166 942 l 337 226 l 31 351 q 0 394 2 362 q 25 439 -2 425 l 1314 1184 q 1339 1190 1326 1190 q 1367 1182 1355 1190 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1388,"o":"m 1367 1182 q 1388 1132 1393 1163 l 1190 -58 q 1165 -93 1186 -81 q 1141 -99 1154 -99 q 1122 -95 1132 -99 l 714 71 l 483 -182 q 446 -198 469 -198 q 429 -195 436 -198 q 405 -177 414 -190 q 397 -149 397 -164 l 397 202 l 31 351 q 0 394 2 362 q 25 439 -2 424 l 1314 1184 q 1367 1182 1342 1200 m 1102 20 l 1273 1046 l 162 405 l 422 298 l 1091 794 l 721 176 l 1102 20 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1143 727 q 1167 672 1143 727 q 1190 496 1190 617 q 1143 265 1190 375 q 1016 75 1096 155 q 826 -52 936 -5 q 595 -99 716 -99 q 342 -43 462 -99 q 137 115 222 13 q 132 133 132 123 q 139 149 133 143 l 245 256 q 264 263 253 263 q 282 253 277 261 q 421 140 339 180 q 595 99 503 99 q 749 131 676 99 q 876 215 822 162 q 961 342 929 269 q 992 496 992 415 q 961 650 992 577 q 876 777 929 723 q 749 861 822 830 q 595 893 676 893 q 450 865 519 893 q 326 787 380 838 l 432 680 q 443 626 456 656 q 397 595 429 595 l 50 595 q 15 610 29 595 q 0 645 0 625 l 0 992 q 31 1038 0 1025 q 84 1027 61 1051 l 185 927 q 375 1048 268 1005 q 595 1091 481 1091 q 826 1044 716 1091 q 1016 917 936 997 q 1143 727 1096 837 m 694 719 l 694 372 q 687 354 694 361 q 670 347 680 347 l 422 347 q 404 354 411 347 q 397 372 397 361 l 397 422 q 404 439 397 432 q 422 446 411 446 l 595 446 l 595 719 q 602 737 595 730 q 620 744 609 744 l 670 744 q 687 737 680 744 q 694 719 694 730 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 788 953 q 742 972 788 953 q 595 992 696 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 788 40 696 0 q 946 145 880 79 q 1052 303 1012 212 q 1091 496 1091 395 q 1052 689 1091 597 q 946 847 1012 780 q 788 953 880 913 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飮�":{"ha":1389,"x_min":48,"x_max":1341,"o":"m 1304 -99 q 1201 -96 1270 -99 q 1097 -94 1132 -94 q 995 -96 1063 -94 q 893 -99 927 -99 q 864 -83 874 -99 q 854 -48 854 -67 q 867 -12 854 -24 q 898 1 880 -1 q 937 6 915 2 q 972 18 960 10 q 997 126 997 34 l 997 429 q 996 453 997 446 q 957 457 986 457 l 434 457 q 395 453 405 457 q 394 429 394 446 l 393 142 q 422 15 393 32 q 459 5 434 7 q 503 2 484 2 q 538 -10 522 2 q 553 -45 553 -21 q 544 -82 553 -65 q 515 -99 534 -99 q 407 -96 479 -99 q 300 -94 336 -94 q 201 -96 267 -94 q 102 -99 135 -99 q 75 -83 84 -99 q 65 -48 65 -67 q 77 -13 65 -25 q 105 0 89 -2 q 142 6 121 2 q 174 18 163 10 q 200 129 200 36 l 199 173 l 199 803 q 200 823 199 805 q 200 851 200 841 q 198 881 199 862 q 196 914 198 901 q 191 942 194 927 q 182 966 188 957 q 170 980 177 976 q 135 990 158 988 q 94 991 112 991 q 62 1002 76 991 q 48 1037 48 1013 q 57 1074 48 1057 q 85 1091 67 1091 q 193 1089 121 1091 q 300 1086 264 1086 q 398 1089 332 1086 q 496 1091 463 1091 q 525 1074 515 1091 q 535 1037 535 1057 q 522 1003 535 1014 q 492 992 508 993 q 453 989 475 991 q 420 979 432 987 q 393 855 393 963 l 394 607 q 395 582 394 591 q 425 580 405 580 l 966 580 q 996 582 986 580 q 997 607 997 591 l 997 855 q 970 979 997 963 q 925 989 956 987 q 874 999 894 990 q 854 1037 854 1008 q 864 1074 854 1057 q 893 1091 873 1091 q 995 1089 927 1091 q 1097 1086 1063 1086 q 1197 1089 1131 1086 q 1297 1091 1264 1091 q 1326 1074 1317 1091 q 1336 1037 1336 1057 q 1323 1003 1336 1014 q 1292 992 1309 992 q 1252 989 1274 991 q 1218 980 1229 987 q 1190 855 1190 962 l 1191 124 q 1218 16 1191 32 q 1253 5 1230 8 q 1295 2 1277 2 q 1327 -10 1313 1 q 1341 -45 1341 -22 q 1332 -82 1341 -65 q 1304 -99 1322 -99 z "},"飮�":{"ha":992,"x_min":19,"x_max":991,"o":"m 991 1044 l 991 987 q 976 940 991 965 q 943 915 962 915 q 901 915 904 915 q 877 891 881 910 q 874 841 874 882 l 874 -52 q 860 -85 874 -71 q 827 -99 846 -99 l 743 -99 q 710 -85 724 -99 q 696 -52 696 -71 l 696 892 l 585 892 l 585 -52 q 572 -85 585 -71 q 538 -99 558 -99 l 454 -99 q 420 -85 434 -99 q 407 -52 407 -71 l 407 332 q 217 378 293 342 q 68 517 119 423 q 19 718 19 608 q 87 939 19 846 q 249 1063 155 1031 q 572 1091 335 1091 l 943 1091 q 977 1077 963 1091 q 991 1044 991 1063 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 273 99 l 273 0 l 0 0 l 0 99 l 273 99 m 546 198 q 581 184 566 198 q 595 149 595 169 l 595 -50 q 581 -84 595 -70 q 546 -99 566 -99 l 347 -99 q 312 -84 327 -99 q 298 -50 298 -70 l 298 149 q 312 184 298 169 q 347 198 327 198 l 546 198 m 670 496 l 670 397 l 0 397 l 0 496 l 670 496 m 174 893 l 174 794 l 0 794 l 0 893 l 174 893 m 1190 99 l 1190 0 l 620 0 l 620 99 l 1190 99 m 446 992 q 481 977 467 992 q 496 942 496 963 l 496 744 q 481 709 496 724 q 446 694 467 694 l 248 694 q 213 709 228 694 q 198 744 198 724 l 198 942 q 213 977 198 963 q 248 992 228 992 l 446 992 m 942 595 q 977 581 963 595 q 992 546 992 566 l 992 347 q 977 312 992 327 q 942 298 963 298 l 744 298 q 709 312 724 298 q 694 347 694 327 l 694 546 q 709 581 694 566 q 744 595 724 595 l 942 595 m 1190 496 l 1190 397 l 1017 397 l 1017 496 l 1190 496 m 1190 893 l 1190 794 l 521 794 l 521 893 l 1190 893 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 942 397 q 1118 324 1046 397 q 1190 149 1190 252 q 1118 -27 1190 46 q 942 -99 1046 -99 q 767 -27 839 -99 q 694 149 694 46 q 696 175 694 158 l 417 315 q 248 248 346 248 q 72 320 145 248 q 0 496 0 393 q 72 672 0 599 q 248 744 145 744 q 417 677 346 744 l 696 817 q 694 843 694 834 q 767 1019 694 946 q 942 1091 839 1091 q 1118 1019 1046 1091 q 1190 843 1190 946 q 1118 668 1190 740 q 942 595 1046 595 q 773 662 845 595 l 494 522 q 496 496 496 505 q 494 470 496 487 l 773 330 q 942 397 845 397 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 944 148 q 968 172 944 148 q 992 264 992 196 q 944 381 992 332 q 827 430 895 430 q 715 385 762 430 l 528 478 q 529 496 529 491 q 528 514 529 501 l 715 607 q 827 562 762 562 q 944 611 895 562 q 992 728 992 660 q 944 844 992 796 q 827 893 895 893 q 710 844 759 893 q 661 728 661 796 q 663 710 661 722 l 476 617 q 363 661 428 661 q 247 613 295 661 q 198 496 198 564 q 247 379 198 428 q 363 331 295 331 q 476 375 428 331 l 663 282 q 661 264 661 270 q 710 148 661 196 q 827 99 759 99 q 944 148 895 99 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 443 696 q 446 705 443 696 q 443 734 450 715 q 416 761 435 753 q 378 761 398 769 q 230 663 295 727 q 132 515 166 598 q 132 477 124 495 q 159 450 140 458 q 177 446 169 446 q 224 477 210 446 q 300 593 250 543 q 415 669 350 643 q 443 696 435 677 m 1173 1010 l 1208 974 l 1019 786 l 1072 733 q 1087 698 1087 718 q 1072 663 1087 677 l 1022 613 q 1091 347 1091 488 q 1048 135 1091 236 q 932 -39 1005 34 q 758 -155 859 -112 q 546 -198 656 -198 q 334 -155 435 -198 q 159 -39 233 -112 q 43 135 86 34 q 0 347 0 236 q 43 559 0 458 q 159 734 86 660 q 334 850 233 807 q 546 893 435 893 q 811 824 687 893 l 861 873 q 896 888 876 888 q 932 873 917 888 l 984 821 l 1173 1010 m 1179 1053 q 1162 1046 1171 1046 q 1144 1053 1152 1046 l 1073 1123 q 1066 1141 1066 1131 q 1073 1159 1066 1151 q 1091 1166 1081 1166 q 1109 1159 1101 1166 l 1179 1088 q 1187 1071 1187 1081 q 1179 1053 1187 1060 m 1357 875 q 1339 868 1349 868 q 1321 875 1330 868 l 1252 946 q 1244 963 1244 953 q 1252 980 1244 973 q 1269 988 1259 988 q 1287 980 1280 988 l 1357 911 q 1364 893 1364 903 q 1357 875 1364 883 m 1382 1035 q 1385 1031 1382 1035 q 1389 1017 1389 1028 q 1382 999 1389 1006 q 1364 992 1375 992 l 1290 992 q 1272 999 1279 992 q 1265 1017 1265 1006 q 1272 1035 1265 1028 q 1290 1042 1279 1042 l 1364 1042 q 1382 1035 1375 1042 m 1240 1166 l 1240 1091 q 1233 1073 1240 1080 q 1215 1066 1226 1066 q 1197 1073 1204 1066 q 1190 1091 1190 1080 l 1190 1166 q 1197 1184 1190 1177 q 1215 1190 1204 1190 q 1233 1184 1226 1190 q 1240 1166 1240 1177 m 1357 1123 l 1287 1053 q 1270 1046 1279 1046 q 1252 1053 1259 1046 q 1244 1071 1244 1060 q 1252 1088 1244 1081 l 1321 1159 q 1339 1166 1329 1166 q 1357 1159 1349 1166 q 1364 1141 1364 1151 q 1357 1123 1364 1131 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 472 558 l 694 719 l 917 558 l 832 298 l 557 298 l 472 558 m 425 1135 q 489 1163 425 1135 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 m 1174 144 q 1290 496 1290 301 l 1290 498 l 1211 429 l 1025 603 l 1073 853 l 1177 844 q 876 1063 1061 1004 l 917 966 l 694 843 l 472 966 l 513 1063 q 212 844 328 1004 l 316 853 l 364 603 l 178 429 l 99 498 l 99 496 q 215 144 99 301 l 238 246 l 491 215 l 598 -16 l 508 -69 q 694 -99 599 -99 q 880 -69 790 -99 l 791 -16 l 898 215 l 1151 246 l 1174 144 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 347 174 l 347 25 q 340 7 347 14 q 322 0 333 0 l 174 0 q 156 7 163 0 q 149 25 149 14 l 149 174 q 156 191 149 184 q 174 198 163 198 l 322 198 q 340 191 333 198 q 347 174 347 184 m 198 471 l 198 322 q 191 305 198 312 q 174 298 184 298 l 25 298 q 7 305 14 298 q 0 322 0 312 l 0 471 q 7 489 0 482 q 25 496 14 496 l 174 496 q 191 489 184 496 q 198 471 198 482 m 645 174 l 645 25 q 638 7 645 14 q 620 0 631 0 l 471 0 q 453 7 460 0 q 446 25 446 14 l 446 174 q 453 191 446 184 q 471 198 460 198 l 620 198 q 638 191 631 198 q 645 174 645 184 m 496 471 l 496 322 q 489 305 496 312 q 471 298 482 298 l 322 298 q 305 305 312 298 q 298 322 298 312 l 298 471 q 305 489 298 482 q 322 496 312 496 l 471 496 q 489 489 482 496 q 496 471 496 482 m 51 595 q 15 610 29 595 q 0 646 0 625 l 0 746 l 398 746 l 398 646 q 384 610 398 625 q 348 595 369 595 l 51 595 m 942 174 l 942 25 q 935 7 942 14 q 918 0 929 0 l 769 0 q 751 7 758 0 q 744 25 744 14 l 744 174 q 751 191 744 184 q 769 198 758 198 l 918 198 q 935 191 929 198 q 942 174 942 184 m 794 471 l 794 322 q 787 305 794 312 q 769 298 780 298 l 620 298 q 602 305 609 298 q 595 322 595 312 l 595 471 q 602 489 595 482 q 620 496 609 496 l 769 496 q 787 489 780 496 q 794 471 794 482 m 1240 174 l 1240 25 q 1233 7 1240 14 q 1215 0 1226 0 l 1066 0 q 1049 7 1056 0 q 1042 25 1042 14 l 1042 174 q 1049 191 1042 184 q 1066 198 1056 198 l 1215 198 q 1233 191 1226 198 q 1240 174 1240 184 m 1091 471 l 1091 322 q 1084 305 1091 312 q 1066 298 1077 298 l 918 298 q 900 305 907 298 q 893 322 893 312 l 893 471 q 900 489 893 482 q 918 496 907 496 l 1066 496 q 1084 489 1077 496 q 1091 471 1091 482 m 1389 787 l 1389 777 l 991 777 l 991 785 q 694 864 991 866 q 398 785 398 863 l 398 777 l 0 777 l 0 787 q 7 821 0 801 q 33 870 13 841 q 84 929 53 900 q 169 988 115 958 q 293 1040 224 1018 q 467 1077 363 1063 q 694 1091 571 1091 q 922 1077 818 1091 q 1095 1040 1025 1063 q 1220 988 1165 1018 q 1305 929 1274 958 q 1356 870 1336 900 q 1382 821 1376 841 q 1389 787 1389 801 m 1389 471 l 1389 322 q 1382 305 1389 312 q 1364 298 1375 298 l 1215 298 q 1197 305 1204 298 q 1190 322 1190 312 l 1190 471 q 1197 489 1190 482 q 1215 496 1204 496 l 1364 496 q 1382 489 1375 496 q 1389 471 1389 482 m 1389 746 l 1389 646 q 1374 610 1389 625 q 1339 595 1359 595 l 1041 595 q 1005 610 1020 595 q 991 646 991 625 l 991 746 l 1389 746 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 546 942 l 546 347 q 531 312 546 327 q 496 298 516 298 l 496 -149 q 481 -184 496 -169 q 446 -198 467 -198 l 50 -198 q 15 -184 29 -198 q 0 -149 0 -169 l 0 248 l 193 925 q 217 942 198 942 l 546 942 m 794 942 l 794 397 l 595 397 l 595 942 l 794 942 m 1389 248 l 1389 -149 q 1374 -184 1389 -169 q 1339 -198 1359 -198 l 942 -198 q 908 -184 922 -198 q 893 -149 893 -169 l 893 298 q 858 312 873 298 q 843 347 843 327 l 843 942 l 1172 942 q 1196 925 1190 942 l 1389 248 m 570 1166 l 570 992 l 298 992 l 298 1166 q 305 1184 298 1177 q 322 1190 312 1190 l 546 1190 q 563 1184 556 1190 q 570 1166 570 1177 m 1091 1166 l 1091 992 l 818 992 l 818 1166 q 825 1184 818 1177 q 843 1190 832 1190 l 1066 1190 q 1084 1184 1077 1190 q 1091 1166 1091 1177 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1360 839 q 1389 769 1389 810 q 1360 699 1389 729 l 1049 389 l 1166 273 l 1042 149 q 740 4 915 22 q 421 82 564 -14 l 140 -198 l 0 -198 l 0 -58 l 281 222 q 203 541 184 366 q 347 843 221 717 l 471 967 l 587 851 l 898 1162 q 968 1190 927 1190 q 1038 1162 1009 1190 q 1066 1092 1066 1133 q 1038 1022 1066 1050 l 728 711 l 909 529 l 1220 839 q 1290 868 1249 868 q 1360 839 1332 868 z "},"飮�":{"ha":1389,"x_min":19,"x_max":1370,"o":"m 677 617 q 627 506 677 553 q 509 460 578 460 q 391 506 440 460 q 342 617 342 553 q 391 728 342 682 q 509 773 440 773 q 627 728 578 773 q 677 617 677 682 m 1066 617 q 1017 506 1066 553 q 898 460 968 460 q 780 506 829 460 q 731 617 731 553 q 780 728 731 682 q 898 773 829 773 q 1017 728 968 773 q 1066 617 1066 682 m 1240 477 l 1240 994 q 1215 1090 1240 1062 q 1129 1118 1190 1118 l 267 1118 q 180 1092 203 1118 q 157 994 157 1066 l 157 473 q 226 442 191 455 q 289 420 261 429 q 351 406 316 412 q 407 397 387 400 q 461 394 426 395 q 506 394 495 394 q 550 395 517 394 q 584 397 583 397 q 658 376 637 398 q 666 369 663 371 q 713 329 686 350 q 805 397 718 400 q 833 396 808 397 q 866 394 857 395 q 901 393 875 394 q 942 394 928 393 q 985 398 957 395 q 1032 404 1012 400 q 1080 415 1052 408 q 1132 430 1108 421 q 1184 451 1156 439 q 1240 477 1213 463 m 1366 481 q 1078 286 1273 366 q 1060 -74 1143 65 q 918 -189 1009 -162 q 777 -177 838 -214 q 714 -50 711 -138 l 713 202 l 713 203 q 694 208 707 205 q 676 212 681 211 l 675 -50 q 611 -177 678 -139 q 469 -189 550 -214 q 328 -73 378 -161 q 311 286 246 67 q 22 481 116 366 q 19 530 3 510 q 66 529 36 550 q 75 524 69 528 q 83 518 81 520 l 83 1056 q 119 1151 83 1111 q 208 1190 156 1190 l 1182 1190 q 1270 1151 1234 1190 q 1307 1056 1307 1111 l 1307 518 l 1323 529 q 1370 530 1353 550 q 1366 481 1386 510 z "},"飮�":{"ha":1389,"x_min":78,"x_max":1311,"o":"m 694 854 l 694 518 l 582 518 l 582 854 l 694 854 m 1003 854 l 1003 518 l 891 518 l 891 854 l 1003 854 m 1003 265 l 1199 462 l 1199 1078 l 274 1078 l 274 265 l 526 265 l 526 97 l 694 265 l 1003 265 m 1311 1190 l 1311 405 l 975 69 l 722 69 l 554 -99 l 386 -99 l 386 69 l 78 69 l 78 966 l 162 1190 l 1311 1190 z "},"飮�":{"ha":1190,"x_min":69,"x_max":1124,"o":"m 599 168 l 599 70 q 594 -167 598 -157 q 555 -198 585 -191 q 414 -168 513 -205 q 288 -99 315 -132 q 275 -71 278 -88 q 278 -51 274 -62 q 305 -15 281 -43 q 445 153 328 14 q 491 207 446 153 q 522 226 503 222 q 560 223 541 230 q 589 201 579 215 q 599 168 600 186 m 484 363 q 443 308 481 320 l 350 278 q 124 210 137 210 q 82 238 97 212 q 69 296 73 257 q 70 425 63 355 q 93 522 77 495 q 136 546 109 548 q 293 487 146 546 q 382 450 348 464 l 447 424 q 475 400 465 417 q 484 363 484 384 m 1124 133 q 1053 8 1118 91 q 948 -91 987 -75 q 899 -85 919 -102 q 756 137 888 -78 l 720 197 q 711 233 709 213 q 726 268 713 252 q 791 288 753 301 q 883 257 791 288 q 1070 196 1040 206 q 1107 180 1101 185 q 1124 133 1128 163 m 603 622 q 561 528 607 543 q 473 583 516 515 l 180 1046 q 195 1094 174 1073 q 355 1164 226 1128 q 529 1188 484 1200 q 567 1153 560 1180 q 584 916 570 1139 q 603 622 599 694 m 1116 539 q 1096 493 1118 508 q 841 426 1084 485 q 770 408 789 415 l 771 410 q 736 413 753 405 q 707 438 718 421 q 707 505 684 474 q 765 584 708 506 q 881 742 862 717 q 908 773 901 768 q 958 774 929 787 q 1053 671 995 756 q 1116 541 1111 585 l 1116 539 z "},"飮�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 794 794 l 496 794 l 496 496 l 794 496 l 794 794 m 893 298 l 893 198 l 397 198 l 397 298 l 893 298 m 893 893 l 893 397 l 397 397 l 397 893 l 893 893 m 1389 298 l 1389 198 l 992 198 l 992 298 l 1389 298 m 1389 496 l 1389 397 l 992 397 l 992 496 l 1389 496 m 1389 694 l 1389 595 l 992 595 l 992 694 l 1389 694 m 1389 893 l 1389 794 l 992 794 l 992 893 l 1389 893 m 198 149 l 198 893 l 99 893 l 99 149 q 114 114 99 129 q 149 99 129 99 q 184 114 169 99 q 198 149 198 129 m 1488 149 l 1488 992 l 298 992 l 298 149 q 289 99 298 123 l 1438 99 q 1473 114 1459 99 q 1488 149 1488 129 m 1587 1091 l 1587 149 q 1544 43 1587 87 q 1438 0 1500 0 l 149 0 q 43 43 87 0 q 0 149 0 87 l 0 992 l 198 992 l 198 1091 l 1587 1091 z "},"飮�":{"ha":1587,"x_min":33,"x_max":1555,"o":"m 866 67 q 837 39 866 67 q 794 10 809 10 q 722 67 778 10 q 665 140 665 124 q 713 181 665 164 q 794 198 762 198 q 874 181 825 198 q 922 140 922 164 q 866 67 922 124 m 1003 220 q 972 239 1001 220 q 893 278 942 259 q 794 298 844 298 q 694 278 743 298 q 616 239 645 259 q 584 220 587 220 q 512 278 570 220 q 453 350 453 336 q 461 368 453 360 q 613 462 522 428 q 794 496 705 496 q 974 462 883 496 q 1126 368 1066 428 q 1134 350 1134 360 q 1075 278 1134 336 q 1003 220 1017 220 m 1215 431 q 1197 437 1206 431 q 1001 557 1091 519 q 794 595 911 595 q 662 578 728 595 q 546 537 595 561 q 458 489 497 513 q 397 448 419 465 q 373 431 374 431 q 301 489 360 431 q 243 561 243 547 q 251 578 243 570 q 499 737 353 680 q 794 794 645 794 q 1088 737 942 794 q 1336 578 1234 680 q 1344 561 1344 570 q 1286 489 1344 547 q 1215 431 1228 431 m 1425 641 q 1407 648 1416 641 q 1120 831 1269 770 q 794 893 970 893 q 468 831 617 893 q 180 648 319 770 q 163 641 171 641 q 91 699 150 641 q 33 771 33 757 q 40 789 33 781 q 385 1012 185 933 q 794 1091 585 1091 q 1202 1012 1002 1091 q 1547 789 1402 933 q 1555 771 1555 781 q 1496 699 1555 757 q 1425 641 1438 641 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 269 -70 q 283 -56 269 -70 q 298 0 298 -41 q 269 70 298 41 q 198 99 239 99 q 128 70 157 99 q 99 0 99 41 q 128 -70 99 -41 q 198 -99 157 -99 q 269 -70 239 -99 m 566 -70 q 581 -56 566 -70 q 595 0 595 -41 q 566 70 595 41 q 496 99 537 99 q 426 70 455 99 q 397 0 397 41 q 426 -70 397 -41 q 496 -99 455 -99 q 566 -70 537 -99 m 269 227 q 283 242 269 227 q 298 298 298 257 q 269 368 298 339 q 198 397 239 397 q 128 368 157 397 q 99 298 99 339 q 128 227 99 257 q 198 198 157 198 q 269 227 239 198 m 864 -70 q 878 -56 864 -70 q 893 0 893 -41 q 864 70 893 41 q 794 99 835 99 q 724 70 753 99 q 694 0 694 41 q 724 -70 694 -41 q 794 -99 753 -99 q 864 -70 835 -99 m 566 227 q 581 242 566 227 q 595 298 595 257 q 566 368 595 339 q 496 397 537 397 q 426 368 455 397 q 397 298 397 339 q 426 227 397 257 q 496 198 455 198 q 566 227 537 198 m 269 525 q 283 540 269 525 q 298 595 298 554 q 269 665 298 636 q 198 694 239 694 q 128 665 157 694 q 99 595 99 636 q 128 525 99 554 q 198 496 157 496 q 269 525 239 496 m 864 227 q 878 242 864 227 q 893 298 893 257 q 864 368 893 339 q 794 397 835 397 q 724 368 753 397 q 694 298 694 339 q 724 227 694 257 q 794 198 753 198 q 864 227 835 198 m 566 525 q 581 540 566 525 q 595 595 595 554 q 566 665 595 636 q 496 694 537 694 q 426 665 455 694 q 397 595 397 636 q 426 525 397 554 q 496 496 455 496 q 566 525 537 496 m 1190 0 l 1190 298 q 1161 367 1190 338 q 1091 397 1132 397 q 1022 367 1051 397 q 992 298 992 338 l 992 0 q 1022 -70 992 -40 q 1091 -99 1051 -99 q 1161 -70 1132 -99 q 1190 0 1190 -40 m 864 525 q 878 540 864 525 q 893 595 893 554 q 864 665 893 636 q 794 694 835 694 q 724 665 753 694 q 694 595 694 636 q 724 525 694 554 q 794 496 753 496 q 864 525 835 496 m 1190 843 l 1190 1042 q 1176 1077 1190 1062 q 1141 1091 1161 1091 l 149 1091 q 114 1077 129 1091 q 99 1042 99 1062 l 99 843 q 114 808 99 823 q 149 794 129 794 l 1141 794 q 1176 808 1161 794 q 1190 843 1190 823 m 1161 525 q 1176 540 1161 525 q 1190 595 1190 554 q 1161 665 1190 636 q 1091 694 1132 694 q 1021 665 1050 694 q 992 595 992 636 q 1021 525 992 554 q 1091 496 1050 496 q 1161 525 1132 496 m 1290 1091 l 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 l 99 -198 q 29 -169 59 -198 q 0 -99 0 -140 l 0 1091 q 29 1161 0 1132 q 99 1190 59 1190 l 1190 1190 q 1260 1161 1231 1190 q 1290 1091 1290 1132 z "},"飮�":{"ha":1190,"x_min":7,"x_max":1177,"o":"m 1177 690 q 1174 532 1191 625 q 736 188 1107 188 l 702 188 q 668 175 683 188 q 649 142 653 162 l 646 127 l 604 -141 l 602 -153 q 583 -186 598 -173 q 549 -198 568 -198 l 354 -198 q 329 -187 338 -198 q 322 -159 319 -175 q 342 -29 329 -115 q 363 102 356 58 q 384 231 370 145 q 405 361 398 318 q 438 390 408 390 l 539 390 q 722 406 643 388 q 945 518 858 436 q 1065 708 1024 591 q 1092 811 1084 763 q 1094 817 1093 816 q 1097 818 1095 818 q 1101 815 1098 818 q 1177 690 1163 770 m 1044 908 q 1008 725 1044 825 q 774 481 946 545 q 579 449 687 450 q 509 448 579 448 l 439 449 q 348 374 362 449 q 282 -36 346 368 q 273 -44 281 -44 l 44 -44 q 16 -31 27 -44 q 7 -2 5 -19 l 187 1139 q 208 1176 191 1161 q 248 1190 226 1190 l 711 1190 q 787 1180 738 1190 q 873 1156 836 1170 q 1000 1060 956 1124 q 1044 908 1044 997 z "},"飮�":{"ha":1389,"x_min":30,"x_max":1389,"o":"m 342 670 q 382 649 367 670 q 663 50 588 367 l 317 50 q 33 630 219 391 q 30 656 23 643 q 53 670 37 670 l 342 670 m 775 393 q 678 88 737 239 q 480 549 617 329 q 514 897 511 720 q 775 393 677 633 m 852 942 q 1150 401 1034 691 q 1293 -198 1266 111 l 943 -198 q 515 942 911 317 l 852 942 m 1389 496 q 1311 -133 1389 167 q 1032 706 1259 301 q 950 1159 1013 939 q 954 1181 947 1171 q 974 1190 962 1190 l 1252 1190 q 1282 1180 1269 1190 q 1300 1155 1296 1170 q 1389 496 1389 838 z "},"飮�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1531 423 l 1424 423 q 1475 562 1435 452 l 1477 569 q 1485 589 1480 577 q 1492 609 1490 601 l 1501 567 l 1531 423 m 412 474 l 367 702 q 308 744 358 744 l 101 744 l 99 734 q 412 474 340 673 m 550 744 l 425 405 l 412 474 q 346 574 391 528 q 244 643 300 620 l 349 247 l 484 247 l 687 744 l 550 744 m 658 246 l 787 246 l 867 744 l 739 744 l 658 246 m 1253 732 q 1138 753 1200 753 q 982 707 1042 753 q 921 588 922 661 q 1033 453 920 509 q 1085 422 1070 436 q 1100 391 1100 408 q 1077 356 1100 368 q 1023 343 1053 343 q 902 369 956 343 l 885 377 l 867 266 q 1011 239 925 239 q 1172 285 1111 239 q 1235 409 1233 332 q 1126 544 1235 491 q 1071 577 1088 563 q 1054 606 1054 590 q 1073 636 1054 623 q 1128 649 1092 649 q 1224 630 1182 649 l 1235 624 l 1253 732 m 1583 744 l 1483 744 q 1416 702 1433 744 l 1225 246 l 1360 246 l 1387 321 l 1552 321 q 1567 246 1556 304 l 1687 246 l 1583 744 m 1786 992 l 1786 0 q 1756 -70 1786 -40 q 1687 -99 1727 -99 l 99 -99 q 29 -70 59 -99 q 0 0 0 -40 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 1687 1091 q 1756 1062 1727 1091 q 1786 992 1786 1032 z "},"飮�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 867 926 q 649 992 768 992 q 496 961 570 992 q 370 877 423 929 q 286 751 318 824 q 255 598 255 678 q 286 445 255 518 q 370 319 318 372 q 496 235 423 267 q 649 204 569 204 q 867 270 768 204 q 729 475 766 353 q 730 721 693 598 q 867 926 767 843 m 893 908 q 760 714 795 831 q 759 481 724 598 q 893 288 794 365 q 1027 481 991 365 q 1026 714 1062 598 q 893 908 991 831 m 918 926 q 1056 720 1019 843 q 1056 475 1093 598 q 918 270 1020 352 q 1136 204 1018 204 q 1290 235 1217 204 q 1415 319 1363 267 q 1499 445 1468 372 q 1531 598 1531 518 q 1499 751 1531 678 q 1415 877 1468 824 q 1289 961 1363 929 q 1136 992 1216 992 q 918 926 1018 992 m 1493 367 l 1498 367 l 1498 369 l 1485 369 l 1485 367 l 1490 367 l 1490 353 l 1493 353 l 1493 367 m 1515 353 l 1518 353 l 1518 369 l 1514 369 l 1510 359 l 1505 369 l 1501 369 l 1501 353 l 1504 353 l 1504 365 l 1508 355 l 1511 355 l 1515 365 l 1515 353 m 1509 12 l 1509 11 l 1507 11 l 1505 11 l 1505 13 l 1507 13 l 1509 13 l 1509 12 m 1509 5 l 1511 5 l 1508 9 q 1510 9 1509 9 l 1511 10 q 1511 12 1511 11 q 1511 15 1511 14 l 1510 16 q 1507 16 1508 16 l 1503 16 l 1503 5 l 1505 5 l 1505 9 l 1506 9 l 1509 5 m 539 34 q 535 39 539 34 q 531 58 531 43 q 539 82 531 73 q 563 91 548 91 q 585 82 577 91 q 594 58 594 72 q 585 34 594 43 q 563 25 577 25 q 539 34 548 25 m 870 67 q 898 92 874 92 q 925 67 921 92 l 870 67 m 1182 34 q 1178 39 1182 34 q 1173 58 1173 43 q 1182 82 1173 73 q 1204 91 1190 91 q 1227 82 1218 91 q 1236 58 1236 72 q 1228 34 1236 43 q 1204 25 1219 25 q 1182 34 1190 25 m 1393 34 q 1389 39 1393 34 q 1384 58 1384 44 q 1393 82 1384 72 q 1416 91 1402 91 q 1439 82 1430 91 q 1448 58 1448 72 q 1439 34 1448 43 q 1416 25 1430 25 q 1393 34 1402 25 m 1507 2 q 1504 3 1505 2 q 1501 5 1503 3 q 1500 7 1500 6 q 1499 10 1499 9 q 1500 13 1499 12 q 1501 16 1500 15 q 1502 17 1502 17 q 1504 18 1504 17 q 1507 19 1505 19 q 1510 18 1509 19 q 1513 16 1513 16 l 1514 13 l 1514 12 q 1515 10 1515 11 l 1514 9 q 1514 7 1514 8 q 1514 6 1514 6 l 1513 5 q 1510 3 1511 3 q 1507 2 1509 2 m 464 5 l 488 5 l 488 71 q 476 101 488 90 q 446 113 465 112 q 409 95 421 113 q 374 113 398 113 q 344 98 356 113 l 344 110 l 321 110 l 321 5 l 344 5 l 344 64 q 370 91 344 91 q 393 64 393 91 l 393 5 l 415 5 l 415 64 q 441 91 415 91 q 464 64 464 91 l 464 5 m 593 5 l 615 5 l 615 58 l 615 110 l 593 110 l 593 98 q 560 113 580 113 q 522 98 537 113 q 508 58 508 82 q 522 19 508 34 q 560 3 537 3 q 593 19 581 3 l 593 5 m 731 37 q 694 68 731 64 l 684 70 q 666 81 666 73 q 685 92 666 92 q 718 84 703 92 l 728 102 q 685 113 711 113 q 653 104 665 113 q 642 79 642 95 q 678 49 642 53 l 688 47 q 707 36 707 44 q 683 23 707 23 q 648 34 663 23 l 638 16 q 683 3 657 3 q 718 12 705 3 q 731 37 731 22 m 832 11 l 825 30 q 805 25 815 25 q 791 42 791 25 l 791 89 l 828 89 l 828 110 l 791 110 l 791 142 l 767 142 l 767 110 l 746 110 l 746 89 l 767 89 l 767 42 q 804 3 767 3 q 832 11 820 3 m 898 113 q 861 98 876 113 q 846 58 846 82 q 861 18 846 33 q 900 3 877 3 q 942 18 925 3 l 932 35 q 901 23 918 23 q 870 49 875 23 l 948 49 l 948 58 q 934 98 948 83 q 898 113 920 113 m 1022 113 q 994 98 1004 113 l 994 110 l 971 110 l 971 5 l 994 5 l 994 64 q 1017 91 994 91 q 1031 88 1025 91 l 1038 110 q 1022 113 1031 113 m 1060 98 q 1052 90 1060 98 q 1045 58 1045 82 q 1060 19 1045 34 q 1101 3 1075 3 q 1138 16 1123 3 l 1127 34 q 1100 25 1113 24 q 1077 34 1086 25 q 1068 58 1068 43 q 1077 82 1068 73 q 1100 91 1086 91 q 1127 82 1115 91 l 1138 101 q 1101 113 1122 113 q 1060 98 1075 113 m 1235 5 l 1258 5 l 1258 58 l 1258 110 l 1235 110 l 1235 98 q 1202 113 1223 113 q 1165 98 1180 113 q 1149 58 1149 82 q 1165 19 1149 34 q 1202 3 1180 3 q 1235 19 1224 3 l 1235 5 m 1338 113 q 1311 98 1320 113 l 1311 110 l 1288 110 l 1288 5 l 1311 5 l 1311 64 q 1333 91 1311 91 q 1347 88 1341 91 l 1354 110 q 1338 113 1348 113 m 1446 5 l 1469 5 l 1469 58 l 1469 153 l 1446 153 l 1446 98 q 1413 113 1435 113 q 1376 97 1391 113 q 1361 58 1361 81 q 1376 19 1361 35 q 1413 3 1391 3 q 1446 19 1435 3 l 1446 5 m 1507 21 l 1505 20 q 1503 20 1504 20 q 1500 18 1501 19 q 1497 15 1497 17 q 1497 10 1497 13 q 1497 6 1497 8 q 1500 3 1497 5 q 1503 1 1501 2 q 1507 0 1504 0 q 1511 1 1510 0 q 1513 2 1511 2 l 1514 3 q 1517 6 1515 4 q 1518 10 1518 8 q 1517 15 1518 13 q 1514 18 1516 16 q 1513 19 1514 19 l 1511 20 q 1509 21 1511 20 q 1507 21 1507 21 m 1786 992 l 1786 0 q 1756 -70 1786 -40 q 1687 -99 1727 -99 l 99 -99 q 29 -70 59 -99 q 0 0 0 -40 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 1687 1091 q 1756 1062 1727 1091 q 1786 992 1786 1032 z "},"飮�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 243 588 q 215 523 243 549 q 146 503 192 503 l 133 503 l 133 674 l 146 674 q 215 653 193 674 q 243 588 243 629 m 1619 639 q 1569 598 1619 598 l 1555 598 l 1555 677 l 1570 677 q 1619 639 1619 677 m 295 588 q 256 682 295 646 q 156 718 217 718 l 82 718 l 82 460 l 156 460 q 248 489 213 460 q 295 588 295 529 m 318 460 l 368 460 l 368 718 l 318 718 l 318 460 m 566 538 q 550 586 566 569 q 491 618 534 603 q 461 633 469 626 q 453 651 453 640 q 463 672 453 663 q 490 680 474 680 q 531 659 512 680 l 557 693 q 481 722 525 722 q 424 700 447 722 q 401 648 401 679 q 415 605 401 621 q 464 577 429 589 q 499 562 493 567 q 514 536 514 553 q 503 510 514 520 q 475 499 492 499 q 420 533 438 499 l 388 502 q 477 453 422 453 q 541 476 516 453 q 566 538 566 500 m 781 468 l 781 528 q 721 499 753 499 q 658 524 683 499 q 634 588 634 550 q 658 651 634 625 q 718 677 683 677 q 781 648 752 677 l 781 708 q 719 723 750 723 q 622 684 662 723 q 582 588 582 645 q 622 493 582 532 q 718 453 661 453 q 781 468 751 453 m 1736 0 l 1736 408 q 1624 343 1686 377 q 1440 253 1563 309 q 1185 146 1318 196 q 861 42 1052 96 q 470 -50 670 -12 l 1687 -50 q 1721 -35 1707 -50 q 1736 0 1736 -20 m 1035 488 q 1056 508 1035 488 q 1077 587 1077 529 q 1035 686 1077 645 q 936 727 994 727 q 837 686 878 727 q 796 587 796 645 q 837 488 796 529 q 936 446 878 446 q 1035 488 994 446 m 1194 453 l 1306 718 l 1251 718 l 1181 544 l 1112 718 l 1057 718 l 1167 453 l 1194 453 m 1328 460 l 1471 460 l 1471 503 l 1379 503 l 1379 573 l 1468 573 l 1468 616 l 1379 616 l 1379 674 l 1471 674 l 1471 718 l 1328 718 l 1328 460 m 1631 460 l 1693 460 l 1612 568 q 1671 641 1671 581 q 1647 698 1671 677 q 1580 718 1623 718 l 1504 718 l 1504 460 l 1555 460 l 1555 563 l 1562 563 l 1631 460 m 1786 987 l 1786 5 q 1756 -69 1786 -39 q 1683 -99 1726 -99 l 102 -99 q 30 -69 60 -99 q 0 5 0 -39 l 0 987 q 30 1061 0 1031 q 102 1091 60 1091 l 1683 1091 q 1756 1061 1726 1091 q 1786 987 1786 1031 z "},"飮�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 92 662 l 161 662 l 126 746 l 92 662 m 574 254 l 631 315 l 577 377 l 450 377 l 450 339 l 560 339 l 560 296 l 450 296 l 450 254 l 574 254 m 696 315 l 773 229 l 773 398 l 696 315 m 919 351 q 888 377 919 377 l 823 377 l 823 323 l 887 323 q 919 351 919 323 m 1143 354 q 1111 377 1143 377 l 1047 377 l 1047 329 l 1110 329 q 1143 354 1143 329 m 928 715 q 895 738 928 738 l 832 738 l 832 691 l 894 691 q 928 715 928 691 m 1283 662 l 1352 662 l 1318 746 l 1283 662 m 542 782 l 542 572 l 491 572 l 491 736 l 418 572 l 374 572 l 301 736 l 301 572 l 198 572 l 179 618 l 74 618 l 55 572 l 1 572 l 91 782 l 165 782 l 250 583 l 250 782 l 332 782 l 398 639 l 458 782 l 542 782 m 973 351 q 968 324 973 336 q 958 305 964 312 q 940 292 951 297 q 920 284 929 287 q 896 281 911 281 q 871 280 880 280 q 846 280 862 280 q 823 281 830 281 l 823 210 l 725 210 l 663 280 l 599 210 l 401 210 l 401 420 l 602 420 l 664 351 l 728 420 l 888 420 q 973 351 973 420 m 747 615 l 747 572 l 579 572 l 579 782 l 747 782 l 747 738 l 629 738 l 629 700 l 744 700 l 744 657 l 629 657 l 629 615 l 747 615 m 1786 182 l 1786 5 q 1756 -69 1786 -38 q 1683 -99 1726 -99 l 102 -99 q 30 -69 60 -99 q 0 5 0 -38 l 0 530 l 86 530 l 105 577 l 148 577 l 167 530 l 336 530 l 336 566 l 351 530 l 439 530 l 454 567 l 454 530 l 873 530 l 873 607 l 881 608 q 889 597 889 608 l 889 530 l 1105 530 l 1105 548 q 1148 534 1123 539 q 1189 529 1173 529 q 1237 529 1204 529 q 1277 530 1270 530 l 1297 577 l 1340 577 l 1359 530 l 1535 530 l 1535 575 l 1562 530 l 1703 530 l 1703 823 l 1563 823 l 1563 789 l 1544 823 l 1401 823 l 1401 789 l 1383 823 l 1190 823 q 1105 806 1136 823 l 1105 823 l 972 823 l 972 806 q 915 823 953 823 l 429 823 l 395 748 l 362 823 l 208 823 l 208 789 l 191 823 l 60 823 l 0 684 l 0 987 q 30 1061 0 1030 q 102 1091 60 1091 l 1683 1091 q 1756 1061 1726 1091 q 1786 987 1786 1030 l 1786 462 l 1693 462 q 1630 445 1653 462 l 1630 462 l 1493 462 q 1432 445 1450 462 l 1432 462 l 1187 462 l 1187 445 q 1120 462 1163 462 l 958 462 l 958 445 q 887 462 940 462 l 706 462 l 664 417 l 625 462 l 355 462 l 355 169 l 621 169 l 663 215 l 704 169 l 867 169 l 867 238 l 884 238 q 953 248 929 238 l 953 169 l 1088 169 l 1088 246 l 1094 246 q 1102 244 1101 246 q 1104 236 1104 243 l 1104 169 l 1514 169 q 1582 188 1558 169 l 1582 169 l 1712 169 q 1786 182 1759 169 m 1198 363 q 1189 330 1198 346 q 1163 308 1180 315 q 1189 288 1182 301 q 1196 252 1196 274 l 1196 210 l 1146 210 l 1146 245 q 1136 279 1146 270 q 1101 287 1127 287 l 1047 287 l 1047 210 l 997 210 l 997 420 l 1116 420 q 1176 408 1153 420 q 1198 363 1198 397 m 984 725 q 974 691 984 707 q 948 669 964 676 q 975 649 968 662 q 981 613 981 636 l 981 572 l 931 572 q 931 593 931 579 q 931 612 932 606 q 929 626 931 618 q 922 639 927 635 q 909 645 918 643 q 886 648 900 648 l 832 648 l 832 572 l 782 572 l 782 782 l 901 781 q 961 770 939 781 q 984 725 984 759 m 1394 253 l 1394 210 l 1226 210 l 1226 420 l 1394 420 l 1394 377 l 1277 377 l 1277 339 l 1391 339 l 1391 296 l 1277 296 l 1277 254 l 1394 253 m 1063 782 l 1063 572 l 1012 572 l 1012 782 l 1063 782 m 1600 277 q 1521 210 1600 210 l 1424 210 l 1424 255 l 1521 255 q 1548 274 1548 255 q 1535 291 1548 287 q 1502 295 1521 295 q 1464 297 1483 295 q 1432 315 1445 300 q 1418 357 1418 329 q 1438 404 1418 388 q 1490 420 1459 420 l 1590 420 l 1590 376 l 1498 376 q 1470 357 1470 376 q 1484 341 1470 344 q 1516 338 1497 337 q 1554 336 1535 338 q 1587 319 1573 333 q 1600 277 1600 305 m 1786 315 l 1786 237 q 1718 210 1767 210 l 1621 210 l 1621 255 l 1718 255 q 1743 274 1743 255 q 1733 289 1743 284 q 1709 293 1724 294 q 1678 295 1695 293 q 1647 301 1662 297 q 1623 320 1633 305 q 1614 357 1614 334 q 1634 404 1614 388 q 1686 420 1655 420 l 1786 420 l 1786 376 l 1694 376 q 1666 357 1666 376 q 1689 339 1666 341 q 1742 336 1711 338 q 1786 315 1773 333 m 1658 781 l 1658 572 l 1587 572 l 1492 729 l 1492 572 l 1390 572 l 1370 618 l 1266 618 l 1246 572 l 1188 572 q 1088 675 1088 572 q 1191 782 1088 782 l 1240 782 l 1240 736 q 1218 737 1235 736 q 1196 737 1202 738 q 1178 736 1190 737 q 1162 731 1166 735 q 1151 720 1157 727 q 1142 703 1144 714 q 1139 677 1139 691 q 1150 632 1139 647 q 1188 616 1160 616 l 1211 616 l 1282 781 l 1357 781 l 1442 583 l 1442 781 l 1518 781 l 1607 636 l 1607 781 l 1658 781 z "},"飮�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 577 488 q 558 441 577 460 q 509 422 538 422 q 473 434 487 422 q 460 468 460 446 q 479 517 460 497 q 527 536 498 536 q 563 524 549 536 q 577 488 577 511 m 1186 604 q 1169 560 1186 571 q 1118 548 1152 548 l 1093 547 l 1106 630 q 1116 639 1108 639 l 1130 639 q 1157 637 1147 639 q 1177 627 1167 636 q 1186 604 1186 619 m 1458 488 q 1438 441 1458 460 q 1390 422 1418 422 q 1354 434 1368 422 q 1340 468 1340 446 q 1359 517 1340 497 q 1407 536 1379 536 q 1444 524 1429 536 q 1458 488 1458 511 m 398 621 q 368 687 398 667 q 290 708 338 708 l 166 708 q 150 693 151 708 l 99 377 q 102 368 98 372 q 109 364 105 364 l 168 364 q 185 379 184 364 l 199 464 q 205 474 200 470 q 216 479 209 478 q 229 481 223 481 q 244 480 236 481 q 255 479 253 479 q 360 517 322 479 q 398 621 398 554 m 637 379 l 669 581 q 667 590 670 586 q 659 594 663 594 l 600 594 q 587 568 589 594 q 513 599 566 599 q 418 557 457 599 q 379 459 379 515 q 406 386 379 413 q 477 359 432 359 q 522 368 499 359 q 560 393 546 377 q 556 377 556 384 q 567 364 556 364 l 620 364 q 637 379 635 364 m 982 577 q 984 583 984 579 q 980 590 984 587 q 973 594 977 594 l 914 594 q 900 586 905 594 l 818 465 l 784 581 q 767 594 780 594 l 708 594 q 701 590 705 594 q 698 583 698 587 q 713 537 698 581 q 746 442 729 493 q 764 388 763 391 q 701 295 701 301 q 711 284 701 284 l 770 284 q 784 292 779 284 l 982 577 m 1278 621 q 1248 687 1278 667 q 1170 708 1218 708 l 1047 708 q 1030 693 1032 708 l 980 377 q 982 368 979 372 q 990 364 985 364 l 1053 364 q 1066 374 1063 364 l 1080 464 q 1085 474 1080 470 q 1097 479 1090 478 q 1110 481 1104 481 q 1125 480 1116 481 q 1135 479 1133 479 q 1240 517 1202 479 q 1278 621 1278 554 m 1518 379 l 1549 581 q 1547 590 1550 586 q 1539 594 1544 594 l 1480 594 q 1467 568 1469 594 q 1394 599 1447 599 q 1299 557 1338 599 q 1259 459 1259 515 q 1286 386 1259 413 q 1358 359 1313 359 q 1404 368 1380 359 q 1440 393 1427 377 q 1438 386 1440 392 q 1437 377 1437 380 q 1447 364 1437 364 l 1500 364 q 1518 379 1515 364 m 1687 696 l 1687 697 q 1676 708 1687 708 l 1619 708 q 1609 699 1611 708 l 1559 377 l 1558 375 q 1561 368 1558 371 q 1569 364 1564 364 l 1620 364 q 1636 379 1635 364 l 1687 696 m 304 592 q 284 556 300 565 q 237 548 267 548 l 212 547 l 225 630 q 235 639 226 639 l 250 639 q 295 630 281 639 q 304 592 308 621 m 1786 992 l 1786 0 q 1756 -70 1786 -40 q 1687 -99 1727 -99 l 99 -99 q 29 -70 59 -99 q 0 0 0 -40 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 1687 1091 q 1756 1062 1727 1091 q 1786 992 1786 1032 z "},"飮�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1238 491 q 1221 408 1238 437 q 1181 381 1207 381 q 1149 388 1163 381 l 1149 562 q 1194 585 1172 585 q 1238 491 1238 585 m 1577 519 l 1492 519 q 1535 594 1497 594 q 1577 519 1575 594 m 369 414 q 343 485 369 460 q 265 529 318 510 q 225 548 237 539 q 212 567 212 556 q 242 587 212 587 q 338 562 287 587 l 352 649 q 236 674 300 674 q 141 644 177 674 q 104 560 104 614 q 129 489 104 515 q 206 446 154 464 q 248 426 236 435 q 260 405 260 417 q 223 381 260 381 q 169 390 201 381 q 113 414 137 400 l 99 326 q 229 295 155 295 q 329 323 292 295 q 369 414 369 355 m 598 581 l 612 667 l 538 667 l 538 771 l 438 755 l 424 667 l 388 660 l 375 581 l 423 581 l 423 411 q 457 318 423 346 q 543 295 487 295 q 605 303 568 295 l 605 395 q 570 389 580 389 q 538 428 538 389 l 538 581 l 598 581 m 842 561 l 842 669 q 821 671 831 671 q 778 659 796 671 q 752 623 760 646 l 744 667 l 643 667 l 643 301 l 759 301 l 759 539 q 822 563 779 563 q 842 561 835 563 m 871 301 l 987 301 l 987 667 l 871 667 l 871 301 m 1353 494 q 1318 633 1353 589 q 1232 674 1287 674 q 1142 630 1183 674 l 1135 667 l 1033 667 l 1033 167 l 1149 186 l 1149 303 q 1202 295 1177 295 q 1306 338 1266 295 q 1353 494 1353 388 m 973 720 q 982 730 973 720 q 991 764 991 739 q 973 808 991 790 q 929 825 955 825 q 886 808 904 825 q 868 764 868 790 q 886 720 868 739 q 929 702 904 702 q 973 720 955 702 m 1687 488 q 1649 624 1687 575 q 1538 674 1611 674 q 1420 622 1463 674 q 1377 483 1377 571 q 1426 337 1377 384 q 1551 295 1469 295 q 1675 326 1629 295 l 1662 405 q 1563 381 1618 381 q 1514 396 1530 381 q 1493 447 1497 411 l 1685 447 q 1687 488 1687 458 m 1786 992 l 1786 0 q 1756 -70 1786 -40 q 1687 -99 1727 -99 l 99 -99 q 29 -70 59 -99 q 0 0 0 -40 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 1687 1091 q 1756 1062 1727 1091 q 1786 992 1786 1032 z "},"飮�":{"ha":1587,"x_min":11,"x_max":1576,"o":"m 1208 530 q 1438 99 1255 254 q 1409 29 1438 59 q 1339 0 1380 0 l 992 0 q 934 -140 992 -82 q 794 -198 876 -198 q 654 -141 711 -198 q 595 -1 596 -83 l 1208 530 m 794 -136 q 806 -124 806 -136 q 794 -112 806 -112 q 715 -79 748 -112 q 682 0 682 -46 q 670 12 682 12 q 657 0 657 12 q 697 -96 657 -57 q 794 -136 737 -136 m 1570 1104 q 1576 1085 1576 1096 q 1568 1068 1576 1075 l 117 -189 q 99 -195 109 -195 q 82 -186 88 -194 l 17 -112 q 11 -93 11 -104 q 19 -77 12 -83 l 164 48 q 149 99 149 73 q 219 167 188 132 q 285 260 251 203 q 343 383 319 317 q 382 543 367 449 q 397 744 397 636 q 488 963 397 862 q 725 1086 578 1064 q 719 1116 719 1101 q 741 1169 719 1147 q 794 1190 763 1190 q 846 1169 825 1190 q 868 1116 868 1147 q 862 1086 868 1101 q 1032 1022 958 1072 q 1146 900 1105 972 l 1470 1181 q 1488 1187 1478 1187 q 1505 1178 1499 1186 l 1570 1104 z "},"飮�":{"ha":1587,"x_min":11,"x_max":1576,"o":"m 794 -136 q 806 -124 806 -136 q 794 -112 806 -112 q 715 -79 748 -112 q 682 0 682 -46 q 670 12 682 12 q 657 0 657 12 q 697 -96 657 -57 q 794 -136 737 -136 m 390 244 l 1070 833 q 967 947 1037 901 q 794 992 897 992 q 662 968 722 992 q 568 905 603 943 q 515 825 533 867 q 496 744 496 784 q 390 244 496 446 m 1438 99 q 1409 29 1438 59 q 1339 0 1380 0 l 992 0 q 934 -140 992 -82 q 794 -198 876 -198 q 654 -141 711 -198 q 595 -1 596 -83 l 711 99 l 1297 99 q 1121 455 1169 244 l 1208 530 q 1438 99 1255 254 m 1505 1178 l 1570 1104 q 1576 1085 1576 1096 q 1568 1068 1576 1075 l 117 -189 q 99 -195 109 -195 q 82 -186 88 -194 l 17 -112 q 11 -93 11 -104 q 19 -77 12 -83 l 164 48 q 149 99 149 73 q 219 167 188 132 q 285 260 251 203 q 343 383 319 317 q 382 543 367 449 q 397 744 397 636 q 488 963 397 862 q 725 1086 578 1064 q 719 1116 719 1101 q 741 1169 719 1147 q 794 1190 763 1190 q 846 1169 825 1190 q 868 1116 868 1147 q 862 1086 868 1101 q 1032 1022 958 1072 q 1146 900 1105 972 l 1470 1181 q 1488 1187 1478 1187 q 1505 1178 1499 1186 z "},"飮�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 397 124 l 397 670 q 390 687 397 680 q 372 694 383 694 l 322 694 q 305 687 312 694 q 298 670 298 680 l 298 124 q 305 106 298 113 q 322 99 312 99 l 372 99 q 390 106 383 99 q 397 124 397 113 m 595 124 l 595 670 q 588 687 595 680 q 570 694 581 694 l 521 694 q 503 687 510 694 q 496 670 496 680 l 496 124 q 503 106 496 113 q 521 99 510 99 l 570 99 q 588 106 581 99 q 595 124 595 113 m 794 124 l 794 670 q 787 687 794 680 q 769 694 780 694 l 719 694 q 701 687 708 694 q 694 670 694 680 l 694 124 q 701 106 694 113 q 719 99 708 99 l 769 99 q 787 106 780 99 q 794 124 794 113 m 372 893 l 719 893 l 682 984 q 669 992 677 991 l 423 992 q 410 984 415 991 l 372 893 m 1091 868 l 1091 818 q 1084 801 1091 808 q 1066 794 1077 794 l 992 794 l 992 59 q 956 -52 992 -5 q 868 -99 919 -99 l 223 -99 q 136 -54 172 -99 q 99 56 99 -9 l 99 794 l 25 794 q 7 801 14 794 q 0 818 0 808 l 0 868 q 7 886 0 879 q 25 893 14 893 l 264 893 l 319 1022 q 360 1071 330 1051 q 422 1091 391 1091 l 670 1091 q 731 1071 701 1091 q 773 1022 761 1051 l 827 893 l 1066 893 q 1084 886 1077 893 q 1091 868 1091 879 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 891 358 l 891 274 q 863 205 891 235 q 790 158 835 174 q 699 133 746 141 q 608 124 652 124 q 342 232 449 124 q 236 500 236 339 q 341 763 236 657 q 604 868 446 868 q 662 865 630 868 q 734 851 694 861 q 806 824 774 840 q 860 780 838 808 q 881 718 881 753 l 881 633 q 869 621 881 621 l 777 621 q 765 633 765 621 l 765 687 q 714 740 765 721 q 608 759 663 759 q 431 688 499 759 q 362 504 362 617 q 433 310 362 387 q 614 234 504 234 q 721 253 667 234 q 775 304 775 271 l 775 358 q 779 367 775 363 q 787 370 782 370 l 879 370 q 887 367 884 370 q 891 358 891 363 m 788 953 q 742 972 788 953 q 595 992 696 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 788 40 696 0 q 946 145 880 79 q 1052 303 1012 212 q 1091 496 1091 395 q 1052 689 1091 597 q 946 847 1012 780 q 788 953 880 913 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飮�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 753 590 q 712 721 753 674 q 598 768 670 768 q 501 744 549 768 q 416 679 454 721 q 355 573 378 637 q 331 433 331 508 q 372 299 331 346 q 489 252 414 252 q 625 303 563 252 q 720 432 687 355 q 753 590 753 509 m 1190 496 q 1162 343 1190 410 q 1085 239 1133 277 q 984 181 1038 201 q 871 160 929 161 q 859 159 867 160 q 846 159 852 159 q 736 200 773 159 q 711 264 715 226 q 609 179 670 213 q 474 145 547 145 q 281 219 350 145 q 212 428 212 293 q 264 653 212 550 q 402 816 315 756 q 593 876 490 876 q 713 848 660 876 q 795 771 766 821 l 797 786 l 805 829 q 810 839 806 834 q 817 843 813 843 l 908 843 q 918 835 912 843 q 921 822 922 831 l 828 346 q 824 309 824 328 q 834 269 824 279 q 868 259 843 259 q 912 263 890 260 q 969 282 935 267 q 1028 320 1003 297 q 1073 390 1054 344 q 1091 496 1091 436 q 956 857 1091 722 q 595 992 822 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 909 112 772 0 q 928 118 918 119 q 944 109 938 117 l 976 71 q 981 52 982 61 q 972 35 980 42 q 796 -64 893 -29 q 595 -99 698 -99 q 364 -52 474 -99 q 174 75 254 -5 q 47 265 95 155 q 0 496 0 375 q 47 727 0 617 q 174 917 95 837 q 364 1044 254 997 q 595 1091 474 1091 q 1026 927 862 1091 q 1190 496 1190 763 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1140 1190 q 1192 1190 1140 1190 q 1316 1118 1243 1190 q 1389 942 1389 1045 q 1316 767 1389 839 l 1142 594 l 1222 514 q 1230 496 1230 506 q 1222 478 1230 486 l 1059 315 q 1042 308 1052 308 q 1024 315 1032 308 l 942 397 l 475 -71 q 405 -99 446 -99 l 248 -99 l 50 -198 l 0 -149 l 99 50 l 99 207 q 128 277 99 248 l 595 744 l 514 825 q 506 843 506 833 q 514 861 506 853 l 677 1024 q 694 1032 684 1032 q 712 1024 705 1032 l 793 943 l 966 1118 q 1140 1190 1038 1190 m 397 50 l 843 496 l 694 645 l 248 198 l 248 50 l 397 50 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1387,"o":"m 1252 1190 q 1347 1154 1306 1190 q 1387 1064 1387 1118 q 1352 947 1387 1015 q 992 364 1095 460 q 823 294 917 294 q 655 365 725 294 q 585 536 585 437 q 656 700 585 635 l 1151 1149 q 1252 1190 1197 1190 m 547 389 q 630 288 577 330 q 746 229 682 246 l 747 174 q 647 -95 750 9 q 377 -198 543 -198 q 208 -162 281 -198 q 90 -64 134 -126 q 22 78 45 -1 q 0 249 0 157 q 32 226 5 245 q 80 191 58 206 q 126 163 102 176 q 161 150 150 150 q 204 178 193 150 q 248 265 223 229 q 302 324 274 301 q 370 361 331 347 q 450 381 410 375 q 547 389 491 387 z "},"飮�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 99 l 1389 -198 l 0 -198 l 0 99 q 66 110 35 99 q 112 131 97 121 q 148 160 126 142 q 188 190 171 181 q 232 198 205 198 q 266 193 250 198 q 290 181 281 188 q 315 160 298 175 q 352 131 338 141 q 397 110 366 121 q 463 99 428 99 q 529 110 498 99 q 574 131 560 122 q 612 160 588 141 q 637 181 628 175 q 661 193 646 188 q 694 198 676 198 q 738 190 722 198 q 778 160 755 181 q 815 131 800 142 q 860 110 829 121 q 926 99 891 99 q 992 110 961 99 q 1038 131 1023 121 q 1074 160 1053 142 q 1114 190 1097 181 q 1158 198 1131 198 q 1201 190 1184 198 q 1241 160 1218 181 q 1277 131 1263 142 q 1323 110 1292 121 q 1389 99 1354 99 m 1389 347 l 1389 198 q 1355 204 1370 198 q 1331 215 1339 209 q 1305 236 1322 222 q 1269 266 1283 256 q 1224 287 1255 276 q 1158 298 1193 298 q 1091 287 1122 298 q 1046 266 1060 276 q 1010 236 1032 256 q 984 215 993 222 q 960 204 976 209 q 926 198 945 198 q 882 207 899 198 q 842 236 866 215 q 806 266 820 256 q 761 287 792 276 q 694 298 730 298 q 629 286 660 298 q 584 265 598 275 q 546 236 570 256 q 521 215 530 222 q 497 204 512 209 q 463 198 482 198 q 420 207 436 198 q 380 236 403 215 q 343 265 358 255 q 298 287 329 276 q 232 298 267 298 q 165 287 196 298 q 120 266 134 276 q 84 236 106 256 q 44 207 60 215 q 0 198 27 198 l 0 347 q 43 453 0 409 q 149 496 87 496 l 198 496 l 198 843 l 397 843 l 397 496 l 595 496 l 595 843 l 794 843 l 794 496 l 992 496 l 992 843 l 1190 843 l 1190 496 l 1240 496 q 1345 453 1302 496 q 1389 347 1389 409 m 397 1017 q 369 925 397 957 q 298 893 341 893 q 227 922 257 893 q 198 992 198 951 q 206 1032 198 1015 q 224 1058 213 1049 q 248 1080 235 1067 q 272 1104 261 1092 q 290 1139 283 1116 q 298 1190 298 1161 q 362 1133 327 1190 q 397 1017 397 1076 m 794 1017 q 766 925 794 957 q 694 893 738 893 q 624 922 653 893 q 595 992 595 951 q 603 1032 595 1015 q 621 1058 610 1049 q 645 1080 632 1067 q 669 1104 658 1092 q 687 1139 680 1116 q 694 1190 694 1161 q 759 1133 724 1190 q 794 1017 794 1076 m 1190 1017 q 1163 925 1190 957 q 1091 893 1135 893 q 1021 922 1050 893 q 992 992 992 951 q 999 1032 992 1015 q 1018 1058 1007 1049 q 1042 1080 1028 1067 q 1066 1104 1055 1092 q 1084 1139 1077 1116 q 1091 1190 1091 1161 q 1156 1133 1121 1190 q 1190 1017 1190 1076 z "},"飮�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1587 0 l 1587 -99 l 0 -99 l 0 1091 l 99 1091 l 99 0 l 1587 0 m 1290 794 l 1488 99 l 198 99 l 198 546 l 546 992 l 992 546 l 1290 794 z "},"飯�":{"ha":1389,"x_min":0,"x_max":1339,"o":"m 595 501 l 1018 78 q 827 -53 936 -6 q 595 -99 717 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 l 595 501 m 740 496 l 1339 496 q 1293 265 1339 374 q 1163 73 1246 155 l 740 496 m 1290 595 l 694 595 l 694 1190 q 993 1111 856 1190 q 1210 894 1130 1031 q 1290 595 1290 757 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1587 0 l 1587 -99 l 0 -99 l 0 1091 l 99 1091 l 99 0 l 1587 0 m 1488 967 l 1488 630 q 1473 607 1488 614 q 1445 613 1458 601 l 1352 707 l 861 216 q 843 208 853 208 q 825 216 833 208 l 645 397 l 322 74 l 174 223 l 627 677 q 645 684 635 684 q 663 677 655 684 l 843 496 l 1203 856 l 1109 949 q 1103 977 1097 962 q 1126 992 1110 992 l 1463 992 q 1481 985 1474 992 q 1488 967 1488 978 z "},"飯�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1001 645 q 1009 613 1001 640 q 1028 575 1017 591 q 1060 548 1040 559 q 1094 533 1080 538 q 1137 520 1108 528 q 1389 263 1389 450 q 1307 75 1389 150 q 1110 0 1225 0 q 1023 14 1064 0 q 953 50 983 29 q 893 107 922 71 q 844 175 863 144 q 803 255 825 206 q 769 335 780 305 q 738 418 757 366 q 711 491 719 470 q 663 595 686 554 q 606 670 640 636 q 525 719 572 704 q 415 735 479 735 q 274 692 341 735 q 167 580 206 649 q 127 436 127 511 q 210 220 127 312 q 414 127 292 127 q 614 201 551 127 q 678 291 657 250 l 743 173 q 709 119 732 146 l 710 118 q 409 0 608 0 q 200 61 295 0 q 53 222 105 122 q 0 435 0 322 q 34 594 0 516 q 124 731 67 673 q 257 825 180 790 q 415 861 334 861 q 539 846 483 861 q 634 808 594 832 q 708 746 674 784 q 764 669 742 708 q 810 578 787 630 q 849 482 832 526 q 887 381 865 437 q 930 282 910 324 q 1111 127 1004 127 q 1218 165 1173 127 q 1263 264 1263 202 q 1248 320 1263 297 q 1209 356 1233 343 q 1152 380 1184 368 q 1087 401 1121 392 q 1019 427 1053 410 q 956 468 985 445 q 906 531 928 491 q 876 626 884 572 q 873 652 873 639 q 941 801 873 737 q 1095 861 1009 864 q 1189 850 1156 859 q 1259 808 1221 841 l 1258 808 q 1276 789 1267 800 q 1296 761 1284 779 q 1311 740 1308 744 l 1211 663 q 1169 718 1190 701 l 1169 718 q 1094 735 1151 735 q 1028 709 1056 735 q 1001 645 1001 684 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1110 375 q 929 560 1110 509 q 887 573 901 568 q 858 593 873 578 q 836 629 842 607 q 834 635 836 630 q 832 644 832 640 q 831 650 831 649 q 850 696 831 678 q 897 715 869 715 q 952 703 939 715 l 951 703 q 981 663 966 691 l 1053 718 q 1015 768 1023 760 q 963 798 990 791 q 897 806 936 806 q 787 761 835 806 q 739 655 739 717 q 740 637 739 649 q 790 529 753 563 q 905 472 828 494 q 943 460 928 466 q 978 443 959 454 q 1008 417 997 432 q 1018 381 1018 401 l 1018 377 q 987 305 1019 332 q 909 277 955 277 q 780 389 834 277 q 740 483 762 426 q 703 581 718 541 q 661 666 687 620 q 603 740 634 712 q 523 787 573 768 q 409 806 474 806 q 260 763 331 806 q 149 648 190 719 q 110 499 108 577 l 110 498 q 149 344 113 415 q 253 230 185 274 q 405 186 320 186 q 621 271 549 186 q 645 311 636 292 l 598 395 q 522 305 566 333 q 408 277 477 277 q 260 345 319 277 q 202 503 202 412 q 265 649 202 584 q 409 715 329 715 q 541 673 496 715 q 622 539 586 632 q 641 486 628 523 q 663 427 655 450 q 688 369 672 405 q 718 312 704 334 q 753 264 732 290 q 796 222 774 237 q 847 196 818 207 q 909 186 877 186 q 1051 240 992 186 q 1110 375 1110 294 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 861 342 q 877 379 861 342 q 893 496 893 415 q 861 650 893 577 q 777 777 830 723 q 650 861 723 830 q 496 893 577 893 q 342 861 415 893 q 215 777 269 830 q 131 650 162 723 q 99 496 99 577 q 131 342 99 415 q 215 215 162 269 q 342 131 269 162 q 496 99 415 99 q 650 131 577 99 q 777 215 723 162 q 861 342 830 269 m 1457 342 q 1472 379 1457 342 q 1488 496 1488 415 q 1457 650 1488 577 q 1372 777 1425 723 q 1245 861 1318 830 q 1091 893 1172 893 l 792 893 q 938 719 884 823 q 992 496 992 615 q 938 273 992 377 q 792 99 884 169 l 1091 99 q 1245 131 1172 99 q 1372 215 1318 162 q 1457 342 1425 269 m 1548 689 q 1568 643 1548 689 q 1587 496 1587 597 q 1548 303 1587 395 q 1442 145 1508 212 q 1284 40 1376 79 q 1091 0 1192 0 l 496 0 q 303 40 395 0 q 145 145 212 79 q 40 303 79 212 q 0 496 0 395 q 40 689 0 597 q 145 847 79 780 q 303 953 212 913 q 496 992 395 992 l 1091 992 q 1284 953 1192 992 q 1442 847 1376 913 q 1548 689 1508 780 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 40 303 q 20 349 40 303 q 0 496 0 395 q 40 689 0 597 q 145 847 79 780 q 303 953 212 913 q 496 992 395 992 l 1091 992 q 1284 953 1192 992 q 1442 847 1376 913 q 1548 689 1508 780 q 1587 496 1587 597 q 1548 303 1587 395 q 1442 145 1508 212 q 1284 40 1376 79 q 1091 0 1192 0 l 496 0 q 303 40 395 0 q 145 145 212 79 q 40 303 79 212 m 937 131 q 974 115 937 131 q 1091 99 1011 99 q 1245 131 1172 99 q 1372 215 1318 162 q 1457 342 1425 269 q 1488 496 1488 415 q 1457 650 1488 577 q 1372 777 1425 723 q 1245 861 1318 830 q 1091 893 1172 893 q 937 861 1011 893 q 811 777 864 830 q 726 650 757 723 q 694 496 694 577 q 726 342 694 415 q 811 215 757 269 q 937 131 864 162 z "},"飯�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 591 298 l 347 298 q 303 325 316 298 q 308 377 289 352 l 453 571 q 347 595 403 595 q 172 522 245 595 q 99 347 99 450 q 172 172 99 245 q 347 99 245 99 q 505 155 436 99 q 591 298 573 212 m 446 397 l 591 397 q 532 512 577 463 l 446 397 m 818 397 l 1042 694 l 670 694 l 593 592 q 691 397 674 512 l 818 397 m 1614 172 q 1650 208 1614 172 q 1687 347 1687 245 q 1614 522 1687 450 q 1438 595 1541 595 q 1345 577 1392 595 l 1480 375 q 1487 337 1491 357 q 1466 306 1483 317 q 1438 298 1455 298 q 1397 320 1411 298 l 1263 522 q 1190 347 1190 448 q 1263 172 1190 245 q 1438 99 1336 99 q 1614 172 1541 99 m 1684 593 q 1735 542 1684 593 q 1786 347 1786 491 q 1684 102 1786 204 q 1438 0 1582 0 q 1193 102 1295 0 q 1091 347 1091 204 q 1122 489 1091 422 q 1207 605 1152 556 l 1156 681 l 883 318 q 843 298 869 298 l 691 298 q 575 85 673 171 q 347 0 477 0 q 102 102 204 0 q 0 347 0 204 q 102 593 0 491 q 347 694 204 694 q 514 652 436 694 l 620 794 l 446 794 q 412 808 426 794 q 397 843 397 823 q 412 878 397 863 q 446 893 426 893 l 744 893 l 744 794 l 1081 794 l 1015 893 l 843 893 q 808 908 823 893 q 794 942 794 922 q 808 977 794 963 q 843 992 823 992 l 1042 992 q 1083 970 1067 992 l 1290 660 q 1438 694 1360 694 q 1684 593 1582 694 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 269 178 q 283 192 269 178 q 298 248 298 207 q 269 318 298 289 q 198 347 239 347 q 128 318 157 347 q 99 248 99 289 q 128 178 99 207 q 198 149 157 149 q 269 178 239 149 m 1062 178 q 1077 192 1062 178 q 1091 248 1091 207 q 1062 318 1091 289 q 992 347 1033 347 q 922 318 951 347 q 893 248 893 289 q 922 178 893 207 q 992 149 951 149 q 1062 178 1033 149 m 1056 555 l 1000 853 q 982 882 996 870 q 951 893 969 893 l 239 893 q 208 882 222 893 q 191 853 195 870 l 135 555 q 146 514 131 532 q 184 496 160 496 l 1007 496 q 1045 514 1030 496 q 1056 555 1059 532 m 870 1003 q 875 1008 870 1003 q 880 1029 880 1014 q 870 1056 880 1045 q 843 1066 859 1066 l 347 1066 q 321 1056 332 1066 q 310 1029 310 1045 q 321 1003 310 1014 q 347 992 332 992 l 843 992 q 870 1003 859 992 m 1190 467 l 1190 0 l 1091 0 l 1091 -99 q 1062 -169 1091 -140 q 992 -198 1033 -198 q 922 -169 951 -198 q 893 -99 893 -140 l 893 0 l 298 0 l 298 -99 q 269 -169 298 -140 q 198 -198 239 -198 q 128 -169 157 -198 q 99 -99 99 -140 l 99 0 l 0 0 l 0 467 q 19 640 0 554 l 99 992 q 175 1098 106 1053 q 353 1167 243 1144 q 595 1190 463 1190 q 837 1167 728 1190 q 1016 1098 947 1144 q 1091 992 1084 1053 l 1173 640 q 1190 467 1190 561 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1115 593 q 1124 583 1115 593 q 1134 546 1134 573 q 1115 499 1134 519 q 1067 479 1095 479 l 523 479 q 476 499 495 479 q 457 546 457 519 q 476 593 457 573 q 523 612 495 612 l 1067 612 q 1115 593 1095 612 m 1300 546 q 1282 677 1300 612 l 521 677 q 474 697 493 677 q 454 743 454 716 q 474 791 454 771 q 521 810 493 810 l 1225 810 q 1042 986 1156 921 q 794 1051 929 1051 q 541 983 657 1051 q 356 799 424 915 q 288 546 288 683 q 306 414 288 479 l 1067 414 q 1115 395 1095 414 q 1134 348 1134 375 q 1115 301 1134 320 q 1067 281 1095 281 l 363 281 q 546 105 432 171 q 794 40 660 40 q 991 80 897 40 q 1152 188 1084 120 q 1259 349 1219 256 q 1300 546 1300 443 m 1587 743 q 1568 697 1587 716 q 1521 677 1549 677 l 1419 677 q 1432 546 1432 612 q 1382 298 1432 416 q 1246 94 1331 180 q 1042 -42 1160 9 q 794 -93 924 -93 q 447 10 604 -93 q 213 281 290 113 l 67 281 q 19 301 39 281 q 0 348 0 320 q 19 395 0 375 q 67 414 39 414 l 169 414 q 156 546 156 480 q 207 793 156 675 q 343 997 257 911 q 546 1134 428 1083 q 794 1184 664 1184 q 1141 1081 984 1184 q 1375 810 1298 978 l 1521 810 q 1568 791 1549 810 q 1587 743 1587 771 z "},"飯�":{"ha":992,"x_min":9,"x_max":984,"o":"m 739 898 l 650 643 l 741 627 q 869 1028 869 977 q 839 1072 869 1072 q 739 898 795 1072 m 507 365 q 532 297 530 303 q 587 349 561 329 q 562 353 578 350 q 532 358 546 356 q 507 365 519 361 m 281 1059 q 404 656 281 984 q 442 663 417 663 q 500 660 453 663 l 406 932 q 311 1102 348 1102 q 288 1089 296 1102 q 281 1059 281 1075 m 219 471 q 259 379 219 443 q 350 260 299 315 q 428 206 401 206 q 448 216 439 206 q 457 237 457 226 q 432 316 457 256 q 407 372 422 341 q 370 441 392 403 q 322 504 348 479 q 274 529 297 529 q 239 508 259 529 q 219 471 219 487 m 97 212 q 116 131 97 180 q 258 -45 162 19 q 477 -109 355 -109 q 773 23 653 -109 q 891 354 891 154 q 890 406 891 388 q 881 454 889 425 q 857 498 873 484 q 693 556 814 536 q 484 577 573 577 q 446 568 455 577 q 436 541 436 564 q 453 494 436 515 q 496 463 470 474 q 556 445 522 453 q 624 436 590 438 q 690 433 658 435 q 744 433 722 432 q 762 433 756 433 q 793 419 780 433 q 808 376 805 404 q 733 334 786 354 q 661 298 686 317 q 577 210 612 263 q 543 104 543 157 q 557 35 543 80 q 571 -33 571 -9 l 569 -42 q 566 -53 566 -51 q 453 115 460 -45 q 421 113 446 113 q 422 97 422 108 q 391 28 422 56 q 318 -1 360 -1 q 189 60 254 -1 q 123 183 123 120 q 149 235 123 209 q 195 176 189 185 q 298 95 255 95 q 319 102 308 95 q 330 118 330 109 q 262 230 330 144 q 172 316 195 316 q 118 282 139 316 q 97 212 97 247 m 9 205 q 41 331 9 283 q 147 399 74 379 q 126 480 126 457 q 173 575 126 528 q 267 622 220 622 q 322 611 290 622 q 195 1050 195 969 q 227 1151 195 1112 q 319 1190 259 1190 q 571 740 421 1190 q 577 722 576 727 q 600 784 582 735 q 634 876 618 833 q 675 975 649 918 q 725 1070 701 1031 q 780 1137 749 1109 q 839 1165 811 1165 q 926 1127 894 1165 q 958 1032 958 1089 q 835 606 958 949 q 913 570 882 594 q 958 510 943 546 q 978 438 973 474 q 984 352 984 401 q 947 135 984 236 q 845 -40 911 34 q 681 -156 779 -113 q 466 -198 584 -198 q 293 -166 380 -198 q 93 -17 177 -122 q 9 205 9 87 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 608 409 l 769 409 q 693 217 758 287 q 526 146 627 146 q 329 236 401 146 q 257 481 257 326 q 329 723 257 632 q 510 814 401 814 q 690 746 625 814 q 765 555 755 679 l 608 555 q 580 632 604 605 q 517 659 556 659 q 448 612 473 659 q 424 474 424 565 q 428 409 424 437 q 442 355 432 381 q 473 315 452 329 q 524 301 494 301 q 608 409 598 301 m 1160 409 l 1320 409 q 1244 217 1309 287 q 1078 146 1179 146 q 881 236 953 146 q 809 481 809 326 q 881 723 809 632 q 1062 814 953 814 q 1242 746 1177 814 q 1317 555 1307 679 l 1159 555 q 1132 632 1156 605 q 1069 659 1108 659 q 1000 612 1025 659 q 976 474 976 565 q 980 409 976 437 q 994 355 984 381 q 1024 315 1004 329 q 1075 301 1045 301 q 1134 331 1113 301 q 1160 409 1156 360 m 1438 501 q 1426 739 1438 662 q 1380 864 1414 817 q 1369 875 1375 870 q 1352 887 1363 880 q 1340 895 1342 894 q 800 944 1273 944 q 250 895 315 944 q 236 886 246 892 q 220 875 226 880 q 208 864 213 870 q 162 741 174 818 q 150 501 150 663 q 162 263 150 340 q 208 139 174 186 q 220 127 213 133 q 236 116 227 122 q 250 107 245 111 q 435 69 284 81 q 800 57 587 57 q 1340 107 1273 57 q 1353 115 1344 110 q 1369 126 1363 121 q 1380 139 1376 132 q 1427 262 1415 185 q 1438 501 1438 339 m 1587 1091 l 1587 -99 l 0 -99 l 0 1091 l 1587 1091 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1066,"o":"m 769 707 l 769 322 q 762 305 769 312 q 744 298 755 298 l 620 298 q 602 305 609 298 q 595 322 595 312 l 595 707 q 533 856 595 794 q 384 918 471 918 l 174 918 l 174 25 q 167 7 174 14 q 149 0 160 0 l 25 0 q 7 7 14 0 q 0 25 0 14 l 0 1066 q 7 1084 0 1077 q 25 1091 14 1091 l 384 1091 q 577 1040 489 1091 q 717 900 666 988 q 769 707 769 811 m 1066 1066 l 1066 384 q 1015 191 1066 280 q 875 52 963 103 q 682 0 787 0 l 322 0 q 305 7 312 0 q 298 25 298 14 l 298 769 q 305 787 298 780 q 322 794 312 794 l 446 794 q 464 787 457 794 q 471 769 471 780 l 471 174 l 682 174 q 831 236 769 174 q 893 384 893 298 l 893 1066 q 900 1084 893 1077 q 918 1091 907 1091 l 1042 1091 q 1059 1084 1053 1091 q 1066 1066 1066 1077 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1016 538 l 1016 450 q 1006 420 1016 431 q 977 409 995 409 l 820 409 q 791 420 801 409 q 780 450 780 431 l 780 538 q 791 567 780 556 q 820 578 801 578 l 977 578 q 1006 567 995 578 q 1016 538 1016 556 m 636 360 l 636 553 q 611 620 636 594 q 545 645 586 645 l 442 645 q 367 605 389 645 q 293 645 346 645 l 192 645 q 126 620 151 645 q 101 553 101 594 l 101 360 q 117 343 101 343 l 160 343 q 177 360 177 343 l 177 538 q 187 567 177 556 q 217 578 198 578 l 290 578 q 319 567 308 578 q 330 538 330 556 l 330 360 q 346 343 330 343 l 388 343 q 405 360 405 343 l 405 538 q 416 567 405 556 q 446 578 427 578 l 521 578 q 550 567 539 578 q 560 538 560 556 l 560 360 q 577 343 560 343 l 620 343 q 636 360 636 343 m 1093 434 l 1093 553 q 1067 620 1093 594 q 1001 645 1042 645 l 796 645 q 729 620 755 645 q 704 553 704 594 l 704 236 q 721 219 704 219 l 763 219 q 780 236 780 219 l 780 375 q 853 343 804 343 l 1001 343 q 1067 368 1042 343 q 1093 434 1093 393 m 1190 911 l 1190 81 q 1138 -47 1190 6 q 1011 -99 1085 -99 l 180 -99 q 53 -47 105 -99 q 0 81 0 6 l 0 911 q 53 1039 0 986 q 180 1091 105 1091 l 1011 1091 q 1138 1039 1085 1091 q 1190 911 1190 986 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 709 349 l 481 349 l 595 776 l 709 349 m 776 99 l 1017 99 l 766 893 l 425 893 l 174 99 l 415 99 l 711 343 l 776 99 m 1190 868 l 1190 124 q 1125 -33 1190 33 q 967 -99 1059 -99 l 223 -99 q 66 -33 132 -99 q 0 124 0 33 l 0 868 q 66 1025 0 960 q 223 1091 132 1091 l 967 1091 q 1125 1025 1059 1091 q 1190 868 1190 960 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1587 497 q 1577 469 1587 481 q 1552 453 1567 457 l 1393 177 q 1395 164 1395 171 q 1385 136 1395 148 q 1360 121 1376 124 l 1211 -140 q 1213 -153 1213 -146 q 1200 -184 1213 -171 q 1169 -197 1187 -197 q 1137 -183 1149 -197 l 827 -183 q 794 -198 814 -198 q 760 -183 773 -198 l 451 -183 q 418 -198 438 -198 q 387 -186 400 -198 q 374 -154 374 -173 q 377 -139 374 -148 l 227 121 q 202 136 212 124 q 192 164 192 148 q 195 177 192 171 l 35 453 q 10 469 19 457 q 0 497 0 481 q 10 525 0 513 q 36 540 21 537 l 191 807 q 190 809 191 808 q 190 811 190 811 q 216 851 190 839 l 378 1132 q 375 1146 375 1140 q 388 1178 375 1165 q 419 1190 401 1190 q 453 1174 439 1190 l 760 1174 q 794 1190 773 1190 q 827 1174 815 1190 l 1135 1174 q 1170 1190 1149 1190 q 1201 1178 1187 1190 q 1214 1146 1214 1165 q 1211 1132 1214 1142 l 1371 855 q 1401 841 1389 854 q 1414 811 1414 829 q 1408 791 1414 801 l 1553 539 q 1578 524 1568 536 q 1587 497 1587 512 m 824 -122 l 1125 -122 l 860 152 l 749 152 l 484 -122 l 763 -122 q 794 -110 777 -110 q 824 -122 810 -110 m 87 507 q 88 497 88 504 q 86 485 88 489 l 247 206 l 259 202 l 405 356 l 405 625 l 260 775 q 237 767 250 769 l 87 507 m 764 1115 l 463 1115 l 611 960 l 1040 1115 l 823 1115 q 794 1102 811 1102 q 764 1115 777 1102 m 1309 175 q 1313 184 1310 180 l 1263 236 l 1250 175 l 1309 175 m 1227 175 l 1244 257 l 1049 463 l 819 225 l 868 175 l 1227 175 m 1159 -110 l 1171 -88 l 1221 152 l 891 152 l 1149 -114 q 1159 -110 1155 -111 m 448 -122 l 452 -122 l 717 152 l 428 152 l 428 -108 l 431 -112 q 448 -122 442 -116 m 428 175 l 739 175 l 789 226 l 550 475 l 428 346 l 428 175 m 278 175 l 405 175 l 405 322 l 274 184 q 278 175 277 178 m 277 815 q 278 813 277 814 q 278 811 278 812 q 272 789 278 799 l 405 652 l 405 860 l 277 815 m 428 869 l 428 628 l 546 506 l 777 749 l 604 932 l 428 869 m 431 1104 l 428 1098 l 428 894 l 587 951 l 439 1107 q 431 1104 434 1105 m 1121 1115 l 1109 1115 l 628 941 l 793 767 l 1121 1115 m 793 733 l 563 489 l 804 242 l 1033 480 l 793 733 m 533 491 l 428 601 l 428 381 l 533 491 m 805 209 l 772 175 l 838 175 l 805 209 m 1065 479 l 1249 284 l 1352 768 l 1349 772 l 1349 773 l 1065 479 m 1332 789 q 1325 811 1325 799 l 1325 813 l 1158 1104 q 1148 1108 1154 1105 l 809 749 l 1049 496 l 1332 789 m 405 885 l 405 1058 l 278 839 l 405 885 m 405 152 l 278 152 l 405 -67 l 405 152 m 1246 152 l 1208 -24 l 1309 152 l 1246 152 m 1340 206 l 1500 486 q 1499 497 1499 494 q 1501 509 1499 498 l 1369 739 l 1269 264 l 1328 201 q 1340 206 1332 203 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1091,"o":"m 0 663 q 71 839 0 765 q 243 913 142 913 l 818 913 l 1091 1190 l 1091 51 q 1020 -125 1091 -51 q 848 -198 949 -198 l 243 -198 q 71 -125 142 -198 q 0 51 0 -51 l 0 663 m 955 79 l 818 219 l 818 548 q 794 609 818 584 q 733 635 769 635 l 358 635 q 298 609 322 635 q 273 548 273 584 l 273 167 q 298 105 273 131 q 358 79 323 79 l 955 79 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 724 1074 q 293 793 478 980 q 16 359 108 606 q 0 495 0 428 q 79 793 0 656 q 295 1010 159 930 q 593 1089 432 1089 q 724 1074 656 1089 m 932 982 q 1059 862 1004 932 q 537 551 758 774 q 229 27 315 329 q 109 153 157 83 q 415 673 196 452 q 932 982 635 894 m 364 -52 q 658 430 453 224 q 1139 728 863 636 q 1180 577 1170 656 q 780 309 954 484 q 515 -92 607 135 q 364 -52 435 -81 m 1190 -97 q 906 -8 1041 -58 q 681 -91 801 -73 q 894 196 766 68 q 1180 410 1022 325 q 1101 190 1163 292 q 1190 -97 1152 54 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1467 887 l 1587 -99 q 1388 -55 1486 -99 q 1084 16 1233 16 q 794 -99 908 16 q 504 16 679 16 q 199 -55 354 16 q 4 -99 100 -99 l 0 -99 l 120 887 q 494 985 294 985 q 794 903 674 985 q 1094 985 913 985 q 1467 887 1294 985 m 1084 122 q 1263 100 1184 122 q 1465 27 1343 78 l 1369 818 q 1084 879 1236 879 q 794 770 910 879 q 504 879 677 879 q 219 818 351 879 l 122 27 q 251 78 204 60 q 366 108 298 95 q 504 122 434 122 q 794 38 660 122 q 1084 122 927 122 m 1115 148 l 1072 851 q 794 731 908 848 q 504 851 676 851 q 243 800 367 851 l 155 71 q 332 129 251 110 q 504 149 413 149 q 794 70 666 149 q 1084 149 927 153 l 1115 148 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1163 128 l 1163 696 q 1151 724 1163 712 q 1124 736 1139 736 l 1052 736 q 1025 724 1036 736 q 1013 696 1013 712 l 1013 128 q 1025 101 1013 112 q 1052 89 1036 89 l 1124 89 q 1151 101 1139 89 q 1163 128 1163 112 m 942 128 l 942 539 q 931 567 942 555 q 904 578 919 578 l 825 578 q 798 567 810 578 q 787 539 787 555 l 787 128 q 798 101 787 112 q 825 89 810 89 l 904 89 q 931 101 919 89 q 942 128 942 112 m 716 128 l 716 460 q 705 488 716 476 q 677 499 693 499 l 599 499 q 572 488 584 499 q 560 460 560 476 l 560 128 q 572 101 560 112 q 599 89 584 89 l 677 89 q 705 101 693 89 q 716 128 716 112 m 490 128 l 490 408 q 478 436 490 424 q 451 447 467 447 l 373 447 q 346 436 357 447 q 334 408 334 424 l 334 128 q 346 101 334 112 q 373 89 357 89 l 451 89 q 478 101 467 89 q 490 128 490 112 m 1587 241 q 1496 21 1587 112 q 1276 -71 1404 -71 l 312 -71 q 91 21 183 -71 q 0 241 0 112 q 49 407 0 331 q 179 522 98 484 q 171 579 171 549 q 234 729 171 667 q 384 791 296 791 q 523 739 463 791 q 674 972 558 881 q 935 1063 789 1063 q 1149 1006 1051 1063 q 1303 851 1246 949 q 1360 638 1360 753 q 1349 543 1360 587 q 1521 433 1454 518 q 1587 241 1587 348 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 0 1190 l 1190 1190 l 1190 112 l 589 -150 l 0 112 l 0 1190 m 1113 162 l 1113 880 l 78 880 l 78 162 l 590 -66 l 1113 162 m 1113 957 l 1113 1113 l 78 1113 l 78 957 l 1113 957 m 140 726 l 140 637 l 112 637 l 112 726 l 140 726 m 140 612 l 140 522 l 112 522 l 112 612 l 140 612 m 140 497 l 140 408 l 112 408 l 112 497 l 140 497 m 140 382 l 140 293 l 112 293 l 112 382 l 140 382 m 140 267 l 140 178 l 112 178 l 112 267 l 140 267 m 160 157 l 172 183 l 253 146 l 242 121 l 160 157 m 266 110 l 277 136 l 359 101 l 347 74 l 266 110 m 370 64 l 382 90 l 463 54 l 452 28 l 370 64 m 476 18 l 488 43 l 568 8 l 556 -19 l 476 18 m 618 8 l 699 43 l 711 18 l 629 -19 l 618 8 m 722 54 l 804 90 l 815 64 l 734 28 l 722 54 m 828 101 l 909 136 l 921 110 l 839 74 l 828 101 m 932 146 l 1014 183 l 1025 157 l 944 121 l 932 146 m 201 1077 l 201 1049 l 112 1049 l 112 1077 l 201 1077 m 326 1077 l 326 1049 l 237 1049 l 237 1077 l 326 1077 m 452 1077 l 452 1049 l 363 1049 l 363 1077 l 452 1077 m 577 1077 l 577 1049 l 488 1049 l 488 1077 l 577 1077 m 702 1077 l 702 1049 l 614 1049 l 614 1077 l 702 1077 m 828 1077 l 828 1049 l 739 1049 l 739 1077 l 828 1077 m 953 1077 l 953 1049 l 864 1049 l 864 1077 l 953 1077 m 1078 1077 l 1078 1049 l 990 1049 l 990 1077 l 1078 1077 m 140 813 l 140 752 l 112 752 l 112 841 l 201 841 l 201 813 l 140 813 m 326 841 l 326 813 l 237 813 l 237 841 l 326 841 m 452 841 l 452 813 l 363 813 l 363 841 l 452 841 m 577 841 l 577 813 l 488 813 l 488 841 l 577 841 m 702 841 l 702 813 l 614 813 l 614 841 l 702 841 m 828 841 l 828 813 l 739 813 l 739 841 l 828 841 m 953 841 l 953 813 l 864 813 l 864 841 l 953 841 m 1050 752 l 1050 813 l 990 813 l 990 841 l 1079 841 l 1079 752 l 1050 752 m 1050 637 l 1050 726 l 1079 726 l 1079 637 l 1050 637 m 1050 522 l 1050 612 l 1079 612 l 1079 522 l 1050 522 m 1050 408 l 1050 497 l 1079 497 l 1079 408 l 1050 408 m 1050 293 l 1050 382 l 1079 382 l 1079 293 l 1050 293 m 1050 178 l 1050 267 l 1079 267 l 1079 178 l 1050 178 m 589 205 q 418 276 489 205 q 346 448 346 347 q 418 619 346 548 q 589 691 489 691 q 761 619 690 691 q 832 448 832 548 q 761 276 832 347 q 589 205 690 205 m 461 501 q 476 457 461 473 q 515 438 491 441 q 564 432 538 434 q 614 431 591 430 q 652 424 637 431 q 667 400 667 416 q 581 362 667 362 q 485 401 505 362 l 483 401 l 459 353 q 584 320 511 320 q 628 324 607 320 q 671 336 649 328 q 706 362 693 345 q 720 403 720 379 q 699 457 720 439 q 646 478 677 475 q 585 480 615 481 q 533 484 554 480 q 512 504 512 488 q 527 529 512 520 q 559 541 543 539 q 591 543 574 543 q 645 535 617 543 q 685 508 674 526 l 687 508 l 711 553 q 694 560 708 554 q 677 567 680 566 q 662 572 674 568 q 645 578 650 577 q 629 581 639 579 q 611 584 619 584 q 593 585 602 585 q 549 581 570 585 q 507 568 528 577 q 474 542 487 560 q 461 501 461 525 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 607 243 q 638 273 607 243 q 669 391 669 304 q 607 539 669 477 q 459 601 546 601 q 311 539 372 601 q 250 391 250 477 q 311 243 250 304 q 459 181 372 181 q 607 243 546 181 m 1277 243 q 1307 274 1277 243 q 1338 391 1338 305 q 1277 539 1338 478 q 1128 601 1215 601 q 980 539 1042 601 q 918 391 918 478 q 980 243 918 304 q 1128 181 1042 181 q 1277 243 1215 181 m 1587 1018 l 1587 -26 q 1563 -85 1587 -60 q 1504 -109 1538 -109 l 84 -109 q 24 -85 49 -109 q 0 -26 0 -60 l 0 1018 q 24 1077 0 1053 q 84 1101 49 1101 l 418 1101 q 477 1077 452 1101 q 501 1018 501 1053 l 501 894 l 1086 894 l 1086 1018 q 1111 1077 1086 1053 q 1170 1101 1135 1101 l 1504 1101 q 1563 1077 1538 1101 q 1587 1018 1587 1053 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1108 739 m 1310 581 q 1506 504 1425 581 q 1587 315 1587 428 q 1503 112 1587 193 q 1296 31 1418 31 q 1170 52 1230 31 q 1063 109 1111 74 q 972 191 1016 145 q 887 289 928 238 q 807 392 847 340 q 723 490 767 443 q 632 572 679 536 q 527 629 586 608 q 404 650 468 650 q 209 579 284 650 q 133 390 133 508 q 214 196 133 268 q 418 124 295 124 q 579 153 495 124 q 729 229 663 182 q 745 244 732 233 q 768 262 757 255 q 785 270 779 270 q 804 262 796 270 q 812 243 812 253 q 766 183 812 224 q 584 73 687 115 q 382 31 481 31 q 192 76 279 31 q 52 204 105 121 q 0 391 0 287 q 110 655 0 550 q 379 760 219 760 q 555 727 472 760 q 698 639 637 693 q 816 520 760 585 q 923 391 872 456 q 1027 272 975 326 q 1143 184 1079 218 q 1277 150 1207 150 q 1407 198 1356 150 q 1459 324 1459 246 q 1409 447 1459 398 q 1285 497 1359 497 q 1222 482 1262 497 q 1169 468 1182 468 q 1141 480 1153 468 q 1129 507 1129 491 q 1136 551 1129 521 q 1142 597 1142 581 q 1059 801 1142 720 q 853 881 976 881 q 766 867 808 881 q 701 836 725 853 q 658 804 677 818 q 632 790 639 790 q 613 798 621 790 q 605 818 605 806 q 624 853 605 832 q 738 934 670 905 q 879 962 806 962 q 1125 865 1027 962 q 1224 620 1224 767 q 1221 569 1224 591 q 1310 581 1265 581 z "},"飯�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 928 610 q 935 617 928 610 q 942 645 942 625 q 928 680 942 665 q 893 694 913 694 l 794 694 l 794 794 q 779 829 794 814 q 744 843 764 843 q 709 829 724 843 q 694 794 694 814 l 694 694 l 595 694 q 560 680 575 694 q 546 645 546 665 q 560 610 546 625 q 595 595 575 595 l 694 595 l 694 496 q 709 461 694 476 q 744 446 724 446 q 779 461 764 446 q 794 496 794 476 l 794 595 l 893 595 q 928 610 913 595 m 467 70 q 481 56 467 70 q 496 0 496 41 q 467 -70 496 -41 q 397 -99 438 -99 q 327 -70 356 -99 q 298 0 298 -41 q 327 70 298 41 q 397 99 356 99 q 467 70 438 99 m 1161 70 q 1176 56 1161 70 q 1190 0 1190 41 q 1161 -70 1190 -41 q 1091 -99 1132 -99 q 1021 -70 1050 -99 q 992 0 992 -41 q 1021 70 992 41 q 1091 99 1050 99 q 1161 70 1132 99 m 1290 843 l 1290 446 q 1277 413 1290 428 q 1246 397 1265 399 l 436 302 q 440 286 437 297 q 444 265 443 274 q 446 248 446 256 q 428 198 446 236 l 1141 198 q 1176 184 1161 198 q 1190 149 1190 169 q 1176 114 1190 129 q 1141 99 1161 99 l 347 99 q 312 114 327 99 q 298 149 298 129 q 306 179 298 160 q 329 226 315 199 q 345 255 343 252 l 208 893 l 50 893 q 15 908 29 893 q 0 942 0 922 q 15 977 0 963 q 50 992 29 992 l 248 992 q 270 987 260 992 q 286 975 280 982 q 296 956 291 968 q 301 935 300 944 q 306 913 303 927 q 309 893 308 898 l 1240 893 q 1275 878 1260 893 q 1290 843 1290 863 z "},"飯�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 977 610 q 992 645 992 625 q 977 680 992 665 q 942 694 963 694 q 908 680 922 694 l 794 567 l 794 794 q 779 829 794 814 q 744 843 764 843 q 709 829 724 843 q 694 794 694 814 l 694 567 l 581 680 q 546 694 566 694 q 511 680 525 694 q 496 645 496 665 q 511 610 496 625 l 709 412 q 744 397 724 397 q 779 412 764 397 l 977 610 m 467 70 q 481 56 467 70 q 496 0 496 41 q 467 -70 496 -41 q 397 -99 438 -99 q 327 -70 356 -99 q 298 0 298 -41 q 327 70 298 41 q 397 99 356 99 q 467 70 438 99 m 1161 70 q 1176 56 1161 70 q 1190 0 1190 41 q 1161 -70 1190 -41 q 1091 -99 1132 -99 q 1021 -70 1050 -99 q 992 0 992 -41 q 1021 70 992 41 q 1091 99 1050 99 q 1161 70 1132 99 m 1290 843 l 1290 446 q 1277 413 1290 428 q 1246 397 1265 399 l 436 302 q 440 286 437 297 q 444 265 443 274 q 446 248 446 256 q 428 198 446 236 l 1141 198 q 1176 184 1161 198 q 1190 149 1190 169 q 1176 114 1190 129 q 1141 99 1161 99 l 347 99 q 312 114 327 99 q 298 149 298 129 q 306 179 298 160 q 329 226 315 199 q 345 255 343 252 l 208 893 l 50 893 q 15 908 29 893 q 0 942 0 922 q 15 977 0 963 q 50 992 29 992 l 248 992 q 270 987 260 992 q 286 975 280 982 q 296 956 291 968 q 301 935 300 944 q 306 913 303 927 q 309 893 308 898 l 1240 893 q 1275 878 1260 893 q 1290 843 1290 863 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 164 595 l 647 80 l 415 595 l 164 595 m 794 -3 l 1064 595 l 523 595 l 794 -3 m 417 694 l 575 992 l 372 992 l 149 694 l 417 694 m 940 80 l 1423 595 l 1173 595 l 940 80 m 529 694 l 1058 694 l 900 992 l 687 992 l 529 694 m 1170 694 l 1438 694 l 1215 992 l 1012 992 l 1170 694 m 1280 1071 l 1577 674 q 1587 642 1588 660 q 1574 611 1587 624 l 830 -183 q 794 -198 816 -198 q 757 -183 771 -198 l 13 611 q 0 642 1 624 q 10 674 -1 660 l 308 1071 q 347 1091 322 1091 l 1240 1091 q 1280 1071 1266 1091 z "},"飯�":{"ha":1587,"x_min":15,"x_max":1573,"o":"m 1404 -15 q 1438 0 1418 0 q 1473 -15 1459 0 l 1573 -114 l 1503 -184 l 1438 -119 l 1374 -184 q 1339 -198 1360 -198 q 1304 -184 1318 -198 l 1240 -119 l 1176 -184 q 1141 -198 1161 -198 q 1106 -184 1121 -198 l 1042 -119 l 977 -184 q 942 -198 963 -198 q 908 -184 922 -198 l 843 -119 l 779 -184 q 744 -198 764 -198 q 709 -184 724 -198 l 645 -119 l 581 -184 q 546 -198 566 -198 q 511 -184 525 -198 l 446 -119 l 382 -184 q 347 -198 367 -198 q 312 -184 327 -198 l 248 -119 l 184 -184 q 149 -198 169 -198 q 114 -184 129 -198 l 15 -84 l 84 -15 l 149 -79 l 213 -15 q 248 0 228 0 q 283 -15 268 0 l 347 -79 l 412 -15 q 446 0 426 0 q 481 -15 467 0 l 546 -79 l 610 -15 q 645 0 625 0 q 680 -15 665 0 l 744 -79 l 808 -15 q 843 0 823 0 q 878 -15 863 0 l 942 -79 l 1007 -15 q 1042 0 1022 0 q 1077 -15 1062 0 l 1141 -79 l 1205 -15 q 1240 0 1220 0 q 1275 -15 1260 0 l 1339 -79 l 1404 -15 m 184 15 q 149 0 169 0 q 114 15 129 0 l 15 114 l 84 184 l 149 120 l 213 184 q 248 198 228 198 q 283 184 268 198 l 347 120 l 397 170 l 397 397 l 234 640 q 229 684 221 660 q 260 715 236 708 l 397 760 l 397 992 l 496 992 l 496 1091 l 694 1091 l 694 1190 l 893 1190 l 893 1091 l 1091 1091 l 1091 992 l 1190 992 l 1190 760 l 1328 715 q 1359 684 1351 708 q 1353 640 1366 660 l 1190 397 l 1190 170 l 1205 184 q 1240 198 1220 198 q 1275 184 1260 198 l 1339 120 l 1404 184 q 1438 198 1418 198 q 1473 184 1459 198 l 1573 84 l 1503 15 l 1438 79 l 1374 15 q 1339 0 1360 0 q 1304 15 1318 0 l 1240 79 l 1176 15 q 1141 0 1161 0 q 1106 15 1121 0 l 1042 79 l 977 15 q 942 0 963 0 q 908 15 922 0 l 843 79 l 779 15 q 744 0 764 0 q 709 15 724 0 l 645 79 l 581 15 q 546 0 566 0 q 511 15 525 0 l 446 79 l 382 15 q 347 0 367 0 q 312 15 327 0 l 248 79 l 184 15 m 496 893 l 496 794 l 794 893 l 1091 794 l 1091 893 l 992 893 l 992 992 l 595 992 l 595 893 l 496 893 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1091,"o":"m 446 0 l 521 347 l 446 446 l 347 496 l 446 0 m 645 0 l 744 496 l 645 446 l 570 347 l 645 0 m 769 783 q 766 787 767 786 q 691 794 758 794 q 562 779 637 794 q 546 777 556 777 q 529 779 535 777 q 400 794 454 794 q 326 787 333 794 q 322 783 324 786 q 326 762 324 769 q 331 757 327 760 q 337 749 336 754 q 343 733 339 746 q 348 717 347 720 q 354 704 350 714 q 361 691 359 694 q 368 680 363 687 q 377 669 373 672 q 388 662 381 667 q 401 656 395 657 q 417 653 408 654 q 436 651 426 651 q 482 661 464 651 q 507 684 500 670 q 519 711 515 698 q 527 734 522 724 q 541 743 532 743 l 550 743 q 564 734 559 743 q 573 711 569 724 q 584 684 577 698 q 609 661 591 670 q 655 651 627 651 q 674 653 665 651 q 690 656 683 654 q 703 662 697 657 q 714 669 710 667 q 724 680 718 672 q 730 691 729 687 q 737 704 732 694 q 743 717 742 714 q 748 733 744 720 q 754 749 753 746 q 760 757 756 754 q 766 762 764 760 q 769 783 767 769 m 1091 102 q 1035 -46 1091 8 q 884 -99 978 -99 l 207 -99 q 57 -46 113 -99 q 0 102 0 8 q 3 193 0 149 q 18 290 7 237 q 47 386 29 343 q 96 466 65 429 q 169 524 128 504 l 99 694 l 265 694 q 248 794 248 744 q 250 818 248 803 q 99 893 99 849 q 262 970 99 937 q 302 1073 275 1018 q 357 1162 329 1129 q 415 1190 381 1190 q 481 1166 439 1190 q 546 1142 522 1142 q 611 1166 569 1142 q 676 1190 653 1190 q 735 1162 710 1190 q 789 1073 763 1129 q 829 970 816 1018 q 992 893 992 937 q 842 818 992 849 q 826 694 847 756 l 992 694 l 929 520 q 1012 445 977 494 q 1063 334 1046 396 q 1085 217 1079 272 q 1091 102 1091 161 z "},"飯�":{"ha":1786,"x_min":0,"x_max":1783,"o":"m 1783 388 q 1766 234 1793 308 q 1690 107 1740 160 q 1567 25 1639 54 q 1414 1 1494 -5 q 1198 98 1290 9 q 1094 310 1106 186 q 1115 473 1084 396 q 1207 605 1146 550 l 1152 688 q 1035 538 1077 626 q 992 349 992 450 q 978 313 992 328 q 942 298 963 298 l 744 298 l 691 298 q 575 85 673 171 q 347 0 477 0 q 102 102 204 0 q 0 347 0 204 q 102 593 0 491 q 347 694 204 694 q 465 674 406 694 l 484 708 q 248 794 388 794 l 198 794 q 164 808 178 794 q 149 843 149 823 q 164 878 149 863 q 198 893 178 893 l 298 893 q 410 882 358 893 q 500 853 462 872 q 556 822 539 833 q 595 794 573 811 l 992 794 l 1081 794 l 1015 893 l 843 893 q 805 910 820 893 q 794 951 791 928 q 812 980 798 969 q 846 992 827 992 l 1042 992 q 1083 970 1067 992 l 1137 889 l 1225 977 q 1261 992 1240 992 l 1339 992 q 1374 977 1359 992 q 1389 942 1389 963 l 1389 843 q 1374 808 1389 823 q 1339 794 1359 794 l 1201 794 l 1290 660 q 1503 688 1391 709 q 1692 584 1614 668 q 1783 388 1770 500 m 347 99 q 505 155 436 99 q 591 298 573 212 l 347 298 q 305 322 320 298 q 304 370 291 346 l 418 585 q 347 595 381 595 q 172 522 245 595 q 99 347 99 450 q 172 172 99 245 q 347 99 245 99 m 1263 172 q 1300 136 1263 172 q 1438 99 1336 99 q 1614 172 1541 99 q 1687 347 1687 245 q 1614 522 1687 450 q 1438 595 1541 595 q 1345 577 1392 595 l 1480 375 q 1487 337 1491 357 q 1466 306 1483 317 q 1438 298 1455 298 q 1397 320 1411 298 l 1263 522 q 1190 347 1190 448 q 1263 172 1190 245 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1091,"o":"m 1091 0 q 1044 -88 1091 -49 q 916 -151 996 -127 q 742 -186 837 -174 q 546 -198 647 -198 q 349 -186 444 -198 q 175 -151 254 -174 q 48 -88 95 -127 q 0 0 0 -49 q 26 69 0 38 q 96 120 51 99 q 188 155 141 141 q 289 177 234 168 q 326 169 309 181 q 346 137 343 157 q 338 100 350 117 q 306 80 326 83 q 224 62 261 72 q 165 42 187 51 q 127 24 143 33 q 106 9 112 15 q 99 -1 100 2 q 120 -21 102 -9 q 177 -47 139 -33 q 265 -72 215 -60 q 389 -91 315 -84 q 546 -99 463 -99 q 702 -91 628 -99 q 826 -72 776 -84 q 915 -47 877 -60 q 971 -21 953 -33 q 992 1 990 -9 q 985 9 991 4 q 964 24 980 15 q 927 42 949 33 q 867 62 904 51 q 785 80 830 72 q 753 100 765 83 q 745 137 741 117 q 765 169 748 157 q 802 177 782 181 q 904 155 857 168 q 995 120 950 141 q 1066 69 1040 99 q 1091 0 1091 38 m 794 694 l 794 397 q 779 362 794 377 q 744 347 764 347 l 694 347 l 694 50 q 680 15 694 29 q 645 0 665 0 l 446 0 q 412 15 426 0 q 397 50 397 29 l 397 347 l 347 347 q 312 362 327 347 q 298 397 298 377 l 298 694 q 327 765 298 736 q 397 794 356 794 l 694 794 q 765 765 736 794 q 794 694 794 736 m 668 1115 q 694 1090 668 1115 q 719 992 719 1064 q 668 869 719 920 q 546 818 618 818 q 423 869 474 818 q 372 992 372 920 q 423 1115 372 1064 q 546 1166 474 1166 q 668 1115 618 1166 z "},"飯�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 992 397 l 1228 397 q 1221 389 1225 392 q 1214 383 1217 385 l 1211 380 l 729 -85 q 694 -99 715 -99 q 660 -85 674 -99 l 177 381 q 160 397 173 383 l 446 397 q 477 407 463 397 q 494 434 491 418 l 549 652 l 696 135 q 714 109 701 119 q 744 99 727 99 q 773 109 760 99 q 791 135 787 119 l 904 511 l 948 424 q 992 397 962 397 m 1389 729 q 1309 496 1389 616 l 1023 496 l 937 667 q 917 688 931 680 q 889 694 904 696 q 846 659 854 691 l 746 326 l 594 857 q 575 883 589 873 q 545 893 562 893 q 515 882 528 893 q 498 856 501 872 l 408 496 l 80 496 q 0 729 0 616 q 98 995 0 899 q 370 1091 197 1091 q 469 1075 419 1091 q 562 1030 519 1058 q 636 977 605 1001 q 694 924 667 952 q 753 977 722 952 q 827 1030 784 1001 q 920 1075 870 1058 q 1018 1091 970 1091 q 1290 995 1192 1091 q 1389 729 1389 899 z "},"飯�":{"ha":992,"x_min":2,"x_max":893,"o":"m 893 744 q 779 446 893 573 q 496 301 664 319 l 496 99 l 670 99 q 687 92 680 99 q 694 74 694 85 l 694 25 q 687 7 694 14 q 670 0 680 0 l 496 0 l 496 -174 q 489 -191 496 -184 q 471 -198 482 -198 l 422 -198 q 404 -191 411 -198 q 397 -174 397 -184 l 397 0 l 223 0 q 205 7 212 0 q 198 25 198 14 l 198 74 q 205 92 198 85 q 223 99 212 99 l 397 99 l 397 301 q 186 381 281 313 q 42 554 92 448 q 2 780 -8 660 q 64 973 10 884 q 205 1119 118 1063 q 395 1187 292 1176 q 643 1146 527 1202 q 825 981 758 1089 q 893 744 893 873 m 201 989 q 150 938 201 989 q 99 744 99 887 q 201 499 99 601 q 446 397 303 397 q 692 499 590 397 q 794 744 794 601 q 692 989 794 887 q 446 1091 590 1091 q 201 989 303 1091 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 l 1190 719 q 1184 701 1190 708 q 1166 694 1177 694 l 1116 694 q 1098 701 1105 694 q 1091 719 1091 708 l 1091 922 l 795 625 q 893 347 893 505 q 858 174 893 257 q 762 31 822 91 q 620 -64 702 -29 q 446 -99 537 -99 q 273 -64 356 -99 q 131 31 191 -29 q 35 174 71 91 q 0 347 0 257 q 35 520 0 438 q 131 663 71 603 q 273 758 191 723 q 446 794 356 794 q 725 696 604 794 l 1021 992 l 818 992 q 801 999 808 992 q 794 1017 794 1006 l 794 1066 q 801 1084 794 1077 q 818 1091 808 1091 l 1141 1091 m 201 102 q 252 51 201 102 q 446 0 303 0 q 692 102 590 0 q 794 347 794 204 q 692 593 794 491 q 446 694 590 694 q 201 593 303 694 q 99 347 99 491 q 201 102 99 204 z "},"飯�":{"ha":992,"x_min":0,"x_max":893,"o":"m 643 946 q 824 782 756 890 q 893 546 893 675 q 779 248 893 374 q 496 102 664 121 l 496 0 l 570 0 q 588 -7 581 0 q 595 -25 595 -14 l 595 -74 q 588 -92 595 -85 q 570 -99 581 -99 l 496 -99 l 496 -174 q 489 -191 496 -184 q 471 -198 482 -198 l 422 -198 q 404 -191 411 -198 q 397 -174 397 -184 l 397 -99 l 322 -99 q 305 -92 312 -99 q 298 -74 298 -85 l 298 -25 q 305 -7 298 -14 q 322 0 312 0 l 397 0 l 397 102 q 114 248 229 121 q 0 546 0 374 q 69 782 0 675 q 250 946 137 890 q 73 1157 122 1020 q 76 1180 68 1170 q 96 1190 83 1190 l 150 1190 q 172 1175 166 1190 q 281 1042 206 1093 q 446 992 355 992 q 612 1042 538 992 q 721 1175 687 1093 q 749 1190 727 1190 l 797 1190 q 817 1180 810 1190 q 820 1157 825 1170 q 643 946 771 1020 m 201 300 q 252 249 201 300 q 446 198 303 198 q 692 300 590 198 q 794 546 794 402 q 692 791 794 689 q 446 893 590 893 q 201 791 303 893 q 99 546 99 689 q 201 300 99 402 z "},"飯�":{"ha":1190,"x_min":2,"x_max":1091,"o":"m 794 1166 q 801 1184 794 1177 q 818 1190 808 1190 l 1042 1190 q 1077 1176 1062 1190 q 1091 1141 1091 1161 l 1091 918 q 1084 900 1091 907 q 1066 893 1077 893 l 1017 893 q 999 900 1006 893 q 992 918 992 907 l 992 1022 l 795 824 q 893 546 893 701 q 779 248 893 374 q 496 102 664 121 l 496 0 l 570 0 q 588 -7 581 0 q 595 -25 595 -14 l 595 -74 q 588 -92 595 -85 q 570 -99 581 -99 l 496 -99 l 496 -174 q 489 -191 496 -184 q 471 -198 482 -198 l 422 -198 q 404 -191 411 -198 q 397 -174 397 -184 l 397 -99 l 322 -99 q 305 -92 312 -99 q 298 -74 298 -85 l 298 -25 q 305 -7 298 -14 q 322 0 312 0 l 397 0 l 397 102 q 187 182 281 115 q 43 355 93 250 q 2 581 -8 461 q 126 855 14 739 q 395 989 237 971 q 571 974 486 1000 q 725 894 656 949 l 922 1091 l 818 1091 q 801 1098 808 1091 q 794 1116 794 1105 l 794 1166 m 201 300 q 252 249 201 300 q 446 198 303 198 q 692 300 590 198 q 794 546 794 402 q 692 791 794 689 q 446 893 590 893 q 201 791 303 893 q 99 546 99 689 q 201 300 99 402 z "},"飯�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 992 1166 q 999 1184 992 1177 q 1017 1190 1006 1190 l 1240 1190 q 1275 1176 1260 1190 q 1290 1141 1290 1161 l 1290 918 q 1283 900 1290 907 q 1265 893 1276 893 l 1215 893 q 1197 900 1204 893 q 1190 918 1190 907 l 1190 1022 l 994 824 q 1091 546 1091 701 q 977 248 1091 374 q 694 102 863 121 l 694 0 l 769 0 q 787 -7 780 0 q 794 -25 794 -14 l 794 -74 q 787 -92 794 -85 q 769 -99 780 -99 l 694 -99 l 694 -174 q 687 -191 694 -184 q 670 -198 680 -198 l 620 -198 q 602 -191 609 -198 q 595 -174 595 -184 l 595 -99 l 521 -99 q 503 -92 510 -99 q 496 -74 496 -85 l 496 -25 q 503 -7 496 -14 q 521 0 510 0 l 595 0 l 595 102 q 313 248 427 121 q 198 546 198 374 q 296 824 198 701 l 256 865 l 177 779 q 160 771 171 771 q 143 777 150 770 l 105 811 q 97 827 98 817 q 104 846 97 838 l 185 935 l 99 1022 l 99 918 q 92 900 99 907 q 74 893 85 893 l 25 893 q 7 900 14 893 q 0 918 0 907 l 0 1141 q 15 1176 0 1161 q 50 1190 29 1190 l 273 1190 q 291 1184 284 1190 q 298 1166 298 1177 l 298 1116 q 291 1098 298 1105 q 273 1091 284 1091 l 170 1091 l 252 1008 l 319 1081 q 336 1089 326 1089 q 353 1084 346 1090 l 391 1049 q 399 1033 398 1043 q 392 1015 399 1022 l 322 938 l 367 894 q 645 992 489 992 q 923 894 801 992 l 1121 1091 l 1017 1091 q 999 1098 1006 1091 q 992 1116 992 1105 l 992 1166 m 400 300 q 450 249 400 300 q 645 198 501 198 q 890 300 788 198 q 992 546 992 402 q 890 791 992 689 q 645 893 788 893 q 400 791 501 893 q 298 546 298 689 q 400 300 298 402 z "},"飯�":{"ha":1389,"x_min":2,"x_max":1387,"o":"m 1387 780 q 1347 554 1397 660 q 1202 381 1297 448 q 992 301 1108 313 l 992 99 l 1166 99 q 1184 92 1177 99 q 1190 74 1190 85 l 1190 25 q 1184 7 1190 14 q 1166 0 1177 0 l 992 0 l 992 -174 q 985 -191 992 -184 q 967 -198 978 -198 l 918 -198 q 900 -191 907 -198 q 893 -174 893 -184 l 893 0 l 496 0 l 496 -174 q 489 -191 496 -184 q 471 -198 482 -198 l 422 -198 q 404 -191 411 -198 q 397 -174 397 -184 l 397 0 l 223 0 q 205 7 212 0 q 198 25 198 14 l 198 74 q 205 92 198 85 q 223 99 212 99 l 397 99 l 397 301 q 186 381 281 313 q 42 554 92 448 q 2 780 -8 660 q 129 1057 15 940 q 402 1188 243 1173 q 694 1115 562 1204 q 987 1188 827 1204 q 1260 1057 1146 1173 q 1387 780 1374 940 m 694 501 q 794 744 794 603 q 694 987 794 885 q 595 744 595 885 q 694 501 595 603 m 446 397 q 615 441 536 397 q 496 744 496 569 q 615 1047 496 918 q 446 1091 536 1091 q 201 989 303 1091 q 99 744 99 887 q 201 499 99 601 q 446 397 303 397 m 893 99 l 893 301 q 694 374 787 312 q 496 301 602 312 l 496 99 l 893 99 m 942 397 q 1188 499 1086 397 q 1290 744 1290 601 q 1188 989 1290 887 q 942 1091 1086 1091 q 773 1047 853 1091 q 893 744 893 918 q 773 441 893 569 q 942 397 853 397 z "},"飯�":{"ha":1488,"x_min":1,"x_max":1488,"o":"m 1190 868 q 1197 886 1190 879 q 1215 893 1204 893 l 1438 893 q 1473 878 1459 893 q 1488 843 1488 863 l 1488 620 q 1481 602 1488 609 q 1463 595 1474 595 l 1414 595 q 1396 602 1403 595 q 1389 620 1389 609 l 1389 724 l 1192 526 q 1275 360 1251 453 q 1283 169 1300 268 q 1154 -73 1259 28 q 908 -194 1049 -174 q 610 -132 745 -216 q 422 101 474 -47 q 251 145 332 105 q 114 248 171 185 q 26 398 57 312 q 1 576 -5 484 q 61 771 8 680 q 202 920 115 862 q 395 989 290 977 q 571 974 486 1000 q 725 894 656 949 l 922 1091 l 818 1091 q 801 1098 808 1091 q 794 1116 794 1105 l 794 1166 q 801 1184 794 1177 q 818 1190 808 1190 l 1042 1190 q 1077 1176 1062 1190 q 1091 1141 1091 1161 l 1091 918 q 1084 900 1091 907 q 1066 893 1077 893 l 1017 893 q 999 900 1006 893 q 992 918 992 907 l 992 1022 l 795 824 q 867 693 841 767 q 1121 597 1008 686 l 1319 794 l 1215 794 q 1197 801 1204 794 q 1190 818 1190 808 l 1190 868 m 794 546 q 791 591 794 561 q 581 474 665 571 q 496 248 496 377 q 499 203 496 233 q 709 319 625 222 q 794 546 794 416 m 99 546 q 185 318 99 415 q 399 202 271 220 q 397 248 397 225 q 501 534 397 411 q 763 687 606 658 q 637 836 722 780 q 446 893 551 893 q 201 791 303 893 q 99 546 99 689 m 843 -99 q 1089 3 987 -99 q 1190 248 1190 105 q 1104 476 1190 378 q 891 591 1018 574 q 893 546 893 570 q 788 259 893 383 q 526 107 684 136 q 653 -43 567 14 q 843 -99 739 -99 z "},"飯�":{"ha":1587,"x_min":5,"x_max":1587,"o":"m 1290 1166 q 1297 1184 1290 1177 q 1314 1190 1304 1190 l 1538 1190 q 1573 1176 1558 1190 q 1587 1141 1587 1161 l 1587 918 q 1580 900 1587 907 q 1563 893 1573 893 l 1513 893 q 1495 900 1502 893 q 1488 918 1488 907 l 1488 1022 l 1291 824 q 1375 658 1350 750 q 1382 467 1399 566 q 1254 226 1357 327 q 1011 105 1152 126 q 694 174 839 78 q 496 102 604 114 l 496 0 l 570 0 q 588 -7 581 0 q 595 -25 595 -14 l 595 -74 q 588 -92 595 -85 q 570 -99 581 -99 l 496 -99 l 496 -174 q 489 -191 496 -184 q 471 -198 482 -198 l 422 -198 q 404 -191 411 -198 q 397 -174 397 -184 l 397 -99 l 322 -99 q 305 -92 312 -99 q 298 -74 298 -85 l 298 -25 q 305 -7 298 -14 q 322 0 312 0 l 397 0 l 397 102 q 180 187 277 115 q 35 371 84 259 q 5 609 -13 484 q 128 859 24 754 q 377 987 233 964 q 694 917 550 1013 q 942 992 808 992 q 1221 894 1098 992 l 1418 1091 l 1314 1091 q 1297 1098 1304 1091 q 1290 1116 1290 1105 l 1290 1166 m 694 303 q 794 546 794 405 q 694 788 794 687 q 595 546 595 687 q 694 303 595 405 m 201 791 q 150 740 201 791 q 99 546 99 689 q 201 300 99 402 q 446 198 303 198 q 615 243 537 198 q 496 546 496 372 q 615 849 496 719 q 446 893 537 893 q 201 791 303 893 m 942 198 q 1188 300 1086 198 q 1290 546 1290 402 q 1188 791 1290 689 q 942 893 1086 893 q 773 849 852 893 q 893 546 893 719 q 773 243 893 372 q 942 198 852 198 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1141 1091 q 1176 1077 1161 1091 q 1190 1042 1190 1062 l 1190 719 q 1184 701 1190 708 q 1166 694 1177 694 l 1116 694 q 1098 701 1105 694 q 1091 719 1091 708 l 1091 922 l 926 756 l 1035 648 q 1042 630 1042 640 q 1035 613 1042 620 l 999 577 q 982 570 992 570 q 964 577 972 570 l 856 687 l 795 625 q 893 347 893 505 q 858 174 893 257 q 762 31 822 91 q 620 -64 702 -29 q 446 -99 537 -99 q 273 -64 356 -99 q 131 31 191 -29 q 35 174 71 91 q 0 347 0 257 q 35 520 0 438 q 131 663 71 603 q 273 758 191 723 q 446 794 356 794 q 725 696 604 794 l 785 756 l 652 890 q 645 908 645 898 q 652 925 645 918 l 687 960 q 705 967 694 967 q 722 960 715 967 l 856 827 l 1021 992 l 818 992 q 801 999 808 992 q 794 1017 794 1006 l 794 1066 q 801 1084 794 1077 q 818 1091 808 1091 l 1141 1091 m 201 102 q 252 51 201 102 q 446 0 303 0 q 692 102 590 0 q 794 347 794 204 q 692 593 794 491 q 446 694 590 694 q 201 593 303 694 q 99 347 99 491 q 201 102 99 204 z "},"飯�":{"ha":992,"x_min":2,"x_max":893,"o":"m 496 691 q 779 546 664 673 q 893 248 893 419 q 825 11 893 119 q 643 -153 758 -97 q 395 -195 527 -210 q 205 -127 292 -184 q 64 19 118 -71 q 2 212 10 108 q 42 438 -8 332 q 186 612 92 544 q 397 691 281 679 l 397 794 l 273 794 q 255 801 262 794 q 248 818 248 808 l 248 868 q 255 886 248 879 q 273 893 262 893 l 397 893 l 397 1021 l 326 949 q 308 942 318 942 q 291 949 298 942 l 255 985 q 248 1002 248 992 q 255 1020 248 1012 l 412 1176 q 446 1190 426 1190 q 481 1176 467 1190 l 638 1020 q 645 1002 645 1012 q 638 985 645 992 l 602 949 q 585 942 595 942 q 567 949 575 942 l 496 1021 l 496 893 l 620 893 q 638 886 631 893 q 645 868 645 879 l 645 818 q 638 801 645 808 q 620 794 631 794 l 496 794 l 496 691 m 201 3 q 252 -48 201 3 q 446 -99 303 -99 q 692 3 590 -99 q 794 248 794 105 q 692 493 794 391 q 446 595 590 595 q 201 493 303 595 q 99 248 99 391 q 201 3 99 105 z "},"飯�":{"ha":1587,"x_min":3,"x_max":1488,"o":"m 1473 481 q 1488 446 1488 467 q 1473 412 1488 426 l 1246 184 q 1228 176 1239 176 q 1211 184 1218 176 l 1176 219 q 1168 236 1168 226 q 1176 253 1168 246 l 1319 397 l 1091 397 l 1091 223 q 1084 205 1091 212 q 1066 198 1077 198 l 1017 198 q 999 205 1006 198 q 992 223 992 212 l 992 397 l 890 397 q 744 114 871 229 q 446 0 618 0 q 209 67 317 0 q 45 250 102 135 q 3 498 -12 366 q 71 688 15 601 q 217 829 128 775 q 410 891 306 883 q 636 851 530 901 q 810 706 742 801 q 890 496 877 612 l 992 496 l 992 670 q 999 687 992 680 q 1017 694 1006 694 l 1066 694 q 1084 687 1077 694 q 1091 670 1091 680 l 1091 496 l 1319 496 l 1176 639 q 1168 657 1168 646 q 1176 674 1168 667 l 1211 709 q 1228 717 1218 717 q 1246 709 1239 717 l 1473 481 m 201 201 q 252 150 201 201 q 446 99 303 99 q 692 201 590 99 q 794 446 794 303 q 692 692 794 590 q 446 794 590 794 q 201 692 303 794 q 99 446 99 590 q 201 201 99 303 z "},"飯�":{"ha":992,"x_min":0,"x_max":893,"o":"m 893 744 q 779 446 893 573 q 496 301 664 319 l 496 -174 q 489 -191 496 -184 q 471 -198 482 -198 l 422 -198 q 404 -191 411 -198 q 397 -174 397 -184 l 397 301 q 114 446 229 319 q 0 744 0 573 q 35 917 0 835 q 131 1060 71 1000 q 273 1155 191 1120 q 446 1190 356 1190 q 620 1155 537 1190 q 762 1060 702 1120 q 858 917 822 1000 q 893 744 893 835 m 201 499 q 252 448 201 499 q 446 397 303 397 q 692 499 590 397 q 794 744 794 601 q 692 989 794 887 q 446 1091 590 1091 q 201 989 303 1091 q 99 744 99 887 q 201 499 99 601 z "},"飯�":{"ha":992,"x_min":0,"x_max":893,"o":"m 692 201 q 743 252 692 201 q 794 446 794 303 q 692 692 794 590 q 446 794 590 794 q 201 692 303 794 q 99 446 99 590 q 201 201 99 303 q 446 99 303 99 q 692 201 590 99 m 858 620 q 875 578 858 620 q 893 446 893 537 q 858 273 893 356 q 762 131 822 191 q 620 35 702 71 q 446 0 537 0 q 273 35 356 0 q 131 131 191 71 q 35 273 71 191 q 0 446 0 356 q 35 620 0 537 q 131 762 71 702 q 273 858 191 822 q 446 893 356 893 q 620 858 537 893 q 762 762 702 822 q 858 620 822 702 z "},"飯�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飯�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1125 1091 q 1171 1072 1152 1091 q 1190 1025 1190 1053 l 1190 -33 q 1171 -80 1190 -60 q 1125 -99 1152 -99 l 822 -99 l 822 362 l 976 362 l 999 542 l 822 542 l 822 656 q 840 722 822 700 q 911 743 858 743 l 1005 744 l 1005 904 q 867 911 956 911 q 699 849 762 911 q 636 674 636 787 l 636 542 l 481 542 l 481 362 l 636 362 l 636 -99 l 66 -99 q 19 -80 39 -99 q 0 -33 0 -60 l 0 1025 q 19 1072 0 1053 q 66 1091 39 1091 l 1125 1091 z "},"飯�":{"ha":992,"x_min":0,"x_max":992,"o":"m 0 728 q 29 885 0 811 q 109 1015 58 960 q 227 1110 160 1070 q 370 1170 294 1150 q 527 1190 447 1190 q 755 1139 649 1190 q 926 989 860 1087 q 992 767 992 891 q 977 621 992 692 q 931 484 963 550 q 853 368 899 418 q 741 288 808 318 q 594 258 674 258 q 490 283 542 258 q 415 351 438 308 q 394 264 408 321 q 376 190 380 207 q 360 135 371 174 q 339 80 348 97 q 315 32 331 64 q 279 -28 298 0 q 231 -95 260 -57 l 220 -99 l 213 -91 q 202 54 202 30 q 218 214 202 126 q 270 437 235 303 q 310 594 305 571 q 285 725 285 645 q 326 846 285 790 q 428 903 366 903 q 501 872 475 903 q 528 792 528 840 q 494 644 528 741 q 460 499 460 547 q 494 418 460 450 q 579 386 529 386 q 658 405 622 386 q 719 458 694 425 q 762 532 743 491 q 792 617 781 572 q 807 703 802 663 q 812 780 812 744 q 727 989 812 915 q 506 1064 643 1064 q 247 964 351 1064 q 143 709 143 863 q 153 643 143 675 q 174 593 163 612 q 195 558 185 574 q 205 534 205 541 q 193 477 205 512 q 164 443 181 443 q 151 445 163 443 q 81 488 112 457 q 34 562 50 520 q 9 645 17 603 q 0 728 0 687 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 723 398 q 738 417 723 398 q 763 436 753 436 q 839 401 773 436 q 908 360 904 367 q 910 349 910 357 q 897 290 910 323 q 842 239 884 260 q 763 219 799 219 q 615 267 718 219 q 484 358 539 301 q 369 501 428 415 q 314 652 313 584 l 314 658 q 371 780 316 729 q 412 798 390 798 q 426 796 416 798 q 440 795 435 795 q 461 790 455 795 q 473 769 467 785 q 498 701 479 753 q 518 643 518 648 q 491 598 518 626 q 464 562 464 570 q 468 550 464 556 q 547 444 494 494 q 664 366 591 403 q 681 360 674 360 q 723 398 693 360 m 606 25 q 795 64 705 25 q 950 167 885 102 q 1054 323 1015 233 q 1093 512 1093 413 q 1054 700 1093 610 q 950 856 1015 791 q 795 960 885 921 q 606 998 705 998 q 417 960 508 998 q 262 856 327 921 q 158 700 197 791 q 119 512 119 610 q 212 226 119 354 l 151 46 l 339 105 q 606 25 461 25 m 379 1049 q 433 1073 379 1049 q 606 1096 488 1096 q 833 1049 725 1096 q 1019 925 941 1003 q 1144 738 1097 846 q 1190 512 1190 630 q 1144 285 1190 393 q 1019 98 1097 177 q 833 -26 941 20 q 606 -73 725 -73 q 323 0 455 -73 l 0 -104 l 105 210 q 22 512 22 348 q 68 738 22 630 q 193 925 115 846 q 379 1049 271 1003 z "},"飯�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 99 99 l 893 99 l 893 198 l 99 198 l 99 99 m 99 496 l 893 496 l 893 595 l 99 595 l 99 496 m 1293 96 q 1304 107 1293 96 q 1314 149 1314 118 q 1293 202 1314 180 q 1240 223 1271 223 q 1187 202 1209 223 q 1166 149 1166 180 q 1187 96 1166 118 q 1240 74 1209 74 q 1293 96 1271 74 m 99 893 l 893 893 l 893 992 l 99 992 l 99 893 m 1293 493 q 1304 504 1293 493 q 1314 546 1314 515 q 1293 598 1314 577 q 1240 620 1271 620 q 1187 598 1209 620 q 1166 546 1166 577 q 1187 493 1166 515 q 1240 471 1209 471 q 1293 493 1271 471 m 1293 890 q 1304 901 1293 890 q 1314 942 1314 911 q 1293 995 1314 973 q 1240 1017 1271 1017 q 1187 995 1209 1017 q 1166 942 1166 973 q 1187 890 1166 911 q 1240 868 1209 868 q 1293 890 1271 868 m 1389 298 l 1389 0 l 0 0 l 0 298 l 1389 298 m 1389 694 l 1389 397 l 0 397 l 0 694 l 1389 694 m 1389 1091 l 1389 794 l 0 794 l 0 1091 l 1389 1091 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 756 583 q 712 540 756 583 q 546 496 669 496 q 335 583 422 496 q 248 794 248 670 q 335 1004 248 917 q 546 1091 422 1091 q 756 1004 669 1091 q 843 794 843 917 q 756 583 843 670 m 1290 397 l 1563 397 q 1580 389 1573 397 q 1587 372 1587 382 l 1587 223 q 1580 206 1587 213 q 1563 198 1573 198 l 1290 198 l 1290 -74 q 1282 -92 1290 -84 q 1265 -99 1275 -99 l 1116 -99 q 1099 -92 1106 -99 q 1091 -74 1091 -84 l 1091 198 l 818 198 q 801 206 808 198 q 794 223 794 213 l 794 372 q 801 389 794 382 q 818 397 808 397 l 1091 397 l 1091 670 q 1099 687 1091 680 q 1116 694 1106 694 l 1265 694 q 1282 687 1275 694 q 1290 670 1290 680 l 1290 397 m 719 223 q 749 153 719 183 q 818 124 778 124 l 1017 124 l 1017 -60 q 884 -99 964 -99 l 207 -99 q 57 -46 113 -99 q 0 102 0 8 q 3 182 0 143 q 14 266 5 221 q 34 350 22 312 q 67 426 47 389 q 115 489 88 463 q 182 530 143 515 q 268 546 221 546 q 298 532 283 546 q 418 462 360 485 q 546 438 477 438 q 673 462 615 438 q 793 532 732 485 q 823 546 808 546 q 991 471 925 546 l 818 471 q 749 442 778 471 q 719 372 719 412 l 719 223 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1580,"o":"m 756 583 q 712 540 756 583 q 546 496 669 496 q 335 583 422 496 q 248 794 248 670 q 335 1004 248 917 q 546 1091 422 1091 q 756 1004 669 1091 q 843 794 843 917 q 756 583 843 670 m 1380 248 l 1573 55 q 1580 37 1580 48 q 1573 20 1580 27 l 1468 -85 q 1451 -92 1461 -92 q 1433 -85 1440 -92 l 1240 108 l 1047 -85 q 1029 -92 1040 -92 q 1012 -85 1019 -92 l 907 20 q 900 37 900 27 q 907 55 900 48 l 1100 248 l 907 441 q 900 459 900 448 q 907 476 900 469 l 1012 581 q 1029 588 1019 588 q 1047 581 1040 588 l 1240 388 l 1433 581 q 1451 588 1440 588 q 1468 581 1461 588 l 1573 476 q 1580 459 1580 469 q 1573 441 1580 448 l 1380 248 m 994 248 l 854 108 q 825 37 825 79 q 854 -33 825 -4 l 918 -97 q 884 -99 902 -99 l 207 -99 q 57 -46 113 -99 q 0 102 0 8 q 3 182 0 143 q 14 266 5 221 q 34 350 22 312 q 67 426 47 389 q 115 489 88 463 q 182 530 143 515 q 268 546 221 546 q 298 532 283 546 q 546 438 418 438 q 793 532 674 438 q 823 546 808 546 q 867 541 845 546 q 836 502 846 520 q 825 459 825 484 q 854 388 825 417 l 994 248 z "},"飯�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 198 397 l 1538 397 q 1573 382 1558 397 q 1587 347 1587 367 l 1587 0 l 1389 0 l 1389 198 l 198 198 l 198 0 l 0 0 l 0 942 q 15 977 0 963 q 50 992 29 992 l 149 992 q 184 977 169 992 q 198 942 198 963 l 198 397 m 587 505 q 616 534 587 505 q 645 645 645 563 q 587 785 645 727 q 446 843 529 843 q 306 785 364 843 q 248 645 248 727 q 306 505 248 563 q 446 446 364 446 q 587 505 529 446 m 1587 446 l 1587 496 q 1500 706 1587 619 q 1290 794 1413 794 l 744 794 q 709 779 724 794 q 694 744 694 764 l 694 446 l 1587 446 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1190 1190 l 1042 843 l 1190 843 l 1190 694 l 978 694 l 935 595 l 1190 595 l 1190 446 l 872 446 l 595 -198 l 319 446 l 0 446 l 0 595 l 255 595 l 212 694 l 0 694 l 0 843 l 149 843 l 0 1190 l 198 1190 l 449 595 l 742 595 l 992 1190 l 1190 1190 m 595 248 l 679 446 l 512 446 l 595 248 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 843 1190 q 1089 1118 987 1190 q 1190 942 1190 1046 l 1190 248 q 1093 76 1190 147 q 856 1 996 5 l 1022 -156 q 1028 -183 1034 -167 q 1004 -198 1022 -198 l 186 -198 q 163 -183 169 -198 q 169 -156 157 -167 l 334 1 q 97 76 195 5 q 0 248 0 147 l 0 942 q 102 1118 0 1046 q 347 1190 204 1190 l 843 1190 m 490 192 q 512 171 490 192 q 595 149 533 149 q 701 192 657 149 q 744 298 744 236 q 701 403 744 360 q 595 446 657 446 q 490 403 533 446 q 446 298 446 360 q 490 192 446 236 m 1042 595 l 1042 992 l 149 992 l 149 595 l 1042 595 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 843 1190 q 1089 1118 987 1190 q 1190 942 1190 1046 l 1190 248 q 1093 76 1190 147 q 856 1 996 5 l 1022 -156 q 1028 -183 1034 -167 q 1004 -198 1022 -198 l 186 -198 q 163 -183 169 -198 q 169 -156 157 -167 l 334 1 q 97 76 195 5 q 0 248 0 147 l 0 942 q 102 1118 0 1046 q 347 1190 204 1190 l 843 1190 m 136 210 q 154 192 136 210 q 223 174 172 174 q 311 210 274 174 q 347 298 347 246 q 311 385 347 349 q 223 422 274 422 q 136 385 172 422 q 99 298 99 349 q 136 210 99 246 m 546 595 l 546 992 l 124 992 l 124 595 l 546 595 m 880 210 q 898 192 880 210 q 967 174 916 174 q 1055 210 1018 174 q 1091 298 1091 246 q 1055 385 1091 349 q 967 422 1018 422 q 880 385 916 422 q 843 298 843 349 q 880 210 843 246 m 1091 595 l 1091 992 l 645 992 l 645 595 l 1091 595 z "},"飯�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 463 864 l 463 -45 q 453 -78 463 -64 q 425 -91 443 -91 q 399 -85 412 -91 l 39 95 q 11 121 22 103 q 0 157 0 140 l 0 1041 q 8 1067 0 1056 q 30 1078 16 1078 q 64 1066 41 1078 l 460 868 q 463 864 463 866 m 512 786 l 926 115 l 512 321 l 512 786 m 1389 772 l 1389 -45 q 1378 -76 1389 -64 q 1349 -88 1367 -88 q 1312 -78 1330 -88 l 970 92 l 1389 772 m 1387 865 q 1188 540 1387 863 q 955 162 989 217 l 653 653 l 904 1062 q 944 1084 917 1084 q 964 1079 955 1084 l 1383 870 q 1387 865 1387 868 z "},"飯�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 627 412 l 833 799 l 746 799 l 625 557 q 591 486 606 520 l 558 557 l 438 799 l 345 799 l 549 417 l 549 166 l 627 166 l 627 412 m 1190 1091 l 1190 -99 l 0 -99 l 0 1091 l 1190 1091 z "},"飯�":{"ha":1780,"x_min":65,"x_max":1714,"o":"m 370 -108 q 350 -134 364 -120 q 321 -154 335 -149 q 281 -152 301 -161 q 259 -127 260 -142 q 290 -84 258 -110 q 343 -55 322 -59 q 369 -72 360 -52 q 370 -108 377 -91 m 1410 -108 q 1430 -134 1415 -120 q 1459 -154 1445 -149 q 1499 -152 1479 -161 q 1521 -127 1520 -142 q 1490 -84 1522 -110 q 1437 -55 1458 -59 q 1411 -72 1420 -52 q 1410 -108 1403 -91 m 1447 -23 q 1491 -69 1457 -44 q 1551 -102 1525 -95 q 1614 -98 1586 -112 q 1643 -59 1643 -84 q 1591 19 1643 -23 q 1501 65 1538 61 q 1452 36 1470 69 q 1447 -23 1434 3 m 332 -23 q 288 -69 322 -44 q 229 -102 255 -95 q 165 -98 194 -112 q 136 -59 136 -84 q 189 19 136 -23 q 278 65 241 61 q 327 36 309 69 q 332 -23 345 3 m 898 848 l 898 848 q 839 836 867 848 q 873 813 860 830 q 887 774 887 795 q 866 728 887 747 q 815 708 845 708 q 753 742 775 708 q 749 709 749 724 q 793 611 749 652 q 898 570 836 570 q 1003 611 960 570 q 1046 709 1046 652 q 1003 807 1046 767 q 898 848 960 848 m 1133 1017 q 962 1119 1056 1101 q 772 1084 868 1136 q 836 1159 793 1131 q 927 1190 879 1187 q 1022 1177 976 1192 q 1099 1119 1067 1161 q 1133 1017 1130 1077 m 1714 57 q 1706 24 1721 48 q 1711 -7 1711 6 q 1677 -94 1712 -50 q 1592 -165 1642 -138 q 1500 -194 1542 -192 q 1429 -177 1463 -195 q 1378 -126 1395 -159 q 402 -126 846 -146 q 351 -177 384 -158 q 279 -194 317 -195 q 140 -131 212 -191 q 68 -7 67 -71 q 74 24 70 10 q 65 57 59 48 q 89 57 70 64 q 121 97 100 74 q 122 126 115 119 q 153 123 131 134 q 198 150 175 139 q 208 178 198 172 q 248 166 226 188 q 295 164 275 170 q 325 150 309 161 l 325 206 q 311 208 316 206 q 236 242 270 215 q 193 310 202 269 q 193 373 186 339 q 265 446 205 421 q 280 474 267 460 q 308 492 293 488 q 333 486 322 496 q 348 463 344 477 l 358 463 q 405 445 394 459 q 408 439 407 443 q 432 442 416 440 q 456 445 448 444 q 432 458 444 453 q 362 491 415 489 q 363 499 362 496 q 271 513 315 501 q 205 550 227 526 q 172 622 181 578 q 171 708 164 665 q 240 847 183 806 q 281 851 258 860 q 305 819 303 842 q 307 808 305 818 q 308 792 308 798 q 311 777 309 786 q 315 762 312 767 q 322 754 318 756 q 381 745 343 743 q 457 802 418 780 q 331 791 426 805 l 367 827 q 494 913 415 872 q 712 980 606 970 q 680 992 697 986 q 644 1003 664 997 q 611 1011 624 1008 q 574 1019 598 1014 q 541 1027 550 1025 q 1242 919 1002 1125 q 1364 747 1318 854 q 1458 754 1430 739 l 1459 754 q 1465 762 1463 756 q 1469 777 1468 767 q 1472 792 1471 786 q 1474 808 1473 798 l 1475 819 q 1500 850 1477 841 q 1540 846 1522 860 q 1611 708 1597 806 q 1608 621 1616 664 q 1575 550 1600 577 q 1510 513 1553 525 q 1421 498 1467 500 l 1421 491 q 1347 457 1366 489 q 1323 444 1336 453 q 1348 441 1332 443 q 1371 439 1364 439 q 1375 445 1372 443 q 1421 463 1387 459 l 1432 463 q 1446 486 1435 477 q 1472 492 1457 495 q 1500 474 1487 489 q 1514 446 1513 460 q 1587 373 1576 422 q 1587 310 1594 342 q 1544 242 1578 269 q 1469 208 1510 215 q 1456 206 1461 206 q 1455 150 1456 168 q 1484 164 1470 161 q 1531 166 1504 170 q 1571 178 1553 188 q 1582 150 1582 171 q 1628 123 1607 137 q 1657 126 1649 133 q 1659 97 1665 119 q 1690 57 1680 74 q 1714 57 1708 64 m 1501 794 q 1494 753 1501 772 q 1581 650 1558 728 q 1574 727 1584 679 q 1542 797 1563 774 q 1514 810 1526 811 q 1501 794 1501 808 m 1441 717 q 1478 633 1468 684 q 1477 536 1487 581 q 1552 571 1529 546 q 1566 593 1563 582 q 1542 682 1564 643 q 1481 733 1521 721 q 1441 717 1469 722 m 1412 714 q 1378 715 1389 714 q 1419 529 1411 625 q 1452 532 1435 529 q 1453 636 1465 584 q 1412 714 1442 688 m 200 650 q 287 753 223 728 q 280 794 280 772 q 267 810 280 808 q 239 797 254 811 q 207 727 218 774 q 200 650 197 679 m 228 571 q 303 536 250 547 q 303 633 293 581 q 339 717 312 684 l 339 717 q 299 733 311 722 q 238 682 260 721 q 214 593 217 643 q 228 571 221 580 m 365 529 q 422 711 376 625 q 379 698 407 708 l 344 683 l 344 684 q 329 532 308 615 q 365 529 348 529 m 1111 499 q 1124 415 1118 470 q 1133 346 1131 360 q 1140 329 1135 332 q 1159 332 1146 326 q 1207 399 1190 348 q 1225 496 1224 450 q 1111 499 1206 498 m 1047 932 q 1015 964 1047 932 q 893 996 983 996 q 739 932 803 996 q 674 778 674 868 q 739 624 674 687 q 893 560 803 560 q 1047 624 983 560 q 1111 778 1111 687 q 1047 932 1111 868 m 1070 501 q 906 501 988 502 l 906 501 q 908 435 905 481 q 918 384 911 389 q 991 372 941 373 q 1065 381 1041 372 q 1073 411 1072 383 q 1073 465 1075 439 q 1070 501 1071 491 m 862 346 q 869 384 868 350 q 869 452 870 418 q 866 501 867 486 l 866 501 q 700 499 701 499 q 694 451 697 484 q 694 387 692 419 q 705 351 697 355 q 784 339 732 339 q 862 346 836 338 m 556 493 q 560 401 544 447 q 620 336 576 355 q 639 332 632 329 q 648 348 646 334 q 654 418 650 360 q 662 498 658 475 q 556 493 608 496 m 458 395 q 432 367 460 377 q 642 181 534 258 q 879 62 750 105 q 1120 175 1012 100 q 1347 369 1227 250 q 1324 395 1321 379 q 1324 398 1324 397 q 1325 400 1325 399 q 1326 402 1326 401 l 1326 403 l 1326 402 q 1287 407 1313 404 q 1250 410 1262 409 q 1187 308 1230 340 q 1123 308 1147 278 q 1116 319 1119 313 q 1103 367 1111 329 q 1099 360 1101 363 q 1093 355 1097 357 q 1087 351 1090 353 q 1080 348 1084 349 q 1072 346 1075 346 q 1063 344 1069 345 q 1053 343 1056 343 q 1043 342 1050 343 q 1032 342 1035 342 q 906 350 950 335 q 898 330 903 337 q 882 318 894 322 q 864 313 870 314 q 836 310 858 312 q 829 309 832 309 q 672 340 691 296 q 629 298 670 291 q 558 340 592 305 q 543 360 549 350 q 522 411 529 383 q 455 403 477 406 q 458 395 456 401 m 393 -91 q 395 -68 395 -81 q 356 33 382 -13 q 299 87 329 78 q 221 76 267 96 q 140 14 174 55 q 109 -70 105 -28 q 187 -142 136 -111 q 279 -174 237 -173 q 352 -153 319 -176 q 393 -91 385 -129 m 395 41 q 416 -51 413 -8 q 720 84 567 36 q 580 177 644 124 q 441 305 516 229 q 419 295 436 301 q 418 291 419 294 q 417 288 417 289 q 434 259 441 274 q 391 233 425 241 q 368 214 383 222 l 367 214 q 368 98 366 150 q 395 41 383 71 m 449 -88 q 1336 -88 861 -104 q 1004 64 1139 26 q 884 20 946 37 q 871 20 877 18 q 771 58 821 36 q 449 -88 610 12 l 448 -88 l 448 -88 q 449 -88 449 -88 m 1366 -52 q 1388 41 1370 -10 q 1414 96 1399 71 l 1413 95 q 1415 214 1415 155 q 1392 233 1404 220 q 1349 259 1359 240 q 1366 288 1342 274 q 1364 295 1364 291 q 1342 305 1352 298 q 1046 84 1184 157 q 1366 -52 1199 39 m 1670 -70 q 1640 14 1674 -28 q 1559 76 1606 55 q 1480 87 1513 96 q 1424 32 1451 78 q 1384 -68 1397 -14 q 1387 -91 1384 -81 q 1428 -153 1394 -129 q 1500 -174 1461 -176 q 1593 -142 1542 -173 q 1670 -70 1643 -111 z "},"飯�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1144 71 q 1163 52 1144 71 q 1181 -19 1181 33 q 1144 -109 1181 -72 q 1054 -146 1107 -146 q 964 -109 1001 -146 q 926 -19 926 -72 q 964 71 926 33 q 1054 109 1001 109 q 1144 71 1107 109 m 563 71 q 582 52 563 71 q 601 -19 601 33 q 563 -109 601 -72 q 473 -146 525 -146 q 383 -109 420 -146 q 346 -19 346 -72 q 383 71 346 33 q 473 109 420 109 q 563 71 525 109 m 0 1139 q 86 1058 44 1092 q 179 994 127 1023 q 285 945 232 965 q 413 910 338 925 q 568 885 489 894 q 762 871 648 877 q 998 864 877 866 q 1287 862 1119 862 q 1476 858 1394 862 q 1616 845 1558 854 q 1712 824 1675 836 q 1768 793 1750 811 q 1786 753 1785 775 q 1771 704 1787 732 q 1727 644 1755 676 q 1658 574 1700 613 q 1568 493 1616 535 q 1460 401 1520 451 q 1239 209 1317 279 q 1298 294 1261 249 q 1371 376 1335 339 q 1444 452 1407 412 q 1508 523 1481 491 q 1550 585 1535 554 q 1560 639 1565 616 q 1525 682 1556 663 q 1435 714 1494 702 q 1277 732 1375 726 q 1041 736 1178 739 q 798 741 911 735 q 599 759 684 747 q 441 791 514 770 q 317 830 367 811 q 222 879 267 850 q 151 930 177 908 q 98 986 125 953 q 59 1040 72 1018 q 28 1092 47 1061 q 0 1139 10 1124 z "},"飯�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 945 1090 q 885 1115 945 1090 q 694 1141 825 1141 q 444 1090 563 1141 q 238 952 325 1039 q 101 746 152 866 q 50 496 50 627 q 101 246 50 365 q 238 40 152 126 q 444 -98 325 -47 q 694 -149 563 -149 q 945 -98 825 -149 q 1151 40 1064 -47 q 1288 246 1237 126 q 1339 496 1339 365 q 1288 746 1339 627 q 1151 952 1237 866 q 945 1090 1064 1039 m 425 1135 q 489 1163 425 1135 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 m 384 546 q 397 533 397 546 l 397 161 q 384 149 397 149 l 360 149 q 347 161 347 149 l 347 533 q 360 546 347 546 l 384 546 m 624 467 q 639 481 624 467 q 694 496 653 496 q 765 467 736 496 q 794 397 794 438 q 780 347 794 370 q 744 312 767 325 l 744 223 q 737 205 744 212 q 719 198 730 198 l 670 198 q 652 205 659 198 q 645 223 645 212 l 645 312 q 609 347 622 325 q 595 397 595 370 q 624 467 595 438 m 396 1011 q 464 1051 396 1011 q 694 1091 532 1091 q 993 1011 856 1091 q 1210 795 1130 932 q 1290 496 1290 658 q 1210 197 1290 334 q 993 -19 1130 60 q 694 -99 856 -99 q 396 -19 532 -99 q 179 197 259 60 q 99 496 99 334 q 179 795 99 658 q 396 1011 259 932 m 422 719 l 422 645 q 429 627 422 634 q 446 620 436 620 l 496 620 q 514 627 507 620 q 521 645 521 634 l 521 719 q 572 842 521 791 q 694 893 622 893 q 817 842 767 893 q 868 719 868 791 l 868 645 q 875 627 868 634 q 893 620 882 620 l 942 620 q 960 627 953 620 q 967 645 967 634 l 967 719 q 887 912 967 832 q 694 992 808 992 q 501 912 581 992 q 422 719 422 832 m 1091 149 l 1091 546 q 1077 581 1091 566 q 1042 595 1062 595 l 347 595 q 312 581 327 595 q 298 546 298 566 l 298 149 q 312 114 298 129 q 347 99 327 99 l 1042 99 q 1077 114 1062 99 q 1091 149 1091 129 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1488 794 l 1488 198 l 198 198 l 198 794 l 1488 794 m 1587 347 l 1687 347 l 1687 645 l 1587 645 l 1587 868 q 1580 886 1587 879 q 1563 893 1573 893 l 124 893 q 106 886 113 893 q 99 868 99 879 l 99 124 q 106 106 99 113 q 124 99 113 99 l 1563 99 q 1580 106 1573 99 q 1587 124 1587 113 l 1587 347 m 1786 645 l 1786 347 q 1757 277 1786 306 q 1687 248 1728 248 l 1687 124 q 1650 36 1687 73 q 1563 0 1614 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 868 q 36 956 0 919 q 124 992 73 992 l 1563 992 q 1650 956 1614 992 q 1687 868 1687 919 l 1687 744 q 1757 715 1728 744 q 1786 645 1786 686 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 198 198 l 198 794 l 1190 794 l 1190 198 l 198 198 m 1687 744 q 1757 715 1728 744 q 1786 645 1786 686 l 1786 347 q 1757 277 1786 306 q 1687 248 1728 248 l 1687 124 q 1650 36 1687 73 q 1563 0 1614 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 868 q 36 956 0 919 q 124 992 73 992 l 1563 992 q 1650 956 1614 992 q 1687 868 1687 919 l 1687 744 m 1687 347 l 1687 645 l 1587 645 l 1587 868 q 1580 886 1587 879 q 1563 893 1573 893 l 124 893 q 106 886 113 893 q 99 868 99 879 l 99 124 q 106 106 99 113 q 124 99 113 99 l 1563 99 q 1580 106 1573 99 q 1587 124 1587 113 l 1587 347 l 1687 347 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 198 198 l 198 794 l 893 794 l 893 198 l 198 198 m 1687 744 q 1757 715 1728 744 q 1786 645 1786 686 l 1786 347 q 1757 277 1786 306 q 1687 248 1728 248 l 1687 124 q 1650 36 1687 73 q 1563 0 1614 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 868 q 36 956 0 919 q 124 992 73 992 l 1563 992 q 1650 956 1614 992 q 1687 868 1687 919 l 1687 744 m 1687 347 l 1687 645 l 1587 645 l 1587 868 q 1580 886 1587 879 q 1563 893 1573 893 l 124 893 q 106 886 113 893 q 99 868 99 879 l 99 124 q 106 106 99 113 q 124 99 113 99 l 1563 99 q 1580 106 1573 99 q 1587 124 1587 113 l 1587 347 l 1687 347 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 198 198 l 198 794 l 595 794 l 595 198 l 198 198 m 1687 744 q 1757 715 1728 744 q 1786 645 1786 686 l 1786 347 q 1757 277 1786 306 q 1687 248 1728 248 l 1687 124 q 1650 36 1687 73 q 1563 0 1614 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 868 q 36 956 0 919 q 124 992 73 992 l 1563 992 q 1650 956 1614 992 q 1687 868 1687 919 l 1687 744 m 1687 347 l 1687 645 l 1587 645 l 1587 868 q 1580 886 1587 879 q 1563 893 1573 893 l 124 893 q 106 886 113 893 q 99 868 99 879 l 99 124 q 106 106 99 113 q 124 99 113 99 l 1563 99 q 1580 106 1573 99 q 1587 124 1587 113 l 1587 347 l 1687 347 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1687 744 q 1757 715 1728 744 q 1786 645 1786 686 l 1786 347 q 1757 277 1786 306 q 1687 248 1728 248 l 1687 124 q 1650 36 1687 73 q 1563 0 1614 0 l 124 0 q 36 36 73 0 q 0 124 0 73 l 0 868 q 36 956 0 919 q 124 992 73 992 l 1563 992 q 1650 956 1614 992 q 1687 868 1687 919 l 1687 744 m 1687 347 l 1687 645 l 1587 645 l 1587 868 q 1580 886 1587 879 q 1563 893 1573 893 l 124 893 q 106 886 113 893 q 99 868 99 879 l 99 124 q 106 106 99 113 q 124 99 113 99 l 1563 99 q 1580 106 1573 99 q 1587 124 1587 113 l 1587 347 l 1687 347 z "},"飰�":{"ha":992,"x_min":0,"x_max":889,"o":"m 878 382 q 889 329 902 359 q 843 298 876 298 l 547 298 l 703 -71 q 703 -109 711 -91 q 677 -136 695 -128 l 539 -195 q 501 -195 520 -202 q 474 -168 483 -187 l 326 182 l 84 -60 q 50 -74 70 -74 q 31 -71 40 -74 q 0 -25 0 -57 l 0 1141 q 31 1187 0 1173 q 50 1190 40 1190 q 84 1176 71 1190 l 878 382 z "},"飰�":{"ha":794,"x_min":0,"x_max":694,"o":"m 645 1091 q 397 918 397 1091 l 397 595 l 496 595 l 496 496 l 397 496 l 397 74 q 645 -99 397 -99 l 694 -99 l 694 -198 l 645 -198 q 347 -85 434 -198 q 50 -198 260 -198 l 0 -198 l 0 -99 l 50 -99 q 298 74 298 -99 l 298 496 l 198 496 l 198 595 l 298 595 l 298 918 q 50 1091 298 1091 l 0 1091 l 0 1190 l 50 1190 q 347 1077 260 1190 q 645 1190 434 1190 l 694 1190 l 694 1091 l 645 1091 z "},"飰�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1587 893 l 1488 893 l 1488 99 l 1587 99 l 1587 -198 l 1290 -198 l 1290 -99 l 298 -99 l 298 -198 l 0 -198 l 0 99 l 99 99 l 99 893 l 0 893 l 0 1190 l 298 1190 l 298 1091 l 1290 1091 l 1290 1190 l 1587 1190 l 1587 893 m 1389 1091 l 1389 992 l 1488 992 l 1488 1091 l 1389 1091 m 99 1091 l 99 992 l 198 992 l 198 1091 l 99 1091 m 198 -99 l 198 0 l 99 0 l 99 -99 l 198 -99 m 1290 0 l 1290 99 l 1389 99 l 1389 893 l 1290 893 l 1290 992 l 298 992 l 298 893 l 198 893 l 198 99 l 298 99 l 298 0 l 1290 0 m 1488 -99 l 1488 0 l 1389 0 l 1389 -99 l 1488 -99 m 992 694 l 1290 694 l 1290 99 l 595 99 l 595 298 l 298 298 l 298 893 l 992 893 l 992 694 m 397 397 l 893 397 l 893 794 l 397 794 l 397 397 m 1190 198 l 1190 595 l 992 595 l 992 298 l 694 298 l 694 198 l 1190 198 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1786 595 l 1687 595 l 1687 99 l 1786 99 l 1786 -198 l 1488 -198 l 1488 -99 l 794 -99 l 794 -198 l 496 -198 l 496 99 l 595 99 l 595 198 l 298 198 l 298 99 l 0 99 l 0 397 l 99 397 l 99 893 l 0 893 l 0 1190 l 298 1190 l 298 1091 l 992 1091 l 992 1190 l 1290 1190 l 1290 893 l 1190 893 l 1190 794 l 1488 794 l 1488 893 l 1786 893 l 1786 595 m 1587 794 l 1587 694 l 1687 694 l 1687 794 l 1587 794 m 1091 1091 l 1091 992 l 1190 992 l 1190 1091 l 1091 1091 m 99 1091 l 99 992 l 198 992 l 198 1091 l 99 1091 m 198 198 l 198 298 l 99 298 l 99 198 l 198 198 m 1190 298 l 1091 298 l 1091 198 l 1190 198 l 1190 298 m 298 298 l 992 298 l 992 397 l 1091 397 l 1091 893 l 992 893 l 992 992 l 298 992 l 298 893 l 198 893 l 198 397 l 298 397 l 298 298 m 694 -99 l 694 0 l 595 0 l 595 -99 l 694 -99 m 1687 -99 l 1687 0 l 1587 0 l 1587 -99 l 1687 -99 m 1587 99 l 1587 595 l 1488 595 l 1488 694 l 1190 694 l 1190 397 l 1290 397 l 1290 99 l 992 99 l 992 198 l 694 198 l 694 99 l 794 99 l 794 0 l 1488 0 l 1488 99 l 1587 99 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 794 223 l 794 -99 l 74 -99 q 22 -78 43 -99 q 0 -25 0 -56 l 0 1017 q 22 1070 0 1048 q 74 1091 43 1091 l 1116 1091 q 1169 1070 1147 1091 q 1190 1017 1190 1048 l 1190 298 l 868 298 q 815 276 837 298 q 794 223 794 254 m 893 198 l 1188 198 q 1138 96 1177 135 l 995 -47 q 893 -97 956 -85 l 893 198 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1085 198 l 893 198 l 893 6 q 925 23 915 14 l 1068 167 q 1085 198 1077 176 m 868 298 l 1091 298 l 1091 992 l 99 992 l 99 0 l 794 0 l 794 223 q 815 276 794 254 q 868 298 837 298 m 1190 1017 l 1190 223 q 1175 155 1190 192 q 1138 96 1159 118 l 995 -47 q 936 -84 973 -68 q 868 -99 899 -99 l 74 -99 q 22 -78 43 -99 q 0 -25 0 -56 l 0 1017 q 22 1070 0 1048 q 74 1091 43 1091 l 1116 1091 q 1169 1070 1147 1091 q 1190 1017 1190 1048 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1500 451 q 1506 444 1500 451 q 1512 417 1512 437 q 1500 382 1512 397 q 1470 364 1488 368 q 1456 363 1464 363 l 1338 363 l 1338 471 l 1456 471 q 1470 470 1464 471 q 1500 451 1488 466 m 1487 615 q 1492 608 1487 615 q 1498 582 1498 601 q 1487 550 1498 563 q 1457 533 1475 536 q 1445 532 1455 532 l 1338 532 l 1338 632 l 1445 632 q 1452 632 1448 632 q 1457 632 1456 632 q 1487 615 1475 629 m 564 455 l 564 694 l 388 694 l 388 455 q 358 382 388 410 q 277 353 329 353 q 99 399 193 353 l 99 312 q 193 295 140 301 q 277 288 246 288 l 310 287 q 564 455 564 287 m 1118 312 l 1118 400 q 963 354 1041 360 q 832 386 879 348 q 784 496 784 424 q 832 606 784 568 q 963 638 879 644 q 1118 593 1041 632 l 1118 680 q 1040 695 1080 689 q 978 702 1000 701 l 956 704 q 787 693 858 708 q 678 646 716 677 q 623 578 640 615 q 606 496 606 541 q 623 414 606 451 q 678 346 640 377 q 787 299 716 315 q 956 288 858 284 q 1118 312 1035 291 m 1687 401 q 1653 470 1687 443 q 1569 501 1620 497 l 1569 503 q 1638 535 1613 509 q 1662 597 1662 561 q 1631 665 1662 639 q 1548 693 1599 691 q 1538 693 1545 693 q 1528 694 1531 694 l 1175 694 l 1175 298 l 1556 298 q 1650 327 1613 298 q 1687 401 1687 355 m 1786 992 l 1786 0 q 1756 -70 1786 -40 q 1687 -99 1727 -99 l 99 -99 q 29 -70 59 -99 q 0 0 0 -40 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 1687 1091 q 1756 1062 1727 1091 q 1786 992 1786 1032 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 665 229 l 665 766 q 532 661 583 734 q 481 497 481 587 q 532 333 481 406 q 665 229 583 260 m 1004 333 q 1030 370 1004 333 q 1056 497 1056 406 q 1004 661 1056 587 q 871 766 953 734 l 871 228 q 1004 333 953 260 m 1161 725 q 1192 672 1161 725 q 1222 497 1222 620 q 1161 269 1222 374 q 996 103 1101 164 q 768 43 891 43 q 592 79 676 43 q 447 176 508 115 q 350 320 386 236 q 314 497 314 405 q 375 725 314 620 q 540 890 436 829 q 768 951 645 951 q 996 890 891 951 q 1161 725 1101 829 m 1519 491 q 1476 694 1519 599 q 1362 853 1433 789 q 1196 955 1290 918 q 1001 992 1102 992 l 767 992 q 517 929 631 992 q 334 751 402 867 q 267 491 267 636 q 334 245 267 359 q 517 66 401 132 q 767 0 632 0 l 1001 0 q 1196 39 1101 0 q 1362 144 1290 78 q 1476 301 1433 209 q 1519 491 1519 392 m 1786 992 l 1786 0 q 1756 -70 1786 -40 q 1687 -99 1727 -99 l 99 -99 q 29 -70 59 -99 q 0 0 0 -40 l 0 992 q 29 1062 0 1032 q 99 1091 59 1091 l 1687 1091 q 1756 1062 1727 1091 q 1786 992 1786 1032 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1290 -74 l 1290 769 q 1282 786 1290 779 q 1265 794 1275 794 l 422 794 q 404 786 412 794 q 397 769 397 779 l 397 -74 q 404 -92 397 -84 q 422 -99 412 -99 l 1265 -99 q 1282 -92 1275 -99 q 1290 -74 1290 -84 m 1389 769 l 1389 -74 q 1352 -162 1389 -126 q 1265 -198 1316 -198 l 422 -198 q 334 -162 370 -198 q 298 -74 298 -126 l 298 769 q 334 856 298 820 q 422 893 370 893 l 1265 893 q 1352 856 1316 893 q 1389 769 1389 820 m 1091 1066 l 1091 942 l 992 942 l 992 1066 q 985 1084 992 1077 q 967 1091 977 1091 l 124 1091 q 107 1084 114 1091 q 99 1066 99 1077 l 99 223 q 107 206 99 213 q 124 198 114 198 l 248 198 l 248 99 l 124 99 q 36 136 73 99 q 0 223 0 172 l 0 1066 q 36 1154 0 1118 q 124 1190 73 1190 l 967 1190 q 1055 1154 1018 1190 q 1091 1066 1091 1118 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1687,"o":"m 1339 843 l 1042 298 l 1637 298 l 1339 843 m 347 843 l 50 298 l 645 298 l 347 843 m 984 992 q 948 937 973 961 q 893 901 924 912 l 893 -99 l 1364 -99 q 1382 -106 1375 -99 q 1389 -124 1389 -113 l 1389 -174 q 1382 -191 1389 -184 q 1364 -198 1375 -198 l 322 -198 q 305 -191 312 -198 q 298 -174 298 -184 l 298 -124 q 305 -106 298 -113 q 322 -99 312 -99 l 794 -99 l 794 901 q 738 937 763 912 q 703 992 714 961 l 322 992 q 305 999 312 992 q 298 1017 298 1006 l 298 1066 q 305 1084 298 1077 q 322 1091 312 1091 l 703 1091 q 757 1163 719 1135 q 843 1190 795 1190 q 929 1163 891 1190 q 984 1091 967 1135 l 1364 1091 q 1382 1084 1375 1091 q 1389 1066 1389 1077 l 1389 1017 q 1382 999 1389 1006 q 1364 992 1375 992 l 984 992 m 799 998 q 809 989 799 998 q 843 980 818 980 q 887 998 869 980 q 905 1042 905 1016 q 887 1085 905 1067 q 843 1104 869 1104 q 799 1085 818 1104 q 781 1042 781 1067 q 799 998 781 1016 m 1687 298 q 1650 196 1687 241 q 1559 126 1614 151 q 1447 87 1504 100 q 1339 74 1390 74 q 1231 87 1288 74 q 1119 126 1174 100 q 1028 196 1064 151 q 992 298 992 241 q 1019 360 992 306 q 1090 496 1046 415 q 1173 647 1135 577 q 1252 790 1212 718 q 1296 867 1293 862 q 1339 893 1310 893 q 1383 867 1369 893 q 1426 790 1386 862 q 1505 647 1466 718 q 1588 496 1544 577 q 1659 360 1632 415 q 1687 298 1687 306 m 694 298 q 658 196 694 241 q 567 126 622 151 q 455 87 512 100 q 347 74 398 74 q 239 87 296 74 q 127 126 182 100 q 36 196 72 151 q 0 298 0 241 q 27 360 0 306 q 98 496 54 415 q 181 647 143 577 q 260 790 220 718 q 304 867 301 862 q 347 893 318 893 q 391 867 377 893 q 434 790 394 862 q 513 647 474 718 q 596 496 552 577 q 667 360 640 415 q 694 298 694 306 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1091 1091 q 1009 734 1091 889 q 802 496 926 578 q 1009 258 926 414 q 1091 -99 1091 103 l 1166 -99 q 1184 -106 1177 -99 q 1190 -124 1190 -113 l 1190 -174 q 1184 -191 1190 -184 q 1166 -198 1177 -198 l 25 -198 q 7 -191 14 -198 q 0 -174 0 -184 l 0 -124 q 7 -106 0 -113 q 25 -99 14 -99 l 99 -99 q 182 258 99 103 q 388 496 264 414 q 182 734 264 578 q 99 1091 99 889 l 25 1091 q 7 1098 14 1091 q 0 1116 0 1105 l 0 1166 q 7 1184 0 1177 q 25 1190 14 1190 l 1166 1190 q 1184 1184 1177 1190 q 1190 1166 1190 1177 l 1190 1116 q 1184 1098 1190 1105 q 1166 1091 1177 1091 l 1091 1091 m 677 543 q 793 614 737 565 q 893 732 849 663 q 965 895 938 801 q 992 1091 992 989 l 198 1091 q 226 895 198 989 q 297 732 253 801 q 398 614 342 663 q 513 543 453 565 q 537 524 528 537 q 546 496 546 512 q 537 468 546 481 q 513 450 528 455 q 398 378 453 427 q 297 260 342 329 q 226 97 253 191 q 198 -99 198 3 l 992 -99 q 965 97 992 3 q 893 260 938 191 q 793 378 849 329 q 677 450 737 427 q 654 468 663 455 q 645 496 645 481 q 654 524 645 512 q 677 543 663 537 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1091 1091 q 1009 734 1091 889 q 802 496 926 578 q 1009 258 926 414 q 1091 -99 1091 103 l 1166 -99 q 1184 -106 1177 -99 q 1190 -124 1190 -113 l 1190 -174 q 1184 -191 1190 -184 q 1166 -198 1177 -198 l 25 -198 q 7 -191 14 -198 q 0 -174 0 -184 l 0 -124 q 7 -106 0 -113 q 25 -99 14 -99 l 99 -99 q 182 258 99 103 q 388 496 264 414 q 182 734 264 578 q 99 1091 99 889 l 25 1091 q 7 1098 14 1091 q 0 1116 0 1105 l 0 1166 q 7 1184 0 1177 q 25 1190 14 1190 l 1166 1190 q 1184 1184 1177 1190 q 1190 1166 1190 1177 l 1190 1116 q 1184 1098 1190 1105 q 1166 1091 1177 1091 l 1091 1091 m 992 1091 l 198 1091 q 205 992 198 1040 l 985 992 q 992 1091 992 1039 m 992 -99 q 966 94 992 2 q 896 255 939 187 q 798 373 852 324 q 684 446 743 422 l 506 446 q 393 373 447 422 q 295 255 339 324 q 225 94 251 187 q 198 -99 198 2 l 992 -99 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1091 1091 q 1009 734 1091 889 q 802 496 926 578 q 1009 258 926 414 q 1091 -99 1091 103 l 1166 -99 q 1184 -106 1177 -99 q 1190 -124 1190 -113 l 1190 -174 q 1184 -191 1190 -184 q 1166 -198 1177 -198 l 25 -198 q 7 -191 14 -198 q 0 -174 0 -184 l 0 -124 q 7 -106 0 -113 q 25 -99 14 -99 l 99 -99 q 182 258 99 103 q 388 496 264 414 q 182 734 264 578 q 99 1091 99 889 l 25 1091 q 7 1098 14 1091 q 0 1116 0 1105 l 0 1166 q 7 1184 0 1177 q 25 1190 14 1190 l 1166 1190 q 1184 1184 1177 1190 q 1190 1166 1190 1177 l 1190 1116 q 1184 1098 1190 1105 q 1166 1091 1177 1091 l 1091 1091 m 992 1091 l 198 1091 q 264 794 198 932 l 926 794 q 992 1091 992 932 m 948 149 q 835 336 906 258 q 684 446 764 414 l 506 446 q 355 336 426 414 q 243 149 284 258 l 948 149 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1091 1091 q 1009 734 1091 889 q 802 496 926 578 q 1009 258 926 414 q 1091 -99 1091 103 l 1166 -99 q 1184 -106 1177 -99 q 1190 -124 1190 -113 l 1190 -174 q 1184 -191 1190 -184 q 1166 -198 1177 -198 l 25 -198 q 7 -191 14 -198 q 0 -174 0 -184 l 0 -124 q 7 -106 0 -113 q 25 -99 14 -99 l 99 -99 q 182 258 99 103 q 388 496 264 414 q 182 734 264 578 q 99 1091 99 889 l 25 1091 q 7 1098 14 1091 q 0 1116 0 1105 l 0 1166 q 7 1184 0 1177 q 25 1190 14 1190 l 1166 1190 q 1184 1184 1177 1190 q 1190 1166 1190 1177 l 1190 1116 q 1184 1098 1190 1105 q 1166 1091 1177 1091 l 1091 1091 m 677 543 q 793 614 737 565 q 893 732 849 663 q 965 895 938 801 q 992 1091 992 989 l 198 1091 q 226 895 198 989 q 297 732 253 801 q 398 614 342 663 q 513 543 453 565 q 537 524 528 537 q 546 496 546 512 q 537 468 546 481 q 513 450 528 455 q 324 298 407 410 l 867 298 q 677 450 784 410 q 654 468 663 455 q 645 496 645 481 q 654 524 645 512 q 677 543 663 537 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1166 -50 q 1184 -57 1177 -50 q 1190 -74 1190 -64 l 1190 -174 q 1184 -191 1190 -184 q 1166 -198 1177 -198 l 25 -198 q 7 -191 14 -198 q 0 -174 0 -184 l 0 -74 q 7 -57 0 -64 q 25 -50 14 -50 l 1166 -50 m 101 0 q 113 83 103 43 q 136 157 123 123 q 172 224 150 190 q 214 283 195 258 q 264 337 233 308 q 315 383 295 366 q 369 426 335 401 q 421 463 404 451 q 471 496 438 474 q 421 529 438 518 q 369 566 404 541 q 315 609 335 591 q 264 655 295 626 q 214 709 233 684 q 172 768 195 734 q 136 836 150 802 q 113 909 123 869 q 101 992 103 949 l 1090 992 q 1077 909 1087 949 q 1054 836 1067 869 q 1018 768 1041 802 q 977 709 996 734 q 927 655 958 684 q 876 609 896 626 q 821 566 856 591 q 770 529 787 541 q 719 496 753 518 q 770 463 753 474 q 821 426 787 451 q 876 383 856 401 q 927 337 896 366 q 977 283 958 308 q 1018 224 996 258 q 1054 157 1041 190 q 1077 83 1067 123 q 1090 0 1087 43 l 101 0 m 1166 1190 q 1184 1184 1177 1190 q 1190 1166 1190 1177 l 1190 1066 q 1184 1049 1190 1056 q 1166 1042 1177 1042 l 25 1042 q 7 1049 14 1042 q 0 1066 0 1056 l 0 1166 q 7 1184 0 1177 q 25 1190 14 1190 l 1166 1190 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 595 893 q 525 864 554 893 q 496 794 496 835 l 496 694 l 471 694 l 471 767 q 446 830 471 804 q 384 856 422 856 q 323 830 349 856 q 298 769 298 805 l 298 436 l 273 460 l 273 593 q 248 656 273 630 q 186 682 223 682 q 125 656 150 682 q 99 595 99 631 l 99 422 q 126 358 99 385 l 367 129 q 397 50 397 98 q 412 15 397 29 q 446 0 426 0 l 942 0 q 977 15 963 0 q 992 50 992 29 l 992 69 q 1000 129 992 101 l 1084 467 q 1091 526 1091 494 l 1091 717 q 1066 780 1091 754 q 1004 806 1042 806 q 943 780 969 806 q 918 719 918 755 l 918 694 l 893 694 l 893 791 q 873 848 893 822 q 824 879 854 873 q 806 880 813 880 q 745 855 770 880 q 719 794 719 829 l 719 694 l 694 694 l 694 789 q 669 858 694 829 q 605 892 644 888 q 595 893 601 893 m 595 992 q 711 953 660 992 q 806 980 755 980 q 892 959 852 980 q 959 900 932 938 q 1004 905 980 905 q 1136 850 1082 905 q 1190 717 1190 794 l 1190 526 q 1180 443 1190 487 l 1096 105 q 1091 50 1091 86 q 1048 -56 1091 -12 q 942 -99 1004 -99 l 446 -99 q 339 -54 381 -99 q 298 57 298 -9 l 59 286 q 0 422 0 343 l 0 595 q 55 727 0 672 q 186 781 109 781 q 198 780 195 781 q 257 904 203 854 q 384 955 311 955 q 460 939 425 955 q 595 992 516 992 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1265,"o":"m 743 1066 q 730 1078 743 1066 q 682 1091 718 1091 q 621 1066 646 1091 q 595 1004 595 1040 l 595 496 l 570 496 l 570 905 q 545 966 570 941 q 484 992 519 992 q 422 966 448 992 q 397 905 397 941 l 397 496 l 397 298 l 277 457 q 198 496 248 496 q 128 467 157 496 q 99 397 99 438 q 119 337 99 363 l 417 -60 q 496 -99 446 -99 l 1029 -99 q 1077 -82 1056 -99 q 1103 -39 1097 -65 l 1162 275 q 1166 321 1166 300 l 1166 707 q 1140 768 1166 742 q 1079 794 1115 794 q 1018 768 1043 794 q 992 707 992 742 l 992 496 l 967 496 l 967 905 q 942 966 967 941 q 880 992 916 992 q 819 966 845 992 q 794 905 794 941 l 794 496 l 769 496 l 769 1004 q 743 1066 769 1040 m 585 1163 q 607 1177 585 1163 q 682 1190 629 1190 q 779 1163 735 1190 q 848 1088 824 1135 q 880 1091 863 1091 q 1012 1037 957 1091 q 1066 905 1066 982 l 1066 892 q 1206 842 1148 897 q 1265 707 1265 788 l 1265 321 q 1259 257 1265 290 l 1200 -57 q 1140 -158 1189 -118 q 1029 -198 1092 -198 l 496 -198 q 407 -177 450 -198 q 337 -119 365 -156 l 40 277 q 0 397 0 330 q 58 537 0 479 q 198 595 116 595 q 298 569 259 595 l 298 905 q 352 1037 298 982 q 484 1091 407 1091 q 516 1088 501 1091 q 585 1163 540 1135 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 832 -99 l 694 -99 q 519 10 568 -99 q 501 89 501 48 l 501 93 q 425 162 453 116 q 397 260 397 207 q 401 298 397 290 l 198 298 q 58 356 116 298 q 0 496 0 414 q 58 636 0 578 q 198 694 116 694 l 286 694 l 252 708 q 159 780 195 729 q 124 893 124 831 q 182 1033 124 975 q 322 1091 240 1091 q 393 1078 358 1091 l 880 893 l 1190 893 q 1331 835 1273 893 q 1389 694 1389 777 l 1389 177 q 1347 55 1389 109 q 1239 -16 1305 1 l 976 -81 q 832 -99 904 -99 m 794 452 l 674 397 l 547 339 q 510 307 524 329 q 496 260 496 286 q 522 199 496 225 q 583 174 547 174 q 618 181 603 174 l 880 301 q 818 339 842 308 q 794 409 794 370 l 794 452 m 1042 211 q 1016 272 1042 246 q 955 298 991 298 q 919 290 935 298 l 694 188 q 666 174 673 177 q 642 161 659 171 q 619 143 625 151 q 607 121 613 135 q 601 89 601 106 q 625 26 601 50 q 688 1 649 1 q 718 8 704 1 l 991 132 q 1028 164 1014 143 q 1042 211 1042 185 m 862 794 l 358 986 q 322 992 339 992 q 252 963 281 992 q 223 893 223 934 q 241 836 223 862 q 287 800 258 811 l 694 645 l 694 595 l 198 595 q 128 566 157 595 q 99 496 99 537 q 128 426 99 455 q 198 397 157 397 l 613 397 l 794 479 l 794 632 q 829 715 794 681 l 915 794 l 862 794 m 832 0 q 952 15 895 0 l 1215 81 q 1269 116 1248 89 q 1290 177 1290 143 l 1290 694 q 1261 765 1290 736 q 1190 794 1232 794 l 952 794 l 846 696 q 818 632 818 670 l 818 403 q 844 343 818 367 q 905 319 870 319 q 966 346 941 319 q 992 409 992 374 l 992 570 l 1017 570 l 1017 409 q 973 321 1017 355 q 1040 283 1013 315 q 1066 211 1066 252 q 1049 150 1066 178 q 1001 109 1031 122 l 761 0 l 832 0 z "},"飰�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 892 1190 q 982 1169 939 1190 q 1053 1109 1025 1147 l 1496 504 q 1587 226 1587 381 l 1587 -50 q 1544 -155 1587 -112 q 1438 -198 1500 -198 l 1141 -198 q 1035 -155 1079 -198 q 992 -50 992 -112 l 992 88 l 770 198 l 347 198 q 242 242 285 198 q 198 347 198 285 l 198 372 q 264 530 198 464 q 422 595 329 595 l 747 595 l 780 694 l 248 694 q 114 747 171 694 q 50 876 57 799 q 0 1017 0 937 l 0 1042 q 43 1147 0 1104 q 149 1190 87 1190 l 892 1190 m 1488 -50 l 1488 226 q 1416 446 1488 347 l 972 1051 q 892 1091 942 1091 l 149 1091 q 114 1077 129 1091 q 99 1042 99 1062 q 100 1003 99 1017 q 108 972 102 990 q 127 939 114 954 q 155 977 135 963 q 198 992 174 992 l 843 992 l 843 967 l 198 967 q 164 953 178 967 q 149 918 149 938 q 151 873 149 884 q 185 816 157 839 q 248 794 213 794 l 744 794 l 815 794 q 867 772 846 794 q 889 719 889 750 q 885 696 889 708 l 836 547 q 808 510 828 525 q 765 496 789 496 l 422 496 q 334 460 370 496 q 298 372 298 423 l 298 347 q 312 312 298 327 q 347 298 327 298 l 782 298 q 805 292 794 298 l 1050 170 q 1080 142 1069 160 q 1091 103 1091 124 l 1091 -50 q 1106 -84 1091 -70 q 1141 -99 1121 -99 l 1438 -99 q 1473 -84 1459 -99 q 1488 -50 1488 -70 z "},"飰�":{"ha":1587,"x_min":0,"x_max":1488,"o":"m 356 -198 q 249 -162 296 -198 q 188 -67 202 -125 l 109 244 q 99 328 99 288 q 95 380 99 363 l 5 749 q 0 794 0 770 q 48 918 0 866 q 168 979 96 971 q 232 1087 181 1045 q 350 1128 283 1128 q 465 1089 415 1128 q 531 986 515 1049 l 595 716 l 675 1048 q 741 1151 691 1111 q 856 1190 791 1190 q 976 1146 925 1190 q 1039 1034 1028 1101 q 1156 973 1110 1026 q 1203 847 1203 919 q 1197 801 1203 829 l 1102 405 q 1131 427 1110 410 q 1161 450 1152 443 q 1188 467 1170 456 q 1220 483 1207 479 q 1252 492 1233 488 q 1290 496 1271 496 q 1430 439 1372 496 q 1488 300 1488 381 q 1466 208 1488 252 q 1405 136 1444 165 l 1012 -159 q 894 -198 960 -198 l 356 -198 m 856 1091 q 803 1073 826 1091 q 772 1025 779 1054 l 645 496 l 546 496 l 434 963 q 403 1011 427 992 q 350 1029 380 1029 q 288 1004 313 1029 q 264 942 264 978 q 266 920 264 930 l 368 496 l 348 496 l 271 812 q 240 861 264 841 q 187 880 216 880 q 125 855 150 880 q 99 794 99 829 q 102 773 99 783 l 191 403 q 198 336 197 381 q 206 268 200 291 l 284 -43 q 310 -83 290 -67 q 356 -99 330 -99 l 894 -99 q 953 -79 926 -99 l 1345 215 q 1389 300 1389 248 q 1360 369 1389 340 q 1290 397 1331 397 q 1231 377 1257 397 l 993 198 l 993 374 q 1018 481 993 377 q 1070 700 1042 585 q 1101 825 1098 815 q 1104 847 1104 839 q 1079 910 1104 884 q 1018 936 1054 936 q 964 918 987 936 q 933 870 940 899 l 843 496 l 823 496 l 939 980 q 942 1001 942 991 q 917 1065 942 1039 q 856 1091 893 1091 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 496 1091 q 426 1062 455 1091 q 397 992 397 1033 l 397 595 l 397 298 l 280 454 q 197 496 248 496 q 128 467 157 496 q 99 397 99 437 q 119 337 99 363 l 417 -60 q 496 -99 446 -99 l 1053 -99 q 1083 -89 1070 -99 q 1101 -62 1097 -78 l 1172 223 q 1190 374 1190 298 l 1190 542 q 1169 597 1190 574 q 1116 620 1147 620 q 1063 598 1085 620 q 1042 546 1042 577 l 1017 546 l 1017 593 q 992 656 1017 630 q 930 682 967 682 q 869 656 894 682 q 843 595 843 631 l 843 546 l 818 546 l 818 615 q 790 689 818 658 q 719 719 761 719 q 649 690 678 719 q 620 620 620 661 l 620 546 l 595 546 l 595 987 q 567 1061 595 1030 q 496 1091 538 1091 m 496 1190 q 637 1130 579 1190 q 694 987 694 1070 l 694 817 q 719 818 711 818 q 853 765 796 818 q 930 781 890 781 q 1073 714 1018 781 q 1116 719 1094 719 q 1239 667 1189 719 q 1290 542 1290 615 l 1290 374 q 1268 199 1290 284 l 1197 -86 q 1144 -167 1184 -136 q 1053 -198 1104 -198 l 496 -198 q 407 -177 450 -198 q 337 -119 365 -156 l 40 277 q 0 397 0 330 q 58 537 0 478 q 197 595 115 595 q 298 568 252 595 l 298 992 q 356 1132 298 1074 q 496 1190 414 1190 m 595 99 l 595 397 l 570 397 l 570 99 l 595 99 m 794 99 l 794 397 l 769 397 l 769 99 l 794 99 m 992 99 l 992 397 l 967 397 l 967 99 l 992 99 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 998 689 q 1081 671 1045 689 q 1190 496 1190 622 l 1190 359 q 1173 215 1190 286 l 1107 -48 q 1037 -157 1090 -115 q 915 -198 983 -198 l 397 -198 q 257 -140 315 -198 q 198 0 198 -82 l 198 311 l 13 798 q 0 868 0 832 q 58 1008 0 950 q 198 1066 116 1066 q 311 1031 260 1066 q 384 939 362 996 l 397 904 l 397 992 q 455 1132 397 1074 q 595 1190 513 1190 q 736 1132 677 1190 q 794 992 794 1074 l 794 790 q 831 794 815 794 q 930 765 884 794 q 998 689 975 737 m 831 694 q 784 680 805 694 q 752 643 763 667 l 694 517 l 639 397 l 682 397 q 752 372 721 397 q 791 310 783 348 l 910 572 q 918 608 918 587 q 892 669 918 643 q 831 694 867 694 m 1002 590 q 971 584 985 590 q 948 571 956 577 q 930 548 940 565 q 917 525 920 532 q 904 496 914 518 l 801 271 q 794 236 794 256 q 819 174 794 200 q 880 149 845 149 q 927 163 906 149 q 960 200 949 177 l 1084 473 q 1090 502 1090 487 q 1066 565 1090 541 q 1002 590 1041 590 m 99 868 q 105 832 99 851 l 298 329 l 298 275 l 377 361 q 459 397 410 397 l 612 397 l 694 577 l 694 992 q 665 1062 694 1033 q 595 1091 636 1091 q 525 1062 554 1091 q 496 992 496 1033 l 496 496 l 446 496 l 291 904 q 255 950 281 932 q 198 967 229 967 q 128 938 157 967 q 99 868 99 909 m 915 -99 q 975 -78 949 -99 q 1011 -24 1002 -57 l 1077 239 q 1091 359 1091 295 l 1091 429 l 982 189 q 941 142 969 160 q 880 124 913 124 q 808 151 839 124 q 770 218 777 177 q 682 174 736 174 l 521 174 l 521 198 l 682 198 q 745 224 718 198 q 772 285 772 250 q 748 346 772 321 q 688 372 724 372 l 459 372 q 395 344 421 372 l 298 239 l 298 0 q 327 -70 298 -41 q 397 -99 356 -99 l 915 -99 z "},"飰�":{"ha":1529,"x_min":0,"x_max":1528,"o":"m 664 769 l 664 678 q 657 661 664 668 q 639 654 649 654 l 408 654 l 408 25 q 401 7 408 15 q 384 0 395 0 l 280 0 q 262 7 270 0 q 255 25 255 14 l 255 654 l 25 654 q 7 661 15 654 q 0 678 0 668 l 0 769 q 7 787 0 780 q 25 794 14 794 l 639 794 q 657 786 649 794 q 664 769 664 779 m 1469 771 l 1528 26 q 1522 8 1529 16 q 1504 0 1514 0 l 1401 0 q 1384 7 1391 0 q 1376 22 1377 13 l 1341 478 l 1194 149 q 1172 134 1188 134 l 1079 134 q 1056 149 1063 134 l 911 480 l 876 22 q 868 7 875 13 q 852 0 861 0 l 747 0 q 729 8 737 0 q 722 26 722 16 l 783 771 q 791 787 784 780 q 807 794 798 794 l 917 794 q 939 779 932 794 l 1110 376 q 1125 336 1118 357 q 1133 355 1128 342 q 1141 376 1138 369 l 1312 779 q 1335 794 1319 794 l 1444 794 q 1461 787 1454 794 q 1469 771 1468 780 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 808 646 q 761 739 808 714 q 670 753 736 753 l 575 753 l 575 536 l 701 536 q 780 564 752 536 q 808 646 808 593 m 848 425 l 1007 136 q 1006 112 1013 122 q 985 99 1000 99 l 867 99 q 846 112 852 99 l 695 395 l 575 395 l 575 124 q 568 106 575 113 q 550 99 561 99 l 446 99 q 429 106 436 99 q 422 124 422 113 l 422 868 q 429 886 422 879 q 446 893 436 893 l 674 893 q 822 874 773 893 q 925 790 887 850 q 963 650 963 729 q 930 522 963 579 q 841 437 898 465 q 848 425 846 429 m 916 1021 q 863 1044 916 1021 q 694 1066 811 1066 q 473 1021 578 1066 q 291 899 367 976 q 169 718 215 823 q 124 496 124 612 q 169 274 124 380 q 291 93 215 169 q 473 -29 367 16 q 694 -74 578 -74 q 916 -29 811 -74 q 1098 93 1022 16 q 1220 274 1174 169 q 1265 496 1265 380 q 1220 718 1265 612 q 1098 899 1174 823 q 916 1021 1022 976 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 469 235 q 668 315 587 235 q 670 343 679 329 l 636 407 q 617 420 631 417 q 596 412 605 422 l 593 409 q 584 401 590 406 q 570 391 578 397 q 552 380 563 385 q 530 370 542 374 q 504 362 519 365 q 475 360 490 360 q 378 398 416 360 q 340 497 340 437 q 377 594 340 556 q 472 632 415 632 q 527 622 501 632 q 567 600 554 611 l 579 589 q 599 581 587 581 q 618 592 612 583 l 659 653 q 657 683 669 668 q 649 692 655 686 q 625 710 643 698 q 588 732 608 722 q 536 749 567 742 q 469 757 504 757 q 278 682 354 757 q 202 496 202 608 q 277 309 202 383 q 469 235 353 235 m 957 235 q 1156 315 1076 235 q 1159 343 1167 329 l 1125 407 q 1105 420 1118 418 q 1084 412 1093 422 l 1081 409 q 1072 401 1078 406 q 1059 391 1066 397 q 1041 380 1051 385 q 1018 370 1030 374 q 992 362 1007 365 q 963 360 978 360 q 867 398 904 360 q 829 497 829 437 q 866 594 829 556 q 960 632 903 632 q 1016 622 989 632 q 1055 600 1042 611 l 1067 589 q 1087 581 1076 581 q 1106 592 1100 583 l 1147 653 q 1146 683 1157 668 q 1137 692 1143 686 q 1114 710 1131 698 q 1076 732 1097 722 q 1024 749 1056 742 q 957 757 992 757 q 767 682 843 757 q 691 496 691 608 q 766 309 691 383 q 957 235 841 235 m 916 1021 q 863 1044 916 1021 q 694 1066 811 1066 q 473 1021 578 1066 q 291 899 367 976 q 169 718 215 823 q 124 496 124 612 q 169 274 124 380 q 291 93 215 169 q 473 -29 367 16 q 694 -74 578 -74 q 916 -29 811 -74 q 1098 93 1022 16 q 1220 274 1174 169 q 1265 496 1265 380 q 1220 718 1265 612 q 1098 899 1174 823 q 916 1021 1022 976 m 425 1135 q 489 1163 425 1135 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 z "},"飰�":{"ha":1587,"x_min":50,"x_max":1538,"o":"m 570 570 l 868 273 l 570 -25 l 50 496 l 570 1017 l 701 887 l 626 812 l 570 868 l 198 496 l 570 124 l 720 274 l 496 496 l 570 570 m 1017 1017 l 1538 496 l 1017 -25 l 887 105 l 961 180 l 1017 124 l 1389 496 l 1017 868 l 867 718 l 1091 496 l 1017 422 l 719 719 l 1017 1017 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 556 141 l 766 351 l 550 567 l 481 499 l 630 351 l 556 277 l 339 493 l 556 709 l 587 678 l 654 746 l 556 845 l 204 493 l 556 141 m 833 147 l 1185 499 l 833 851 l 623 641 l 839 425 l 908 493 l 759 641 l 833 715 l 1049 499 l 833 283 l 802 314 l 735 246 l 833 147 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 505 418 q 483 366 505 388 q 432 345 462 345 q 381 366 402 345 q 360 418 360 388 q 381 469 360 447 q 432 490 402 490 q 483 469 462 490 q 505 418 505 447 m 1378 470 q 1388 459 1378 470 q 1399 419 1399 449 q 1378 367 1399 388 q 1326 346 1356 346 q 1275 367 1296 346 q 1253 419 1253 388 q 1275 470 1253 449 q 1326 491 1296 491 q 1378 470 1356 491 m 593 418 q 549 523 593 479 q 443 567 505 567 q 338 524 381 567 q 294 418 294 480 q 338 312 294 356 q 443 268 381 268 q 549 312 505 268 q 593 418 593 356 m 1443 313 q 1465 335 1443 313 q 1487 419 1487 357 q 1443 524 1487 481 q 1337 568 1399 568 q 1232 524 1276 568 q 1187 419 1187 481 q 1231 313 1187 357 q 1337 269 1275 269 q 1443 313 1399 269 m 659 418 q 596 265 659 328 q 443 202 532 202 q 290 265 353 202 q 227 418 227 329 q 291 570 227 507 q 443 633 354 633 q 596 570 532 633 q 659 418 659 507 m 1490 571 q 1522 539 1490 571 q 1553 419 1553 508 q 1490 266 1553 329 q 1337 203 1427 203 q 1185 266 1248 203 q 1121 419 1121 329 q 1185 571 1121 508 q 1337 634 1248 634 q 1490 571 1427 634 m 701 163 q 754 216 701 163 q 806 416 806 268 q 701 669 806 564 q 448 774 596 774 q 269 726 351 774 q 139 596 187 678 q 91 416 91 513 q 139 237 91 319 q 269 106 187 154 q 448 58 351 58 q 701 163 596 58 m 1324 860 q 893 946 1127 946 q 449 861 646 946 q 622 826 539 861 q 763 731 704 791 q 858 589 822 671 q 893 416 893 507 q 927 586 893 505 q 1018 726 960 667 q 1156 822 1076 785 q 1324 860 1235 858 m 1590 163 q 1643 216 1590 163 q 1695 416 1695 268 q 1590 669 1695 564 q 1338 774 1486 774 q 1085 669 1190 774 q 980 416 980 564 q 1085 163 980 268 q 1338 58 1190 58 q 1590 163 1486 58 m 1489 855 l 1786 855 q 1728 766 1752 815 q 1697 677 1704 717 q 1782 416 1782 560 q 1722 193 1782 295 q 1560 31 1662 91 q 1338 -28 1458 -28 q 1145 16 1235 -28 q 993 136 1055 59 q 893 -3 956 92 q 851 61 884 14 q 794 136 818 108 q 641 16 732 60 q 448 -28 551 -28 q 226 31 328 -28 q 64 193 123 91 q 4 416 4 295 q 89 677 4 560 q 58 766 82 717 q 0 855 34 815 l 283 855 q 558 976 398 932 q 893 1020 718 1020 q 1219 977 1066 1020 q 1489 855 1372 933 z "},"飰�":{"ha":992,"x_min":79,"x_max":913,"o":"m 745 591 q 693 539 745 591 q 496 488 642 488 q 247 591 350 488 q 144 839 144 694 q 247 1087 144 984 q 496 1190 350 1190 q 745 1087 642 1190 q 848 839 848 984 q 745 591 848 694 m 618 961 q 593 987 618 961 q 496 1012 567 1012 q 374 961 425 1012 q 323 839 323 911 q 374 717 323 767 q 496 666 425 666 q 618 717 567 666 q 669 839 669 767 q 618 961 669 911 m 901 445 q 913 407 911 424 q 910 375 915 389 q 889 345 904 361 q 856 317 873 329 q 808 284 839 304 q 564 212 719 228 l 621 156 l 828 -51 q 851 -109 851 -75 q 828 -165 851 -142 l 818 -175 q 761 -198 794 -198 q 704 -175 728 -198 q 497 33 652 -122 l 290 -175 q 233 -198 266 -198 q 176 -175 199 -198 l 167 -165 q 143 -109 143 -142 q 167 -51 143 -75 l 374 156 l 429 212 q 184 284 272 228 q 136 317 153 304 q 103 345 119 329 q 83 375 88 361 q 79 407 78 389 q 91 445 81 424 q 112 472 98 460 q 145 489 126 484 q 188 488 164 494 q 239 460 213 481 q 250 452 243 457 q 284 433 258 446 q 337 409 309 419 q 408 391 365 399 q 496 382 452 382 q 631 402 567 382 q 724 441 695 422 l 753 460 q 804 488 779 481 q 847 489 829 494 q 880 472 866 484 q 901 445 894 460 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 682 828 q 700 810 682 828 q 718 741 718 792 q 682 654 718 690 q 595 618 646 618 q 508 654 544 618 q 472 741 472 690 q 508 828 472 792 q 595 864 544 864 q 682 828 646 864 m 884 460 q 863 484 877 475 q 826 492 849 494 q 779 470 803 490 q 756 455 771 464 q 694 430 742 446 q 595 415 646 415 q 499 429 545 415 q 432 457 453 443 l 412 470 q 365 492 388 490 q 328 484 342 494 q 306 460 314 475 q 305 402 289 425 q 372 345 320 379 q 547 293 436 304 l 508 253 q 360 105 398 143 q 343 65 343 88 q 360 24 343 41 l 367 17 q 407 0 384 0 q 448 17 431 0 l 596 165 q 744 17 684 76 q 785 0 761 0 q 825 17 808 0 l 832 24 q 849 65 849 41 q 832 105 849 88 l 684 253 l 644 293 q 818 345 753 304 q 886 402 870 379 q 884 460 901 425 m 773 563 q 810 600 773 563 q 846 741 846 637 q 773 918 846 845 q 595 992 699 992 q 418 918 491 992 q 344 741 344 845 q 418 563 344 637 q 595 490 491 490 q 773 563 699 490 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飰�":{"ha":1333,"x_min":0,"x_max":1333,"o":"m 1213 1091 q 1298 1056 1263 1091 q 1333 970 1333 1021 l 1333 568 q 1280 308 1333 432 q 1139 95 1228 184 q 927 -47 1050 5 q 667 -99 803 -99 q 407 -47 531 -99 q 195 95 284 5 q 53 308 105 184 q 0 568 0 432 l 0 970 q 36 1056 0 1020 q 121 1091 71 1091 l 1213 1091 m 667 267 q 731 292 704 267 l 1044 593 q 1073 659 1073 620 q 1046 724 1073 697 q 981 750 1019 750 q 918 725 945 750 l 667 484 l 417 725 q 354 750 390 750 q 289 724 316 750 q 263 659 263 697 q 291 593 263 619 l 605 292 q 667 267 630 267 z "},"飰�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1158 -80 l 929 459 q 806 222 910 421 q 653 -80 703 23 q 631 -80 652 -81 q 611 -79 611 -80 q 413 376 547 71 q 212 838 278 681 q 160 921 195 877 q 80 999 125 966 q 1 1032 35 1032 q 0 1051 1 1036 q 0 1072 0 1066 l 452 1072 l 452 1033 q 390 1021 422 1032 q 339 987 359 1010 q 331 938 319 965 q 499 551 351 892 q 681 133 646 210 q 790 339 705 180 q 891 531 874 498 q 794 749 877 561 q 688 977 711 936 q 532 1032 659 1031 l 532 1071 l 930 1070 l 930 1034 q 858 1015 884 1032 q 848 961 832 997 q 915 814 873 907 q 982 669 957 722 q 1116 950 1067 835 q 1108 1012 1135 993 q 1008 1032 1082 1031 q 1009 1052 1009 1038 q 1009 1070 1009 1066 q 1141 1071 1059 1070 q 1281 1072 1224 1071 q 1352 1072 1338 1072 l 1352 1034 q 1260 1008 1304 1032 q 1190 946 1216 984 l 1025 603 q 1124 378 1035 577 q 1218 166 1213 179 l 1560 954 q 1522 1003 1549 984 q 1471 1027 1494 1022 q 1428 1033 1449 1032 l 1428 1072 l 1785 1069 l 1786 1067 l 1785 1033 q 1629 921 1677 1030 q 1196 -80 1221 -22 l 1158 -80 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 736 498 q 723 463 736 478 q 691 449 710 449 q 656 462 670 449 q 641 494 641 474 q 654 529 641 514 q 687 543 667 543 q 721 531 706 543 q 736 498 736 518 m 747 453 l 1018 904 q 966 855 1011 898 q 869 765 921 813 q 763 667 817 717 q 672 581 709 616 q 633 541 636 546 l 363 91 q 415 140 368 97 q 512 230 461 182 q 618 328 563 277 q 708 414 672 379 q 747 453 745 450 m 1249 496 q 1168 208 1249 340 q 1155 217 1166 210 q 1134 230 1144 224 q 1121 236 1125 236 q 1111 226 1111 236 q 1157 191 1111 218 q 1014 44 1100 105 q 827 -42 929 -17 l 815 10 q 803 18 814 18 q 797 14 799 18 q 795 6 794 9 l 808 -47 q 694 -58 752 -58 q 406 23 540 -58 q 416 39 407 25 q 433 65 426 53 q 440 80 440 77 q 430 90 440 90 q 417 79 426 90 q 400 52 408 67 q 389 34 391 36 q 240 179 301 92 q 155 369 179 267 l 208 381 q 216 392 216 383 q 212 398 216 396 q 204 400 208 401 l 151 388 q 140 496 140 444 q 225 790 140 656 q 239 780 226 789 q 262 766 252 772 q 276 760 273 760 q 286 769 286 760 q 276 781 286 773 q 251 798 267 788 l 236 807 q 382 953 295 894 q 571 1036 469 1013 l 583 984 q 594 977 584 977 q 601 981 598 977 q 602 989 603 985 l 591 1040 q 694 1050 646 1050 q 988 966 853 1050 q 958 915 958 922 q 967 905 958 905 q 1004 955 976 905 q 1150 811 1090 897 q 1233 624 1209 725 l 1190 615 q 1182 602 1182 613 q 1186 596 1182 598 q 1194 594 1190 594 l 1238 605 q 1249 496 1249 549 m 1265 255 q 1290 312 1265 255 q 1314 496 1314 370 q 1265 737 1314 622 q 1133 935 1216 852 q 935 1067 1050 1018 q 694 1116 821 1116 q 453 1067 568 1116 q 256 935 339 1018 q 124 737 173 852 q 74 496 74 622 q 124 255 74 370 q 256 57 173 140 q 453 -75 339 -26 q 694 -124 568 -124 q 935 -75 821 -124 q 1133 57 1050 -26 q 1265 255 1216 140 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 692 1190 q 1042 1097 878 1192 q 1314 809 1221 994 l 739 839 q 512 782 615 846 q 368 604 408 717 l 154 932 q 395 1123 253 1056 q 692 1190 537 1190 m 113 877 l 374 363 q 538 195 430 252 q 765 160 646 137 l 587 -190 q 288 -68 422 -164 q 77 177 154 29 q 0 496 0 326 q 113 877 0 703 m 1342 746 q 1389 505 1387 629 q 1351 268 1390 381 q 1232 57 1312 155 q 1042 -105 1152 -41 q 656 -198 863 -208 l 970 285 q 1034 510 1038 387 q 951 725 1029 634 l 1342 746 m 529 662 q 563 696 529 662 q 694 730 598 730 q 860 662 791 730 q 929 496 929 593 q 860 331 929 399 q 694 262 791 262 q 529 331 598 262 q 460 496 460 399 q 529 662 460 593 z "},"飰�":{"ha":1389,"x_min":2,"x_max":1389,"o":"m 700 -198 q 309 -82 481 -198 q 53 227 137 35 q 2 460 9 329 q 22 718 -5 592 q 108 960 49 844 q 246 1148 167 1076 l 238 930 q 291 942 246 941 q 345 930 335 943 q 469 1037 377 993 q 651 1083 561 1081 q 558 968 609 1048 q 513 841 508 887 q 562 830 532 835 q 610 825 591 826 q 663 822 630 823 q 702 819 696 820 q 710 784 714 815 q 686 725 705 753 q 673 711 682 720 q 629 684 664 702 q 551 657 594 665 l 563 511 l 455 563 q 449 500 441 529 q 477 448 457 470 q 528 416 497 426 q 591 411 559 405 q 667 438 630 418 q 731 472 703 457 q 788 486 760 488 q 858 460 836 483 q 873 410 880 438 q 871 406 872 408 q 864 396 870 403 q 850 384 859 389 q 826 376 842 379 q 790 375 810 373 q 678 270 743 301 q 515 247 612 239 q 641 183 573 200 q 772 179 710 167 q 892 219 834 191 q 991 287 949 247 q 1053 367 1032 326 q 1084 517 1087 438 q 1054 663 1080 595 q 994 760 1028 730 q 1100 698 1061 730 q 1159 611 1139 666 q 1115 877 1171 742 q 953 1097 1059 1011 q 1272 880 1158 1037 q 1389 479 1386 723 q 1357 281 1390 381 q 1262 97 1325 182 q 1115 -55 1199 12 q 923 -160 1032 -122 q 700 -198 815 -198 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1157 1014 q 879 1099 1029 1099 q 652 1042 759 1099 q 466 887 545 986 q 373 718 408 815 q 336 512 339 622 l 336 480 q 373 274 339 370 q 466 105 408 177 q 652 -50 545 6 q 879 -107 759 -107 q 1157 -22 1029 -107 q 944 -152 1063 -105 q 694 -198 825 -198 q 661 -198 672 -198 q 403 -134 525 -191 q 192 16 281 -77 q 52 233 104 108 q 0 496 0 359 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 l 697 1190 q 945 1144 827 1190 q 1157 1014 1063 1097 m 1389 496 q 1329 215 1389 347 q 1164 -15 1270 83 q 992 -64 1084 -64 q 794 2 886 -64 q 991 182 914 45 q 1068 496 1068 319 q 991 809 1068 672 q 795 991 915 946 q 992 1055 887 1055 q 1167 1004 1084 1055 q 1330 776 1272 908 q 1389 496 1389 644 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 464 q 1383 384 1389 421 l 491 384 q 576 194 491 270 q 776 118 661 118 q 920 154 853 118 q 1025 255 987 190 l 1353 255 q 1221 37 1310 132 q 1014 -109 1132 -57 q 765 -160 895 -160 q 489 -96 620 -160 q 184 -186 312 -186 q 0 18 0 -186 q 35 231 0 107 q 119 408 48 277 q 488 878 274 687 q 157 604 345 817 q 376 952 205 816 q 765 1088 547 1088 q 800 1087 788 1088 q 1135 1178 997 1178 q 1225 1168 1185 1178 q 1299 1137 1266 1158 q 1350 1077 1332 1115 q 1369 988 1369 1039 q 1311 767 1369 898 q 1389 464 1389 625 m 1335 960 q 1294 1063 1335 1025 q 1187 1101 1252 1101 q 991 1046 1104 1101 q 1163 944 1084 1010 q 1295 793 1242 879 q 1335 960 1335 898 m 99 2 q 137 -101 99 -65 q 241 -137 174 -137 q 447 -73 330 -137 q 282 69 353 -17 q 175 259 211 155 q 99 2 99 100 m 490 554 l 1054 554 q 966 738 1050 664 q 772 811 883 811 q 577 738 660 811 q 490 554 494 664 z "},"飰�":{"ha":1587,"x_min":0,"x_max":1488,"o":"m 1389 223 l 1389 967 q 1382 985 1389 977 q 1364 992 1374 992 l 124 992 q 107 985 114 992 q 99 967 99 977 l 99 223 q 107 206 99 213 q 124 198 114 198 l 1364 198 q 1382 206 1374 198 q 1389 223 1389 213 m 1488 967 l 1488 223 q 1452 136 1488 172 q 1364 99 1415 99 l 794 99 l 794 0 l 1066 0 q 1084 -7 1077 0 q 1091 -25 1091 -14 l 1091 -74 q 1084 -92 1091 -85 q 1066 -99 1077 -99 l 422 -99 q 404 -92 411 -99 q 397 -74 397 -85 l 397 -25 q 404 -7 397 -14 q 422 0 411 0 l 694 0 l 694 99 l 124 99 q 36 136 73 99 q 0 223 0 172 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1364 1091 q 1452 1055 1415 1091 q 1488 967 1488 1018 z "},"飰�":{"ha":1389,"x_min":17,"x_max":1372,"o":"m 107 1091 l 260 1091 q 162 976 205 1042 q 116 887 134 932 q 93 789 98 841 q 86 696 88 738 q 95 594 85 655 q 111 496 104 533 q 133 391 118 460 q 137 369 136 376 q 200 114 177 184 q 318 -99 244 -19 l 107 -99 q 43 -73 70 -99 q 17 -9 17 -47 l 17 1001 q 43 1065 17 1039 q 107 1091 70 1091 m 1043 1091 l 1282 1091 q 1345 1065 1319 1091 q 1372 1001 1372 1039 l 1372 -9 q 1345 -73 1372 -47 q 1282 -99 1319 -99 l 1144 -99 q 1296 339 1308 64 l 932 260 q 923 197 931 226 q 899 141 915 168 q 853 95 883 114 q 780 67 823 76 q 626 98 685 47 q 585 145 601 119 q 545 245 569 171 q 495 445 522 319 q 460 649 468 571 q 456 756 452 726 q 474 816 460 787 q 522 873 489 848 q 601 908 555 898 q 666 913 636 917 q 718 899 696 908 q 760 872 740 891 q 793 835 780 854 q 820 791 807 816 l 1183 869 q 1043 1091 1130 1004 z "},"飰�":{"ha":1190,"x_min":11,"x_max":1086,"o":"m 1086 -9 l 1081 -13 q 880 -149 994 -101 q 635 -198 761 -198 q 389 -149 507 -198 q 188 -13 274 -100 q 53 187 101 74 q 11 333 20 267 q 48 361 8 355 q 91 346 88 367 q 92 343 92 345 q 128 219 106 273 q 246 44 167 123 q 421 -74 322 -32 q 635 -117 523 -117 q 849 -74 746 -117 q 1023 44 948 -31 l 1028 49 q 1047 53 1035 57 q 1073 36 1056 51 q 1086 -9 1101 8 m 720 468 l 669 417 l 718 368 q 712 330 734 352 q 687 317 699 317 q 673 325 680 317 l 625 372 l 574 321 q 562 317 570 317 q 538 329 550 317 l 536 331 q 522 353 522 343 q 529 367 522 359 l 580 417 l 529 468 q 539 503 516 481 q 563 517 553 517 q 574 513 568 517 l 624 462 l 674 512 q 711 502 688 525 q 720 468 732 481 m 1085 424 q 1049 247 1085 332 q 952 103 1015 166 q 807 5 890 41 q 630 -30 724 -30 q 453 5 536 -30 q 308 103 370 41 q 212 247 245 167 q 200 278 200 273 l 199 278 q 233 312 192 299 q 279 303 271 325 q 354 174 308 226 l 355 174 l 355 436 l 355 438 q 434 618 357 543 q 630 698 515 698 q 825 618 744 698 q 905 425 905 538 q 824 230 905 311 q 630 150 743 150 q 543 162 585 150 q 533 209 522 171 q 567 243 546 249 l 578 240 q 604 236 589 238 q 627 233 618 233 q 763 289 708 233 q 819 424 819 344 q 763 556 819 502 q 628 612 708 612 q 490 550 545 612 q 440 426 440 494 l 440 105 q 628 53 525 53 q 771 82 702 53 q 892 162 840 110 q 972 282 944 214 q 1001 424 1001 350 q 891 687 1001 577 q 629 795 783 795 q 365 687 474 795 q 305 619 324 646 l 304 618 q 294 606 298 609 q 277 598 290 602 q 247 601 264 594 q 219 613 231 605 q 207 634 207 622 l 207 1161 q 215 1182 207 1173 q 236 1190 223 1190 l 916 1190 q 939 1148 939 1190 q 916 1105 939 1105 l 288 1105 l 288 731 l 288 731 q 367 796 319 763 q 451 843 415 829 q 630 879 536 879 q 807 843 724 879 q 952 746 890 808 q 1049 601 1015 683 q 1085 424 1085 515 m 1061 874 q 1068 860 1068 868 q 1064 846 1068 853 q 1051 830 1059 840 q 1021 810 1031 810 q 1008 815 1014 810 q 848 918 926 886 q 634 962 749 962 q 431 924 531 962 q 396 953 410 916 q 390 982 389 972 q 402 997 392 994 q 634 1042 503 1042 q 879 992 761 1042 q 1061 874 985 947 z "},"飰�":{"ha":1389,"x_min":22,"x_max":1365,"o":"m 1202 47 q 1222 49 1214 51 q 1231 35 1231 47 q 1219 9 1231 24 q 1185 -24 1209 -3 q 1111 -77 1161 -46 q 1002 -134 1061 -109 q 856 -179 942 -160 q 678 -198 770 -198 q 494 -174 586 -198 q 332 -115 401 -150 q 198 -34 262 -80 q 95 47 134 11 q 30 115 57 83 q 22 127 24 122 q 23 137 21 133 q 29 142 26 140 q 38 144 33 144 q 47 140 43 143 q 280 12 196 50 q 899 -58 581 -125 q 1202 47 1046 -27 m 1363 136 q 1364 82 1371 123 q 1342 2 1358 40 q 1277 -94 1316 -62 q 1256 -101 1263 -105 q 1256 -82 1249 -97 q 1291 12 1273 -47 q 1296 88 1309 71 q 1284 97 1292 94 q 1263 102 1276 101 q 1240 104 1250 103 q 1213 104 1230 105 q 1189 102 1196 103 q 1165 100 1181 102 q 1147 98 1148 98 q 1137 97 1142 98 q 1128 96 1132 97 q 1122 96 1125 96 q 1116 95 1118 95 q 1112 95 1115 95 q 1109 95 1110 95 q 1106 96 1108 95 q 1105 97 1105 96 q 1104 99 1104 98 q 1140 130 1099 112 q 1220 153 1181 149 q 1304 154 1256 159 q 1363 136 1352 150 m 1057 479 q 1068 429 1057 455 q 1092 384 1078 404 q 1121 349 1107 365 q 1147 324 1136 332 l 1157 315 l 981 142 q 920 200 950 171 q 875 246 890 230 l 860 261 q 841 287 852 270 q 765 207 811 241 q 667 158 719 174 q 558 140 614 143 q 451 157 502 138 q 360 207 401 175 q 296 295 320 239 q 272 421 272 350 q 294 540 272 486 q 350 631 315 594 q 432 695 384 667 q 527 739 481 723 q 628 766 574 755 q 720 780 682 777 q 798 785 759 784 l 798 884 q 781 959 798 934 q 687 1000 755 1000 q 675 999 683 1000 q 643 990 667 998 q 600 967 620 981 q 556 921 580 953 q 519 846 533 889 l 291 867 q 308 960 291 914 q 360 1047 326 1005 q 444 1121 395 1089 q 562 1171 493 1152 q 709 1190 630 1190 q 849 1171 787 1190 q 950 1123 912 1152 q 1013 1059 987 1095 q 1047 992 1038 1023 q 1057 935 1057 962 l 1057 479 m 536 463 q 591 360 536 396 q 698 343 642 326 q 787 438 763 362 q 798 516 798 473 l 798 642 q 711 632 752 640 q 629 606 671 625 q 562 551 587 588 q 536 463 536 515 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 1190 992 q 1260 963 1231 992 q 1290 893 1290 933 l 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 l 99 -198 q 29 -169 59 -198 q 0 -99 0 -140 l 0 893 q 29 963 0 933 q 99 992 59 992 l 198 992 l 198 1066 q 235 1154 198 1118 q 322 1190 271 1190 l 372 1190 q 460 1154 423 1190 q 496 1066 496 1118 l 496 992 l 794 992 l 794 1066 q 830 1154 794 1118 q 918 1190 867 1190 l 967 1190 q 1055 1154 1018 1190 q 1091 1066 1091 1118 l 1091 992 l 1190 992 m 893 1066 l 893 843 q 900 825 893 832 q 918 818 907 818 l 967 818 q 985 825 978 818 q 992 843 992 832 l 992 1066 q 985 1084 992 1077 q 967 1091 978 1091 l 918 1091 q 900 1084 907 1091 q 893 1066 893 1077 m 298 1066 l 298 843 q 305 825 298 832 q 322 818 312 818 l 372 818 q 390 825 383 818 q 397 843 397 832 l 397 1066 q 390 1084 397 1077 q 372 1091 383 1091 l 322 1091 q 305 1084 312 1091 q 298 1066 298 1077 m 1190 -99 l 1190 694 l 99 694 l 99 -99 l 1190 -99 m 694 347 l 868 347 q 886 340 879 347 q 893 322 893 333 l 893 273 q 886 255 893 262 q 868 248 879 248 l 694 248 l 694 74 q 687 57 694 64 q 670 50 680 50 l 620 50 q 602 57 609 50 q 595 74 595 64 l 595 248 l 422 248 q 404 255 411 248 q 397 273 397 262 l 397 322 q 404 340 397 333 q 422 347 411 347 l 595 347 l 595 521 q 602 539 595 532 q 620 546 609 546 l 670 546 q 687 539 680 546 q 694 521 694 532 l 694 347 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 893 322 l 893 273 q 886 255 893 262 q 868 248 879 248 l 422 248 q 404 255 411 248 q 397 273 397 262 l 397 322 q 404 340 397 333 q 422 347 411 347 l 868 347 q 886 340 879 347 q 893 322 893 333 m 99 -99 l 1190 -99 l 1190 694 l 99 694 l 99 -99 m 397 843 l 397 1066 q 390 1084 397 1077 q 372 1091 383 1091 l 322 1091 q 305 1084 312 1091 q 298 1066 298 1077 l 298 843 q 305 825 298 832 q 322 818 312 818 l 372 818 q 390 825 383 818 q 397 843 397 832 m 992 843 l 992 1066 q 985 1084 992 1077 q 967 1091 978 1091 l 918 1091 q 900 1084 907 1091 q 893 1066 893 1077 l 893 843 q 900 825 893 832 q 918 818 907 818 l 967 818 q 985 825 978 818 q 992 843 992 832 m 1290 893 l 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 l 99 -198 q 29 -169 59 -198 q 0 -99 0 -140 l 0 893 q 29 963 0 933 q 99 992 59 992 l 198 992 l 198 1066 q 235 1154 198 1118 q 322 1190 271 1190 l 372 1190 q 460 1154 423 1190 q 496 1066 496 1118 l 496 992 l 794 992 l 794 1066 q 830 1154 794 1118 q 918 1190 867 1190 l 967 1190 q 1055 1154 1018 1190 q 1091 1066 1091 1118 l 1091 992 l 1190 992 q 1260 963 1231 992 q 1290 893 1290 933 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 861 117 l 825 81 q 808 74 818 74 q 791 81 798 74 l 645 228 l 499 81 q 481 74 491 74 q 464 81 471 74 l 429 117 q 422 134 422 124 q 429 152 422 144 l 575 298 l 429 443 q 422 461 422 451 q 429 478 422 471 l 464 514 q 481 521 471 521 q 499 514 491 521 l 645 368 l 791 514 q 808 521 798 521 q 825 514 818 521 l 861 478 q 868 461 868 471 q 861 443 868 451 l 715 298 l 861 152 q 868 134 868 144 q 861 117 868 124 m 99 -99 l 1190 -99 l 1190 694 l 99 694 l 99 -99 m 397 843 l 397 1066 q 390 1084 397 1077 q 372 1091 383 1091 l 322 1091 q 305 1084 312 1091 q 298 1066 298 1077 l 298 843 q 305 825 298 832 q 322 818 312 818 l 372 818 q 390 825 383 818 q 397 843 397 832 m 992 843 l 992 1066 q 985 1084 992 1077 q 967 1091 978 1091 l 918 1091 q 900 1084 907 1091 q 893 1066 893 1077 l 893 843 q 900 825 893 832 q 918 818 907 818 l 967 818 q 985 825 978 818 q 992 843 992 832 m 1290 893 l 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 l 99 -198 q 29 -169 59 -198 q 0 -99 0 -140 l 0 893 q 29 963 0 933 q 99 992 59 992 l 198 992 l 198 1066 q 235 1154 198 1118 q 322 1190 271 1190 l 372 1190 q 460 1154 423 1190 q 496 1066 496 1118 l 496 992 l 794 992 l 794 1066 q 830 1154 794 1118 q 918 1190 867 1190 l 967 1190 q 1055 1154 1018 1190 q 1091 1066 1091 1118 l 1091 992 l 1190 992 q 1260 963 1231 992 q 1290 893 1290 933 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 1010 443 l 613 47 q 595 40 605 40 q 577 47 585 40 l 354 270 q 347 288 347 277 q 354 305 347 298 l 390 340 q 407 347 397 347 q 425 340 417 347 l 595 170 l 939 514 q 957 521 947 521 q 974 514 967 521 l 1010 478 q 1017 461 1017 471 q 1010 443 1017 451 m 99 -99 l 1190 -99 l 1190 694 l 99 694 l 99 -99 m 397 843 l 397 1066 q 390 1084 397 1077 q 372 1091 383 1091 l 322 1091 q 305 1084 312 1091 q 298 1066 298 1077 l 298 843 q 305 825 298 832 q 322 818 312 818 l 372 818 q 390 825 383 818 q 397 843 397 832 m 992 843 l 992 1066 q 985 1084 992 1077 q 967 1091 978 1091 l 918 1091 q 900 1084 907 1091 q 893 1066 893 1077 l 893 843 q 900 825 893 832 q 918 818 907 818 l 967 818 q 985 825 978 818 q 992 843 992 832 m 1290 893 l 1290 -99 q 1260 -169 1290 -140 q 1190 -198 1231 -198 l 99 -198 q 29 -169 59 -198 q 0 -99 0 -140 l 0 893 q 29 963 0 933 q 99 992 59 992 l 198 992 l 198 1066 q 235 1154 198 1118 q 322 1190 271 1190 l 372 1190 q 460 1154 423 1190 q 496 1066 496 1118 l 496 992 l 794 992 l 794 1066 q 830 1154 794 1118 q 918 1190 867 1190 l 967 1190 q 1055 1154 1018 1190 q 1091 1066 1091 1118 l 1091 992 l 1190 992 q 1260 963 1231 992 q 1290 893 1290 933 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 347 1190 q 382 1176 367 1190 q 397 1141 397 1161 l 397 450 l 812 783 q 843 794 825 794 q 878 779 863 794 q 893 744 893 764 l 893 450 l 1308 783 q 1339 794 1321 794 q 1374 779 1359 794 q 1389 744 1389 764 l 1389 -149 q 1374 -184 1389 -169 q 1339 -198 1359 -198 l 50 -198 q 15 -184 29 -198 q 0 -149 0 -169 l 0 1141 q 15 1176 0 1161 q 50 1190 29 1190 l 347 1190 z "},"飰�":{"ha":794,"x_min":0,"x_max":794,"o":"m 298 359 q 397 347 346 347 q 496 359 448 347 l 496 -149 q 481 -184 496 -169 q 446 -198 467 -198 l 347 -198 q 312 -184 327 -198 q 298 -149 298 -169 l 298 359 m 116 1074 q 174 1132 116 1074 q 397 1190 233 1190 q 677 1074 561 1190 q 794 794 794 958 q 677 513 794 629 q 397 397 561 397 q 116 513 233 397 q 0 794 0 629 q 116 1074 0 958 m 397 1017 q 415 1024 408 1017 q 422 1042 422 1031 q 415 1059 422 1053 q 397 1066 408 1066 q 204 987 284 1066 q 124 794 124 907 q 131 776 124 783 q 149 769 138 769 q 167 776 160 769 q 174 794 174 783 q 239 951 174 886 q 397 1017 305 1017 z "},"飰�":{"ha":1389,"x_min":29,"x_max":1360,"o":"m 1352 960 q 1360 942 1360 953 q 1352 925 1360 932 l 1243 815 q 1190 794 1221 794 l 149 794 q 114 808 129 794 q 99 843 99 823 l 99 1042 q 114 1077 99 1062 q 149 1091 129 1091 l 595 1091 l 595 1141 q 610 1176 595 1161 q 645 1190 625 1190 l 744 1190 q 779 1176 764 1190 q 794 1141 794 1161 l 794 1091 l 1190 1091 q 1243 1070 1221 1091 l 1352 960 m 595 248 l 794 248 l 794 -149 q 779 -184 794 -169 q 744 -198 764 -198 l 645 -198 q 610 -184 625 -198 q 595 -149 595 -169 l 595 248 m 1240 595 q 1275 581 1260 595 q 1290 546 1290 566 l 1290 347 q 1275 312 1290 327 q 1240 298 1260 298 l 198 298 q 146 319 167 298 l 36 429 q 29 446 29 436 q 36 464 29 457 l 146 574 q 198 595 167 595 l 595 595 l 595 744 l 794 744 l 794 595 l 1240 595 z "},"飰�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1566 1182 q 1587 1141 1587 1166 l 1587 50 q 1579 22 1587 34 q 1556 4 1570 9 l 1060 -195 q 1023 -195 1042 -203 l 546 -4 l 68 -195 q 50 -198 60 -198 q 22 -190 35 -198 q 0 -149 0 -174 l 0 942 q 9 970 0 958 q 31 988 17 983 l 527 1187 q 564 1187 546 1195 l 1042 996 l 1519 1187 q 1566 1182 1544 1197 m 570 1077 l 570 93 l 1017 -85 l 1017 899 l 570 1077 m 99 909 l 99 -75 l 521 93 l 521 1077 l 99 909 m 1488 83 l 1488 1067 l 1066 899 l 1066 -85 l 1488 83 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 397 1190 q 414 1183 407 1190 q 422 1166 422 1176 l 422 25 q 408 3 422 9 l 36 -195 q 25 -198 31 -198 q 7 -191 15 -198 q 0 -174 0 -184 l 0 967 q 13 989 0 983 l 385 1187 q 397 1190 391 1190 m 1364 1190 q 1382 1183 1374 1190 q 1389 1166 1389 1176 l 1389 25 q 1376 3 1389 9 l 1004 -195 q 992 -198 998 -198 q 975 -191 982 -198 q 967 -174 967 -184 l 967 967 q 980 989 967 983 l 1352 1187 q 1364 1190 1358 1190 m 496 1190 q 507 1188 502 1190 l 904 990 q 918 967 918 982 l 918 -174 q 910 -191 918 -184 q 893 -198 903 -198 q 882 -196 887 -198 l 485 2 q 471 25 471 10 l 471 1166 q 479 1183 471 1176 q 496 1190 486 1190 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 467 426 q 481 440 467 426 q 496 496 496 455 q 467 566 496 537 q 397 595 438 595 q 327 566 356 595 q 298 496 298 537 q 327 426 298 455 q 397 397 356 397 q 467 426 438 397 m 765 426 q 779 440 765 426 q 794 496 794 455 q 765 566 794 537 q 694 595 736 595 q 624 566 653 595 q 595 496 595 537 q 624 426 595 455 q 694 397 653 397 q 765 426 736 397 m 1062 426 q 1077 440 1062 426 q 1091 496 1091 455 q 1062 566 1091 537 q 992 595 1033 595 q 922 566 951 595 q 893 496 893 537 q 922 426 893 455 q 992 397 951 397 q 1062 426 1033 397 m 1296 745 q 1342 688 1296 745 q 1389 496 1389 631 q 1296 247 1389 361 q 1043 66 1203 133 q 694 0 884 0 q 531 14 609 0 q 194 -164 397 -120 q 127 -174 153 -171 q 110 -169 118 -174 q 100 -155 102 -164 q 115 -126 97 -143 q 134 -110 119 -122 q 153 -91 148 -97 q 172 -72 159 -86 q 190 -47 184 -57 q 206 -19 196 -37 q 222 19 216 0 q 233 63 227 37 q 243 119 239 89 q 65 287 129 189 q 0 496 0 385 q 93 745 0 631 q 346 926 186 860 q 694 992 505 992 q 1043 926 884 992 q 1296 745 1203 860 z "},"飰�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 467 566 q 481 552 467 566 q 496 496 496 537 q 467 426 496 455 q 397 397 438 397 q 327 426 356 397 q 298 496 298 455 q 327 566 298 537 q 397 595 356 595 q 467 566 438 595 m 765 566 q 779 552 765 566 q 794 496 794 537 q 765 426 794 455 q 694 397 736 397 q 624 426 653 397 q 595 496 595 455 q 624 566 595 537 q 694 595 653 595 q 765 566 736 595 m 1062 566 q 1077 552 1062 566 q 1091 496 1091 537 q 1062 426 1091 455 q 992 397 1033 397 q 922 426 951 397 q 893 496 893 455 q 922 566 893 537 q 992 595 951 595 q 1062 566 1033 595 m 990 839 q 921 866 990 839 q 694 893 853 893 q 399 839 536 893 q 180 694 261 785 q 99 496 99 602 q 155 331 99 409 q 311 195 210 252 l 378 156 l 357 81 q 303 -52 339 11 q 516 81 421 -3 l 550 110 l 594 105 q 694 99 647 99 q 990 153 853 99 q 1209 298 1128 207 q 1290 496 1290 390 q 1209 694 1290 602 q 990 839 1128 785 m 1389 496 q 1296 247 1389 361 q 1043 66 1203 133 q 694 0 884 0 q 582 6 640 0 q 226 -181 429 -129 q 137 -198 188 -192 l 133 -198 q 112 -190 122 -198 q 100 -169 103 -182 l 100 -168 q 100 -159 98 -165 q 101 -151 102 -153 q 105 -144 101 -150 q 109 -137 109 -138 q 115 -130 110 -136 q 121 -123 119 -125 q 145 -96 126 -117 q 172 -67 164 -76 q 196 -36 180 -58 q 221 3 212 -15 q 242 49 230 21 q 262 108 253 77 q 70 278 140 177 q 0 496 0 380 q 55 689 0 597 q 203 847 110 780 q 425 953 296 914 q 694 992 553 992 q 964 953 836 992 q 1186 847 1093 914 q 1334 689 1279 780 q 1389 496 1389 597 z "},"飰�":{"ha":794,"x_min":0,"x_max":794,"o":"m 397 267 l 794 496 l 794 38 l 397 -191 l 397 267 m 0 496 l 0 38 l 397 267 l 0 496 m 397 1184 l 397 725 l 0 496 l 0 954 l 397 1184 m 397 725 l 794 954 l 794 496 l 397 725 z "},"飰�":{"ha":1389,"x_min":64,"x_max":1325,"o":"m 1325 789 q 1067 284 1317 606 q 632 -50 809 -50 q 446 154 522 -50 q 343 528 412 278 q 222 731 288 731 q 123 672 208 731 l 64 748 q 147 823 82 764 q 248 912 212 881 q 435 1025 369 1019 q 553 982 508 1032 q 616 825 598 932 q 667 536 650 602 q 760 343 710 343 q 880 467 800 343 q 964 658 958 592 q 880 766 974 766 q 786 746 836 766 q 1142 1042 879 1050 q 1325 789 1336 1035 z "},"飰�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 0 1091 l 1190 1091 l 1190 -99 l 0 -99 l 0 1091 m 841 227 l 670 716 l 841 946 l 350 946 l 521 716 l 350 227 l 595 -9 l 841 227 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 0 1091 l 1190 1091 l 1190 -99 l 0 -99 l 0 1091 m 704 843 l 694 818 l 753 753 l 729 665 l 748 646 l 831 690 l 914 646 l 933 665 l 909 753 l 967 818 l 958 843 l 884 843 l 843 918 l 818 918 l 777 843 l 704 843 m 497 717 q 531 705 522 717 q 540 656 541 692 l 675 672 q 662 744 675 715 q 622 787 648 773 q 569 807 597 801 q 503 812 541 812 q 349 768 400 812 q 298 626 298 723 l 298 570 l 223 570 l 223 471 l 282 471 q 298 465 298 471 l 298 169 q 294 153 298 158 q 280 148 290 149 l 223 143 l 223 74 l 570 74 l 570 141 l 455 152 q 448 153 450 153 q 446 155 446 153 q 445 158 445 157 q 446 164 446 160 q 446 171 446 167 l 446 471 l 594 471 l 624 570 l 445 570 q 443 575 440 570 q 446 582 446 580 l 446 644 q 448 675 446 665 q 453 697 449 686 q 469 713 458 708 q 497 717 479 717 m 967 74 l 967 141 l 925 148 q 918 150 920 149 q 916 152 916 151 q 917 158 916 153 q 918 167 918 163 l 918 570 l 705 570 l 687 492 l 751 475 q 769 454 769 470 l 769 167 q 764 153 769 157 q 749 148 760 150 l 694 141 l 694 74 l 967 74 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 535 q 1366 453 1389 490 q 1304 397 1343 416 q 1314 322 1314 361 q 1231 100 1314 202 q 1006 -62 1149 -2 q 696 -121 863 -121 q 386 -62 529 -121 q 162 100 244 -2 q 79 322 79 202 q 88 395 79 359 q 24 452 48 415 q 0 535 0 490 q 45 644 0 598 q 154 689 90 689 q 267 640 220 689 q 666 766 436 758 l 756 1170 q 767 1186 758 1180 q 787 1190 777 1192 l 1073 1127 q 1115 1173 1087 1156 q 1177 1190 1143 1190 q 1259 1157 1225 1190 q 1293 1075 1293 1123 q 1259 993 1293 1027 q 1177 959 1225 959 q 1095 992 1128 959 q 1061 1074 1061 1026 l 802 1132 l 722 766 q 1124 642 954 759 q 1235 689 1169 689 q 1344 644 1299 689 q 1389 535 1389 598 m 324 381 q 358 298 324 332 q 439 264 391 264 q 522 298 488 264 q 556 381 556 332 q 522 462 556 429 q 439 496 488 496 q 358 462 392 496 q 324 381 324 428 m 952 105 q 960 126 960 114 q 952 146 960 137 q 932 153 944 153 q 912 146 921 153 q 818 98 880 113 q 694 82 756 82 q 570 98 632 82 q 477 146 508 113 q 457 153 468 153 q 437 146 445 153 q 429 126 429 138 q 437 105 429 114 q 529 53 470 72 q 624 30 587 33 q 694 26 660 26 q 765 30 729 26 q 860 53 801 33 q 952 105 918 72 m 867 298 q 884 281 867 298 q 949 264 901 264 q 1031 298 997 264 q 1065 381 1065 332 q 1031 462 1065 428 q 949 496 997 496 q 867 462 901 496 q 833 381 833 429 q 867 298 833 332 z "},"飱�":{"ha":1389,"x_min":53,"x_max":1335,"o":"m 53 574 l 54 574 q 100 761 67 672 q 189 930 133 851 q 319 1066 245 1008 q 492 1157 392 1124 q 706 1190 591 1190 q 1027 1109 885 1190 q 1255 873 1169 1027 q 1335 531 1335 729 l 1335 385 l 463 385 q 505 236 464 299 q 611 141 546 173 q 758 97 676 109 q 923 95 839 84 q 1084 131 1006 105 q 1218 196 1162 157 l 1218 -96 q 1041 -167 1147 -139 q 798 -197 934 -196 q 553 -156 663 -198 q 312 37 407 -99 q 215 326 217 174 q 301 645 213 513 q 553 853 390 777 q 493 755 516 806 q 457 632 470 705 l 949 632 q 943 740 956 691 q 907 819 931 789 q 852 870 883 849 q 790 902 822 892 q 732 918 758 912 q 688 925 705 924 l 671 925 q 470 891 567 922 q 297 810 374 860 q 160 701 220 760 q 53 574 101 643 z "},"飱�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 0 25 l 0 496 l 1786 496 l 1786 25 q 1749 -63 1786 -26 q 1662 -99 1713 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 m 496 198 l 496 99 l 794 99 l 794 198 l 496 198 m 198 198 l 198 99 l 397 99 l 397 198 l 198 198 m 1662 1091 q 1749 1055 1713 1091 q 1786 967 1786 1018 l 1786 794 l 0 794 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1662 1091 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1335,"o":"m 1228 191 l 1059 277 q 906 130 1001 184 q 702 77 811 77 q 492 133 588 77 q 340 284 396 188 q 284 494 284 381 q 317 656 284 579 q 407 789 350 733 q 540 879 463 846 q 702 911 617 911 q 894 865 804 911 q 1043 734 984 818 l 1210 831 q 988 1036 1125 962 q 694 1111 851 1111 q 456 1062 570 1111 q 260 931 342 1013 q 129 735 177 849 q 80 496 80 621 q 129 257 80 371 q 260 61 177 143 q 456 -70 342 -21 q 694 -119 570 -119 q 1003 -36 860 -119 q 1228 191 1146 47 m 798 498 l 1335 226 q 1076 -84 1246 29 q 694 -198 907 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 1059 1087 896 1190 q 1319 803 1222 984 l 798 498 m 1196 496 l 1166 496 l 1166 372 l 1091 372 l 1091 645 l 1197 645 q 1239 629 1221 645 q 1261 592 1256 614 q 1262 549 1266 570 q 1240 512 1258 527 q 1196 496 1223 496 z "},"飱�":{"ha":1389,"x_min":25,"x_max":1364,"o":"m 1106 641 l 630 940 l 701 1057 l 1364 1057 l 1106 641 m 314 436 l 171 525 l 171 1190 l 1088 615 l 314 436 m 1104 540 l 1218 467 l 1218 -198 l 805 61 l 1104 540 m 1075 556 l 687 -65 l 25 -65 l 301 377 l 1075 556 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1290,"o":"m 496 409 l 496 583 q 484 595 496 595 l 409 595 q 397 583 397 595 l 397 409 q 409 397 397 397 l 484 397 q 496 409 496 397 m 893 409 l 893 583 q 880 595 893 595 l 806 595 q 794 583 794 595 l 794 409 q 806 397 794 397 l 880 397 q 893 409 893 397 m 1290 384 l 1290 -198 l 794 -198 l 794 50 q 750 155 794 112 q 645 198 707 198 q 539 155 583 198 q 496 50 496 112 l 496 -198 l 0 -198 l 0 384 q 12 397 0 397 l 87 397 q 99 384 99 397 l 99 298 l 198 298 l 198 781 q 211 794 198 794 l 285 794 q 298 781 298 794 l 298 694 l 397 694 l 397 781 q 409 794 397 794 l 484 794 q 496 781 496 794 l 496 694 l 595 694 l 595 781 q 597 789 595 786 q 604 792 599 791 q 611 794 608 794 q 620 794 614 794 q 627 794 626 794 l 627 1097 q 602 1135 602 1108 q 615 1166 602 1153 q 645 1178 628 1178 q 675 1166 662 1178 q 687 1135 687 1153 q 663 1097 687 1108 l 663 1084 q 727 1091 698 1091 q 773 1085 743 1091 q 815 1080 803 1080 q 852 1085 829 1080 q 880 1091 875 1091 q 893 1079 893 1091 l 893 916 q 866 899 893 904 q 818 894 839 894 q 775 900 804 894 q 732 906 747 906 q 663 897 701 906 l 663 794 q 670 794 663 794 q 679 794 676 794 q 686 792 681 794 q 693 789 691 791 q 694 781 694 786 l 694 694 l 794 694 l 794 781 q 806 794 794 794 l 880 794 q 893 781 893 794 l 893 694 l 992 694 l 992 781 q 1004 794 992 794 l 1079 794 q 1091 781 1091 794 l 1091 298 l 1190 298 l 1190 384 q 1203 397 1190 397 l 1277 397 q 1290 384 1290 397 z "},"飱�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1773 567 q 1786 546 1786 560 q 1773 525 1786 531 l 1525 376 q 1513 372 1519 372 q 1500 375 1506 372 q 1488 397 1488 383 l 1488 496 l 823 496 q 887 368 852 451 q 906 326 900 339 q 925 288 913 312 q 946 251 937 264 q 967 225 955 239 q 991 205 979 211 q 1017 198 1004 198 l 1091 198 l 1091 273 q 1098 291 1091 284 q 1116 298 1105 298 l 1364 298 q 1382 291 1375 298 q 1389 273 1389 284 l 1389 25 q 1382 7 1389 14 q 1364 0 1375 0 l 1116 0 q 1098 7 1105 0 q 1091 25 1091 14 l 1091 99 l 1017 99 q 970 107 992 99 q 930 125 947 115 q 895 157 913 136 q 867 192 877 177 q 841 236 856 207 q 818 281 825 266 q 797 328 811 296 q 768 391 779 369 q 740 441 757 413 q 706 483 723 470 q 670 496 688 496 l 391 496 q 320 389 374 431 q 198 347 267 347 q 58 405 116 347 q 0 546 0 463 q 58 686 0 628 q 198 744 116 744 q 320 702 267 744 q 391 595 374 660 l 471 595 q 507 608 490 595 q 542 650 525 622 q 570 700 559 678 q 598 763 581 722 q 620 810 613 795 q 642 855 627 825 q 668 899 657 884 q 697 935 679 914 q 732 966 715 956 q 771 984 749 977 q 818 992 794 992 l 901 992 q 956 1064 918 1036 q 1042 1091 994 1091 q 1147 1048 1104 1091 q 1190 942 1190 1004 q 1147 837 1190 880 q 1042 794 1104 794 q 956 821 994 794 q 901 893 918 849 l 818 893 q 793 887 805 893 q 768 867 780 880 q 748 840 756 853 q 727 804 739 828 q 708 766 715 780 q 689 723 701 752 q 625 595 653 640 l 1488 595 l 1488 694 q 1500 716 1488 708 q 1525 715 1513 724 l 1773 567 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 861 674 q 876 659 861 674 q 891 600 891 643 q 861 526 891 556 q 787 496 830 496 l 591 496 l 591 705 l 787 705 q 861 674 830 705 m 959 428 q 994 464 959 428 q 1030 600 1030 499 q 959 772 1030 701 q 787 843 888 843 l 451 843 l 451 149 l 591 149 l 591 357 l 787 357 q 959 428 887 357 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飱�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1275 339 q 1249 422 1275 385 q 1181 475 1222 459 q 1163 404 1176 440 q 1142 374 1158 385 q 1108 363 1126 363 q 1089 366 1098 363 q 1054 396 1065 374 q 1051 441 1043 418 q 1069 552 1069 496 q 1022 728 1069 647 q 893 856 974 809 q 716 904 811 904 q 525 847 612 904 q 395 697 437 791 q 541 615 479 675 q 558 572 558 597 q 541 530 558 547 q 499 513 524 513 q 457 530 474 513 q 317 588 398 588 q 177 531 235 588 q 119 391 119 473 q 177 251 119 308 q 317 193 235 193 l 1128 193 q 1232 236 1189 193 q 1275 339 1275 279 m 1394 339 q 1316 152 1394 229 q 1128 74 1238 74 l 317 74 q 93 167 186 74 q 0 391 0 260 q 78 598 0 509 q 270 703 155 686 q 442 934 319 846 q 716 1022 565 1022 q 1033 899 898 1022 q 1185 598 1167 777 q 1334 506 1275 578 q 1394 339 1394 433 m 1587 339 q 1512 92 1587 204 q 1463 67 1494 67 q 1429 77 1444 67 q 1404 114 1409 90 q 1414 159 1400 139 q 1469 339 1469 239 q 1414 520 1469 439 q 1404 564 1400 540 q 1429 602 1409 588 q 1474 611 1449 616 q 1512 586 1498 606 q 1587 339 1587 476 m 1682 682 q 1786 339 1786 529 q 1682 -4 1786 150 q 1632 -30 1664 -30 q 1600 -20 1614 -30 q 1575 18 1580 -6 q 1583 62 1569 42 q 1667 339 1667 189 q 1583 616 1667 491 q 1575 661 1569 636 q 1600 698 1580 685 q 1644 708 1620 712 q 1682 682 1668 703 z "},"飱�":{"ha":1190,"x_min":28,"x_max":1163,"o":"m 1163 -10 q 1114 -128 1163 -79 q 995 -177 1065 -177 q 876 -128 925 -177 q 827 -10 827 -79 q 876 109 827 60 q 995 158 925 158 q 1114 109 1065 158 q 1163 -10 1163 60 m 982 208 q 833 128 893 196 q 773 -31 773 60 q 798 -138 773 -88 q 505 -198 685 -198 q 349 -182 420 -198 q 230 -140 277 -166 q 144 -81 182 -114 q 85 -15 106 -47 q 51 50 64 18 q 33 101 37 81 q 28 132 28 121 q 31 165 28 146 q 46 208 35 183 q 74 253 57 233 q 124 287 91 273 q 197 301 156 301 q 270 287 238 301 q 319 255 301 274 q 346 214 336 237 q 360 176 357 191 q 363 150 363 161 q 345 88 363 124 q 408 55 367 67 q 481 42 450 43 l 512 41 q 659 81 601 41 q 717 184 717 120 q 710 221 717 204 q 686 256 703 239 q 647 288 668 273 q 590 322 626 302 q 517 358 553 341 q 425 402 481 376 q 391 418 403 412 q 246 495 301 460 q 152 574 191 530 q 96 672 112 618 q 80 798 80 725 q 96 914 80 858 q 147 1020 112 970 q 234 1109 182 1071 q 363 1168 286 1146 q 535 1190 440 1190 q 705 1170 628 1190 q 833 1118 783 1150 q 918 1046 883 1087 q 967 964 953 1004 q 982 884 982 923 q 970 820 982 848 q 942 775 959 791 q 904 747 925 758 q 867 732 884 736 q 836 728 849 728 q 830 728 835 728 q 805 728 815 728 q 775 732 795 728 q 741 742 755 736 q 709 764 727 749 q 680 800 691 779 q 662 854 670 821 q 654 930 654 888 q 608 950 643 942 q 546 958 574 957 l 517 959 q 426 935 464 959 q 371 880 388 911 q 355 822 355 850 q 359 788 355 803 q 377 753 363 773 q 419 713 392 732 q 494 672 445 694 q 610 626 543 649 q 717 585 669 607 q 802 542 766 563 q 866 496 838 521 q 913 450 894 471 q 945 401 932 429 q 965 353 958 374 q 977 304 973 332 q 981 256 980 276 q 982 208 982 236 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 546 273 l 546 719 q 539 737 546 730 q 521 744 532 744 l 322 744 q 305 737 312 744 q 298 719 298 730 l 298 273 q 305 255 298 262 q 322 248 312 248 l 521 248 q 539 255 532 248 q 546 273 546 262 m 893 273 l 893 719 q 886 737 893 730 q 868 744 879 744 l 670 744 q 652 737 659 744 q 645 719 645 730 l 645 273 q 652 255 645 262 q 670 248 659 248 l 868 248 q 886 255 879 248 q 893 273 893 262 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 296 1011 q 365 1051 296 1011 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 m 384 131 q 432 103 384 131 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 m 670 248 q 652 255 659 248 q 645 273 645 262 l 645 719 q 652 737 645 730 q 670 744 659 744 l 818 744 q 836 737 829 744 q 843 719 843 730 l 843 273 q 836 255 843 262 q 818 248 829 248 l 670 248 m 372 248 q 354 255 361 248 q 347 273 347 262 l 347 719 q 354 737 347 730 q 372 744 361 744 l 521 744 q 539 737 532 744 q 546 719 546 730 l 546 273 q 539 255 546 262 q 521 248 532 248 l 372 248 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 843 273 l 843 719 q 836 737 843 730 q 818 744 829 744 l 372 744 q 354 737 361 744 q 347 719 347 730 l 347 273 q 354 255 347 262 q 372 248 361 248 l 818 248 q 836 255 829 248 q 843 273 843 262 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 296 1011 q 365 1051 296 1011 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 m 384 131 q 432 103 384 131 q 595 74 481 74 q 807 131 710 74 q 960 284 904 188 q 1017 496 1017 381 q 960 708 1017 611 q 807 861 904 805 q 595 918 710 918 q 384 861 481 918 q 230 708 287 805 q 174 496 174 611 q 230 284 174 381 q 384 131 287 188 m 372 248 q 354 255 361 248 q 347 273 347 262 l 347 719 q 354 737 347 730 q 372 744 361 744 l 818 744 q 836 737 829 744 q 843 719 843 730 l 843 273 q 836 255 843 262 q 818 248 829 248 l 372 248 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1362 99 l 1389 -143 q 1376 -182 1391 -165 q 1339 -198 1362 -198 l 50 -198 q 12 -182 27 -198 q 0 -143 -2 -165 l 27 99 l 1362 99 m 1290 749 l 1356 149 l 33 149 l 99 749 q 115 781 102 768 q 149 794 129 794 l 347 794 l 347 694 q 376 624 347 653 q 446 595 405 595 q 517 624 488 595 q 546 694 546 653 l 546 794 l 843 794 l 843 694 q 872 624 843 653 q 942 595 901 595 q 1013 624 984 595 q 1042 694 1042 653 l 1042 794 l 1240 794 q 1273 781 1259 794 q 1290 749 1287 768 m 992 893 l 992 694 q 977 660 992 674 q 942 645 963 645 q 908 660 922 645 q 893 694 893 674 l 893 893 q 835 1033 893 975 q 694 1091 777 1091 q 554 1033 612 1091 q 496 893 496 975 l 496 694 q 481 660 496 674 q 446 645 467 645 q 412 660 426 645 q 397 694 397 674 l 397 893 q 484 1103 397 1016 q 694 1190 571 1190 q 905 1103 818 1190 q 992 893 992 1016 z "},"飱�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 1488 595 q 1558 566 1529 595 q 1587 496 1587 537 q 1558 426 1587 455 q 1488 397 1529 397 l 1476 397 l 1387 -116 q 1353 -175 1381 -152 q 1290 -198 1325 -198 l 298 -198 q 234 -175 262 -198 q 200 -116 206 -152 l 111 397 l 99 397 q 29 426 58 397 q 0 496 0 455 q 29 566 0 537 q 99 595 58 595 l 1488 595 m 376 -25 q 410 -7 396 -23 q 422 29 423 9 l 397 351 q 379 385 395 371 q 343 397 363 398 q 310 379 323 395 q 298 343 296 363 l 322 21 q 338 -12 324 2 q 372 -25 353 -25 l 376 -25 m 694 25 l 694 347 q 680 382 694 367 q 645 397 665 397 q 610 382 625 397 q 595 347 595 367 l 595 25 q 610 -10 595 5 q 645 -25 625 -25 q 680 -10 665 -25 q 694 25 694 5 m 992 25 l 992 347 q 977 382 992 367 q 942 397 963 397 q 908 382 922 397 q 893 347 893 367 l 893 25 q 908 -10 893 5 q 942 -25 922 -25 q 977 -10 963 -25 q 992 25 992 5 m 1265 21 l 1290 343 q 1278 379 1291 363 q 1244 397 1264 395 q 1208 385 1224 398 q 1190 351 1192 371 l 1166 29 q 1178 -7 1164 9 q 1211 -25 1191 -23 l 1215 -25 q 1249 -12 1235 -25 q 1265 21 1263 2 m 369 964 l 297 645 l 195 645 l 273 987 q 342 1098 288 1055 q 466 1141 396 1141 l 595 1141 q 610 1176 595 1161 q 645 1190 625 1190 l 942 1190 q 977 1176 963 1190 q 992 1141 992 1161 l 1121 1141 q 1246 1098 1191 1141 q 1314 987 1300 1055 l 1393 645 l 1290 645 l 1218 964 q 1183 1020 1210 998 q 1121 1042 1156 1042 l 992 1042 q 977 1007 992 1022 q 942 992 963 992 l 645 992 q 610 1007 625 992 q 595 1042 595 1022 l 466 1042 q 404 1020 431 1042 q 369 964 377 998 z "},"飱�":{"ha":1389,"x_min":26,"x_max":1363,"o":"m 768 397 l 818 595 l 621 595 l 571 397 l 768 397 m 1363 787 l 1320 614 q 1296 595 1314 595 l 1042 595 l 993 397 l 1234 397 q 1253 388 1246 397 q 1258 366 1261 377 l 1215 192 q 1190 174 1211 174 l 937 174 l 874 -81 q 850 -99 869 -99 l 677 -99 q 656 -90 664 -99 q 652 -68 649 -81 l 712 174 l 515 174 l 453 -81 q 429 -99 447 -99 l 254 -99 q 235 -90 243 -99 q 230 -68 228 -81 l 291 174 l 50 174 q 30 183 38 174 q 26 205 23 192 l 69 378 q 93 397 74 397 l 346 397 l 396 595 l 155 595 q 136 605 143 595 q 131 626 128 615 l 174 800 q 198 818 178 818 l 452 818 l 515 1073 q 539 1091 520 1091 l 713 1091 q 732 1082 725 1091 q 737 1060 739 1073 l 677 818 l 873 818 l 936 1073 q 961 1091 942 1091 l 1135 1091 q 1154 1082 1146 1091 q 1159 1060 1161 1073 l 1098 818 l 1339 818 q 1359 809 1351 818 q 1363 787 1366 800 z "},"飱�":{"ha":1190,"x_min":83,"x_max":1108,"o":"m 652 374 l 767 260 l 651 144 l 652 374 m 651 848 l 767 732 l 652 618 l 651 848 m 550 -101 l 910 259 l 673 496 l 910 733 l 550 1093 l 550 619 l 353 817 l 281 745 l 529 496 l 281 247 l 353 175 l 550 373 l 550 -101 m 1083 779 q 1095 719 1083 779 q 1108 496 1108 658 q 1083 213 1108 334 q 1015 14 1058 91 q 906 -112 972 -64 q 765 -179 840 -160 q 595 -198 691 -198 q 425 -179 500 -198 q 284 -112 350 -160 q 176 14 219 -64 q 108 213 133 91 q 83 496 83 334 q 108 779 83 658 q 176 979 133 901 q 284 1104 219 1056 q 425 1171 350 1152 q 595 1190 500 1190 q 765 1171 691 1190 q 906 1104 840 1152 q 1015 979 972 1056 q 1083 779 1058 901 z "},"飱�":{"ha":794,"x_min":31,"x_max":763,"o":"m 462 88 l 596 221 l 462 354 l 462 88 m 462 638 l 596 771 l 462 904 l 462 638 m 487 496 l 763 220 l 345 -198 l 345 353 l 115 123 l 31 207 l 319 496 l 31 785 l 115 869 l 345 639 l 345 1190 l 763 772 l 487 496 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 963 129 q 977 143 963 129 q 992 198 992 158 q 963 268 992 239 q 893 298 933 298 q 823 268 853 298 q 794 198 794 239 q 823 129 794 158 q 893 99 853 99 q 963 129 933 99 m 367 724 q 382 739 367 724 q 397 794 397 753 q 367 863 397 834 q 298 893 338 893 q 228 863 257 893 q 198 794 198 834 q 228 724 198 753 q 298 694 257 694 q 367 724 338 694 m 1103 409 q 1147 365 1103 409 q 1190 198 1190 322 q 1103 -12 1190 75 q 893 -99 1016 -99 q 682 -12 770 -99 q 595 198 595 75 q 682 409 595 322 q 893 496 770 496 q 1103 409 1016 496 m 1116 1042 q 1106 1012 1116 1026 l 288 -79 q 248 -99 273 -99 l 124 -99 q 89 -84 104 -99 q 74 -50 74 -70 q 84 -20 74 -34 l 903 1071 q 942 1091 918 1091 l 1066 1091 q 1101 1077 1087 1091 q 1116 1042 1116 1062 m 508 1004 q 552 960 508 1004 q 595 794 595 917 q 508 583 595 670 q 298 496 421 496 q 87 583 174 496 q 0 794 0 670 q 87 1004 0 917 q 298 1091 174 1091 q 508 1004 421 1091 z "},"飱�":{"ha":1389,"x_min":2,"x_max":1387,"o":"m 81 643 l 694 -143 l 22 345 q 2 372 8 355 q 2 405 -3 388 l 81 643 l 81 643 m 439 643 l 950 643 l 694 -143 l 694 -143 l 439 643 m 285 1118 l 439 643 l 81 643 l 234 1118 q 260 1135 240 1135 q 285 1118 279 1135 m 1308 643 l 1387 405 q 1387 372 1392 388 q 1367 345 1381 355 l 694 -143 l 1308 643 l 1308 643 m 1308 643 l 950 643 l 1104 1118 q 1129 1135 1110 1135 q 1155 1118 1149 1135 l 1308 643 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 298 546 l 422 546 l 422 719 l 298 719 l 298 546 m 946 288 l 946 360 q 758 330 866 332 q 557 366 653 329 q 386 461 460 403 l 387 387 q 551 287 455 325 q 762 250 647 250 q 946 288 862 250 m 496 546 l 992 546 l 992 719 l 496 719 l 496 546 m 1389 570 q 1312 298 1389 426 q 1381 120 1381 219 q 1281 -88 1381 -2 q 1038 -174 1180 -174 q 863 -133 943 -174 q 739 -24 784 -92 q 694 -25 724 -25 q 650 -24 665 -25 q 525 -133 605 -92 q 351 -174 446 -174 q 108 -88 208 -174 q 8 120 8 -2 q 77 298 8 219 q 0 570 0 426 q 93 869 0 732 q 346 1086 186 1006 q 694 1166 506 1166 q 1043 1086 883 1166 q 1296 869 1203 1006 q 1389 570 1389 732 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 399 484 l 399 385 l 204 385 l 204 484 l 399 484 m 399 682 l 399 584 l 204 584 l 204 682 l 399 682 m 987 286 l 987 187 l 722 187 l 722 286 l 987 286 m 987 484 l 987 385 l 466 385 l 466 484 l 987 484 m 987 682 l 987 584 l 466 584 l 466 682 l 987 682 m 1091 16 l 1091 977 q 1087 987 1091 983 q 1076 992 1082 992 l 1051 992 l 758 794 l 595 926 l 432 794 l 140 992 l 115 992 q 104 987 109 992 q 99 977 99 983 l 99 16 q 104 5 99 9 q 115 0 109 0 l 1076 0 q 1087 5 1082 0 q 1091 16 1091 9 m 429 876 l 572 992 l 257 992 l 429 876 m 762 876 l 933 992 l 618 992 l 762 876 m 1190 977 l 1190 16 q 1157 -66 1190 -33 q 1076 -99 1124 -99 l 115 -99 q 33 -66 67 -99 q 0 16 0 -33 l 0 977 q 33 1058 0 1025 q 115 1091 67 1091 l 1076 1091 q 1157 1058 1124 1091 q 1190 977 1190 1025 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 694 558 q 570 773 614 710 q 301 1020 463 930 q 247 1048 275 1035 q 174 1073 178 1079 q 201 1043 171 1066 l 231 1019 q 318 947 279 986 q 391 856 357 908 q 446 769 426 805 q 501 667 467 732 q 511 648 508 654 q 576 529 545 583 q 652 410 607 476 q 741 294 697 344 q 843 198 786 243 q 958 128 900 153 q 1077 81 1077 77 q 1039 110 1078 84 q 977 154 998 138 q 838 318 917 199 q 694 558 759 436 m 426 137 q 323 234 367 184 q 247 345 279 284 q 192 465 215 406 q 146 609 169 524 q 106 771 124 694 q 59 966 88 848 q 0 1190 30 1085 q 386 1163 212 1190 q 679 1091 560 1135 q 889 979 799 1048 q 1033 846 980 911 q 1118 692 1087 780 q 1162 537 1150 603 q 1171 383 1173 471 q 1164 249 1170 295 q 1149 138 1159 203 q 1139 55 1139 73 l 1389 -198 l 1308 -198 l 1090 22 q 1020 12 1073 21 q 925 -3 966 2 q 818 -8 885 -9 q 694 5 752 -7 q 564 51 636 18 q 426 137 492 84 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1059 644 q 1064 652 1059 644 q 1065 681 1070 661 q 1043 712 1060 701 q 1005 718 1025 722 q 694 670 803 670 q 384 718 586 670 q 346 712 363 722 q 324 681 329 701 q 330 644 319 661 q 360 622 340 626 q 595 577 511 586 q 583 368 594 454 q 563 248 573 282 q 531 158 553 213 l 524 142 q 525 104 516 122 q 553 78 533 85 q 570 74 560 74 q 617 106 605 74 l 623 122 q 678 322 665 229 l 711 322 q 766 122 724 229 l 772 106 q 818 74 784 74 q 836 78 829 74 q 864 104 856 85 q 865 142 873 122 l 858 158 q 826 248 836 213 q 806 368 816 282 q 794 577 795 454 q 1028 622 878 586 q 1059 644 1049 626 m 765 724 q 779 738 765 724 q 794 794 794 753 q 765 864 794 835 q 694 893 736 893 q 624 864 653 893 q 595 794 595 835 q 624 724 595 753 q 694 694 653 694 q 765 724 736 694 m 1197 708 q 1219 657 1197 708 q 1240 496 1240 607 q 1197 284 1240 385 q 1081 110 1154 183 q 906 -7 1008 36 q 694 -50 805 -50 q 482 -7 584 -50 q 308 110 381 36 q 192 284 235 183 q 149 496 149 385 q 192 708 149 607 q 308 882 235 809 q 482 999 381 956 q 694 1042 584 1042 q 906 999 805 1042 q 1081 882 1008 956 q 1197 708 1154 809 m 925 1044 q 870 1068 925 1044 q 694 1091 815 1091 q 463 1044 574 1091 q 274 917 353 997 q 146 727 194 837 q 99 496 99 617 q 146 265 99 375 q 274 75 194 155 q 463 -52 353 -5 q 694 -99 574 -99 q 925 -52 815 -99 q 1115 75 1035 -5 q 1242 265 1195 155 q 1290 496 1290 375 q 1242 727 1290 617 q 1115 917 1195 837 q 925 1044 1035 997 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飱�":{"ha":1190,"x_min":53,"x_max":1137,"o":"m 1050 585 q 1115 560 1088 587 q 1137 497 1141 533 l 1103 70 q 1076 16 1100 37 q 1021 -6 1053 -6 q 1014 -5 1016 -6 q 958 23 980 -3 q 938 83 935 49 l 965 415 l 854 409 q 897 223 897 322 q 782 -65 897 56 l 676 41 q 746 223 746 119 q 667 415 746 336 q 475 495 587 495 q 292 424 371 495 l 186 531 q 406 640 279 619 l 611 873 l 495 940 l 355 815 q 295 794 329 792 q 239 822 261 796 q 218 881 216 847 q 245 938 220 915 l 430 1103 q 477 1123 450 1121 q 526 1112 503 1126 l 904 893 q 942 840 932 877 q 922 749 955 788 l 763 570 l 1050 585 m 1059 955 q 1039 935 1059 955 q 961 915 1018 915 q 863 955 904 915 q 823 1053 823 995 q 863 1150 823 1110 q 961 1190 904 1190 q 1059 1150 1018 1190 q 1100 1053 1100 1110 q 1059 955 1100 995 m 475 -48 q 627 -1 557 -48 l 735 -109 q 475 -198 622 -198 q 263 -142 360 -198 q 109 12 166 -85 q 53 223 53 109 q 143 484 53 369 l 250 376 q 204 223 204 308 q 283 31 204 111 q 475 -48 363 -48 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 682 260 l 682 136 q 675 119 682 126 q 657 112 668 112 l 533 112 q 515 119 522 112 q 508 136 508 126 l 508 260 q 515 278 508 271 q 533 285 522 285 l 657 285 q 675 278 668 285 q 682 260 682 271 m 880 645 q 869 575 880 606 q 834 522 857 544 q 793 488 810 499 q 747 460 777 476 q 711 438 722 446 q 691 419 700 430 q 682 397 682 408 l 682 372 q 675 354 682 361 q 657 347 668 347 l 533 347 q 515 354 522 347 q 508 372 508 361 l 508 425 q 517 475 508 452 q 535 512 525 498 q 565 539 546 525 q 597 559 585 553 q 632 575 609 565 q 690 608 673 594 q 707 646 707 622 q 673 702 707 679 q 599 725 639 725 q 525 704 556 725 q 463 639 503 688 q 444 630 457 630 q 429 635 436 630 l 346 698 q 336 714 338 704 q 340 732 335 724 q 611 880 435 880 q 796 811 711 880 q 880 645 880 742 m 788 953 q 742 972 788 953 q 595 992 696 992 q 403 953 494 992 q 245 847 311 913 q 139 689 178 780 q 99 496 99 597 q 139 303 99 395 q 245 145 178 212 q 403 40 311 79 q 595 0 494 0 q 788 40 696 0 q 946 145 880 79 q 1052 303 1012 212 q 1091 496 1091 395 q 1052 689 1091 597 q 946 847 1012 780 q 788 953 880 913 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飱�":{"ha":1091,"x_min":30,"x_max":1061,"o":"m 369 985 q 351 967 369 985 q 284 949 333 949 q 198 985 234 949 q 163 1070 163 1020 q 198 1155 163 1120 q 284 1190 234 1190 q 369 1155 333 1190 q 404 1070 404 1120 q 369 985 404 1020 m 711 452 q 687 400 711 413 q 638 395 664 386 q 601 421 612 403 l 317 760 q 306 772 312 770 q 298 773 301 775 l 295 771 q 298 755 290 765 l 393 647 l 394 373 l 269 19 q 198 -163 217 -130 q 176 -188 186 -183 q 96 -188 137 -208 q 64 -155 74 -178 q 57 -111 54 -132 q 209 368 58 -98 l 213 691 l 147 563 l 174 391 q 174 359 177 373 q 163 338 170 345 q 148 325 156 330 q 135 319 140 320 l 129 318 q 103 320 115 315 q 84 332 91 325 q 73 350 78 340 q 67 365 69 359 q 66 372 66 370 l 30 604 l 194 899 q 281 925 212 925 q 364 894 339 925 l 693 491 q 704 477 698 487 l 706 475 l 705 474 q 711 452 711 464 m 398 336 q 467 161 432 248 q 521 31 502 74 l 539 -12 q 572 -109 567 -84 q 544 -184 581 -163 q 493 -196 517 -201 q 453 -179 469 -191 q 431 -152 438 -167 l 430 -152 q 424 -133 426 -140 l 328 140 l 398 336 m 1037 -123 q 1061 -167 1061 -161 q 1059 -173 1061 -171 q 1047 -172 1052 -177 q 1035 -152 1043 -168 q 1023 -129 1028 -136 q 695 384 935 5 q 701 384 698 383 q 706 388 704 386 l 708 389 q 717 402 717 396 l 1037 -123 z "},"飱�":{"ha":1786,"x_min":2,"x_max":1786,"o":"m 391 420 l 523 420 l 522 625 l 391 420 m 1186 497 q 1147 605 1186 564 q 1033 646 1108 646 l 991 646 l 991 346 l 1032 346 q 1144 390 1102 346 q 1186 497 1186 434 m 741 789 l 742 203 q 734 184 742 192 q 716 177 727 177 l 549 177 q 531 184 538 177 q 523 203 523 192 l 523 251 l 298 251 l 255 188 q 233 177 247 177 l 26 177 q 3 191 10 177 q 5 218 -5 205 l 436 805 q 457 815 443 815 l 715 815 q 733 808 725 815 q 741 789 741 800 m 1284 731 q 1333 689 1284 731 q 1382 497 1382 646 q 1285 262 1382 347 q 1033 177 1187 177 l 824 177 q 805 184 813 177 q 798 203 798 192 l 798 789 q 805 808 798 800 q 824 815 813 815 l 1032 815 q 1284 731 1187 815 m 1503 496 q 1502 474 1503 488 q 1496 418 1502 460 q 1480 339 1490 377 q 1445 255 1469 301 q 1388 176 1421 209 l 1349 176 q 1400 257 1378 211 q 1432 344 1422 303 q 1449 420 1442 384 q 1456 476 1455 455 l 1456 497 q 1456 514 1456 503 q 1450 561 1456 525 q 1435 632 1445 596 q 1403 718 1425 667 q 1352 815 1381 769 l 1385 815 q 1441 732 1417 778 q 1476 645 1465 685 q 1494 571 1487 605 q 1502 516 1500 536 l 1503 496 m 1645 496 q 1645 474 1645 488 q 1639 418 1645 460 q 1622 339 1633 377 q 1587 255 1611 301 q 1530 176 1563 209 l 1490 176 q 1542 257 1520 211 q 1574 344 1564 303 q 1590 420 1584 384 q 1597 476 1597 455 l 1598 497 q 1598 514 1598 503 q 1592 561 1597 525 q 1577 632 1587 596 q 1545 718 1567 667 q 1494 815 1524 769 l 1528 815 q 1583 732 1559 778 q 1619 645 1607 685 q 1637 571 1630 605 q 1645 516 1643 536 l 1645 496 m 1786 496 q 1785 474 1786 488 q 1779 418 1785 460 q 1762 339 1773 377 q 1728 255 1752 301 q 1671 176 1704 209 l 1631 176 q 1683 257 1661 211 q 1714 344 1704 303 q 1731 420 1724 384 q 1738 476 1737 455 l 1738 497 q 1738 514 1738 503 q 1732 561 1738 525 q 1717 632 1727 596 q 1686 718 1707 667 q 1635 815 1664 769 l 1668 815 q 1724 732 1700 778 q 1759 645 1748 685 q 1777 571 1770 605 q 1784 516 1783 536 l 1786 496 z "},"飱�":{"ha":1091,"x_min":0,"x_max":1091,"o":"m 478 -119 q 468 -74 478 -110 q 444 9 458 -37 q 429 63 430 56 q 425 83 428 66 q 418 111 422 101 q 408 128 415 122 q 368 139 396 139 q 314 134 350 139 q 259 130 277 130 q 222 139 233 130 q 214 151 218 143 q 208 166 210 159 q 203 185 206 174 q 199 199 200 196 q 171 397 171 298 q 199 594 171 495 q 203 609 200 598 q 208 627 206 620 q 214 643 210 635 q 222 655 218 651 q 259 663 233 663 q 314 659 277 663 q 368 655 350 655 q 408 666 396 655 q 418 682 415 672 q 425 710 422 693 q 429 731 428 728 q 444 784 430 738 q 468 867 458 831 q 478 912 478 904 q 444 953 478 929 q 386 986 411 977 q 351 992 370 992 q 275 978 325 992 q 200 947 231 965 q 145 896 170 929 q 110 841 121 863 q 74 768 98 820 q 67 753 70 759 q 15 586 29 670 q 0 397 0 501 q 15 208 0 292 q 67 40 29 123 q 132 -84 111 -54 q 270 -183 181 -155 q 275 -184 273 -184 q 351 -198 325 -198 q 386 -192 370 -198 q 444 -159 411 -183 q 478 -119 478 -136 m 601 589 q 567 604 581 589 q 552 639 552 618 q 567 674 552 660 q 595 744 595 703 q 567 815 595 784 q 552 849 552 829 q 567 884 552 870 q 601 899 581 899 q 636 884 622 899 q 694 744 694 826 q 636 604 694 662 q 601 589 620 589 m 777 463 q 742 449 763 449 q 707 463 721 449 q 692 498 692 478 q 707 533 692 519 q 794 744 794 622 q 707 955 794 867 q 692 990 692 970 q 707 1025 692 1010 q 742 1039 722 1039 q 777 1025 762 1039 q 893 744 893 908 q 777 463 893 580 m 917 323 q 882 308 903 308 q 847 323 861 308 q 832 358 832 338 q 847 393 832 378 q 954 554 917 463 q 992 744 992 645 q 954 934 992 843 q 847 1095 917 1025 q 832 1130 832 1110 q 847 1165 832 1150 q 882 1180 862 1180 q 917 1165 902 1180 q 1046 972 1001 1080 q 1091 744 1091 863 q 1046 516 1091 625 q 917 323 1001 408 z "},"飱�":{"ha":1687,"x_min":0,"x_max":1687,"o":"m 236 236 q 218 255 236 236 q 149 273 200 273 q 61 236 98 273 q 25 149 25 200 q 61 61 25 98 q 149 25 98 25 q 236 61 200 25 q 273 149 273 98 q 236 236 273 200 m 633 236 q 615 255 633 236 q 546 273 597 273 q 458 236 494 273 q 422 149 422 200 q 458 61 422 98 q 546 25 494 25 q 633 61 597 25 q 670 149 670 98 q 633 236 670 200 m 633 633 q 615 651 633 633 q 546 670 597 670 q 458 633 494 670 q 422 546 422 597 q 458 458 422 494 q 546 422 494 422 q 633 458 597 422 q 670 546 670 494 q 633 633 670 597 m 1228 236 q 1210 255 1228 236 q 1141 273 1192 273 q 1053 236 1090 273 q 1017 149 1017 200 q 1053 61 1017 98 q 1141 25 1090 25 q 1228 61 1192 25 q 1265 149 1265 98 q 1228 236 1265 200 m 1625 236 q 1607 255 1625 236 q 1538 273 1589 273 q 1450 236 1487 273 q 1414 149 1414 200 q 1450 61 1414 98 q 1538 25 1487 25 q 1625 61 1589 25 q 1662 149 1662 98 q 1625 236 1662 200 m 1228 633 q 1210 651 1228 633 q 1141 670 1192 670 q 1053 633 1090 670 q 1017 546 1017 597 q 1053 458 1017 494 q 1141 422 1090 422 q 1228 458 1192 422 q 1265 546 1265 494 q 1228 633 1265 597 m 1625 633 q 1607 651 1625 633 q 1538 670 1589 670 q 1450 633 1487 670 q 1414 546 1414 597 q 1450 458 1414 494 q 1538 422 1487 422 q 1625 458 1589 422 q 1662 546 1662 494 q 1625 633 1662 597 m 1625 1030 q 1607 1048 1625 1030 q 1538 1066 1589 1066 q 1450 1030 1487 1066 q 1414 942 1414 994 q 1450 855 1414 891 q 1538 818 1487 818 q 1625 855 1589 818 q 1662 942 1662 891 q 1625 1030 1662 994 m 254 254 q 276 233 254 254 q 298 149 298 211 q 254 43 298 87 q 149 0 211 0 q 43 43 87 0 q 0 149 0 87 q 43 254 0 211 q 149 298 87 298 q 254 254 211 298 m 651 254 q 673 233 651 254 q 694 149 694 211 q 651 43 694 87 q 546 0 608 0 q 440 43 484 0 q 397 149 397 87 q 440 254 397 211 q 546 298 484 298 q 651 254 608 298 m 254 651 q 276 629 254 651 q 298 546 298 608 q 254 440 298 484 q 149 397 211 397 q 43 440 87 397 q 0 546 0 484 q 43 651 0 608 q 149 694 87 694 q 254 651 211 694 m 651 651 q 673 629 651 651 q 694 546 694 608 q 651 440 694 484 q 546 397 608 397 q 440 440 484 397 q 397 546 397 484 q 440 651 397 608 q 546 694 484 694 q 651 651 608 694 m 254 1048 q 276 1026 254 1048 q 298 942 298 1004 q 254 837 298 880 q 149 794 211 794 q 43 837 87 794 q 0 942 0 880 q 43 1048 0 1004 q 149 1091 87 1091 q 254 1048 211 1091 m 1246 254 q 1268 233 1246 254 q 1290 149 1290 211 q 1246 43 1290 87 q 1141 0 1203 0 q 1035 43 1079 0 q 992 149 992 87 q 1035 254 992 211 q 1141 298 1079 298 q 1246 254 1203 298 m 651 1048 q 673 1026 651 1048 q 694 942 694 1004 q 651 837 694 880 q 546 794 608 794 q 440 837 484 794 q 397 942 397 880 q 440 1048 397 1004 q 546 1091 484 1091 q 651 1048 608 1091 m 1643 254 q 1665 233 1643 254 q 1687 149 1687 211 q 1643 43 1687 87 q 1538 0 1600 0 q 1432 43 1476 0 q 1389 149 1389 87 q 1432 254 1389 211 q 1538 298 1476 298 q 1643 254 1600 298 m 1246 651 q 1268 629 1246 651 q 1290 546 1290 608 q 1246 440 1290 484 q 1141 397 1203 397 q 1035 440 1079 397 q 992 546 992 484 q 1035 651 992 608 q 1141 694 1079 694 q 1246 651 1203 694 m 1643 651 q 1665 629 1643 651 q 1687 546 1687 608 q 1643 440 1687 484 q 1538 397 1600 397 q 1432 440 1476 397 q 1389 546 1389 484 q 1432 651 1389 608 q 1538 694 1476 694 q 1643 651 1600 694 m 1246 1048 q 1268 1026 1246 1048 q 1290 942 1290 1004 q 1246 837 1290 880 q 1141 794 1203 794 q 1035 837 1079 794 q 992 942 992 880 q 1035 1048 992 1004 q 1141 1091 1079 1091 q 1246 1048 1203 1091 m 1643 1048 q 1665 1026 1643 1048 q 1687 942 1687 1004 q 1643 837 1687 880 q 1538 794 1600 794 q 1432 837 1476 794 q 1389 942 1389 880 q 1432 1048 1389 1004 q 1538 1091 1476 1091 q 1643 1048 1600 1091 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1386,"o":"m 84 -114 q 92 -121 84 -114 q 99 -149 99 -129 q 84 -184 99 -169 q 50 -198 70 -198 q 15 -184 29 -198 q 0 -149 0 -169 q 15 -114 0 -129 q 50 -99 29 -99 q 84 -114 70 -99 m 233 35 q 241 28 233 35 q 248 0 248 20 q 233 -35 248 -20 q 198 -50 219 -50 q 164 -35 178 -50 q 149 0 149 -20 q 164 35 149 20 q 198 50 178 50 q 233 35 219 50 m 283 283 l 481 84 l 412 15 l 213 213 l 283 283 m 531 332 q 538 325 531 332 q 546 298 546 318 q 531 263 546 277 q 496 248 516 248 q 461 263 476 248 q 446 298 446 277 q 461 332 446 318 q 496 347 476 347 q 531 332 516 347 m 1094 546 q 1085 462 1094 500 q 1056 389 1076 423 q 1022 337 1035 355 q 980 287 1008 319 q 945 245 956 260 q 919 206 934 230 q 899 157 904 182 q 893 99 893 131 q 806 -111 893 -24 q 595 -198 718 -198 q 560 -184 575 -198 q 546 -149 546 -169 q 560 -114 546 -129 q 595 -99 575 -99 q 736 -41 677 -99 q 794 99 794 17 q 803 181 794 143 q 831 252 811 219 q 865 303 851 284 q 905 352 879 322 q 951 408 936 388 q 980 465 966 428 q 994 546 994 503 q 892 791 994 689 q 647 893 791 893 q 402 791 504 893 q 300 546 300 689 q 285 511 300 525 q 250 496 270 496 q 215 511 230 496 q 201 546 201 525 q 236 719 201 636 q 331 861 271 801 q 474 957 391 922 q 647 992 556 992 q 820 957 738 992 q 963 861 903 922 q 1058 719 1023 801 q 1094 546 1094 636 m 680 481 q 687 474 680 481 q 694 446 694 467 q 680 412 694 426 q 645 397 665 397 q 610 412 625 397 q 595 446 595 426 q 610 481 595 467 q 645 496 625 496 q 680 481 665 496 m 918 546 q 903 511 918 525 q 868 496 888 496 q 833 511 848 496 q 818 546 818 525 q 768 668 818 618 q 645 719 717 719 q 522 668 574 719 q 471 546 471 618 q 457 511 471 525 q 422 496 442 496 q 387 511 401 496 q 372 546 372 525 q 452 739 372 659 q 645 818 532 818 q 838 739 758 818 q 918 546 918 659 m 1223 770 q 1222 732 1231 750 q 1194 705 1214 713 q 1177 702 1187 702 q 1149 711 1162 702 q 1131 734 1136 719 q 957 963 1078 872 q 938 995 941 975 q 947 1032 935 1015 q 980 1051 960 1048 q 1017 1042 1001 1054 q 1223 770 1159 935 m 1386 832 q 1385 794 1393 813 q 1357 768 1376 776 q 1339 765 1349 765 q 1293 797 1305 765 q 1063 1101 1221 981 q 1043 1134 1046 1114 q 1053 1170 1040 1154 q 1085 1190 1065 1187 q 1121 1180 1105 1193 q 1386 832 1304 1045 z "},"飱�":{"ha":1786,"x_min":2,"x_max":1783,"o":"m 800 446 q 735 489 754 448 q 698 531 722 515 q 645 546 674 546 q 575 517 604 546 q 546 446 546 488 q 574 377 546 403 l 581 371 q 645 347 608 347 q 698 362 674 347 q 735 404 722 377 q 800 446 754 445 m 1240 546 q 1212 615 1240 589 l 1204 621 q 1141 645 1178 645 q 1088 630 1112 645 q 1051 588 1064 615 q 986 546 1032 547 q 1051 503 1032 544 q 1088 462 1064 477 q 1141 446 1112 446 q 1211 475 1182 446 q 1240 546 1240 505 m 910 717 q 867 680 897 690 q 811 683 838 670 q 707 707 763 707 q 630 694 667 707 q 637 694 632 694 q 645 694 643 694 q 777 656 716 694 q 869 553 838 617 q 872 496 882 525 q 833 453 861 467 q 803 446 819 446 q 833 439 819 446 q 872 397 861 426 q 869 340 882 368 q 777 237 838 276 q 645 198 716 198 l 640 198 q 606 202 628 200 l 381 222 l 196 129 q 174 124 185 124 q 129 151 143 124 l 5 399 q 2 436 -3 417 q 25 465 8 455 l 187 557 l 301 764 q 372 990 315 884 q 524 1173 430 1096 q 579 1190 548 1193 q 629 1163 609 1187 q 645 1109 648 1139 q 618 1059 643 1079 q 528 960 564 1013 q 735 1038 623 1025 q 790 1023 766 1042 q 818 973 815 1004 q 803 918 822 942 q 753 891 784 894 q 630 848 688 883 q 707 856 666 856 q 876 817 796 856 q 914 774 904 803 q 910 717 924 745 m 1656 841 l 1780 593 q 1783 556 1789 575 q 1761 527 1778 537 l 1599 435 l 1484 228 q 1413 2 1471 108 q 1262 -181 1356 -104 q 1215 -198 1242 -198 q 1157 -171 1180 -198 q 1140 -117 1138 -147 q 1167 -67 1143 -87 q 1258 33 1221 -21 q 1051 -46 1163 -33 q 1042 -47 1048 -47 q 992 -28 1014 -47 q 968 19 971 -9 q 983 74 964 50 q 1032 102 1001 98 q 1156 144 1097 109 q 1079 136 1120 136 q 910 175 990 136 q 872 218 882 189 q 876 275 862 247 q 918 312 889 302 q 975 309 948 322 q 1079 285 1023 285 q 1156 298 1118 285 q 1148 298 1153 298 q 1141 298 1143 298 q 1009 336 1070 298 q 917 439 948 375 q 914 496 904 467 q 953 539 925 525 q 983 546 966 546 q 953 553 966 546 q 914 595 925 566 q 917 652 904 624 q 1009 755 948 716 q 1141 794 1070 794 l 1146 794 l 1146 794 q 1179 791 1157 792 l 1404 770 l 1590 863 q 1612 868 1600 868 q 1656 841 1643 868 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 818 546 q 833 511 818 525 q 868 496 848 496 q 903 511 888 496 q 918 546 918 525 q 838 739 918 659 q 645 818 758 818 q 452 739 532 818 q 372 546 372 659 q 387 511 372 525 q 422 496 401 496 q 457 511 442 496 q 471 546 471 525 q 522 668 471 618 q 645 719 574 719 q 767 668 716 719 q 818 546 818 618 m 820 957 q 779 974 820 957 q 647 992 738 992 q 474 957 556 992 q 331 861 391 922 q 236 719 271 801 q 201 546 201 636 q 215 511 201 525 q 250 496 230 496 q 285 511 270 496 q 300 546 300 525 q 402 791 300 689 q 647 893 504 893 q 892 791 791 893 q 994 546 994 689 q 980 465 994 503 q 951 408 966 428 q 905 352 936 388 q 865 303 879 322 q 831 252 851 284 q 803 181 811 219 q 794 99 794 143 q 736 -41 794 17 q 595 -99 677 -99 q 560 -114 575 -99 q 546 -149 546 -129 q 560 -184 546 -169 q 595 -198 575 -198 q 806 -111 718 -198 q 893 99 893 -24 q 899 157 893 131 q 919 206 904 182 q 945 245 934 230 q 980 287 956 260 q 1022 337 1008 319 q 1056 389 1035 355 q 1085 462 1076 423 q 1094 546 1094 500 q 1058 719 1094 636 q 963 861 1023 801 q 820 957 903 922 m 458 435 l 633 260 l 184 -189 q 162 -198 175 -198 q 140 -189 149 -198 l 9 -59 q 0 -36 0 -50 q 9 -14 0 -23 l 458 435 m 1249 1181 l 1380 1051 q 1389 1028 1389 1042 q 1380 1005 1389 1015 l 1199 825 l 1179 805 l 1124 750 q 973 950 1073 869 l 1043 1021 l 1204 1181 q 1227 1190 1214 1190 q 1249 1181 1240 1190 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 671 791 q 661 718 671 770 q 637 602 653 680 q 613 486 621 525 q 610 476 612 477 q 599 474 608 475 q 575 473 584 473 q 510 511 530 473 q 490 599 490 550 q 517 734 490 667 q 597 830 544 801 q 636 841 618 841 q 665 828 658 841 q 671 791 671 815 m 1048 463 q 1018 521 1048 474 q 977 573 987 569 q 951 579 961 579 q 776 519 880 579 l 774 521 q 796 625 777 538 q 815 763 815 713 q 627 944 815 944 q 574 939 608 944 q 444 870 501 926 q 357 741 386 814 q 329 594 329 668 q 391 420 329 481 q 567 359 453 359 q 587 357 587 359 q 586 353 587 354 q 566 262 583 326 q 526 184 555 222 q 462 146 497 146 q 429 182 429 146 q 438 219 429 201 q 457 250 446 237 q 480 272 468 262 q 500 287 491 281 q 508 294 508 293 q 503 301 508 296 q 458 330 484 319 q 407 341 431 341 q 358 315 380 341 q 326 257 336 288 q 316 198 316 225 q 356 88 316 130 q 463 47 396 47 q 584 88 527 47 q 675 185 640 129 q 725 304 709 242 q 737 355 730 321 q 749 407 745 390 q 760 421 751 416 q 935 467 851 467 q 1034 453 973 467 q 1037 453 1035 453 q 1044 456 1041 453 q 1048 463 1048 460 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飱�":{"ha":1190,"x_min":29,"x_max":1161,"o":"m 577 954 q 575 984 577 973 q 568 1007 574 995 q 552 1025 563 1019 q 523 1031 541 1031 q 463 1013 493 1031 q 339 865 381 968 q 298 656 298 763 q 304 590 298 622 q 325 528 311 558 q 365 479 339 498 q 429 461 392 461 q 443 461 432 461 q 458 461 453 460 q 470 463 463 461 q 482 470 478 465 q 488 482 486 474 q 525 662 500 542 q 562 841 550 781 q 577 954 577 911 m 1161 446 q 1155 435 1161 440 q 1143 430 1149 430 l 1139 431 q 1090 439 1121 433 q 1035 449 1059 446 q 986 453 1010 453 q 714 381 856 453 q 698 360 702 374 q 679 278 690 332 q 661 200 667 224 q 607 61 643 129 q 520 -67 570 -8 q 400 -162 469 -126 q 257 -198 331 -198 q 90 -134 152 -198 q 29 36 29 -69 q 44 127 29 78 q 93 217 59 177 q 168 258 126 258 q 261 232 198 258 q 326 184 325 206 q 313 175 326 184 q 282 151 300 166 q 246 116 264 136 q 216 69 229 97 q 204 12 204 41 q 217 -29 204 -14 q 254 -45 229 -45 q 320 -21 289 -45 q 372 40 351 4 q 409 122 392 76 q 434 205 426 167 q 446 274 443 242 l 446 281 q 444 284 446 283 q 437 285 441 285 q 429 285 433 285 q 422 285 426 285 q 417 284 418 284 q 144 379 241 284 q 47 649 47 474 q 74 821 47 733 q 148 984 101 908 q 269 1113 196 1059 q 428 1183 343 1168 q 510 1190 468 1190 q 800 911 800 1190 q 770 699 800 835 q 737 536 741 563 l 739 533 q 881 601 818 577 q 1011 625 944 625 q 1052 615 1028 625 q 1114 536 1066 610 q 1161 446 1161 462 z "},"飱�":{"ha":1290,"x_min":1,"x_max":1289,"o":"m 644 669 q 690 655 669 669 l 862 540 q 947 465 909 509 l 1060 333 q 1083 251 1091 298 l 1027 -69 q 1004 -110 1022 -94 q 961 -130 986 -127 l 553 -174 l 280 -198 l 273 -198 q 221 -177 243 -198 q 198 -124 198 -155 q 219 -74 198 -95 q 270 -50 240 -53 l 471 -25 l 124 -25 q 70 -2 92 -25 q 50 53 48 22 q 74 104 51 84 q 128 124 98 124 l 470 125 l 67 174 q 16 203 35 178 q 1 260 -4 228 q 28 304 5 287 q 78 322 50 322 l 86 322 l 459 275 l 187 348 q 139 380 157 356 q 125 433 120 405 q 150 479 129 461 q 198 496 171 496 q 214 494 203 496 l 561 420 l 729 391 q 732 391 730 391 q 734 391 733 391 q 758 408 752 391 q 748 436 763 426 l 604 533 q 571 582 577 551 q 585 639 566 614 q 644 669 606 669 m 590 512 l 734 415 l 565 444 l 561 446 l 533 475 l 349 678 q 347 681 348 679 q 345 684 346 683 q 331 738 326 708 q 360 787 335 768 q 412 801 384 805 q 462 775 441 797 l 572 661 q 568 658 570 660 q 565 655 566 656 q 547 578 540 620 q 590 512 554 536 m 1277 864 l 1289 658 q 1280 544 1292 601 l 1243 374 q 1191 307 1234 329 l 1109 265 q 1079 350 1111 313 l 966 481 q 875 561 925 529 l 703 676 q 644 694 677 694 q 576 665 605 694 l 394 907 q 380 964 374 932 q 412 1013 385 995 q 467 1024 437 1030 q 515 993 497 1018 l 722 720 l 519 1073 q 510 1131 502 1100 q 547 1177 519 1162 q 603 1181 574 1190 q 648 1146 632 1172 l 835 820 l 729 1081 q 726 1139 718 1108 q 760 1182 734 1169 q 819 1187 789 1197 q 863 1147 849 1177 l 1012 825 l 1090 674 q 1108 660 1097 662 q 1129 666 1120 658 q 1138 686 1139 674 l 1128 860 q 1149 915 1127 891 q 1202 939 1170 938 q 1254 916 1232 939 q 1277 864 1276 894 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 260 140 q 255 141 258 140 q 124 253 188 185 q 16 393 60 322 q 0 446 0 416 q 2 461 0 453 q 5 475 3 469 q 10 489 6 481 q 17 501 14 497 q 25 515 19 506 q 33 526 30 523 q 42 538 35 529 q 50 550 49 547 q 401 832 193 744 q 315 996 315 986 q 329 1018 315 1011 q 428 1068 419 1068 q 450 1056 442 1068 l 546 878 q 694 893 617 893 q 1080 786 901 893 q 1373 500 1259 680 q 1389 446 1389 476 q 1373 393 1389 417 q 1204 196 1303 283 q 988 60 1105 110 q 1073 -103 1073 -93 q 1060 -126 1073 -119 q 962 -175 970 -175 q 939 -163 947 -175 l 843 15 l 794 107 l 450 742 l 455 748 q 378 711 410 729 q 477 530 381 708 q 665 182 573 353 q 757 9 757 12 q 750 2 757 4 q 694 0 740 0 q 648 5 650 0 l 295 657 q 231 605 264 636 q 397 300 250 571 q 544 25 544 28 q 536 17 544 17 q 472 34 525 17 q 415 56 419 51 l 333 208 l 160 529 q 99 446 126 488 q 113 427 101 444 q 131 401 126 410 l 267 147 q 260 140 267 140 m 903 219 l 941 148 q 1290 446 1152 234 q 934 748 1150 661 q 1014 633 986 698 q 1042 496 1042 567 q 1005 341 1042 414 q 903 219 969 267 m 668 721 q 663 715 668 721 q 657 694 657 710 q 668 668 657 679 q 694 657 679 657 q 808 610 761 657 q 856 496 856 563 q 867 470 856 481 q 893 459 877 459 q 919 470 908 459 q 930 496 930 481 q 861 663 930 594 q 694 732 792 732 q 668 721 679 732 m 941 745 l 934 748 l 939 742 l 941 745 z "},"飱�":{"ha":992,"x_min":0,"x_max":991,"o":"m 814 333 q 700 43 814 167 q 407 -81 585 -81 q 114 43 227 -81 q 0 333 0 167 q 53 543 0 447 q 199 695 105 639 q 407 752 293 752 q 548 728 481 752 q 518 630 523 680 q 407 652 467 652 q 189 556 277 652 q 102 331 102 461 q 189 107 102 199 q 407 16 276 16 q 625 107 538 16 q 711 331 711 199 q 687 460 711 400 q 782 498 738 470 q 814 333 814 422 m 656 480 q 594 212 656 331 q 409 16 532 94 l 398 16 q 350 19 376 16 q 464 99 415 44 q 541 219 513 153 q 586 365 569 284 q 610 514 604 446 q 615 653 615 582 q 613 732 615 706 q 656 480 656 608 m 613 734 l 613 732 q 453 1073 556 898 q 564 929 522 1028 q 613 734 606 830 m 802 577 q 678 635 738 577 q 903 826 847 728 q 919 870 918 855 q 811 741 887 797 q 653 665 736 684 q 625 753 625 707 q 639 814 625 781 q 672 867 652 846 q 794 924 708 901 q 876 969 839 936 q 933 1047 912 1002 q 991 851 991 966 q 972 719 991 767 q 903 618 947 660 q 802 577 860 577 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 814 384 q 792 498 814 444 q 726 471 760 478 q 743 383 743 432 q 684 229 743 292 q 534 166 624 166 q 384 229 444 166 q 324 383 324 292 q 384 537 324 472 q 534 603 445 603 q 610 588 575 603 q 631 656 613 622 q 534 672 584 672 q 334 588 415 672 q 254 384 254 504 q 334 181 254 264 q 534 99 415 99 q 734 182 653 99 q 814 384 814 264 m 676 659 q 677 604 677 640 q 674 508 677 555 q 658 406 670 462 q 626 305 646 350 q 573 223 607 260 q 495 168 539 185 q 528 166 512 166 l 536 166 q 705 484 705 274 q 676 659 705 574 m 676 659 q 642 792 673 721 q 566 893 611 863 q 676 659 637 772 m 935 740 q 896 875 935 819 q 800 791 864 808 q 715 749 746 776 q 684 672 684 722 q 703 612 684 641 q 812 664 760 625 q 886 753 863 703 q 828 667 883 713 q 721 591 773 621 q 806 551 761 551 q 876 580 846 551 q 922 649 906 608 q 935 740 935 682 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 991 301 q 974 322 991 318 q 883 367 922 333 q 821 451 843 401 q 815 470 815 466 q 830 491 815 482 q 864 504 846 499 q 897 520 882 508 q 912 548 912 531 q 898 572 912 563 q 868 582 884 582 q 843 576 859 582 q 819 570 828 570 q 810 571 816 570 q 814 660 814 645 q 801 748 814 721 q 721 842 773 808 q 603 876 669 876 q 390 748 449 876 q 377 660 377 721 q 381 571 377 645 q 370 570 377 570 q 345 575 360 570 q 322 581 329 581 q 292 572 305 581 q 278 547 278 563 q 293 520 278 531 q 327 504 308 508 q 360 491 345 499 q 375 470 375 482 q 370 451 375 466 q 216 322 320 344 q 199 301 199 318 q 305 248 199 265 q 310 228 307 244 q 319 204 313 212 q 337 197 325 197 q 366 200 346 197 q 397 204 386 204 q 449 192 424 204 q 491 167 474 181 q 535 142 508 153 q 594 130 563 130 q 656 142 628 130 q 700 167 684 153 q 742 192 717 181 q 794 204 767 204 q 824 201 805 204 q 854 198 844 198 q 872 205 867 198 q 880 229 877 213 q 885 248 884 244 q 991 301 991 265 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飱�":{"ha":1290,"x_min":12,"x_max":1278,"o":"m 657 1091 q 844 1038 761 1092 q 970 889 926 984 q 991 750 991 844 q 984 602 991 714 q 1006 597 995 597 q 1046 607 1020 597 q 1085 618 1071 618 q 1128 604 1108 618 q 1149 568 1149 590 q 1125 526 1149 543 q 1072 502 1101 509 q 1018 479 1042 494 q 994 443 994 464 q 1003 409 994 431 q 1082 293 1032 346 q 1194 215 1133 240 q 1256 197 1216 205 q 1278 170 1278 192 q 1108 90 1278 115 q 1100 60 1103 81 q 1089 24 1097 38 q 1063 9 1081 9 q 1015 14 1048 9 q 966 19 983 19 q 918 16 937 19 q 869 -2 893 12 q 824 -31 845 -16 q 779 -63 803 -47 q 720 -89 755 -78 q 643 -99 685 -99 q 568 -89 603 -99 q 510 -63 534 -78 q 466 -31 487 -47 q 421 -2 445 -16 q 373 16 397 12 q 324 19 353 19 q 273 14 305 19 q 228 8 241 8 q 201 22 208 8 q 190 59 193 36 q 181 90 187 81 q 12 170 12 115 q 33 197 12 192 q 95 215 74 205 q 207 293 156 239 q 287 409 259 346 q 296 443 296 431 q 272 479 296 464 q 218 502 247 494 q 164 527 188 510 q 140 567 140 543 q 160 603 140 588 q 202 617 180 617 q 239 607 214 617 q 281 597 265 597 q 305 602 295 597 q 298 749 298 712 q 319 889 298 844 q 453 1042 369 995 q 657 1091 536 1090 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 992 301 q 975 322 992 318 q 884 367 923 332 q 822 451 844 401 q 816 470 816 462 q 831 491 816 482 q 864 504 846 499 q 897 520 882 508 q 912 548 912 531 q 898 572 912 563 q 868 582 884 582 q 844 576 860 582 q 819 570 829 570 q 810 571 816 570 q 814 660 814 620 q 801 749 814 721 q 721 843 773 809 q 603 877 670 877 q 390 749 450 877 q 376 660 376 719 q 381 571 376 630 q 369 570 373 570 q 345 576 360 570 q 321 582 329 582 q 292 572 305 582 q 278 547 278 563 q 293 520 278 531 q 326 504 308 508 q 359 491 344 499 q 374 470 374 482 q 369 451 374 462 q 215 322 319 344 q 198 301 198 318 q 305 247 198 264 q 310 227 307 243 q 319 203 313 211 q 336 196 324 196 q 366 200 346 196 q 396 204 386 204 q 448 192 423 204 q 491 167 474 181 q 535 142 508 153 q 594 130 563 130 q 656 142 628 130 q 700 167 684 153 q 742 192 717 181 q 794 204 767 204 q 825 200 805 204 q 855 197 845 197 q 872 204 867 197 q 881 228 878 212 q 885 247 884 245 q 992 301 992 264 m 1190 868 l 1190 124 q 1125 -34 1190 32 q 967 -99 1059 -99 l 223 -99 q 65 -34 131 -99 q 0 124 0 32 l 0 868 q 65 1026 0 960 q 223 1091 131 1091 l 967 1091 q 1125 1026 1059 1091 q 1190 868 1190 960 z "},"飱�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 1786 1190 q 1689 1119 1732 1155 q 1620 1056 1645 1084 q 1574 1001 1594 1029 q 1545 956 1553 973 q 1528 922 1536 940 q 1517 899 1519 904 q 1489 793 1509 885 q 1452 666 1469 701 q 1413 619 1440 643 q 1361 580 1386 594 q 1304 548 1335 565 q 1267 526 1273 531 q 1150 347 1231 502 q 662 225 886 358 q 427 86 591 184 q 494 110 463 98 q 536 127 524 122 l 548 133 q 674 183 603 153 q 778 224 746 212 q 861 251 810 236 q 972 275 913 265 q 1332 270 1116 299 q 1340 267 1333 270 q 1351 254 1349 263 q 1349 237 1353 246 l 1198 -30 q 1162 -47 1187 -53 q 887 -29 1063 -29 q 576 -63 774 -29 q 272 -99 377 -98 q 157 -89 208 -100 q 74 -60 105 -78 q 26 -29 43 -43 q 1 -3 10 -16 l 0 -2 q 0 -1 0 -2 q 5 4 0 4 q 292 47 112 4 q 582 453 441 330 q 880 575 724 575 q 891 575 884 575 q 920 571 898 574 q 963 562 942 567 q 1011 543 984 556 q 1059 512 1038 529 q 1101 466 1081 494 q 1132 402 1121 438 l 1211 539 q 1228 572 1213 543 q 1262 639 1242 602 q 1309 724 1282 677 q 1375 828 1337 772 q 1452 934 1412 884 q 1552 1044 1504 997 q 1646 1118 1600 1090 q 1718 1160 1692 1147 q 1786 1190 1743 1173 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 1025 496 q 1021 437 1025 461 l 838 448 l 1011 388 q 966 278 997 331 l 801 358 l 938 236 q 855 152 904 188 l 733 290 l 813 123 q 705 78 766 95 l 643 254 l 654 68 q 595 64 625 64 q 536 68 566 64 l 547 253 l 487 78 q 378 123 429 92 l 458 290 l 336 152 q 253 236 291 185 l 391 358 l 225 277 q 180 387 195 331 l 353 448 l 170 437 q 166 496 166 470 q 170 556 166 523 l 354 545 l 180 606 q 225 715 195 663 l 391 634 l 253 757 q 336 841 289 805 l 459 703 l 379 870 q 488 915 431 900 l 547 741 l 537 924 q 595 929 565 929 q 654 924 625 929 l 643 740 l 704 915 q 812 869 761 900 l 732 703 l 855 841 q 938 757 902 805 l 801 634 l 966 715 q 1011 605 994 667 l 837 545 l 1021 556 q 1025 496 1025 532 m 1048 496 q 987 725 1048 620 q 822 891 926 830 q 595 952 718 952 q 419 916 503 952 q 275 819 336 880 q 178 674 214 758 q 143 496 143 589 q 178 319 143 404 q 275 174 214 235 q 419 77 336 113 q 595 41 503 41 q 822 102 718 41 q 987 268 926 163 q 1048 496 1048 373 m 1104 793 l 1104 199 l 595 -98 l 86 199 l 86 793 l 595 1090 l 1104 793 m 595 -142 l 1144 177 l 1144 815 l 595 1134 l 47 815 l 47 177 l 595 -142 m 1190 843 l 1190 149 l 595 -198 l 0 149 l 0 843 l 595 1190 l 1190 843 z "},"飱�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 263 1022 l 798 1022 l 778 966 l 263 966 q 117 904 177 966 q 56 758 56 843 l 56 160 q 103 29 56 87 q 222 -43 150 -29 q 298 -47 239 -47 l 298 -103 l 263 -103 q 77 -26 154 -103 q 0 160 0 52 l 0 758 q 77 944 0 867 q 263 1022 154 1022 m 922 1190 l 1114 1190 l 740 188 q 709 107 722 140 q 674 31 695 74 q 632 -41 653 -12 q 582 -102 612 -71 q 520 -152 553 -133 q 446 -184 488 -171 q 357 -198 405 -197 l 357 -47 q 527 94 483 -27 q 543 175 543 134 q 527 257 543 217 l 306 825 l 483 825 l 628 372 l 922 1190 m 1290 758 l 1290 -103 l 674 -103 q 708 -47 702 -60 l 1234 -47 l 1234 758 q 1196 878 1234 824 q 1095 955 1157 932 l 1115 1007 q 1241 911 1193 980 q 1290 758 1290 842 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 647 992 q 654 983 647 992 q 660 951 660 973 q 647 910 660 929 q 612 892 634 892 q 577 910 591 892 q 564 951 564 929 q 577 992 564 973 q 612 1010 591 1010 q 647 992 634 1010 m 533 -115 l 533 -27 q 517 13 533 -4 q 478 29 501 29 q 439 13 455 29 q 424 -27 424 -4 l 424 -115 q 440 -156 424 -139 q 478 -173 456 -173 q 517 -156 501 -173 q 533 -115 533 -139 m 667 -115 l 667 -27 q 651 13 667 -4 q 612 29 636 29 q 573 13 589 29 q 557 -27 557 -4 l 557 -115 q 573 -156 557 -139 q 612 -173 589 -173 q 651 -156 635 -173 q 667 -115 667 -139 m 801 -115 l 801 -27 q 786 13 801 -4 q 746 29 770 29 q 707 13 723 29 q 691 -27 691 -4 l 691 -115 q 707 -156 691 -139 q 746 -173 723 -173 q 786 -156 770 -173 q 801 -115 801 -139 m 936 -115 l 936 -27 q 920 13 936 -4 q 881 29 904 29 q 842 13 858 29 q 826 -27 826 -4 l 826 -115 q 842 -156 826 -139 q 881 -173 858 -173 q 920 -156 904 -173 q 936 -115 936 -139 m 1144 415 q 964 214 1079 291 q 714 136 849 136 q 536 176 618 136 q 398 283 453 216 q 310 436 342 349 q 278 615 278 522 q 295 750 278 684 q 214 448 214 615 q 264 206 214 322 q 408 12 315 90 q 478 56 431 56 q 545 17 522 56 q 612 56 570 56 q 679 17 656 56 q 746 56 704 56 q 814 17 789 56 q 880 56 837 56 q 921 44 902 56 q 950 12 940 32 q 1087 192 1037 85 q 1144 415 1138 298 m 1028 437 q 972 495 1028 495 q 935 491 959 495 q 820 476 862 476 q 645 664 645 476 q 668 822 645 731 q 604 609 604 724 q 673 407 604 493 q 855 322 742 322 q 1018 376 941 322 q 1028 437 1028 413 m 685 948 q 660 1017 685 987 q 598 1048 636 1048 q 535 1017 560 1048 q 510 948 510 987 q 534 878 510 908 q 598 847 559 847 q 661 878 636 847 q 685 948 685 908 m 1173 685 q 1144 824 1173 760 q 1056 930 1115 888 q 922 972 997 972 q 806 945 862 972 q 708 872 750 918 q 670 664 670 749 q 706 543 670 584 q 820 501 741 501 q 930 516 861 501 q 971 521 958 521 q 1031 499 1011 521 q 1052 437 1052 477 q 1049 401 1052 417 q 1140 530 1107 454 q 1173 685 1173 605 m 1389 517 q 1363 324 1389 431 q 1290 165 1337 216 q 1139 55 1246 115 q 963 -26 1033 -6 l 960 -27 l 960 -115 q 937 -174 960 -149 q 880 -198 914 -198 q 814 -160 837 -198 q 746 -198 789 -198 q 679 -160 704 -198 q 612 -198 656 -198 q 545 -160 570 -198 q 478 -198 522 -198 q 420 -172 442 -198 q 398 -109 398 -146 q 245 -162 329 -162 q 81 -100 153 -162 q 164 -84 123 -99 q 22 14 76 -60 q 78 9 47 9 q 205 44 146 9 q 19 281 56 193 q 0 405 0 325 q 7 503 0 450 q 31 616 14 556 q 74 725 49 677 q 141 807 99 774 q 234 839 183 839 q 297 799 280 839 q 329 841 312 822 q 339 851 331 843 q 349 863 346 859 q 367 893 357 875 q 386 925 377 911 q 408 956 395 940 q 572 1093 475 1042 q 773 1144 668 1144 q 822 1141 801 1144 q 935 1190 867 1190 q 1043 1146 999 1190 q 1047 1137 1047 1142 q 1042 1127 1047 1133 q 1033 1114 1038 1120 q 1020 1101 1028 1108 q 1012 1093 1013 1094 q 1040 1079 1025 1088 q 1055 1060 1055 1070 q 1042 1041 1055 1056 q 1195 748 1164 934 q 1242 771 1215 771 q 1319 733 1277 771 q 1389 517 1389 671 z "},"飱�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 711 489 q 706 539 711 515 l 426 539 l 426 436 l 594 436 q 536 343 584 377 q 426 308 488 308 q 295 364 349 308 q 240 496 240 419 q 295 628 240 573 q 426 684 349 684 q 544 638 498 684 l 625 716 q 426 794 541 794 q 215 706 301 794 q 128 496 128 619 q 215 286 128 373 q 426 198 301 198 q 632 280 553 198 q 711 489 711 361 m 978 453 l 1063 453 l 1063 539 l 978 539 l 978 624 l 893 624 l 893 539 l 808 539 l 808 453 l 893 453 l 893 368 l 978 368 l 978 453 m 1111 795 q 1151 726 1111 795 q 1190 496 1190 658 q 1111 197 1190 334 q 894 -19 1031 60 q 595 -99 757 -99 q 296 -19 433 -99 q 80 197 160 60 q 0 496 0 334 q 80 795 0 658 q 296 1011 160 932 q 595 1091 433 1091 q 894 1011 757 1091 q 1111 795 1031 932 z "},"飱�":{"ha":1190,"x_min":29,"x_max":1190,"o":"m 1190 794 l 1190 143 q 1152 95 1190 106 q 891 55 1018 55 q 724 78 834 55 q 547 101 613 101 q 260 64 420 101 l 260 -198 l 136 -198 l 136 862 q 58 925 88 881 q 29 1021 29 968 q 78 1141 29 1091 q 198 1190 128 1190 q 319 1141 269 1190 q 368 1021 368 1091 q 339 925 368 968 q 260 862 309 881 l 260 809 q 526 843 408 843 q 680 832 603 843 q 766 814 691 830 q 882 798 842 798 q 1010 812 942 798 q 1072 829 1018 814 q 1141 843 1125 843 q 1176 829 1161 843 q 1190 794 1190 814 z "},"飱�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 105 322 q 112 310 105 322 q 149 298 118 298 q 192 322 180 298 q 192 372 205 347 q 149 397 180 397 q 105 372 118 397 q 105 322 93 347 m 1290 343 q 1261 381 1283 353 q 1228 423 1239 410 q 1199 461 1218 436 q 1166 502 1180 486 q 1135 539 1152 519 q 1100 577 1117 559 l 1003 468 q 841 397 939 395 q 682 473 744 398 q 638 595 638 526 q 684 717 639 664 l 821 877 q 781 889 804 885 q 744 894 759 894 q 701 894 730 894 q 663 893 671 893 q 540 842 591 893 l 418 719 l 298 719 l 298 298 q 314 298 301 298 q 331 298 326 298 q 346 296 336 298 q 362 293 357 295 q 376 286 367 291 q 390 276 384 282 l 620 50 q 796 -36 709 -36 q 893 0 856 -36 q 980 6 937 -16 q 1036 72 1023 28 q 1135 106 1094 67 q 1163 141 1150 120 q 1173 181 1175 163 q 1207 173 1181 173 q 1266 189 1240 173 q 1305 230 1293 205 q 1314 286 1317 255 q 1290 343 1311 316 m 1414 298 l 1488 298 l 1488 694 l 1416 694 l 1294 834 q 1163 893 1243 893 l 1034 893 q 921 841 965 893 l 759 653 q 737 594 737 627 q 758 536 737 562 q 843 496 791 497 q 929 534 895 495 l 1079 703 q 1120 720 1098 721 q 1157 699 1142 718 q 1163 655 1171 679 q 1207 606 1176 640 q 1253 553 1238 572 q 1317 472 1276 525 q 1367 406 1359 418 q 1414 298 1407 355 m 1594 322 q 1600 310 1594 322 q 1637 298 1606 298 q 1680 322 1668 298 q 1680 372 1693 347 q 1637 397 1668 397 q 1594 372 1606 397 q 1594 322 1581 347 m 1786 744 l 1786 248 q 1771 213 1786 228 q 1736 198 1756 198 l 1400 198 q 1336 116 1379 148 q 1239 76 1294 84 q 1177 13 1214 39 q 1097 -22 1140 -13 q 1016 -86 1065 -64 q 917 -105 968 -108 q 819 -135 870 -131 q 720 -124 768 -140 q 630 -83 673 -109 q 550 -20 587 -57 l 327 198 l 50 198 q 15 213 29 198 q 0 248 0 228 l 0 769 q 15 804 0 789 q 50 818 29 818 l 376 818 q 412 856 387 829 q 449 893 438 882 q 483 924 460 904 q 522 953 506 944 q 562 973 539 962 q 610 988 585 984 q 663 992 635 992 l 753 992 q 894 949 830 992 q 1034 992 957 992 l 1163 992 q 1215 987 1190 992 q 1259 976 1240 983 q 1299 956 1278 970 q 1333 932 1320 942 q 1367 901 1347 922 q 1397 868 1387 880 q 1429 831 1407 856 q 1461 794 1450 806 l 1736 794 q 1771 779 1756 794 q 1786 744 1786 764 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 684 l 1389 -74 q 1352 -162 1389 -126 q 1265 -198 1316 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 684 q 9 702 0 695 q 39 729 15 708 q 71 757 63 750 q 106 786 79 763 q 160 829 133 808 q 235 885 188 849 q 346 968 282 922 q 495 1077 410 1015 q 536 1108 499 1080 q 591 1149 573 1136 q 641 1176 610 1162 q 694 1190 672 1190 q 748 1176 717 1190 q 798 1149 779 1162 q 853 1108 818 1135 q 894 1077 889 1081 q 1043 968 979 1015 q 1154 885 1107 922 q 1228 829 1201 849 q 1283 786 1256 808 q 1318 757 1310 763 q 1350 729 1326 750 q 1380 702 1374 708 q 1389 684 1389 695 m 952 230 q 1219 426 1156 378 q 1229 441 1228 432 q 1224 460 1230 451 l 1194 500 q 1178 510 1188 508 q 1159 505 1168 511 q 894 311 980 374 q 853 281 890 308 q 798 240 817 253 q 748 213 779 227 q 694 198 717 198 q 641 213 672 198 q 591 240 610 227 q 536 281 572 253 q 495 311 499 308 q 229 505 351 415 q 211 510 221 511 q 195 500 201 508 l 165 460 q 160 441 159 451 q 170 426 161 432 q 437 230 233 378 q 476 201 445 224 q 526 164 507 177 q 576 134 546 151 q 636 108 606 116 q 694 99 666 99 q 753 108 723 99 q 814 134 783 116 q 864 165 846 153 q 915 202 883 177 q 952 230 946 226 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1142 483 l 1173 443 q 1178 425 1179 435 q 1169 409 1177 415 q 1071 333 1135 383 q 957 245 1006 283 q 905 205 908 208 q 859 168 875 181 q 812 136 842 156 q 753 108 781 117 q 695 99 724 99 l 694 99 l 694 99 q 636 108 665 99 q 577 136 608 117 q 530 169 547 156 q 484 205 513 181 q 433 245 480 208 q 322 331 387 281 q 227 404 257 381 q 217 420 219 410 q 222 438 216 429 l 251 478 q 268 488 257 487 q 287 483 278 490 q 524 300 360 426 q 558 273 528 297 q 605 237 587 249 q 648 212 622 225 q 694 198 675 198 l 694 198 l 695 198 q 741 212 714 198 q 784 237 767 225 q 831 273 801 249 q 865 300 861 297 q 1108 488 1065 453 q 1126 493 1116 494 q 1142 483 1136 491 m 1290 -74 l 1290 645 q 1166 753 1220 709 q 865 988 1096 810 q 832 1015 863 990 q 784 1053 801 1041 q 741 1078 768 1064 q 695 1091 714 1091 l 694 1091 l 694 1091 q 648 1078 675 1091 q 605 1053 621 1064 q 557 1015 588 1041 q 524 988 526 990 q 279 798 357 860 q 179 717 202 736 q 115 660 157 698 q 99 645 105 650 l 99 -74 q 107 -92 99 -84 q 124 -99 114 -99 l 1265 -99 q 1282 -92 1275 -99 q 1290 -74 1290 -84 m 1389 645 l 1389 -74 q 1352 -162 1389 -126 q 1265 -198 1316 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 645 q 32 718 0 688 q 303 943 127 806 q 484 1084 479 1080 q 529 1120 512 1107 q 577 1153 547 1134 q 636 1181 607 1172 q 694 1190 665 1190 l 694 1190 l 695 1190 q 753 1181 724 1190 q 812 1153 782 1172 q 860 1120 842 1134 q 905 1084 877 1107 q 1026 989 939 1056 q 1201 852 1114 922 q 1357 718 1289 781 q 1389 645 1389 688 z "},"飱�":{"ha":1190,"x_min":16,"x_max":1174,"o":"m 256 1 l 412 -165 l 386 18 l 219 183 l 256 1 m 431 -174 l 643 -5 l 635 184 l 402 18 l 431 -174 m 190 320 l 366 155 l 329 408 l 139 567 l 190 320 m 384 146 l 629 312 l 618 563 l 346 408 l 384 146 m 653 138 l 727 76 l 725 261 l 646 322 q 646 316 646 322 q 646 307 647 310 q 643 301 646 303 l 582 260 l 648 206 q 653 138 653 202 m 107 721 l 305 566 l 253 926 l 36 1060 l 107 721 m 909 207 l 921 388 l 742 261 l 744 75 l 909 207 m 323 560 l 612 710 l 598 1052 l 270 925 l 323 560 m 984 277 l 1000 457 l 825 567 l 823 486 l 935 412 q 938 405 939 409 l 932 313 l 984 277 m 1132 384 l 1156 556 l 1017 457 l 1001 281 l 1132 384 m 987 255 l 932 293 l 925 202 q 922 196 925 198 l 741 51 q 730 51 736 47 l 654 115 l 660 -9 q 656 -16 660 -13 l 429 -197 q 425 -198 426 -198 q 419 -196 419 -197 l 242 -9 q 196 206 239 -5 q 200 215 195 212 l 247 243 q 174 315 174 310 l 118 587 q 122 596 116 592 l 195 631 q 91 715 92 708 l 16 1076 q 22 1086 15 1084 l 357 1190 q 363 1190 361 1190 l 609 1071 q 614 1064 614 1068 l 629 705 q 625 698 629 700 l 533 650 l 631 584 q 635 578 635 583 l 639 483 l 732 540 q 741 540 736 543 l 806 497 l 808 582 q 812 589 808 587 l 972 687 q 980 687 977 689 l 1170 582 q 1174 577 1173 579 q 1169 530 1175 574 q 1156 434 1163 486 q 1148 379 1148 381 q 1145 374 1148 375 l 997 255 q 987 255 992 251 z "},"飱�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 931 231 q 927 314 931 275 q 910 392 922 353 q 880 458 898 431 q 830 503 861 486 q 760 521 799 521 q 734 505 755 518 q 701 486 712 492 q 669 470 689 480 q 631 457 649 461 q 595 453 613 453 q 559 457 577 453 q 521 470 541 461 q 490 486 501 480 q 457 505 478 492 q 431 521 436 518 q 360 503 391 521 q 311 458 329 486 q 280 392 292 431 q 264 314 268 353 q 260 231 260 275 q 292 137 260 174 q 372 99 325 99 l 818 99 q 898 137 866 99 q 931 231 931 174 m 797 691 q 737 834 797 775 q 595 893 678 893 q 453 834 512 893 q 394 691 394 775 q 453 550 394 608 q 595 491 512 491 q 737 550 678 491 q 797 691 797 608 m 1290 273 l 1290 124 q 1283 106 1290 113 q 1265 99 1276 99 l 1190 99 l 1190 -74 q 1154 -162 1190 -126 q 1066 -198 1118 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 1066 q 36 1154 0 1118 q 124 1190 73 1190 l 1066 1190 q 1154 1154 1118 1190 q 1190 1066 1190 1118 l 1190 893 l 1265 893 q 1283 886 1276 893 q 1290 868 1290 879 l 1290 719 q 1283 701 1290 708 q 1265 694 1276 694 l 1190 694 l 1190 595 l 1265 595 q 1283 588 1276 595 q 1290 570 1290 581 l 1290 422 q 1283 404 1290 411 q 1265 397 1276 397 l 1190 397 l 1190 298 l 1265 298 q 1283 291 1276 298 q 1290 273 1290 284 z "},"飱�":{"ha":1290,"x_min":0,"x_max":1290,"o":"m 797 691 q 737 550 797 608 q 595 491 678 491 q 453 550 512 491 q 394 691 394 608 q 453 834 394 775 q 595 893 512 893 q 737 834 678 893 q 797 691 797 775 m 760 521 q 823 508 795 521 q 870 471 852 494 q 901 419 888 447 q 919 356 913 391 q 928 292 925 322 q 931 231 931 263 q 900 139 931 179 q 818 99 870 99 l 372 99 q 290 139 321 99 q 260 231 260 179 q 263 303 260 268 q 277 380 267 339 q 306 451 288 421 q 355 501 323 481 q 427 521 386 521 l 431 521 q 456 506 436 518 q 483 489 475 494 q 509 476 491 485 q 537 464 526 467 q 565 457 549 460 q 595 453 581 453 q 626 457 610 453 q 653 464 642 460 q 682 476 664 467 q 707 489 699 485 q 735 506 715 494 q 760 521 754 518 m 1290 719 q 1282 702 1290 709 q 1265 694 1275 694 l 1190 694 l 1190 595 l 1265 595 q 1282 588 1275 595 q 1290 570 1290 581 l 1290 422 q 1282 404 1290 412 q 1265 397 1275 397 l 1190 397 l 1190 298 l 1265 298 q 1282 290 1275 298 q 1290 273 1290 283 l 1290 124 q 1282 107 1290 114 q 1265 99 1275 99 l 1190 99 l 1190 -74 q 1154 -162 1190 -126 q 1066 -198 1118 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 1066 q 36 1154 0 1118 q 124 1190 73 1190 l 1066 1190 q 1154 1154 1118 1190 q 1190 1066 1190 1118 l 1190 893 l 1265 893 q 1282 885 1275 893 q 1290 868 1290 878 l 1290 719 m 1091 -74 l 1091 1066 q 1084 1084 1091 1077 q 1066 1091 1077 1091 l 124 1091 q 107 1084 114 1091 q 99 1066 99 1077 l 99 -74 q 107 -92 99 -84 q 124 -99 114 -99 l 1066 -99 q 1084 -92 1077 -99 q 1091 -74 1091 -84 z "},"飱�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 765 231 q 779 248 765 231 q 794 314 794 264 q 787 405 794 363 q 764 485 780 446 q 717 545 748 523 q 642 567 686 567 q 618 553 637 564 q 589 537 600 543 q 562 523 579 531 q 529 512 545 515 q 496 508 512 508 q 463 512 480 508 q 430 523 447 515 q 403 537 413 531 q 374 553 392 543 q 350 567 355 564 q 275 545 306 567 q 228 485 244 523 q 205 405 212 446 q 198 314 198 363 q 227 231 198 264 q 298 198 256 198 l 694 198 q 765 231 736 198 m 620 593 q 646 618 620 593 q 672 717 672 644 q 620 841 672 790 q 496 893 569 893 q 372 841 423 893 q 320 717 320 790 q 372 593 320 644 q 496 541 423 541 q 620 593 569 541 m 1389 322 l 1389 372 q 1382 390 1389 383 q 1364 397 1375 397 l 918 397 q 900 390 907 397 q 893 372 893 383 l 893 322 q 900 305 893 312 q 918 298 907 298 l 1364 298 q 1382 305 1375 298 q 1389 322 1389 312 m 1389 524 l 1389 567 q 1381 587 1389 579 q 1361 595 1373 595 l 921 595 q 901 587 909 595 q 893 567 893 579 l 893 524 q 901 504 893 512 q 921 496 909 496 l 1361 496 q 1381 504 1373 496 q 1389 524 1389 512 m 1389 719 l 1389 769 q 1382 787 1389 780 q 1364 794 1375 794 l 918 794 q 900 787 907 794 q 893 769 893 780 l 893 719 q 900 701 893 708 q 918 694 907 694 l 1364 694 q 1382 701 1375 694 q 1389 719 1389 708 m 1587 967 l 1587 25 q 1551 -63 1587 -26 q 1463 -99 1514 -99 l 1190 -99 l 1190 -25 q 1184 -7 1190 -14 q 1166 0 1177 0 l 1116 0 q 1098 -7 1105 0 q 1091 -25 1091 -14 l 1091 -99 l 496 -99 l 496 -25 q 489 -7 496 -14 q 471 0 482 0 l 422 0 q 404 -7 411 0 q 397 -25 397 -14 l 397 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1463 1091 q 1551 1055 1514 1091 q 1587 967 1587 1018 z "},"飱�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 787 405 q 790 384 787 405 q 794 314 794 363 q 765 231 794 264 q 694 198 736 198 l 298 198 q 227 231 256 198 q 198 314 198 264 q 205 405 198 363 q 228 485 212 446 q 275 545 244 523 q 350 567 306 567 q 374 553 355 564 q 403 537 392 543 q 430 523 413 531 q 463 512 447 515 q 496 508 480 508 q 529 512 512 508 q 562 523 545 515 q 589 537 579 531 q 618 553 600 543 q 642 567 637 564 q 717 545 686 567 q 764 485 748 523 q 787 405 780 446 m 620 841 q 646 816 620 841 q 672 717 672 790 q 620 593 672 644 q 496 541 569 541 q 372 593 423 541 q 320 717 320 644 q 372 841 320 790 q 496 893 423 893 q 620 841 569 893 m 1389 372 l 1389 322 q 1382 305 1389 312 q 1364 298 1375 298 l 918 298 q 900 305 907 298 q 893 322 893 312 l 893 372 q 900 390 893 383 q 918 397 907 397 l 1364 397 q 1382 390 1375 397 q 1389 372 1389 383 m 1389 567 l 1389 524 q 1381 504 1389 512 q 1361 496 1373 496 l 921 496 q 901 504 909 496 q 893 524 893 512 l 893 567 q 901 587 893 579 q 921 595 909 595 l 1361 595 q 1381 587 1373 595 q 1389 567 1389 579 m 1389 769 l 1389 719 q 1382 701 1389 708 q 1364 694 1375 694 l 918 694 q 900 701 907 694 q 893 719 893 708 l 893 769 q 900 787 893 780 q 918 794 907 794 l 1364 794 q 1382 787 1375 794 q 1389 769 1389 780 m 1488 25 l 1488 967 q 1481 985 1488 977 q 1463 992 1473 992 l 124 992 q 107 985 114 992 q 99 967 99 977 l 99 25 q 107 7 99 15 q 124 0 114 0 l 397 0 l 397 74 q 404 92 397 85 q 422 99 411 99 l 471 99 q 489 92 482 99 q 496 74 496 85 l 496 0 l 1091 0 l 1091 74 q 1098 92 1091 85 q 1116 99 1105 99 l 1166 99 q 1184 92 1177 99 q 1190 74 1190 85 l 1190 0 l 1463 0 q 1481 7 1473 0 q 1488 25 1488 15 m 1587 967 l 1587 25 q 1551 -63 1587 -26 q 1463 -99 1514 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1463 1091 q 1551 1055 1514 1091 q 1587 967 1587 1018 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1180 153 q 1113 352 1163 273 q 970 444 1062 432 q 846 355 918 387 q 694 322 774 322 q 543 355 615 322 q 419 444 471 387 q 276 352 327 432 q 208 153 226 273 q 419 -31 291 36 q 694 -99 546 -99 q 970 -31 842 -99 q 1180 153 1098 36 m 905 484 q 948 528 905 484 q 992 694 992 571 q 905 905 992 818 q 694 992 818 992 q 484 905 571 992 q 397 694 397 818 q 484 484 397 571 q 694 397 571 397 q 905 484 818 397 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 227 1389 355 q 1186 5 1279 98 q 965 -143 1094 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飱�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 425 1135 q 489 1163 425 1135 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 q 1389 496 1389 637 q 1334 227 1389 356 q 1187 5 1280 98 q 965 -143 1094 -88 q 694 -198 836 -198 q 424 -143 553 -198 q 203 5 295 -88 q 55 227 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 m 1174 143 q 1290 496 1290 302 q 1242 727 1290 617 q 1115 917 1195 837 q 925 1044 1035 997 q 694 1091 815 1091 q 463 1044 574 1091 q 274 917 353 997 q 146 727 194 837 q 99 496 99 617 q 215 143 99 302 q 452 397 266 397 q 694 298 553 298 q 937 397 836 298 q 1174 143 1123 397 m 905 434 q 948 478 905 434 q 992 645 992 522 q 905 855 992 768 q 694 942 818 942 q 484 855 571 942 q 397 645 397 768 q 484 434 397 522 q 694 347 571 347 q 905 434 818 347 z "},"飲�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 931 583 q 1000 553 967 572 q 1069 497 1033 535 q 1131 407 1105 459 q 1173 274 1156 356 q 1190 91 1190 192 q 1113 -114 1190 -29 q 926 -198 1035 -198 l 264 -198 q 78 -114 155 -198 q 0 91 0 -29 q 17 274 0 192 q 60 407 34 356 q 121 497 85 459 q 190 553 157 535 q 260 583 223 572 q 198 794 198 680 q 230 947 198 874 q 315 1074 261 1021 q 441 1159 368 1128 q 595 1190 515 1190 q 749 1159 676 1190 q 876 1074 822 1128 q 961 947 929 1021 q 992 794 992 874 q 931 583 992 680 m 806 1004 q 762 1048 806 1004 q 595 1091 718 1091 q 385 1004 472 1091 q 298 794 298 917 q 385 583 298 670 q 595 496 472 496 q 806 583 718 496 q 893 794 893 670 q 806 1004 893 917 m 926 -99 q 1043 -44 994 -99 q 1091 91 1091 12 q 1030 383 1091 276 q 856 495 970 490 q 595 397 743 397 q 335 495 447 397 q 160 383 221 490 q 99 91 99 276 q 148 -44 99 12 q 264 -99 196 -99 l 926 -99 z "},"飲�":{"ha":992,"x_min":0,"x_max":992,"o":"m 787 307 q 790 286 787 307 q 794 215 794 265 q 765 133 794 166 q 694 99 736 99 l 298 99 q 227 133 256 99 q 198 215 198 166 q 205 307 198 265 q 228 388 212 349 q 276 448 244 426 q 350 470 307 470 q 496 412 412 412 q 642 470 580 412 q 717 448 685 470 q 764 388 748 426 q 787 307 780 349 m 622 742 q 648 716 622 742 q 674 618 674 691 q 622 493 674 545 q 496 442 570 442 q 370 493 422 442 q 318 618 318 545 q 370 742 318 691 q 496 794 422 794 q 622 742 570 794 m 893 -74 l 893 992 l 99 992 l 99 -74 q 107 -92 99 -84 q 124 -99 114 -99 l 868 -99 q 885 -92 878 -99 q 893 -74 893 -84 m 992 1066 l 992 -74 q 956 -162 992 -126 q 868 -198 919 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 1066 q 36 1154 0 1118 q 124 1190 73 1190 l 397 1190 l 397 1116 q 404 1098 397 1105 q 422 1091 411 1091 l 570 1091 q 588 1098 581 1091 q 595 1116 595 1105 l 595 1190 l 868 1190 q 956 1154 919 1190 q 992 1066 992 1118 z "},"飲�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 694 251 q 689 329 694 293 q 670 399 683 365 q 630 452 656 432 q 567 471 604 471 q 446 422 518 422 q 326 471 375 422 q 263 452 289 471 q 223 399 236 432 q 204 329 210 365 q 198 251 198 293 q 223 179 198 208 q 281 149 247 149 l 612 149 q 670 179 646 149 q 694 251 694 208 m 552 490 q 574 512 552 490 q 595 595 595 533 q 552 701 595 657 q 446 744 508 744 q 341 701 384 744 q 298 595 298 657 q 341 490 298 533 q 446 446 384 446 q 552 490 508 446 m 1389 223 l 1389 273 q 1382 291 1389 284 q 1364 298 1375 298 l 818 298 q 801 291 808 298 q 794 273 794 284 l 794 223 q 801 205 794 212 q 818 198 808 198 l 1364 198 q 1382 205 1375 198 q 1389 223 1389 212 m 1091 422 l 1091 471 q 1084 489 1091 482 q 1066 496 1077 496 l 818 496 q 801 489 808 496 q 794 471 794 482 l 794 422 q 801 404 794 411 q 818 397 808 397 l 1066 397 q 1084 404 1077 397 q 1091 422 1091 411 m 1389 422 l 1389 471 q 1382 489 1389 482 q 1364 496 1375 496 l 1215 496 q 1197 489 1204 496 q 1190 471 1190 482 l 1190 422 q 1197 404 1190 411 q 1215 397 1204 397 l 1364 397 q 1382 404 1375 397 q 1389 422 1389 411 m 1389 620 l 1389 670 q 1382 687 1389 680 q 1364 694 1375 694 l 818 694 q 801 687 808 694 q 794 670 794 680 l 794 620 q 801 602 794 609 q 818 595 808 595 l 1364 595 q 1382 602 1375 595 q 1389 620 1389 609 m 99 893 l 1488 893 l 1488 967 q 1481 985 1488 978 q 1463 992 1474 992 l 124 992 q 106 985 113 992 q 99 967 99 978 l 99 893 m 1587 967 l 1587 25 q 1551 -63 1587 -26 q 1463 -99 1514 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1463 1091 q 1551 1055 1514 1091 q 1587 967 1587 1018 z "},"飲�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 694 251 q 670 179 694 208 q 612 149 646 149 l 281 149 q 223 179 247 149 q 198 251 198 208 q 204 329 198 293 q 223 399 210 365 q 263 452 236 432 q 326 471 289 471 q 446 422 375 422 q 567 471 518 422 q 630 452 604 471 q 670 399 656 432 q 689 329 683 365 q 694 251 694 293 m 552 701 q 574 679 552 701 q 595 595 595 657 q 552 490 595 533 q 446 446 508 446 q 341 490 384 446 q 298 595 298 533 q 341 701 298 657 q 446 744 384 744 q 552 701 508 744 m 1389 273 l 1389 223 q 1382 205 1389 212 q 1364 198 1375 198 l 818 198 q 801 205 808 198 q 794 223 794 212 l 794 273 q 801 291 794 284 q 818 298 808 298 l 1364 298 q 1382 291 1375 298 q 1389 273 1389 284 m 1091 471 l 1091 422 q 1084 404 1091 411 q 1066 397 1077 397 l 818 397 q 801 404 808 397 q 794 422 794 411 l 794 471 q 801 489 794 482 q 818 496 808 496 l 1066 496 q 1084 489 1077 496 q 1091 471 1091 482 m 1389 471 l 1389 422 q 1382 404 1389 411 q 1364 397 1375 397 l 1215 397 q 1197 404 1204 397 q 1190 422 1190 411 l 1190 471 q 1197 489 1190 482 q 1215 496 1204 496 l 1364 496 q 1382 489 1375 496 q 1389 471 1389 482 m 1389 670 l 1389 620 q 1382 602 1389 609 q 1364 595 1375 595 l 818 595 q 801 602 808 595 q 794 620 794 609 l 794 670 q 801 687 794 680 q 818 694 808 694 l 1364 694 q 1382 687 1375 694 q 1389 670 1389 680 m 1488 25 l 1488 893 l 99 893 l 99 25 q 107 7 99 15 q 124 0 114 0 l 1463 0 q 1481 7 1473 0 q 1488 25 1488 15 m 1587 967 l 1587 25 q 1551 -63 1587 -26 q 1463 -99 1514 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1463 1091 q 1551 1055 1514 1091 q 1587 967 1587 1018 z "},"飲�":{"ha":1389,"x_min":22,"x_max":1366,"o":"m 973 581 q 891 948 973 827 q 636 1070 810 1070 q 383 948 463 1070 q 302 581 302 826 q 383 215 302 336 q 636 95 463 95 q 737 108 693 95 q 707 164 720 141 q 673 215 694 188 q 631 258 652 242 q 582 286 611 275 q 522 298 554 298 q 461 285 487 298 l 423 360 q 637 431 505 431 q 804 389 739 431 q 921 269 869 347 q 973 581 973 384 m 1275 91 l 1366 91 q 1364 39 1368 70 q 1344 -35 1360 8 q 1299 -113 1327 -78 q 1216 -173 1270 -148 q 1090 -198 1161 -198 q 989 -184 1035 -198 q 907 -140 942 -169 q 846 -80 871 -112 q 794 -5 820 -48 q 636 -26 719 -26 q 409 19 519 -26 q 213 141 298 64 q 75 334 127 219 q 22 581 22 450 q 75 828 22 712 q 213 1022 127 944 q 410 1146 299 1101 q 636 1190 520 1190 q 820 1163 729 1190 q 989 1080 911 1135 q 1125 953 1066 1026 q 1218 783 1184 880 q 1251 581 1251 687 q 1189 311 1251 433 q 1019 106 1126 189 q 1092 24 1056 52 q 1173 -5 1128 -5 q 1246 24 1220 -5 q 1275 91 1271 53 z "},"飲�":{"ha":1786,"x_min":0,"x_max":1786,"o":"m 351 -78 q 339 -107 351 -95 q 310 -120 326 -120 q 300 -118 309 -120 q 174 -9 251 -106 q 0 515 0 211 q 165 991 0 779 q 239 1071 195 1030 q 312 1111 282 1111 q 339 1101 326 1111 q 351 1076 351 1090 q 302 1006 351 1055 q 188 863 226 927 q 96 515 96 709 q 191 135 96 298 q 297 1 230 69 q 308 -12 298 -2 q 323 -28 318 -22 q 336 -44 329 -34 q 348 -62 344 -53 q 351 -78 351 -71 m 1392 26 q 1378 -12 1392 3 q 1342 -27 1365 -27 l 505 -27 q 470 -12 484 -27 q 455 22 455 2 q 469 60 455 45 q 505 75 482 75 l 1342 75 q 1377 60 1363 75 q 1392 26 1392 46 m 1225 499 q 1173 319 1225 395 q 1120 258 1154 289 q 1055 211 1085 226 q 1034 203 1042 203 q 1022 208 1028 203 q 1016 217 1016 212 q 1031 240 1016 224 q 1063 276 1046 257 q 1096 328 1081 295 q 1111 397 1111 361 q 1084 498 1111 456 q 1048 530 1061 530 q 1046 526 1046 530 q 1051 499 1046 517 q 1057 470 1057 481 q 1041 443 1057 453 q 1006 433 1024 433 q 955 492 955 433 q 956 526 955 504 q 957 560 957 549 q 949 596 957 580 q 917 637 939 615 q 877 660 894 660 q 872 659 873 660 q 869 657 870 659 q 868 653 868 656 q 880 632 868 651 q 893 591 893 614 q 878 538 893 562 q 842 496 863 514 q 801 460 822 478 q 766 419 780 443 q 751 366 751 395 q 784 242 751 290 q 845 193 806 208 q 858 185 857 189 q 859 181 859 184 q 845 169 859 169 q 819 177 840 169 q 668 286 727 211 q 609 455 609 360 q 628 544 609 498 q 675 634 647 591 q 729 718 702 676 q 775 806 756 760 q 794 892 794 852 q 775 965 794 933 q 732 1015 753 1002 q 717 1031 717 1022 q 749 1046 717 1046 q 834 1024 787 1046 q 889 989 866 1009 q 927 950 912 970 q 953 901 942 930 q 970 848 964 873 q 983 786 977 823 q 985 772 983 785 q 989 753 987 760 q 993 734 990 746 q 1000 713 996 721 q 1008 696 1004 705 q 1020 683 1013 687 q 1034 679 1026 679 q 1063 690 1052 679 q 1073 718 1073 701 q 1058 770 1073 738 q 1042 811 1042 803 q 1050 818 1042 818 q 1122 764 1071 818 q 1202 643 1178 705 q 1225 499 1225 581 m 1786 477 q 1679 87 1786 264 q 1642 31 1664 62 q 1589 -36 1619 0 q 1526 -96 1559 -72 q 1469 -119 1494 -119 q 1445 -107 1456 -119 q 1433 -83 1433 -95 q 1456 -44 1433 -71 q 1509 16 1478 -16 q 1546 57 1539 48 q 1688 468 1688 235 q 1672 650 1688 570 q 1616 814 1656 731 q 1490 991 1571 906 q 1480 1001 1488 993 q 1467 1014 1471 1009 q 1455 1027 1463 1018 q 1444 1043 1448 1036 q 1436 1057 1439 1049 q 1433 1072 1433 1065 q 1445 1099 1433 1087 q 1473 1112 1458 1112 q 1625 981 1527 1112 q 1738 770 1700 880 q 1784 526 1775 660 q 1786 477 1786 494 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 922 177 l 1035 715 q 1027 763 1042 749 q 987 769 1012 778 l 318 511 q 287 491 295 502 q 285 471 279 481 q 310 456 291 461 l 481 402 l 879 653 q 904 657 895 663 q 901 646 909 653 l 579 355 l 579 355 l 579 355 l 567 178 q 601 195 584 178 l 685 276 l 859 148 q 922 177 908 120 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飲�":{"ha":794,"x_min":0,"x_max":794,"o":"m 496 149 q 453 43 496 87 q 347 0 409 0 q 242 43 285 0 q 198 149 198 87 q 226 234 198 195 q 298 289 253 273 l 298 992 l 397 992 l 397 289 q 469 234 442 273 q 496 149 496 195 m 595 149 q 569 260 595 208 q 496 347 543 312 l 496 942 q 453 1048 496 1004 q 347 1091 409 1091 q 242 1048 285 1091 q 198 942 198 1004 l 198 347 q 126 260 152 312 q 99 149 99 208 q 172 -27 99 46 q 347 -99 244 -99 q 523 -27 450 -99 q 595 149 595 46 m 694 149 q 593 -96 694 5 q 347 -198 491 -198 q 102 -96 204 -198 q 0 149 0 5 q 99 391 0 290 l 99 942 q 172 1118 99 1046 q 347 1190 244 1190 q 523 1118 450 1190 q 595 942 595 1046 l 595 391 q 694 149 694 290 m 794 595 l 794 496 l 645 496 l 645 595 l 794 595 m 794 794 l 794 694 l 645 694 l 645 794 l 794 794 m 794 992 l 794 893 l 645 893 l 645 992 l 794 992 z "},"飲�":{"ha":794,"x_min":0,"x_max":794,"o":"m 496 149 q 453 43 496 87 q 347 0 409 0 q 242 43 285 0 q 198 149 198 87 q 226 234 198 195 q 298 289 253 273 l 298 794 l 397 794 l 397 289 q 469 234 442 273 q 496 149 496 195 m 595 149 q 569 260 595 208 q 496 347 543 312 l 496 942 q 453 1048 496 1004 q 347 1091 409 1091 q 242 1048 285 1091 q 198 942 198 1004 l 198 347 q 126 260 152 312 q 99 149 99 208 q 172 -27 99 46 q 347 -99 244 -99 q 523 -27 450 -99 q 595 149 595 46 m 694 149 q 593 -96 694 5 q 347 -198 491 -198 q 102 -96 204 -198 q 0 149 0 5 q 99 391 0 290 l 99 942 q 172 1118 99 1046 q 347 1190 244 1190 q 523 1118 450 1190 q 595 942 595 1046 l 595 391 q 694 149 694 290 m 794 595 l 794 496 l 645 496 l 645 595 l 794 595 m 794 794 l 794 694 l 645 694 l 645 794 l 794 794 m 794 992 l 794 893 l 645 893 l 645 992 l 794 992 z "},"飲�":{"ha":794,"x_min":0,"x_max":794,"o":"m 496 149 q 453 43 496 87 q 347 0 409 0 q 242 43 285 0 q 198 149 198 87 q 226 234 198 195 q 298 289 253 273 l 298 595 l 397 595 l 397 289 q 469 234 442 273 q 496 149 496 195 m 595 149 q 569 260 595 208 q 496 347 543 312 l 496 942 q 453 1048 496 1004 q 347 1091 409 1091 q 242 1048 285 1091 q 198 942 198 1004 l 198 347 q 126 260 152 312 q 99 149 99 208 q 172 -27 99 46 q 347 -99 244 -99 q 523 -27 450 -99 q 595 149 595 46 m 694 149 q 593 -96 694 5 q 347 -198 491 -198 q 102 -96 204 -198 q 0 149 0 5 q 99 391 0 290 l 99 942 q 172 1118 99 1046 q 347 1190 244 1190 q 523 1118 450 1190 q 595 942 595 1046 l 595 391 q 694 149 694 290 m 794 595 l 794 496 l 645 496 l 645 595 l 794 595 m 794 794 l 794 694 l 645 694 l 645 794 l 794 794 m 794 992 l 794 893 l 645 893 l 645 992 l 794 992 z "},"飲�":{"ha":794,"x_min":0,"x_max":794,"o":"m 496 149 q 453 43 496 87 q 347 0 409 0 q 242 43 285 0 q 198 149 198 87 q 226 234 198 195 q 298 289 253 273 l 298 397 l 397 397 l 397 289 q 469 234 442 273 q 496 149 496 195 m 595 149 q 569 260 595 208 q 496 347 543 312 l 496 942 q 453 1048 496 1004 q 347 1091 409 1091 q 242 1048 285 1091 q 198 942 198 1004 l 198 347 q 126 260 152 312 q 99 149 99 208 q 172 -27 99 46 q 347 -99 244 -99 q 523 -27 450 -99 q 595 149 595 46 m 694 149 q 593 -96 694 5 q 347 -198 491 -198 q 102 -96 204 -198 q 0 149 0 5 q 99 391 0 290 l 99 942 q 172 1118 99 1046 q 347 1190 244 1190 q 523 1118 450 1190 q 595 942 595 1046 l 595 391 q 694 149 694 290 m 794 595 l 794 496 l 645 496 l 645 595 l 794 595 m 794 794 l 794 694 l 645 694 l 645 794 l 794 794 m 794 992 l 794 893 l 645 893 l 645 992 l 794 992 z "},"飲�":{"ha":794,"x_min":0,"x_max":794,"o":"m 496 149 q 453 43 496 87 q 347 0 409 0 q 242 43 285 0 q 198 149 198 87 q 242 254 198 210 q 347 298 285 298 q 453 254 409 298 q 496 149 496 210 m 595 149 q 569 260 595 208 q 496 347 543 312 l 496 942 q 453 1048 496 1004 q 347 1091 409 1091 q 242 1048 285 1091 q 198 942 198 1004 l 198 347 q 126 260 152 312 q 99 149 99 208 q 172 -27 99 46 q 347 -99 244 -99 q 523 -27 450 -99 q 595 149 595 46 m 694 149 q 593 -96 694 5 q 347 -198 491 -198 q 102 -96 204 -198 q 0 149 0 5 q 99 391 0 290 l 99 942 q 172 1118 99 1046 q 347 1190 244 1190 q 523 1118 450 1190 q 595 942 595 1046 l 595 391 q 694 149 694 290 m 794 595 l 794 496 l 645 496 l 645 595 l 794 595 m 794 794 l 794 694 l 645 694 l 645 794 l 794 794 m 794 992 l 794 893 l 645 893 l 645 992 l 794 992 z "},"飲�":{"ha":1488,"x_min":0,"x_max":1488,"o":"m 1111 997 q 1118 980 1118 990 q 1111 962 1118 970 l 625 477 q 608 469 618 469 q 590 477 598 469 l 526 540 q 519 558 519 548 q 526 576 519 568 l 560 610 q 497 770 505 680 q 533 937 490 860 q 397 992 476 992 q 257 934 315 992 q 198 794 198 876 l 198 -198 l 0 -198 l 0 794 q 31 947 0 874 q 116 1074 63 1021 q 243 1159 170 1128 q 397 1190 316 1190 q 553 1159 479 1190 q 681 1070 626 1127 q 834 1089 754 1100 q 977 1027 914 1077 l 1011 1061 q 1029 1069 1019 1069 q 1047 1061 1039 1069 l 1111 997 m 1007 779 q 1014 786 1007 779 q 1042 794 1022 794 q 1077 779 1062 794 q 1091 744 1091 764 q 1077 709 1091 724 q 1042 694 1062 694 q 1007 709 1022 694 q 992 744 992 724 q 1007 779 992 764 m 1275 709 q 1268 702 1275 709 q 1240 694 1260 694 q 1205 709 1220 694 q 1190 744 1190 724 q 1205 779 1190 764 q 1240 794 1220 794 q 1275 779 1260 794 q 1290 744 1290 764 q 1275 709 1290 724 m 1404 779 q 1411 786 1404 779 q 1438 794 1418 794 q 1473 779 1459 794 q 1488 744 1488 764 q 1473 709 1488 724 q 1438 694 1459 694 q 1404 709 1418 694 q 1389 744 1389 724 q 1404 779 1389 764 m 908 680 q 915 687 908 680 q 942 694 922 694 q 977 680 963 694 q 992 645 992 665 q 977 610 992 625 q 942 595 963 595 q 908 610 922 595 q 893 645 893 625 q 908 680 893 665 m 1106 610 q 1099 617 1106 610 q 1091 645 1091 625 q 1106 680 1091 665 q 1141 694 1121 694 q 1176 680 1161 694 q 1190 645 1190 665 q 1176 610 1190 625 q 1141 595 1161 595 q 1106 610 1121 595 m 1304 680 q 1312 687 1304 680 q 1339 694 1319 694 q 1374 680 1359 694 q 1389 645 1389 665 q 1374 610 1389 625 q 1339 595 1359 595 q 1304 610 1319 595 q 1290 645 1290 625 q 1304 680 1290 665 m 808 581 q 816 588 808 581 q 843 595 823 595 q 878 581 863 595 q 893 546 893 566 q 878 511 893 525 q 843 496 863 496 q 808 511 823 496 q 794 546 794 525 q 808 581 794 566 m 1077 511 q 1069 503 1077 511 q 1042 496 1062 496 q 1007 511 1022 496 q 992 546 992 525 q 1007 581 992 566 q 1042 595 1022 595 q 1077 581 1062 595 q 1091 546 1091 566 q 1077 511 1091 525 m 1205 581 q 1213 588 1205 581 q 1240 595 1220 595 q 1275 581 1260 595 q 1290 546 1290 566 q 1275 511 1290 525 q 1240 496 1260 496 q 1205 511 1220 496 q 1190 546 1190 525 q 1205 581 1190 566 m 977 412 q 970 404 977 412 q 942 397 963 397 q 908 412 922 397 q 893 446 893 426 q 908 481 893 467 q 942 496 922 496 q 977 481 963 496 q 992 446 992 467 q 977 412 992 426 m 1106 481 q 1113 489 1106 481 q 1141 496 1121 496 q 1176 481 1161 496 q 1190 446 1190 467 q 1176 412 1190 426 q 1141 397 1161 397 q 1106 412 1121 397 q 1091 446 1091 426 q 1106 481 1091 467 m 808 382 q 816 389 808 382 q 843 397 823 397 q 878 382 863 397 q 893 347 893 367 q 878 312 893 327 q 843 298 863 298 q 808 312 823 298 q 794 347 794 327 q 808 382 794 367 m 1007 382 q 1014 389 1007 382 q 1042 397 1022 397 q 1077 382 1062 397 q 1091 347 1091 367 q 1077 312 1091 327 q 1042 298 1062 298 q 1007 312 1022 298 q 992 347 992 327 q 1007 382 992 367 m 908 283 q 915 290 908 283 q 942 298 922 298 q 977 283 963 298 q 992 248 992 268 q 977 213 992 228 q 942 198 963 198 q 908 213 922 198 q 893 248 893 228 q 908 283 893 268 m 808 184 q 816 191 808 184 q 843 198 823 198 q 878 184 863 198 q 893 149 893 169 q 878 114 893 129 q 843 99 863 99 q 808 114 823 99 q 794 149 794 129 q 808 184 794 169 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1290 347 l 1290 198 q 1190 -23 1290 67 l 1190 -174 q 1184 -191 1190 -184 q 1166 -198 1177 -198 l 1116 -198 q 1098 -191 1105 -198 q 1091 -174 1091 -184 l 1091 -82 q 992 -99 1042 -99 l 397 -99 q 298 -82 346 -99 l 298 -167 q 290 -189 298 -181 q 273 -198 283 -198 l 223 -198 q 206 -189 213 -198 q 198 -167 198 -181 l 198 -23 q 99 198 99 67 l 99 347 l 1290 347 m 539 687 q 542 684 539 687 q 546 670 546 680 q 539 652 546 659 q 521 645 532 645 q 503 652 510 645 q 496 670 496 659 q 503 687 496 680 q 521 694 510 694 q 539 687 532 694 m 588 737 q 592 734 588 737 q 595 719 595 730 q 588 701 595 708 q 570 694 581 694 q 553 701 560 694 q 546 719 546 708 q 553 737 546 730 q 570 744 560 744 q 588 737 581 744 m 539 787 q 542 783 539 787 q 546 769 546 780 q 539 751 546 758 q 521 744 532 744 q 503 751 510 744 q 496 769 496 758 q 503 787 496 780 q 521 794 510 794 q 539 787 532 794 m 638 787 q 641 783 638 787 q 645 769 645 780 q 638 751 645 758 q 620 744 631 744 q 602 751 609 744 q 595 769 595 758 q 602 787 595 780 q 620 794 609 794 q 638 787 631 794 m 588 836 q 592 833 588 836 q 595 818 595 829 q 588 801 595 808 q 570 794 581 794 q 553 801 560 794 q 546 818 546 808 q 553 836 546 829 q 570 843 560 843 q 588 836 581 843 m 539 886 q 542 882 539 886 q 546 868 546 879 q 539 850 546 857 q 521 843 532 843 q 503 850 510 843 q 496 868 496 857 q 503 886 496 879 q 521 893 510 893 q 539 886 532 893 m 1389 471 l 1389 422 q 1382 404 1389 411 q 1364 397 1375 397 l 25 397 q 7 404 14 397 q 0 422 0 411 l 0 471 q 7 489 0 482 q 25 496 14 496 l 99 496 l 99 992 q 157 1132 99 1074 q 298 1190 215 1190 q 440 1130 381 1190 q 516 1139 476 1145 q 588 1109 556 1134 l 605 1126 q 622 1126 614 1135 l 655 1094 q 655 1077 663 1085 l 412 833 q 395 833 403 825 l 362 866 q 362 883 353 874 l 379 900 q 348 980 351 935 q 366 1064 344 1025 q 298 1091 337 1091 q 227 1062 257 1091 q 198 992 198 1033 l 198 496 l 1364 496 q 1382 489 1375 496 q 1389 471 1389 482 m 687 836 q 691 833 687 836 q 694 818 694 829 q 687 801 694 808 q 670 794 680 794 q 652 801 659 794 q 645 818 645 808 q 652 836 645 829 q 670 843 659 843 q 687 836 680 843 m 638 886 q 641 882 638 886 q 645 868 645 879 q 638 850 645 857 q 620 843 631 843 q 602 850 609 843 q 595 868 595 857 q 602 886 595 879 q 620 893 609 893 q 638 886 631 893 m 588 935 q 592 932 588 935 q 595 918 595 929 q 588 900 595 907 q 570 893 581 893 q 553 900 560 893 q 546 918 546 907 q 553 935 546 929 q 570 942 560 942 q 588 935 581 942 m 737 886 q 741 882 737 886 q 744 868 744 879 q 737 850 744 857 q 719 843 730 843 q 701 850 708 843 q 694 868 694 857 q 701 886 694 879 q 719 893 708 893 q 737 886 730 893 m 687 935 q 691 932 687 935 q 694 918 694 929 q 687 900 694 907 q 670 893 680 893 q 652 900 659 893 q 645 918 645 907 q 652 935 645 929 q 670 942 659 942 q 687 935 680 942 m 638 985 q 641 982 638 985 q 645 967 645 978 q 638 949 645 956 q 620 942 631 942 q 602 949 609 942 q 595 967 595 956 q 602 985 595 978 q 620 992 609 992 q 638 985 631 992 m 787 935 q 790 932 787 935 q 794 918 794 929 q 787 900 794 907 q 769 893 780 893 q 751 900 758 893 q 744 918 744 907 q 751 935 744 929 q 769 942 758 942 q 787 935 780 942 m 737 985 q 741 982 737 985 q 744 967 744 978 q 737 949 744 956 q 719 942 730 942 q 701 949 708 942 q 694 967 694 956 q 701 985 694 978 q 719 992 708 992 q 737 985 730 992 m 836 985 q 840 982 836 985 q 843 967 843 978 q 836 949 843 956 q 818 942 829 942 q 801 949 808 942 q 794 967 794 956 q 801 985 794 978 q 818 992 808 992 q 836 985 829 992 z "},"飲�":{"ha":1190,"x_min":1,"x_max":1190,"o":"m 770 267 q 757 114 770 200 q 715 -129 733 -53 q 597 -198 698 -198 q 479 -129 496 -198 q 436 114 460 -53 q 423 267 423 199 q 597 397 423 397 q 770 267 770 397 m 1190 595 q 1087 259 1190 409 q 815 42 983 109 q 804 44 809 40 q 799 56 798 49 q 807 107 805 93 q 811 143 810 132 q 818 153 812 150 q 1016 334 942 215 q 1091 595 1091 453 q 1021 851 1091 735 q 829 1033 950 968 q 568 1090 708 1098 q 384 1043 472 1085 q 234 934 297 1001 q 135 778 172 867 q 99 591 98 688 q 176 331 100 449 q 375 151 252 212 q 382 142 381 149 q 387 107 384 126 q 391 82 388 100 q 395 54 394 64 q 390 43 396 47 q 378 41 384 38 q 176 172 264 86 q 41 377 88 259 q 1 625 -5 495 q 52 837 6 736 q 172 1013 98 938 q 346 1135 246 1087 q 557 1189 446 1182 q 802 1153 684 1197 q 1004 1028 919 1109 q 1140 834 1089 948 q 1190 595 1190 721 m 720 743 q 745 718 720 743 q 770 620 770 692 q 720 497 770 548 q 597 446 669 446 q 474 497 525 446 q 423 620 423 548 q 474 743 423 692 q 597 794 525 794 q 720 743 669 794 m 994 595 q 952 418 994 501 q 839 281 911 336 q 826 279 832 276 q 818 290 820 282 q 796 361 814 330 q 798 377 791 369 q 869 475 843 419 q 894 595 894 532 q 849 753 894 681 q 727 863 804 825 q 563 891 650 901 q 385 804 460 880 q 301 625 311 728 q 319 488 293 553 q 395 377 345 423 q 398 361 403 369 q 375 289 379 329 q 367 279 374 282 q 355 281 361 276 q 240 422 281 338 q 200 604 198 507 q 253 793 202 705 q 391 934 305 880 q 577 991 477 987 q 785 945 689 997 q 937 799 881 893 q 994 595 994 706 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 198 99 l 1190 99 l 1190 694 l 198 694 l 198 99 m 1389 967 l 1389 25 q 1352 -63 1389 -26 q 1265 -99 1316 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1265 1091 q 1352 1055 1316 1091 q 1389 967 1389 1018 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1389 174 l 1389 25 q 1352 -63 1389 -26 q 1265 -99 1316 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 174 q 36 261 0 225 q 124 298 73 298 l 1265 298 q 1352 261 1316 298 q 1389 174 1389 225 z "},"飲�":{"ha":1587,"x_min":0,"x_max":1587,"o":"m 198 0 l 794 0 l 794 397 l 198 397 l 198 0 m 992 397 l 1389 397 l 1389 992 l 794 992 l 794 794 l 868 794 q 956 757 919 794 q 992 670 992 721 l 992 397 m 1587 1066 l 1587 322 q 1551 235 1587 271 q 1463 198 1514 198 l 992 198 l 992 -74 q 956 -162 992 -126 q 868 -198 919 -198 l 124 -198 q 36 -162 73 -198 q 0 -74 0 -126 l 0 670 q 36 757 0 721 q 124 794 73 794 l 595 794 l 595 1066 q 632 1154 595 1118 q 719 1190 668 1190 l 1463 1190 q 1551 1154 1514 1190 q 1587 1066 1587 1118 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 911 167 l 1024 280 q 1032 298 1032 288 q 1024 315 1032 308 l 843 496 l 1024 677 q 1032 694 1032 684 q 1024 712 1032 705 l 911 825 q 893 833 903 833 q 875 825 883 833 l 694 645 l 514 825 q 496 833 506 833 q 478 825 486 833 l 365 712 q 357 694 357 705 q 365 677 357 684 l 546 496 l 365 315 q 357 298 357 308 q 365 280 357 288 l 478 167 q 496 159 486 159 q 514 167 506 159 l 694 347 l 875 167 q 893 159 883 159 q 911 167 903 159 m 1389 967 l 1389 25 q 1352 -63 1389 -26 q 1265 -99 1316 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1265 1091 q 1352 1055 1316 1091 q 1389 967 1389 1018 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 974 329 l 861 216 q 843 208 853 208 q 825 216 833 208 l 694 347 l 563 216 q 546 208 556 208 q 528 216 536 208 l 415 329 q 407 347 407 337 q 415 365 407 357 l 546 496 l 415 627 q 407 645 407 635 q 415 663 407 655 l 528 776 q 546 784 536 784 q 563 776 556 784 l 694 645 l 825 776 q 843 784 833 784 q 861 776 853 784 l 974 663 q 982 645 982 655 q 974 627 982 635 l 843 496 l 974 365 q 982 347 982 357 q 974 329 982 337 m 198 99 l 1190 99 l 1190 893 l 198 893 l 198 99 m 1389 967 l 1389 25 q 1352 -63 1389 -26 q 1265 -99 1316 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1265 1091 q 1352 1055 1316 1091 q 1389 967 1389 1018 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 829 277 l 1066 715 l 560 715 l 322 277 l 829 277 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飲�":{"ha":1390,"x_min":0,"x_max":1390,"o":"m 1001 822 q 973 828 989 835 q 953 806 958 822 q 957 777 949 791 q 988 765 968 763 q 1015 781 1008 767 q 1001 822 1021 795 m 694 631 q 679 625 687 625 q 664 631 670 625 q 658 646 658 637 q 664 660 658 654 q 679 666 670 666 q 694 660 687 666 q 699 646 699 654 q 694 631 699 637 m 822 574 l 794 546 q 772 536 785 536 q 748 546 758 536 l 718 576 q 709 599 709 586 q 718 622 709 612 l 746 649 q 768 659 755 659 q 792 649 782 659 l 822 619 q 831 596 831 610 q 822 574 831 583 m 737 674 q 723 668 732 668 q 708 674 714 668 q 702 689 702 680 q 708 704 702 698 q 722 710 714 710 q 737 704 731 710 q 743 689 743 698 q 737 674 743 680 m 1049 750 q 966 684 1023 701 q 867 697 909 667 q 820 748 838 718 q 804 816 802 778 q 834 887 805 854 q 892 929 863 921 q 947 925 922 936 q 1001 885 972 913 q 1011 875 1003 884 q 1023 865 1020 867 q 1033 854 1025 863 q 1042 842 1040 846 q 1050 830 1045 839 q 1057 817 1056 822 q 1060 802 1058 811 q 1061 786 1062 794 q 1057 769 1059 778 q 1049 750 1054 760 m 1205 377 q 1199 403 1208 392 q 1177 420 1190 415 q 1152 433 1165 426 q 1134 449 1139 441 q 1069 525 1103 504 q 981 534 1035 546 q 1012 548 996 544 q 1038 552 1028 553 l 1047 551 q 1021 621 1049 586 q 1026 652 1025 636 q 1024 676 1026 668 l 1022 684 q 1077 734 1055 702 q 1103 805 1098 766 q 1070 921 1111 870 q 963 980 1028 973 q 875 966 917 986 q 811 908 833 946 q 786 830 788 869 q 797 763 783 791 q 830 713 811 734 q 874 680 850 692 q 806 708 839 684 q 762 777 773 733 q 787 949 740 860 q 764 973 774 965 q 695 959 725 973 q 728 987 710 977 q 756 998 746 997 l 766 999 q 756 1059 766 1038 q 730 1082 748 1076 q 694 1079 713 1087 q 665 1048 675 1070 q 668 1053 667 1051 q 663 995 663 1032 q 678 904 663 958 q 715 809 692 850 q 679 781 696 798 q 613 727 652 769 q 547 648 574 684 l 522 612 q 381 515 452 586 q 323 389 311 444 q 332 368 324 377 q 308 345 320 359 q 292 303 292 326 q 309 272 292 281 q 358 277 326 264 q 418 315 390 291 q 460 362 446 339 q 455 366 459 363 q 439 372 452 368 q 414 374 427 375 q 453 384 432 378 q 484 392 475 390 q 506 396 494 394 q 526 400 518 399 q 544 400 534 400 q 561 426 555 395 q 567 496 567 455 q 536 612 567 575 q 614 443 618 532 q 602 404 613 420 q 581 383 591 388 l 571 378 q 556 353 568 373 q 536 318 545 334 q 516 278 528 302 q 496 231 504 253 q 483 182 489 208 q 478 130 477 156 q 486 81 479 105 q 457 143 459 123 q 431 113 440 125 q 405 81 421 102 q 381 45 388 60 q 368 13 374 30 q 368 -16 363 -4 q 388 -37 373 -29 q 499 12 422 -57 q 647 184 576 81 q 742 361 718 287 q 854 451 808 401 q 921 543 900 500 q 1040 405 957 471 q 1170 343 1121 341 q 1205 377 1200 345 m 1335 766 q 1363 701 1335 766 q 1390 496 1390 637 q 1335 226 1390 355 q 1187 5 1280 98 q 965 -143 1094 -88 q 695 -198 836 -198 q 425 -143 554 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 695 1190 554 1190 q 965 1135 836 1190 q 1187 987 1094 1080 q 1335 766 1280 894 z "},"飲�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 401 1049 l 401 541 q 550 542 481 540 q 647 546 618 544 l 676 549 q 746 568 729 550 q 777 641 763 585 l 802 751 l 882 751 l 871 501 l 877 254 l 797 254 l 774 353 q 739 425 763 405 q 674 445 716 444 q 401 451 607 451 l 401 20 q 435 -69 401 -40 q 539 -98 469 -98 l 815 -98 q 861 -97 842 -98 q 904 -91 880 -95 q 946 -77 928 -87 q 984 -52 964 -67 q 1019 -13 1003 -37 q 1049 43 1035 11 l 1121 211 l 1190 211 q 1166 16 1186 182 q 1142 -198 1146 -151 q 938 -192 1029 -195 q 812 -189 847 -190 l 778 -189 l 291 -189 l 0 -198 l 0 -119 l 98 -100 q 169 -71 150 -90 q 189 -10 188 -53 l 195 488 q 189 988 198 800 q 169 1053 188 1035 q 98 1081 151 1071 l 0 1100 l 0 1179 l 291 1170 l 836 1170 q 1125 1190 943 1170 q 1115 1040 1121 1138 q 1105 870 1108 942 l 1101 798 l 1029 798 l 1004 894 q 947 1034 980 988 q 860 1079 914 1079 l 435 1079 q 407 1072 413 1079 q 401 1049 401 1066 z "},"飲�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 715 573 l 715 432 q 715 420 715 429 q 715 408 715 412 q 714 399 715 405 q 711 390 713 393 q 706 384 709 388 q 698 380 703 381 q 685 379 692 379 l 685 618 q 698 618 692 618 q 706 614 703 617 q 711 610 709 611 q 714 602 713 608 q 715 594 715 596 q 715 584 715 592 q 715 573 715 575 m 960 498 l 960 405 q 960 395 960 404 q 960 383 960 386 q 958 374 960 380 q 952 366 956 368 q 942 363 948 363 q 931 370 935 363 q 928 498 928 378 q 928 504 928 500 q 928 510 928 508 q 928 517 928 513 q 929 524 928 522 q 932 529 930 526 q 935 534 933 532 q 942 535 938 535 q 949 534 946 535 q 954 530 953 532 q 958 525 956 528 q 959 519 959 523 q 960 513 960 515 q 960 505 960 511 q 960 498 960 500 m 140 315 l 234 315 l 234 681 l 140 681 l 140 315 m 476 315 l 558 315 l 558 681 l 435 681 l 413 510 q 388 681 398 625 l 266 681 l 266 315 l 349 315 l 349 557 l 384 315 l 443 315 l 476 563 l 476 315 m 805 552 q 801 622 805 604 q 793 644 799 634 q 780 660 787 653 q 760 670 773 666 q 740 677 748 675 q 716 680 732 679 q 693 681 700 681 q 670 681 687 681 q 661 681 664 681 l 591 681 l 591 315 q 634 315 606 315 q 787 334 765 315 q 806 474 808 354 q 805 552 805 522 m 1051 399 l 1051 502 q 1049 537 1051 525 q 1042 563 1048 550 q 1023 582 1036 577 q 987 588 1010 588 q 928 562 952 588 l 928 681 l 837 681 l 837 315 l 922 315 l 928 339 q 987 311 951 311 q 1039 334 1026 311 q 1051 399 1051 358 m 1190 967 l 1190 25 q 1154 -63 1190 -26 q 1066 -99 1118 -99 l 124 -99 q 36 -63 73 -99 q 0 25 0 -26 l 0 967 q 36 1055 0 1018 q 124 1091 73 1091 l 1066 1091 q 1154 1055 1118 1091 q 1190 967 1190 1018 z "},"飲�":{"ha":1687,"x_min":37,"x_max":1645,"o":"m 886 -153 q 877 -150 881 -152 q 849 -132 867 -143 q 783 -81 832 -120 q 693 0 734 -43 q 606 108 651 42 q 536 242 560 174 q 401 270 523 244 q 583 -10 452 105 q 886 -153 714 -126 m 389 317 l 519 295 q 488 425 500 354 q 473 538 475 496 l 470 579 q 376 405 405 515 q 389 317 380 355 m 474 789 q 415 674 441 739 q 472 727 449 710 l 474 789 m 1588 453 q 1540 691 1588 577 q 1410 886 1492 804 q 1216 1016 1328 968 q 980 1065 1104 1065 q 763 1024 867 1065 q 577 909 659 984 q 542 785 553 864 q 653 850 588 825 q 775 883 717 875 q 886 894 834 891 q 970 893 939 896 l 1001 891 q 1042 879 1027 890 q 1061 853 1058 867 q 1066 824 1065 839 q 1066 802 1068 810 q 889 803 968 811 q 748 769 811 794 q 637 713 684 743 q 536 637 590 684 q 544 565 539 609 q 572 427 550 522 q 620 288 594 333 q 812 300 715 284 q 978 341 908 315 q 1104 393 1048 367 q 1189 439 1160 419 l 1218 457 q 1248 473 1235 470 q 1272 469 1262 477 q 1285 443 1282 462 q 1255 349 1296 367 q 893 245 1094 274 q 647 233 788 229 q 732 96 679 158 q 839 -3 786 33 q 940 -64 891 -39 q 1018 -98 988 -89 l 1049 -107 q 1252 -95 1159 -125 q 1496 129 1404 -19 q 1588 453 1588 276 m 1645 481 q 1614 317 1635 377 q 1474 48 1560 156 q 1227 -148 1387 -59 q 1163 -182 1190 -174 q 1037 -195 1108 -202 q 980 -197 1009 -197 q 589 -63 761 -197 q 360 280 418 71 q 357 280 360 280 q 353 281 355 281 q 355 193 349 242 q 376 104 362 145 q 403 28 389 64 q 428 -27 418 -7 l 439 -47 q 481 -111 445 -57 q 384 -28 426 -81 q 323 80 343 25 q 293 186 304 136 q 279 270 281 237 l 277 302 q 252 312 274 304 q 214 326 229 320 q 173 342 198 332 q 128 361 147 352 q 90 381 109 370 q 57 402 70 391 q 37 422 43 412 q 76 402 52 414 q 164 367 101 390 q 277 337 227 343 l 278 362 q 351 587 287 477 q 488 870 383 743 q 550 1035 509 959 q 575 1070 562 1057 q 613 1095 588 1084 q 848 1176 736 1152 q 1082 1184 961 1199 q 1320 1109 1204 1170 q 1578 849 1490 1020 q 1645 481 1666 677 z "},"飲�":{"ha":1389,"x_min":29,"x_max":1358,"o":"m 1039 583 q 1034 683 1062 617 q 940 794 1007 749 q 843 835 895 824 q 751 839 791 846 q 698 810 712 831 q 695 788 689 792 q 728 780 701 784 q 758 777 746 778 q 792 769 770 775 q 836 756 815 763 q 888 731 863 746 q 929 703 912 717 q 960 673 946 688 q 984 643 974 657 q 1001 617 993 629 q 1013 594 1008 604 q 1023 580 1018 585 q 1031 575 1027 575 q 1039 583 1035 576 m 1321 138 q 1206 -33 1280 40 q 1039 -142 1131 -105 q 843 -189 948 -180 q 637 -179 739 -198 q 443 -108 536 -159 q 280 17 350 -57 q 170 200 210 91 q 134 435 130 308 q 141 500 135 467 q 150 550 146 534 q 169 612 154 566 q 187 669 184 659 q 188 361 147 508 q 322 115 228 215 q 547 -45 415 15 q 815 -109 679 -105 q 1086 -52 952 -114 q 1310 138 1220 11 q 1324 149 1325 159 q 1321 138 1324 146 m 1104 640 q 1120 603 1104 640 q 1135 486 1135 567 q 1104 332 1135 405 q 1020 205 1073 258 q 894 120 967 151 q 741 88 822 88 q 587 120 660 88 q 462 205 515 151 q 378 332 409 258 q 346 486 346 405 q 378 640 346 567 q 462 767 409 714 q 587 852 515 821 q 741 884 660 884 q 894 852 822 884 q 1020 767 967 821 q 1104 640 1073 714 m 1358 709 q 1218 904 1308 823 q 1022 1023 1128 984 q 796 1064 915 1061 q 562 1036 676 1067 q 349 936 449 1004 q 178 772 249 867 q 77 542 108 677 q 69 253 46 407 q 29 494 31 377 q 57 705 27 611 q 141 881 86 800 q 269 1021 196 963 q 430 1119 343 1080 q 610 1174 517 1158 q 798 1181 702 1190 q 980 1139 893 1172 q 1148 1042 1068 1106 q 1286 890 1228 979 q 1334 796 1311 851 q 1358 709 1356 741 m 1310 444 q 1204 767 1319 633 q 897 953 1089 900 q 889 956 891 953 q 908 963 887 960 q 1086 924 1004 960 q 1220 831 1167 888 q 1310 700 1273 773 q 1355 546 1347 627 q 1354 385 1363 465 q 1307 232 1345 305 q 1212 102 1268 159 q 1068 11 1156 46 q 876 -25 981 -23 q 1032 37 960 -2 q 1167 133 1104 76 q 1267 269 1229 189 q 1310 444 1305 350 z "},"飲�":{"ha":1190,"x_min":0,"x_max":1190,"o":"m 149 198 l 149 99 l 62 99 q 50 112 50 99 l 50 124 l 12 124 q 0 136 0 124 l 0 161 q 12 174 0 174 l 50 174 l 50 186 q 62 198 50 198 l 149 198 m 149 397 l 149 298 l 62 298 q 50 310 50 298 l 50 322 l 12 322 q 0 335 0 322 l 0 360 q 12 372 0 372 l 50 372 l 50 384 q 62 397 50 397 l 149 397 m 149 595 l 149 496 l 62 496 q 50 508 50 496 l 50 521 l 12 521 q 0 533 0 521 l 0 558 q 12 570 0 570 l 50 570 l 50 583 q 62 595 50 595 l 149 595 m 149 794 l 149 694 l 62 694 q 50 707 50 694 l 50 719 l 12 719 q 0 732 0 719 l 0 756 q 12 769 0 769 l 50 769 l 50 781 q 62 794 50 794 l 149 794 m 149 992 l 149 893 l 62 893 q 50 905 50 893 l 50 918 l 12 918 q 0 930 0 918 l 0 955 q 12 967 0 967 l 50 967 l 50 980 q 62 992 50 992 l 149 992 m 992 1116 l 992 -25 q 970 -78 992 -56 q 918 -99 949 -99 l 273 -99 q 220 -78 242 -99 q 198 -25 198 -56 l 198 1116 q 220 1169 198 1147 q 273 1190 242 1190 l 918 1190 q 970 1169 949 1190 q 992 1116 992 1147 m 1190 161 l 1190 136 q 1178 124 1190 124 l 1141 124 l 1141 112 q 1128 99 1141 99 l 1042 99 l 1042 198 l 1128 198 q 1141 186 1141 198 l 1141 174 l 1178 174 q 1190 161 1190 174 m 1190 360 l 1190 335 q 1178 322 1190 322 l 1141 322 l 1141 310 q 1128 298 1141 298 l 1042 298 l 1042 397 l 1128 397 q 1141 384 1141 397 l 1141 372 l 1178 372 q 1190 360 1190 372 m 1190 558 l 1190 533 q 1178 521 1190 521 l 1141 521 l 1141 508 q 1128 496 1141 496 l 1042 496 l 1042 595 l 1128 595 q 1141 583 1141 595 l 1141 570 l 1178 570 q 1190 558 1190 570 m 1190 756 l 1190 732 q 1178 719 1190 719 l 1141 719 l 1141 707 q 1128 694 1141 694 l 1042 694 l 1042 794 l 1128 794 q 1141 781 1141 794 l 1141 769 l 1178 769 q 1190 756 1190 769 m 1190 955 l 1190 930 q 1178 918 1190 918 l 1141 918 l 1141 905 q 1128 893 1141 893 l 1042 893 l 1042 992 l 1128 992 q 1141 980 1141 992 l 1141 967 l 1178 967 q 1190 955 1190 967 z "},"飲�":{"ha":1290,"x_min":36,"x_max":1253,"o":"m 1214 325 l 1084 299 l 1228 216 q 1251 186 1246 206 q 1246 149 1256 167 q 1216 126 1235 131 q 1179 131 1197 121 l 1035 213 l 1077 89 q 1068 40 1087 60 q 1021 24 1049 20 q 984 57 994 28 l 904 289 l 694 410 l 694 167 l 856 -17 q 869 -47 868 -31 q 860 -76 870 -64 q 838 -95 851 -88 q 810 -99 825 -102 q 781 -82 794 -96 l 694 17 l 694 -149 q 680 -184 694 -169 q 645 -198 665 -198 q 610 -184 625 -198 q 595 -149 595 -169 l 595 17 l 508 -82 q 480 -99 496 -96 q 451 -95 464 -102 q 429 -76 439 -88 q 421 -47 420 -64 q 434 -17 422 -31 l 595 167 l 595 410 l 385 289 l 306 57 q 269 24 296 28 q 222 40 241 20 q 212 89 202 60 l 255 213 l 111 131 q 74 126 93 121 q 43 149 54 131 q 38 186 33 167 q 61 216 43 206 l 205 299 l 76 325 q 43 347 53 329 q 37 383 33 365 q 57 414 40 401 q 95 422 73 427 l 336 374 l 546 496 l 336 618 l 95 570 q 85 569 92 569 q 51 583 64 569 q 36 614 38 597 q 45 647 35 631 q 76 667 55 663 l 205 693 l 61 776 q 38 806 43 786 q 43 843 33 825 q 74 867 53 861 q 111 861 94 872 l 255 779 l 212 903 q 222 952 202 932 q 269 968 241 972 q 306 935 296 964 l 385 703 l 595 582 l 595 825 l 434 1009 q 421 1039 422 1023 q 429 1068 420 1056 q 451 1087 439 1080 q 480 1091 464 1094 q 508 1074 496 1088 l 595 975 l 595 1141 q 610 1176 595 1161 q 645 1190 625 1190 q 680 1176 665 1190 q 694 1141 694 1161 l 694 975 l 781 1074 q 810 1091 794 1088 q 838 1087 825 1094 q 860 1068 851 1080 q 869 1039 870 1056 q 856 1009 868 1023 l 694 825 l 694 582 l 904 703 l 984 935 q 1021 968 994 964 q 1068 952 1049 972 q 1077 903 1087 932 l 1035 779 l 1179 861 q 1216 866 1197 871 q 1246 843 1235 861 q 1251 806 1256 825 q 1228 776 1246 786 l 1084 693 l 1214 667 q 1245 647 1235 663 q 1253 614 1255 631 q 1239 583 1252 597 q 1204 569 1225 569 q 1194 570 1197 569 l 954 618 l 744 496 l 954 374 l 1194 422 q 1233 414 1217 427 q 1253 383 1249 401 q 1246 347 1256 365 q 1214 325 1236 329 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 1142 470 q 1116 646 1147 562 q 1028 792 1085 730 q 891 894 972 855 q 720 939 811 933 q 545 914 630 944 q 396 828 460 884 q 292 693 332 773 q 246 522 251 612 q 271 346 240 430 q 359 200 302 262 q 496 98 415 137 q 668 53 577 59 q 895 99 788 47 q 1069 251 1002 152 q 1142 470 1135 350 m 1389 1190 l 1118 921 q 1258 710 1211 830 q 1297 461 1305 590 q 1218 198 1289 319 q 1032 0 1148 78 q 774 -96 915 -77 l 0 -198 l 269 71 q 129 281 176 160 q 90 530 82 401 q 169 794 98 673 q 356 992 239 915 q 614 1088 473 1069 q 1001 1139 743 1105 q 1389 1190 1259 1173 z "},"飲�":{"ha":1389,"x_min":0,"x_max":1389,"o":"m 735 394 l 861 139 l 822 139 l 686 410 l 553 139 l 515 139 l 654 429 l 594 454 l 610 492 l 796 413 l 780 374 l 735 394 m 436 853 l 672 752 l 571 516 l 336 617 l 436 853 m 703 709 l 889 629 l 809 444 l 624 523 l 703 709 m 921 593 l 1069 530 l 1005 383 l 858 446 l 921 593 m 1254 260 q 1278 317 1254 260 q 1302 496 1302 373 q 1254 732 1302 619 q 1124 926 1206 844 q 930 1056 1042 1008 q 694 1104 818 1104 q 459 1056 571 1104 q 265 926 346 1008 q 135 732 183 844 q 87 496 87 619 q 135 260 87 373 q 265 66 183 148 q 459 -64 346 -16 q 694 -112 571 -112 q 930 -64 818 -112 q 1124 66 1042 -16 q 1254 260 1206 148 m 1334 766 q 1361 701 1334 766 q 1389 496 1389 637 q 1334 226 1389 355 q 1186 5 1279 98 q 964 -143 1093 -88 q 694 -198 836 -198 q 425 -143 553 -198 q 203 5 296 -88 q 55 226 110 98 q 0 496 0 355 q 55 766 0 637 q 203 987 110 894 q 425 1135 296 1080 q 694 1190 553 1190 q 964 1135 836 1190 q 1186 987 1093 1080 q 1334 766 1279 894 z "},"飲�":{"ha":1488,"x_min":29,"x_max":1459,"o":"m 1034 234 q 1013 260 1031 253 q 974 269 994 268 q 937 278 954 269 q 917 308 919 288 q 942 416 913 344 q 1001 556 972 488 q 1025 655 1029 625 q 935 735 1015 733 q 877 722 900 736 l 874 721 q 870 719 871 719 q 867 717 870 718 q 863 716 864 716 q 859 715 862 715 q 854 717 856 715 q 850 719 853 718 q 845 723 847 721 q 838 730 842 725 q 831 737 833 735 q 824 742 829 739 q 817 748 820 746 q 810 753 814 750 q 801 756 805 755 q 792 758 797 757 q 755 756 769 762 q 720 732 741 749 q 713 725 719 731 q 703 717 707 719 q 692 709 700 714 q 679 705 684 704 q 666 707 674 705 q 601 738 624 728 q 528 734 569 752 q 469 684 487 716 q 437 607 457 662 q 403 505 418 553 q 372 401 389 457 q 356 344 356 345 q 370 252 339 291 q 456 216 401 213 q 495 228 479 218 q 525 264 511 238 q 586 418 530 274 q 646 569 642 563 q 662 583 650 577 q 685 583 674 588 q 701 542 706 571 q 662 434 700 528 q 623 331 624 339 q 638 287 618 301 q 685 282 658 273 q 728 320 712 291 q 763 391 731 326 q 826 518 795 457 q 862 587 857 580 q 894 608 877 609 q 913 579 916 608 q 862 465 911 567 q 808 341 813 363 q 818 261 798 300 q 875 204 837 222 q 915 192 888 197 q 970 186 941 187 q 1018 196 999 184 q 1034 234 1038 208 m 284 84 q 289 81 284 84 q 297 67 295 78 q 293 45 299 55 q 275 33 287 36 q 255 37 264 31 q 243 55 245 43 q 246 76 240 66 q 264 88 253 86 q 284 84 274 91 m 739 -137 q 745 -166 748 -150 q 729 -191 742 -182 q 700 -198 716 -201 q 675 -181 684 -195 q 669 -152 667 -168 q 685 -127 672 -136 q 714 -121 698 -118 q 739 -137 730 -124 m 146 537 q 149 525 146 537 q 137 492 151 513 q 99 467 123 471 q 54 477 74 462 q 29 515 34 491 q 39 560 25 540 q 77 586 53 581 q 122 577 102 591 q 146 537 142 562 m 1137 -33 q 1147 -80 1152 -54 q 1121 -121 1142 -106 q 1074 -131 1099 -136 q 1034 -105 1049 -126 q 1024 -57 1019 -83 q 1049 -16 1028 -32 q 1096 -6 1071 -2 q 1137 -33 1121 -11 m 1224 436 q 1257 246 1277 348 q 1152 85 1236 144 q 998 39 1083 36 q 933 -60 983 -23 q 822 -94 883 -96 q 713 -50 760 -92 q 703 -57 704 -57 q 529 -95 623 -112 q 379 3 434 -78 q 338 130 340 60 q 227 185 274 141 q 165 284 181 229 q 164 402 149 339 q 226 509 178 464 q 197 608 198 556 q 216 705 195 661 q 277 782 236 749 q 371 821 319 814 q 448 935 396 887 q 562 1006 500 984 q 692 1020 623 1028 q 815 968 760 1011 q 924 982 871 984 q 1023 954 977 979 q 1104 892 1070 929 q 1157 803 1139 855 q 1170 694 1175 750 q 1238 649 1211 681 q 1273 581 1265 618 q 1269 503 1281 543 q 1224 436 1256 463 m 353 947 q 360 913 363 932 q 341 883 357 894 q 307 875 326 872 q 278 894 288 879 q 271 929 267 910 q 290 959 274 948 q 324 966 305 970 q 353 947 343 963 m 476 1165 q 472 1141 479 1152 q 452 1127 465 1130 q 428 1131 439 1124 q 414 1152 417 1139 q 419 1176 412 1165 q 439 1190 426 1187 q 463 1185 452 1193 q 476 1165 474 1178 m 1395 430 q 1390 401 1398 415 q 1366 385 1382 388 q 1339 390 1352 382 q 1322 414 1325 398 q 1327 443 1319 429 q 1351 460 1335 456 q 1379 454 1366 463 q 1395 430 1392 445 m 880 1122 q 887 1077 893 1101 q 860 1040 881 1053 q 815 1034 839 1028 q 779 1060 791 1039 q 772 1106 767 1082 q 799 1143 778 1130 q 844 1150 820 1156 q 880 1122 868 1144 m 1459 614 q 1456 593 1462 602 q 1438 580 1449 583 q 1416 584 1426 577 q 1404 601 1407 591 q 1408 623 1402 613 q 1426 636 1414 633 q 1447 632 1437 638 q 1459 614 1456 625 m 1311 801 q 1319 763 1322 784 q 1298 729 1315 742 q 1260 722 1281 718 q 1228 742 1239 725 q 1220 780 1216 760 q 1241 814 1224 801 q 1278 822 1258 826 q 1311 801 1299 818 z "},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飲�":{"ha":1389,"x_min":0,"x_max":0,"o":""},"飻�":{"ha":1389,"x_min":0,"x_max":0,"o":""}},"familyName":"FontAwesome","ascender":1190,"descender":-198,"underlinePosition":0,"underlineThickness":0,"boundingBox":{"yMin":-198,"xMin":-1,"yMax":1190,"xMax":1786},"resolution":1000,"original_font_information":{"format":0,"copyright":"Copyright Dave Gandy 2016. All rights reserved.","fontFamily":"FontAwesome","fontSubfamily":"Regular","uniqueID":"FONTLAB:OTFEXPORT","fullName":"FontAwesome","version":"Version 4.7.0 2016","postScriptName":"FontAwesome","trademark":"Please refer to the Copyright section for the font trademark attribution notices.","manufacturer":"Fort Awesome","designer":"Dave Gandy","manufacturerURL":"http://fontawesome.io","licenceURL":"http://fontawesome.io/license/"},"cssFontWeight":"normal","cssFontStyle":"normal"} \ No newline at end of file diff --git a/public/static/modelView/fonts/fontawesome-webfont.eot b/public/static/modelView/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca --- /dev/null +++ b/public/static/modelView/fonts/fontawesome-webfont.eot Binary files differ diff --git a/public/static/modelView/fonts/fontawesome-webfont.svg b/public/static/modelView/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/public/static/modelView/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg> +<metadata> +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. +</metadata> +<defs> +<font id="FontAwesome" horiz-adv-x="1536" > + <font-face + font-family="FontAwesome" + font-weight="400" + font-stretch="normal" + units-per-em="1792" + panose-1="0 0 0 0 0 0 0 0 0 0" + ascent="1536" + descent="-256" + bbox="-1.02083 -256.962 2304.6 1537.02" + underline-thickness="0" + underline-position="0" + unicode-range="U+0020-F500" + /> +<missing-glyph horiz-adv-x="896" +d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> + <glyph glyph-name=".notdef" horiz-adv-x="896" +d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" + /> + <glyph glyph-name="space" unicode=" " horiz-adv-x="448" + /> + <glyph glyph-name="dieresis" unicode="¨" horiz-adv-x="1792" + /> + <glyph glyph-name="copyright" unicode="©" horiz-adv-x="1792" + /> + <glyph glyph-name="registered" unicode="®" horiz-adv-x="1792" + /> + <glyph glyph-name="acute" unicode="´" horiz-adv-x="1792" + /> + <glyph glyph-name="AE" unicode="Æ" horiz-adv-x="1792" + /> + <glyph glyph-name="Oslash" unicode="Ø" horiz-adv-x="1792" + /> + <glyph glyph-name="trademark" unicode="™" horiz-adv-x="1792" + /> + <glyph glyph-name="infinity" unicode="∞" horiz-adv-x="1792" + /> + <glyph glyph-name="notequal" unicode="≠" horiz-adv-x="1792" + /> + <glyph glyph-name="glass" unicode="" horiz-adv-x="1792" +d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> + <glyph glyph-name="music" unicode="" +d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 +t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> + <glyph glyph-name="search" unicode="" horiz-adv-x="1664" +d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 +t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> + <glyph glyph-name="envelope" unicode="" horiz-adv-x="1792" +d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 +t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z +M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="heart" unicode="" horiz-adv-x="1792" +d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 +q-18 -18 -44 -18z" /> + <glyph glyph-name="star" unicode="" horiz-adv-x="1664" +d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 +l502 -73q56 -9 56 -46z" /> + <glyph glyph-name="star_empty" unicode="" horiz-adv-x="1664" +d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 +l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> + <glyph glyph-name="user" unicode="" horiz-adv-x="1280" +d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5 +t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="film" unicode="" horiz-adv-x="1920" +d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 +q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 +t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 +q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 +t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="th_large" unicode="" horiz-adv-x="1664" +d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 +h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> + <glyph glyph-name="th" unicode="" horiz-adv-x="1792" +d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 +h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 +q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> + <glyph glyph-name="th_list" unicode="" horiz-adv-x="1792" +d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 +h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> + <glyph glyph-name="ok" unicode="" horiz-adv-x="1792" +d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> + <glyph glyph-name="remove" unicode="" horiz-adv-x="1408" +d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 +t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> + <glyph glyph-name="zoom_in" unicode="" horiz-adv-x="1664" +d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 +q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 +t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> + <glyph glyph-name="zoom_out" unicode="" horiz-adv-x="1664" +d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z +M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z +" /> + <glyph glyph-name="off" unicode="" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 +t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> + <glyph glyph-name="signal" unicode="" horiz-adv-x="1792" +d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 +v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> + <glyph glyph-name="cog" unicode="" +d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 +q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 +l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 +q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> + <glyph glyph-name="trash" unicode="" horiz-adv-x="1408" +d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 +q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 +q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> + <glyph glyph-name="home" unicode="" horiz-adv-x="1664" +d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 +l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> + <glyph glyph-name="file_alt" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +" /> + <glyph glyph-name="time" unicode="" +d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="road" unicode="" horiz-adv-x="1920" +d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 +q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> + <glyph glyph-name="download_alt" unicode="" horiz-adv-x="1664" +d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 +q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> + <glyph glyph-name="download" unicode="" +d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 +t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="upload" unicode="" +d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 +t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="inbox" unicode="" +d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 +q25 -61 25 -123z" /> + <glyph glyph-name="play_circle" unicode="" +d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="repeat" unicode="" +d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9 +l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> + <glyph glyph-name="refresh" unicode="" +d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 +q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 +q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="list_alt" unicode="" horiz-adv-x="1792" +d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z +M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 +t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 +t47 -113z" /> + <glyph glyph-name="lock" unicode="" horiz-adv-x="1152" +d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> + <glyph glyph-name="flag" unicode="" horiz-adv-x="1792" +d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 +t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> + <glyph glyph-name="headphones" unicode="" horiz-adv-x="1664" +d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 +t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 +t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> + <glyph glyph-name="volume_off" unicode="" horiz-adv-x="768" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="volume_down" unicode="" horiz-adv-x="1152" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 +t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> + <glyph glyph-name="volume_up" unicode="" horiz-adv-x="1664" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 +t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 +t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 +t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> + <glyph glyph-name="qrcode" unicode="" horiz-adv-x="1408" +d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z +M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> + <glyph glyph-name="barcode" unicode="" horiz-adv-x="1792" +d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z +M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> + <glyph glyph-name="tag" unicode="" +d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 +l715 -714q37 -39 37 -91z" /> + <glyph glyph-name="tags" unicode="" horiz-adv-x="1920" +d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 +l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> + <glyph glyph-name="book" unicode="" horiz-adv-x="1664" +d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 +q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 +q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 +t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> + <glyph glyph-name="bookmark" unicode="" horiz-adv-x="1280" +d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> + <glyph glyph-name="print" unicode="" horiz-adv-x="1664" +d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 +v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> + <glyph glyph-name="camera" unicode="" horiz-adv-x="1920" +d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 +q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="font" unicode="" horiz-adv-x="1664" +d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 +q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 +q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> + <glyph glyph-name="bold" unicode="" horiz-adv-x="1408" +d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 +q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 +t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 +t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> + <glyph glyph-name="italic" unicode="" horiz-adv-x="1024" +d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 +q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> + <glyph glyph-name="text_height" unicode="" horiz-adv-x="1792" +d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 +t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 +q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 +q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> + <glyph glyph-name="text_width" unicode="" +d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 +t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 +q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 +t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 +t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> + <glyph glyph-name="align_left" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 +t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_center" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 +h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_right" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 +t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_justify" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 +t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> + <glyph glyph-name="list" unicode="" horiz-adv-x="1792" +d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 +t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 +q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 +t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 +q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="indent_left" unicode="" horiz-adv-x="1792" +d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 +t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 +q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="indent_right" unicode="" horiz-adv-x="1792" +d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 +t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 +q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="facetime_video" unicode="" horiz-adv-x="1792" +d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 +q39 -17 39 -59z" /> + <glyph glyph-name="picture" unicode="" horiz-adv-x="1920" +d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 +q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="pencil" unicode="" +d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 +q53 0 91 -38l235 -234q37 -39 37 -91z" /> + <glyph glyph-name="map_marker" unicode="" horiz-adv-x="1024" +d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> + <glyph glyph-name="adjust" unicode="" +d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="tint" unicode="" horiz-adv-x="1024" +d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 +q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> + <glyph glyph-name="edit" unicode="" horiz-adv-x="1792" +d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 +q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 +l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> + <glyph glyph-name="share" unicode="" horiz-adv-x="1664" +d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 +q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 +t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="check" unicode="" horiz-adv-x="1664" +d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 +q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 +q24 -24 24 -57t-24 -57z" /> + <glyph glyph-name="move" unicode="" horiz-adv-x="1792" +d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 +t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="step_backward" unicode="" horiz-adv-x="1024" +d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" /> + <glyph glyph-name="fast_backward" unicode="" horiz-adv-x="1792" +d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710 +q19 19 32 13t13 -32v-710q4 10 13 19z" /> + <glyph glyph-name="backward" unicode="" horiz-adv-x="1664" +d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" /> + <glyph glyph-name="play" unicode="" horiz-adv-x="1408" +d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> + <glyph glyph-name="pause" unicode="" +d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> + <glyph glyph-name="stop" unicode="" +d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="forward" unicode="" horiz-adv-x="1664" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> + <glyph glyph-name="fast_forward" unicode="" horiz-adv-x="1792" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710 +q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> + <glyph glyph-name="step_forward" unicode="" horiz-adv-x="1024" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" /> + <glyph glyph-name="eject" unicode="" horiz-adv-x="1538" +d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> + <glyph glyph-name="chevron_left" unicode="" horiz-adv-x="1280" +d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="chevron_right" unicode="" horiz-adv-x="1280" +d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="plus_sign" unicode="" +d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 +t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="minus_sign" unicode="" +d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="remove_sign" unicode="" +d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 +q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ok_sign" unicode="" +d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="question_sign" unicode="" +d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 +q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="info_sign" unicode="" +d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 +t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="screenshot" unicode="" +d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 +q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 +q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> + <glyph glyph-name="remove_circle" unicode="" +d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 +l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 +t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ok_circle" unicode="" +d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 +t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ban_circle" unicode="" +d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 +t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> + <glyph glyph-name="arrow_left" unicode="" +d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 +t32.5 -90.5z" /> + <glyph glyph-name="arrow_right" unicode="" +d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> + <glyph glyph-name="arrow_up" unicode="" horiz-adv-x="1664" +d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 +q37 -39 37 -91z" /> + <glyph glyph-name="arrow_down" unicode="" horiz-adv-x="1664" +d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> + <glyph glyph-name="share_alt" unicode="" horiz-adv-x="1792" +d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 +t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> + <glyph glyph-name="resize_full" unicode="" +d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 +q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> + <glyph glyph-name="resize_small" unicode="" +d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 +t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> + <glyph glyph-name="plus" unicode="" horiz-adv-x="1408" +d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> + <glyph glyph-name="minus" unicode="" horiz-adv-x="1408" +d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> + <glyph glyph-name="asterisk" unicode="" horiz-adv-x="1664" +d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 +q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> + <glyph glyph-name="exclamation_sign" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 +q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> + <glyph glyph-name="gift" unicode="" +d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 +q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 +t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> + <glyph glyph-name="leaf" unicode="" horiz-adv-x="1792" +d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 +q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 +t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> + <glyph glyph-name="fire" unicode="" horiz-adv-x="1408" +d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 +q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> + <glyph glyph-name="eye_open" unicode="" horiz-adv-x="1792" +d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 +t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> + <glyph glyph-name="eye_close" unicode="" horiz-adv-x="1792" +d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 +q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 +q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z +" /> + <glyph glyph-name="warning_sign" unicode="" horiz-adv-x="1792" +d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 +q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> + <glyph glyph-name="plane" unicode="" horiz-adv-x="1408" +d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 +q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> + <glyph glyph-name="calendar" unicode="" horiz-adv-x="1664" +d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z +M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 +q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 +h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="random" unicode="" horiz-adv-x="1792" +d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 +t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 +v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 +t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> + <glyph glyph-name="comment" unicode="" horiz-adv-x="1792" +d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 +q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="magnet" unicode="" +d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 +q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> + <glyph glyph-name="chevron_up" unicode="" horiz-adv-x="1792" +d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> + <glyph glyph-name="chevron_down" unicode="" horiz-adv-x="1792" +d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> + <glyph glyph-name="retweet" unicode="" horiz-adv-x="1920" +d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21 +zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z +" /> + <glyph glyph-name="shopping_cart" unicode="" horiz-adv-x="1664" +d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 +t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="folder_close" unicode="" horiz-adv-x="1664" +d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> + <glyph glyph-name="folder_open" unicode="" horiz-adv-x="1920" +d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 +t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> + <glyph glyph-name="resize_vertical" unicode="" horiz-adv-x="768" +d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="resize_horizontal" unicode="" horiz-adv-x="1792" +d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="bar_chart" unicode="" horiz-adv-x="2048" +d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> + <glyph glyph-name="twitter_sign" unicode="" +d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 +q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 +t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="facebook_sign" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960z" /> + <glyph glyph-name="camera_retro" unicode="" horiz-adv-x="1792" +d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 +t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 +q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="key" unicode="" horiz-adv-x="1792" +d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 +l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 +t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> + <glyph glyph-name="cogs" unicode="" horiz-adv-x="1920" +d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 +l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 +l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 +q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 +t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 +q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 +q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> + <glyph glyph-name="comments" unicode="" horiz-adv-x="1792" +d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 +q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 +q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> + <glyph glyph-name="thumbs_up_alt" unicode="" +d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 +t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 +q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 +q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> + <glyph glyph-name="thumbs_down_alt" unicode="" +d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 +t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z +M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 +h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" /> + <glyph glyph-name="star_half" unicode="" horiz-adv-x="896" +d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> + <glyph glyph-name="heart_empty" unicode="" horiz-adv-x="1792" +d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 +q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 +q224 0 351 -124t127 -344z" /> + <glyph glyph-name="signout" unicode="" horiz-adv-x="1664" +d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 +q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> + <glyph glyph-name="linkedin_sign" unicode="" +d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 +q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="pushpin" unicode="" horiz-adv-x="1152" +d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 +t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> + <glyph glyph-name="external_link" unicode="" horiz-adv-x="1792" +d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 +q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> + <glyph glyph-name="signin" unicode="" +d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 +q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="trophy" unicode="" horiz-adv-x="1664" +d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 +t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 +q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> + <glyph glyph-name="github_sign" unicode="" +d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4 +q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4 +t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16 +q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="upload_alt" unicode="" horiz-adv-x="1664" +d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 +t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> + <glyph glyph-name="lemon" unicode="" +d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 +q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 +q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 +q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" /> + <glyph glyph-name="phone" unicode="" horiz-adv-x="1408" +d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186 +q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14 +t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> + <glyph glyph-name="check_empty" unicode="" horiz-adv-x="1408" +d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 +q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="bookmark_empty" unicode="" horiz-adv-x="1280" +d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 +q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> + <glyph glyph-name="phone_sign" unicode="" +d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5 +t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5 +t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z +" /> + <glyph glyph-name="twitter" unicode="" horiz-adv-x="1664" +d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 +q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> + <glyph glyph-name="facebook" unicode="" horiz-adv-x="1024" +d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> + <glyph glyph-name="github" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24 +q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5 +t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12 +q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z +M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" /> + <glyph glyph-name="unlock" unicode="" horiz-adv-x="1664" +d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 +t316.5 -131.5t131.5 -316.5z" /> + <glyph glyph-name="credit_card" unicode="" horiz-adv-x="1920" +d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 +q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> + <glyph glyph-name="rss" unicode="" horiz-adv-x="1408" +d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 +t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 +q187 -186 294 -425.5t120 -501.5z" /> + <glyph glyph-name="hdd" unicode="" +d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 +h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 +l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> + <glyph glyph-name="bullhorn" unicode="" horiz-adv-x="1792" +d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 +t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> + <glyph glyph-name="bell" unicode="" horiz-adv-x="1792" +d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z +M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 +t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> + <glyph glyph-name="certificate" unicode="" +d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 +l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 +l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> + <glyph glyph-name="hand_right" unicode="" horiz-adv-x="1792" +d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 +q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 +q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 +t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> + <glyph glyph-name="hand_left" unicode="" horiz-adv-x="1792" +d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5 +t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z +M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67 +q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="hand_up" unicode="" +d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 +q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 +t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 +q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> + <glyph glyph-name="hand_down" unicode="" +d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 +t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 +q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 +q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> + <glyph glyph-name="circle_arrow_left" unicode="" +d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_right" unicode="" +d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_up" unicode="" +d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_down" unicode="" +d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="globe" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 +q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 +q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 +q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 +t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 +q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 +q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 +t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 +t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 +q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 +q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 +q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 +t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 +q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 +q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> + <glyph glyph-name="wrench" unicode="" horiz-adv-x="1664" +d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 +t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> + <glyph glyph-name="tasks" unicode="" horiz-adv-x="1792" +d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 +t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> + <glyph glyph-name="filter" unicode="" horiz-adv-x="1408" +d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> + <glyph glyph-name="briefcase" unicode="" horiz-adv-x="1792" +d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 +t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> + <glyph glyph-name="fullscreen" unicode="" +d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 +l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z +" /> + <glyph glyph-name="group" unicode="" horiz-adv-x="1920" +d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 +t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 +t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 +t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> + <glyph glyph-name="link" unicode="" horiz-adv-x="1664" +d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 +l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 +t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 +q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> + <glyph glyph-name="cloud" unicode="" horiz-adv-x="1920" +d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z +" /> + <glyph glyph-name="beaker" unicode="" horiz-adv-x="1664" +d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> + <glyph glyph-name="cut" unicode="" horiz-adv-x="1792" +d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 +q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 +q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 +q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 +q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> + <glyph glyph-name="copy" unicode="" horiz-adv-x="1792" +d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 +h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> + <glyph glyph-name="paper_clip" unicode="" horiz-adv-x="1408" +d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 +l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 +z" /> + <glyph glyph-name="save" unicode="" +d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 +h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> + <glyph glyph-name="sign_blank" unicode="" +d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="reorder" unicode="" +d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 +t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="ul" unicode="" horiz-adv-x="1792" +d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 +t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z +M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="ol" unicode="" horiz-adv-x="1792" +d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 +q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 +t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216 +q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="strikethrough" unicode="" horiz-adv-x="1792" +d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 +l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 +l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> + <glyph glyph-name="underline" unicode="" +d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 +q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 +q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 +q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> + <glyph glyph-name="table" unicode="" horiz-adv-x="1664" +d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 +v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 +q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 +q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 +z" /> + <glyph glyph-name="magic" unicode="" horiz-adv-x="1664" +d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 +l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> + <glyph glyph-name="truck" unicode="" horiz-adv-x="1792" +d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 +t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 +t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> + <glyph glyph-name="pinterest" unicode="" +d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 +q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 +q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="pinterest_sign" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 +t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 +t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> + <glyph glyph-name="google_plus_sign" unicode="" +d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585 +h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="google_plus" unicode="" horiz-adv-x="2304" +d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62 +q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" /> + <glyph glyph-name="money" unicode="" horiz-adv-x="1920" +d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 +v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> + <glyph glyph-name="caret_down" unicode="" horiz-adv-x="1024" +d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> + <glyph glyph-name="caret_up" unicode="" horiz-adv-x="1024" +d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="caret_left" unicode="" horiz-adv-x="640" +d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="caret_right" unicode="" horiz-adv-x="640" +d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="columns" unicode="" horiz-adv-x="1664" +d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> + <glyph glyph-name="sort" unicode="" horiz-adv-x="1024" +d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="sort_down" unicode="" horiz-adv-x="1024" +d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> + <glyph glyph-name="sort_up" unicode="" horiz-adv-x="1024" +d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="envelope_alt" unicode="" horiz-adv-x="1792" +d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 +q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> + <glyph glyph-name="linkedin" unicode="" +d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 +q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> + <glyph glyph-name="undo" unicode="" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 +t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> + <glyph glyph-name="legal" unicode="" horiz-adv-x="1792" +d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 +t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 +q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 +q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> + <glyph glyph-name="dashboard" unicode="" horiz-adv-x="1792" +d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 +t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 +t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 +q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="comment_alt" unicode="" horiz-adv-x="1792" +d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 +q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 +t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="comments_alt" unicode="" horiz-adv-x="1792" +d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 +t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 +t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 +q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> + <glyph glyph-name="bolt" unicode="" horiz-adv-x="896" +d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> + <glyph glyph-name="sitemap" unicode="" horiz-adv-x="1792" +d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 +q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 +z" /> + <glyph glyph-name="umbrella" unicode="" horiz-adv-x="1664" +d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 +q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 +q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> + <glyph glyph-name="paste" unicode="" horiz-adv-x="1792" +d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 +h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> + <glyph glyph-name="light_bulb" unicode="" horiz-adv-x="1024" +d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 +q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 +q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 +t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> + <glyph glyph-name="exchange" unicode="" horiz-adv-x="1792" +d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 +q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> + <glyph glyph-name="cloud_download" unicode="" horiz-adv-x="1920" +d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 +q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> + <glyph glyph-name="cloud_upload" unicode="" horiz-adv-x="1920" +d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 +q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> + <glyph glyph-name="user_md" unicode="" horiz-adv-x="1408" +d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 +t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 +t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 +t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="stethoscope" unicode="" horiz-adv-x="1408" +d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 +t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 +t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="suitcase" unicode="" horiz-adv-x="1792" +d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 +t66 -158z" /> + <glyph glyph-name="bell_alt" unicode="" horiz-adv-x="1792" +d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 +t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> + <glyph glyph-name="coffee" unicode="" horiz-adv-x="1920" +d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 +t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="food" unicode="" horiz-adv-x="1408" +d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 +t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> + <glyph glyph-name="file_text_alt" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 +q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> + <glyph glyph-name="building" unicode="" horiz-adv-x="1408" +d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> + <glyph glyph-name="hospital" unicode="" horiz-adv-x="1408" +d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 +t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 +v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> + <glyph glyph-name="ambulance" unicode="" horiz-adv-x="1920" +d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 +q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="medkit" unicode="" horiz-adv-x="1792" +d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 +q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> + <glyph glyph-name="fighter_jet" unicode="" horiz-adv-x="1920" +d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 +q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" /> + <glyph glyph-name="beer" unicode="" horiz-adv-x="1664" +d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> + <glyph glyph-name="h_sign" unicode="" +d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="f0fe" unicode="" +d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="double_angle_left" unicode="" horiz-adv-x="1024" +d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 +t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_right" unicode="" horiz-adv-x="1024" +d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 +l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_up" unicode="" horiz-adv-x="1152" +d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 +q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_down" unicode="" horiz-adv-x="1152" +d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 +t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="angle_left" unicode="" horiz-adv-x="640" +d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="angle_right" unicode="" horiz-adv-x="640" +d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="angle_up" unicode="" horiz-adv-x="1152" +d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="angle_down" unicode="" horiz-adv-x="1152" +d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="desktop" unicode="" horiz-adv-x="1920" +d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 +t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="laptop" unicode="" horiz-adv-x="1920" +d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z +M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> + <glyph glyph-name="tablet" unicode="" horiz-adv-x="1152" +d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 +q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> + <glyph glyph-name="mobile_phone" unicode="" horiz-adv-x="768" +d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 +q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> + <glyph glyph-name="circle_blank" unicode="" +d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 +t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="quote_left" unicode="" horiz-adv-x="1664" +d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z +M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> + <glyph glyph-name="quote_right" unicode="" horiz-adv-x="1664" +d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 +v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> + <glyph glyph-name="spinner" unicode="" horiz-adv-x="1792" +d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 +t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z +M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 +q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" /> + <glyph glyph-name="circle" unicode="" +d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="reply" unicode="" horiz-adv-x="1792" +d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 +l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> + <glyph glyph-name="github_alt" unicode="" horiz-adv-x="1664" +d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 +q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 +t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 +q0 -87 -27 -168q136 -160 136 -398z" /> + <glyph glyph-name="folder_close_alt" unicode="" horiz-adv-x="1664" +d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 +q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> + <glyph glyph-name="folder_open_alt" unicode="" horiz-adv-x="1920" +d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 +v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z +" /> + <glyph glyph-name="expand_alt" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="collapse_alt" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="smile" unicode="" +d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 +t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="frown" unicode="" +d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 +t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="meh" unicode="" +d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="gamepad" unicode="" horiz-adv-x="1920" +d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 +t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 +t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> + <glyph glyph-name="keyboard" unicode="" horiz-adv-x="1920" +d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 +h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 +h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 +q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 +h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="flag_alt" unicode="" horiz-adv-x="1792" +d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 +h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 +q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> + <glyph glyph-name="flag_checkered" unicode="" horiz-adv-x="1792" +d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 +q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 +q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 +q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> + <glyph glyph-name="terminal" unicode="" horiz-adv-x="1664" +d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 +t9 -23z" /> + <glyph glyph-name="code" unicode="" horiz-adv-x="1920" +d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 +l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> + <glyph glyph-name="reply_all" unicode="" horiz-adv-x="1792" +d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 +q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> + <glyph glyph-name="star_half_empty" unicode="" horiz-adv-x="1664" +d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 +l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> + <glyph glyph-name="location_arrow" unicode="" horiz-adv-x="1408" +d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> + <glyph glyph-name="crop" unicode="" horiz-adv-x="1664" +d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 +v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> + <glyph glyph-name="code_fork" unicode="" horiz-adv-x="1024" +d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 +q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 +q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="unlink" unicode="" horiz-adv-x="1664" +d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 +q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 +l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 +t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> + <glyph glyph-name="question" unicode="" horiz-adv-x="1024" +d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 +t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> + <glyph glyph-name="_279" unicode="" horiz-adv-x="640" +d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 +q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> + <glyph glyph-name="exclamation" unicode="" horiz-adv-x="640" +d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> + <glyph glyph-name="superscript" unicode="" +d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z +M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5 +t-65.5 -51.5t-30.5 -63h232v80h126z" /> + <glyph glyph-name="subscript" unicode="" +d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z +M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73 +h232v80h126z" /> + <glyph glyph-name="_283" unicode="" horiz-adv-x="1920" +d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> + <glyph glyph-name="puzzle_piece" unicode="" horiz-adv-x="1664" +d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 +t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 +q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 +q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> + <glyph glyph-name="microphone" unicode="" horiz-adv-x="1152" +d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 +t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> + <glyph glyph-name="microphone_off" unicode="" horiz-adv-x="1408" +d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 +q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 +t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> + <glyph glyph-name="shield" unicode="" horiz-adv-x="1280" +d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 +t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="calendar_empty" unicode="" horiz-adv-x="1664" +d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 +q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="fire_extinguisher" unicode="" horiz-adv-x="1408" +d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 +q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 +q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> + <glyph glyph-name="rocket" unicode="" horiz-adv-x="1664" +d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 +q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> + <glyph glyph-name="maxcdn" unicode="" horiz-adv-x="1792" +d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> + <glyph glyph-name="chevron_sign_left" unicode="" +d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_right" unicode="" +d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_up" unicode="" +d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_down" unicode="" +d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="html5" unicode="" horiz-adv-x="1408" +d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> + <glyph glyph-name="css3" unicode="" horiz-adv-x="1792" +d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> + <glyph glyph-name="anchor" unicode="" horiz-adv-x="1792" +d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 +q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 +t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> + <glyph glyph-name="unlock_alt" unicode="" horiz-adv-x="1152" +d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 +v-320h736z" /> + <glyph glyph-name="bullseye" unicode="" +d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 +t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ellipsis_horizontal" unicode="" horiz-adv-x="1408" +d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> + <glyph glyph-name="ellipsis_vertical" unicode="" horiz-adv-x="384" +d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> + <glyph glyph-name="_303" unicode="" +d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128 +q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="play_sign" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 +q16 -8 32 -8q17 0 32 9z" /> + <glyph glyph-name="ticket" unicode="" horiz-adv-x="1792" +d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 +t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> + <glyph glyph-name="minus_sign_alt" unicode="" +d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="check_minus" unicode="" horiz-adv-x="1408" +d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 +t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="level_up" unicode="" horiz-adv-x="1024" +d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> + <glyph glyph-name="level_down" unicode="" horiz-adv-x="1024" +d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> + <glyph glyph-name="check_sign" unicode="" +d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 +t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="edit_sign" unicode="" +d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_312" unicode="" +d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 +q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="share_sign" unicode="" +d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 +t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="compass" unicode="" +d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="collapse" unicode="" +d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="collapse_top" unicode="" +d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_317" unicode="" +d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 +t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="eur" unicode="" horiz-adv-x="1024" +d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 +t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 +l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> + <glyph glyph-name="gbp" unicode="" horiz-adv-x="1024" +d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 +q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> + <glyph glyph-name="usd" unicode="" horiz-adv-x="1024" +d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 +t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 +t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 +t53 -63.5t31.5 -76.5t13 -94z" /> + <glyph glyph-name="inr" unicode="" horiz-adv-x="898" +d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 +q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> + <glyph glyph-name="jpy" unicode="" horiz-adv-x="1027" +d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 +l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> + <glyph glyph-name="rub" unicode="" horiz-adv-x="1280" +d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 +q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> + <glyph glyph-name="krw" unicode="" horiz-adv-x="1792" +d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 +t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 +q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> + <glyph glyph-name="btc" unicode="" horiz-adv-x="1280" +d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 +l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 +t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> + <glyph glyph-name="file" unicode="" +d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> + <glyph glyph-name="file_text" unicode="" +d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 +q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> + <glyph glyph-name="sort_by_alphabet" unicode="" horiz-adv-x="1664" +d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 +v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 +l230 -662h70z" /> + <glyph glyph-name="_329" unicode="" horiz-adv-x="1664" +d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 +v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 +v119h121z" /> + <glyph glyph-name="sort_by_attributes" unicode="" horiz-adv-x="1792" +d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 +q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> + <glyph glyph-name="sort_by_attributes_alt" unicode="" horiz-adv-x="1792" +d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 +q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> + <glyph glyph-name="sort_by_order" unicode="" +d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 +zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 +t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> + <glyph glyph-name="sort_by_order_alt" unicode="" +d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 +t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 +q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> + <glyph glyph-name="_334" unicode="" horiz-adv-x="1664" +d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 +q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 +t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> + <glyph glyph-name="_335" unicode="" horiz-adv-x="1664" +d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 +t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 +t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> + <glyph glyph-name="youtube_sign" unicode="" +d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 +q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 +q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 +q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38 +q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5 +h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="youtube" unicode="" +d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 +q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 +q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 +q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51 +q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> + <glyph glyph-name="xing" unicode="" horiz-adv-x="1408" +d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 +q25 45 64 45h241q22 0 31 -15z" /> + <glyph glyph-name="xing_sign" unicode="" +d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 +l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="youtube_play" unicode="" horiz-adv-x="1792" +d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5 +l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136 +q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" /> + <glyph glyph-name="dropbox" unicode="" horiz-adv-x="1792" +d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> + <glyph glyph-name="stackexchange" unicode="" +d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" /> + <glyph glyph-name="instagram" unicode="" +d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270 +q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5 +t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317 +q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" /> + <glyph glyph-name="flickr" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 +t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> + <glyph glyph-name="adn" unicode="" +d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="f171" unicode="" horiz-adv-x="1408" +d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 +t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 +t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 +t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> + <glyph glyph-name="bitbucket_sign" unicode="" +d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 +t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z +M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="tumblr" unicode="" horiz-adv-x="1024" +d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 +q78 2 134 29z" /> + <glyph glyph-name="tumblr_sign" unicode="" +d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z +M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="long_arrow_down" unicode="" horiz-adv-x="768" +d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> + <glyph glyph-name="long_arrow_up" unicode="" horiz-adv-x="768" +d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> + <glyph glyph-name="long_arrow_left" unicode="" horiz-adv-x="1792" +d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> + <glyph glyph-name="long_arrow_right" unicode="" horiz-adv-x="1792" +d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> + <glyph glyph-name="apple" unicode="" horiz-adv-x="1408" +d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 +q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> + <glyph glyph-name="windows" unicode="" horiz-adv-x="1664" +d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> + <glyph glyph-name="android" unicode="" horiz-adv-x="1408" +d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 +t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 +h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> + <glyph glyph-name="linux" unicode="" +d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z +M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 +q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 +q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 +t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 +q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 +q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 +q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 +q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4 +t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5 +t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43 +q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49 +t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54 +q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5 +t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5 +t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> + <glyph glyph-name="dribble" unicode="" +d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 +t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 +q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 +t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="skype" unicode="" +d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 +t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 +q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 +q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> + <glyph glyph-name="foursquare" unicode="" horiz-adv-x="1280" +d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z +M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 +l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> + <glyph glyph-name="trello" unicode="" +d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 +q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="female" unicode="" horiz-adv-x="1280" +d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 +q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="male" unicode="" horiz-adv-x="1024" +d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z +M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="gittip" unicode="" +d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="sun" unicode="" horiz-adv-x="1792" +d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 +l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 +q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> + <glyph glyph-name="_366" unicode="" +d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 +t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> + <glyph glyph-name="archive" unicode="" horiz-adv-x="1792" +d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 +q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> + <glyph glyph-name="bug" unicode="" horiz-adv-x="1664" +d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 +q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 +t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> + <glyph glyph-name="vk" unicode="" horiz-adv-x="1920" +d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 +t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 +q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24 +q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 +q39 5 64 -2.5t31 -16.5z" /> + <glyph glyph-name="weibo" unicode="" horiz-adv-x="1792" +d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 +q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 +q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 +q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z +M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> + <glyph glyph-name="renren" unicode="" +d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 +q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> + <glyph glyph-name="_372" unicode="" horiz-adv-x="1408" +d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 +t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 +t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 +t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> + <glyph glyph-name="stack_exchange" unicode="" horiz-adv-x="1280" +d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z +" /> + <glyph glyph-name="_374" unicode="" +d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 +t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="arrow_circle_alt_left" unicode="" +d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 +t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_376" unicode="" +d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z +M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="dot_circle_alt" unicode="" +d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 +t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_378" unicode="" horiz-adv-x="1664" +d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 +q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> + <glyph glyph-name="vimeo_square" unicode="" +d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 +q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_380" unicode="" horiz-adv-x="1152" +d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 +q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> + <glyph glyph-name="plus_square_o" unicode="" horiz-adv-x="1408" +d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 +q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_382" unicode="" horiz-adv-x="2176" +d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 +t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 +q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> + <glyph glyph-name="_383" unicode="" horiz-adv-x="1664" +d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 +q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 +t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> + <glyph glyph-name="_384" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 +q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 +t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> + <glyph glyph-name="_385" unicode="" horiz-adv-x="1792" +d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 +t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 +t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 +t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 +t273 -182.5t331.5 -68z" /> + <glyph glyph-name="_386" unicode="" horiz-adv-x="1792" +d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> + <glyph glyph-name="_387" unicode="" horiz-adv-x="2048" +d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 +q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> + <glyph glyph-name="_388" unicode="" horiz-adv-x="2304" +d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 +q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> + <glyph glyph-name="_389" unicode="" +d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 +q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> + <glyph glyph-name="uniF1A0" unicode="" +d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5 +t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" /> + <glyph glyph-name="f1a1" unicode="" horiz-adv-x="1792" +d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 +t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 +q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 +t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_392" unicode="" +d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 +q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 +q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_393" unicode="" +d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 +v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 +t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="f1a4" unicode="" horiz-adv-x="1920" +d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 +v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> + <glyph glyph-name="_395" unicode="" +d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="_396" unicode="" horiz-adv-x="2048" +d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 +v-369h123z" /> + <glyph glyph-name="_397" unicode="" +d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 +v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_398" unicode="" horiz-adv-x="2038" +d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 +q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 +q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 +q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 +t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 +q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 +t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 +t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> + <glyph glyph-name="_399" unicode="" +d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 +q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 +q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 +t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 +q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> + <glyph glyph-name="_400" unicode="" +d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z +M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 +t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 +q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 +t135.5 51q85 0 145 -60.5t60 -145.5z" /> + <glyph glyph-name="f1ab" unicode="" +d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 +q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 +q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z +M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 +q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 +q20 0 20 -21v-418z" /> + <glyph glyph-name="_402" unicode="" horiz-adv-x="1792" +d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 +l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 +t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 +q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 +q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> + <glyph glyph-name="_403" unicode="" +d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 +t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 +q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 +q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 +t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 +q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 +q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 +t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> + <glyph glyph-name="_404" unicode="" horiz-adv-x="1280" +d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152 +q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="uniF1B1" unicode="" horiz-adv-x="1664" +d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 +q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 +q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 +t100.5 134t141.5 55.5z" /> + <glyph glyph-name="_406" unicode="" horiz-adv-x="768" +d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> + <glyph glyph-name="_407" unicode="" horiz-adv-x="1792" +d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z +" /> + <glyph glyph-name="_408" unicode="" horiz-adv-x="2304" +d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 +t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 +v-400l434 -186q36 -16 57 -48t21 -70z" /> + <glyph glyph-name="_409" unicode="" horiz-adv-x="2048" +d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 +q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 +q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> + <glyph glyph-name="_410" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 +t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 +t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> + <glyph glyph-name="_411" unicode="" horiz-adv-x="1792" +d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 +q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 +q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> + <glyph glyph-name="_412" unicode="" +d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 +q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 +q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z +" /> + <glyph glyph-name="_413" unicode="" horiz-adv-x="1792" +d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 +l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 +t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 +q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> + <glyph glyph-name="_414" unicode="" horiz-adv-x="2048" +d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 +q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 +l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="_415" unicode="" horiz-adv-x="2048" +d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 +t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z +M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> + <glyph glyph-name="_416" unicode="" +d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 +q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> + <glyph glyph-name="_417" unicode="" +d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 +q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 +q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_418" unicode="" horiz-adv-x="1024" +d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" /> + <glyph glyph-name="_419" unicode="" horiz-adv-x="2304" +d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 +q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 +q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 +l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 +q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236 +q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786 +q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> + <glyph glyph-name="uniF1C0" unicode="" +d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 +t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 +t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> + <glyph glyph-name="uniF1C1" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 +q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 +q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> + <glyph glyph-name="_422" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5 +t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" /> + <glyph glyph-name="_423" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 +h-290v-107h68l189 -272l-194 -283h-68z" /> + <glyph glyph-name="_424" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> + <glyph glyph-name="_425" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> + <glyph glyph-name="_426" unicode="" +d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 +v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 +q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> + <glyph glyph-name="_427" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 +q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> + <glyph glyph-name="_428" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> + <glyph glyph-name="_429" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 +l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> + <glyph glyph-name="_430" unicode="" +d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 +q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> + <glyph glyph-name="_431" unicode="" horiz-adv-x="1792" +d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 +q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> + <glyph glyph-name="_432" unicode="" horiz-adv-x="2048" +d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 +q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 +t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" /> + <glyph glyph-name="_433" unicode="" horiz-adv-x="1792" +d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 +q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 +t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> + <glyph glyph-name="_434" unicode="" horiz-adv-x="1792" +d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5 +t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" /> + <glyph glyph-name="uniF1D0" unicode="" horiz-adv-x="1792" +d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 +t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 +t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 +q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> + <glyph glyph-name="uniF1D1" unicode="" horiz-adv-x="1792" +d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 +l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 +q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 +q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 +t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 +t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF1D2" unicode="" +d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 +q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 +q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 +q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_438" unicode="" horiz-adv-x="1792" +d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 +q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 +q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 +v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> + <glyph glyph-name="_439" unicode="" +d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF1D5" unicode="" horiz-adv-x="1280" +d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 +t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 +t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> + <glyph glyph-name="uniF1D6" unicode="" horiz-adv-x="1792" +d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 +q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 +t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 +t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> + <glyph glyph-name="uniF1D7" unicode="" horiz-adv-x="2048" +d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 +q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 +q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 +q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> + <glyph glyph-name="_443" unicode="" horiz-adv-x="1792" +d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> + <glyph glyph-name="_444" unicode="" horiz-adv-x="1792" +d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 +l863 639l-478 -797z" /> + <glyph glyph-name="_445" unicode="" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 +t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 +t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_446" unicode="" +d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_447" unicode="" horiz-adv-x="1792" +d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 +t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 +t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 +q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 +q0 -26 -12 -48t-36 -22z" /> + <glyph glyph-name="_448" unicode="" horiz-adv-x="1280" +d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 +q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> + <glyph glyph-name="_449" unicode="" +d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 +q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> + <glyph glyph-name="uniF1E0" unicode="" +d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 +t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> + <glyph glyph-name="_451" unicode="" +d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 +t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_452" unicode="" horiz-adv-x="1792" +d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 +t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 +q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 +t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> + <glyph glyph-name="_453" unicode="" horiz-adv-x="1792" +d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 +l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> + <glyph glyph-name="_454" unicode="" horiz-adv-x="1792" +d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 +v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 +zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 +t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> + <glyph glyph-name="_455" unicode="" horiz-adv-x="1792" +d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z +M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_456" unicode="" horiz-adv-x="1792" +d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234 +l401 400q38 37 91 37t90 -37z" /> + <glyph glyph-name="_457" unicode="" horiz-adv-x="1792" +d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 +t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z +M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7 +t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> + <glyph glyph-name="_458" unicode="" horiz-adv-x="1792" +d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> + <glyph glyph-name="_459" unicode="" +d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 +q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 +t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 +q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> + <glyph glyph-name="_460" unicode="" horiz-adv-x="2048" +d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 +t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> + <glyph glyph-name="_461" unicode="" horiz-adv-x="2048" +d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 +q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z +M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> + <glyph glyph-name="_462" unicode="" horiz-adv-x="1792" +d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 +t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 +t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 +t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z +M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 +h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_463" unicode="" +d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 +q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 +q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" /> + <glyph glyph-name="_464" unicode="" horiz-adv-x="1792" +d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640 +q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" /> + <glyph glyph-name="uniF1F0" unicode="" horiz-adv-x="2304" +d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 +q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 +q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_466" unicode="" horiz-adv-x="2304" +d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249 +q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z +M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32 +h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4 +q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75 +q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14 +q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22 +q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12 +q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122 +h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5 +t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_467" unicode="" horiz-adv-x="2304" +d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 +q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 +v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 +q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 +t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> + <glyph glyph-name="f1f3" unicode="" horiz-adv-x="2304" +d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z +M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 +l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 +v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 +q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 +q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 +t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 +h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 +t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> + <glyph glyph-name="_469" unicode="" horiz-adv-x="2304" +d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 +t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 +q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 +t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 +l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 +q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_470" unicode="" horiz-adv-x="2304" +d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 +q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 +q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 +q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 +q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_471" unicode="" horiz-adv-x="2048" +d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 +l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 +l418 363q10 8 23.5 7t21.5 -11z" /> + <glyph glyph-name="_472" unicode="" horiz-adv-x="2048" +d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 +q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 +q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> + <glyph glyph-name="_473" unicode="" horiz-adv-x="1408" +d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 +q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 +q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_474" unicode="" +d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 +t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 +t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_475" unicode="" +d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 +q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 +t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 +t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> + <glyph glyph-name="_476" unicode="" horiz-adv-x="1792" +d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 +t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> + <glyph glyph-name="f1fc" unicode="" horiz-adv-x="1792" +d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 +t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> + <glyph glyph-name="_478" unicode="" horiz-adv-x="1792" +d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5 +t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38 +t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448 +h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5 +q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> + <glyph glyph-name="_479" unicode="" horiz-adv-x="2048" +d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> + <glyph glyph-name="_480" unicode="" horiz-adv-x="1792" +d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_481" unicode="" horiz-adv-x="2048" +d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 +t9 -23z" /> + <glyph glyph-name="_482" unicode="" horiz-adv-x="1792" +d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 +q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 +t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 +q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> + <glyph glyph-name="_483" unicode="" +d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 +q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 +q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_484" unicode="" horiz-adv-x="2048" +d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 +t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 +t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> + <glyph glyph-name="_485" unicode="" horiz-adv-x="2048" +d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 +t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> + <glyph glyph-name="_486" unicode="" horiz-adv-x="2304" +d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 +q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 +q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 +q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> + <glyph glyph-name="_487" unicode="" +d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 +h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> + <glyph glyph-name="_488" unicode="" horiz-adv-x="2048" +d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 +q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 +q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> + <glyph glyph-name="_489" unicode="" horiz-adv-x="1280" +d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 +t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 +t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 +q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 +q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 +t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> + <glyph glyph-name="_490" unicode="" horiz-adv-x="2048" +d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 +q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 +t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 +t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> + <glyph glyph-name="_491" unicode="" +d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 +t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_492" unicode="" +d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 +q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 +q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> + <glyph glyph-name="_493" unicode="" +d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" /> + <glyph glyph-name="_494" unicode="" horiz-adv-x="2048" +d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 +q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 +q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438 +h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66 +l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946 +l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82 +zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" /> + <glyph glyph-name="f210" unicode="" +d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" /> + <glyph glyph-name="_496" unicode="" +d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 +q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" /> + <glyph glyph-name="f212" unicode="" horiz-adv-x="2048" +d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 +q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 +q209 0 374 -102q172 107 374 102z" /> + <glyph glyph-name="_498" unicode="" horiz-adv-x="2048" +d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 +q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 +q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" /> + <glyph glyph-name="_499" unicode="" +d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 +l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 +v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z +M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 +v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 +h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 +t-43 -34t-16.5 -53.5z" /> + <glyph glyph-name="_500" unicode="" horiz-adv-x="2048" +d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 +q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" /> + <glyph glyph-name="_501" unicode="" horiz-adv-x="2048" +d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 +t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 +t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 +q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" /> + <glyph glyph-name="_502" unicode="" horiz-adv-x="1664" +d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 +q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="_503" unicode="" horiz-adv-x="1664" +d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 +q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="_504" unicode="" horiz-adv-x="2048" +d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 +l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" /> + <glyph glyph-name="_505" unicode="" horiz-adv-x="2048" +d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 +q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 +q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 +v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 +q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" /> + <glyph glyph-name="_506" unicode="" +d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 +t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 +q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 +t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" /> + <glyph glyph-name="_507" unicode="" horiz-adv-x="2304" +d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 +t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 +l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 +t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" /> + <glyph glyph-name="_508" unicode="" +d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 +q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 +q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 +t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="_509" unicode="" horiz-adv-x="1792" +d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 +q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 +t127 -344z" /> + <glyph glyph-name="venus" unicode="" horiz-adv-x="1280" +d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 +q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" /> + <glyph glyph-name="_511" unicode="" +d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 +q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_512" unicode="" horiz-adv-x="1280" +d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 +t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_513" unicode="" +d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 +q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_514" unicode="" horiz-adv-x="1792" +d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 +q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 +t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 +t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_515" unicode="" horiz-adv-x="1792" +d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 +t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 +q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 +q0 -226 -154 -391q103 -57 218 -57z" /> + <glyph glyph-name="_516" unicode="" horiz-adv-x="1920" +d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 +q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 +t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 +q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" /> + <glyph glyph-name="_517" unicode="" horiz-adv-x="2048" +d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 +t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 +t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 +t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" /> + <glyph glyph-name="_518" unicode="" +d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 +t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_519" unicode="" horiz-adv-x="1280" +d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 +t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 +t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_520" unicode="" horiz-adv-x="2048" +d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 +t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 +t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_521" unicode="" horiz-adv-x="1280" +d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 +t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_522" unicode="" horiz-adv-x="1280" +d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 +t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" /> + <glyph glyph-name="_523" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="_524" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="_525" unicode="" +d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" /> + <glyph glyph-name="_526" unicode="" horiz-adv-x="1280" +d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 +l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 +q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" /> + <glyph glyph-name="_527" unicode="" +d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 +t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 +l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" /> + <glyph glyph-name="_528" unicode="" horiz-adv-x="1792" +d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 +q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" /> + <glyph glyph-name="_529" unicode="" horiz-adv-x="2048" +d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 +t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 +t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" /> + <glyph glyph-name="_530" unicode="" horiz-adv-x="2048" +d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 +q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 +t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" /> + <glyph glyph-name="_531" unicode="" horiz-adv-x="2048" +d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 +q-26 0 -45 -19t-19 -45v-384h1152z" /> + <glyph glyph-name="_532" unicode="" +d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" /> + <glyph glyph-name="_533" unicode="" +d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 +t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" /> + <glyph glyph-name="_534" unicode="" +d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 +t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" /> + <glyph glyph-name="_535" unicode="" horiz-adv-x="1792" +d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 +q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" /> + <glyph glyph-name="_536" unicode="" +d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" /> + <glyph glyph-name="_537" unicode="" horiz-adv-x="2296" +d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 +q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 +q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 +q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 +q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 +q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 +q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8 +t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 +q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 +q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z +M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86 +t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 +q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4 +l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130 +t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 +q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 +q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" /> + <glyph glyph-name="_538" unicode="" horiz-adv-x="2304" +d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 +t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 +t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" /> + <glyph glyph-name="_539" unicode="" horiz-adv-x="1792" +d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 +t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 +t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 +q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 +q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" /> + <glyph glyph-name="_540" unicode="" horiz-adv-x="2304" +d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 +v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="_541" unicode="" horiz-adv-x="2304" +d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_542" unicode="" horiz-adv-x="2304" +d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_543" unicode="" horiz-adv-x="2304" +d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_544" unicode="" horiz-adv-x="2304" +d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 +v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_545" unicode="" horiz-adv-x="1280" +d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" /> + <glyph glyph-name="_546" unicode="" horiz-adv-x="1024" +d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" /> + <glyph glyph-name="_547" unicode="" horiz-adv-x="2048" +d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 +h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" /> + <glyph glyph-name="_548" unicode="" horiz-adv-x="2304" +d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 +v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" /> + <glyph glyph-name="_549" unicode="" +d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" /> + <glyph glyph-name="_550" unicode="" +d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 +z" /> + <glyph glyph-name="_551" unicode="" horiz-adv-x="2304" +d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 +t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 +t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 +t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_552" unicode="" horiz-adv-x="2304" +d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 +t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z +M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_553" unicode="" horiz-adv-x="1792" +d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 +zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" /> + <glyph glyph-name="_554" unicode="" horiz-adv-x="2304" +d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 +q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 +t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 +t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" /> + <glyph glyph-name="_555" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 +t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> + <glyph glyph-name="_556" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" /> + <glyph glyph-name="_557" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" /> + <glyph glyph-name="_558" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 +h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> + <glyph glyph-name="_559" unicode="" +d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 +t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 +h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" /> + <glyph glyph-name="_560" unicode="" +d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 +q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 +t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 +q72 69 174 69z" /> + <glyph glyph-name="_561" unicode="" horiz-adv-x="1792" +d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 +t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 +h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" /> + <glyph glyph-name="_562" unicode="" horiz-adv-x="1792" +d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 +q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 +t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 +t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 +q0 -42 -23 -78t-61 -53l-310 -141h91z" /> + <glyph glyph-name="_563" unicode="" horiz-adv-x="2048" +d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 +q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 +q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" /> + <glyph glyph-name="_564" unicode="" horiz-adv-x="2048" +d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79 +t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24 +q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26 +l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" /> + <glyph glyph-name="_565" unicode="" horiz-adv-x="1792" +d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 +q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 +v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 +v-384h32z" /> + <glyph glyph-name="_566" unicode="" +d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 +v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 +q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 +q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 +q0 -53 37.5 -90.5t90.5 -37.5h668z" /> + <glyph glyph-name="_567" unicode="" horiz-adv-x="1973" +d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 +t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 +q13 0 22 -8.5t10 -20.5z" /> + <glyph glyph-name="_568" unicode="" horiz-adv-x="1792" +d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 +t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 +q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_569" unicode="" horiz-adv-x="1792" +d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 +q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5 +t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 +q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 +t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" /> + <glyph glyph-name="f260" unicode="" horiz-adv-x="2048" +d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" /> + <glyph glyph-name="f261" unicode="" horiz-adv-x="1792" +d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 +t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_572" unicode="" horiz-adv-x="2304" +d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 +t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 +t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 +t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 +t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 +q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" /> + <glyph glyph-name="f263" unicode="" horiz-adv-x="1280" +d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 +t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 +q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" /> + <glyph glyph-name="_574" unicode="" +d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 +q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 +zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_575" unicode="" horiz-adv-x="1720" +d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 +l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" /> + <glyph glyph-name="_576" unicode="" horiz-adv-x="2304" +d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 +q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 +l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" /> + <glyph glyph-name="_577" unicode="" horiz-adv-x="1792" +d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 +q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 +t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 +t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 +t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 +t191 -286t71 -348z" /> + <glyph glyph-name="_578" unicode="" horiz-adv-x="1792" +d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 +q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" /> + <glyph glyph-name="_579" unicode="" horiz-adv-x="1792" +d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 +q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 +q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" /> + <glyph glyph-name="_580" unicode="" horiz-adv-x="1792" +d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339 +q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z +" /> + <glyph glyph-name="_581" unicode="" horiz-adv-x="1792" +d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606 +q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z +M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" /> + <glyph glyph-name="_582" unicode="" horiz-adv-x="2048" +d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 +v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="_583" unicode="" horiz-adv-x="1792" +d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 +h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 +q-68 175 -180 287z" /> + <glyph glyph-name="_584" unicode="" +d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6 +q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13 +q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249 +q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183 +q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46 +t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" /> + <glyph glyph-name="_585" unicode="" horiz-adv-x="1792" +d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z +M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 +q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 +t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 +q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" /> + <glyph glyph-name="_586" unicode="" horiz-adv-x="1792" +d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 +h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 +v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" /> + <glyph glyph-name="_587" unicode="" horiz-adv-x="1792" +d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 +t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 +t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_588" unicode="" horiz-adv-x="1792" +d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z +M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 +q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_589" unicode="" horiz-adv-x="1792" +d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 +t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 +t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_590" unicode="" horiz-adv-x="1792" +d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" /> + <glyph glyph-name="_591" unicode="" horiz-adv-x="1024" +d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 +q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" /> + <glyph glyph-name="_592" unicode="" horiz-adv-x="1792" +d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 +q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" /> + <glyph glyph-name="_593" unicode="" horiz-adv-x="2048" +d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 +v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" /> + <glyph glyph-name="_594" unicode="" horiz-adv-x="1792" +d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 +q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" /> + <glyph glyph-name="_595" unicode="" horiz-adv-x="1792" +d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 +t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 +t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="_596" unicode="" horiz-adv-x="1792" +d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 +t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 +t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 +t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" /> + <glyph glyph-name="_597" unicode="" horiz-adv-x="1024" +d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" /> + <glyph glyph-name="_598" unicode="" horiz-adv-x="1792" +d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 +q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" /> + <glyph glyph-name="f27e" unicode="" +d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" /> + <glyph glyph-name="uniF280" unicode="" +d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 +h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 +l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" /> + <glyph glyph-name="uniF281" unicode="" horiz-adv-x="1792" +d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5 +l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44 +t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106 +q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" /> + <glyph glyph-name="_602" unicode="" horiz-adv-x="1792" +d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53 +q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" /> + <glyph glyph-name="_603" unicode="" horiz-adv-x="2304" +d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" /> + <glyph glyph-name="_604" unicode="" horiz-adv-x="1792" +d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308 +t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20 +t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" /> + <glyph glyph-name="uniF285" unicode="" horiz-adv-x="1792" +d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" /> + <glyph glyph-name="uniF286" unicode="" horiz-adv-x="1792" +d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96 +q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5 +q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96 +q16 0 16 -16z" /> + <glyph glyph-name="_607" unicode="" horiz-adv-x="2304" +d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96 +q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5 +t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" /> + <glyph glyph-name="_608" unicode="" horiz-adv-x="1792" +d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348 +t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_609" unicode="" horiz-adv-x="2304" +d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22 +q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5 +q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13 +q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" /> + <glyph glyph-name="_610" unicode="" +d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83 +t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20 +q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5 +t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" /> + <glyph glyph-name="_611" unicode="" +d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103 +t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_612" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 +t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" /> + <glyph glyph-name="_613" unicode="" +d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="_614" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 +t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" /> + <glyph glyph-name="_615" unicode="" horiz-adv-x="1792" +d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="_616" unicode="" horiz-adv-x="2048" +d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5 +t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416 +q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441 +h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" /> + <glyph glyph-name="_617" unicode="" horiz-adv-x="1792" +d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12 +q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311 +q15 0 25 -12q9 -12 6 -28z" /> + <glyph glyph-name="_618" unicode="" +d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5 +t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" /> + <glyph glyph-name="_619" unicode="" horiz-adv-x="1024" +d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" /> + <glyph glyph-name="_620" unicode="" +d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5 +t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 +t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="_621" unicode="" horiz-adv-x="1792" +d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" /> + <glyph glyph-name="_622" unicode="" horiz-adv-x="1792" +d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111 +q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" /> + <glyph glyph-name="_623" unicode="" +d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14 +t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" /> + <glyph glyph-name="_624" unicode="" horiz-adv-x="1792" +d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57 +q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285 +q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" /> + <glyph glyph-name="_625" unicode="" horiz-adv-x="1792" +d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42 +q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z +M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298 +t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_626" unicode="" +d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300 +l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z +M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" /> + <glyph glyph-name="_627" unicode="" +d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5 +t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5 +t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5 +t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_628" unicode="" horiz-adv-x="1408" +d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457 +q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521 +q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661 +q3 -1 7 1t7 4l3 2q11 9 11 17z" /> + <glyph glyph-name="_629" unicode="" horiz-adv-x="2304" +d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10 +t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5 +t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5 +h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96 +t9.5 -70.5z" /> + <glyph glyph-name="uniF2A0" unicode="" horiz-adv-x="1408" +d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5 +q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127 +l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272 +t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249 +q-18 -19 -45 -19z" /> + <glyph glyph-name="uniF2A1" unicode="" horiz-adv-x="2176" +d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352 +q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864 +q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136 +t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56 +t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56 +t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136 +t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="uniF2A2" unicode="" horiz-adv-x="1792" +d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z +M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72 +t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45 +t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4 +q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" /> + <glyph glyph-name="uniF2A3" unicode="" horiz-adv-x="2304" +d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55 +q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5 +q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101 +q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35 +q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5 +q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" /> + <glyph glyph-name="uniF2A4" unicode="" horiz-adv-x="1792" +d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19 +t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74 +t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233 +l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" /> + <glyph glyph-name="uniF2A5" unicode="" +d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2 +q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10 +q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5 +t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF2A6" unicode="" horiz-adv-x="1535" +d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5 +l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5 +q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9 +q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" /> + <glyph glyph-name="uniF2A7" unicode="" horiz-adv-x="1664" +d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37 +t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38 +l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148 +q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26 +l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" /> + <glyph glyph-name="uniF2A8" unicode="" horiz-adv-x="1792" +d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5 +q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841 +q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5 +q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" /> + <glyph glyph-name="uniF2A9" unicode="" horiz-adv-x="1280" +d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5 +q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z +M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" /> + <glyph glyph-name="uniF2AA" unicode="" +d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z +M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5 +q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="uniF2AB" unicode="" +d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114 +q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5 +t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="uniF2AC" unicode="" horiz-adv-x="1664" +d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35 +q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5 +t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" /> + <glyph glyph-name="uniF2AD" unicode="" +d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115 +q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15 +t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 +q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF2AE" unicode="" horiz-adv-x="2304" +d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7 +q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158 +q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" /> + <glyph glyph-name="uniF2B0" unicode="" +d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104 +q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108 +l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z +M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" /> + <glyph glyph-name="uniF2B1" unicode="" horiz-adv-x="1664" +d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5 +t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" /> + <glyph glyph-name="uniF2B2" unicode="" horiz-adv-x="1792" +d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5 +t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114 +q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50 +q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5 +t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46 +q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5 +q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177 +t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" /> + <glyph glyph-name="uniF2B3" unicode="" +d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110 +h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="uniF2B4" unicode="" +d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5 +q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" /> + <glyph glyph-name="uniF2B5" unicode="" horiz-adv-x="2304" +d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66 +l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180 +q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z +M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421 +q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" /> + <glyph glyph-name="uniF2B6" unicode="" horiz-adv-x="1792" +d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107 +t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39 +q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" /> + <glyph glyph-name="uniF2B7" unicode="" horiz-adv-x="1792" +d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5 +l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5 +h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94 +q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" /> + <glyph glyph-name="uniF2B8" unicode="" +d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465 +l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161 +q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74 +q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" /> + <glyph glyph-name="uniF2B9" unicode="" horiz-adv-x="1664" +d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576 +q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216 +q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" /> + <glyph glyph-name="uniF2BA" unicode="" horiz-adv-x="1664" +d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5 +t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96 +q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216 +q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" /> + <glyph glyph-name="uniF2BB" unicode="" horiz-adv-x="2048" +d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z +M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568 +q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9 +h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2BC" unicode="" horiz-adv-x="2048" +d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925 +q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568 +q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5 +t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113 +t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2BD" unicode="" horiz-adv-x="1792" +d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5 +t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2BE" unicode="" horiz-adv-x="1792" +d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61 +t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" /> + <glyph glyph-name="uniF2C0" unicode="" +d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5 +t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145 +q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" /> + <glyph glyph-name="uniF2C1" unicode="" horiz-adv-x="1280" +d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5 +t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352 +q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C2" unicode="" horiz-adv-x="2048" +d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56 +t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23 +v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728 +q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C3" unicode="" horiz-adv-x="2048" +d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z +M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64 +q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47 +h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C4" unicode="" horiz-adv-x="1792" +d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117 +q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5 +t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" /> + <glyph glyph-name="uniF2C5" unicode="" horiz-adv-x="2304" +d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21 +t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46 +t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54 +t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29 +q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5 +t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314 +q2 -42 2 -64z" /> + <glyph glyph-name="uniF2C6" unicode="" horiz-adv-x="1792" +d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 +t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2C7" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2C8" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2C9" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2CA" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2CB" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z +M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" /> + <glyph glyph-name="uniF2CC" unicode="" horiz-adv-x="1920" +d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41 +t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19 +t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768 +q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19 +t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384 +q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" /> + <glyph glyph-name="uniF2CD" unicode="" horiz-adv-x="1792" +d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9 +t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9 +t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42 +q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9 +t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23 +t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" /> + <glyph glyph-name="uniF2CE" unicode="" +d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5 +t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70 +q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20 +q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5 +t72.5 -263.5z" /> + <glyph glyph-name="uniF2D0" unicode="" horiz-adv-x="1792" +d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D1" unicode="" horiz-adv-x="1792" +d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D2" unicode="" horiz-adv-x="2048" +d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47 +t47 -113z" /> + <glyph glyph-name="uniF2D3" unicode="" horiz-adv-x="1792" +d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10 +l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D4" unicode="" horiz-adv-x="1792" +d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 +l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D5" unicode="" horiz-adv-x="1792" +d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2D6" unicode="" horiz-adv-x="1794" +d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12 +t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5 +t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5 +q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5 +q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34 +q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5 +t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2D7" unicode="" +d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89 +q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5 +t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" /> + <glyph glyph-name="uniF2D8" unicode="" +d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7 +t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5 +h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113 +v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D9" unicode="" horiz-adv-x="2176" +d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584 +q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5 +q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15 +q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82 +q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104 +t302 11t306.5 -97q220 -115 333 -336t87 -474z" /> + <glyph glyph-name="uniF2DA" unicode="" horiz-adv-x="1792" +d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178 +q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199 +t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297 +t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208 +t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" /> + <glyph glyph-name="uniF2DB" unicode="" +d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16 +q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28 +t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32 +q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16 +h48q16 0 16 -16z" /> + <glyph glyph-name="uniF2DC" unicode="" horiz-adv-x="1664" +d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45 +t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33 +q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313 +l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106 +q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" /> + <glyph glyph-name="uniF2DD" unicode="" horiz-adv-x="1792" +d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321 +q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" /> + <glyph glyph-name="uniF2DE" unicode="" horiz-adv-x="1792" +d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62 +t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71 +t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2E0" unicode="" horiz-adv-x="1920" +d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3 +t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53 +q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5 +q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5 +t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5 +q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z +M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21 +q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16 +q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" /> + <glyph glyph-name="uniF2E1" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E2" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E3" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E4" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E5" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E6" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E7" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="_698" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E9" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EA" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EB" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EC" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2ED" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EE" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="lessequal" unicode="" horiz-adv-x="1792" + /> + </font> +</defs></svg> diff --git a/public/static/modelView/fonts/fontawesome-webfont.ttf b/public/static/modelView/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 --- /dev/null +++ b/public/static/modelView/fonts/fontawesome-webfont.ttf Binary files differ diff --git a/public/static/modelView/fonts/fontawesome-webfont.woff b/public/static/modelView/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a --- /dev/null +++ b/public/static/modelView/fonts/fontawesome-webfont.woff Binary files differ diff --git a/public/static/modelView/fonts/fontawesome-webfont.woff2 b/public/static/modelView/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 --- /dev/null +++ b/public/static/modelView/fonts/fontawesome-webfont.woff2 Binary files differ diff --git a/public/static/modelView/images/XRay.png b/public/static/modelView/images/XRay.png new file mode 100644 index 0000000..f0524e3 --- /dev/null +++ b/public/static/modelView/images/XRay.png Binary files differ diff --git a/public/static/modelView/images/ambient_icon.png b/public/static/modelView/images/ambient_icon.png new file mode 100644 index 0000000..4968ad3 --- /dev/null +++ b/public/static/modelView/images/ambient_icon.png Binary files differ diff --git a/public/static/modelView/images/colour_pick.png b/public/static/modelView/images/colour_pick.png new file mode 100644 index 0000000..8c098da --- /dev/null +++ b/public/static/modelView/images/colour_pick.png Binary files differ diff --git a/public/static/modelView/images/dir_light_icon.png b/public/static/modelView/images/dir_light_icon.png new file mode 100644 index 0000000..d6e042e --- /dev/null +++ b/public/static/modelView/images/dir_light_icon.png Binary files differ diff --git a/public/static/modelView/images/folder_icon.png b/public/static/modelView/images/folder_icon.png new file mode 100644 index 0000000..46223cf --- /dev/null +++ b/public/static/modelView/images/folder_icon.png Binary files differ diff --git a/public/static/modelView/images/fullscreen.png b/public/static/modelView/images/fullscreen.png new file mode 100644 index 0000000..ac135d0 --- /dev/null +++ b/public/static/modelView/images/fullscreen.png Binary files differ diff --git a/public/static/modelView/images/glow_icon.png b/public/static/modelView/images/glow_icon.png new file mode 100644 index 0000000..49d7cd7 --- /dev/null +++ b/public/static/modelView/images/glow_icon.png Binary files differ diff --git a/public/static/modelView/images/glowing.png b/public/static/modelView/images/glowing.png new file mode 100644 index 0000000..969f660 --- /dev/null +++ b/public/static/modelView/images/glowing.png Binary files differ diff --git a/public/static/modelView/images/grid.png b/public/static/modelView/images/grid.png new file mode 100644 index 0000000..eb5fbf2 --- /dev/null +++ b/public/static/modelView/images/grid.png Binary files differ diff --git a/public/static/modelView/images/phong_icon.png b/public/static/modelView/images/phong_icon.png new file mode 100644 index 0000000..69efef7 --- /dev/null +++ b/public/static/modelView/images/phong_icon.png Binary files differ diff --git a/public/static/modelView/images/rotation.png b/public/static/modelView/images/rotation.png new file mode 100644 index 0000000..4c4c734 --- /dev/null +++ b/public/static/modelView/images/rotation.png Binary files differ diff --git a/public/static/modelView/images/scale.png b/public/static/modelView/images/scale.png new file mode 100644 index 0000000..b55eb01 --- /dev/null +++ b/public/static/modelView/images/scale.png Binary files differ diff --git a/public/static/modelView/images/smoothed.png b/public/static/modelView/images/smoothed.png new file mode 100644 index 0000000..aaa6b3c --- /dev/null +++ b/public/static/modelView/images/smoothed.png Binary files differ diff --git a/public/static/modelView/images/wireframe_cube.png b/public/static/modelView/images/wireframe_cube.png new file mode 100644 index 0000000..a999cf2 --- /dev/null +++ b/public/static/modelView/images/wireframe_cube.png Binary files differ diff --git a/public/static/modelView/index.html b/public/static/modelView/index.html new file mode 100644 index 0000000..3e48837 --- /dev/null +++ b/public/static/modelView/index.html @@ -0,0 +1,617 @@ +<!doctype html> +<html> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> + <title>妯″瀷棰勮</title> + + <script src="js/jquery.min.js"></script> + <script src="js/jqueryUI.js"></script> + <link rel="stylesheet" href="css/jquery-ui.css" /> + + <link href="https://fonts.googleapis.com/css?family=Titillium+Web" rel="stylesheet" /> + <link rel="shortcut icon" href="favicon.ico" /> + + <link rel="stylesheet" href="css/spectrum.css" /> + <link rel="stylesheet" href="css/font-awesome.min.css" /> + + <link rel="stylesheet" href="css/main_style.css" /> + + <!--Three.js scripts--> + <script src="js/three.js"></script> + + <script src="js/Projector.js"></script> + <script src="js/Detector.js"></script> + + <script src="js/loaders/MTLLoader.js"></script> + <script src="js/loaders/OBJLoader.js"></script> + <script src="js/loaders/ColladaLoader.js"></script> + <script src="js/loaders/inflate.min.js"></script> + <script src="js/loaders/FBXLoader.js"></script> + <script src="js/loaders/GLTFLoader.js"></script> + <script src="js/loaders/STLLoader.js"></script> + <script src="js/loaders/DDSLoader.js"></script> + + <script src="js/OrbitControls.js"></script> + <script src="js/TransformControls.js"></script> + + <script src="js/THREEx.FullScreen.js"></script> + <script src="js/THREEx.WindowResize.js"></script> + <script src="js/screenfull.min.js"></script> + + <!--Post-Processing--> + <script src="js/effects/EffectComposer.js"></script> + <script src="js/effects/ShaderPass.js"></script> + <script src="js/effects/RenderPass.js"></script> + <script src="js/effects/CopyShader.js"></script> + <script src="js/effects/OutlinePass.js"></script> + <script src="js/effects/FXAAShader.js"></script> + + <script src="js/jquery.nicescroll.js"></script> + <script src="js/spectrum.js"></script> + + <meta + name="viewport" + charset="UTF-8" + content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" + /> + + <script> + $(function () { + $('#red, #green, #blue, #ambient_red, #ambient_green, #ambient_blue').slider({ + orientation: 'horizontal', + range: 'min', + max: 255, + value: 127 //Default value, Light colour of model set to median value (grey colour) + }) + }) + </script> + + <script id="vertexShader" type="x-shader/x-vertex"> + uniform float p; + varying float intensity; + void main() + { + vec3 vNormal = normalize( normalMatrix * normal ); + intensity = pow(1.0 - abs(dot(vNormal, vec3(0, 0, 1))), p); + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + } + </script> + + <script id="fragmentShader" type="x-shader/x-vertex"> + uniform vec3 glowColor; + varying float intensity; + void main() + { + vec3 glow = glowColor * intensity; + gl_FragColor = vec4( glow, 1.0 ); + } + </script> + + <script> + $(document).ready(function () { + $('#load_help') + .dialog({ + autoOpen: false, + width: 667 + }) + .css('font-size', '16px') + + $('.qBtn').click(function () { + $('#load_help').dialog('open') + }) + }) + </script> + </head> + + <body> + <div id="container"> + <div id="stats" style="display: none"></div> + <button id="collapse_side" style="display: none" title="Collapse Side Menu">←</button> + <!-- <button id="collapse_btm" title="Collapse Bottom Menu">↓</button> --> + + <!--Side Menu Start--> + <div style="display: none" id="customSlide" class="side_menu"> + <ul class="menu_item"> + <li id="header"> + <table style="width: 100%"> + <tr> + <th style="font-size: 15px">涓婚</th> + <th style="font-size: 11px"><button id="lightSkin">鏄庝寒</button></th> + <th style="font-size: 11px"><button id="darkSkin">鏆楅粦</button></th> + </tr> + </table> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/dir_light_icon.png" class="image" /> 鐏厜</a> + <ul> + <div class="customMenu"> + <li style="margin: 15px 0"><span>鐜鍏�</span></li> + <li> + <label class="switch"> + <input class="check" type="checkbox" id="ambient_light" /> + <span class="toggle round"></span> + </label> + </li> + </div> + <li><span style="font-size: 12px">R</span></li> + <li><div id="ambient_red"></div></li> + <li><span style="font-size: 12px">G</span></li> + <li><div id="ambient_green"></div></li> + <li><span style="font-size: 12px">B</span></li> + <li><div id="ambient_blue"></div></li> + + <li><hr style="margin-top: 15px" /></li> + <li style="margin: 15px 0">瀹氬悜鍏�</li> + <li><span style="font-size: 12px">R</span></li> + <li><div id="red"></div></li> + <li><span style="font-size: 12px">G</span></li> + <li><div id="green"></div></li> + <li><span style="font-size: 12px">B</span></li> + <li><div id="blue"></div></li> + + <li><hr style="margin-top: 15px" /></li> + <li style="margin: 15px 0">鐐瑰厜婧�</li> + <li style="margin: 15px 0"><span style="font-size: 12px">寮哄害</span></li> + <li style="margin: 15px 0"><div id="point_light"></div></li> + </ul> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/wireframe_cube.png" class="image" />绾挎瑙嗗浘</a> + <ul> + <div class="customMenu"> + <li style="margin: 15px 0"><span>绾挎</span></li> + <li> + <label class="switch"> + <input class="check" type="checkbox" name="mod_mat" id="wire_check" /> + <span class="toggle round"></span> + </label> + </li> + </div> + <div class="customMenu"> + <li><span>妯″瀷 + 绾挎</span></li> + <li> + <label class="switch"> + <input class="check" type="checkbox" name="mod_mat" id="model_wire" /> + <span class="toggle round"></span> + </label> + </li> + </div> + </ul> + </li> + + <!-- <li class="dropdown"> + <a href="#"><img src="images/phong_icon.png" class="image" />Phong Shading</a> + <ul> + <li><span>Phong Shading </span></li> + + <li> + <label class="switch"> + <input class="check" type="checkbox" name="mod_phong" id="phong_check" /> + <span class="toggle round"></span> + </label> + </li> + + <li><span style="font-size: 12px">Shininess</span></li> + <li><div id="shine"></div></li> + </ul> + </li> --> + + <li class="dropdown"> + <a href="#"><img src="images/XRay.png" class="image" />X 灏勭嚎</a> + <ul> + <div style="margin: 10px 0" class="customMenu"> + <li><span>X 灏勭嚎 </span></li> + <li> + <label class="switch"> + <input class="check" type="checkbox" name="mod_xray" id="xray_check" /> + <span class="toggle round"></span> + </label> + </li> + </div> + </ul> + </li> + + <li class="dropdown"> + <a href="#" + ><img src="images/glowing.png" width="32" height="32" class="image" />鍙戝厜杞粨</a + > + <ul> + <div style="margin: 10px 0" class="customMenu"> + <li><span>鍙戝厜杞粨</span></li> + <li> + <label class="switch"> + <input class="check" type="checkbox" name="mod_mat" id="glow_check" /> + <span class="toggle round"></span> + </label> + </li> + </div> + + <li style="margin: 5px 0"><span style="font-size: 12px">杈圭紭寮哄害</span></li> + <li style="margin: 10px 0"><div id="edgeStrength"></div></li> + + <div style="margin: 10px 0" class="customMenu"> + <li><span>閫夋嫨鍙戝厜棰滆壊 </span></li> + <li><input type="text" class="glow_select" /></li> + <!-- <li><em id="basic-log"></em></li> 灞曠ず鎵�閫夌殑鍗佸叚杩涘埗棰滆壊 --> + </div> + </ul> + </li> + + <li class="dropdown"> + <a href="#" + ><img src="images/smoothed.png" width="32" height="32" class="image" />骞虫粦妯″瀷</a + > + <ul> + <div style="margin: 15px 0" class="customMenu"> + <li><span id="smooth-model" style="font-size: 15px">鍏夋粦妯″瀷</span></li> + <li> + <label class="switch"> + <input type="checkbox" id="smooth" /> + <span class="toggle round"></span> + </label> + </li> + </div> + </ul> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/colour_pick.png" class="image" />璁剧疆鑳屾櫙鑹�</a> + <ul> + <div style="margin: 15px 0" class="customMenu"> + <li><span>閫夋嫨鑳屾櫙鑹�</span></li> + <li><input type="text" class="bg_select" /></li> + </div> + <!-- <li><em id="basic_log"></em></li> 灞曠ず鎵�閫夌殑鍗佸叚杩涘埗棰滆壊 --> + </ul> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/rotation.png" class="image" />妯″瀷鏃嬭浆</a> + <ul> + <div style="margin: 15px 0" class="customMenu"> + <li style="display: inline-block; margin: 0 35px 0 0"><span>鑷姩鏃嬭浆</span></li> + <li> + <label class="switch"> + <input type="checkbox" id="rotation" /> + <span class="toggle round"></span> + </label> + </li> + </div> + <li style="margin: 15px 0" style="display: inline-block"> + <span>鏃嬭浆閫熷害</span> + <span style="margin: 5px 0" id="rot_slider"></span> + </li> + <!-- <li>Fix Rotation of Imported Models<hr style="margin-top:0px" /></li> + + <li> + <div id="rotation"> + <div class="radioBtn"> + <input type="radio" id="r1" name="rotate" value="rotateX"> Rotate X + </div> + + <div class="radioBtn"> + <input type="radio" id="r2" name="rotate" value="rotateY"> Rotate Y + </div> + + <div class="radioBtn"> + <input type="radio" id="r3" name="rotate" value="rotateZ"> Rotate Z + </div> + </div> + </li> --> + + <!-- <li><button class="resetRotateButton" type='reset' id="reset_rot">Reset</button></li> --> + </ul> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/scale.png" class="image" />鍙樻崲妯″瀷</a> + <ul> + <li style="margin: 15px 0; margin-left: 25px; font-size: 15px"> + <label for="transform" class="customMenu"> + 闄勫姞鍙樻崲鎺у埗: + <label class="switch helper"> + <input type="checkbox" id="transform" /> + <span class="toggle grid round"></span> + </label> + </label> + </li> + <li id="transformKey">蹇嵎閿�: S: (Scale), T: (Translate), R: (Rotate)</li> + + <li style="text-align: center; margin-top: 8px; font-size: 15px"> + <span>鏀惧ぇ:</span> <button + id="scale_up" + style="margin: 0 35px 0 0" + type="button" + > + + + </button> + <span>缂╁皬:</span> <button id="scale_down" type="button">-</button> + </li> + </ul> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/grid.png" class="image" />妯″瀷瑙嗗浘鍔╂墜</a> + <ul style="font-size: 13.5px"> + <li + style=" + display: inline-flex; + line-height: 45px; + align-items: center; + margin: 0 25px 0 0; + " + > + <span style="font-size: 15px">缃戞牸</span> + <label class="switch helper"> + <input type="checkbox" id="grid" /> + <span class="toggle grid round"></span> + </label> + </li> + <li + style=" + display: inline-flex; + line-height: 40px; + align-items: center; + margin: 0 25px 0 0; + " + > + <span style="font-size: 15px">鏋佸潗鏍囩綉鏍�</span> + <label class="switch helper"> + <input type="checkbox" id="polar_grid" /> + <span class="toggle grid round"></span> + </label> + </li> + <li + style=" + display: inline-flex; + line-height: 40px; + align-items: center; + margin: 0 25px 0 0; + " + > + <span style="font-size: 15px">杞�</span> + <label class="switch helper"> + <input type="checkbox" id="axis" /> + <span class="toggle grid round"></span> + </label> + </li> + <li + style=" + display: inline-flex; + line-height: 40px; + align-items: center; + margin: 0 25px 0 0; + " + > + <span style="font-size: 15px">妯″瀷鐩掑瓙</span> + <label class="switch helper"> + <input type="checkbox" id="bBox" /> + <span class="toggle grid round"></span> + </label> + </li> + </ul> + </li> + + <!-- <li class='dropdown'> + <a href='#'><img src="images/folder_icon.png" class="image" />Select/Drop Model File</a> + <ul> + <li style="background: #d9d9f2; color: black; text-align: center">Select from button or drag and drop model onto the viewer</li> + + <li style="margin-top: 12px; margin-bottom: 16px;"> + <label for="obj_file" class="model-upload"> + <i style="margin-right: 5px;" class="fa fa-upload"></i> Load Model + </label> + <button class="qBtn" id="q_btn" title="Model Loading Help"><i class="fa fa-question-circle q_mark"></i></button> + </li> + <li><input onclick="this.value=null;" type="file" id="obj_file" /></li> + + <li style="margin-top: 12px; margin-bottom: 16px;"> + <label for="modelPlusTexture" class="model-upload"> + <i style="margin-right: 5px;" class="fa fa-upload"></i> Model and Textures + </label> + </li> + <li><input id="modelPlusTexture" type="file" name="files[]" multiple="" class="model-upload"></li> + + <li><button type="button" id="remove"><i style="margin-right: 5px;" class="fa fa-trash"></i> Remove file</button></li> + <li><output id="result" /></li> + </ul> + </li> --> + </ul> + + <!-- <div id="load_help" title="Loading Models"> + <p>Locate the model file you wish to view. Textures/associated images of the model + are supported (.obj, .gltf, .fbx and .dae formats), make sure the images and model file are in the same folder + on your machine. + </p> + <h4>Supported File Types</h4> + <ul > + <li><span style="color: green">.obj (+ .mtl)</span></li> + <li><span style="color: green">.stl</span></li> + <li><span style="color: green">.dae (Collada)</span></li> + <li><span style="color: green">.glTF</span></li> + <li><span style="color: green">.FBX</span></li> + </ul> + <p> + <h4>Model Sizes</h4> + <hr /> + Some Models may be out of view of the camera on load. Try to use the mouse wheel and the + scale up/scale down buttons to see if the model comes into view. + </p> + <p> + <h4>Object Rotation</h4> + <hr /> + Some Models load with a different up axis, depending on the software used to create the model. + The model rotation section contains radio buttons to rotate the model in the x, y or z direction + in order to fix the orientation for viewing your model. Most often <b>X axis</b> rotation is the one required. + </p> + <p> + <h4>Model Loads in Black</h4> + <hr /> + Some Models may load in black, try using the smooth model checkbox, to compute the vertex and face Normals. + </p> + </div> --> + + <div id="disp_tmp_path"></div> + </div> + <!--Side Menu End--> + + <!--Bottom Menu Start--> + <!-- <div id="bottom_menu"> + <ul class="bottom_menu_item"> + <li class="dropdown"> + <a href="#"><img src="images/rotation.png" class="image" />Model Rotation</a> + <ul> + <li style="display: inline-block; margin: 0 35px 0 0"><span>Auto Rotate</span></li> + <li style="display: inline-block"> + <span>Set Rotation Speed</span> + <span id="rot_slider"></span> + </li> + <li> + <label class="switch"> + <input type="checkbox" id="rotation" /> + <span class="toggle round"></span> + </label> + </li> + <li>Fix Rotation of Imported Models<hr style="margin-top:0px" /></li> + + <li> + <div id="rotation"> + <div class="radioBtn"> + <input type="radio" id="r1" name="rotate" value="rotateX"> Rotate X + </div> + + <div class="radioBtn"> + <input type="radio" id="r2" name="rotate" value="rotateY"> Rotate Y + </div> + + <div class="radioBtn"> + <input type="radio" id="r3" name="rotate" value="rotateZ"> Rotate Z + </div> + </div> + </li> + + <li><button class="resetRotateButton" type='reset' id="reset_rot">Reset</button></li> + </ul> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/scale.png" class="image" />Transform Model</a> + <ul> + <li style="margin-left: 25px; font-size: 15px"> + <label for="transform"> + Attach Transform Controls: + <label class="switch helper"> + <input type="checkbox" id="transform" /> + <span class="toggle grid round"></span> + </label> + </label> + </li> + <li id="transformKey">Press S: (Scale), T: (Translate), R: (Rotate)</li> + + <li style="text-align: center; margin-top: 8px; font-size: 15px"> + <span>Scale Up:</span> <button + id="scale_up" + style="margin: 0 35px 0 0" + type="button" + > + + + </button> + <span>Scale Down:</span> <button id="scale_down" type="button">-</button> + </li> + </ul> + </li> + + <li class="dropdown"> + <a href="#"><img src="images/grid.png" class="image" />Model View Helpers</a> + <ul style="font-size: 13.5px"> + <li style="display: inline-block; margin: 0 25px 0 0"> + <span style="font-size: 18px">Grid</span> + <label class="switch helper"> + <input type="checkbox" id="grid" /> + <span class="toggle grid round"></span> + </label> + </li> + <li style="display: inline-block; margin: 0 25px 0 0"> + <span style="font-size: 18px">Polar-grid</span> + <label class="switch helper"> + <input type="checkbox" id="polar_grid" /> + <span class="toggle grid round"></span> + </label> + </li> + <li style="display: inline-block; margin: 0 25px 0 0"> + <span style="font-size: 18px">Axis</span> + <label class="switch helper"> + <input type="checkbox" id="axis" /> + <span class="toggle grid round"></span> + </label> + </li> + <li style="display: inline-block; margin: 0 25px 0 0"> + <span style="font-size: 18px">Model Box</span> + <label class="switch helper"> + <input type="checkbox" id="bBox" /> + <span class="toggle grid round"></span> + </label> + </li> + </ul> + </li> + </ul> + </div> --> + <!--Bottom Menu End--> + + <div id="main_viewer"></div> + + <div id="fullscreen"> + <button + id="fullscreenBtn" + title="Fullscreen Mode" + style="border: 0; float: right; background: transparent" + > + <img src="images/fullscreen.png" width="30" height="30" alt="fullscreen" /> + </button> + </div> + + <div id="sampleMods" style="display: none"> + Models + <br /> + <div class="select"> + <select id="scenes_list" onchange="selectModel();"> + <option>models</option> + <!-- <option>Crash Model (165 KB)</option> --> + <!-- <option>Bear Model (113 KB)</option> + <option>Car Model (1.33 MB)</option> + <option>Tiger Model (3.77 MB)</option> + <option>Dinosaur Model (5.07 MB)</option> + <option>Skeleton Model (5.52 MB)</option> --> + </select> + <br /><br /> + </div> + </div> + + <div id="anims"> + <span>Select Animation</span> + <div class="select"> + <select id="animationSelect"></select> + </div> + <br /> + <button class="animBtn" id="play">Play</button> + <button class="animBtn" id="stop">Stop</button> + <button class="animBtn" id="playAll">Play All</button> + </div> + + <script src="js/menu.js"></script> + <script src="js/utils.js"></script> + <script src="js/main.js"></script> + <script src="js/userModelTextures.js"></script> + <script src="js/userModel.js"></script> + </div> + <script src="js/ColourTheme.js"></script> + <script> + $(document).ready(function () { + $('html').niceScroll({ styler: 'fb', cursorcolor: '#000' }) + $('#stats').niceScroll({ horizrailenabled: false }) + }) + </script> + </body> +</html> diff --git a/public/static/modelView/js/CanvasRenderer.js b/public/static/modelView/js/CanvasRenderer.js new file mode 100644 index 0000000..852671d --- /dev/null +++ b/public/static/modelView/js/CanvasRenderer.js @@ -0,0 +1,1158 @@ +锘�/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.SpriteCanvasMaterial = function (parameters) { + + THREE.Material.call(this); + + this.type = 'SpriteCanvasMaterial'; + + this.color = new THREE.Color(0xffffff); + this.program = function () { }; + + this.setValues(parameters); + +}; + +THREE.SpriteCanvasMaterial.prototype = Object.create(THREE.Material.prototype); +THREE.SpriteCanvasMaterial.prototype.constructor = THREE.SpriteCanvasMaterial; +THREE.SpriteCanvasMaterial.prototype.isSpriteCanvasMaterial = true; + +THREE.SpriteCanvasMaterial.prototype.clone = function () { + + var material = new THREE.SpriteCanvasMaterial(); + + material.copy(this); + material.color.copy(this.color); + material.program = this.program; + + return material; + +}; + +// + +THREE.CanvasRenderer = function (parameters) { + + console.log('THREE.CanvasRenderer', THREE.REVISION); + + parameters = parameters || {}; + + var _this = this, + _renderData, _elements, _lights, + _projector = new THREE.Projector(), + + _canvas = parameters.canvas !== undefined + ? parameters.canvas + : document.createElement('canvas'), + + _canvasWidth = _canvas.width, + _canvasHeight = _canvas.height, + _canvasWidthHalf = Math.floor(_canvasWidth / 2), + _canvasHeightHalf = Math.floor(_canvasHeight / 2), + + _viewportX = 0, + _viewportY = 0, + _viewportWidth = _canvasWidth, + _viewportHeight = _canvasHeight, + + _pixelRatio = 1, + + _context = _canvas.getContext('2d', { + alpha: parameters.alpha === true + }), + + _clearColor = new THREE.Color(0x000000), + _clearAlpha = parameters.alpha === true ? 0 : 1, + + _contextGlobalAlpha = 1, + _contextGlobalCompositeOperation = 0, + _contextStrokeStyle = null, + _contextFillStyle = null, + _contextLineWidth = null, + _contextLineCap = null, + _contextLineJoin = null, + _contextLineDash = [], + + _v1, _v2, _v3, + + _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, + + _color = new THREE.Color(), + + _diffuseColor = new THREE.Color(), + _emissiveColor = new THREE.Color(), + + _lightColor = new THREE.Color(), + + _patterns = {}, + + _uvs, + _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, + + _clipBox = new THREE.Box2(), + _clearBox = new THREE.Box2(), + _elemBox = new THREE.Box2(), + + _ambientLight = new THREE.Color(), + _directionalLights = new THREE.Color(), + _pointLights = new THREE.Color(), + + _vector3 = new THREE.Vector3(), // Needed for PointLight + _centroid = new THREE.Vector3(), + _normal = new THREE.Vector3(), + _normalViewMatrix = new THREE.Matrix3(); + + /* TODO + _canvas.mozImageSmoothingEnabled = false; + _canvas.webkitImageSmoothingEnabled = false; + _canvas.msImageSmoothingEnabled = false; + _canvas.imageSmoothingEnabled = false; + */ + + // dash+gap fallbacks for Firefox and everything else + + if (_context.setLineDash === undefined) { + + _context.setLineDash = function () { }; + + } + + this.domElement = _canvas; + + this.autoClear = true; + this.sortObjects = true; + this.sortElements = true; + + this.info = { + + render: { + + vertices: 0, + faces: 0 + + } + + }; + + // WebGLRenderer compatibility + + this.supportsVertexTextures = function () { }; + this.setFaceCulling = function () { }; + + // API + + this.getContext = function () { + + return _context; + + }; + + this.getContextAttributes = function () { + + return _context.getContextAttributes(); + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function (value) { + + if (value !== undefined) _pixelRatio = value; + + }; + + this.setSize = function (width, height, updateStyle) { + + _canvasWidth = width * _pixelRatio; + _canvasHeight = height * _pixelRatio; + + _canvas.width = _canvasWidth; + _canvas.height = _canvasHeight; + + _canvasWidthHalf = Math.floor(_canvasWidth / 2); + _canvasHeightHalf = Math.floor(_canvasHeight / 2); + + if (updateStyle !== false) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + _clipBox.min.set(-_canvasWidthHalf, -_canvasHeightHalf); + _clipBox.max.set(_canvasWidthHalf, _canvasHeightHalf); + + _clearBox.min.set(-_canvasWidthHalf, -_canvasHeightHalf); + _clearBox.max.set(_canvasWidthHalf, _canvasHeightHalf); + + _contextGlobalAlpha = 1; + _contextGlobalCompositeOperation = 0; + _contextStrokeStyle = null; + _contextFillStyle = null; + _contextLineWidth = null; + _contextLineCap = null; + _contextLineJoin = null; + + this.setViewport(0, 0, width, height); + + }; + + this.setViewport = function (x, y, width, height) { + + _viewportX = x * _pixelRatio; + _viewportY = y * _pixelRatio; + + _viewportWidth = width * _pixelRatio; + _viewportHeight = height * _pixelRatio; + + }; + + this.setScissor = function () { }; + this.setScissorTest = function () { }; + + this.setClearColor = function (color, alpha) { + + _clearColor.set(color); + _clearAlpha = alpha !== undefined ? alpha : 1; + + _clearBox.min.set(-_canvasWidthHalf, -_canvasHeightHalf); + _clearBox.max.set(_canvasWidthHalf, _canvasHeightHalf); + + }; + + this.setClearColorHex = function (hex, alpha) { + + console.warn('THREE.CanvasRenderer: .setClearColorHex() is being removed. Use .setClearColor() instead.'); + this.setClearColor(hex, alpha); + + }; + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.getMaxAnisotropy = function () { + + return 0; + + }; + + this.clear = function () { + + if (_clearBox.isEmpty() === false) { + + _clearBox.intersect(_clipBox); + _clearBox.expandByScalar(2); + + _clearBox.min.x = _clearBox.min.x + _canvasWidthHalf; + _clearBox.min.y = -_clearBox.min.y + _canvasHeightHalf; // higher y value ! + _clearBox.max.x = _clearBox.max.x + _canvasWidthHalf; + _clearBox.max.y = -_clearBox.max.y + _canvasHeightHalf; // lower y value ! + + if (_clearAlpha < 1) { + + _context.clearRect( + _clearBox.min.x | 0, + _clearBox.max.y | 0, + (_clearBox.max.x - _clearBox.min.x) | 0, + (_clearBox.min.y - _clearBox.max.y) | 0 + ); + + } + + if (_clearAlpha > 0) { + + setOpacity(1); + setBlending(THREE.NormalBlending); + + setFillStyle('rgba(' + Math.floor(_clearColor.r * 255) + ',' + Math.floor(_clearColor.g * 255) + ',' + Math.floor(_clearColor.b * 255) + ',' + _clearAlpha + ')'); + + _context.fillRect( + _clearBox.min.x | 0, + _clearBox.max.y | 0, + (_clearBox.max.x - _clearBox.min.x) | 0, + (_clearBox.min.y - _clearBox.max.y) | 0 + ); + + } + + _clearBox.makeEmpty(); + + } + + }; + + // compatibility + + this.clearColor = function () { }; + this.clearDepth = function () { }; + this.clearStencil = function () { }; + + this.render = function (scene, camera) { + + if (camera.isCamera === undefined) { + + console.error('THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.'); + return; + + } + + var background = scene.background; + + if (background && background.isColor) { + + setOpacity(1); + setBlending(THREE.NormalBlending); + + setFillStyle(background.getStyle()); + _context.fillRect(0, 0, _canvasWidth, _canvasHeight); + + } else if (this.autoClear === true) { + + this.clear(); + + } + + _this.info.render.vertices = 0; + _this.info.render.faces = 0; + + _context.setTransform(_viewportWidth / _canvasWidth, 0, 0, -_viewportHeight / _canvasHeight, _viewportX, _canvasHeight - _viewportY); + _context.translate(_canvasWidthHalf, _canvasHeightHalf); + + _renderData = _projector.projectScene(scene, camera, this.sortObjects, this.sortElements); + _elements = _renderData.elements; + _lights = _renderData.lights; + + _normalViewMatrix.getNormalMatrix(camera.matrixWorldInverse); + + /* DEBUG + setFillStyle( 'rgba( 0, 255, 255, 0.5 )' ); + _context.fillRect( _clipBox.min.x, _clipBox.min.y, _clipBox.max.x - _clipBox.min.x, _clipBox.max.y - _clipBox.min.y ); + */ + + calculateLights(); + + for (var e = 0, el = _elements.length; e < el; e++) { + + var element = _elements[e]; + + var material = element.material; + + if (material === undefined || material.opacity === 0) continue; + + _elemBox.makeEmpty(); + + if (element instanceof THREE.RenderableSprite) { + + _v1 = element; + _v1.x *= _canvasWidthHalf; _v1.y *= _canvasHeightHalf; + + renderSprite(_v1, element, material); + + } else if (element instanceof THREE.RenderableLine) { + + _v1 = element.v1; _v2 = element.v2; + + _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; + _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; + + _elemBox.setFromPoints([ + _v1.positionScreen, + _v2.positionScreen + ]); + + if (_clipBox.intersectsBox(_elemBox) === true) { + + renderLine(_v1, _v2, element, material); + + } + + } else if (element instanceof THREE.RenderableFace) { + + _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; + + if (_v1.positionScreen.z < -1 || _v1.positionScreen.z > 1) continue; + if (_v2.positionScreen.z < -1 || _v2.positionScreen.z > 1) continue; + if (_v3.positionScreen.z < -1 || _v3.positionScreen.z > 1) continue; + + _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; + _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; + _v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf; + + if (material.overdraw > 0) { + + expand(_v1.positionScreen, _v2.positionScreen, material.overdraw); + expand(_v2.positionScreen, _v3.positionScreen, material.overdraw); + expand(_v3.positionScreen, _v1.positionScreen, material.overdraw); + + } + + _elemBox.setFromPoints([ + _v1.positionScreen, + _v2.positionScreen, + _v3.positionScreen + ]); + + if (_clipBox.intersectsBox(_elemBox) === true) { + + renderFace3(_v1, _v2, _v3, 0, 1, 2, element, material); + + } + + } + + /* DEBUG + setLineWidth( 1 ); + setStrokeStyle( 'rgba( 0, 255, 0, 0.5 )' ); + _context.strokeRect( _elemBox.min.x, _elemBox.min.y, _elemBox.max.x - _elemBox.min.x, _elemBox.max.y - _elemBox.min.y ); + */ + + _clearBox.union(_elemBox); + + } + + /* DEBUG + setLineWidth( 1 ); + setStrokeStyle( 'rgba( 255, 0, 0, 0.5 )' ); + _context.strokeRect( _clearBox.min.x, _clearBox.min.y, _clearBox.max.x - _clearBox.min.x, _clearBox.max.y - _clearBox.min.y ); + */ + + _context.setTransform(1, 0, 0, 1, 0, 0); + + }; + + // + + function calculateLights() { + + _ambientLight.setRGB(0, 0, 0); + _directionalLights.setRGB(0, 0, 0); + _pointLights.setRGB(0, 0, 0); + + for (var l = 0, ll = _lights.length; l < ll; l++) { + + var light = _lights[l]; + var lightColor = light.color; + + if (light.isAmbientLight) { + + _ambientLight.add(lightColor); + + } else if (light.isDirectionalLight) { + + // for sprites + + _directionalLights.add(lightColor); + + } else if (light.isPointLight) { + + // for sprites + + _pointLights.add(lightColor); + + } + + } + + } + + function calculateLight(position, normal, color) { + + for (var l = 0, ll = _lights.length; l < ll; l++) { + + var light = _lights[l]; + + _lightColor.copy(light.color); + + if (light.isDirectionalLight) { + + var lightPosition = _vector3.setFromMatrixPosition(light.matrixWorld).normalize(); + + var amount = normal.dot(lightPosition); + + if (amount <= 0) continue; + + amount *= light.intensity; + + color.add(_lightColor.multiplyScalar(amount)); + + } else if (light.isPointLight) { + + var lightPosition = _vector3.setFromMatrixPosition(light.matrixWorld); + + var amount = normal.dot(_vector3.subVectors(lightPosition, position).normalize()); + + if (amount <= 0) continue; + + amount *= light.distance == 0 ? 1 : 1 - Math.min(position.distanceTo(lightPosition) / light.distance, 1); + + if (amount == 0) continue; + + amount *= light.intensity; + + color.add(_lightColor.multiplyScalar(amount)); + + } + + } + + } + + function renderSprite(v1, element, material) { + + setOpacity(material.opacity); + setBlending(material.blending); + + var scaleX = element.scale.x * _canvasWidthHalf; + var scaleY = element.scale.y * _canvasHeightHalf; + + var dist = Math.sqrt(scaleX * scaleX + scaleY * scaleY); // allow for rotated sprite + _elemBox.min.set(v1.x - dist, v1.y - dist); + _elemBox.max.set(v1.x + dist, v1.y + dist); + + if (material.isSpriteMaterial) { + + var texture = material.map; + + if (texture !== null) { + + var pattern = _patterns[texture.id]; + + if (pattern === undefined || pattern.version !== texture.version) { + + pattern = textureToPattern(texture); + _patterns[texture.id] = pattern; + + } + + if (pattern.canvas !== undefined) { + + setFillStyle(pattern.canvas); + + var bitmap = texture.image; + + var ox = bitmap.width * texture.offset.x; + var oy = bitmap.height * texture.offset.y; + + var sx = bitmap.width * texture.repeat.x; + var sy = bitmap.height * texture.repeat.y; + + var cx = scaleX / sx; + var cy = scaleY / sy; + + _context.save(); + _context.translate(v1.x, v1.y); + if (material.rotation !== 0) _context.rotate(material.rotation); + _context.translate(-scaleX / 2, -scaleY / 2); + _context.scale(cx, cy); + _context.translate(-ox, -oy); + _context.fillRect(ox, oy, sx, sy); + _context.restore(); + + } + + } else { + + // no texture + + setFillStyle(material.color.getStyle()); + + _context.save(); + _context.translate(v1.x, v1.y); + if (material.rotation !== 0) _context.rotate(material.rotation); + _context.scale(scaleX, -scaleY); + _context.fillRect(-0.5, -0.5, 1, 1); + _context.restore(); + + } + + } else if (material.isSpriteCanvasMaterial) { + + setStrokeStyle(material.color.getStyle()); + setFillStyle(material.color.getStyle()); + + _context.save(); + _context.translate(v1.x, v1.y); + if (material.rotation !== 0) _context.rotate(material.rotation); + _context.scale(scaleX, scaleY); + + material.program(_context); + + _context.restore(); + + } else if (material.isPointsMaterial) { + + setFillStyle(material.color.getStyle()); + + _context.save(); + _context.translate(v1.x, v1.y); + if (material.rotation !== 0) _context.rotate(material.rotation); + _context.scale(scaleX * material.size, -scaleY * material.size); + _context.fillRect(-0.5, -0.5, 1, 1); + _context.restore(); + + } + + /* DEBUG + setStrokeStyle( 'rgb(255,255,0)' ); + _context.beginPath(); + _context.moveTo( v1.x - 10, v1.y ); + _context.lineTo( v1.x + 10, v1.y ); + _context.moveTo( v1.x, v1.y - 10 ); + _context.lineTo( v1.x, v1.y + 10 ); + _context.stroke(); + */ + + } + + function renderLine(v1, v2, element, material) { + + setOpacity(material.opacity); + setBlending(material.blending); + + _context.beginPath(); + _context.moveTo(v1.positionScreen.x, v1.positionScreen.y); + _context.lineTo(v2.positionScreen.x, v2.positionScreen.y); + + if (material.isLineBasicMaterial) { + + setLineWidth(material.linewidth); + setLineCap(material.linecap); + setLineJoin(material.linejoin); + + if (material.vertexColors !== THREE.VertexColors) { + + setStrokeStyle(material.color.getStyle()); + + } else { + + var colorStyle1 = element.vertexColors[0].getStyle(); + var colorStyle2 = element.vertexColors[1].getStyle(); + + if (colorStyle1 === colorStyle2) { + + setStrokeStyle(colorStyle1); + + } else { + + try { + + var grad = _context.createLinearGradient( + v1.positionScreen.x, + v1.positionScreen.y, + v2.positionScreen.x, + v2.positionScreen.y + ); + grad.addColorStop(0, colorStyle1); + grad.addColorStop(1, colorStyle2); + + } catch (exception) { + + grad = colorStyle1; + + } + + setStrokeStyle(grad); + + } + + } + + if (material.isLineDashedMaterial) { + + setLineDash([material.dashSize, material.gapSize]); + + } + + _context.stroke(); + _elemBox.expandByScalar(material.linewidth * 2); + + if (material.isLineDashedMaterial) { + + setLineDash([]); + + } + + } + + } + + function renderFace3(v1, v2, v3, uv1, uv2, uv3, element, material) { + + _this.info.render.vertices += 3; + _this.info.render.faces++; + + setOpacity(material.opacity); + setBlending(material.blending); + + _v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y; + _v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y; + _v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y; + + drawTriangle(_v1x, _v1y, _v2x, _v2y, _v3x, _v3y); + + if ((material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial) && material.map === null) { + + _diffuseColor.copy(material.color); + _emissiveColor.copy(material.emissive); + + if (material.vertexColors === THREE.FaceColors) { + + _diffuseColor.multiply(element.color); + + } + + _color.copy(_ambientLight); + + _centroid.copy(v1.positionWorld).add(v2.positionWorld).add(v3.positionWorld).divideScalar(3); + + calculateLight(_centroid, element.normalModel, _color); + + _color.multiply(_diffuseColor).add(_emissiveColor); + + material.wireframe === true + ? strokePath(_color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin) + : fillPath(_color); + + } else if (material.isMeshBasicMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial) { + + if (material.map !== null) { + + var mapping = material.map.mapping; + + if (mapping === THREE.UVMapping) { + + _uvs = element.uvs; + patternPath(_v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[uv1].x, _uvs[uv1].y, _uvs[uv2].x, _uvs[uv2].y, _uvs[uv3].x, _uvs[uv3].y, material.map); + + } + + } else if (material.envMap !== null) { + + if (material.envMap.mapping === THREE.SphericalReflectionMapping) { + + _normal.copy(element.vertexNormalsModel[uv1]).applyMatrix3(_normalViewMatrix); + _uv1x = 0.5 * _normal.x + 0.5; + _uv1y = 0.5 * _normal.y + 0.5; + + _normal.copy(element.vertexNormalsModel[uv2]).applyMatrix3(_normalViewMatrix); + _uv2x = 0.5 * _normal.x + 0.5; + _uv2y = 0.5 * _normal.y + 0.5; + + _normal.copy(element.vertexNormalsModel[uv3]).applyMatrix3(_normalViewMatrix); + _uv3x = 0.5 * _normal.x + 0.5; + _uv3y = 0.5 * _normal.y + 0.5; + + patternPath(_v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap); + + } + + } else { + + _color.copy(material.color); + + if (material.vertexColors === THREE.FaceColors) { + + _color.multiply(element.color); + + } + + material.wireframe === true + ? strokePath(_color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin) + : fillPath(_color); + + } + + } else if (material.isMeshNormalMaterial) { + + _normal.copy(element.normalModel).applyMatrix3(_normalViewMatrix); + + _color.setRGB(_normal.x, _normal.y, _normal.z).multiplyScalar(0.5).addScalar(0.5); + + material.wireframe === true + ? strokePath(_color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin) + : fillPath(_color); + + } else { + + _color.setRGB(1, 1, 1); + + material.wireframe === true + ? strokePath(_color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin) + : fillPath(_color); + + } + + } + + // + + function drawTriangle(x0, y0, x1, y1, x2, y2) { + + _context.beginPath(); + _context.moveTo(x0, y0); + _context.lineTo(x1, y1); + _context.lineTo(x2, y2); + _context.closePath(); + + } + + function strokePath(color, linewidth, linecap, linejoin) { + + setLineWidth(linewidth); + setLineCap(linecap); + setLineJoin(linejoin); + setStrokeStyle(color.getStyle()); + + _context.stroke(); + + _elemBox.expandByScalar(linewidth * 2); + + } + + function fillPath(color) { + + setFillStyle(color.getStyle()); + _context.fill(); + + } + + function textureToPattern(texture) { + + if (texture.version === 0 || + texture instanceof THREE.CompressedTexture || + texture instanceof THREE.DataTexture) { + + return { + canvas: undefined, + version: texture.version + }; + + } + + var image = texture.image; + + if (image.complete === false) { + + return { + canvas: undefined, + version: 0 + }; + + } + + var repeatX = texture.wrapS === THREE.RepeatWrapping || texture.wrapS === THREE.MirroredRepeatWrapping; + var repeatY = texture.wrapT === THREE.RepeatWrapping || texture.wrapT === THREE.MirroredRepeatWrapping; + + var mirrorX = texture.wrapS === THREE.MirroredRepeatWrapping; + var mirrorY = texture.wrapT === THREE.MirroredRepeatWrapping; + + // + + var canvas = document.createElement('canvas'); + canvas.width = image.width * (mirrorX ? 2 : 1); + canvas.height = image.height * (mirrorY ? 2 : 1); + + var context = canvas.getContext('2d'); + context.setTransform(1, 0, 0, -1, 0, image.height); + context.drawImage(image, 0, 0); + + if (mirrorX === true) { + + context.setTransform(-1, 0, 0, -1, image.width, image.height); + context.drawImage(image, -image.width, 0); + + } + + if (mirrorY === true) { + + context.setTransform(1, 0, 0, 1, 0, 0); + context.drawImage(image, 0, image.height); + + } + + if (mirrorX === true && mirrorY === true) { + + context.setTransform(-1, 0, 0, 1, image.width, 0); + context.drawImage(image, -image.width, image.height); + + } + + var repeat = 'no-repeat'; + + if (repeatX === true && repeatY === true) { + + repeat = 'repeat'; + + } else if (repeatX === true) { + + repeat = 'repeat-x'; + + } else if (repeatY === true) { + + repeat = 'repeat-y'; + + } + + var pattern = _context.createPattern(canvas, repeat); + + if (texture.onUpdate) texture.onUpdate(texture); + + return { + canvas: pattern, + version: texture.version + }; + + } + + function patternPath(x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, texture) { + + var pattern = _patterns[texture.id]; + + if (pattern === undefined || pattern.version !== texture.version) { + + pattern = textureToPattern(texture); + _patterns[texture.id] = pattern; + + } + + if (pattern.canvas !== undefined) { + + setFillStyle(pattern.canvas); + + } else { + + setFillStyle('rgba( 0, 0, 0, 1)'); + _context.fill(); + return; + + } + + // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 + + var a, b, c, d, e, f, det, idet, + offsetX = texture.offset.x / texture.repeat.x, + offsetY = texture.offset.y / texture.repeat.y, + width = texture.image.width * texture.repeat.x, + height = texture.image.height * texture.repeat.y; + + u0 = (u0 + offsetX) * width; + v0 = (v0 + offsetY) * height; + + u1 = (u1 + offsetX) * width; + v1 = (v1 + offsetY) * height; + + u2 = (u2 + offsetX) * width; + v2 = (v2 + offsetY) * height; + + x1 -= x0; y1 -= y0; + x2 -= x0; y2 -= y0; + + u1 -= u0; v1 -= v0; + u2 -= u0; v2 -= v0; + + det = u1 * v2 - u2 * v1; + + if (det === 0) return; + + idet = 1 / det; + + a = (v2 * x1 - v1 * x2) * idet; + b = (v2 * y1 - v1 * y2) * idet; + c = (u1 * x2 - u2 * x1) * idet; + d = (u1 * y2 - u2 * y1) * idet; + + e = x0 - a * u0 - c * v0; + f = y0 - b * u0 - d * v0; + + _context.save(); + _context.transform(a, b, c, d, e, f); + _context.fill(); + _context.restore(); + + } + + /* + function clipImage( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, image ) { + + // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 + + var a, b, c, d, e, f, det, idet, + width = image.width - 1, + height = image.height - 1; + + u0 *= width; v0 *= height; + u1 *= width; v1 *= height; + u2 *= width; v2 *= height; + + x1 -= x0; y1 -= y0; + x2 -= x0; y2 -= y0; + + u1 -= u0; v1 -= v0; + u2 -= u0; v2 -= v0; + + det = u1 * v2 - u2 * v1; + + idet = 1 / det; + + a = ( v2 * x1 - v1 * x2 ) * idet; + b = ( v2 * y1 - v1 * y2 ) * idet; + c = ( u1 * x2 - u2 * x1 ) * idet; + d = ( u1 * y2 - u2 * y1 ) * idet; + + e = x0 - a * u0 - c * v0; + f = y0 - b * u0 - d * v0; + + _context.save(); + _context.transform( a, b, c, d, e, f ); + _context.clip(); + _context.drawImage( image, 0, 0 ); + _context.restore(); + + } + */ + + // Hide anti-alias gaps + + function expand(v1, v2, pixels) { + + var x = v2.x - v1.x, y = v2.y - v1.y, + det = x * x + y * y, idet; + + if (det === 0) return; + + idet = pixels / Math.sqrt(det); + + x *= idet; y *= idet; + + v2.x += x; v2.y += y; + v1.x -= x; v1.y -= y; + + } + + // Context cached methods. + + function setOpacity(value) { + + if (_contextGlobalAlpha !== value) { + + _context.globalAlpha = value; + _contextGlobalAlpha = value; + + } + + } + + function setBlending(value) { + + if (_contextGlobalCompositeOperation !== value) { + + if (value === THREE.NormalBlending) { + + _context.globalCompositeOperation = 'source-over'; + + } else if (value === THREE.AdditiveBlending) { + + _context.globalCompositeOperation = 'lighter'; + + } else if (value === THREE.SubtractiveBlending) { + + _context.globalCompositeOperation = 'darker'; + + } else if (value === THREE.MultiplyBlending) { + + _context.globalCompositeOperation = 'multiply'; + + } + + _contextGlobalCompositeOperation = value; + + } + + } + + function setLineWidth(value) { + + if (_contextLineWidth !== value) { + + _context.lineWidth = value; + _contextLineWidth = value; + + } + + } + + function setLineCap(value) { + + // "butt", "round", "square" + + if (_contextLineCap !== value) { + + _context.lineCap = value; + _contextLineCap = value; + + } + + } + + function setLineJoin(value) { + + // "round", "bevel", "miter" + + if (_contextLineJoin !== value) { + + _context.lineJoin = value; + _contextLineJoin = value; + + } + + } + + function setStrokeStyle(value) { + + if (_contextStrokeStyle !== value) { + + _context.strokeStyle = value; + _contextStrokeStyle = value; + + } + + } + + function setFillStyle(value) { + + if (_contextFillStyle !== value) { + + _context.fillStyle = value; + _contextFillStyle = value; + + } + + } + + function setLineDash(value) { + + if (_contextLineDash.length !== value.length) { + + _context.setLineDash(value); + _contextLineDash = value; + + } + + } + +}; \ No newline at end of file diff --git a/public/static/modelView/js/ColourTheme.js b/public/static/modelView/js/ColourTheme.js new file mode 100644 index 0000000..fc9d708 --- /dev/null +++ b/public/static/modelView/js/ColourTheme.js @@ -0,0 +1,162 @@ +锘縱ar header = document.getElementById("header"); +var light_btn = document.getElementById("lightSkin"); +var dark_btn = document.getElementById("darkSkin") + +$("#lightSkin").click(function () { + + header.style.background = "#e0e0d1"; + + //Lighter colour for buttons and hover + light_btn.style.background = "#8a8a5c"; + dark_btn.style.background = "#8a8a5c"; + + $("#lightSkin").hover(function () { + $(this).css("background", "#333"); //Light blue colour on hover + }, function () { + $(this).css("background", "#333"); //back to light theme colour when not hovering + }); + $("#darkSkin").hover(function () { + $(this).css("background", "#333"); //Light blue colour on hover + }, function () { + $(this).css("background", "#333"); //back to light theme colour when not hovering + }); + + /*SET SIDE AND BOTTOM MENU BACKGROUND COLOURS*/ + $(".side_menu").each(function () { + $(this).css("background", "#fff"); //b8b894 + }); + + $("#bottom_menu").each(function () { + $(this).css("background", "#b8b894"); + }); + /*SET SIDE AND BOTTOM MENU BACKGROUND COLOURS*/ + + //Menu item list items background i.e. the box that contains the options e.g. light sliders + $(".menu_item > li").each(function () { + $(this).css("background", "#666"); + }); + + //Each subsequent list item set to same background colour + $(".menu_item > li > ul > li").each(function () { + $(this).css("background", "#666"); + }); + + //List item links background colour + darker text colour e.g. wireframe mode, phong shading + $(".menu_item > li > a").each(function () { + $(this).css("background", "#fff"); + $(this).css("color", "#000000"); + }); + + //Hovering over list item links e.g. wireframe mode, phong shading + $(".menu_item li a").hover(function () { + $(this).css("background", "#cce6ff"); //Light blue colour on hover + }, function () { + $(this).css("background", "#fff"); //back to light theme colour when not hovering + }); + + /***BOTTOM MENU***/ + //list items background i.e. the box that contains the options e.g. light sliders + $(".bottom_menu_item > li").each(function () { + $(this).css("background", "#8a8a5c"); + }); + + //Each subsequent list item set to same background colour + $(".bottom_menu_item > li > ul > li").each(function () { + $(this).css("background", "#8a8a5c"); + }); + + //List item links background colour + darker text colour e.g. wireframe mode, phong shading + $(".bottom_menu_item > li > a").each(function () { + $(this).css("background", "#e0e0d1"); + $(this).css("color", "#000000"); + }); + + //Hovering over list item links e.g. wireframe mode, phong shading + $(".bottom_menu_item li a").hover(function () { + $(this).css("background", "#cce6ff"); //Light blue colour on hover + }, function () { + $(this).css("background", "#e0e0d1"); //back to light theme colour when not hovering + }); + +}); + +$("#darkSkin").click(function () +{ + header.style.background = "#3d5c5c"; + + //Lighter colour for buttons and hover + light_btn.style.background = "#3d5c5c"; + dark_btn.style.background = "#3d5c5c"; + + $("#lightSkin").hover(function () { + $(this).css("background", "#494a4c"); //Light blue colour on hover + }, function () { + $(this).css("background", "#3d5c5c"); //back to light theme colour when not hovering + }); + $("#darkSkin").hover(function () { + $(this).css("background", "#494a4c"); //Light blue colour on hover + }, function () { + $(this).css("background", "#3d5c5c"); //back to light theme colour when not hovering + }); + + /*SET SIDE AND BOTTOM MENU BACKGROUND COLOURS*/ + $(".side_menu").each(function () { + $(this).css("background", "#494a4c"); + }); + + $("#bottom_menu").each(function () { + $(this).css("background", "#494a4c"); + }); + /*SET SIDE AND BOTTOM MENU BACKGROUND COLOURS*/ + + //Menu item list items background except the first (so that header remains different colour) + $(".menu_item > li").not(":first").each(function () { + $(this).css("background", "#1d1e1e"); + }); + + //Each subsequent list item set to same background colour + $(".menu_item > li > ul > li").each(function () { + $(this).css("background", "#1d1e1e"); + }); + + //List item links background colour + darker text colour e.g. wireframe mode, phong shading + $(".menu_item > li > a").each(function () { + $(this).css("background", "#1d1e1e"); + $(this).css("color", "#fff"); + }); + + //Hovering over list item links e.g. wireframe mode, phong shading + $(".menu_item li a").hover(function () { + $(this).css("background", "#494a4c"); + }, function () { + $(this).css("background", "#1d1e1e"); + }); + + /*********BOTTOM MENU********/ + + //list items background i.e. the box that contains the options e.g. light sliders + $(".bottom_menu_item > li").each(function () { + $(this).css("background", "#1d1e1e"); + }); + + //Each subsequent list item set to same background colour + $(".bottom_menu_item > li > ul > li").each(function () { + $(this).css("background", "#1d1e1e"); + }); + + //List item links background colour + darker text colour e.g. wireframe mode, phong shading + $(".bottom_menu_item > li > a").each(function () { + $(this).css("background", "#1d1e1e"); + $(this).css("color", "#fff"); + }); + + //Hovering over list item links e.g. wireframe mode, phong shading + $(".bottom_menu_item li a").hover(function () { + $(this).css("background", "#494a4c"); + }, function () { + $(this).css("background", "#1d1e1e"); + }); + + + +}); \ No newline at end of file diff --git a/public/static/modelView/js/DDSLoader.js b/public/static/modelView/js/DDSLoader.js new file mode 100644 index 0000000..ef9c252 --- /dev/null +++ b/public/static/modelView/js/DDSLoader.js @@ -0,0 +1,269 @@ +锘�/* + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.DDSLoader = function () { + + this._parser = THREE.DDSLoader.parse; + +}; + +THREE.DDSLoader.prototype = Object.create(THREE.CompressedTextureLoader.prototype); +THREE.DDSLoader.prototype.constructor = THREE.DDSLoader; + +THREE.DDSLoader.parse = function (buffer, loadMipmaps) { + + var dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 }; + + // Adapted from @toji's DDS utils + // https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js + + // All values and structures referenced from: + // http://msdn.microsoft.com/en-us/library/bb943991.aspx/ + + var DDS_MAGIC = 0x20534444; + + var DDSD_CAPS = 0x1, + DDSD_HEIGHT = 0x2, + DDSD_WIDTH = 0x4, + DDSD_PITCH = 0x8, + DDSD_PIXELFORMAT = 0x1000, + DDSD_MIPMAPCOUNT = 0x20000, + DDSD_LINEARSIZE = 0x80000, + DDSD_DEPTH = 0x800000; + + var DDSCAPS_COMPLEX = 0x8, + DDSCAPS_MIPMAP = 0x400000, + DDSCAPS_TEXTURE = 0x1000; + + var DDSCAPS2_CUBEMAP = 0x200, + DDSCAPS2_CUBEMAP_POSITIVEX = 0x400, + DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800, + DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000, + DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000, + DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000, + DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000, + DDSCAPS2_VOLUME = 0x200000; + + var DDPF_ALPHAPIXELS = 0x1, + DDPF_ALPHA = 0x2, + DDPF_FOURCC = 0x4, + DDPF_RGB = 0x40, + DDPF_YUV = 0x200, + DDPF_LUMINANCE = 0x20000; + + function fourCCToInt32(value) { + + return value.charCodeAt(0) + + (value.charCodeAt(1) << 8) + + (value.charCodeAt(2) << 16) + + (value.charCodeAt(3) << 24); + + } + + function int32ToFourCC(value) { + + return String.fromCharCode( + value & 0xff, + (value >> 8) & 0xff, + (value >> 16) & 0xff, + (value >> 24) & 0xff + ); + + } + + function loadARGBMip(buffer, dataOffset, width, height) { + + var dataLength = width * height * 4; + var srcBuffer = new Uint8Array(buffer, dataOffset, dataLength); + var byteArray = new Uint8Array(dataLength); + var dst = 0; + var src = 0; + for (var y = 0; y < height; y++) { + + for (var x = 0; x < width; x++) { + + var b = srcBuffer[src]; src++; + var g = srcBuffer[src]; src++; + var r = srcBuffer[src]; src++; + var a = srcBuffer[src]; src++; + byteArray[dst] = r; dst++; //r + byteArray[dst] = g; dst++; //g + byteArray[dst] = b; dst++; //b + byteArray[dst] = a; dst++; //a + + } + + } + return byteArray; + + } + + var FOURCC_DXT1 = fourCCToInt32("DXT1"); + var FOURCC_DXT3 = fourCCToInt32("DXT3"); + var FOURCC_DXT5 = fourCCToInt32("DXT5"); + var FOURCC_ETC1 = fourCCToInt32("ETC1"); + + var headerLengthInt = 31; // The header length in 32 bit ints + + // Offsets into the header array + + var off_magic = 0; + + var off_size = 1; + var off_flags = 2; + var off_height = 3; + var off_width = 4; + + var off_mipmapCount = 7; + + var off_pfFlags = 20; + var off_pfFourCC = 21; + var off_RGBBitCount = 22; + var off_RBitMask = 23; + var off_GBitMask = 24; + var off_BBitMask = 25; + var off_ABitMask = 26; + + var off_caps = 27; + var off_caps2 = 28; + var off_caps3 = 29; + var off_caps4 = 30; + + // Parse header + + var header = new Int32Array(buffer, 0, headerLengthInt); + + if (header[off_magic] !== DDS_MAGIC) { + + console.error('THREE.DDSLoader.parse: Invalid magic number in DDS header.'); + return dds; + + } + + if (!header[off_pfFlags] & DDPF_FOURCC) { + + console.error('THREE.DDSLoader.parse: Unsupported format, must contain a FourCC code.'); + return dds; + + } + + var blockBytes; + + var fourCC = header[off_pfFourCC]; + + var isRGBAUncompressed = false; + + switch (fourCC) { + + case FOURCC_DXT1: + + blockBytes = 8; + dds.format = THREE.RGB_S3TC_DXT1_Format; + break; + + case FOURCC_DXT3: + + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT3_Format; + break; + + case FOURCC_DXT5: + + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT5_Format; + break; + + case FOURCC_ETC1: + + blockBytes = 8; + dds.format = THREE.RGB_ETC1_Format; + break; + + default: + + if (header[off_RGBBitCount] === 32 + && header[off_RBitMask] & 0xff0000 + && header[off_GBitMask] & 0xff00 + && header[off_BBitMask] & 0xff + && header[off_ABitMask] & 0xff000000) { + + isRGBAUncompressed = true; + blockBytes = 64; + dds.format = THREE.RGBAFormat; + + } else { + + console.error('THREE.DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC(fourCC)); + return dds; + + } + } + + dds.mipmapCount = 1; + + if (header[off_flags] & DDSD_MIPMAPCOUNT && loadMipmaps !== false) { + + dds.mipmapCount = Math.max(1, header[off_mipmapCount]); + + } + + var caps2 = header[off_caps2]; + dds.isCubemap = caps2 & DDSCAPS2_CUBEMAP ? true : false; + if (dds.isCubemap && ( + !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) || + !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) || + !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) || + !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) || + !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) || + !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) + )) { + + console.error('THREE.DDSLoader.parse: Incomplete cubemap faces'); + return dds; + + } + + dds.width = header[off_width]; + dds.height = header[off_height]; + + var dataOffset = header[off_size] + 4; + + // Extract mipmaps buffers + + var faces = dds.isCubemap ? 6 : 1; + + for (var face = 0; face < faces; face++) { + + var width = dds.width; + var height = dds.height; + + for (var i = 0; i < dds.mipmapCount; i++) { + + if (isRGBAUncompressed) { + + var byteArray = loadARGBMip(buffer, dataOffset, width, height); + var dataLength = byteArray.length; + + } else { + + var dataLength = Math.max(4, width) / 4 * Math.max(4, height) / 4 * blockBytes; + var byteArray = new Uint8Array(buffer, dataOffset, dataLength); + + } + + var mipmap = { "data": byteArray, "width": width, "height": height }; + dds.mipmaps.push(mipmap); + + dataOffset += dataLength; + + width = Math.max(width >> 1, 1); + height = Math.max(height >> 1, 1); + + } + + } + + return dds; + +}; \ No newline at end of file diff --git a/public/static/modelView/js/Detector.js b/public/static/modelView/js/Detector.js new file mode 100644 index 0000000..f01ab39 --- /dev/null +++ b/public/static/modelView/js/Detector.js @@ -0,0 +1,78 @@ +锘�/** + * @author alteredq / http://alteredqualia.com/ + * @author mr.doob / http://mrdoob.com/ + */ + +var Detector = { + + canvas: !!window.CanvasRenderingContext2D, + webgl: (function () { + + try { + + var canvas = document.createElement('canvas'); return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))); + + } catch (e) { + + return false; + + } + + })(), + workers: !!window.Worker, + fileapi: window.File && window.FileReader && window.FileList && window.Blob, + + getWebGLErrorMessage: function () { + + var element = document.createElement('div'); + element.id = 'webgl-error-message'; + element.style.fontFamily = 'monospace'; + element.style.fontSize = '13px'; + element.style.fontWeight = 'normal'; + element.style.textAlign = 'center'; + element.style.background = '#fff'; + element.style.color = '#000'; + element.style.padding = '1.5em'; + element.style.width = '400px'; + element.style.margin = '5em auto 0'; + + if (!this.webgl) { + + element.innerHTML = window.WebGLRenderingContext ? [ + 'Your graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br />', + 'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.' + ].join('\n') : [ + 'Your browser does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br/>', + 'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.' + ].join('\n'); + + } + + return element; + + }, + + addGetWebGLMessage: function (parameters) { + + var parent, id, element; + + parameters = parameters || {}; + + parent = parameters.parent !== undefined ? parameters.parent : document.body; + id = parameters.id !== undefined ? parameters.id : 'oldie'; + + element = Detector.getWebGLErrorMessage(); + element.id = id; + + parent.appendChild(element); + + } + +}; + +// browserify support +if (typeof module === 'object') { + + module.exports = Detector; + +} \ No newline at end of file diff --git a/public/static/modelView/js/OrbitControls.js b/public/static/modelView/js/OrbitControls.js new file mode 100644 index 0000000..259fa1a --- /dev/null +++ b/public/static/modelView/js/OrbitControls.js @@ -0,0 +1,1037 @@ +锘�/** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// +// Orbit - left mouse / touch: one finger move +// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish +// Pan - right mouse, or arrow keys / touch: three finter swipe + +THREE.OrbitControls = function (object, domElement) { + + this.object = object; + + this.domElement = (domElement !== undefined) ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = -Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.reset = function () { + + scope.target.copy(scope.target0); + scope.object.position.copy(scope.position0); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent(changeEvent); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function () { + + var offset = new THREE.Vector3(); + + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0)); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + + return function () { + + var position = scope.object.position; + + offset.copy(position).sub(scope.target); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion(quat); + + // angle from z-axis around y-axis + spherical.setFromVector3(offset); + + if (scope.autoRotate && state === STATE.NONE) { + + rotateLeft(getAutoRotationAngle()); + + } + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + // restrict theta to be between desired limits + spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); + + // restrict phi to be between desired limits + spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); + + spherical.makeSafe(); + + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); + + // move target to panned location + scope.target.add(panOffset); + + offset.setFromSpherical(spherical); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion(quatInverse); + + position.copy(scope.target).add(offset); + + scope.object.lookAt(scope.target); + + if (scope.enableDamping === true) { + + sphericalDelta.theta *= (1 - scope.dampingFactor); + sphericalDelta.phi *= (1 - scope.dampingFactor); + + } else { + + sphericalDelta.set(0, 0, 0); + + } + + scale = 1; + panOffset.set(0, 0, 0); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if (zoomChanged || + lastPosition.distanceToSquared(scope.object.position) > EPS || + 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { + + scope.dispatchEvent(changeEvent); + + lastPosition.copy(scope.object.position); + lastQuaternion.copy(scope.object.quaternion); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function () { + + scope.domElement.removeEventListener('contextmenu', onContextMenu, false); + scope.domElement.removeEventListener('mousedown', onMouseDown, false); + scope.domElement.removeEventListener('mousewheel', onMouseWheel, false); + scope.domElement.removeEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox + + scope.domElement.removeEventListener('touchstart', onTouchStart, false); + scope.domElement.removeEventListener('touchend', onTouchEnd, false); + scope.domElement.removeEventListener('touchmove', onTouchMove, false); + + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + document.removeEventListener('mouseout', onMouseUp, false); + + window.removeEventListener('keydown', onKeyDown, false); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new THREE.Spherical(); + var sphericalDelta = new THREE.Spherical(); + + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow(0.95, scope.zoomSpeed); + + } + + function rotateLeft(angle) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp(angle) { + + sphericalDelta.phi -= angle; + + } + + var panLeft = function () { + + var v = new THREE.Vector3(); + + return function panLeft(distance, objectMatrix) { + + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + v.multiplyScalar(-distance); + + panOffset.add(v); + + }; + + }(); + + var panUp = function () { + + var v = new THREE.Vector3(); + + return function panUp(distance, objectMatrix) { + + v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix + v.multiplyScalar(distance); + + panOffset.add(v); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function () { + + var offset = new THREE.Vector3(); + + return function (deltaX, deltaY) { + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + if (scope.object instanceof THREE.PerspectiveCamera) { + + // perspective + var position = scope.object.position; + offset.copy(position).sub(scope.target); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan((scope.object.fov / 2) * Math.PI / 180.0); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); + panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); + + } else if (scope.object instanceof THREE.OrthographicCamera) { + + // orthographic + panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); + panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); + + } else { + + // camera neither orthographic nor perspective + console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.'); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn(dollyScale) { + + if (scope.object instanceof THREE.PerspectiveCamera) { + + scale /= dollyScale; + + } else if (scope.object instanceof THREE.OrthographicCamera) { + + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.'); + scope.enableZoom = false; + + } + + } + + function dollyOut(dollyScale) { + + if (scope.object instanceof THREE.PerspectiveCamera) { + + scale *= dollyScale; + + } else if (scope.object instanceof THREE.OrthographicCamera) { + + scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.'); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate(event) { + + //console.log( 'handleMouseDownRotate' ); + + rotateStart.set(event.clientX, event.clientY); + + } + + function handleMouseDownDolly(event) { + + //console.log( 'handleMouseDownDolly' ); + + dollyStart.set(event.clientX, event.clientY); + + } + + function handleMouseDownPan(event) { + + //console.log( 'handleMouseDownPan' ); + + panStart.set(event.clientX, event.clientY); + + } + + function handleMouseMoveRotate(event) { + + //console.log( 'handleMouseMoveRotate' ); + + rotateEnd.set(event.clientX, event.clientY); + rotateDelta.subVectors(rotateEnd, rotateStart); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); + + rotateStart.copy(rotateEnd); + + scope.update(); + + } + + function handleMouseMoveDolly(event) { + + //console.log( 'handleMouseMoveDolly' ); + + dollyEnd.set(event.clientX, event.clientY); + + dollyDelta.subVectors(dollyEnd, dollyStart); + + if (dollyDelta.y > 0) { + + dollyIn(getZoomScale()); + + } else if (dollyDelta.y < 0) { + + dollyOut(getZoomScale()); + + } + + dollyStart.copy(dollyEnd); + + scope.update(); + + } + + function handleMouseMovePan(event) { + + //console.log( 'handleMouseMovePan' ); + + panEnd.set(event.clientX, event.clientY); + + panDelta.subVectors(panEnd, panStart); + + pan(panDelta.x, panDelta.y); + + panStart.copy(panEnd); + + scope.update(); + + } + + function handleMouseUp(event) { + + //console.log( 'handleMouseUp' ); + + } + + function handleMouseWheel(event) { + + //console.log( 'handleMouseWheel' ); + + var delta = 0; + + if (event.wheelDelta !== undefined) { + + // WebKit / Opera / Explorer 9 + + delta = event.wheelDelta; + + } else if (event.detail !== undefined) { + + // Firefox + + delta = - event.detail; + + } + + if (delta > 0) { + + dollyOut(getZoomScale()); + + } else if (delta < 0) { + + dollyIn(getZoomScale()); + + } + + scope.update(); + + } + + function handleKeyDown(event) { + + //console.log( 'handleKeyDown' ); + + switch (event.keyCode) { + + case scope.keys.UP: + pan(0, scope.keyPanSpeed); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan(0, -scope.keyPanSpeed); + scope.update(); + break; + + case scope.keys.LEFT: + pan(scope.keyPanSpeed, 0); + scope.update(); + break; + + case scope.keys.RIGHT: + pan(-scope.keyPanSpeed, 0); + scope.update(); + break; + + } + + } + + function handleTouchStartRotate(event) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + + } + + function handleTouchStartDolly(event) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyStart.set(0, distance); + + } + + function handleTouchStartPan(event) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + + } + + function handleTouchMoveRotate(event) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + rotateDelta.subVectors(rotateEnd, rotateStart); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed); + + rotateStart.copy(rotateEnd); + + scope.update(); + + } + + function handleTouchMoveDolly(event) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyEnd.set(0, distance); + + dollyDelta.subVectors(dollyEnd, dollyStart); + + if (dollyDelta.y > 0) { + + dollyOut(getZoomScale()); + + } else if (dollyDelta.y < 0) { + + dollyIn(getZoomScale()); + + } + + dollyStart.copy(dollyEnd); + + scope.update(); + + } + + function handleTouchMovePan(event) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + + panDelta.subVectors(panEnd, panStart); + + pan(panDelta.x, panDelta.y); + + panStart.copy(panEnd); + + scope.update(); + + } + + function handleTouchEnd(event) { + + //console.log( 'handleTouchEnd' ); + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown(event) { + + if (scope.enabled === false) return; + + event.preventDefault(); + + if (event.button === scope.mouseButtons.ORBIT) { + + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + + } else if (event.button === scope.mouseButtons.ZOOM) { + + if (scope.enableZoom === false) return; + + handleMouseDownDolly(event); + + state = STATE.DOLLY; + + } else if (event.button === scope.mouseButtons.PAN) { + + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + + } + + if (state !== STATE.NONE) { + + document.addEventListener('mousemove', onMouseMove, false); + document.addEventListener('mouseup', onMouseUp, false); + document.addEventListener('mouseout', onMouseUp, false); + + scope.dispatchEvent(startEvent); + + } + + } + + function onMouseMove(event) { + + if (scope.enabled === false) return; + + event.preventDefault(); + + if (state === STATE.ROTATE) { + + if (scope.enableRotate === false) return; + + handleMouseMoveRotate(event); + + } else if (state === STATE.DOLLY) { + + if (scope.enableZoom === false) return; + + handleMouseMoveDolly(event); + + } else if (state === STATE.PAN) { + + if (scope.enablePan === false) return; + + handleMouseMovePan(event); + + } + + } + + function onMouseUp(event) { + + if (scope.enabled === false) return; + + handleMouseUp(event); + + document.removeEventListener('mousemove', onMouseMove, false); + document.removeEventListener('mouseup', onMouseUp, false); + document.removeEventListener('mouseout', onMouseUp, false); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + + } + + function onMouseWheel(event) { + + if (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE)) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel(event); + + scope.dispatchEvent(startEvent); // not sure why these are here... + scope.dispatchEvent(endEvent); + + } + + function onKeyDown(event) { + + if (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return; + + handleKeyDown(event); + + } + + function onTouchStart(event) { + + if (scope.enabled === false) return; + + switch (event.touches.length) { + + case 1: // one-fingered touch: rotate + + if (scope.enableRotate === false) return; + + handleTouchStartRotate(event); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: // two-fingered touch: dolly + + if (scope.enableZoom === false) return; + + handleTouchStartDolly(event); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: // three-fingered touch: pan + + if (scope.enablePan === false) return; + + handleTouchStartPan(event); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + if (state !== STATE.NONE) { + + scope.dispatchEvent(startEvent); + + } + + } + + function onTouchMove(event) { + + if (scope.enabled === false) return; + + event.preventDefault(); + event.stopPropagation(); + + switch (event.touches.length) { + + case 1: // one-fingered touch: rotate + + if (scope.enableRotate === false) return; + if (state !== STATE.TOUCH_ROTATE) return; // is this needed?... + + handleTouchMoveRotate(event); + + break; + + case 2: // two-fingered touch: dolly + + if (scope.enableZoom === false) return; + if (state !== STATE.TOUCH_DOLLY) return; // is this needed?... + + handleTouchMoveDolly(event); + + break; + + case 3: // three-fingered touch: pan + + if (scope.enablePan === false) return; + if (state !== STATE.TOUCH_PAN) return; // is this needed?... + + handleTouchMovePan(event); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd(event) { + + if (scope.enabled === false) return; + + handleTouchEnd(event); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + + } + + function onContextMenu(event) { + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener('contextmenu', onContextMenu, false); + + scope.domElement.addEventListener('mousedown', onMouseDown, false); + scope.domElement.addEventListener('mousewheel', onMouseWheel, false); + scope.domElement.addEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox + + scope.domElement.addEventListener('touchstart', onTouchStart, false); + scope.domElement.addEventListener('touchend', onTouchEnd, false); + scope.domElement.addEventListener('touchmove', onTouchMove, false); + + window.addEventListener('keydown', onKeyDown, false); + + // force an update at start + + this.update(); + +}; + +THREE.OrbitControls.prototype = Object.create(THREE.EventDispatcher.prototype); +THREE.OrbitControls.prototype.constructor = THREE.OrbitControls; + +Object.defineProperties(THREE.OrbitControls.prototype, { + + center: { + + get: function () { + + console.warn('THREE.OrbitControls: .center has been renamed to .target'); + return this.target; + + } + + }, + + // backward compatibility + + noZoom: { + + get: function () { + + console.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + return !this.enableZoom; + + }, + + set: function (value) { + + console.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.'); + this.enableZoom = !value; + + } + + }, + + noRotate: { + + get: function () { + + console.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + return !this.enableRotate; + + }, + + set: function (value) { + + console.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'); + this.enableRotate = !value; + + } + + }, + + noPan: { + + get: function () { + + console.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + return !this.enablePan; + + }, + + set: function (value) { + + console.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.'); + this.enablePan = !value; + + } + + }, + + noKeys: { + + get: function () { + + console.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + return !this.enableKeys; + + }, + + set: function (value) { + + console.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.'); + this.enableKeys = !value; + + } + + }, + + staticMoving: { + + get: function () { + + console.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + return !this.enableDamping; + + }, + + set: function (value) { + + console.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'); + this.enableDamping = !value; + + } + + }, + + dynamicDampingFactor: { + + get: function () { + + console.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + return this.dampingFactor; + + }, + + set: function (value) { + + console.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'); + this.dampingFactor = value; + + } + + } + +}); \ No newline at end of file diff --git a/public/static/modelView/js/Projector.js b/public/static/modelView/js/Projector.js new file mode 100644 index 0000000..63ad162 --- /dev/null +++ b/public/static/modelView/js/Projector.js @@ -0,0 +1,1028 @@ +锘�/** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author julianwa / https://github.com/julianwa + */ + +THREE.RenderableObject = function () { + + this.id = 0; + + this.object = null; + this.z = 0; + this.renderOrder = 0; + +}; + +// + +THREE.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; + this.renderOrder = 0; + +}; + +// + +THREE.RenderableVertex = function () { + + this.position = new THREE.Vector3(); + this.positionWorld = new THREE.Vector3(); + this.positionScreen = new THREE.Vector4(); + + this.visible = true; + +}; + +THREE.RenderableVertex.prototype.copy = function (vertex) { + + this.positionWorld.copy(vertex.positionWorld); + this.positionScreen.copy(vertex.positionScreen); + +}; + +// + +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; + this.renderOrder = 0; + +}; + +// + +THREE.RenderableSprite = function () { + + this.id = 0; + + this.object = null; + + this.x = 0; + this.y = 0; + this.z = 0; + + this.rotation = 0; + this.scale = new THREE.Vector2(); + + this.material = null; + this.renderOrder = 0; + +}; + +// + +THREE.Projector = function () { + + var _object, _objectCount, _objectPool = [], _objectPoolLength = 0, + _vertex, _vertexCount, _vertexPool = [], _vertexPoolLength = 0, + _face, _faceCount, _facePool = [], _facePoolLength = 0, + _line, _lineCount, _linePool = [], _linePoolLength = 0, + _sprite, _spriteCount, _spritePool = [], _spritePoolLength = 0, + + _renderData = { objects: [], lights: [], elements: [] }, + + _vector3 = new THREE.Vector3(), + _vector4 = new THREE.Vector4(), + + _clipBox = new THREE.Box3(new THREE.Vector3(-1, -1, -1), new THREE.Vector3(1, 1, 1)), + _boundingBox = new THREE.Box3(), + _points3 = new Array(3), + + _viewMatrix = new THREE.Matrix4(), + _viewProjectionMatrix = new THREE.Matrix4(), + + _modelMatrix, + _modelViewProjectionMatrix = new THREE.Matrix4(), + + _normalMatrix = new THREE.Matrix3(), + + _frustum = new THREE.Frustum(), + + _clippedVertex1PositionScreen = new THREE.Vector4(), + _clippedVertex2PositionScreen = new THREE.Vector4(); + + // + + this.projectVector = function (vector, camera) { + + console.warn('THREE.Projector: .projectVector() is now vector.project().'); + vector.project(camera); + + }; + + this.unprojectVector = function (vector, camera) { + + console.warn('THREE.Projector: .unprojectVector() is now vector.unproject().'); + vector.unproject(camera); + + }; + + this.pickingRay = function () { + + console.error('THREE.Projector: .pickingRay() is now raycaster.setFromCamera().'); + + }; + + // + + var RenderList = function () { + + var normals = []; + var colors = []; + var uvs = []; + + var object = null; + var material = null; + + var normalMatrix = new THREE.Matrix3(); + + function setObject(value) { + + object = value; + material = object.material; + + normalMatrix.getNormalMatrix(object.matrixWorld); + + normals.length = 0; + colors.length = 0; + uvs.length = 0; + + } + + function projectVertex(vertex) { + + var position = vertex.position; + var positionWorld = vertex.positionWorld; + var positionScreen = vertex.positionScreen; + + positionWorld.copy(position).applyMatrix4(_modelMatrix); + positionScreen.copy(positionWorld).applyMatrix4(_viewProjectionMatrix); + + var invW = 1 / positionScreen.w; + + positionScreen.x *= invW; + positionScreen.y *= invW; + positionScreen.z *= invW; + + vertex.visible = positionScreen.x >= -1 && positionScreen.x <= 1 && + positionScreen.y >= -1 && positionScreen.y <= 1 && + positionScreen.z >= -1 && positionScreen.z <= 1; + + } + + function pushVertex(x, y, z) { + + _vertex = getNextVertexInPool(); + _vertex.position.set(x, y, z); + + projectVertex(_vertex); + + } + + function pushNormal(x, y, z) { + + normals.push(x, y, z); + + } + + function pushColor(r, g, b) { + + colors.push(r, g, b); + + } + + function pushUv(x, y) { + + uvs.push(x, y); + + } + + function checkTriangleVisibility(v1, v2, v3) { + + if (v1.visible === true || v2.visible === true || v3.visible === true) return true; + + _points3[0] = v1.positionScreen; + _points3[1] = v2.positionScreen; + _points3[2] = v3.positionScreen; + + return _clipBox.intersectsBox(_boundingBox.setFromPoints(_points3)); + + } + + function checkBackfaceCulling(v1, v2, v3) { + + return ((v3.positionScreen.x - v1.positionScreen.x) * + (v2.positionScreen.y - v1.positionScreen.y) - + (v3.positionScreen.y - v1.positionScreen.y) * + (v2.positionScreen.x - v1.positionScreen.x)) < 0; + + } + + function pushLine(a, b) { + + var v1 = _vertexPool[a]; + var v2 = _vertexPool[b]; + + // Clip + + v1.positionScreen.copy(v1.position).applyMatrix4(_modelViewProjectionMatrix); + v2.positionScreen.copy(v2.position).applyMatrix4(_modelViewProjectionMatrix); + + if (clipLine(v1.positionScreen, v2.positionScreen) === true) { + + // Perform the perspective divide + v1.positionScreen.multiplyScalar(1 / v1.positionScreen.w); + v2.positionScreen.multiplyScalar(1 / v2.positionScreen.w); + + _line = getNextLineInPool(); + _line.id = object.id; + _line.v1.copy(v1); + _line.v2.copy(v2); + _line.z = Math.max(v1.positionScreen.z, v2.positionScreen.z); + _line.renderOrder = object.renderOrder; + + _line.material = object.material; + + if (object.material.vertexColors === THREE.VertexColors) { + + _line.vertexColors[0].fromArray(colors, a * 3); + _line.vertexColors[1].fromArray(colors, b * 3); + + } + + _renderData.elements.push(_line); + + } + + } + + function pushTriangle(a, b, c) { + + var v1 = _vertexPool[a]; + var v2 = _vertexPool[b]; + var v3 = _vertexPool[c]; + + if (checkTriangleVisibility(v1, v2, v3) === false) return; + + if (material.side === THREE.DoubleSide || checkBackfaceCulling(v1, v2, v3) === true) { + + _face = getNextFaceInPool(); + + _face.id = object.id; + _face.v1.copy(v1); + _face.v2.copy(v2); + _face.v3.copy(v3); + _face.z = (v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z) / 3; + _face.renderOrder = object.renderOrder; + + // use first vertex normal as face normal + + _face.normalModel.fromArray(normals, a * 3); + _face.normalModel.applyMatrix3(normalMatrix).normalize(); + + for (var i = 0; i < 3; i++) { + + var normal = _face.vertexNormalsModel[i]; + normal.fromArray(normals, arguments[i] * 3); + normal.applyMatrix3(normalMatrix).normalize(); + + var uv = _face.uvs[i]; + uv.fromArray(uvs, arguments[i] * 2); + + } + + _face.vertexNormalsLength = 3; + + _face.material = object.material; + + _renderData.elements.push(_face); + + } + + } + + return { + setObject: setObject, + projectVertex: projectVertex, + checkTriangleVisibility: checkTriangleVisibility, + checkBackfaceCulling: checkBackfaceCulling, + pushVertex: pushVertex, + pushNormal: pushNormal, + pushColor: pushColor, + pushUv: pushUv, + pushLine: pushLine, + pushTriangle: pushTriangle + }; + + }; + + var renderList = new RenderList(); + + function projectObject(object) { + + if (object.visible === false) return; + + if (object instanceof THREE.Light) { + + _renderData.lights.push(object); + + } else if (object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points) { + + if (object.material.visible === false) return; + if (object.frustumCulled === true && _frustum.intersectsObject(object) === false) return; + + addObject(object); + + } else if (object instanceof THREE.Sprite) { + + if (object.material.visible === false) return; + if (object.frustumCulled === true && _frustum.intersectsSprite(object) === false) return; + + addObject(object); + + } + + var children = object.children; + + for (var i = 0, l = children.length; i < l; i++) { + + projectObject(children[i]); + + } + + } + + function addObject(object) { + + _object = getNextObjectInPool(); + _object.id = object.id; + _object.object = object; + + _vector3.setFromMatrixPosition(object.matrixWorld); + _vector3.applyMatrix4(_viewProjectionMatrix); + _object.z = _vector3.z; + _object.renderOrder = object.renderOrder; + + _renderData.objects.push(_object); + + } + + this.projectScene = function (scene, camera, sortObjects, sortElements) { + + _faceCount = 0; + _lineCount = 0; + _spriteCount = 0; + + _renderData.elements.length = 0; + + if (scene.autoUpdate === true) scene.updateMatrixWorld(); + if (camera.parent === null) camera.updateMatrixWorld(); + + _viewMatrix.copy(camera.matrixWorldInverse); + _viewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, _viewMatrix); + + _frustum.setFromMatrix(_viewProjectionMatrix); + + // + + _objectCount = 0; + + _renderData.objects.length = 0; + _renderData.lights.length = 0; + + projectObject(scene); + + if (sortObjects === true) { + + _renderData.objects.sort(painterSort); + + } + + // + + var objects = _renderData.objects; + + for (var o = 0, ol = objects.length; o < ol; o++) { + + var object = objects[o].object; + var geometry = object.geometry; + + renderList.setObject(object); + + _modelMatrix = object.matrixWorld; + + _vertexCount = 0; + + if (object instanceof THREE.Mesh) { + + if (geometry instanceof THREE.BufferGeometry) { + + var attributes = geometry.attributes; + var groups = geometry.groups; + + if (attributes.position === undefined) continue; + + var positions = attributes.position.array; + + for (var i = 0, l = positions.length; i < l; i += 3) { + + renderList.pushVertex(positions[i], positions[i + 1], positions[i + 2]); + + } + + if (attributes.normal !== undefined) { + + var normals = attributes.normal.array; + + for (var i = 0, l = normals.length; i < l; i += 3) { + + renderList.pushNormal(normals[i], normals[i + 1], normals[i + 2]); + + } + + } + + if (attributes.uv !== undefined) { + + var uvs = attributes.uv.array; + + for (var i = 0, l = uvs.length; i < l; i += 2) { + + renderList.pushUv(uvs[i], uvs[i + 1]); + + } + + } + + if (geometry.index !== null) { + + var indices = geometry.index.array; + + if (groups.length > 0) { + + for (var g = 0; g < groups.length; g++) { + + var group = groups[g]; + + for (var i = group.start, l = group.start + group.count; i < l; i += 3) { + + renderList.pushTriangle(indices[i], indices[i + 1], indices[i + 2]); + + } + + } + + } else { + + for (var i = 0, l = indices.length; i < l; i += 3) { + + renderList.pushTriangle(indices[i], indices[i + 1], indices[i + 2]); + + } + + } + + } else { + + for (var i = 0, l = positions.length / 3; i < l; i += 3) { + + renderList.pushTriangle(i, i + 1, i + 2); + + } + + } + + } else if (geometry instanceof THREE.Geometry) { + + var vertices = geometry.vertices; + var faces = geometry.faces; + var faceVertexUvs = geometry.faceVertexUvs[0]; + + _normalMatrix.getNormalMatrix(_modelMatrix); + + var material = object.material; + + var isMultiMaterial = Array.isArray(material); + + for (var v = 0, vl = vertices.length; v < vl; v++) { + + var vertex = vertices[v]; + + _vector3.copy(vertex); + + if (material.morphTargets === true) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = object.morphTargetInfluences; + + for (var t = 0, tl = morphTargets.length; t < tl; t++) { + + var influence = morphInfluences[t]; + + if (influence === 0) continue; + + var target = morphTargets[t]; + var targetVertex = target.vertices[v]; + + _vector3.x += (targetVertex.x - vertex.x) * influence; + _vector3.y += (targetVertex.y - vertex.y) * influence; + _vector3.z += (targetVertex.z - vertex.z) * influence; + + } + + } + + renderList.pushVertex(_vector3.x, _vector3.y, _vector3.z); + + } + + for (var f = 0, fl = faces.length; f < fl; f++) { + + var face = faces[f]; + + material = isMultiMaterial === true + ? object.material[face.materialIndex] + : object.material; + + if (material === undefined) continue; + + var side = material.side; + + var v1 = _vertexPool[face.a]; + var v2 = _vertexPool[face.b]; + var v3 = _vertexPool[face.c]; + + if (renderList.checkTriangleVisibility(v1, v2, v3) === false) continue; + + var visible = renderList.checkBackfaceCulling(v1, v2, v3); + + if (side !== THREE.DoubleSide) { + + if (side === THREE.FrontSide && visible === false) continue; + if (side === THREE.BackSide && visible === true) continue; + + } + + _face = getNextFaceInPool(); + + _face.id = object.id; + _face.v1.copy(v1); + _face.v2.copy(v2); + _face.v3.copy(v3); + + _face.normalModel.copy(face.normal); + + if (visible === false && (side === THREE.BackSide || side === THREE.DoubleSide)) { + + _face.normalModel.negate(); + + } + + _face.normalModel.applyMatrix3(_normalMatrix).normalize(); + + var faceVertexNormals = face.vertexNormals; + + for (var n = 0, nl = Math.min(faceVertexNormals.length, 3) ; n < nl; n++) { + + var normalModel = _face.vertexNormalsModel[n]; + normalModel.copy(faceVertexNormals[n]); + + if (visible === false && (side === THREE.BackSide || side === THREE.DoubleSide)) { + + normalModel.negate(); + + } + + normalModel.applyMatrix3(_normalMatrix).normalize(); + + } + + _face.vertexNormalsLength = faceVertexNormals.length; + + var vertexUvs = faceVertexUvs[f]; + + if (vertexUvs !== undefined) { + + for (var u = 0; u < 3; u++) { + + _face.uvs[u].copy(vertexUvs[u]); + + } + + } + + _face.color = face.color; + _face.material = material; + + _face.z = (v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z) / 3; + _face.renderOrder = object.renderOrder; + + _renderData.elements.push(_face); + + } + + } + + } else if (object instanceof THREE.Line) { + + _modelViewProjectionMatrix.multiplyMatrices(_viewProjectionMatrix, _modelMatrix); + + if (geometry instanceof THREE.BufferGeometry) { + + var attributes = geometry.attributes; + + if (attributes.position !== undefined) { + + var positions = attributes.position.array; + + for (var i = 0, l = positions.length; i < l; i += 3) { + + renderList.pushVertex(positions[i], positions[i + 1], positions[i + 2]); + + } + + if (attributes.color !== undefined) { + + var colors = attributes.color.array; + + for (var i = 0, l = colors.length; i < l; i += 3) { + + renderList.pushColor(colors[i], colors[i + 1], colors[i + 2]); + + } + + } + + if (geometry.index !== null) { + + var indices = geometry.index.array; + + for (var i = 0, l = indices.length; i < l; i += 2) { + + renderList.pushLine(indices[i], indices[i + 1]); + + } + + } else { + + var step = object instanceof THREE.LineSegments ? 2 : 1; + + for (var i = 0, l = (positions.length / 3) - 1; i < l; i += step) { + + renderList.pushLine(i, i + 1); + + } + + } + + } + + } else if (geometry instanceof THREE.Geometry) { + + var vertices = object.geometry.vertices; + + if (vertices.length === 0) continue; + + v1 = getNextVertexInPool(); + v1.positionScreen.copy(vertices[0]).applyMatrix4(_modelViewProjectionMatrix); + + var step = object instanceof THREE.LineSegments ? 2 : 1; + + for (var v = 1, vl = vertices.length; v < vl; v++) { + + v1 = getNextVertexInPool(); + v1.positionScreen.copy(vertices[v]).applyMatrix4(_modelViewProjectionMatrix); + + if ((v + 1) % step > 0) continue; + + v2 = _vertexPool[_vertexCount - 2]; + + _clippedVertex1PositionScreen.copy(v1.positionScreen); + _clippedVertex2PositionScreen.copy(v2.positionScreen); + + if (clipLine(_clippedVertex1PositionScreen, _clippedVertex2PositionScreen) === true) { + + // Perform the perspective divide + _clippedVertex1PositionScreen.multiplyScalar(1 / _clippedVertex1PositionScreen.w); + _clippedVertex2PositionScreen.multiplyScalar(1 / _clippedVertex2PositionScreen.w); + + _line = getNextLineInPool(); + + _line.id = object.id; + _line.v1.positionScreen.copy(_clippedVertex1PositionScreen); + _line.v2.positionScreen.copy(_clippedVertex2PositionScreen); + + _line.z = Math.max(_clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z); + _line.renderOrder = object.renderOrder; + + _line.material = object.material; + + if (object.material.vertexColors === THREE.VertexColors) { + + _line.vertexColors[0].copy(object.geometry.colors[v]); + _line.vertexColors[1].copy(object.geometry.colors[v - 1]); + + } + + _renderData.elements.push(_line); + + } + + } + + } + + } else if (object instanceof THREE.Points) { + + _modelViewProjectionMatrix.multiplyMatrices(_viewProjectionMatrix, _modelMatrix); + + if (geometry instanceof THREE.Geometry) { + + var vertices = object.geometry.vertices; + + for (var v = 0, vl = vertices.length; v < vl; v++) { + + var vertex = vertices[v]; + + _vector4.set(vertex.x, vertex.y, vertex.z, 1); + _vector4.applyMatrix4(_modelViewProjectionMatrix); + + pushPoint(_vector4, object, camera); + + } + + } else if (geometry instanceof THREE.BufferGeometry) { + + var attributes = geometry.attributes; + + if (attributes.position !== undefined) { + + var positions = attributes.position.array; + + for (var i = 0, l = positions.length; i < l; i += 3) { + + _vector4.set(positions[i], positions[i + 1], positions[i + 2], 1); + _vector4.applyMatrix4(_modelViewProjectionMatrix); + + pushPoint(_vector4, object, camera); + + } + + } + + } + + } else if (object instanceof THREE.Sprite) { + + _vector4.set(_modelMatrix.elements[12], _modelMatrix.elements[13], _modelMatrix.elements[14], 1); + _vector4.applyMatrix4(_viewProjectionMatrix); + + pushPoint(_vector4, object, camera); + + } + + } + + if (sortElements === true) { + + _renderData.elements.sort(painterSort); + + } + + return _renderData; + + }; + + function pushPoint(_vector4, object, camera) { + + var invW = 1 / _vector4.w; + + _vector4.z *= invW; + + if (_vector4.z >= -1 && _vector4.z <= 1) { + + _sprite = getNextSpriteInPool(); + _sprite.id = object.id; + _sprite.x = _vector4.x * invW; + _sprite.y = _vector4.y * invW; + _sprite.z = _vector4.z; + _sprite.renderOrder = object.renderOrder; + _sprite.object = object; + + _sprite.rotation = object.rotation; + + _sprite.scale.x = object.scale.x * Math.abs(_sprite.x - (_vector4.x + camera.projectionMatrix.elements[0]) / (_vector4.w + camera.projectionMatrix.elements[12])); + _sprite.scale.y = object.scale.y * Math.abs(_sprite.y - (_vector4.y + camera.projectionMatrix.elements[5]) / (_vector4.w + camera.projectionMatrix.elements[13])); + + _sprite.material = object.material; + + _renderData.elements.push(_sprite); + + } + + } + + // Pools + + function getNextObjectInPool() { + + if (_objectCount === _objectPoolLength) { + + var object = new THREE.RenderableObject(); + _objectPool.push(object); + _objectPoolLength++; + _objectCount++; + return object; + + } + + return _objectPool[_objectCount++]; + + } + + function getNextVertexInPool() { + + if (_vertexCount === _vertexPoolLength) { + + var vertex = new THREE.RenderableVertex(); + _vertexPool.push(vertex); + _vertexPoolLength++; + _vertexCount++; + return vertex; + + } + + return _vertexPool[_vertexCount++]; + + } + + function getNextFaceInPool() { + + if (_faceCount === _facePoolLength) { + + var face = new THREE.RenderableFace(); + _facePool.push(face); + _facePoolLength++; + _faceCount++; + return face; + + } + + return _facePool[_faceCount++]; + + + } + + function getNextLineInPool() { + + if (_lineCount === _linePoolLength) { + + var line = new THREE.RenderableLine(); + _linePool.push(line); + _linePoolLength++; + _lineCount++; + return line; + + } + + return _linePool[_lineCount++]; + + } + + function getNextSpriteInPool() { + + if (_spriteCount === _spritePoolLength) { + + var sprite = new THREE.RenderableSprite(); + _spritePool.push(sprite); + _spritePoolLength++; + _spriteCount++; + return sprite; + + } + + return _spritePool[_spriteCount++]; + + } + + // + + function painterSort(a, b) { + + if (a.renderOrder !== b.renderOrder) { + + return a.renderOrder - b.renderOrder; + + } else if (a.z !== b.z) { + + return b.z - a.z; + + } else if (a.id !== b.id) { + + return a.id - b.id; + + } else { + + return 0; + + } + + } + + function clipLine(s1, s2) { + + var alpha1 = 0, alpha2 = 1, + + // Calculate the boundary coordinate of each vertex for the near and far clip planes, + // Z = -1 and Z = +1, respectively. + + bc1near = s1.z + s1.w, + bc2near = s2.z + s2.w, + bc1far = -s1.z + s1.w, + bc2far = -s2.z + s2.w; + + if (bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0) { + + // Both vertices lie entirely within all clip planes. + return true; + + } else if ((bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0)) { + + // Both vertices lie entirely outside one of the clip planes. + return false; + + } else { + + // The line segment spans at least one clip plane. + + if (bc1near < 0) { + + // v1 lies outside the near plane, v2 inside + alpha1 = Math.max(alpha1, bc1near / (bc1near - bc2near)); + + } else if (bc2near < 0) { + + // v2 lies outside the near plane, v1 inside + alpha2 = Math.min(alpha2, bc1near / (bc1near - bc2near)); + + } + + if (bc1far < 0) { + + // v1 lies outside the far plane, v2 inside + alpha1 = Math.max(alpha1, bc1far / (bc1far - bc2far)); + + } else if (bc2far < 0) { + + // v2 lies outside the far plane, v2 inside + alpha2 = Math.min(alpha2, bc1far / (bc1far - bc2far)); + + } + + if (alpha2 < alpha1) { + + // The line segment spans two boundaries, but is outside both of them. + // (This can't happen when we're only clipping against just near/far but good + // to leave the check here for future usage if other clip planes are added.) + return false; + + } else { + + // Update the s1 and s2 vertices to match the clipped line segment. + s1.lerp(s2, alpha1); + s2.lerp(s1, 1 - alpha2); + + return true; + + } + + } + + } + +}; \ No newline at end of file diff --git a/public/static/modelView/js/THREEx.FullScreen.js b/public/static/modelView/js/THREEx.FullScreen.js new file mode 100644 index 0000000..4775d48 --- /dev/null +++ b/public/static/modelView/js/THREEx.FullScreen.js @@ -0,0 +1,107 @@ +锘�// This THREEx helper makes it easy to handle the fullscreen API +// * it hides the prefix for each browser +// * it hides the little discrepencies of the various vendor API +// * at the time of this writing (nov 2011) it is available in +// [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html), +// [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and +// [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API). + +// +// # Code + +// + +/** @namespace */ +var THREEx = THREEx || {}; +THREEx.FullScreen = THREEx.FullScreen || {}; + +/** + * test if it is possible to have fullscreen + * + * @returns {Boolean} true if fullscreen API is available, false otherwise +*/ +THREEx.FullScreen.available = function () { + return this._hasWebkitFullScreen || this._hasMozFullScreen; +} + +/** + * test if fullscreen is currently activated + * + * @returns {Boolean} true if fullscreen is currently activated, false otherwise +*/ +THREEx.FullScreen.activated = function () { + if (this._hasWebkitFullScreen) { + return document.webkitIsFullScreen; + } else if (this._hasMozFullScreen) { + return document.mozFullScreen; + } else { + console.assert(false); + } +} + +/** + * Request fullscreen on a given element + * @param {DomElement} element to make fullscreen. optional. default to document.body +*/ +THREEx.FullScreen.request = function (element) { + element = element || document.body; + if (this._hasWebkitFullScreen) { + element.webkitRequestFullScreen(); + } else if (this._hasMozFullScreen) { + element.mozRequestFullScreen(); + } else { + console.assert(false); + } +} + +/** + * Cancel fullscreen +*/ +THREEx.FullScreen.cancel = function () { + if (this._hasWebkitFullScreen) { + document.webkitCancelFullScreen(); + } else if (this._hasMozFullScreen) { + document.mozCancelFullScreen(); + } else { + console.assert(false); + } +} + +// internal functions to know which fullscreen API implementation is available +THREEx.FullScreen._hasWebkitFullScreen = 'webkitCancelFullScreen' in document ? true : false; +THREEx.FullScreen._hasMozFullScreen = 'mozCancelFullScreen' in document ? true : false; + +/** + * Bind a key to renderer screenshot + * usage: THREEx.FullScreen.bindKey({ charCode : 'a'.charCodeAt(0) }); +*/ +THREEx.FullScreen.bindKey = function (opts) { + opts = opts || {}; + var charCode = opts.charCode || 'f'.charCodeAt(0); + var dblclick = opts.dblclick !== undefined ? opts.dblclick : false; + var element = opts.element + + var toggle = function () { + if (THREEx.FullScreen.activated()) { + THREEx.FullScreen.cancel(); + } else { + THREEx.FullScreen.request(element); + } + } + + var onKeyPress = function (event) { + if (event.which !== charCode) return; + toggle(); + }.bind(this); + + document.addEventListener('keypress', onKeyPress, false); + + dblclick && document.addEventListener('dblclick', toggle, false); + + return { + unbind: function () { + document.removeEventListener('keypress', onKeyPress, false); + dblclick && document.removeEventListener('dblclick', toggle, false); + } + }; +} \ No newline at end of file diff --git a/public/static/modelView/js/THREEx.WindowResize.js b/public/static/modelView/js/THREEx.WindowResize.js new file mode 100644 index 0000000..7023422 --- /dev/null +++ b/public/static/modelView/js/THREEx.WindowResize.js @@ -0,0 +1,45 @@ +锘�// This THREEx helper makes it easy to handle window resize. +// It will update renderer and camera when window is resized. +// +// # Usage +// +// **Step 1**: Start updating renderer and camera +// +// ```var windowResize = THREEx.WindowResize(aRenderer, aCamera)``` +// +// **Step 2**: Start updating renderer and camera +// +// ```windowResize.stop()``` +// # Code + +// + +/** @namespace */ +var THREEx = THREEx || {}; + +/** + * Update renderer and camera when the window is resized + * + * @param {Object} renderer the renderer to update + * @param {Object} Camera the camera to update +*/ +THREEx.WindowResize = function (renderer, camera) { + var callback = function () { + // notify the renderer of the size change + renderer.setSize(window.innerWidth, window.innerHeight); + // update the camera + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + } + // bind the resize event + window.addEventListener('resize', callback, false); + // return .stop() the function to stop watching window resize + return { + /** + * Stop watching window resize + */ + stop: function () { + window.removeEventListener('resize', callback); + } + }; +} \ No newline at end of file diff --git a/public/static/modelView/js/TransformControls.js b/public/static/modelView/js/TransformControls.js new file mode 100644 index 0000000..a34b6cc --- /dev/null +++ b/public/static/modelView/js/TransformControls.js @@ -0,0 +1,1147 @@ +锘�/** + * @author arodic / https://github.com/arodic + */ + +(function () { + + 'use strict'; + + var GizmoMaterial = function (parameters) { + + THREE.MeshBasicMaterial.call(this); + + this.depthTest = false; + this.depthWrite = false; + this.fog = false; + this.side = THREE.FrontSide; + this.transparent = true; + + this.setValues(parameters); + + this.oldColor = this.color.clone(); + this.oldOpacity = this.opacity; + + this.highlight = function (highlighted) { + + if (highlighted) { + + this.color.setRGB(1, 1, 0); + this.opacity = 1; + + } else { + + this.color.copy(this.oldColor); + this.opacity = this.oldOpacity; + + } + + }; + + }; + + GizmoMaterial.prototype = Object.create(THREE.MeshBasicMaterial.prototype); + GizmoMaterial.prototype.constructor = GizmoMaterial; + + + var GizmoLineMaterial = function (parameters) { + + THREE.LineBasicMaterial.call(this); + + this.depthTest = false; + this.depthWrite = false; + this.fog = false; + this.transparent = true; + this.linewidth = 1; + + this.setValues(parameters); + + this.oldColor = this.color.clone(); + this.oldOpacity = this.opacity; + + this.highlight = function (highlighted) { + + if (highlighted) { + + this.color.setRGB(1, 1, 0); + this.opacity = 1; + + } else { + + this.color.copy(this.oldColor); + this.opacity = this.oldOpacity; + + } + + }; + + }; + + GizmoLineMaterial.prototype = Object.create(THREE.LineBasicMaterial.prototype); + GizmoLineMaterial.prototype.constructor = GizmoLineMaterial; + + + var pickerMaterial = new GizmoMaterial({ visible: false, transparent: false }); + + + THREE.TransformGizmo = function () { + + this.init = function () { + + THREE.Object3D.call(this); + + this.handles = new THREE.Object3D(); + this.pickers = new THREE.Object3D(); + this.planes = new THREE.Object3D(); + + this.add(this.handles); + this.add(this.pickers); + this.add(this.planes); + + //// PLANES + + var planeGeometry = new THREE.PlaneBufferGeometry(50, 50, 2, 2); + var planeMaterial = new THREE.MeshBasicMaterial({ visible: false, side: THREE.DoubleSide }); + + var planes = { + "XY": new THREE.Mesh(planeGeometry, planeMaterial), + "YZ": new THREE.Mesh(planeGeometry, planeMaterial), + "XZ": new THREE.Mesh(planeGeometry, planeMaterial), + "XYZE": new THREE.Mesh(planeGeometry, planeMaterial) + }; + + this.activePlane = planes["XYZE"]; + + planes["YZ"].rotation.set(0, Math.PI / 2, 0); + planes["XZ"].rotation.set(-Math.PI / 2, 0, 0); + + for (var i in planes) { + + planes[i].name = i; + this.planes.add(planes[i]); + this.planes[i] = planes[i]; + + } + + //// HANDLES AND PICKERS + + var setupGizmos = function (gizmoMap, parent) { + + for (var name in gizmoMap) { + + for (i = gizmoMap[name].length; i--;) { + + var object = gizmoMap[name][i][0]; + var position = gizmoMap[name][i][1]; + var rotation = gizmoMap[name][i][2]; + + object.name = name; + + object.renderOrder = Infinity; // avoid being hidden by other transparent objects + + if (position) object.position.set(position[0], position[1], position[2]); + if (rotation) object.rotation.set(rotation[0], rotation[1], rotation[2]); + + parent.add(object); + + } + + } + + }; + + setupGizmos(this.handleGizmos, this.handles); + setupGizmos(this.pickerGizmos, this.pickers); + + // reset Transformations + + this.traverse(function (child) { + + if (child instanceof THREE.Mesh) { + + child.updateMatrix(); + + var tempGeometry = child.geometry.clone(); + tempGeometry.applyMatrix(child.matrix); + child.geometry = tempGeometry; + + child.position.set(0, 0, 0); + child.rotation.set(0, 0, 0); + child.scale.set(1, 1, 1); + + } + + }); + + }; + + this.highlight = function (axis) { + + this.traverse(function (child) { + + if (child.material && child.material.highlight) { + + if (child.name === axis) { + + child.material.highlight(true); + + } else { + + child.material.highlight(false); + + } + + } + + }); + + }; + + }; + + THREE.TransformGizmo.prototype = Object.create(THREE.Object3D.prototype); + THREE.TransformGizmo.prototype.constructor = THREE.TransformGizmo; + + THREE.TransformGizmo.prototype.update = function (rotation, eye) { + + var vec1 = new THREE.Vector3(0, 0, 0); + var vec2 = new THREE.Vector3(0, 1, 0); + var lookAtMatrix = new THREE.Matrix4(); + + this.traverse(function (child) { + + if (child.name.search("E") !== -1) { + + child.quaternion.setFromRotationMatrix(lookAtMatrix.lookAt(eye, vec1, vec2)); + + } else if (child.name.search("X") !== -1 || child.name.search("Y") !== -1 || child.name.search("Z") !== -1) { + + child.quaternion.setFromEuler(rotation); + + } + + }); + + }; + + THREE.TransformGizmoTranslate = function () { + + THREE.TransformGizmo.call(this); + + var arrowGeometry = new THREE.ConeBufferGeometry(0.05, 0.2, 12, 1, false); + arrowGeometry.translate(0, 0.5, 0); + + var lineXGeometry = new THREE.BufferGeometry(); + lineXGeometry.addAttribute('position', new THREE.Float32BufferAttribute([0, 0, 0, 1, 0, 0], 3)); + + var lineYGeometry = new THREE.BufferGeometry(); + lineYGeometry.addAttribute('position', new THREE.Float32BufferAttribute([0, 0, 0, 0, 1, 0], 3)); + + var lineZGeometry = new THREE.BufferGeometry(); + lineZGeometry.addAttribute('position', new THREE.Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3)); + + this.handleGizmos = { + + X: [ + [new THREE.Mesh(arrowGeometry, new GizmoMaterial({ color: 0xff0000 })), [0.5, 0, 0], [0, 0, -Math.PI / 2]], + [new THREE.Line(lineXGeometry, new GizmoLineMaterial({ color: 0xff0000 }))] + ], + + Y: [ + [new THREE.Mesh(arrowGeometry, new GizmoMaterial({ color: 0x00ff00 })), [0, 0.5, 0]], + [new THREE.Line(lineYGeometry, new GizmoLineMaterial({ color: 0x00ff00 }))] + ], + + Z: [ + [new THREE.Mesh(arrowGeometry, new GizmoMaterial({ color: 0x0000ff })), [0, 0, 0.5], [Math.PI / 2, 0, 0]], + [new THREE.Line(lineZGeometry, new GizmoLineMaterial({ color: 0x0000ff }))] + ], + + XYZ: [ + [new THREE.Mesh(new THREE.OctahedronGeometry(0.1, 0), new GizmoMaterial({ color: 0xffffff, opacity: 0.25 })), [0, 0, 0], [0, 0, 0]] + ], + + XY: [ + [new THREE.Mesh(new THREE.PlaneBufferGeometry(0.29, 0.29), new GizmoMaterial({ color: 0xffff00, opacity: 0.25 })), [0.15, 0.15, 0]] + ], + + YZ: [ + [new THREE.Mesh(new THREE.PlaneBufferGeometry(0.29, 0.29), new GizmoMaterial({ color: 0x00ffff, opacity: 0.25 })), [0, 0.15, 0.15], [0, Math.PI / 2, 0]] + ], + + XZ: [ + [new THREE.Mesh(new THREE.PlaneBufferGeometry(0.29, 0.29), new GizmoMaterial({ color: 0xff00ff, opacity: 0.25 })), [0.15, 0, 0.15], [-Math.PI / 2, 0, 0]] + ] + + }; + + this.pickerGizmos = { + + X: [ + [new THREE.Mesh(new THREE.CylinderBufferGeometry(0.2, 0, 1, 4, 1, false), pickerMaterial), [0.6, 0, 0], [0, 0, -Math.PI / 2]] + ], + + Y: [ + [new THREE.Mesh(new THREE.CylinderBufferGeometry(0.2, 0, 1, 4, 1, false), pickerMaterial), [0, 0.6, 0]] + ], + + Z: [ + [new THREE.Mesh(new THREE.CylinderBufferGeometry(0.2, 0, 1, 4, 1, false), pickerMaterial), [0, 0, 0.6], [Math.PI / 2, 0, 0]] + ], + + XYZ: [ + [new THREE.Mesh(new THREE.OctahedronGeometry(0.2, 0), pickerMaterial)] + ], + + XY: [ + [new THREE.Mesh(new THREE.PlaneBufferGeometry(0.4, 0.4), pickerMaterial), [0.2, 0.2, 0]] + ], + + YZ: [ + [new THREE.Mesh(new THREE.PlaneBufferGeometry(0.4, 0.4), pickerMaterial), [0, 0.2, 0.2], [0, Math.PI / 2, 0]] + ], + + XZ: [ + [new THREE.Mesh(new THREE.PlaneBufferGeometry(0.4, 0.4), pickerMaterial), [0.2, 0, 0.2], [-Math.PI / 2, 0, 0]] + ] + + }; + + this.setActivePlane = function (axis, eye) { + + var tempMatrix = new THREE.Matrix4(); + eye.applyMatrix4(tempMatrix.getInverse(tempMatrix.extractRotation(this.planes["XY"].matrixWorld))); + + if (axis === "X") { + + this.activePlane = this.planes["XY"]; + + if (Math.abs(eye.y) > Math.abs(eye.z)) this.activePlane = this.planes["XZ"]; + + } + + if (axis === "Y") { + + this.activePlane = this.planes["XY"]; + + if (Math.abs(eye.x) > Math.abs(eye.z)) this.activePlane = this.planes["YZ"]; + + } + + if (axis === "Z") { + + this.activePlane = this.planes["XZ"]; + + if (Math.abs(eye.x) > Math.abs(eye.y)) this.activePlane = this.planes["YZ"]; + + } + + if (axis === "XYZ") this.activePlane = this.planes["XYZE"]; + + if (axis === "XY") this.activePlane = this.planes["XY"]; + + if (axis === "YZ") this.activePlane = this.planes["YZ"]; + + if (axis === "XZ") this.activePlane = this.planes["XZ"]; + + }; + + this.init(); + + }; + + THREE.TransformGizmoTranslate.prototype = Object.create(THREE.TransformGizmo.prototype); + THREE.TransformGizmoTranslate.prototype.constructor = THREE.TransformGizmoTranslate; + + THREE.TransformGizmoRotate = function () { + + THREE.TransformGizmo.call(this); + + var CircleGeometry = function (radius, facing, arc) { + + var geometry = new THREE.BufferGeometry(); + var vertices = []; + arc = arc ? arc : 1; + + for (var i = 0; i <= 64 * arc; ++i) { + + if (facing === 'x') vertices.push(0, Math.cos(i / 32 * Math.PI) * radius, Math.sin(i / 32 * Math.PI) * radius); + if (facing === 'y') vertices.push(Math.cos(i / 32 * Math.PI) * radius, 0, Math.sin(i / 32 * Math.PI) * radius); + if (facing === 'z') vertices.push(Math.sin(i / 32 * Math.PI) * radius, Math.cos(i / 32 * Math.PI) * radius, 0); + + } + + geometry.addAttribute('position', new THREE.Float32BufferAttribute(vertices, 3)); + return geometry; + + }; + + this.handleGizmos = { + + X: [ + [new THREE.Line(new CircleGeometry(1, 'x', 0.5), new GizmoLineMaterial({ color: 0xff0000 }))] + ], + + Y: [ + [new THREE.Line(new CircleGeometry(1, 'y', 0.5), new GizmoLineMaterial({ color: 0x00ff00 }))] + ], + + Z: [ + [new THREE.Line(new CircleGeometry(1, 'z', 0.5), new GizmoLineMaterial({ color: 0x0000ff }))] + ], + + E: [ + [new THREE.Line(new CircleGeometry(1.25, 'z', 1), new GizmoLineMaterial({ color: 0xcccc00 }))] + ], + + XYZE: [ + [new THREE.Line(new CircleGeometry(1, 'z', 1), new GizmoLineMaterial({ color: 0x787878 }))] + ] + + }; + + this.pickerGizmos = { + + X: [ + [new THREE.Mesh(new THREE.TorusBufferGeometry(1, 0.12, 4, 12, Math.PI), pickerMaterial), [0, 0, 0], [0, -Math.PI / 2, -Math.PI / 2]] + ], + + Y: [ + [new THREE.Mesh(new THREE.TorusBufferGeometry(1, 0.12, 4, 12, Math.PI), pickerMaterial), [0, 0, 0], [Math.PI / 2, 0, 0]] + ], + + Z: [ + [new THREE.Mesh(new THREE.TorusBufferGeometry(1, 0.12, 4, 12, Math.PI), pickerMaterial), [0, 0, 0], [0, 0, -Math.PI / 2]] + ], + + E: [ + [new THREE.Mesh(new THREE.TorusBufferGeometry(1.25, 0.12, 2, 24), pickerMaterial)] + ], + + XYZE: [ + [new THREE.Mesh(new THREE.TorusBufferGeometry(1, 0.12, 2, 24), pickerMaterial)] + ] + + }; + + this.pickerGizmos.XYZE[0][0].visible = false; // disable XYZE picker gizmo + + this.setActivePlane = function (axis) { + + if (axis === "E") this.activePlane = this.planes["XYZE"]; + + if (axis === "X") this.activePlane = this.planes["YZ"]; + + if (axis === "Y") this.activePlane = this.planes["XZ"]; + + if (axis === "Z") this.activePlane = this.planes["XY"]; + + }; + + this.update = function (rotation, eye2) { + + THREE.TransformGizmo.prototype.update.apply(this, arguments); + + var tempMatrix = new THREE.Matrix4(); + var worldRotation = new THREE.Euler(0, 0, 1); + var tempQuaternion = new THREE.Quaternion(); + var unitX = new THREE.Vector3(1, 0, 0); + var unitY = new THREE.Vector3(0, 1, 0); + var unitZ = new THREE.Vector3(0, 0, 1); + var quaternionX = new THREE.Quaternion(); + var quaternionY = new THREE.Quaternion(); + var quaternionZ = new THREE.Quaternion(); + var eye = eye2.clone(); + + worldRotation.copy(this.planes["XY"].rotation); + tempQuaternion.setFromEuler(worldRotation); + + tempMatrix.makeRotationFromQuaternion(tempQuaternion).getInverse(tempMatrix); + eye.applyMatrix4(tempMatrix); + + this.traverse(function (child) { + + tempQuaternion.setFromEuler(worldRotation); + + if (child.name === "X") { + + quaternionX.setFromAxisAngle(unitX, Math.atan2(-eye.y, eye.z)); + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionX); + child.quaternion.copy(tempQuaternion); + + } + + if (child.name === "Y") { + + quaternionY.setFromAxisAngle(unitY, Math.atan2(eye.x, eye.z)); + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionY); + child.quaternion.copy(tempQuaternion); + + } + + if (child.name === "Z") { + + quaternionZ.setFromAxisAngle(unitZ, Math.atan2(eye.y, eye.x)); + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionZ); + child.quaternion.copy(tempQuaternion); + + } + + }); + + }; + + this.init(); + + }; + + THREE.TransformGizmoRotate.prototype = Object.create(THREE.TransformGizmo.prototype); + THREE.TransformGizmoRotate.prototype.constructor = THREE.TransformGizmoRotate; + + THREE.TransformGizmoScale = function () { + + THREE.TransformGizmo.call(this); + + var arrowGeometry = new THREE.BoxBufferGeometry(0.125, 0.125, 0.125); + arrowGeometry.translate(0, 0.5, 0); + + var lineXGeometry = new THREE.BufferGeometry(); + lineXGeometry.addAttribute('position', new THREE.Float32BufferAttribute([0, 0, 0, 1, 0, 0], 3)); + + var lineYGeometry = new THREE.BufferGeometry(); + lineYGeometry.addAttribute('position', new THREE.Float32BufferAttribute([0, 0, 0, 0, 1, 0], 3)); + + var lineZGeometry = new THREE.BufferGeometry(); + lineZGeometry.addAttribute('position', new THREE.Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3)); + + this.handleGizmos = { + + X: [ + [new THREE.Mesh(arrowGeometry, new GizmoMaterial({ color: 0xff0000 })), [0.5, 0, 0], [0, 0, -Math.PI / 2]], + [new THREE.Line(lineXGeometry, new GizmoLineMaterial({ color: 0xff0000 }))] + ], + + Y: [ + [new THREE.Mesh(arrowGeometry, new GizmoMaterial({ color: 0x00ff00 })), [0, 0.5, 0]], + [new THREE.Line(lineYGeometry, new GizmoLineMaterial({ color: 0x00ff00 }))] + ], + + Z: [ + [new THREE.Mesh(arrowGeometry, new GizmoMaterial({ color: 0x0000ff })), [0, 0, 0.5], [Math.PI / 2, 0, 0]], + [new THREE.Line(lineZGeometry, new GizmoLineMaterial({ color: 0x0000ff }))] + ], + + XYZ: [ + [new THREE.Mesh(new THREE.BoxBufferGeometry(0.125, 0.125, 0.125), new GizmoMaterial({ color: 0xffffff, opacity: 0.25 }))] + ] + + }; + + this.pickerGizmos = { + + X: [ + [new THREE.Mesh(new THREE.CylinderBufferGeometry(0.2, 0, 1, 4, 1, false), pickerMaterial), [0.6, 0, 0], [0, 0, -Math.PI / 2]] + ], + + Y: [ + [new THREE.Mesh(new THREE.CylinderBufferGeometry(0.2, 0, 1, 4, 1, false), pickerMaterial), [0, 0.6, 0]] + ], + + Z: [ + [new THREE.Mesh(new THREE.CylinderBufferGeometry(0.2, 0, 1, 4, 1, false), pickerMaterial), [0, 0, 0.6], [Math.PI / 2, 0, 0]] + ], + + XYZ: [ + [new THREE.Mesh(new THREE.BoxBufferGeometry(0.4, 0.4, 0.4), pickerMaterial)] + ] + + }; + + this.setActivePlane = function (axis, eye) { + + var tempMatrix = new THREE.Matrix4(); + eye.applyMatrix4(tempMatrix.getInverse(tempMatrix.extractRotation(this.planes["XY"].matrixWorld))); + + if (axis === "X") { + + this.activePlane = this.planes["XY"]; + if (Math.abs(eye.y) > Math.abs(eye.z)) this.activePlane = this.planes["XZ"]; + + } + + if (axis === "Y") { + + this.activePlane = this.planes["XY"]; + if (Math.abs(eye.x) > Math.abs(eye.z)) this.activePlane = this.planes["YZ"]; + + } + + if (axis === "Z") { + + this.activePlane = this.planes["XZ"]; + if (Math.abs(eye.x) > Math.abs(eye.y)) this.activePlane = this.planes["YZ"]; + + } + + if (axis === "XYZ") this.activePlane = this.planes["XYZE"]; + + }; + + this.init(); + + }; + + THREE.TransformGizmoScale.prototype = Object.create(THREE.TransformGizmo.prototype); + THREE.TransformGizmoScale.prototype.constructor = THREE.TransformGizmoScale; + + THREE.TransformControls = function (camera, domElement) { + + // TODO: Make non-uniform scale and rotate play nice in hierarchies + // TODO: ADD RXYZ contol + + THREE.Object3D.call(this); + + domElement = (domElement !== undefined) ? domElement : document; + + this.object = undefined; + this.visible = false; + this.translationSnap = null; + this.rotationSnap = null; + this.space = "world"; + this.size = 1; + this.axis = null; + + var scope = this; + + var _mode = "translate"; + var _dragging = false; + var _gizmo = { + + "translate": new THREE.TransformGizmoTranslate(), + "rotate": new THREE.TransformGizmoRotate(), + "scale": new THREE.TransformGizmoScale() + }; + + for (var type in _gizmo) { + + var gizmoObj = _gizmo[type]; + + gizmoObj.visible = (type === _mode); + this.add(gizmoObj); + + } + + var changeEvent = { type: "change" }; + var mouseDownEvent = { type: "mouseDown" }; + var mouseUpEvent = { type: "mouseUp", mode: _mode }; + var objectChangeEvent = { type: "objectChange" }; + + var ray = new THREE.Raycaster(); + var pointerVector = new THREE.Vector2(); + + var point = new THREE.Vector3(); + var offset = new THREE.Vector3(); + + var rotation = new THREE.Vector3(); + var offsetRotation = new THREE.Vector3(); + var scale = 1; + + var lookAtMatrix = new THREE.Matrix4(); + var eye = new THREE.Vector3(); + + var tempMatrix = new THREE.Matrix4(); + var tempVector = new THREE.Vector3(); + var tempQuaternion = new THREE.Quaternion(); + var unitX = new THREE.Vector3(1, 0, 0); + var unitY = new THREE.Vector3(0, 1, 0); + var unitZ = new THREE.Vector3(0, 0, 1); + + var quaternionXYZ = new THREE.Quaternion(); + var quaternionX = new THREE.Quaternion(); + var quaternionY = new THREE.Quaternion(); + var quaternionZ = new THREE.Quaternion(); + var quaternionE = new THREE.Quaternion(); + + var oldPosition = new THREE.Vector3(); + var oldScale = new THREE.Vector3(); + var oldRotationMatrix = new THREE.Matrix4(); + + var parentRotationMatrix = new THREE.Matrix4(); + var parentScale = new THREE.Vector3(); + + var worldPosition = new THREE.Vector3(); + var worldRotation = new THREE.Euler(); + var worldRotationMatrix = new THREE.Matrix4(); + var camPosition = new THREE.Vector3(); + var camRotation = new THREE.Euler(); + + domElement.addEventListener("mousedown", onPointerDown, false); + domElement.addEventListener("touchstart", onPointerDown, false); + + domElement.addEventListener("mousemove", onPointerHover, false); + domElement.addEventListener("touchmove", onPointerHover, false); + + domElement.addEventListener("mousemove", onPointerMove, false); + domElement.addEventListener("touchmove", onPointerMove, false); + + domElement.addEventListener("mouseup", onPointerUp, false); + domElement.addEventListener("mouseout", onPointerUp, false); + domElement.addEventListener("touchend", onPointerUp, false); + domElement.addEventListener("touchcancel", onPointerUp, false); + domElement.addEventListener("touchleave", onPointerUp, false); + + this.dispose = function () { + + domElement.removeEventListener("mousedown", onPointerDown); + domElement.removeEventListener("touchstart", onPointerDown); + + domElement.removeEventListener("mousemove", onPointerHover); + domElement.removeEventListener("touchmove", onPointerHover); + + domElement.removeEventListener("mousemove", onPointerMove); + domElement.removeEventListener("touchmove", onPointerMove); + + domElement.removeEventListener("mouseup", onPointerUp); + domElement.removeEventListener("mouseout", onPointerUp); + domElement.removeEventListener("touchend", onPointerUp); + domElement.removeEventListener("touchcancel", onPointerUp); + domElement.removeEventListener("touchleave", onPointerUp); + + }; + + this.attach = function (object) { + + this.object = object; + this.visible = true; + this.update(); + + }; + + this.detach = function () { + + this.object = undefined; + this.visible = false; + this.axis = null; + + }; + + this.getMode = function () { + + return _mode; + + }; + + this.setMode = function (mode) { + + _mode = mode ? mode : _mode; + + if (_mode === "scale") scope.space = "local"; + + for (var type in _gizmo) _gizmo[type].visible = (type === _mode); + + this.update(); + scope.dispatchEvent(changeEvent); + + }; + + this.setTranslationSnap = function (translationSnap) { + + scope.translationSnap = translationSnap; + + }; + + this.setRotationSnap = function (rotationSnap) { + + scope.rotationSnap = rotationSnap; + + }; + + this.setSize = function (size) { + + scope.size = size; + this.update(); + scope.dispatchEvent(changeEvent); + + }; + + this.setSpace = function (space) { + + scope.space = space; + this.update(); + scope.dispatchEvent(changeEvent); + + }; + + this.update = function () { + + if (scope.object === undefined) return; + + scope.object.updateMatrixWorld(); + worldPosition.setFromMatrixPosition(scope.object.matrixWorld); + worldRotation.setFromRotationMatrix(tempMatrix.extractRotation(scope.object.matrixWorld)); + + camera.updateMatrixWorld(); + camPosition.setFromMatrixPosition(camera.matrixWorld); + camRotation.setFromRotationMatrix(tempMatrix.extractRotation(camera.matrixWorld)); + + scale = worldPosition.distanceTo(camPosition) / 6 * scope.size; + this.position.copy(worldPosition); + this.scale.set(scale, scale, scale); + + if (camera instanceof THREE.PerspectiveCamera) { + + eye.copy(camPosition).sub(worldPosition).normalize(); + + } else if (camera instanceof THREE.OrthographicCamera) { + + eye.copy(camPosition).normalize(); + + } + + if (scope.space === "local") { + + _gizmo[_mode].update(worldRotation, eye); + + } else if (scope.space === "world") { + + _gizmo[_mode].update(new THREE.Euler(), eye); + + } + + _gizmo[_mode].highlight(scope.axis); + + }; + + function onPointerHover(event) { + + if (scope.object === undefined || _dragging === true || (event.button !== undefined && event.button !== 0)) return; + + var pointer = event.changedTouches ? event.changedTouches[0] : event; + + var intersect = intersectObjects(pointer, _gizmo[_mode].pickers.children); + + var axis = null; + + if (intersect) { + + axis = intersect.object.name; + + event.preventDefault(); + + } + + if (scope.axis !== axis) { + + scope.axis = axis; + scope.update(); + scope.dispatchEvent(changeEvent); + + } + + } + + function onPointerDown(event) { + + if (scope.object === undefined || _dragging === true || (event.button !== undefined && event.button !== 0)) return; + + var pointer = event.changedTouches ? event.changedTouches[0] : event; + + if (pointer.button === 0 || pointer.button === undefined) { + + var intersect = intersectObjects(pointer, _gizmo[_mode].pickers.children); + + if (intersect) { + + event.preventDefault(); + event.stopPropagation(); + + scope.axis = intersect.object.name; + + scope.dispatchEvent(mouseDownEvent); + + scope.update(); + + eye.copy(camPosition).sub(worldPosition).normalize(); + + _gizmo[_mode].setActivePlane(scope.axis, eye); + + var planeIntersect = intersectObjects(pointer, [_gizmo[_mode].activePlane]); + + if (planeIntersect) { + + oldPosition.copy(scope.object.position); + oldScale.copy(scope.object.scale); + + oldRotationMatrix.extractRotation(scope.object.matrix); + worldRotationMatrix.extractRotation(scope.object.matrixWorld); + + parentRotationMatrix.extractRotation(scope.object.parent.matrixWorld); + parentScale.setFromMatrixScale(tempMatrix.getInverse(scope.object.parent.matrixWorld)); + + offset.copy(planeIntersect.point); + + } + + } + + } + + _dragging = true; + + } + + function onPointerMove(event) { + + if (scope.object === undefined || scope.axis === null || _dragging === false || (event.button !== undefined && event.button !== 0)) return; + + var pointer = event.changedTouches ? event.changedTouches[0] : event; + + var planeIntersect = intersectObjects(pointer, [_gizmo[_mode].activePlane]); + + if (planeIntersect === false) return; + + event.preventDefault(); + event.stopPropagation(); + + point.copy(planeIntersect.point); + + if (_mode === "translate") { + + point.sub(offset); + point.multiply(parentScale); + + if (scope.space === "local") { + + point.applyMatrix4(tempMatrix.getInverse(worldRotationMatrix)); + + if (scope.axis.search("X") === -1) point.x = 0; + if (scope.axis.search("Y") === -1) point.y = 0; + if (scope.axis.search("Z") === -1) point.z = 0; + + point.applyMatrix4(oldRotationMatrix); + + scope.object.position.copy(oldPosition); + scope.object.position.add(point); + + } + + if (scope.space === "world" || scope.axis.search("XYZ") !== -1) { + + if (scope.axis.search("X") === -1) point.x = 0; + if (scope.axis.search("Y") === -1) point.y = 0; + if (scope.axis.search("Z") === -1) point.z = 0; + + point.applyMatrix4(tempMatrix.getInverse(parentRotationMatrix)); + + scope.object.position.copy(oldPosition); + scope.object.position.add(point); + + } + + if (scope.translationSnap !== null) { + + if (scope.space === "local") { + + scope.object.position.applyMatrix4(tempMatrix.getInverse(worldRotationMatrix)); + + } + + if (scope.axis.search("X") !== -1) scope.object.position.x = Math.round(scope.object.position.x / scope.translationSnap) * scope.translationSnap; + if (scope.axis.search("Y") !== -1) scope.object.position.y = Math.round(scope.object.position.y / scope.translationSnap) * scope.translationSnap; + if (scope.axis.search("Z") !== -1) scope.object.position.z = Math.round(scope.object.position.z / scope.translationSnap) * scope.translationSnap; + + if (scope.space === "local") { + + scope.object.position.applyMatrix4(worldRotationMatrix); + + } + + } + + } else if (_mode === "scale") { + + point.sub(offset); + point.multiply(parentScale); + + if (scope.space === "local") { + + if (scope.axis === "XYZ") { + + scale = 1 + ((point.y) / Math.max(oldScale.x, oldScale.y, oldScale.z)); + + scope.object.scale.x = oldScale.x * scale; + scope.object.scale.y = oldScale.y * scale; + scope.object.scale.z = oldScale.z * scale; + + } else { + + point.applyMatrix4(tempMatrix.getInverse(worldRotationMatrix)); + + if (scope.axis === "X") scope.object.scale.x = oldScale.x * (1 + point.x / oldScale.x); + if (scope.axis === "Y") scope.object.scale.y = oldScale.y * (1 + point.y / oldScale.y); + if (scope.axis === "Z") scope.object.scale.z = oldScale.z * (1 + point.z / oldScale.z); + + } + + } + + } else if (_mode === "rotate") { + + point.sub(worldPosition); + point.multiply(parentScale); + tempVector.copy(offset).sub(worldPosition); + tempVector.multiply(parentScale); + + if (scope.axis === "E") { + + point.applyMatrix4(tempMatrix.getInverse(lookAtMatrix)); + tempVector.applyMatrix4(tempMatrix.getInverse(lookAtMatrix)); + + rotation.set(Math.atan2(point.z, point.y), Math.atan2(point.x, point.z), Math.atan2(point.y, point.x)); + offsetRotation.set(Math.atan2(tempVector.z, tempVector.y), Math.atan2(tempVector.x, tempVector.z), Math.atan2(tempVector.y, tempVector.x)); + + tempQuaternion.setFromRotationMatrix(tempMatrix.getInverse(parentRotationMatrix)); + + quaternionE.setFromAxisAngle(eye, rotation.z - offsetRotation.z); + quaternionXYZ.setFromRotationMatrix(worldRotationMatrix); + + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionE); + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionXYZ); + + scope.object.quaternion.copy(tempQuaternion); + + } else if (scope.axis === "XYZE") { + + quaternionE.setFromEuler(point.clone().cross(tempVector).normalize()); // rotation axis + + tempQuaternion.setFromRotationMatrix(tempMatrix.getInverse(parentRotationMatrix)); + quaternionX.setFromAxisAngle(quaternionE, -point.clone().angleTo(tempVector)); + quaternionXYZ.setFromRotationMatrix(worldRotationMatrix); + + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionX); + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionXYZ); + + scope.object.quaternion.copy(tempQuaternion); + + } else if (scope.space === "local") { + + point.applyMatrix4(tempMatrix.getInverse(worldRotationMatrix)); + + tempVector.applyMatrix4(tempMatrix.getInverse(worldRotationMatrix)); + + rotation.set(Math.atan2(point.z, point.y), Math.atan2(point.x, point.z), Math.atan2(point.y, point.x)); + offsetRotation.set(Math.atan2(tempVector.z, tempVector.y), Math.atan2(tempVector.x, tempVector.z), Math.atan2(tempVector.y, tempVector.x)); + + quaternionXYZ.setFromRotationMatrix(oldRotationMatrix); + + if (scope.rotationSnap !== null) { + + quaternionX.setFromAxisAngle(unitX, Math.round((rotation.x - offsetRotation.x) / scope.rotationSnap) * scope.rotationSnap); + quaternionY.setFromAxisAngle(unitY, Math.round((rotation.y - offsetRotation.y) / scope.rotationSnap) * scope.rotationSnap); + quaternionZ.setFromAxisAngle(unitZ, Math.round((rotation.z - offsetRotation.z) / scope.rotationSnap) * scope.rotationSnap); + + } else { + + quaternionX.setFromAxisAngle(unitX, rotation.x - offsetRotation.x); + quaternionY.setFromAxisAngle(unitY, rotation.y - offsetRotation.y); + quaternionZ.setFromAxisAngle(unitZ, rotation.z - offsetRotation.z); + + } + + if (scope.axis === "X") quaternionXYZ.multiplyQuaternions(quaternionXYZ, quaternionX); + if (scope.axis === "Y") quaternionXYZ.multiplyQuaternions(quaternionXYZ, quaternionY); + if (scope.axis === "Z") quaternionXYZ.multiplyQuaternions(quaternionXYZ, quaternionZ); + + scope.object.quaternion.copy(quaternionXYZ); + + } else if (scope.space === "world") { + + rotation.set(Math.atan2(point.z, point.y), Math.atan2(point.x, point.z), Math.atan2(point.y, point.x)); + offsetRotation.set(Math.atan2(tempVector.z, tempVector.y), Math.atan2(tempVector.x, tempVector.z), Math.atan2(tempVector.y, tempVector.x)); + + tempQuaternion.setFromRotationMatrix(tempMatrix.getInverse(parentRotationMatrix)); + + if (scope.rotationSnap !== null) { + + quaternionX.setFromAxisAngle(unitX, Math.round((rotation.x - offsetRotation.x) / scope.rotationSnap) * scope.rotationSnap); + quaternionY.setFromAxisAngle(unitY, Math.round((rotation.y - offsetRotation.y) / scope.rotationSnap) * scope.rotationSnap); + quaternionZ.setFromAxisAngle(unitZ, Math.round((rotation.z - offsetRotation.z) / scope.rotationSnap) * scope.rotationSnap); + + } else { + + quaternionX.setFromAxisAngle(unitX, rotation.x - offsetRotation.x); + quaternionY.setFromAxisAngle(unitY, rotation.y - offsetRotation.y); + quaternionZ.setFromAxisAngle(unitZ, rotation.z - offsetRotation.z); + + } + + quaternionXYZ.setFromRotationMatrix(worldRotationMatrix); + + if (scope.axis === "X") tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionX); + if (scope.axis === "Y") tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionY); + if (scope.axis === "Z") tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionZ); + + tempQuaternion.multiplyQuaternions(tempQuaternion, quaternionXYZ); + + scope.object.quaternion.copy(tempQuaternion); + + } + + } + + scope.update(); + scope.dispatchEvent(changeEvent); + scope.dispatchEvent(objectChangeEvent); + + } + + function onPointerUp(event) { + + event.preventDefault(); // Prevent MouseEvent on mobile + + if (event.button !== undefined && event.button !== 0) return; + + if (_dragging && (scope.axis !== null)) { + + mouseUpEvent.mode = _mode; + scope.dispatchEvent(mouseUpEvent); + + } + + _dragging = false; + + if ('TouchEvent' in window && event instanceof TouchEvent) { + + // Force "rollover" + + scope.axis = null; + scope.update(); + scope.dispatchEvent(changeEvent); + + } else { + + onPointerHover(event); + + } + + } + + function intersectObjects(pointer, objects) { + + var rect = domElement.getBoundingClientRect(); + var x = (pointer.clientX - rect.left) / rect.width; + var y = (pointer.clientY - rect.top) / rect.height; + + pointerVector.set((x * 2) - 1, -(y * 2) + 1); + ray.setFromCamera(pointerVector, camera); + + var intersections = ray.intersectObjects(objects, true); + return intersections[0] ? intersections[0] : false; + + } + + }; + + THREE.TransformControls.prototype = Object.create(THREE.Object3D.prototype); + THREE.TransformControls.prototype.constructor = THREE.TransformControls; + +}()); \ No newline at end of file diff --git a/public/static/modelView/js/effects/CopyShader.js b/public/static/modelView/js/effects/CopyShader.js new file mode 100644 index 0000000..c5db451 --- /dev/null +++ b/public/static/modelView/js/effects/CopyShader.js @@ -0,0 +1,46 @@ +锘�/** + * @author alteredq / http://alteredqualia.com/ + * + * Full-screen textured quad shader + */ + +THREE.CopyShader = { + + uniforms: { + + "tDiffuse": { value: null }, + "opacity": { value: 1.0 } + + }, + + vertexShader: [ + + "varying vec2 vUv;", + + "void main() {", + + "vUv = uv;", + "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + "}" + + ].join("\n"), + + fragmentShader: [ + + "uniform float opacity;", + + "uniform sampler2D tDiffuse;", + + "varying vec2 vUv;", + + "void main() {", + + "vec4 texel = texture2D( tDiffuse, vUv );", + "gl_FragColor = opacity * texel;", + + "}" + + ].join("\n") + +}; \ No newline at end of file diff --git a/public/static/modelView/js/effects/EffectComposer.js b/public/static/modelView/js/effects/EffectComposer.js new file mode 100644 index 0000000..024a164 --- /dev/null +++ b/public/static/modelView/js/effects/EffectComposer.js @@ -0,0 +1,189 @@ +锘�/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.EffectComposer = function (renderer, renderTarget) { + + this.renderer = renderer; + + if (renderTarget === undefined) { + + var parameters = { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBAFormat, + stencilBuffer: false + }; + + var size = renderer.getDrawingBufferSize(); + renderTarget = new THREE.WebGLRenderTarget(size.width, size.height, parameters); + renderTarget.texture.name = 'EffectComposer.rt1'; + + } + + this.renderTarget1 = renderTarget; + this.renderTarget2 = renderTarget.clone(); + this.renderTarget2.texture.name = 'EffectComposer.rt2'; + + this.writeBuffer = this.renderTarget1; + this.readBuffer = this.renderTarget2; + + this.passes = []; + + // dependencies + + if (THREE.CopyShader === undefined) { + + console.error('THREE.EffectComposer relies on THREE.CopyShader'); + + } + + if (THREE.ShaderPass === undefined) { + + console.error('THREE.EffectComposer relies on THREE.ShaderPass'); + + } + + this.copyPass = new THREE.ShaderPass(THREE.CopyShader); + +}; + +Object.assign(THREE.EffectComposer.prototype, { + + swapBuffers: function () { + + var tmp = this.readBuffer; + this.readBuffer = this.writeBuffer; + this.writeBuffer = tmp; + + }, + + addPass: function (pass) { + + this.passes.push(pass); + + var size = this.renderer.getDrawingBufferSize(); + pass.setSize(size.width, size.height); + + }, + + insertPass: function (pass, index) { + + this.passes.splice(index, 0, pass); + + }, + + render: function (delta) { + + var maskActive = false; + + var pass, i, il = this.passes.length; + + for (i = 0; i < il; i++) { + + pass = this.passes[i]; + + if (pass.enabled === false) continue; + + pass.render(this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive); + + if (pass.needsSwap) { + + if (maskActive) { + + var context = this.renderer.context; + + context.stencilFunc(context.NOTEQUAL, 1, 0xffffffff); + + this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, delta); + + context.stencilFunc(context.EQUAL, 1, 0xffffffff); + + } + + this.swapBuffers(); + + } + + if (THREE.MaskPass !== undefined) { + + if (pass instanceof THREE.MaskPass) { + + maskActive = true; + + } else if (pass instanceof THREE.ClearMaskPass) { + + maskActive = false; + + } + + } + + } + + }, + + reset: function (renderTarget) { + + if (renderTarget === undefined) { + + var size = this.renderer.getDrawingBufferSize(); + + renderTarget = this.renderTarget1.clone(); + renderTarget.setSize(size.width, size.height); + + } + + this.renderTarget1.dispose(); + this.renderTarget2.dispose(); + this.renderTarget1 = renderTarget; + this.renderTarget2 = renderTarget.clone(); + + this.writeBuffer = this.renderTarget1; + this.readBuffer = this.renderTarget2; + + }, + + setSize: function (width, height) { + + this.renderTarget1.setSize(width, height); + this.renderTarget2.setSize(width, height); + + for (var i = 0; i < this.passes.length; i++) { + + this.passes[i].setSize(width, height); + + } + + } + +}); + + +THREE.Pass = function () { + + // if set to true, the pass is processed by the composer + this.enabled = true; + + // if set to true, the pass indicates to swap read and write buffer after rendering + this.needsSwap = true; + + // if set to true, the pass clears its buffer before rendering + this.clear = false; + + // if set to true, the result of the pass is rendered to screen + this.renderToScreen = false; + +}; + +Object.assign(THREE.Pass.prototype, { + + setSize: function (width, height) { }, + + render: function (renderer, writeBuffer, readBuffer, delta, maskActive) { + + console.error('THREE.Pass: .render() must be implemented in derived pass.'); + + } + +}); \ No newline at end of file diff --git a/public/static/modelView/js/effects/FXAAShader.js b/public/static/modelView/js/effects/FXAAShader.js new file mode 100644 index 0000000..93e3bbc --- /dev/null +++ b/public/static/modelView/js/effects/FXAAShader.js @@ -0,0 +1,1115 @@ +锘�/** + * @author alteredq / http://alteredqualia.com/ + * @author davidedc / http://www.sketchpatch.net/ + * + * NVIDIA FXAA by Timothy Lottes + * http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html + * - WebGL port by @supereggbert + * http://www.glge.org/demos/fxaa/ + */ + +THREE.FXAAShader = { + + uniforms: { + + "tDiffuse": { value: null }, + "resolution": { value: new THREE.Vector2(1 / 1024, 1 / 512) } + + }, + + vertexShader: [ + + "varying vec2 vUv;", + + "void main() {", + + "vUv = uv;", + "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + "}" + + ].join("\n"), + + fragmentShader: [ + "precision highp float;", + "", + "uniform sampler2D tDiffuse;", + "", + "uniform vec2 resolution;", + "", + "varying vec2 vUv;", + "", + "// FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com)", + "", + "//----------------------------------------------------------------------------------", + "// File: es3-kepler\FXAA\assets\shaders/FXAA_DefaultES.frag", + "// SDK Version: v3.00", + "// Email: gameworks@nvidia.com", + "// Site: http://developer.nvidia.com/", + "//", + "// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.", + "//", + "// Redistribution and use in source and binary forms, with or without", + "// modification, are permitted provided that the following conditions", + "// are met:", + "// * Redistributions of source code must retain the above copyright", + "// notice, this list of conditions and the following disclaimer.", + "// * Redistributions in binary form must reproduce the above copyright", + "// notice, this list of conditions and the following disclaimer in the", + "// documentation and/or other materials provided with the distribution.", + "// * Neither the name of NVIDIA CORPORATION nor the names of its", + "// contributors may be used to endorse or promote products derived", + "// from this software without specific prior written permission.", + "//", + "// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY", + "// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE", + "// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", + "// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR", + "// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", + "// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,", + "// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR", + "// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY", + "// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT", + "// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE", + "// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", + "//", + "//----------------------------------------------------------------------------------", + "", + "#define FXAA_PC 1", + "#define FXAA_GLSL_100 1", + "#define FXAA_QUALITY_PRESET 12", + "", + "#define FXAA_GREEN_AS_LUMA 1", + "", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_PC_CONSOLE", + " //", + " // The console algorithm for PC is included", + " // for developers targeting really low spec machines.", + " // Likely better to just run FXAA_PC, and use a really low preset.", + " //", + " #define FXAA_PC_CONSOLE 0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_GLSL_120", + " #define FXAA_GLSL_120 0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_GLSL_130", + " #define FXAA_GLSL_130 0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_HLSL_3", + " #define FXAA_HLSL_3 0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_HLSL_4", + " #define FXAA_HLSL_4 0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_HLSL_5", + " #define FXAA_HLSL_5 0", + "#endif", + "/*==========================================================================*/", + "#ifndef FXAA_GREEN_AS_LUMA", + " //", + " // For those using non-linear color,", + " // and either not able to get luma in alpha, or not wanting to,", + " // this enables FXAA to run using green as a proxy for luma.", + " // So with this enabled, no need to pack luma in alpha.", + " //", + " // This will turn off AA on anything which lacks some amount of green.", + " // Pure red and blue or combination of only R and B, will get no AA.", + " //", + " // Might want to lower the settings for both,", + " // fxaaConsoleEdgeThresholdMin", + " // fxaaQualityEdgeThresholdMin", + " // In order to insure AA does not get turned off on colors", + " // which contain a minor amount of green.", + " //", + " // 1 = On.", + " // 0 = Off.", + " //", + " #define FXAA_GREEN_AS_LUMA 0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_EARLY_EXIT", + " //", + " // Controls algorithm's early exit path.", + " // On PS3 turning this ON adds 2 cycles to the shader.", + " // On 360 turning this OFF adds 10ths of a millisecond to the shader.", + " // Turning this off on console will result in a more blurry image.", + " // So this defaults to on.", + " //", + " // 1 = On.", + " // 0 = Off.", + " //", + " #define FXAA_EARLY_EXIT 1", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_DISCARD", + " //", + " // Only valid for PC OpenGL currently.", + " // Probably will not work when FXAA_GREEN_AS_LUMA = 1.", + " //", + " // 1 = Use discard on pixels which don't need AA.", + " // For APIs which enable concurrent TEX+ROP from same surface.", + " // 0 = Return unchanged color on pixels which don't need AA.", + " //", + " #define FXAA_DISCARD 0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_FAST_PIXEL_OFFSET", + " //", + " // Used for GLSL 120 only.", + " //", + " // 1 = GL API supports fast pixel offsets", + " // 0 = do not use fast pixel offsets", + " //", + " #ifdef GL_EXT_gpu_shader4", + " #define FXAA_FAST_PIXEL_OFFSET 1", + " #endif", + " #ifdef GL_NV_gpu_shader5", + " #define FXAA_FAST_PIXEL_OFFSET 1", + " #endif", + " #ifdef GL_ARB_gpu_shader5", + " #define FXAA_FAST_PIXEL_OFFSET 1", + " #endif", + " #ifndef FXAA_FAST_PIXEL_OFFSET", + " #define FXAA_FAST_PIXEL_OFFSET 0", + " #endif", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#ifndef FXAA_GATHER4_ALPHA", + " //", + " // 1 = API supports gather4 on alpha channel.", + " // 0 = API does not support gather4 on alpha channel.", + " //", + " #if (FXAA_HLSL_5 == 1)", + " #define FXAA_GATHER4_ALPHA 1", + " #endif", + " #ifdef GL_ARB_gpu_shader5", + " #define FXAA_GATHER4_ALPHA 1", + " #endif", + " #ifdef GL_NV_gpu_shader5", + " #define FXAA_GATHER4_ALPHA 1", + " #endif", + " #ifndef FXAA_GATHER4_ALPHA", + " #define FXAA_GATHER4_ALPHA 0", + " #endif", + "#endif", + "", + "", + "/*============================================================================", + " FXAA QUALITY - TUNING KNOBS", + "------------------------------------------------------------------------------", + "NOTE the other tuning knobs are now in the shader function inputs!", + "============================================================================*/", + "#ifndef FXAA_QUALITY_PRESET", + " //", + " // Choose the quality preset.", + " // This needs to be compiled into the shader as it effects code.", + " // Best option to include multiple presets is to", + " // in each shader define the preset, then include this file.", + " //", + " // OPTIONS", + " // -----------------------------------------------------------------------", + " // 10 to 15 - default medium dither (10=fastest, 15=highest quality)", + " // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)", + " // 39 - no dither, very expensive", + " //", + " // NOTES", + " // -----------------------------------------------------------------------", + " // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)", + " // 13 = about same speed as FXAA 3.9 and better than 12", + " // 23 = closest to FXAA 3.9 visually and performance wise", + " // _ = the lowest digit is directly related to performance", + " // _ = the highest digit is directly related to style", + " //", + " #define FXAA_QUALITY_PRESET 12", + "#endif", + "", + "", + "/*============================================================================", + "", + " FXAA QUALITY - PRESETS", + "", + "============================================================================*/", + "", + "/*============================================================================", + " FXAA QUALITY - MEDIUM DITHER PRESETS", + "============================================================================*/", + "#if (FXAA_QUALITY_PRESET == 10)", + " #define FXAA_QUALITY_PS 3", + " #define FXAA_QUALITY_P0 1.5", + " #define FXAA_QUALITY_P1 3.0", + " #define FXAA_QUALITY_P2 12.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 11)", + " #define FXAA_QUALITY_PS 4", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 3.0", + " #define FXAA_QUALITY_P3 12.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 12)", + " #define FXAA_QUALITY_PS 5", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 4.0", + " #define FXAA_QUALITY_P4 12.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 13)", + " #define FXAA_QUALITY_PS 6", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 4.0", + " #define FXAA_QUALITY_P5 12.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 14)", + " #define FXAA_QUALITY_PS 7", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 4.0", + " #define FXAA_QUALITY_P6 12.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 15)", + " #define FXAA_QUALITY_PS 8", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 2.0", + " #define FXAA_QUALITY_P6 4.0", + " #define FXAA_QUALITY_P7 12.0", + "#endif", + "", + "/*============================================================================", + " FXAA QUALITY - LOW DITHER PRESETS", + "============================================================================*/", + "#if (FXAA_QUALITY_PRESET == 20)", + " #define FXAA_QUALITY_PS 3", + " #define FXAA_QUALITY_P0 1.5", + " #define FXAA_QUALITY_P1 2.0", + " #define FXAA_QUALITY_P2 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 21)", + " #define FXAA_QUALITY_PS 4", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 22)", + " #define FXAA_QUALITY_PS 5", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 23)", + " #define FXAA_QUALITY_PS 6", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 24)", + " #define FXAA_QUALITY_PS 7", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 3.0", + " #define FXAA_QUALITY_P6 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 25)", + " #define FXAA_QUALITY_PS 8", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 2.0", + " #define FXAA_QUALITY_P6 4.0", + " #define FXAA_QUALITY_P7 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 26)", + " #define FXAA_QUALITY_PS 9", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 2.0", + " #define FXAA_QUALITY_P6 2.0", + " #define FXAA_QUALITY_P7 4.0", + " #define FXAA_QUALITY_P8 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 27)", + " #define FXAA_QUALITY_PS 10", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 2.0", + " #define FXAA_QUALITY_P6 2.0", + " #define FXAA_QUALITY_P7 2.0", + " #define FXAA_QUALITY_P8 4.0", + " #define FXAA_QUALITY_P9 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 28)", + " #define FXAA_QUALITY_PS 11", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 2.0", + " #define FXAA_QUALITY_P6 2.0", + " #define FXAA_QUALITY_P7 2.0", + " #define FXAA_QUALITY_P8 2.0", + " #define FXAA_QUALITY_P9 4.0", + " #define FXAA_QUALITY_P10 8.0", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_QUALITY_PRESET == 29)", + " #define FXAA_QUALITY_PS 12", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.5", + " #define FXAA_QUALITY_P2 2.0", + " #define FXAA_QUALITY_P3 2.0", + " #define FXAA_QUALITY_P4 2.0", + " #define FXAA_QUALITY_P5 2.0", + " #define FXAA_QUALITY_P6 2.0", + " #define FXAA_QUALITY_P7 2.0", + " #define FXAA_QUALITY_P8 2.0", + " #define FXAA_QUALITY_P9 2.0", + " #define FXAA_QUALITY_P10 4.0", + " #define FXAA_QUALITY_P11 8.0", + "#endif", + "", + "/*============================================================================", + " FXAA QUALITY - EXTREME QUALITY", + "============================================================================*/", + "#if (FXAA_QUALITY_PRESET == 39)", + " #define FXAA_QUALITY_PS 12", + " #define FXAA_QUALITY_P0 1.0", + " #define FXAA_QUALITY_P1 1.0", + " #define FXAA_QUALITY_P2 1.0", + " #define FXAA_QUALITY_P3 1.0", + " #define FXAA_QUALITY_P4 1.0", + " #define FXAA_QUALITY_P5 1.5", + " #define FXAA_QUALITY_P6 2.0", + " #define FXAA_QUALITY_P7 2.0", + " #define FXAA_QUALITY_P8 2.0", + " #define FXAA_QUALITY_P9 2.0", + " #define FXAA_QUALITY_P10 4.0", + " #define FXAA_QUALITY_P11 8.0", + "#endif", + "", + "", + "", + "/*============================================================================", + "", + " API PORTING", + "", + "============================================================================*/", + "#if (FXAA_GLSL_100 == 1) || (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)", + " #define FxaaBool bool", + " #define FxaaDiscard discard", + " #define FxaaFloat float", + " #define FxaaFloat2 vec2", + " #define FxaaFloat3 vec3", + " #define FxaaFloat4 vec4", + " #define FxaaHalf float", + " #define FxaaHalf2 vec2", + " #define FxaaHalf3 vec3", + " #define FxaaHalf4 vec4", + " #define FxaaInt2 ivec2", + " #define FxaaSat(x) clamp(x, 0.0, 1.0)", + " #define FxaaTex sampler2D", + "#else", + " #define FxaaBool bool", + " #define FxaaDiscard clip(-1)", + " #define FxaaFloat float", + " #define FxaaFloat2 float2", + " #define FxaaFloat3 float3", + " #define FxaaFloat4 float4", + " #define FxaaHalf half", + " #define FxaaHalf2 half2", + " #define FxaaHalf3 half3", + " #define FxaaHalf4 half4", + " #define FxaaSat(x) saturate(x)", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_GLSL_100 == 1)", + " #define FxaaTexTop(t, p) texture2D(t, p, 0.0)", + " #define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), 0.0)", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_GLSL_120 == 1)", + " // Requires,", + " // #version 120", + " // And at least,", + " // #extension GL_EXT_gpu_shader4 : enable", + " // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)", + " #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)", + " #if (FXAA_FAST_PIXEL_OFFSET == 1)", + " #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)", + " #else", + " #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)", + " #endif", + " #if (FXAA_GATHER4_ALPHA == 1)", + " // use #extension GL_ARB_gpu_shader5 : enable", + " #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)", + " #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)", + " #define FxaaTexGreen4(t, p) textureGather(t, p, 1)", + " #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)", + " #endif", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_GLSL_130 == 1)", + " // Requires \"#version 130\" or better", + " #define FxaaTexTop(t, p) textureLod(t, p, 0.0)", + " #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)", + " #if (FXAA_GATHER4_ALPHA == 1)", + " // use #extension GL_ARB_gpu_shader5 : enable", + " #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)", + " #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)", + " #define FxaaTexGreen4(t, p) textureGather(t, p, 1)", + " #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)", + " #endif", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_HLSL_3 == 1)", + " #define FxaaInt2 float2", + " #define FxaaTex sampler2D", + " #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))", + " #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_HLSL_4 == 1)", + " #define FxaaInt2 int2", + " struct FxaaTex { SamplerState smpl; Texture2D tex; };", + " #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)", + " #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)", + "#endif", + "/*--------------------------------------------------------------------------*/", + "#if (FXAA_HLSL_5 == 1)", + " #define FxaaInt2 int2", + " struct FxaaTex { SamplerState smpl; Texture2D tex; };", + " #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)", + " #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)", + " #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p)", + " #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o)", + " #define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p)", + " #define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o)", + "#endif", + "", + "", + "/*============================================================================", + " GREEN AS LUMA OPTION SUPPORT FUNCTION", + "============================================================================*/", + "#if (FXAA_GREEN_AS_LUMA == 0)", + " FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }", + "#else", + " FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }", + "#endif", + "", + "", + "", + "", + "/*============================================================================", + "", + " FXAA3 QUALITY - PC", + "", + "============================================================================*/", + "#if (FXAA_PC == 1)", + "/*--------------------------------------------------------------------------*/", + "FxaaFloat4 FxaaPixelShader(", + " //", + " // Use noperspective interpolation here (turn off perspective interpolation).", + " // {xy} = center of pixel", + " FxaaFloat2 pos,", + " //", + " // Used only for FXAA Console, and not used on the 360 version.", + " // Use noperspective interpolation here (turn off perspective interpolation).", + " // {xy_} = upper left of pixel", + " // {_zw} = lower right of pixel", + " FxaaFloat4 fxaaConsolePosPos,", + " //", + " // Input color texture.", + " // {rgb_} = color in linear or perceptual color space", + " // if (FXAA_GREEN_AS_LUMA == 0)", + " // {__a} = luma in perceptual color space (not linear)", + " FxaaTex tex,", + " //", + " // Only used on the optimized 360 version of FXAA Console.", + " // For everything but 360, just use the same input here as for \"tex\".", + " // For 360, same texture, just alias with a 2nd sampler.", + " // This sampler needs to have an exponent bias of -1.", + " FxaaTex fxaaConsole360TexExpBiasNegOne,", + " //", + " // Only used on the optimized 360 version of FXAA Console.", + " // For everything but 360, just use the same input here as for \"tex\".", + " // For 360, same texture, just alias with a 3nd sampler.", + " // This sampler needs to have an exponent bias of -2.", + " FxaaTex fxaaConsole360TexExpBiasNegTwo,", + " //", + " // Only used on FXAA Quality.", + " // This must be from a constant/uniform.", + " // {x_} = 1.0/screenWidthInPixels", + " // {_y} = 1.0/screenHeightInPixels", + " FxaaFloat2 fxaaQualityRcpFrame,", + " //", + " // Only used on FXAA Console.", + " // This must be from a constant/uniform.", + " // This effects sub-pixel AA quality and inversely sharpness.", + " // Where N ranges between,", + " // N = 0.50 (default)", + " // N = 0.33 (sharper)", + " // {x__} = -N/screenWidthInPixels", + " // {_y_} = -N/screenHeightInPixels", + " // {_z_} = N/screenWidthInPixels", + " // {__w} = N/screenHeightInPixels", + " FxaaFloat4 fxaaConsoleRcpFrameOpt,", + " //", + " // Only used on FXAA Console.", + " // Not used on 360, but used on PS3 and PC.", + " // This must be from a constant/uniform.", + " // {x__} = -2.0/screenWidthInPixels", + " // {_y_} = -2.0/screenHeightInPixels", + " // {_z_} = 2.0/screenWidthInPixels", + " // {__w} = 2.0/screenHeightInPixels", + " FxaaFloat4 fxaaConsoleRcpFrameOpt2,", + " //", + " // Only used on FXAA Console.", + " // Only used on 360 in place of fxaaConsoleRcpFrameOpt2.", + " // This must be from a constant/uniform.", + " // {x__} = 8.0/screenWidthInPixels", + " // {_y_} = 8.0/screenHeightInPixels", + " // {_z_} = -4.0/screenWidthInPixels", + " // {__w} = -4.0/screenHeightInPixels", + " FxaaFloat4 fxaaConsole360RcpFrameOpt2,", + " //", + " // Only used on FXAA Quality.", + " // This used to be the FXAA_QUALITY_SUBPIX define.", + " // It is here now to allow easier tuning.", + " // Choose the amount of sub-pixel aliasing removal.", + " // This can effect sharpness.", + " // 1.00 - upper limit (softer)", + " // 0.75 - default amount of filtering", + " // 0.50 - lower limit (sharper, less sub-pixel aliasing removal)", + " // 0.25 - almost off", + " // 0.00 - completely off", + " FxaaFloat fxaaQualitySubpix,", + " //", + " // Only used on FXAA Quality.", + " // This used to be the FXAA_QUALITY_EDGE_THRESHOLD define.", + " // It is here now to allow easier tuning.", + " // The minimum amount of local contrast required to apply algorithm.", + " // 0.333 - too little (faster)", + " // 0.250 - low quality", + " // 0.166 - default", + " // 0.125 - high quality", + " // 0.063 - overkill (slower)", + " FxaaFloat fxaaQualityEdgeThreshold,", + " //", + " // Only used on FXAA Quality.", + " // This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define.", + " // It is here now to allow easier tuning.", + " // Trims the algorithm from processing darks.", + " // 0.0833 - upper limit (default, the start of visible unfiltered edges)", + " // 0.0625 - high quality (faster)", + " // 0.0312 - visible limit (slower)", + " // Special notes when using FXAA_GREEN_AS_LUMA,", + " // Likely want to set this to zero.", + " // As colors that are mostly not-green", + " // will appear very dark in the green channel!", + " // Tune by looking at mostly non-green content,", + " // then start at zero and increase until aliasing is a problem.", + " FxaaFloat fxaaQualityEdgeThresholdMin,", + " //", + " // Only used on FXAA Console.", + " // This used to be the FXAA_CONSOLE_EDGE_SHARPNESS define.", + " // It is here now to allow easier tuning.", + " // This does not effect PS3, as this needs to be compiled in.", + " // Use FXAA_CONSOLE_PS3_EDGE_SHARPNESS for PS3.", + " // Due to the PS3 being ALU bound,", + " // there are only three safe values here: 2 and 4 and 8.", + " // These options use the shaders ability to a free *|/ by 2|4|8.", + " // For all other platforms can be a non-power of two.", + " // 8.0 is sharper (default!!!)", + " // 4.0 is softer", + " // 2.0 is really soft (good only for vector graphics inputs)", + " FxaaFloat fxaaConsoleEdgeSharpness,", + " //", + " // Only used on FXAA Console.", + " // This used to be the FXAA_CONSOLE_EDGE_THRESHOLD define.", + " // It is here now to allow easier tuning.", + " // This does not effect PS3, as this needs to be compiled in.", + " // Use FXAA_CONSOLE_PS3_EDGE_THRESHOLD for PS3.", + " // Due to the PS3 being ALU bound,", + " // there are only two safe values here: 1/4 and 1/8.", + " // These options use the shaders ability to a free *|/ by 2|4|8.", + " // The console setting has a different mapping than the quality setting.", + " // Other platforms can use other values.", + " // 0.125 leaves less aliasing, but is softer (default!!!)", + " // 0.25 leaves more aliasing, and is sharper", + " FxaaFloat fxaaConsoleEdgeThreshold,", + " //", + " // Only used on FXAA Console.", + " // This used to be the FXAA_CONSOLE_EDGE_THRESHOLD_MIN define.", + " // It is here now to allow easier tuning.", + " // Trims the algorithm from processing darks.", + " // The console setting has a different mapping than the quality setting.", + " // This only applies when FXAA_EARLY_EXIT is 1.", + " // This does not apply to PS3,", + " // PS3 was simplified to avoid more shader instructions.", + " // 0.06 - faster but more aliasing in darks", + " // 0.05 - default", + " // 0.04 - slower and less aliasing in darks", + " // Special notes when using FXAA_GREEN_AS_LUMA,", + " // Likely want to set this to zero.", + " // As colors that are mostly not-green", + " // will appear very dark in the green channel!", + " // Tune by looking at mostly non-green content,", + " // then start at zero and increase until aliasing is a problem.", + " FxaaFloat fxaaConsoleEdgeThresholdMin,", + " //", + " // Extra constants for 360 FXAA Console only.", + " // Use zeros or anything else for other platforms.", + " // These must be in physical constant registers and NOT immedates.", + " // Immedates will result in compiler un-optimizing.", + " // {xyzw} = float4(1.0, -1.0, 0.25, -0.25)", + " FxaaFloat4 fxaaConsole360ConstDir", + ") {", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat2 posM;", + " posM.x = pos.x;", + " posM.y = pos.y;", + " #if (FXAA_GATHER4_ALPHA == 1)", + " #if (FXAA_DISCARD == 0)", + " FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);", + " #if (FXAA_GREEN_AS_LUMA == 0)", + " #define lumaM rgbyM.w", + " #else", + " #define lumaM rgbyM.y", + " #endif", + " #endif", + " #if (FXAA_GREEN_AS_LUMA == 0)", + " FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);", + " FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));", + " #else", + " FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);", + " FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));", + " #endif", + " #if (FXAA_DISCARD == 1)", + " #define lumaM luma4A.w", + " #endif", + " #define lumaE luma4A.z", + " #define lumaS luma4A.x", + " #define lumaSE luma4A.y", + " #define lumaNW luma4B.w", + " #define lumaN luma4B.z", + " #define lumaW luma4B.x", + " #else", + " FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);", + " #if (FXAA_GREEN_AS_LUMA == 0)", + " #define lumaM rgbyM.w", + " #else", + " #define lumaM rgbyM.y", + " #endif", + " #if (FXAA_GLSL_100 == 1)", + " FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0, 1.0), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 0.0), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0,-1.0), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 0.0), fxaaQualityRcpFrame.xy));", + " #else", + " FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));", + " #endif", + " #endif", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat maxSM = max(lumaS, lumaM);", + " FxaaFloat minSM = min(lumaS, lumaM);", + " FxaaFloat maxESM = max(lumaE, maxSM);", + " FxaaFloat minESM = min(lumaE, minSM);", + " FxaaFloat maxWN = max(lumaN, lumaW);", + " FxaaFloat minWN = min(lumaN, lumaW);", + " FxaaFloat rangeMax = max(maxWN, maxESM);", + " FxaaFloat rangeMin = min(minWN, minESM);", + " FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;", + " FxaaFloat range = rangeMax - rangeMin;", + " FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);", + " FxaaBool earlyExit = range < rangeMaxClamped;", + "/*--------------------------------------------------------------------------*/", + " if(earlyExit)", + " #if (FXAA_DISCARD == 1)", + " FxaaDiscard;", + " #else", + " return rgbyM;", + " #endif", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_GATHER4_ALPHA == 0)", + " #if (FXAA_GLSL_100 == 1)", + " FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0,-1.0), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 1.0), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0,-1.0), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 1.0), fxaaQualityRcpFrame.xy));", + " #else", + " FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));", + " #endif", + " #else", + " FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));", + " FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));", + " #endif", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat lumaNS = lumaN + lumaS;", + " FxaaFloat lumaWE = lumaW + lumaE;", + " FxaaFloat subpixRcpRange = 1.0/range;", + " FxaaFloat subpixNSWE = lumaNS + lumaWE;", + " FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;", + " FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat lumaNESE = lumaNE + lumaSE;", + " FxaaFloat lumaNWNE = lumaNW + lumaNE;", + " FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;", + " FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat lumaNWSW = lumaNW + lumaSW;", + " FxaaFloat lumaSWSE = lumaSW + lumaSE;", + " FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);", + " FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);", + " FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;", + " FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;", + " FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;", + " FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;", + " FxaaFloat lengthSign = fxaaQualityRcpFrame.x;", + " FxaaBool horzSpan = edgeHorz >= edgeVert;", + " FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;", + "/*--------------------------------------------------------------------------*/", + " if(!horzSpan) lumaN = lumaW;", + " if(!horzSpan) lumaS = lumaE;", + " if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;", + " FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat gradientN = lumaN - lumaM;", + " FxaaFloat gradientS = lumaS - lumaM;", + " FxaaFloat lumaNN = lumaN + lumaM;", + " FxaaFloat lumaSS = lumaS + lumaM;", + " FxaaBool pairN = abs(gradientN) >= abs(gradientS);", + " FxaaFloat gradient = max(abs(gradientN), abs(gradientS));", + " if(pairN) lengthSign = -lengthSign;", + " FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat2 posB;", + " posB.x = posM.x;", + " posB.y = posM.y;", + " FxaaFloat2 offNP;", + " offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;", + " offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;", + " if(!horzSpan) posB.x += lengthSign * 0.5;", + " if( horzSpan) posB.y += lengthSign * 0.5;", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat2 posN;", + " posN.x = posB.x - offNP.x * FXAA_QUALITY_P0;", + " posN.y = posB.y - offNP.y * FXAA_QUALITY_P0;", + " FxaaFloat2 posP;", + " posP.x = posB.x + offNP.x * FXAA_QUALITY_P0;", + " posP.y = posB.y + offNP.y * FXAA_QUALITY_P0;", + " FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;", + " FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));", + " FxaaFloat subpixE = subpixC * subpixC;", + " FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));", + "/*--------------------------------------------------------------------------*/", + " if(!pairN) lumaNN = lumaSS;", + " FxaaFloat gradientScaled = gradient * 1.0/4.0;", + " FxaaFloat lumaMM = lumaM - lumaNN * 0.5;", + " FxaaFloat subpixF = subpixD * subpixE;", + " FxaaBool lumaMLTZero = lumaMM < 0.0;", + "/*--------------------------------------------------------------------------*/", + " lumaEndN -= lumaNN * 0.5;", + " lumaEndP -= lumaNN * 0.5;", + " FxaaBool doneN = abs(lumaEndN) >= gradientScaled;", + " FxaaBool doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;", + " FxaaBool doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;", + "/*--------------------------------------------------------------------------*/", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 3)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 4)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 5)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 6)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 7)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 8)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 9)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 10)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 11)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;", + "/*--------------------------------------------------------------------------*/", + " #if (FXAA_QUALITY_PS > 12)", + " if(doneNP) {", + " if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));", + " if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));", + " if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;", + " if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;", + " doneN = abs(lumaEndN) >= gradientScaled;", + " doneP = abs(lumaEndP) >= gradientScaled;", + " if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;", + " if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;", + " doneNP = (!doneN) || (!doneP);", + " if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;", + " if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + " #endif", + "/*--------------------------------------------------------------------------*/", + " }", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat dstN = posM.x - posN.x;", + " FxaaFloat dstP = posP.x - posM.x;", + " if(!horzSpan) dstN = posM.y - posN.y;", + " if(!horzSpan) dstP = posP.y - posM.y;", + "/*--------------------------------------------------------------------------*/", + " FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;", + " FxaaFloat spanLength = (dstP + dstN);", + " FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;", + " FxaaFloat spanLengthRcp = 1.0/spanLength;", + "/*--------------------------------------------------------------------------*/", + " FxaaBool directionN = dstN < dstP;", + " FxaaFloat dst = min(dstN, dstP);", + " FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;", + " FxaaFloat subpixG = subpixF * subpixF;", + " FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;", + " FxaaFloat subpixH = subpixG * fxaaQualitySubpix;", + "/*--------------------------------------------------------------------------*/", + " FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;", + " FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);", + " if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;", + " if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;", + " #if (FXAA_DISCARD == 1)", + " return FxaaTexTop(tex, posM);", + " #else", + " return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);", + " #endif", + "}", + "/*==========================================================================*/", + "#endif", + "", + "void main() {", + " gl_FragColor = FxaaPixelShader(", + " vUv,", + " vec4(0.0),", + " tDiffuse,", + " tDiffuse,", + " tDiffuse,", + " resolution,", + " vec4(0.0),", + " vec4(0.0),", + " vec4(0.0),", + " 0.75,", + " 0.166,", + " 0.0833,", + " 0.0,", + " 0.0,", + " 0.0,", + " vec4(0.0)", + " );", + "", + " // TODO avoid querying texture twice for same texel", + " gl_FragColor.a = texture2D(tDiffuse, vUv).a;", + "}" + ].join("\n") + +}; \ No newline at end of file diff --git a/public/static/modelView/js/effects/OutlinePass.js b/public/static/modelView/js/effects/OutlinePass.js new file mode 100644 index 0000000..2600376 --- /dev/null +++ b/public/static/modelView/js/effects/OutlinePass.js @@ -0,0 +1,571 @@ +锘�/** + * @author spidersharma / http://eduperiment.com/ + */ + +THREE.OutlinePass = function (resolution, scene, camera, selectedObjects) { + + this.renderScene = scene; + this.renderCamera = camera; + this.selectedObjects = selectedObjects !== undefined ? selectedObjects : []; + this.visibleEdgeColor = new THREE.Color(1, 1, 1); + this.hiddenEdgeColor = new THREE.Color(0.1, 0.04, 0.02); + this.edgeGlow = 0.0; + this.usePatternTexture = false; + this.edgeThickness = 1.0; + this.edgeStrength = 3.0; + this.downSampleRatio = 2; + this.pulsePeriod = 0; + + THREE.Pass.call(this); + + this.resolution = (resolution !== undefined) ? new THREE.Vector2(resolution.x, resolution.y) : new THREE.Vector2(256, 256); + + var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat }; + + var resx = Math.round(this.resolution.x / this.downSampleRatio); + var resy = Math.round(this.resolution.y / this.downSampleRatio); + + this.maskBufferMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff }); + this.maskBufferMaterial.side = THREE.DoubleSide; + this.renderTargetMaskBuffer = new THREE.WebGLRenderTarget(this.resolution.x, this.resolution.y, pars); + this.renderTargetMaskBuffer.texture.name = "OutlinePass.mask"; + this.renderTargetMaskBuffer.texture.generateMipmaps = false; + + this.depthMaterial = new THREE.MeshDepthMaterial(); + this.depthMaterial.side = THREE.DoubleSide; + this.depthMaterial.depthPacking = THREE.RGBADepthPacking; + this.depthMaterial.blending = THREE.NoBlending; + + this.prepareMaskMaterial = this.getPrepareMaskMaterial(); + this.prepareMaskMaterial.side = THREE.DoubleSide; + this.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ(this.prepareMaskMaterial.fragmentShader, this.renderCamera); + + this.renderTargetDepthBuffer = new THREE.WebGLRenderTarget(this.resolution.x, this.resolution.y, pars); + this.renderTargetDepthBuffer.texture.name = "OutlinePass.depth"; + this.renderTargetDepthBuffer.texture.generateMipmaps = false; + + this.renderTargetMaskDownSampleBuffer = new THREE.WebGLRenderTarget(resx, resy, pars); + this.renderTargetMaskDownSampleBuffer.texture.name = "OutlinePass.depthDownSample"; + this.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false; + + this.renderTargetBlurBuffer1 = new THREE.WebGLRenderTarget(resx, resy, pars); + this.renderTargetBlurBuffer1.texture.name = "OutlinePass.blur1"; + this.renderTargetBlurBuffer1.texture.generateMipmaps = false; + this.renderTargetBlurBuffer2 = new THREE.WebGLRenderTarget(Math.round(resx / 2), Math.round(resy / 2), pars); + this.renderTargetBlurBuffer2.texture.name = "OutlinePass.blur2"; + this.renderTargetBlurBuffer2.texture.generateMipmaps = false; + + this.edgeDetectionMaterial = this.getEdgeDetectionMaterial(); + this.renderTargetEdgeBuffer1 = new THREE.WebGLRenderTarget(resx, resy, pars); + this.renderTargetEdgeBuffer1.texture.name = "OutlinePass.edge1"; + this.renderTargetEdgeBuffer1.texture.generateMipmaps = false; + this.renderTargetEdgeBuffer2 = new THREE.WebGLRenderTarget(Math.round(resx / 2), Math.round(resy / 2), pars); + this.renderTargetEdgeBuffer2.texture.name = "OutlinePass.edge2"; + this.renderTargetEdgeBuffer2.texture.generateMipmaps = false; + + var MAX_EDGE_THICKNESS = 4; + var MAX_EDGE_GLOW = 4; + + this.separableBlurMaterial1 = this.getSeperableBlurMaterial(MAX_EDGE_THICKNESS); + this.separableBlurMaterial1.uniforms["texSize"].value = new THREE.Vector2(resx, resy); + this.separableBlurMaterial1.uniforms["kernelRadius"].value = 1; + this.separableBlurMaterial2 = this.getSeperableBlurMaterial(MAX_EDGE_GLOW); + this.separableBlurMaterial2.uniforms["texSize"].value = new THREE.Vector2(Math.round(resx / 2), Math.round(resy / 2)); + this.separableBlurMaterial2.uniforms["kernelRadius"].value = MAX_EDGE_GLOW; + + // Overlay material + this.overlayMaterial = this.getOverlayMaterial(); + + // copy material + if (THREE.CopyShader === undefined) + console.error("THREE.OutlinePass relies on THREE.CopyShader"); + + var copyShader = THREE.CopyShader; + + this.copyUniforms = THREE.UniformsUtils.clone(copyShader.uniforms); + this.copyUniforms["opacity"].value = 1.0; + + this.materialCopy = new THREE.ShaderMaterial({ + uniforms: this.copyUniforms, + vertexShader: copyShader.vertexShader, + fragmentShader: copyShader.fragmentShader, + blending: THREE.NoBlending, + depthTest: false, + depthWrite: false, + transparent: true + }); + + this.enabled = true; + this.needsSwap = false; + + this.oldClearColor = new THREE.Color(); + this.oldClearAlpha = 1; + + this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); + this.scene = new THREE.Scene(); + + this.quad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), null); + this.quad.frustumCulled = false; // Avoid getting clipped + this.scene.add(this.quad); + + this.tempPulseColor1 = new THREE.Color(); + this.tempPulseColor2 = new THREE.Color(); + this.textureMatrix = new THREE.Matrix4(); + + function replaceDepthToViewZ(string, camera) { + + var type = camera.isPerspectiveCamera ? 'perspective' : 'orthographic'; + + return string.replace(/DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ'); + + } + +}; + +THREE.OutlinePass.prototype = Object.assign(Object.create(THREE.Pass.prototype), { + + constructor: THREE.OutlinePass, + + dispose: function () { + + this.renderTargetMaskBuffer.dispose(); + this.renderTargetDepthBuffer.dispose(); + this.renderTargetMaskDownSampleBuffer.dispose(); + this.renderTargetBlurBuffer1.dispose(); + this.renderTargetBlurBuffer2.dispose(); + this.renderTargetEdgeBuffer1.dispose(); + this.renderTargetEdgeBuffer2.dispose(); + + }, + + setSize: function (width, height) { + + this.renderTargetMaskBuffer.setSize(width, height); + + var resx = Math.round(width / this.downSampleRatio); + var resy = Math.round(height / this.downSampleRatio); + this.renderTargetMaskDownSampleBuffer.setSize(resx, resy); + this.renderTargetBlurBuffer1.setSize(resx, resy); + this.renderTargetEdgeBuffer1.setSize(resx, resy); + this.separableBlurMaterial1.uniforms["texSize"].value = new THREE.Vector2(resx, resy); + + resx = Math.round(resx / 2); + resy = Math.round(resy / 2); + + this.renderTargetBlurBuffer2.setSize(resx, resy); + this.renderTargetEdgeBuffer2.setSize(resx, resy); + + this.separableBlurMaterial2.uniforms["texSize"].value = new THREE.Vector2(resx, resy); + + }, + + changeVisibilityOfSelectedObjects: function (bVisible) { + + function gatherSelectedMeshesCallBack(object) { + + if (object.isMesh) { + + if (bVisible) { + + object.visible = object.userData.oldVisible; + delete object.userData.oldVisible; + + } else { + + object.userData.oldVisible = object.visible; + object.visible = bVisible; + + } + + } + + } + + for (var i = 0; i < this.selectedObjects.length; i++) { + + var selectedObject = this.selectedObjects[i]; + selectedObject.traverse(gatherSelectedMeshesCallBack); + + } + + }, + + changeVisibilityOfNonSelectedObjects: function (bVisible) { + + var selectedMeshes = []; + + function gatherSelectedMeshesCallBack(object) { + + if (object.isMesh) selectedMeshes.push(object); + + } + + for (var i = 0; i < this.selectedObjects.length; i++) { + + var selectedObject = this.selectedObjects[i]; + selectedObject.traverse(gatherSelectedMeshesCallBack); + + } + + function VisibilityChangeCallBack(object) { + + if (object.isMesh || object.isLine || object.isSprite) { + + var bFound = false; + + for (var i = 0; i < selectedMeshes.length; i++) { + + var selectedObjectId = selectedMeshes[i].id; + + if (selectedObjectId === object.id) { + + bFound = true; + break; + + } + + } + + if (!bFound) { + + var visibility = object.visible; + + if (!bVisible || object.bVisible) object.visible = bVisible; + + object.bVisible = visibility; + + } + + } + + } + + this.renderScene.traverse(VisibilityChangeCallBack); + + }, + + updateTextureMatrix: function () { + + this.textureMatrix.set(0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0); + this.textureMatrix.multiply(this.renderCamera.projectionMatrix); + this.textureMatrix.multiply(this.renderCamera.matrixWorldInverse); + + }, + + render: function (renderer, writeBuffer, readBuffer, delta, maskActive) { + + if (this.selectedObjects.length > 0) { + + this.oldClearColor.copy(renderer.getClearColor()); + this.oldClearAlpha = renderer.getClearAlpha(); + var oldAutoClear = renderer.autoClear; + + renderer.autoClear = false; + + if (maskActive) renderer.context.disable(renderer.context.STENCIL_TEST); + + renderer.setClearColor(0xffffff, 1); + + // Make selected objects invisible + this.changeVisibilityOfSelectedObjects(false); + + var currentBackground = this.renderScene.background; + this.renderScene.background = null; + + // 1. Draw Non Selected objects in the depth buffer + this.renderScene.overrideMaterial = this.depthMaterial; + renderer.render(this.renderScene, this.renderCamera, this.renderTargetDepthBuffer, true); + + // Make selected objects visible + this.changeVisibilityOfSelectedObjects(true); + + // Update Texture Matrix for Depth compare + this.updateTextureMatrix(); + + // Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects + this.changeVisibilityOfNonSelectedObjects(false); + this.renderScene.overrideMaterial = this.prepareMaskMaterial; + this.prepareMaskMaterial.uniforms["cameraNearFar"].value = new THREE.Vector2(this.renderCamera.near, this.renderCamera.far); + this.prepareMaskMaterial.uniforms["depthTexture"].value = this.renderTargetDepthBuffer.texture; + this.prepareMaskMaterial.uniforms["textureMatrix"].value = this.textureMatrix; + renderer.render(this.renderScene, this.renderCamera, this.renderTargetMaskBuffer, true); + this.renderScene.overrideMaterial = null; + this.changeVisibilityOfNonSelectedObjects(true); + + this.renderScene.background = currentBackground; + + // 2. Downsample to Half resolution + this.quad.material = this.materialCopy; + this.copyUniforms["tDiffuse"].value = this.renderTargetMaskBuffer.texture; + renderer.render(this.scene, this.camera, this.renderTargetMaskDownSampleBuffer, true); + + this.tempPulseColor1.copy(this.visibleEdgeColor); + this.tempPulseColor2.copy(this.hiddenEdgeColor); + + if (this.pulsePeriod > 0) { + + var scalar = (1 + 0.25) / 2 + Math.cos(performance.now() * 0.01 / this.pulsePeriod) * (1.0 - 0.25) / 2; + this.tempPulseColor1.multiplyScalar(scalar); + this.tempPulseColor2.multiplyScalar(scalar); + + } + + // 3. Apply Edge Detection Pass + this.quad.material = this.edgeDetectionMaterial; + this.edgeDetectionMaterial.uniforms["maskTexture"].value = this.renderTargetMaskDownSampleBuffer.texture; + this.edgeDetectionMaterial.uniforms["texSize"].value = new THREE.Vector2(this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height); + this.edgeDetectionMaterial.uniforms["visibleEdgeColor"].value = this.tempPulseColor1; + this.edgeDetectionMaterial.uniforms["hiddenEdgeColor"].value = this.tempPulseColor2; + renderer.render(this.scene, this.camera, this.renderTargetEdgeBuffer1, true); + + // 4. Apply Blur on Half res + this.quad.material = this.separableBlurMaterial1; + this.separableBlurMaterial1.uniforms["colorTexture"].value = this.renderTargetEdgeBuffer1.texture; + this.separableBlurMaterial1.uniforms["direction"].value = THREE.OutlinePass.BlurDirectionX; + this.separableBlurMaterial1.uniforms["kernelRadius"].value = this.edgeThickness; + renderer.render(this.scene, this.camera, this.renderTargetBlurBuffer1, true); + this.separableBlurMaterial1.uniforms["colorTexture"].value = this.renderTargetBlurBuffer1.texture; + this.separableBlurMaterial1.uniforms["direction"].value = THREE.OutlinePass.BlurDirectionY; + renderer.render(this.scene, this.camera, this.renderTargetEdgeBuffer1, true); + + // Apply Blur on quarter res + this.quad.material = this.separableBlurMaterial2; + this.separableBlurMaterial2.uniforms["colorTexture"].value = this.renderTargetEdgeBuffer1.texture; + this.separableBlurMaterial2.uniforms["direction"].value = THREE.OutlinePass.BlurDirectionX; + renderer.render(this.scene, this.camera, this.renderTargetBlurBuffer2, true); + this.separableBlurMaterial2.uniforms["colorTexture"].value = this.renderTargetBlurBuffer2.texture; + this.separableBlurMaterial2.uniforms["direction"].value = THREE.OutlinePass.BlurDirectionY; + renderer.render(this.scene, this.camera, this.renderTargetEdgeBuffer2, true); + + // Blend it additively over the input texture + this.quad.material = this.overlayMaterial; + this.overlayMaterial.uniforms["maskTexture"].value = this.renderTargetMaskBuffer.texture; + this.overlayMaterial.uniforms["edgeTexture1"].value = this.renderTargetEdgeBuffer1.texture; + this.overlayMaterial.uniforms["edgeTexture2"].value = this.renderTargetEdgeBuffer2.texture; + this.overlayMaterial.uniforms["patternTexture"].value = this.patternTexture; + this.overlayMaterial.uniforms["edgeStrength"].value = this.edgeStrength; + this.overlayMaterial.uniforms["edgeGlow"].value = this.edgeGlow; + this.overlayMaterial.uniforms["usePatternTexture"].value = this.usePatternTexture; + + + if (maskActive) renderer.context.enable(renderer.context.STENCIL_TEST); + + renderer.render(this.scene, this.camera, readBuffer, false); + + renderer.setClearColor(this.oldClearColor, this.oldClearAlpha); + renderer.autoClear = oldAutoClear; + + } + + if (this.renderToScreen) { + + this.quad.material = this.materialCopy; + this.copyUniforms["tDiffuse"].value = readBuffer.texture; + renderer.render(this.scene, this.camera); + + } + + }, + + getPrepareMaskMaterial: function () { + + return new THREE.ShaderMaterial({ + + uniforms: { + "depthTexture": { value: null }, + "cameraNearFar": { value: new THREE.Vector2(0.5, 0.5) }, + "textureMatrix": { value: new THREE.Matrix4() } + }, + + vertexShader: [ + 'varying vec4 projTexCoord;', + 'varying vec4 vPosition;', + 'uniform mat4 textureMatrix;', + + 'void main() {', + + ' vPosition = modelViewMatrix * vec4( position, 1.0 );', + ' vec4 worldPosition = modelMatrix * vec4( position, 1.0 );', + ' projTexCoord = textureMatrix * worldPosition;', + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', + + '}' + ].join('\n'), + + fragmentShader: [ + '#include <packing>', + 'varying vec4 vPosition;', + 'varying vec4 projTexCoord;', + 'uniform sampler2D depthTexture;', + 'uniform vec2 cameraNearFar;', + + 'void main() {', + + ' float depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));', + ' float viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );', + ' float depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;', + ' gl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);', + + '}' + ].join('\n') + + }); + + }, + + getEdgeDetectionMaterial: function () { + + return new THREE.ShaderMaterial({ + + uniforms: { + "maskTexture": { value: null }, + "texSize": { value: new THREE.Vector2(0.5, 0.5) }, + "visibleEdgeColor": { value: new THREE.Vector3(1.0, 1.0, 1.0) }, + "hiddenEdgeColor": { value: new THREE.Vector3(1.0, 1.0, 1.0) }, + }, + + vertexShader: + "varying vec2 vUv;\n\ + void main() {\n\ + vUv = uv;\n\ + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\ + }", + + fragmentShader: + "varying vec2 vUv;\ + uniform sampler2D maskTexture;\ + uniform vec2 texSize;\ + uniform vec3 visibleEdgeColor;\ + uniform vec3 hiddenEdgeColor;\ + \ + void main() {\n\ + vec2 invSize = 1.0 / texSize;\ + vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\ + vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\ + vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\ + vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\ + vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\ + float diff1 = (c1.r - c2.r)*0.5;\ + float diff2 = (c3.r - c4.r)*0.5;\ + float d = length( vec2(diff1, diff2) );\ + float a1 = min(c1.g, c2.g);\ + float a2 = min(c3.g, c4.g);\ + float visibilityFactor = min(a1, a2);\ + vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\ + gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\ + }" + }); + + }, + + getSeperableBlurMaterial: function (maxRadius) { + + return new THREE.ShaderMaterial({ + + defines: { + "MAX_RADIUS": maxRadius, + }, + + uniforms: { + "colorTexture": { value: null }, + "texSize": { value: new THREE.Vector2(0.5, 0.5) }, + "direction": { value: new THREE.Vector2(0.5, 0.5) }, + "kernelRadius": { value: 1.0 } + }, + + vertexShader: + "varying vec2 vUv;\n\ + void main() {\n\ + vUv = uv;\n\ + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\ + }", + + fragmentShader: + "#include <common>\ + varying vec2 vUv;\ + uniform sampler2D colorTexture;\ + uniform vec2 texSize;\ + uniform vec2 direction;\ + uniform float kernelRadius;\ + \ + float gaussianPdf(in float x, in float sigma) {\ + return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\ + }\ + void main() {\ + vec2 invSize = 1.0 / texSize;\ + float weightSum = gaussianPdf(0.0, kernelRadius);\ + vec3 diffuseSum = texture2D( colorTexture, vUv).rgb * weightSum;\ + vec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\ + vec2 uvOffset = delta;\ + for( int i = 1; i <= MAX_RADIUS; i ++ ) {\ + float w = gaussianPdf(uvOffset.x, kernelRadius);\ + vec3 sample1 = texture2D( colorTexture, vUv + uvOffset).rgb;\ + vec3 sample2 = texture2D( colorTexture, vUv - uvOffset).rgb;\ + diffuseSum += ((sample1 + sample2) * w);\ + weightSum += (2.0 * w);\ + uvOffset += delta;\ + }\ + gl_FragColor = vec4(diffuseSum/weightSum, 1.0);\ + }" + }); + + }, + + getOverlayMaterial: function () { + + return new THREE.ShaderMaterial({ + + uniforms: { + "maskTexture": { value: null }, + "edgeTexture1": { value: null }, + "edgeTexture2": { value: null }, + "patternTexture": { value: null }, + "edgeStrength": { value: 1.0 }, + "edgeGlow": { value: 1.0 }, + "usePatternTexture": { value: 0.0 } + }, + + vertexShader: + "varying vec2 vUv;\n\ + void main() {\n\ + vUv = uv;\n\ + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\ + }", + + fragmentShader: + "varying vec2 vUv;\ + uniform sampler2D maskTexture;\ + uniform sampler2D edgeTexture1;\ + uniform sampler2D edgeTexture2;\ + uniform sampler2D patternTexture;\ + uniform float edgeStrength;\ + uniform float edgeGlow;\ + uniform bool usePatternTexture;\ + \ + void main() {\ + vec4 edgeValue1 = texture2D(edgeTexture1, vUv);\ + vec4 edgeValue2 = texture2D(edgeTexture2, vUv);\ + vec4 maskColor = texture2D(maskTexture, vUv);\ + vec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\ + float visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\ + vec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\ + vec4 finalColor = edgeStrength * maskColor.r * edgeValue;\ + if(usePatternTexture)\ + finalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\ + gl_FragColor = finalColor;\ + }", + blending: THREE.AdditiveBlending, + depthTest: false, + depthWrite: false, + transparent: true + }); + + } + +}); + +THREE.OutlinePass.BlurDirectionX = new THREE.Vector2(1.0, 0.0); +THREE.OutlinePass.BlurDirectionY = new THREE.Vector2(0.0, 1.0); \ No newline at end of file diff --git a/public/static/modelView/js/effects/RenderPass.js b/public/static/modelView/js/effects/RenderPass.js new file mode 100644 index 0000000..74a7dba --- /dev/null +++ b/public/static/modelView/js/effects/RenderPass.js @@ -0,0 +1,63 @@ +锘�/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.RenderPass = function (scene, camera, overrideMaterial, clearColor, clearAlpha) { + + THREE.Pass.call(this); + + this.scene = scene; + this.camera = camera; + + this.overrideMaterial = overrideMaterial; + + this.clearColor = clearColor; + this.clearAlpha = (clearAlpha !== undefined) ? clearAlpha : 0; + + this.clear = true; + this.clearDepth = false; + this.needsSwap = false; + +}; + +THREE.RenderPass.prototype = Object.assign(Object.create(THREE.Pass.prototype), { + + constructor: THREE.RenderPass, + + render: function (renderer, writeBuffer, readBuffer, delta, maskActive) { + + var oldAutoClear = renderer.autoClear; + renderer.autoClear = false; + + this.scene.overrideMaterial = this.overrideMaterial; + + var oldClearColor, oldClearAlpha; + + if (this.clearColor) { + + oldClearColor = renderer.getClearColor().getHex(); + oldClearAlpha = renderer.getClearAlpha(); + + renderer.setClearColor(this.clearColor, this.clearAlpha); + + } + + if (this.clearDepth) { + + renderer.clearDepth(); + + } + + renderer.render(this.scene, this.camera, this.renderToScreen ? null : readBuffer, this.clear); + + if (this.clearColor) { + + renderer.setClearColor(oldClearColor, oldClearAlpha); + + } + + this.scene.overrideMaterial = null; + renderer.autoClear = oldAutoClear; + } + +}); \ No newline at end of file diff --git a/public/static/modelView/js/effects/SSAARenderPass.js b/public/static/modelView/js/effects/SSAARenderPass.js new file mode 100644 index 0000000..8aa6faf --- /dev/null +++ b/public/static/modelView/js/effects/SSAARenderPass.js @@ -0,0 +1,180 @@ +锘�/** +* +* Supersample Anti-Aliasing Render Pass +* +* @author bhouston / http://clara.io/ +* +* This manual approach to SSAA re-renders the scene ones for each sample with camera jitter and accumulates the results. +* +* References: https://en.wikipedia.org/wiki/Supersampling +* +*/ + +THREE.SSAARenderPass = function (scene, camera, clearColor, clearAlpha) { + + THREE.Pass.call(this); + + this.scene = scene; + this.camera = camera; + + this.sampleLevel = 4; // specified as n, where the number of samples is 2^n, so sampleLevel = 4, is 2^4 samples, 16. + this.unbiased = true; + + // as we need to clear the buffer in this pass, clearColor must be set to something, defaults to black. + this.clearColor = (clearColor !== undefined) ? clearColor : 0x000000; + this.clearAlpha = (clearAlpha !== undefined) ? clearAlpha : 0; + + if (THREE.CopyShader === undefined) console.error("THREE.SSAARenderPass relies on THREE.CopyShader"); + + var copyShader = THREE.CopyShader; + this.copyUniforms = THREE.UniformsUtils.clone(copyShader.uniforms); + + this.copyMaterial = new THREE.ShaderMaterial({ + uniforms: this.copyUniforms, + vertexShader: copyShader.vertexShader, + fragmentShader: copyShader.fragmentShader, + premultipliedAlpha: true, + transparent: true, + blending: THREE.AdditiveBlending, + depthTest: false, + depthWrite: false + }); + + this.camera2 = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); + this.scene2 = new THREE.Scene(); + this.quad2 = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), this.copyMaterial); + this.quad2.frustumCulled = false; // Avoid getting clipped + this.scene2.add(this.quad2); + +}; + +THREE.SSAARenderPass.prototype = Object.assign(Object.create(THREE.Pass.prototype), { + + constructor: THREE.SSAARenderPass, + + dispose: function () { + + if (this.sampleRenderTarget) { + + this.sampleRenderTarget.dispose(); + this.sampleRenderTarget = null; + + } + + }, + + setSize: function (width, height) { + + if (this.sampleRenderTarget) this.sampleRenderTarget.setSize(width, height); + + }, + + render: function (renderer, writeBuffer, readBuffer) { + + if (!this.sampleRenderTarget) { + + this.sampleRenderTarget = new THREE.WebGLRenderTarget(readBuffer.width, readBuffer.height, { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat }); + this.sampleRenderTarget.texture.name = "SSAARenderPass.sample"; + + } + + var jitterOffsets = THREE.SSAARenderPass.JitterVectors[Math.max(0, Math.min(this.sampleLevel, 5))]; + + var autoClear = renderer.autoClear; + renderer.autoClear = false; + + var oldClearColor = renderer.getClearColor().getHex(); + var oldClearAlpha = renderer.getClearAlpha(); + + var baseSampleWeight = 1.0 / jitterOffsets.length; + var roundingRange = 1 / 32; + this.copyUniforms["tDiffuse"].value = this.sampleRenderTarget.texture; + + var width = readBuffer.width, height = readBuffer.height; + + // render the scene multiple times, each slightly jitter offset from the last and accumulate the results. + for (var i = 0; i < jitterOffsets.length; i++) { + + var jitterOffset = jitterOffsets[i]; + + if (this.camera.setViewOffset) { + + this.camera.setViewOffset(width, height, + jitterOffset[0] * 0.0625, jitterOffset[1] * 0.0625, // 0.0625 = 1 / 16 + width, height); + + } + + var sampleWeight = baseSampleWeight; + + if (this.unbiased) { + + // the theory is that equal weights for each sample lead to an accumulation of rounding errors. + // The following equation varies the sampleWeight per sample so that it is uniformly distributed + // across a range of values whose rounding errors cancel each other out. + + var uniformCenteredDistribution = (-0.5 + (i + 0.5) / jitterOffsets.length); + sampleWeight += roundingRange * uniformCenteredDistribution; + + } + + this.copyUniforms["opacity"].value = sampleWeight; + renderer.setClearColor(this.clearColor, this.clearAlpha); + renderer.render(this.scene, this.camera, this.sampleRenderTarget, true); + + if (i === 0) { + + renderer.setClearColor(0x000000, 0.0); + + } + + renderer.render(this.scene2, this.camera2, this.renderToScreen ? null : writeBuffer, (i === 0)); + + } + + if (this.camera.clearViewOffset) this.camera.clearViewOffset(); + + renderer.autoClear = autoClear; + renderer.setClearColor(oldClearColor, oldClearAlpha); + + } + +}); + + +// These jitter vectors are specified in integers because it is easier. +// I am assuming a [-8,8) integer grid, but it needs to be mapped onto [-0.5,0.5) +// before being used, thus these integers need to be scaled by 1/16. +// +// Sample patterns reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 +THREE.SSAARenderPass.JitterVectors = [ + [ + [0, 0] + ], + [ + [4, 4], [-4, -4] + ], + [ + [-2, -6], [6, -2], [-6, 2], [2, 6] + ], + [ + [1, -3], [-1, 3], [5, 1], [-3, -5], + [-5, 5], [-7, -1], [3, 7], [7, -7] + ], + [ + [1, 1], [-1, -3], [-3, 2], [4, -1], + [-5, -2], [2, 5], [5, 3], [3, -5], + [-2, 6], [0, -7], [-4, -6], [-6, 4], + [-8, 0], [7, -4], [6, 7], [-7, -8] + ], + [ + [-4, -7], [-7, -5], [-3, -5], [-5, -4], + [-1, -4], [-2, -2], [-6, -1], [-4, 0], + [-7, 1], [-1, 2], [-6, 3], [-3, 3], + [-7, 6], [-3, 6], [-5, 7], [-1, 7], + [5, -7], [1, -6], [6, -5], [4, -4], + [2, -3], [7, -2], [1, -1], [4, -1], + [2, 1], [6, 2], [0, 4], [4, 4], + [2, 5], [7, 5], [5, 6], [3, 7] + ] +]; \ No newline at end of file diff --git a/public/static/modelView/js/effects/ShaderPass.js b/public/static/modelView/js/effects/ShaderPass.js new file mode 100644 index 0000000..f049aac --- /dev/null +++ b/public/static/modelView/js/effects/ShaderPass.js @@ -0,0 +1,67 @@ +锘�/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.ShaderPass = function (shader, textureID) { + + THREE.Pass.call(this); + + this.textureID = (textureID !== undefined) ? textureID : "tDiffuse"; + + if (shader instanceof THREE.ShaderMaterial) { + + this.uniforms = shader.uniforms; + + this.material = shader; + + } else if (shader) { + + this.uniforms = THREE.UniformsUtils.clone(shader.uniforms); + + this.material = new THREE.ShaderMaterial({ + + defines: Object.assign({}, shader.defines), + uniforms: this.uniforms, + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + + }); + + } + + this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); + this.scene = new THREE.Scene(); + + this.quad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), null); + this.quad.frustumCulled = false; // Avoid getting clipped + this.scene.add(this.quad); + +}; + +THREE.ShaderPass.prototype = Object.assign(Object.create(THREE.Pass.prototype), { + + constructor: THREE.ShaderPass, + + render: function (renderer, writeBuffer, readBuffer, delta, maskActive) { + + if (this.uniforms[this.textureID]) { + + this.uniforms[this.textureID].value = readBuffer.texture; + + } + + this.quad.material = this.material; + + if (this.renderToScreen) { + + renderer.render(this.scene, this.camera); + + } else { + + renderer.render(this.scene, this.camera, writeBuffer, this.clear); + + } + + } + +}); \ No newline at end of file diff --git a/public/static/modelView/js/jquery.min.js b/public/static/modelView/js/jquery.min.js new file mode 100644 index 0000000..5c82cc0 --- /dev/null +++ b/public/static/modelView/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; +}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ca(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Fa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ba.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Oa(a,b,c||(g?"border":"content"),d,f)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]), +void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g,hb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(hb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var ib=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!ib.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,ib.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b)}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var jb=a.location,kb=n.now(),lb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var mb=/#.*$/,nb=/([?&])_=[^&]*/,ob=/^(.*?):[ \t]*([^\r\n]*)$/gm,pb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,qb=/^(?:GET|HEAD)$/,rb=/^\/\//,sb={},tb={},ub="*/".concat("*"),vb=d.createElement("a");vb.href=jb.href;function wb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function xb(a,b,c,d){var e={},f=a===tb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function yb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function zb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Ab(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:jb.href,type:"GET",isLocal:pb.test(jb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":ub,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?yb(yb(a,n.ajaxSettings),b):yb(n.ajaxSettings,a)},ajaxPrefilter:wb(sb),ajaxTransport:wb(tb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=ob.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||jb.href)+"").replace(mb,"").replace(rb,jb.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=vb.protocol+"//"+vb.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),xb(sb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!qb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(lb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=nb.test(f)?f.replace(nb,"$1_="+kb++):f+(lb.test(f)?"&":"?")+"_="+kb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+ub+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=xb(tb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=zb(m,x,d)),u=Ab(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Bb=/%20/g,Cb=/\[\]$/,Db=/\r?\n/g,Eb=/^(?:submit|button|image|reset|file)$/i,Fb=/^(?:input|select|textarea|keygen)/i;function Gb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Cb.test(a)?d(a,e):Gb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Gb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Gb(c,a[c],b,e);return d.join("&").replace(Bb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Fb.test(this.nodeName)&&!Eb.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Db,"\r\n")}}):{name:b.name,value:c.replace(Db,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Hb={0:200,1223:204},Ib=n.ajaxSettings.xhr();l.cors=!!Ib&&"withCredentials"in Ib,l.ajax=Ib=!!Ib,n.ajaxTransport(function(b){var c,d;return l.cors||Ib&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Hb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Jb=[],Kb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Jb.pop()||n.expando+"_"+kb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Kb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Kb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Kb,"$1"+e):b.jsonp!==!1&&(b.url+=(lb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Jb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Lb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Lb)return Lb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Mb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Mb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Mb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Nb=a.jQuery,Ob=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Ob),b&&a.jQuery===n&&(a.jQuery=Nb),n},b||(a.jQuery=a.$=n),n}); \ No newline at end of file diff --git a/public/static/modelView/js/jquery.nicescroll.js b/public/static/modelView/js/jquery.nicescroll.js new file mode 100644 index 0000000..81bee57 --- /dev/null +++ b/public/static/modelView/js/jquery.nicescroll.js @@ -0,0 +1,3471 @@ +/* jquery.nicescroll +-- version 3.4.0 +-- copyright 2011-12-13 InuYaksa*2013 +-- licensed under the MIT +-- +-- http://areaaperta.com/nicescroll +-- https://github.com/inuyaksa/jquery.nicescroll +-- +*/ + +;(function (jQuery) { + // globals + var domfocus = false + var mousefocus = false + var zoomactive = false + var tabindexcounter = 5000 + var ascrailcounter = 2000 + var globalmaxzindex = 0 + + var $ = jQuery // sandbox + + // http://stackoverflow.com/questions/2161159/get-script-path + function getScriptPath() { + var scripts = document.getElementsByTagName('script') + var path = scripts[scripts.length - 1].src.split('?')[0] + return path.split('/').length > 0 ? path.split('/').slice(0, -1).join('/') + '/' : '' + } + var scriptpath = getScriptPath() + + // derived by Paul Irish https://gist.github.com/paulirish/1579671 - thanks for your code! + + if (!Array.prototype.forEach) { + // JS 1.6 polyfill + Array.prototype.forEach = function (fn, scope) { + for (var i = 0, len = this.length; i < len; ++i) { + fn.call(scope, this[i], i, this) + } + } + } + + var vendors = ['ms', 'moz', 'webkit', 'o'] + + var setAnimationFrame = window.requestAnimationFrame || false + var clearAnimationFrame = window.cancelAnimationFrame || false + + vendors.forEach(function (v) { + if (!setAnimationFrame) setAnimationFrame = window[v + 'RequestAnimationFrame'] + if (!clearAnimationFrame) + clearAnimationFrame = + window[v + 'CancelAnimationFrame'] || window[v + 'CancelRequestAnimationFrame'] + }) + + var clsMutationObserver = window.MutationObserver || window.WebKitMutationObserver || false + + var _globaloptions = { + zindex: 'auto', + cursoropacitymin: 0, + cursoropacitymax: 1, + cursorcolor: '#424242', + cursorwidth: '5px', + cursorborder: '1px solid #fff', + cursorborderradius: '5px', + scrollspeed: 60, + mousescrollstep: 8 * 3, + touchbehavior: false, + hwacceleration: true, + usetransition: true, + boxzoom: false, + dblclickzoom: true, + gesturezoom: true, + grabcursorenabled: true, + autohidemode: true, + background: '', + iframeautoresize: true, + cursorminheight: 32, + preservenativescrolling: true, + railoffset: false, + bouncescroll: true, + spacebarenabled: true, + railpadding: { top: 0, right: 0, left: 0, bottom: 0 }, + disableoutline: true, + horizrailenabled: true, + railalign: 'right', + railvalign: 'bottom', + enabletranslate3d: true, + enablemousewheel: true, + enablekeyboard: true, + smoothscroll: true, + sensitiverail: true, + enablemouselockapi: true, + // cursormaxheight:false, + cursorfixedheight: false, + directionlockdeadzone: 6, + hidecursordelay: 400, + nativeparentscrolling: true, + enablescrollonselection: true, + overflowx: true, + overflowy: true, + cursordragspeed: 0.3, + rtlmode: false, + cursordragontouch: false + } + + var browserdetected = false + + var getBrowserDetection = function () { + if (browserdetected) return browserdetected + + var domtest = document.createElement('DIV') + + var d = {} + + d.haspointerlock = + 'pointerLockElement' in document || + 'mozPointerLockElement' in document || + 'webkitPointerLockElement' in document + + d.isopera = 'opera' in window + d.isopera12 = d.isopera && 'getUserMedia' in navigator + + d.isie = 'all' in document && 'attachEvent' in domtest && !d.isopera + d.isieold = d.isie && !('msInterpolationMode' in domtest.style) // IE6 and older + d.isie7 = d.isie && !d.isieold && (!('documentMode' in document) || document.documentMode == 7) + d.isie8 = d.isie && 'documentMode' in document && document.documentMode == 8 + d.isie9 = d.isie && 'performance' in window && document.documentMode >= 9 + d.isie10 = d.isie && 'performance' in window && document.documentMode >= 10 + + d.isie9mobile = /iemobile.9/i.test(navigator.userAgent) //wp 7.1 mango + if (d.isie9mobile) d.isie9 = false + d.isie7mobile = !d.isie9mobile && d.isie7 && /iemobile/i.test(navigator.userAgent) //wp 7.0 + + d.ismozilla = 'MozAppearance' in domtest.style + + d.iswebkit = 'WebkitAppearance' in domtest.style + + d.ischrome = 'chrome' in window + d.ischrome22 = d.ischrome && d.haspointerlock + d.ischrome26 = d.ischrome && 'transition' in domtest.style // issue with transform detection (maintain prefix) + + d.cantouch = 'ontouchstart' in document.documentElement || 'ontouchstart' in window // detection for Chrome Touch Emulation + d.hasmstouch = window.navigator.msPointerEnabled || false // IE10+ pointer events + + d.ismac = /^mac$/i.test(navigator.platform) + + d.isios = d.cantouch && /iphone|ipad|ipod/i.test(navigator.platform) + d.isios4 = d.isios && !('seal' in Object) + + d.isandroid = /android/i.test(navigator.userAgent) + + d.trstyle = false + d.hastransform = false + d.hastranslate3d = false + d.transitionstyle = false + d.hastransition = false + d.transitionend = false + + var check = ['transform', 'msTransform', 'webkitTransform', 'MozTransform', 'OTransform'] + for (var a = 0; a < check.length; a++) { + if (typeof domtest.style[check[a]] != 'undefined') { + d.trstyle = check[a] + break + } + } + d.hastransform = d.trstyle != false + if (d.hastransform) { + domtest.style[d.trstyle] = 'translate3d(1px,2px,3px)' + d.hastranslate3d = /translate3d/.test(domtest.style[d.trstyle]) + } + + d.transitionstyle = false + d.prefixstyle = '' + d.transitionend = false + var check = [ + 'transition', + 'webkitTransition', + 'MozTransition', + 'OTransition', + 'OTransition', + 'msTransition', + 'KhtmlTransition' + ] + var prefix = ['', '-webkit-', '-moz-', '-o-', '-o', '-ms-', '-khtml-'] + var evs = [ + 'transitionend', + 'webkitTransitionEnd', + 'transitionend', + 'otransitionend', + 'oTransitionEnd', + 'msTransitionEnd', + 'KhtmlTransitionEnd' + ] + for (var a = 0; a < check.length; a++) { + if (check[a] in domtest.style) { + d.transitionstyle = check[a] + d.prefixstyle = prefix[a] + d.transitionend = evs[a] + break + } + } + if (d.ischrome26) { + // use always prefix + d.prefixstyle = prefix[1] + } + + d.hastransition = d.transitionstyle + + function detectCursorGrab() { + var lst = ['-moz-grab', '-webkit-grab', 'grab'] + if ((d.ischrome && !d.ischrome22) || d.isie) lst = [] // force setting for IE returns false positive and chrome cursor bug + for (var a = 0; a < lst.length; a++) { + var p = lst[a] + domtest.style['cursor'] = p + if (domtest.style['cursor'] == p) return p + } + return 'url(http://www.google.com/intl/en_ALL/mapfiles/openhand.cur),n-resize' // thank you google for custom cursor! + } + d.cursorgrabvalue = detectCursorGrab() + + d.hasmousecapture = 'setCapture' in domtest + + d.hasMutationObserver = clsMutationObserver !== false + + domtest = null //memory released + + browserdetected = d + + return d + } + + var NiceScrollClass = function (myopt, me) { + var self = this + + this.version = '3.4.0' + this.name = 'nicescroll' + + this.me = me + + this.opt = { + doc: $('body'), + win: false + } + + $.extend(this.opt, _globaloptions) + + // Options for internal use + this.opt.snapbackspeed = 80 + + if (myopt || false) { + for (var a in self.opt) { + if (typeof myopt[a] != 'undefined') self.opt[a] = myopt[a] + } + } + + this.doc = self.opt.doc + this.iddoc = this.doc && this.doc[0] ? this.doc[0].id || '' : '' + this.ispage = /BODY|HTML/.test(self.opt.win ? self.opt.win[0].nodeName : this.doc[0].nodeName) + this.haswrapper = self.opt.win !== false + this.win = self.opt.win || (this.ispage ? $(window) : this.doc) + this.docscroll = this.ispage && !this.haswrapper ? $(window) : this.win + this.body = $('body') + this.viewport = false + + this.isfixed = false + + this.iframe = false + this.isiframe = this.doc[0].nodeName == 'IFRAME' && this.win[0].nodeName == 'IFRAME' + + this.istextarea = this.win[0].nodeName == 'TEXTAREA' + + this.forcescreen = false //force to use screen position on events + + this.canshowonmouseevent = self.opt.autohidemode != 'scroll' + + // Events jump table + this.onmousedown = false + this.onmouseup = false + this.onmousemove = false + this.onmousewheel = false + this.onkeypress = false + this.ongesturezoom = false + this.onclick = false + + // Nicescroll custom events + this.onscrollstart = false + this.onscrollend = false + this.onscrollcancel = false + + this.onzoomin = false + this.onzoomout = false + + // Let's start! + this.view = false + this.page = false + + this.scroll = { x: 0, y: 0 } + this.scrollratio = { x: 0, y: 0 } + this.cursorheight = 20 + this.scrollvaluemax = 0 + + this.checkrtlmode = false + + this.scrollrunning = false + + this.scrollmom = false + + this.observer = false + this.observerremover = false // observer on parent for remove detection + + do { + this.id = 'ascrail' + ascrailcounter++ + } while (document.getElementById(this.id)) + + this.rail = false + this.cursor = false + this.cursorfreezed = false + this.selectiondrag = false + + this.zoom = false + this.zoomactive = false + + this.hasfocus = false + this.hasmousefocus = false + + this.visibility = true + this.locked = false + this.hidden = false // rails always hidden + this.cursoractive = true // user can interact with cursors + + this.overflowx = self.opt.overflowx + this.overflowy = self.opt.overflowy + + this.nativescrollingarea = false + this.checkarea = 0 + + this.events = [] // event list for unbind + + this.saved = {} + + this.delaylist = {} + this.synclist = {} + + this.lastdeltax = 0 + this.lastdeltay = 0 + + this.detected = getBrowserDetection() + + var cap = $.extend({}, this.detected) + + this.canhwscroll = cap.hastransform && self.opt.hwacceleration + this.ishwscroll = this.canhwscroll && self.haswrapper + + this.istouchcapable = false // desktop devices with touch screen support + + //## Check Chrome desktop with touch support + if (cap.cantouch && cap.ischrome && !cap.isios && !cap.isandroid) { + this.istouchcapable = true + cap.cantouch = false // parse normal desktop events + } + + //## Firefox 18 nightly build (desktop) false positive (or desktop with touch support) + if (cap.cantouch && cap.ismozilla && !cap.isios) { + this.istouchcapable = true + cap.cantouch = false // parse normal desktop events + } + + //## disable MouseLock API on user request + + if (!self.opt.enablemouselockapi) { + cap.hasmousecapture = false + cap.haspointerlock = false + } + + this.delayed = function (name, fn, tm, lazy) { + var dd = self.delaylist[name] + var nw = new Date().getTime() + if (!lazy && dd && dd.tt) return false + if (dd && dd.tt) clearTimeout(dd.tt) + if (dd && dd.last + tm > nw && !dd.tt) { + self.delaylist[name] = { + last: nw + tm, + tt: setTimeout(function () { + self.delaylist[name].tt = 0 + fn.call() + }, tm) + } + } else if (!dd || !dd.tt) { + self.delaylist[name] = { + last: nw, + tt: 0 + } + setTimeout(function () { + fn.call() + }, 0) + } + } + + this.debounced = function (name, fn, tm) { + var dd = self.delaylist[name] + var nw = new Date().getTime() + self.delaylist[name] = fn + if (!dd) { + setTimeout(function () { + var fn = self.delaylist[name] + self.delaylist[name] = false + fn.call() + }, tm) + } + } + + this.synched = function (name, fn) { + function requestSync() { + if (self.onsync) return + setAnimationFrame(function () { + self.onsync = false + for (name in self.synclist) { + var fn = self.synclist[name] + if (fn) fn.call(self) + self.synclist[name] = false + } + }) + self.onsync = true + } + + self.synclist[name] = fn + requestSync() + return name + } + + this.unsynched = function (name) { + if (self.synclist[name]) self.synclist[name] = false + } + + this.css = function (el, pars) { + // save & set + for (var n in pars) { + self.saved.css.push([el, n, el.css(n)]) + el.css(n, pars[n]) + } + } + + this.scrollTop = function (val) { + return typeof val == 'undefined' ? self.getScrollTop() : self.setScrollTop(val) + } + + this.scrollLeft = function (val) { + return typeof val == 'undefined' ? self.getScrollLeft() : self.setScrollLeft(val) + } + + // derived by by Dan Pupius www.pupius.net + BezierClass = function (st, ed, spd, p1, p2, p3, p4) { + this.st = st + this.ed = ed + this.spd = spd + + this.p1 = p1 || 0 + this.p2 = p2 || 1 + this.p3 = p3 || 0 + this.p4 = p4 || 1 + + this.ts = new Date().getTime() + this.df = this.ed - this.st + } + BezierClass.prototype = { + B2: function (t) { + return 3 * t * t * (1 - t) + }, + B3: function (t) { + return 3 * t * (1 - t) * (1 - t) + }, + B4: function (t) { + return (1 - t) * (1 - t) * (1 - t) + }, + getNow: function () { + var nw = new Date().getTime() + var pc = 1 - (nw - this.ts) / this.spd + var bz = this.B2(pc) + this.B3(pc) + this.B4(pc) + return pc < 0 ? this.ed : this.st + Math.round(this.df * bz) + }, + update: function (ed, spd) { + this.st = this.getNow() + this.ed = ed + this.spd = spd + this.ts = new Date().getTime() + this.df = this.ed - this.st + return this + } + } + + if (this.ishwscroll) { + // hw accelerated scroll + this.doc.translate = { x: 0, y: 0, tx: '0px', ty: '0px' } + + //this one can help to enable hw accel on ios6 http://indiegamr.com/ios6-html-hardware-acceleration-changes-and-how-to-fix-them/ + if (cap.hastranslate3d && cap.isios) this.doc.css('-webkit-backface-visibility', 'hidden') // prevent flickering http://stackoverflow.com/questions/3461441/ + + //derived from http://stackoverflow.com/questions/11236090/ + function getMatrixValues() { + var tr = self.doc.css(cap.trstyle) + if (tr && tr.substr(0, 6) == 'matrix') { + return tr + .replace(/^.*\((.*)\)$/g, '$1') + .replace(/px/g, '') + .split(/, +/) + } + return false + } + + this.getScrollTop = function (last) { + if (!last) { + var mtx = getMatrixValues() + if (mtx) return mtx.length == 16 ? -mtx[13] : -mtx[5] //matrix3d 16 on IE10 + if (self.timerscroll && self.timerscroll.bz) return self.timerscroll.bz.getNow() + } + return self.doc.translate.y + } + + this.getScrollLeft = function (last) { + if (!last) { + var mtx = getMatrixValues() + if (mtx) return mtx.length == 16 ? -mtx[12] : -mtx[4] //matrix3d 16 on IE10 + if (self.timerscroll && self.timerscroll.bh) return self.timerscroll.bh.getNow() + } + return self.doc.translate.x + } + + if (document.createEvent) { + this.notifyScrollEvent = function (el) { + var e = document.createEvent('UIEvents') + e.initUIEvent('scroll', false, true, window, 1) + el.dispatchEvent(e) + } + } else if (document.fireEvent) { + this.notifyScrollEvent = function (el) { + var e = document.createEventObject() + el.fireEvent('onscroll') + e.cancelBubble = true + } + } else { + this.notifyScrollEvent = function (el, add) {} //NOPE + } + + if (cap.hastranslate3d && self.opt.enabletranslate3d) { + this.setScrollTop = function (val, silent) { + self.doc.translate.y = val + self.doc.translate.ty = val * -1 + 'px' + self.doc.css( + cap.trstyle, + 'translate3d(' + self.doc.translate.tx + ',' + self.doc.translate.ty + ',0px)' + ) + if (!silent) self.notifyScrollEvent(self.win[0]) + } + this.setScrollLeft = function (val, silent) { + self.doc.translate.x = val + self.doc.translate.tx = val * -1 + 'px' + self.doc.css( + cap.trstyle, + 'translate3d(' + self.doc.translate.tx + ',' + self.doc.translate.ty + ',0px)' + ) + if (!silent) self.notifyScrollEvent(self.win[0]) + } + } else { + this.setScrollTop = function (val, silent) { + self.doc.translate.y = val + self.doc.translate.ty = val * -1 + 'px' + self.doc.css( + cap.trstyle, + 'translate(' + self.doc.translate.tx + ',' + self.doc.translate.ty + ')' + ) + if (!silent) self.notifyScrollEvent(self.win[0]) + } + this.setScrollLeft = function (val, silent) { + self.doc.translate.x = val + self.doc.translate.tx = val * -1 + 'px' + self.doc.css( + cap.trstyle, + 'translate(' + self.doc.translate.tx + ',' + self.doc.translate.ty + ')' + ) + if (!silent) self.notifyScrollEvent(self.win[0]) + } + } + } else { + // native scroll + this.getScrollTop = function () { + return self.docscroll.scrollTop() + } + this.setScrollTop = function (val) { + return self.docscroll.scrollTop(val) + } + this.getScrollLeft = function () { + return self.docscroll.scrollLeft() + } + this.setScrollLeft = function (val) { + return self.docscroll.scrollLeft(val) + } + } + + this.getTarget = function (e) { + if (!e) return false + if (e.target) return e.target + if (e.srcElement) return e.srcElement + return false + } + + this.hasParent = function (e, id) { + if (!e) return false + var el = e.target || e.srcElement || e || false + while (el && el.id != id) { + el = el.parentNode || false + } + return el !== false + } + + function getZIndex() { + var dom = self.win + if ('zIndex' in dom) return dom.zIndex() // use jQuery UI method when available + while (dom.length > 0) { + if (dom[0].nodeType == 9) return false + var zi = dom.css('zIndex') + if (!isNaN(zi) && zi != 0) return parseInt(zi) + dom = dom.parent() + } + return false + } + + //inspired by http://forum.jquery.com/topic/width-includes-border-width-when-set-to-thin-medium-thick-in-ie + var _convertBorderWidth = { thin: 1, medium: 3, thick: 5 } + function getWidthToPixel(dom, prop, chkheight) { + var wd = dom.css(prop) + var px = parseFloat(wd) + if (isNaN(px)) { + px = _convertBorderWidth[wd] || 0 + var brd = + px == 3 + ? chkheight + ? self.win.outerHeight() - self.win.innerHeight() + : self.win.outerWidth() - self.win.innerWidth() + : 1 //DON'T TRUST CSS + if (self.isie8 && px) px += 1 + return brd ? px : 0 + } + return px + } + + this.getOffset = function () { + if (self.isfixed) + return { top: parseFloat(self.win.css('top')), left: parseFloat(self.win.css('left')) } + if (!self.viewport) return self.win.offset() + var ww = self.win.offset() + var vp = self.viewport.offset() + return { + top: ww.top - vp.top + self.viewport.scrollTop(), + left: ww.left - vp.left + self.viewport.scrollLeft() + } + } + + this.updateScrollBar = function (len) { + if (self.ishwscroll) { + self.rail.css({ height: self.win.innerHeight() }) + if (self.railh) self.railh.css({ width: self.win.innerWidth() }) + } else { + var wpos = self.getOffset() + var pos = { top: wpos.top, left: wpos.left } + pos.top += getWidthToPixel(self.win, 'border-top-width', true) + var brd = (self.win.outerWidth() - self.win.innerWidth()) / 2 + pos.left += self.rail.align + ? self.win.outerWidth() - + getWidthToPixel(self.win, 'border-right-width') - + self.rail.width + : getWidthToPixel(self.win, 'border-left-width') + + var off = self.opt.railoffset + if (off) { + if (off.top) pos.top += off.top + if (self.rail.align && off.left) pos.left += off.left + } + + if (!self.locked) + self.rail.css({ + top: pos.top, + left: pos.left, + height: len ? len.h : self.win.innerHeight() + }) + + if (self.zoom) { + self.zoom.css({ + top: pos.top + 1, + left: self.rail.align == 1 ? pos.left - 20 : pos.left + self.rail.width + 4 + }) + } + + if (self.railh && !self.locked) { + var pos = { top: wpos.top, left: wpos.left } + var y = self.railh.align + ? pos.top + + getWidthToPixel(self.win, 'border-top-width', true) + + self.win.innerHeight() - + self.railh.height + : pos.top + getWidthToPixel(self.win, 'border-top-width', true) + var x = pos.left + getWidthToPixel(self.win, 'border-left-width') + self.railh.css({ top: y, left: x, width: self.railh.width }) + } + } + } + + this.doRailClick = function (e, dbl, hr) { + var fn, pg, cur, pos + + // if (self.rail.drag&&self.rail.drag.pt!=1) return; + if (self.locked) return + // if (self.rail.drag) return; + + // self.cancelScroll(); + + self.cancelEvent(e) + + if (dbl) { + fn = hr ? self.doScrollLeft : self.doScrollTop + cur = hr + ? (e.pageX - self.railh.offset().left - self.cursorwidth / 2) * self.scrollratio.x + : (e.pageY - self.rail.offset().top - self.cursorheight / 2) * self.scrollratio.y + fn(cur) + } else { + // console.log(e.pageY); + fn = hr ? self.doScrollLeftBy : self.doScrollBy + cur = hr ? self.scroll.x : self.scroll.y + pos = hr ? e.pageX - self.railh.offset().left : e.pageY - self.rail.offset().top + pg = hr ? self.view.w : self.view.h + cur >= pos ? fn(pg) : fn(-pg) + } + } + + self.hasanimationframe = setAnimationFrame + self.hascancelanimationframe = clearAnimationFrame + + if (!self.hasanimationframe) { + setAnimationFrame = function (fn) { + return setTimeout(fn, 15 - (Math.floor(+new Date() / 1000) % 16)) + } // 1000/60)}; + clearAnimationFrame = clearInterval + } else if (!self.hascancelanimationframe) + clearAnimationFrame = function () { + self.cancelAnimationFrame = true + } + + this.init = function () { + self.saved.css = [] + + if (cap.isie7mobile) return true // SORRY, DO NOT WORK! + + if (cap.hasmstouch) + self.css(self.ispage ? $('html') : self.win, { '-ms-touch-action': 'none' }) + + self.zindex = 'auto' + if (!self.ispage && self.opt.zindex == 'auto') { + self.zindex = getZIndex() || 'auto' + } else { + self.zindex = self.opt.zindex + } + + if (!self.ispage && self.zindex != 'auto') { + if (self.zindex > globalmaxzindex) globalmaxzindex = self.zindex + } + + if (self.isie && self.zindex == 0 && self.opt.zindex == 'auto') { + // fix IE auto == 0 + self.zindex = 'auto' + } + + /* + self.ispage = true; + self.haswrapper = true; +// self.win = $(window); + self.docscroll = $("body"); +// self.doc = $("body"); +*/ + + if (!self.ispage || (!cap.cantouch && !cap.isieold && !cap.isie9mobile)) { + var cont = self.docscroll + if (self.ispage) cont = self.haswrapper ? self.win : self.doc + + if (!cap.isie9mobile) self.css(cont, { 'overflow-y': 'hidden' }) + + if (self.ispage && cap.isie7) { + if (self.doc[0].nodeName == 'BODY') + self.css($('html'), { 'overflow-y': 'hidden' }) //IE7 double scrollbar issue + else if (self.doc[0].nodeName == 'HTML') self.css($('body'), { 'overflow-y': 'hidden' }) //IE7 double scrollbar issue + } + + if (cap.isios && !self.ispage && !self.haswrapper) + self.css($('body'), { '-webkit-overflow-scrolling': 'touch' }) //force hw acceleration + + var cursor = $(document.createElement('div')) + cursor.css({ + position: 'relative', + top: 0, + float: 'right', + width: self.opt.cursorwidth, + height: '0px', + 'background-color': self.opt.cursorcolor, + border: self.opt.cursorborder, + 'background-clip': 'padding-box', + '-webkit-border-radius': self.opt.cursorborderradius, + '-moz-border-radius': self.opt.cursorborderradius, + 'border-radius': self.opt.cursorborderradius + }) + + cursor.hborder = parseFloat(cursor.outerHeight() - cursor.innerHeight()) + self.cursor = cursor + + var rail = $(document.createElement('div')) + rail.attr('id', self.id) + rail.addClass('nicescroll-rails') + + var v, + a, + kp = ['left', 'right'] //"top","bottom" + for (var n in kp) { + a = kp[n] + v = self.opt.railpadding[a] + v ? rail.css('padding-' + a, v + 'px') : (self.opt.railpadding[a] = 0) + } + + rail.append(cursor) + + rail.width = + Math.max(parseFloat(self.opt.cursorwidth), cursor.outerWidth()) + + self.opt.railpadding['left'] + + self.opt.railpadding['right'] + rail.css({ + width: rail.width + 'px', + zIndex: self.zindex, + background: self.opt.background, + cursor: 'default' + }) + + rail.visibility = true + rail.scrollable = true + + rail.align = self.opt.railalign == 'left' ? 0 : 1 + + self.rail = rail + + self.rail.drag = false + + var zoom = false + if (self.opt.boxzoom && !self.ispage && !cap.isieold) { + zoom = document.createElement('div') + self.bind(zoom, 'click', self.doZoom) + self.zoom = $(zoom) + self.zoom.css({ + cursor: 'pointer', + 'z-index': self.zindex, + backgroundImage: 'url(' + scriptpath + 'zoomico.png)', + height: 18, + width: 18, + backgroundPosition: '0px 0px' + }) + if (self.opt.dblclickzoom) self.bind(self.win, 'dblclick', self.doZoom) + if (cap.cantouch && self.opt.gesturezoom) { + self.ongesturezoom = function (e) { + if (e.scale > 1.5) self.doZoomIn(e) + if (e.scale < 0.8) self.doZoomOut(e) + return self.cancelEvent(e) + } + self.bind(self.win, 'gestureend', self.ongesturezoom) + } + } + + // init HORIZ + + self.railh = false + + if (self.opt.horizrailenabled) { + self.css(cont, { 'overflow-x': 'hidden' }) + + var cursor = $(document.createElement('div')) + cursor.css({ + position: 'relative', + top: 0, + height: self.opt.cursorwidth, + width: '0px', + 'background-color': self.opt.cursorcolor, + border: self.opt.cursorborder, + 'background-clip': 'padding-box', + '-webkit-border-radius': self.opt.cursorborderradius, + '-moz-border-radius': self.opt.cursorborderradius, + 'border-radius': self.opt.cursorborderradius + }) + + cursor.wborder = parseFloat(cursor.outerWidth() - cursor.innerWidth()) + self.cursorh = cursor + + var railh = $(document.createElement('div')) + railh.attr('id', self.id + '-hr') + railh.addClass('nicescroll-rails') + railh.height = Math.max(parseFloat(self.opt.cursorwidth), cursor.outerHeight()) + railh.css({ + height: railh.height + 'px', + zIndex: self.zindex, + background: self.opt.background + }) + + railh.append(cursor) + + railh.visibility = true + railh.scrollable = true + + railh.align = self.opt.railvalign == 'top' ? 0 : 1 + + self.railh = railh + + self.railh.drag = false + } + + // + + if (self.ispage) { + rail.css({ position: 'fixed', top: '0px', height: '100%' }) + rail.align ? rail.css({ right: '0px' }) : rail.css({ left: '0px' }) + self.body.append(rail) + if (self.railh) { + railh.css({ position: 'fixed', left: '0px', width: '100%' }) + railh.align ? railh.css({ bottom: '0px' }) : railh.css({ top: '0px' }) + self.body.append(railh) + } + } else { + if (self.ishwscroll) { + if (self.win.css('position') == 'static') self.css(self.win, { position: 'relative' }) + var bd = self.win[0].nodeName == 'HTML' ? self.body : self.win + if (self.zoom) { + self.zoom.css({ + position: 'absolute', + top: 1, + right: 0, + 'margin-right': rail.width + 4 + }) + bd.append(self.zoom) + } + rail.css({ position: 'absolute', top: 0 }) + rail.align ? rail.css({ right: 0 }) : rail.css({ left: 0 }) + bd.append(rail) + if (railh) { + railh.css({ position: 'absolute', left: 0, bottom: 0 }) + railh.align ? railh.css({ bottom: 0 }) : railh.css({ top: 0 }) + bd.append(railh) + } + } else { + self.isfixed = self.win.css('position') == 'fixed' + var rlpos = self.isfixed ? 'fixed' : 'absolute' + + if (!self.isfixed) self.viewport = self.getViewport(self.win[0]) + if (self.viewport) { + self.body = self.viewport + if (/relative|absolute/.test(self.viewport.css('position')) == false) + self.css(self.viewport, { position: 'relative' }) + } + + rail.css({ position: rlpos }) + if (self.zoom) self.zoom.css({ position: rlpos }) + self.updateScrollBar() + self.body.append(rail) + if (self.zoom) self.body.append(self.zoom) + if (self.railh) { + railh.css({ position: rlpos }) + self.body.append(railh) + } + } + + if (cap.isios) + self.css(self.win, { + '-webkit-tap-highlight-color': 'rgba(0,0,0,0)', + '-webkit-touch-callout': 'none' + }) // prevent grey layer on click + + if (cap.isie && self.opt.disableoutline) self.win.attr('hideFocus', 'true') // IE, prevent dotted rectangle on focused div + if (cap.iswebkit && self.opt.disableoutline) self.win.css({ outline: 'none' }) + } + + if (self.opt.autohidemode === false) { + self.autohidedom = false + self.rail.css({ opacity: self.opt.cursoropacitymax }) + if (self.railh) self.railh.css({ opacity: self.opt.cursoropacitymax }) + } else if (self.opt.autohidemode === true) { + self.autohidedom = $().add(self.rail) + if (cap.isie8) self.autohidedom = self.autohidedom.add(self.cursor) + if (self.railh) self.autohidedom = self.autohidedom.add(self.railh) + if (self.railh && cap.isie8) self.autohidedom = self.autohidedom.add(self.cursorh) + } else if (self.opt.autohidemode == 'scroll') { + self.autohidedom = $().add(self.rail) + if (self.railh) self.autohidedom = self.autohidedom.add(self.railh) + } else if (self.opt.autohidemode == 'cursor') { + self.autohidedom = $().add(self.cursor) + if (self.railh) self.autohidedom = self.autohidedom.add(self.cursorh) + } else if (self.opt.autohidemode == 'hidden') { + self.autohidedom = false + self.hide() + self.locked = false + } + + if (cap.isie9mobile) { + self.scrollmom = new ScrollMomentumClass2D(self) + + /* + var trace = function(msg) { + var db = $("#debug"); + if (isNaN(msg)&&(typeof msg != "string")) { + var x = []; + for(var a in msg) { + x.push(a+":"+msg[a]); + } + msg ="{"+x.join(",")+"}"; + } + if (db.children().length>0) { + db.children().eq(0).before("<div>"+msg+"</div>"); + } else { + db.append("<div>"+msg+"</div>"); + } + } + window.onerror = function(msg,url,ln) { + trace("ERR: "+msg+" at "+ln); + } +*/ + + self.onmangotouch = function (e) { + var py = self.getScrollTop() + var px = self.getScrollLeft() + + if (py == self.scrollmom.lastscrolly && px == self.scrollmom.lastscrollx) return true + // $("#debug").html('DRAG:'+py); + + var dfy = py - self.mangotouch.sy + var dfx = px - self.mangotouch.sx + var df = Math.round(Math.sqrt(Math.pow(dfx, 2) + Math.pow(dfy, 2))) + if (df == 0) return + + var dry = dfy < 0 ? -1 : 1 + var drx = dfx < 0 ? -1 : 1 + + var tm = +new Date() + if (self.mangotouch.lazy) clearTimeout(self.mangotouch.lazy) + + if ( + tm - self.mangotouch.tm > 80 || + self.mangotouch.dry != dry || + self.mangotouch.drx != drx + ) { + // trace('RESET+'+(tm-self.mangotouch.tm)); + self.scrollmom.stop() + self.scrollmom.reset(px, py) + self.mangotouch.sy = py + self.mangotouch.ly = py + self.mangotouch.sx = px + self.mangotouch.lx = px + self.mangotouch.dry = dry + self.mangotouch.drx = drx + self.mangotouch.tm = tm + } else { + self.scrollmom.stop() + self.scrollmom.update(self.mangotouch.sx - dfx, self.mangotouch.sy - dfy) + var gap = tm - self.mangotouch.tm + self.mangotouch.tm = tm + + // trace('MOVE:'+df+" - "+gap); + + var ds = Math.max( + Math.abs(self.mangotouch.ly - py), + Math.abs(self.mangotouch.lx - px) + ) + self.mangotouch.ly = py + self.mangotouch.lx = px + + if (ds > 2) { + self.mangotouch.lazy = setTimeout(function () { + // trace('END:'+ds+'+'+gap); + self.mangotouch.lazy = false + self.mangotouch.dry = 0 + self.mangotouch.drx = 0 + self.mangotouch.tm = 0 + self.scrollmom.doMomentum(30) + }, 100) + } + } + } + + var top = self.getScrollTop() + var lef = self.getScrollLeft() + self.mangotouch = { + sy: top, + ly: top, + dry: 0, + sx: lef, + lx: lef, + drx: 0, + lazy: false, + tm: 0 + } + + self.bind(self.docscroll, 'scroll', self.onmangotouch) + } else { + if (cap.cantouch || self.istouchcapable || self.opt.touchbehavior || cap.hasmstouch) { + self.scrollmom = new ScrollMomentumClass2D(self) + + self.ontouchstart = function (e) { + if (e.pointerType && e.pointerType != 2) return false + + if (!self.locked) { + if (cap.hasmstouch) { + var tg = e.target ? e.target : false + while (tg) { + var nc = $(tg).getNiceScroll() + if (nc.length > 0 && nc[0].me == self.me) break + if (nc.length > 0) return false + if (tg.nodeName == 'DIV' && tg.id == self.id) break + tg = tg.parentNode ? tg.parentNode : false + } + } + + self.cancelScroll() + + var tg = self.getTarget(e) + + if (tg) { + var skp = /INPUT/i.test(tg.nodeName) && /range/i.test(tg.type) + if (skp) return self.stopPropagation(e) + } + + if (!('clientX' in e) && 'changedTouches' in e) { + e.clientX = e.changedTouches[0].clientX + e.clientY = e.changedTouches[0].clientY + } + + if (self.forcescreen) { + var le = e + var e = { original: e.original ? e.original : e } + e.clientX = le.screenX + e.clientY = le.screenY + } + + self.rail.drag = { + x: e.clientX, + y: e.clientY, + sx: self.scroll.x, + sy: self.scroll.y, + st: self.getScrollTop(), + sl: self.getScrollLeft(), + pt: 2, + dl: false + } + + if (self.ispage || !self.opt.directionlockdeadzone) { + self.rail.drag.dl = 'f' + } else { + var view = { + w: $(window).width(), + h: $(window).height() + } + + var page = { + w: Math.max(document.body.scrollWidth, document.documentElement.scrollWidth), + h: Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) + } + + var maxh = Math.max(0, page.h - view.h) + var maxw = Math.max(0, page.w - view.w) + + if (!self.rail.scrollable && self.railh.scrollable) + self.rail.drag.ck = maxh > 0 ? 'v' : false + else if (self.rail.scrollable && !self.railh.scrollable) + self.rail.drag.ck = maxw > 0 ? 'h' : false + else self.rail.drag.ck = false + if (!self.rail.drag.ck) self.rail.drag.dl = 'f' + } + + if (self.opt.touchbehavior && self.isiframe && cap.isie) { + var wp = self.win.position() + self.rail.drag.x += wp.left + self.rail.drag.y += wp.top + } + + self.hasmoving = false + self.lastmouseup = false + self.scrollmom.reset(e.clientX, e.clientY) + if (!cap.cantouch && !this.istouchcapable && !cap.hasmstouch) { + var ip = tg ? /INPUT|SELECT|TEXTAREA/i.test(tg.nodeName) : false + if (!ip) { + if (!self.ispage && cap.hasmousecapture) tg.setCapture() + return self.cancelEvent(e) + } + if (/SUBMIT|CANCEL|BUTTON/i.test($(tg).attr('type'))) { + pc = { tg: tg, click: false } + self.preventclick = pc + } + } + } + } + + self.ontouchend = function (e) { + if (e.pointerType && e.pointerType != 2) return false + if (self.rail.drag && self.rail.drag.pt == 2) { + self.scrollmom.doMomentum() + self.rail.drag = false + if (self.hasmoving) { + self.hasmoving = false + self.lastmouseup = true + self.hideCursor() + if (cap.hasmousecapture) document.releaseCapture() + if (!cap.cantouch) return self.cancelEvent(e) + } + } + } + + var moveneedoffset = self.opt.touchbehavior && self.isiframe && !cap.hasmousecapture + + self.ontouchmove = function (e, byiframe) { + if (e.pointerType && e.pointerType != 2) return false + + if (self.rail.drag && self.rail.drag.pt == 2) { + if (cap.cantouch && typeof e.original == 'undefined') return true // prevent ios "ghost" events by clickable elements + + self.hasmoving = true + + if (self.preventclick && !self.preventclick.click) { + self.preventclick.click = self.preventclick.tg.onclick || false + self.preventclick.tg.onclick = self.onpreventclick + } + + var ev = $.extend({ original: e }, e) + e = ev + + if ('changedTouches' in e) { + e.clientX = e.changedTouches[0].clientX + e.clientY = e.changedTouches[0].clientY + } + + if (self.forcescreen) { + var le = e + var e = { original: e.original ? e.original : e } + e.clientX = le.screenX + e.clientY = le.screenY + } + + var ofx = (ofy = 0) + + if (moveneedoffset && !byiframe) { + var wp = self.win.position() + ofx = -wp.left + ofy = -wp.top + } + + var fy = e.clientY + ofy + var my = fy - self.rail.drag.y + var fx = e.clientX + ofx + var mx = fx - self.rail.drag.x + + var ny = self.rail.drag.st - my + + if (self.ishwscroll && self.opt.bouncescroll) { + if (ny < 0) { + ny = Math.round(ny / 2) + // fy = 0; + } else if (ny > self.page.maxh) { + ny = self.page.maxh + Math.round((ny - self.page.maxh) / 2) + // fy = 0; + } + } else { + if (ny < 0) { + ny = 0 + fy = 0 + } + if (ny > self.page.maxh) { + ny = self.page.maxh + fy = 0 + } + } + + if (self.railh && self.railh.scrollable) { + var nx = self.rail.drag.sl - mx + + if (self.ishwscroll && self.opt.bouncescroll) { + if (nx < 0) { + nx = Math.round(nx / 2) + // fx = 0; + } else if (nx > self.page.maxw) { + nx = self.page.maxw + Math.round((nx - self.page.maxw) / 2) + // fx = 0; + } + } else { + if (nx < 0) { + nx = 0 + fx = 0 + } + if (nx > self.page.maxw) { + nx = self.page.maxw + fx = 0 + } + } + } + + var grabbed = false + if (self.rail.drag.dl) { + grabbed = true + if (self.rail.drag.dl == 'v') nx = self.rail.drag.sl + else if (self.rail.drag.dl == 'h') ny = self.rail.drag.st + } else { + var ay = Math.abs(my) + var ax = Math.abs(mx) + var dz = self.opt.directionlockdeadzone + if (self.rail.drag.ck == 'v') { + if (ay > dz && ax <= ay * 0.3) { + self.rail.drag = false + return true + } else if (ax > dz) { + self.rail.drag.dl = 'f' + $('body').scrollTop($('body').scrollTop()) // stop iOS native scrolling (when active javascript has blocked) + } + } else if (self.rail.drag.ck == 'h') { + if (ax > dz && ay <= az * 0.3) { + self.rail.drag = false + return true + } else if (ay > dz) { + self.rail.drag.dl = 'f' + $('body').scrollLeft($('body').scrollLeft()) // stop iOS native scrolling (when active javascript has blocked) + } + } + } + + self.synched('touchmove', function () { + if (self.rail.drag && self.rail.drag.pt == 2) { + if (self.prepareTransition) self.prepareTransition(0) + if (self.rail.scrollable) self.setScrollTop(ny) + self.scrollmom.update(fx, fy) + if (self.railh && self.railh.scrollable) { + self.setScrollLeft(nx) + self.showCursor(ny, nx) + } else { + self.showCursor(ny) + } + if (cap.isie10) document.selection.clear() + } + }) + + if (cap.ischrome && self.istouchcapable) grabbed = false //chrome touch emulation doesn't like! + if (grabbed) return self.cancelEvent(e) + } + } + } + + self.onmousedown = function (e, hronly) { + if (self.rail.drag && self.rail.drag.pt != 1) return + if (self.locked) return self.cancelEvent(e) + self.cancelScroll() + self.rail.drag = { + x: e.clientX, + y: e.clientY, + sx: self.scroll.x, + sy: self.scroll.y, + pt: 1, + hr: !!hronly + } + var tg = self.getTarget(e) + if (!self.ispage && cap.hasmousecapture) tg.setCapture() + if (self.isiframe && !cap.hasmousecapture) { + self.saved['csspointerevents'] = self.doc.css('pointer-events') + self.css(self.doc, { 'pointer-events': 'none' }) + } + return self.cancelEvent(e) + } + + self.onmouseup = function (e) { + if (self.rail.drag) { + if (cap.hasmousecapture) document.releaseCapture() + if (self.isiframe && !cap.hasmousecapture) + self.doc.css('pointer-events', self.saved['csspointerevents']) + if (self.rail.drag.pt != 1) return + self.rail.drag = false + //if (!self.rail.active) self.hideCursor(); + return self.cancelEvent(e) + } + } + + self.onmousemove = function (e) { + if (self.rail.drag) { + if (self.rail.drag.pt != 1) return + + if (cap.ischrome && e.which == 0) return self.onmouseup(e) + + self.cursorfreezed = true + + if (self.rail.drag.hr) { + self.scroll.x = self.rail.drag.sx + (e.clientX - self.rail.drag.x) + if (self.scroll.x < 0) self.scroll.x = 0 + var mw = self.scrollvaluemaxw + if (self.scroll.x > mw) self.scroll.x = mw + } else { + self.scroll.y = self.rail.drag.sy + (e.clientY - self.rail.drag.y) + if (self.scroll.y < 0) self.scroll.y = 0 + var my = self.scrollvaluemax + if (self.scroll.y > my) self.scroll.y = my + } + + self.synched('mousemove', function () { + if (self.rail.drag && self.rail.drag.pt == 1) { + self.showCursor() + if (self.rail.drag.hr) + self.doScrollLeft( + Math.round(self.scroll.x * self.scrollratio.x), + self.opt.cursordragspeed + ) + else + self.doScrollTop( + Math.round(self.scroll.y * self.scrollratio.y), + self.opt.cursordragspeed + ) + } + }) + + return self.cancelEvent(e) + } + /* + else { + self.checkarea = true; + } +*/ + } + + if (cap.cantouch || self.opt.touchbehavior) { + self.onpreventclick = function (e) { + if (self.preventclick) { + self.preventclick.tg.onclick = self.preventclick.click + self.preventclick = false + return self.cancelEvent(e) + } + } + + // self.onmousedown = self.ontouchstart; + // self.onmouseup = self.ontouchend; + // self.onmousemove = self.ontouchmove; + + self.bind(self.win, 'mousedown', self.ontouchstart) // control content dragging + + self.onclick = cap.isios + ? false + : function (e) { + if (self.lastmouseup) { + self.lastmouseup = false + return self.cancelEvent(e) + } else { + return true + } + } + + if (self.opt.grabcursorenabled && cap.cursorgrabvalue) { + self.css(self.ispage ? self.doc : self.win, { cursor: cap.cursorgrabvalue }) + self.css(self.rail, { cursor: cap.cursorgrabvalue }) + } + } else { + function checkSelectionScroll(e) { + if (!self.selectiondrag) return + + if (e) { + var ww = self.win.outerHeight() + var df = e.pageY - self.selectiondrag.top + if (df > 0 && df < ww) df = 0 + if (df >= ww) df -= ww + self.selectiondrag.df = df + } + if (self.selectiondrag.df == 0) return + + var rt = -Math.floor(self.selectiondrag.df / 6) * 2 + // self.doScrollTop(self.getScrollTop(true)+rt); + self.doScrollBy(rt) + + self.debounced( + 'doselectionscroll', + function () { + checkSelectionScroll() + }, + 50 + ) + } + + if ('getSelection' in document) { + // A grade - Major browsers + self.hasTextSelected = function () { + return document.getSelection().rangeCount > 0 + } + } else if ('selection' in document) { + //IE9- + self.hasTextSelected = function () { + return document.selection.type != 'None' + } + } else { + self.hasTextSelected = function () { + // no support + return false + } + } + + self.onselectionstart = function (e) { + if (self.ispage) return + self.selectiondrag = self.win.offset() + } + self.onselectionend = function (e) { + self.selectiondrag = false + } + self.onselectiondrag = function (e) { + if (!self.selectiondrag) return + if (self.hasTextSelected()) + self.debounced( + 'selectionscroll', + function () { + checkSelectionScroll(e) + }, + 250 + ) + } + } + + if (cap.hasmstouch) { + self.css(self.rail, { '-ms-touch-action': 'none' }) + self.css(self.cursor, { '-ms-touch-action': 'none' }) + + self.bind(self.win, 'MSPointerDown', self.ontouchstart) + self.bind(document, 'MSPointerUp', self.ontouchend) + self.bind(document, 'MSPointerMove', self.ontouchmove) + self.bind(self.cursor, 'MSGestureHold', function (e) { + e.preventDefault() + }) + self.bind(self.cursor, 'contextmenu', function (e) { + e.preventDefault() + }) + } + + if (this.istouchcapable) { + //desktop with screen touch enabled + self.bind(self.win, 'touchstart', self.ontouchstart) + self.bind(document, 'touchend', self.ontouchend) + self.bind(document, 'touchcancel', self.ontouchend) + self.bind(document, 'touchmove', self.ontouchmove) + } + + self.bind(self.cursor, 'mousedown', self.onmousedown) + self.bind(self.cursor, 'mouseup', self.onmouseup) + + if (self.railh) { + self.bind(self.cursorh, 'mousedown', function (e) { + self.onmousedown(e, true) + }) + self.bind(self.cursorh, 'mouseup', function (e) { + if (self.rail.drag && self.rail.drag.pt == 2) return + self.rail.drag = false + self.hasmoving = false + self.hideCursor() + if (cap.hasmousecapture) document.releaseCapture() + return self.cancelEvent(e) + }) + } + + if (self.opt.cursordragontouch || (!cap.cantouch && !self.opt.touchbehavior)) { + self.rail.css({ cursor: 'default' }) + self.railh && self.railh.css({ cursor: 'default' }) + + self.jqbind(self.rail, 'mouseenter', function () { + if (self.canshowonmouseevent) self.showCursor() + self.rail.active = true + }) + self.jqbind(self.rail, 'mouseleave', function () { + self.rail.active = false + if (!self.rail.drag) self.hideCursor() + }) + + if (self.opt.sensitiverail) { + self.bind(self.rail, 'click', function (e) { + self.doRailClick(e, false, false) + }) + self.bind(self.rail, 'dblclick', function (e) { + self.doRailClick(e, true, false) + }) + self.bind(self.cursor, 'click', function (e) { + self.cancelEvent(e) + }) + self.bind(self.cursor, 'dblclick', function (e) { + self.cancelEvent(e) + }) + } + + if (self.railh) { + self.jqbind(self.railh, 'mouseenter', function () { + if (self.canshowonmouseevent) self.showCursor() + self.rail.active = true + }) + self.jqbind(self.railh, 'mouseleave', function () { + self.rail.active = false + if (!self.rail.drag) self.hideCursor() + }) + + if (self.opt.sensitiverail) { + self.bind(self.railh, 'click', function (e) { + self.doRailClick(e, false, true) + }) + self.bind(self.railh, 'dblclick', function (e) { + self.doRailClick(e, true, true) + }) + self.bind(self.cursorh, 'click', function (e) { + self.cancelEvent(e) + }) + self.bind(self.cursorh, 'dblclick', function (e) { + self.cancelEvent(e) + }) + } + } + } + + if (!cap.cantouch && !self.opt.touchbehavior) { + self.bind(cap.hasmousecapture ? self.win : document, 'mouseup', self.onmouseup) + self.bind(document, 'mousemove', self.onmousemove) + if (self.onclick) self.bind(document, 'click', self.onclick) + + if (!self.ispage && self.opt.enablescrollonselection) { + self.bind(self.win[0], 'mousedown', self.onselectionstart) + self.bind(document, 'mouseup', self.onselectionend) + self.bind(self.cursor, 'mouseup', self.onselectionend) + if (self.cursorh) self.bind(self.cursorh, 'mouseup', self.onselectionend) + self.bind(document, 'mousemove', self.onselectiondrag) + } + + if (self.zoom) { + self.jqbind(self.zoom, 'mouseenter', function () { + if (self.canshowonmouseevent) self.showCursor() + self.rail.active = true + }) + self.jqbind(self.zoom, 'mouseleave', function () { + self.rail.active = false + if (!self.rail.drag) self.hideCursor() + }) + } + } else { + self.bind(cap.hasmousecapture ? self.win : document, 'mouseup', self.ontouchend) + self.bind(document, 'mousemove', self.ontouchmove) + if (self.onclick) self.bind(document, 'click', self.onclick) + + if (self.opt.cursordragontouch) { + self.bind(self.cursor, 'mousedown', self.onmousedown) + self.bind(self.cursor, 'mousemove', self.onmousemove) + self.cursorh && self.bind(self.cursorh, 'mousedown', self.onmousedown) + self.cursorh && self.bind(self.cursorh, 'mousemove', self.onmousemove) + } + } + + if (self.opt.enablemousewheel) { + if (!self.isiframe) + self.bind( + cap.isie && self.ispage ? document : self.docscroll, + 'mousewheel', + self.onmousewheel + ) + self.bind(self.rail, 'mousewheel', self.onmousewheel) + if (self.railh) self.bind(self.railh, 'mousewheel', self.onmousewheelhr) + } + + if (!self.ispage && !cap.cantouch && !/HTML|BODY/.test(self.win[0].nodeName)) { + if (!self.win.attr('tabindex')) self.win.attr({ tabindex: tabindexcounter++ }) + + self.jqbind(self.win, 'focus', function (e) { + domfocus = self.getTarget(e).id || true + self.hasfocus = true + if (self.canshowonmouseevent) self.noticeCursor() + }) + self.jqbind(self.win, 'blur', function (e) { + domfocus = false + self.hasfocus = false + }) + + self.jqbind(self.win, 'mouseenter', function (e) { + mousefocus = self.getTarget(e).id || true + self.hasmousefocus = true + if (self.canshowonmouseevent) self.noticeCursor() + }) + self.jqbind(self.win, 'mouseleave', function () { + mousefocus = false + self.hasmousefocus = false + }) + } + } // !ie9mobile + + //Thanks to http://www.quirksmode.org !! + self.onkeypress = function (e) { + if (self.locked && self.page.maxh == 0) return true + + e = e ? e : window.e + var tg = self.getTarget(e) + if (tg && /INPUT|TEXTAREA|SELECT|OPTION/.test(tg.nodeName)) { + var tp = tg.getAttribute('type') || tg.type || false + if (!tp || !/submit|button|cancel/i.tp) return true + } + + if ( + self.hasfocus || + (self.hasmousefocus && !domfocus) || + (self.ispage && !domfocus && !mousefocus) + ) { + var key = e.keyCode + + if (self.locked && key != 27) return self.cancelEvent(e) + + var ctrl = e.ctrlKey || false + var shift = e.shiftKey || false + + var ret = false + switch (key) { + case 38: + case 63233: //safari + self.doScrollBy(24 * 3) + ret = true + break + case 40: + case 63235: //safari + self.doScrollBy(-24 * 3) + ret = true + break + case 37: + case 63232: //safari + if (self.railh) { + ctrl ? self.doScrollLeft(0) : self.doScrollLeftBy(24 * 3) + ret = true + } + break + case 39: + case 63234: //safari + if (self.railh) { + ctrl ? self.doScrollLeft(self.page.maxw) : self.doScrollLeftBy(-24 * 3) + ret = true + } + break + case 33: + case 63276: // safari + self.doScrollBy(self.view.h) + ret = true + break + case 34: + case 63277: // safari + self.doScrollBy(-self.view.h) + ret = true + break + case 36: + case 63273: // safari + self.railh && ctrl ? self.doScrollPos(0, 0) : self.doScrollTo(0) + ret = true + break + case 35: + case 63275: // safari + self.railh && ctrl + ? self.doScrollPos(self.page.maxw, self.page.maxh) + : self.doScrollTo(self.page.maxh) + ret = true + break + case 32: + if (self.opt.spacebarenabled) { + shift ? self.doScrollBy(self.view.h) : self.doScrollBy(-self.view.h) + ret = true + } + break + case 27: // ESC + if (self.zoomactive) { + self.doZoom() + ret = true + } + break + } + if (ret) return self.cancelEvent(e) + } + } + + if (self.opt.enablekeyboard) + self.bind( + document, + cap.isopera && !cap.isopera12 ? 'keypress' : 'keydown', + self.onkeypress + ) + + self.bind(window, 'resize', self.lazyResize) + self.bind(window, 'orientationchange', self.lazyResize) + + self.bind(window, 'load', self.lazyResize) + + if (cap.ischrome && !self.ispage && !self.haswrapper) { + //chrome void scrollbar bug - it persists in version 26 + var tmp = self.win.attr('style') + var ww = parseFloat(self.win.css('width')) + 1 + self.win.css('width', ww) + self.synched('chromefix', function () { + self.win.attr('style', tmp) + }) + } + + // Trying a cross-browser implementation - good luck! + + self.onAttributeChange = function (e) { + self.lazyResize(250) + } + + if (!self.ispage && !self.haswrapper) { + // redesigned MutationObserver for Chrome18+/Firefox14+/iOS6+ with support for: remove div, add/remove content + if (clsMutationObserver !== false) { + self.observer = new clsMutationObserver(function (mutations) { + mutations.forEach(self.onAttributeChange) + }) + self.observer.observe(self.win[0], { + childList: true, + characterData: false, + attributes: true, + subtree: false + }) + + self.observerremover = new clsMutationObserver(function (mutations) { + mutations.forEach(function (mo) { + if (mo.removedNodes.length > 0) { + for (var dd in mo.removedNodes) { + if (mo.removedNodes[dd] == self.win[0]) return self.remove() + } + } + }) + }) + self.observerremover.observe(self.win[0].parentNode, { + childList: true, + characterData: false, + attributes: false, + subtree: false + }) + } else { + self.bind( + self.win, + cap.isie && !cap.isie9 ? 'propertychange' : 'DOMAttrModified', + self.onAttributeChange + ) + if (cap.isie9) self.win[0].attachEvent('onpropertychange', self.onAttributeChange) //IE9 DOMAttrModified bug + self.bind(self.win, 'DOMNodeRemoved', function (e) { + if (e.target == self.win[0]) self.remove() + }) + } + } + + // + + if (!self.ispage && self.opt.boxzoom) self.bind(window, 'resize', self.resizeZoom) + if (self.istextarea) self.bind(self.win, 'mouseup', self.lazyResize) + + self.checkrtlmode = true + self.lazyResize(30) + } + + if (this.doc[0].nodeName == 'IFRAME') { + function oniframeload(e) { + self.iframexd = false + try { + var doc = 'contentDocument' in this ? this.contentDocument : this.contentWindow.document + var a = doc.domain + } catch (e) { + self.iframexd = true + doc = false + } + + if (self.iframexd) { + if ('console' in window) console.log('NiceScroll error: policy restriced iframe') + return true //cross-domain - I can't manage this + } + + self.forcescreen = true + + if (self.isiframe) { + self.iframe = { + doc: $(doc), + html: self.doc.contents().find('html')[0], + body: self.doc.contents().find('body')[0] + } + self.getContentSize = function () { + return { + w: Math.max(self.iframe.html.scrollWidth, self.iframe.body.scrollWidth), + h: Math.max(self.iframe.html.scrollHeight, self.iframe.body.scrollHeight) + } + } + self.docscroll = $(self.iframe.body) //$(this.contentWindow); + } + + if (!cap.isios && self.opt.iframeautoresize && !self.isiframe) { + self.win.scrollTop(0) // reset position + self.doc.height('') //reset height to fix browser bug + var hh = Math.max( + doc.getElementsByTagName('html')[0].scrollHeight, + doc.body.scrollHeight + ) + self.doc.height(hh) + } + self.lazyResize(30) + + if (cap.isie7) self.css($(self.iframe.html), { 'overflow-y': 'hidden' }) + //self.css($(doc.body),{'overflow-y':'hidden'}); + self.css($(self.iframe.body), { 'overflow-y': 'hidden' }) + + if ('contentWindow' in this) { + self.bind(this.contentWindow, 'scroll', self.onscroll) //IE8 & minor + } else { + self.bind(doc, 'scroll', self.onscroll) + } + + if (self.opt.enablemousewheel) { + self.bind(doc, 'mousewheel', self.onmousewheel) + } + + if (self.opt.enablekeyboard) + self.bind(doc, cap.isopera ? 'keypress' : 'keydown', self.onkeypress) + + if (cap.cantouch || self.opt.touchbehavior) { + self.bind(doc, 'mousedown', self.onmousedown) + self.bind(doc, 'mousemove', function (e) { + self.onmousemove(e, true) + }) + if (self.opt.grabcursorenabled && cap.cursorgrabvalue) + self.css($(doc.body), { cursor: cap.cursorgrabvalue }) + } + + self.bind(doc, 'mouseup', self.onmouseup) + + if (self.zoom) { + if (self.opt.dblclickzoom) self.bind(doc, 'dblclick', self.doZoom) + if (self.ongesturezoom) self.bind(doc, 'gestureend', self.ongesturezoom) + } + } + + if (this.doc[0].readyState && this.doc[0].readyState == 'complete') { + setTimeout(function () { + oniframeload.call(self.doc[0], false) + }, 500) + } + self.bind(this.doc, 'load', oniframeload) + } + } + + this.showCursor = function (py, px) { + if (self.cursortimeout) { + clearTimeout(self.cursortimeout) + self.cursortimeout = 0 + } + if (!self.rail) return + if (self.autohidedom) { + self.autohidedom.stop().css({ opacity: self.opt.cursoropacitymax }) + self.cursoractive = true + } + + if (!self.rail.drag || self.rail.drag.pt != 1) { + if (typeof py != 'undefined' && py !== false) { + self.scroll.y = Math.round((py * 1) / self.scrollratio.y) + } + if (typeof px != 'undefined') { + self.scroll.x = Math.round((px * 1) / self.scrollratio.x) + } + } + + self.cursor.css({ height: self.cursorheight, top: self.scroll.y }) + if (self.cursorh) { + !self.rail.align && self.rail.visibility + ? self.cursorh.css({ width: self.cursorwidth, left: self.scroll.x + self.rail.width }) + : self.cursorh.css({ width: self.cursorwidth, left: self.scroll.x }) + self.cursoractive = true + } + + if (self.zoom) self.zoom.stop().css({ opacity: self.opt.cursoropacitymax }) + } + + this.hideCursor = function (tm) { + if (self.cursortimeout) return + if (!self.rail) return + if (!self.autohidedom) return + self.cursortimeout = setTimeout(function () { + if (!self.rail.active || !self.showonmouseevent) { + self.autohidedom.stop().animate({ opacity: self.opt.cursoropacitymin }) + if (self.zoom) self.zoom.stop().animate({ opacity: self.opt.cursoropacitymin }) + self.cursoractive = false + } + self.cursortimeout = 0 + }, tm || self.opt.hidecursordelay) + } + + this.noticeCursor = function (tm, py, px) { + self.showCursor(py, px) + if (!self.rail.active) self.hideCursor(tm) + } + + this.getContentSize = self.ispage + ? function () { + return { + w: Math.max(document.body.scrollWidth, document.documentElement.scrollWidth), + h: Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) + } + } + : self.haswrapper + ? function () { + return { + w: + self.doc.outerWidth() + + parseInt(self.win.css('paddingLeft')) + + parseInt(self.win.css('paddingRight')), + h: + self.doc.outerHeight() + + parseInt(self.win.css('paddingTop')) + + parseInt(self.win.css('paddingBottom')) + } + } + : function () { + return { + w: self.docscroll[0].scrollWidth, + h: self.docscroll[0].scrollHeight + } + } + + this.onResize = function (e, page) { + if (!self.win) return false + + if (!self.haswrapper && !self.ispage) { + if (self.win.css('display') == 'none') { + if (self.visibility) self.hideRail().hideRailHr() + return false + } else { + if (!self.hidden && !self.visibility) self.showRail().showRailHr() + } + } + + var premaxh = self.page.maxh + var premaxw = self.page.maxw + + var preview = { h: self.view.h, w: self.view.w } + + self.view = { + w: self.ispage ? self.win.width() : parseInt(self.win[0].clientWidth), + h: self.ispage ? self.win.height() : parseInt(self.win[0].clientHeight) + } + + self.page = page ? page : self.getContentSize() + + self.page.maxh = Math.max(0, self.page.h - self.view.h) + self.page.maxw = Math.max(0, self.page.w - self.view.w) + + if (self.page.maxh == premaxh && self.page.maxw == premaxw && self.view.w == preview.w) { + // test position + if (!self.ispage) { + var pos = self.win.offset() + if (self.lastposition) { + var lst = self.lastposition + if (lst.top == pos.top && lst.left == pos.left) return self //nothing to do + } + self.lastposition = pos + } else { + return self //nothing to do + } + } + + if (self.page.maxh == 0) { + self.hideRail() + self.scrollvaluemax = 0 + self.scroll.y = 0 + self.scrollratio.y = 0 + self.cursorheight = 0 + self.setScrollTop(0) + self.rail.scrollable = false + } else { + self.rail.scrollable = true + } + + if (self.page.maxw == 0) { + self.hideRailHr() + self.scrollvaluemaxw = 0 + self.scroll.x = 0 + self.scrollratio.x = 0 + self.cursorwidth = 0 + self.setScrollLeft(0) + self.railh.scrollable = false + } else { + self.railh.scrollable = true + } + + self.locked = self.page.maxh == 0 && self.page.maxw == 0 + if (self.locked) { + if (!self.ispage) self.updateScrollBar(self.view) + return false + } + + if (!self.hidden && !self.visibility) { + self.showRail().showRailHr() + } else if (!self.hidden && !self.railh.visibility) self.showRailHr() + + if (self.istextarea && self.win.css('resize') && self.win.css('resize') != 'none') + self.view.h -= 20 + + self.cursorheight = Math.min( + self.view.h, + Math.round(self.view.h * (self.view.h / self.page.h)) + ) + self.cursorheight = self.opt.cursorfixedheight + ? self.opt.cursorfixedheight + : Math.max(self.opt.cursorminheight, self.cursorheight) + + self.cursorwidth = Math.min( + self.view.w, + Math.round(self.view.w * (self.view.w / self.page.w)) + ) + self.cursorwidth = self.opt.cursorfixedheight + ? self.opt.cursorfixedheight + : Math.max(self.opt.cursorminheight, self.cursorwidth) + + self.scrollvaluemax = self.view.h - self.cursorheight - self.cursor.hborder + + if (self.railh) { + self.railh.width = self.page.maxh > 0 ? self.view.w - self.rail.width : self.view.w + self.scrollvaluemaxw = self.railh.width - self.cursorwidth - self.cursorh.wborder + } + + if (self.checkrtlmode && self.railh) { + self.checkrtlmode = false + if (self.opt.rtlmode && self.scroll.x == 0) self.setScrollLeft(self.page.maxw) + } + + if (!self.ispage) self.updateScrollBar(self.view) + + self.scrollratio = { + x: self.page.maxw / self.scrollvaluemaxw, + y: self.page.maxh / self.scrollvaluemax + } + + var sy = self.getScrollTop() + if (sy > self.page.maxh) { + self.doScrollTop(self.page.maxh) + } else { + self.scroll.y = Math.round(self.getScrollTop() * (1 / self.scrollratio.y)) + self.scroll.x = Math.round(self.getScrollLeft() * (1 / self.scrollratio.x)) + if (self.cursoractive) self.noticeCursor() + } + + if (self.scroll.y && self.getScrollTop() == 0) + self.doScrollTo(Math.floor(self.scroll.y * self.scrollratio.y)) + + return self + } + + this.resize = self.onResize + + this.lazyResize = function (tm) { + // event debounce + tm = isNaN(tm) ? 30 : tm + self.delayed('resize', self.resize, tm) + return self + } + + // modified by MDN https://developer.mozilla.org/en-US/docs/DOM/Mozilla_event_reference/wheel + function _modernWheelEvent(dom, name, fn, bubble) { + self._bind( + dom, + name, + function (e) { + var e = e ? e : window.event + var event = { + original: e, + target: e.target || e.srcElement, + type: 'wheel', + deltaMode: e.type == 'MozMousePixelScroll' ? 0 : 1, + deltaX: 0, + deltaZ: 0, + preventDefault: function () { + e.preventDefault ? e.preventDefault() : (e.returnValue = false) + return false + }, + stopImmediatePropagation: function () { + e.stopImmediatePropagation ? e.stopImmediatePropagation() : (e.cancelBubble = true) + } + } + + if (name == 'mousewheel') { + event.deltaY = (-1 / 40) * e.wheelDelta + e.wheelDeltaX && (event.deltaX = (-1 / 40) * e.wheelDeltaX) + } else { + event.deltaY = e.detail + } + + return fn.call(dom, event) + }, + bubble + ) + } + + this._bind = function (el, name, fn, bubble) { + // primitive bind + self.events.push({ e: el, n: name, f: fn, b: bubble, q: false }) + if (el.addEventListener) { + el.addEventListener(name, fn, bubble || false) + } else if (el.attachEvent) { + el.attachEvent('on' + name, fn) + } else { + el['on' + name] = fn + } + } + + this.jqbind = function (dom, name, fn) { + // use jquery bind for non-native events (mouseenter/mouseleave) + self.events.push({ e: dom, n: name, f: fn, q: true }) + $(dom).bind(name, fn) + } + + this.bind = function (dom, name, fn, bubble) { + // touch-oriented & fixing jquery bind + var el = 'jquery' in dom ? dom[0] : dom + + if (name == 'mousewheel') { + if ('onwheel' in self.win) { + self._bind(el, 'wheel', fn, bubble || false) + } else { + var wname = typeof document.onmousewheel != 'undefined' ? 'mousewheel' : 'DOMMouseScroll' // older IE/Firefox + _modernWheelEvent(el, wname, fn, bubble || false) + if (wname == 'DOMMouseScroll') + _modernWheelEvent(el, 'MozMousePixelScroll', fn, bubble || false) // Firefox legacy + } + } else if (el.addEventListener) { + if (cap.cantouch && /mouseup|mousedown|mousemove/.test(name)) { + // touch device support + var tt = name == 'mousedown' ? 'touchstart' : name == 'mouseup' ? 'touchend' : 'touchmove' + self._bind( + el, + tt, + function (e) { + if (e.touches) { + if (e.touches.length < 2) { + var ev = e.touches.length ? e.touches[0] : e + ev.original = e + fn.call(this, ev) + } + } else if (e.changedTouches) { + var ev = e.changedTouches[0] + ev.original = e + fn.call(this, ev) + } //blackberry + }, + bubble || false + ) + } + self._bind(el, name, fn, bubble || false) + if (cap.cantouch && name == 'mouseup') self._bind(el, 'touchcancel', fn, bubble || false) + } else { + self._bind(el, name, function (e) { + e = e || window.event || false + if (e) { + if (e.srcElement) e.target = e.srcElement + } + if (!('pageY' in e)) { + e.pageX = e.clientX + document.documentElement.scrollLeft + e.pageY = e.clientY + document.documentElement.scrollTop + } + return fn.call(el, e) === false || bubble === false ? self.cancelEvent(e) : true + }) + } + } + + this._unbind = function (el, name, fn, bub) { + // primitive unbind + if (el.removeEventListener) { + el.removeEventListener(name, fn, bub) + } else if (el.detachEvent) { + el.detachEvent('on' + name, fn) + } else { + el['on' + name] = false + } + } + + this.unbindAll = function () { + for (var a = 0; a < self.events.length; a++) { + var r = self.events[a] + r.q ? r.e.unbind(r.n, r.f) : self._unbind(r.e, r.n, r.f, r.b) + } + } + + // Thanks to http://www.switchonthecode.com !! + this.cancelEvent = function (e) { + var e = e.original ? e.original : e ? e : window.event || false + if (!e) return false + if (e.preventDefault) e.preventDefault() + if (e.stopPropagation) e.stopPropagation() + if (e.preventManipulation) e.preventManipulation() //IE10 + e.cancelBubble = true + e.cancel = true + e.returnValue = false + return false + } + + this.stopPropagation = function (e) { + var e = e.original ? e.original : e ? e : window.event || false + if (!e) return false + if (e.stopPropagation) return e.stopPropagation() + if (e.cancelBubble) e.cancelBubble = true + return false + } + + this.showRail = function () { + if (self.page.maxh != 0 && (self.ispage || self.win.css('display') != 'none')) { + self.visibility = true + self.rail.visibility = true + self.rail.css('display', 'block') + } + return self + } + + this.showRailHr = function () { + if (!self.railh) return self + if (self.page.maxw != 0 && (self.ispage || self.win.css('display') != 'none')) { + self.railh.visibility = true + self.railh.css('display', 'block') + } + return self + } + + this.hideRail = function () { + self.visibility = false + self.rail.visibility = false + self.rail.css('display', 'none') + return self + } + + this.hideRailHr = function () { + if (!self.railh) return self + self.railh.visibility = false + self.railh.css('display', 'none') + return self + } + + this.show = function () { + self.hidden = false + self.locked = false + return self.showRail().showRailHr() + } + + this.hide = function () { + self.hidden = true + self.locked = true + return self.hideRail().hideRailHr() + } + + this.toggle = function () { + return self.hidden ? self.show() : self.hide() + } + + this.remove = function () { + self.stop() + if (self.cursortimeout) clearTimeout(self.cursortimeout) + self.doZoomOut() + self.unbindAll() + if (self.observer !== false) self.observer.disconnect() + if (self.observerremover !== false) self.observerremover.disconnect() + self.events = [] + if (self.cursor) { + self.cursor.remove() + self.cursor = null + } + if (self.cursorh) { + self.cursorh.remove() + self.cursorh = null + } + if (self.rail) { + self.rail.remove() + self.rail = null + } + if (self.railh) { + self.railh.remove() + self.railh = null + } + if (self.zoom) { + self.zoom.remove() + self.zoom = null + } + for (var a = 0; a < self.saved.css.length; a++) { + var d = self.saved.css[a] + d[0].css(d[1], typeof d[2] == 'undefined' ? '' : d[2]) + } + self.saved = false + self.me.data('__nicescroll', '') //erase all traces + self.me = null + self.doc = null + self.docscroll = null + self.win = null + return self + } + + this.scrollstart = function (fn) { + this.onscrollstart = fn + return self + } + this.scrollend = function (fn) { + this.onscrollend = fn + return self + } + this.scrollcancel = function (fn) { + this.onscrollcancel = fn + return self + } + + this.zoomin = function (fn) { + this.onzoomin = fn + return self + } + this.zoomout = function (fn) { + this.onzoomout = fn + return self + } + + this.isScrollable = function (e) { + var dom = e.target ? e.target : e + if (dom.nodeName == 'OPTION') return true + while (dom && dom.nodeType == 1 && !/BODY|HTML/.test(dom.nodeName)) { + var dd = $(dom) + var ov = dd.css('overflowY') || dd.css('overflowX') || dd.css('overflow') || '' + if (/scroll|auto/.test(ov)) return dom.clientHeight != dom.scrollHeight + dom = dom.parentNode ? dom.parentNode : false + } + return false + } + + this.getViewport = function (me) { + var dom = me && me.parentNode ? me.parentNode : false + while (dom && dom.nodeType == 1 && !/BODY|HTML/.test(dom.nodeName)) { + var dd = $(dom) + var ov = dd.css('overflowY') || dd.css('overflowX') || dd.css('overflow') || '' + if (/scroll|auto/.test(ov) && dom.clientHeight != dom.scrollHeight) return dd + if (dd.getNiceScroll().length > 0) return dd + dom = dom.parentNode ? dom.parentNode : false + } + return false + } + + function execScrollWheel(e, hr, chkscroll) { + var px, py + var rt = 1 + + if (e.deltaMode == 0) { + // PIXEL + px = -Math.floor(e.deltaX * (self.opt.mousescrollstep / (18 * 3))) + py = -Math.floor(e.deltaY * (self.opt.mousescrollstep / (18 * 3))) + } else if (e.deltaMode == 1) { + // LINE + px = -Math.floor(e.deltaX * self.opt.mousescrollstep) + py = -Math.floor(e.deltaY * self.opt.mousescrollstep) + } + + if (hr && px == 0 && py) { + // classic vertical-only mousewheel + browser with x/y support + px = py + py = 0 + } + + if (px) { + if (self.scrollmom) { + self.scrollmom.stop() + } + self.lastdeltax += px + self.debounced( + 'mousewheelx', + function () { + var dt = self.lastdeltax + self.lastdeltax = 0 + if (!self.rail.drag) { + self.doScrollLeftBy(dt) + } + }, + 120 + ) + } + if (py) { + if (self.opt.nativeparentscrolling && chkscroll && !self.ispage && !self.zoomactive) { + if (py < 0) { + if (self.getScrollTop() >= self.page.maxh) return true + } else { + if (self.getScrollTop() <= 0) return true + } + } + if (self.scrollmom) { + self.scrollmom.stop() + } + self.lastdeltay += py + self.debounced( + 'mousewheely', + function () { + var dt = self.lastdeltay + self.lastdeltay = 0 + if (!self.rail.drag) { + self.doScrollBy(dt) + } + }, + 120 + ) + } + + e.stopImmediatePropagation() + return e.preventDefault() + // return self.cancelEvent(e); + } + + this.onmousewheel = function (e) { + if (self.locked) return true + if (self.rail.drag) return self.cancelEvent(e) + + if (!self.rail.scrollable) { + if (self.railh && self.railh.scrollable) { + return self.onmousewheelhr(e) + } else { + return true + } + } + + var nw = +new Date() + var chk = false + if (self.opt.preservenativescrolling && self.checkarea + 600 < nw) { + // self.checkarea = false; + self.nativescrollingarea = self.isScrollable(e) + chk = true + } + self.checkarea = nw + if (self.nativescrollingarea) return true // this isn't my business + // if (self.locked) return self.cancelEvent(e); + var ret = execScrollWheel(e, false, chk) + if (ret) self.checkarea = 0 + return ret + } + + this.onmousewheelhr = function (e) { + if (self.locked || !self.railh.scrollable) return true + if (self.rail.drag) return self.cancelEvent(e) + + var nw = +new Date() + var chk = false + if (self.opt.preservenativescrolling && self.checkarea + 600 < nw) { + // self.checkarea = false; + self.nativescrollingarea = self.isScrollable(e) + chk = true + } + self.checkarea = nw + if (self.nativescrollingarea) return true // this isn't my business + if (self.locked) return self.cancelEvent(e) + + return execScrollWheel(e, true, chk) + } + + this.stop = function () { + self.cancelScroll() + if (self.scrollmon) self.scrollmon.stop() + self.cursorfreezed = false + self.scroll.y = Math.round(self.getScrollTop() * (1 / self.scrollratio.y)) + self.noticeCursor() + return self + } + + this.getTransitionSpeed = function (dif) { + var sp = Math.round(self.opt.scrollspeed * 10) + var ex = Math.min(sp, Math.round((dif / 20) * self.opt.scrollspeed)) + return ex > 20 ? ex : 0 + } + + if (!self.opt.smoothscroll) { + this.doScrollLeft = function (x, spd) { + //direct + var y = self.getScrollTop() + self.doScrollPos(x, y, spd) + } + this.doScrollTop = function (y, spd) { + //direct + var x = self.getScrollLeft() + self.doScrollPos(x, y, spd) + } + this.doScrollPos = function (x, y, spd) { + //direct + var nx = x > self.page.maxw ? self.page.maxw : x + if (nx < 0) nx = 0 + var ny = y > self.page.maxh ? self.page.maxh : y + if (ny < 0) ny = 0 + self.synched('scroll', function () { + self.setScrollTop(ny) + self.setScrollLeft(nx) + }) + } + this.cancelScroll = function () {} // direct + } else if (self.ishwscroll && cap.hastransition && self.opt.usetransition) { + this.prepareTransition = function (dif, istime) { + var ex = istime ? (dif > 20 ? dif : 0) : self.getTransitionSpeed(dif) + var trans = ex ? cap.prefixstyle + 'transform ' + ex + 'ms ease-out' : '' + if (!self.lasttransitionstyle || self.lasttransitionstyle != trans) { + self.lasttransitionstyle = trans + self.doc.css(cap.transitionstyle, trans) + } + return ex + } + + this.doScrollLeft = function (x, spd) { + //trans + var y = self.scrollrunning ? self.newscrolly : self.getScrollTop() + self.doScrollPos(x, y, spd) + } + + this.doScrollTop = function (y, spd) { + //trans + var x = self.scrollrunning ? self.newscrollx : self.getScrollLeft() + self.doScrollPos(x, y, spd) + } + + this.doScrollPos = function (x, y, spd) { + //trans + + var py = self.getScrollTop() + var px = self.getScrollLeft() + + if ((self.newscrolly - py) * (y - py) < 0 || (self.newscrollx - px) * (x - px) < 0) + self.cancelScroll() //inverted movement detection + + if (self.opt.bouncescroll == false) { + if (y < 0) y = 0 + else if (y > self.page.maxh) y = self.page.maxh + if (x < 0) x = 0 + else if (x > self.page.maxw) x = self.page.maxw + } + + if (self.scrollrunning && x == self.newscrollx && y == self.newscrolly) return false + + self.newscrolly = y + self.newscrollx = x + + self.newscrollspeed = spd || false + + if (self.timer) return false + + self.timer = setTimeout(function () { + var top = self.getScrollTop() + var lft = self.getScrollLeft() + + var dst = {} + dst.x = x - lft + dst.y = y - top + dst.px = lft + dst.py = top + + var dd = Math.round(Math.sqrt(Math.pow(dst.x, 2) + Math.pow(dst.y, 2))) + + // var df = (self.newscrollspeed) ? self.newscrollspeed : dd; + + var ms = + self.newscrollspeed && self.newscrollspeed > 1 + ? self.newscrollspeed + : self.getTransitionSpeed(dd) + if (self.newscrollspeed && self.newscrollspeed <= 1) ms *= self.newscrollspeed + + self.prepareTransition(ms, true) + + if (self.timerscroll && self.timerscroll.tm) clearInterval(self.timerscroll.tm) + + if (ms > 0) { + if (!self.scrollrunning && self.onscrollstart) { + var info = { + type: 'scrollstart', + current: { x: lft, y: top }, + request: { x: x, y: y }, + end: { x: self.newscrollx, y: self.newscrolly }, + speed: ms + } + self.onscrollstart.call(self, info) + } + + if (cap.transitionend) { + if (!self.scrollendtrapped) { + self.scrollendtrapped = true + self.bind(self.doc, cap.transitionend, self.onScrollEnd, false) //I have got to do something usefull!! + } + } else { + if (self.scrollendtrapped) clearTimeout(self.scrollendtrapped) + self.scrollendtrapped = setTimeout(self.onScrollEnd, ms) // simulate transitionend event + } + + var py = top + var px = lft + self.timerscroll = { + bz: new BezierClass(py, self.newscrolly, ms, 0, 0, 0.58, 1), + bh: new BezierClass(px, self.newscrollx, ms, 0, 0, 0.58, 1) + } + if (!self.cursorfreezed) + self.timerscroll.tm = setInterval(function () { + self.showCursor(self.getScrollTop(), self.getScrollLeft()) + }, 60) + } + + self.synched('doScroll-set', function () { + self.timer = 0 + if (self.scrollendtrapped) self.scrollrunning = true + self.setScrollTop(self.newscrolly) + self.setScrollLeft(self.newscrollx) + if (!self.scrollendtrapped) self.onScrollEnd() + }) + }, 50) + } + + this.cancelScroll = function () { + if (!self.scrollendtrapped) return true + var py = self.getScrollTop() + var px = self.getScrollLeft() + self.scrollrunning = false + if (!cap.transitionend) clearTimeout(cap.transitionend) + self.scrollendtrapped = false + self._unbind(self.doc, cap.transitionend, self.onScrollEnd) + self.prepareTransition(0) + self.setScrollTop(py) // fire event onscroll + if (self.railh) self.setScrollLeft(px) + if (self.timerscroll && self.timerscroll.tm) clearInterval(self.timerscroll.tm) + self.timerscroll = false + + self.cursorfreezed = false + + //self.noticeCursor(false,py,px); + self.showCursor(py, px) + return self + } + this.onScrollEnd = function () { + if (self.scrollendtrapped) self._unbind(self.doc, cap.transitionend, self.onScrollEnd) + self.scrollendtrapped = false + self.prepareTransition(0) + if (self.timerscroll && self.timerscroll.tm) clearInterval(self.timerscroll.tm) + self.timerscroll = false + var py = self.getScrollTop() + var px = self.getScrollLeft() + self.setScrollTop(py) // fire event onscroll + if (self.railh) self.setScrollLeft(px) // fire event onscroll left + + self.noticeCursor(false, py, px) + + self.cursorfreezed = false + + if (py < 0) py = 0 + else if (py > self.page.maxh) py = self.page.maxh + if (px < 0) px = 0 + else if (px > self.page.maxw) px = self.page.maxw + if (py != self.newscrolly || px != self.newscrollx) + return self.doScrollPos(px, py, self.opt.snapbackspeed) + + if (self.onscrollend && self.scrollrunning) { + var info = { + type: 'scrollend', + current: { x: px, y: py }, + end: { x: self.newscrollx, y: self.newscrolly } + } + self.onscrollend.call(self, info) + } + self.scrollrunning = false + } + } else { + this.doScrollLeft = function (x, spd) { + //no-trans + var y = self.scrollrunning ? self.newscrolly : self.getScrollTop() + self.doScrollPos(x, y, spd) + } + + this.doScrollTop = function (y, spd) { + //no-trans + var x = self.scrollrunning ? self.newscrollx : self.getScrollLeft() + self.doScrollPos(x, y, spd) + } + + this.doScrollPos = function (x, y, spd) { + //no-trans + var y = typeof y == 'undefined' || y === false ? self.getScrollTop(true) : y + + if (self.timer && self.newscrolly == y && self.newscrollx == x) return true + + if (self.timer) clearAnimationFrame(self.timer) + self.timer = 0 + + var py = self.getScrollTop() + var px = self.getScrollLeft() + + if ((self.newscrolly - py) * (y - py) < 0 || (self.newscrollx - px) * (x - px) < 0) + self.cancelScroll() //inverted movement detection + + self.newscrolly = y + self.newscrollx = x + + if (!self.bouncescroll || !self.rail.visibility) { + if (self.newscrolly < 0) { + self.newscrolly = 0 + } else if (self.newscrolly > self.page.maxh) { + self.newscrolly = self.page.maxh + } + } + if (!self.bouncescroll || !self.railh.visibility) { + if (self.newscrollx < 0) { + self.newscrollx = 0 + } else if (self.newscrollx > self.page.maxw) { + self.newscrollx = self.page.maxw + } + } + + self.dst = {} + self.dst.x = x - px + self.dst.y = y - py + self.dst.px = px + self.dst.py = py + + var dst = Math.round(Math.sqrt(Math.pow(self.dst.x, 2) + Math.pow(self.dst.y, 2))) + + self.dst.ax = self.dst.x / dst + self.dst.ay = self.dst.y / dst + + var pa = 0 + var pe = dst + + if (self.dst.x == 0) { + pa = py + pe = y + self.dst.ay = 1 + self.dst.py = 0 + } else if (self.dst.y == 0) { + pa = px + pe = x + self.dst.ax = 1 + self.dst.px = 0 + } + + var ms = self.getTransitionSpeed(dst) + if (spd && spd <= 1) ms *= spd + if (ms > 0) { + self.bzscroll = self.bzscroll + ? self.bzscroll.update(pe, ms) + : new BezierClass(pa, pe, ms, 0, 1, 0, 1) + } else { + self.bzscroll = false + } + + if (self.timer) return + + if ( + (py == self.page.maxh && y >= self.page.maxh) || + (px == self.page.maxw && x >= self.page.maxw) + ) + self.checkContentSize() + + var sync = 1 + + function scrolling() { + if (self.cancelAnimationFrame) return true + + self.scrollrunning = true + + sync = 1 - sync + if (sync) return (self.timer = setAnimationFrame(scrolling) || 1) + + var done = 0 + + var sc = (sy = self.getScrollTop()) + if (self.dst.ay) { + sc = self.bzscroll + ? self.dst.py + self.bzscroll.getNow() * self.dst.ay + : self.newscrolly + var dr = sc - sy + if ((dr < 0 && sc < self.newscrolly) || (dr > 0 && sc > self.newscrolly)) + sc = self.newscrolly + self.setScrollTop(sc) + if (sc == self.newscrolly) done = 1 + } else { + done = 1 + } + + var scx = (sx = self.getScrollLeft()) + if (self.dst.ax) { + scx = self.bzscroll + ? self.dst.px + self.bzscroll.getNow() * self.dst.ax + : self.newscrollx + var dr = scx - sx + if ((dr < 0 && scx < self.newscrollx) || (dr > 0 && scx > self.newscrollx)) + scx = self.newscrollx + self.setScrollLeft(scx) + if (scx == self.newscrollx) done += 1 + } else { + done += 1 + } + + if (done == 2) { + self.timer = 0 + self.cursorfreezed = false + self.bzscroll = false + self.scrollrunning = false + if (sc < 0) sc = 0 + else if (sc > self.page.maxh) sc = self.page.maxh + if (scx < 0) scx = 0 + else if (scx > self.page.maxw) scx = self.page.maxw + if (scx != self.newscrollx || sc != self.newscrolly) self.doScrollPos(scx, sc) + else { + if (self.onscrollend) { + var info = { + type: 'scrollend', + current: { x: sx, y: sy }, + end: { x: self.newscrollx, y: self.newscrolly } + } + self.onscrollend.call(self, info) + } + } + } else { + self.timer = setAnimationFrame(scrolling) || 1 + } + } + self.cancelAnimationFrame = false + self.timer = 1 + + if (self.onscrollstart && !self.scrollrunning) { + var info = { + type: 'scrollstart', + current: { x: px, y: py }, + request: { x: x, y: y }, + end: { x: self.newscrollx, y: self.newscrolly }, + speed: ms + } + self.onscrollstart.call(self, info) + } + + scrolling() + + if ((py == self.page.maxh && y >= py) || (px == self.page.maxw && x >= px)) + self.checkContentSize() + + self.noticeCursor() + } + + this.cancelScroll = function () { + if (self.timer) clearAnimationFrame(self.timer) + self.timer = 0 + self.bzscroll = false + self.scrollrunning = false + return self + } + } + + this.doScrollBy = function (stp, relative) { + var ny = 0 + if (relative) { + ny = Math.floor((self.scroll.y - stp) * self.scrollratio.y) + } else { + var sy = self.timer ? self.newscrolly : self.getScrollTop(true) + ny = sy - stp + } + if (self.bouncescroll) { + var haf = Math.round(self.view.h / 2) + if (ny < -haf) ny = -haf + else if (ny > self.page.maxh + haf) ny = self.page.maxh + haf + } + self.cursorfreezed = false + + py = self.getScrollTop(true) + if (ny < 0 && py <= 0) return self.noticeCursor() + else if (ny > self.page.maxh && py >= self.page.maxh) { + self.checkContentSize() + return self.noticeCursor() + } + + self.doScrollTop(ny) + } + + this.doScrollLeftBy = function (stp, relative) { + var nx = 0 + if (relative) { + nx = Math.floor((self.scroll.x - stp) * self.scrollratio.x) + } else { + var sx = self.timer ? self.newscrollx : self.getScrollLeft(true) + nx = sx - stp + } + if (self.bouncescroll) { + var haf = Math.round(self.view.w / 2) + if (nx < -haf) nx = -haf + else if (nx > self.page.maxw + haf) nx = self.page.maxw + haf + } + self.cursorfreezed = false + + px = self.getScrollLeft(true) + if (nx < 0 && px <= 0) return self.noticeCursor() + else if (nx > self.page.maxw && px >= self.page.maxw) return self.noticeCursor() + + self.doScrollLeft(nx) + } + + this.doScrollTo = function (pos, relative) { + var ny = relative ? Math.round(pos * self.scrollratio.y) : pos + if (ny < 0) ny = 0 + else if (ny > self.page.maxh) ny = self.page.maxh + self.cursorfreezed = false + self.doScrollTop(pos) + } + + this.checkContentSize = function () { + var pg = self.getContentSize() + if (pg.h != self.page.h || pg.w != self.page.w) self.resize(false, pg) + } + + self.onscroll = function (e) { + if (self.rail.drag) return + if (!self.cursorfreezed) { + self.synched('scroll', function () { + self.scroll.y = Math.round(self.getScrollTop() * (1 / self.scrollratio.y)) + if (self.railh) + self.scroll.x = Math.round(self.getScrollLeft() * (1 / self.scrollratio.x)) + self.noticeCursor() + }) + } + } + self.bind(self.docscroll, 'scroll', self.onscroll) + + this.doZoomIn = function (e) { + if (self.zoomactive) return + self.zoomactive = true + + self.zoomrestore = { + style: {} + } + var lst = [ + 'position', + 'top', + 'left', + 'zIndex', + 'backgroundColor', + 'marginTop', + 'marginBottom', + 'marginLeft', + 'marginRight' + ] + var win = self.win[0].style + for (var a in lst) { + var pp = lst[a] + self.zoomrestore.style[pp] = typeof win[pp] != 'undefined' ? win[pp] : '' + } + + self.zoomrestore.style.width = self.win.css('width') + self.zoomrestore.style.height = self.win.css('height') + + self.zoomrestore.padding = { + w: self.win.outerWidth() - self.win.width(), + h: self.win.outerHeight() - self.win.height() + } + + if (cap.isios4) { + self.zoomrestore.scrollTop = $(window).scrollTop() + $(window).scrollTop(0) + } + + self.win.css({ + position: cap.isios4 ? 'absolute' : 'fixed', + top: 0, + left: 0, + 'z-index': globalmaxzindex + 100, + margin: '0px' + }) + var bkg = self.win.css('backgroundColor') + if (bkg == '' || /transparent|rgba\(0, 0, 0, 0\)|rgba\(0,0,0,0\)/.test(bkg)) + self.win.css('backgroundColor', '#fff') + self.rail.css({ 'z-index': globalmaxzindex + 101 }) + self.zoom.css({ 'z-index': globalmaxzindex + 102 }) + self.zoom.css('backgroundPosition', '0px -18px') + self.resizeZoom() + + if (self.onzoomin) self.onzoomin.call(self) + + return self.cancelEvent(e) + } + + this.doZoomOut = function (e) { + if (!self.zoomactive) return + self.zoomactive = false + + self.win.css('margin', '') + self.win.css(self.zoomrestore.style) + + if (cap.isios4) { + $(window).scrollTop(self.zoomrestore.scrollTop) + } + + self.rail.css({ 'z-index': self.zindex }) + self.zoom.css({ 'z-index': self.zindex }) + self.zoomrestore = false + self.zoom.css('backgroundPosition', '0px 0px') + self.onResize() + + if (self.onzoomout) self.onzoomout.call(self) + + return self.cancelEvent(e) + } + + this.doZoom = function (e) { + return self.zoomactive ? self.doZoomOut(e) : self.doZoomIn(e) + } + + this.resizeZoom = function () { + if (!self.zoomactive) return + + var py = self.getScrollTop() //preserve scrolling position + self.win.css({ + width: $(window).width() - self.zoomrestore.padding.w + 'px', + height: $(window).height() - self.zoomrestore.padding.h + 'px' + }) + self.onResize() + + self.setScrollTop(Math.min(self.page.maxh, py)) + } + + this.init() + + $.nicescroll.push(this) + } + + // Inspired by the work of Kin Blas + // http://webpro.host.adobe.com/people/jblas/momentum/includes/jquery.momentum.0.7.js + + var ScrollMomentumClass2D = function (nc) { + var self = this + this.nc = nc + + this.lastx = 0 + this.lasty = 0 + this.speedx = 0 + this.speedy = 0 + this.lasttime = 0 + this.steptime = 0 + this.snapx = false + this.snapy = false + this.demulx = 0 + this.demuly = 0 + + this.lastscrollx = -1 + this.lastscrolly = -1 + + this.chkx = 0 + this.chky = 0 + + this.timer = 0 + + this.time = function () { + return +new Date() //beautifull hack + } + + this.reset = function (px, py) { + self.stop() + var now = self.time() + self.steptime = 0 + self.lasttime = now + self.speedx = 0 + self.speedy = 0 + self.lastx = px + self.lasty = py + self.lastscrollx = -1 + self.lastscrolly = -1 + } + + this.update = function (px, py) { + var now = self.time() + self.steptime = now - self.lasttime + self.lasttime = now + var dy = py - self.lasty + var dx = px - self.lastx + var sy = self.nc.getScrollTop() + var sx = self.nc.getScrollLeft() + var newy = sy + dy + var newx = sx + dx + self.snapx = newx < 0 || newx > self.nc.page.maxw + self.snapy = newy < 0 || newy > self.nc.page.maxh + self.speedx = dx + self.speedy = dy + self.lastx = px + self.lasty = py + } + + this.stop = function () { + self.nc.unsynched('domomentum2d') + if (self.timer) clearTimeout(self.timer) + self.timer = 0 + self.lastscrollx = -1 + self.lastscrolly = -1 + } + + this.doSnapy = function (nx, ny) { + var snap = false + + if (ny < 0) { + ny = 0 + snap = true + } else if (ny > self.nc.page.maxh) { + ny = self.nc.page.maxh + snap = true + } + + if (nx < 0) { + nx = 0 + snap = true + } else if (nx > self.nc.page.maxw) { + nx = self.nc.page.maxw + snap = true + } + + if (snap) self.nc.doScrollPos(nx, ny, self.nc.opt.snapbackspeed) + } + + this.doMomentum = function (gp) { + var t = self.time() + var l = gp ? t + gp : self.lasttime + + var sl = self.nc.getScrollLeft() + var st = self.nc.getScrollTop() + + var pageh = self.nc.page.maxh + var pagew = self.nc.page.maxw + + self.speedx = pagew > 0 ? Math.min(60, self.speedx) : 0 + self.speedy = pageh > 0 ? Math.min(60, self.speedy) : 0 + + var chk = l && t - l <= 50 + + if (st < 0 || st > pageh || sl < 0 || sl > pagew) chk = false + + var sy = self.speedy && chk ? self.speedy : false + var sx = self.speedx && chk ? self.speedx : false + + if (sy || sx) { + var tm = Math.max(16, self.steptime) //timeout granularity + + if (tm > 50) { + // do smooth + var xm = tm / 50 + self.speedx *= xm + self.speedy *= xm + tm = 50 + } + + self.demulxy = 0 + + self.lastscrollx = self.nc.getScrollLeft() + self.chkx = self.lastscrollx + self.lastscrolly = self.nc.getScrollTop() + self.chky = self.lastscrolly + + var nx = self.lastscrollx + var ny = self.lastscrolly + + var onscroll = function () { + var df = self.time() - t > 600 ? 0.04 : 0.02 + + if (self.speedx) { + nx = Math.floor(self.lastscrollx - self.speedx * (1 - self.demulxy)) + self.lastscrollx = nx + if (nx < 0 || nx > pagew) df = 0.1 + } + + if (self.speedy) { + ny = Math.floor(self.lastscrolly - self.speedy * (1 - self.demulxy)) + self.lastscrolly = ny + if (ny < 0 || ny > pageh) df = 0.1 + } + + self.demulxy = Math.min(1, self.demulxy + df) + + self.nc.synched('domomentum2d', function () { + if (self.speedx) { + var scx = self.nc.getScrollLeft() + if (scx != self.chkx) self.stop() + self.chkx = nx + self.nc.setScrollLeft(nx) + } + + if (self.speedy) { + var scy = self.nc.getScrollTop() + if (scy != self.chky) self.stop() + self.chky = ny + self.nc.setScrollTop(ny) + } + + if (!self.timer) { + self.nc.hideCursor() + self.doSnapy(nx, ny) + } + }) + + if (self.demulxy < 1) { + self.timer = setTimeout(onscroll, tm) + } else { + self.stop() + self.nc.hideCursor() + self.doSnapy(nx, ny) + } + } + + onscroll() + } else { + self.doSnapy(self.nc.getScrollLeft(), self.nc.getScrollTop()) + } + } + } + + // override jQuery scrollTop + + var _scrollTop = jQuery.fn.scrollTop // preserve original function + + jQuery.cssHooks['pageYOffset'] = { + get: function (elem, computed, extra) { + var nice = $.data(elem, '__nicescroll') || false + return nice && nice.ishwscroll ? nice.getScrollTop() : _scrollTop.call(elem) + }, + set: function (elem, value) { + var nice = $.data(elem, '__nicescroll') || false + nice && nice.ishwscroll ? nice.setScrollTop(parseInt(value)) : _scrollTop.call(elem, value) + return this + } + } + + /* + $.fx.step["scrollTop"] = function(fx){ + $.cssHooks["scrollTop"].set( fx.elem, fx.now + fx.unit ); + }; +*/ + + jQuery.fn.scrollTop = function (value) { + if (typeof value == 'undefined') { + var nice = this[0] ? $.data(this[0], '__nicescroll') || false : false + return nice && nice.ishwscroll ? nice.getScrollTop() : _scrollTop.call(this) + } else { + return this.each(function () { + var nice = $.data(this, '__nicescroll') || false + nice && nice.ishwscroll + ? nice.setScrollTop(parseInt(value)) + : _scrollTop.call($(this), value) + }) + } + } + + // override jQuery scrollLeft + + var _scrollLeft = jQuery.fn.scrollLeft // preserve original function + + $.cssHooks.pageXOffset = { + get: function (elem, computed, extra) { + var nice = $.data(elem, '__nicescroll') || false + return nice && nice.ishwscroll ? nice.getScrollLeft() : _scrollLeft.call(elem) + }, + set: function (elem, value) { + var nice = $.data(elem, '__nicescroll') || false + nice && nice.ishwscroll ? nice.setScrollLeft(parseInt(value)) : _scrollLeft.call(elem, value) + return this + } + } + + /* + $.fx.step["scrollLeft"] = function(fx){ + $.cssHooks["scrollLeft"].set( fx.elem, fx.now + fx.unit ); + }; +*/ + + jQuery.fn.scrollLeft = function (value) { + if (typeof value == 'undefined') { + var nice = this[0] ? $.data(this[0], '__nicescroll') || false : false + return nice && nice.ishwscroll ? nice.getScrollLeft() : _scrollLeft.call(this) + } else { + return this.each(function () { + var nice = $.data(this, '__nicescroll') || false + nice && nice.ishwscroll + ? nice.setScrollLeft(parseInt(value)) + : _scrollLeft.call($(this), value) + }) + } + } + + var NiceScrollArray = function (doms) { + var self = this + this.length = 0 + this.name = 'nicescrollarray' + + this.each = function (fn) { + for (var a = 0; a < self.length; a++) fn.call(self[a]) + return self + } + + this.push = function (nice) { + self[self.length] = nice + self.length++ + } + + this.eq = function (idx) { + return self[idx] + } + + if (doms) { + for (a = 0; a < doms.length; a++) { + var nice = $.data(doms[a], '__nicescroll') || false + if (nice) { + this[this.length] = nice + this.length++ + } + } + } + + return this + } + + function mplex(el, lst, fn) { + for (var a = 0; a < lst.length; a++) fn(el, lst[a]) + } + mplex( + NiceScrollArray.prototype, + ['show', 'hide', 'toggle', 'onResize', 'resize', 'remove', 'stop', 'doScrollPos'], + function (e, n) { + e[n] = function () { + var args = arguments + return this.each(function () { + this[n].apply(this, args) + }) + } + } + ) + + jQuery.fn.getNiceScroll = function (index) { + if (typeof index == 'undefined') { + return new NiceScrollArray(this) + } else { + var nice = $.data(this[index], '__nicescroll') || false + return nice + } + } + + jQuery.extend(jQuery.expr[':'], { + nicescroll: function (a) { + return $.data(a, '__nicescroll') ? true : false + } + }) + + $.fn.niceScroll = function (wrapper, opt) { + if (typeof opt == 'undefined') { + if (typeof wrapper == 'object' && !('jquery' in wrapper)) { + opt = wrapper + wrapper = false + } + } + var ret = new NiceScrollArray() + if (typeof opt == 'undefined') opt = {} + + if (wrapper || false) { + opt.doc = $(wrapper) + opt.win = $(this) + } + var docundef = !('doc' in opt) + if (!docundef && !('win' in opt)) opt.win = $(this) + + this.each(function () { + var nice = $(this).data('__nicescroll') || false + if (!nice) { + opt.doc = docundef ? $(this) : opt.doc + nice = new NiceScrollClass(opt, $(this)) + $(this).data('__nicescroll', nice) + } + ret.push(nice) + }) + return ret.length == 1 ? ret[0] : ret + } + + window.NiceScroll = { + getjQuery: function () { + return jQuery + } + } + + if (!$.nicescroll) { + $.nicescroll = new NiceScrollArray() + $.nicescroll.options = _globaloptions + } +})(jQuery) diff --git a/public/static/modelView/js/jqueryUI.js b/public/static/modelView/js/jqueryUI.js new file mode 100644 index 0000000..d7734b4 --- /dev/null +++ b/public/static/modelView/js/jqueryUI.js @@ -0,0 +1,19046 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 + * http://jqueryui.com + * Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js + * Copyright jQuery Foundation and other contributors; Licensed MIT */ + +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory) + } else { + // Browser globals + factory(jQuery) + } +})(function ($) { + $.ui = $.ui || {} + + var version = ($.ui.version = '1.12.1') + + /*! + * jQuery UI Widget 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Widget + //>>group: Core + //>>description: Provides a factory for creating stateful widgets with a common API. + //>>docs: http://api.jqueryui.com/jQuery.widget/ + //>>demos: http://jqueryui.com/widget/ + + var widgetUuid = 0 + var widgetSlice = Array.prototype.slice + + $.cleanData = (function (orig) { + return function (elems) { + var events, elem, i + for (i = 0; (elem = elems[i]) != null; i++) { + try { + // Only trigger remove when necessary to save time + events = $._data(elem, 'events') + if (events && events.remove) { + $(elem).triggerHandler('remove') + } + + // Http://bugs.jquery.com/ticket/8235 + } catch (e) {} + } + orig(elems) + } + })($.cleanData) + + $.widget = function (name, base, prototype) { + var existingConstructor, constructor, basePrototype + + // ProxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + var proxiedPrototype = {} + + var namespace = name.split('.')[0] + name = name.split('.')[1] + var fullName = namespace + '-' + name + + if (!prototype) { + prototype = base + base = $.Widget + } + + if ($.isArray(prototype)) { + prototype = $.extend.apply(null, [{}].concat(prototype)) + } + + // Create selector for plugin + $.expr[':'][fullName.toLowerCase()] = function (elem) { + return !!$.data(elem, fullName) + } + + $[namespace] = $[namespace] || {} + existingConstructor = $[namespace][name] + constructor = $[namespace][name] = function (options, element) { + // Allow instantiation without "new" keyword + if (!this._createWidget) { + return new constructor(options, element) + } + + // Allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if (arguments.length) { + this._createWidget(options, element) + } + } + + // Extend with the existing constructor to carry over any static properties + $.extend(constructor, existingConstructor, { + version: prototype.version, + + // Copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend({}, prototype), + + // Track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }) + + basePrototype = new base() + + // We need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend({}, basePrototype.options) + $.each(prototype, function (prop, value) { + if (!$.isFunction(value)) { + proxiedPrototype[prop] = value + return + } + proxiedPrototype[prop] = (function () { + function _super() { + return base.prototype[prop].apply(this, arguments) + } + + function _superApply(args) { + return base.prototype[prop].apply(this, args) + } + + return function () { + var __super = this._super + var __superApply = this._superApply + var returnValue + + this._super = _super + this._superApply = _superApply + + returnValue = value.apply(this, arguments) + + this._super = __super + this._superApply = __superApply + + return returnValue + } + })() + }) + constructor.prototype = $.widget.extend( + basePrototype, + { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix || name : name + }, + proxiedPrototype, + { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + } + ) + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if (existingConstructor) { + $.each(existingConstructor._childConstructors, function (i, child) { + var childPrototype = child.prototype + + // Redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( + childPrototype.namespace + '.' + childPrototype.widgetName, + constructor, + child._proto + ) + }) + + // Remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors + } else { + base._childConstructors.push(constructor) + } + + $.widget.bridge(name, constructor) + + return constructor + } + + $.widget.extend = function (target) { + var input = widgetSlice.call(arguments, 1) + var inputIndex = 0 + var inputLength = input.length + var key + var value + + for (; inputIndex < inputLength; inputIndex++) { + for (key in input[inputIndex]) { + value = input[inputIndex][key] + if (input[inputIndex].hasOwnProperty(key) && value !== undefined) { + // Clone objects + if ($.isPlainObject(value)) { + target[key] = $.isPlainObject(target[key]) + ? $.widget.extend({}, target[key], value) + : // Don't extend strings, arrays, etc. with objects + $.widget.extend({}, value) + + // Copy everything else by reference + } else { + target[key] = value + } + } + } + } + return target + } + + $.widget.bridge = function (name, object) { + var fullName = object.prototype.widgetFullName || name + $.fn[name] = function (options) { + var isMethodCall = typeof options === 'string' + var args = widgetSlice.call(arguments, 1) + var returnValue = this + + if (isMethodCall) { + // If this is an empty collection, we need to have the instance method + // return undefined instead of the jQuery instance + if (!this.length && options === 'instance') { + returnValue = undefined + } else { + this.each(function () { + var methodValue + var instance = $.data(this, fullName) + + if (options === 'instance') { + returnValue = instance + return false + } + + if (!instance) { + return $.error( + 'cannot call methods on ' + + name + + ' prior to initialization; ' + + "attempted to call method '" + + options + + "'" + ) + } + + if (!$.isFunction(instance[options]) || options.charAt(0) === '_') { + return $.error("no such method '" + options + "' for " + name + ' widget instance') + } + + methodValue = instance[options].apply(instance, args) + + if (methodValue !== instance && methodValue !== undefined) { + returnValue = + methodValue && methodValue.jquery + ? returnValue.pushStack(methodValue.get()) + : methodValue + return false + } + }) + } + } else { + // Allow multiple hashes to be passed on init + if (args.length) { + options = $.widget.extend.apply(null, [options].concat(args)) + } + + this.each(function () { + var instance = $.data(this, fullName) + if (instance) { + instance.option(options || {}) + if (instance._init) { + instance._init() + } + } else { + $.data(this, fullName, new object(options, this)) + } + }) + } + + return returnValue + } + } + + $.Widget = function (/* options, element */) {} + $.Widget._childConstructors = [] + + $.Widget.prototype = { + widgetName: 'widget', + widgetEventPrefix: '', + defaultElement: '<div>', + + options: { + classes: {}, + disabled: false, + + // Callbacks + create: null + }, + + _createWidget: function (options, element) { + element = $(element || this.defaultElement || this)[0] + this.element = $(element) + this.uuid = widgetUuid++ + this.eventNamespace = '.' + this.widgetName + this.uuid + + this.bindings = $() + this.hoverable = $() + this.focusable = $() + this.classesElementLookup = {} + + if (element !== this) { + $.data(element, this.widgetFullName, this) + this._on(true, this.element, { + remove: function (event) { + if (event.target === element) { + this.destroy() + } + } + }) + this.document = $( + element.style + ? // Element within the document + element.ownerDocument + : // Element is window or document + element.document || element + ) + this.window = $(this.document[0].defaultView || this.document[0].parentWindow) + } + + this.options = $.widget.extend({}, this.options, this._getCreateOptions(), options) + + this._create() + + if (this.options.disabled) { + this._setOptionDisabled(this.options.disabled) + } + + this._trigger('create', null, this._getCreateEventData()) + this._init() + }, + + _getCreateOptions: function () { + return {} + }, + + _getCreateEventData: $.noop, + + _create: $.noop, + + _init: $.noop, + + destroy: function () { + var that = this + + this._destroy() + $.each(this.classesElementLookup, function (key, value) { + that._removeClass(value, key) + }) + + // We can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element.off(this.eventNamespace).removeData(this.widgetFullName) + this.widget().off(this.eventNamespace).removeAttr('aria-disabled') + + // Clean up events and states + this.bindings.off(this.eventNamespace) + }, + + _destroy: $.noop, + + widget: function () { + return this.element + }, + + option: function (key, value) { + var options = key + var parts + var curOption + var i + + if (arguments.length === 0) { + // Don't return a reference to the internal hash + return $.widget.extend({}, this.options) + } + + if (typeof key === 'string') { + // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {} + parts = key.split('.') + key = parts.shift() + if (parts.length) { + curOption = options[key] = $.widget.extend({}, this.options[key]) + for (i = 0; i < parts.length - 1; i++) { + curOption[parts[i]] = curOption[parts[i]] || {} + curOption = curOption[parts[i]] + } + key = parts.pop() + if (arguments.length === 1) { + return curOption[key] === undefined ? null : curOption[key] + } + curOption[key] = value + } else { + if (arguments.length === 1) { + return this.options[key] === undefined ? null : this.options[key] + } + options[key] = value + } + } + + this._setOptions(options) + + return this + }, + + _setOptions: function (options) { + var key + + for (key in options) { + this._setOption(key, options[key]) + } + + return this + }, + + _setOption: function (key, value) { + if (key === 'classes') { + this._setOptionClasses(value) + } + + this.options[key] = value + + if (key === 'disabled') { + this._setOptionDisabled(value) + } + + return this + }, + + _setOptionClasses: function (value) { + var classKey, elements, currentElements + + for (classKey in value) { + currentElements = this.classesElementLookup[classKey] + if ( + value[classKey] === this.options.classes[classKey] || + !currentElements || + !currentElements.length + ) { + continue + } + + // We are doing this to create a new jQuery object because the _removeClass() call + // on the next line is going to destroy the reference to the current elements being + // tracked. We need to save a copy of this collection so that we can add the new classes + // below. + elements = $(currentElements.get()) + this._removeClass(currentElements, classKey) + + // We don't use _addClass() here, because that uses this.options.classes + // for generating the string of classes. We want to use the value passed in from + // _setOption(), this is the new value of the classes option which was passed to + // _setOption(). We pass this value directly to _classes(). + elements.addClass( + this._classes({ + element: elements, + keys: classKey, + classes: value, + add: true + }) + ) + } + }, + + _setOptionDisabled: function (value) { + this._toggleClass(this.widget(), this.widgetFullName + '-disabled', null, !!value) + + // If the widget is becoming disabled, then nothing is interactive + if (value) { + this._removeClass(this.hoverable, null, 'ui-state-hover') + this._removeClass(this.focusable, null, 'ui-state-focus') + } + }, + + enable: function () { + return this._setOptions({ disabled: false }) + }, + + disable: function () { + return this._setOptions({ disabled: true }) + }, + + _classes: function (options) { + var full = [] + var that = this + + options = $.extend( + { + element: this.element, + classes: this.options.classes || {} + }, + options + ) + + function processClassString(classes, checkOption) { + var current, i + for (i = 0; i < classes.length; i++) { + current = that.classesElementLookup[classes[i]] || $() + if (options.add) { + current = $($.unique(current.get().concat(options.element.get()))) + } else { + current = $(current.not(options.element).get()) + } + that.classesElementLookup[classes[i]] = current + full.push(classes[i]) + if (checkOption && options.classes[classes[i]]) { + full.push(options.classes[classes[i]]) + } + } + } + + this._on(options.element, { + remove: '_untrackClassesElement' + }) + + if (options.keys) { + processClassString(options.keys.match(/\S+/g) || [], true) + } + if (options.extra) { + processClassString(options.extra.match(/\S+/g) || []) + } + + return full.join(' ') + }, + + _untrackClassesElement: function (event) { + var that = this + $.each(that.classesElementLookup, function (key, value) { + if ($.inArray(event.target, value) !== -1) { + that.classesElementLookup[key] = $(value.not(event.target).get()) + } + }) + }, + + _removeClass: function (element, keys, extra) { + return this._toggleClass(element, keys, extra, false) + }, + + _addClass: function (element, keys, extra) { + return this._toggleClass(element, keys, extra, true) + }, + + _toggleClass: function (element, keys, extra, add) { + add = typeof add === 'boolean' ? add : extra + var shift = typeof element === 'string' || element === null, + options = { + extra: shift ? keys : extra, + keys: shift ? element : keys, + element: shift ? this.element : element, + add: add + } + options.element.toggleClass(this._classes(options), add) + return this + }, + + _on: function (suppressDisabledCheck, element, handlers) { + var delegateElement + var instance = this + + // No suppressDisabledCheck flag, shuffle arguments + if (typeof suppressDisabledCheck !== 'boolean') { + handlers = element + element = suppressDisabledCheck + suppressDisabledCheck = false + } + + // No element argument, shuffle and use this.element + if (!handlers) { + handlers = element + element = this.element + delegateElement = this.widget() + } else { + element = delegateElement = $(element) + this.bindings = this.bindings.add(element) + } + + $.each(handlers, function (event, handler) { + function handlerProxy() { + // Allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( + !suppressDisabledCheck && + (instance.options.disabled === true || $(this).hasClass('ui-state-disabled')) + ) { + return + } + return (typeof handler === 'string' ? instance[handler] : handler).apply( + instance, + arguments + ) + } + + // Copy the guid so direct unbinding works + if (typeof handler !== 'string') { + handlerProxy.guid = handler.guid = handler.guid || handlerProxy.guid || $.guid++ + } + + var match = event.match(/^([\w:-]*)\s*(.*)$/) + var eventName = match[1] + instance.eventNamespace + var selector = match[2] + + if (selector) { + delegateElement.on(eventName, selector, handlerProxy) + } else { + element.on(eventName, handlerProxy) + } + }) + }, + + _off: function (element, eventName) { + eventName = (eventName || '').split(' ').join(this.eventNamespace + ' ') + this.eventNamespace + element.off(eventName).off(eventName) + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $(this.bindings.not(element).get()) + this.focusable = $(this.focusable.not(element).get()) + this.hoverable = $(this.hoverable.not(element).get()) + }, + + _delay: function (handler, delay) { + function handlerProxy() { + return (typeof handler === 'string' ? instance[handler] : handler).apply( + instance, + arguments + ) + } + var instance = this + return setTimeout(handlerProxy, delay || 0) + }, + + _hoverable: function (element) { + this.hoverable = this.hoverable.add(element) + this._on(element, { + mouseenter: function (event) { + this._addClass($(event.currentTarget), null, 'ui-state-hover') + }, + mouseleave: function (event) { + this._removeClass($(event.currentTarget), null, 'ui-state-hover') + } + }) + }, + + _focusable: function (element) { + this.focusable = this.focusable.add(element) + this._on(element, { + focusin: function (event) { + this._addClass($(event.currentTarget), null, 'ui-state-focus') + }, + focusout: function (event) { + this._removeClass($(event.currentTarget), null, 'ui-state-focus') + } + }) + }, + + _trigger: function (type, event, data) { + var prop, orig + var callback = this.options[type] + + data = data || {} + event = $.Event(event) + event.type = ( + type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type + ).toLowerCase() + + // The original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[0] + + // Copy original event properties over to the new event + orig = event.originalEvent + if (orig) { + for (prop in orig) { + if (!(prop in event)) { + event[prop] = orig[prop] + } + } + } + + this.element.trigger(event, data) + return !( + ($.isFunction(callback) && + callback.apply(this.element[0], [event].concat(data)) === false) || + event.isDefaultPrevented() + ) + } + } + + $.each({ show: 'fadeIn', hide: 'fadeOut' }, function (method, defaultEffect) { + $.Widget.prototype['_' + method] = function (element, options, callback) { + if (typeof options === 'string') { + options = { effect: options } + } + + var hasOptions + var effectName = !options + ? method + : options === true || typeof options === 'number' + ? defaultEffect + : options.effect || defaultEffect + + options = options || {} + if (typeof options === 'number') { + options = { duration: options } + } + + hasOptions = !$.isEmptyObject(options) + options.complete = callback + + if (options.delay) { + element.delay(options.delay) + } + + if (hasOptions && $.effects && $.effects.effect[effectName]) { + element[method](options) + } else if (effectName !== method && element[effectName]) { + element[effectName](options.duration, options.easing, callback) + } else { + element.queue(function (next) { + $(this)[method]() + if (callback) { + callback.call(element[0]) + } + next() + }) + } + } + }) + + var widget = $.widget + + /*! + * jQuery UI Position 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + + //>>label: Position + //>>group: Core + //>>description: Positions elements relative to other elements. + //>>docs: http://api.jqueryui.com/position/ + //>>demos: http://jqueryui.com/position/ + + ;(function () { + var cachedScrollbarWidth, + max = Math.max, + abs = Math.abs, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position + + function getOffsets(offsets, width, height) { + return [ + parseFloat(offsets[0]) * (rpercent.test(offsets[0]) ? width / 100 : 1), + parseFloat(offsets[1]) * (rpercent.test(offsets[1]) ? height / 100 : 1) + ] + } + + function parseCss(element, property) { + return parseInt($.css(element, property), 10) || 0 + } + + function getDimensions(elem) { + var raw = elem[0] + if (raw.nodeType === 9) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + } + } + if ($.isWindow(raw)) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + } + } + if (raw.preventDefault) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + } + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + } + } + + $.position = { + scrollbarWidth: function () { + if (cachedScrollbarWidth !== undefined) { + return cachedScrollbarWidth + } + var w1, + w2, + div = $( + '<div ' + + "style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" + + "<div style='height:100px;width:auto;'></div></div>" + ), + innerDiv = div.children()[0] + + $('body').append(div) + w1 = innerDiv.offsetWidth + div.css('overflow', 'scroll') + + w2 = innerDiv.offsetWidth + + if (w1 === w2) { + w2 = div[0].clientWidth + } + + div.remove() + + return (cachedScrollbarWidth = w1 - w2) + }, + getScrollInfo: function (within) { + var overflowX = + within.isWindow || within.isDocument ? '' : within.element.css('overflow-x'), + overflowY = within.isWindow || within.isDocument ? '' : within.element.css('overflow-y'), + hasOverflowX = + overflowX === 'scroll' || + (overflowX === 'auto' && within.width < within.element[0].scrollWidth), + hasOverflowY = + overflowY === 'scroll' || + (overflowY === 'auto' && within.height < within.element[0].scrollHeight) + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + } + }, + getWithinInfo: function (element) { + var withinElement = $(element || window), + isWindow = $.isWindow(withinElement[0]), + isDocument = !!withinElement[0] && withinElement[0].nodeType === 9, + hasOffset = !isWindow && !isDocument + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: hasOffset ? $(element).offset() : { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + width: withinElement.outerWidth(), + height: withinElement.outerHeight() + } + } + } + + $.fn.position = function (options) { + if (!options || !options.of) { + return _position.apply(this, arguments) + } + + // Make a copy, we don't want to modify arguments + options = $.extend({}, options) + + var atOffset, + targetWidth, + targetHeight, + targetOffset, + basePosition, + dimensions, + target = $(options.of), + within = $.position.getWithinInfo(options.within), + scrollInfo = $.position.getScrollInfo(within), + collision = (options.collision || 'flip').split(' '), + offsets = {} + + dimensions = getDimensions(target) + if (target[0].preventDefault) { + // Force left top to allow flipping + options.at = 'left top' + } + targetWidth = dimensions.width + targetHeight = dimensions.height + targetOffset = dimensions.offset + + // Clone to reuse original targetOffset later + basePosition = $.extend({}, targetOffset) + + // Force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each(['my', 'at'], function () { + var pos = (options[this] || '').split(' '), + horizontalOffset, + verticalOffset + + if (pos.length === 1) { + pos = rhorizontal.test(pos[0]) + ? pos.concat(['center']) + : rvertical.test(pos[0]) + ? ['center'].concat(pos) + : ['center', 'center'] + } + pos[0] = rhorizontal.test(pos[0]) ? pos[0] : 'center' + pos[1] = rvertical.test(pos[1]) ? pos[1] : 'center' + + // Calculate offsets + horizontalOffset = roffset.exec(pos[0]) + verticalOffset = roffset.exec(pos[1]) + offsets[this] = [ + horizontalOffset ? horizontalOffset[0] : 0, + verticalOffset ? verticalOffset[0] : 0 + ] + + // Reduce to just the positions without the offsets + options[this] = [rposition.exec(pos[0])[0], rposition.exec(pos[1])[0]] + }) + + // Normalize collision option + if (collision.length === 1) { + collision[1] = collision[0] + } + + if (options.at[0] === 'right') { + basePosition.left += targetWidth + } else if (options.at[0] === 'center') { + basePosition.left += targetWidth / 2 + } + + if (options.at[1] === 'bottom') { + basePosition.top += targetHeight + } else if (options.at[1] === 'center') { + basePosition.top += targetHeight / 2 + } + + atOffset = getOffsets(offsets.at, targetWidth, targetHeight) + basePosition.left += atOffset[0] + basePosition.top += atOffset[1] + + return this.each(function () { + var collisionPosition, + using, + elem = $(this), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss(this, 'marginLeft'), + marginTop = parseCss(this, 'marginTop'), + collisionWidth = + elemWidth + marginLeft + parseCss(this, 'marginRight') + scrollInfo.width, + collisionHeight = + elemHeight + marginTop + parseCss(this, 'marginBottom') + scrollInfo.height, + position = $.extend({}, basePosition), + myOffset = getOffsets(offsets.my, elem.outerWidth(), elem.outerHeight()) + + if (options.my[0] === 'right') { + position.left -= elemWidth + } else if (options.my[0] === 'center') { + position.left -= elemWidth / 2 + } + + if (options.my[1] === 'bottom') { + position.top -= elemHeight + } else if (options.my[1] === 'center') { + position.top -= elemHeight / 2 + } + + position.left += myOffset[0] + position.top += myOffset[1] + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + } + + $.each(['left', 'top'], function (i, dir) { + if ($.ui.position[collision[i]]) { + $.ui.position[collision[i]][dir](position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [atOffset[0] + myOffset[0], atOffset[1] + myOffset[1]], + my: options.my, + at: options.at, + within: within, + elem: elem + }) + } + }) + + if (options.using) { + // Adds feedback as second argument to using callback, if present + using = function (props) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? 'left' : left > 0 ? 'right' : 'center', + vertical: bottom < 0 ? 'top' : top > 0 ? 'bottom' : 'middle' + } + if (targetWidth < elemWidth && abs(left + right) < targetWidth) { + feedback.horizontal = 'center' + } + if (targetHeight < elemHeight && abs(top + bottom) < targetHeight) { + feedback.vertical = 'middle' + } + if (max(abs(left), abs(right)) > max(abs(top), abs(bottom))) { + feedback.important = 'horizontal' + } else { + feedback.important = 'vertical' + } + options.using.call(this, props, feedback) + } + } + + elem.offset($.extend(position, { using: using })) + }) + } + + $.ui.position = { + fit: { + left: function (position, data) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight + + // Element is wider than within + if (data.collisionWidth > outerWidth) { + // Element is initially over the left side of within + if (overLeft > 0 && overRight <= 0) { + newOverRight = + position.left + overLeft + data.collisionWidth - outerWidth - withinOffset + position.left += overLeft - newOverRight + + // Element is initially over right side of within + } else if (overRight > 0 && overLeft <= 0) { + position.left = withinOffset + + // Element is initially over both left and right sides of within + } else { + if (overLeft > overRight) { + position.left = withinOffset + outerWidth - data.collisionWidth + } else { + position.left = withinOffset + } + } + + // Too far left -> align with left edge + } else if (overLeft > 0) { + position.left += overLeft + + // Too far right -> align with right edge + } else if (overRight > 0) { + position.left -= overRight + + // Adjust based on position and margin + } else { + position.left = max(position.left - collisionPosLeft, position.left) + } + }, + top: function (position, data) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom + + // Element is taller than within + if (data.collisionHeight > outerHeight) { + // Element is initially over the top of within + if (overTop > 0 && overBottom <= 0) { + newOverBottom = + position.top + overTop + data.collisionHeight - outerHeight - withinOffset + position.top += overTop - newOverBottom + + // Element is initially over bottom of within + } else if (overBottom > 0 && overTop <= 0) { + position.top = withinOffset + + // Element is initially over both top and bottom of within + } else { + if (overTop > overBottom) { + position.top = withinOffset + outerHeight - data.collisionHeight + } else { + position.top = withinOffset + } + } + + // Too far up -> align with top + } else if (overTop > 0) { + position.top += overTop + + // Too far down -> align with bottom edge + } else if (overBottom > 0) { + position.top -= overBottom + + // Adjust based on position and margin + } else { + position.top = max(position.top - collisionPosTop, position.top) + } + } + }, + flip: { + left: function (position, data) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = + data.my[0] === 'left' ? -data.elemWidth : data.my[0] === 'right' ? data.elemWidth : 0, + atOffset = + data.at[0] === 'left' + ? data.targetWidth + : data.at[0] === 'right' + ? -data.targetWidth + : 0, + offset = -2 * data.offset[0], + newOverRight, + newOverLeft + + if (overLeft < 0) { + newOverRight = + position.left + + myOffset + + atOffset + + offset + + data.collisionWidth - + outerWidth - + withinOffset + if (newOverRight < 0 || newOverRight < abs(overLeft)) { + position.left += myOffset + atOffset + offset + } + } else if (overRight > 0) { + newOverLeft = + position.left - + data.collisionPosition.marginLeft + + myOffset + + atOffset + + offset - + offsetLeft + if (newOverLeft > 0 || abs(newOverLeft) < overRight) { + position.left += myOffset + atOffset + offset + } + } + }, + top: function (position, data) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[1] === 'top', + myOffset = top ? -data.elemHeight : data.my[1] === 'bottom' ? data.elemHeight : 0, + atOffset = + data.at[1] === 'top' + ? data.targetHeight + : data.at[1] === 'bottom' + ? -data.targetHeight + : 0, + offset = -2 * data.offset[1], + newOverTop, + newOverBottom + if (overTop < 0) { + newOverBottom = + position.top + + myOffset + + atOffset + + offset + + data.collisionHeight - + outerHeight - + withinOffset + if (newOverBottom < 0 || newOverBottom < abs(overTop)) { + position.top += myOffset + atOffset + offset + } + } else if (overBottom > 0) { + newOverTop = + position.top - + data.collisionPosition.marginTop + + myOffset + + atOffset + + offset - + offsetTop + if (newOverTop > 0 || abs(newOverTop) < overBottom) { + position.top += myOffset + atOffset + offset + } + } + } + }, + flipfit: { + left: function () { + $.ui.position.flip.left.apply(this, arguments) + $.ui.position.fit.left.apply(this, arguments) + }, + top: function () { + $.ui.position.flip.top.apply(this, arguments) + $.ui.position.fit.top.apply(this, arguments) + } + } + } + })() + + var position = $.ui.position + + /*! + * jQuery UI :data 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: :data Selector + //>>group: Core + //>>description: Selects elements which have data stored under the specified key. + //>>docs: http://api.jqueryui.com/data-selector/ + + var data = $.extend($.expr[':'], { + data: $.expr.createPseudo + ? $.expr.createPseudo(function (dataName) { + return function (elem) { + return !!$.data(elem, dataName) + } + }) + : // Support: jQuery <1.8 + function (elem, i, match) { + return !!$.data(elem, match[3]) + } + }) + + /*! + * jQuery UI Disable Selection 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: disableSelection + //>>group: Core + //>>description: Disable selection of text content within the set of matched elements. + //>>docs: http://api.jqueryui.com/disableSelection/ + + // This file is deprecated + + var disableSelection = $.fn.extend({ + disableSelection: (function () { + var eventType = 'onselectstart' in document.createElement('div') ? 'selectstart' : 'mousedown' + + return function () { + return this.on(eventType + '.ui-disableSelection', function (event) { + event.preventDefault() + }) + } + })(), + + enableSelection: function () { + return this.off('.ui-disableSelection') + } + }) + + /*! + * jQuery UI Effects 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Effects Core + //>>group: Effects + // jscs:disable maximumLineLength + //>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects. + // jscs:enable maximumLineLength + //>>docs: http://api.jqueryui.com/category/effects-core/ + //>>demos: http://jqueryui.com/effect/ + + var dataSpace = 'ui-effects-', + dataSpaceStyle = 'ui-effects-style', + dataSpaceAnimated = 'ui-effects-animated', + // Create a local jQuery because jQuery Color relies on it and the + // global may not exist with AMD and a custom build (#10199) + jQuery = $ + + $.effects = { + effect: {} + } + + /*! + * jQuery Color Animations v2.1.2 + * https://github.com/jquery/jquery-color + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * Date: Wed Jan 16 08:47:09 2013 -0600 + */ + ;(function (jQuery, undefined) { + var stepHooks = + 'backgroundColor borderBottomColor borderLeftColor borderRightColor ' + + 'borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor', + // Plusequals test for += 100 -= 100 + rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, + // A set of RE's that can match strings and generate color tuples. + stringParsers = [ + { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function (execResult) { + return [execResult[1], execResult[2], execResult[3], execResult[4]] + } + }, + { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function (execResult) { + return [execResult[1] * 2.55, execResult[2] * 2.55, execResult[3] * 2.55, execResult[4]] + } + }, + { + // This regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, + parse: function (execResult) { + return [ + parseInt(execResult[1], 16), + parseInt(execResult[2], 16), + parseInt(execResult[3], 16) + ] + } + }, + { + // This regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, + parse: function (execResult) { + return [ + parseInt(execResult[1] + execResult[1], 16), + parseInt(execResult[2] + execResult[2], 16), + parseInt(execResult[3] + execResult[3], 16) + ] + } + }, + { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + space: 'hsla', + parse: function (execResult) { + return [execResult[1], execResult[2] / 100, execResult[3] / 100, execResult[4]] + } + } + ], + // JQuery.Color( ) + color = (jQuery.Color = function (color, green, blue, alpha) { + return new jQuery.Color.fn.parse(color, green, blue, alpha) + }), + spaces = { + rgba: { + props: { + red: { + idx: 0, + type: 'byte' + }, + green: { + idx: 1, + type: 'byte' + }, + blue: { + idx: 2, + type: 'byte' + } + } + }, + + hsla: { + props: { + hue: { + idx: 0, + type: 'degrees' + }, + saturation: { + idx: 1, + type: 'percent' + }, + lightness: { + idx: 2, + type: 'percent' + } + } + } + }, + propTypes = { + byte: { + floor: true, + max: 255 + }, + percent: { + max: 1 + }, + degrees: { + mod: 360, + floor: true + } + }, + support = (color.support = {}), + // Element for support tests + supportElem = jQuery('<p>')[0], + // Colors = jQuery.Color.names + colors, + // Local aliases of functions called often + each = jQuery.each + + // Determine rgba support immediately + supportElem.style.cssText = 'background-color:rgba(1,1,1,.5)' + support.rgba = supportElem.style.backgroundColor.indexOf('rgba') > -1 + + // Define cache name and alpha properties + // for rgba and hsla spaces + each(spaces, function (spaceName, space) { + space.cache = '_' + spaceName + space.props.alpha = { + idx: 3, + type: 'percent', + def: 1 + } + }) + + function clamp(value, prop, allowEmpty) { + var type = propTypes[prop.type] || {} + + if (value == null) { + return allowEmpty || !prop.def ? null : prop.def + } + + // ~~ is an short way of doing floor for positive numbers + value = type.floor ? ~~value : parseFloat(value) + + // IE will pass in empty strings as value for alpha, + // which will hit this case + if (isNaN(value)) { + return prop.def + } + + if (type.mod) { + // We add mod before modding to make sure that negatives values + // get converted properly: -10 -> 350 + return (value + type.mod) % type.mod + } + + // For now all property types without mod have min and max + return 0 > value ? 0 : type.max < value ? type.max : value + } + + function stringParse(string) { + var inst = color(), + rgba = (inst._rgba = []) + + string = string.toLowerCase() + + each(stringParsers, function (i, parser) { + var parsed, + match = parser.re.exec(string), + values = match && parser.parse(match), + spaceName = parser.space || 'rgba' + + if (values) { + parsed = inst[spaceName](values) + + // If this was an rgba parse the assignment might happen twice + // oh well.... + inst[spaces[spaceName].cache] = parsed[spaces[spaceName].cache] + rgba = inst._rgba = parsed._rgba + + // Exit each( stringParsers ) here because we matched + return false + } + }) + + // Found a stringParser that handled it + if (rgba.length) { + // If this came from a parsed string, force "transparent" when alpha is 0 + // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) + if (rgba.join() === '0,0,0,0') { + jQuery.extend(rgba, colors.transparent) + } + return inst + } + + // Named colors + return colors[string] + } + + color.fn = jQuery.extend(color.prototype, { + parse: function (red, green, blue, alpha) { + if (red === undefined) { + this._rgba = [null, null, null, null] + return this + } + if (red.jquery || red.nodeType) { + red = jQuery(red).css(green) + green = undefined + } + + var inst = this, + type = jQuery.type(red), + rgba = (this._rgba = []) + + // More than 1 argument specified - assume ( red, green, blue, alpha ) + if (green !== undefined) { + red = [red, green, blue, alpha] + type = 'array' + } + + if (type === 'string') { + return this.parse(stringParse(red) || colors._default) + } + + if (type === 'array') { + each(spaces.rgba.props, function (key, prop) { + rgba[prop.idx] = clamp(red[prop.idx], prop) + }) + return this + } + + if (type === 'object') { + if (red instanceof color) { + each(spaces, function (spaceName, space) { + if (red[space.cache]) { + inst[space.cache] = red[space.cache].slice() + } + }) + } else { + each(spaces, function (spaceName, space) { + var cache = space.cache + each(space.props, function (key, prop) { + // If the cache doesn't exist, and we know how to convert + if (!inst[cache] && space.to) { + // If the value was null, we don't need to copy it + // if the key was alpha, we don't need to copy it either + if (key === 'alpha' || red[key] == null) { + return + } + inst[cache] = space.to(inst._rgba) + } + + // This is the only case where we allow nulls for ALL properties. + // call clamp with alwaysAllowEmpty + inst[cache][prop.idx] = clamp(red[key], prop, true) + }) + + // Everything defined but alpha? + if (inst[cache] && jQuery.inArray(null, inst[cache].slice(0, 3)) < 0) { + // Use the default of 1 + inst[cache][3] = 1 + if (space.from) { + inst._rgba = space.from(inst[cache]) + } + } + }) + } + return this + } + }, + is: function (compare) { + var is = color(compare), + same = true, + inst = this + + each(spaces, function (_, space) { + var localCache, + isCache = is[space.cache] + if (isCache) { + localCache = inst[space.cache] || (space.to && space.to(inst._rgba)) || [] + each(space.props, function (_, prop) { + if (isCache[prop.idx] != null) { + same = isCache[prop.idx] === localCache[prop.idx] + return same + } + }) + } + return same + }) + return same + }, + _space: function () { + var used = [], + inst = this + each(spaces, function (spaceName, space) { + if (inst[space.cache]) { + used.push(spaceName) + } + }) + return used.pop() + }, + transition: function (other, distance) { + var end = color(other), + spaceName = end._space(), + space = spaces[spaceName], + startColor = this.alpha() === 0 ? color('transparent') : this, + start = startColor[space.cache] || space.to(startColor._rgba), + result = start.slice() + + end = end[space.cache] + each(space.props, function (key, prop) { + var index = prop.idx, + startValue = start[index], + endValue = end[index], + type = propTypes[prop.type] || {} + + // If null, don't override start value + if (endValue === null) { + return + } + + // If null - use end + if (startValue === null) { + result[index] = endValue + } else { + if (type.mod) { + if (endValue - startValue > type.mod / 2) { + startValue += type.mod + } else if (startValue - endValue > type.mod / 2) { + startValue -= type.mod + } + } + result[index] = clamp((endValue - startValue) * distance + startValue, prop) + } + }) + return this[spaceName](result) + }, + blend: function (opaque) { + // If we are already opaque - return ourself + if (this._rgba[3] === 1) { + return this + } + + var rgb = this._rgba.slice(), + a = rgb.pop(), + blend = color(opaque)._rgba + + return color( + jQuery.map(rgb, function (v, i) { + return (1 - a) * blend[i] + a * v + }) + ) + }, + toRgbaString: function () { + var prefix = 'rgba(', + rgba = jQuery.map(this._rgba, function (v, i) { + return v == null ? (i > 2 ? 1 : 0) : v + }) + + if (rgba[3] === 1) { + rgba.pop() + prefix = 'rgb(' + } + + return prefix + rgba.join() + ')' + }, + toHslaString: function () { + var prefix = 'hsla(', + hsla = jQuery.map(this.hsla(), function (v, i) { + if (v == null) { + v = i > 2 ? 1 : 0 + } + + // Catch 1 and 2 + if (i && i < 3) { + v = Math.round(v * 100) + '%' + } + return v + }) + + if (hsla[3] === 1) { + hsla.pop() + prefix = 'hsl(' + } + return prefix + hsla.join() + ')' + }, + toHexString: function (includeAlpha) { + var rgba = this._rgba.slice(), + alpha = rgba.pop() + + if (includeAlpha) { + rgba.push(~~(alpha * 255)) + } + + return ( + '#' + + jQuery + .map(rgba, function (v) { + // Default to 0 when nulls exist + v = (v || 0).toString(16) + return v.length === 1 ? '0' + v : v + }) + .join('') + ) + }, + toString: function () { + return this._rgba[3] === 0 ? 'transparent' : this.toRgbaString() + } + }) + color.fn.parse.prototype = color.fn + + // Hsla conversions adapted from: + // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 + + function hue2rgb(p, q, h) { + h = (h + 1) % 1 + if (h * 6 < 1) { + return p + (q - p) * h * 6 + } + if (h * 2 < 1) { + return q + } + if (h * 3 < 2) { + return p + (q - p) * (2 / 3 - h) * 6 + } + return p + } + + spaces.hsla.to = function (rgba) { + if (rgba[0] == null || rgba[1] == null || rgba[2] == null) { + return [null, null, null, rgba[3]] + } + var r = rgba[0] / 255, + g = rgba[1] / 255, + b = rgba[2] / 255, + a = rgba[3], + max = Math.max(r, g, b), + min = Math.min(r, g, b), + diff = max - min, + add = max + min, + l = add * 0.5, + h, + s + + if (min === max) { + h = 0 + } else if (r === max) { + h = (60 * (g - b)) / diff + 360 + } else if (g === max) { + h = (60 * (b - r)) / diff + 120 + } else { + h = (60 * (r - g)) / diff + 240 + } + + // Chroma (diff) == 0 means greyscale which, by definition, saturation = 0% + // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) + if (diff === 0) { + s = 0 + } else if (l <= 0.5) { + s = diff / add + } else { + s = diff / (2 - add) + } + return [Math.round(h) % 360, s, l, a == null ? 1 : a] + } + + spaces.hsla.from = function (hsla) { + if (hsla[0] == null || hsla[1] == null || hsla[2] == null) { + return [null, null, null, hsla[3]] + } + var h = hsla[0] / 360, + s = hsla[1], + l = hsla[2], + a = hsla[3], + q = l <= 0.5 ? l * (1 + s) : l + s - l * s, + p = 2 * l - q + + return [ + Math.round(hue2rgb(p, q, h + 1 / 3) * 255), + Math.round(hue2rgb(p, q, h) * 255), + Math.round(hue2rgb(p, q, h - 1 / 3) * 255), + a + ] + } + + each(spaces, function (spaceName, space) { + var props = space.props, + cache = space.cache, + to = space.to, + from = space.from + + // Makes rgba() and hsla() + color.fn[spaceName] = function (value) { + // Generate a cache for this space if it doesn't exist + if (to && !this[cache]) { + this[cache] = to(this._rgba) + } + if (value === undefined) { + return this[cache].slice() + } + + var ret, + type = jQuery.type(value), + arr = type === 'array' || type === 'object' ? value : arguments, + local = this[cache].slice() + + each(props, function (key, prop) { + var val = arr[type === 'object' ? key : prop.idx] + if (val == null) { + val = local[prop.idx] + } + local[prop.idx] = clamp(val, prop) + }) + + if (from) { + ret = color(from(local)) + ret[cache] = local + return ret + } else { + return color(local) + } + } + + // Makes red() green() blue() alpha() hue() saturation() lightness() + each(props, function (key, prop) { + // Alpha is included in more than one space + if (color.fn[key]) { + return + } + color.fn[key] = function (value) { + var vtype = jQuery.type(value), + fn = key === 'alpha' ? (this._hsla ? 'hsla' : 'rgba') : spaceName, + local = this[fn](), + cur = local[prop.idx], + match + + if (vtype === 'undefined') { + return cur + } + + if (vtype === 'function') { + value = value.call(this, cur) + vtype = jQuery.type(value) + } + if (value == null && prop.empty) { + return this + } + if (vtype === 'string') { + match = rplusequals.exec(value) + if (match) { + value = cur + parseFloat(match[2]) * (match[1] === '+' ? 1 : -1) + } + } + local[prop.idx] = value + return this[fn](local) + } + }) + }) + + // Add cssHook and .fx.step function for each named hook. + // accept a space separated string of properties + color.hook = function (hook) { + var hooks = hook.split(' ') + each(hooks, function (i, hook) { + jQuery.cssHooks[hook] = { + set: function (elem, value) { + var parsed, + curElem, + backgroundColor = '' + + if ( + value !== 'transparent' && + (jQuery.type(value) !== 'string' || (parsed = stringParse(value))) + ) { + value = color(parsed || value) + if (!support.rgba && value._rgba[3] !== 1) { + curElem = hook === 'backgroundColor' ? elem.parentNode : elem + while ( + (backgroundColor === '' || backgroundColor === 'transparent') && + curElem && + curElem.style + ) { + try { + backgroundColor = jQuery.css(curElem, 'backgroundColor') + curElem = curElem.parentNode + } catch (e) {} + } + + value = value.blend( + backgroundColor && backgroundColor !== 'transparent' + ? backgroundColor + : '_default' + ) + } + + value = value.toRgbaString() + } + try { + elem.style[hook] = value + } catch (e) { + // Wrapped to prevent IE from throwing errors on "invalid" values like + // 'auto' or 'inherit' + } + } + } + jQuery.fx.step[hook] = function (fx) { + if (!fx.colorInit) { + fx.start = color(fx.elem, hook) + fx.end = color(fx.end) + fx.colorInit = true + } + jQuery.cssHooks[hook].set(fx.elem, fx.start.transition(fx.end, fx.pos)) + } + }) + } + + color.hook(stepHooks) + + jQuery.cssHooks.borderColor = { + expand: function (value) { + var expanded = {} + + each(['Top', 'Right', 'Bottom', 'Left'], function (i, part) { + expanded['border' + part + 'Color'] = value + }) + return expanded + } + } + + // Basic color names only. + // Usage of any of the other color names requires adding yourself or including + // jquery.color.svg-names.js. + colors = jQuery.Color.names = { + // 4.1. Basic color keywords + aqua: '#00ffff', + black: '#000000', + blue: '#0000ff', + fuchsia: '#ff00ff', + gray: '#808080', + green: '#008000', + lime: '#00ff00', + maroon: '#800000', + navy: '#000080', + olive: '#808000', + purple: '#800080', + red: '#ff0000', + silver: '#c0c0c0', + teal: '#008080', + white: '#ffffff', + yellow: '#ffff00', + + // 4.2.3. "transparent" color keyword + transparent: [null, null, null, 0], + + _default: '#ffffff' + } + })(jQuery) + + /******************************************************************************/ + /****************************** CLASS ANIMATIONS ******************************/ + /******************************************************************************/ + ;(function () { + var classAnimationActions = ['add', 'remove', 'toggle'], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + } + + $.each( + ['borderLeftStyle', 'borderRightStyle', 'borderBottomStyle', 'borderTopStyle'], + function (_, prop) { + $.fx.step[prop] = function (fx) { + if ((fx.end !== 'none' && !fx.setAttr) || (fx.pos === 1 && !fx.setAttr)) { + jQuery.style(fx.elem, prop, fx.end) + fx.setAttr = true + } + } + } + ) + + function getElementStyles(elem) { + var key, + len, + style = elem.ownerDocument.defaultView + ? elem.ownerDocument.defaultView.getComputedStyle(elem, null) + : elem.currentStyle, + styles = {} + + if (style && style.length && style[0] && style[style[0]]) { + len = style.length + while (len--) { + key = style[len] + if (typeof style[key] === 'string') { + styles[$.camelCase(key)] = style[key] + } + } + + // Support: Opera, IE <9 + } else { + for (key in style) { + if (typeof style[key] === 'string') { + styles[key] = style[key] + } + } + } + + return styles + } + + function styleDifference(oldStyle, newStyle) { + var diff = {}, + name, + value + + for (name in newStyle) { + value = newStyle[name] + if (oldStyle[name] !== value) { + if (!shorthandStyles[name]) { + if ($.fx.step[name] || !isNaN(parseFloat(value))) { + diff[name] = value + } + } + } + } + + return diff + } + + // Support: jQuery <1.8 + if (!$.fn.addBack) { + $.fn.addBack = function (selector) { + return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector)) + } + } + + $.effects.animateClass = function (value, duration, easing, callback) { + var o = $.speed(duration, easing, callback) + + return this.queue(function () { + var animated = $(this), + baseClass = animated.attr('class') || '', + applyClassChange, + allAnimations = o.children ? animated.find('*').addBack() : animated + + // Map the animated objects to store the original styles. + allAnimations = allAnimations.map(function () { + var el = $(this) + return { + el: el, + start: getElementStyles(this) + } + }) + + // Apply class change + applyClassChange = function () { + $.each(classAnimationActions, function (i, action) { + if (value[action]) { + animated[action + 'Class'](value[action]) + } + }) + } + applyClassChange() + + // Map all animated objects again - calculate new styles and diff + allAnimations = allAnimations.map(function () { + this.end = getElementStyles(this.el[0]) + this.diff = styleDifference(this.start, this.end) + return this + }) + + // Apply original class + animated.attr('class', baseClass) + + // Map all animated objects again - this time collecting a promise + allAnimations = allAnimations.map(function () { + var styleInfo = this, + dfd = $.Deferred(), + opts = $.extend({}, o, { + queue: false, + complete: function () { + dfd.resolve(styleInfo) + } + }) + + this.el.animate(this.diff, opts) + return dfd.promise() + }) + + // Once all animations have completed: + $.when.apply($, allAnimations.get()).done(function () { + // Set the final class + applyClassChange() + + // For each animated element, + // clear all css properties that were animated + $.each(arguments, function () { + var el = this.el + $.each(this.diff, function (key) { + el.css(key, '') + }) + }) + + // This is guarnteed to be there if you use jQuery.speed() + // it also handles dequeuing the next anim... + o.complete.call(animated[0]) + }) + }) + } + + $.fn.extend({ + addClass: (function (orig) { + return function (classNames, speed, easing, callback) { + return speed + ? $.effects.animateClass.call(this, { add: classNames }, speed, easing, callback) + : orig.apply(this, arguments) + } + })($.fn.addClass), + + removeClass: (function (orig) { + return function (classNames, speed, easing, callback) { + return arguments.length > 1 + ? $.effects.animateClass.call(this, { remove: classNames }, speed, easing, callback) + : orig.apply(this, arguments) + } + })($.fn.removeClass), + + toggleClass: (function (orig) { + return function (classNames, force, speed, easing, callback) { + if (typeof force === 'boolean' || force === undefined) { + if (!speed) { + // Without speed parameter + return orig.apply(this, arguments) + } else { + return $.effects.animateClass.call( + this, + force ? { add: classNames } : { remove: classNames }, + speed, + easing, + callback + ) + } + } else { + // Without force parameter + return $.effects.animateClass.call(this, { toggle: classNames }, force, speed, easing) + } + } + })($.fn.toggleClass), + + switchClass: function (remove, add, speed, easing, callback) { + return $.effects.animateClass.call( + this, + { + add: add, + remove: remove + }, + speed, + easing, + callback + ) + } + }) + })() + + /******************************************************************************/ + /*********************************** EFFECTS **********************************/ + /******************************************************************************/ + + ;(function () { + if ($.expr && $.expr.filters && $.expr.filters.animated) { + $.expr.filters.animated = (function (orig) { + return function (elem) { + return !!$(elem).data(dataSpaceAnimated) || orig(elem) + } + })($.expr.filters.animated) + } + + if ($.uiBackCompat !== false) { + $.extend($.effects, { + // Saves a set of properties in a data storage + save: function (element, set) { + var i = 0, + length = set.length + for (; i < length; i++) { + if (set[i] !== null) { + element.data(dataSpace + set[i], element[0].style[set[i]]) + } + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function (element, set) { + var val, + i = 0, + length = set.length + for (; i < length; i++) { + if (set[i] !== null) { + val = element.data(dataSpace + set[i]) + element.css(set[i], val) + } + } + }, + + setMode: function (el, mode) { + if (mode === 'toggle') { + mode = el.is(':hidden') ? 'show' : 'hide' + } + return mode + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function (element) { + // If the element is already wrapped, return it + if (element.parent().is('.ui-effects-wrapper')) { + return element.parent() + } + + // Wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + float: element.css('float') + }, + wrapper = $('<div></div>').addClass('ui-effects-wrapper').css({ + fontSize: '100%', + background: 'transparent', + border: 'none', + margin: 0, + padding: 0 + }), + // Store the size in case width/height are defined in % - Fixes #5245 + size = { + width: element.width(), + height: element.height() + }, + active = document.activeElement + + // Support: Firefox + // Firefox incorrectly exposes anonymous content + // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 + try { + active.id + } catch (e) { + active = document.body + } + + element.wrap(wrapper) + + // Fixes #7595 - Elements lose focus when wrapped. + if (element[0] === active || $.contains(element[0], active)) { + $(active).trigger('focus') + } + + // Hotfix for jQuery 1.4 since some change in wrap() seems to actually + // lose the reference to the wrapped element + wrapper = element.parent() + + // Transfer positioning properties to the wrapper + if (element.css('position') === 'static') { + wrapper.css({ position: 'relative' }) + element.css({ position: 'relative' }) + } else { + $.extend(props, { + position: element.css('position'), + zIndex: element.css('z-index') + }) + $.each(['top', 'left', 'bottom', 'right'], function (i, pos) { + props[pos] = element.css(pos) + if (isNaN(parseInt(props[pos], 10))) { + props[pos] = 'auto' + } + }) + element.css({ + position: 'relative', + top: 0, + left: 0, + right: 'auto', + bottom: 'auto' + }) + } + element.css(size) + + return wrapper.css(props).show() + }, + + removeWrapper: function (element) { + var active = document.activeElement + + if (element.parent().is('.ui-effects-wrapper')) { + element.parent().replaceWith(element) + + // Fixes #7595 - Elements lose focus when wrapped. + if (element[0] === active || $.contains(element[0], active)) { + $(active).trigger('focus') + } + } + + return element + } + }) + } + + $.extend($.effects, { + version: '1.12.1', + + define: function (name, mode, effect) { + if (!effect) { + effect = mode + mode = 'effect' + } + + $.effects.effect[name] = effect + $.effects.effect[name].mode = mode + + return effect + }, + + scaledDimensions: function (element, percent, direction) { + if (percent === 0) { + return { + height: 0, + width: 0, + outerHeight: 0, + outerWidth: 0 + } + } + + var x = direction !== 'horizontal' ? (percent || 100) / 100 : 1, + y = direction !== 'vertical' ? (percent || 100) / 100 : 1 + + return { + height: element.height() * y, + width: element.width() * x, + outerHeight: element.outerHeight() * y, + outerWidth: element.outerWidth() * x + } + }, + + clipToBox: function (animation) { + return { + width: animation.clip.right - animation.clip.left, + height: animation.clip.bottom - animation.clip.top, + left: animation.clip.left, + top: animation.clip.top + } + }, + + // Injects recently queued functions to be first in line (after "inprogress") + unshift: function (element, queueLength, count) { + var queue = element.queue() + + if (queueLength > 1) { + queue.splice.apply(queue, [1, 0].concat(queue.splice(queueLength, count))) + } + element.dequeue() + }, + + saveStyle: function (element) { + element.data(dataSpaceStyle, element[0].style.cssText) + }, + + restoreStyle: function (element) { + element[0].style.cssText = element.data(dataSpaceStyle) || '' + element.removeData(dataSpaceStyle) + }, + + mode: function (element, mode) { + var hidden = element.is(':hidden') + + if (mode === 'toggle') { + mode = hidden ? 'show' : 'hide' + } + if (hidden ? mode === 'hide' : mode === 'show') { + mode = 'none' + } + return mode + }, + + // Translates a [top,left] array into a baseline value + getBaseline: function (origin, original) { + var y, x + + switch (origin[0]) { + case 'top': + y = 0 + break + case 'middle': + y = 0.5 + break + case 'bottom': + y = 1 + break + default: + y = origin[0] / original.height + } + + switch (origin[1]) { + case 'left': + x = 0 + break + case 'center': + x = 0.5 + break + case 'right': + x = 1 + break + default: + x = origin[1] / original.width + } + + return { + x: x, + y: y + } + }, + + // Creates a placeholder element so that the original element can be made absolute + createPlaceholder: function (element) { + var placeholder, + cssPosition = element.css('position'), + position = element.position() + + // Lock in margins first to account for form elements, which + // will change margin if you explicitly set height + // see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380 + // Support: Safari + element + .css({ + marginTop: element.css('marginTop'), + marginBottom: element.css('marginBottom'), + marginLeft: element.css('marginLeft'), + marginRight: element.css('marginRight') + }) + .outerWidth(element.outerWidth()) + .outerHeight(element.outerHeight()) + + if (/^(static|relative)/.test(cssPosition)) { + cssPosition = 'absolute' + + placeholder = $('<' + element[0].nodeName + '>') + .insertAfter(element) + .css({ + // Convert inline to inline block to account for inline elements + // that turn to inline block based on content (like img) + display: /^(inline|ruby)/.test(element.css('display')) ? 'inline-block' : 'block', + visibility: 'hidden', + + // Margins need to be set to account for margin collapse + marginTop: element.css('marginTop'), + marginBottom: element.css('marginBottom'), + marginLeft: element.css('marginLeft'), + marginRight: element.css('marginRight'), + float: element.css('float') + }) + .outerWidth(element.outerWidth()) + .outerHeight(element.outerHeight()) + .addClass('ui-effects-placeholder') + + element.data(dataSpace + 'placeholder', placeholder) + } + + element.css({ + position: cssPosition, + left: position.left, + top: position.top + }) + + return placeholder + }, + + removePlaceholder: function (element) { + var dataKey = dataSpace + 'placeholder', + placeholder = element.data(dataKey) + + if (placeholder) { + placeholder.remove() + element.removeData(dataKey) + } + }, + + // Removes a placeholder if it exists and restores + // properties that were modified during placeholder creation + cleanUp: function (element) { + $.effects.restoreStyle(element) + $.effects.removePlaceholder(element) + }, + + setTransition: function (element, list, factor, value) { + value = value || {} + $.each(list, function (i, x) { + var unit = element.cssUnit(x) + if (unit[0] > 0) { + value[x] = unit[0] * factor + unit[1] + } + }) + return value + } + }) + + // Return an effect options object for the given parameters: + function _normalizeArguments(effect, options, speed, callback) { + // Allow passing all options as the first parameter + if ($.isPlainObject(effect)) { + options = effect + effect = effect.effect + } + + // Convert to an object + effect = { effect: effect } + + // Catch (effect, null, ...) + if (options == null) { + options = {} + } + + // Catch (effect, callback) + if ($.isFunction(options)) { + callback = options + speed = null + options = {} + } + + // Catch (effect, speed, ?) + if (typeof options === 'number' || $.fx.speeds[options]) { + callback = speed + speed = options + options = {} + } + + // Catch (effect, options, callback) + if ($.isFunction(speed)) { + callback = speed + speed = null + } + + // Add options to effect + if (options) { + $.extend(effect, options) + } + + speed = speed || options.duration + effect.duration = $.fx.off + ? 0 + : typeof speed === 'number' + ? speed + : speed in $.fx.speeds + ? $.fx.speeds[speed] + : $.fx.speeds._default + + effect.complete = callback || options.complete + + return effect + } + + function standardAnimationOption(option) { + // Valid standard speeds (nothing, number, named speed) + if (!option || typeof option === 'number' || $.fx.speeds[option]) { + return true + } + + // Invalid strings - treat as "normal" speed + if (typeof option === 'string' && !$.effects.effect[option]) { + return true + } + + // Complete callback + if ($.isFunction(option)) { + return true + } + + // Options hash (but not naming an effect) + if (typeof option === 'object' && !option.effect) { + return true + } + + // Didn't match any standard API + return false + } + + $.fn.extend({ + effect: function (/* effect, options, speed, callback */) { + var args = _normalizeArguments.apply(this, arguments), + effectMethod = $.effects.effect[args.effect], + defaultMode = effectMethod.mode, + queue = args.queue, + queueName = queue || 'fx', + complete = args.complete, + mode = args.mode, + modes = [], + prefilter = function (next) { + var el = $(this), + normalizedMode = $.effects.mode(el, mode) || defaultMode + + // Sentinel for duck-punching the :animated psuedo-selector + el.data(dataSpaceAnimated, true) + + // Save effect mode for later use, + // we can't just call $.effects.mode again later, + // as the .show() below destroys the initial state + modes.push(normalizedMode) + + // See $.uiBackCompat inside of run() for removal of defaultMode in 1.13 + if ( + defaultMode && + (normalizedMode === 'show' || + (normalizedMode === defaultMode && normalizedMode === 'hide')) + ) { + el.show() + } + + if (!defaultMode || normalizedMode !== 'none') { + $.effects.saveStyle(el) + } + + if ($.isFunction(next)) { + next() + } + } + + if ($.fx.off || !effectMethod) { + // Delegate to the original method (e.g., .show()) if possible + if (mode) { + return this[mode](args.duration, complete) + } else { + return this.each(function () { + if (complete) { + complete.call(this) + } + }) + } + } + + function run(next) { + var elem = $(this) + + function cleanup() { + elem.removeData(dataSpaceAnimated) + + $.effects.cleanUp(elem) + + if (args.mode === 'hide') { + elem.hide() + } + + done() + } + + function done() { + if ($.isFunction(complete)) { + complete.call(elem[0]) + } + + if ($.isFunction(next)) { + next() + } + } + + // Override mode option on a per element basis, + // as toggle can be either show or hide depending on element state + args.mode = modes.shift() + + if ($.uiBackCompat !== false && !defaultMode) { + if (elem.is(':hidden') ? mode === 'hide' : mode === 'show') { + // Call the core method to track "olddisplay" properly + elem[mode]() + done() + } else { + effectMethod.call(elem[0], args, done) + } + } else { + if (args.mode === 'none') { + // Call the core method to track "olddisplay" properly + elem[mode]() + done() + } else { + effectMethod.call(elem[0], args, cleanup) + } + } + } + + // Run prefilter on all elements first to ensure that + // any showing or hiding happens before placeholder creation, + // which ensures that any layout changes are correctly captured. + return queue === false + ? this.each(prefilter).each(run) + : this.queue(queueName, prefilter).queue(queueName, run) + }, + + show: (function (orig) { + return function (option) { + if (standardAnimationOption(option)) { + return orig.apply(this, arguments) + } else { + var args = _normalizeArguments.apply(this, arguments) + args.mode = 'show' + return this.effect.call(this, args) + } + } + })($.fn.show), + + hide: (function (orig) { + return function (option) { + if (standardAnimationOption(option)) { + return orig.apply(this, arguments) + } else { + var args = _normalizeArguments.apply(this, arguments) + args.mode = 'hide' + return this.effect.call(this, args) + } + } + })($.fn.hide), + + toggle: (function (orig) { + return function (option) { + if (standardAnimationOption(option) || typeof option === 'boolean') { + return orig.apply(this, arguments) + } else { + var args = _normalizeArguments.apply(this, arguments) + args.mode = 'toggle' + return this.effect.call(this, args) + } + } + })($.fn.toggle), + + cssUnit: function (key) { + var style = this.css(key), + val = [] + + $.each(['em', 'px', '%', 'pt'], function (i, unit) { + if (style.indexOf(unit) > 0) { + val = [parseFloat(style), unit] + } + }) + return val + }, + + cssClip: function (clipObj) { + if (clipObj) { + return this.css( + 'clip', + 'rect(' + + clipObj.top + + 'px ' + + clipObj.right + + 'px ' + + clipObj.bottom + + 'px ' + + clipObj.left + + 'px)' + ) + } + return parseClip(this.css('clip'), this) + }, + + transfer: function (options, done) { + var element = $(this), + target = $(options.to), + targetFixed = target.css('position') === 'fixed', + body = $('body'), + fixTop = targetFixed ? body.scrollTop() : 0, + fixLeft = targetFixed ? body.scrollLeft() : 0, + endPosition = target.offset(), + animation = { + top: endPosition.top - fixTop, + left: endPosition.left - fixLeft, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = element.offset(), + transfer = $("<div class='ui-effects-transfer'></div>") + .appendTo('body') + .addClass(options.className) + .css({ + top: startPosition.top - fixTop, + left: startPosition.left - fixLeft, + height: element.innerHeight(), + width: element.innerWidth(), + position: targetFixed ? 'fixed' : 'absolute' + }) + .animate(animation, options.duration, options.easing, function () { + transfer.remove() + if ($.isFunction(done)) { + done() + } + }) + } + }) + + function parseClip(str, element) { + var outerWidth = element.outerWidth(), + outerHeight = element.outerHeight(), + clipRegex = + /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/, + values = clipRegex.exec(str) || ['', 0, outerWidth, outerHeight, 0] + + return { + top: parseFloat(values[1]) || 0, + right: values[2] === 'auto' ? outerWidth : parseFloat(values[2]), + bottom: values[3] === 'auto' ? outerHeight : parseFloat(values[3]), + left: parseFloat(values[4]) || 0 + } + } + + $.fx.step.clip = function (fx) { + if (!fx.clipInit) { + fx.start = $(fx.elem).cssClip() + if (typeof fx.end === 'string') { + fx.end = parseClip(fx.end, fx.elem) + } + fx.clipInit = true + } + + $(fx.elem).cssClip({ + top: fx.pos * (fx.end.top - fx.start.top) + fx.start.top, + right: fx.pos * (fx.end.right - fx.start.right) + fx.start.right, + bottom: fx.pos * (fx.end.bottom - fx.start.bottom) + fx.start.bottom, + left: fx.pos * (fx.end.left - fx.start.left) + fx.start.left + }) + } + })() + + /******************************************************************************/ + /*********************************** EASING ***********************************/ + /******************************************************************************/ + + ;(function () { + // Based on easing equations from Robert Penner (http://www.robertpenner.com/easing) + + var baseEasings = {} + + $.each(['Quad', 'Cubic', 'Quart', 'Quint', 'Expo'], function (i, name) { + baseEasings[name] = function (p) { + return Math.pow(p, i + 2) + } + }) + + $.extend(baseEasings, { + Sine: function (p) { + return 1 - Math.cos((p * Math.PI) / 2) + }, + Circ: function (p) { + return 1 - Math.sqrt(1 - p * p) + }, + Elastic: function (p) { + return p === 0 || p === 1 + ? p + : -Math.pow(2, 8 * (p - 1)) * Math.sin((((p - 1) * 80 - 7.5) * Math.PI) / 15) + }, + Back: function (p) { + return p * p * (3 * p - 2) + }, + Bounce: function (p) { + var pow2, + bounce = 4 + + while (p < ((pow2 = Math.pow(2, --bounce)) - 1) / 11) {} + return 1 / Math.pow(4, 3 - bounce) - 7.5625 * Math.pow((pow2 * 3 - 2) / 22 - p, 2) + } + }) + + $.each(baseEasings, function (name, easeIn) { + $.easing['easeIn' + name] = easeIn + $.easing['easeOut' + name] = function (p) { + return 1 - easeIn(1 - p) + } + $.easing['easeInOut' + name] = function (p) { + return p < 0.5 ? easeIn(p * 2) / 2 : 1 - easeIn(p * -2 + 2) / 2 + } + }) + })() + + var effect = $.effects + + /*! + * jQuery UI Effects Blind 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Blind Effect + //>>group: Effects + //>>description: Blinds the element. + //>>docs: http://api.jqueryui.com/blind-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectBlind = $.effects.define('blind', 'hide', function (options, done) { + var map = { + up: ['bottom', 'top'], + vertical: ['bottom', 'top'], + down: ['top', 'bottom'], + left: ['right', 'left'], + horizontal: ['right', 'left'], + right: ['left', 'right'] + }, + element = $(this), + direction = options.direction || 'up', + start = element.cssClip(), + animate = { clip: $.extend({}, start) }, + placeholder = $.effects.createPlaceholder(element) + + animate.clip[map[direction][0]] = animate.clip[map[direction][1]] + + if (options.mode === 'show') { + element.cssClip(animate.clip) + if (placeholder) { + placeholder.css($.effects.clipToBox(animate)) + } + + animate.clip = start + } + + if (placeholder) { + placeholder.animate($.effects.clipToBox(animate), options.duration, options.easing) + } + + element.animate(animate, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + }) + }) + + /*! + * jQuery UI Effects Bounce 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Bounce Effect + //>>group: Effects + //>>description: Bounces an element horizontally or vertically n times. + //>>docs: http://api.jqueryui.com/bounce-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectBounce = $.effects.define('bounce', function (options, done) { + var upAnim, + downAnim, + refValue, + element = $(this), + // Defaults: + mode = options.mode, + hide = mode === 'hide', + show = mode === 'show', + direction = options.direction || 'up', + distance = options.distance, + times = options.times || 5, + // Number of internal animations + anims = times * 2 + (show || hide ? 1 : 0), + speed = options.duration / anims, + easing = options.easing, + // Utility: + ref = direction === 'up' || direction === 'down' ? 'top' : 'left', + motion = direction === 'up' || direction === 'left', + i = 0, + queuelen = element.queue().length + + $.effects.createPlaceholder(element) + + refValue = element.css(ref) + + // Default distance for the BIGGEST bounce is the outer Distance / 3 + if (!distance) { + distance = element[ref === 'top' ? 'outerHeight' : 'outerWidth']() / 3 + } + + if (show) { + downAnim = { opacity: 1 } + downAnim[ref] = refValue + + // If we are showing, force opacity 0 and set the initial position + // then do the "first" animation + element + .css('opacity', 0) + .css(ref, motion ? -distance * 2 : distance * 2) + .animate(downAnim, speed, easing) + } + + // Start at the smallest distance if we are hiding + if (hide) { + distance = distance / Math.pow(2, times - 1) + } + + downAnim = {} + downAnim[ref] = refValue + + // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here + for (; i < times; i++) { + upAnim = {} + upAnim[ref] = (motion ? '-=' : '+=') + distance + + element.animate(upAnim, speed, easing).animate(downAnim, speed, easing) + + distance = hide ? distance * 2 : distance / 2 + } + + // Last Bounce when Hiding + if (hide) { + upAnim = { opacity: 0 } + upAnim[ref] = (motion ? '-=' : '+=') + distance + + element.animate(upAnim, speed, easing) + } + + element.queue(done) + + $.effects.unshift(element, queuelen, anims + 1) + }) + + /*! + * jQuery UI Effects Clip 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Clip Effect + //>>group: Effects + //>>description: Clips the element on and off like an old TV. + //>>docs: http://api.jqueryui.com/clip-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectClip = $.effects.define('clip', 'hide', function (options, done) { + var start, + animate = {}, + element = $(this), + direction = options.direction || 'vertical', + both = direction === 'both', + horizontal = both || direction === 'horizontal', + vertical = both || direction === 'vertical' + + start = element.cssClip() + animate.clip = { + top: vertical ? (start.bottom - start.top) / 2 : start.top, + right: horizontal ? (start.right - start.left) / 2 : start.right, + bottom: vertical ? (start.bottom - start.top) / 2 : start.bottom, + left: horizontal ? (start.right - start.left) / 2 : start.left + } + + $.effects.createPlaceholder(element) + + if (options.mode === 'show') { + element.cssClip(animate.clip) + animate.clip = start + } + + element.animate(animate, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + }) + }) + + /*! + * jQuery UI Effects Drop 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Drop Effect + //>>group: Effects + //>>description: Moves an element in one direction and hides it at the same time. + //>>docs: http://api.jqueryui.com/drop-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectDrop = $.effects.define('drop', 'hide', function (options, done) { + var distance, + element = $(this), + mode = options.mode, + show = mode === 'show', + direction = options.direction || 'left', + ref = direction === 'up' || direction === 'down' ? 'top' : 'left', + motion = direction === 'up' || direction === 'left' ? '-=' : '+=', + oppositeMotion = motion === '+=' ? '-=' : '+=', + animation = { + opacity: 0 + } + + $.effects.createPlaceholder(element) + + distance = options.distance || element[ref === 'top' ? 'outerHeight' : 'outerWidth'](true) / 2 + + animation[ref] = motion + distance + + if (show) { + element.css(animation) + + animation[ref] = oppositeMotion + distance + animation.opacity = 1 + } + + // Animate + element.animate(animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + }) + }) + + /*! + * jQuery UI Effects Explode 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Explode Effect + //>>group: Effects + // jscs:disable maximumLineLength + //>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness. + // jscs:enable maximumLineLength + //>>docs: http://api.jqueryui.com/explode-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectExplode = $.effects.define('explode', 'hide', function (options, done) { + var i, + j, + left, + top, + mx, + my, + rows = options.pieces ? Math.round(Math.sqrt(options.pieces)) : 3, + cells = rows, + element = $(this), + mode = options.mode, + show = mode === 'show', + // Show and then visibility:hidden the element before calculating offset + offset = element.show().css('visibility', 'hidden').offset(), + // Width and height of a piece + width = Math.ceil(element.outerWidth() / cells), + height = Math.ceil(element.outerHeight() / rows), + pieces = [] + + // Children animate complete: + function childComplete() { + pieces.push(this) + if (pieces.length === rows * cells) { + animComplete() + } + } + + // Clone the element for each row and cell. + for (i = 0; i < rows; i++) { + // ===> + top = offset.top + i * height + my = i - (rows - 1) / 2 + + for (j = 0; j < cells; j++) { + // ||| + left = offset.left + j * width + mx = j - (cells - 1) / 2 + + // Create a clone of the now hidden main element that will be absolute positioned + // within a wrapper div off the -left and -top equal to size of our pieces + element + .clone() + .appendTo('body') + .wrap('<div></div>') + .css({ + position: 'absolute', + visibility: 'visible', + left: -j * width, + top: -i * height + }) + + // Select the wrapper - make it overflow: hidden and absolute positioned based on + // where the original was located +left and +top equal to the size of pieces + .parent() + .addClass('ui-effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: width, + height: height, + left: left + (show ? mx * width : 0), + top: top + (show ? my * height : 0), + opacity: show ? 0 : 1 + }) + .animate( + { + left: left + (show ? 0 : mx * width), + top: top + (show ? 0 : my * height), + opacity: show ? 1 : 0 + }, + options.duration || 500, + options.easing, + childComplete + ) + } + } + + function animComplete() { + element.css({ + visibility: 'visible' + }) + $(pieces).remove() + done() + } + }) + + /*! + * jQuery UI Effects Fade 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Fade Effect + //>>group: Effects + //>>description: Fades the element. + //>>docs: http://api.jqueryui.com/fade-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectFade = $.effects.define('fade', 'toggle', function (options, done) { + var show = options.mode === 'show' + + $(this) + .css('opacity', show ? 0 : 1) + .animate( + { + opacity: show ? 1 : 0 + }, + { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } + ) + }) + + /*! + * jQuery UI Effects Fold 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Fold Effect + //>>group: Effects + //>>description: Folds an element first horizontally and then vertically. + //>>docs: http://api.jqueryui.com/fold-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectFold = $.effects.define('fold', 'hide', function (options, done) { + // Create element + var element = $(this), + mode = options.mode, + show = mode === 'show', + hide = mode === 'hide', + size = options.size || 15, + percent = /([0-9]+)%/.exec(size), + horizFirst = !!options.horizFirst, + ref = horizFirst ? ['right', 'bottom'] : ['bottom', 'right'], + duration = options.duration / 2, + placeholder = $.effects.createPlaceholder(element), + start = element.cssClip(), + animation1 = { clip: $.extend({}, start) }, + animation2 = { clip: $.extend({}, start) }, + distance = [start[ref[0]], start[ref[1]]], + queuelen = element.queue().length + + if (percent) { + size = (parseInt(percent[1], 10) / 100) * distance[hide ? 0 : 1] + } + animation1.clip[ref[0]] = size + animation2.clip[ref[0]] = size + animation2.clip[ref[1]] = 0 + + if (show) { + element.cssClip(animation2.clip) + if (placeholder) { + placeholder.css($.effects.clipToBox(animation2)) + } + + animation2.clip = start + } + + // Animate + element + .queue(function (next) { + if (placeholder) { + placeholder + .animate($.effects.clipToBox(animation1), duration, options.easing) + .animate($.effects.clipToBox(animation2), duration, options.easing) + } + + next() + }) + .animate(animation1, duration, options.easing) + .animate(animation2, duration, options.easing) + .queue(done) + + $.effects.unshift(element, queuelen, 4) + }) + + /*! + * jQuery UI Effects Highlight 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Highlight Effect + //>>group: Effects + //>>description: Highlights the background of an element in a defined color for a custom duration. + //>>docs: http://api.jqueryui.com/highlight-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectHighlight = $.effects.define('highlight', 'show', function (options, done) { + var element = $(this), + animation = { + backgroundColor: element.css('backgroundColor') + } + + if (options.mode === 'hide') { + animation.opacity = 0 + } + + $.effects.saveStyle(element) + + element + .css({ + backgroundImage: 'none', + backgroundColor: options.color || '#ffff99' + }) + .animate(animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + }) + }) + + /*! + * jQuery UI Effects Size 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Size Effect + //>>group: Effects + //>>description: Resize an element to a specified width and height. + //>>docs: http://api.jqueryui.com/size-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectSize = $.effects.define('size', function (options, done) { + // Create element + var baseline, + factor, + temp, + element = $(this), + // Copy for children + cProps = ['fontSize'], + vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'], + hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'], + // Set options + mode = options.mode, + restore = mode !== 'effect', + scale = options.scale || 'both', + origin = options.origin || ['middle', 'center'], + position = element.css('position'), + pos = element.position(), + original = $.effects.scaledDimensions(element), + from = options.from || original, + to = options.to || $.effects.scaledDimensions(element, 0) + + $.effects.createPlaceholder(element) + + if (mode === 'show') { + temp = from + from = to + to = temp + } + + // Set scaling factor + factor = { + from: { + y: from.height / original.height, + x: from.width / original.width + }, + to: { + y: to.height / original.height, + x: to.width / original.width + } + } + + // Scale the css box + if (scale === 'box' || scale === 'both') { + // Vertical props scaling + if (factor.from.y !== factor.to.y) { + from = $.effects.setTransition(element, vProps, factor.from.y, from) + to = $.effects.setTransition(element, vProps, factor.to.y, to) + } + + // Horizontal props scaling + if (factor.from.x !== factor.to.x) { + from = $.effects.setTransition(element, hProps, factor.from.x, from) + to = $.effects.setTransition(element, hProps, factor.to.x, to) + } + } + + // Scale the content + if (scale === 'content' || scale === 'both') { + // Vertical props scaling + if (factor.from.y !== factor.to.y) { + from = $.effects.setTransition(element, cProps, factor.from.y, from) + to = $.effects.setTransition(element, cProps, factor.to.y, to) + } + } + + // Adjust the position properties based on the provided origin points + if (origin) { + baseline = $.effects.getBaseline(origin, original) + from.top = (original.outerHeight - from.outerHeight) * baseline.y + pos.top + from.left = (original.outerWidth - from.outerWidth) * baseline.x + pos.left + to.top = (original.outerHeight - to.outerHeight) * baseline.y + pos.top + to.left = (original.outerWidth - to.outerWidth) * baseline.x + pos.left + } + element.css(from) + + // Animate the children if desired + if (scale === 'content' || scale === 'both') { + vProps = vProps.concat(['marginTop', 'marginBottom']).concat(cProps) + hProps = hProps.concat(['marginLeft', 'marginRight']) + + // Only animate children with width attributes specified + // TODO: is this right? should we include anything with css width specified as well + element.find('*[width]').each(function () { + var child = $(this), + childOriginal = $.effects.scaledDimensions(child), + childFrom = { + height: childOriginal.height * factor.from.y, + width: childOriginal.width * factor.from.x, + outerHeight: childOriginal.outerHeight * factor.from.y, + outerWidth: childOriginal.outerWidth * factor.from.x + }, + childTo = { + height: childOriginal.height * factor.to.y, + width: childOriginal.width * factor.to.x, + outerHeight: childOriginal.height * factor.to.y, + outerWidth: childOriginal.width * factor.to.x + } + + // Vertical props scaling + if (factor.from.y !== factor.to.y) { + childFrom = $.effects.setTransition(child, vProps, factor.from.y, childFrom) + childTo = $.effects.setTransition(child, vProps, factor.to.y, childTo) + } + + // Horizontal props scaling + if (factor.from.x !== factor.to.x) { + childFrom = $.effects.setTransition(child, hProps, factor.from.x, childFrom) + childTo = $.effects.setTransition(child, hProps, factor.to.x, childTo) + } + + if (restore) { + $.effects.saveStyle(child) + } + + // Animate children + child.css(childFrom) + child.animate(childTo, options.duration, options.easing, function () { + // Restore children + if (restore) { + $.effects.restoreStyle(child) + } + }) + }) + } + + // Animate + element.animate(to, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: function () { + var offset = element.offset() + + if (to.opacity === 0) { + element.css('opacity', from.opacity) + } + + if (!restore) { + element.css('position', position === 'static' ? 'relative' : position).offset(offset) + + // Need to save style here so that automatic style restoration + // doesn't restore to the original styles from before the animation. + $.effects.saveStyle(element) + } + + done() + } + }) + }) + + /*! + * jQuery UI Effects Scale 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Scale Effect + //>>group: Effects + //>>description: Grows or shrinks an element and its content. + //>>docs: http://api.jqueryui.com/scale-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectScale = $.effects.define('scale', function (options, done) { + // Create element + var el = $(this), + mode = options.mode, + percent = + parseInt(options.percent, 10) || + (parseInt(options.percent, 10) === 0 ? 0 : mode !== 'effect' ? 0 : 100), + newOptions = $.extend( + true, + { + from: $.effects.scaledDimensions(el), + to: $.effects.scaledDimensions(el, percent, options.direction || 'both'), + origin: options.origin || ['middle', 'center'] + }, + options + ) + + // Fade option to support puff + if (options.fade) { + newOptions.from.opacity = 1 + newOptions.to.opacity = 0 + } + + $.effects.effect.size.call(this, newOptions, done) + }) + + /*! + * jQuery UI Effects Puff 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Puff Effect + //>>group: Effects + //>>description: Creates a puff effect by scaling the element up and hiding it at the same time. + //>>docs: http://api.jqueryui.com/puff-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectPuff = $.effects.define('puff', 'hide', function (options, done) { + var newOptions = $.extend(true, {}, options, { + fade: true, + percent: parseInt(options.percent, 10) || 150 + }) + + $.effects.effect.scale.call(this, newOptions, done) + }) + + /*! + * jQuery UI Effects Pulsate 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Pulsate Effect + //>>group: Effects + //>>description: Pulsates an element n times by changing the opacity to zero and back. + //>>docs: http://api.jqueryui.com/pulsate-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectPulsate = $.effects.define('pulsate', 'show', function (options, done) { + var element = $(this), + mode = options.mode, + show = mode === 'show', + hide = mode === 'hide', + showhide = show || hide, + // Showing or hiding leaves off the "last" animation + anims = (options.times || 5) * 2 + (showhide ? 1 : 0), + duration = options.duration / anims, + animateTo = 0, + i = 1, + queuelen = element.queue().length + + if (show || !element.is(':visible')) { + element.css('opacity', 0).show() + animateTo = 1 + } + + // Anims - 1 opacity "toggles" + for (; i < anims; i++) { + element.animate({ opacity: animateTo }, duration, options.easing) + animateTo = 1 - animateTo + } + + element.animate({ opacity: animateTo }, duration, options.easing) + + element.queue(done) + + $.effects.unshift(element, queuelen, anims + 1) + }) + + /*! + * jQuery UI Effects Shake 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Shake Effect + //>>group: Effects + //>>description: Shakes an element horizontally or vertically n times. + //>>docs: http://api.jqueryui.com/shake-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectShake = $.effects.define('shake', function (options, done) { + var i = 1, + element = $(this), + direction = options.direction || 'left', + distance = options.distance || 20, + times = options.times || 3, + anims = times * 2 + 1, + speed = Math.round(options.duration / anims), + ref = direction === 'up' || direction === 'down' ? 'top' : 'left', + positiveMotion = direction === 'up' || direction === 'left', + animation = {}, + animation1 = {}, + animation2 = {}, + queuelen = element.queue().length + + $.effects.createPlaceholder(element) + + // Animation + animation[ref] = (positiveMotion ? '-=' : '+=') + distance + animation1[ref] = (positiveMotion ? '+=' : '-=') + distance * 2 + animation2[ref] = (positiveMotion ? '-=' : '+=') + distance * 2 + + // Animate + element.animate(animation, speed, options.easing) + + // Shakes + for (; i < times; i++) { + element.animate(animation1, speed, options.easing).animate(animation2, speed, options.easing) + } + + element + .animate(animation1, speed, options.easing) + .animate(animation, speed / 2, options.easing) + .queue(done) + + $.effects.unshift(element, queuelen, anims + 1) + }) + + /*! + * jQuery UI Effects Slide 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Slide Effect + //>>group: Effects + //>>description: Slides an element in and out of the viewport. + //>>docs: http://api.jqueryui.com/slide-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effectsEffectSlide = $.effects.define('slide', 'show', function (options, done) { + var startClip, + startRef, + element = $(this), + map = { + up: ['bottom', 'top'], + down: ['top', 'bottom'], + left: ['right', 'left'], + right: ['left', 'right'] + }, + mode = options.mode, + direction = options.direction || 'left', + ref = direction === 'up' || direction === 'down' ? 'top' : 'left', + positiveMotion = direction === 'up' || direction === 'left', + distance = options.distance || element[ref === 'top' ? 'outerHeight' : 'outerWidth'](true), + animation = {} + + $.effects.createPlaceholder(element) + + startClip = element.cssClip() + startRef = element.position()[ref] + + // Define hide animation + animation[ref] = (positiveMotion ? -1 : 1) * distance + startRef + animation.clip = element.cssClip() + animation.clip[map[direction][1]] = animation.clip[map[direction][0]] + + // Reverse the animation if we're showing + if (mode === 'show') { + element.cssClip(animation.clip) + element.css(ref, animation[ref]) + animation.clip = startClip + animation[ref] = startRef + } + + // Actually animate + element.animate(animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + }) + }) + + /*! + * jQuery UI Effects Transfer 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Transfer Effect + //>>group: Effects + //>>description: Displays a transfer effect from one element to another. + //>>docs: http://api.jqueryui.com/transfer-effect/ + //>>demos: http://jqueryui.com/effect/ + + var effect + if ($.uiBackCompat !== false) { + effect = $.effects.define('transfer', function (options, done) { + $(this).transfer(options, done) + }) + } + var effectsEffectTransfer = effect + + /*! + * jQuery UI Focusable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: :focusable Selector + //>>group: Core + //>>description: Selects elements which can be focused. + //>>docs: http://api.jqueryui.com/focusable-selector/ + + // Selectors + $.ui.focusable = function (element, hasTabindex) { + var map, + mapName, + img, + focusableIfVisible, + fieldset, + nodeName = element.nodeName.toLowerCase() + + if ('area' === nodeName) { + map = element.parentNode + mapName = map.name + if (!element.href || !mapName || map.nodeName.toLowerCase() !== 'map') { + return false + } + img = $("img[usemap='#" + mapName + "']") + return img.length > 0 && img.is(':visible') + } + + if (/^(input|select|textarea|button|object)$/.test(nodeName)) { + focusableIfVisible = !element.disabled + + if (focusableIfVisible) { + // Form controls within a disabled fieldset are disabled. + // However, controls within the fieldset's legend do not get disabled. + // Since controls generally aren't placed inside legends, we skip + // this portion of the check. + fieldset = $(element).closest('fieldset')[0] + if (fieldset) { + focusableIfVisible = !fieldset.disabled + } + } + } else if ('a' === nodeName) { + focusableIfVisible = element.href || hasTabindex + } else { + focusableIfVisible = hasTabindex + } + + return focusableIfVisible && $(element).is(':visible') && visible($(element)) + } + + // Support: IE 8 only + // IE 8 doesn't resolve inherit to visible/hidden for computed values + function visible(element) { + var visibility = element.css('visibility') + while (visibility === 'inherit') { + element = element.parent() + visibility = element.css('visibility') + } + return visibility !== 'hidden' + } + + $.extend($.expr[':'], { + focusable: function (element) { + return $.ui.focusable(element, $.attr(element, 'tabindex') != null) + } + }) + + var focusable = $.ui.focusable + + // Support: IE8 Only + // IE8 does not support the form attribute and when it is supplied. It overwrites the form prop + // with a string, so we need to find the proper form. + var form = ($.fn.form = function () { + return typeof this[0].form === 'string' ? this.closest('form') : $(this[0].form) + }) + + /*! + * jQuery UI Form Reset Mixin 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Form Reset Mixin + //>>group: Core + //>>description: Refresh input widgets when their form is reset + //>>docs: http://api.jqueryui.com/form-reset-mixin/ + + var formResetMixin = ($.ui.formResetMixin = { + _formResetHandler: function () { + var form = $(this) + + // Wait for the form reset to actually happen before refreshing + setTimeout(function () { + var instances = form.data('ui-form-reset-instances') + $.each(instances, function () { + this.refresh() + }) + }) + }, + + _bindFormResetHandler: function () { + this.form = this.element.form() + if (!this.form.length) { + return + } + + var instances = this.form.data('ui-form-reset-instances') || [] + if (!instances.length) { + // We don't use _on() here because we use a single event handler per form + this.form.on('reset.ui-form-reset', this._formResetHandler) + } + instances.push(this) + this.form.data('ui-form-reset-instances', instances) + }, + + _unbindFormResetHandler: function () { + if (!this.form.length) { + return + } + + var instances = this.form.data('ui-form-reset-instances') + instances.splice($.inArray(this, instances), 1) + if (instances.length) { + this.form.data('ui-form-reset-instances', instances) + } else { + this.form.removeData('ui-form-reset-instances').off('reset.ui-form-reset') + } + } + }) + + /*! + * jQuery UI Support for jQuery core 1.7.x 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + */ + + //>>label: jQuery 1.7 Support + //>>group: Core + //>>description: Support version 1.7.x of jQuery core + + // Support: jQuery 1.7 only + // Not a great way to check versions, but since we only support 1.7+ and only + // need to detect <1.8, this is a simple check that should suffice. Checking + // for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0 + // and we'll never reach 1.70.0 (if we do, we certainly won't be supporting + // 1.7 anymore). See #11197 for why we're not using feature detection. + if ($.fn.jquery.substring(0, 3) === '1.7') { + // Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight() + // Unlike jQuery Core 1.8+, these only support numeric values to set the + // dimensions in pixels + $.each(['Width', 'Height'], function (i, name) { + var side = name === 'Width' ? ['Left', 'Right'] : ['Top', 'Bottom'], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + } + + function reduce(elem, size, border, margin) { + $.each(side, function () { + size -= parseFloat($.css(elem, 'padding' + this)) || 0 + if (border) { + size -= parseFloat($.css(elem, 'border' + this + 'Width')) || 0 + } + if (margin) { + size -= parseFloat($.css(elem, 'margin' + this)) || 0 + } + }) + return size + } + + $.fn['inner' + name] = function (size) { + if (size === undefined) { + return orig['inner' + name].call(this) + } + + return this.each(function () { + $(this).css(type, reduce(this, size) + 'px') + }) + } + + $.fn['outer' + name] = function (size, margin) { + if (typeof size !== 'number') { + return orig['outer' + name].call(this, size) + } + + return this.each(function () { + $(this).css(type, reduce(this, size, true, margin) + 'px') + }) + } + }) + + $.fn.addBack = function (selector) { + return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector)) + } + } + + /*! + * jQuery UI Keycode 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Keycode + //>>group: Core + //>>description: Provide keycodes as keynames + //>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ + + var keycode = ($.ui.keyCode = { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 + }) + + // Internal use only + var escapeSelector = ($.ui.escapeSelector = (function () { + var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g + return function (selector) { + return selector.replace(selectorEscape, '\\$1') + } + })()) + + /*! + * jQuery UI Labels 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: labels + //>>group: Core + //>>description: Find all the labels associated with a given input + //>>docs: http://api.jqueryui.com/labels/ + + var labels = ($.fn.labels = function () { + var ancestor, selector, id, labels, ancestors + + // Check control.labels first + if (this[0].labels && this[0].labels.length) { + return this.pushStack(this[0].labels) + } + + // Support: IE <= 11, FF <= 37, Android <= 2.3 only + // Above browsers do not support control.labels. Everything below is to support them + // as well as document fragments. control.labels does not work on document fragments + labels = this.eq(0).parents('label') + + // Look for the label based on the id + id = this.attr('id') + if (id) { + // We don't search against the document in case the element + // is disconnected from the DOM + ancestor = this.eq(0).parents().last() + + // Get a full set of top level ancestors + ancestors = ancestor.add(ancestor.length ? ancestor.siblings() : this.siblings()) + + // Create a selector for the label based on the id + selector = "label[for='" + $.ui.escapeSelector(id) + "']" + + labels = labels.add(ancestors.find(selector).addBack(selector)) + } + + // Return whatever we have found for labels + return this.pushStack(labels) + }) + + /*! + * jQuery UI Scroll Parent 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: scrollParent + //>>group: Core + //>>description: Get the closest ancestor element that is scrollable. + //>>docs: http://api.jqueryui.com/scrollParent/ + + var scrollParent = ($.fn.scrollParent = function (includeHidden) { + var position = this.css('position'), + excludeStaticParent = position === 'absolute', + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents() + .filter(function () { + var parent = $(this) + if (excludeStaticParent && parent.css('position') === 'static') { + return false + } + return overflowRegex.test( + parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x') + ) + }) + .eq(0) + + return position === 'fixed' || !scrollParent.length + ? $(this[0].ownerDocument || document) + : scrollParent + }) + + /*! + * jQuery UI Tabbable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: :tabbable Selector + //>>group: Core + //>>description: Selects elements which can be tabbed to. + //>>docs: http://api.jqueryui.com/tabbable-selector/ + + var tabbable = $.extend($.expr[':'], { + tabbable: function (element) { + var tabIndex = $.attr(element, 'tabindex'), + hasTabindex = tabIndex != null + return (!hasTabindex || tabIndex >= 0) && $.ui.focusable(element, hasTabindex) + } + }) + + /*! + * jQuery UI Unique ID 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: uniqueId + //>>group: Core + //>>description: Functions to generate and remove uniqueId's + //>>docs: http://api.jqueryui.com/uniqueId/ + + var uniqueId = $.fn.extend({ + uniqueId: (function () { + var uuid = 0 + + return function () { + return this.each(function () { + if (!this.id) { + this.id = 'ui-id-' + ++uuid + } + }) + } + })(), + + removeUniqueId: function () { + return this.each(function () { + if (/^ui-id-\d+$/.test(this.id)) { + $(this).removeAttr('id') + } + }) + } + }) + + /*! + * jQuery UI Accordion 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Accordion + //>>group: Widgets + // jscs:disable maximumLineLength + //>>description: Displays collapsible content panels for presenting information in a limited amount of space. + // jscs:enable maximumLineLength + //>>docs: http://api.jqueryui.com/accordion/ + //>>demos: http://jqueryui.com/accordion/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/accordion.css + //>>css.theme: ../../themes/base/theme.css + + var widgetsAccordion = $.widget('ui.accordion', { + version: '1.12.1', + options: { + active: 0, + animate: {}, + classes: { + 'ui-accordion-header': 'ui-corner-top', + 'ui-accordion-header-collapsed': 'ui-corner-all', + 'ui-accordion-content': 'ui-corner-bottom' + }, + collapsible: false, + event: 'click', + header: '> li > :first-child, > :not(li):even', + heightStyle: 'auto', + icons: { + activeHeader: 'ui-icon-triangle-1-s', + header: 'ui-icon-triangle-1-e' + }, + + // Callbacks + activate: null, + beforeActivate: null + }, + + hideProps: { + borderTopWidth: 'hide', + borderBottomWidth: 'hide', + paddingTop: 'hide', + paddingBottom: 'hide', + height: 'hide' + }, + + showProps: { + borderTopWidth: 'show', + borderBottomWidth: 'show', + paddingTop: 'show', + paddingBottom: 'show', + height: 'show' + }, + + _create: function () { + var options = this.options + + this.prevShow = this.prevHide = $() + this._addClass('ui-accordion', 'ui-widget ui-helper-reset') + this.element.attr('role', 'tablist') + + // Don't allow collapsible: false and active: false / null + if (!options.collapsible && (options.active === false || options.active == null)) { + options.active = 0 + } + + this._processPanels() + + // handle negative values + if (options.active < 0) { + options.active += this.headers.length + } + this._refresh() + }, + + _getCreateEventData: function () { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next() + } + }, + + _createIcons: function () { + var icon, + children, + icons = this.options.icons + + if (icons) { + icon = $('<span>') + this._addClass(icon, 'ui-accordion-header-icon', 'ui-icon ' + icons.header) + icon.prependTo(this.headers) + children = this.active.children('.ui-accordion-header-icon') + this._removeClass(children, icons.header) + ._addClass(children, null, icons.activeHeader) + ._addClass(this.headers, 'ui-accordion-icons') + } + }, + + _destroyIcons: function () { + this._removeClass(this.headers, 'ui-accordion-icons') + this.headers.children('.ui-accordion-header-icon').remove() + }, + + _destroy: function () { + var contents + + // Clean up main element + this.element.removeAttr('role') + + // Clean up headers + this.headers + .removeAttr('role aria-expanded aria-selected aria-controls tabIndex') + .removeUniqueId() + + this._destroyIcons() + + // Clean up content panels + contents = this.headers + .next() + .css('display', '') + .removeAttr('role aria-hidden aria-labelledby') + .removeUniqueId() + + if (this.options.heightStyle !== 'content') { + contents.css('height', '') + } + }, + + _setOption: function (key, value) { + if (key === 'active') { + // _activate() will handle invalid values and update this.options + this._activate(value) + return + } + + if (key === 'event') { + if (this.options.event) { + this._off(this.headers, this.options.event) + } + this._setupEvents(value) + } + + this._super(key, value) + + // Setting collapsible: false while collapsed; open first panel + if (key === 'collapsible' && !value && this.options.active === false) { + this._activate(0) + } + + if (key === 'icons') { + this._destroyIcons() + if (value) { + this._createIcons() + } + } + }, + + _setOptionDisabled: function (value) { + this._super(value) + + this.element.attr('aria-disabled', value) + + // Support: IE8 Only + // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + this._toggleClass(null, 'ui-state-disabled', !!value) + this._toggleClass(this.headers.add(this.headers.next()), null, 'ui-state-disabled', !!value) + }, + + _keydown: function (event) { + if (event.altKey || event.ctrlKey) { + return + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index(event.target), + toFocus = false + + switch (event.keyCode) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[(currentIndex + 1) % length] + break + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[(currentIndex - 1 + length) % length] + break + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler(event) + break + case keyCode.HOME: + toFocus = this.headers[0] + break + case keyCode.END: + toFocus = this.headers[length - 1] + break + } + + if (toFocus) { + $(event.target).attr('tabIndex', -1) + $(toFocus).attr('tabIndex', 0) + $(toFocus).trigger('focus') + event.preventDefault() + } + }, + + _panelKeyDown: function (event) { + if (event.keyCode === $.ui.keyCode.UP && event.ctrlKey) { + $(event.currentTarget).prev().trigger('focus') + } + }, + + refresh: function () { + var options = this.options + this._processPanels() + + // Was collapsed or no panel + if ((options.active === false && options.collapsible === true) || !this.headers.length) { + options.active = false + this.active = $() + + // active false only when collapsible is true + } else if (options.active === false) { + this._activate(0) + + // was active, but active panel is gone + } else if (this.active.length && !$.contains(this.element[0], this.active[0])) { + // all remaining panel are disabled + if (this.headers.length === this.headers.find('.ui-state-disabled').length) { + options.active = false + this.active = $() + + // activate previous panel + } else { + this._activate(Math.max(0, options.active - 1)) + } + + // was active, active panel still exists + } else { + // make sure active index is correct + options.active = this.headers.index(this.active) + } + + this._destroyIcons() + + this._refresh() + }, + + _processPanels: function () { + var prevHeaders = this.headers, + prevPanels = this.panels + + this.headers = this.element.find(this.options.header) + this._addClass( + this.headers, + 'ui-accordion-header ui-accordion-header-collapsed', + 'ui-state-default' + ) + + this.panels = this.headers.next().filter(':not(.ui-accordion-content-active)').hide() + this._addClass(this.panels, 'ui-accordion-content', 'ui-helper-reset ui-widget-content') + + // Avoid memory leaks (#10056) + if (prevPanels) { + this._off(prevHeaders.not(this.headers)) + this._off(prevPanels.not(this.panels)) + } + }, + + _refresh: function () { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent() + + this.active = this._findActive(options.active) + this._addClass(this.active, 'ui-accordion-header-active', 'ui-state-active')._removeClass( + this.active, + 'ui-accordion-header-collapsed' + ) + this._addClass(this.active.next(), 'ui-accordion-content-active') + this.active.next().show() + + this.headers + .attr('role', 'tab') + .each(function () { + var header = $(this), + headerId = header.uniqueId().attr('id'), + panel = header.next(), + panelId = panel.uniqueId().attr('id') + header.attr('aria-controls', panelId) + panel.attr('aria-labelledby', headerId) + }) + .next() + .attr('role', 'tabpanel') + + this.headers + .not(this.active) + .attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false', + tabIndex: -1 + }) + .next() + .attr({ + 'aria-hidden': 'true' + }) + .hide() + + // Make sure at least one header is in the tab order + if (!this.active.length) { + this.headers.eq(0).attr('tabIndex', 0) + } else { + this.active + .attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0 + }) + .next() + .attr({ + 'aria-hidden': 'false' + }) + } + + this._createIcons() + + this._setupEvents(options.event) + + if (heightStyle === 'fill') { + maxHeight = parent.height() + this.element.siblings(':visible').each(function () { + var elem = $(this), + position = elem.css('position') + + if (position === 'absolute' || position === 'fixed') { + return + } + maxHeight -= elem.outerHeight(true) + }) + + this.headers.each(function () { + maxHeight -= $(this).outerHeight(true) + }) + + this.headers + .next() + .each(function () { + $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height())) + }) + .css('overflow', 'auto') + } else if (heightStyle === 'auto') { + maxHeight = 0 + this.headers + .next() + .each(function () { + var isVisible = $(this).is(':visible') + if (!isVisible) { + $(this).show() + } + maxHeight = Math.max(maxHeight, $(this).css('height', '').height()) + if (!isVisible) { + $(this).hide() + } + }) + .height(maxHeight) + } + }, + + _activate: function (index) { + var active = this._findActive(index)[0] + + // Trying to activate the already active panel + if (active === this.active[0]) { + return + } + + // Trying to collapse, simulate a click on the currently active header + active = active || this.active[0] + + this._eventHandler({ + target: active, + currentTarget: active, + preventDefault: $.noop + }) + }, + + _findActive: function (selector) { + return typeof selector === 'number' ? this.headers.eq(selector) : $() + }, + + _setupEvents: function (event) { + var events = { + keydown: '_keydown' + } + if (event) { + $.each(event.split(' '), function (index, eventName) { + events[eventName] = '_eventHandler' + }) + } + + this._off(this.headers.add(this.headers.next())) + this._on(this.headers, events) + this._on(this.headers.next(), { keydown: '_panelKeyDown' }) + this._hoverable(this.headers) + this._focusable(this.headers) + }, + + _eventHandler: function (event) { + var activeChildren, + clickedChildren, + options = this.options, + active = this.active, + clicked = $(event.currentTarget), + clickedIsActive = clicked[0] === active[0], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + } + + event.preventDefault() + + if ( + // click on active header, but not collapsible + (clickedIsActive && !options.collapsible) || + // allow canceling activation + this._trigger('beforeActivate', event, eventData) === false + ) { + return + } + + options.active = collapsing ? false : this.headers.index(clicked) + + // When the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked + this._toggle(eventData) + + // Switch classes + // corner classes on the previously active header stay after the animation + this._removeClass(active, 'ui-accordion-header-active', 'ui-state-active') + if (options.icons) { + activeChildren = active.children('.ui-accordion-header-icon') + this._removeClass(activeChildren, null, options.icons.activeHeader)._addClass( + activeChildren, + null, + options.icons.header + ) + } + + if (!clickedIsActive) { + this._removeClass(clicked, 'ui-accordion-header-collapsed')._addClass( + clicked, + 'ui-accordion-header-active', + 'ui-state-active' + ) + if (options.icons) { + clickedChildren = clicked.children('.ui-accordion-header-icon') + this._removeClass(clickedChildren, null, options.icons.header)._addClass( + clickedChildren, + null, + options.icons.activeHeader + ) + } + + this._addClass(clicked.next(), 'ui-accordion-content-active') + } + }, + + _toggle: function (data) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel + + // Handle activating a panel during the animation for another activation + this.prevShow.add(this.prevHide).stop(true, true) + this.prevShow = toShow + this.prevHide = toHide + + if (this.options.animate) { + this._animate(toShow, toHide, data) + } else { + toHide.hide() + toShow.show() + this._toggleComplete(data) + } + + toHide.attr({ + 'aria-hidden': 'true' + }) + toHide.prev().attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false' + }) + + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if (toShow.length && toHide.length) { + toHide.prev().attr({ + tabIndex: -1, + 'aria-expanded': 'false' + }) + } else if (toShow.length) { + this.headers + .filter(function () { + return parseInt($(this).attr('tabIndex'), 10) === 0 + }) + .attr('tabIndex', -1) + } + + toShow.attr('aria-hidden', 'false').prev().attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0 + }) + }, + + _animate: function (toShow, toHide, data) { + var total, + easing, + duration, + that = this, + adjust = 0, + boxSizing = toShow.css('box-sizing'), + down = toShow.length && (!toHide.length || toShow.index() < toHide.index()), + animate = this.options.animate || {}, + options = (down && animate.down) || animate, + complete = function () { + that._toggleComplete(data) + } + + if (typeof options === 'number') { + duration = options + } + if (typeof options === 'string') { + easing = options + } + + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing + duration = duration || options.duration || animate.duration + + if (!toHide.length) { + return toShow.animate(this.showProps, duration, easing, complete) + } + if (!toShow.length) { + return toHide.animate(this.hideProps, duration, easing, complete) + } + + total = toShow.show().outerHeight() + toHide.animate(this.hideProps, { + duration: duration, + easing: easing, + step: function (now, fx) { + fx.now = Math.round(now) + } + }) + toShow.hide().animate(this.showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function (now, fx) { + fx.now = Math.round(now) + if (fx.prop !== 'height') { + if (boxSizing === 'content-box') { + adjust += fx.now + } + } else if (that.options.heightStyle !== 'content') { + fx.now = Math.round(total - toHide.outerHeight() - adjust) + adjust = 0 + } + } + }) + }, + + _toggleComplete: function (data) { + var toHide = data.oldPanel, + prev = toHide.prev() + + this._removeClass(toHide, 'ui-accordion-content-active') + this._removeClass(prev, 'ui-accordion-header-active')._addClass( + prev, + 'ui-accordion-header-collapsed' + ) + + // Work around for rendering bug in IE (#5421) + if (toHide.length) { + toHide.parent()[0].className = toHide.parent()[0].className + } + this._trigger('activate', null, data) + } + }) + + var safeActiveElement = ($.ui.safeActiveElement = function (document) { + var activeElement + + // Support: IE 9 only + // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> + try { + activeElement = document.activeElement + } catch (error) { + activeElement = document.body + } + + // Support: IE 9 - 11 only + // IE may return null instead of an element + // Interestingly, this only seems to occur when NOT in an iframe + if (!activeElement) { + activeElement = document.body + } + + // Support: IE 11 only + // IE11 returns a seemingly empty object in some cases when accessing + // document.activeElement from an <iframe> + if (!activeElement.nodeName) { + activeElement = document.body + } + + return activeElement + }) + + /*! + * jQuery UI Menu 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Menu + //>>group: Widgets + //>>description: Creates nestable menus. + //>>docs: http://api.jqueryui.com/menu/ + //>>demos: http://jqueryui.com/menu/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/menu.css + //>>css.theme: ../../themes/base/theme.css + + var widgetsMenu = $.widget('ui.menu', { + version: '1.12.1', + defaultElement: '<ul>', + delay: 300, + options: { + icons: { + submenu: 'ui-icon-caret-1-e' + }, + items: '> *', + menus: 'ul', + position: { + my: 'left top', + at: 'right top' + }, + role: 'menu', + + // Callbacks + blur: null, + focus: null, + select: null + }, + + _create: function () { + this.activeMenu = this.element + + // Flag used to prevent firing of the click handler + // as the event bubbles up through nested menus + this.mouseHandled = false + this.element.uniqueId().attr({ + role: this.options.role, + tabIndex: 0 + }) + + this._addClass('ui-menu', 'ui-widget ui-widget-content') + this._on({ + // Prevent focus from sticking to links inside menu after clicking + // them (focus should always stay on UL during navigation). + 'mousedown .ui-menu-item': function (event) { + event.preventDefault() + }, + 'click .ui-menu-item': function (event) { + var target = $(event.target) + var active = $($.ui.safeActiveElement(this.document[0])) + if (!this.mouseHandled && target.not('.ui-state-disabled').length) { + this.select(event) + + // Only set the mouseHandled flag if the event will bubble, see #9469. + if (!event.isPropagationStopped()) { + this.mouseHandled = true + } + + // Open submenu on click + if (target.has('.ui-menu').length) { + this.expand(event) + } else if (!this.element.is(':focus') && active.closest('.ui-menu').length) { + // Redirect focus to the menu + this.element.trigger('focus', [true]) + + // If the active item is on the top level, let it stay active. + // Otherwise, blur the active item since it is no longer visible. + if (this.active && this.active.parents('.ui-menu').length === 1) { + clearTimeout(this.timer) + } + } + } + }, + 'mouseenter .ui-menu-item': function (event) { + // Ignore mouse events while typeahead is active, see #10458. + // Prevents focusing the wrong item when typeahead causes a scroll while the mouse + // is over an item in the menu + if (this.previousFilter) { + return + } + + var actualTarget = $(event.target).closest('.ui-menu-item'), + target = $(event.currentTarget) + + // Ignore bubbled events on parent items, see #11641 + if (actualTarget[0] !== target[0]) { + return + } + + // Remove ui-state-active class from siblings of the newly focused menu item + // to avoid a jump caused by adjacent elements both having a class with a border + this._removeClass(target.siblings().children('.ui-state-active'), null, 'ui-state-active') + this.focus(event, target) + }, + mouseleave: 'collapseAll', + 'mouseleave .ui-menu': 'collapseAll', + focus: function (event, keepActiveItem) { + // If there's already an active item, keep it active + // If not, activate the first item + var item = this.active || this.element.find(this.options.items).eq(0) + + if (!keepActiveItem) { + this.focus(event, item) + } + }, + blur: function (event) { + this._delay(function () { + var notContained = !$.contains( + this.element[0], + $.ui.safeActiveElement(this.document[0]) + ) + if (notContained) { + this.collapseAll(event) + } + }) + }, + keydown: '_keydown' + }) + + this.refresh() + + // Clicks outside of a menu collapse any open menus + this._on(this.document, { + click: function (event) { + if (this._closeOnDocumentClick(event)) { + this.collapseAll(event) + } + + // Reset the mouseHandled flag + this.mouseHandled = false + } + }) + }, + + _destroy: function () { + var items = this.element.find('.ui-menu-item').removeAttr('role aria-disabled'), + submenus = items + .children('.ui-menu-item-wrapper') + .removeUniqueId() + .removeAttr('tabIndex role aria-haspopup') + + // Destroy (sub)menus + this.element + .removeAttr('aria-activedescendant') + .find('.ui-menu') + .addBack() + .removeAttr('role aria-labelledby aria-expanded aria-hidden aria-disabled ' + 'tabIndex') + .removeUniqueId() + .show() + + submenus.children().each(function () { + var elem = $(this) + if (elem.data('ui-menu-submenu-caret')) { + elem.remove() + } + }) + }, + + _keydown: function (event) { + var match, + prev, + character, + skip, + preventDefault = true + + switch (event.keyCode) { + case $.ui.keyCode.PAGE_UP: + this.previousPage(event) + break + case $.ui.keyCode.PAGE_DOWN: + this.nextPage(event) + break + case $.ui.keyCode.HOME: + this._move('first', 'first', event) + break + case $.ui.keyCode.END: + this._move('last', 'last', event) + break + case $.ui.keyCode.UP: + this.previous(event) + break + case $.ui.keyCode.DOWN: + this.next(event) + break + case $.ui.keyCode.LEFT: + this.collapse(event) + break + case $.ui.keyCode.RIGHT: + if (this.active && !this.active.is('.ui-state-disabled')) { + this.expand(event) + } + break + case $.ui.keyCode.ENTER: + case $.ui.keyCode.SPACE: + this._activate(event) + break + case $.ui.keyCode.ESCAPE: + this.collapse(event) + break + default: + preventDefault = false + prev = this.previousFilter || '' + skip = false + + // Support number pad values + character = + event.keyCode >= 96 && event.keyCode <= 105 + ? (event.keyCode - 96).toString() + : String.fromCharCode(event.keyCode) + + clearTimeout(this.filterTimer) + + if (character === prev) { + skip = true + } else { + character = prev + character + } + + match = this._filterMenuItems(character) + match = + skip && match.index(this.active.next()) !== -1 + ? this.active.nextAll('.ui-menu-item') + : match + + // If no matches on the current filter, reset to the last character pressed + // to move down the menu to the first item that starts with that character + if (!match.length) { + character = String.fromCharCode(event.keyCode) + match = this._filterMenuItems(character) + } + + if (match.length) { + this.focus(event, match) + this.previousFilter = character + this.filterTimer = this._delay(function () { + delete this.previousFilter + }, 1000) + } else { + delete this.previousFilter + } + } + + if (preventDefault) { + event.preventDefault() + } + }, + + _activate: function (event) { + if (this.active && !this.active.is('.ui-state-disabled')) { + if (this.active.children("[aria-haspopup='true']").length) { + this.expand(event) + } else { + this.select(event) + } + } + }, + + refresh: function () { + var menus, + items, + newSubmenus, + newItems, + newWrappers, + that = this, + icon = this.options.icons.submenu, + submenus = this.element.find(this.options.menus) + + this._toggleClass('ui-menu-icons', null, !!this.element.find('.ui-icon').length) + + // Initialize nested menus + newSubmenus = submenus + .filter(':not(.ui-menu)') + .hide() + .attr({ + role: this.options.role, + 'aria-hidden': 'true', + 'aria-expanded': 'false' + }) + .each(function () { + var menu = $(this), + item = menu.prev(), + submenuCaret = $('<span>').data('ui-menu-submenu-caret', true) + + that._addClass(submenuCaret, 'ui-menu-icon', 'ui-icon ' + icon) + item.attr('aria-haspopup', 'true').prepend(submenuCaret) + menu.attr('aria-labelledby', item.attr('id')) + }) + + this._addClass(newSubmenus, 'ui-menu', 'ui-widget ui-widget-content ui-front') + + menus = submenus.add(this.element) + items = menus.find(this.options.items) + + // Initialize menu-items containing spaces and/or dashes only as dividers + items.not('.ui-menu-item').each(function () { + var item = $(this) + if (that._isDivider(item)) { + that._addClass(item, 'ui-menu-divider', 'ui-widget-content') + } + }) + + // Don't refresh list items that are already adapted + newItems = items.not('.ui-menu-item, .ui-menu-divider') + newWrappers = newItems.children().not('.ui-menu').uniqueId().attr({ + tabIndex: -1, + role: this._itemRole() + }) + this._addClass(newItems, 'ui-menu-item')._addClass(newWrappers, 'ui-menu-item-wrapper') + + // Add aria-disabled attribute to any disabled menu item + items.filter('.ui-state-disabled').attr('aria-disabled', 'true') + + // If the active item has been removed, blur the menu + if (this.active && !$.contains(this.element[0], this.active[0])) { + this.blur() + } + }, + + _itemRole: function () { + return { + menu: 'menuitem', + listbox: 'option' + }[this.options.role] + }, + + _setOption: function (key, value) { + if (key === 'icons') { + var icons = this.element.find('.ui-menu-icon') + this._removeClass(icons, null, this.options.icons.submenu)._addClass( + icons, + null, + value.submenu + ) + } + this._super(key, value) + }, + + _setOptionDisabled: function (value) { + this._super(value) + + this.element.attr('aria-disabled', String(value)) + this._toggleClass(null, 'ui-state-disabled', !!value) + }, + + focus: function (event, item) { + var nested, focused, activeParent + this.blur(event, event && event.type === 'focus') + + this._scrollIntoView(item) + + this.active = item.first() + + focused = this.active.children('.ui-menu-item-wrapper') + this._addClass(focused, null, 'ui-state-active') + + // Only update aria-activedescendant if there's a role + // otherwise we assume focus is managed elsewhere + if (this.options.role) { + this.element.attr('aria-activedescendant', focused.attr('id')) + } + + // Highlight active parent menu item, if any + activeParent = this.active.parent().closest('.ui-menu-item').children('.ui-menu-item-wrapper') + this._addClass(activeParent, null, 'ui-state-active') + + if (event && event.type === 'keydown') { + this._close() + } else { + this.timer = this._delay(function () { + this._close() + }, this.delay) + } + + nested = item.children('.ui-menu') + if (nested.length && event && /^mouse/.test(event.type)) { + this._startOpening(nested) + } + this.activeMenu = item.parent() + + this._trigger('focus', event, { item: item }) + }, + + _scrollIntoView: function (item) { + var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight + if (this._hasScroll()) { + borderTop = parseFloat($.css(this.activeMenu[0], 'borderTopWidth')) || 0 + paddingTop = parseFloat($.css(this.activeMenu[0], 'paddingTop')) || 0 + offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop + scroll = this.activeMenu.scrollTop() + elementHeight = this.activeMenu.height() + itemHeight = item.outerHeight() + + if (offset < 0) { + this.activeMenu.scrollTop(scroll + offset) + } else if (offset + itemHeight > elementHeight) { + this.activeMenu.scrollTop(scroll + offset - elementHeight + itemHeight) + } + } + }, + + blur: function (event, fromFocus) { + if (!fromFocus) { + clearTimeout(this.timer) + } + + if (!this.active) { + return + } + + this._removeClass(this.active.children('.ui-menu-item-wrapper'), null, 'ui-state-active') + + this._trigger('blur', event, { item: this.active }) + this.active = null + }, + + _startOpening: function (submenu) { + clearTimeout(this.timer) + + // Don't open if already open fixes a Firefox bug that caused a .5 pixel + // shift in the submenu position when mousing over the caret icon + if (submenu.attr('aria-hidden') !== 'true') { + return + } + + this.timer = this._delay(function () { + this._close() + this._open(submenu) + }, this.delay) + }, + + _open: function (submenu) { + var position = $.extend( + { + of: this.active + }, + this.options.position + ) + + clearTimeout(this.timer) + this.element + .find('.ui-menu') + .not(submenu.parents('.ui-menu')) + .hide() + .attr('aria-hidden', 'true') + + submenu.show().removeAttr('aria-hidden').attr('aria-expanded', 'true').position(position) + }, + + collapseAll: function (event, all) { + clearTimeout(this.timer) + this.timer = this._delay(function () { + // If we were passed an event, look for the submenu that contains the event + var currentMenu = all + ? this.element + : $(event && event.target).closest(this.element.find('.ui-menu')) + + // If we found no valid submenu ancestor, use the main menu to close all + // sub menus anyway + if (!currentMenu.length) { + currentMenu = this.element + } + + this._close(currentMenu) + + this.blur(event) + + // Work around active item staying active after menu is blurred + this._removeClass(currentMenu.find('.ui-state-active'), null, 'ui-state-active') + + this.activeMenu = currentMenu + }, this.delay) + }, + + // With no arguments, closes the currently active menu - if nothing is active + // it closes all menus. If passed an argument, it will search for menus BELOW + _close: function (startMenu) { + if (!startMenu) { + startMenu = this.active ? this.active.parent() : this.element + } + + startMenu.find('.ui-menu').hide().attr('aria-hidden', 'true').attr('aria-expanded', 'false') + }, + + _closeOnDocumentClick: function (event) { + return !$(event.target).closest('.ui-menu').length + }, + + _isDivider: function (item) { + // Match hyphen, em dash, en dash + return !/[^\-\u2014\u2013\s]/.test(item.text()) + }, + + collapse: function (event) { + var newItem = this.active && this.active.parent().closest('.ui-menu-item', this.element) + if (newItem && newItem.length) { + this._close() + this.focus(event, newItem) + } + }, + + expand: function (event) { + var newItem = + this.active && this.active.children('.ui-menu ').find(this.options.items).first() + + if (newItem && newItem.length) { + this._open(newItem.parent()) + + // Delay so Firefox will not hide activedescendant change in expanding submenu from AT + this._delay(function () { + this.focus(event, newItem) + }) + } + }, + + next: function (event) { + this._move('next', 'first', event) + }, + + previous: function (event) { + this._move('prev', 'last', event) + }, + + isFirstItem: function () { + return this.active && !this.active.prevAll('.ui-menu-item').length + }, + + isLastItem: function () { + return this.active && !this.active.nextAll('.ui-menu-item').length + }, + + _move: function (direction, filter, event) { + var next + if (this.active) { + if (direction === 'first' || direction === 'last') { + next = this.active[direction === 'first' ? 'prevAll' : 'nextAll']('.ui-menu-item').eq(-1) + } else { + next = this.active[direction + 'All']('.ui-menu-item').eq(0) + } + } + if (!next || !next.length || !this.active) { + next = this.activeMenu.find(this.options.items)[filter]() + } + + this.focus(event, next) + }, + + nextPage: function (event) { + var item, base, height + + if (!this.active) { + this.next(event) + return + } + if (this.isLastItem()) { + return + } + if (this._hasScroll()) { + base = this.active.offset().top + height = this.element.height() + this.active.nextAll('.ui-menu-item').each(function () { + item = $(this) + return item.offset().top - base - height < 0 + }) + + this.focus(event, item) + } else { + this.focus( + event, + this.activeMenu.find(this.options.items)[!this.active ? 'first' : 'last']() + ) + } + }, + + previousPage: function (event) { + var item, base, height + if (!this.active) { + this.next(event) + return + } + if (this.isFirstItem()) { + return + } + if (this._hasScroll()) { + base = this.active.offset().top + height = this.element.height() + this.active.prevAll('.ui-menu-item').each(function () { + item = $(this) + return item.offset().top - base + height > 0 + }) + + this.focus(event, item) + } else { + this.focus(event, this.activeMenu.find(this.options.items).first()) + } + }, + + _hasScroll: function () { + return this.element.outerHeight() < this.element.prop('scrollHeight') + }, + + select: function (event) { + // TODO: It should never be possible to not have an active item at this + // point, but the tests don't trigger mouseenter before click. + this.active = this.active || $(event.target).closest('.ui-menu-item') + var ui = { item: this.active } + if (!this.active.has('.ui-menu').length) { + this.collapseAll(event, true) + } + this._trigger('select', event, ui) + }, + + _filterMenuItems: function (character) { + var escapedCharacter = character.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'), + regex = new RegExp('^' + escapedCharacter, 'i') + + return ( + this.activeMenu + .find(this.options.items) + + // Only match on items, not dividers or other content (#10571) + .filter('.ui-menu-item') + .filter(function () { + return regex.test($.trim($(this).children('.ui-menu-item-wrapper').text())) + }) + ) + } + }) + + /*! + * jQuery UI Autocomplete 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Autocomplete + //>>group: Widgets + //>>description: Lists suggested words as the user is typing. + //>>docs: http://api.jqueryui.com/autocomplete/ + //>>demos: http://jqueryui.com/autocomplete/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/autocomplete.css + //>>css.theme: ../../themes/base/theme.css + + $.widget('ui.autocomplete', { + version: '1.12.1', + defaultElement: '<input>', + options: { + appendTo: null, + autoFocus: false, + delay: 300, + minLength: 1, + position: { + my: 'left top', + at: 'left bottom', + collision: 'none' + }, + source: null, + + // Callbacks + change: null, + close: null, + focus: null, + open: null, + response: null, + search: null, + select: null + }, + + requestIndex: 0, + pending: 0, + + _create: function () { + // Some browsers only repeat keydown events, not keypress events, + // so we use the suppressKeyPress flag to determine if we've already + // handled the keydown event. #7269 + // Unfortunately the code for & in keypress is the same as the up arrow, + // so we use the suppressKeyPressRepeat flag to avoid handling keypress + // events when we know the keydown event was used to modify the + // search term. #7799 + var suppressKeyPress, + suppressKeyPressRepeat, + suppressInput, + nodeName = this.element[0].nodeName.toLowerCase(), + isTextarea = nodeName === 'textarea', + isInput = nodeName === 'input' + + // Textareas are always multi-line + // Inputs are always single-line, even if inside a contentEditable element + // IE also treats inputs as contentEditable + // All other element types are determined by whether or not they're contentEditable + this.isMultiLine = isTextarea || (!isInput && this._isContentEditable(this.element)) + + this.valueMethod = this.element[isTextarea || isInput ? 'val' : 'text'] + this.isNewMenu = true + + this._addClass('ui-autocomplete-input') + this.element.attr('autocomplete', 'off') + + this._on(this.element, { + keydown: function (event) { + if (this.element.prop('readOnly')) { + suppressKeyPress = true + suppressInput = true + suppressKeyPressRepeat = true + return + } + + suppressKeyPress = false + suppressInput = false + suppressKeyPressRepeat = false + var keyCode = $.ui.keyCode + switch (event.keyCode) { + case keyCode.PAGE_UP: + suppressKeyPress = true + this._move('previousPage', event) + break + case keyCode.PAGE_DOWN: + suppressKeyPress = true + this._move('nextPage', event) + break + case keyCode.UP: + suppressKeyPress = true + this._keyEvent('previous', event) + break + case keyCode.DOWN: + suppressKeyPress = true + this._keyEvent('next', event) + break + case keyCode.ENTER: + // when menu is open and has focus + if (this.menu.active) { + // #6055 - Opera still allows the keypress to occur + // which causes forms to submit + suppressKeyPress = true + event.preventDefault() + this.menu.select(event) + } + break + case keyCode.TAB: + if (this.menu.active) { + this.menu.select(event) + } + break + case keyCode.ESCAPE: + if (this.menu.element.is(':visible')) { + if (!this.isMultiLine) { + this._value(this.term) + } + this.close(event) + + // Different browsers have different default behavior for escape + // Single press can mean undo or clear + // Double press in IE means clear the whole form + event.preventDefault() + } + break + default: + suppressKeyPressRepeat = true + + // search timeout should be triggered before the input value is changed + this._searchTimeout(event) + break + } + }, + keypress: function (event) { + if (suppressKeyPress) { + suppressKeyPress = false + if (!this.isMultiLine || this.menu.element.is(':visible')) { + event.preventDefault() + } + return + } + if (suppressKeyPressRepeat) { + return + } + + // Replicate some key handlers to allow them to repeat in Firefox and Opera + var keyCode = $.ui.keyCode + switch (event.keyCode) { + case keyCode.PAGE_UP: + this._move('previousPage', event) + break + case keyCode.PAGE_DOWN: + this._move('nextPage', event) + break + case keyCode.UP: + this._keyEvent('previous', event) + break + case keyCode.DOWN: + this._keyEvent('next', event) + break + } + }, + input: function (event) { + if (suppressInput) { + suppressInput = false + event.preventDefault() + return + } + this._searchTimeout(event) + }, + focus: function () { + this.selectedItem = null + this.previous = this._value() + }, + blur: function (event) { + if (this.cancelBlur) { + delete this.cancelBlur + return + } + + clearTimeout(this.searching) + this.close(event) + this._change(event) + } + }) + + this._initSource() + this.menu = $('<ul>') + .appendTo(this._appendTo()) + .menu({ + // disable ARIA support, the live region takes care of that + role: null + }) + .hide() + .menu('instance') + + this._addClass(this.menu.element, 'ui-autocomplete', 'ui-front') + this._on(this.menu.element, { + mousedown: function (event) { + // prevent moving focus out of the text field + event.preventDefault() + + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + this.cancelBlur = true + this._delay(function () { + delete this.cancelBlur + + // Support: IE 8 only + // Right clicking a menu item or selecting text from the menu items will + // result in focus moving out of the input. However, we've already received + // and ignored the blur event because of the cancelBlur flag set above. So + // we restore focus to ensure that the menu closes properly based on the user's + // next actions. + if (this.element[0] !== $.ui.safeActiveElement(this.document[0])) { + this.element.trigger('focus') + } + }) + }, + menufocus: function (event, ui) { + var label, item + + // support: Firefox + // Prevent accidental activation of menu items in Firefox (#7024 #9118) + if (this.isNewMenu) { + this.isNewMenu = false + if (event.originalEvent && /^mouse/.test(event.originalEvent.type)) { + this.menu.blur() + + this.document.one('mousemove', function () { + $(event.target).trigger(event.originalEvent) + }) + + return + } + } + + item = ui.item.data('ui-autocomplete-item') + if (false !== this._trigger('focus', event, { item: item })) { + // use value to match what will end up in the input, if it was a key event + if (event.originalEvent && /^key/.test(event.originalEvent.type)) { + this._value(item.value) + } + } + + // Announce the value in the liveRegion + label = ui.item.attr('aria-label') || item.value + if (label && $.trim(label).length) { + this.liveRegion.children().hide() + $('<div>').text(label).appendTo(this.liveRegion) + } + }, + menuselect: function (event, ui) { + var item = ui.item.data('ui-autocomplete-item'), + previous = this.previous + + // Only trigger when focus was lost (click on menu) + if (this.element[0] !== $.ui.safeActiveElement(this.document[0])) { + this.element.trigger('focus') + this.previous = previous + + // #6109 - IE triggers two focus events and the second + // is asynchronous, so we need to reset the previous + // term synchronously and asynchronously :-( + this._delay(function () { + this.previous = previous + this.selectedItem = item + }) + } + + if (false !== this._trigger('select', event, { item: item })) { + this._value(item.value) + } + + // reset the term after the select event + // this allows custom select handling to work properly + this.term = this._value() + + this.close(event) + this.selectedItem = item + } + }) + + this.liveRegion = $('<div>', { + role: 'status', + 'aria-live': 'assertive', + 'aria-relevant': 'additions' + }).appendTo(this.document[0].body) + + this._addClass(this.liveRegion, null, 'ui-helper-hidden-accessible') + + // Turning off autocomplete prevents the browser from remembering the + // value when navigating through history, so we re-enable autocomplete + // if the page is unloaded before the widget is destroyed. #7790 + this._on(this.window, { + beforeunload: function () { + this.element.removeAttr('autocomplete') + } + }) + }, + + _destroy: function () { + clearTimeout(this.searching) + this.element.removeAttr('autocomplete') + this.menu.element.remove() + this.liveRegion.remove() + }, + + _setOption: function (key, value) { + this._super(key, value) + if (key === 'source') { + this._initSource() + } + if (key === 'appendTo') { + this.menu.element.appendTo(this._appendTo()) + } + if (key === 'disabled' && value && this.xhr) { + this.xhr.abort() + } + }, + + _isEventTargetInWidget: function (event) { + var menuElement = this.menu.element[0] + + return ( + event.target === this.element[0] || + event.target === menuElement || + $.contains(menuElement, event.target) + ) + }, + + _closeOnClickOutside: function (event) { + if (!this._isEventTargetInWidget(event)) { + this.close() + } + }, + + _appendTo: function () { + var element = this.options.appendTo + + if (element) { + element = + element.jquery || element.nodeType ? $(element) : this.document.find(element).eq(0) + } + + if (!element || !element[0]) { + element = this.element.closest('.ui-front, dialog') + } + + if (!element.length) { + element = this.document[0].body + } + + return element + }, + + _initSource: function () { + var array, + url, + that = this + if ($.isArray(this.options.source)) { + array = this.options.source + this.source = function (request, response) { + response($.ui.autocomplete.filter(array, request.term)) + } + } else if (typeof this.options.source === 'string') { + url = this.options.source + this.source = function (request, response) { + if (that.xhr) { + that.xhr.abort() + } + that.xhr = $.ajax({ + url: url, + data: request, + dataType: 'json', + success: function (data) { + response(data) + }, + error: function () { + response([]) + } + }) + } + } else { + this.source = this.options.source + } + }, + + _searchTimeout: function (event) { + clearTimeout(this.searching) + this.searching = this._delay(function () { + // Search if the value has changed, or if the user retypes the same value (see #7434) + var equalValues = this.term === this._value(), + menuVisible = this.menu.element.is(':visible'), + modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey + + if (!equalValues || (equalValues && !menuVisible && !modifierKey)) { + this.selectedItem = null + this.search(null, event) + } + }, this.options.delay) + }, + + search: function (value, event) { + value = value != null ? value : this._value() + + // Always save the actual value, not the one passed as an argument + this.term = this._value() + + if (value.length < this.options.minLength) { + return this.close(event) + } + + if (this._trigger('search', event) === false) { + return + } + + return this._search(value) + }, + + _search: function (value) { + this.pending++ + this._addClass('ui-autocomplete-loading') + this.cancelSearch = false + + this.source({ term: value }, this._response()) + }, + + _response: function () { + var index = ++this.requestIndex + + return $.proxy(function (content) { + if (index === this.requestIndex) { + this.__response(content) + } + + this.pending-- + if (!this.pending) { + this._removeClass('ui-autocomplete-loading') + } + }, this) + }, + + __response: function (content) { + if (content) { + content = this._normalize(content) + } + this._trigger('response', null, { content: content }) + if (!this.options.disabled && content && content.length && !this.cancelSearch) { + this._suggest(content) + this._trigger('open') + } else { + // use ._close() instead of .close() so we don't cancel future searches + this._close() + } + }, + + close: function (event) { + this.cancelSearch = true + this._close(event) + }, + + _close: function (event) { + // Remove the handler that closes the menu on outside clicks + this._off(this.document, 'mousedown') + + if (this.menu.element.is(':visible')) { + this.menu.element.hide() + this.menu.blur() + this.isNewMenu = true + this._trigger('close', event) + } + }, + + _change: function (event) { + if (this.previous !== this._value()) { + this._trigger('change', event, { item: this.selectedItem }) + } + }, + + _normalize: function (items) { + // assume all items have the right format when the first item is complete + if (items.length && items[0].label && items[0].value) { + return items + } + return $.map(items, function (item) { + if (typeof item === 'string') { + return { + label: item, + value: item + } + } + return $.extend({}, item, { + label: item.label || item.value, + value: item.value || item.label + }) + }) + }, + + _suggest: function (items) { + var ul = this.menu.element.empty() + this._renderMenu(ul, items) + this.isNewMenu = true + this.menu.refresh() + + // Size and position menu + ul.show() + this._resizeMenu() + ul.position( + $.extend( + { + of: this.element + }, + this.options.position + ) + ) + + if (this.options.autoFocus) { + this.menu.next() + } + + // Listen for interactions outside of the widget (#6642) + this._on(this.document, { + mousedown: '_closeOnClickOutside' + }) + }, + + _resizeMenu: function () { + var ul = this.menu.element + ul.outerWidth( + Math.max( + // Firefox wraps long text (possibly a rounding bug) + // so we add 1px to avoid the wrapping (#7513) + ul.width('').outerWidth() + 1, + this.element.outerWidth() + ) + ) + }, + + _renderMenu: function (ul, items) { + var that = this + $.each(items, function (index, item) { + that._renderItemData(ul, item) + }) + }, + + _renderItemData: function (ul, item) { + return this._renderItem(ul, item).data('ui-autocomplete-item', item) + }, + + _renderItem: function (ul, item) { + return $('<li>').append($('<div>').text(item.label)).appendTo(ul) + }, + + _move: function (direction, event) { + if (!this.menu.element.is(':visible')) { + this.search(null, event) + return + } + if ( + (this.menu.isFirstItem() && /^previous/.test(direction)) || + (this.menu.isLastItem() && /^next/.test(direction)) + ) { + if (!this.isMultiLine) { + this._value(this.term) + } + + this.menu.blur() + return + } + this.menu[direction](event) + }, + + widget: function () { + return this.menu.element + }, + + _value: function () { + return this.valueMethod.apply(this.element, arguments) + }, + + _keyEvent: function (keyEvent, event) { + if (!this.isMultiLine || this.menu.element.is(':visible')) { + this._move(keyEvent, event) + + // Prevents moving cursor to beginning/end of the text field in some browsers + event.preventDefault() + } + }, + + // Support: Chrome <=50 + // We should be able to just use this.element.prop( "isContentEditable" ) + // but hidden elements always report false in Chrome. + // https://code.google.com/p/chromium/issues/detail?id=313082 + _isContentEditable: function (element) { + if (!element.length) { + return false + } + + var editable = element.prop('contentEditable') + + if (editable === 'inherit') { + return this._isContentEditable(element.parent()) + } + + return editable === 'true' + } + }) + + $.extend($.ui.autocomplete, { + escapeRegex: function (value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') + }, + filter: function (array, term) { + var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), 'i') + return $.grep(array, function (value) { + return matcher.test(value.label || value.value || value) + }) + } + }) + + // Live region extension, adding a `messages` option + // NOTE: This is an experimental API. We are still investigating + // a full solution for string manipulation and internationalization. + $.widget('ui.autocomplete', $.ui.autocomplete, { + options: { + messages: { + noResults: 'No search results.', + results: function (amount) { + return ( + amount + + (amount > 1 ? ' results are' : ' result is') + + ' available, use up and down arrow keys to navigate.' + ) + } + } + }, + + __response: function (content) { + var message + this._superApply(arguments) + if (this.options.disabled || this.cancelSearch) { + return + } + if (content && content.length) { + message = this.options.messages.results(content.length) + } else { + message = this.options.messages.noResults + } + this.liveRegion.children().hide() + $('<div>').text(message).appendTo(this.liveRegion) + } + }) + + var widgetsAutocomplete = $.ui.autocomplete + + /*! + * jQuery UI Controlgroup 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Controlgroup + //>>group: Widgets + //>>description: Visually groups form control widgets + //>>docs: http://api.jqueryui.com/controlgroup/ + //>>demos: http://jqueryui.com/controlgroup/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/controlgroup.css + //>>css.theme: ../../themes/base/theme.css + + var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g + + var widgetsControlgroup = $.widget('ui.controlgroup', { + version: '1.12.1', + defaultElement: '<div>', + options: { + direction: 'horizontal', + disabled: null, + onlyVisible: true, + items: { + button: 'input[type=button], input[type=submit], input[type=reset], button, a', + controlgroupLabel: '.ui-controlgroup-label', + checkboxradio: "input[type='checkbox'], input[type='radio']", + selectmenu: 'select', + spinner: '.ui-spinner-input' + } + }, + + _create: function () { + this._enhance() + }, + + // To support the enhanced option in jQuery Mobile, we isolate DOM manipulation + _enhance: function () { + this.element.attr('role', 'toolbar') + this.refresh() + }, + + _destroy: function () { + this._callChildMethod('destroy') + this.childWidgets.removeData('ui-controlgroup-data') + this.element.removeAttr('role') + if (this.options.items.controlgroupLabel) { + this.element + .find(this.options.items.controlgroupLabel) + .find('.ui-controlgroup-label-contents') + .contents() + .unwrap() + } + }, + + _initWidgets: function () { + var that = this, + childWidgets = [] + + // First we iterate over each of the items options + $.each(this.options.items, function (widget, selector) { + var labels + var options = {} + + // Make sure the widget has a selector set + if (!selector) { + return + } + + if (widget === 'controlgroupLabel') { + labels = that.element.find(selector) + labels.each(function () { + var element = $(this) + + if (element.children('.ui-controlgroup-label-contents').length) { + return + } + element.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>") + }) + that._addClass(labels, null, 'ui-widget ui-widget-content ui-state-default') + childWidgets = childWidgets.concat(labels.get()) + return + } + + // Make sure the widget actually exists + if (!$.fn[widget]) { + return + } + + // We assume everything is in the middle to start because we can't determine + // first / last elements until all enhancments are done. + if (that['_' + widget + 'Options']) { + options = that['_' + widget + 'Options']('middle') + } else { + options = { classes: {} } + } + + // Find instances of this widget inside controlgroup and init them + that.element.find(selector).each(function () { + var element = $(this) + var instance = element[widget]('instance') + + // We need to clone the default options for this type of widget to avoid + // polluting the variable options which has a wider scope than a single widget. + var instanceOptions = $.widget.extend({}, options) + + // If the button is the child of a spinner ignore it + // TODO: Find a more generic solution + if (widget === 'button' && element.parent('.ui-spinner').length) { + return + } + + // Create the widget if it doesn't exist + if (!instance) { + instance = element[widget]()[widget]('instance') + } + if (instance) { + instanceOptions.classes = that._resolveClassesValues(instanceOptions.classes, instance) + } + element[widget](instanceOptions) + + // Store an instance of the controlgroup to be able to reference + // from the outermost element for changing options and refresh + var widgetElement = element[widget]('widget') + $.data( + widgetElement[0], + 'ui-controlgroup-data', + instance ? instance : element[widget]('instance') + ) + + childWidgets.push(widgetElement[0]) + }) + }) + + this.childWidgets = $($.unique(childWidgets)) + this._addClass(this.childWidgets, 'ui-controlgroup-item') + }, + + _callChildMethod: function (method) { + this.childWidgets.each(function () { + var element = $(this), + data = element.data('ui-controlgroup-data') + if (data && data[method]) { + data[method]() + } + }) + }, + + _updateCornerClass: function (element, position) { + var remove = 'ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all' + var add = this._buildSimpleOptions(position, 'label').classes.label + + this._removeClass(element, null, remove) + this._addClass(element, null, add) + }, + + _buildSimpleOptions: function (position, key) { + var direction = this.options.direction === 'vertical' + var result = { + classes: {} + } + result.classes[key] = { + middle: '', + first: 'ui-corner-' + (direction ? 'top' : 'left'), + last: 'ui-corner-' + (direction ? 'bottom' : 'right'), + only: 'ui-corner-all' + }[position] + + return result + }, + + _spinnerOptions: function (position) { + var options = this._buildSimpleOptions(position, 'ui-spinner') + + options.classes['ui-spinner-up'] = '' + options.classes['ui-spinner-down'] = '' + + return options + }, + + _buttonOptions: function (position) { + return this._buildSimpleOptions(position, 'ui-button') + }, + + _checkboxradioOptions: function (position) { + return this._buildSimpleOptions(position, 'ui-checkboxradio-label') + }, + + _selectmenuOptions: function (position) { + var direction = this.options.direction === 'vertical' + return { + width: direction ? 'auto' : false, + classes: { + middle: { + 'ui-selectmenu-button-open': '', + 'ui-selectmenu-button-closed': '' + }, + first: { + 'ui-selectmenu-button-open': 'ui-corner-' + (direction ? 'top' : 'tl'), + 'ui-selectmenu-button-closed': 'ui-corner-' + (direction ? 'top' : 'left') + }, + last: { + 'ui-selectmenu-button-open': direction ? '' : 'ui-corner-tr', + 'ui-selectmenu-button-closed': 'ui-corner-' + (direction ? 'bottom' : 'right') + }, + only: { + 'ui-selectmenu-button-open': 'ui-corner-top', + 'ui-selectmenu-button-closed': 'ui-corner-all' + } + }[position] + } + }, + + _resolveClassesValues: function (classes, instance) { + var result = {} + $.each(classes, function (key) { + var current = instance.options.classes[key] || '' + current = $.trim(current.replace(controlgroupCornerRegex, '')) + result[key] = (current + ' ' + classes[key]).replace(/\s+/g, ' ') + }) + return result + }, + + _setOption: function (key, value) { + if (key === 'direction') { + this._removeClass('ui-controlgroup-' + this.options.direction) + } + + this._super(key, value) + if (key === 'disabled') { + this._callChildMethod(value ? 'disable' : 'enable') + return + } + + this.refresh() + }, + + refresh: function () { + var children, + that = this + + this._addClass('ui-controlgroup ui-controlgroup-' + this.options.direction) + + if (this.options.direction === 'horizontal') { + this._addClass(null, 'ui-helper-clearfix') + } + this._initWidgets() + + children = this.childWidgets + + // We filter here because we need to track all childWidgets not just the visible ones + if (this.options.onlyVisible) { + children = children.filter(':visible') + } + + if (children.length) { + // We do this last because we need to make sure all enhancment is done + // before determining first and last + $.each(['first', 'last'], function (index, value) { + var instance = children[value]().data('ui-controlgroup-data') + + if (instance && that['_' + instance.widgetName + 'Options']) { + var options = that['_' + instance.widgetName + 'Options']( + children.length === 1 ? 'only' : value + ) + options.classes = that._resolveClassesValues(options.classes, instance) + instance.element[instance.widgetName](options) + } else { + that._updateCornerClass(children[value](), value) + } + }) + + // Finally call the refresh method on each of the child widgets. + this._callChildMethod('refresh') + } + } + }) + + /*! + * jQuery UI Checkboxradio 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Checkboxradio + //>>group: Widgets + //>>description: Enhances a form with multiple themeable checkboxes or radio buttons. + //>>docs: http://api.jqueryui.com/checkboxradio/ + //>>demos: http://jqueryui.com/checkboxradio/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/button.css + //>>css.structure: ../../themes/base/checkboxradio.css + //>>css.theme: ../../themes/base/theme.css + + $.widget('ui.checkboxradio', [ + $.ui.formResetMixin, + { + version: '1.12.1', + options: { + disabled: null, + label: null, + icon: true, + classes: { + 'ui-checkboxradio-label': 'ui-corner-all', + 'ui-checkboxradio-icon': 'ui-corner-all' + } + }, + + _getCreateOptions: function () { + var disabled, labels + var that = this + var options = this._super() || {} + + // We read the type here, because it makes more sense to throw a element type error first, + // rather then the error for lack of a label. Often if its the wrong type, it + // won't have a label (e.g. calling on a div, btn, etc) + this._readType() + + labels = this.element.labels() + + // If there are multiple labels, use the last one + this.label = $(labels[labels.length - 1]) + if (!this.label.length) { + $.error('No label found for checkboxradio widget') + } + + this.originalLabel = '' + + // We need to get the label text but this may also need to make sure it does not contain the + // input itself. + this.label + .contents() + .not(this.element[0]) + .each(function () { + // The label contents could be text, html, or a mix. We concat each element to get a + // string representation of the label, without the input as part of it. + that.originalLabel += this.nodeType === 3 ? $(this).text() : this.outerHTML + }) + + // Set the label option if we found label text + if (this.originalLabel) { + options.label = this.originalLabel + } + + disabled = this.element[0].disabled + if (disabled != null) { + options.disabled = disabled + } + return options + }, + + _create: function () { + var checked = this.element[0].checked + + this._bindFormResetHandler() + + if (this.options.disabled == null) { + this.options.disabled = this.element[0].disabled + } + + this._setOption('disabled', this.options.disabled) + this._addClass('ui-checkboxradio', 'ui-helper-hidden-accessible') + this._addClass(this.label, 'ui-checkboxradio-label', 'ui-button ui-widget') + + if (this.type === 'radio') { + this._addClass(this.label, 'ui-checkboxradio-radio-label') + } + + if (this.options.label && this.options.label !== this.originalLabel) { + this._updateLabel() + } else if (this.originalLabel) { + this.options.label = this.originalLabel + } + + this._enhance() + + if (checked) { + this._addClass(this.label, 'ui-checkboxradio-checked', 'ui-state-active') + if (this.icon) { + this._addClass(this.icon, null, 'ui-state-hover') + } + } + + this._on({ + change: '_toggleClasses', + focus: function () { + this._addClass(this.label, null, 'ui-state-focus ui-visual-focus') + }, + blur: function () { + this._removeClass(this.label, null, 'ui-state-focus ui-visual-focus') + } + }) + }, + + _readType: function () { + var nodeName = this.element[0].nodeName.toLowerCase() + this.type = this.element[0].type + if (nodeName !== 'input' || !/radio|checkbox/.test(this.type)) { + $.error( + "Can't create checkboxradio on element.nodeName=" + + nodeName + + ' and element.type=' + + this.type + ) + } + }, + + // Support jQuery Mobile enhanced option + _enhance: function () { + this._updateIcon(this.element[0].checked) + }, + + widget: function () { + return this.label + }, + + _getRadioGroup: function () { + var group + var name = this.element[0].name + var nameSelector = "input[name='" + $.ui.escapeSelector(name) + "']" + + if (!name) { + return $([]) + } + + if (this.form.length) { + group = $(this.form[0].elements).filter(nameSelector) + } else { + // Not inside a form, check all inputs that also are not inside a form + group = $(nameSelector).filter(function () { + return $(this).form().length === 0 + }) + } + + return group.not(this.element) + }, + + _toggleClasses: function () { + var checked = this.element[0].checked + this._toggleClass(this.label, 'ui-checkboxradio-checked', 'ui-state-active', checked) + + if (this.options.icon && this.type === 'checkbox') { + this._toggleClass( + this.icon, + null, + 'ui-icon-check ui-state-checked', + checked + )._toggleClass(this.icon, null, 'ui-icon-blank', !checked) + } + + if (this.type === 'radio') { + this._getRadioGroup().each(function () { + var instance = $(this).checkboxradio('instance') + + if (instance) { + instance._removeClass(instance.label, 'ui-checkboxradio-checked', 'ui-state-active') + } + }) + } + }, + + _destroy: function () { + this._unbindFormResetHandler() + + if (this.icon) { + this.icon.remove() + this.iconSpace.remove() + } + }, + + _setOption: function (key, value) { + // We don't allow the value to be set to nothing + if (key === 'label' && !value) { + return + } + + this._super(key, value) + + if (key === 'disabled') { + this._toggleClass(this.label, null, 'ui-state-disabled', value) + this.element[0].disabled = value + + // Don't refresh when setting disabled + return + } + this.refresh() + }, + + _updateIcon: function (checked) { + var toAdd = 'ui-icon ui-icon-background ' + + if (this.options.icon) { + if (!this.icon) { + this.icon = $('<span>') + this.iconSpace = $('<span> </span>') + this._addClass(this.iconSpace, 'ui-checkboxradio-icon-space') + } + + if (this.type === 'checkbox') { + toAdd += checked ? 'ui-icon-check ui-state-checked' : 'ui-icon-blank' + this._removeClass(this.icon, null, checked ? 'ui-icon-blank' : 'ui-icon-check') + } else { + toAdd += 'ui-icon-blank' + } + this._addClass(this.icon, 'ui-checkboxradio-icon', toAdd) + if (!checked) { + this._removeClass(this.icon, null, 'ui-icon-check ui-state-checked') + } + this.icon.prependTo(this.label).after(this.iconSpace) + } else if (this.icon !== undefined) { + this.icon.remove() + this.iconSpace.remove() + delete this.icon + } + }, + + _updateLabel: function () { + // Remove the contents of the label ( minus the icon, icon space, and input ) + var contents = this.label.contents().not(this.element[0]) + if (this.icon) { + contents = contents.not(this.icon[0]) + } + if (this.iconSpace) { + contents = contents.not(this.iconSpace[0]) + } + contents.remove() + + this.label.append(this.options.label) + }, + + refresh: function () { + var checked = this.element[0].checked, + isDisabled = this.element[0].disabled + + this._updateIcon(checked) + this._toggleClass(this.label, 'ui-checkboxradio-checked', 'ui-state-active', checked) + if (this.options.label !== null) { + this._updateLabel() + } + + if (isDisabled !== this.options.disabled) { + this._setOptions({ disabled: isDisabled }) + } + } + } + ]) + + var widgetsCheckboxradio = $.ui.checkboxradio + + /*! + * jQuery UI Button 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Button + //>>group: Widgets + //>>description: Enhances a form with themeable buttons. + //>>docs: http://api.jqueryui.com/button/ + //>>demos: http://jqueryui.com/button/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/button.css + //>>css.theme: ../../themes/base/theme.css + + $.widget('ui.button', { + version: '1.12.1', + defaultElement: '<button>', + options: { + classes: { + 'ui-button': 'ui-corner-all' + }, + disabled: null, + icon: null, + iconPosition: 'beginning', + label: null, + showLabel: true + }, + + _getCreateOptions: function () { + var disabled, + // This is to support cases like in jQuery Mobile where the base widget does have + // an implementation of _getCreateOptions + options = this._super() || {} + + this.isInput = this.element.is('input') + + disabled = this.element[0].disabled + if (disabled != null) { + options.disabled = disabled + } + + this.originalLabel = this.isInput ? this.element.val() : this.element.html() + if (this.originalLabel) { + options.label = this.originalLabel + } + + return options + }, + + _create: function () { + if (!this.option.showLabel & !this.options.icon) { + this.options.showLabel = true + } + + // We have to check the option again here even though we did in _getCreateOptions, + // because null may have been passed on init which would override what was set in + // _getCreateOptions + if (this.options.disabled == null) { + this.options.disabled = this.element[0].disabled || false + } + + this.hasTitle = !!this.element.attr('title') + + // Check to see if the label needs to be set or if its already correct + if (this.options.label && this.options.label !== this.originalLabel) { + if (this.isInput) { + this.element.val(this.options.label) + } else { + this.element.html(this.options.label) + } + } + this._addClass('ui-button', 'ui-widget') + this._setOption('disabled', this.options.disabled) + this._enhance() + + if (this.element.is('a')) { + this._on({ + keyup: function (event) { + if (event.keyCode === $.ui.keyCode.SPACE) { + event.preventDefault() + + // Support: PhantomJS <= 1.9, IE 8 Only + // If a native click is available use it so we actually cause navigation + // otherwise just trigger a click event + if (this.element[0].click) { + this.element[0].click() + } else { + this.element.trigger('click') + } + } + } + }) + } + }, + + _enhance: function () { + if (!this.element.is('button')) { + this.element.attr('role', 'button') + } + + if (this.options.icon) { + this._updateIcon('icon', this.options.icon) + this._updateTooltip() + } + }, + + _updateTooltip: function () { + this.title = this.element.attr('title') + + if (!this.options.showLabel && !this.title) { + this.element.attr('title', this.options.label) + } + }, + + _updateIcon: function (option, value) { + var icon = option !== 'iconPosition', + position = icon ? this.options.iconPosition : value, + displayBlock = position === 'top' || position === 'bottom' + + // Create icon + if (!this.icon) { + this.icon = $('<span>') + + this._addClass(this.icon, 'ui-button-icon', 'ui-icon') + + if (!this.options.showLabel) { + this._addClass('ui-button-icon-only') + } + } else if (icon) { + // If we are updating the icon remove the old icon class + this._removeClass(this.icon, null, this.options.icon) + } + + // If we are updating the icon add the new icon class + if (icon) { + this._addClass(this.icon, null, value) + } + + this._attachIcon(position) + + // If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove + // the iconSpace if there is one. + if (displayBlock) { + this._addClass(this.icon, null, 'ui-widget-icon-block') + if (this.iconSpace) { + this.iconSpace.remove() + } + } else { + // Position is beginning or end so remove the ui-widget-icon-block class and add the + // space if it does not exist + if (!this.iconSpace) { + this.iconSpace = $('<span> </span>') + this._addClass(this.iconSpace, 'ui-button-icon-space') + } + this._removeClass(this.icon, null, 'ui-wiget-icon-block') + this._attachIconSpace(position) + } + }, + + _destroy: function () { + this.element.removeAttr('role') + + if (this.icon) { + this.icon.remove() + } + if (this.iconSpace) { + this.iconSpace.remove() + } + if (!this.hasTitle) { + this.element.removeAttr('title') + } + }, + + _attachIconSpace: function (iconPosition) { + this.icon[/^(?:end|bottom)/.test(iconPosition) ? 'before' : 'after'](this.iconSpace) + }, + + _attachIcon: function (iconPosition) { + this.element[/^(?:end|bottom)/.test(iconPosition) ? 'append' : 'prepend'](this.icon) + }, + + _setOptions: function (options) { + var newShowLabel = + options.showLabel === undefined ? this.options.showLabel : options.showLabel, + newIcon = options.icon === undefined ? this.options.icon : options.icon + + if (!newShowLabel && !newIcon) { + options.showLabel = true + } + this._super(options) + }, + + _setOption: function (key, value) { + if (key === 'icon') { + if (value) { + this._updateIcon(key, value) + } else if (this.icon) { + this.icon.remove() + if (this.iconSpace) { + this.iconSpace.remove() + } + } + } + + if (key === 'iconPosition') { + this._updateIcon(key, value) + } + + // Make sure we can't end up with a button that has neither text nor icon + if (key === 'showLabel') { + this._toggleClass('ui-button-icon-only', null, !value) + this._updateTooltip() + } + + if (key === 'label') { + if (this.isInput) { + this.element.val(value) + } else { + // If there is an icon, append it, else nothing then append the value + // this avoids removal of the icon when setting label text + this.element.html(value) + if (this.icon) { + this._attachIcon(this.options.iconPosition) + this._attachIconSpace(this.options.iconPosition) + } + } + } + + this._super(key, value) + + if (key === 'disabled') { + this._toggleClass(null, 'ui-state-disabled', value) + this.element[0].disabled = value + if (value) { + this.element.blur() + } + } + }, + + refresh: function () { + // Make sure to only check disabled if its an element that supports this otherwise + // check for the disabled class to determine state + var isDisabled = this.element.is('input, button') + ? this.element[0].disabled + : this.element.hasClass('ui-button-disabled') + + if (isDisabled !== this.options.disabled) { + this._setOptions({ disabled: isDisabled }) + } + + this._updateTooltip() + } + }) + + // DEPRECATED + if ($.uiBackCompat !== false) { + // Text and Icons options + $.widget('ui.button', $.ui.button, { + options: { + text: true, + icons: { + primary: null, + secondary: null + } + }, + + _create: function () { + if (this.options.showLabel && !this.options.text) { + this.options.showLabel = this.options.text + } + if (!this.options.showLabel && this.options.text) { + this.options.text = this.options.showLabel + } + if (!this.options.icon && (this.options.icons.primary || this.options.icons.secondary)) { + if (this.options.icons.primary) { + this.options.icon = this.options.icons.primary + } else { + this.options.icon = this.options.icons.secondary + this.options.iconPosition = 'end' + } + } else if (this.options.icon) { + this.options.icons.primary = this.options.icon + } + this._super() + }, + + _setOption: function (key, value) { + if (key === 'text') { + this._super('showLabel', value) + return + } + if (key === 'showLabel') { + this.options.text = value + } + if (key === 'icon') { + this.options.icons.primary = value + } + if (key === 'icons') { + if (value.primary) { + this._super('icon', value.primary) + this._super('iconPosition', 'beginning') + } else if (value.secondary) { + this._super('icon', value.secondary) + this._super('iconPosition', 'end') + } + } + this._superApply(arguments) + } + }) + + $.fn.button = (function (orig) { + return function () { + if ( + !this.length || + (this.length && this[0].tagName !== 'INPUT') || + (this.length && + this[0].tagName === 'INPUT' && + this.attr('type') !== 'checkbox' && + this.attr('type') !== 'radio') + ) { + return orig.apply(this, arguments) + } + if (!$.ui.checkboxradio) { + $.error('Checkboxradio widget missing') + } + if (arguments.length === 0) { + return this.checkboxradio({ + icon: false + }) + } + return this.checkboxradio.apply(this, arguments) + } + })($.fn.button) + + $.fn.buttonset = function () { + if (!$.ui.controlgroup) { + $.error('Controlgroup widget missing') + } + if (arguments[0] === 'option' && arguments[1] === 'items' && arguments[2]) { + return this.controlgroup.apply(this, [arguments[0], 'items.button', arguments[2]]) + } + if (arguments[0] === 'option' && arguments[1] === 'items') { + return this.controlgroup.apply(this, [arguments[0], 'items.button']) + } + if (typeof arguments[0] === 'object' && arguments[0].items) { + arguments[0].items = { + button: arguments[0].items + } + } + return this.controlgroup.apply(this, arguments) + } + } + + var widgetsButton = $.ui.button + + // jscs:disable maximumLineLength + /* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */ + /*! + * jQuery UI Datepicker 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Datepicker + //>>group: Widgets + //>>description: Displays a calendar from an input or inline for selecting dates. + //>>docs: http://api.jqueryui.com/datepicker/ + //>>demos: http://jqueryui.com/datepicker/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/datepicker.css + //>>css.theme: ../../themes/base/theme.css + + $.extend($.ui, { datepicker: { version: '1.12.1' } }) + + var datepicker_instActive + + function datepicker_getZindex(elem) { + var position, value + while (elem.length && elem[0] !== document) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css('position') + if (position === 'absolute' || position === 'relative' || position === 'fixed') { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> + value = parseInt(elem.css('zIndex'), 10) + if (!isNaN(value) && value !== 0) { + return value + } + } + elem = elem.parent() + } + + return 0 + } + /* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + + function Datepicker() { + this._curInst = null // The current instance in use + this._keyEvent = false // If the last event was a key event + this._disabledInputs = [] // List of date picker inputs that have been disabled + this._datepickerShowing = false // True if the popup picker is showing , false if not + this._inDialog = false // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div' // The ID of the main datepicker division + this._inlineClass = 'ui-datepicker-inline' // The name of the inline marker class + this._appendClass = 'ui-datepicker-append' // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger' // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog' // The name of the dialog marker class + this._disableClass = 'ui-datepicker-disabled' // The name of the disabled covering marker class + this._unselectableClass = 'ui-datepicker-unselectable' // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day' // The name of the current day marker class + this._dayOverClass = 'ui-datepicker-days-cell-over' // The name of the day hover marker class + this.regional = [] // Available regional settings, indexed by language code + this.regional[''] = { + // Default regional settings + closeText: 'Done', // Display text for close link + prevText: 'Prev', // Display text for previous month link + nextText: 'Next', // Display text for next month link + currentText: 'Today', // Display text for current month link + monthNames: [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' + ], // Names of months for drop-down and formatting + monthNamesShort: [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' + ], // For formatting + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], // Column headings for days starting at Sunday + weekHeader: 'Wk', // Column header for week of the year + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + isRTL: false, // True if right-to-left language, false if left-to-right + showMonthAfterYear: false, // True if the year select precedes month, false for month then year + yearSuffix: '' // Additional text to append to the year in the month headers + } + this._defaults = { + // Global defaults for all the date picker instances + showOn: 'focus', // "focus" for popup on focus, + // "button" for trigger button, or "both" for either + showAnim: 'fadeIn', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: false, // True if month can be selected directly, false if only prev/next + changeYear: false, // True if year can be selected directly, false if only prev/next + yearRange: 'c-10:c+10', // Range of years to display in drop-down, + // either relative to today's year (-nn:+nn), relative to currently displayed year + // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) + showOtherMonths: false, // True to show dates in other months, false to leave blank + selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable + showWeek: false, // True to show week of the year, false to not show it + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with "+" for current year + value + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: 'fast', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "", + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) + stepMonths: 1, // Number of months to step back/forward + stepBigMonths: 12, // Number of months to step back/forward for the big links + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '', // The date format to use for the alternate field + constrainInput: true, // The input is constrained by the current date format + showButtonPanel: false, // True to show button panel, false to not show it + autoSize: false, // True to size the input for the date format, false to leave as is + disabled: false // The initial disabled state + } + $.extend(this._defaults, this.regional['']) + this.regional.en = $.extend(true, {}, this.regional['']) + this.regional['en-US'] = $.extend(true, {}, this.regional.en) + this.dpDiv = datepicker_bindHover( + $( + "<div id='" + + this._mainDivId + + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" + ) + ) + } + + $.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + //Keep track of the maximum number of rows displayed (see #7043) + maxRows: 4, + + // TODO rename to "widget" when switching to widget factory + _widgetDatepicker: function () { + return this.dpDiv + }, + + /* Override the default settings for all instances of the date picker. + * @param settings object - the new settings to use as defaults (anonymous object) + * @return the manager object + */ + setDefaults: function (settings) { + datepicker_extendRemove(this._defaults, settings || {}) + return this + }, + + /* Attach the date picker to a jQuery selection. + * @param target element - the target input field or division or span + * @param settings object - the new settings to use for this date picker instance (anonymous) + */ + _attachDatepicker: function (target, settings) { + var nodeName, inline, inst + nodeName = target.nodeName.toLowerCase() + inline = nodeName === 'div' || nodeName === 'span' + if (!target.id) { + this.uuid += 1 + target.id = 'dp' + this.uuid + } + inst = this._newInst($(target), inline) + inst.settings = $.extend({}, settings || {}) + if (nodeName === 'input') { + this._connectDatepicker(target, inst) + } else if (inline) { + this._inlineDatepicker(target, inst) + } + }, + + /* Create a new instance object. */ + _newInst: function (target, inline) { + var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, '\\\\$1') // escape jQuery meta chars + return { + id: id, + input: target, // associated target + selectedDay: 0, + selectedMonth: 0, + selectedYear: 0, // current selection + drawMonth: 0, + drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: !inline + ? this.dpDiv // presentation div + : datepicker_bindHover( + $( + "<div class='" + + this._inlineClass + + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" + ) + ) + } + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function (target, inst) { + var input = $(target) + inst.append = $([]) + inst.trigger = $([]) + if (input.hasClass(this.markerClassName)) { + return + } + this._attachments(input, inst) + input + .addClass(this.markerClassName) + .on('keydown', this._doKeyDown) + .on('keypress', this._doKeyPress) + .on('keyup', this._doKeyUp) + this._autoSize(inst) + $.data(target, 'datepicker', inst) + + //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665) + if (inst.settings.disabled) { + this._disableDatepicker(target) + } + }, + + /* Make attachments based on settings. */ + _attachments: function (input, inst) { + var showOn, + buttonText, + buttonImage, + appendText = this._get(inst, 'appendText'), + isRTL = this._get(inst, 'isRTL') + + if (inst.append) { + inst.append.remove() + } + if (appendText) { + inst.append = $("<span class='" + this._appendClass + "'>" + appendText + '</span>') + input[isRTL ? 'before' : 'after'](inst.append) + } + + input.off('focus', this._showDatepicker) + + if (inst.trigger) { + inst.trigger.remove() + } + + showOn = this._get(inst, 'showOn') + if (showOn === 'focus' || showOn === 'both') { + // pop-up date picker when in the marked field + input.on('focus', this._showDatepicker) + } + if (showOn === 'button' || showOn === 'both') { + // pop-up date picker when button clicked + buttonText = this._get(inst, 'buttonText') + buttonImage = this._get(inst, 'buttonImage') + inst.trigger = $( + this._get(inst, 'buttonImageOnly') + ? $('<img/>') + .addClass(this._triggerClass) + .attr({ src: buttonImage, alt: buttonText, title: buttonText }) + : $("<button type='button'></button>") + .addClass(this._triggerClass) + .html( + !buttonImage + ? buttonText + : $('<img/>').attr({ src: buttonImage, alt: buttonText, title: buttonText }) + ) + ) + input[isRTL ? 'before' : 'after'](inst.trigger) + inst.trigger.on('click', function () { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) { + $.datepicker._hideDatepicker() + } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) { + $.datepicker._hideDatepicker() + $.datepicker._showDatepicker(input[0]) + } else { + $.datepicker._showDatepicker(input[0]) + } + return false + }) + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function (inst) { + if (this._get(inst, 'autoSize') && !inst.inline) { + var findMax, + max, + maxI, + i, + date = new Date(2009, 12 - 1, 20), // Ensure double digits + dateFormat = this._get(inst, 'dateFormat') + + if (dateFormat.match(/[DM]/)) { + findMax = function (names) { + max = 0 + maxI = 0 + for (i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length + maxI = i + } + } + return maxI + } + date.setMonth( + findMax(this._get(inst, dateFormat.match(/MM/) ? 'monthNames' : 'monthNamesShort')) + ) + date.setDate( + findMax(this._get(inst, dateFormat.match(/DD/) ? 'dayNames' : 'dayNamesShort')) + + 20 - + date.getDay() + ) + } + inst.input.attr('size', this._formatDate(inst, date).length) + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function (target, inst) { + var divSpan = $(target) + if (divSpan.hasClass(this.markerClassName)) { + return + } + divSpan.addClass(this.markerClassName).append(inst.dpDiv) + $.data(target, 'datepicker', inst) + this._setDate(inst, this._getDefaultDate(inst), true) + this._updateDatepicker(inst) + this._updateAlternate(inst) + + //If disabled option is true, disable the datepicker before showing it (see ticket #5665) + if (inst.settings.disabled) { + this._disableDatepicker(target) + } + + // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements + // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height + inst.dpDiv.css('display', 'block') + }, + + /* Pop-up the date picker in a "dialog" box. + * @param input element - ignored + * @param date string or Date - the initial date to display + * @param onSelect function - the function to call when a date is selected + * @param settings object - update the dialog date picker instance's settings (anonymous object) + * @param pos int[2] - coordinates for the dialog's position within the screen or + * event - with x/y coordinates or + * leave empty for default (screen centre) + * @return the manager object + */ + _dialogDatepicker: function (input, date, onSelect, settings, pos) { + var id, + browserWidth, + browserHeight, + scrollX, + scrollY, + inst = this._dialogInst // internal instance + + if (!inst) { + this.uuid += 1 + id = 'dp' + this.uuid + this._dialogInput = $( + "<input type='text' id='" + + id + + "' style='position: absolute; top: -100px; width: 0px;'/>" + ) + this._dialogInput.on('keydown', this._doKeyDown) + $('body').append(this._dialogInput) + inst = this._dialogInst = this._newInst(this._dialogInput, false) + inst.settings = {} + $.data(this._dialogInput[0], 'datepicker', inst) + } + datepicker_extendRemove(inst.settings, settings || {}) + date = date && date.constructor === Date ? this._formatDate(inst, date) : date + this._dialogInput.val(date) + + this._pos = pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null + if (!this._pos) { + browserWidth = document.documentElement.clientWidth + browserHeight = document.documentElement.clientHeight + scrollX = document.documentElement.scrollLeft || document.body.scrollLeft + scrollY = document.documentElement.scrollTop || document.body.scrollTop + this._pos = + // should use actual width/height below + [browserWidth / 2 - 100 + scrollX, browserHeight / 2 - 150 + scrollY] + } + + // Move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', this._pos[0] + 20 + 'px').css('top', this._pos[1] + 'px') + inst.settings.onSelect = onSelect + this._inDialog = true + this.dpDiv.addClass(this._dialogClass) + this._showDatepicker(this._dialogInput[0]) + if ($.blockUI) { + $.blockUI(this.dpDiv) + } + $.data(this._dialogInput[0], 'datepicker', inst) + return this + }, + + /* Detach a datepicker from its control. + * @param target element - the target input field or division or span + */ + _destroyDatepicker: function (target) { + var nodeName, + $target = $(target), + inst = $.data(target, 'datepicker') + + if (!$target.hasClass(this.markerClassName)) { + return + } + + nodeName = target.nodeName.toLowerCase() + $.removeData(target, 'datepicker') + if (nodeName === 'input') { + inst.append.remove() + inst.trigger.remove() + $target + .removeClass(this.markerClassName) + .off('focus', this._showDatepicker) + .off('keydown', this._doKeyDown) + .off('keypress', this._doKeyPress) + .off('keyup', this._doKeyUp) + } else if (nodeName === 'div' || nodeName === 'span') { + $target.removeClass(this.markerClassName).empty() + } + + if (datepicker_instActive === inst) { + datepicker_instActive = null + } + }, + + /* Enable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _enableDatepicker: function (target) { + var nodeName, + inline, + $target = $(target), + inst = $.data(target, 'datepicker') + + if (!$target.hasClass(this.markerClassName)) { + return + } + + nodeName = target.nodeName.toLowerCase() + if (nodeName === 'input') { + target.disabled = false + inst.trigger + .filter('button') + .each(function () { + this.disabled = false + }) + .end() + .filter('img') + .css({ opacity: '1.0', cursor: '' }) + } else if (nodeName === 'div' || nodeName === 'span') { + inline = $target.children('.' + this._inlineClass) + inline.children().removeClass('ui-state-disabled') + inline.find('select.ui-datepicker-month, select.ui-datepicker-year').prop('disabled', false) + } + this._disabledInputs = $.map(this._disabledInputs, function (value) { + return value === target ? null : value + }) // delete entry + }, + + /* Disable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _disableDatepicker: function (target) { + var nodeName, + inline, + $target = $(target), + inst = $.data(target, 'datepicker') + + if (!$target.hasClass(this.markerClassName)) { + return + } + + nodeName = target.nodeName.toLowerCase() + if (nodeName === 'input') { + target.disabled = true + inst.trigger + .filter('button') + .each(function () { + this.disabled = true + }) + .end() + .filter('img') + .css({ opacity: '0.5', cursor: 'default' }) + } else if (nodeName === 'div' || nodeName === 'span') { + inline = $target.children('.' + this._inlineClass) + inline.children().addClass('ui-state-disabled') + inline.find('select.ui-datepicker-month, select.ui-datepicker-year').prop('disabled', true) + } + this._disabledInputs = $.map(this._disabledInputs, function (value) { + return value === target ? null : value + }) // delete entry + this._disabledInputs[this._disabledInputs.length] = target + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + * @param target element - the target input field or division or span + * @return boolean - true if disabled, false if enabled + */ + _isDisabledDatepicker: function (target) { + if (!target) { + return false + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] === target) { + return true + } + } + return false + }, + + /* Retrieve the instance data for the target control. + * @param target element - the target input field or division or span + * @return object - the associated instance data + * @throws error if a jQuery problem getting data + */ + _getInst: function (target) { + try { + return $.data(target, 'datepicker') + } catch (err) { + throw 'Missing instance data for this datepicker' + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + * @param target element - the target input field or division or span + * @param name object - the new settings to update or + * string - the name of the setting to change or retrieve, + * when retrieving also "all" for all instance settings or + * "defaults" for all global defaults + * @param value any - the new value for the setting + * (omit if above is an object or to retrieve a value) + */ + _optionDatepicker: function (target, name, value) { + var settings, + date, + minDate, + maxDate, + inst = this._getInst(target) + + if (arguments.length === 2 && typeof name === 'string') { + return name === 'defaults' + ? $.extend({}, $.datepicker._defaults) + : inst + ? name === 'all' + ? $.extend({}, inst.settings) + : this._get(inst, name) + : null + } + + settings = name || {} + if (typeof name === 'string') { + settings = {} + settings[name] = value + } + + if (inst) { + if (this._curInst === inst) { + this._hideDatepicker() + } + + date = this._getDateDatepicker(target, true) + minDate = this._getMinMaxDate(inst, 'min') + maxDate = this._getMinMaxDate(inst, 'max') + datepicker_extendRemove(inst.settings, settings) + + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if ( + minDate !== null && + settings.dateFormat !== undefined && + settings.minDate === undefined + ) { + inst.settings.minDate = this._formatDate(inst, minDate) + } + if ( + maxDate !== null && + settings.dateFormat !== undefined && + settings.maxDate === undefined + ) { + inst.settings.maxDate = this._formatDate(inst, maxDate) + } + if ('disabled' in settings) { + if (settings.disabled) { + this._disableDatepicker(target) + } else { + this._enableDatepicker(target) + } + } + this._attachments($(target), inst) + this._autoSize(inst) + this._setDate(inst, date) + this._updateAlternate(inst) + this._updateDatepicker(inst) + } + }, + + // Change method deprecated + _changeDatepicker: function (target, name, value) { + this._optionDatepicker(target, name, value) + }, + + /* Redraw the date picker attached to an input field or division. + * @param target element - the target input field or division or span + */ + _refreshDatepicker: function (target) { + var inst = this._getInst(target) + if (inst) { + this._updateDatepicker(inst) + } + }, + + /* Set the dates for a jQuery selection. + * @param target element - the target input field or division or span + * @param date Date - the new date + */ + _setDateDatepicker: function (target, date) { + var inst = this._getInst(target) + if (inst) { + this._setDate(inst, date) + this._updateDatepicker(inst) + this._updateAlternate(inst) + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + * @param target element - the target input field or division or span + * @param noDefault boolean - true if no default date is to be used + * @return Date - the current date + */ + _getDateDatepicker: function (target, noDefault) { + var inst = this._getInst(target) + if (inst && !inst.inline) { + this._setDateFromField(inst, noDefault) + } + return inst ? this._getDate(inst) : null + }, + + /* Handle keystrokes. */ + _doKeyDown: function (event) { + var onSelect, + dateStr, + sel, + inst = $.datepicker._getInst(event.target), + handled = true, + isRTL = inst.dpDiv.is('.ui-datepicker-rtl') + + inst._keyEvent = true + if ($.datepicker._datepickerShowing) { + switch (event.keyCode) { + case 9: + $.datepicker._hideDatepicker() + handled = false + break // hide on tab out + case 13: + sel = $( + 'td.' + $.datepicker._dayOverClass + ':not(.' + $.datepicker._currentClass + ')', + inst.dpDiv + ) + if (sel[0]) { + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]) + } + + onSelect = $.datepicker._get(inst, 'onSelect') + if (onSelect) { + dateStr = $.datepicker._formatDate(inst) + + // Trigger custom callback + onSelect.apply(inst.input ? inst.input[0] : null, [dateStr, inst]) + } else { + $.datepicker._hideDatepicker() + } + + return false // don't submit the form + case 27: + $.datepicker._hideDatepicker() + break // hide on escape + case 33: + $.datepicker._adjustDate( + event.target, + event.ctrlKey + ? -$.datepicker._get(inst, 'stepBigMonths') + : -$.datepicker._get(inst, 'stepMonths'), + 'M' + ) + break // previous month/year on page up/+ ctrl + case 34: + $.datepicker._adjustDate( + event.target, + event.ctrlKey + ? +$.datepicker._get(inst, 'stepBigMonths') + : +$.datepicker._get(inst, 'stepMonths'), + 'M' + ) + break // next month/year on page down/+ ctrl + case 35: + if (event.ctrlKey || event.metaKey) { + $.datepicker._clearDate(event.target) + } + handled = event.ctrlKey || event.metaKey + break // clear on ctrl or command +end + case 36: + if (event.ctrlKey || event.metaKey) { + $.datepicker._gotoToday(event.target) + } + handled = event.ctrlKey || event.metaKey + break // current on ctrl or command +home + case 37: + if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, isRTL ? +1 : -1, 'D') + } + handled = event.ctrlKey || event.metaKey + + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) { + $.datepicker._adjustDate( + event.target, + event.ctrlKey + ? -$.datepicker._get(inst, 'stepBigMonths') + : -$.datepicker._get(inst, 'stepMonths'), + 'M' + ) + } + + // next month/year on alt +left on Mac + break + case 38: + if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, -7, 'D') + } + handled = event.ctrlKey || event.metaKey + break // -1 week on ctrl or command +up + case 39: + if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, isRTL ? -1 : +1, 'D') + } + handled = event.ctrlKey || event.metaKey + + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) { + $.datepicker._adjustDate( + event.target, + event.ctrlKey + ? +$.datepicker._get(inst, 'stepBigMonths') + : +$.datepicker._get(inst, 'stepMonths'), + 'M' + ) + } + + // next month/year on alt +right + break + case 40: + if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, +7, 'D') + } + handled = event.ctrlKey || event.metaKey + break // +1 week on ctrl or command +down + default: + handled = false + } + } else if (event.keyCode === 36 && event.ctrlKey) { + // display the date picker on ctrl+home + $.datepicker._showDatepicker(this) + } else { + handled = false + } + + if (handled) { + event.preventDefault() + event.stopPropagation() + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function (event) { + var chars, + chr, + inst = $.datepicker._getInst(event.target) + + if ($.datepicker._get(inst, 'constrainInput')) { + chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')) + chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode) + return event.ctrlKey || event.metaKey || chr < ' ' || !chars || chars.indexOf(chr) > -1 + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function (event) { + var date, + inst = $.datepicker._getInst(event.target) + + if (inst.input.val() !== inst.lastVal) { + try { + date = $.datepicker.parseDate( + $.datepicker._get(inst, 'dateFormat'), + inst.input ? inst.input.val() : null, + $.datepicker._getFormatConfig(inst) + ) + + if (date) { + // only if valid + $.datepicker._setDateFromField(inst) + $.datepicker._updateAlternate(inst) + $.datepicker._updateDatepicker(inst) + } + } catch (err) {} + } + return true + }, + + /* Pop-up the date picker for a given input field. + * If false returned from beforeShow event handler do not show. + * @param input element - the input field attached to the date picker or + * event - if triggered by focus + */ + _showDatepicker: function (input) { + input = input.target || input + if (input.nodeName.toLowerCase() !== 'input') { + // find from button/image trigger + input = $('input', input.parentNode)[0] + } + + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { + // already here + return + } + + var inst, beforeShow, beforeShowSettings, isFixed, offset, showAnim, duration + + inst = $.datepicker._getInst(input) + if ($.datepicker._curInst && $.datepicker._curInst !== inst) { + $.datepicker._curInst.dpDiv.stop(true, true) + if (inst && $.datepicker._datepickerShowing) { + $.datepicker._hideDatepicker($.datepicker._curInst.input[0]) + } + } + + beforeShow = $.datepicker._get(inst, 'beforeShow') + beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {} + if (beforeShowSettings === false) { + return + } + datepicker_extendRemove(inst.settings, beforeShowSettings) + + inst.lastVal = null + $.datepicker._lastInput = input + $.datepicker._setDateFromField(inst) + + if ($.datepicker._inDialog) { + // hide cursor + input.value = '' + } + if (!$.datepicker._pos) { + // position below input + $.datepicker._pos = $.datepicker._findPos(input) + $.datepicker._pos[1] += input.offsetHeight // add the height + } + + isFixed = false + $(input) + .parents() + .each(function () { + isFixed |= $(this).css('position') === 'fixed' + return !isFixed + }) + + offset = { left: $.datepicker._pos[0], top: $.datepicker._pos[1] } + $.datepicker._pos = null + + //to avoid flashes on Firefox + inst.dpDiv.empty() + + // determine sizing offscreen + inst.dpDiv.css({ position: 'absolute', display: 'block', top: '-1000px' }) + $.datepicker._updateDatepicker(inst) + + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed) + inst.dpDiv.css({ + position: $.datepicker._inDialog && $.blockUI ? 'static' : isFixed ? 'fixed' : 'absolute', + display: 'none', + left: offset.left + 'px', + top: offset.top + 'px' + }) + + if (!inst.inline) { + showAnim = $.datepicker._get(inst, 'showAnim') + duration = $.datepicker._get(inst, 'duration') + inst.dpDiv.css('z-index', datepicker_getZindex($(input)) + 1) + $.datepicker._datepickerShowing = true + + if ($.effects && $.effects.effect[showAnim]) { + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration) + } else { + inst.dpDiv[showAnim || 'show'](showAnim ? duration : null) + } + + if ($.datepicker._shouldFocusInput(inst)) { + inst.input.trigger('focus') + } + + $.datepicker._curInst = inst + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function (inst) { + this.maxRows = 4 //Reset the max number of rows being displayed (see #7043) + datepicker_instActive = inst // for delegate hover events + inst.dpDiv.empty().append(this._generateHTML(inst)) + this._attachHandlers(inst) + + var origyearshtml, + numMonths = this._getNumberOfMonths(inst), + cols = numMonths[1], + width = 17, + activeCell = inst.dpDiv.find('.' + this._dayOverClass + ' a') + + if (activeCell.length > 0) { + datepicker_handleMouseover.apply(activeCell.get(0)) + } + + inst.dpDiv + .removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4') + .width('') + if (cols > 1) { + inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', width * cols + 'em') + } + inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? 'add' : 'remove') + 'Class']( + 'ui-datepicker-multi' + ) + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + 'Class']('ui-datepicker-rtl') + + if ( + inst === $.datepicker._curInst && + $.datepicker._datepickerShowing && + $.datepicker._shouldFocusInput(inst) + ) { + inst.input.trigger('focus') + } + + // Deffered render of the years select (to avoid flashes on Firefox) + if (inst.yearshtml) { + origyearshtml = inst.yearshtml + setTimeout(function () { + //assure that inst.yearshtml didn't change. + if (origyearshtml === inst.yearshtml && inst.yearshtml) { + inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml) + } + origyearshtml = inst.yearshtml = null + }, 0) + } + }, + + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + // Support: IE and jQuery <1.9 + _shouldFocusInput: function (inst) { + return ( + inst.input && + inst.input.is(':visible') && + !inst.input.is(':disabled') && + !inst.input.is(':focus') + ) + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function (inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(), + dpHeight = inst.dpDiv.outerHeight(), + inputWidth = inst.input ? inst.input.outerWidth() : 0, + inputHeight = inst.input ? inst.input.outerHeight() : 0, + viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()), + viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop()) + + offset.left -= this._get(inst, 'isRTL') ? dpWidth - inputWidth : 0 + offset.left -= + isFixed && offset.left === inst.input.offset().left ? $(document).scrollLeft() : 0 + offset.top -= + isFixed && offset.top === inst.input.offset().top + inputHeight + ? $(document).scrollTop() + : 0 + + // Now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min( + offset.left, + offset.left + dpWidth > viewWidth && viewWidth > dpWidth + ? Math.abs(offset.left + dpWidth - viewWidth) + : 0 + ) + offset.top -= Math.min( + offset.top, + offset.top + dpHeight > viewHeight && viewHeight > dpHeight + ? Math.abs(dpHeight + inputHeight) + : 0 + ) + + return offset + }, + + /* Find an object's position on the screen. */ + _findPos: function (obj) { + var position, + inst = this._getInst(obj), + isRTL = this._get(inst, 'isRTL') + + while (obj && (obj.type === 'hidden' || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? 'previousSibling' : 'nextSibling'] + } + + position = $(obj).offset() + return [position.left, position.top] + }, + + /* Hide the date picker from view. + * @param input element - the input field attached to the date picker + */ + _hideDatepicker: function (input) { + var showAnim, + duration, + postProcess, + onClose, + inst = this._curInst + + if (!inst || (input && inst !== $.data(input, 'datepicker'))) { + return + } + + if (this._datepickerShowing) { + showAnim = this._get(inst, 'showAnim') + duration = this._get(inst, 'duration') + postProcess = function () { + $.datepicker._tidyDialog(inst) + } + + // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed + if ($.effects && ($.effects.effect[showAnim] || $.effects[showAnim])) { + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess) + } else { + inst.dpDiv[ + showAnim === 'slideDown' ? 'slideUp' : showAnim === 'fadeIn' ? 'fadeOut' : 'hide' + ](showAnim ? duration : null, postProcess) + } + + if (!showAnim) { + postProcess() + } + this._datepickerShowing = false + + onClose = this._get(inst, 'onClose') + if (onClose) { + onClose.apply(inst.input ? inst.input[0] : null, [ + inst.input ? inst.input.val() : '', + inst + ]) + } + + this._lastInput = null + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }) + if ($.blockUI) { + $.unblockUI() + $('body').append(this.dpDiv) + } + } + this._inDialog = false + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function (inst) { + inst.dpDiv.removeClass(this._dialogClass).off('.ui-datepicker-calendar') + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function (event) { + if (!$.datepicker._curInst) { + return + } + + var $target = $(event.target), + inst = $.datepicker._getInst($target[0]) + + if ( + ($target[0].id !== $.datepicker._mainDivId && + $target.parents('#' + $.datepicker._mainDivId).length === 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.closest('.' + $.datepicker._triggerClass).length && + $.datepicker._datepickerShowing && + !($.datepicker._inDialog && $.blockUI)) || + ($target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst) + ) { + $.datepicker._hideDatepicker() + } + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function (id, offset, period) { + var target = $(id), + inst = this._getInst(target[0]) + + if (this._isDisabledDatepicker(target[0])) { + return + } + this._adjustInstDate( + inst, + offset + (period === 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning + period + ) + this._updateDatepicker(inst) + }, + + /* Action for current link. */ + _gotoToday: function (id) { + var date, + target = $(id), + inst = this._getInst(target[0]) + + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay + inst.drawMonth = inst.selectedMonth = inst.currentMonth + inst.drawYear = inst.selectedYear = inst.currentYear + } else { + date = new Date() + inst.selectedDay = date.getDate() + inst.drawMonth = inst.selectedMonth = date.getMonth() + inst.drawYear = inst.selectedYear = date.getFullYear() + } + this._notifyChange(inst) + this._adjustDate(target) + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function (id, select, period) { + var target = $(id), + inst = this._getInst(target[0]) + + inst['selected' + (period === 'M' ? 'Month' : 'Year')] = inst[ + 'draw' + (period === 'M' ? 'Month' : 'Year') + ] = parseInt(select.options[select.selectedIndex].value, 10) + + this._notifyChange(inst) + this._adjustDate(target) + }, + + /* Action for selecting a day. */ + _selectDay: function (id, month, year, td) { + var inst, + target = $(id) + + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return + } + + inst = this._getInst(target[0]) + inst.selectedDay = inst.currentDay = $('a', td).html() + inst.selectedMonth = inst.currentMonth = month + inst.selectedYear = inst.currentYear = year + this._selectDate( + id, + this._formatDate(inst, inst.currentDay, inst.currentMonth, inst.currentYear) + ) + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function (id) { + var target = $(id) + this._selectDate(target, '') + }, + + /* Update the input field with the selected date. */ + _selectDate: function (id, dateStr) { + var onSelect, + target = $(id), + inst = this._getInst(target[0]) + + dateStr = dateStr != null ? dateStr : this._formatDate(inst) + if (inst.input) { + inst.input.val(dateStr) + } + this._updateAlternate(inst) + + onSelect = this._get(inst, 'onSelect') + if (onSelect) { + onSelect.apply(inst.input ? inst.input[0] : null, [dateStr, inst]) // trigger custom callback + } else if (inst.input) { + inst.input.trigger('change') // fire the change event + } + + if (inst.inline) { + this._updateDatepicker(inst) + } else { + this._hideDatepicker() + this._lastInput = inst.input[0] + if (typeof inst.input[0] !== 'object') { + inst.input.trigger('focus') // restore focus + } + this._lastInput = null + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function (inst) { + var altFormat, + date, + dateStr, + altField = this._get(inst, 'altField') + + if (altField) { + // update alternate field too + altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat') + date = this._getDate(inst) + dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)) + $(altField).val(dateStr) + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + * @param date Date - the date to customise + * @return [boolean, string] - is this date selectable?, what is its CSS class? + */ + noWeekends: function (date) { + var day = date.getDay() + return [day > 0 && day < 6, ''] + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + * @param date Date - the date to get the week for + * @return number - the number of the week within the year that contains this date + */ + iso8601Week: function (date) { + var time, + checkDate = new Date(date.getTime()) + + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)) + + time = checkDate.getTime() + checkDate.setMonth(0) // Compare with Jan 1 + checkDate.setDate(1) + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1 + }, + + /* Parse a string value into a date object. + * See formatDate below for the possible formats. + * + * @param format string - the expected format of the date + * @param value string - the date in the above format + * @param settings Object - attributes include: + * shortYearCutoff number - the cutoff year for determining the century (optional) + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return Date - the extracted date value or null if value is blank + */ + parseDate: function (format, value, settings) { + if (format == null || value == null) { + throw 'Invalid arguments' + } + + value = typeof value === 'object' ? value.toString() : value + '' + if (value === '') { + return null + } + + var iFormat, + dim, + extra, + iValue = 0, + shortYearCutoffTemp = + (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff, + shortYearCutoff = + typeof shortYearCutoffTemp !== 'string' + ? shortYearCutoffTemp + : (new Date().getFullYear() % 100) + parseInt(shortYearCutoffTemp, 10), + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = + (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + year = -1, + month = -1, + day = -1, + doy = -1, + literal = false, + date, + // Check whether a format character is doubled + lookAhead = function (match) { + var matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match + if (matches) { + iFormat++ + } + return matches + }, + // Extract a number from the string value + getNumber = function (match) { + var isDoubled = lookAhead(match), + size = + match === '@' + ? 14 + : match === '!' + ? 20 + : match === 'y' && isDoubled + ? 4 + : match === 'o' + ? 3 + : 2, + minSize = match === 'y' ? size : 1, + digits = new RegExp('^\\d{' + minSize + ',' + size + '}'), + num = value.substring(iValue).match(digits) + if (!num) { + throw 'Missing number at position ' + iValue + } + iValue += num[0].length + return parseInt(num[0], 10) + }, + // Extract a name from the string value and convert to an index + getName = function (match, shortNames, longNames) { + var index = -1, + names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { + return [[k, v]] + }).sort(function (a, b) { + return -(a[1].length - b[1].length) + }) + + $.each(names, function (i, pair) { + var name = pair[1] + if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) { + index = pair[0] + iValue += name.length + return false + } + }) + if (index !== -1) { + return index + 1 + } else { + throw 'Unknown name at position ' + iValue + } + }, + // Confirm that a literal character matches the string value + checkLiteral = function () { + if (value.charAt(iValue) !== format.charAt(iFormat)) { + throw 'Unexpected literal at position ' + iValue + } + iValue++ + } + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false + } else { + checkLiteral() + } + } else { + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d') + break + case 'D': + getName('D', dayNamesShort, dayNames) + break + case 'o': + doy = getNumber('o') + break + case 'm': + month = getNumber('m') + break + case 'M': + month = getName('M', monthNamesShort, monthNames) + break + case 'y': + year = getNumber('y') + break + case '@': + date = new Date(getNumber('@')) + year = date.getFullYear() + month = date.getMonth() + 1 + day = date.getDate() + break + case '!': + date = new Date((getNumber('!') - this._ticksTo1970) / 10000) + year = date.getFullYear() + month = date.getMonth() + 1 + day = date.getDate() + break + case "'": + if (lookAhead("'")) { + checkLiteral() + } else { + literal = true + } + break + default: + checkLiteral() + } + } + } + + if (iValue < value.length) { + extra = value.substr(iValue) + if (!/^\s+/.test(extra)) { + throw 'Extra/unparsed characters found in date: ' + extra + } + } + + if (year === -1) { + year = new Date().getFullYear() + } else if (year < 100) { + year += + new Date().getFullYear() - + (new Date().getFullYear() % 100) + + (year <= shortYearCutoff ? 0 : -100) + } + + if (doy > -1) { + month = 1 + day = doy + do { + dim = this._getDaysInMonth(year, month - 1) + if (day <= dim) { + break + } + month++ + day -= dim + } while (true) + } + + date = this._daylightSavingAdjust(new Date(year, month - 1, day)) + if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { + throw 'Invalid date' // E.g. 31/02/00 + } + return date + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + COOKIE: 'D, dd M yy', + ISO_8601: 'yy-mm-dd', + RFC_822: 'D, d M y', + RFC_850: 'DD, dd-M-y', + RFC_1036: 'D, d M y', + RFC_1123: 'D, d M yy', + RFC_2822: 'D, d M yy', + RSS: 'D, d M y', // RFC 822 + TICKS: '!', + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + _ticksTo1970: + ((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + Math.floor(1970 / 400)) * + 24 * + 60 * + 60 * + 10000000, + + /* Format a date object into a string value. + * The format can be combinations of the following: + * d - day of month (no leading zero) + * dd - day of month (two digit) + * o - day of year (no leading zeros) + * oo - day of year (three digit) + * D - day name short + * DD - day name long + * m - month of year (no leading zero) + * mm - month of year (two digit) + * M - month name short + * MM - month name long + * y - year (two digit) + * yy - year (four digit) + * @ - Unix timestamp (ms since 01/01/1970) + * ! - Windows ticks (100ns since 01/01/0001) + * "..." - literal text + * '' - single quote + * + * @param format string - the desired format of the date + * @param date Date - the date value to format + * @param settings Object - attributes include: + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return string - the date in the above format + */ + formatDate: function (format, date, settings) { + if (!date) { + return '' + } + + var iFormat, + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = + (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + // Check whether a format character is doubled + lookAhead = function (match) { + var matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match + if (matches) { + iFormat++ + } + return matches + }, + // Format a number, with leading zero if necessary + formatNumber = function (match, value, len) { + var num = '' + value + if (lookAhead(match)) { + while (num.length < len) { + num = '0' + num + } + } + return num + }, + // Format a name, short or long as requested + formatName = function (match, value, shortNames, longNames) { + return lookAhead(match) ? longNames[value] : shortNames[value] + }, + output = '', + literal = false + + if (date) { + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false + } else { + output += format.charAt(iFormat) + } + } else { + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate(), 2) + break + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames) + break + case 'o': + output += formatNumber( + 'o', + Math.round( + (new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - + new Date(date.getFullYear(), 0, 0).getTime()) / + 86400000 + ), + 3 + ) + break + case 'm': + output += formatNumber('m', date.getMonth() + 1, 2) + break + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames) + break + case 'y': + output += lookAhead('y') + ? date.getFullYear() + : (date.getFullYear() % 100 < 10 ? '0' : '') + (date.getFullYear() % 100) + break + case '@': + output += date.getTime() + break + case '!': + output += date.getTime() * 10000 + this._ticksTo1970 + break + case "'": + if (lookAhead("'")) { + output += "'" + } else { + literal = true + } + break + default: + output += format.charAt(iFormat) + } + } + } + } + return output + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var iFormat, + chars = '', + literal = false, + // Check whether a format character is doubled + lookAhead = function (match) { + var matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match + if (matches) { + iFormat++ + } + return matches + } + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false + } else { + chars += format.charAt(iFormat) + } + } else { + switch (format.charAt(iFormat)) { + case 'd': + case 'm': + case 'y': + case '@': + chars += '0123456789' + break + case 'D': + case 'M': + return null // Accept anything + case "'": + if (lookAhead("'")) { + chars += "'" + } else { + literal = true + } + break + default: + chars += format.charAt(iFormat) + } + } + } + return chars + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function (inst, name) { + return inst.settings[name] !== undefined ? inst.settings[name] : this._defaults[name] + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function (inst, noDefault) { + if (inst.input.val() === inst.lastVal) { + return + } + + var dateFormat = this._get(inst, 'dateFormat'), + dates = (inst.lastVal = inst.input ? inst.input.val() : null), + defaultDate = this._getDefaultDate(inst), + date = defaultDate, + settings = this._getFormatConfig(inst) + + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate + } catch (event) { + dates = noDefault ? '' : dates + } + inst.selectedDay = date.getDate() + inst.drawMonth = inst.selectedMonth = date.getMonth() + inst.drawYear = inst.selectedYear = date.getFullYear() + inst.currentDay = dates ? date.getDate() : 0 + inst.currentMonth = dates ? date.getMonth() : 0 + inst.currentYear = dates ? date.getFullYear() : 0 + this._adjustInstDate(inst) + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function (inst) { + return this._restrictMinMax( + inst, + this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()) + ) + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function (inst, date, defaultDate) { + var offsetNumeric = function (offset) { + var date = new Date() + date.setDate(date.getDate() + offset) + return date + }, + offsetString = function (offset) { + try { + return $.datepicker.parseDate( + $.datepicker._get(inst, 'dateFormat'), + offset, + $.datepicker._getFormatConfig(inst) + ) + } catch (e) { + // Ignore + } + + var date = + (offset.toLowerCase().match(/^c/) ? $.datepicker._getDate(inst) : null) || new Date(), + year = date.getFullYear(), + month = date.getMonth(), + day = date.getDate(), + pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, + matches = pattern.exec(offset) + + while (matches) { + switch (matches[2] || 'd') { + case 'd': + case 'D': + day += parseInt(matches[1], 10) + break + case 'w': + case 'W': + day += parseInt(matches[1], 10) * 7 + break + case 'm': + case 'M': + month += parseInt(matches[1], 10) + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)) + break + case 'y': + case 'Y': + year += parseInt(matches[1], 10) + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)) + break + } + matches = pattern.exec(offset) + } + return new Date(year, month, day) + }, + newDate = + date == null || date === '' + ? defaultDate + : typeof date === 'string' + ? offsetString(date) + : typeof date === 'number' + ? isNaN(date) + ? defaultDate + : offsetNumeric(date) + : new Date(date.getTime()) + + newDate = newDate && newDate.toString() === 'Invalid Date' ? defaultDate : newDate + if (newDate) { + newDate.setHours(0) + newDate.setMinutes(0) + newDate.setSeconds(0) + newDate.setMilliseconds(0) + } + return this._daylightSavingAdjust(newDate) + }, + + /* Handle switch to/from daylight saving. + * Hours may be non-zero on daylight saving cut-over: + * > 12 when midnight changeover, but then cannot generate + * midnight datetime, so jump to 1AM, otherwise reset. + * @param date (Date) the date to check + * @return (Date) the corrected date + */ + _daylightSavingAdjust: function (date) { + if (!date) { + return null + } + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0) + return date + }, + + /* Set the date(s) directly. */ + _setDate: function (inst, date, noChange) { + var clear = !date, + origMonth = inst.selectedMonth, + origYear = inst.selectedYear, + newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())) + + inst.selectedDay = inst.currentDay = newDate.getDate() + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth() + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear() + if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) { + this._notifyChange(inst) + } + this._adjustInstDate(inst) + if (inst.input) { + inst.input.val(clear ? '' : this._formatDate(inst)) + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function (inst) { + var startDate = + !inst.currentYear || (inst.input && inst.input.val() === '') + ? null + : this._daylightSavingAdjust( + new Date(inst.currentYear, inst.currentMonth, inst.currentDay) + ) + return startDate + }, + + /* Attach the onxxx handlers. These are declared statically so + * they work with static code transformers like Caja. + */ + _attachHandlers: function (inst) { + var stepMonths = this._get(inst, 'stepMonths'), + id = '#' + inst.id.replace(/\\\\/g, '\\') + inst.dpDiv.find('[data-handler]').map(function () { + var handler = { + prev: function () { + $.datepicker._adjustDate(id, -stepMonths, 'M') + }, + next: function () { + $.datepicker._adjustDate(id, +stepMonths, 'M') + }, + hide: function () { + $.datepicker._hideDatepicker() + }, + today: function () { + $.datepicker._gotoToday(id) + }, + selectDay: function () { + $.datepicker._selectDay( + id, + +this.getAttribute('data-month'), + +this.getAttribute('data-year'), + this + ) + return false + }, + selectMonth: function () { + $.datepicker._selectMonthYear(id, this, 'M') + return false + }, + selectYear: function () { + $.datepicker._selectMonthYear(id, this, 'Y') + return false + } + } + $(this).on(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]) + }) + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function (inst) { + var maxDraw, + prevText, + prev, + nextText, + next, + currentText, + gotoDate, + controls, + buttonPanel, + firstDay, + showWeek, + dayNames, + dayNamesMin, + monthNames, + monthNamesShort, + beforeShowDay, + showOtherMonths, + selectOtherMonths, + defaultDate, + html, + dow, + row, + group, + col, + selectedDate, + cornerClass, + calender, + thead, + day, + daysInMonth, + leadDays, + curRows, + numRows, + printDate, + dRow, + tbody, + daySettings, + otherMonth, + unselectable, + tempDate = new Date(), + today = this._daylightSavingAdjust( + new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate()) + ), // clear time + isRTL = this._get(inst, 'isRTL'), + showButtonPanel = this._get(inst, 'showButtonPanel'), + hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'), + navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'), + numMonths = this._getNumberOfMonths(inst), + showCurrentAtPos = this._get(inst, 'showCurrentAtPos'), + stepMonths = this._get(inst, 'stepMonths'), + isMultiMonth = numMonths[0] !== 1 || numMonths[1] !== 1, + currentDate = this._daylightSavingAdjust( + !inst.currentDay + ? new Date(9999, 9, 9) + : new Date(inst.currentYear, inst.currentMonth, inst.currentDay) + ), + minDate = this._getMinMaxDate(inst, 'min'), + maxDate = this._getMinMaxDate(inst, 'max'), + drawMonth = inst.drawMonth - showCurrentAtPos, + drawYear = inst.drawYear + + if (drawMonth < 0) { + drawMonth += 12 + drawYear-- + } + if (maxDate) { + maxDraw = this._daylightSavingAdjust( + new Date( + maxDate.getFullYear(), + maxDate.getMonth() - numMonths[0] * numMonths[1] + 1, + maxDate.getDate() + ) + ) + maxDraw = minDate && maxDraw < minDate ? minDate : maxDraw + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth-- + if (drawMonth < 0) { + drawMonth = 11 + drawYear-- + } + } + } + inst.drawMonth = drawMonth + inst.drawYear = drawYear + + prevText = this._get(inst, 'prevText') + prevText = !navigationAsDateFormat + ? prevText + : this.formatDate( + prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst) + ) + + prev = this._canAdjustMonth(inst, -1, drawYear, drawMonth) + ? "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" + + " title='" + + prevText + + "'><span class='ui-icon ui-icon-circle-triangle-" + + (isRTL ? 'e' : 'w') + + "'>" + + prevText + + '</span></a>' + : hideIfNoPrevNext + ? '' + : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + + prevText + + "'><span class='ui-icon ui-icon-circle-triangle-" + + (isRTL ? 'e' : 'w') + + "'>" + + prevText + + '</span></a>' + + nextText = this._get(inst, 'nextText') + nextText = !navigationAsDateFormat + ? nextText + : this.formatDate( + nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst) + ) + + next = this._canAdjustMonth(inst, +1, drawYear, drawMonth) + ? "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" + + " title='" + + nextText + + "'><span class='ui-icon ui-icon-circle-triangle-" + + (isRTL ? 'w' : 'e') + + "'>" + + nextText + + '</span></a>' + : hideIfNoPrevNext + ? '' + : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + + nextText + + "'><span class='ui-icon ui-icon-circle-triangle-" + + (isRTL ? 'w' : 'e') + + "'>" + + nextText + + '</span></a>' + + currentText = this._get(inst, 'currentText') + gotoDate = this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today + currentText = !navigationAsDateFormat + ? currentText + : this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)) + + controls = !inst.inline + ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" + + this._get(inst, 'closeText') + + '</button>' + : '' + + buttonPanel = showButtonPanel + ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + + (isRTL ? controls : '') + + (this._isInRange(inst, gotoDate) + ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" + + '>' + + currentText + + '</button>' + : '') + + (isRTL ? '' : controls) + + '</div>' + : '' + + firstDay = parseInt(this._get(inst, 'firstDay'), 10) + firstDay = isNaN(firstDay) ? 0 : firstDay + + showWeek = this._get(inst, 'showWeek') + dayNames = this._get(inst, 'dayNames') + dayNamesMin = this._get(inst, 'dayNamesMin') + monthNames = this._get(inst, 'monthNames') + monthNamesShort = this._get(inst, 'monthNamesShort') + beforeShowDay = this._get(inst, 'beforeShowDay') + showOtherMonths = this._get(inst, 'showOtherMonths') + selectOtherMonths = this._get(inst, 'selectOtherMonths') + defaultDate = this._getDefaultDate(inst) + html = '' + + for (row = 0; row < numMonths[0]; row++) { + group = '' + this.maxRows = 4 + for (col = 0; col < numMonths[1]; col++) { + selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)) + cornerClass = ' ui-corner-all' + calender = '' + if (isMultiMonth) { + calender += "<div class='ui-datepicker-group" + if (numMonths[1] > 1) { + switch (col) { + case 0: + calender += ' ui-datepicker-group-first' + cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left') + break + case numMonths[1] - 1: + calender += ' ui-datepicker-group-last' + cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right') + break + default: + calender += ' ui-datepicker-group-middle' + cornerClass = '' + break + } + } + calender += "'>" + } + calender += + "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + + cornerClass + + "'>" + + (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : '') + + (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : '') + + this._generateMonthYearHeader( + inst, + drawMonth, + drawYear, + minDate, + maxDate, + row > 0 || col > 0, + monthNames, + monthNamesShort + ) + // draw month headers + "</div><table class='ui-datepicker-calendar'><thead>" + + '<tr>' + thead = showWeek + ? "<th class='ui-datepicker-week-col'>" + this._get(inst, 'weekHeader') + '</th>' + : '' + for (dow = 0; dow < 7; dow++) { + // days of the week + day = (dow + firstDay) % 7 + thead += + "<th scope='col'" + + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : '') + + '>' + + "<span title='" + + dayNames[day] + + "'>" + + dayNamesMin[day] + + '</span></th>' + } + calender += thead + '</tr></thead><tbody>' + daysInMonth = this._getDaysInMonth(drawYear, drawMonth) + if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) { + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth) + } + leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7 + curRows = Math.ceil((leadDays + daysInMonth) / 7) // calculate the number of rows to generate + numRows = isMultiMonth ? (this.maxRows > curRows ? this.maxRows : curRows) : curRows //If multiple months, use the higher number of rows (see #7043) + this.maxRows = numRows + printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)) + for (dRow = 0; dRow < numRows; dRow++) { + // create date picker rows + calender += '<tr>' + tbody = !showWeek + ? '' + : "<td class='ui-datepicker-week-col'>" + + this._get(inst, 'calculateWeek')(printDate) + + '</td>' + for (dow = 0; dow < 7; dow++) { + // create date picker days + daySettings = beforeShowDay + ? beforeShowDay.apply(inst.input ? inst.input[0] : null, [printDate]) + : [true, ''] + otherMonth = printDate.getMonth() !== drawMonth + unselectable = + (otherMonth && !selectOtherMonths) || + !daySettings[0] || + (minDate && printDate < minDate) || + (maxDate && printDate > maxDate) + tbody += + "<td class='" + + ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends + (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months + ((printDate.getTime() === selectedDate.getTime() && + drawMonth === inst.selectedMonth && + inst._keyEvent) || // user pressed key + (defaultDate.getTime() === printDate.getTime() && + defaultDate.getTime() === selectedDate.getTime()) + ? // or defaultDate is current printedDate and defaultDate is selectedDate + ' ' + this._dayOverClass + : '') + // highlight selected day + (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled' : '') + // highlight unselectable days + (otherMonth && !showOtherMonths + ? '' + : ' ' + + daySettings[1] + // highlight custom dates + (printDate.getTime() === currentDate.getTime() + ? ' ' + this._currentClass + : '') + // highlight selected day + (printDate.getTime() === today.getTime() ? ' ui-datepicker-today' : '')) + + "'" + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] + ? " title='" + daySettings[2].replace(/'/g, ''') + "'" + : '') + // cell title + (unselectable + ? '' + : " data-handler='selectDay' data-event='click' data-month='" + + printDate.getMonth() + + "' data-year='" + + printDate.getFullYear() + + "'") + + '>' + // actions + (otherMonth && !showOtherMonths + ? ' ' // display for other months + : unselectable + ? "<span class='ui-state-default'>" + printDate.getDate() + '</span>' + : "<a class='ui-state-default" + + (printDate.getTime() === today.getTime() ? ' ui-state-highlight' : '') + + (printDate.getTime() === currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day + (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months + "' href='#'>" + + printDate.getDate() + + '</a>') + + '</td>' // display selectable date + printDate.setDate(printDate.getDate() + 1) + printDate = this._daylightSavingAdjust(printDate) + } + calender += tbody + '</tr>' + } + drawMonth++ + if (drawMonth > 11) { + drawMonth = 0 + drawYear++ + } + calender += + '</tbody></table>' + + (isMultiMonth + ? '</div>' + + (numMonths[0] > 0 && col === numMonths[1] - 1 + ? "<div class='ui-datepicker-row-break'></div>" + : '') + : '') + group += calender + } + html += group + } + html += buttonPanel + inst._keyEvent = false + return html + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function ( + inst, + drawMonth, + drawYear, + minDate, + maxDate, + secondary, + monthNames, + monthNamesShort + ) { + var inMinYear, + inMaxYear, + month, + years, + thisYear, + determineYear, + year, + endYear, + changeMonth = this._get(inst, 'changeMonth'), + changeYear = this._get(inst, 'changeYear'), + showMonthAfterYear = this._get(inst, 'showMonthAfterYear'), + html = "<div class='ui-datepicker-title'>", + monthHtml = '' + + // Month selection + if (secondary || !changeMonth) { + monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + '</span>' + } else { + inMinYear = minDate && minDate.getFullYear() === drawYear + inMaxYear = maxDate && maxDate.getFullYear() === drawYear + monthHtml += + "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>" + for (month = 0; month < 12; month++) { + if ( + (!inMinYear || month >= minDate.getMonth()) && + (!inMaxYear || month <= maxDate.getMonth()) + ) { + monthHtml += + "<option value='" + + month + + "'" + + (month === drawMonth ? " selected='selected'" : '') + + '>' + + monthNamesShort[month] + + '</option>' + } + } + monthHtml += '</select>' + } + + if (!showMonthAfterYear) { + html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : '') + } + + // Year selection + if (!inst.yearshtml) { + inst.yearshtml = '' + if (secondary || !changeYear) { + html += "<span class='ui-datepicker-year'>" + drawYear + '</span>' + } else { + // determine range of years to display + years = this._get(inst, 'yearRange').split(':') + thisYear = new Date().getFullYear() + determineYear = function (value) { + var year = value.match(/c[+\-].*/) + ? drawYear + parseInt(value.substring(1), 10) + : value.match(/[+\-].*/) + ? thisYear + parseInt(value, 10) + : parseInt(value, 10) + return isNaN(year) ? thisYear : year + } + year = determineYear(years[0]) + endYear = Math.max(year, determineYear(years[1] || '')) + year = minDate ? Math.max(year, minDate.getFullYear()) : year + endYear = maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear + inst.yearshtml += + "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>" + for (; year <= endYear; year++) { + inst.yearshtml += + "<option value='" + + year + + "'" + + (year === drawYear ? " selected='selected'" : '') + + '>' + + year + + '</option>' + } + inst.yearshtml += '</select>' + + html += inst.yearshtml + inst.yearshtml = null + } + } + + html += this._get(inst, 'yearSuffix') + if (showMonthAfterYear) { + html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml + } + html += '</div>' // Close datepicker_header + return html + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function (inst, offset, period) { + var year = inst.selectedYear + (period === 'Y' ? offset : 0), + month = inst.selectedMonth + (period === 'M' ? offset : 0), + day = + Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period === 'D' ? offset : 0), + date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day))) + + inst.selectedDay = date.getDate() + inst.drawMonth = inst.selectedMonth = date.getMonth() + inst.drawYear = inst.selectedYear = date.getFullYear() + if (period === 'M' || period === 'Y') { + this._notifyChange(inst) + } + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function (inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'), + maxDate = this._getMinMaxDate(inst, 'max'), + newDate = minDate && date < minDate ? minDate : date + return maxDate && newDate > maxDate ? maxDate : newDate + }, + + /* Notify change of month/year. */ + _notifyChange: function (inst) { + var onChange = this._get(inst, 'onChangeMonthYear') + if (onChange) { + onChange.apply(inst.input ? inst.input[0] : null, [ + inst.selectedYear, + inst.selectedMonth + 1, + inst + ]) + } + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function (inst) { + var numMonths = this._get(inst, 'numberOfMonths') + return numMonths == null ? [1, 1] : typeof numMonths === 'number' ? [1, numMonths] : numMonths + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function (inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + 'Date'), null) + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function (year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate() + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function (year, month) { + return new Date(year, month, 1).getDay() + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function (inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst), + date = this._daylightSavingAdjust( + new Date(curYear, curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1) + ) + + if (offset < 0) { + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())) + } + return this._isInRange(inst, date) + }, + + /* Is the given date in the accepted range? */ + _isInRange: function (inst, date) { + var yearSplit, + currentYear, + minDate = this._getMinMaxDate(inst, 'min'), + maxDate = this._getMinMaxDate(inst, 'max'), + minYear = null, + maxYear = null, + years = this._get(inst, 'yearRange') + if (years) { + yearSplit = years.split(':') + currentYear = new Date().getFullYear() + minYear = parseInt(yearSplit[0], 10) + maxYear = parseInt(yearSplit[1], 10) + if (yearSplit[0].match(/[+\-].*/)) { + minYear += currentYear + } + if (yearSplit[1].match(/[+\-].*/)) { + maxYear += currentYear + } + } + + return ( + (!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime()) && + (!minYear || date.getFullYear() >= minYear) && + (!maxYear || date.getFullYear() <= maxYear) + ) + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function (inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff') + shortYearCutoff = + typeof shortYearCutoff !== 'string' + ? shortYearCutoff + : (new Date().getFullYear() % 100) + parseInt(shortYearCutoff, 10) + return { + shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), + dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), + monthNames: this._get(inst, 'monthNames') + } + }, + + /* Format the given date for display. */ + _formatDate: function (inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay + inst.currentMonth = inst.selectedMonth + inst.currentYear = inst.selectedYear + } + var date = day + ? typeof day === 'object' + ? day + : this._daylightSavingAdjust(new Date(year, month, day)) + : this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)) + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)) + } + }) + + /* + * Bind hover events for datepicker elements. + * Done via delegate so the binding only occurs once in the lifetime of the parent div. + * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. + */ + function datepicker_bindHover(dpDiv) { + var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a' + return dpDiv + .on('mouseout', selector, function () { + $(this).removeClass('ui-state-hover') + if (this.className.indexOf('ui-datepicker-prev') !== -1) { + $(this).removeClass('ui-datepicker-prev-hover') + } + if (this.className.indexOf('ui-datepicker-next') !== -1) { + $(this).removeClass('ui-datepicker-next-hover') + } + }) + .on('mouseover', selector, datepicker_handleMouseover) + } + + function datepicker_handleMouseover() { + if ( + !$.datepicker._isDisabledDatepicker( + datepicker_instActive.inline + ? datepicker_instActive.dpDiv.parent()[0] + : datepicker_instActive.input[0] + ) + ) { + $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover') + $(this).addClass('ui-state-hover') + if (this.className.indexOf('ui-datepicker-prev') !== -1) { + $(this).addClass('ui-datepicker-prev-hover') + } + if (this.className.indexOf('ui-datepicker-next') !== -1) { + $(this).addClass('ui-datepicker-next-hover') + } + } + } + + /* jQuery extend now ignores nulls! */ + function datepicker_extendRemove(target, props) { + $.extend(target, props) + for (var name in props) { + if (props[name] == null) { + target[name] = props[name] + } + } + return target + } + + /* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ + $.fn.datepicker = function (options) { + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if (!this.length) { + return this + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).on('mousedown', $.datepicker._checkExternalClick) + $.datepicker.initialized = true + } + + /* Append datepicker main container to body if not exist. */ + if ($('#' + $.datepicker._mainDivId).length === 0) { + $('body').append($.datepicker.dpDiv) + } + + var otherArgs = Array.prototype.slice.call(arguments, 1) + if ( + typeof options === 'string' && + (options === 'isDisabled' || options === 'getDate' || options === 'widget') + ) { + return $.datepicker['_' + options + 'Datepicker'].apply( + $.datepicker, + [this[0]].concat(otherArgs) + ) + } + if (options === 'option' && arguments.length === 2 && typeof arguments[1] === 'string') { + return $.datepicker['_' + options + 'Datepicker'].apply( + $.datepicker, + [this[0]].concat(otherArgs) + ) + } + return this.each(function () { + typeof options === 'string' + ? $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this].concat(otherArgs)) + : $.datepicker._attachDatepicker(this, options) + }) + } + + $.datepicker = new Datepicker() // singleton instance + $.datepicker.initialized = false + $.datepicker.uuid = new Date().getTime() + $.datepicker.version = '1.12.1' + + var widgetsDatepicker = $.datepicker + + // This file is deprecated + var ie = ($.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase())) + + /*! + * jQuery UI Mouse 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Mouse + //>>group: Widgets + //>>description: Abstracts mouse-based interactions to assist in creating certain widgets. + //>>docs: http://api.jqueryui.com/mouse/ + + var mouseHandled = false + $(document).on('mouseup', function () { + mouseHandled = false + }) + + var widgetsMouse = $.widget('ui.mouse', { + version: '1.12.1', + options: { + cancel: 'input, textarea, button, select, option', + distance: 1, + delay: 0 + }, + _mouseInit: function () { + var that = this + + this.element + .on('mousedown.' + this.widgetName, function (event) { + return that._mouseDown(event) + }) + .on('click.' + this.widgetName, function (event) { + if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) { + $.removeData(event.target, that.widgetName + '.preventClickEvent') + event.stopImmediatePropagation() + return false + } + }) + + this.started = false + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function () { + this.element.off('.' + this.widgetName) + if (this._mouseMoveDelegate) { + this.document + .off('mousemove.' + this.widgetName, this._mouseMoveDelegate) + .off('mouseup.' + this.widgetName, this._mouseUpDelegate) + } + }, + + _mouseDown: function (event) { + // don't let more than one widget handle mouseStart + if (mouseHandled) { + return + } + + this._mouseMoved = false + + // We may have missed mouseup (out of window) + this._mouseStarted && this._mouseUp(event) + + this._mouseDownEvent = event + + var that = this, + btnIsLeft = event.which === 1, + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = + typeof this.options.cancel === 'string' && event.target.nodeName + ? $(event.target).closest(this.options.cancel).length + : false + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true + } + + this.mouseDelayMet = !this.options.delay + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function () { + that.mouseDelayMet = true + }, this.options.delay) + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = this._mouseStart(event) !== false + if (!this._mouseStarted) { + event.preventDefault() + return true + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) { + $.removeData(event.target, this.widgetName + '.preventClickEvent') + } + + // These delegates are required to keep context + this._mouseMoveDelegate = function (event) { + return that._mouseMove(event) + } + this._mouseUpDelegate = function (event) { + return that._mouseUp(event) + } + + this.document + .on('mousemove.' + this.widgetName, this._mouseMoveDelegate) + .on('mouseup.' + this.widgetName, this._mouseUpDelegate) + + event.preventDefault() + + mouseHandled = true + return true + }, + + _mouseMove: function (event) { + // Only check for mouseups outside the document if you've moved inside the document + // at least once. This prevents the firing of mouseup in the case of IE<9, which will + // fire a mousemove event if content is placed under the cursor. See #7778 + // Support: IE <9 + if (this._mouseMoved) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.ui.ie && (!document.documentMode || document.documentMode < 9) && !event.button) { + return this._mouseUp(event) + + // Iframe mouseup check - mouseup occurred in another document + } else if (!event.which) { + // Support: Safari <=8 - 9 + // Safari sets which to 0 if you press any of the following keys + // during a drag (#14461) + if ( + event.originalEvent.altKey || + event.originalEvent.ctrlKey || + event.originalEvent.metaKey || + event.originalEvent.shiftKey + ) { + this.ignoreMissingWhich = true + } else if (!this.ignoreMissingWhich) { + return this._mouseUp(event) + } + } + } + + if (event.which || event.button) { + this._mouseMoved = true + } + + if (this._mouseStarted) { + this._mouseDrag(event) + return event.preventDefault() + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = this._mouseStart(this._mouseDownEvent, event) !== false + this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event) + } + + return !this._mouseStarted + }, + + _mouseUp: function (event) { + this.document + .off('mousemove.' + this.widgetName, this._mouseMoveDelegate) + .off('mouseup.' + this.widgetName, this._mouseUpDelegate) + + if (this._mouseStarted) { + this._mouseStarted = false + + if (event.target === this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + '.preventClickEvent', true) + } + + this._mouseStop(event) + } + + if (this._mouseDelayTimer) { + clearTimeout(this._mouseDelayTimer) + delete this._mouseDelayTimer + } + + this.ignoreMissingWhich = false + mouseHandled = false + event.preventDefault() + }, + + _mouseDistanceMet: function (event) { + return ( + Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ) + }, + + _mouseDelayMet: function (/* event */) { + return this.mouseDelayMet + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function (/* event */) {}, + _mouseDrag: function (/* event */) {}, + _mouseStop: function (/* event */) {}, + _mouseCapture: function (/* event */) { + return true + } + }) + + // $.ui.plugin is deprecated. Use $.widget() extensions instead. + var plugin = ($.ui.plugin = { + add: function (module, option, set) { + var i, + proto = $.ui[module].prototype + for (i in set) { + proto.plugins[i] = proto.plugins[i] || [] + proto.plugins[i].push([option, set[i]]) + } + }, + call: function (instance, name, args, allowDisconnected) { + var i, + set = instance.plugins[name] + + if (!set) { + return + } + + if ( + !allowDisconnected && + (!instance.element[0].parentNode || instance.element[0].parentNode.nodeType === 11) + ) { + return + } + + for (i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args) + } + } + } + }) + + var safeBlur = ($.ui.safeBlur = function (element) { + // Support: IE9 - 10 only + // If the <body> is blurred, IE will switch windows, see #9420 + if (element && element.nodeName.toLowerCase() !== 'body') { + $(element).trigger('blur') + } + }) + + /*! + * jQuery UI Draggable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Draggable + //>>group: Interactions + //>>description: Enables dragging functionality for any element. + //>>docs: http://api.jqueryui.com/draggable/ + //>>demos: http://jqueryui.com/draggable/ + //>>css.structure: ../../themes/base/draggable.css + + $.widget('ui.draggable', $.ui.mouse, { + version: '1.12.1', + widgetEventPrefix: 'drag', + options: { + addClasses: true, + appendTo: 'parent', + axis: false, + connectToSortable: false, + containment: false, + cursor: 'auto', + cursorAt: false, + grid: false, + handle: false, + helper: 'original', + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: 'default', + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: 'both', + snapTolerance: 20, + stack: false, + zIndex: false, + + // Callbacks + drag: null, + start: null, + stop: null + }, + _create: function () { + if (this.options.helper === 'original') { + this._setPositionRelative() + } + if (this.options.addClasses) { + this._addClass('ui-draggable') + } + this._setHandleClassName() + + this._mouseInit() + }, + + _setOption: function (key, value) { + this._super(key, value) + if (key === 'handle') { + this._removeHandleClassName() + this._setHandleClassName() + } + }, + + _destroy: function () { + if ((this.helper || this.element).is('.ui-draggable-dragging')) { + this.destroyOnClear = true + return + } + this._removeHandleClassName() + this._mouseDestroy() + }, + + _mouseCapture: function (event) { + var o = this.options + + // Among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).closest('.ui-resizable-handle').length > 0) { + return false + } + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event) + if (!this.handle) { + return false + } + + this._blurActiveElement(event) + + this._blockFrames(o.iframeFix === true ? 'iframe' : o.iframeFix) + + return true + }, + + _blockFrames: function (selector) { + this.iframeBlocks = this.document.find(selector).map(function () { + var iframe = $(this) + + return $('<div>') + .css('position', 'absolute') + .appendTo(iframe.parent()) + .outerWidth(iframe.outerWidth()) + .outerHeight(iframe.outerHeight()) + .offset(iframe.offset())[0] + }) + }, + + _unblockFrames: function () { + if (this.iframeBlocks) { + this.iframeBlocks.remove() + delete this.iframeBlocks + } + }, + + _blurActiveElement: function (event) { + var activeElement = $.ui.safeActiveElement(this.document[0]), + target = $(event.target) + + // Don't blur if the event occurred on an element that is within + // the currently focused element + // See #10527, #12472 + if (target.closest(activeElement).length) { + return + } + + // Blur any element that currently has focus, see #4261 + $.ui.safeBlur(activeElement) + }, + + _mouseStart: function (event) { + var o = this.options + + //Create and append the visible helper + this.helper = this._createHelper(event) + + this._addClass(this.helper, 'ui-draggable-dragging') + + //Cache the helper size + this._cacheHelperProportions() + + //If ddmanager is used for droppables, set the global draggable + if ($.ui.ddmanager) { + $.ui.ddmanager.current = this + } + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins() + + //Store the helper's css position + this.cssPosition = this.helper.css('position') + this.scrollParent = this.helper.scrollParent(true) + this.offsetParent = this.helper.offsetParent() + this.hasFixedAncestor = + this.helper.parents().filter(function () { + return $(this).css('position') === 'fixed' + }).length > 0 + + //The element's absolute position on the page minus margins + this.positionAbs = this.element.offset() + this._refreshOffsets(event) + + //Generate the original position + this.originalPosition = this.position = this._generatePosition(event, false) + this.originalPageX = event.pageX + this.originalPageY = event.pageY + + //Adjust the mouse offset relative to the helper if "cursorAt" is supplied + o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt) + + //Set a containment if given in the options + this._setContainment() + + //Trigger event + callbacks + if (this._trigger('start', event) === false) { + this._clear() + return false + } + + //Recache the helper size + this._cacheHelperProportions() + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event) + } + + // Execute the drag once - this causes the helper not to be visible before getting its + // correct position + this._mouseDrag(event, true) + + // If the ddmanager is used for droppables, inform the manager that dragging has started + // (see #5003) + if ($.ui.ddmanager) { + $.ui.ddmanager.dragStart(this, event) + } + + return true + }, + + _refreshOffsets: function (event) { + this.offset = { + top: this.positionAbs.top - this.margins.top, + left: this.positionAbs.left - this.margins.left, + scroll: false, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() + } + + this.offset.click = { + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + } + }, + + _mouseDrag: function (event, noPropagation) { + // reset any necessary cached properties (see #5009) + if (this.hasFixedAncestor) { + this.offset.parent = this._getParentOffset() + } + + //Compute the helpers position + this.position = this._generatePosition(event, true) + this.positionAbs = this._convertPositionTo('absolute') + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash() + if (this._trigger('drag', event, ui) === false) { + this._mouseUp(new $.Event('mouseup', event)) + return false + } + this.position = ui.position + } + + this.helper[0].style.left = this.position.left + 'px' + this.helper[0].style.top = this.position.top + 'px' + + if ($.ui.ddmanager) { + $.ui.ddmanager.drag(this, event) + } + + return false + }, + + _mouseStop: function (event) { + //If we are using droppables, inform the manager about the drop + var that = this, + dropped = false + if ($.ui.ddmanager && !this.options.dropBehaviour) { + dropped = $.ui.ddmanager.drop(this, event) + } + + //if a drop comes from outside (a sortable) + if (this.dropped) { + dropped = this.dropped + this.dropped = false + } + + if ( + (this.options.revert === 'invalid' && !dropped) || + (this.options.revert === 'valid' && dropped) || + this.options.revert === true || + ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped)) + ) { + $(this.helper).animate( + this.originalPosition, + parseInt(this.options.revertDuration, 10), + function () { + if (that._trigger('stop', event) !== false) { + that._clear() + } + } + ) + } else { + if (this._trigger('stop', event) !== false) { + this._clear() + } + } + + return false + }, + + _mouseUp: function (event) { + this._unblockFrames() + + // If the ddmanager is used for droppables, inform the manager that dragging has stopped + // (see #5003) + if ($.ui.ddmanager) { + $.ui.ddmanager.dragStop(this, event) + } + + // Only need to focus if the event occurred on the draggable itself, see #10527 + if (this.handleElement.is(event.target)) { + // The interaction is over; whether or not the click resulted in a drag, + // focus the element + this.element.trigger('focus') + } + + return $.ui.mouse.prototype._mouseUp.call(this, event) + }, + + cancel: function () { + if (this.helper.is('.ui-draggable-dragging')) { + this._mouseUp(new $.Event('mouseup', { target: this.element[0] })) + } else { + this._clear() + } + + return this + }, + + _getHandle: function (event) { + return this.options.handle + ? !!$(event.target).closest(this.element.find(this.options.handle)).length + : true + }, + + _setHandleClassName: function () { + this.handleElement = this.options.handle + ? this.element.find(this.options.handle) + : this.element + this._addClass(this.handleElement, 'ui-draggable-handle') + }, + + _removeHandleClassName: function () { + this._removeClass(this.handleElement, 'ui-draggable-handle') + }, + + _createHelper: function (event) { + var o = this.options, + helperIsFunction = $.isFunction(o.helper), + helper = helperIsFunction + ? $(o.helper.apply(this.element[0], [event])) + : o.helper === 'clone' + ? this.element.clone().removeAttr('id') + : this.element + + if (!helper.parents('body').length) { + helper.appendTo(o.appendTo === 'parent' ? this.element[0].parentNode : o.appendTo) + } + + // Http://bugs.jqueryui.com/ticket/9446 + // a helper function can return the original element + // which wouldn't have been set to relative in _create + if (helperIsFunction && helper[0] === this.element[0]) { + this._setPositionRelative() + } + + if (helper[0] !== this.element[0] && !/(fixed|absolute)/.test(helper.css('position'))) { + helper.css('position', 'absolute') + } + + return helper + }, + + _setPositionRelative: function () { + if (!/^(?:r|a|f)/.test(this.element.css('position'))) { + this.element[0].style.position = 'relative' + } + }, + + _adjustOffsetFromHelper: function (obj) { + if (typeof obj === 'string') { + obj = obj.split(' ') + } + if ($.isArray(obj)) { + obj = { left: +obj[0], top: +obj[1] || 0 } + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top + } + }, + + _isRootNode: function (element) { + return /(html|body)/i.test(element.tagName) || element === this.document[0] + }, + + _getParentOffset: function () { + //Get the offsetParent and cache its position + var po = this.offsetParent.offset(), + document = this.document[0] + + // This is a special case where we need to modify a offset calculated on start, since the + // following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the + // next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't + // the document, which means that the scroll is included in the initial calculation of the + // offset of the parent, and never recalculated upon drag + if ( + this.cssPosition === 'absolute' && + this.scrollParent[0] !== document && + $.contains(this.scrollParent[0], this.offsetParent[0]) + ) { + po.left += this.scrollParent.scrollLeft() + po.top += this.scrollParent.scrollTop() + } + + if (this._isRootNode(this.offsetParent[0])) { + po = { top: 0, left: 0 } + } + + return { + top: po.top + (parseInt(this.offsetParent.css('borderTopWidth'), 10) || 0), + left: po.left + (parseInt(this.offsetParent.css('borderLeftWidth'), 10) || 0) + } + }, + + _getRelativeOffset: function () { + if (this.cssPosition !== 'relative') { + return { top: 0, left: 0 } + } + + var p = this.element.position(), + scrollIsRootNode = this._isRootNode(this.scrollParent[0]) + + return { + top: + p.top - + (parseInt(this.helper.css('top'), 10) || 0) + + (!scrollIsRootNode ? this.scrollParent.scrollTop() : 0), + left: + p.left - + (parseInt(this.helper.css('left'), 10) || 0) + + (!scrollIsRootNode ? this.scrollParent.scrollLeft() : 0) + } + }, + + _cacheMargins: function () { + this.margins = { + left: parseInt(this.element.css('marginLeft'), 10) || 0, + top: parseInt(this.element.css('marginTop'), 10) || 0, + right: parseInt(this.element.css('marginRight'), 10) || 0, + bottom: parseInt(this.element.css('marginBottom'), 10) || 0 + } + }, + + _cacheHelperProportions: function () { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + } + }, + + _setContainment: function () { + var isUserScrollable, + c, + ce, + o = this.options, + document = this.document[0] + + this.relativeContainer = null + + if (!o.containment) { + this.containment = null + return + } + + if (o.containment === 'window') { + this.containment = [ + $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left, + $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top, + $(window).scrollLeft() + + $(window).width() - + this.helperProportions.width - + this.margins.left, + $(window).scrollTop() + + ($(window).height() || document.body.parentNode.scrollHeight) - + this.helperProportions.height - + this.margins.top + ] + return + } + + if (o.containment === 'document') { + this.containment = [ + 0, + 0, + $(document).width() - this.helperProportions.width - this.margins.left, + ($(document).height() || document.body.parentNode.scrollHeight) - + this.helperProportions.height - + this.margins.top + ] + return + } + + if (o.containment.constructor === Array) { + this.containment = o.containment + return + } + + if (o.containment === 'parent') { + o.containment = this.helper[0].parentNode + } + + c = $(o.containment) + ce = c[0] + + if (!ce) { + return + } + + isUserScrollable = /(scroll|auto)/.test(c.css('overflow')) + + this.containment = [ + (parseInt(c.css('borderLeftWidth'), 10) || 0) + (parseInt(c.css('paddingLeft'), 10) || 0), + (parseInt(c.css('borderTopWidth'), 10) || 0) + (parseInt(c.css('paddingTop'), 10) || 0), + (isUserScrollable ? Math.max(ce.scrollWidth, ce.offsetWidth) : ce.offsetWidth) - + (parseInt(c.css('borderRightWidth'), 10) || 0) - + (parseInt(c.css('paddingRight'), 10) || 0) - + this.helperProportions.width - + this.margins.left - + this.margins.right, + (isUserScrollable ? Math.max(ce.scrollHeight, ce.offsetHeight) : ce.offsetHeight) - + (parseInt(c.css('borderBottomWidth'), 10) || 0) - + (parseInt(c.css('paddingBottom'), 10) || 0) - + this.helperProportions.height - + this.margins.top - + this.margins.bottom + ] + this.relativeContainer = c + }, + + _convertPositionTo: function (d, pos) { + if (!pos) { + pos = this.position + } + + var mod = d === 'absolute' ? 1 : -1, + scrollIsRootNode = this._isRootNode(this.scrollParent[0]) + + return { + top: + // The absolute mouse position + pos.top + + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.top * mod + + // The offsetParent's offset without borders (offset + border) + this.offset.parent.top * mod - + (this.cssPosition === 'fixed' + ? -this.offset.scroll.top + : scrollIsRootNode + ? 0 + : this.offset.scroll.top) * + mod, + left: + // The absolute mouse position + pos.left + + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.left * mod + + // The offsetParent's offset without borders (offset + border) + this.offset.parent.left * mod - + (this.cssPosition === 'fixed' + ? -this.offset.scroll.left + : scrollIsRootNode + ? 0 + : this.offset.scroll.left) * + mod + } + }, + + _generatePosition: function (event, constrainPosition) { + var containment, + co, + top, + left, + o = this.options, + scrollIsRootNode = this._isRootNode(this.scrollParent[0]), + pageX = event.pageX, + pageY = event.pageY + + // Cache the scroll + if (!scrollIsRootNode || !this.offset.scroll) { + this.offset.scroll = { + top: this.scrollParent.scrollTop(), + left: this.scrollParent.scrollLeft() + } + } + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + // If we are not dragging yet, we won't check for options + if (constrainPosition) { + if (this.containment) { + if (this.relativeContainer) { + co = this.relativeContainer.offset() + containment = [ + this.containment[0] + co.left, + this.containment[1] + co.top, + this.containment[2] + co.left, + this.containment[3] + co.top + ] + } else { + containment = this.containment + } + + if (event.pageX - this.offset.click.left < containment[0]) { + pageX = containment[0] + this.offset.click.left + } + if (event.pageY - this.offset.click.top < containment[1]) { + pageY = containment[1] + this.offset.click.top + } + if (event.pageX - this.offset.click.left > containment[2]) { + pageX = containment[2] + this.offset.click.left + } + if (event.pageY - this.offset.click.top > containment[3]) { + pageY = containment[3] + this.offset.click.top + } + } + + if (o.grid) { + //Check for grid elements set to 0 to prevent divide by 0 error causing invalid + // argument errors in IE (see ticket #6950) + top = o.grid[1] + ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] + : this.originalPageY + pageY = containment + ? top - this.offset.click.top >= containment[1] || + top - this.offset.click.top > containment[3] + ? top + : top - this.offset.click.top >= containment[1] + ? top - o.grid[1] + : top + o.grid[1] + : top + + left = o.grid[0] + ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] + : this.originalPageX + pageX = containment + ? left - this.offset.click.left >= containment[0] || + left - this.offset.click.left > containment[2] + ? left + : left - this.offset.click.left >= containment[0] + ? left - o.grid[0] + : left + o.grid[0] + : left + } + + if (o.axis === 'y') { + pageX = this.originalPageX + } + + if (o.axis === 'x') { + pageY = this.originalPageY + } + } + + return { + top: + // The absolute mouse position + pageY - + // Click offset (relative to the element) + this.offset.click.top - + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.top - + // The offsetParent's offset without borders (offset + border) + this.offset.parent.top + + (this.cssPosition === 'fixed' + ? -this.offset.scroll.top + : scrollIsRootNode + ? 0 + : this.offset.scroll.top), + left: + // The absolute mouse position + pageX - + // Click offset (relative to the element) + this.offset.click.left - + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.left - + // The offsetParent's offset without borders (offset + border) + this.offset.parent.left + + (this.cssPosition === 'fixed' + ? -this.offset.scroll.left + : scrollIsRootNode + ? 0 + : this.offset.scroll.left) + } + }, + + _clear: function () { + this._removeClass(this.helper, 'ui-draggable-dragging') + if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) { + this.helper.remove() + } + this.helper = null + this.cancelHelperRemoval = false + if (this.destroyOnClear) { + this.destroy() + } + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function (type, event, ui) { + ui = ui || this._uiHash() + $.ui.plugin.call(this, type, [event, ui, this], true) + + // Absolute position and offset (see #6884 ) have to be recalculated after plugins + if (/^(drag|start|stop)/.test(type)) { + this.positionAbs = this._convertPositionTo('absolute') + ui.offset = this.positionAbs + } + return $.Widget.prototype._trigger.call(this, type, event, ui) + }, + + plugins: {}, + + _uiHash: function () { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs + } + } + }) + + $.ui.plugin.add('draggable', 'connectToSortable', { + start: function (event, ui, draggable) { + var uiSortable = $.extend({}, ui, { + item: draggable.element + }) + + draggable.sortables = [] + $(draggable.options.connectToSortable).each(function () { + var sortable = $(this).sortable('instance') + + if (sortable && !sortable.options.disabled) { + draggable.sortables.push(sortable) + + // RefreshPositions is called at drag start to refresh the containerCache + // which is used in drag. This ensures it's initialized and synchronized + // with any changes that might have happened on the page since initialization. + sortable.refreshPositions() + sortable._trigger('activate', event, uiSortable) + } + }) + }, + stop: function (event, ui, draggable) { + var uiSortable = $.extend({}, ui, { + item: draggable.element + }) + + draggable.cancelHelperRemoval = false + + $.each(draggable.sortables, function () { + var sortable = this + + if (sortable.isOver) { + sortable.isOver = 0 + + // Allow this sortable to handle removing the helper + draggable.cancelHelperRemoval = true + sortable.cancelHelperRemoval = false + + // Use _storedCSS To restore properties in the sortable, + // as this also handles revert (#9675) since the draggable + // may have modified them in unexpected ways (#8809) + sortable._storedCSS = { + position: sortable.placeholder.css('position'), + top: sortable.placeholder.css('top'), + left: sortable.placeholder.css('left') + } + + sortable._mouseStop(event) + + // Once drag has ended, the sortable should return to using + // its original helper, not the shared helper from draggable + sortable.options.helper = sortable.options._helper + } else { + // Prevent this Sortable from removing the helper. + // However, don't set the draggable to remove the helper + // either as another connected Sortable may yet handle the removal. + sortable.cancelHelperRemoval = true + + sortable._trigger('deactivate', event, uiSortable) + } + }) + }, + drag: function (event, ui, draggable) { + $.each(draggable.sortables, function () { + var innermostIntersecting = false, + sortable = this + + // Copy over variables that sortable's _intersectsWith uses + sortable.positionAbs = draggable.positionAbs + sortable.helperProportions = draggable.helperProportions + sortable.offset.click = draggable.offset.click + + if (sortable._intersectsWith(sortable.containerCache)) { + innermostIntersecting = true + + $.each(draggable.sortables, function () { + // Copy over variables that sortable's _intersectsWith uses + this.positionAbs = draggable.positionAbs + this.helperProportions = draggable.helperProportions + this.offset.click = draggable.offset.click + + if ( + this !== sortable && + this._intersectsWith(this.containerCache) && + $.contains(sortable.element[0], this.element[0]) + ) { + innermostIntersecting = false + } + + return innermostIntersecting + }) + } + + if (innermostIntersecting) { + // If it intersects, we use a little isOver variable and set it once, + // so that the move-in stuff gets fired only once. + if (!sortable.isOver) { + sortable.isOver = 1 + + // Store draggable's parent in case we need to reappend to it later. + draggable._parent = ui.helper.parent() + + sortable.currentItem = ui.helper + .appendTo(sortable.element) + .data('ui-sortable-item', true) + + // Store helper option to later restore it + sortable.options._helper = sortable.options.helper + + sortable.options.helper = function () { + return ui.helper[0] + } + + // Fire the start events of the sortable with our passed browser event, + // and our own helper (so it doesn't create a new one) + event.target = sortable.currentItem[0] + sortable._mouseCapture(event, true) + sortable._mouseStart(event, true, true) + + // Because the browser event is way off the new appended portlet, + // modify necessary variables to reflect the changes + sortable.offset.click.top = draggable.offset.click.top + sortable.offset.click.left = draggable.offset.click.left + sortable.offset.parent.left -= + draggable.offset.parent.left - sortable.offset.parent.left + sortable.offset.parent.top -= draggable.offset.parent.top - sortable.offset.parent.top + + draggable._trigger('toSortable', event) + + // Inform draggable that the helper is in a valid drop zone, + // used solely in the revert option to handle "valid/invalid". + draggable.dropped = sortable.element + + // Need to refreshPositions of all sortables in the case that + // adding to one sortable changes the location of the other sortables (#9675) + $.each(draggable.sortables, function () { + this.refreshPositions() + }) + + // Hack so receive/update callbacks work (mostly) + draggable.currentItem = draggable.element + sortable.fromOutside = draggable + } + + if (sortable.currentItem) { + sortable._mouseDrag(event) + + // Copy the sortable's position because the draggable's can potentially reflect + // a relative position, while sortable is always absolute, which the dragged + // element has now become. (#8809) + ui.position = sortable.position + } + } else { + // If it doesn't intersect with the sortable, and it intersected before, + // we fake the drag stop of the sortable, but make sure it doesn't remove + // the helper by using cancelHelperRemoval. + if (sortable.isOver) { + sortable.isOver = 0 + sortable.cancelHelperRemoval = true + + // Calling sortable's mouseStop would trigger a revert, + // so revert must be temporarily false until after mouseStop is called. + sortable.options._revert = sortable.options.revert + sortable.options.revert = false + + sortable._trigger('out', event, sortable._uiHash(sortable)) + sortable._mouseStop(event, true) + + // Restore sortable behaviors that were modfied + // when the draggable entered the sortable area (#9481) + sortable.options.revert = sortable.options._revert + sortable.options.helper = sortable.options._helper + + if (sortable.placeholder) { + sortable.placeholder.remove() + } + + // Restore and recalculate the draggable's offset considering the sortable + // may have modified them in unexpected ways. (#8809, #10669) + ui.helper.appendTo(draggable._parent) + draggable._refreshOffsets(event) + ui.position = draggable._generatePosition(event, true) + + draggable._trigger('fromSortable', event) + + // Inform draggable that the helper is no longer in a valid drop zone + draggable.dropped = false + + // Need to refreshPositions of all sortables just in case removing + // from one sortable changes the location of other sortables (#9675) + $.each(draggable.sortables, function () { + this.refreshPositions() + }) + } + } + }) + } + }) + + $.ui.plugin.add('draggable', 'cursor', { + start: function (event, ui, instance) { + var t = $('body'), + o = instance.options + + if (t.css('cursor')) { + o._cursor = t.css('cursor') + } + t.css('cursor', o.cursor) + }, + stop: function (event, ui, instance) { + var o = instance.options + if (o._cursor) { + $('body').css('cursor', o._cursor) + } + } + }) + + $.ui.plugin.add('draggable', 'opacity', { + start: function (event, ui, instance) { + var t = $(ui.helper), + o = instance.options + if (t.css('opacity')) { + o._opacity = t.css('opacity') + } + t.css('opacity', o.opacity) + }, + stop: function (event, ui, instance) { + var o = instance.options + if (o._opacity) { + $(ui.helper).css('opacity', o._opacity) + } + } + }) + + $.ui.plugin.add('draggable', 'scroll', { + start: function (event, ui, i) { + if (!i.scrollParentNotHidden) { + i.scrollParentNotHidden = i.helper.scrollParent(false) + } + + if ( + i.scrollParentNotHidden[0] !== i.document[0] && + i.scrollParentNotHidden[0].tagName !== 'HTML' + ) { + i.overflowOffset = i.scrollParentNotHidden.offset() + } + }, + drag: function (event, ui, i) { + var o = i.options, + scrolled = false, + scrollParent = i.scrollParentNotHidden[0], + document = i.document[0] + + if (scrollParent !== document && scrollParent.tagName !== 'HTML') { + if (!o.axis || o.axis !== 'x') { + if ( + i.overflowOffset.top + scrollParent.offsetHeight - event.pageY < + o.scrollSensitivity + ) { + scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed + } else if (event.pageY - i.overflowOffset.top < o.scrollSensitivity) { + scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed + } + } + + if (!o.axis || o.axis !== 'y') { + if ( + i.overflowOffset.left + scrollParent.offsetWidth - event.pageX < + o.scrollSensitivity + ) { + scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed + } else if (event.pageX - i.overflowOffset.left < o.scrollSensitivity) { + scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed + } + } + } else { + if (!o.axis || o.axis !== 'x') { + if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed) + } else if ( + $(window).height() - (event.pageY - $(document).scrollTop()) < + o.scrollSensitivity + ) { + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed) + } + } + + if (!o.axis || o.axis !== 'y') { + if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed) + } else if ( + $(window).width() - (event.pageX - $(document).scrollLeft()) < + o.scrollSensitivity + ) { + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed) + } + } + } + + if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(i, event) + } + } + }) + + $.ui.plugin.add('draggable', 'snap', { + start: function (event, ui, i) { + var o = i.options + + i.snapElements = [] + + $(o.snap.constructor !== String ? o.snap.items || ':data(ui-draggable)' : o.snap).each( + function () { + var $t = $(this), + $o = $t.offset() + if (this !== i.element[0]) { + i.snapElements.push({ + item: this, + width: $t.outerWidth(), + height: $t.outerHeight(), + top: $o.top, + left: $o.left + }) + } + } + ) + }, + drag: function (event, ui, inst) { + var ts, + bs, + ls, + rs, + l, + r, + t, + b, + i, + first, + o = inst.options, + d = o.snapTolerance, + x1 = ui.offset.left, + x2 = x1 + inst.helperProportions.width, + y1 = ui.offset.top, + y2 = y1 + inst.helperProportions.height + + for (i = inst.snapElements.length - 1; i >= 0; i--) { + l = inst.snapElements[i].left - inst.margins.left + r = l + inst.snapElements[i].width + t = inst.snapElements[i].top - inst.margins.top + b = t + inst.snapElements[i].height + + if ( + x2 < l - d || + x1 > r + d || + y2 < t - d || + y1 > b + d || + !$.contains(inst.snapElements[i].item.ownerDocument, inst.snapElements[i].item) + ) { + if (inst.snapElements[i].snapping) { + inst.options.snap.release && + inst.options.snap.release.call( + inst.element, + event, + $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }) + ) + } + inst.snapElements[i].snapping = false + continue + } + + if (o.snapMode !== 'inner') { + ts = Math.abs(t - y2) <= d + bs = Math.abs(b - y1) <= d + ls = Math.abs(l - x2) <= d + rs = Math.abs(r - x1) <= d + if (ts) { + ui.position.top = inst._convertPositionTo('relative', { + top: t - inst.helperProportions.height, + left: 0 + }).top + } + if (bs) { + ui.position.top = inst._convertPositionTo('relative', { + top: b, + left: 0 + }).top + } + if (ls) { + ui.position.left = inst._convertPositionTo('relative', { + top: 0, + left: l - inst.helperProportions.width + }).left + } + if (rs) { + ui.position.left = inst._convertPositionTo('relative', { + top: 0, + left: r + }).left + } + } + + first = ts || bs || ls || rs + + if (o.snapMode !== 'outer') { + ts = Math.abs(t - y1) <= d + bs = Math.abs(b - y2) <= d + ls = Math.abs(l - x1) <= d + rs = Math.abs(r - x2) <= d + if (ts) { + ui.position.top = inst._convertPositionTo('relative', { + top: t, + left: 0 + }).top + } + if (bs) { + ui.position.top = inst._convertPositionTo('relative', { + top: b - inst.helperProportions.height, + left: 0 + }).top + } + if (ls) { + ui.position.left = inst._convertPositionTo('relative', { + top: 0, + left: l + }).left + } + if (rs) { + ui.position.left = inst._convertPositionTo('relative', { + top: 0, + left: r - inst.helperProportions.width + }).left + } + } + + if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) { + inst.options.snap.snap && + inst.options.snap.snap.call( + inst.element, + event, + $.extend(inst._uiHash(), { + snapItem: inst.snapElements[i].item + }) + ) + } + inst.snapElements[i].snapping = ts || bs || ls || rs || first + } + } + }) + + $.ui.plugin.add('draggable', 'stack', { + start: function (event, ui, instance) { + var min, + o = instance.options, + group = $.makeArray($(o.stack)).sort(function (a, b) { + return (parseInt($(a).css('zIndex'), 10) || 0) - (parseInt($(b).css('zIndex'), 10) || 0) + }) + + if (!group.length) { + return + } + + min = parseInt($(group[0]).css('zIndex'), 10) || 0 + $(group).each(function (i) { + $(this).css('zIndex', min + i) + }) + this.css('zIndex', min + group.length) + } + }) + + $.ui.plugin.add('draggable', 'zIndex', { + start: function (event, ui, instance) { + var t = $(ui.helper), + o = instance.options + + if (t.css('zIndex')) { + o._zIndex = t.css('zIndex') + } + t.css('zIndex', o.zIndex) + }, + stop: function (event, ui, instance) { + var o = instance.options + + if (o._zIndex) { + $(ui.helper).css('zIndex', o._zIndex) + } + } + }) + + var widgetsDraggable = $.ui.draggable + + /*! + * jQuery UI Resizable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Resizable + //>>group: Interactions + //>>description: Enables resize functionality for any element. + //>>docs: http://api.jqueryui.com/resizable/ + //>>demos: http://jqueryui.com/resizable/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/resizable.css + //>>css.theme: ../../themes/base/theme.css + + $.widget('ui.resizable', $.ui.mouse, { + version: '1.12.1', + widgetEventPrefix: 'resize', + options: { + alsoResize: false, + animate: false, + animateDuration: 'slow', + animateEasing: 'swing', + aspectRatio: false, + autoHide: false, + classes: { + 'ui-resizable-se': 'ui-icon ui-icon-gripsmall-diagonal-se' + }, + containment: false, + ghost: false, + grid: false, + handles: 'e,s,se', + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + + // See #7960 + zIndex: 90, + + // Callbacks + resize: null, + start: null, + stop: null + }, + + _num: function (value) { + return parseFloat(value) || 0 + }, + + _isNumber: function (value) { + return !isNaN(parseFloat(value)) + }, + + _hasScroll: function (el, a) { + if ($(el).css('overflow') === 'hidden') { + return false + } + + var scroll = a && a === 'left' ? 'scrollLeft' : 'scrollTop', + has = false + + if (el[scroll] > 0) { + return true + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[scroll] = 1 + has = el[scroll] > 0 + el[scroll] = 0 + return has + }, + + _create: function () { + var margins, + o = this.options, + that = this + this._addClass('ui-resizable') + + $.extend(this, { + _aspectRatio: !!o.aspectRatio, + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null + }) + + // Wrap the element if it cannot hold child nodes + if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) { + this.element.wrap( + $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({ + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left') + }) + ) + + this.element = this.element + .parent() + .data('ui-resizable', this.element.resizable('instance')) + + this.elementIsWrapper = true + + margins = { + marginTop: this.originalElement.css('marginTop'), + marginRight: this.originalElement.css('marginRight'), + marginBottom: this.originalElement.css('marginBottom'), + marginLeft: this.originalElement.css('marginLeft') + } + + this.element.css(margins) + this.originalElement.css('margin', 0) + + // support: Safari + // Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css('resize') + this.originalElement.css('resize', 'none') + + this._proportionallyResizeElements.push( + this.originalElement.css({ + position: 'static', + zoom: 1, + display: 'block' + }) + ) + + // Support: IE9 + // avoid IE jump (hard set the margin) + this.originalElement.css(margins) + + this._proportionallyResize() + } + + this._setupHandles() + + if (o.autoHide) { + $(this.element) + .on('mouseenter', function () { + if (o.disabled) { + return + } + that._removeClass('ui-resizable-autohide') + that._handles.show() + }) + .on('mouseleave', function () { + if (o.disabled) { + return + } + if (!that.resizing) { + that._addClass('ui-resizable-autohide') + that._handles.hide() + } + }) + } + + this._mouseInit() + }, + + _destroy: function () { + this._mouseDestroy() + + var wrapper, + _destroy = function (exp) { + $(exp) + .removeData('resizable') + .removeData('ui-resizable') + .off('.resizable') + .find('.ui-resizable-handle') + .remove() + } + + // TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element) + wrapper = this.element + this.originalElement + .css({ + position: wrapper.css('position'), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css('top'), + left: wrapper.css('left') + }) + .insertAfter(wrapper) + wrapper.remove() + } + + this.originalElement.css('resize', this.originalResizeStyle) + _destroy(this.originalElement) + + return this + }, + + _setOption: function (key, value) { + this._super(key, value) + + switch (key) { + case 'handles': + this._removeHandles() + this._setupHandles() + break + default: + break + } + }, + + _setupHandles: function () { + var o = this.options, + handle, + i, + n, + hname, + axis, + that = this + this.handles = + o.handles || + (!$('.ui-resizable-handle', this.element).length + ? 'e,s,se' + : { + n: '.ui-resizable-n', + e: '.ui-resizable-e', + s: '.ui-resizable-s', + w: '.ui-resizable-w', + se: '.ui-resizable-se', + sw: '.ui-resizable-sw', + ne: '.ui-resizable-ne', + nw: '.ui-resizable-nw' + }) + + this._handles = $() + if (this.handles.constructor === String) { + if (this.handles === 'all') { + this.handles = 'n,e,s,w,se,sw,ne,nw' + } + + n = this.handles.split(',') + this.handles = {} + + for (i = 0; i < n.length; i++) { + handle = $.trim(n[i]) + hname = 'ui-resizable-' + handle + axis = $('<div>') + this._addClass(axis, 'ui-resizable-handle ' + hname) + + axis.css({ zIndex: o.zIndex }) + + this.handles[handle] = '.ui-resizable-' + handle + this.element.append(axis) + } + } + + this._renderAxis = function (target) { + var i, axis, padPos, padWrapper + + target = target || this.element + + for (i in this.handles) { + if (this.handles[i].constructor === String) { + this.handles[i] = this.element.children(this.handles[i]).first().show() + } else if (this.handles[i].jquery || this.handles[i].nodeType) { + this.handles[i] = $(this.handles[i]) + this._on(this.handles[i], { mousedown: that._mouseDown }) + } + + if ( + this.elementIsWrapper && + this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i) + ) { + axis = $(this.handles[i], this.element) + + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth() + + padPos = [ + 'padding', + /ne|nw|n/.test(i) + ? 'Top' + : /se|sw|s/.test(i) + ? 'Bottom' + : /^e$/.test(i) + ? 'Right' + : 'Left' + ].join('') + + target.css(padPos, padWrapper) + + this._proportionallyResize() + } + + this._handles = this._handles.add(this.handles[i]) + } + } + + // TODO: make renderAxis a prototype function + this._renderAxis(this.element) + + this._handles = this._handles.add(this.element.find('.ui-resizable-handle')) + this._handles.disableSelection() + + this._handles.on('mouseover', function () { + if (!that.resizing) { + if (this.className) { + axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i) + } + that.axis = axis && axis[1] ? axis[1] : 'se' + } + }) + + if (o.autoHide) { + this._handles.hide() + this._addClass('ui-resizable-autohide') + } + }, + + _removeHandles: function () { + this._handles.remove() + }, + + _mouseCapture: function (event) { + var i, + handle, + capture = false + + for (i in this.handles) { + handle = $(this.handles[i])[0] + if (handle === event.target || $.contains(handle, event.target)) { + capture = true + } + } + + return !this.options.disabled && capture + }, + + _mouseStart: function (event) { + var curleft, + curtop, + cursor, + o = this.options, + el = this.element + + this.resizing = true + + this._renderProxy() + + curleft = this._num(this.helper.css('left')) + curtop = this._num(this.helper.css('top')) + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0 + curtop += $(o.containment).scrollTop() || 0 + } + + this.offset = this.helper.offset() + this.position = { left: curleft, top: curtop } + + this.size = this._helper + ? { + width: this.helper.width(), + height: this.helper.height() + } + : { + width: el.width(), + height: el.height() + } + + this.originalSize = this._helper + ? { + width: el.outerWidth(), + height: el.outerHeight() + } + : { + width: el.width(), + height: el.height() + } + + this.sizeDiff = { + width: el.outerWidth() - el.width(), + height: el.outerHeight() - el.height() + } + + this.originalPosition = { left: curleft, top: curtop } + this.originalMousePosition = { left: event.pageX, top: event.pageY } + + this.aspectRatio = + typeof o.aspectRatio === 'number' + ? o.aspectRatio + : this.originalSize.width / this.originalSize.height || 1 + + cursor = $('.ui-resizable-' + this.axis).css('cursor') + $('body').css('cursor', cursor === 'auto' ? this.axis + '-resize' : cursor) + + this._addClass('ui-resizable-resizing') + this._propagate('start', event) + return true + }, + + _mouseDrag: function (event) { + var data, + props, + smp = this.originalMousePosition, + a = this.axis, + dx = event.pageX - smp.left || 0, + dy = event.pageY - smp.top || 0, + trigger = this._change[a] + + this._updatePrevProperties() + + if (!trigger) { + return false + } + + data = trigger.apply(this, [event, dx, dy]) + + this._updateVirtualBoundaries(event.shiftKey) + if (this._aspectRatio || event.shiftKey) { + data = this._updateRatio(data, event) + } + + data = this._respectSize(data, event) + + this._updateCache(data) + + this._propagate('resize', event) + + props = this._applyChanges() + + if (!this._helper && this._proportionallyResizeElements.length) { + this._proportionallyResize() + } + + if (!$.isEmptyObject(props)) { + this._updatePrevProperties() + this._trigger('resize', event, this.ui()) + this._applyChanges() + } + + return false + }, + + _mouseStop: function (event) { + this.resizing = false + var pr, + ista, + soffseth, + soffsetw, + s, + left, + top, + o = this.options, + that = this + + if (this._helper) { + pr = this._proportionallyResizeElements + ista = pr.length && /textarea/i.test(pr[0].nodeName) + soffseth = ista && this._hasScroll(pr[0], 'left') ? 0 : that.sizeDiff.height + soffsetw = ista ? 0 : that.sizeDiff.width + + s = { + width: that.helper.width() - soffsetw, + height: that.helper.height() - soffseth + } + left = + parseFloat(that.element.css('left')) + + (that.position.left - that.originalPosition.left) || null + top = + parseFloat(that.element.css('top')) + (that.position.top - that.originalPosition.top) || + null + + if (!o.animate) { + this.element.css($.extend(s, { top: top, left: left })) + } + + that.helper.height(that.size.height) + that.helper.width(that.size.width) + + if (this._helper && !o.animate) { + this._proportionallyResize() + } + } + + $('body').css('cursor', 'auto') + + this._removeClass('ui-resizable-resizing') + + this._propagate('stop', event) + + if (this._helper) { + this.helper.remove() + } + + return false + }, + + _updatePrevProperties: function () { + this.prevPosition = { + top: this.position.top, + left: this.position.left + } + this.prevSize = { + width: this.size.width, + height: this.size.height + } + }, + + _applyChanges: function () { + var props = {} + + if (this.position.top !== this.prevPosition.top) { + props.top = this.position.top + 'px' + } + if (this.position.left !== this.prevPosition.left) { + props.left = this.position.left + 'px' + } + if (this.size.width !== this.prevSize.width) { + props.width = this.size.width + 'px' + } + if (this.size.height !== this.prevSize.height) { + props.height = this.size.height + 'px' + } + + this.helper.css(props) + + return props + }, + + _updateVirtualBoundaries: function (forceAspectRatio) { + var pMinWidth, + pMaxWidth, + pMinHeight, + pMaxHeight, + b, + o = this.options + + b = { + minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0, + maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity, + minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0, + maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity + } + + if (this._aspectRatio || forceAspectRatio) { + pMinWidth = b.minHeight * this.aspectRatio + pMinHeight = b.minWidth / this.aspectRatio + pMaxWidth = b.maxHeight * this.aspectRatio + pMaxHeight = b.maxWidth / this.aspectRatio + + if (pMinWidth > b.minWidth) { + b.minWidth = pMinWidth + } + if (pMinHeight > b.minHeight) { + b.minHeight = pMinHeight + } + if (pMaxWidth < b.maxWidth) { + b.maxWidth = pMaxWidth + } + if (pMaxHeight < b.maxHeight) { + b.maxHeight = pMaxHeight + } + } + this._vBoundaries = b + }, + + _updateCache: function (data) { + this.offset = this.helper.offset() + if (this._isNumber(data.left)) { + this.position.left = data.left + } + if (this._isNumber(data.top)) { + this.position.top = data.top + } + if (this._isNumber(data.height)) { + this.size.height = data.height + } + if (this._isNumber(data.width)) { + this.size.width = data.width + } + }, + + _updateRatio: function (data) { + var cpos = this.position, + csize = this.size, + a = this.axis + + if (this._isNumber(data.height)) { + data.width = data.height * this.aspectRatio + } else if (this._isNumber(data.width)) { + data.height = data.width / this.aspectRatio + } + + if (a === 'sw') { + data.left = cpos.left + (csize.width - data.width) + data.top = null + } + if (a === 'nw') { + data.top = cpos.top + (csize.height - data.height) + data.left = cpos.left + (csize.width - data.width) + } + + return data + }, + + _respectSize: function (data) { + var o = this._vBoundaries, + a = this.axis, + ismaxw = this._isNumber(data.width) && o.maxWidth && o.maxWidth < data.width, + ismaxh = this._isNumber(data.height) && o.maxHeight && o.maxHeight < data.height, + isminw = this._isNumber(data.width) && o.minWidth && o.minWidth > data.width, + isminh = this._isNumber(data.height) && o.minHeight && o.minHeight > data.height, + dw = this.originalPosition.left + this.originalSize.width, + dh = this.originalPosition.top + this.originalSize.height, + cw = /sw|nw|w/.test(a), + ch = /nw|ne|n/.test(a) + if (isminw) { + data.width = o.minWidth + } + if (isminh) { + data.height = o.minHeight + } + if (ismaxw) { + data.width = o.maxWidth + } + if (ismaxh) { + data.height = o.maxHeight + } + + if (isminw && cw) { + data.left = dw - o.minWidth + } + if (ismaxw && cw) { + data.left = dw - o.maxWidth + } + if (isminh && ch) { + data.top = dh - o.minHeight + } + if (ismaxh && ch) { + data.top = dh - o.maxHeight + } + + // Fixing jump error on top/left - bug #2330 + if (!data.width && !data.height && !data.left && data.top) { + data.top = null + } else if (!data.width && !data.height && !data.top && data.left) { + data.left = null + } + + return data + }, + + _getPaddingPlusBorderDimensions: function (element) { + var i = 0, + widths = [], + borders = [ + element.css('borderTopWidth'), + element.css('borderRightWidth'), + element.css('borderBottomWidth'), + element.css('borderLeftWidth') + ], + paddings = [ + element.css('paddingTop'), + element.css('paddingRight'), + element.css('paddingBottom'), + element.css('paddingLeft') + ] + + for (; i < 4; i++) { + widths[i] = parseFloat(borders[i]) || 0 + widths[i] += parseFloat(paddings[i]) || 0 + } + + return { + height: widths[0] + widths[2], + width: widths[1] + widths[3] + } + }, + + _proportionallyResize: function () { + if (!this._proportionallyResizeElements.length) { + return + } + + var prel, + i = 0, + element = this.helper || this.element + + for (; i < this._proportionallyResizeElements.length; i++) { + prel = this._proportionallyResizeElements[i] + + // TODO: Seems like a bug to cache this.outerDimensions + // considering that we are in a loop. + if (!this.outerDimensions) { + this.outerDimensions = this._getPaddingPlusBorderDimensions(prel) + } + + prel.css({ + height: element.height() - this.outerDimensions.height || 0, + width: element.width() - this.outerDimensions.width || 0 + }) + } + }, + + _renderProxy: function () { + var el = this.element, + o = this.options + this.elementOffset = el.offset() + + if (this._helper) { + this.helper = this.helper || $("<div style='overflow:hidden;'></div>") + + this._addClass(this.helper, this._helper) + this.helper.css({ + width: this.element.outerWidth(), + height: this.element.outerHeight(), + position: 'absolute', + left: this.elementOffset.left + 'px', + top: this.elementOffset.top + 'px', + zIndex: ++o.zIndex //TODO: Don't modify option + }) + + this.helper.appendTo('body').disableSelection() + } else { + this.helper = this.element + } + }, + + _change: { + e: function (event, dx) { + return { width: this.originalSize.width + dx } + }, + w: function (event, dx) { + var cs = this.originalSize, + sp = this.originalPosition + return { left: sp.left + dx, width: cs.width - dx } + }, + n: function (event, dx, dy) { + var cs = this.originalSize, + sp = this.originalPosition + return { top: sp.top + dy, height: cs.height - dy } + }, + s: function (event, dx, dy) { + return { height: this.originalSize.height + dy } + }, + se: function (event, dx, dy) { + return $.extend( + this._change.s.apply(this, arguments), + this._change.e.apply(this, [event, dx, dy]) + ) + }, + sw: function (event, dx, dy) { + return $.extend( + this._change.s.apply(this, arguments), + this._change.w.apply(this, [event, dx, dy]) + ) + }, + ne: function (event, dx, dy) { + return $.extend( + this._change.n.apply(this, arguments), + this._change.e.apply(this, [event, dx, dy]) + ) + }, + nw: function (event, dx, dy) { + return $.extend( + this._change.n.apply(this, arguments), + this._change.w.apply(this, [event, dx, dy]) + ) + } + }, + + _propagate: function (n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]) + n !== 'resize' && this._trigger(n, event, this.ui()) + }, + + plugins: {}, + + ui: function () { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + } + } + }) + + /* + * Resizable Extensions + */ + + $.ui.plugin.add('resizable', 'animate', { + stop: function (event) { + var that = $(this).resizable('instance'), + o = that.options, + pr = that._proportionallyResizeElements, + ista = pr.length && /textarea/i.test(pr[0].nodeName), + soffseth = ista && that._hasScroll(pr[0], 'left') ? 0 : that.sizeDiff.height, + soffsetw = ista ? 0 : that.sizeDiff.width, + style = { + width: that.size.width - soffsetw, + height: that.size.height - soffseth + }, + left = + parseFloat(that.element.css('left')) + + (that.position.left - that.originalPosition.left) || null, + top = + parseFloat(that.element.css('top')) + (that.position.top - that.originalPosition.top) || + null + + that.element.animate($.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function () { + var data = { + width: parseFloat(that.element.css('width')), + height: parseFloat(that.element.css('height')), + top: parseFloat(that.element.css('top')), + left: parseFloat(that.element.css('left')) + } + + if (pr && pr.length) { + $(pr[0]).css({ width: data.width, height: data.height }) + } + + // Propagating resize, and updating values for each animation step + that._updateCache(data) + that._propagate('resize', event) + } + }) + } + }) + + $.ui.plugin.add('resizable', 'containment', { + start: function () { + var element, + p, + co, + ch, + cw, + width, + height, + that = $(this).resizable('instance'), + o = that.options, + el = that.element, + oc = o.containment, + ce = oc instanceof $ ? oc.get(0) : /parent/.test(oc) ? el.parent().get(0) : oc + + if (!ce) { + return + } + + that.containerElement = $(ce) + + if (/document/.test(oc) || oc === document) { + that.containerOffset = { + left: 0, + top: 0 + } + that.containerPosition = { + left: 0, + top: 0 + } + + that.parentData = { + element: $(document), + left: 0, + top: 0, + width: $(document).width(), + height: $(document).height() || document.body.parentNode.scrollHeight + } + } else { + element = $(ce) + p = [] + $(['Top', 'Right', 'Left', 'Bottom']).each(function (i, name) { + p[i] = that._num(element.css('padding' + name)) + }) + + that.containerOffset = element.offset() + that.containerPosition = element.position() + that.containerSize = { + height: element.innerHeight() - p[3], + width: element.innerWidth() - p[1] + } + + co = that.containerOffset + ch = that.containerSize.height + cw = that.containerSize.width + width = that._hasScroll(ce, 'left') ? ce.scrollWidth : cw + height = that._hasScroll(ce) ? ce.scrollHeight : ch + + that.parentData = { + element: ce, + left: co.left, + top: co.top, + width: width, + height: height + } + } + }, + + resize: function (event) { + var woset, + hoset, + isParent, + isOffsetRelative, + that = $(this).resizable('instance'), + o = that.options, + co = that.containerOffset, + cp = that.position, + pRatio = that._aspectRatio || event.shiftKey, + cop = { + top: 0, + left: 0 + }, + ce = that.containerElement, + continueResize = true + + if (ce[0] !== document && /static/.test(ce.css('position'))) { + cop = co + } + + if (cp.left < (that._helper ? co.left : 0)) { + that.size.width = + that.size.width + + (that._helper ? that.position.left - co.left : that.position.left - cop.left) + + if (pRatio) { + that.size.height = that.size.width / that.aspectRatio + continueResize = false + } + that.position.left = o.helper ? co.left : 0 + } + + if (cp.top < (that._helper ? co.top : 0)) { + that.size.height = + that.size.height + (that._helper ? that.position.top - co.top : that.position.top) + + if (pRatio) { + that.size.width = that.size.height * that.aspectRatio + continueResize = false + } + that.position.top = that._helper ? co.top : 0 + } + + isParent = that.containerElement.get(0) === that.element.parent().get(0) + isOffsetRelative = /relative|absolute/.test(that.containerElement.css('position')) + + if (isParent && isOffsetRelative) { + that.offset.left = that.parentData.left + that.position.left + that.offset.top = that.parentData.top + that.position.top + } else { + that.offset.left = that.element.offset().left + that.offset.top = that.element.offset().top + } + + woset = Math.abs( + that.sizeDiff.width + + (that._helper ? that.offset.left - cop.left : that.offset.left - co.left) + ) + + hoset = Math.abs( + that.sizeDiff.height + (that._helper ? that.offset.top - cop.top : that.offset.top - co.top) + ) + + if (woset + that.size.width >= that.parentData.width) { + that.size.width = that.parentData.width - woset + if (pRatio) { + that.size.height = that.size.width / that.aspectRatio + continueResize = false + } + } + + if (hoset + that.size.height >= that.parentData.height) { + that.size.height = that.parentData.height - hoset + if (pRatio) { + that.size.width = that.size.height * that.aspectRatio + continueResize = false + } + } + + if (!continueResize) { + that.position.left = that.prevPosition.left + that.position.top = that.prevPosition.top + that.size.width = that.prevSize.width + that.size.height = that.prevSize.height + } + }, + + stop: function () { + var that = $(this).resizable('instance'), + o = that.options, + co = that.containerOffset, + cop = that.containerPosition, + ce = that.containerElement, + helper = $(that.helper), + ho = helper.offset(), + w = helper.outerWidth() - that.sizeDiff.width, + h = helper.outerHeight() - that.sizeDiff.height + + if (that._helper && !o.animate && /relative/.test(ce.css('position'))) { + $(this).css({ + left: ho.left - cop.left - co.left, + width: w, + height: h + }) + } + + if (that._helper && !o.animate && /static/.test(ce.css('position'))) { + $(this).css({ + left: ho.left - cop.left - co.left, + width: w, + height: h + }) + } + } + }) + + $.ui.plugin.add('resizable', 'alsoResize', { + start: function () { + var that = $(this).resizable('instance'), + o = that.options + + $(o.alsoResize).each(function () { + var el = $(this) + el.data('ui-resizable-alsoresize', { + width: parseFloat(el.width()), + height: parseFloat(el.height()), + left: parseFloat(el.css('left')), + top: parseFloat(el.css('top')) + }) + }) + }, + + resize: function (event, ui) { + var that = $(this).resizable('instance'), + o = that.options, + os = that.originalSize, + op = that.originalPosition, + delta = { + height: that.size.height - os.height || 0, + width: that.size.width - os.width || 0, + top: that.position.top - op.top || 0, + left: that.position.left - op.left || 0 + } + + $(o.alsoResize).each(function () { + var el = $(this), + start = $(this).data('ui-resizable-alsoresize'), + style = {}, + css = el.parents(ui.originalElement[0]).length + ? ['width', 'height'] + : ['width', 'height', 'top', 'left'] + + $.each(css, function (i, prop) { + var sum = (start[prop] || 0) + (delta[prop] || 0) + if (sum && sum >= 0) { + style[prop] = sum || null + } + }) + + el.css(style) + }) + }, + + stop: function () { + $(this).removeData('ui-resizable-alsoresize') + } + }) + + $.ui.plugin.add('resizable', 'ghost', { + start: function () { + var that = $(this).resizable('instance'), + cs = that.size + + that.ghost = that.originalElement.clone() + that.ghost.css({ + opacity: 0.25, + display: 'block', + position: 'relative', + height: cs.height, + width: cs.width, + margin: 0, + left: 0, + top: 0 + }) + + that._addClass(that.ghost, 'ui-resizable-ghost') + + // DEPRECATED + // TODO: remove after 1.12 + if ($.uiBackCompat !== false && typeof that.options.ghost === 'string') { + // Ghost option + that.ghost.addClass(this.options.ghost) + } + + that.ghost.appendTo(that.helper) + }, + + resize: function () { + var that = $(this).resizable('instance') + if (that.ghost) { + that.ghost.css({ + position: 'relative', + height: that.size.height, + width: that.size.width + }) + } + }, + + stop: function () { + var that = $(this).resizable('instance') + if (that.ghost && that.helper) { + that.helper.get(0).removeChild(that.ghost.get(0)) + } + } + }) + + $.ui.plugin.add('resizable', 'grid', { + resize: function () { + var outerDimensions, + that = $(this).resizable('instance'), + o = that.options, + cs = that.size, + os = that.originalSize, + op = that.originalPosition, + a = that.axis, + grid = typeof o.grid === 'number' ? [o.grid, o.grid] : o.grid, + gridX = grid[0] || 1, + gridY = grid[1] || 1, + ox = Math.round((cs.width - os.width) / gridX) * gridX, + oy = Math.round((cs.height - os.height) / gridY) * gridY, + newWidth = os.width + ox, + newHeight = os.height + oy, + isMaxWidth = o.maxWidth && o.maxWidth < newWidth, + isMaxHeight = o.maxHeight && o.maxHeight < newHeight, + isMinWidth = o.minWidth && o.minWidth > newWidth, + isMinHeight = o.minHeight && o.minHeight > newHeight + + o.grid = grid + + if (isMinWidth) { + newWidth += gridX + } + if (isMinHeight) { + newHeight += gridY + } + if (isMaxWidth) { + newWidth -= gridX + } + if (isMaxHeight) { + newHeight -= gridY + } + + if (/^(se|s|e)$/.test(a)) { + that.size.width = newWidth + that.size.height = newHeight + } else if (/^(ne)$/.test(a)) { + that.size.width = newWidth + that.size.height = newHeight + that.position.top = op.top - oy + } else if (/^(sw)$/.test(a)) { + that.size.width = newWidth + that.size.height = newHeight + that.position.left = op.left - ox + } else { + if (newHeight - gridY <= 0 || newWidth - gridX <= 0) { + outerDimensions = that._getPaddingPlusBorderDimensions(this) + } + + if (newHeight - gridY > 0) { + that.size.height = newHeight + that.position.top = op.top - oy + } else { + newHeight = gridY - outerDimensions.height + that.size.height = newHeight + that.position.top = op.top + os.height - newHeight + } + if (newWidth - gridX > 0) { + that.size.width = newWidth + that.position.left = op.left - ox + } else { + newWidth = gridX - outerDimensions.width + that.size.width = newWidth + that.position.left = op.left + os.width - newWidth + } + } + } + }) + + var widgetsResizable = $.ui.resizable + + /*! + * jQuery UI Dialog 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Dialog + //>>group: Widgets + //>>description: Displays customizable dialog windows. + //>>docs: http://api.jqueryui.com/dialog/ + //>>demos: http://jqueryui.com/dialog/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/dialog.css + //>>css.theme: ../../themes/base/theme.css + + $.widget('ui.dialog', { + version: '1.12.1', + options: { + appendTo: 'body', + autoOpen: true, + buttons: [], + classes: { + 'ui-dialog': 'ui-corner-all', + 'ui-dialog-titlebar': 'ui-corner-all' + }, + closeOnEscape: true, + closeText: 'Close', + draggable: true, + hide: null, + height: 'auto', + maxHeight: null, + maxWidth: null, + minHeight: 150, + minWidth: 150, + modal: false, + position: { + my: 'center', + at: 'center', + of: window, + collision: 'fit', + + // Ensure the titlebar is always visible + using: function (pos) { + var topOffset = $(this).css(pos).offset().top + if (topOffset < 0) { + $(this).css('top', pos.top - topOffset) + } + } + }, + resizable: true, + show: null, + title: null, + width: 300, + + // Callbacks + beforeClose: null, + close: null, + drag: null, + dragStart: null, + dragStop: null, + focus: null, + open: null, + resize: null, + resizeStart: null, + resizeStop: null + }, + + sizeRelatedOptions: { + buttons: true, + height: true, + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true, + width: true + }, + + resizableRelatedOptions: { + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true + }, + + _create: function () { + this.originalCss = { + display: this.element[0].style.display, + width: this.element[0].style.width, + minHeight: this.element[0].style.minHeight, + maxHeight: this.element[0].style.maxHeight, + height: this.element[0].style.height + } + this.originalPosition = { + parent: this.element.parent(), + index: this.element.parent().children().index(this.element) + } + this.originalTitle = this.element.attr('title') + if (this.options.title == null && this.originalTitle != null) { + this.options.title = this.originalTitle + } + + // Dialogs can't be disabled + if (this.options.disabled) { + this.options.disabled = false + } + + this._createWrapper() + + this.element.show().removeAttr('title').appendTo(this.uiDialog) + + this._addClass('ui-dialog-content', 'ui-widget-content') + + this._createTitlebar() + this._createButtonPane() + + if (this.options.draggable && $.fn.draggable) { + this._makeDraggable() + } + if (this.options.resizable && $.fn.resizable) { + this._makeResizable() + } + + this._isOpen = false + + this._trackFocus() + }, + + _init: function () { + if (this.options.autoOpen) { + this.open() + } + }, + + _appendTo: function () { + var element = this.options.appendTo + if (element && (element.jquery || element.nodeType)) { + return $(element) + } + return this.document.find(element || 'body').eq(0) + }, + + _destroy: function () { + var next, + originalPosition = this.originalPosition + + this._untrackInstance() + this._destroyOverlay() + + this.element + .removeUniqueId() + .css(this.originalCss) + + // Without detaching first, the following becomes really slow + .detach() + + this.uiDialog.remove() + + if (this.originalTitle) { + this.element.attr('title', this.originalTitle) + } + + next = originalPosition.parent.children().eq(originalPosition.index) + + // Don't try to place the dialog next to itself (#8613) + if (next.length && next[0] !== this.element[0]) { + next.before(this.element) + } else { + originalPosition.parent.append(this.element) + } + }, + + widget: function () { + return this.uiDialog + }, + + disable: $.noop, + enable: $.noop, + + close: function (event) { + var that = this + + if (!this._isOpen || this._trigger('beforeClose', event) === false) { + return + } + + this._isOpen = false + this._focusedElement = null + this._destroyOverlay() + this._untrackInstance() + + if (!this.opener.filter(':focusable').trigger('focus').length) { + // Hiding a focused element doesn't trigger blur in WebKit + // so in case we have nothing to focus on, explicitly blur the active element + // https://bugs.webkit.org/show_bug.cgi?id=47182 + $.ui.safeBlur($.ui.safeActiveElement(this.document[0])) + } + + this._hide(this.uiDialog, this.options.hide, function () { + that._trigger('close', event) + }) + }, + + isOpen: function () { + return this._isOpen + }, + + moveToTop: function () { + this._moveToTop() + }, + + _moveToTop: function (event, silent) { + var moved = false, + zIndices = this.uiDialog + .siblings('.ui-front:visible') + .map(function () { + return +$(this).css('z-index') + }) + .get(), + zIndexMax = Math.max.apply(null, zIndices) + + if (zIndexMax >= +this.uiDialog.css('z-index')) { + this.uiDialog.css('z-index', zIndexMax + 1) + moved = true + } + + if (moved && !silent) { + this._trigger('focus', event) + } + return moved + }, + + open: function () { + var that = this + if (this._isOpen) { + if (this._moveToTop()) { + this._focusTabbable() + } + return + } + + this._isOpen = true + this.opener = $($.ui.safeActiveElement(this.document[0])) + + this._size() + this._position() + this._createOverlay() + this._moveToTop(null, true) + + // Ensure the overlay is moved to the top with the dialog, but only when + // opening. The overlay shouldn't move after the dialog is open so that + // modeless dialogs opened after the modal dialog stack properly. + if (this.overlay) { + this.overlay.css('z-index', this.uiDialog.css('z-index') - 1) + } + + this._show(this.uiDialog, this.options.show, function () { + that._focusTabbable() + that._trigger('focus') + }) + + // Track the dialog immediately upon openening in case a focus event + // somehow occurs outside of the dialog before an element inside the + // dialog is focused (#10152) + this._makeFocusTarget() + + this._trigger('open') + }, + + _focusTabbable: function () { + // Set focus to the first match: + // 1. An element that was focused previously + // 2. First element inside the dialog matching [autofocus] + // 3. Tabbable element inside the content element + // 4. Tabbable element inside the buttonpane + // 5. The close button + // 6. The dialog itself + var hasFocus = this._focusedElement + if (!hasFocus) { + hasFocus = this.element.find('[autofocus]') + } + if (!hasFocus.length) { + hasFocus = this.element.find(':tabbable') + } + if (!hasFocus.length) { + hasFocus = this.uiDialogButtonPane.find(':tabbable') + } + if (!hasFocus.length) { + hasFocus = this.uiDialogTitlebarClose.filter(':tabbable') + } + if (!hasFocus.length) { + hasFocus = this.uiDialog + } + hasFocus.eq(0).trigger('focus') + }, + + _keepFocus: function (event) { + function checkFocus() { + var activeElement = $.ui.safeActiveElement(this.document[0]), + isActive = + this.uiDialog[0] === activeElement || $.contains(this.uiDialog[0], activeElement) + if (!isActive) { + this._focusTabbable() + } + } + event.preventDefault() + checkFocus.call(this) + + // support: IE + // IE <= 8 doesn't prevent moving focus even with event.preventDefault() + // so we check again later + this._delay(checkFocus) + }, + + _createWrapper: function () { + this.uiDialog = $('<div>') + .hide() + .attr({ + // Setting tabIndex makes the div focusable + tabIndex: -1, + role: 'dialog' + }) + .appendTo(this._appendTo()) + + this._addClass(this.uiDialog, 'ui-dialog', 'ui-widget ui-widget-content ui-front') + this._on(this.uiDialog, { + keydown: function (event) { + if ( + this.options.closeOnEscape && + !event.isDefaultPrevented() && + event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE + ) { + event.preventDefault() + this.close(event) + return + } + + // Prevent tabbing out of dialogs + if (event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented()) { + return + } + var tabbables = this.uiDialog.find(':tabbable'), + first = tabbables.filter(':first'), + last = tabbables.filter(':last') + + if ((event.target === last[0] || event.target === this.uiDialog[0]) && !event.shiftKey) { + this._delay(function () { + first.trigger('focus') + }) + event.preventDefault() + } else if ( + (event.target === first[0] || event.target === this.uiDialog[0]) && + event.shiftKey + ) { + this._delay(function () { + last.trigger('focus') + }) + event.preventDefault() + } + }, + mousedown: function (event) { + if (this._moveToTop(event)) { + this._focusTabbable() + } + } + }) + + // We assume that any existing aria-describedby attribute means + // that the dialog content is marked up properly + // otherwise we brute force the content as the description + if (!this.element.find('[aria-describedby]').length) { + this.uiDialog.attr({ + 'aria-describedby': this.element.uniqueId().attr('id') + }) + } + }, + + _createTitlebar: function () { + var uiDialogTitle + + this.uiDialogTitlebar = $('<div>') + this._addClass( + this.uiDialogTitlebar, + 'ui-dialog-titlebar', + 'ui-widget-header ui-helper-clearfix' + ) + this._on(this.uiDialogTitlebar, { + mousedown: function (event) { + // Don't prevent click on close button (#8838) + // Focusing a dialog that is partially scrolled out of view + // causes the browser to scroll it into view, preventing the click event + if (!$(event.target).closest('.ui-dialog-titlebar-close')) { + // Dialog isn't getting focus when dragging (#8063) + this.uiDialog.trigger('focus') + } + } + }) + + // Support: IE + // Use type="button" to prevent enter keypresses in textboxes from closing the + // dialog in IE (#9312) + this.uiDialogTitlebarClose = $("<button type='button'></button>") + .button({ + label: $('<a>').text(this.options.closeText).html(), + icon: 'ui-icon-closethick', + showLabel: false + }) + .appendTo(this.uiDialogTitlebar) + + this._addClass(this.uiDialogTitlebarClose, 'ui-dialog-titlebar-close') + this._on(this.uiDialogTitlebarClose, { + click: function (event) { + event.preventDefault() + this.close(event) + } + }) + + uiDialogTitle = $('<span>').uniqueId().prependTo(this.uiDialogTitlebar) + this._addClass(uiDialogTitle, 'ui-dialog-title') + this._title(uiDialogTitle) + + this.uiDialogTitlebar.prependTo(this.uiDialog) + + this.uiDialog.attr({ + 'aria-labelledby': uiDialogTitle.attr('id') + }) + }, + + _title: function (title) { + if (this.options.title) { + title.text(this.options.title) + } else { + title.html(' ') + } + }, + + _createButtonPane: function () { + this.uiDialogButtonPane = $('<div>') + this._addClass( + this.uiDialogButtonPane, + 'ui-dialog-buttonpane', + 'ui-widget-content ui-helper-clearfix' + ) + + this.uiButtonSet = $('<div>').appendTo(this.uiDialogButtonPane) + this._addClass(this.uiButtonSet, 'ui-dialog-buttonset') + + this._createButtons() + }, + + _createButtons: function () { + var that = this, + buttons = this.options.buttons + + // If we already have a button pane, remove it + this.uiDialogButtonPane.remove() + this.uiButtonSet.empty() + + if ($.isEmptyObject(buttons) || ($.isArray(buttons) && !buttons.length)) { + this._removeClass(this.uiDialog, 'ui-dialog-buttons') + return + } + + $.each(buttons, function (name, props) { + var click, buttonOptions + props = $.isFunction(props) ? { click: props, text: name } : props + + // Default to a non-submitting button + props = $.extend({ type: 'button' }, props) + + // Change the context for the click callback to be the main element + click = props.click + buttonOptions = { + icon: props.icon, + iconPosition: props.iconPosition, + showLabel: props.showLabel, + + // Deprecated options + icons: props.icons, + text: props.text + } + + delete props.click + delete props.icon + delete props.iconPosition + delete props.showLabel + + // Deprecated options + delete props.icons + if (typeof props.text === 'boolean') { + delete props.text + } + + $('<button></button>', props) + .button(buttonOptions) + .appendTo(that.uiButtonSet) + .on('click', function () { + click.apply(that.element[0], arguments) + }) + }) + this._addClass(this.uiDialog, 'ui-dialog-buttons') + this.uiDialogButtonPane.appendTo(this.uiDialog) + }, + + _makeDraggable: function () { + var that = this, + options = this.options + + function filteredUi(ui) { + return { + position: ui.position, + offset: ui.offset + } + } + + this.uiDialog.draggable({ + cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', + handle: '.ui-dialog-titlebar', + containment: 'document', + start: function (event, ui) { + that._addClass($(this), 'ui-dialog-dragging') + that._blockFrames() + that._trigger('dragStart', event, filteredUi(ui)) + }, + drag: function (event, ui) { + that._trigger('drag', event, filteredUi(ui)) + }, + stop: function (event, ui) { + var left = ui.offset.left - that.document.scrollLeft(), + top = ui.offset.top - that.document.scrollTop() + + options.position = { + my: 'left top', + at: 'left' + (left >= 0 ? '+' : '') + left + ' ' + 'top' + (top >= 0 ? '+' : '') + top, + of: that.window + } + that._removeClass($(this), 'ui-dialog-dragging') + that._unblockFrames() + that._trigger('dragStop', event, filteredUi(ui)) + } + }) + }, + + _makeResizable: function () { + var that = this, + options = this.options, + handles = options.resizable, + // .ui-resizable has position: relative defined in the stylesheet + // but dialogs have to use absolute or fixed positioning + position = this.uiDialog.css('position'), + resizeHandles = typeof handles === 'string' ? handles : 'n,e,s,w,se,sw,ne,nw' + + function filteredUi(ui) { + return { + originalPosition: ui.originalPosition, + originalSize: ui.originalSize, + position: ui.position, + size: ui.size + } + } + + this.uiDialog + .resizable({ + cancel: '.ui-dialog-content', + containment: 'document', + alsoResize: this.element, + maxWidth: options.maxWidth, + maxHeight: options.maxHeight, + minWidth: options.minWidth, + minHeight: this._minHeight(), + handles: resizeHandles, + start: function (event, ui) { + that._addClass($(this), 'ui-dialog-resizing') + that._blockFrames() + that._trigger('resizeStart', event, filteredUi(ui)) + }, + resize: function (event, ui) { + that._trigger('resize', event, filteredUi(ui)) + }, + stop: function (event, ui) { + var offset = that.uiDialog.offset(), + left = offset.left - that.document.scrollLeft(), + top = offset.top - that.document.scrollTop() + + options.height = that.uiDialog.height() + options.width = that.uiDialog.width() + options.position = { + my: 'left top', + at: + 'left' + (left >= 0 ? '+' : '') + left + ' ' + 'top' + (top >= 0 ? '+' : '') + top, + of: that.window + } + that._removeClass($(this), 'ui-dialog-resizing') + that._unblockFrames() + that._trigger('resizeStop', event, filteredUi(ui)) + } + }) + .css('position', position) + }, + + _trackFocus: function () { + this._on(this.widget(), { + focusin: function (event) { + this._makeFocusTarget() + this._focusedElement = $(event.target) + } + }) + }, + + _makeFocusTarget: function () { + this._untrackInstance() + this._trackingInstances().unshift(this) + }, + + _untrackInstance: function () { + var instances = this._trackingInstances(), + exists = $.inArray(this, instances) + if (exists !== -1) { + instances.splice(exists, 1) + } + }, + + _trackingInstances: function () { + var instances = this.document.data('ui-dialog-instances') + if (!instances) { + instances = [] + this.document.data('ui-dialog-instances', instances) + } + return instances + }, + + _minHeight: function () { + var options = this.options + + return options.height === 'auto' + ? options.minHeight + : Math.min(options.minHeight, options.height) + }, + + _position: function () { + // Need to show the dialog to get the actual offset in the position plugin + var isVisible = this.uiDialog.is(':visible') + if (!isVisible) { + this.uiDialog.show() + } + this.uiDialog.position(this.options.position) + if (!isVisible) { + this.uiDialog.hide() + } + }, + + _setOptions: function (options) { + var that = this, + resize = false, + resizableOptions = {} + + $.each(options, function (key, value) { + that._setOption(key, value) + + if (key in that.sizeRelatedOptions) { + resize = true + } + if (key in that.resizableRelatedOptions) { + resizableOptions[key] = value + } + }) + + if (resize) { + this._size() + this._position() + } + if (this.uiDialog.is(':data(ui-resizable)')) { + this.uiDialog.resizable('option', resizableOptions) + } + }, + + _setOption: function (key, value) { + var isDraggable, + isResizable, + uiDialog = this.uiDialog + + if (key === 'disabled') { + return + } + + this._super(key, value) + + if (key === 'appendTo') { + this.uiDialog.appendTo(this._appendTo()) + } + + if (key === 'buttons') { + this._createButtons() + } + + if (key === 'closeText') { + this.uiDialogTitlebarClose.button({ + // Ensure that we always pass a string + label: $('<a>') + .text('' + this.options.closeText) + .html() + }) + } + + if (key === 'draggable') { + isDraggable = uiDialog.is(':data(ui-draggable)') + if (isDraggable && !value) { + uiDialog.draggable('destroy') + } + + if (!isDraggable && value) { + this._makeDraggable() + } + } + + if (key === 'position') { + this._position() + } + + if (key === 'resizable') { + // currently resizable, becoming non-resizable + isResizable = uiDialog.is(':data(ui-resizable)') + if (isResizable && !value) { + uiDialog.resizable('destroy') + } + + // Currently resizable, changing handles + if (isResizable && typeof value === 'string') { + uiDialog.resizable('option', 'handles', value) + } + + // Currently non-resizable, becoming resizable + if (!isResizable && value !== false) { + this._makeResizable() + } + } + + if (key === 'title') { + this._title(this.uiDialogTitlebar.find('.ui-dialog-title')) + } + }, + + _size: function () { + // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content + // divs will both have width and height set, so we need to reset them + var nonContentHeight, + minContentHeight, + maxContentHeight, + options = this.options + + // Reset content sizing + this.element.show().css({ + width: 'auto', + minHeight: 0, + maxHeight: 'none', + height: 0 + }) + + if (options.minWidth > options.width) { + options.width = options.minWidth + } + + // Reset wrapper sizing + // determine the height of all the non-content elements + nonContentHeight = this.uiDialog + .css({ + height: 'auto', + width: options.width + }) + .outerHeight() + minContentHeight = Math.max(0, options.minHeight - nonContentHeight) + maxContentHeight = + typeof options.maxHeight === 'number' + ? Math.max(0, options.maxHeight - nonContentHeight) + : 'none' + + if (options.height === 'auto') { + this.element.css({ + minHeight: minContentHeight, + maxHeight: maxContentHeight, + height: 'auto' + }) + } else { + this.element.height(Math.max(0, options.height - nonContentHeight)) + } + + if (this.uiDialog.is(':data(ui-resizable)')) { + this.uiDialog.resizable('option', 'minHeight', this._minHeight()) + } + }, + + _blockFrames: function () { + this.iframeBlocks = this.document.find('iframe').map(function () { + var iframe = $(this) + + return $('<div>') + .css({ + position: 'absolute', + width: iframe.outerWidth(), + height: iframe.outerHeight() + }) + .appendTo(iframe.parent()) + .offset(iframe.offset())[0] + }) + }, + + _unblockFrames: function () { + if (this.iframeBlocks) { + this.iframeBlocks.remove() + delete this.iframeBlocks + } + }, + + _allowInteraction: function (event) { + if ($(event.target).closest('.ui-dialog').length) { + return true + } + + // TODO: Remove hack when datepicker implements + // the .ui-front logic (#8989) + return !!$(event.target).closest('.ui-datepicker').length + }, + + _createOverlay: function () { + if (!this.options.modal) { + return + } + + // We use a delay in case the overlay is created from an + // event that we're going to be cancelling (#2804) + var isOpening = true + this._delay(function () { + isOpening = false + }) + + if (!this.document.data('ui-dialog-overlays')) { + // Prevent use of anchors and inputs + // Using _on() for an event handler shared across many instances is + // safe because the dialogs stack and must be closed in reverse order + this._on(this.document, { + focusin: function (event) { + if (isOpening) { + return + } + + if (!this._allowInteraction(event)) { + event.preventDefault() + this._trackingInstances()[0]._focusTabbable() + } + } + }) + } + + this.overlay = $('<div>').appendTo(this._appendTo()) + + this._addClass(this.overlay, null, 'ui-widget-overlay ui-front') + this._on(this.overlay, { + mousedown: '_keepFocus' + }) + this.document.data('ui-dialog-overlays', (this.document.data('ui-dialog-overlays') || 0) + 1) + }, + + _destroyOverlay: function () { + if (!this.options.modal) { + return + } + + if (this.overlay) { + var overlays = this.document.data('ui-dialog-overlays') - 1 + + if (!overlays) { + this._off(this.document, 'focusin') + this.document.removeData('ui-dialog-overlays') + } else { + this.document.data('ui-dialog-overlays', overlays) + } + + this.overlay.remove() + this.overlay = null + } + } + }) + + // DEPRECATED + // TODO: switch return back to widget declaration at top of file when this is removed + if ($.uiBackCompat !== false) { + // Backcompat for dialogClass option + $.widget('ui.dialog', $.ui.dialog, { + options: { + dialogClass: '' + }, + _createWrapper: function () { + this._super() + this.uiDialog.addClass(this.options.dialogClass) + }, + _setOption: function (key, value) { + if (key === 'dialogClass') { + this.uiDialog.removeClass(this.options.dialogClass).addClass(value) + } + this._superApply(arguments) + } + }) + } + + var widgetsDialog = $.ui.dialog + + /*! + * jQuery UI Droppable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Droppable + //>>group: Interactions + //>>description: Enables drop targets for draggable elements. + //>>docs: http://api.jqueryui.com/droppable/ + //>>demos: http://jqueryui.com/droppable/ + + $.widget('ui.droppable', { + version: '1.12.1', + widgetEventPrefix: 'drop', + options: { + accept: '*', + addClasses: true, + greedy: false, + scope: 'default', + tolerance: 'intersect', + + // Callbacks + activate: null, + deactivate: null, + drop: null, + out: null, + over: null + }, + _create: function () { + var proportions, + o = this.options, + accept = o.accept + + this.isover = false + this.isout = true + + this.accept = $.isFunction(accept) + ? accept + : function (d) { + return d.is(accept) + } + + this.proportions = function (/* valueToWrite */) { + if (arguments.length) { + // Store the droppable's proportions + proportions = arguments[0] + } else { + // Retrieve or derive the droppable's proportions + return proportions + ? proportions + : (proportions = { + width: this.element[0].offsetWidth, + height: this.element[0].offsetHeight + }) + } + } + + this._addToManager(o.scope) + + o.addClasses && this._addClass('ui-droppable') + }, + + _addToManager: function (scope) { + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[scope] = $.ui.ddmanager.droppables[scope] || [] + $.ui.ddmanager.droppables[scope].push(this) + }, + + _splice: function (drop) { + var i = 0 + for (; i < drop.length; i++) { + if (drop[i] === this) { + drop.splice(i, 1) + } + } + }, + + _destroy: function () { + var drop = $.ui.ddmanager.droppables[this.options.scope] + + this._splice(drop) + }, + + _setOption: function (key, value) { + if (key === 'accept') { + this.accept = $.isFunction(value) + ? value + : function (d) { + return d.is(value) + } + } else if (key === 'scope') { + var drop = $.ui.ddmanager.droppables[this.options.scope] + + this._splice(drop) + this._addToManager(value) + } + + this._super(key, value) + }, + + _activate: function (event) { + var draggable = $.ui.ddmanager.current + + this._addActiveClass() + if (draggable) { + this._trigger('activate', event, this.ui(draggable)) + } + }, + + _deactivate: function (event) { + var draggable = $.ui.ddmanager.current + + this._removeActiveClass() + if (draggable) { + this._trigger('deactivate', event, this.ui(draggable)) + } + }, + + _over: function (event) { + var draggable = $.ui.ddmanager.current + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return + } + + if (this.accept.call(this.element[0], draggable.currentItem || draggable.element)) { + this._addHoverClass() + this._trigger('over', event, this.ui(draggable)) + } + }, + + _out: function (event) { + var draggable = $.ui.ddmanager.current + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return + } + + if (this.accept.call(this.element[0], draggable.currentItem || draggable.element)) { + this._removeHoverClass() + this._trigger('out', event, this.ui(draggable)) + } + }, + + _drop: function (event, custom) { + var draggable = custom || $.ui.ddmanager.current, + childrenIntersection = false + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return false + } + + this.element + .find(':data(ui-droppable)') + .not('.ui-draggable-dragging') + .each(function () { + var inst = $(this).droppable('instance') + if ( + inst.options.greedy && + !inst.options.disabled && + inst.options.scope === draggable.options.scope && + inst.accept.call(inst.element[0], draggable.currentItem || draggable.element) && + intersect( + draggable, + $.extend(inst, { offset: inst.element.offset() }), + inst.options.tolerance, + event + ) + ) { + childrenIntersection = true + return false + } + }) + if (childrenIntersection) { + return false + } + + if (this.accept.call(this.element[0], draggable.currentItem || draggable.element)) { + this._removeActiveClass() + this._removeHoverClass() + + this._trigger('drop', event, this.ui(draggable)) + return this.element + } + + return false + }, + + ui: function (c) { + return { + draggable: c.currentItem || c.element, + helper: c.helper, + position: c.position, + offset: c.positionAbs + } + }, + + // Extension points just to make backcompat sane and avoid duplicating logic + // TODO: Remove in 1.13 along with call to it below + _addHoverClass: function () { + this._addClass('ui-droppable-hover') + }, + + _removeHoverClass: function () { + this._removeClass('ui-droppable-hover') + }, + + _addActiveClass: function () { + this._addClass('ui-droppable-active') + }, + + _removeActiveClass: function () { + this._removeClass('ui-droppable-active') + } + }) + + var intersect = ($.ui.intersect = (function () { + function isOverAxis(x, reference, size) { + return x >= reference && x < reference + size + } + + return function (draggable, droppable, toleranceMode, event) { + if (!droppable.offset) { + return false + } + + var x1 = (draggable.positionAbs || draggable.position.absolute).left + draggable.margins.left, + y1 = (draggable.positionAbs || draggable.position.absolute).top + draggable.margins.top, + x2 = x1 + draggable.helperProportions.width, + y2 = y1 + draggable.helperProportions.height, + l = droppable.offset.left, + t = droppable.offset.top, + r = l + droppable.proportions().width, + b = t + droppable.proportions().height + + switch (toleranceMode) { + case 'fit': + return l <= x1 && x2 <= r && t <= y1 && y2 <= b + case 'intersect': + return ( + l < x1 + draggable.helperProportions.width / 2 && // Right Half + x2 - draggable.helperProportions.width / 2 < r && // Left Half + t < y1 + draggable.helperProportions.height / 2 && // Bottom Half + y2 - draggable.helperProportions.height / 2 < b + ) // Top Half + case 'pointer': + return ( + isOverAxis(event.pageY, t, droppable.proportions().height) && + isOverAxis(event.pageX, l, droppable.proportions().width) + ) + case 'touch': + return ( + ((y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b)) && // Surrounded vertically + ((x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r)) // Surrounded horizontally + ) + default: + return false + } + } + })()) + + /* + This manager tracks offsets of draggables and droppables +*/ + $.ui.ddmanager = { + current: null, + droppables: { default: [] }, + prepareOffsets: function (t, event) { + var i, + j, + m = $.ui.ddmanager.droppables[t.options.scope] || [], + type = event ? event.type : null, // workaround for #2317 + list = (t.currentItem || t.element).find(':data(ui-droppable)').addBack() + + droppablesLoop: for (i = 0; i < m.length; i++) { + // No disabled and non-accepted + if ( + m[i].options.disabled || + (t && !m[i].accept.call(m[i].element[0], t.currentItem || t.element)) + ) { + continue + } + + // Filter out elements in the current dragged item + for (j = 0; j < list.length; j++) { + if (list[j] === m[i].element[0]) { + m[i].proportions().height = 0 + continue droppablesLoop + } + } + + m[i].visible = m[i].element.css('display') !== 'none' + if (!m[i].visible) { + continue + } + + // Activate the droppable if used directly from draggables + if (type === 'mousedown') { + m[i]._activate.call(m[i], event) + } + + m[i].offset = m[i].element.offset() + m[i].proportions({ + width: m[i].element[0].offsetWidth, + height: m[i].element[0].offsetHeight + }) + } + }, + drop: function (draggable, event) { + var dropped = false + + // Create a copy of the droppables in case the list changes during the drop (#9116) + $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function () { + if (!this.options) { + return + } + if ( + !this.options.disabled && + this.visible && + intersect(draggable, this, this.options.tolerance, event) + ) { + dropped = this._drop.call(this, event) || dropped + } + + if ( + !this.options.disabled && + this.visible && + this.accept.call(this.element[0], draggable.currentItem || draggable.element) + ) { + this.isout = true + this.isover = false + this._deactivate.call(this, event) + } + }) + return dropped + }, + dragStart: function (draggable, event) { + // Listen for scrolling so that if the dragging causes scrolling the position of the + // droppables can be recalculated (see #5003) + draggable.element.parentsUntil('body').on('scroll.droppable', function () { + if (!draggable.options.refreshPositions) { + $.ui.ddmanager.prepareOffsets(draggable, event) + } + }) + }, + drag: function (draggable, event) { + // If you have a highly dynamic page, you might try this option. It renders positions + // every time you move the mouse. + if (draggable.options.refreshPositions) { + $.ui.ddmanager.prepareOffsets(draggable, event) + } + + // Run through all droppables and check their positions based on specific tolerance options + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function () { + if (this.options.disabled || this.greedyChild || !this.visible) { + return + } + + var parentInstance, + scope, + parent, + intersects = intersect(draggable, this, this.options.tolerance, event), + c = !intersects && this.isover ? 'isout' : intersects && !this.isover ? 'isover' : null + if (!c) { + return + } + + if (this.options.greedy) { + // find droppable parents with same scope + scope = this.options.scope + parent = this.element.parents(':data(ui-droppable)').filter(function () { + return $(this).droppable('instance').options.scope === scope + }) + + if (parent.length) { + parentInstance = $(parent[0]).droppable('instance') + parentInstance.greedyChild = c === 'isover' + } + } + + // We just moved into a greedy child + if (parentInstance && c === 'isover') { + parentInstance.isover = false + parentInstance.isout = true + parentInstance._out.call(parentInstance, event) + } + + this[c] = true + this[c === 'isout' ? 'isover' : 'isout'] = false + this[c === 'isover' ? '_over' : '_out'].call(this, event) + + // We just moved out of a greedy child + if (parentInstance && c === 'isout') { + parentInstance.isout = false + parentInstance.isover = true + parentInstance._over.call(parentInstance, event) + } + }) + }, + dragStop: function (draggable, event) { + draggable.element.parentsUntil('body').off('scroll.droppable') + + // Call prepareOffsets one final time since IE does not fire return scroll events when + // overflow was caused by drag (see #5003) + if (!draggable.options.refreshPositions) { + $.ui.ddmanager.prepareOffsets(draggable, event) + } + } + } + + // DEPRECATED + // TODO: switch return back to widget declaration at top of file when this is removed + if ($.uiBackCompat !== false) { + // Backcompat for activeClass and hoverClass options + $.widget('ui.droppable', $.ui.droppable, { + options: { + hoverClass: false, + activeClass: false + }, + _addActiveClass: function () { + this._super() + if (this.options.activeClass) { + this.element.addClass(this.options.activeClass) + } + }, + _removeActiveClass: function () { + this._super() + if (this.options.activeClass) { + this.element.removeClass(this.options.activeClass) + } + }, + _addHoverClass: function () { + this._super() + if (this.options.hoverClass) { + this.element.addClass(this.options.hoverClass) + } + }, + _removeHoverClass: function () { + this._super() + if (this.options.hoverClass) { + this.element.removeClass(this.options.hoverClass) + } + } + }) + } + + var widgetsDroppable = $.ui.droppable + + /*! + * jQuery UI Progressbar 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Progressbar + //>>group: Widgets + // jscs:disable maximumLineLength + //>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators. + // jscs:enable maximumLineLength + //>>docs: http://api.jqueryui.com/progressbar/ + //>>demos: http://jqueryui.com/progressbar/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/progressbar.css + //>>css.theme: ../../themes/base/theme.css + + var widgetsProgressbar = $.widget('ui.progressbar', { + version: '1.12.1', + options: { + classes: { + 'ui-progressbar': 'ui-corner-all', + 'ui-progressbar-value': 'ui-corner-left', + 'ui-progressbar-complete': 'ui-corner-right' + }, + max: 100, + value: 0, + + change: null, + complete: null + }, + + min: 0, + + _create: function () { + // Constrain initial value + this.oldValue = this.options.value = this._constrainedValue() + + this.element.attr({ + // Only set static values; aria-valuenow and aria-valuemax are + // set inside _refreshValue() + role: 'progressbar', + 'aria-valuemin': this.min + }) + this._addClass('ui-progressbar', 'ui-widget ui-widget-content') + + this.valueDiv = $('<div>').appendTo(this.element) + this._addClass(this.valueDiv, 'ui-progressbar-value', 'ui-widget-header') + this._refreshValue() + }, + + _destroy: function () { + this.element.removeAttr('role aria-valuemin aria-valuemax aria-valuenow') + + this.valueDiv.remove() + }, + + value: function (newValue) { + if (newValue === undefined) { + return this.options.value + } + + this.options.value = this._constrainedValue(newValue) + this._refreshValue() + }, + + _constrainedValue: function (newValue) { + if (newValue === undefined) { + newValue = this.options.value + } + + this.indeterminate = newValue === false + + // Sanitize value + if (typeof newValue !== 'number') { + newValue = 0 + } + + return this.indeterminate ? false : Math.min(this.options.max, Math.max(this.min, newValue)) + }, + + _setOptions: function (options) { + // Ensure "value" option is set after other values (like max) + var value = options.value + delete options.value + + this._super(options) + + this.options.value = this._constrainedValue(value) + this._refreshValue() + }, + + _setOption: function (key, value) { + if (key === 'max') { + // Don't allow a max less than min + value = Math.max(this.min, value) + } + this._super(key, value) + }, + + _setOptionDisabled: function (value) { + this._super(value) + + this.element.attr('aria-disabled', value) + this._toggleClass(null, 'ui-state-disabled', !!value) + }, + + _percentage: function () { + return this.indeterminate + ? 100 + : (100 * (this.options.value - this.min)) / (this.options.max - this.min) + }, + + _refreshValue: function () { + var value = this.options.value, + percentage = this._percentage() + + this.valueDiv + .toggle(this.indeterminate || value > this.min) + .width(percentage.toFixed(0) + '%') + + this._toggleClass( + this.valueDiv, + 'ui-progressbar-complete', + null, + value === this.options.max + )._toggleClass('ui-progressbar-indeterminate', null, this.indeterminate) + + if (this.indeterminate) { + this.element.removeAttr('aria-valuenow') + if (!this.overlayDiv) { + this.overlayDiv = $('<div>').appendTo(this.valueDiv) + this._addClass(this.overlayDiv, 'ui-progressbar-overlay') + } + } else { + this.element.attr({ + 'aria-valuemax': this.options.max, + 'aria-valuenow': value + }) + if (this.overlayDiv) { + this.overlayDiv.remove() + this.overlayDiv = null + } + } + + if (this.oldValue !== value) { + this.oldValue = value + this._trigger('change') + } + if (value === this.options.max) { + this._trigger('complete') + } + } + }) + + /*! + * jQuery UI Selectable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Selectable + //>>group: Interactions + //>>description: Allows groups of elements to be selected with the mouse. + //>>docs: http://api.jqueryui.com/selectable/ + //>>demos: http://jqueryui.com/selectable/ + //>>css.structure: ../../themes/base/selectable.css + + var widgetsSelectable = $.widget('ui.selectable', $.ui.mouse, { + version: '1.12.1', + options: { + appendTo: 'body', + autoRefresh: true, + distance: 0, + filter: '*', + tolerance: 'touch', + + // Callbacks + selected: null, + selecting: null, + start: null, + stop: null, + unselected: null, + unselecting: null + }, + _create: function () { + var that = this + + this._addClass('ui-selectable') + + this.dragged = false + + // Cache selectee children based on filter + this.refresh = function () { + that.elementPos = $(that.element[0]).offset() + that.selectees = $(that.options.filter, that.element[0]) + that._addClass(that.selectees, 'ui-selectee') + that.selectees.each(function () { + var $this = $(this), + selecteeOffset = $this.offset(), + pos = { + left: selecteeOffset.left - that.elementPos.left, + top: selecteeOffset.top - that.elementPos.top + } + $.data(this, 'selectable-item', { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.outerWidth(), + bottom: pos.top + $this.outerHeight(), + startselected: false, + selected: $this.hasClass('ui-selected'), + selecting: $this.hasClass('ui-selecting'), + unselecting: $this.hasClass('ui-unselecting') + }) + }) + } + this.refresh() + + this._mouseInit() + + this.helper = $('<div>') + this._addClass(this.helper, 'ui-selectable-helper') + }, + + _destroy: function () { + this.selectees.removeData('selectable-item') + this._mouseDestroy() + }, + + _mouseStart: function (event) { + var that = this, + options = this.options + + this.opos = [event.pageX, event.pageY] + this.elementPos = $(this.element[0]).offset() + + if (this.options.disabled) { + return + } + + this.selectees = $(options.filter, this.element[0]) + + this._trigger('start', event) + + $(options.appendTo).append(this.helper) + + // position helper (lasso) + this.helper.css({ + left: event.pageX, + top: event.pageY, + width: 0, + height: 0 + }) + + if (options.autoRefresh) { + this.refresh() + } + + this.selectees.filter('.ui-selected').each(function () { + var selectee = $.data(this, 'selectable-item') + selectee.startselected = true + if (!event.metaKey && !event.ctrlKey) { + that._removeClass(selectee.$element, 'ui-selected') + selectee.selected = false + that._addClass(selectee.$element, 'ui-unselecting') + selectee.unselecting = true + + // selectable UNSELECTING callback + that._trigger('unselecting', event, { + unselecting: selectee.element + }) + } + }) + + $(event.target) + .parents() + .addBack() + .each(function () { + var doSelect, + selectee = $.data(this, 'selectable-item') + if (selectee) { + doSelect = + (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected') + that + ._removeClass(selectee.$element, doSelect ? 'ui-unselecting' : 'ui-selected') + ._addClass(selectee.$element, doSelect ? 'ui-selecting' : 'ui-unselecting') + selectee.unselecting = !doSelect + selectee.selecting = doSelect + selectee.selected = doSelect + + // selectable (UN)SELECTING callback + if (doSelect) { + that._trigger('selecting', event, { + selecting: selectee.element + }) + } else { + that._trigger('unselecting', event, { + unselecting: selectee.element + }) + } + return false + } + }) + }, + + _mouseDrag: function (event) { + this.dragged = true + + if (this.options.disabled) { + return + } + + var tmp, + that = this, + options = this.options, + x1 = this.opos[0], + y1 = this.opos[1], + x2 = event.pageX, + y2 = event.pageY + + if (x1 > x2) { + tmp = x2 + x2 = x1 + x1 = tmp + } + if (y1 > y2) { + tmp = y2 + y2 = y1 + y1 = tmp + } + this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 }) + + this.selectees.each(function () { + var selectee = $.data(this, 'selectable-item'), + hit = false, + offset = {} + + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element === that.element[0]) { + return + } + + offset.left = selectee.left + that.elementPos.left + offset.right = selectee.right + that.elementPos.left + offset.top = selectee.top + that.elementPos.top + offset.bottom = selectee.bottom + that.elementPos.top + + if (options.tolerance === 'touch') { + hit = !(offset.left > x2 || offset.right < x1 || offset.top > y2 || offset.bottom < y1) + } else if (options.tolerance === 'fit') { + hit = offset.left > x1 && offset.right < x2 && offset.top > y1 && offset.bottom < y2 + } + + if (hit) { + // SELECT + if (selectee.selected) { + that._removeClass(selectee.$element, 'ui-selected') + selectee.selected = false + } + if (selectee.unselecting) { + that._removeClass(selectee.$element, 'ui-unselecting') + selectee.unselecting = false + } + if (!selectee.selecting) { + that._addClass(selectee.$element, 'ui-selecting') + selectee.selecting = true + + // selectable SELECTING callback + that._trigger('selecting', event, { + selecting: selectee.element + }) + } + } else { + // UNSELECT + if (selectee.selecting) { + if ((event.metaKey || event.ctrlKey) && selectee.startselected) { + that._removeClass(selectee.$element, 'ui-selecting') + selectee.selecting = false + that._addClass(selectee.$element, 'ui-selected') + selectee.selected = true + } else { + that._removeClass(selectee.$element, 'ui-selecting') + selectee.selecting = false + if (selectee.startselected) { + that._addClass(selectee.$element, 'ui-unselecting') + selectee.unselecting = true + } + + // selectable UNSELECTING callback + that._trigger('unselecting', event, { + unselecting: selectee.element + }) + } + } + if (selectee.selected) { + if (!event.metaKey && !event.ctrlKey && !selectee.startselected) { + that._removeClass(selectee.$element, 'ui-selected') + selectee.selected = false + + that._addClass(selectee.$element, 'ui-unselecting') + selectee.unselecting = true + + // selectable UNSELECTING callback + that._trigger('unselecting', event, { + unselecting: selectee.element + }) + } + } + } + }) + + return false + }, + + _mouseStop: function (event) { + var that = this + + this.dragged = false + + $('.ui-unselecting', this.element[0]).each(function () { + var selectee = $.data(this, 'selectable-item') + that._removeClass(selectee.$element, 'ui-unselecting') + selectee.unselecting = false + selectee.startselected = false + that._trigger('unselected', event, { + unselected: selectee.element + }) + }) + $('.ui-selecting', this.element[0]).each(function () { + var selectee = $.data(this, 'selectable-item') + that + ._removeClass(selectee.$element, 'ui-selecting') + ._addClass(selectee.$element, 'ui-selected') + selectee.selecting = false + selectee.selected = true + selectee.startselected = true + that._trigger('selected', event, { + selected: selectee.element + }) + }) + this._trigger('stop', event) + + this.helper.remove() + + return false + } + }) + + /*! + * jQuery UI Selectmenu 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Selectmenu + //>>group: Widgets + // jscs:disable maximumLineLength + //>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select. + // jscs:enable maximumLineLength + //>>docs: http://api.jqueryui.com/selectmenu/ + //>>demos: http://jqueryui.com/selectmenu/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css + //>>css.theme: ../../themes/base/theme.css + + var widgetsSelectmenu = $.widget('ui.selectmenu', [ + $.ui.formResetMixin, + { + version: '1.12.1', + defaultElement: '<select>', + options: { + appendTo: null, + classes: { + 'ui-selectmenu-button-open': 'ui-corner-top', + 'ui-selectmenu-button-closed': 'ui-corner-all' + }, + disabled: null, + icons: { + button: 'ui-icon-triangle-1-s' + }, + position: { + my: 'left top', + at: 'left bottom', + collision: 'none' + }, + width: false, + + // Callbacks + change: null, + close: null, + focus: null, + open: null, + select: null + }, + + _create: function () { + var selectmenuId = this.element.uniqueId().attr('id') + this.ids = { + element: selectmenuId, + button: selectmenuId + '-button', + menu: selectmenuId + '-menu' + } + + this._drawButton() + this._drawMenu() + this._bindFormResetHandler() + + this._rendered = false + this.menuItems = $() + }, + + _drawButton: function () { + var icon, + that = this, + item = this._parseOption( + this.element.find('option:selected'), + this.element[0].selectedIndex + ) + + // Associate existing label with the new button + this.labels = this.element.labels().attr('for', this.ids.button) + this._on(this.labels, { + click: function (event) { + this.button.focus() + event.preventDefault() + } + }) + + // Hide original select element + this.element.hide() + + // Create button + this.button = $('<span>', { + tabindex: this.options.disabled ? -1 : 0, + id: this.ids.button, + role: 'combobox', + 'aria-expanded': 'false', + 'aria-autocomplete': 'list', + 'aria-owns': this.ids.menu, + 'aria-haspopup': 'true', + title: this.element.attr('title') + }).insertAfter(this.element) + + this._addClass( + this.button, + 'ui-selectmenu-button ui-selectmenu-button-closed', + 'ui-button ui-widget' + ) + + icon = $('<span>').appendTo(this.button) + this._addClass(icon, 'ui-selectmenu-icon', 'ui-icon ' + this.options.icons.button) + this.buttonItem = this._renderButtonItem(item).appendTo(this.button) + + if (this.options.width !== false) { + this._resizeButton() + } + + this._on(this.button, this._buttonEvents) + this.button.one('focusin', function () { + // Delay rendering the menu items until the button receives focus. + // The menu may have already been rendered via a programmatic open. + if (!that._rendered) { + that._refreshMenu() + } + }) + }, + + _drawMenu: function () { + var that = this + + // Create menu + this.menu = $('<ul>', { + 'aria-hidden': 'true', + 'aria-labelledby': this.ids.button, + id: this.ids.menu + }) + + // Wrap menu + this.menuWrap = $('<div>').append(this.menu) + this._addClass(this.menuWrap, 'ui-selectmenu-menu', 'ui-front') + this.menuWrap.appendTo(this._appendTo()) + + // Initialize menu widget + this.menuInstance = this.menu + .menu({ + classes: { + 'ui-menu': 'ui-corner-bottom' + }, + role: 'listbox', + select: function (event, ui) { + event.preventDefault() + + // Support: IE8 + // If the item was selected via a click, the text selection + // will be destroyed in IE + that._setSelection() + + that._select(ui.item.data('ui-selectmenu-item'), event) + }, + focus: function (event, ui) { + var item = ui.item.data('ui-selectmenu-item') + + // Prevent inital focus from firing and check if its a newly focused item + if (that.focusIndex != null && item.index !== that.focusIndex) { + that._trigger('focus', event, { item: item }) + if (!that.isOpen) { + that._select(item, event) + } + } + that.focusIndex = item.index + + that.button.attr('aria-activedescendant', that.menuItems.eq(item.index).attr('id')) + } + }) + .menu('instance') + + // Don't close the menu on mouseleave + this.menuInstance._off(this.menu, 'mouseleave') + + // Cancel the menu's collapseAll on document click + this.menuInstance._closeOnDocumentClick = function () { + return false + } + + // Selects often contain empty items, but never contain dividers + this.menuInstance._isDivider = function () { + return false + } + }, + + refresh: function () { + this._refreshMenu() + this.buttonItem.replaceWith( + (this.buttonItem = this._renderButtonItem( + // Fall back to an empty object in case there are no options + this._getSelectedItem().data('ui-selectmenu-item') || {} + )) + ) + if (this.options.width === null) { + this._resizeButton() + } + }, + + _refreshMenu: function () { + var item, + options = this.element.find('option') + + this.menu.empty() + + this._parseOptions(options) + this._renderMenu(this.menu, this.items) + + this.menuInstance.refresh() + this.menuItems = this.menu + .find('li') + .not('.ui-selectmenu-optgroup') + .find('.ui-menu-item-wrapper') + + this._rendered = true + + if (!options.length) { + return + } + + item = this._getSelectedItem() + + // Update the menu to have the correct item focused + this.menuInstance.focus(null, item) + this._setAria(item.data('ui-selectmenu-item')) + + // Set disabled state + this._setOption('disabled', this.element.prop('disabled')) + }, + + open: function (event) { + if (this.options.disabled) { + return + } + + // If this is the first time the menu is being opened, render the items + if (!this._rendered) { + this._refreshMenu() + } else { + // Menu clears focus on close, reset focus to selected item + this._removeClass(this.menu.find('.ui-state-active'), null, 'ui-state-active') + this.menuInstance.focus(null, this._getSelectedItem()) + } + + // If there are no options, don't open the menu + if (!this.menuItems.length) { + return + } + + this.isOpen = true + this._toggleAttr() + this._resizeMenu() + this._position() + + this._on(this.document, this._documentClick) + + this._trigger('open', event) + }, + + _position: function () { + this.menuWrap.position($.extend({ of: this.button }, this.options.position)) + }, + + close: function (event) { + if (!this.isOpen) { + return + } + + this.isOpen = false + this._toggleAttr() + + this.range = null + this._off(this.document) + + this._trigger('close', event) + }, + + widget: function () { + return this.button + }, + + menuWidget: function () { + return this.menu + }, + + _renderButtonItem: function (item) { + var buttonItem = $('<span>') + + this._setText(buttonItem, item.label) + this._addClass(buttonItem, 'ui-selectmenu-text') + + return buttonItem + }, + + _renderMenu: function (ul, items) { + var that = this, + currentOptgroup = '' + + $.each(items, function (index, item) { + var li + + if (item.optgroup !== currentOptgroup) { + li = $('<li>', { + text: item.optgroup + }) + that._addClass( + li, + 'ui-selectmenu-optgroup', + 'ui-menu-divider' + + (item.element.parent('optgroup').prop('disabled') ? ' ui-state-disabled' : '') + ) + + li.appendTo(ul) + + currentOptgroup = item.optgroup + } + + that._renderItemData(ul, item) + }) + }, + + _renderItemData: function (ul, item) { + return this._renderItem(ul, item).data('ui-selectmenu-item', item) + }, + + _renderItem: function (ul, item) { + var li = $('<li>'), + wrapper = $('<div>', { + title: item.element.attr('title') + }) + + if (item.disabled) { + this._addClass(li, null, 'ui-state-disabled') + } + this._setText(wrapper, item.label) + + return li.append(wrapper).appendTo(ul) + }, + + _setText: function (element, value) { + if (value) { + element.text(value) + } else { + element.html(' ') + } + }, + + _move: function (direction, event) { + var item, + next, + filter = '.ui-menu-item' + + if (this.isOpen) { + item = this.menuItems.eq(this.focusIndex).parent('li') + } else { + item = this.menuItems.eq(this.element[0].selectedIndex).parent('li') + filter += ':not(.ui-state-disabled)' + } + + if (direction === 'first' || direction === 'last') { + next = item[direction === 'first' ? 'prevAll' : 'nextAll'](filter).eq(-1) + } else { + next = item[direction + 'All'](filter).eq(0) + } + + if (next.length) { + this.menuInstance.focus(event, next) + } + }, + + _getSelectedItem: function () { + return this.menuItems.eq(this.element[0].selectedIndex).parent('li') + }, + + _toggle: function (event) { + this[this.isOpen ? 'close' : 'open'](event) + }, + + _setSelection: function () { + var selection + + if (!this.range) { + return + } + + if (window.getSelection) { + selection = window.getSelection() + selection.removeAllRanges() + selection.addRange(this.range) + + // Support: IE8 + } else { + this.range.select() + } + + // Support: IE + // Setting the text selection kills the button focus in IE, but + // restoring the focus doesn't kill the selection. + this.button.focus() + }, + + _documentClick: { + mousedown: function (event) { + if (!this.isOpen) { + return + } + + if ( + !$(event.target).closest( + '.ui-selectmenu-menu, #' + $.ui.escapeSelector(this.ids.button) + ).length + ) { + this.close(event) + } + } + }, + + _buttonEvents: { + // Prevent text selection from being reset when interacting with the selectmenu (#10144) + mousedown: function () { + var selection + + if (window.getSelection) { + selection = window.getSelection() + if (selection.rangeCount) { + this.range = selection.getRangeAt(0) + } + + // Support: IE8 + } else { + this.range = document.selection.createRange() + } + }, + + click: function (event) { + this._setSelection() + this._toggle(event) + }, + + keydown: function (event) { + var preventDefault = true + switch (event.keyCode) { + case $.ui.keyCode.TAB: + case $.ui.keyCode.ESCAPE: + this.close(event) + preventDefault = false + break + case $.ui.keyCode.ENTER: + if (this.isOpen) { + this._selectFocusedItem(event) + } + break + case $.ui.keyCode.UP: + if (event.altKey) { + this._toggle(event) + } else { + this._move('prev', event) + } + break + case $.ui.keyCode.DOWN: + if (event.altKey) { + this._toggle(event) + } else { + this._move('next', event) + } + break + case $.ui.keyCode.SPACE: + if (this.isOpen) { + this._selectFocusedItem(event) + } else { + this._toggle(event) + } + break + case $.ui.keyCode.LEFT: + this._move('prev', event) + break + case $.ui.keyCode.RIGHT: + this._move('next', event) + break + case $.ui.keyCode.HOME: + case $.ui.keyCode.PAGE_UP: + this._move('first', event) + break + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_DOWN: + this._move('last', event) + break + default: + this.menu.trigger(event) + preventDefault = false + } + + if (preventDefault) { + event.preventDefault() + } + } + }, + + _selectFocusedItem: function (event) { + var item = this.menuItems.eq(this.focusIndex).parent('li') + if (!item.hasClass('ui-state-disabled')) { + this._select(item.data('ui-selectmenu-item'), event) + } + }, + + _select: function (item, event) { + var oldIndex = this.element[0].selectedIndex + + // Change native select element + this.element[0].selectedIndex = item.index + this.buttonItem.replaceWith((this.buttonItem = this._renderButtonItem(item))) + this._setAria(item) + this._trigger('select', event, { item: item }) + + if (item.index !== oldIndex) { + this._trigger('change', event, { item: item }) + } + + this.close(event) + }, + + _setAria: function (item) { + var id = this.menuItems.eq(item.index).attr('id') + + this.button.attr({ + 'aria-labelledby': id, + 'aria-activedescendant': id + }) + this.menu.attr('aria-activedescendant', id) + }, + + _setOption: function (key, value) { + if (key === 'icons') { + var icon = this.button.find('span.ui-icon') + this._removeClass(icon, null, this.options.icons.button)._addClass( + icon, + null, + value.button + ) + } + + this._super(key, value) + + if (key === 'appendTo') { + this.menuWrap.appendTo(this._appendTo()) + } + + if (key === 'width') { + this._resizeButton() + } + }, + + _setOptionDisabled: function (value) { + this._super(value) + + this.menuInstance.option('disabled', value) + this.button.attr('aria-disabled', value) + this._toggleClass(this.button, null, 'ui-state-disabled', value) + + this.element.prop('disabled', value) + if (value) { + this.button.attr('tabindex', -1) + this.close() + } else { + this.button.attr('tabindex', 0) + } + }, + + _appendTo: function () { + var element = this.options.appendTo + + if (element) { + element = + element.jquery || element.nodeType ? $(element) : this.document.find(element).eq(0) + } + + if (!element || !element[0]) { + element = this.element.closest('.ui-front, dialog') + } + + if (!element.length) { + element = this.document[0].body + } + + return element + }, + + _toggleAttr: function () { + this.button.attr('aria-expanded', this.isOpen) + + // We can't use two _toggleClass() calls here, because we need to make sure + // we always remove classes first and add them second, otherwise if both classes have the + // same theme class, it will be removed after we add it. + this._removeClass(this.button, 'ui-selectmenu-button-' + (this.isOpen ? 'closed' : 'open')) + ._addClass(this.button, 'ui-selectmenu-button-' + (this.isOpen ? 'open' : 'closed')) + ._toggleClass(this.menuWrap, 'ui-selectmenu-open', null, this.isOpen) + + this.menu.attr('aria-hidden', !this.isOpen) + }, + + _resizeButton: function () { + var width = this.options.width + + // For `width: false`, just remove inline style and stop + if (width === false) { + this.button.css('width', '') + return + } + + // For `width: null`, match the width of the original element + if (width === null) { + width = this.element.show().outerWidth() + this.element.hide() + } + + this.button.outerWidth(width) + }, + + _resizeMenu: function () { + this.menu.outerWidth( + Math.max( + this.button.outerWidth(), + + // Support: IE10 + // IE10 wraps long text (possibly a rounding bug) + // so we add 1px to avoid the wrapping + this.menu.width('').outerWidth() + 1 + ) + ) + }, + + _getCreateOptions: function () { + var options = this._super() + + options.disabled = this.element.prop('disabled') + + return options + }, + + _parseOptions: function (options) { + var that = this, + data = [] + options.each(function (index, item) { + data.push(that._parseOption($(item), index)) + }) + this.items = data + }, + + _parseOption: function (option, index) { + var optgroup = option.parent('optgroup') + + return { + element: option, + index: index, + value: option.val(), + label: option.text(), + optgroup: optgroup.attr('label') || '', + disabled: optgroup.prop('disabled') || option.prop('disabled') + } + }, + + _destroy: function () { + this._unbindFormResetHandler() + this.menuWrap.remove() + this.button.remove() + this.element.show() + this.element.removeUniqueId() + this.labels.attr('for', this.ids.element) + } + } + ]) + + /*! + * jQuery UI Slider 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Slider + //>>group: Widgets + //>>description: Displays a flexible slider with ranges and accessibility via keyboard. + //>>docs: http://api.jqueryui.com/slider/ + //>>demos: http://jqueryui.com/slider/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/slider.css + //>>css.theme: ../../themes/base/theme.css + + var widgetsSlider = $.widget('ui.slider', $.ui.mouse, { + version: '1.12.1', + widgetEventPrefix: 'slide', + + options: { + animate: false, + classes: { + 'ui-slider': 'ui-corner-all', + 'ui-slider-handle': 'ui-corner-all', + + // Note: ui-widget-header isn't the most fittingly semantic framework class for this + // element, but worked best visually with a variety of themes + 'ui-slider-range': 'ui-corner-all ui-widget-header' + }, + distance: 0, + max: 100, + min: 0, + orientation: 'horizontal', + range: false, + step: 1, + value: 0, + values: null, + + // Callbacks + change: null, + slide: null, + start: null, + stop: null + }, + + // Number of pages in a slider + // (how many times can you page up/down to go through the whole range) + numPages: 5, + + _create: function () { + this._keySliding = false + this._mouseSliding = false + this._animateOff = true + this._handleIndex = null + this._detectOrientation() + this._mouseInit() + this._calculateNewMax() + + this._addClass('ui-slider ui-slider-' + this.orientation, 'ui-widget ui-widget-content') + + this._refresh() + + this._animateOff = false + }, + + _refresh: function () { + this._createRange() + this._createHandles() + this._setupEvents() + this._refreshValue() + }, + + _createHandles: function () { + var i, + handleCount, + options = this.options, + existingHandles = this.element.find('.ui-slider-handle'), + handle = "<span tabindex='0'></span>", + handles = [] + + handleCount = (options.values && options.values.length) || 1 + + if (existingHandles.length > handleCount) { + existingHandles.slice(handleCount).remove() + existingHandles = existingHandles.slice(0, handleCount) + } + + for (i = existingHandles.length; i < handleCount; i++) { + handles.push(handle) + } + + this.handles = existingHandles.add($(handles.join('')).appendTo(this.element)) + + this._addClass(this.handles, 'ui-slider-handle', 'ui-state-default') + + this.handle = this.handles.eq(0) + + this.handles.each(function (i) { + $(this).data('ui-slider-handle-index', i).attr('tabIndex', 0) + }) + }, + + _createRange: function () { + var options = this.options + + if (options.range) { + if (options.range === true) { + if (!options.values) { + options.values = [this._valueMin(), this._valueMin()] + } else if (options.values.length && options.values.length !== 2) { + options.values = [options.values[0], options.values[0]] + } else if ($.isArray(options.values)) { + options.values = options.values.slice(0) + } + } + + if (!this.range || !this.range.length) { + this.range = $('<div>').appendTo(this.element) + + this._addClass(this.range, 'ui-slider-range') + } else { + this._removeClass(this.range, 'ui-slider-range-min ui-slider-range-max') + + // Handle range switching from true to min/max + this.range.css({ + left: '', + bottom: '' + }) + } + if (options.range === 'min' || options.range === 'max') { + this._addClass(this.range, 'ui-slider-range-' + options.range) + } + } else { + if (this.range) { + this.range.remove() + } + this.range = null + } + }, + + _setupEvents: function () { + this._off(this.handles) + this._on(this.handles, this._handleEvents) + this._hoverable(this.handles) + this._focusable(this.handles) + }, + + _destroy: function () { + this.handles.remove() + if (this.range) { + this.range.remove() + } + + this._mouseDestroy() + }, + + _mouseCapture: function (event) { + var position, + normValue, + distance, + closestHandle, + index, + allowed, + offset, + mouseOverHandle, + that = this, + o = this.options + + if (o.disabled) { + return false + } + + this.elementSize = { + width: this.element.outerWidth(), + height: this.element.outerHeight() + } + this.elementOffset = this.element.offset() + + position = { x: event.pageX, y: event.pageY } + normValue = this._normValueFromMouse(position) + distance = this._valueMax() - this._valueMin() + 1 + this.handles.each(function (i) { + var thisDistance = Math.abs(normValue - that.values(i)) + if ( + distance > thisDistance || + (distance === thisDistance && (i === that._lastChangedValue || that.values(i) === o.min)) + ) { + distance = thisDistance + closestHandle = $(this) + index = i + } + }) + + allowed = this._start(event, index) + if (allowed === false) { + return false + } + this._mouseSliding = true + + this._handleIndex = index + + this._addClass(closestHandle, null, 'ui-state-active') + closestHandle.trigger('focus') + + offset = closestHandle.offset() + mouseOverHandle = !$(event.target).parents().addBack().is('.ui-slider-handle') + this._clickOffset = mouseOverHandle + ? { left: 0, top: 0 } + : { + left: event.pageX - offset.left - closestHandle.width() / 2, + top: + event.pageY - + offset.top - + closestHandle.height() / 2 - + (parseInt(closestHandle.css('borderTopWidth'), 10) || 0) - + (parseInt(closestHandle.css('borderBottomWidth'), 10) || 0) + + (parseInt(closestHandle.css('marginTop'), 10) || 0) + } + + if (!this.handles.hasClass('ui-state-hover')) { + this._slide(event, index, normValue) + } + this._animateOff = true + return true + }, + + _mouseStart: function () { + return true + }, + + _mouseDrag: function (event) { + var position = { x: event.pageX, y: event.pageY }, + normValue = this._normValueFromMouse(position) + + this._slide(event, this._handleIndex, normValue) + + return false + }, + + _mouseStop: function (event) { + this._removeClass(this.handles, null, 'ui-state-active') + this._mouseSliding = false + + this._stop(event, this._handleIndex) + this._change(event, this._handleIndex) + + this._handleIndex = null + this._clickOffset = null + this._animateOff = false + + return false + }, + + _detectOrientation: function () { + this.orientation = this.options.orientation === 'vertical' ? 'vertical' : 'horizontal' + }, + + _normValueFromMouse: function (position) { + var pixelTotal, pixelMouse, percentMouse, valueTotal, valueMouse + + if (this.orientation === 'horizontal') { + pixelTotal = this.elementSize.width + pixelMouse = + position.x - this.elementOffset.left - (this._clickOffset ? this._clickOffset.left : 0) + } else { + pixelTotal = this.elementSize.height + pixelMouse = + position.y - this.elementOffset.top - (this._clickOffset ? this._clickOffset.top : 0) + } + + percentMouse = pixelMouse / pixelTotal + if (percentMouse > 1) { + percentMouse = 1 + } + if (percentMouse < 0) { + percentMouse = 0 + } + if (this.orientation === 'vertical') { + percentMouse = 1 - percentMouse + } + + valueTotal = this._valueMax() - this._valueMin() + valueMouse = this._valueMin() + percentMouse * valueTotal + + return this._trimAlignValue(valueMouse) + }, + + _uiHash: function (index, value, values) { + var uiHash = { + handle: this.handles[index], + handleIndex: index, + value: value !== undefined ? value : this.value() + } + + if (this._hasMultipleValues()) { + uiHash.value = value !== undefined ? value : this.values(index) + uiHash.values = values || this.values() + } + + return uiHash + }, + + _hasMultipleValues: function () { + return this.options.values && this.options.values.length + }, + + _start: function (event, index) { + return this._trigger('start', event, this._uiHash(index)) + }, + + _slide: function (event, index, newVal) { + var allowed, + otherVal, + currentValue = this.value(), + newValues = this.values() + + if (this._hasMultipleValues()) { + otherVal = this.values(index ? 0 : 1) + currentValue = this.values(index) + + if (this.options.values.length === 2 && this.options.range === true) { + newVal = index === 0 ? Math.min(otherVal, newVal) : Math.max(otherVal, newVal) + } + + newValues[index] = newVal + } + + if (newVal === currentValue) { + return + } + + allowed = this._trigger('slide', event, this._uiHash(index, newVal, newValues)) + + // A slide can be canceled by returning false from the slide callback + if (allowed === false) { + return + } + + if (this._hasMultipleValues()) { + this.values(index, newVal) + } else { + this.value(newVal) + } + }, + + _stop: function (event, index) { + this._trigger('stop', event, this._uiHash(index)) + }, + + _change: function (event, index) { + if (!this._keySliding && !this._mouseSliding) { + //store the last changed value index for reference when handles overlap + this._lastChangedValue = index + this._trigger('change', event, this._uiHash(index)) + } + }, + + value: function (newValue) { + if (arguments.length) { + this.options.value = this._trimAlignValue(newValue) + this._refreshValue() + this._change(null, 0) + return + } + + return this._value() + }, + + values: function (index, newValue) { + var vals, newValues, i + + if (arguments.length > 1) { + this.options.values[index] = this._trimAlignValue(newValue) + this._refreshValue() + this._change(null, index) + return + } + + if (arguments.length) { + if ($.isArray(arguments[0])) { + vals = this.options.values + newValues = arguments[0] + for (i = 0; i < vals.length; i += 1) { + vals[i] = this._trimAlignValue(newValues[i]) + this._change(null, i) + } + this._refreshValue() + } else { + if (this._hasMultipleValues()) { + return this._values(index) + } else { + return this.value() + } + } + } else { + return this._values() + } + }, + + _setOption: function (key, value) { + var i, + valsLength = 0 + + if (key === 'range' && this.options.range === true) { + if (value === 'min') { + this.options.value = this._values(0) + this.options.values = null + } else if (value === 'max') { + this.options.value = this._values(this.options.values.length - 1) + this.options.values = null + } + } + + if ($.isArray(this.options.values)) { + valsLength = this.options.values.length + } + + this._super(key, value) + + switch (key) { + case 'orientation': + this._detectOrientation() + this._removeClass('ui-slider-horizontal ui-slider-vertical')._addClass( + 'ui-slider-' + this.orientation + ) + this._refreshValue() + if (this.options.range) { + this._refreshRange(value) + } + + // Reset positioning from previous orientation + this.handles.css(value === 'horizontal' ? 'bottom' : 'left', '') + break + case 'value': + this._animateOff = true + this._refreshValue() + this._change(null, 0) + this._animateOff = false + break + case 'values': + this._animateOff = true + this._refreshValue() + + // Start from the last handle to prevent unreachable handles (#9046) + for (i = valsLength - 1; i >= 0; i--) { + this._change(null, i) + } + this._animateOff = false + break + case 'step': + case 'min': + case 'max': + this._animateOff = true + this._calculateNewMax() + this._refreshValue() + this._animateOff = false + break + case 'range': + this._animateOff = true + this._refresh() + this._animateOff = false + break + } + }, + + _setOptionDisabled: function (value) { + this._super(value) + + this._toggleClass(null, 'ui-state-disabled', !!value) + }, + + //internal value getter + // _value() returns value trimmed by min and max, aligned by step + _value: function () { + var val = this.options.value + val = this._trimAlignValue(val) + + return val + }, + + //internal values getter + // _values() returns array of values trimmed by min and max, aligned by step + // _values( index ) returns single value trimmed by min and max, aligned by step + _values: function (index) { + var val, vals, i + + if (arguments.length) { + val = this.options.values[index] + val = this._trimAlignValue(val) + + return val + } else if (this._hasMultipleValues()) { + // .slice() creates a copy of the array + // this copy gets trimmed by min and max and then returned + vals = this.options.values.slice() + for (i = 0; i < vals.length; i += 1) { + vals[i] = this._trimAlignValue(vals[i]) + } + + return vals + } else { + return [] + } + }, + + // Returns the step-aligned value that val is closest to, between (inclusive) min and max + _trimAlignValue: function (val) { + if (val <= this._valueMin()) { + return this._valueMin() + } + if (val >= this._valueMax()) { + return this._valueMax() + } + var step = this.options.step > 0 ? this.options.step : 1, + valModStep = (val - this._valueMin()) % step, + alignValue = val - valModStep + + if (Math.abs(valModStep) * 2 >= step) { + alignValue += valModStep > 0 ? step : -step + } + + // Since JavaScript has problems with large floats, round + // the final value to 5 digits after the decimal point (see #4124) + return parseFloat(alignValue.toFixed(5)) + }, + + _calculateNewMax: function () { + var max = this.options.max, + min = this._valueMin(), + step = this.options.step, + aboveMin = Math.round((max - min) / step) * step + max = aboveMin + min + if (max > this.options.max) { + //If max is not divisible by step, rounding off may increase its value + max -= step + } + this.max = parseFloat(max.toFixed(this._precision())) + }, + + _precision: function () { + var precision = this._precisionOf(this.options.step) + if (this.options.min !== null) { + precision = Math.max(precision, this._precisionOf(this.options.min)) + } + return precision + }, + + _precisionOf: function (num) { + var str = num.toString(), + decimal = str.indexOf('.') + return decimal === -1 ? 0 : str.length - decimal - 1 + }, + + _valueMin: function () { + return this.options.min + }, + + _valueMax: function () { + return this.max + }, + + _refreshRange: function (orientation) { + if (orientation === 'vertical') { + this.range.css({ width: '', left: '' }) + } + if (orientation === 'horizontal') { + this.range.css({ height: '', bottom: '' }) + } + }, + + _refreshValue: function () { + var lastValPercent, + valPercent, + value, + valueMin, + valueMax, + oRange = this.options.range, + o = this.options, + that = this, + animate = !this._animateOff ? o.animate : false, + _set = {} + + if (this._hasMultipleValues()) { + this.handles.each(function (i) { + valPercent = + ((that.values(i) - that._valueMin()) / (that._valueMax() - that._valueMin())) * 100 + _set[that.orientation === 'horizontal' ? 'left' : 'bottom'] = valPercent + '%' + $(this).stop(1, 1)[animate ? 'animate' : 'css'](_set, o.animate) + if (that.options.range === true) { + if (that.orientation === 'horizontal') { + if (i === 0) { + that.range.stop(1, 1)[animate ? 'animate' : 'css']( + { + left: valPercent + '%' + }, + o.animate + ) + } + if (i === 1) { + that.range[animate ? 'animate' : 'css']( + { + width: valPercent - lastValPercent + '%' + }, + { + queue: false, + duration: o.animate + } + ) + } + } else { + if (i === 0) { + that.range.stop(1, 1)[animate ? 'animate' : 'css']( + { + bottom: valPercent + '%' + }, + o.animate + ) + } + if (i === 1) { + that.range[animate ? 'animate' : 'css']( + { + height: valPercent - lastValPercent + '%' + }, + { + queue: false, + duration: o.animate + } + ) + } + } + } + lastValPercent = valPercent + }) + } else { + value = this.value() + valueMin = this._valueMin() + valueMax = this._valueMax() + valPercent = valueMax !== valueMin ? ((value - valueMin) / (valueMax - valueMin)) * 100 : 0 + _set[this.orientation === 'horizontal' ? 'left' : 'bottom'] = valPercent + '%' + this.handle.stop(1, 1)[animate ? 'animate' : 'css'](_set, o.animate) + + if (oRange === 'min' && this.orientation === 'horizontal') { + this.range.stop(1, 1)[animate ? 'animate' : 'css']( + { + width: valPercent + '%' + }, + o.animate + ) + } + if (oRange === 'max' && this.orientation === 'horizontal') { + this.range.stop(1, 1)[animate ? 'animate' : 'css']( + { + width: 100 - valPercent + '%' + }, + o.animate + ) + } + if (oRange === 'min' && this.orientation === 'vertical') { + this.range.stop(1, 1)[animate ? 'animate' : 'css']( + { + height: valPercent + '%' + }, + o.animate + ) + } + if (oRange === 'max' && this.orientation === 'vertical') { + this.range.stop(1, 1)[animate ? 'animate' : 'css']( + { + height: 100 - valPercent + '%' + }, + o.animate + ) + } + } + }, + + _handleEvents: { + keydown: function (event) { + var allowed, + curVal, + newVal, + step, + index = $(event.target).data('ui-slider-handle-index') + + switch (event.keyCode) { + case $.ui.keyCode.HOME: + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_UP: + case $.ui.keyCode.PAGE_DOWN: + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + event.preventDefault() + if (!this._keySliding) { + this._keySliding = true + this._addClass($(event.target), null, 'ui-state-active') + allowed = this._start(event, index) + if (allowed === false) { + return + } + } + break + } + + step = this.options.step + if (this._hasMultipleValues()) { + curVal = newVal = this.values(index) + } else { + curVal = newVal = this.value() + } + + switch (event.keyCode) { + case $.ui.keyCode.HOME: + newVal = this._valueMin() + break + case $.ui.keyCode.END: + newVal = this._valueMax() + break + case $.ui.keyCode.PAGE_UP: + newVal = this._trimAlignValue( + curVal + (this._valueMax() - this._valueMin()) / this.numPages + ) + break + case $.ui.keyCode.PAGE_DOWN: + newVal = this._trimAlignValue( + curVal - (this._valueMax() - this._valueMin()) / this.numPages + ) + break + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + if (curVal === this._valueMax()) { + return + } + newVal = this._trimAlignValue(curVal + step) + break + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + if (curVal === this._valueMin()) { + return + } + newVal = this._trimAlignValue(curVal - step) + break + } + + this._slide(event, index, newVal) + }, + keyup: function (event) { + var index = $(event.target).data('ui-slider-handle-index') + + if (this._keySliding) { + this._keySliding = false + this._stop(event, index) + this._change(event, index) + this._removeClass($(event.target), null, 'ui-state-active') + } + } + } + }) + + /*! + * jQuery UI Sortable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Sortable + //>>group: Interactions + //>>description: Enables items in a list to be sorted using the mouse. + //>>docs: http://api.jqueryui.com/sortable/ + //>>demos: http://jqueryui.com/sortable/ + //>>css.structure: ../../themes/base/sortable.css + + var widgetsSortable = $.widget('ui.sortable', $.ui.mouse, { + version: '1.12.1', + widgetEventPrefix: 'sort', + ready: false, + options: { + appendTo: 'parent', + axis: false, + connectWith: false, + containment: false, + cursor: 'auto', + cursorAt: false, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: 'original', + items: '> *', + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: 'default', + tolerance: 'intersect', + zIndex: 1000, + + // Callbacks + activate: null, + beforeStop: null, + change: null, + deactivate: null, + out: null, + over: null, + receive: null, + remove: null, + sort: null, + start: null, + stop: null, + update: null + }, + + _isOverAxis: function (x, reference, size) { + return x >= reference && x < reference + size + }, + + _isFloating: function (item) { + return /left|right/.test(item.css('float')) || /inline|table-cell/.test(item.css('display')) + }, + + _create: function () { + this.containerCache = {} + this._addClass('ui-sortable') + + //Get the items + this.refresh() + + //Let's determine the parent's offset + this.offset = this.element.offset() + + //Initialize mouse events for interaction + this._mouseInit() + + this._setHandleClassName() + + //We're ready to go + this.ready = true + }, + + _setOption: function (key, value) { + this._super(key, value) + + if (key === 'handle') { + this._setHandleClassName() + } + }, + + _setHandleClassName: function () { + var that = this + this._removeClass(this.element.find('.ui-sortable-handle'), 'ui-sortable-handle') + $.each(this.items, function () { + that._addClass( + this.instance.options.handle ? this.item.find(this.instance.options.handle) : this.item, + 'ui-sortable-handle' + ) + }) + }, + + _destroy: function () { + this._mouseDestroy() + + for (var i = this.items.length - 1; i >= 0; i--) { + this.items[i].item.removeData(this.widgetName + '-item') + } + + return this + }, + + _mouseCapture: function (event, overrideHandle) { + var currentItem = null, + validHandle = false, + that = this + + if (this.reverting) { + return false + } + + if (this.options.disabled || this.options.type === 'static') { + return false + } + + //We have to refresh the items data once first + this._refreshItems(event) + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + $(event.target) + .parents() + .each(function () { + if ($.data(this, that.widgetName + '-item') === that) { + currentItem = $(this) + return false + } + }) + if ($.data(event.target, that.widgetName + '-item') === that) { + currentItem = $(event.target) + } + + if (!currentItem) { + return false + } + if (this.options.handle && !overrideHandle) { + $(this.options.handle, currentItem) + .find('*') + .addBack() + .each(function () { + if (this === event.target) { + validHandle = true + } + }) + if (!validHandle) { + return false + } + } + + this.currentItem = currentItem + this._removeCurrentsFromItems() + return true + }, + + _mouseStart: function (event, overrideHandle, noActivation) { + var i, + body, + o = this.options + + this.currentContainer = this + + //We only need to call refreshPositions, because the refreshItems call has been moved to + // mouseCapture + this.refreshPositions() + + //Create and append the visible helper + this.helper = this._createHelper(event) + + //Cache the helper size + this._cacheHelperProportions() + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins() + + //Get the next scrolling parent + this.scrollParent = this.helper.scrollParent() + + //The element's absolute position on the page minus margins + this.offset = this.currentItem.offset() + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + } + + $.extend(this.offset, { + click: { + //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + + // This is a relative to absolute position minus the actual position calculation - + // only used for relative positioned helper + relative: this._getRelativeOffset() + }) + + // Only after we got the offset, we can change the helper's position to absolute + // TODO: Still need to figure out a way to make relative sorting possible + this.helper.css('position', 'absolute') + this.cssPosition = this.helper.css('position') + + //Generate the original position + this.originalPosition = this._generatePosition(event) + this.originalPageX = event.pageX + this.originalPageY = event.pageY + + //Adjust the mouse offset relative to the helper if "cursorAt" is supplied + o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt) + + //Cache the former DOM position + this.domPosition = { + prev: this.currentItem.prev()[0], + parent: this.currentItem.parent()[0] + } + + // If the helper is not the original, hide the original so it's not playing any role during + // the drag, won't cause anything bad this way + if (this.helper[0] !== this.currentItem[0]) { + this.currentItem.hide() + } + + //Create the placeholder + this._createPlaceholder() + + //Set a containment if given in the options + if (o.containment) { + this._setContainment() + } + + if (o.cursor && o.cursor !== 'auto') { + // cursor option + body = this.document.find('body') + + // Support: IE + this.storedCursor = body.css('cursor') + body.css('cursor', o.cursor) + + this.storedStylesheet = $( + '<style>*{ cursor: ' + o.cursor + ' !important; }</style>' + ).appendTo(body) + } + + if (o.opacity) { + // opacity option + if (this.helper.css('opacity')) { + this._storedOpacity = this.helper.css('opacity') + } + this.helper.css('opacity', o.opacity) + } + + if (o.zIndex) { + // zIndex option + if (this.helper.css('zIndex')) { + this._storedZIndex = this.helper.css('zIndex') + } + this.helper.css('zIndex', o.zIndex) + } + + //Prepare scrolling + if (this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== 'HTML') { + this.overflowOffset = this.scrollParent.offset() + } + + //Call callbacks + this._trigger('start', event, this._uiHash()) + + //Recache the helper size + if (!this._preserveHelperProportions) { + this._cacheHelperProportions() + } + + //Post "activate" events to possible containers + if (!noActivation) { + for (i = this.containers.length - 1; i >= 0; i--) { + this.containers[i]._trigger('activate', event, this._uiHash(this)) + } + } + + //Prepare possible droppables + if ($.ui.ddmanager) { + $.ui.ddmanager.current = this + } + + if ($.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event) + } + + this.dragging = true + + this._addClass(this.helper, 'ui-sortable-helper') + + // Execute the drag once - this causes the helper not to be visiblebefore getting its + // correct position + this._mouseDrag(event) + return true + }, + + _mouseDrag: function (event) { + var i, + item, + itemElement, + intersection, + o = this.options, + scrolled = false + + //Compute the helpers position + this.position = this._generatePosition(event) + this.positionAbs = this._convertPositionTo('absolute') + + if (!this.lastPositionAbs) { + this.lastPositionAbs = this.positionAbs + } + + //Do scrolling + if (this.options.scroll) { + if (this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== 'HTML') { + if ( + this.overflowOffset.top + this.scrollParent[0].offsetHeight - event.pageY < + o.scrollSensitivity + ) { + this.scrollParent[0].scrollTop = scrolled = + this.scrollParent[0].scrollTop + o.scrollSpeed + } else if (event.pageY - this.overflowOffset.top < o.scrollSensitivity) { + this.scrollParent[0].scrollTop = scrolled = + this.scrollParent[0].scrollTop - o.scrollSpeed + } + + if ( + this.overflowOffset.left + this.scrollParent[0].offsetWidth - event.pageX < + o.scrollSensitivity + ) { + this.scrollParent[0].scrollLeft = scrolled = + this.scrollParent[0].scrollLeft + o.scrollSpeed + } else if (event.pageX - this.overflowOffset.left < o.scrollSensitivity) { + this.scrollParent[0].scrollLeft = scrolled = + this.scrollParent[0].scrollLeft - o.scrollSpeed + } + } else { + if (event.pageY - this.document.scrollTop() < o.scrollSensitivity) { + scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed) + } else if ( + this.window.height() - (event.pageY - this.document.scrollTop()) < + o.scrollSensitivity + ) { + scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed) + } + + if (event.pageX - this.document.scrollLeft() < o.scrollSensitivity) { + scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed) + } else if ( + this.window.width() - (event.pageX - this.document.scrollLeft()) < + o.scrollSensitivity + ) { + scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed) + } + } + + if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event) + } + } + + //Regenerate the absolute position used for position checks + this.positionAbs = this._convertPositionTo('absolute') + + //Set the helper position + if (!this.options.axis || this.options.axis !== 'y') { + this.helper[0].style.left = this.position.left + 'px' + } + if (!this.options.axis || this.options.axis !== 'x') { + this.helper[0].style.top = this.position.top + 'px' + } + + //Rearrange + for (i = this.items.length - 1; i >= 0; i--) { + //Cache variables and intersection, continue if no intersection + item = this.items[i] + itemElement = item.item[0] + intersection = this._intersectsWithPointer(item) + if (!intersection) { + continue + } + + // Only put the placeholder inside the current Container, skip all + // items from other containers. This works because when moving + // an item from one container to another the + // currentContainer is switched before the placeholder is moved. + // + // Without this, moving items in "sub-sortables" can cause + // the placeholder to jitter between the outer and inner container. + if (item.instance !== this.currentContainer) { + continue + } + + // Cannot intersect with itself + // no useless actions that have been done before + // no action if the item moved is the parent of the item checked + if ( + itemElement !== this.currentItem[0] && + this.placeholder[intersection === 1 ? 'next' : 'prev']()[0] !== itemElement && + !$.contains(this.placeholder[0], itemElement) && + (this.options.type === 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true) + ) { + this.direction = intersection === 1 ? 'down' : 'up' + + if (this.options.tolerance === 'pointer' || this._intersectsWithSides(item)) { + this._rearrange(event, item) + } else { + break + } + + this._trigger('change', event, this._uiHash()) + break + } + } + + //Post events to containers + this._contactContainers(event) + + //Interconnect with droppables + if ($.ui.ddmanager) { + $.ui.ddmanager.drag(this, event) + } + + //Call callbacks + this._trigger('sort', event, this._uiHash()) + + this.lastPositionAbs = this.positionAbs + return false + }, + + _mouseStop: function (event, noPropagation) { + if (!event) { + return + } + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) { + $.ui.ddmanager.drop(this, event) + } + + if (this.options.revert) { + var that = this, + cur = this.placeholder.offset(), + axis = this.options.axis, + animation = {} + + if (!axis || axis === 'x') { + animation.left = + cur.left - + this.offset.parent.left - + this.margins.left + + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft) + } + if (!axis || axis === 'y') { + animation.top = + cur.top - + this.offset.parent.top - + this.margins.top + + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop) + } + this.reverting = true + $(this.helper).animate(animation, parseInt(this.options.revert, 10) || 500, function () { + that._clear(event) + }) + } else { + this._clear(event, noPropagation) + } + + return false + }, + + cancel: function () { + if (this.dragging) { + this._mouseUp(new $.Event('mouseup', { target: null })) + + if (this.options.helper === 'original') { + this.currentItem.css(this._storedCSS) + this._removeClass(this.currentItem, 'ui-sortable-helper') + } else { + this.currentItem.show() + } + + //Post deactivating events to containers + for (var i = this.containers.length - 1; i >= 0; i--) { + this.containers[i]._trigger('deactivate', null, this._uiHash(this)) + if (this.containers[i].containerCache.over) { + this.containers[i]._trigger('out', null, this._uiHash(this)) + this.containers[i].containerCache.over = 0 + } + } + } + + if (this.placeholder) { + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, + // it unbinds ALL events from the original node! + if (this.placeholder[0].parentNode) { + this.placeholder[0].parentNode.removeChild(this.placeholder[0]) + } + if (this.options.helper !== 'original' && this.helper && this.helper[0].parentNode) { + this.helper.remove() + } + + $.extend(this, { + helper: null, + dragging: false, + reverting: false, + _noFinalSort: null + }) + + if (this.domPosition.prev) { + $(this.domPosition.prev).after(this.currentItem) + } else { + $(this.domPosition.parent).prepend(this.currentItem) + } + } + + return this + }, + + serialize: function (o) { + var items = this._getItemsAsjQuery(o && o.connected), + str = [] + o = o || {} + + $(items).each(function () { + var res = ($(o.item || this).attr(o.attribute || 'id') || '').match( + o.expression || /(.+)[\-=_](.+)/ + ) + if (res) { + str.push((o.key || res[1] + '[]') + '=' + (o.key && o.expression ? res[1] : res[2])) + } + }) + + if (!str.length && o.key) { + str.push(o.key + '=') + } + + return str.join('&') + }, + + toArray: function (o) { + var items = this._getItemsAsjQuery(o && o.connected), + ret = [] + + o = o || {} + + items.each(function () { + ret.push($(o.item || this).attr(o.attribute || 'id') || '') + }) + return ret + }, + + /* Be careful with the following core functions */ + _intersectsWith: function (item) { + var x1 = this.positionAbs.left, + x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, + y2 = y1 + this.helperProportions.height, + l = item.left, + r = l + item.width, + t = item.top, + b = t + item.height, + dyClick = this.offset.click.top, + dxClick = this.offset.click.left, + isOverElementHeight = this.options.axis === 'x' || (y1 + dyClick > t && y1 + dyClick < b), + isOverElementWidth = this.options.axis === 'y' || (x1 + dxClick > l && x1 + dxClick < r), + isOverElement = isOverElementHeight && isOverElementWidth + + if ( + this.options.tolerance === 'pointer' || + this.options.forcePointerForContainers || + (this.options.tolerance !== 'pointer' && + this.helperProportions[this.floating ? 'width' : 'height'] > + item[this.floating ? 'width' : 'height']) + ) { + return isOverElement + } else { + return ( + l < x1 + this.helperProportions.width / 2 && // Right Half + x2 - this.helperProportions.width / 2 < r && // Left Half + t < y1 + this.helperProportions.height / 2 && // Bottom Half + y2 - this.helperProportions.height / 2 < b + ) // Top Half + } + }, + + _intersectsWithPointer: function (item) { + var verticalDirection, + horizontalDirection, + isOverElementHeight = + this.options.axis === 'x' || + this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), + isOverElementWidth = + this.options.axis === 'y' || + this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), + isOverElement = isOverElementHeight && isOverElementWidth + + if (!isOverElement) { + return false + } + + verticalDirection = this._getDragVerticalDirection() + horizontalDirection = this._getDragHorizontalDirection() + + return this.floating + ? horizontalDirection === 'right' || verticalDirection === 'down' + ? 2 + : 1 + : verticalDirection && (verticalDirection === 'down' ? 2 : 1) + }, + + _intersectsWithSides: function (item) { + var isOverBottomHalf = this._isOverAxis( + this.positionAbs.top + this.offset.click.top, + item.top + item.height / 2, + item.height + ), + isOverRightHalf = this._isOverAxis( + this.positionAbs.left + this.offset.click.left, + item.left + item.width / 2, + item.width + ), + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection() + + if (this.floating && horizontalDirection) { + return ( + (horizontalDirection === 'right' && isOverRightHalf) || + (horizontalDirection === 'left' && !isOverRightHalf) + ) + } else { + return ( + verticalDirection && + ((verticalDirection === 'down' && isOverBottomHalf) || + (verticalDirection === 'up' && !isOverBottomHalf)) + ) + } + }, + + _getDragVerticalDirection: function () { + var delta = this.positionAbs.top - this.lastPositionAbs.top + return delta !== 0 && (delta > 0 ? 'down' : 'up') + }, + + _getDragHorizontalDirection: function () { + var delta = this.positionAbs.left - this.lastPositionAbs.left + return delta !== 0 && (delta > 0 ? 'right' : 'left') + }, + + refresh: function (event) { + this._refreshItems(event) + this._setHandleClassName() + this.refreshPositions() + return this + }, + + _connectWith: function () { + var options = this.options + return options.connectWith.constructor === String + ? [options.connectWith] + : options.connectWith + }, + + _getItemsAsjQuery: function (connected) { + var i, + j, + cur, + inst, + items = [], + queries = [], + connectWith = this._connectWith() + + if (connectWith && connected) { + for (i = connectWith.length - 1; i >= 0; i--) { + cur = $(connectWith[i], this.document[0]) + for (j = cur.length - 1; j >= 0; j--) { + inst = $.data(cur[j], this.widgetFullName) + if (inst && inst !== this && !inst.options.disabled) { + queries.push([ + $.isFunction(inst.options.items) + ? inst.options.items.call(inst.element) + : $(inst.options.items, inst.element) + .not('.ui-sortable-helper') + .not('.ui-sortable-placeholder'), + inst + ]) + } + } + } + } + + queries.push([ + $.isFunction(this.options.items) + ? this.options.items.call(this.element, null, { + options: this.options, + item: this.currentItem + }) + : $(this.options.items, this.element) + .not('.ui-sortable-helper') + .not('.ui-sortable-placeholder'), + this + ]) + + function addItems() { + items.push(this) + } + for (i = queries.length - 1; i >= 0; i--) { + queries[i][0].each(addItems) + } + + return $(items) + }, + + _removeCurrentsFromItems: function () { + var list = this.currentItem.find(':data(' + this.widgetName + '-item)') + + this.items = $.grep(this.items, function (item) { + for (var j = 0; j < list.length; j++) { + if (list[j] === item.item[0]) { + return false + } + } + return true + }) + }, + + _refreshItems: function (event) { + this.items = [] + this.containers = [this] + + var i, + j, + cur, + inst, + targetData, + _queries, + item, + queriesLength, + items = this.items, + queries = [ + [ + $.isFunction(this.options.items) + ? this.options.items.call(this.element[0], event, { item: this.currentItem }) + : $(this.options.items, this.element), + this + ] + ], + connectWith = this._connectWith() + + //Shouldn't be run the first time through due to massive slow-down + if (connectWith && this.ready) { + for (i = connectWith.length - 1; i >= 0; i--) { + cur = $(connectWith[i], this.document[0]) + for (j = cur.length - 1; j >= 0; j--) { + inst = $.data(cur[j], this.widgetFullName) + if (inst && inst !== this && !inst.options.disabled) { + queries.push([ + $.isFunction(inst.options.items) + ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) + : $(inst.options.items, inst.element), + inst + ]) + this.containers.push(inst) + } + } + } + } + + for (i = queries.length - 1; i >= 0; i--) { + targetData = queries[i][1] + _queries = queries[i][0] + + for (j = 0, queriesLength = _queries.length; j < queriesLength; j++) { + item = $(_queries[j]) + + // Data for target checking (mouse manager) + item.data(this.widgetName + '-item', targetData) + + items.push({ + item: item, + instance: targetData, + width: 0, + height: 0, + left: 0, + top: 0 + }) + } + } + }, + + refreshPositions: function (fast) { + // Determine whether items are being displayed horizontally + this.floating = this.items.length + ? this.options.axis === 'x' || this._isFloating(this.items[0].item) + : false + + //This has to be redone because due to the item being moved out/into the offsetParent, + // the offsetParent's position will change + if (this.offsetParent && this.helper) { + this.offset.parent = this._getParentOffset() + } + + var i, item, t, p + + for (i = this.items.length - 1; i >= 0; i--) { + item = this.items[i] + + //We ignore calculating positions of all connected containers when we're not over them + if ( + item.instance !== this.currentContainer && + this.currentContainer && + item.item[0] !== this.currentItem[0] + ) { + continue + } + + t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item + + if (!fast) { + item.width = t.outerWidth() + item.height = t.outerHeight() + } + + p = t.offset() + item.left = p.left + item.top = p.top + } + + if (this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this) + } else { + for (i = this.containers.length - 1; i >= 0; i--) { + p = this.containers[i].element.offset() + this.containers[i].containerCache.left = p.left + this.containers[i].containerCache.top = p.top + this.containers[i].containerCache.width = this.containers[i].element.outerWidth() + this.containers[i].containerCache.height = this.containers[i].element.outerHeight() + } + } + + return this + }, + + _createPlaceholder: function (that) { + that = that || this + var className, + o = that.options + + if (!o.placeholder || o.placeholder.constructor === String) { + className = o.placeholder + o.placeholder = { + element: function () { + var nodeName = that.currentItem[0].nodeName.toLowerCase(), + element = $('<' + nodeName + '>', that.document[0]) + + that + ._addClass( + element, + 'ui-sortable-placeholder', + className || that.currentItem[0].className + ) + ._removeClass(element, 'ui-sortable-helper') + + if (nodeName === 'tbody') { + that._createTrPlaceholder( + that.currentItem.find('tr').eq(0), + $('<tr>', that.document[0]).appendTo(element) + ) + } else if (nodeName === 'tr') { + that._createTrPlaceholder(that.currentItem, element) + } else if (nodeName === 'img') { + element.attr('src', that.currentItem.attr('src')) + } + + if (!className) { + element.css('visibility', 'hidden') + } + + return element + }, + update: function (container, p) { + // 1. If a className is set as 'placeholder option, we don't force sizes - + // the class is responsible for that + // 2. The option 'forcePlaceholderSize can be enabled to force it even if a + // class name is specified + if (className && !o.forcePlaceholderSize) { + return + } + + //If the element doesn't have a actual height by itself (without styles coming + // from a stylesheet), it receives the inline height from the dragged item + if (!p.height()) { + p.height( + that.currentItem.innerHeight() - + parseInt(that.currentItem.css('paddingTop') || 0, 10) - + parseInt(that.currentItem.css('paddingBottom') || 0, 10) + ) + } + if (!p.width()) { + p.width( + that.currentItem.innerWidth() - + parseInt(that.currentItem.css('paddingLeft') || 0, 10) - + parseInt(that.currentItem.css('paddingRight') || 0, 10) + ) + } + } + } + } + + //Create the placeholder + that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem)) + + //Append it after the actual current item + that.currentItem.after(that.placeholder) + + //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) + o.placeholder.update(that, that.placeholder) + }, + + _createTrPlaceholder: function (sourceTr, targetTr) { + var that = this + + sourceTr.children().each(function () { + $('<td> </td>', that.document[0]) + .attr('colspan', $(this).attr('colspan') || 1) + .appendTo(targetTr) + }) + }, + + _contactContainers: function (event) { + var i, + j, + dist, + itemWithLeastDistance, + posProperty, + sizeProperty, + cur, + nearBottom, + floating, + axis, + innermostContainer = null, + innermostIndex = null + + // Get innermost container that intersects with item + for (i = this.containers.length - 1; i >= 0; i--) { + // Never consider a container that's located within the item itself + if ($.contains(this.currentItem[0], this.containers[i].element[0])) { + continue + } + + if (this._intersectsWith(this.containers[i].containerCache)) { + // If we've already found a container and it's more "inner" than this, then continue + if ( + innermostContainer && + $.contains(this.containers[i].element[0], innermostContainer.element[0]) + ) { + continue + } + + innermostContainer = this.containers[i] + innermostIndex = i + } else { + // container doesn't intersect. trigger "out" event if necessary + if (this.containers[i].containerCache.over) { + this.containers[i]._trigger('out', event, this._uiHash(this)) + this.containers[i].containerCache.over = 0 + } + } + } + + // If no intersecting containers found, return + if (!innermostContainer) { + return + } + + // Move the item into the container if it's not there already + if (this.containers.length === 1) { + if (!this.containers[innermostIndex].containerCache.over) { + this.containers[innermostIndex]._trigger('over', event, this._uiHash(this)) + this.containers[innermostIndex].containerCache.over = 1 + } + } else { + // When entering a new container, we will find the item with the least distance and + // append our item near it + dist = 10000 + itemWithLeastDistance = null + floating = innermostContainer.floating || this._isFloating(this.currentItem) + posProperty = floating ? 'left' : 'top' + sizeProperty = floating ? 'width' : 'height' + axis = floating ? 'pageX' : 'pageY' + + for (j = this.items.length - 1; j >= 0; j--) { + if (!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) { + continue + } + if (this.items[j].item[0] === this.currentItem[0]) { + continue + } + + cur = this.items[j].item.offset()[posProperty] + nearBottom = false + if (event[axis] - cur > this.items[j][sizeProperty] / 2) { + nearBottom = true + } + + if (Math.abs(event[axis] - cur) < dist) { + dist = Math.abs(event[axis] - cur) + itemWithLeastDistance = this.items[j] + this.direction = nearBottom ? 'up' : 'down' + } + } + + //Check if dropOnEmpty is enabled + if (!itemWithLeastDistance && !this.options.dropOnEmpty) { + return + } + + if (this.currentContainer === this.containers[innermostIndex]) { + if (!this.currentContainer.containerCache.over) { + this.containers[innermostIndex]._trigger('over', event, this._uiHash()) + this.currentContainer.containerCache.over = 1 + } + return + } + + itemWithLeastDistance + ? this._rearrange(event, itemWithLeastDistance, null, true) + : this._rearrange(event, null, this.containers[innermostIndex].element, true) + this._trigger('change', event, this._uiHash()) + this.containers[innermostIndex]._trigger('change', event, this._uiHash(this)) + this.currentContainer = this.containers[innermostIndex] + + //Update the placeholder + this.options.placeholder.update(this.currentContainer, this.placeholder) + + this.containers[innermostIndex]._trigger('over', event, this._uiHash(this)) + this.containers[innermostIndex].containerCache.over = 1 + } + }, + + _createHelper: function (event) { + var o = this.options, + helper = $.isFunction(o.helper) + ? $(o.helper.apply(this.element[0], [event, this.currentItem])) + : o.helper === 'clone' + ? this.currentItem.clone() + : this.currentItem + + //Add the helper to the DOM if that didn't happen already + if (!helper.parents('body').length) { + $(o.appendTo !== 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild( + helper[0] + ) + } + + if (helper[0] === this.currentItem[0]) { + this._storedCSS = { + width: this.currentItem[0].style.width, + height: this.currentItem[0].style.height, + position: this.currentItem.css('position'), + top: this.currentItem.css('top'), + left: this.currentItem.css('left') + } + } + + if (!helper[0].style.width || o.forceHelperSize) { + helper.width(this.currentItem.width()) + } + if (!helper[0].style.height || o.forceHelperSize) { + helper.height(this.currentItem.height()) + } + + return helper + }, + + _adjustOffsetFromHelper: function (obj) { + if (typeof obj === 'string') { + obj = obj.split(' ') + } + if ($.isArray(obj)) { + obj = { left: +obj[0], top: +obj[1] || 0 } + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top + } + }, + + _getParentOffset: function () { + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent() + var po = this.offsetParent.offset() + + // This is a special case where we need to modify a offset calculated on start, since the + // following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the + // next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't + // the document, which means that the scroll is included in the initial calculation of the + // offset of the parent, and never recalculated upon drag + if ( + this.cssPosition === 'absolute' && + this.scrollParent[0] !== this.document[0] && + $.contains(this.scrollParent[0], this.offsetParent[0]) + ) { + po.left += this.scrollParent.scrollLeft() + po.top += this.scrollParent.scrollTop() + } + + // This needs to be actually done for all browsers, since pageX/pageY includes this + // information with an ugly IE fix + if ( + this.offsetParent[0] === this.document[0].body || + (this.offsetParent[0].tagName && + this.offsetParent[0].tagName.toLowerCase() === 'html' && + $.ui.ie) + ) { + po = { top: 0, left: 0 } + } + + return { + top: po.top + (parseInt(this.offsetParent.css('borderTopWidth'), 10) || 0), + left: po.left + (parseInt(this.offsetParent.css('borderLeftWidth'), 10) || 0) + } + }, + + _getRelativeOffset: function () { + if (this.cssPosition === 'relative') { + var p = this.currentItem.position() + return { + top: p.top - (parseInt(this.helper.css('top'), 10) || 0) + this.scrollParent.scrollTop(), + left: + p.left - (parseInt(this.helper.css('left'), 10) || 0) + this.scrollParent.scrollLeft() + } + } else { + return { top: 0, left: 0 } + } + }, + + _cacheMargins: function () { + this.margins = { + left: parseInt(this.currentItem.css('marginLeft'), 10) || 0, + top: parseInt(this.currentItem.css('marginTop'), 10) || 0 + } + }, + + _cacheHelperProportions: function () { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + } + }, + + _setContainment: function () { + var ce, + co, + over, + o = this.options + if (o.containment === 'parent') { + o.containment = this.helper[0].parentNode + } + if (o.containment === 'document' || o.containment === 'window') { + this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + o.containment === 'document' + ? this.document.width() + : this.window.width() - this.helperProportions.width - this.margins.left, + (o.containment === 'document' + ? this.document.height() || document.body.parentNode.scrollHeight + : this.window.height() || this.document[0].body.parentNode.scrollHeight) - + this.helperProportions.height - + this.margins.top + ] + } + + if (!/^(document|window|parent)$/.test(o.containment)) { + ce = $(o.containment)[0] + co = $(o.containment).offset() + over = $(ce).css('overflow') !== 'hidden' + + this.containment = [ + co.left + + (parseInt($(ce).css('borderLeftWidth'), 10) || 0) + + (parseInt($(ce).css('paddingLeft'), 10) || 0) - + this.margins.left, + co.top + + (parseInt($(ce).css('borderTopWidth'), 10) || 0) + + (parseInt($(ce).css('paddingTop'), 10) || 0) - + this.margins.top, + co.left + + (over ? Math.max(ce.scrollWidth, ce.offsetWidth) : ce.offsetWidth) - + (parseInt($(ce).css('borderLeftWidth'), 10) || 0) - + (parseInt($(ce).css('paddingRight'), 10) || 0) - + this.helperProportions.width - + this.margins.left, + co.top + + (over ? Math.max(ce.scrollHeight, ce.offsetHeight) : ce.offsetHeight) - + (parseInt($(ce).css('borderTopWidth'), 10) || 0) - + (parseInt($(ce).css('paddingBottom'), 10) || 0) - + this.helperProportions.height - + this.margins.top + ] + } + }, + + _convertPositionTo: function (d, pos) { + if (!pos) { + pos = this.position + } + var mod = d === 'absolute' ? 1 : -1, + scroll = + this.cssPosition === 'absolute' && + !( + this.scrollParent[0] !== this.document[0] && + $.contains(this.scrollParent[0], this.offsetParent[0]) + ) + ? this.offsetParent + : this.scrollParent, + scrollIsRootNode = /(html|body)/i.test(scroll[0].tagName) + + return { + top: + // The absolute mouse position + pos.top + + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.top * mod + + // The offsetParent's offset without borders (offset + border) + this.offset.parent.top * mod - + (this.cssPosition === 'fixed' + ? -this.scrollParent.scrollTop() + : scrollIsRootNode + ? 0 + : scroll.scrollTop()) * + mod, + left: + // The absolute mouse position + pos.left + + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.left * mod + + // The offsetParent's offset without borders (offset + border) + this.offset.parent.left * mod - + (this.cssPosition === 'fixed' + ? -this.scrollParent.scrollLeft() + : scrollIsRootNode + ? 0 + : scroll.scrollLeft()) * + mod + } + }, + + _generatePosition: function (event) { + var top, + left, + o = this.options, + pageX = event.pageX, + pageY = event.pageY, + scroll = + this.cssPosition === 'absolute' && + !( + this.scrollParent[0] !== this.document[0] && + $.contains(this.scrollParent[0], this.offsetParent[0]) + ) + ? this.offsetParent + : this.scrollParent, + scrollIsRootNode = /(html|body)/i.test(scroll[0].tagName) + + // This is another very weird special case that only happens for relative elements: + // 1. If the css position is relative + // 2. and the scroll parent is the document or similar to the offset parent + // we have to refresh the relative offset during the scroll so there are no jumps + if ( + this.cssPosition === 'relative' && + !( + this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0] + ) + ) { + this.offset.relative = this._getRelativeOffset() + } + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if (this.originalPosition) { + //If we are not dragging yet, we won't check for options + + if (this.containment) { + if (event.pageX - this.offset.click.left < this.containment[0]) { + pageX = this.containment[0] + this.offset.click.left + } + if (event.pageY - this.offset.click.top < this.containment[1]) { + pageY = this.containment[1] + this.offset.click.top + } + if (event.pageX - this.offset.click.left > this.containment[2]) { + pageX = this.containment[2] + this.offset.click.left + } + if (event.pageY - this.offset.click.top > this.containment[3]) { + pageY = this.containment[3] + this.offset.click.top + } + } + + if (o.grid) { + top = + this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] + pageY = this.containment + ? top - this.offset.click.top >= this.containment[1] && + top - this.offset.click.top <= this.containment[3] + ? top + : top - this.offset.click.top >= this.containment[1] + ? top - o.grid[1] + : top + o.grid[1] + : top + + left = + this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] + pageX = this.containment + ? left - this.offset.click.left >= this.containment[0] && + left - this.offset.click.left <= this.containment[2] + ? left + : left - this.offset.click.left >= this.containment[0] + ? left - o.grid[0] + : left + o.grid[0] + : left + } + } + + return { + top: + // The absolute mouse position + pageY - + // Click offset (relative to the element) + this.offset.click.top - + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.top - + // The offsetParent's offset without borders (offset + border) + this.offset.parent.top + + (this.cssPosition === 'fixed' + ? -this.scrollParent.scrollTop() + : scrollIsRootNode + ? 0 + : scroll.scrollTop()), + left: + // The absolute mouse position + pageX - + // Click offset (relative to the element) + this.offset.click.left - + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.relative.left - + // The offsetParent's offset without borders (offset + border) + this.offset.parent.left + + (this.cssPosition === 'fixed' + ? -this.scrollParent.scrollLeft() + : scrollIsRootNode + ? 0 + : scroll.scrollLeft()) + } + }, + + _rearrange: function (event, i, a, hardRefresh) { + a + ? a[0].appendChild(this.placeholder[0]) + : i.item[0].parentNode.insertBefore( + this.placeholder[0], + this.direction === 'down' ? i.item[0] : i.item[0].nextSibling + ) + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, + // if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1 + var counter = this.counter + + this._delay(function () { + if (counter === this.counter) { + //Precompute after each DOM insertion, NOT on mousemove + this.refreshPositions(!hardRefresh) + } + }) + }, + + _clear: function (event, noPropagation) { + this.reverting = false + + // We delay all events that have to be triggered to after the point where the placeholder + // has been removed and everything else normalized again + var i, + delayedTriggers = [] + + // We first have to update the dom position of the actual currentItem + // Note: don't do it if the current item is already removed (by a user), or it gets + // reappended (see #4088) + if (!this._noFinalSort && this.currentItem.parent().length) { + this.placeholder.before(this.currentItem) + } + this._noFinalSort = null + + if (this.helper[0] === this.currentItem[0]) { + for (i in this._storedCSS) { + if (this._storedCSS[i] === 'auto' || this._storedCSS[i] === 'static') { + this._storedCSS[i] = '' + } + } + this.currentItem.css(this._storedCSS) + this._removeClass(this.currentItem, 'ui-sortable-helper') + } else { + this.currentItem.show() + } + + if (this.fromOutside && !noPropagation) { + delayedTriggers.push(function (event) { + this._trigger('receive', event, this._uiHash(this.fromOutside)) + }) + } + if ( + (this.fromOutside || + this.domPosition.prev !== this.currentItem.prev().not('.ui-sortable-helper')[0] || + this.domPosition.parent !== this.currentItem.parent()[0]) && + !noPropagation + ) { + // Trigger update callback if the DOM position has changed + delayedTriggers.push(function (event) { + this._trigger('update', event, this._uiHash()) + }) + } + + // Check if the items Container has Changed and trigger appropriate + // events. + if (this !== this.currentContainer) { + if (!noPropagation) { + delayedTriggers.push(function (event) { + this._trigger('remove', event, this._uiHash()) + }) + delayedTriggers.push( + function (c) { + return function (event) { + c._trigger('receive', event, this._uiHash(this)) + } + }.call(this, this.currentContainer) + ) + delayedTriggers.push( + function (c) { + return function (event) { + c._trigger('update', event, this._uiHash(this)) + } + }.call(this, this.currentContainer) + ) + } + } + + //Post events to containers + function delayEvent(type, instance, container) { + return function (event) { + container._trigger(type, event, instance._uiHash(instance)) + } + } + for (i = this.containers.length - 1; i >= 0; i--) { + if (!noPropagation) { + delayedTriggers.push(delayEvent('deactivate', this, this.containers[i])) + } + if (this.containers[i].containerCache.over) { + delayedTriggers.push(delayEvent('out', this, this.containers[i])) + this.containers[i].containerCache.over = 0 + } + } + + //Do what was originally in plugins + if (this.storedCursor) { + this.document.find('body').css('cursor', this.storedCursor) + this.storedStylesheet.remove() + } + if (this._storedOpacity) { + this.helper.css('opacity', this._storedOpacity) + } + if (this._storedZIndex) { + this.helper.css('zIndex', this._storedZIndex === 'auto' ? '' : this._storedZIndex) + } + + this.dragging = false + + if (!noPropagation) { + this._trigger('beforeStop', event, this._uiHash()) + } + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, + // it unbinds ALL events from the original node! + this.placeholder[0].parentNode.removeChild(this.placeholder[0]) + + if (!this.cancelHelperRemoval) { + if (this.helper[0] !== this.currentItem[0]) { + this.helper.remove() + } + this.helper = null + } + + if (!noPropagation) { + for (i = 0; i < delayedTriggers.length; i++) { + // Trigger all delayed events + delayedTriggers[i].call(this, event) + } + this._trigger('stop', event, this._uiHash()) + } + + this.fromOutside = false + return !this.cancelHelperRemoval + }, + + _trigger: function () { + if ($.Widget.prototype._trigger.apply(this, arguments) === false) { + this.cancel() + } + }, + + _uiHash: function (_inst) { + var inst = _inst || this + return { + helper: inst.helper, + placeholder: inst.placeholder || $([]), + position: inst.position, + originalPosition: inst.originalPosition, + offset: inst.positionAbs, + item: inst.currentItem, + sender: _inst ? _inst.element : null + } + } + }) + + /*! + * jQuery UI Spinner 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Spinner + //>>group: Widgets + //>>description: Displays buttons to easily input numbers via the keyboard or mouse. + //>>docs: http://api.jqueryui.com/spinner/ + //>>demos: http://jqueryui.com/spinner/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/spinner.css + //>>css.theme: ../../themes/base/theme.css + + function spinnerModifer(fn) { + return function () { + var previous = this.element.val() + fn.apply(this, arguments) + this._refresh() + if (previous !== this.element.val()) { + this._trigger('change') + } + } + } + + $.widget('ui.spinner', { + version: '1.12.1', + defaultElement: '<input>', + widgetEventPrefix: 'spin', + options: { + classes: { + 'ui-spinner': 'ui-corner-all', + 'ui-spinner-down': 'ui-corner-br', + 'ui-spinner-up': 'ui-corner-tr' + }, + culture: null, + icons: { + down: 'ui-icon-triangle-1-s', + up: 'ui-icon-triangle-1-n' + }, + incremental: true, + max: null, + min: null, + numberFormat: null, + page: 10, + step: 1, + + change: null, + spin: null, + start: null, + stop: null + }, + + _create: function () { + // handle string values that need to be parsed + this._setOption('max', this.options.max) + this._setOption('min', this.options.min) + this._setOption('step', this.options.step) + + // Only format if there is a value, prevents the field from being marked + // as invalid in Firefox, see #9573. + if (this.value() !== '') { + // Format the value, but don't constrain. + this._value(this.element.val(), true) + } + + this._draw() + this._on(this._events) + this._refresh() + + // Turning off autocomplete prevents the browser from remembering the + // value when navigating through history, so we re-enable autocomplete + // if the page is unloaded before the widget is destroyed. #7790 + this._on(this.window, { + beforeunload: function () { + this.element.removeAttr('autocomplete') + } + }) + }, + + _getCreateOptions: function () { + var options = this._super() + var element = this.element + + $.each(['min', 'max', 'step'], function (i, option) { + var value = element.attr(option) + if (value != null && value.length) { + options[option] = value + } + }) + + return options + }, + + _events: { + keydown: function (event) { + if (this._start(event) && this._keydown(event)) { + event.preventDefault() + } + }, + keyup: '_stop', + focus: function () { + this.previous = this.element.val() + }, + blur: function (event) { + if (this.cancelBlur) { + delete this.cancelBlur + return + } + + this._stop() + this._refresh() + if (this.previous !== this.element.val()) { + this._trigger('change', event) + } + }, + mousewheel: function (event, delta) { + if (!delta) { + return + } + if (!this.spinning && !this._start(event)) { + return false + } + + this._spin((delta > 0 ? 1 : -1) * this.options.step, event) + clearTimeout(this.mousewheelTimer) + this.mousewheelTimer = this._delay(function () { + if (this.spinning) { + this._stop(event) + } + }, 100) + event.preventDefault() + }, + 'mousedown .ui-spinner-button': function (event) { + var previous + + // We never want the buttons to have focus; whenever the user is + // interacting with the spinner, the focus should be on the input. + // If the input is focused then this.previous is properly set from + // when the input first received focus. If the input is not focused + // then we need to set this.previous based on the value before spinning. + previous = + this.element[0] === $.ui.safeActiveElement(this.document[0]) + ? this.previous + : this.element.val() + function checkFocus() { + var isActive = this.element[0] === $.ui.safeActiveElement(this.document[0]) + if (!isActive) { + this.element.trigger('focus') + this.previous = previous + + // support: IE + // IE sets focus asynchronously, so we need to check if focus + // moved off of the input because the user clicked on the button. + this._delay(function () { + this.previous = previous + }) + } + } + + // Ensure focus is on (or stays on) the text field + event.preventDefault() + checkFocus.call(this) + + // Support: IE + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + // and check (again) if focus moved off of the input. + this.cancelBlur = true + this._delay(function () { + delete this.cancelBlur + checkFocus.call(this) + }) + + if (this._start(event) === false) { + return + } + + this._repeat(null, $(event.currentTarget).hasClass('ui-spinner-up') ? 1 : -1, event) + }, + 'mouseup .ui-spinner-button': '_stop', + 'mouseenter .ui-spinner-button': function (event) { + // button will add ui-state-active if mouse was down while mouseleave and kept down + if (!$(event.currentTarget).hasClass('ui-state-active')) { + return + } + + if (this._start(event) === false) { + return false + } + this._repeat(null, $(event.currentTarget).hasClass('ui-spinner-up') ? 1 : -1, event) + }, + + // TODO: do we really want to consider this a stop? + // shouldn't we just stop the repeater and wait until mouseup before + // we trigger the stop event? + 'mouseleave .ui-spinner-button': '_stop' + }, + + // Support mobile enhanced option and make backcompat more sane + _enhance: function () { + this.uiSpinner = this.element + .attr('autocomplete', 'off') + .wrap('<span>') + .parent() + + // Add buttons + .append('<a></a><a></a>') + }, + + _draw: function () { + this._enhance() + + this._addClass(this.uiSpinner, 'ui-spinner', 'ui-widget ui-widget-content') + this._addClass('ui-spinner-input') + + this.element.attr('role', 'spinbutton') + + // Button bindings + this.buttons = this.uiSpinner + .children('a') + .attr('tabIndex', -1) + .attr('aria-hidden', true) + .button({ + classes: { + 'ui-button': '' + } + }) + + // TODO: Right now button does not support classes this is already updated in button PR + this._removeClass(this.buttons, 'ui-corner-all') + + this._addClass(this.buttons.first(), 'ui-spinner-button ui-spinner-up') + this._addClass(this.buttons.last(), 'ui-spinner-button ui-spinner-down') + this.buttons.first().button({ + icon: this.options.icons.up, + showLabel: false + }) + this.buttons.last().button({ + icon: this.options.icons.down, + showLabel: false + }) + + // IE 6 doesn't understand height: 50% for the buttons + // unless the wrapper has an explicit height + if ( + this.buttons.height() > Math.ceil(this.uiSpinner.height() * 0.5) && + this.uiSpinner.height() > 0 + ) { + this.uiSpinner.height(this.uiSpinner.height()) + } + }, + + _keydown: function (event) { + var options = this.options, + keyCode = $.ui.keyCode + + switch (event.keyCode) { + case keyCode.UP: + this._repeat(null, 1, event) + return true + case keyCode.DOWN: + this._repeat(null, -1, event) + return true + case keyCode.PAGE_UP: + this._repeat(null, options.page, event) + return true + case keyCode.PAGE_DOWN: + this._repeat(null, -options.page, event) + return true + } + + return false + }, + + _start: function (event) { + if (!this.spinning && this._trigger('start', event) === false) { + return false + } + + if (!this.counter) { + this.counter = 1 + } + this.spinning = true + return true + }, + + _repeat: function (i, steps, event) { + i = i || 500 + + clearTimeout(this.timer) + this.timer = this._delay(function () { + this._repeat(40, steps, event) + }, i) + + this._spin(steps * this.options.step, event) + }, + + _spin: function (step, event) { + var value = this.value() || 0 + + if (!this.counter) { + this.counter = 1 + } + + value = this._adjustValue(value + step * this._increment(this.counter)) + + if (!this.spinning || this._trigger('spin', event, { value: value }) !== false) { + this._value(value) + this.counter++ + } + }, + + _increment: function (i) { + var incremental = this.options.incremental + + if (incremental) { + return $.isFunction(incremental) + ? incremental(i) + : Math.floor((i * i * i) / 50000 - (i * i) / 500 + (17 * i) / 200 + 1) + } + + return 1 + }, + + _precision: function () { + var precision = this._precisionOf(this.options.step) + if (this.options.min !== null) { + precision = Math.max(precision, this._precisionOf(this.options.min)) + } + return precision + }, + + _precisionOf: function (num) { + var str = num.toString(), + decimal = str.indexOf('.') + return decimal === -1 ? 0 : str.length - decimal - 1 + }, + + _adjustValue: function (value) { + var base, + aboveMin, + options = this.options + + // Make sure we're at a valid step + // - find out where we are relative to the base (min or 0) + base = options.min !== null ? options.min : 0 + aboveMin = value - base + + // - round to the nearest step + aboveMin = Math.round(aboveMin / options.step) * options.step + + // - rounding is based on 0, so adjust back to our base + value = base + aboveMin + + // Fix precision from bad JS floating point math + value = parseFloat(value.toFixed(this._precision())) + + // Clamp the value + if (options.max !== null && value > options.max) { + return options.max + } + if (options.min !== null && value < options.min) { + return options.min + } + + return value + }, + + _stop: function (event) { + if (!this.spinning) { + return + } + + clearTimeout(this.timer) + clearTimeout(this.mousewheelTimer) + this.counter = 0 + this.spinning = false + this._trigger('stop', event) + }, + + _setOption: function (key, value) { + var prevValue, first, last + + if (key === 'culture' || key === 'numberFormat') { + prevValue = this._parse(this.element.val()) + this.options[key] = value + this.element.val(this._format(prevValue)) + return + } + + if (key === 'max' || key === 'min' || key === 'step') { + if (typeof value === 'string') { + value = this._parse(value) + } + } + if (key === 'icons') { + first = this.buttons.first().find('.ui-icon') + this._removeClass(first, null, this.options.icons.up) + this._addClass(first, null, value.up) + last = this.buttons.last().find('.ui-icon') + this._removeClass(last, null, this.options.icons.down) + this._addClass(last, null, value.down) + } + + this._super(key, value) + }, + + _setOptionDisabled: function (value) { + this._super(value) + + this._toggleClass(this.uiSpinner, null, 'ui-state-disabled', !!value) + this.element.prop('disabled', !!value) + this.buttons.button(value ? 'disable' : 'enable') + }, + + _setOptions: spinnerModifer(function (options) { + this._super(options) + }), + + _parse: function (val) { + if (typeof val === 'string' && val !== '') { + val = + window.Globalize && this.options.numberFormat + ? Globalize.parseFloat(val, 10, this.options.culture) + : +val + } + return val === '' || isNaN(val) ? null : val + }, + + _format: function (value) { + if (value === '') { + return '' + } + return window.Globalize && this.options.numberFormat + ? Globalize.format(value, this.options.numberFormat, this.options.culture) + : value + }, + + _refresh: function () { + this.element.attr({ + 'aria-valuemin': this.options.min, + 'aria-valuemax': this.options.max, + + // TODO: what should we do with values that can't be parsed? + 'aria-valuenow': this._parse(this.element.val()) + }) + }, + + isValid: function () { + var value = this.value() + + // Null is invalid + if (value === null) { + return false + } + + // If value gets adjusted, it's invalid + return value === this._adjustValue(value) + }, + + // Update the value without triggering change + _value: function (value, allowAny) { + var parsed + if (value !== '') { + parsed = this._parse(value) + if (parsed !== null) { + if (!allowAny) { + parsed = this._adjustValue(parsed) + } + value = this._format(parsed) + } + } + this.element.val(value) + this._refresh() + }, + + _destroy: function () { + this.element + .prop('disabled', false) + .removeAttr('autocomplete role aria-valuemin aria-valuemax aria-valuenow') + + this.uiSpinner.replaceWith(this.element) + }, + + stepUp: spinnerModifer(function (steps) { + this._stepUp(steps) + }), + _stepUp: function (steps) { + if (this._start()) { + this._spin((steps || 1) * this.options.step) + this._stop() + } + }, + + stepDown: spinnerModifer(function (steps) { + this._stepDown(steps) + }), + _stepDown: function (steps) { + if (this._start()) { + this._spin((steps || 1) * -this.options.step) + this._stop() + } + }, + + pageUp: spinnerModifer(function (pages) { + this._stepUp((pages || 1) * this.options.page) + }), + + pageDown: spinnerModifer(function (pages) { + this._stepDown((pages || 1) * this.options.page) + }), + + value: function (newVal) { + if (!arguments.length) { + return this._parse(this.element.val()) + } + spinnerModifer(this._value).call(this, newVal) + }, + + widget: function () { + return this.uiSpinner + } + }) + + // DEPRECATED + // TODO: switch return back to widget declaration at top of file when this is removed + if ($.uiBackCompat !== false) { + // Backcompat for spinner html extension points + $.widget('ui.spinner', $.ui.spinner, { + _enhance: function () { + this.uiSpinner = this.element + .attr('autocomplete', 'off') + .wrap(this._uiSpinnerHtml()) + .parent() + + // Add buttons + .append(this._buttonHtml()) + }, + _uiSpinnerHtml: function () { + return '<span>' + }, + + _buttonHtml: function () { + return '<a></a><a></a>' + } + }) + } + + var widgetsSpinner = $.ui.spinner + + /*! + * jQuery UI Tabs 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Tabs + //>>group: Widgets + //>>description: Transforms a set of container elements into a tab structure. + //>>docs: http://api.jqueryui.com/tabs/ + //>>demos: http://jqueryui.com/tabs/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/tabs.css + //>>css.theme: ../../themes/base/theme.css + + $.widget('ui.tabs', { + version: '1.12.1', + delay: 300, + options: { + active: null, + classes: { + 'ui-tabs': 'ui-corner-all', + 'ui-tabs-nav': 'ui-corner-all', + 'ui-tabs-panel': 'ui-corner-bottom', + 'ui-tabs-tab': 'ui-corner-top' + }, + collapsible: false, + event: 'click', + heightStyle: 'content', + hide: null, + show: null, + + // Callbacks + activate: null, + beforeActivate: null, + beforeLoad: null, + load: null + }, + + _isLocal: (function () { + var rhash = /#.*$/ + + return function (anchor) { + var anchorUrl, locationUrl + + anchorUrl = anchor.href.replace(rhash, '') + locationUrl = location.href.replace(rhash, '') + + // Decoding may throw an error if the URL isn't UTF-8 (#9518) + try { + anchorUrl = decodeURIComponent(anchorUrl) + } catch (error) {} + try { + locationUrl = decodeURIComponent(locationUrl) + } catch (error) {} + + return anchor.hash.length > 1 && anchorUrl === locationUrl + } + })(), + + _create: function () { + var that = this, + options = this.options + + this.running = false + + this._addClass('ui-tabs', 'ui-widget ui-widget-content') + this._toggleClass('ui-tabs-collapsible', null, options.collapsible) + + this._processTabs() + options.active = this._initialActive() + + // Take disabling tabs via class attribute from HTML + // into account and update option properly. + if ($.isArray(options.disabled)) { + options.disabled = $.unique( + options.disabled.concat( + $.map(this.tabs.filter('.ui-state-disabled'), function (li) { + return that.tabs.index(li) + }) + ) + ).sort() + } + + // Check for length avoids error when initializing empty list + if (this.options.active !== false && this.anchors.length) { + this.active = this._findActive(options.active) + } else { + this.active = $() + } + + this._refresh() + + if (this.active.length) { + this.load(options.active) + } + }, + + _initialActive: function () { + var active = this.options.active, + collapsible = this.options.collapsible, + locationHash = location.hash.substring(1) + + if (active === null) { + // check the fragment identifier in the URL + if (locationHash) { + this.tabs.each(function (i, tab) { + if ($(tab).attr('aria-controls') === locationHash) { + active = i + return false + } + }) + } + + // Check for a tab marked active via a class + if (active === null) { + active = this.tabs.index(this.tabs.filter('.ui-tabs-active')) + } + + // No active tab, set to false + if (active === null || active === -1) { + active = this.tabs.length ? 0 : false + } + } + + // Handle numbers: negative, out of range + if (active !== false) { + active = this.tabs.index(this.tabs.eq(active)) + if (active === -1) { + active = collapsible ? false : 0 + } + } + + // Don't allow collapsible: false and active: false + if (!collapsible && active === false && this.anchors.length) { + active = 0 + } + + return active + }, + + _getCreateEventData: function () { + return { + tab: this.active, + panel: !this.active.length ? $() : this._getPanelForTab(this.active) + } + }, + + _tabKeydown: function (event) { + var focusedTab = $($.ui.safeActiveElement(this.document[0])).closest('li'), + selectedIndex = this.tabs.index(focusedTab), + goingForward = true + + if (this._handlePageNav(event)) { + return + } + + switch (event.keyCode) { + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + selectedIndex++ + break + case $.ui.keyCode.UP: + case $.ui.keyCode.LEFT: + goingForward = false + selectedIndex-- + break + case $.ui.keyCode.END: + selectedIndex = this.anchors.length - 1 + break + case $.ui.keyCode.HOME: + selectedIndex = 0 + break + case $.ui.keyCode.SPACE: + // Activate only, no collapsing + event.preventDefault() + clearTimeout(this.activating) + this._activate(selectedIndex) + return + case $.ui.keyCode.ENTER: + // Toggle (cancel delayed activation, allow collapsing) + event.preventDefault() + clearTimeout(this.activating) + + // Determine if we should collapse or activate + this._activate(selectedIndex === this.options.active ? false : selectedIndex) + return + default: + return + } + + // Focus the appropriate tab, based on which key was pressed + event.preventDefault() + clearTimeout(this.activating) + selectedIndex = this._focusNextTab(selectedIndex, goingForward) + + // Navigating with control/command key will prevent automatic activation + if (!event.ctrlKey && !event.metaKey) { + // Update aria-selected immediately so that AT think the tab is already selected. + // Otherwise AT may confuse the user by stating that they need to activate the tab, + // but the tab will already be activated by the time the announcement finishes. + focusedTab.attr('aria-selected', 'false') + this.tabs.eq(selectedIndex).attr('aria-selected', 'true') + + this.activating = this._delay(function () { + this.option('active', selectedIndex) + }, this.delay) + } + }, + + _panelKeydown: function (event) { + if (this._handlePageNav(event)) { + return + } + + // Ctrl+up moves focus to the current tab + if (event.ctrlKey && event.keyCode === $.ui.keyCode.UP) { + event.preventDefault() + this.active.trigger('focus') + } + }, + + // Alt+page up/down moves focus to the previous/next tab (and activates) + _handlePageNav: function (event) { + if (event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP) { + this._activate(this._focusNextTab(this.options.active - 1, false)) + return true + } + if (event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN) { + this._activate(this._focusNextTab(this.options.active + 1, true)) + return true + } + }, + + _findNextTab: function (index, goingForward) { + var lastTabIndex = this.tabs.length - 1 + + function constrain() { + if (index > lastTabIndex) { + index = 0 + } + if (index < 0) { + index = lastTabIndex + } + return index + } + + while ($.inArray(constrain(), this.options.disabled) !== -1) { + index = goingForward ? index + 1 : index - 1 + } + + return index + }, + + _focusNextTab: function (index, goingForward) { + index = this._findNextTab(index, goingForward) + this.tabs.eq(index).trigger('focus') + return index + }, + + _setOption: function (key, value) { + if (key === 'active') { + // _activate() will handle invalid values and update this.options + this._activate(value) + return + } + + this._super(key, value) + + if (key === 'collapsible') { + this._toggleClass('ui-tabs-collapsible', null, value) + + // Setting collapsible: false while collapsed; open first panel + if (!value && this.options.active === false) { + this._activate(0) + } + } + + if (key === 'event') { + this._setupEvents(value) + } + + if (key === 'heightStyle') { + this._setupHeightStyle(value) + } + }, + + _sanitizeSelector: function (hash) { + return hash ? hash.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, '\\$&') : '' + }, + + refresh: function () { + var options = this.options, + lis = this.tablist.children(':has(a[href])') + + // Get disabled tabs from class attribute from HTML + // this will get converted to a boolean if needed in _refresh() + options.disabled = $.map(lis.filter('.ui-state-disabled'), function (tab) { + return lis.index(tab) + }) + + this._processTabs() + + // Was collapsed or no tabs + if (options.active === false || !this.anchors.length) { + options.active = false + this.active = $() + + // was active, but active tab is gone + } else if (this.active.length && !$.contains(this.tablist[0], this.active[0])) { + // all remaining tabs are disabled + if (this.tabs.length === options.disabled.length) { + options.active = false + this.active = $() + + // activate previous tab + } else { + this._activate(this._findNextTab(Math.max(0, options.active - 1), false)) + } + + // was active, active tab still exists + } else { + // make sure active index is correct + options.active = this.tabs.index(this.active) + } + + this._refresh() + }, + + _refresh: function () { + this._setOptionDisabled(this.options.disabled) + this._setupEvents(this.options.event) + this._setupHeightStyle(this.options.heightStyle) + + this.tabs.not(this.active).attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false', + tabIndex: -1 + }) + this.panels.not(this._getPanelForTab(this.active)).hide().attr({ + 'aria-hidden': 'true' + }) + + // Make sure one tab is in the tab order + if (!this.active.length) { + this.tabs.eq(0).attr('tabIndex', 0) + } else { + this.active.attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0 + }) + this._addClass(this.active, 'ui-tabs-active', 'ui-state-active') + this._getPanelForTab(this.active).show().attr({ + 'aria-hidden': 'false' + }) + } + }, + + _processTabs: function () { + var that = this, + prevTabs = this.tabs, + prevAnchors = this.anchors, + prevPanels = this.panels + + this.tablist = this._getList().attr('role', 'tablist') + this._addClass( + this.tablist, + 'ui-tabs-nav', + 'ui-helper-reset ui-helper-clearfix ui-widget-header' + ) + + // Prevent users from focusing disabled tabs via click + this.tablist + .on('mousedown' + this.eventNamespace, '> li', function (event) { + if ($(this).is('.ui-state-disabled')) { + event.preventDefault() + } + }) + + // Support: IE <9 + // Preventing the default action in mousedown doesn't prevent IE + // from focusing the element, so if the anchor gets focused, blur. + // We don't have to worry about focusing the previously focused + // element since clicking on a non-focusable element should focus + // the body anyway. + .on('focus' + this.eventNamespace, '.ui-tabs-anchor', function () { + if ($(this).closest('li').is('.ui-state-disabled')) { + this.blur() + } + }) + + this.tabs = this.tablist.find('> li:has(a[href])').attr({ + role: 'tab', + tabIndex: -1 + }) + this._addClass(this.tabs, 'ui-tabs-tab', 'ui-state-default') + + this.anchors = this.tabs + .map(function () { + return $('a', this)[0] + }) + .attr({ + role: 'presentation', + tabIndex: -1 + }) + this._addClass(this.anchors, 'ui-tabs-anchor') + + this.panels = $() + + this.anchors.each(function (i, anchor) { + var selector, + panel, + panelId, + anchorId = $(anchor).uniqueId().attr('id'), + tab = $(anchor).closest('li'), + originalAriaControls = tab.attr('aria-controls') + + // Inline tab + if (that._isLocal(anchor)) { + selector = anchor.hash + panelId = selector.substring(1) + panel = that.element.find(that._sanitizeSelector(selector)) + + // remote tab + } else { + // If the tab doesn't already have aria-controls, + // generate an id by using a throw-away element + panelId = tab.attr('aria-controls') || $({}).uniqueId()[0].id + selector = '#' + panelId + panel = that.element.find(selector) + if (!panel.length) { + panel = that._createPanel(panelId) + panel.insertAfter(that.panels[i - 1] || that.tablist) + } + panel.attr('aria-live', 'polite') + } + + if (panel.length) { + that.panels = that.panels.add(panel) + } + if (originalAriaControls) { + tab.data('ui-tabs-aria-controls', originalAriaControls) + } + tab.attr({ + 'aria-controls': panelId, + 'aria-labelledby': anchorId + }) + panel.attr('aria-labelledby', anchorId) + }) + + this.panels.attr('role', 'tabpanel') + this._addClass(this.panels, 'ui-tabs-panel', 'ui-widget-content') + + // Avoid memory leaks (#10056) + if (prevTabs) { + this._off(prevTabs.not(this.tabs)) + this._off(prevAnchors.not(this.anchors)) + this._off(prevPanels.not(this.panels)) + } + }, + + // Allow overriding how to find the list for rare usage scenarios (#7715) + _getList: function () { + return this.tablist || this.element.find('ol, ul').eq(0) + }, + + _createPanel: function (id) { + return $('<div>').attr('id', id).data('ui-tabs-destroy', true) + }, + + _setOptionDisabled: function (disabled) { + var currentItem, li, i + + if ($.isArray(disabled)) { + if (!disabled.length) { + disabled = false + } else if (disabled.length === this.anchors.length) { + disabled = true + } + } + + // Disable tabs + for (i = 0; (li = this.tabs[i]); i++) { + currentItem = $(li) + if (disabled === true || $.inArray(i, disabled) !== -1) { + currentItem.attr('aria-disabled', 'true') + this._addClass(currentItem, null, 'ui-state-disabled') + } else { + currentItem.removeAttr('aria-disabled') + this._removeClass(currentItem, null, 'ui-state-disabled') + } + } + + this.options.disabled = disabled + + this._toggleClass(this.widget(), this.widgetFullName + '-disabled', null, disabled === true) + }, + + _setupEvents: function (event) { + var events = {} + if (event) { + $.each(event.split(' '), function (index, eventName) { + events[eventName] = '_eventHandler' + }) + } + + this._off(this.anchors.add(this.tabs).add(this.panels)) + + // Always prevent the default action, even when disabled + this._on(true, this.anchors, { + click: function (event) { + event.preventDefault() + } + }) + this._on(this.anchors, events) + this._on(this.tabs, { keydown: '_tabKeydown' }) + this._on(this.panels, { keydown: '_panelKeydown' }) + + this._focusable(this.tabs) + this._hoverable(this.tabs) + }, + + _setupHeightStyle: function (heightStyle) { + var maxHeight, + parent = this.element.parent() + + if (heightStyle === 'fill') { + maxHeight = parent.height() + maxHeight -= this.element.outerHeight() - this.element.height() + + this.element.siblings(':visible').each(function () { + var elem = $(this), + position = elem.css('position') + + if (position === 'absolute' || position === 'fixed') { + return + } + maxHeight -= elem.outerHeight(true) + }) + + this.element + .children() + .not(this.panels) + .each(function () { + maxHeight -= $(this).outerHeight(true) + }) + + this.panels + .each(function () { + $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height())) + }) + .css('overflow', 'auto') + } else if (heightStyle === 'auto') { + maxHeight = 0 + this.panels + .each(function () { + maxHeight = Math.max(maxHeight, $(this).height('').height()) + }) + .height(maxHeight) + } + }, + + _eventHandler: function (event) { + var options = this.options, + active = this.active, + anchor = $(event.currentTarget), + tab = anchor.closest('li'), + clickedIsActive = tab[0] === active[0], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : this._getPanelForTab(tab), + toHide = !active.length ? $() : this._getPanelForTab(active), + eventData = { + oldTab: active, + oldPanel: toHide, + newTab: collapsing ? $() : tab, + newPanel: toShow + } + + event.preventDefault() + + if ( + tab.hasClass('ui-state-disabled') || + // tab is already loading + tab.hasClass('ui-tabs-loading') || + // can't switch durning an animation + this.running || + // click on active header, but not collapsible + (clickedIsActive && !options.collapsible) || + // allow canceling activation + this._trigger('beforeActivate', event, eventData) === false + ) { + return + } + + options.active = collapsing ? false : this.tabs.index(tab) + + this.active = clickedIsActive ? $() : tab + if (this.xhr) { + this.xhr.abort() + } + + if (!toHide.length && !toShow.length) { + $.error('jQuery UI Tabs: Mismatching fragment identifier.') + } + + if (toShow.length) { + this.load(this.tabs.index(tab), event) + } + this._toggle(event, eventData) + }, + + // Handles show/hide for selecting tabs + _toggle: function (event, eventData) { + var that = this, + toShow = eventData.newPanel, + toHide = eventData.oldPanel + + this.running = true + + function complete() { + that.running = false + that._trigger('activate', event, eventData) + } + + function show() { + that._addClass(eventData.newTab.closest('li'), 'ui-tabs-active', 'ui-state-active') + + if (toShow.length && that.options.show) { + that._show(toShow, that.options.show, complete) + } else { + toShow.show() + complete() + } + } + + // Start out by hiding, then showing, then completing + if (toHide.length && this.options.hide) { + this._hide(toHide, this.options.hide, function () { + that._removeClass(eventData.oldTab.closest('li'), 'ui-tabs-active', 'ui-state-active') + show() + }) + } else { + this._removeClass(eventData.oldTab.closest('li'), 'ui-tabs-active', 'ui-state-active') + toHide.hide() + show() + } + + toHide.attr('aria-hidden', 'true') + eventData.oldTab.attr({ + 'aria-selected': 'false', + 'aria-expanded': 'false' + }) + + // If we're switching tabs, remove the old tab from the tab order. + // If we're opening from collapsed state, remove the previous tab from the tab order. + // If we're collapsing, then keep the collapsing tab in the tab order. + if (toShow.length && toHide.length) { + eventData.oldTab.attr('tabIndex', -1) + } else if (toShow.length) { + this.tabs + .filter(function () { + return $(this).attr('tabIndex') === 0 + }) + .attr('tabIndex', -1) + } + + toShow.attr('aria-hidden', 'false') + eventData.newTab.attr({ + 'aria-selected': 'true', + 'aria-expanded': 'true', + tabIndex: 0 + }) + }, + + _activate: function (index) { + var anchor, + active = this._findActive(index) + + // Trying to activate the already active panel + if (active[0] === this.active[0]) { + return + } + + // Trying to collapse, simulate a click on the current active header + if (!active.length) { + active = this.active + } + + anchor = active.find('.ui-tabs-anchor')[0] + this._eventHandler({ + target: anchor, + currentTarget: anchor, + preventDefault: $.noop + }) + }, + + _findActive: function (index) { + return index === false ? $() : this.tabs.eq(index) + }, + + _getIndex: function (index) { + // meta-function to give users option to provide a href string instead of a numerical index. + if (typeof index === 'string') { + index = this.anchors.index( + this.anchors.filter("[href$='" + $.ui.escapeSelector(index) + "']") + ) + } + + return index + }, + + _destroy: function () { + if (this.xhr) { + this.xhr.abort() + } + + this.tablist.removeAttr('role').off(this.eventNamespace) + + this.anchors.removeAttr('role tabIndex').removeUniqueId() + + this.tabs.add(this.panels).each(function () { + if ($.data(this, 'ui-tabs-destroy')) { + $(this).remove() + } else { + $(this).removeAttr( + 'role tabIndex ' + + 'aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded' + ) + } + }) + + this.tabs.each(function () { + var li = $(this), + prev = li.data('ui-tabs-aria-controls') + if (prev) { + li.attr('aria-controls', prev).removeData('ui-tabs-aria-controls') + } else { + li.removeAttr('aria-controls') + } + }) + + this.panels.show() + + if (this.options.heightStyle !== 'content') { + this.panels.css('height', '') + } + }, + + enable: function (index) { + var disabled = this.options.disabled + if (disabled === false) { + return + } + + if (index === undefined) { + disabled = false + } else { + index = this._getIndex(index) + if ($.isArray(disabled)) { + disabled = $.map(disabled, function (num) { + return num !== index ? num : null + }) + } else { + disabled = $.map(this.tabs, function (li, num) { + return num !== index ? num : null + }) + } + } + this._setOptionDisabled(disabled) + }, + + disable: function (index) { + var disabled = this.options.disabled + if (disabled === true) { + return + } + + if (index === undefined) { + disabled = true + } else { + index = this._getIndex(index) + if ($.inArray(index, disabled) !== -1) { + return + } + if ($.isArray(disabled)) { + disabled = $.merge([index], disabled).sort() + } else { + disabled = [index] + } + } + this._setOptionDisabled(disabled) + }, + + load: function (index, event) { + index = this._getIndex(index) + var that = this, + tab = this.tabs.eq(index), + anchor = tab.find('.ui-tabs-anchor'), + panel = this._getPanelForTab(tab), + eventData = { + tab: tab, + panel: panel + }, + complete = function (jqXHR, status) { + if (status === 'abort') { + that.panels.stop(false, true) + } + + that._removeClass(tab, 'ui-tabs-loading') + panel.removeAttr('aria-busy') + + if (jqXHR === that.xhr) { + delete that.xhr + } + } + + // Not remote + if (this._isLocal(anchor[0])) { + return + } + + this.xhr = $.ajax(this._ajaxSettings(anchor, event, eventData)) + + // Support: jQuery <1.8 + // jQuery <1.8 returns false if the request is canceled in beforeSend, + // but as of 1.8, $.ajax() always returns a jqXHR object. + if (this.xhr && this.xhr.statusText !== 'canceled') { + this._addClass(tab, 'ui-tabs-loading') + panel.attr('aria-busy', 'true') + + this.xhr + .done(function (response, status, jqXHR) { + // support: jQuery <1.8 + // http://bugs.jquery.com/ticket/11778 + setTimeout(function () { + panel.html(response) + that._trigger('load', event, eventData) + + complete(jqXHR, status) + }, 1) + }) + .fail(function (jqXHR, status) { + // support: jQuery <1.8 + // http://bugs.jquery.com/ticket/11778 + setTimeout(function () { + complete(jqXHR, status) + }, 1) + }) + } + }, + + _ajaxSettings: function (anchor, event, eventData) { + var that = this + return { + // Support: IE <11 only + // Strip any hash that exists to prevent errors with the Ajax request + url: anchor.attr('href').replace(/#.*$/, ''), + beforeSend: function (jqXHR, settings) { + return that._trigger( + 'beforeLoad', + event, + $.extend({ jqXHR: jqXHR, ajaxSettings: settings }, eventData) + ) + } + } + }, + + _getPanelForTab: function (tab) { + var id = $(tab).attr('aria-controls') + return this.element.find(this._sanitizeSelector('#' + id)) + } + }) + + // DEPRECATED + // TODO: Switch return back to widget declaration at top of file when this is removed + if ($.uiBackCompat !== false) { + // Backcompat for ui-tab class (now ui-tabs-tab) + $.widget('ui.tabs', $.ui.tabs, { + _processTabs: function () { + this._superApply(arguments) + this._addClass(this.tabs, 'ui-tab') + } + }) + } + + var widgetsTabs = $.ui.tabs + + /*! + * jQuery UI Tooltip 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + + //>>label: Tooltip + //>>group: Widgets + //>>description: Shows additional information for any element on hover or focus. + //>>docs: http://api.jqueryui.com/tooltip/ + //>>demos: http://jqueryui.com/tooltip/ + //>>css.structure: ../../themes/base/core.css + //>>css.structure: ../../themes/base/tooltip.css + //>>css.theme: ../../themes/base/theme.css + + $.widget('ui.tooltip', { + version: '1.12.1', + options: { + classes: { + 'ui-tooltip': 'ui-corner-all ui-widget-shadow' + }, + content: function () { + // support: IE<9, Opera in jQuery <1.7 + // .text() can't accept undefined, so coerce to a string + var title = $(this).attr('title') || '' + + // Escape title, since we're going from an attribute to raw HTML + return $('<a>').text(title).html() + }, + hide: true, + + // Disabled elements have inconsistent behavior across browsers (#8661) + items: '[title]:not([disabled])', + position: { + my: 'left top+15', + at: 'left bottom', + collision: 'flipfit flip' + }, + show: true, + track: false, + + // Callbacks + close: null, + open: null + }, + + _addDescribedBy: function (elem, id) { + var describedby = (elem.attr('aria-describedby') || '').split(/\s+/) + describedby.push(id) + elem.data('ui-tooltip-id', id).attr('aria-describedby', $.trim(describedby.join(' '))) + }, + + _removeDescribedBy: function (elem) { + var id = elem.data('ui-tooltip-id'), + describedby = (elem.attr('aria-describedby') || '').split(/\s+/), + index = $.inArray(id, describedby) + + if (index !== -1) { + describedby.splice(index, 1) + } + + elem.removeData('ui-tooltip-id') + describedby = $.trim(describedby.join(' ')) + if (describedby) { + elem.attr('aria-describedby', describedby) + } else { + elem.removeAttr('aria-describedby') + } + }, + + _create: function () { + this._on({ + mouseover: 'open', + focusin: 'open' + }) + + // IDs of generated tooltips, needed for destroy + this.tooltips = {} + + // IDs of parent tooltips where we removed the title attribute + this.parents = {} + + // Append the aria-live region so tooltips announce correctly + this.liveRegion = $('<div>') + .attr({ + role: 'log', + 'aria-live': 'assertive', + 'aria-relevant': 'additions' + }) + .appendTo(this.document[0].body) + this._addClass(this.liveRegion, null, 'ui-helper-hidden-accessible') + + this.disabledTitles = $([]) + }, + + _setOption: function (key, value) { + var that = this + + this._super(key, value) + + if (key === 'content') { + $.each(this.tooltips, function (id, tooltipData) { + that._updateContent(tooltipData.element) + }) + } + }, + + _setOptionDisabled: function (value) { + this[value ? '_disable' : '_enable']() + }, + + _disable: function () { + var that = this + + // Close open tooltips + $.each(this.tooltips, function (id, tooltipData) { + var event = $.Event('blur') + event.target = event.currentTarget = tooltipData.element[0] + that.close(event, true) + }) + + // Remove title attributes to prevent native tooltips + this.disabledTitles = this.disabledTitles.add( + this.element + .find(this.options.items) + .addBack() + .filter(function () { + var element = $(this) + if (element.is('[title]')) { + return element.data('ui-tooltip-title', element.attr('title')).removeAttr('title') + } + }) + ) + }, + + _enable: function () { + // restore title attributes + this.disabledTitles.each(function () { + var element = $(this) + if (element.data('ui-tooltip-title')) { + element.attr('title', element.data('ui-tooltip-title')) + } + }) + this.disabledTitles = $([]) + }, + + open: function (event) { + var that = this, + target = $(event ? event.target : this.element) + // we need closest here due to mouseover bubbling, + // but always pointing at the same event target + .closest(this.options.items) + + // No element to show a tooltip for or the tooltip is already open + if (!target.length || target.data('ui-tooltip-id')) { + return + } + + if (target.attr('title')) { + target.data('ui-tooltip-title', target.attr('title')) + } + + target.data('ui-tooltip-open', true) + + // Kill parent tooltips, custom or native, for hover + if (event && event.type === 'mouseover') { + target.parents().each(function () { + var parent = $(this), + blurEvent + if (parent.data('ui-tooltip-open')) { + blurEvent = $.Event('blur') + blurEvent.target = blurEvent.currentTarget = this + that.close(blurEvent, true) + } + if (parent.attr('title')) { + parent.uniqueId() + that.parents[this.id] = { + element: this, + title: parent.attr('title') + } + parent.attr('title', '') + } + }) + } + + this._registerCloseHandlers(event, target) + this._updateContent(target, event) + }, + + _updateContent: function (target, event) { + var content, + contentOption = this.options.content, + that = this, + eventType = event ? event.type : null + + if (typeof contentOption === 'string' || contentOption.nodeType || contentOption.jquery) { + return this._open(event, target, contentOption) + } + + content = contentOption.call(target[0], function (response) { + // IE may instantly serve a cached response for ajax requests + // delay this call to _open so the other call to _open runs first + that._delay(function () { + // Ignore async response if tooltip was closed already + if (!target.data('ui-tooltip-open')) { + return + } + + // JQuery creates a special event for focusin when it doesn't + // exist natively. To improve performance, the native event + // object is reused and the type is changed. Therefore, we can't + // rely on the type being correct after the event finished + // bubbling, so we set it back to the previous value. (#8740) + if (event) { + event.type = eventType + } + this._open(event, target, response) + }) + }) + if (content) { + this._open(event, target, content) + } + }, + + _open: function (event, target, content) { + var tooltipData, + tooltip, + delayedShow, + a11yContent, + positionOption = $.extend({}, this.options.position) + + if (!content) { + return + } + + // Content can be updated multiple times. If the tooltip already + // exists, then just update the content and bail. + tooltipData = this._find(target) + if (tooltipData) { + tooltipData.tooltip.find('.ui-tooltip-content').html(content) + return + } + + // If we have a title, clear it to prevent the native tooltip + // we have to check first to avoid defining a title if none exists + // (we don't want to cause an element to start matching [title]) + // + // We use removeAttr only for key events, to allow IE to export the correct + // accessible attributes. For mouse events, set to empty string to avoid + // native tooltip showing up (happens only when removing inside mouseover). + if (target.is('[title]')) { + if (event && event.type === 'mouseover') { + target.attr('title', '') + } else { + target.removeAttr('title') + } + } + + tooltipData = this._tooltip(target) + tooltip = tooltipData.tooltip + this._addDescribedBy(target, tooltip.attr('id')) + tooltip.find('.ui-tooltip-content').html(content) + + // Support: Voiceover on OS X, JAWS on IE <= 9 + // JAWS announces deletions even when aria-relevant="additions" + // Voiceover will sometimes re-read the entire log region's contents from the beginning + this.liveRegion.children().hide() + a11yContent = $('<div>').html(tooltip.find('.ui-tooltip-content').html()) + a11yContent.removeAttr('name').find('[name]').removeAttr('name') + a11yContent.removeAttr('id').find('[id]').removeAttr('id') + a11yContent.appendTo(this.liveRegion) + + function position(event) { + positionOption.of = event + if (tooltip.is(':hidden')) { + return + } + tooltip.position(positionOption) + } + if (this.options.track && event && /^mouse/.test(event.type)) { + this._on(this.document, { + mousemove: position + }) + + // trigger once to override element-relative positioning + position(event) + } else { + tooltip.position( + $.extend( + { + of: target + }, + this.options.position + ) + ) + } + + tooltip.hide() + + this._show(tooltip, this.options.show) + + // Handle tracking tooltips that are shown with a delay (#8644). As soon + // as the tooltip is visible, position the tooltip using the most recent + // event. + // Adds the check to add the timers only when both delay and track options are set (#14682) + if (this.options.track && this.options.show && this.options.show.delay) { + delayedShow = this.delayedShow = setInterval(function () { + if (tooltip.is(':visible')) { + position(positionOption.of) + clearInterval(delayedShow) + } + }, $.fx.interval) + } + + this._trigger('open', event, { tooltip: tooltip }) + }, + + _registerCloseHandlers: function (event, target) { + var events = { + keyup: function (event) { + if (event.keyCode === $.ui.keyCode.ESCAPE) { + var fakeEvent = $.Event(event) + fakeEvent.currentTarget = target[0] + this.close(fakeEvent, true) + } + } + } + + // Only bind remove handler for delegated targets. Non-delegated + // tooltips will handle this in destroy. + if (target[0] !== this.element[0]) { + events.remove = function () { + this._removeTooltip(this._find(target).tooltip) + } + } + + if (!event || event.type === 'mouseover') { + events.mouseleave = 'close' + } + if (!event || event.type === 'focusin') { + events.focusout = 'close' + } + this._on(true, target, events) + }, + + close: function (event) { + var tooltip, + that = this, + target = $(event ? event.currentTarget : this.element), + tooltipData = this._find(target) + + // The tooltip may already be closed + if (!tooltipData) { + // We set ui-tooltip-open immediately upon open (in open()), but only set the + // additional data once there's actually content to show (in _open()). So even if the + // tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in + // the period between open() and _open(). + target.removeData('ui-tooltip-open') + return + } + + tooltip = tooltipData.tooltip + + // Disabling closes the tooltip, so we need to track when we're closing + // to avoid an infinite loop in case the tooltip becomes disabled on close + if (tooltipData.closing) { + return + } + + // Clear the interval for delayed tracking tooltips + clearInterval(this.delayedShow) + + // Only set title if we had one before (see comment in _open()) + // If the title attribute has changed since open(), don't restore + if (target.data('ui-tooltip-title') && !target.attr('title')) { + target.attr('title', target.data('ui-tooltip-title')) + } + + this._removeDescribedBy(target) + + tooltipData.hiding = true + tooltip.stop(true) + this._hide(tooltip, this.options.hide, function () { + that._removeTooltip($(this)) + }) + + target.removeData('ui-tooltip-open') + this._off(target, 'mouseleave focusout keyup') + + // Remove 'remove' binding only on delegated targets + if (target[0] !== this.element[0]) { + this._off(target, 'remove') + } + this._off(this.document, 'mousemove') + + if (event && event.type === 'mouseleave') { + $.each(this.parents, function (id, parent) { + $(parent.element).attr('title', parent.title) + delete that.parents[id] + }) + } + + tooltipData.closing = true + this._trigger('close', event, { tooltip: tooltip }) + if (!tooltipData.hiding) { + tooltipData.closing = false + } + }, + + _tooltip: function (element) { + var tooltip = $('<div>').attr('role', 'tooltip'), + content = $('<div>').appendTo(tooltip), + id = tooltip.uniqueId().attr('id') + + this._addClass(content, 'ui-tooltip-content') + this._addClass(tooltip, 'ui-tooltip', 'ui-widget ui-widget-content') + + tooltip.appendTo(this._appendTo(element)) + + return (this.tooltips[id] = { + element: element, + tooltip: tooltip + }) + }, + + _find: function (target) { + var id = target.data('ui-tooltip-id') + return id ? this.tooltips[id] : null + }, + + _removeTooltip: function (tooltip) { + tooltip.remove() + delete this.tooltips[tooltip.attr('id')] + }, + + _appendTo: function (target) { + var element = target.closest('.ui-front, dialog') + + if (!element.length) { + element = this.document[0].body + } + + return element + }, + + _destroy: function () { + var that = this + + // Close open tooltips + $.each(this.tooltips, function (id, tooltipData) { + // Delegate to close method to handle common cleanup + var event = $.Event('blur'), + element = tooltipData.element + event.target = event.currentTarget = element[0] + that.close(event, true) + + // Remove immediately; destroying an open tooltip doesn't use the + // hide animation + $('#' + id).remove() + + // Restore the title + if (element.data('ui-tooltip-title')) { + // If the title attribute has changed since open(), don't restore + if (!element.attr('title')) { + element.attr('title', element.data('ui-tooltip-title')) + } + element.removeData('ui-tooltip-title') + } + }) + this.liveRegion.remove() + } + }) + + // DEPRECATED + // TODO: Switch return back to widget declaration at top of file when this is removed + if ($.uiBackCompat !== false) { + // Backcompat for tooltipClass option + $.widget('ui.tooltip', $.ui.tooltip, { + options: { + tooltipClass: null + }, + _tooltip: function () { + var tooltipData = this._superApply(arguments) + if (this.options.tooltipClass) { + tooltipData.tooltip.addClass(this.options.tooltipClass) + } + return tooltipData + } + }) + } + + var widgetsTooltip = $.ui.tooltip +}) diff --git a/public/static/modelView/js/loaders/ColladaLoader.js b/public/static/modelView/js/loaders/ColladaLoader.js new file mode 100644 index 0000000..25f8f15 --- /dev/null +++ b/public/static/modelView/js/loaders/ColladaLoader.js @@ -0,0 +1,3889 @@ +锘�/** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + +THREE.ColladaLoader = function (manager) { + + this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.ColladaLoader.prototype = { + + constructor: THREE.ColladaLoader, + + crossOrigin: 'anonymous', + + load: function (url, onLoad, onProgress, onError) { + + var scope = this; + + var path = scope.path === undefined ? THREE.LoaderUtils.extractUrlBase(url) : scope.path; + + var loader = new THREE.FileLoader(scope.manager); + loader.load(url, function (text) { + + onLoad(scope.parse(text, path)); + + }, onProgress, onError); + + }, + + setPath: function (value) { + + this.path = value; + return this; + + }, + + options: { + + set convertUpAxis(value) { + + console.warn('THREE.ColladaLoader: options.convertUpAxis() has been removed. Up axis is converted automatically.'); + + } + + }, + + setCrossOrigin: function (value) { + + this.crossOrigin = value; + return this; + + }, + + parse: function (text, path) { + + function getElementsByTagName(xml, name) { + + // Non recursive xml.getElementsByTagName() ... + + var array = []; + var childNodes = xml.childNodes; + + for (var i = 0, l = childNodes.length; i < l; i++) { + + var child = childNodes[i]; + + if (child.nodeName === name) { + + array.push(child); + + } + + } + + return array; + + } + + function parseStrings(text) { + + if (text.length === 0) return []; + + var parts = text.trim().split(/\s+/); + var array = new Array(parts.length); + + for (var i = 0, l = parts.length; i < l; i++) { + + array[i] = parts[i]; + + } + + return array; + + } + + function parseFloats(text) { + + if (text.length === 0) return []; + + var parts = text.trim().split(/\s+/); + var array = new Array(parts.length); + + for (var i = 0, l = parts.length; i < l; i++) { + + array[i] = parseFloat(parts[i]); + + } + + return array; + + } + + function parseInts(text) { + + if (text.length === 0) return []; + + var parts = text.trim().split(/\s+/); + var array = new Array(parts.length); + + for (var i = 0, l = parts.length; i < l; i++) { + + array[i] = parseInt(parts[i]); + + } + + return array; + + } + + function parseId(text) { + + return text.substring(1); + + } + + function generateId() { + + return 'three_default_' + (count++); + + } + + function isEmpty(object) { + + return Object.keys(object).length === 0; + + } + + // asset + + function parseAsset(xml) { + + return { + unit: parseAssetUnit(getElementsByTagName(xml, 'unit')[0]), + upAxis: parseAssetUpAxis(getElementsByTagName(xml, 'up_axis')[0]) + }; + + } + + function parseAssetUnit(xml) { + + if ((xml !== undefined) && (xml.hasAttribute('meter') === true)) { + + return parseFloat(xml.getAttribute('meter')); + + } else { + + return 1; // default 1 meter + + } + + } + + function parseAssetUpAxis(xml) { + + return xml !== undefined ? xml.textContent : 'Y_UP'; + + } + + // library + + function parseLibrary(xml, libraryName, nodeName, parser) { + + var library = getElementsByTagName(xml, libraryName)[0]; + + if (library !== undefined) { + + var elements = getElementsByTagName(library, nodeName); + + for (var i = 0; i < elements.length; i++) { + + parser(elements[i]); + + } + + } + + } + + function buildLibrary(data, builder) { + + for (var name in data) { + + var object = data[name]; + object.build = builder(data[name]); + + } + + } + + // get + + function getBuild(data, builder) { + + if (data.build !== undefined) return data.build; + + data.build = builder(data); + + return data.build; + + } + + // animation + + function parseAnimation(xml) { + + var data = { + sources: {}, + samplers: {}, + channels: {} + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + var id; + + switch (child.nodeName) { + + case 'source': + id = child.getAttribute('id'); + data.sources[id] = parseSource(child); + break; + + case 'sampler': + id = child.getAttribute('id'); + data.samplers[id] = parseAnimationSampler(child); + break; + + case 'channel': + id = child.getAttribute('target'); + data.channels[id] = parseAnimationChannel(child); + break; + + default: + console.log(child); + + } + + } + + library.animations[xml.getAttribute('id')] = data; + + } + + function parseAnimationSampler(xml) { + + var data = { + inputs: {}, + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'input': + var id = parseId(child.getAttribute('source')); + var semantic = child.getAttribute('semantic'); + data.inputs[semantic] = id; + break; + + } + + } + + return data; + + } + + function parseAnimationChannel(xml) { + + var data = {}; + + var target = xml.getAttribute('target'); + + // parsing SID Addressing Syntax + + var parts = target.split('/'); + + var id = parts.shift(); + var sid = parts.shift(); + + // check selection syntax + + var arraySyntax = (sid.indexOf('(') !== -1); + var memberSyntax = (sid.indexOf('.') !== -1); + + if (memberSyntax) { + + // member selection access + + parts = sid.split('.'); + sid = parts.shift(); + data.member = parts.shift(); + + } else if (arraySyntax) { + + // array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices. + + var indices = sid.split('('); + sid = indices.shift(); + + for (var i = 0; i < indices.length; i++) { + + indices[i] = parseInt(indices[i].replace(/\)/, '')); + + } + + data.indices = indices; + + } + + data.id = id; + data.sid = sid; + + data.arraySyntax = arraySyntax; + data.memberSyntax = memberSyntax; + + data.sampler = parseId(xml.getAttribute('source')); + + return data; + + } + + function buildAnimation(data) { + + var tracks = []; + + var channels = data.channels; + var samplers = data.samplers; + var sources = data.sources; + + for (var target in channels) { + + if (channels.hasOwnProperty(target)) { + + var channel = channels[target]; + var sampler = samplers[channel.sampler]; + + var inputId = sampler.inputs.INPUT; + var outputId = sampler.inputs.OUTPUT; + + var inputSource = sources[inputId]; + var outputSource = sources[outputId]; + + var animation = buildAnimationChannel(channel, inputSource, outputSource); + + createKeyframeTracks(animation, tracks); + + } + + } + + return tracks; + + } + + function getAnimation(id) { + + return getBuild(library.animations[id], buildAnimation); + + } + + function buildAnimationChannel(channel, inputSource, outputSource) { + + var node = library.nodes[channel.id]; + var object3D = getNode(node.id); + + var transform = node.transforms[channel.sid]; + var defaultMatrix = node.matrix.clone().transpose(); + + var time, stride; + var i, il, j, jl; + + var data = {}; + + // the collada spec allows the animation of data in various ways. + // depending on the transform type (matrix, translate, rotate, scale), we execute different logic + + switch (transform) { + + case 'matrix': + + for (i = 0, il = inputSource.array.length; i < il; i++) { + + time = inputSource.array[i]; + stride = i * outputSource.stride; + + if (data[time] === undefined) data[time] = {}; + + if (channel.arraySyntax === true) { + + var value = outputSource.array[stride]; + var index = channel.indices[0] + 4 * channel.indices[1]; + + data[time][index] = value; + + } else { + + for (j = 0, jl = outputSource.stride; j < jl; j++) { + + data[time][j] = outputSource.array[stride + j]; + + } + + } + + } + + break; + + case 'translate': + console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform); + break; + + case 'rotate': + console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform); + break; + + case 'scale': + console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform); + break; + + } + + var keyframes = prepareAnimationData(data, defaultMatrix); + + var animation = { + name: object3D.uuid, + keyframes: keyframes + }; + + return animation; + + } + + function prepareAnimationData(data, defaultMatrix) { + + var keyframes = []; + + // transfer data into a sortable array + + for (var time in data) { + + keyframes.push({ time: parseFloat(time), value: data[time] }); + + } + + // ensure keyframes are sorted by time + + keyframes.sort(ascending); + + // now we clean up all animation data, so we can use them for keyframe tracks + + for (var i = 0; i < 16; i++) { + + transformAnimationData(keyframes, i, defaultMatrix.elements[i]); + + } + + return keyframes; + + // array sort function + + function ascending(a, b) { + + return a.time - b.time; + + } + + } + + var position = new THREE.Vector3(); + var scale = new THREE.Vector3(); + var quaternion = new THREE.Quaternion(); + + function createKeyframeTracks(animation, tracks) { + + var keyframes = animation.keyframes; + var name = animation.name; + + var times = []; + var positionData = []; + var quaternionData = []; + var scaleData = []; + + for (var i = 0, l = keyframes.length; i < l; i++) { + + var keyframe = keyframes[i]; + + var time = keyframe.time; + var value = keyframe.value; + + matrix.fromArray(value).transpose(); + matrix.decompose(position, quaternion, scale); + + times.push(time); + positionData.push(position.x, position.y, position.z); + quaternionData.push(quaternion.x, quaternion.y, quaternion.z, quaternion.w); + scaleData.push(scale.x, scale.y, scale.z); + + } + + if (positionData.length > 0) tracks.push(new THREE.VectorKeyframeTrack(name + '.position', times, positionData)); + if (quaternionData.length > 0) tracks.push(new THREE.QuaternionKeyframeTrack(name + '.quaternion', times, quaternionData)); + if (scaleData.length > 0) tracks.push(new THREE.VectorKeyframeTrack(name + '.scale', times, scaleData)); + + return tracks; + + } + + function transformAnimationData(keyframes, property, defaultValue) { + + var keyframe; + + var empty = true; + var i, l; + + // check, if values of a property are missing in our keyframes + + for (i = 0, l = keyframes.length; i < l; i++) { + + keyframe = keyframes[i]; + + if (keyframe.value[property] === undefined) { + + keyframe.value[property] = null; // mark as missing + + } else { + + empty = false; + + } + + } + + if (empty === true) { + + // no values at all, so we set a default value + + for (i = 0, l = keyframes.length; i < l; i++) { + + keyframe = keyframes[i]; + + keyframe.value[property] = defaultValue; + + } + + } else { + + // filling gaps + + createMissingKeyframes(keyframes, property); + + } + + } + + function createMissingKeyframes(keyframes, property) { + + var prev, next; + + for (var i = 0, l = keyframes.length; i < l; i++) { + + var keyframe = keyframes[i]; + + if (keyframe.value[property] === null) { + + prev = getPrev(keyframes, i, property); + next = getNext(keyframes, i, property); + + if (prev === null) { + + keyframe.value[property] = next.value[property]; + continue; + + } + + if (next === null) { + + keyframe.value[property] = prev.value[property]; + continue; + + } + + interpolate(keyframe, prev, next, property); + + } + + } + + } + + function getPrev(keyframes, i, property) { + + while (i >= 0) { + + var keyframe = keyframes[i]; + + if (keyframe.value[property] !== null) return keyframe; + + i--; + + } + + return null; + + } + + function getNext(keyframes, i, property) { + + while (i < keyframes.length) { + + var keyframe = keyframes[i]; + + if (keyframe.value[property] !== null) return keyframe; + + i++; + + } + + return null; + + } + + function interpolate(key, prev, next, property) { + + if ((next.time - prev.time) === 0) { + + key.value[property] = prev.value[property]; + return; + + } + + key.value[property] = ((key.time - prev.time) * (next.value[property] - prev.value[property]) / (next.time - prev.time)) + prev.value[property]; + + } + + // animation clips + + function parseAnimationClip(xml) { + + var data = { + name: xml.getAttribute('id') || 'default', + start: parseFloat(xml.getAttribute('start') || 0), + end: parseFloat(xml.getAttribute('end') || 0), + animations: [] + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'instance_animation': + data.animations.push(parseId(child.getAttribute('url'))); + break; + + } + + } + + library.clips[xml.getAttribute('id')] = data; + + } + + function buildAnimationClip(data) { + + var tracks = []; + + var name = data.name; + var duration = (data.end - data.start) || -1; + var animations = data.animations; + + for (var i = 0, il = animations.length; i < il; i++) { + + var animationTracks = getAnimation(animations[i]); + + for (var j = 0, jl = animationTracks.length; j < jl; j++) { + + tracks.push(animationTracks[j]); + + } + + } + + return new THREE.AnimationClip(name, duration, tracks); + + } + + function getAnimationClip(id) { + + return getBuild(library.clips[id], buildAnimationClip); + + } + + // controller + + function parseController(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'skin': + // there is exactly one skin per controller + data.id = parseId(child.getAttribute('source')); + data.skin = parseSkin(child); + break; + + case 'morph': + data.id = parseId(child.getAttribute('source')); + console.warn('THREE.ColladaLoader: Morph target animation not supported yet.'); + break; + + } + + } + + library.controllers[xml.getAttribute('id')] = data; + + } + + function parseSkin(xml) { + + var data = { + sources: {} + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'bind_shape_matrix': + data.bindShapeMatrix = parseFloats(child.textContent); + break; + + case 'source': + var id = child.getAttribute('id'); + data.sources[id] = parseSource(child); + break; + + case 'joints': + data.joints = parseJoints(child); + break; + + case 'vertex_weights': + data.vertexWeights = parseVertexWeights(child); + break; + + } + + } + + return data; + + } + + function parseJoints(xml) { + + var data = { + inputs: {} + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'input': + var semantic = child.getAttribute('semantic'); + var id = parseId(child.getAttribute('source')); + data.inputs[semantic] = id; + break; + + } + + } + + return data; + + } + + function parseVertexWeights(xml) { + + var data = { + inputs: {} + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'input': + var semantic = child.getAttribute('semantic'); + var id = parseId(child.getAttribute('source')); + var offset = parseInt(child.getAttribute('offset')); + data.inputs[semantic] = { id: id, offset: offset }; + break; + + case 'vcount': + data.vcount = parseInts(child.textContent); + break; + + case 'v': + data.v = parseInts(child.textContent); + break; + + } + + } + + return data; + + } + + function buildController(data) { + + var build = { + id: data.id + }; + + var geometry = library.geometries[build.id]; + + if (data.skin !== undefined) { + + build.skin = buildSkin(data.skin); + + // we enhance the 'sources' property of the corresponding geometry with our skin data + + geometry.sources.skinIndices = build.skin.indices; + geometry.sources.skinWeights = build.skin.weights; + + } + + return build; + + } + + function buildSkin(data) { + + var BONE_LIMIT = 4; + + var build = { + joints: [], // this must be an array to preserve the joint order + indices: { + array: [], + stride: BONE_LIMIT + }, + weights: { + array: [], + stride: BONE_LIMIT + } + }; + + var sources = data.sources; + var vertexWeights = data.vertexWeights; + + var vcount = vertexWeights.vcount; + var v = vertexWeights.v; + var jointOffset = vertexWeights.inputs.JOINT.offset; + var weightOffset = vertexWeights.inputs.WEIGHT.offset; + + var jointSource = data.sources[data.joints.inputs.JOINT]; + var inverseSource = data.sources[data.joints.inputs.INV_BIND_MATRIX]; + + var weights = sources[vertexWeights.inputs.WEIGHT.id].array; + var stride = 0; + + var i, j, l; + + // procces skin data for each vertex + + for (i = 0, l = vcount.length; i < l; i++) { + + var jointCount = vcount[i]; // this is the amount of joints that affect a single vertex + var vertexSkinData = []; + + for (j = 0; j < jointCount; j++) { + + var skinIndex = v[stride + jointOffset]; + var weightId = v[stride + weightOffset]; + var skinWeight = weights[weightId]; + + vertexSkinData.push({ index: skinIndex, weight: skinWeight }); + + stride += 2; + + } + + // we sort the joints in descending order based on the weights. + // this ensures, we only procced the most important joints of the vertex + + vertexSkinData.sort(descending); + + // now we provide for each vertex a set of four index and weight values. + // the order of the skin data matches the order of vertices + + for (j = 0; j < BONE_LIMIT; j++) { + + var d = vertexSkinData[j]; + + if (d !== undefined) { + + build.indices.array.push(d.index); + build.weights.array.push(d.weight); + + } else { + + build.indices.array.push(0); + build.weights.array.push(0); + + } + + } + + } + + // setup bind matrix + + if (data.bindShapeMatrix) { + + build.bindMatrix = new THREE.Matrix4().fromArray(data.bindShapeMatrix).transpose(); + + } else { + + build.bindMatrix = new THREE.Matrix4().identity(); + + } + + // process bones and inverse bind matrix data + + for (i = 0, l = jointSource.array.length; i < l; i++) { + + var name = jointSource.array[i]; + var boneInverse = new THREE.Matrix4().fromArray(inverseSource.array, i * inverseSource.stride).transpose(); + + build.joints.push({ name: name, boneInverse: boneInverse }); + + } + + return build; + + // array sort function + + function descending(a, b) { + + return b.weight - a.weight; + + } + + } + + function getController(id) { + + return getBuild(library.controllers[id], buildController); + + } + + // image + + function parseImage(xml) { + + var data = { + init_from: getElementsByTagName(xml, 'init_from')[0].textContent + }; + + library.images[xml.getAttribute('id')] = data; + + } + + function buildImage(data) { + + if (data.build !== undefined) return data.build; + + return data.init_from; + + } + + function getImage(id) { + + var data = library.images[id]; + + if (data !== undefined) { + + return getBuild(data, buildImage); + + } + + console.warn('THREE.ColladaLoader: Couldn\'t find image with ID:', id); + + return null; + + } + + // effect + + function parseEffect(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'profile_COMMON': + data.profile = parseEffectProfileCOMMON(child); + break; + + } + + } + + library.effects[xml.getAttribute('id')] = data; + + } + + function parseEffectProfileCOMMON(xml) { + + var data = { + surfaces: {}, + samplers: {} + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'newparam': + parseEffectNewparam(child, data); + break; + + case 'technique': + data.technique = parseEffectTechnique(child); + break; + + case 'extra': + data.extra = parseEffectExtra(child); + break; + + } + + } + + return data; + + } + + function parseEffectNewparam(xml, data) { + + var sid = xml.getAttribute('sid'); + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'surface': + data.surfaces[sid] = parseEffectSurface(child); + break; + + case 'sampler2D': + data.samplers[sid] = parseEffectSampler(child); + break; + + } + + } + + } + + function parseEffectSurface(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'init_from': + data.init_from = child.textContent; + break; + + } + + } + + return data; + + } + + function parseEffectSampler(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'source': + data.source = child.textContent; + break; + + } + + } + + return data; + + } + + function parseEffectTechnique(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'constant': + case 'lambert': + case 'blinn': + case 'phong': + data.type = child.nodeName; + data.parameters = parseEffectParameters(child); + break; + + } + + } + + return data; + + } + + function parseEffectParameters(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'emission': + case 'diffuse': + case 'specular': + case 'shininess': + case 'transparency': + data[child.nodeName] = parseEffectParameter(child); + break; + case 'transparent': + data[child.nodeName] = { + opaque: child.getAttribute('opaque'), + data: parseEffectParameter(child) + }; + break; + + } + + } + + return data; + + } + + function parseEffectParameter(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'color': + data[child.nodeName] = parseFloats(child.textContent); + break; + + case 'float': + data[child.nodeName] = parseFloat(child.textContent); + break; + + case 'texture': + data[child.nodeName] = { id: child.getAttribute('texture'), extra: parseEffectParameterTexture(child) }; + break; + + } + + } + + return data; + + } + + function parseEffectParameterTexture(xml) { + + var data = { + technique: {} + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'extra': + parseEffectParameterTextureExtra(child, data); + break; + + } + + } + + return data; + + } + + function parseEffectParameterTextureExtra(xml, data) { + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'technique': + parseEffectParameterTextureExtraTechnique(child, data); + break; + + } + + } + + } + + function parseEffectParameterTextureExtraTechnique(xml, data) { + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'repeatU': + case 'repeatV': + case 'offsetU': + case 'offsetV': + data.technique[child.nodeName] = parseFloat(child.textContent); + break; + + case 'wrapU': + case 'wrapV': + + // some files have values for wrapU/wrapV which become NaN via parseInt + + if (child.textContent.toUpperCase() === 'TRUE') { + + data.technique[child.nodeName] = 1; + + } else if (child.textContent.toUpperCase() === 'FALSE') { + + data.technique[child.nodeName] = 0; + + } else { + + data.technique[child.nodeName] = parseInt(child.textContent); + + } + + break; + + } + + } + + } + + function parseEffectExtra(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'technique': + data.technique = parseEffectExtraTechnique(child); + break; + + } + + } + + return data; + + } + + function parseEffectExtraTechnique(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'double_sided': + data[child.nodeName] = parseInt(child.textContent); + break; + + } + + } + + return data; + + } + + function buildEffect(data) { + + return data; + + } + + function getEffect(id) { + + return getBuild(library.effects[id], buildEffect); + + } + + // material + + function parseMaterial(xml) { + + var data = { + name: xml.getAttribute('name') + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'instance_effect': + data.url = parseId(child.getAttribute('url')); + break; + + } + + } + + library.materials[xml.getAttribute('id')] = data; + + } + + function getTextureLoader(image) { + + var loader; + + var extension = image.slice((image.lastIndexOf('.') - 1 >>> 0) + 2); // http://www.jstips.co/en/javascript/get-file-extension/ + extension = extension.toLowerCase(); + + switch (extension) { + + case 'tga': + loader = tgaLoader; + break; + + default: + loader = textureLoader; + + } + + return loader; + + } + + function buildMaterial(data) { + + var effect = getEffect(data.url); + var technique = effect.profile.technique; + var extra = effect.profile.extra; + + var material; + + switch (technique.type) { + + case 'phong': + case 'blinn': + material = new THREE.MeshPhongMaterial(); + break; + + case 'lambert': + material = new THREE.MeshLambertMaterial(); + break; + + default: + material = new THREE.MeshBasicMaterial(); + break; + + } + + material.name = data.name; + + function getTexture(textureObject) { + + var sampler = effect.profile.samplers[textureObject.id]; + var image = null; + + // get image + + if (sampler !== undefined) { + + var surface = effect.profile.surfaces[sampler.source]; + image = getImage(surface.init_from); + + } else { + + console.warn('THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).'); + image = getImage(textureObject.id); + + } + + // create texture if image is avaiable + + if (image !== null) { + + var loader = getTextureLoader(image); + + if (loader !== undefined) { + + var texture = loader.load(image); + + var extra = textureObject.extra; + + if (extra !== undefined && extra.technique !== undefined && isEmpty(extra.technique) === false) { + + var technique = extra.technique; + + texture.wrapS = technique.wrapU ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; + texture.wrapT = technique.wrapV ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; + + texture.offset.set(technique.offsetU || 0, technique.offsetV || 0); + texture.repeat.set(technique.repeatU || 1, technique.repeatV || 1); + + } else { + + texture.wrapS = THREE.RepeatWrapping; + texture.wrapT = THREE.RepeatWrapping; + + } + + return texture; + + } else { + + console.warn('THREE.ColladaLoader: Loader for texture %s not found.', image); + + return null; + + } + + } else { + + console.warn('THREE.ColladaLoader: Couldn\'t create texture with ID:', textureObject.id); + + return null; + + } + + } + + var parameters = technique.parameters; + + for (var key in parameters) { + + var parameter = parameters[key]; + + switch (key) { + + case 'diffuse': + if (parameter.color) material.color.fromArray(parameter.color); + if (parameter.texture) material.map = getTexture(parameter.texture); + break; + case 'specular': + if (parameter.color && material.specular) material.specular.fromArray(parameter.color); + if (parameter.texture) material.specularMap = getTexture(parameter.texture); + break; + case 'shininess': + if (parameter.float && material.shininess) material.shininess = parameter.float; + break; + case 'emission': + if (parameter.color && material.emissive) material.emissive.fromArray(parameter.color); + if (parameter.texture) material.emissiveMap = getTexture(parameter.texture); + break; + + } + + } + + // + + var transparent = parameters['transparent']; + var transparency = parameters['transparency']; + + // <transparency> does not exist but <transparent> + + if (transparency === undefined && transparent) { + + transparency = { + float: 1 + }; + + } + + // <transparent> does not exist but <transparency> + + if (transparent === undefined && transparency) { + + transparent = { + opaque: 'A_ONE', + data: { + color: [1, 1, 1, 1] + } + }; + + } + + if (transparent && transparency) { + + // handle case if a texture exists but no color + + if (transparent.data.texture) { + + // we do not set an alpha map (see #13792) + + material.transparent = true; + + } else { + + var color = transparent.data.color; + + switch (transparent.opaque) { + + case 'A_ONE': + material.opacity = color[3] * transparency.float; + break; + case 'RGB_ZERO': + material.opacity = 1 - (color[0] * transparency.float); + break; + case 'A_ZERO': + material.opacity = 1 - (color[3] * transparency.float); + break; + case 'RGB_ONE': + material.opacity = color[0] * transparency.float; + break; + default: + console.warn('THREE.ColladaLoader: Invalid opaque type "%s" of transparent tag.', transparent.opaque); + + } + + if (material.opacity < 1) material.transparent = true; + + } + + } + + // + + if (extra !== undefined && extra.technique !== undefined && extra.technique.double_sided === 1) { + + material.side = THREE.DoubleSide; + + } + + return material; + + } + + function getMaterial(id) { + + return getBuild(library.materials[id], buildMaterial); + + } + + // camera + + function parseCamera(xml) { + + var data = { + name: xml.getAttribute('name') + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'optics': + data.optics = parseCameraOptics(child); + break; + + } + + } + + library.cameras[xml.getAttribute('id')] = data; + + } + + function parseCameraOptics(xml) { + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + switch (child.nodeName) { + + case 'technique_common': + return parseCameraTechnique(child); + + } + + } + + return {}; + + } + + function parseCameraTechnique(xml) { + + var data = {}; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + switch (child.nodeName) { + + case 'perspective': + case 'orthographic': + + data.technique = child.nodeName; + data.parameters = parseCameraParameters(child); + + break; + + } + + } + + return data; + + } + + function parseCameraParameters(xml) { + + var data = {}; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + switch (child.nodeName) { + + case 'xfov': + case 'yfov': + case 'xmag': + case 'ymag': + case 'znear': + case 'zfar': + case 'aspect_ratio': + data[child.nodeName] = parseFloat(child.textContent); + break; + + } + + } + + return data; + + } + + function buildCamera(data) { + + var camera; + + switch (data.optics.technique) { + + case 'perspective': + camera = new THREE.PerspectiveCamera( + data.optics.parameters.yfov, + data.optics.parameters.aspect_ratio, + data.optics.parameters.znear, + data.optics.parameters.zfar + ); + break; + + case 'orthographic': + var ymag = data.optics.parameters.ymag; + var xmag = data.optics.parameters.xmag; + var aspectRatio = data.optics.parameters.aspect_ratio; + + xmag = (xmag === undefined) ? (ymag * aspectRatio) : xmag; + ymag = (ymag === undefined) ? (xmag / aspectRatio) : ymag; + + xmag *= 0.5; + ymag *= 0.5; + + camera = new THREE.OrthographicCamera( + -xmag, xmag, ymag, -ymag, // left, right, top, bottom + data.optics.parameters.znear, + data.optics.parameters.zfar + ); + break; + + default: + camera = new THREE.PerspectiveCamera(); + break; + + } + + camera.name = data.name; + + return camera; + + } + + function getCamera(id) { + + var data = library.cameras[id]; + + if (data !== undefined) { + + return getBuild(data, buildCamera); + + } + + console.warn('THREE.ColladaLoader: Couldn\'t find camera with ID:', id); + + return null; + + } + + // light + + function parseLight(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'technique_common': + data = parseLightTechnique(child); + break; + + } + + } + + library.lights[xml.getAttribute('id')] = data; + + } + + function parseLightTechnique(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'directional': + case 'point': + case 'spot': + case 'ambient': + + data.technique = child.nodeName; + data.parameters = parseLightParameters(child); + + } + + } + + return data; + + } + + function parseLightParameters(xml) { + + var data = {}; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'color': + var array = parseFloats(child.textContent); + data.color = new THREE.Color().fromArray(array); + break; + + case 'falloff_angle': + data.falloffAngle = parseFloat(child.textContent); + break; + + case 'quadratic_attenuation': + var f = parseFloat(child.textContent); + data.distance = f ? Math.sqrt(1 / f) : 0; + break; + + } + + } + + return data; + + } + + function buildLight(data) { + + var light; + + switch (data.technique) { + + case 'directional': + light = new THREE.DirectionalLight(); + break; + + case 'point': + light = new THREE.PointLight(); + break; + + case 'spot': + light = new THREE.SpotLight(); + break; + + case 'ambient': + light = new THREE.AmbientLight(); + break; + + } + + if (data.parameters.color) light.color.copy(data.parameters.color); + if (data.parameters.distance) light.distance = data.parameters.distance; + + return light; + + } + + function getLight(id) { + + var data = library.lights[id]; + + if (data !== undefined) { + + return getBuild(data, buildLight); + + } + + console.warn('THREE.ColladaLoader: Couldn\'t find light with ID:', id); + + return null; + + } + + // geometry + + function parseGeometry(xml) { + + var data = { + name: xml.getAttribute('name'), + sources: {}, + vertices: {}, + primitives: [] + }; + + var mesh = getElementsByTagName(xml, 'mesh')[0]; + + // the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep + if (mesh === undefined) return; + + for (var i = 0; i < mesh.childNodes.length; i++) { + + var child = mesh.childNodes[i]; + + if (child.nodeType !== 1) continue; + + var id = child.getAttribute('id'); + + switch (child.nodeName) { + + case 'source': + data.sources[id] = parseSource(child); + break; + + case 'vertices': + // data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ]; + data.vertices = parseGeometryVertices(child); + break; + + case 'polygons': + console.warn('THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName); + break; + + case 'lines': + case 'linestrips': + case 'polylist': + case 'triangles': + data.primitives.push(parseGeometryPrimitive(child)); + break; + + default: + console.log(child); + + } + + } + + library.geometries[xml.getAttribute('id')] = data; + + } + + function parseSource(xml) { + + var data = { + array: [], + stride: 3 + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'float_array': + data.array = parseFloats(child.textContent); + break; + + case 'Name_array': + data.array = parseStrings(child.textContent); + break; + + case 'technique_common': + var accessor = getElementsByTagName(child, 'accessor')[0]; + + if (accessor !== undefined) { + + data.stride = parseInt(accessor.getAttribute('stride')); + + } + break; + + } + + } + + return data; + + } + + function parseGeometryVertices(xml) { + + var data = {}; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + data[child.getAttribute('semantic')] = parseId(child.getAttribute('source')); + + } + + return data; + + } + + function parseGeometryPrimitive(xml) { + + var primitive = { + type: xml.nodeName, + material: xml.getAttribute('material'), + count: parseInt(xml.getAttribute('count')), + inputs: {}, + stride: 0, + hasUV: false + }; + + for (var i = 0, l = xml.childNodes.length; i < l; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'input': + var id = parseId(child.getAttribute('source')); + var semantic = child.getAttribute('semantic'); + var offset = parseInt(child.getAttribute('offset')); + primitive.inputs[semantic] = { id: id, offset: offset }; + primitive.stride = Math.max(primitive.stride, offset + 1); + if (semantic === 'TEXCOORD') primitive.hasUV = true; + break; + + case 'vcount': + primitive.vcount = parseInts(child.textContent); + break; + + case 'p': + primitive.p = parseInts(child.textContent); + break; + + } + + } + + return primitive; + + } + + function groupPrimitives(primitives) { + + var build = {}; + + for (var i = 0; i < primitives.length; i++) { + + var primitive = primitives[i]; + + if (build[primitive.type] === undefined) build[primitive.type] = []; + + build[primitive.type].push(primitive); + + } + + return build; + + } + + function checkUVCoordinates(primitives) { + + var count = 0; + + for (var i = 0, l = primitives.length; i < l; i++) { + + var primitive = primitives[i]; + + if (primitive.hasUV === true) { + + count++; + + } + + } + + if (count > 0 && count < primitives.length) { + + primitives.uvsNeedsFix = true; + + } + + } + + function buildGeometry(data) { + + var build = {}; + + var sources = data.sources; + var vertices = data.vertices; + var primitives = data.primitives; + + if (primitives.length === 0) return {}; + + // our goal is to create one buffer geometry for a single type of primitives + // first, we group all primitives by their type + + var groupedPrimitives = groupPrimitives(primitives); + + for (var type in groupedPrimitives) { + + var primitiveType = groupedPrimitives[type]; + + // second, ensure consistent uv coordinates for each type of primitives (polylist,triangles or lines) + + checkUVCoordinates(primitiveType); + + // third, create a buffer geometry for each type of primitives + + build[type] = buildGeometryType(primitiveType, sources, vertices); + + } + + return build; + + } + + function buildGeometryType(primitives, sources, vertices) { + + var build = {}; + + var position = { array: [], stride: 0 }; + var normal = { array: [], stride: 0 }; + var uv = { array: [], stride: 0 }; + var color = { array: [], stride: 0 }; + + var skinIndex = { array: [], stride: 4 }; + var skinWeight = { array: [], stride: 4 }; + + var geometry = new THREE.BufferGeometry(); + + var materialKeys = []; + + var start = 0; + + for (var p = 0; p < primitives.length; p++) { + + var primitive = primitives[p]; + var inputs = primitive.inputs; + + // groups + + var count = 0; + + switch (primitive.type) { + + case 'lines': + case 'linestrips': + count = primitive.count * 2; + break; + + case 'triangles': + count = primitive.count * 3; + break; + + case 'polylist': + + for (var g = 0; g < primitive.count; g++) { + + var vc = primitive.vcount[g]; + + switch (vc) { + + case 3: + count += 3; // single triangle + break; + + case 4: + count += 6; // quad, subdivided into two triangles + break; + + default: + count += (vc - 2) * 3; // polylist with more than four vertices + break; + + } + + } + + break; + + default: + console.warn('THREE.ColladaLoader: Unknow primitive type:', primitive.type); + + } + + geometry.addGroup(start, count, p); + start += count; + + // material + + if (primitive.material) { + + materialKeys.push(primitive.material); + + } + + // geometry data + + for (var name in inputs) { + + var input = inputs[name]; + + switch (name) { + + case 'VERTEX': + for (var key in vertices) { + + var id = vertices[key]; + + switch (key) { + + case 'POSITION': + var prevLength = position.array.length; + buildGeometryData(primitive, sources[id], input.offset, position.array); + position.stride = sources[id].stride; + + if (sources.skinWeights && sources.skinIndices) { + + buildGeometryData(primitive, sources.skinIndices, input.offset, skinIndex.array); + buildGeometryData(primitive, sources.skinWeights, input.offset, skinWeight.array); + + } + + // see #3803 + + if (primitive.hasUV === false && primitives.uvsNeedsFix === true) { + + var count = (position.array.length - prevLength) / position.stride; + + for (var i = 0; i < count; i++) { + + // fill missing uv coordinates + + uv.array.push(0, 0); + + } + + } + break; + + case 'NORMAL': + buildGeometryData(primitive, sources[id], input.offset, normal.array); + normal.stride = sources[id].stride; + break; + + case 'COLOR': + buildGeometryData(primitive, sources[id], input.offset, color.array); + color.stride = sources[id].stride; + break; + + case 'TEXCOORD': + buildGeometryData(primitive, sources[id], input.offset, uv.array); + uv.stride = sources[id].stride; + break; + + default: + console.warn('THREE.ColladaLoader: Semantic "%s" not handled in geometry build process.', key); + + } + + } + break; + + case 'NORMAL': + buildGeometryData(primitive, sources[input.id], input.offset, normal.array); + normal.stride = sources[input.id].stride; + break; + + case 'COLOR': + buildGeometryData(primitive, sources[input.id], input.offset, color.array); + color.stride = sources[input.id].stride; + break; + + case 'TEXCOORD': + buildGeometryData(primitive, sources[input.id], input.offset, uv.array); + uv.stride = sources[input.id].stride; + break; + + } + + } + + } + + // build geometry + + if (position.array.length > 0) geometry.addAttribute('position', new THREE.Float32BufferAttribute(position.array, position.stride)); + if (normal.array.length > 0) geometry.addAttribute('normal', new THREE.Float32BufferAttribute(normal.array, normal.stride)); + if (color.array.length > 0) geometry.addAttribute('color', new THREE.Float32BufferAttribute(color.array, color.stride)); + if (uv.array.length > 0) geometry.addAttribute('uv', new THREE.Float32BufferAttribute(uv.array, uv.stride)); + + if (skinIndex.array.length > 0) geometry.addAttribute('skinIndex', new THREE.Float32BufferAttribute(skinIndex.array, skinIndex.stride)); + if (skinWeight.array.length > 0) geometry.addAttribute('skinWeight', new THREE.Float32BufferAttribute(skinWeight.array, skinWeight.stride)); + + build.data = geometry; + build.type = primitives[0].type; + build.materialKeys = materialKeys; + + return build; + + } + + function buildGeometryData(primitive, source, offset, array) { + + var indices = primitive.p; + var stride = primitive.stride; + var vcount = primitive.vcount; + + function pushVector(i) { + + var index = indices[i + offset] * sourceStride; + var length = index + sourceStride; + + for (; index < length; index++) { + + array.push(sourceArray[index]); + + } + + } + + var sourceArray = source.array; + var sourceStride = source.stride; + + if (primitive.vcount !== undefined) { + + var index = 0; + + for (var i = 0, l = vcount.length; i < l; i++) { + + var count = vcount[i]; + + if (count === 4) { + + var a = index + stride * 0; + var b = index + stride * 1; + var c = index + stride * 2; + var d = index + stride * 3; + + pushVector(a); pushVector(b); pushVector(d); + pushVector(b); pushVector(c); pushVector(d); + + } else if (count === 3) { + + var a = index + stride * 0; + var b = index + stride * 1; + var c = index + stride * 2; + + pushVector(a); pushVector(b); pushVector(c); + + } else if (count > 4) { + + for (var k = 1, kl = (count - 2) ; k <= kl; k++) { + + var a = index + stride * 0; + var b = index + stride * k; + var c = index + stride * (k + 1); + + pushVector(a); pushVector(b); pushVector(c); + + } + + } + + index += stride * count; + + } + + } else { + + for (var i = 0, l = indices.length; i < l; i += stride) { + + pushVector(i); + + } + + } + + } + + function getGeometry(id) { + + return getBuild(library.geometries[id], buildGeometry); + + } + + // kinematics + + function parseKinematicsModel(xml) { + + var data = { + name: xml.getAttribute('name') || '', + joints: {}, + links: [] + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'technique_common': + parseKinematicsTechniqueCommon(child, data); + break; + + } + + } + + library.kinematicsModels[xml.getAttribute('id')] = data; + + } + + function buildKinematicsModel(data) { + + if (data.build !== undefined) return data.build; + + return data; + + } + + function getKinematicsModel(id) { + + return getBuild(library.kinematicsModels[id], buildKinematicsModel); + + } + + function parseKinematicsTechniqueCommon(xml, data) { + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'joint': + data.joints[child.getAttribute('sid')] = parseKinematicsJoint(child); + break; + + case 'link': + data.links.push(parseKinematicsLink(child)); + break; + + } + + } + + } + + function parseKinematicsJoint(xml) { + + var data; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'prismatic': + case 'revolute': + data = parseKinematicsJointParameter(child); + break; + + } + + } + + return data; + + } + + function parseKinematicsJointParameter(xml, data) { + + var data = { + sid: xml.getAttribute('sid'), + name: xml.getAttribute('name') || '', + axis: new THREE.Vector3(), + limits: { + min: 0, + max: 0 + }, + type: xml.nodeName, + static: false, + zeroPosition: 0, + middlePosition: 0 + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'axis': + var array = parseFloats(child.textContent); + data.axis.fromArray(array); + break; + case 'limits': + var max = child.getElementsByTagName('max')[0]; + var min = child.getElementsByTagName('min')[0]; + + data.limits.max = parseFloat(max.textContent); + data.limits.min = parseFloat(min.textContent); + break; + + } + + } + + // if min is equal to or greater than max, consider the joint static + + if (data.limits.min >= data.limits.max) { + + data.static = true; + + } + + // calculate middle position + + data.middlePosition = (data.limits.min + data.limits.max) / 2.0; + + return data; + + } + + function parseKinematicsLink(xml) { + + var data = { + sid: xml.getAttribute('sid'), + name: xml.getAttribute('name') || '', + attachments: [], + transforms: [] + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'attachment_full': + data.attachments.push(parseKinematicsAttachment(child)); + break; + + case 'matrix': + case 'translate': + case 'rotate': + data.transforms.push(parseKinematicsTransform(child)); + break; + + } + + } + + return data; + + } + + function parseKinematicsAttachment(xml) { + + var data = { + joint: xml.getAttribute('joint').split('/').pop(), + transforms: [], + links: [] + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'link': + data.links.push(parseKinematicsLink(child)); + break; + + case 'matrix': + case 'translate': + case 'rotate': + data.transforms.push(parseKinematicsTransform(child)); + break; + + } + + } + + return data; + + } + + function parseKinematicsTransform(xml) { + + var data = { + type: xml.nodeName + }; + + var array = parseFloats(xml.textContent); + + switch (data.type) { + + case 'matrix': + data.obj = new THREE.Matrix4(); + data.obj.fromArray(array).transpose(); + break; + + case 'translate': + data.obj = new THREE.Vector3(); + data.obj.fromArray(array); + break; + + case 'rotate': + data.obj = new THREE.Vector3(); + data.obj.fromArray(array); + data.angle = THREE.Math.degToRad(array[3]); + break; + + } + + return data; + + } + + // physics + + function parsePhysicsModel(xml) { + + var data = { + name: xml.getAttribute('name') || '', + rigidBodies: {} + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'rigid_body': + data.rigidBodies[child.getAttribute('name')] = {}; + parsePhysicsRigidBody(child, data.rigidBodies[child.getAttribute('name')]); + break; + + } + + } + + library.physicsModels[xml.getAttribute('id')] = data; + + } + + function parsePhysicsRigidBody(xml, data) { + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'technique_common': + parsePhysicsTechniqueCommon(child, data); + break; + + } + + } + + } + + function parsePhysicsTechniqueCommon(xml, data) { + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'inertia': + data.inertia = parseFloats(child.textContent); + break; + + case 'mass': + data.mass = parseFloats(child.textContent)[0]; + break; + + } + + } + + } + + // scene + + function parseKinematicsScene(xml) { + + var data = { + bindJointAxis: [] + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'bind_joint_axis': + data.bindJointAxis.push(parseKinematicsBindJointAxis(child)); + break; + + } + + } + + library.kinematicsScenes[parseId(xml.getAttribute('url'))] = data; + + } + + function parseKinematicsBindJointAxis(xml) { + + var data = { + target: xml.getAttribute('target').split('/').pop() + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'axis': + var param = child.getElementsByTagName('param')[0]; + data.axis = param.textContent; + var tmpJointIndex = data.axis.split('inst_').pop().split('axis')[0]; + data.jointIndex = tmpJointIndex.substr(0, tmpJointIndex.length - 1); + break; + + } + + } + + return data; + + } + + function buildKinematicsScene(data) { + + if (data.build !== undefined) return data.build; + + return data; + + } + + function getKinematicsScene(id) { + + return getBuild(library.kinematicsScenes[id], buildKinematicsScene); + + } + + function setupKinematics() { + + var kinematicsModelId = Object.keys(library.kinematicsModels)[0]; + var kinematicsSceneId = Object.keys(library.kinematicsScenes)[0]; + var visualSceneId = Object.keys(library.visualScenes)[0]; + + if (kinematicsModelId === undefined || kinematicsSceneId === undefined) return; + + var kinematicsModel = getKinematicsModel(kinematicsModelId); + var kinematicsScene = getKinematicsScene(kinematicsSceneId); + var visualScene = getVisualScene(visualSceneId); + + var bindJointAxis = kinematicsScene.bindJointAxis; + var jointMap = {}; + + for (var i = 0, l = bindJointAxis.length; i < l; i++) { + + var axis = bindJointAxis[i]; + + // the result of the following query is an element of type 'translate', 'rotate','scale' or 'matrix' + + var targetElement = collada.querySelector('[sid="' + axis.target + '"]'); + + if (targetElement) { + + // get the parent of the transfrom element + + var parentVisualElement = targetElement.parentElement; + + // connect the joint of the kinematics model with the element in the visual scene + + connect(axis.jointIndex, parentVisualElement); + + } + + } + + function connect(jointIndex, visualElement) { + + var visualElementName = visualElement.getAttribute('name'); + var joint = kinematicsModel.joints[jointIndex]; + + visualScene.traverse(function (object) { + + if (object.name === visualElementName) { + + jointMap[jointIndex] = { + object: object, + transforms: buildTransformList(visualElement), + joint: joint, + position: joint.zeroPosition + }; + + } + + }); + + } + + var m0 = new THREE.Matrix4(); + + kinematics = { + + joints: kinematicsModel && kinematicsModel.joints, + + getJointValue: function (jointIndex) { + + var jointData = jointMap[jointIndex]; + + if (jointData) { + + return jointData.position; + + } else { + + console.warn('THREE.ColladaLoader: Joint ' + jointIndex + ' doesn\'t exist.'); + + } + + }, + + setJointValue: function (jointIndex, value) { + + var jointData = jointMap[jointIndex]; + + if (jointData) { + + var joint = jointData.joint; + + if (value > joint.limits.max || value < joint.limits.min) { + + console.warn('THREE.ColladaLoader: Joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ').'); + + } else if (joint.static) { + + console.warn('THREE.ColladaLoader: Joint ' + jointIndex + ' is static.'); + + } else { + + var object = jointData.object; + var axis = joint.axis; + var transforms = jointData.transforms; + + matrix.identity(); + + // each update, we have to apply all transforms in the correct order + + for (var i = 0; i < transforms.length; i++) { + + var transform = transforms[i]; + + // if there is a connection of the transform node with a joint, apply the joint value + + if (transform.sid && transform.sid.indexOf(jointIndex) !== -1) { + + switch (joint.type) { + + case 'revolute': + matrix.multiply(m0.makeRotationAxis(axis, THREE.Math.degToRad(value))); + break; + + case 'prismatic': + matrix.multiply(m0.makeTranslation(axis.x * value, axis.y * value, axis.z * value)); + break; + + default: + console.warn('THREE.ColladaLoader: Unknown joint type: ' + joint.type); + break; + + } + + } else { + + switch (transform.type) { + + case 'matrix': + matrix.multiply(transform.obj); + break; + + case 'translate': + matrix.multiply(m0.makeTranslation(transform.obj.x, transform.obj.y, transform.obj.z)); + break; + + case 'scale': + matrix.scale(transform.obj); + break; + + case 'rotate': + matrix.multiply(m0.makeRotationAxis(transform.obj, transform.angle)); + break; + + } + + } + + } + + object.matrix.copy(matrix); + object.matrix.decompose(object.position, object.quaternion, object.scale); + + jointMap[jointIndex].position = value; + + } + + } else { + + console.log('THREE.ColladaLoader: ' + jointIndex + ' does not exist.'); + + } + + } + + }; + + } + + function buildTransformList(node) { + + var transforms = []; + + var xml = collada.querySelector('[id="' + node.id + '"]'); + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'matrix': + var array = parseFloats(child.textContent); + var matrix = new THREE.Matrix4().fromArray(array).transpose(); + transforms.push({ + sid: child.getAttribute('sid'), + type: child.nodeName, + obj: matrix + }); + break; + + case 'translate': + case 'scale': + var array = parseFloats(child.textContent); + var vector = new THREE.Vector3().fromArray(array); + transforms.push({ + sid: child.getAttribute('sid'), + type: child.nodeName, + obj: vector + }); + break; + + case 'rotate': + var array = parseFloats(child.textContent); + var vector = new THREE.Vector3().fromArray(array); + var angle = THREE.Math.degToRad(array[3]); + transforms.push({ + sid: child.getAttribute('sid'), + type: child.nodeName, + obj: vector, + angle: angle + }); + break; + + } + + } + + return transforms; + + } + + // nodes + + function prepareNodes(xml) { + + var elements = xml.getElementsByTagName('node'); + + // ensure all node elements have id attributes + + for (var i = 0; i < elements.length; i++) { + + var element = elements[i]; + + if (element.hasAttribute('id') === false) { + + element.setAttribute('id', generateId()); + + } + + } + + } + + var matrix = new THREE.Matrix4(); + var vector = new THREE.Vector3(); + + function parseNode(xml) { + + var data = { + name: xml.getAttribute('name') || '', + type: xml.getAttribute('type'), + id: xml.getAttribute('id'), + sid: xml.getAttribute('sid'), + matrix: new THREE.Matrix4(), + nodes: [], + instanceCameras: [], + instanceControllers: [], + instanceLights: [], + instanceGeometries: [], + instanceNodes: [], + transforms: {} + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + if (child.nodeType !== 1) continue; + + switch (child.nodeName) { + + case 'node': + data.nodes.push(child.getAttribute('id')); + parseNode(child); + break; + + case 'instance_camera': + data.instanceCameras.push(parseId(child.getAttribute('url'))); + break; + + case 'instance_controller': + data.instanceControllers.push(parseNodeInstance(child)); + break; + + case 'instance_light': + data.instanceLights.push(parseId(child.getAttribute('url'))); + break; + + case 'instance_geometry': + data.instanceGeometries.push(parseNodeInstance(child)); + break; + + case 'instance_node': + data.instanceNodes.push(parseId(child.getAttribute('url'))); + break; + + case 'matrix': + var array = parseFloats(child.textContent); + data.matrix.multiply(matrix.fromArray(array).transpose()); + data.transforms[child.getAttribute('sid')] = child.nodeName; + break; + + case 'translate': + var array = parseFloats(child.textContent); + vector.fromArray(array); + data.matrix.multiply(matrix.makeTranslation(vector.x, vector.y, vector.z)); + data.transforms[child.getAttribute('sid')] = child.nodeName; + break; + + case 'rotate': + var array = parseFloats(child.textContent); + var angle = THREE.Math.degToRad(array[3]); + data.matrix.multiply(matrix.makeRotationAxis(vector.fromArray(array), angle)); + data.transforms[child.getAttribute('sid')] = child.nodeName; + break; + + case 'scale': + var array = parseFloats(child.textContent); + data.matrix.scale(vector.fromArray(array)); + data.transforms[child.getAttribute('sid')] = child.nodeName; + break; + + case 'extra': + break; + + default: + console.log(child); + + } + + } + + if (hasNode(data.id)) { + + console.warn('THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id); + + } else { + + library.nodes[data.id] = data; + + } + + return data; + + } + + function parseNodeInstance(xml) { + + var data = { + id: parseId(xml.getAttribute('url')), + materials: {}, + skeletons: [] + }; + + for (var i = 0; i < xml.childNodes.length; i++) { + + var child = xml.childNodes[i]; + + switch (child.nodeName) { + + case 'bind_material': + var instances = child.getElementsByTagName('instance_material'); + + for (var j = 0; j < instances.length; j++) { + + var instance = instances[j]; + var symbol = instance.getAttribute('symbol'); + var target = instance.getAttribute('target'); + + data.materials[symbol] = parseId(target); + + } + + break; + + case 'skeleton': + data.skeletons.push(parseId(child.textContent)); + break; + + default: + break; + + } + + } + + return data; + + } + + function buildSkeleton(skeletons, joints) { + + var boneData = []; + var sortedBoneData = []; + + var i, j, data; + + // a skeleton can have multiple root bones. collada expresses this + // situtation with multiple "skeleton" tags per controller instance + + for (i = 0; i < skeletons.length; i++) { + + var skeleton = skeletons[i]; + + var root; + + if (hasNode(skeleton)) { + + root = getNode(skeleton); + buildBoneHierarchy(root, joints, boneData); + + } else if (hasVisualScene(skeleton)) { + + // handle case where the skeleton refers to the visual scene (#13335) + + var visualScene = library.visualScenes[skeleton]; + var children = visualScene.children; + + for (var j = 0; j < children.length; j++) { + + var child = children[j]; + + if (child.type === 'JOINT') { + + var root = getNode(child.id); + buildBoneHierarchy(root, joints, boneData); + + } + + } + + } else { + + console.error('THREE.ColladaLoader: Unable to find root bone of skeleton with ID:', skeleton); + + } + + } + + // sort bone data (the order is defined in the corresponding controller) + + for (i = 0; i < joints.length; i++) { + + for (j = 0; j < boneData.length; j++) { + + data = boneData[j]; + + if (data.bone.name === joints[i].name) { + + sortedBoneData[i] = data; + data.processed = true; + break; + + } + + } + + } + + // add unprocessed bone data at the end of the list + + for (i = 0; i < boneData.length; i++) { + + data = boneData[i]; + + if (data.processed === false) { + + sortedBoneData.push(data); + data.processed = true; + + } + + } + + // setup arrays for skeleton creation + + var bones = []; + var boneInverses = []; + + for (i = 0; i < sortedBoneData.length; i++) { + + data = sortedBoneData[i]; + + bones.push(data.bone); + boneInverses.push(data.boneInverse); + + } + + return new THREE.Skeleton(bones, boneInverses); + + } + + function buildBoneHierarchy(root, joints, boneData) { + + // setup bone data from visual scene + + root.traverse(function (object) { + + if (object.isBone === true) { + + var boneInverse; + + // retrieve the boneInverse from the controller data + + for (var i = 0; i < joints.length; i++) { + + var joint = joints[i]; + + if (joint.name === object.name) { + + boneInverse = joint.boneInverse; + break; + + } + + } + + if (boneInverse === undefined) { + + // Unfortunately, there can be joints in the visual scene that are not part of the + // corresponding controller. In this case, we have to create a dummy boneInverse matrix + // for the respective bone. This bone won't affect any vertices, because there are no skin indices + // and weights defined for it. But we still have to add the bone to the sorted bone list in order to + // ensure a correct animation of the model. + + boneInverse = new THREE.Matrix4(); + + } + + boneData.push({ bone: object, boneInverse: boneInverse, processed: false }); + + } + + }); + + } + + function buildNode(data) { + + var objects = []; + + var matrix = data.matrix; + var nodes = data.nodes; + var type = data.type; + var instanceCameras = data.instanceCameras; + var instanceControllers = data.instanceControllers; + var instanceLights = data.instanceLights; + var instanceGeometries = data.instanceGeometries; + var instanceNodes = data.instanceNodes; + + // nodes + + for (var i = 0, l = nodes.length; i < l; i++) { + + objects.push(getNode(nodes[i])); + + } + + // instance cameras + + for (var i = 0, l = instanceCameras.length; i < l; i++) { + + var instanceCamera = getCamera(instanceCameras[i]); + + if (instanceCamera !== null) { + + objects.push(instanceCamera.clone()); + + } + + } + + // instance controllers + + for (var i = 0, l = instanceControllers.length; i < l; i++) { + + var instance = instanceControllers[i]; + var controller = getController(instance.id); + var geometries = getGeometry(controller.id); + var newObjects = buildObjects(geometries, instance.materials); + + var skeletons = instance.skeletons; + var joints = controller.skin.joints; + + var skeleton = buildSkeleton(skeletons, joints); + + for (var j = 0, jl = newObjects.length; j < jl; j++) { + + var object = newObjects[j]; + + if (object.isSkinnedMesh) { + + object.bind(skeleton, controller.skin.bindMatrix); + object.normalizeSkinWeights(); + + } + + objects.push(object); + + } + + } + + // instance lights + + for (var i = 0, l = instanceLights.length; i < l; i++) { + + var instanceLight = getLight(instanceLights[i]); + + if (instanceLight !== null) { + + objects.push(instanceLight.clone()); + + } + + } + + // instance geometries + + for (var i = 0, l = instanceGeometries.length; i < l; i++) { + + var instance = instanceGeometries[i]; + + // a single geometry instance in collada can lead to multiple object3Ds. + // this is the case when primitives are combined like triangles and lines + + var geometries = getGeometry(instance.id); + var newObjects = buildObjects(geometries, instance.materials); + + for (var j = 0, jl = newObjects.length; j < jl; j++) { + + objects.push(newObjects[j]); + + } + + } + + // instance nodes + + for (var i = 0, l = instanceNodes.length; i < l; i++) { + + objects.push(getNode(instanceNodes[i]).clone()); + + } + + var object; + + if (nodes.length === 0 && objects.length === 1) { + + object = objects[0]; + + } else { + + object = (type === 'JOINT') ? new THREE.Bone() : new THREE.Group(); + + for (var i = 0; i < objects.length; i++) { + + object.add(objects[i]); + + } + + } + + if (object.name === '') { + + object.name = (type === 'JOINT') ? data.sid : data.name; + + } + + object.matrix.copy(matrix); + object.matrix.decompose(object.position, object.quaternion, object.scale); + + return object; + + } + + var fallbackMaterial = new THREE.MeshBasicMaterial({ color: 0xff00ff }); + + function resolveMaterialBinding(keys, instanceMaterials) { + + var materials = []; + + for (var i = 0, l = keys.length; i < l; i++) { + + var id = instanceMaterials[keys[i]]; + + if (id === undefined) { + + console.warn('THREE.ColladaLoader: Material with key %s not found. Apply fallback material.', keys[i]); + materials.push(fallbackMaterial); + + } else { + + materials.push(getMaterial(id)); + + } + + } + + return materials; + + } + + function buildObjects(geometries, instanceMaterials) { + + var objects = []; + + for (var type in geometries) { + + var geometry = geometries[type]; + + var materials = resolveMaterialBinding(geometry.materialKeys, instanceMaterials); + + // handle case if no materials are defined + + if (materials.length === 0) { + + if (type === 'lines' || type === 'linestrips') { + + materials.push(new THREE.LineBasicMaterial()); + + } else { + + materials.push(new THREE.MeshPhongMaterial()); + + } + + } + + // regard skinning + + var skinning = (geometry.data.attributes.skinIndex !== undefined); + + if (skinning) { + + for (var i = 0, l = materials.length; i < l; i++) { + + materials[i].skinning = true; + + } + + } + + // choose between a single or multi materials (material array) + + var material = (materials.length === 1) ? materials[0] : materials; + + // now create a specific 3D object + + var object; + + switch (type) { + + case 'lines': + object = new THREE.LineSegments(geometry.data, material); + break; + + case 'linestrips': + object = new THREE.Line(geometry.data, material); + break; + + case 'triangles': + case 'polylist': + if (skinning) { + + object = new THREE.SkinnedMesh(geometry.data, material); + + } else { + + object = new THREE.Mesh(geometry.data, material); + + } + break; + + } + + objects.push(object); + + } + + return objects; + + } + + function hasNode(id) { + + return library.nodes[id] !== undefined; + + } + + function getNode(id) { + + return getBuild(library.nodes[id], buildNode); + + } + + // visual scenes + + function parseVisualScene(xml) { + + var data = { + name: xml.getAttribute('name'), + children: [] + }; + + prepareNodes(xml); + + var elements = getElementsByTagName(xml, 'node'); + + for (var i = 0; i < elements.length; i++) { + + data.children.push(parseNode(elements[i])); + + } + + library.visualScenes[xml.getAttribute('id')] = data; + + } + + function buildVisualScene(data) { + + var group = new THREE.Group(); + group.name = data.name; + + var children = data.children; + + for (var i = 0; i < children.length; i++) { + + var child = children[i]; + + group.add(getNode(child.id)); + + } + + return group; + + } + + function hasVisualScene(id) { + + return library.visualScenes[id] !== undefined; + + } + + function getVisualScene(id) { + + return getBuild(library.visualScenes[id], buildVisualScene); + + } + + // scenes + + function parseScene(xml) { + + var instance = getElementsByTagName(xml, 'instance_visual_scene')[0]; + return getVisualScene(parseId(instance.getAttribute('url'))); + + } + + function setupAnimations() { + + var clips = library.clips; + + if (isEmpty(clips) === true) { + + if (isEmpty(library.animations) === false) { + + // if there are animations but no clips, we create a default clip for playback + + var tracks = []; + + for (var id in library.animations) { + + var animationTracks = getAnimation(id); + + for (var i = 0, l = animationTracks.length; i < l; i++) { + + tracks.push(animationTracks[i]); + + } + + } + + animations.push(new THREE.AnimationClip('default', -1, tracks)); + + } + + } else { + + for (var id in clips) { + + animations.push(getAnimationClip(id)); + + } + + } + + } + + if (text.length === 0) { + + return { scene: new THREE.Scene() }; + + } + + var xml = new DOMParser().parseFromString(text, 'application/xml'); + + var collada = getElementsByTagName(xml, 'COLLADA')[0]; + + // metadata + + var version = collada.getAttribute('version'); + console.log('THREE.ColladaLoader: File version', version); + + var asset = parseAsset(getElementsByTagName(collada, 'asset')[0]); + var textureLoader = new THREE.TextureLoader(this.manager); + textureLoader.setPath(path).setCrossOrigin(this.crossOrigin); + + var tgaLoader; + + if (THREE.TGALoader) { + + tgaLoader = new THREE.TGALoader(this.manager); + tgaLoader.setPath(path); + + } + + // + + var animations = []; + var kinematics = {}; + var count = 0; + + // + + var library = { + animations: {}, + clips: {}, + controllers: {}, + images: {}, + effects: {}, + materials: {}, + cameras: {}, + lights: {}, + geometries: {}, + nodes: {}, + visualScenes: {}, + kinematicsModels: {}, + physicsModels: {}, + kinematicsScenes: {} + }; + + parseLibrary(collada, 'library_animations', 'animation', parseAnimation); + parseLibrary(collada, 'library_animation_clips', 'animation_clip', parseAnimationClip); + parseLibrary(collada, 'library_controllers', 'controller', parseController); + parseLibrary(collada, 'library_images', 'image', parseImage); + parseLibrary(collada, 'library_effects', 'effect', parseEffect); + parseLibrary(collada, 'library_materials', 'material', parseMaterial); + parseLibrary(collada, 'library_cameras', 'camera', parseCamera); + parseLibrary(collada, 'library_lights', 'light', parseLight); + parseLibrary(collada, 'library_geometries', 'geometry', parseGeometry); + parseLibrary(collada, 'library_nodes', 'node', parseNode); + parseLibrary(collada, 'library_visual_scenes', 'visual_scene', parseVisualScene); + parseLibrary(collada, 'library_kinematics_models', 'kinematics_model', parseKinematicsModel); + parseLibrary(collada, 'library_physics_models', 'physics_model', parsePhysicsModel); + parseLibrary(collada, 'scene', 'instance_kinematics_scene', parseKinematicsScene); + + buildLibrary(library.animations, buildAnimation); + buildLibrary(library.clips, buildAnimationClip); + buildLibrary(library.controllers, buildController); + buildLibrary(library.images, buildImage); + buildLibrary(library.effects, buildEffect); + buildLibrary(library.materials, buildMaterial); + buildLibrary(library.cameras, buildCamera); + buildLibrary(library.lights, buildLight); + buildLibrary(library.geometries, buildGeometry); + buildLibrary(library.visualScenes, buildVisualScene); + + setupAnimations(); + setupKinematics(); + + var scene = parseScene(getElementsByTagName(collada, 'scene')[0]); + + if (asset.upAxis === 'Z_UP') { + + scene.quaternion.setFromEuler(new THREE.Euler(-Math.PI / 2, 0, 0)); + + } + + scene.scale.multiplyScalar(asset.unit); + + return { + animations: animations, + kinematics: kinematics, + library: library, + scene: scene + }; + + } + +}; \ No newline at end of file diff --git a/public/static/modelView/js/loaders/DDSLoader.js b/public/static/modelView/js/loaders/DDSLoader.js new file mode 100644 index 0000000..7a8b773 --- /dev/null +++ b/public/static/modelView/js/loaders/DDSLoader.js @@ -0,0 +1,269 @@ +锘�/* + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.DDSLoader = function () { + + this._parser = THREE.DDSLoader.parse; + +}; + +THREE.DDSLoader.prototype = Object.create(THREE.CompressedTextureLoader.prototype); +THREE.DDSLoader.prototype.constructor = THREE.DDSLoader; + +THREE.DDSLoader.parse = function (buffer, loadMipmaps) { + + var dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 }; + + // Adapted from @toji's DDS utils + // https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js + + // All values and structures referenced from: + // http://msdn.microsoft.com/en-us/library/bb943991.aspx/ + + var DDS_MAGIC = 0x20534444; + + var DDSD_CAPS = 0x1, + DDSD_HEIGHT = 0x2, + DDSD_WIDTH = 0x4, + DDSD_PITCH = 0x8, + DDSD_PIXELFORMAT = 0x1000, + DDSD_MIPMAPCOUNT = 0x20000, + DDSD_LINEARSIZE = 0x80000, + DDSD_DEPTH = 0x800000; + + var DDSCAPS_COMPLEX = 0x8, + DDSCAPS_MIPMAP = 0x400000, + DDSCAPS_TEXTURE = 0x1000; + + var DDSCAPS2_CUBEMAP = 0x200, + DDSCAPS2_CUBEMAP_POSITIVEX = 0x400, + DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800, + DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000, + DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000, + DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000, + DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000, + DDSCAPS2_VOLUME = 0x200000; + + var DDPF_ALPHAPIXELS = 0x1, + DDPF_ALPHA = 0x2, + DDPF_FOURCC = 0x4, + DDPF_RGB = 0x40, + DDPF_YUV = 0x200, + DDPF_LUMINANCE = 0x20000; + + function fourCCToInt32(value) { + + return value.charCodeAt(0) + + (value.charCodeAt(1) << 8) + + (value.charCodeAt(2) << 16) + + (value.charCodeAt(3) << 24); + + } + + function int32ToFourCC(value) { + + return String.fromCharCode( + value & 0xff, + (value >> 8) & 0xff, + (value >> 16) & 0xff, + (value >> 24) & 0xff + ); + + } + + function loadARGBMip(buffer, dataOffset, width, height) { + + var dataLength = width * height * 4; + var srcBuffer = new Uint8Array(buffer, dataOffset, dataLength); + var byteArray = new Uint8Array(dataLength); + var dst = 0; + var src = 0; + for (var y = 0; y < height; y++) { + + for (var x = 0; x < width; x++) { + + var b = srcBuffer[src]; src++; + var g = srcBuffer[src]; src++; + var r = srcBuffer[src]; src++; + var a = srcBuffer[src]; src++; + byteArray[dst] = r; dst++; //r + byteArray[dst] = g; dst++; //g + byteArray[dst] = b; dst++; //b + byteArray[dst] = a; dst++; //a + + } + + } + return byteArray; + + } + + var FOURCC_DXT1 = fourCCToInt32("DXT1"); + var FOURCC_DXT3 = fourCCToInt32("DXT3"); + var FOURCC_DXT5 = fourCCToInt32("DXT5"); + var FOURCC_ETC1 = fourCCToInt32("ETC1"); + + var headerLengthInt = 31; // The header length in 32 bit ints + + // Offsets into the header array + + var off_magic = 0; + + var off_size = 1; + var off_flags = 2; + var off_height = 3; + var off_width = 4; + + var off_mipmapCount = 7; + + var off_pfFlags = 20; + var off_pfFourCC = 21; + var off_RGBBitCount = 22; + var off_RBitMask = 23; + var off_GBitMask = 24; + var off_BBitMask = 25; + var off_ABitMask = 26; + + var off_caps = 27; + var off_caps2 = 28; + var off_caps3 = 29; + var off_caps4 = 30; + + // Parse header + + var header = new Int32Array(buffer, 0, headerLengthInt); + + if (header[off_magic] !== DDS_MAGIC) { + + console.error('THREE.DDSLoader.parse: Invalid magic number in DDS header.'); + return dds; + + } + + if (!header[off_pfFlags] & DDPF_FOURCC) { + + console.error('THREE.DDSLoader.parse: Unsupported format, must contain a FourCC code.'); + return dds; + + } + + var blockBytes; + + var fourCC = header[off_pfFourCC]; + + var isRGBAUncompressed = false; + + switch (fourCC) { + + case FOURCC_DXT1: + + blockBytes = 8; + dds.format = THREE.RGB_S3TC_DXT1_Format; + break; + + case FOURCC_DXT3: + + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT3_Format; + break; + + case FOURCC_DXT5: + + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT5_Format; + break; + + case FOURCC_ETC1: + + blockBytes = 8; + dds.format = THREE.RGB_ETC1_Format; + break; + + default: + + if (header[off_RGBBitCount] === 32 + && header[off_RBitMask] & 0xff0000 + && header[off_GBitMask] & 0xff00 + && header[off_BBitMask] & 0xff + && header[off_ABitMask] & 0xff000000) { + + isRGBAUncompressed = true; + blockBytes = 64; + dds.format = THREE.RGBAFormat; + + } else { + + console.error('THREE.DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC(fourCC)); + return dds; + + } + } + + dds.mipmapCount = 1; + + if (header[off_flags] & DDSD_MIPMAPCOUNT && loadMipmaps !== false) { + + dds.mipmapCount = Math.max(1, header[off_mipmapCount]); + + } + + var caps2 = header[off_caps2]; + dds.isCubemap = caps2 & DDSCAPS2_CUBEMAP ? true : false; + if (dds.isCubemap && ( + !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) || + !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) || + !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) || + !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) || + !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) || + !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) + )) { + + console.error('THREE.DDSLoader.parse: Incomplete cubemap faces'); + return dds; + + } + + dds.width = header[off_width]; + dds.height = header[off_height]; + + var dataOffset = header[off_size] + 4; + + // Extract mipmaps buffers + + var faces = dds.isCubemap ? 6 : 1; + + for (var face = 0; face < faces; face++) { + + var width = dds.width; + var height = dds.height; + + for (var i = 0; i < dds.mipmapCount; i++) { + + if (isRGBAUncompressed) { + + var byteArray = loadARGBMip(buffer, dataOffset, width, height); + var dataLength = byteArray.length; + + } else { + + var dataLength = Math.max(4, width) / 4 * Math.max(4, height) / 4 * blockBytes; + var byteArray = new Uint8Array(buffer, dataOffset, dataLength); + + } + + var mipmap = { "data": byteArray, "width": width, "height": height }; + dds.mipmaps.push(mipmap); + + dataOffset += dataLength; + + width = Math.max(width >> 1, 1); + height = Math.max(height >> 1, 1); + + } + + } + + return dds; + +}; diff --git a/public/static/modelView/js/loaders/FBXLoader.js b/public/static/modelView/js/loaders/FBXLoader.js new file mode 100644 index 0000000..db5623f --- /dev/null +++ b/public/static/modelView/js/loaders/FBXLoader.js @@ -0,0 +1,4015 @@ +/** + * @author Kyle-Larson https://github.com/Kyle-Larson + * @author Takahiro https://github.com/takahirox + * @author Lewy Blue https://github.com/looeee + * + * Loader loads FBX file and generates Group representing FBX scene. + * Requires FBX file to be >= 7.0 and in ASCII or >= 6400 in Binary format + * Versions lower than this may load but will probably have errors + * + * Needs Support: + * Morph normals / blend shape normals + * + * FBX format references: + * https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure + * http://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html (C++ SDK reference) + * + * Binary format specification: + * https://code.blender.org/2013/08/fbx-binary-file-format-specification/ + */ + + +THREE.FBXLoader = (function () { + + var fbxTree; + var connections; + var sceneGraph; + + function FBXLoader(manager) { + + this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; + + } + + FBXLoader.prototype = { + + constructor: FBXLoader, + + crossOrigin: 'anonymous', + + load: function (url, onLoad, onProgress, onError) { + var self = this; + + var resourceDirectory = THREE.LoaderUtils.extractUrlBase(url); + + var loader = new THREE.FileLoader(this.manager); + loader.setResponseType('arraybuffer'); + loader.load(url, function (buffer) { + + try { + + var scene = self.parse(buffer, resourceDirectory); + onLoad(scene); + + } catch (error) { + + setTimeout(function () { + + if (onError) onError(error); + + self.manager.itemError(url); + + }, 0); + + } + + }, onProgress, onError); + }, + + setCrossOrigin: function (value) { + + this.crossOrigin = value; + return this; + + }, + + parse: function (FBXBuffer, resourceDirectory) { + + if (isFbxFormatBinary(FBXBuffer)) { + + fbxTree = new BinaryParser().parse(FBXBuffer); + + } else { + + var FBXText = convertArrayBufferToString(FBXBuffer); + + if (!isFbxFormatASCII(FBXText)) { + + throw new Error('THREE.FBXLoader: Unknown format.'); + + } + + if (getFbxVersion(FBXText) < 7000) { + + throw new Error('THREE.FBXLoader: FBX version not supported, FileVersion: ' + getFbxVersion(FBXText)); + + } + + fbxTree = new TextParser().parse(FBXText); + + } + + //console.log( FBXTree ); + + var textureLoader = new THREE.TextureLoader(this.manager).setPath(resourceDirectory).setCrossOrigin(this.crossOrigin); + + return new FBXTreeParser(textureLoader).parse(fbxTree); + + } + + }; + + // Parse the FBXTree object returned by the BinaryParser or TextParser and return a THREE.Group + function FBXTreeParser(textureLoader) { + + this.textureLoader = textureLoader; + + } + + FBXTreeParser.prototype = { + + constructor: FBXTreeParser, + + parse: function () { + + connections = this.parseConnections(); + + var images = this.parseImages(); + var textures = this.parseTextures(images); + var materials = this.parseMaterials(textures); + var deformers = this.parseDeformers(); + var geometryMap = new GeometryParser().parse(deformers); + + this.parseScene(deformers, geometryMap, materials); + + return sceneGraph; + + }, + + // Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry ) + // and details the connection type + parseConnections: function () { + + var connectionMap = new Map(); + + if ('Connections' in fbxTree) { + + var rawConnections = fbxTree.Connections.connections; + + rawConnections.forEach(function (rawConnection) { + + var fromID = rawConnection[0]; + var toID = rawConnection[1]; + var relationship = rawConnection[2]; + + if (!connectionMap.has(fromID)) { + + connectionMap.set(fromID, { + parents: [], + children: [] + }); + + } + + var parentRelationship = { ID: toID, relationship: relationship }; + connectionMap.get(fromID).parents.push(parentRelationship); + + if (!connectionMap.has(toID)) { + + connectionMap.set(toID, { + parents: [], + children: [] + }); + + } + + var childRelationship = { ID: fromID, relationship: relationship }; + connectionMap.get(toID).children.push(childRelationship); + + }); + + } + + return connectionMap; + + }, + + // Parse FBXTree.Objects.Video for embedded image data + // These images are connected to textures in FBXTree.Objects.Textures + // via FBXTree.Connections. + parseImages: function () { + + var images = {}; + var blobs = {}; + + if ('Video' in fbxTree.Objects) { + + var videoNodes = fbxTree.Objects.Video; + + for (var nodeID in videoNodes) { + + var videoNode = videoNodes[nodeID]; + + var id = parseInt(nodeID); + + images[id] = videoNode.RelativeFilename || videoNode.Filename; + + // raw image data is in videoNode.Content + if ('Content' in videoNode) { + + var arrayBufferContent = (videoNode.Content instanceof ArrayBuffer) && (videoNode.Content.byteLength > 0); + var base64Content = (typeof videoNode.Content === 'string') && (videoNode.Content !== ''); + + if (arrayBufferContent || base64Content) { + + var image = this.parseImage(videoNodes[nodeID]); + + blobs[videoNode.RelativeFilename || videoNode.Filename] = image; + + } + + } + + } + + } + + for (var id in images) { + + var filename = images[id]; + + if (blobs[filename] !== undefined) images[id] = blobs[filename]; + else images[id] = images[id].split('\\').pop(); + + } + + return images; + + }, + + // Parse embedded image data in FBXTree.Video.Content + parseImage: function (videoNode) { + + var content = videoNode.Content; + var fileName = videoNode.RelativeFilename || videoNode.Filename; + var extension = fileName.slice(fileName.lastIndexOf('.') + 1).toLowerCase(); + + var type; + + switch (extension) { + + case 'bmp': + + type = 'image/bmp'; + break; + + case 'jpg': + case 'jpeg': + + type = 'image/jpeg'; + break; + + case 'png': + + type = 'image/png'; + break; + + case 'tif': + + type = 'image/tiff'; + break; + + case 'tga': + + if (typeof THREE.TGALoader !== 'function') { + + console.warn('FBXLoader: THREE.TGALoader is required to load TGA textures'); + return; + + } else { + + if (THREE.Loader.Handlers.get('.tga') === null) { + + THREE.Loader.Handlers.add(/\.tga$/i, new THREE.TGALoader()); + + } + + type = 'image/tga'; + break; + + } + + default: + + console.warn('FBXLoader: Image type "' + extension + '" is not supported.'); + return; + + } + + if (typeof content === 'string') { // ASCII format + + return 'data:' + type + ';base64,' + content; + + } else { // Binary Format + + var array = new Uint8Array(content); + return window.URL.createObjectURL(new Blob([array], { type: type })); + + } + + }, + + // Parse nodes in FBXTree.Objects.Texture + // These contain details such as UV scaling, cropping, rotation etc and are connected + // to images in FBXTree.Objects.Video + parseTextures: function (images) { + + var textureMap = new Map(); + + if ('Texture' in fbxTree.Objects) { + + var textureNodes = fbxTree.Objects.Texture; + for (var nodeID in textureNodes) { + + var texture = this.parseTexture(textureNodes[nodeID], images); + textureMap.set(parseInt(nodeID), texture); + + } + + } + + return textureMap; + + }, + + // Parse individual node in FBXTree.Objects.Texture + parseTexture: function (textureNode, images) { + + var texture = this.loadTexture(textureNode, images); + + texture.ID = textureNode.id; + + texture.name = textureNode.attrName; + + var wrapModeU = textureNode.WrapModeU; + var wrapModeV = textureNode.WrapModeV; + + var valueU = wrapModeU !== undefined ? wrapModeU.value : 0; + var valueV = wrapModeV !== undefined ? wrapModeV.value : 0; + + // http://download.autodesk.com/us/fbx/SDKdocs/FBX_SDK_Help/files/fbxsdkref/class_k_fbx_texture.html#889640e63e2e681259ea81061b85143a + // 0: repeat(default), 1: clamp + + texture.wrapS = valueU === 0 ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; + texture.wrapT = valueV === 0 ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; + + if ('Scaling' in textureNode) { + + var values = textureNode.Scaling.value; + + texture.repeat.x = values[0]; + texture.repeat.y = values[1]; + + } + + return texture; + + }, + + // load a texture specified as a blob or data URI, or via an external URL using THREE.TextureLoader + loadTexture: function (textureNode, images) { + + var fileName; + + var currentPath = this.textureLoader.path; + + var children = connections.get(textureNode.id).children; + + if (children !== undefined && children.length > 0 && images[children[0].ID] !== undefined) { + + fileName = images[children[0].ID]; + + if (fileName.indexOf('blob:') === 0 || fileName.indexOf('data:') === 0) { + + this.textureLoader.setPath(undefined); + + } + + } + + var texture; + + var extension = textureNode.FileName.slice(-3).toLowerCase(); + + if (extension === 'tga') { + + var loader = THREE.Loader.Handlers.get('.tga'); + + if (loader === null) { + + console.warn('FBXLoader: TGALoader not found, creating empty placeholder texture for', fileName); + texture = new THREE.Texture(); + + } else { + + texture = loader.load(fileName); + + } + + } else if (extension === 'psd') { + + console.warn('FBXLoader: PSD textures are not supported, creating empty placeholder texture for', fileName); + texture = new THREE.Texture(); + + } else { + + texture = this.textureLoader.load(fileName); + + } + + this.textureLoader.setPath(currentPath); + + return texture; + + }, + + // Parse nodes in FBXTree.Objects.Material + parseMaterials: function (textureMap) { + + var materialMap = new Map(); + + if ('Material' in fbxTree.Objects) { + + var materialNodes = fbxTree.Objects.Material; + + for (var nodeID in materialNodes) { + + var material = this.parseMaterial(materialNodes[nodeID], textureMap); + + if (material !== null) materialMap.set(parseInt(nodeID), material); + + } + + } + + return materialMap; + + }, + + // Parse single node in FBXTree.Objects.Material + // Materials are connected to texture maps in FBXTree.Objects.Textures + // FBX format currently only supports Lambert and Phong shading models + parseMaterial: function (materialNode, textureMap) { + + var ID = materialNode.id; + var name = materialNode.attrName; + var type = materialNode.ShadingModel; + + // Case where FBX wraps shading model in property object. + if (typeof type === 'object') { + + type = type.value; + + } + + // Ignore unused materials which don't have any connections. + if (!connections.has(ID)) return null; + + var parameters = this.parseParameters(materialNode, textureMap, ID); + + var material; + + switch (type.toLowerCase()) { + + case 'phong': + material = new THREE.MeshPhongMaterial(); + break; + case 'lambert': + material = new THREE.MeshLambertMaterial(); + break; + default: + console.warn('THREE.FBXLoader: unknown material type "%s". Defaulting to MeshPhongMaterial.', type); + material = new THREE.MeshPhongMaterial({ color: 0x3300ff }); + break; + + } + + material.setValues(parameters); + material.name = name; + + return material; + + }, + + // Parse FBX material and return parameters suitable for a three.js material + // Also parse the texture map and return any textures associated with the material + parseParameters: function (materialNode, textureMap, ID) { + + var parameters = {}; + + if (materialNode.BumpFactor) { + + parameters.bumpScale = materialNode.BumpFactor.value; + + } + if (materialNode.Diffuse) { + + parameters.color = new THREE.Color().fromArray(materialNode.Diffuse.value); + + } else if (materialNode.DiffuseColor && materialNode.DiffuseColor.type === 'Color') { + + // The blender exporter exports diffuse here instead of in materialNode.Diffuse + parameters.color = new THREE.Color().fromArray(materialNode.DiffuseColor.value); + + } + if (materialNode.DisplacementFactor) { + + parameters.displacementScale = materialNode.DisplacementFactor.value; + + } + if (materialNode.Emissive) { + + parameters.emissive = new THREE.Color().fromArray(materialNode.Emissive.value); + + } else if (materialNode.EmissiveColor && materialNode.EmissiveColor.type === 'Color') { + + // The blender exporter exports emissive color here instead of in materialNode.Emissive + parameters.emissive = new THREE.Color().fromArray(materialNode.EmissiveColor.value); + + } + if (materialNode.EmissiveFactor) { + + parameters.emissiveIntensity = parseFloat(materialNode.EmissiveFactor.value); + + } + if (materialNode.Opacity) { + + parameters.opacity = parseFloat(materialNode.Opacity.value); + + } + if (parameters.opacity < 1.0) { + + parameters.transparent = true; + + } + if (materialNode.ReflectionFactor) { + + parameters.reflectivity = materialNode.ReflectionFactor.value; + + } + if (materialNode.Shininess) { + + parameters.shininess = materialNode.Shininess.value; + + } + if (materialNode.Specular) { + + parameters.specular = new THREE.Color().fromArray(materialNode.Specular.value); + + } else if (materialNode.SpecularColor && materialNode.SpecularColor.type === 'Color') { + + // The blender exporter exports specular color here instead of in materialNode.Specular + parameters.specular = new THREE.Color().fromArray(materialNode.SpecularColor.value); + + } + + var self = this; + connections.get(ID).children.forEach(function (child) { + + var type = child.relationship; + + switch (type) { + + case 'Bump': + parameters.bumpMap = self.getTexture(textureMap, child.ID); + break; + + case 'DiffuseColor': + parameters.map = self.getTexture(textureMap, child.ID); + break; + + case 'DisplacementColor': + parameters.displacementMap = self.getTexture(textureMap, child.ID); + break; + + + case 'EmissiveColor': + parameters.emissiveMap = self.getTexture(textureMap, child.ID); + break; + + case 'NormalMap': + parameters.normalMap = self.getTexture(textureMap, child.ID); + break; + + case 'ReflectionColor': + parameters.envMap = self.getTexture(textureMap, child.ID); + parameters.envMap.mapping = THREE.EquirectangularReflectionMapping; + break; + + case 'SpecularColor': + parameters.specularMap = self.getTexture(textureMap, child.ID); + break; + + case 'TransparentColor': + parameters.alphaMap = self.getTexture(textureMap, child.ID); + parameters.transparent = true; + break; + + case 'AmbientColor': + case 'ShininessExponent': // AKA glossiness map + case 'SpecularFactor': // AKA specularLevel + case 'VectorDisplacementColor': // NOTE: Seems to be a copy of DisplacementColor + default: + console.warn('THREE.FBXLoader: %s map is not supported in three.js, skipping texture.', type); + break; + + } + + }); + + return parameters; + + }, + + // get a texture from the textureMap for use by a material. + getTexture: function (textureMap, id) { + + // if the texture is a layered texture, just use the first layer and issue a warning + if ('LayeredTexture' in fbxTree.Objects && id in fbxTree.Objects.LayeredTexture) { + + console.warn('THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer.'); + id = connections.get(id).children[0].ID; + + } + + return textureMap.get(id); + + }, + + // Parse nodes in FBXTree.Objects.Deformer + // Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here + // Generates map of Skeleton-like objects for use later when generating and binding skeletons. + parseDeformers: function () { + + var skeletons = {}; + var morphTargets = {}; + + if ('Deformer' in fbxTree.Objects) { + + var DeformerNodes = fbxTree.Objects.Deformer; + + for (var nodeID in DeformerNodes) { + + var deformerNode = DeformerNodes[nodeID]; + + var relationships = connections.get(parseInt(nodeID)); + + if (deformerNode.attrType === 'Skin') { + + var skeleton = this.parseSkeleton(relationships, DeformerNodes); + skeleton.ID = nodeID; + + if (relationships.parents.length > 1) console.warn('THREE.FBXLoader: skeleton attached to more than one geometry is not supported.'); + skeleton.geometryID = relationships.parents[0].ID; + + skeletons[nodeID] = skeleton; + + } else if (deformerNode.attrType === 'BlendShape') { + + var morphTarget = { + id: nodeID, + }; + + morphTarget.rawTargets = this.parseMorphTargets(relationships, DeformerNodes); + morphTarget.id = nodeID; + + if (relationships.parents.length > 1) console.warn('THREE.FBXLoader: morph target attached to more than one geometry is not supported.'); + + morphTargets[nodeID] = morphTarget; + + } + + } + + } + + return { + + skeletons: skeletons, + morphTargets: morphTargets, + + }; + + }, + + // Parse single nodes in FBXTree.Objects.Deformer + // The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster' + // Each skin node represents a skeleton and each cluster node represents a bone + parseSkeleton: function (relationships, deformerNodes) { + + var rawBones = []; + + relationships.children.forEach(function (child) { + + var boneNode = deformerNodes[child.ID]; + + if (boneNode.attrType !== 'Cluster') return; + + var rawBone = { + + ID: child.ID, + indices: [], + weights: [], + transform: new THREE.Matrix4().fromArray(boneNode.Transform.a), + transformLink: new THREE.Matrix4().fromArray(boneNode.TransformLink.a), + linkMode: boneNode.Mode, + + }; + + if ('Indexes' in boneNode) { + + rawBone.indices = boneNode.Indexes.a; + rawBone.weights = boneNode.Weights.a; + + } + + rawBones.push(rawBone); + + }); + + return { + + rawBones: rawBones, + bones: [] + + }; + + }, + + // The top level morph deformer node has type "BlendShape" and sub nodes have type "BlendShapeChannel" + parseMorphTargets: function (relationships, deformerNodes) { + + var rawMorphTargets = []; + + for (var i = 0; i < relationships.children.length; i++) { + + if (i === 8) { + + console.warn('FBXLoader: maximum of 8 morph targets supported. Ignoring additional targets.'); + + break; + + } + + var child = relationships.children[i]; + + var morphTargetNode = deformerNodes[child.ID]; + + var rawMorphTarget = { + + name: morphTargetNode.attrName, + initialWeight: morphTargetNode.DeformPercent, + id: morphTargetNode.id, + fullWeights: morphTargetNode.FullWeights.a + + }; + + if (morphTargetNode.attrType !== 'BlendShapeChannel') return; + + var targetRelationships = connections.get(parseInt(child.ID)); + + targetRelationships.children.forEach(function (child) { + + if (child.relationship === undefined) rawMorphTarget.geoID = child.ID; + + }); + + rawMorphTargets.push(rawMorphTarget); + + } + + return rawMorphTargets; + + }, + + // create the main THREE.Group() to be returned by the loader + parseScene: function (deformers, geometryMap, materialMap) { + + sceneGraph = new THREE.Group(); + + var modelMap = this.parseModels(deformers.skeletons, geometryMap, materialMap); + + var modelNodes = fbxTree.Objects.Model; + + var self = this; + modelMap.forEach(function (model) { + + var modelNode = modelNodes[model.ID]; + self.setLookAtProperties(model, modelNode); + + var parentConnections = connections.get(model.ID).parents; + + parentConnections.forEach(function (connection) { + + var parent = modelMap.get(connection.ID); + if (parent !== undefined) parent.add(model); + + }); + + if (model.parent === null) { + + sceneGraph.add(model); + + } + + + }); + + this.bindSkeleton(deformers.skeletons, geometryMap, modelMap); + + this.createAmbientLight(); + + this.setupMorphMaterials(); + + var animations = new AnimationParser().parse(); + + // if all the models where already combined in a single group, just return that + if (sceneGraph.children.length === 1 && sceneGraph.children[0].isGroup) { + + sceneGraph.children[0].animations = animations; + sceneGraph = sceneGraph.children[0]; + + } + + sceneGraph.animations = animations; + + }, + + // parse nodes in FBXTree.Objects.Model + parseModels: function (skeletons, geometryMap, materialMap) { + + var modelMap = new Map(); + var modelNodes = fbxTree.Objects.Model; + + for (var nodeID in modelNodes) { + + var id = parseInt(nodeID); + var node = modelNodes[nodeID]; + var relationships = connections.get(id); + + var model = this.buildSkeleton(relationships, skeletons, id, node.attrName); + + if (!model) { + + switch (node.attrType) { + + case 'Camera': + model = this.createCamera(relationships); + break; + case 'Light': + model = this.createLight(relationships); + break; + case 'Mesh': + model = this.createMesh(relationships, geometryMap, materialMap); + break; + case 'NurbsCurve': + model = this.createCurve(relationships, geometryMap); + break; + case 'LimbNode': // usually associated with a Bone, however if a Bone was not created we'll make a Group instead + case 'Null': + default: + model = new THREE.Group(); + break; + + } + + model.name = THREE.PropertyBinding.sanitizeNodeName(node.attrName); + model.ID = id; + + } + + this.setModelTransforms(model, node); + modelMap.set(id, model); + + } + + return modelMap; + + }, + + buildSkeleton: function (relationships, skeletons, id, name) { + + var bone = null; + + relationships.parents.forEach(function (parent) { + + for (var ID in skeletons) { + + var skeleton = skeletons[ID]; + + skeleton.rawBones.forEach(function (rawBone, i) { + + if (rawBone.ID === parent.ID) { + + var subBone = bone; + bone = new THREE.Bone(); + bone.matrixWorld.copy(rawBone.transformLink); + + // set name and id here - otherwise in cases where "subBone" is created it will not have a name / id + bone.name = THREE.PropertyBinding.sanitizeNodeName(name); + bone.ID = id; + + skeleton.bones[i] = bone; + + // In cases where a bone is shared between multiple meshes + // duplicate the bone here and and it as a child of the first bone + if (subBone !== null) { + + bone.add(subBone); + + } + + } + + }); + + } + + }); + + return bone; + + }, + + // create a THREE.PerspectiveCamera or THREE.OrthographicCamera + createCamera: function (relationships) { + + var model; + var cameraAttribute; + + relationships.children.forEach(function (child) { + + var attr = fbxTree.Objects.NodeAttribute[child.ID]; + + if (attr !== undefined) { + + cameraAttribute = attr; + + } + + }); + + if (cameraAttribute === undefined) { + + model = new THREE.Object3D(); + + } else { + + var type = 0; + if (cameraAttribute.CameraProjectionType !== undefined && cameraAttribute.CameraProjectionType.value === 1) { + + type = 1; + + } + + var nearClippingPlane = 1; + if (cameraAttribute.NearPlane !== undefined) { + + nearClippingPlane = cameraAttribute.NearPlane.value / 1000; + + } + + var farClippingPlane = 1000; + if (cameraAttribute.FarPlane !== undefined) { + + farClippingPlane = cameraAttribute.FarPlane.value / 1000; + + } + + + var width = window.innerWidth; + var height = window.innerHeight; + + if (cameraAttribute.AspectWidth !== undefined && cameraAttribute.AspectHeight !== undefined) { + + width = cameraAttribute.AspectWidth.value; + height = cameraAttribute.AspectHeight.value; + + } + + var aspect = width / height; + + var fov = 45; + if (cameraAttribute.FieldOfView !== undefined) { + + fov = cameraAttribute.FieldOfView.value; + + } + + var focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null; + + switch (type) { + + case 0: // Perspective + model = new THREE.PerspectiveCamera(fov, aspect, nearClippingPlane, farClippingPlane); + if (focalLength !== null) model.setFocalLength(focalLength); + break; + + case 1: // Orthographic + model = new THREE.OrthographicCamera(-width / 2, width / 2, height / 2, -height / 2, nearClippingPlane, farClippingPlane); + break; + + default: + console.warn('THREE.FBXLoader: Unknown camera type ' + type + '.'); + model = new THREE.Object3D(); + break; + + } + + } + + return model; + + }, + + // Create a THREE.DirectionalLight, THREE.PointLight or THREE.SpotLight + createLight: function (relationships) { + + var model; + var lightAttribute; + + relationships.children.forEach(function (child) { + + var attr = fbxTree.Objects.NodeAttribute[child.ID]; + + if (attr !== undefined) { + + lightAttribute = attr; + + } + + }); + + if (lightAttribute === undefined) { + + model = new THREE.Object3D(); + + } else { + + var type; + + // LightType can be undefined for Point lights + if (lightAttribute.LightType === undefined) { + + type = 0; + + } else { + + type = lightAttribute.LightType.value; + + } + + var color = 0xffffff; + + if (lightAttribute.Color !== undefined) { + + color = new THREE.Color().fromArray(lightAttribute.Color.value); + + } + + var intensity = (lightAttribute.Intensity === undefined) ? 1 : lightAttribute.Intensity.value / 100; + + // light disabled + if (lightAttribute.CastLightOnObject !== undefined && lightAttribute.CastLightOnObject.value === 0) { + + intensity = 0; + + } + + var distance = 0; + if (lightAttribute.FarAttenuationEnd !== undefined) { + + if (lightAttribute.EnableFarAttenuation !== undefined && lightAttribute.EnableFarAttenuation.value === 0) { + + distance = 0; + + } else { + + distance = lightAttribute.FarAttenuationEnd.value; + + } + + } + + // TODO: could this be calculated linearly from FarAttenuationStart to FarAttenuationEnd? + var decay = 1; + + switch (type) { + + case 0: // Point + model = new THREE.PointLight(color, intensity, distance, decay); + break; + + case 1: // Directional + model = new THREE.DirectionalLight(color, intensity); + break; + + case 2: // Spot + var angle = Math.PI / 3; + + if (lightAttribute.InnerAngle !== undefined) { + + angle = THREE.Math.degToRad(lightAttribute.InnerAngle.value); + + } + + var penumbra = 0; + if (lightAttribute.OuterAngle !== undefined) { + + // TODO: this is not correct - FBX calculates outer and inner angle in degrees + // with OuterAngle > InnerAngle && OuterAngle <= Math.PI + // while three.js uses a penumbra between (0, 1) to attenuate the inner angle + penumbra = THREE.Math.degToRad(lightAttribute.OuterAngle.value); + penumbra = Math.max(penumbra, 1); + + } + + model = new THREE.SpotLight(color, intensity, distance, angle, penumbra, decay); + break; + + default: + console.warn('THREE.FBXLoader: Unknown light type ' + lightAttribute.LightType.value + ', defaulting to a THREE.PointLight.'); + model = new THREE.PointLight(color, intensity); + break; + + } + + if (lightAttribute.CastShadows !== undefined && lightAttribute.CastShadows.value === 1) { + + model.castShadow = true; + + } + + } + + return model; + + }, + + createMesh: function (relationships, geometryMap, materialMap) { + + var model; + var geometry = null; + var material = null; + var materials = []; + + // get geometry and materials(s) from connections + relationships.children.forEach(function (child) { + + if (geometryMap.has(child.ID)) { + + geometry = geometryMap.get(child.ID); + + } + + if (materialMap.has(child.ID)) { + + materials.push(materialMap.get(child.ID)); + + } + + }); + + if (materials.length > 1) { + + material = materials; + + } else if (materials.length > 0) { + + material = materials[0]; + + } else { + + material = new THREE.MeshPhongMaterial({ color: 0xcccccc }); + materials.push(material); + + } + + if ('color' in geometry.attributes) { + + materials.forEach(function (material) { + + material.vertexColors = THREE.VertexColors; + + }); + + } + + if (geometry.FBX_Deformer) { + + materials.forEach(function (material) { + + material.skinning = true; + + }); + + model = new THREE.SkinnedMesh(geometry, material); + + } else { + + model = new THREE.Mesh(geometry, material); + + } + + return model; + + }, + + createCurve: function (relationships, geometryMap) { + + var geometry = relationships.children.reduce(function (geo, child) { + + if (geometryMap.has(child.ID)) geo = geometryMap.get(child.ID); + + return geo; + + }, null); + + // FBX does not list materials for Nurbs lines, so we'll just put our own in here. + var material = new THREE.LineBasicMaterial({ color: 0x3300ff, linewidth: 1 }); + return new THREE.Line(geometry, material); + + }, + + // parse the model node for transform details and apply them to the model + setModelTransforms: function (model, modelNode) { + + var transformData = {}; + + if ('RotationOrder' in modelNode) transformData.eulerOrder = parseInt(modelNode.RotationOrder.value); + if ('Lcl_Translation' in modelNode) transformData.translation = modelNode.Lcl_Translation.value; + if ('RotationOffset' in modelNode) transformData.rotationOffset = modelNode.RotationOffset.value; + if ('Lcl_Rotation' in modelNode) transformData.rotation = modelNode.Lcl_Rotation.value; + if ('PreRotation' in modelNode) transformData.preRotation = modelNode.PreRotation.value; + if ('PostRotation' in modelNode) transformData.postRotation = modelNode.PostRotation.value; + if ('Lcl_Scaling' in modelNode) transformData.scale = modelNode.Lcl_Scaling.value; + + var transform = generateTransform(transformData); + + model.applyMatrix(transform); + + }, + + setLookAtProperties: function (model, modelNode) { + + if ('LookAtProperty' in modelNode) { + + var children = connections.get(model.ID).children; + + children.forEach(function (child) { + + if (child.relationship === 'LookAtProperty') { + + var lookAtTarget = fbxTree.Objects.Model[child.ID]; + + if ('Lcl_Translation' in lookAtTarget) { + + var pos = lookAtTarget.Lcl_Translation.value; + + // DirectionalLight, SpotLight + if (model.target !== undefined) { + + model.target.position.fromArray(pos); + sceneGraph.add(model.target); + + } else { // Cameras and other Object3Ds + + model.lookAt(new THREE.Vector3().fromArray(pos)); + + } + + } + + } + + }); + + } + + }, + + bindSkeleton: function (skeletons, geometryMap, modelMap) { + + var bindMatrices = this.parsePoseNodes(); + + for (var ID in skeletons) { + + var skeleton = skeletons[ID]; + + var parents = connections.get(parseInt(skeleton.ID)).parents; + + parents.forEach(function (parent) { + + if (geometryMap.has(parent.ID)) { + + var geoID = parent.ID; + var geoRelationships = connections.get(geoID); + + geoRelationships.parents.forEach(function (geoConnParent) { + + if (modelMap.has(geoConnParent.ID)) { + + var model = modelMap.get(geoConnParent.ID); + + model.bind(new THREE.Skeleton(skeleton.bones), bindMatrices[geoConnParent.ID]); + + } + + }); + + } + + }); + + } + + }, + + parsePoseNodes: function () { + + var bindMatrices = {}; + + if ('Pose' in fbxTree.Objects) { + + var BindPoseNode = fbxTree.Objects.Pose; + + for (var nodeID in BindPoseNode) { + + if (BindPoseNode[nodeID].attrType === 'BindPose') { + + var poseNodes = BindPoseNode[nodeID].PoseNode; + + if (Array.isArray(poseNodes)) { + + poseNodes.forEach(function (poseNode) { + + bindMatrices[poseNode.Node] = new THREE.Matrix4().fromArray(poseNode.Matrix.a); + + }); + + } else { + + bindMatrices[poseNodes.Node] = new THREE.Matrix4().fromArray(poseNodes.Matrix.a); + + } + + } + + } + + } + + return bindMatrices; + + }, + + // Parse ambient color in FBXTree.GlobalSettings - if it's not set to black (default), create an ambient light + createAmbientLight: function () { + + if ('GlobalSettings' in fbxTree && 'AmbientColor' in fbxTree.GlobalSettings) { + + var ambientColor = fbxTree.GlobalSettings.AmbientColor.value; + var r = ambientColor[0]; + var g = ambientColor[1]; + var b = ambientColor[2]; + + if (r !== 0 || g !== 0 || b !== 0) { + + var color = new THREE.Color(r, g, b); + sceneGraph.add(new THREE.AmbientLight(color, 1)); + + } + + } + + }, + + setupMorphMaterials: function () { + + sceneGraph.traverse(function (child) { + + if (child.isMesh) { + + if (child.geometry.morphAttributes.position || child.geometry.morphAttributes.normal) { + + var uuid = child.uuid; + var matUuid = child.material.uuid; + + // if a geometry has morph targets, it cannot share the material with other geometries + var sharedMat = false; + + sceneGraph.traverse(function (child) { + + if (child.isMesh) { + + if (child.material.uuid === matUuid && child.uuid !== uuid) sharedMat = true; + + } + + }); + + if (sharedMat === true) child.material = child.material.clone(); + + child.material.morphTargets = true; + + } + + } + + }); + + }, + + }; + + // parse Geometry data from FBXTree and return map of BufferGeometries + function GeometryParser() { } + + GeometryParser.prototype = { + + constructor: GeometryParser, + + // Parse nodes in FBXTree.Objects.Geometry + parse: function (deformers) { + + var geometryMap = new Map(); + + if ('Geometry' in fbxTree.Objects) { + + var geoNodes = fbxTree.Objects.Geometry; + + for (var nodeID in geoNodes) { + + var relationships = connections.get(parseInt(nodeID)); + var geo = this.parseGeometry(relationships, geoNodes[nodeID], deformers); + + geometryMap.set(parseInt(nodeID), geo); + + } + + } + + return geometryMap; + + }, + + // Parse single node in FBXTree.Objects.Geometry + parseGeometry: function (relationships, geoNode, deformers) { + + switch (geoNode.attrType) { + + case 'Mesh': + return this.parseMeshGeometry(relationships, geoNode, deformers); + break; + + case 'NurbsCurve': + return this.parseNurbsGeometry(geoNode); + break; + + } + + }, + + // Parse single node mesh geometry in FBXTree.Objects.Geometry + parseMeshGeometry: function (relationships, geoNode, deformers) { + + var skeletons = deformers.skeletons; + var morphTargets = deformers.morphTargets; + + var modelNodes = relationships.parents.map(function (parent) { + + return fbxTree.Objects.Model[parent.ID]; + + }); + + // don't create geometry if it is not associated with any models + if (modelNodes.length === 0) return; + + var skeleton = relationships.children.reduce(function (skeleton, child) { + + if (skeletons[child.ID] !== undefined) skeleton = skeletons[child.ID]; + + return skeleton; + + }, null); + + var morphTarget = relationships.children.reduce(function (morphTarget, child) { + + if (morphTargets[child.ID] !== undefined) morphTarget = morphTargets[child.ID]; + + return morphTarget; + + }, null); + + // TODO: if there is more than one model associated with the geometry, AND the models have + // different geometric transforms, then this will cause problems + // if ( modelNodes.length > 1 ) { } + + // For now just assume one model and get the preRotations from that + var modelNode = modelNodes[0]; + + var transformData = {}; + + if ('RotationOrder' in modelNode) transformData.eulerOrder = modelNode.RotationOrder.value; + if ('GeometricTranslation' in modelNode) transformData.translation = modelNode.GeometricTranslation.value; + if ('GeometricRotation' in modelNode) transformData.rotation = modelNode.GeometricRotation.value; + if ('GeometricScaling' in modelNode) transformData.scale = modelNode.GeometricScaling.value; + + var transform = generateTransform(transformData); + + return this.genGeometry(geoNode, skeleton, morphTarget, transform); + + }, + + // Generate a THREE.BufferGeometry from a node in FBXTree.Objects.Geometry + genGeometry: function (geoNode, skeleton, morphTarget, preTransform) { + + var geo = new THREE.BufferGeometry(); + if (geoNode.attrName) geo.name = geoNode.attrName; + + var geoInfo = this.parseGeoNode(geoNode, skeleton); + var buffers = this.genBuffers(geoInfo); + + var positionAttribute = new THREE.Float32BufferAttribute(buffers.vertex, 3); + + preTransform.applyToBufferAttribute(positionAttribute); + + geo.addAttribute('position', positionAttribute); + + if (buffers.colors.length > 0) { + + geo.addAttribute('color', new THREE.Float32BufferAttribute(buffers.colors, 3)); + + } + + if (skeleton) { + + geo.addAttribute('skinIndex', new THREE.Uint16BufferAttribute(buffers.weightsIndices, 4)); + + geo.addAttribute('skinWeight', new THREE.Float32BufferAttribute(buffers.vertexWeights, 4)); + + // used later to bind the skeleton to the model + geo.FBX_Deformer = skeleton; + + } + + if (buffers.normal.length > 0) { + + var normalAttribute = new THREE.Float32BufferAttribute(buffers.normal, 3); + + var normalMatrix = new THREE.Matrix3().getNormalMatrix(preTransform); + normalMatrix.applyToBufferAttribute(normalAttribute); + + geo.addAttribute('normal', normalAttribute); + + } + + buffers.uvs.forEach(function (uvBuffer, i) { + + // subsequent uv buffers are called 'uv1', 'uv2', ... + var name = 'uv' + (i + 1).toString(); + + // the first uv buffer is just called 'uv' + if (i === 0) { + + name = 'uv'; + + } + + geo.addAttribute(name, new THREE.Float32BufferAttribute(buffers.uvs[i], 2)); + + }); + + if (geoInfo.material && geoInfo.material.mappingType !== 'AllSame') { + + // Convert the material indices of each vertex into rendering groups on the geometry. + var prevMaterialIndex = buffers.materialIndex[0]; + var startIndex = 0; + + buffers.materialIndex.forEach(function (currentIndex, i) { + + if (currentIndex !== prevMaterialIndex) { + + geo.addGroup(startIndex, i - startIndex, prevMaterialIndex); + + prevMaterialIndex = currentIndex; + startIndex = i; + + } + + }); + + // the loop above doesn't add the last group, do that here. + if (geo.groups.length > 0) { + + var lastGroup = geo.groups[geo.groups.length - 1]; + var lastIndex = lastGroup.start + lastGroup.count; + + if (lastIndex !== buffers.materialIndex.length) { + + geo.addGroup(lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex); + + } + + } + + // case where there are multiple materials but the whole geometry is only + // using one of them + if (geo.groups.length === 0) { + + geo.addGroup(0, buffers.materialIndex.length, buffers.materialIndex[0]); + + } + + } + + this.addMorphTargets(geo, geoNode, morphTarget, preTransform); + + return geo; + + }, + + parseGeoNode: function (geoNode, skeleton) { + + var geoInfo = {}; + + geoInfo.vertexPositions = (geoNode.Vertices !== undefined) ? geoNode.Vertices.a : []; + geoInfo.vertexIndices = (geoNode.PolygonVertexIndex !== undefined) ? geoNode.PolygonVertexIndex.a : []; + + if (geoNode.LayerElementColor) { + + geoInfo.color = this.parseVertexColors(geoNode.LayerElementColor[0]); + + } + + if (geoNode.LayerElementMaterial) { + + geoInfo.material = this.parseMaterialIndices(geoNode.LayerElementMaterial[0]); + + } + + if (geoNode.LayerElementNormal) { + + geoInfo.normal = this.parseNormals(geoNode.LayerElementNormal[0]); + + } + + if (geoNode.LayerElementUV) { + + geoInfo.uv = []; + + var i = 0; + while (geoNode.LayerElementUV[i]) { + + geoInfo.uv.push(this.parseUVs(geoNode.LayerElementUV[i])); + i++; + + } + + } + + geoInfo.weightTable = {}; + + if (skeleton !== null) { + + geoInfo.skeleton = skeleton; + + skeleton.rawBones.forEach(function (rawBone, i) { + + // loop over the bone's vertex indices and weights + rawBone.indices.forEach(function (index, j) { + + if (geoInfo.weightTable[index] === undefined) geoInfo.weightTable[index] = []; + + geoInfo.weightTable[index].push({ + + id: i, + weight: rawBone.weights[j], + + }); + + }); + + }); + + } + + return geoInfo; + + }, + + genBuffers: function (geoInfo) { + + var buffers = { + vertex: [], + normal: [], + colors: [], + uvs: [], + materialIndex: [], + vertexWeights: [], + weightsIndices: [], + }; + + var polygonIndex = 0; + var faceLength = 0; + var displayedWeightsWarning = false; + + // these will hold data for a single face + var facePositionIndexes = []; + var faceNormals = []; + var faceColors = []; + var faceUVs = []; + var faceWeights = []; + var faceWeightIndices = []; + + var self = this; + geoInfo.vertexIndices.forEach(function (vertexIndex, polygonVertexIndex) { + + var endOfFace = false; + + // Face index and vertex index arrays are combined in a single array + // A cube with quad faces looks like this: + // PolygonVertexIndex: *24 { + // a: 0, 1, 3, -3, 2, 3, 5, -5, 4, 5, 7, -7, 6, 7, 1, -1, 1, 7, 5, -4, 6, 0, 2, -5 + // } + // Negative numbers mark the end of a face - first face here is 0, 1, 3, -3 + // to find index of last vertex bit shift the index: ^ - 1 + if (vertexIndex < 0) { + + vertexIndex = vertexIndex ^ -1; // equivalent to ( x * -1 ) - 1 + endOfFace = true; + + } + + var weightIndices = []; + var weights = []; + + facePositionIndexes.push(vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2); + + if (geoInfo.color) { + + var data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color); + + faceColors.push(data[0], data[1], data[2]); + + } + + if (geoInfo.skeleton) { + + if (geoInfo.weightTable[vertexIndex] !== undefined) { + + geoInfo.weightTable[vertexIndex].forEach(function (wt) { + + weights.push(wt.weight); + weightIndices.push(wt.id); + + }); + + + } + + if (weights.length > 4) { + + if (!displayedWeightsWarning) { + + console.warn('THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights.'); + displayedWeightsWarning = true; + + } + + var wIndex = [0, 0, 0, 0]; + var Weight = [0, 0, 0, 0]; + + weights.forEach(function (weight, weightIndex) { + + var currentWeight = weight; + var currentIndex = weightIndices[weightIndex]; + + Weight.forEach(function (comparedWeight, comparedWeightIndex, comparedWeightArray) { + + if (currentWeight > comparedWeight) { + + comparedWeightArray[comparedWeightIndex] = currentWeight; + currentWeight = comparedWeight; + + var tmp = wIndex[comparedWeightIndex]; + wIndex[comparedWeightIndex] = currentIndex; + currentIndex = tmp; + + } + + }); + + }); + + weightIndices = wIndex; + weights = Weight; + + } + + // if the weight array is shorter than 4 pad with 0s + while (weights.length < 4) { + + weights.push(0); + weightIndices.push(0); + + } + + for (var i = 0; i < 4; ++i) { + + faceWeights.push(weights[i]); + faceWeightIndices.push(weightIndices[i]); + + } + + } + + if (geoInfo.normal) { + + var data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal); + + faceNormals.push(data[0], data[1], data[2]); + + } + + if (geoInfo.material && geoInfo.material.mappingType !== 'AllSame') { + + var materialIndex = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material)[0]; + + } + + if (geoInfo.uv) { + + geoInfo.uv.forEach(function (uv, i) { + + var data = getData(polygonVertexIndex, polygonIndex, vertexIndex, uv); + + if (faceUVs[i] === undefined) { + + faceUVs[i] = []; + + } + + faceUVs[i].push(data[0]); + faceUVs[i].push(data[1]); + + }); + + } + + faceLength++; + + if (endOfFace) { + + self.genFace(buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength); + + polygonIndex++; + faceLength = 0; + + // reset arrays for the next face + facePositionIndexes = []; + faceNormals = []; + faceColors = []; + faceUVs = []; + faceWeights = []; + faceWeightIndices = []; + + } + + }); + + return buffers; + + }, + + // Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris + genFace: function (buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength) { + + for (var i = 2; i < faceLength; i++) { + + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[0]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[1]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[2]]); + + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[(i - 1) * 3]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[(i - 1) * 3 + 1]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[(i - 1) * 3 + 2]]); + + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i * 3]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i * 3 + 1]]); + buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i * 3 + 2]]); + + if (geoInfo.skeleton) { + + buffers.vertexWeights.push(faceWeights[0]); + buffers.vertexWeights.push(faceWeights[1]); + buffers.vertexWeights.push(faceWeights[2]); + buffers.vertexWeights.push(faceWeights[3]); + + buffers.vertexWeights.push(faceWeights[(i - 1) * 4]); + buffers.vertexWeights.push(faceWeights[(i - 1) * 4 + 1]); + buffers.vertexWeights.push(faceWeights[(i - 1) * 4 + 2]); + buffers.vertexWeights.push(faceWeights[(i - 1) * 4 + 3]); + + buffers.vertexWeights.push(faceWeights[i * 4]); + buffers.vertexWeights.push(faceWeights[i * 4 + 1]); + buffers.vertexWeights.push(faceWeights[i * 4 + 2]); + buffers.vertexWeights.push(faceWeights[i * 4 + 3]); + + buffers.weightsIndices.push(faceWeightIndices[0]); + buffers.weightsIndices.push(faceWeightIndices[1]); + buffers.weightsIndices.push(faceWeightIndices[2]); + buffers.weightsIndices.push(faceWeightIndices[3]); + + buffers.weightsIndices.push(faceWeightIndices[(i - 1) * 4]); + buffers.weightsIndices.push(faceWeightIndices[(i - 1) * 4 + 1]); + buffers.weightsIndices.push(faceWeightIndices[(i - 1) * 4 + 2]); + buffers.weightsIndices.push(faceWeightIndices[(i - 1) * 4 + 3]); + + buffers.weightsIndices.push(faceWeightIndices[i * 4]); + buffers.weightsIndices.push(faceWeightIndices[i * 4 + 1]); + buffers.weightsIndices.push(faceWeightIndices[i * 4 + 2]); + buffers.weightsIndices.push(faceWeightIndices[i * 4 + 3]); + + } + + if (geoInfo.color) { + + buffers.colors.push(faceColors[0]); + buffers.colors.push(faceColors[1]); + buffers.colors.push(faceColors[2]); + + buffers.colors.push(faceColors[(i - 1) * 3]); + buffers.colors.push(faceColors[(i - 1) * 3 + 1]); + buffers.colors.push(faceColors[(i - 1) * 3 + 2]); + + buffers.colors.push(faceColors[i * 3]); + buffers.colors.push(faceColors[i * 3 + 1]); + buffers.colors.push(faceColors[i * 3 + 2]); + + } + + if (geoInfo.material && geoInfo.material.mappingType !== 'AllSame') { + + buffers.materialIndex.push(materialIndex); + buffers.materialIndex.push(materialIndex); + buffers.materialIndex.push(materialIndex); + + } + + if (geoInfo.normal) { + + buffers.normal.push(faceNormals[0]); + buffers.normal.push(faceNormals[1]); + buffers.normal.push(faceNormals[2]); + + buffers.normal.push(faceNormals[(i - 1) * 3]); + buffers.normal.push(faceNormals[(i - 1) * 3 + 1]); + buffers.normal.push(faceNormals[(i - 1) * 3 + 2]); + + buffers.normal.push(faceNormals[i * 3]); + buffers.normal.push(faceNormals[i * 3 + 1]); + buffers.normal.push(faceNormals[i * 3 + 2]); + + } + + if (geoInfo.uv) { + + geoInfo.uv.forEach(function (uv, j) { + + if (buffers.uvs[j] === undefined) buffers.uvs[j] = []; + + buffers.uvs[j].push(faceUVs[j][0]); + buffers.uvs[j].push(faceUVs[j][1]); + + buffers.uvs[j].push(faceUVs[j][(i - 1) * 2]); + buffers.uvs[j].push(faceUVs[j][(i - 1) * 2 + 1]); + + buffers.uvs[j].push(faceUVs[j][i * 2]); + buffers.uvs[j].push(faceUVs[j][i * 2 + 1]); + + }); + + } + + } + + }, + + addMorphTargets: function (parentGeo, parentGeoNode, morphTarget, preTransform) { + + if (morphTarget === null) return; + + parentGeo.morphAttributes.position = []; + parentGeo.morphAttributes.normal = []; + + var self = this; + morphTarget.rawTargets.forEach(function (rawTarget) { + + var morphGeoNode = fbxTree.Objects.Geometry[rawTarget.geoID]; + + if (morphGeoNode !== undefined) { + + self.genMorphGeometry(parentGeo, parentGeoNode, morphGeoNode, preTransform); + + } + + }); + + }, + + // a morph geometry node is similar to a standard node, and the node is also contained + // in FBXTree.Objects.Geometry, however it can only have attributes for position, normal + // and a special attribute Index defining which vertices of the original geometry are affected + // Normal and position attributes only have data for the vertices that are affected by the morph + genMorphGeometry: function (parentGeo, parentGeoNode, morphGeoNode, preTransform) { + + var morphGeo = new THREE.BufferGeometry(); + if (morphGeoNode.attrName) morphGeo.name = morphGeoNode.attrName; + + var vertexIndices = (parentGeoNode.PolygonVertexIndex !== undefined) ? parentGeoNode.PolygonVertexIndex.a : []; + + // make a copy of the parent's vertex positions + var vertexPositions = (parentGeoNode.Vertices !== undefined) ? parentGeoNode.Vertices.a.slice() : []; + + var morphPositions = (morphGeoNode.Vertices !== undefined) ? morphGeoNode.Vertices.a : []; + var indices = (morphGeoNode.Indexes !== undefined) ? morphGeoNode.Indexes.a : []; + + for (var i = 0; i < indices.length; i++) { + + var morphIndex = indices[i] * 3; + + // FBX format uses blend shapes rather than morph targets. This can be converted + // by additively combining the blend shape positions with the original geometry's positions + vertexPositions[morphIndex] += morphPositions[i * 3]; + vertexPositions[morphIndex + 1] += morphPositions[i * 3 + 1]; + vertexPositions[morphIndex + 2] += morphPositions[i * 3 + 2]; + + } + + // TODO: add morph normal support + var morphGeoInfo = { + vertexIndices: vertexIndices, + vertexPositions: vertexPositions, + }; + + var morphBuffers = this.genBuffers(morphGeoInfo); + + var positionAttribute = new THREE.Float32BufferAttribute(morphBuffers.vertex, 3); + positionAttribute.name = morphGeoNode.attrName; + + preTransform.applyToBufferAttribute(positionAttribute); + + parentGeo.morphAttributes.position.push(positionAttribute); + + }, + + // Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists + parseNormals: function (NormalNode) { + + var mappingType = NormalNode.MappingInformationType; + var referenceType = NormalNode.ReferenceInformationType; + var buffer = NormalNode.Normals.a; + var indexBuffer = []; + if (referenceType === 'IndexToDirect') { + + if ('NormalIndex' in NormalNode) { + + indexBuffer = NormalNode.NormalIndex.a; + + } else if ('NormalsIndex' in NormalNode) { + + indexBuffer = NormalNode.NormalsIndex.a; + + } + + } + + return { + dataSize: 3, + buffer: buffer, + indices: indexBuffer, + mappingType: mappingType, + referenceType: referenceType + }; + + }, + + // Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists + parseUVs: function (UVNode) { + + var mappingType = UVNode.MappingInformationType; + var referenceType = UVNode.ReferenceInformationType; + var buffer = UVNode.UV.a; + var indexBuffer = []; + if (referenceType === 'IndexToDirect') { + + indexBuffer = UVNode.UVIndex.a; + + } + + return { + dataSize: 2, + buffer: buffer, + indices: indexBuffer, + mappingType: mappingType, + referenceType: referenceType + }; + + }, + + // Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists + parseVertexColors: function (ColorNode) { + + var mappingType = ColorNode.MappingInformationType; + var referenceType = ColorNode.ReferenceInformationType; + var buffer = ColorNode.Colors.a; + var indexBuffer = []; + if (referenceType === 'IndexToDirect') { + + indexBuffer = ColorNode.ColorIndex.a; + + } + + return { + dataSize: 4, + buffer: buffer, + indices: indexBuffer, + mappingType: mappingType, + referenceType: referenceType + }; + + }, + + // Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists + parseMaterialIndices: function (MaterialNode) { + + var mappingType = MaterialNode.MappingInformationType; + var referenceType = MaterialNode.ReferenceInformationType; + + if (mappingType === 'NoMappingInformation') { + + return { + dataSize: 1, + buffer: [0], + indices: [0], + mappingType: 'AllSame', + referenceType: referenceType + }; + + } + + var materialIndexBuffer = MaterialNode.Materials.a; + + // Since materials are stored as indices, there's a bit of a mismatch between FBX and what + // we expect.So we create an intermediate buffer that points to the index in the buffer, + // for conforming with the other functions we've written for other data. + var materialIndices = []; + + for (var i = 0; i < materialIndexBuffer.length; ++i) { + + materialIndices.push(i); + + } + + return { + dataSize: 1, + buffer: materialIndexBuffer, + indices: materialIndices, + mappingType: mappingType, + referenceType: referenceType + }; + + }, + + // Generate a NurbGeometry from a node in FBXTree.Objects.Geometry + parseNurbsGeometry: function (geoNode) { + + if (THREE.NURBSCurve === undefined) { + + console.error('THREE.FBXLoader: The loader relies on THREE.NURBSCurve for any nurbs present in the model. Nurbs will show up as empty geometry.'); + return new THREE.BufferGeometry(); + + } + + var order = parseInt(geoNode.Order); + + if (isNaN(order)) { + + console.error('THREE.FBXLoader: Invalid Order %s given for geometry ID: %s', geoNode.Order, geoNode.id); + return new THREE.BufferGeometry(); + + } + + var degree = order - 1; + + var knots = geoNode.KnotVector.a; + var controlPoints = []; + var pointsValues = geoNode.Points.a; + + for (var i = 0, l = pointsValues.length; i < l; i += 4) { + + controlPoints.push(new THREE.Vector4().fromArray(pointsValues, i)); + + } + + var startKnot, endKnot; + + if (geoNode.Form === 'Closed') { + + controlPoints.push(controlPoints[0]); + + } else if (geoNode.Form === 'Periodic') { + + startKnot = degree; + endKnot = knots.length - 1 - startKnot; + + for (var i = 0; i < degree; ++i) { + + controlPoints.push(controlPoints[i]); + + } + + } + + var curve = new THREE.NURBSCurve(degree, knots, controlPoints, startKnot, endKnot); + var vertices = curve.getPoints(controlPoints.length * 7); + + var positions = new Float32Array(vertices.length * 3); + + vertices.forEach(function (vertex, i) { + + vertex.toArray(positions, i * 3); + + }); + + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3)); + + return geometry; + + }, + + }; + + // parse animation data from FBXTree + function AnimationParser() { } + + AnimationParser.prototype = { + + constructor: AnimationParser, + + // take raw animation clips and turn them into three.js animation clips + parse: function () { + + var animationClips = []; + + + var rawClips = this.parseClips(); + + if (rawClips === undefined) return; + + for (var key in rawClips) { + + var rawClip = rawClips[key]; + + var clip = this.addClip(rawClip); + + animationClips.push(clip); + + } + + return animationClips; + + }, + + parseClips: function () { + + // since the actual transformation data is stored in FBXTree.Objects.AnimationCurve, + // if this is undefined we can safely assume there are no animations + if (fbxTree.Objects.AnimationCurve === undefined) return undefined; + + var curveNodesMap = this.parseAnimationCurveNodes(); + + this.parseAnimationCurves(curveNodesMap); + + var layersMap = this.parseAnimationLayers(curveNodesMap); + var rawClips = this.parseAnimStacks(layersMap); + + return rawClips; + + }, + + // parse nodes in FBXTree.Objects.AnimationCurveNode + // each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation ) + // and is referenced by an AnimationLayer + parseAnimationCurveNodes: function () { + + var rawCurveNodes = fbxTree.Objects.AnimationCurveNode; + + var curveNodesMap = new Map(); + + for (var nodeID in rawCurveNodes) { + + var rawCurveNode = rawCurveNodes[nodeID]; + + if (rawCurveNode.attrName.match(/S|R|T|DeformPercent/) !== null) { + + var curveNode = { + + id: rawCurveNode.id, + attr: rawCurveNode.attrName, + curves: {}, + + }; + + curveNodesMap.set(curveNode.id, curveNode); + + } + + } + + return curveNodesMap; + + }, + + // parse nodes in FBXTree.Objects.AnimationCurve and connect them up to + // previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated + // axis ( e.g. times and values of x rotation) + parseAnimationCurves: function (curveNodesMap) { + + var rawCurves = fbxTree.Objects.AnimationCurve; + + // TODO: Many values are identical up to roundoff error, but won't be optimised + // e.g. position times: [0, 0.4, 0. 8] + // position values: [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.235384487103147e-7, 93.67520904541016, -0.9982695579528809] + // clearly, this should be optimised to + // times: [0], positions [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809] + // this shows up in nearly every FBX file, and generally time array is length > 100 + + for (var nodeID in rawCurves) { + + var animationCurve = { + + id: rawCurves[nodeID].id, + times: rawCurves[nodeID].KeyTime.a.map(convertFBXTimeToSeconds), + values: rawCurves[nodeID].KeyValueFloat.a, + + }; + + var relationships = connections.get(animationCurve.id); + + if (relationships !== undefined) { + + var animationCurveID = relationships.parents[0].ID; + var animationCurveRelationship = relationships.parents[0].relationship; + + if (animationCurveRelationship.match(/X/)) { + + curveNodesMap.get(animationCurveID).curves['x'] = animationCurve; + + } else if (animationCurveRelationship.match(/Y/)) { + + curveNodesMap.get(animationCurveID).curves['y'] = animationCurve; + + } else if (animationCurveRelationship.match(/Z/)) { + + curveNodesMap.get(animationCurveID).curves['z'] = animationCurve; + + } else if (animationCurveRelationship.match(/d|DeformPercent/) && curveNodesMap.has(animationCurveID)) { + + curveNodesMap.get(animationCurveID).curves['morph'] = animationCurve; + + } + + } + + } + + }, + + // parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references + // to various AnimationCurveNodes and is referenced by an AnimationStack node + // note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack + parseAnimationLayers: function (curveNodesMap) { + + var rawLayers = fbxTree.Objects.AnimationLayer; + + var layersMap = new Map(); + + for (var nodeID in rawLayers) { + + var layerCurveNodes = []; + + var connection = connections.get(parseInt(nodeID)); + + if (connection !== undefined) { + + // all the animationCurveNodes used in the layer + var children = connection.children; + + var self = this; + children.forEach(function (child, i) { + + if (curveNodesMap.has(child.ID)) { + + var curveNode = curveNodesMap.get(child.ID); + + // check that the curves are defined for at least one axis, otherwise ignore the curveNode + if (curveNode.curves.x !== undefined || curveNode.curves.y !== undefined || curveNode.curves.z !== undefined) { + + if (layerCurveNodes[i] === undefined) { + + var modelID; + + connections.get(child.ID).parents.forEach(function (parent) { + + if (parent.relationship !== undefined) modelID = parent.ID; + + }); + + var rawModel = fbxTree.Objects.Model[modelID.toString()]; + + var node = { + + modelName: THREE.PropertyBinding.sanitizeNodeName(rawModel.attrName), + initialPosition: [0, 0, 0], + initialRotation: [0, 0, 0], + initialScale: [1, 1, 1], + transform: self.getModelAnimTransform(rawModel), + + }; + + // if the animated model is pre rotated, we'll have to apply the pre rotations to every + // animation value as well + if ('PreRotation' in rawModel) node.preRotations = rawModel.PreRotation.value; + if ('PostRotation' in rawModel) node.postRotations = rawModel.PostRotation.value; + + layerCurveNodes[i] = node; + + } + + layerCurveNodes[i][curveNode.attr] = curveNode; + + } else if (curveNode.curves.morph !== undefined) { + + if (layerCurveNodes[i] === undefined) { + + var deformerID; + + connections.get(child.ID).parents.forEach(function (parent) { + + if (parent.relationship !== undefined) deformerID = parent.ID; + + }); + + var morpherID = connections.get(deformerID).parents[0].ID; + var geoID = connections.get(morpherID).parents[0].ID; + + // assuming geometry is not used in more than one model + var modelID = connections.get(geoID).parents[0].ID; + + var rawModel = fbxTree.Objects.Model[modelID]; + + var node = { + + modelName: THREE.PropertyBinding.sanitizeNodeName(rawModel.attrName), + morphName: fbxTree.Objects.Deformer[deformerID].attrName, + + }; + + layerCurveNodes[i] = node; + + } + + layerCurveNodes[i][curveNode.attr] = curveNode; + + } + + } + + }); + + layersMap.set(parseInt(nodeID), layerCurveNodes); + + } + + } + + return layersMap; + + }, + + getModelAnimTransform: function (modelNode) { + + var transformData = {}; + + if ('RotationOrder' in modelNode) transformData.eulerOrder = parseInt(modelNode.RotationOrder.value); + + if ('Lcl_Translation' in modelNode) transformData.translation = modelNode.Lcl_Translation.value; + if ('RotationOffset' in modelNode) transformData.rotationOffset = modelNode.RotationOffset.value; + + if ('Lcl_Rotation' in modelNode) transformData.rotation = modelNode.Lcl_Rotation.value; + if ('PreRotation' in modelNode) transformData.preRotation = modelNode.PreRotation.value; + + if ('PostRotation' in modelNode) transformData.postRotation = modelNode.PostRotation.value; + + if ('Lcl_Scaling' in modelNode) transformData.scale = modelNode.Lcl_Scaling.value; + + return generateTransform(transformData); + + }, + + // parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation + // hierarchy. Each Stack node will be used to create a THREE.AnimationClip + parseAnimStacks: function (layersMap) { + + var rawStacks = fbxTree.Objects.AnimationStack; + + // connect the stacks (clips) up to the layers + var rawClips = {}; + + for (var nodeID in rawStacks) { + + var children = connections.get(parseInt(nodeID)).children; + + if (children.length > 1) { + + // it seems like stacks will always be associated with a single layer. But just in case there are files + // where there are multiple layers per stack, we'll display a warning + console.warn('THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers.'); + + } + + var layer = layersMap.get(children[0].ID); + + rawClips[nodeID] = { + + name: rawStacks[nodeID].attrName, + layer: layer, + + }; + + } + + return rawClips; + + }, + + addClip: function (rawClip) { + + var tracks = []; + + var self = this; + rawClip.layer.forEach(function (rawTracks) { + + tracks = tracks.concat(self.generateTracks(rawTracks)); + + }); + + return new THREE.AnimationClip(rawClip.name, -1, tracks); + + }, + + generateTracks: function (rawTracks) { + + var tracks = []; + + var initialPosition = new THREE.Vector3(); + var initialRotation = new THREE.Quaternion(); + var initialScale = new THREE.Vector3(); + + if (rawTracks.transform) rawTracks.transform.decompose(initialPosition, initialRotation, initialScale); + + initialPosition = initialPosition.toArray(); + initialRotation = new THREE.Euler().setFromQuaternion(initialRotation).toArray(); // todo: euler order + initialScale = initialScale.toArray(); + + if (rawTracks.T !== undefined && Object.keys(rawTracks.T.curves).length > 0) { + + var positionTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.T.curves, initialPosition, 'position'); + if (positionTrack !== undefined) tracks.push(positionTrack); + + } + + if (rawTracks.R !== undefined && Object.keys(rawTracks.R.curves).length > 0) { + + var rotationTrack = this.generateRotationTrack(rawTracks.modelName, rawTracks.R.curves, initialRotation, rawTracks.preRotations, rawTracks.postRotations); + if (rotationTrack !== undefined) tracks.push(rotationTrack); + + } + + if (rawTracks.S !== undefined && Object.keys(rawTracks.S.curves).length > 0) { + + var scaleTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.S.curves, initialScale, 'scale'); + if (scaleTrack !== undefined) tracks.push(scaleTrack); + + } + + if (rawTracks.DeformPercent !== undefined) { + + var morphTrack = this.generateMorphTrack(rawTracks); + if (morphTrack !== undefined) tracks.push(morphTrack); + + } + + return tracks; + + }, + + generateVectorTrack: function (modelName, curves, initialValue, type) { + + var times = this.getTimesForAllAxes(curves); + var values = this.getKeyframeTrackValues(times, curves, initialValue); + + return new THREE.VectorKeyframeTrack(modelName + '.' + type, times, values); + + }, + + generateRotationTrack: function (modelName, curves, initialValue, preRotations, postRotations) { + + if (curves.x !== undefined) { + + this.interpolateRotations(curves.x); + curves.x.values = curves.x.values.map(THREE.Math.degToRad); + + } + if (curves.y !== undefined) { + + this.interpolateRotations(curves.y); + curves.y.values = curves.y.values.map(THREE.Math.degToRad); + + } + if (curves.z !== undefined) { + + this.interpolateRotations(curves.z); + curves.z.values = curves.z.values.map(THREE.Math.degToRad); + + } + + var times = this.getTimesForAllAxes(curves); + var values = this.getKeyframeTrackValues(times, curves, initialValue); + + if (preRotations !== undefined) { + + preRotations = preRotations.map(THREE.Math.degToRad); + preRotations.push('ZYX'); + + preRotations = new THREE.Euler().fromArray(preRotations); + preRotations = new THREE.Quaternion().setFromEuler(preRotations); + + } + + if (postRotations !== undefined) { + + postRotations = postRotations.map(THREE.Math.degToRad); + postRotations.push('ZYX'); + + postRotations = new THREE.Euler().fromArray(postRotations); + postRotations = new THREE.Quaternion().setFromEuler(postRotations).inverse(); + + } + + var quaternion = new THREE.Quaternion(); + var euler = new THREE.Euler(); + + var quaternionValues = []; + + for (var i = 0; i < values.length; i += 3) { + + euler.set(values[i], values[i + 1], values[i + 2], 'ZYX'); + + quaternion.setFromEuler(euler); + + if (preRotations !== undefined) quaternion.premultiply(preRotations); + if (postRotations !== undefined) quaternion.multiply(postRotations); + + quaternion.toArray(quaternionValues, (i / 3) * 4); + + } + + return new THREE.QuaternionKeyframeTrack(modelName + '.quaternion', times, quaternionValues); + + }, + + generateMorphTrack: function (rawTracks) { + + var curves = rawTracks.DeformPercent.curves.morph; + var values = curves.values.map(function (val) { + + return val / 100; + + }); + + var morphNum = sceneGraph.getObjectByName(rawTracks.modelName).morphTargetDictionary[rawTracks.morphName]; + + return new THREE.NumberKeyframeTrack(rawTracks.modelName + '.morphTargetInfluences[' + morphNum + ']', curves.times, values); + + }, + + // For all animated objects, times are defined separately for each axis + // Here we'll combine the times into one sorted array without duplicates + getTimesForAllAxes: function (curves) { + + var times = []; + + // first join together the times for each axis, if defined + if (curves.x !== undefined) times = times.concat(curves.x.times); + if (curves.y !== undefined) times = times.concat(curves.y.times); + if (curves.z !== undefined) times = times.concat(curves.z.times); + + // then sort them and remove duplicates + times = times.sort(function (a, b) { + + return a - b; + + }).filter(function (elem, index, array) { + + return array.indexOf(elem) == index; + + }); + + return times; + + }, + + getKeyframeTrackValues: function (times, curves, initialValue) { + + var prevValue = initialValue; + + var values = []; + + var xIndex = -1; + var yIndex = -1; + var zIndex = -1; + + times.forEach(function (time) { + + if (curves.x) xIndex = curves.x.times.indexOf(time); + if (curves.y) yIndex = curves.y.times.indexOf(time); + if (curves.z) zIndex = curves.z.times.indexOf(time); + + // if there is an x value defined for this frame, use that + if (xIndex !== -1) { + + var xValue = curves.x.values[xIndex]; + values.push(xValue); + prevValue[0] = xValue; + + } else { + + // otherwise use the x value from the previous frame + values.push(prevValue[0]); + + } + + if (yIndex !== -1) { + + var yValue = curves.y.values[yIndex]; + values.push(yValue); + prevValue[1] = yValue; + + } else { + + values.push(prevValue[1]); + + } + + if (zIndex !== -1) { + + var zValue = curves.z.values[zIndex]; + values.push(zValue); + prevValue[2] = zValue; + + } else { + + values.push(prevValue[2]); + + } + + }); + + return values; + + }, + + // Rotations are defined as Euler angles which can have values of any size + // These will be converted to quaternions which don't support values greater than + // PI, so we'll interpolate large rotations + interpolateRotations: function (curve) { + + for (var i = 1; i < curve.values.length; i++) { + + var initialValue = curve.values[i - 1]; + var valuesSpan = curve.values[i] - initialValue; + + var absoluteSpan = Math.abs(valuesSpan); + + if (absoluteSpan >= 180) { + + var numSubIntervals = absoluteSpan / 180; + + var step = valuesSpan / numSubIntervals; + var nextValue = initialValue + step; + + var initialTime = curve.times[i - 1]; + var timeSpan = curve.times[i] - initialTime; + var interval = timeSpan / numSubIntervals; + var nextTime = initialTime + interval; + + var interpolatedTimes = []; + var interpolatedValues = []; + + while (nextTime < curve.times[i]) { + + interpolatedTimes.push(nextTime); + nextTime += interval; + + interpolatedValues.push(nextValue); + nextValue += step; + + } + + curve.times = inject(curve.times, i, interpolatedTimes); + curve.values = inject(curve.values, i, interpolatedValues); + + } + + } + + }, + + }; + + // parse an FBX file in ASCII format + function TextParser() { } + + TextParser.prototype = { + + constructor: TextParser, + + getPrevNode: function () { + + return this.nodeStack[this.currentIndent - 2]; + + }, + + getCurrentNode: function () { + + return this.nodeStack[this.currentIndent - 1]; + + }, + + getCurrentProp: function () { + + return this.currentProp; + + }, + + pushStack: function (node) { + + this.nodeStack.push(node); + this.currentIndent += 1; + + }, + + popStack: function () { + + this.nodeStack.pop(); + this.currentIndent -= 1; + + }, + + setCurrentProp: function (val, name) { + + this.currentProp = val; + this.currentPropName = name; + + }, + + parse: function (text) { + + this.currentIndent = 0; + console.log("FBXTree: ", FBXTree); + this.allNodes = new FBXTree(); + this.nodeStack = []; + this.currentProp = []; + this.currentPropName = ''; + + var self = this; + + var split = text.split(/[\r\n]+/); + + split.forEach(function (line, i) { + + var matchComment = line.match(/^[\s\t]*;/); + var matchEmpty = line.match(/^[\s\t]*$/); + + if (matchComment || matchEmpty) return; + + var matchBeginning = line.match('^\\t{' + self.currentIndent + '}(\\w+):(.*){', ''); + var matchProperty = line.match('^\\t{' + (self.currentIndent) + '}(\\w+):[\\s\\t\\r\\n](.*)'); + var matchEnd = line.match('^\\t{' + (self.currentIndent - 1) + '}}'); + + if (matchBeginning) { + + self.parseNodeBegin(line, matchBeginning); + + } else if (matchProperty) { + + self.parseNodeProperty(line, matchProperty, split[++i]); + + } else if (matchEnd) { + + self.popStack(); + + } else if (line.match(/^[^\s\t}]/)) { + + // large arrays are split over multiple lines terminated with a ',' character + // if this is encountered the line needs to be joined to the previous line + self.parseNodePropertyContinued(line); + + } + + }); + + return this.allNodes; + + }, + + parseNodeBegin: function (line, property) { + + var nodeName = property[1].trim().replace(/^"/, '').replace(/"$/, ''); + + var nodeAttrs = property[2].split(',').map(function (attr) { + + return attr.trim().replace(/^"/, '').replace(/"$/, ''); + + }); + + var node = { name: nodeName }; + var attrs = this.parseNodeAttr(nodeAttrs); + + var currentNode = this.getCurrentNode(); + + // a top node + if (this.currentIndent === 0) { + + this.allNodes.add(nodeName, node); + + } else { // a subnode + + // if the subnode already exists, append it + if (nodeName in currentNode) { + + // special case Pose needs PoseNodes as an array + if (nodeName === 'PoseNode') { + + currentNode.PoseNode.push(node); + + } else if (currentNode[nodeName].id !== undefined) { + + currentNode[nodeName] = {}; + currentNode[nodeName][currentNode[nodeName].id] = currentNode[nodeName]; + + } + + if (attrs.id !== '') currentNode[nodeName][attrs.id] = node; + + } else if (typeof attrs.id === 'number') { + + currentNode[nodeName] = {}; + currentNode[nodeName][attrs.id] = node; + + } else if (nodeName !== 'Properties70') { + + if (nodeName === 'PoseNode') currentNode[nodeName] = [node]; + else currentNode[nodeName] = node; + + } + + } + + if (typeof attrs.id === 'number') node.id = attrs.id; + if (attrs.name !== '') node.attrName = attrs.name; + if (attrs.type !== '') node.attrType = attrs.type; + + this.pushStack(node); + + }, + + parseNodeAttr: function (attrs) { + + var id = attrs[0]; + + if (attrs[0] !== '') { + + id = parseInt(attrs[0]); + + if (isNaN(id)) { + + id = attrs[0]; + + } + + } + + var name = '', type = ''; + + if (attrs.length > 1) { + + name = attrs[1].replace(/^(\w+)::/, ''); + type = attrs[2]; + + } + + return { id: id, name: name, type: type }; + + }, + + parseNodeProperty: function (line, property, contentLine) { + + var propName = property[1].replace(/^"/, '').replace(/"$/, '').trim(); + var propValue = property[2].replace(/^"/, '').replace(/"$/, '').trim(); + + // for special case: base64 image data follows "Content: ," line + // Content: , + // "/9j/4RDaRXhpZgAATU0A..." + if (propName === 'Content' && propValue === ',') { + + propValue = contentLine.replace(/"/g, '').replace(/,$/, '').trim(); + + } + + var currentNode = this.getCurrentNode(); + var parentName = currentNode.name; + + if (parentName === 'Properties70') { + + this.parseNodeSpecialProperty(line, propName, propValue); + return; + + } + + // Connections + if (propName === 'C') { + + var connProps = propValue.split(',').slice(1); + var from = parseInt(connProps[0]); + var to = parseInt(connProps[1]); + + var rest = propValue.split(',').slice(3); + + rest = rest.map(function (elem) { + + return elem.trim().replace(/^"/, ''); + + }); + + propName = 'connections'; + propValue = [from, to]; + append(propValue, rest); + + if (currentNode[propName] === undefined) { + + currentNode[propName] = []; + + } + + } + + // Node + if (propName === 'Node') currentNode.id = propValue; + + // connections + if (propName in currentNode && Array.isArray(currentNode[propName])) { + + currentNode[propName].push(propValue); + + } else { + + if (propName !== 'a') currentNode[propName] = propValue; + else currentNode.a = propValue; + + } + + this.setCurrentProp(currentNode, propName); + + // convert string to array, unless it ends in ',' in which case more will be added to it + if (propName === 'a' && propValue.slice(-1) !== ',') { + + currentNode.a = parseNumberArray(propValue); + + } + + }, + + parseNodePropertyContinued: function (line) { + + var currentNode = this.getCurrentNode(); + + currentNode.a += line; + + // if the line doesn't end in ',' we have reached the end of the property value + // so convert the string to an array + if (line.slice(-1) !== ',') { + + currentNode.a = parseNumberArray(currentNode.a); + + } + + }, + + // parse "Property70" + parseNodeSpecialProperty: function (line, propName, propValue) { + + // split this + // P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + // into array like below + // ["Lcl Scaling", "Lcl Scaling", "", "A", "1,1,1" ] + var props = propValue.split('",').map(function (prop) { + + return prop.trim().replace(/^\"/, '').replace(/\s/, '_'); + + }); + + var innerPropName = props[0]; + var innerPropType1 = props[1]; + var innerPropType2 = props[2]; + var innerPropFlag = props[3]; + var innerPropValue = props[4]; + + // cast values where needed, otherwise leave as strings + switch (innerPropType1) { + + case 'int': + case 'enum': + case 'bool': + case 'ULongLong': + case 'double': + case 'Number': + case 'FieldOfView': + innerPropValue = parseFloat(innerPropValue); + break; + + case 'Color': + case 'ColorRGB': + case 'Vector3D': + case 'Lcl_Translation': + case 'Lcl_Rotation': + case 'Lcl_Scaling': + innerPropValue = parseNumberArray(innerPropValue); + break; + + } + + // CAUTION: these props must append to parent's parent + this.getPrevNode()[innerPropName] = { + + 'type': innerPropType1, + 'type2': innerPropType2, + 'flag': innerPropFlag, + 'value': innerPropValue + + }; + + this.setCurrentProp(this.getPrevNode(), innerPropName); + + }, + + }; + + // Parse an FBX file in Binary format + function BinaryParser() { } + + BinaryParser.prototype = { + + constructor: BinaryParser, + + parse: function (buffer) { + + var reader = new BinaryReader(buffer); + reader.skip(23); // skip magic 23 bytes + + var version = reader.getUint32(); + + console.log('THREE.FBXLoader: FBX binary version: ' + version); + + var allNodes = new FBXTree(); + + while (!this.endOfContent(reader)) { + + var node = this.parseNode(reader, version); + if (node !== null) allNodes.add(node.name, node); + + } + + return allNodes; + + }, + + // Check if reader has reached the end of content. + endOfContent: function (reader) { + + // footer size: 160bytes + 16-byte alignment padding + // - 16bytes: magic + // - padding til 16-byte alignment (at least 1byte?) + // (seems like some exporters embed fixed 15 or 16bytes?) + // - 4bytes: magic + // - 4bytes: version + // - 120bytes: zero + // - 16bytes: magic + if (reader.size() % 16 === 0) { + + return ((reader.getOffset() + 160 + 16) & ~0xf) >= reader.size(); + + } else { + + return reader.getOffset() + 160 + 16 >= reader.size(); + + } + + }, + + // recursively parse nodes until the end of the file is reached + parseNode: function (reader, version) { + + var node = {}; + + // The first three data sizes depends on version. + var endOffset = (version >= 7500) ? reader.getUint64() : reader.getUint32(); + var numProperties = (version >= 7500) ? reader.getUint64() : reader.getUint32(); + + // note: do not remove this even if you get a linter warning as it moves the buffer forward + var propertyListLen = (version >= 7500) ? reader.getUint64() : reader.getUint32(); + + var nameLen = reader.getUint8(); + var name = reader.getString(nameLen); + + // Regards this node as NULL-record if endOffset is zero + if (endOffset === 0) return null; + + var propertyList = []; + + for (var i = 0; i < numProperties; i++) { + + propertyList.push(this.parseProperty(reader)); + + } + + // Regards the first three elements in propertyList as id, attrName, and attrType + var id = propertyList.length > 0 ? propertyList[0] : ''; + var attrName = propertyList.length > 1 ? propertyList[1] : ''; + var attrType = propertyList.length > 2 ? propertyList[2] : ''; + + // check if this node represents just a single property + // like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]} + node.singleProperty = (numProperties === 1 && reader.getOffset() === endOffset) ? true : false; + + while (endOffset > reader.getOffset()) { + + var subNode = this.parseNode(reader, version); + + if (subNode !== null) this.parseSubNode(name, node, subNode); + + } + + node.propertyList = propertyList; // raw property list used by parent + + if (typeof id === 'number') node.id = id; + if (attrName !== '') node.attrName = attrName; + if (attrType !== '') node.attrType = attrType; + if (name !== '') node.name = name; + + return node; + + }, + + parseSubNode: function (name, node, subNode) { + + // special case: child node is single property + if (subNode.singleProperty === true) { + + var value = subNode.propertyList[0]; + + if (Array.isArray(value)) { + + node[subNode.name] = subNode; + + subNode.a = value; + + } else { + + node[subNode.name] = value; + + } + + } else if (name === 'Connections' && subNode.name === 'C') { + + var array = []; + + subNode.propertyList.forEach(function (property, i) { + + // first Connection is FBX type (OO, OP, etc.). We'll discard these + if (i !== 0) array.push(property); + + }); + + if (node.connections === undefined) { + + node.connections = []; + + } + + node.connections.push(array); + + } else if (subNode.name === 'Properties70') { + + var keys = Object.keys(subNode); + + keys.forEach(function (key) { + + node[key] = subNode[key]; + + }); + + } else if (name === 'Properties70' && subNode.name === 'P') { + + var innerPropName = subNode.propertyList[0]; + var innerPropType1 = subNode.propertyList[1]; + var innerPropType2 = subNode.propertyList[2]; + var innerPropFlag = subNode.propertyList[3]; + var innerPropValue; + + if (innerPropName.indexOf('Lcl ') === 0) innerPropName = innerPropName.replace('Lcl ', 'Lcl_'); + if (innerPropType1.indexOf('Lcl ') === 0) innerPropType1 = innerPropType1.replace('Lcl ', 'Lcl_'); + + if (innerPropType1 === 'Color' || innerPropType1 === 'ColorRGB' || innerPropType1 === 'Vector' || innerPropType1 === 'Vector3D' || innerPropType1.indexOf('Lcl_') === 0) { + + innerPropValue = [ + subNode.propertyList[4], + subNode.propertyList[5], + subNode.propertyList[6] + ]; + + } else { + + innerPropValue = subNode.propertyList[4]; + + } + + // this will be copied to parent, see above + node[innerPropName] = { + + 'type': innerPropType1, + 'type2': innerPropType2, + 'flag': innerPropFlag, + 'value': innerPropValue + + }; + + } else if (node[subNode.name] === undefined) { + + if (typeof subNode.id === 'number') { + + node[subNode.name] = {}; + node[subNode.name][subNode.id] = subNode; + + } else { + + node[subNode.name] = subNode; + + } + + } else { + + if (subNode.name === 'PoseNode') { + + if (!Array.isArray(node[subNode.name])) { + + node[subNode.name] = [node[subNode.name]]; + + } + + node[subNode.name].push(subNode); + + } else if (node[subNode.name][subNode.id] === undefined) { + + node[subNode.name][subNode.id] = subNode; + + } + + } + + }, + + parseProperty: function (reader) { + + var type = reader.getString(1); + + switch (type) { + + case 'C': + return reader.getBoolean(); + + case 'D': + return reader.getFloat64(); + + case 'F': + return reader.getFloat32(); + + case 'I': + return reader.getInt32(); + + case 'L': + return reader.getInt64(); + + case 'R': + var length = reader.getUint32(); + return reader.getArrayBuffer(length); + + case 'S': + var length = reader.getUint32(); + return reader.getString(length); + + case 'Y': + return reader.getInt16(); + + case 'b': + case 'c': + case 'd': + case 'f': + case 'i': + case 'l': + + var arrayLength = reader.getUint32(); + var encoding = reader.getUint32(); // 0: non-compressed, 1: compressed + var compressedLength = reader.getUint32(); + + if (encoding === 0) { + + switch (type) { + + case 'b': + case 'c': + return reader.getBooleanArray(arrayLength); + + case 'd': + return reader.getFloat64Array(arrayLength); + + case 'f': + return reader.getFloat32Array(arrayLength); + + case 'i': + return reader.getInt32Array(arrayLength); + + case 'l': + return reader.getInt64Array(arrayLength); + + } + + } + + if (typeof Zlib === 'undefined') { + + console.error('THREE.FBXLoader: External library Inflate.min.js required, obtain or import from https://github.com/imaya/zlib.js'); + + } + + var inflate = new Zlib.Inflate(new Uint8Array(reader.getArrayBuffer(compressedLength))); // eslint-disable-line no-undef + var reader2 = new BinaryReader(inflate.decompress().buffer); + + switch (type) { + + case 'b': + case 'c': + return reader2.getBooleanArray(arrayLength); + + case 'd': + return reader2.getFloat64Array(arrayLength); + + case 'f': + return reader2.getFloat32Array(arrayLength); + + case 'i': + return reader2.getInt32Array(arrayLength); + + case 'l': + return reader2.getInt64Array(arrayLength); + + } + + default: + throw new Error('THREE.FBXLoader: Unknown property type ' + type); + + } + + } + + }; + + function BinaryReader(buffer, littleEndian) { + + this.dv = new DataView(buffer); + this.offset = 0; + this.littleEndian = (littleEndian !== undefined) ? littleEndian : true; + + } + + BinaryReader.prototype = { + + constructor: BinaryReader, + + getOffset: function () { + + return this.offset; + + }, + + size: function () { + + return this.dv.buffer.byteLength; + + }, + + skip: function (length) { + + this.offset += length; + + }, + + // seems like true/false representation depends on exporter. + // true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54) + // then sees LSB. + getBoolean: function () { + + return (this.getUint8() & 1) === 1; + + }, + + getBooleanArray: function (size) { + + var a = []; + + for (var i = 0; i < size; i++) { + + a.push(this.getBoolean()); + + } + + return a; + + }, + + getUint8: function () { + + var value = this.dv.getUint8(this.offset); + this.offset += 1; + return value; + + }, + + getInt16: function () { + + var value = this.dv.getInt16(this.offset, this.littleEndian); + this.offset += 2; + return value; + + }, + + getInt32: function () { + + var value = this.dv.getInt32(this.offset, this.littleEndian); + this.offset += 4; + return value; + + }, + + getInt32Array: function (size) { + + var a = []; + + for (var i = 0; i < size; i++) { + + a.push(this.getInt32()); + + } + + return a; + + }, + + getUint32: function () { + + var value = this.dv.getUint32(this.offset, this.littleEndian); + this.offset += 4; + return value; + + }, + + // JavaScript doesn't support 64-bit integer so calculate this here + // 1 << 32 will return 1 so using multiply operation instead here. + // There's a possibility that this method returns wrong value if the value + // is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER. + // TODO: safely handle 64-bit integer + getInt64: function () { + + var low, high; + + if (this.littleEndian) { + + low = this.getUint32(); + high = this.getUint32(); + + } else { + + high = this.getUint32(); + low = this.getUint32(); + + } + + // calculate negative value + if (high & 0x80000000) { + + high = ~high & 0xFFFFFFFF; + low = ~low & 0xFFFFFFFF; + + if (low === 0xFFFFFFFF) high = (high + 1) & 0xFFFFFFFF; + + low = (low + 1) & 0xFFFFFFFF; + + return -(high * 0x100000000 + low); + + } + + return high * 0x100000000 + low; + + }, + + getInt64Array: function (size) { + + var a = []; + + for (var i = 0; i < size; i++) { + + a.push(this.getInt64()); + + } + + return a; + + }, + + // Note: see getInt64() comment + getUint64: function () { + + var low, high; + + if (this.littleEndian) { + + low = this.getUint32(); + high = this.getUint32(); + + } else { + + high = this.getUint32(); + low = this.getUint32(); + + } + + return high * 0x100000000 + low; + + }, + + getFloat32: function () { + + var value = this.dv.getFloat32(this.offset, this.littleEndian); + this.offset += 4; + return value; + + }, + + getFloat32Array: function (size) { + + var a = []; + + for (var i = 0; i < size; i++) { + + a.push(this.getFloat32()); + + } + + return a; + + }, + + getFloat64: function () { + + var value = this.dv.getFloat64(this.offset, this.littleEndian); + this.offset += 8; + return value; + + }, + + getFloat64Array: function (size) { + + var a = []; + + for (var i = 0; i < size; i++) { + + a.push(this.getFloat64()); + + } + + return a; + + }, + + getArrayBuffer: function (size) { + + var value = this.dv.buffer.slice(this.offset, this.offset + size); + this.offset += size; + return value; + + }, + + getString: function (size) { + + // note: safari 9 doesn't support Uint8Array.indexOf; create intermediate array instead + var a = []; + + for (var i = 0; i < size; i++) { + + a[i] = this.getUint8(); + + } + + var nullByte = a.indexOf(0); + if (nullByte >= 0) a = a.slice(0, nullByte); + + return THREE.LoaderUtils.decodeText(new Uint8Array(a)); + + } + + }; + + // FBXTree holds a representation of the FBX data, returned by the TextParser ( FBX ASCII format) + // and BinaryParser( FBX Binary format) + function FBXTree() { } + + FBXTree.prototype = { + + constructor: FBXTree, + + add: function (key, val) { + + this[key] = val; + + }, + + }; + + // ************** UTILITY FUNCTIONS ************** + + function isFbxFormatBinary(buffer) { + + var CORRECT = 'Kaydara FBX Binary \0'; + + return buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString(buffer, 0, CORRECT.length); + + } + + function isFbxFormatASCII(text) { + + var CORRECT = ['K', 'a', 'y', 'd', 'a', 'r', 'a', '\\', 'F', 'B', 'X', '\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\', '\\']; + + var cursor = 0; + + function read(offset) { + + var result = text[offset - 1]; + text = text.slice(cursor + offset); + cursor++; + return result; + + } + + for (var i = 0; i < CORRECT.length; ++i) { + + var num = read(1); + if (num === CORRECT[i]) { + + return false; + + } + + } + + return true; + + } + + function getFbxVersion(text) { + + var versionRegExp = /FBXVersion: (\d+)/; + var match = text.match(versionRegExp); + if (match) { + + var version = parseInt(match[1]); + return version; + + } + throw new Error('THREE.FBXLoader: Cannot find the version number for the file given.'); + + } + + // Converts FBX ticks into real time seconds. + function convertFBXTimeToSeconds(time) { + + return time / 46186158000; + + } + + var dataArray = []; + + // extracts the data from the correct position in the FBX array based on indexing type + function getData(polygonVertexIndex, polygonIndex, vertexIndex, infoObject) { + + var index; + + switch (infoObject.mappingType) { + + case 'ByPolygonVertex': + index = polygonVertexIndex; + break; + case 'ByPolygon': + index = polygonIndex; + break; + case 'ByVertice': + index = vertexIndex; + break; + case 'AllSame': + index = infoObject.indices[0]; + break; + default: + console.warn('THREE.FBXLoader: unknown attribute mapping type ' + infoObject.mappingType); + + } + + if (infoObject.referenceType === 'IndexToDirect') index = infoObject.indices[index]; + + var from = index * infoObject.dataSize; + var to = from + infoObject.dataSize; + + return slice(dataArray, infoObject.buffer, from, to); + + } + + var tempMat = new THREE.Matrix4(); + var tempEuler = new THREE.Euler(); + var tempVec = new THREE.Vector3(); + var translation = new THREE.Vector3(); + var rotation = new THREE.Matrix4(); + + // generate transformation from FBX transform data + // ref: https://help.autodesk.com/view/FBX/2017/ENU/?guid=__files_GUID_10CDD63C_79C1_4F2D_BB28_AD2BE65A02ED_htm + // transformData = { + // eulerOrder: int, + // translation: [], + // rotationOffset: [], + // preRotation + // rotation + // postRotation + // scale + // } + // all entries are optional + function generateTransform(transformData) { + + var transform = new THREE.Matrix4(); + translation.set(0, 0, 0); + rotation.identity(); + + var order = (transformData.eulerOrder) ? getEulerOrder(transformData.eulerOrder) : getEulerOrder(0); + + if (transformData.translation) translation.fromArray(transformData.translation); + if (transformData.rotationOffset) translation.add(tempVec.fromArray(transformData.rotationOffset)); + + if (transformData.rotation) { + + var array = transformData.rotation.map(THREE.Math.degToRad); + array.push(order); + rotation.makeRotationFromEuler(tempEuler.fromArray(array)); + + } + + if (transformData.preRotation) { + + var array = transformData.preRotation.map(THREE.Math.degToRad); + array.push(order); + tempMat.makeRotationFromEuler(tempEuler.fromArray(array)); + + rotation.premultiply(tempMat); + + } + + if (transformData.postRotation) { + + var array = transformData.postRotation.map(THREE.Math.degToRad); + array.push(order); + tempMat.makeRotationFromEuler(tempEuler.fromArray(array)); + + tempMat.getInverse(tempMat); + + rotation.multiply(tempMat); + + } + + if (transformData.scale) transform.scale(tempVec.fromArray(transformData.scale)); + + transform.setPosition(translation); + transform.multiply(rotation); + + return transform; + + } + + // Returns the three.js intrinsic Euler order corresponding to FBX extrinsic Euler order + // ref: http://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_euler_html + function getEulerOrder(order) { + + var enums = [ + 'ZYX', // -> XYZ extrinsic + 'YZX', // -> XZY extrinsic + 'XZY', // -> YZX extrinsic + 'ZXY', // -> YXZ extrinsic + 'YXZ', // -> ZXY extrinsic + 'XYZ', // -> ZYX extrinsic + //'SphericXYZ', // not possible to support + ]; + + if (order === 6) { + + console.warn('THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect.'); + return enums[0]; + + } + + return enums[order]; + + } + + // Parses comma separated list of numbers and returns them an array. + // Used internally by the TextParser + function parseNumberArray(value) { + + var array = value.split(',').map(function (val) { + + return parseFloat(val); + + }); + + return array; + + } + + function convertArrayBufferToString(buffer, from, to) { + + if (from === undefined) from = 0; + if (to === undefined) to = buffer.byteLength; + + return THREE.LoaderUtils.decodeText(new Uint8Array(buffer, from, to)); + + } + + function append(a, b) { + + for (var i = 0, j = a.length, l = b.length; i < l; i++, j++) { + + a[j] = b[i]; + + } + + } + + function slice(a, b, from, to) { + + for (var i = from, j = 0; i < to; i++, j++) { + + a[j] = b[i]; + + } + + return a; + + } + + // inject array a2 into array a1 at index + function inject(a1, index, a2) { + + return a1.slice(0, index).concat(a2).concat(a1.slice(index)); + + } + + return FBXLoader; + +})(); diff --git a/public/static/modelView/js/loaders/GLTFLoader.js b/public/static/modelView/js/loaders/GLTFLoader.js new file mode 100644 index 0000000..4af9c94 --- /dev/null +++ b/public/static/modelView/js/loaders/GLTFLoader.js @@ -0,0 +1,3166 @@ +/** + * @author Rich Tibbett / https://github.com/richtr + * @author mrdoob / http://mrdoob.com/ + * @author Tony Parisi / http://www.tonyparisi.com/ + * @author Takahiro / https://github.com/takahirox + * @author Don McCurdy / https://www.donmccurdy.com + */ + +THREE.GLTFLoader = (function () { + + function GLTFLoader(manager) { + + this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; + this.dracoLoader = null; + + } + + GLTFLoader.prototype = { + + constructor: GLTFLoader, + + crossOrigin: 'Anonymous', + + load: function (url, onLoad, onProgress, onError) { + + var scope = this; + + var path = this.path !== undefined ? this.path : THREE.LoaderUtils.extractUrlBase(url); + + var loader = new THREE.FileLoader(scope.manager); + + loader.setResponseType('arraybuffer'); + + loader.load(url, function (data) { + + try { + + scope.parse(data, path, onLoad, onError); + + } catch (e) { + + if (onError !== undefined) { + + onError(e); + + } else { + + throw e; + + } + + } + + }, onProgress, onError); + + }, + + setCrossOrigin: function (value) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function (value) { + + this.path = value; + return this; + + }, + + setDRACOLoader: function (dracoLoader) { + + this.dracoLoader = dracoLoader; + return this; + + }, + + parse: function (data, path, onLoad, onError) { + + var content; + var extensions = {}; + + if (typeof data === 'string') { + + content = data; + + } else { + + var magic = THREE.LoaderUtils.decodeText(new Uint8Array(data, 0, 4)); + + if (magic === BINARY_EXTENSION_HEADER_MAGIC) { + + try { + + extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data); + + } catch (error) { + + if (onError) onError(error); + return; + + } + + content = extensions[EXTENSIONS.KHR_BINARY_GLTF].content; + + } else { + + content = THREE.LoaderUtils.decodeText(new Uint8Array(data)); + + } + + } + + var json = JSON.parse(content); + + if (json.asset === undefined || json.asset.version[0] < 2) { + + if (onError) onError(new Error('THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported. Use LegacyGLTFLoader instead.')); + return; + + } + + if (json.extensionsUsed) { + + for (var i = 0; i < json.extensionsUsed.length; ++i) { + + var extensionName = json.extensionsUsed[i]; + var extensionsRequired = json.extensionsRequired || []; + + switch (extensionName) { + + case EXTENSIONS.KHR_LIGHTS: + extensions[extensionName] = new GLTFLightsExtension(json); + break; + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[extensionName] = new GLTFMaterialsUnlitExtension(json); + break; + + case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: + extensions[extensionName] = new GLTFMaterialsPbrSpecularGlossinessExtension(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[extensionName] = new GLTFDracoMeshCompressionExtension(json, this.dracoLoader); + break; + + case EXTENSIONS.MSFT_TEXTURE_DDS: + extensions[EXTENSIONS.MSFT_TEXTURE_DDS] = new GLTFTextureDDSExtension(); + break; + + default: + + if (extensionsRequired.indexOf(extensionName) >= 0) { + + console.warn('THREE.GLTFLoader: Unknown extension "' + extensionName + '".'); + + } + + } + + } + + } + + var parser = new GLTFParser(json, extensions, { + + path: path || this.path || '', + crossOrigin: this.crossOrigin, + manager: this.manager + + }); + + parser.parse(function (scene, scenes, cameras, animations, json) { + + var glTF = { + scene: scene, + scenes: scenes, + cameras: cameras, + animations: animations, + asset: json.asset, + parser: parser, + userData: {} + }; + + addUnknownExtensionsToUserData(extensions, glTF, json); + + onLoad(glTF); + + }, onError); + + } + + }; + + /* GLTFREGISTRY */ + + function GLTFRegistry() { + + var objects = {}; + + return { + + get: function (key) { + + return objects[key]; + + }, + + add: function (key, object) { + + objects[key] = object; + + }, + + remove: function (key) { + + delete objects[key]; + + }, + + removeAll: function () { + + objects = {}; + + } + + }; + + } + + /*********************************/ + /********** EXTENSIONS ***********/ + /*********************************/ + + var EXTENSIONS = { + KHR_BINARY_GLTF: 'KHR_binary_glTF', + KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + KHR_LIGHTS: 'KHR_lights', + KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', + KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + MSFT_TEXTURE_DDS: 'MSFT_texture_dds' + }; + + /** + * DDS Texture Extension + * + * Specification: + * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds + * + */ + function GLTFTextureDDSExtension() { + + if (!THREE.DDSLoader) { + + throw new Error('THREE.GLTFLoader: Attempting to load .dds texture without importing THREE.DDSLoader'); + + } + + this.name = EXTENSIONS.MSFT_TEXTURE_DDS; + this.ddsLoader = new THREE.DDSLoader(); + + } + + /** + * Lights Extension + * + * Specification: PENDING + */ + function GLTFLightsExtension(json) { + + this.name = EXTENSIONS.KHR_LIGHTS; + + this.lights = {}; + + var extension = (json.extensions && json.extensions[EXTENSIONS.KHR_LIGHTS]) || {}; + var lights = extension.lights || {}; + + for (var lightId in lights) { + + var light = lights[lightId]; + var lightNode; + + var color = new THREE.Color().fromArray(light.color); + + switch (light.type) { + + case 'directional': + lightNode = new THREE.DirectionalLight(color); + lightNode.target.position.set(0, 0, 1); + lightNode.add(lightNode.target); + break; + + case 'point': + lightNode = new THREE.PointLight(color); + break; + + case 'spot': + lightNode = new THREE.SpotLight(color); + // Handle spotlight properties. + light.spot = light.spot || {}; + light.spot.innerConeAngle = light.spot.innerConeAngle !== undefined ? light.spot.innerConeAngle : 0; + light.spot.outerConeAngle = light.spot.outerConeAngle !== undefined ? light.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = light.spot.outerConeAngle; + lightNode.penumbra = 1.0 - light.spot.innerConeAngle / light.spot.outerConeAngle; + lightNode.target.position.set(0, 0, 1); + lightNode.add(lightNode.target); + break; + + case 'ambient': + lightNode = new THREE.AmbientLight(color); + break; + + } + + if (lightNode) { + + lightNode.decay = 2; + + if (light.intensity !== undefined) { + + lightNode.intensity = light.intensity; + + } + + lightNode.name = light.name || ('light_' + lightId); + this.lights[lightId] = lightNode; + + } + + } + + } + + /** + * Unlit Materials Extension (pending) + * + * PR: https://github.com/KhronosGroup/glTF/pull/1163 + */ + function GLTFMaterialsUnlitExtension(json) { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + GLTFMaterialsUnlitExtension.prototype.getMaterialType = function (material) { + + return THREE.MeshBasicMaterial; + + }; + + GLTFMaterialsUnlitExtension.prototype.extendParams = function (materialParams, material, parser) { + + var pending = []; + + materialParams.color = new THREE.Color(1.0, 1.0, 1.0); + materialParams.opacity = 1.0; + + var metallicRoughness = material.pbrMetallicRoughness; + + if (metallicRoughness) { + + if (Array.isArray(metallicRoughness.baseColorFactor)) { + + var array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray(array); + materialParams.opacity = array[3]; + + } + + if (metallicRoughness.baseColorTexture !== undefined) { + + pending.push(parser.assignTexture(materialParams, 'map', metallicRoughness.baseColorTexture.index)); + + } + + } + + return Promise.all(pending); + + }; + + /* BINARY EXTENSION */ + + var BINARY_EXTENSION_BUFFER_NAME = 'binary_glTF'; + var BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; + var BINARY_EXTENSION_HEADER_LENGTH = 12; + var BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; + + function GLTFBinaryExtension(data) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + var headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH); + + this.header = { + magic: THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))), + version: headerView.getUint32(4, true), + length: headerView.getUint32(8, true) + }; + + if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) { + + throw new Error('THREE.GLTFLoader: Unsupported glTF-Binary header.'); + + } else if (this.header.version < 2.0) { + + throw new Error('THREE.GLTFLoader: Legacy binary file detected. Use LegacyGLTFLoader instead.'); + + } + + var chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH); + var chunkIndex = 0; + + while (chunkIndex < chunkView.byteLength) { + + var chunkLength = chunkView.getUint32(chunkIndex, true); + chunkIndex += 4; + + var chunkType = chunkView.getUint32(chunkIndex, true); + chunkIndex += 4; + + if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) { + + var contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength); + this.content = THREE.LoaderUtils.decodeText(contentArray); + + } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) { + + var byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice(byteOffset, byteOffset + chunkLength); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if (this.content === null) { + + throw new Error('THREE.GLTFLoader: JSON content not found.'); + + } + + } + + /** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/pull/874 + */ + function GLTFDracoMeshCompressionExtension(json, dracoLoader) { + + if (!dracoLoader) { + + throw new Error('THREE.GLTFLoader: No DRACOLoader instance provided.'); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + + } + + GLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function (primitive, parser) { + + var json = this.json; + var dracoLoader = this.dracoLoader; + var bufferViewIndex = primitive.extensions[this.name].bufferView; + var gltfAttributeMap = primitive.extensions[this.name].attributes; + var threeAttributeMap = {}; + var attributeNormalizedMap = {}; + var attributeTypeMap = {}; + + for (var attributeName in gltfAttributeMap) { + + if (!(attributeName in ATTRIBUTES)) continue; + + threeAttributeMap[ATTRIBUTES[attributeName]] = gltfAttributeMap[attributeName]; + + } + + for (attributeName in primitive.attributes) { + + if (ATTRIBUTES[attributeName] !== undefined && gltfAttributeMap[attributeName] !== undefined) { + + var accessorDef = json.accessors[primitive.attributes[attributeName]]; + var componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; + + attributeTypeMap[ATTRIBUTES[attributeName]] = componentType; + attributeNormalizedMap[ATTRIBUTES[attributeName]] = accessorDef.normalized === true; + + } + + } + + return parser.getDependency('bufferView', bufferViewIndex).then(function (bufferView) { + + return new Promise(function (resolve) { + + dracoLoader.decodeDracoFile(bufferView, function (geometry) { + + for (var attributeName in geometry.attributes) { + + var attribute = geometry.attributes[attributeName]; + var normalized = attributeNormalizedMap[attributeName]; + + if (normalized !== undefined) attribute.normalized = normalized; + + } + + resolve(geometry); + + }, threeAttributeMap, attributeTypeMap); + + }); + + }); + + }; + + /** + * Specular-Glossiness Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness + */ + function GLTFMaterialsPbrSpecularGlossinessExtension() { + + return { + + name: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS, + + specularGlossinessParams: [ + 'color', + 'map', + 'lightMap', + 'lightMapIntensity', + 'aoMap', + 'aoMapIntensity', + 'emissive', + 'emissiveIntensity', + 'emissiveMap', + 'bumpMap', + 'bumpScale', + 'normalMap', + 'displacementMap', + 'displacementScale', + 'displacementBias', + 'specularMap', + 'specular', + 'glossinessMap', + 'glossiness', + 'alphaMap', + 'envMap', + 'envMapIntensity', + 'refractionRatio', + ], + + getMaterialType: function () { + + return THREE.ShaderMaterial; + + }, + + extendParams: function (params, material, parser) { + + var pbrSpecularGlossiness = material.extensions[this.name]; + + var shader = THREE.ShaderLib['standard']; + + var uniforms = THREE.UniformsUtils.clone(shader.uniforms); + + var specularMapParsFragmentChunk = [ + '#ifdef USE_SPECULARMAP', + ' uniform sampler2D specularMap;', + '#endif' + ].join('\n'); + + var glossinessMapParsFragmentChunk = [ + '#ifdef USE_GLOSSINESSMAP', + ' uniform sampler2D glossinessMap;', + '#endif' + ].join('\n'); + + var specularMapFragmentChunk = [ + 'vec3 specularFactor = specular;', + '#ifdef USE_SPECULARMAP', + ' vec4 texelSpecular = texture2D( specularMap, vUv );', + ' texelSpecular = sRGBToLinear( texelSpecular );', + ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' specularFactor *= texelSpecular.rgb;', + '#endif' + ].join('\n'); + + var glossinessMapFragmentChunk = [ + 'float glossinessFactor = glossiness;', + '#ifdef USE_GLOSSINESSMAP', + ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', + ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' glossinessFactor *= texelGlossiness.a;', + '#endif' + ].join('\n'); + + var lightPhysicalFragmentChunk = [ + 'PhysicalMaterial material;', + 'material.diffuseColor = diffuseColor.rgb;', + 'material.specularRoughness = clamp( 1.0 - glossinessFactor, 0.04, 1.0 );', + 'material.specularColor = specularFactor.rgb;', + ].join('\n'); + + var fragmentShader = shader.fragmentShader + .replace('uniform float roughness;', 'uniform vec3 specular;') + .replace('uniform float metalness;', 'uniform float glossiness;') + .replace('#include <roughnessmap_pars_fragment>', specularMapParsFragmentChunk) + .replace('#include <metalnessmap_pars_fragment>', glossinessMapParsFragmentChunk) + .replace('#include <roughnessmap_fragment>', specularMapFragmentChunk) + .replace('#include <metalnessmap_fragment>', glossinessMapFragmentChunk) + .replace('#include <lights_physical_fragment>', lightPhysicalFragmentChunk); + + delete uniforms.roughness; + delete uniforms.metalness; + delete uniforms.roughnessMap; + delete uniforms.metalnessMap; + + uniforms.specular = { value: new THREE.Color().setHex(0x111111) }; + uniforms.glossiness = { value: 0.5 }; + uniforms.specularMap = { value: null }; + uniforms.glossinessMap = { value: null }; + + params.vertexShader = shader.vertexShader; + params.fragmentShader = fragmentShader; + params.uniforms = uniforms; + params.defines = { 'STANDARD': '' }; + + params.color = new THREE.Color(1.0, 1.0, 1.0); + params.opacity = 1.0; + + var pending = []; + + if (Array.isArray(pbrSpecularGlossiness.diffuseFactor)) { + + var array = pbrSpecularGlossiness.diffuseFactor; + + params.color.fromArray(array); + params.opacity = array[3]; + + } + + if (pbrSpecularGlossiness.diffuseTexture !== undefined) { + + pending.push(parser.assignTexture(params, 'map', pbrSpecularGlossiness.diffuseTexture.index)); + + } + + params.emissive = new THREE.Color(0.0, 0.0, 0.0); + params.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; + params.specular = new THREE.Color(1.0, 1.0, 1.0); + + if (Array.isArray(pbrSpecularGlossiness.specularFactor)) { + + params.specular.fromArray(pbrSpecularGlossiness.specularFactor); + + } + + if (pbrSpecularGlossiness.specularGlossinessTexture !== undefined) { + + var specGlossIndex = pbrSpecularGlossiness.specularGlossinessTexture.index; + pending.push(parser.assignTexture(params, 'glossinessMap', specGlossIndex)); + pending.push(parser.assignTexture(params, 'specularMap', specGlossIndex)); + + } + + return Promise.all(pending); + + }, + + createMaterial: function (params) { + + // setup material properties based on MeshStandardMaterial for Specular-Glossiness + + var material = new THREE.ShaderMaterial({ + defines: params.defines, + vertexShader: params.vertexShader, + fragmentShader: params.fragmentShader, + uniforms: params.uniforms, + fog: true, + lights: true, + opacity: params.opacity, + transparent: params.transparent + }); + + material.isGLTFSpecularGlossinessMaterial = true; + + material.color = params.color; + + material.map = params.map === undefined ? null : params.map; + + material.lightMap = null; + material.lightMapIntensity = 1.0; + + material.aoMap = params.aoMap === undefined ? null : params.aoMap; + material.aoMapIntensity = 1.0; + + material.emissive = params.emissive; + material.emissiveIntensity = 1.0; + material.emissiveMap = params.emissiveMap === undefined ? null : params.emissiveMap; + + material.bumpMap = params.bumpMap === undefined ? null : params.bumpMap; + material.bumpScale = 1; + + material.normalMap = params.normalMap === undefined ? null : params.normalMap; + if (params.normalScale) material.normalScale = params.normalScale; + + material.displacementMap = null; + material.displacementScale = 1; + material.displacementBias = 0; + + material.specularMap = params.specularMap === undefined ? null : params.specularMap; + material.specular = params.specular; + + material.glossinessMap = params.glossinessMap === undefined ? null : params.glossinessMap; + material.glossiness = params.glossiness; + + material.alphaMap = null; + + material.envMap = params.envMap === undefined ? null : params.envMap; + material.envMapIntensity = 1.0; + + material.refractionRatio = 0.98; + + material.extensions.derivatives = true; + + return material; + + }, + + /** + * Clones a GLTFSpecularGlossinessMaterial instance. The ShaderMaterial.copy() method can + * copy only properties it knows about or inherits, and misses many properties that would + * normally be defined by MeshStandardMaterial. + * + * This method allows GLTFSpecularGlossinessMaterials to be cloned in the process of + * loading a glTF model, but cloning later (e.g. by the user) would require these changes + * AND also updating `.onBeforeRender` on the parent mesh. + * + * @param {THREE.ShaderMaterial} source + * @return {THREE.ShaderMaterial} + */ + cloneMaterial: function (source) { + + var target = source.clone(); + + target.isGLTFSpecularGlossinessMaterial = true; + + var params = this.specularGlossinessParams; + + for (var i = 0, il = params.length; i < il; i++) { + + target[params[i]] = source[params[i]]; + + } + + return target; + + }, + + // Here's based on refreshUniformsCommon() and refreshUniformsStandard() in WebGLRenderer. + refreshUniforms: function (renderer, scene, camera, geometry, material, group) { + + if (material.isGLTFSpecularGlossinessMaterial !== true) { + + return; + + } + + var uniforms = material.uniforms; + var defines = material.defines; + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value.copy(material.color); + uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity); + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if (material.map) { + + uvScaleMap = material.map; + + } else if (material.specularMap) { + + uvScaleMap = material.specularMap; + + } else if (material.displacementMap) { + + uvScaleMap = material.displacementMap; + + } else if (material.normalMap) { + + uvScaleMap = material.normalMap; + + } else if (material.bumpMap) { + + uvScaleMap = material.bumpMap; + + } else if (material.glossinessMap) { + + uvScaleMap = material.glossinessMap; + + } else if (material.alphaMap) { + + uvScaleMap = material.alphaMap; + + } else if (material.emissiveMap) { + + uvScaleMap = material.emissiveMap; + + } + + if (uvScaleMap !== undefined) { + + // backwards compatibility + if (uvScaleMap.isWebGLRenderTarget) { + + uvScaleMap = uvScaleMap.texture; + + } + + var offset; + var repeat; + + if (uvScaleMap.matrix !== undefined) { + + // > r88. + + if (uvScaleMap.matrixAutoUpdate === true) { + + offset = uvScaleMap.offset; + repeat = uvScaleMap.repeat; + var rotation = uvScaleMap.rotation; + var center = uvScaleMap.center; + + uvScaleMap.matrix.setUvTransform(offset.x, offset.y, repeat.x, repeat.y, rotation, center.x, center.y); + + } + + uniforms.uvTransform.value.copy(uvScaleMap.matrix); + + } else { + + // <= r87. Remove when reasonable. + + offset = uvScaleMap.offset; + repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set(offset.x, offset.y, repeat.x, repeat.y); + + } + + } + + uniforms.envMap.value = material.envMap; + uniforms.envMapIntensity.value = material.envMapIntensity; + uniforms.flipEnvMap.value = (material.envMap && material.envMap.isCubeTexture) ? -1 : 1; + + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.specular.value.copy(material.specular); + uniforms.glossiness.value = material.glossiness; + + uniforms.glossinessMap.value = material.glossinessMap; + + uniforms.emissiveMap.value = material.emissiveMap; + uniforms.bumpMap.value = material.bumpMap; + uniforms.normalMap.value = material.normalMap; + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + if (uniforms.glossinessMap.value !== null && defines.USE_GLOSSINESSMAP === undefined) { + + defines.USE_GLOSSINESSMAP = ''; + // set USE_ROUGHNESSMAP to enable vUv + defines.USE_ROUGHNESSMAP = ''; + + } + + if (uniforms.glossinessMap.value === null && defines.USE_GLOSSINESSMAP !== undefined) { + + delete defines.USE_GLOSSINESSMAP; + delete defines.USE_ROUGHNESSMAP; + + } + + } + + }; + + } + + /*********************************/ + /********** INTERPOLATION ********/ + /*********************************/ + + // Spline Interpolation + // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation + function GLTFCubicSplineInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) { + + THREE.Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer); + + }; + + GLTFCubicSplineInterpolant.prototype = Object.create(THREE.Interpolant.prototype); + GLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant; + + GLTFCubicSplineInterpolant.prototype.interpolate_ = function (i1, t0, t, t1) { + + var result = this.resultBuffer; + var values = this.sampleValues; + var stride = this.valueSize; + + var stride2 = stride * 2; + var stride3 = stride * 3; + + var td = t1 - t0; + + var p = (t - t0) / td; + var pp = p * p; + var ppp = pp * p; + + var offset1 = i1 * stride3; + var offset0 = offset1 - stride3; + + var s0 = 2 * ppp - 3 * pp + 1; + var s1 = ppp - 2 * pp + p; + var s2 = -2 * ppp + 3 * pp; + var s3 = ppp - pp; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for (var i = 0; i !== stride; i++) { + + var p0 = values[offset0 + i + stride]; // splineVertex_k + var m0 = values[offset0 + i + stride2] * td; // outTangent_k * (t_k+1 - t_k) + var p1 = values[offset1 + i + stride]; // splineVertex_k+1 + var m1 = values[offset1 + i] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + + }; + + /*********************************/ + /********** INTERNALS ************/ + /*********************************/ + + /* CONSTANTS */ + + var WEBGL_CONSTANTS = { + FLOAT: 5126, + //FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + LINEAR: 9729, + REPEAT: 10497, + SAMPLER_2D: 35678, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + UNSIGNED_BYTE: 5121, + UNSIGNED_SHORT: 5123 + }; + + var WEBGL_TYPE = { + 5126: Number, + //35674: THREE.Matrix2, + 35675: THREE.Matrix3, + 35676: THREE.Matrix4, + 35664: THREE.Vector2, + 35665: THREE.Vector3, + 35666: THREE.Vector4, + 35678: THREE.Texture + }; + + var WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array + }; + + var WEBGL_FILTERS = { + 9728: THREE.NearestFilter, + 9729: THREE.LinearFilter, + 9984: THREE.NearestMipMapNearestFilter, + 9985: THREE.LinearMipMapNearestFilter, + 9986: THREE.NearestMipMapLinearFilter, + 9987: THREE.LinearMipMapLinearFilter + }; + + var WEBGL_WRAPPINGS = { + 33071: THREE.ClampToEdgeWrapping, + 33648: THREE.MirroredRepeatWrapping, + 10497: THREE.RepeatWrapping + }; + + var WEBGL_TEXTURE_FORMATS = { + 6406: THREE.AlphaFormat, + 6407: THREE.RGBFormat, + 6408: THREE.RGBAFormat, + 6409: THREE.LuminanceFormat, + 6410: THREE.LuminanceAlphaFormat + }; + + var WEBGL_TEXTURE_DATATYPES = { + 5121: THREE.UnsignedByteType, + 32819: THREE.UnsignedShort4444Type, + 32820: THREE.UnsignedShort5551Type, + 33635: THREE.UnsignedShort565Type + }; + + var WEBGL_SIDES = { + 1028: THREE.BackSide, // Culling front + 1029: THREE.FrontSide // Culling back + //1032: THREE.NoSide // Culling front and back, what to do? + }; + + var WEBGL_DEPTH_FUNCS = { + 512: THREE.NeverDepth, + 513: THREE.LessDepth, + 514: THREE.EqualDepth, + 515: THREE.LessEqualDepth, + 516: THREE.GreaterEqualDepth, + 517: THREE.NotEqualDepth, + 518: THREE.GreaterEqualDepth, + 519: THREE.AlwaysDepth + }; + + var WEBGL_BLEND_EQUATIONS = { + 32774: THREE.AddEquation, + 32778: THREE.SubtractEquation, + 32779: THREE.ReverseSubtractEquation + }; + + var WEBGL_BLEND_FUNCS = { + 0: THREE.ZeroFactor, + 1: THREE.OneFactor, + 768: THREE.SrcColorFactor, + 769: THREE.OneMinusSrcColorFactor, + 770: THREE.SrcAlphaFactor, + 771: THREE.OneMinusSrcAlphaFactor, + 772: THREE.DstAlphaFactor, + 773: THREE.OneMinusDstAlphaFactor, + 774: THREE.DstColorFactor, + 775: THREE.OneMinusDstColorFactor, + 776: THREE.SrcAlphaSaturateFactor + // The followings are not supported by Three.js yet + //32769: CONSTANT_COLOR, + //32770: ONE_MINUS_CONSTANT_COLOR, + //32771: CONSTANT_ALPHA, + //32772: ONE_MINUS_CONSTANT_COLOR + }; + + var WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 + }; + + var ATTRIBUTES = { + POSITION: 'position', + NORMAL: 'normal', + TEXCOORD_0: 'uv', + TEXCOORD0: 'uv', // deprecated + TEXCOORD: 'uv', // deprecated + TEXCOORD_1: 'uv2', + COLOR_0: 'color', + COLOR0: 'color', // deprecated + COLOR: 'color', // deprecated + WEIGHTS_0: 'skinWeight', + WEIGHT: 'skinWeight', // deprecated + JOINTS_0: 'skinIndex', + JOINT: 'skinIndex' // deprecated + } + + var PATH_PROPERTIES = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences' + }; + + var INTERPOLATION = { + CUBICSPLINE: THREE.InterpolateSmooth, // We use custom interpolation GLTFCubicSplineInterpolation for CUBICSPLINE. + // KeyframeTrack.optimize() can't handle glTF Cubic Spline output values layout, + // using THREE.InterpolateSmooth for KeyframeTrack instantiation to prevent optimization. + // See KeyframeTrack.optimize() for the detail. + LINEAR: THREE.InterpolateLinear, + STEP: THREE.InterpolateDiscrete + }; + + var STATES_ENABLES = { + 2884: 'CULL_FACE', + 2929: 'DEPTH_TEST', + 3042: 'BLEND', + 3089: 'SCISSOR_TEST', + 32823: 'POLYGON_OFFSET_FILL', + 32926: 'SAMPLE_ALPHA_TO_COVERAGE' + }; + + var ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND' + }; + + /* UTILITY FUNCTIONS */ + + function resolveURL(url, path) { + + // Invalid URL + if (typeof url !== 'string' || url === '') return ''; + + // Absolute URL http://,https://,// + if (/^(https?:)?\/\//i.test(url)) return url; + + // Data URI + if (/^data:.*,.*$/i.test(url)) return url; + + // Blob URL + if (/^blob:.*$/i.test(url)) return url; + + // Relative URL + return path + url; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + */ + function createDefaultMaterial() { + + return new THREE.MeshStandardMaterial({ + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: THREE.FrontSide + }); + + } + + function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) { + + // Add unknown glTF extensions to an object's userData. + + for (var name in objectDef.extensions) { + + if (knownExtensions[name] === undefined) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[name] = objectDef.extensions[name]; + + } + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {THREE.Geometry} geometry + * @param {Array<GLTF.Target>} targets + * @param {Array<THREE.BufferAttribute>} accessors + */ + function addMorphTargets(geometry, targets, accessors) { + + var hasMorphPosition = false; + var hasMorphNormal = false; + + for (var i = 0, il = targets.length; i < il; i++) { + + var target = targets[i]; + + if (target.POSITION !== undefined) hasMorphPosition = true; + if (target.NORMAL !== undefined) hasMorphNormal = true; + + if (hasMorphPosition && hasMorphNormal) break; + + } + + if (!hasMorphPosition && !hasMorphNormal) return; + + var morphPositions = []; + var morphNormals = []; + + for (var i = 0, il = targets.length; i < il; i++) { + + var target = targets[i]; + var attributeName = 'morphTarget' + i; + + if (hasMorphPosition) { + + // Three.js morph position is absolute value. The formula is + // basePosition + // + weight0 * ( morphPosition0 - basePosition ) + // + weight1 * ( morphPosition1 - basePosition ) + // ... + // while the glTF one is relative + // basePosition + // + weight0 * glTFmorphPosition0 + // + weight1 * glTFmorphPosition1 + // ... + // then we need to convert from relative to absolute here. + + if (target.POSITION !== undefined) { + + // Cloning not to pollute original accessor + var positionAttribute = cloneBufferAttribute(accessors[target.POSITION]); + positionAttribute.name = attributeName; + + var position = geometry.attributes.position; + + for (var j = 0, jl = positionAttribute.count; j < jl; j++) { + + positionAttribute.setXYZ( + j, + positionAttribute.getX(j) + position.getX(j), + positionAttribute.getY(j) + position.getY(j), + positionAttribute.getZ(j) + position.getZ(j) + ); + + } + + } else { + + positionAttribute = geometry.attributes.position; + + } + + morphPositions.push(positionAttribute); + + } + + if (hasMorphNormal) { + + // see target.POSITION's comment + + var normalAttribute; + + if (target.NORMAL !== undefined) { + + var normalAttribute = cloneBufferAttribute(accessors[target.NORMAL]); + normalAttribute.name = attributeName; + + var normal = geometry.attributes.normal; + + for (var j = 0, jl = normalAttribute.count; j < jl; j++) { + + normalAttribute.setXYZ( + j, + normalAttribute.getX(j) + normal.getX(j), + normalAttribute.getY(j) + normal.getY(j), + normalAttribute.getZ(j) + normal.getZ(j) + ); + + } + + } else { + + normalAttribute = geometry.attributes.normal; + + } + + morphNormals.push(normalAttribute); + + } + + } + + if (hasMorphPosition) geometry.morphAttributes.position = morphPositions; + if (hasMorphNormal) geometry.morphAttributes.normal = morphNormals; + + } + + /** + * @param {THREE.Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ + function updateMorphTargets(mesh, meshDef) { + + mesh.updateMorphTargets(); + + if (meshDef.weights !== undefined) { + + for (var i = 0, il = meshDef.weights.length; i < il; i++) { + + mesh.morphTargetInfluences[i] = meshDef.weights[i]; + + } + + } + + // .extras has user-defined data, so check that .extras.targetNames is an array. + if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) { + + var targetNames = meshDef.extras.targetNames; + + if (mesh.morphTargetInfluences.length === targetNames.length) { + + mesh.morphTargetDictionary = {}; + + for (var i = 0, il = targetNames.length; i < il; i++) { + + mesh.morphTargetDictionary[targetNames[i]] = i; + + } + + } else { + + console.warn('THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.'); + + } + + } + + } + + function isPrimitiveEqual(a, b) { + + if (a.indices !== b.indices) { + + return false; + + } + + return isObjectEqual(a.attributes, b.attributes); + + } + + function isObjectEqual(a, b) { + + if (Object.keys(a).length !== Object.keys(b).length) return false; + + for (var key in a) { + + if (a[key] !== b[key]) return false; + + } + + return true; + + } + + function isArrayEqual(a, b) { + + if (a.length !== b.length) return false; + + for (var i = 0, il = a.length; i < il; i++) { + + if (a[i] !== b[i]) return false; + + } + + return true; + + } + + function getCachedGeometry(cache, newPrimitive) { + + for (var i = 0, il = cache.length; i < il; i++) { + + var cached = cache[i]; + + if (isPrimitiveEqual(cached.primitive, newPrimitive)) return cached.promise; + + } + + return null; + + } + + function getCachedCombinedGeometry(cache, geometries) { + + for (var i = 0, il = cache.length; i < il; i++) { + + var cached = cache[i]; + + if (isArrayEqual(geometries, cached.baseGeometries)) return cached.geometry; + + } + + return null; + + } + + function getCachedMultiPassGeometry(cache, geometry, primitives) { + + for (var i = 0, il = cache.length; i < il; i++) { + + var cached = cache[i]; + + if (geometry === cached.baseGeometry && isArrayEqual(primitives, cached.primitives)) return cached.geometry; + + } + + return null; + + } + + function cloneBufferAttribute(attribute) { + + if (attribute.isInterleavedBufferAttribute) { + + var count = attribute.count; + var itemSize = attribute.itemSize; + var array = attribute.array.slice(0, count * itemSize); + + for (var i = 0; i < count; ++i) { + + array[i] = attribute.getX(i); + if (itemSize >= 2) array[i + 1] = attribute.getY(i); + if (itemSize >= 3) array[i + 2] = attribute.getZ(i); + if (itemSize >= 4) array[i + 3] = attribute.getW(i); + + } + + return new THREE.BufferAttribute(array, itemSize, attribute.normalized); + + } + + return attribute.clone(); + + } + + /** + * Checks if we can build a single Mesh with MultiMaterial from multiple primitives. + * Returns true if all primitives use the same attributes/morphAttributes/mode + * and also have index. Otherwise returns false. + * + * @param {Array<GLTF.Primitive>} primitives + * @return {Boolean} + */ + function isMultiPassGeometry(primitives) { + + if (primitives.length < 2) return false; + + var primitive0 = primitives[0]; + var targets0 = primitive0.targets || []; + + if (primitive0.indices === undefined) return false; + + for (var i = 1, il = primitives.length; i < il; i++) { + + var primitive = primitives[i]; + + if (primitive0.mode !== primitive.mode) return false; + if (primitive.indices === undefined) return false; + if (!isObjectEqual(primitive0.attributes, primitive.attributes)) return false; + + var targets = primitive.targets || []; + + if (targets0.length !== targets.length) return false; + + for (var j = 0, jl = targets0.length; j < jl; j++) { + + if (!isObjectEqual(targets0[j], targets[j])) return false; + + } + + } + + return true; + + } + + /* GLTF PARSER */ + + function GLTFParser(json, extensions, options) { + + this.json = json || {}; + this.extensions = extensions || {}; + this.options = options || {}; + + // loader object cache + this.cache = new GLTFRegistry(); + + // BufferGeometry caching + this.primitiveCache = []; + this.multiplePrimitivesCache = []; + this.multiPassGeometryCache = [] + + this.textureLoader = new THREE.TextureLoader(this.options.manager); + this.textureLoader.setCrossOrigin(this.options.crossOrigin); + + this.fileLoader = new THREE.FileLoader(this.options.manager); + this.fileLoader.setResponseType('arraybuffer'); + + } + + GLTFParser.prototype.parse = function (onLoad, onError) { + + var json = this.json; + + // Clear the loader cache + this.cache.removeAll(); + + // Mark the special nodes/meshes in json for efficient parse + this.markDefs(); + + // Fire the callback on complete + this.getMultiDependencies([ + + 'scene', + 'animation', + 'camera' + + ]).then(function (dependencies) { + + var scenes = dependencies.scenes || []; + var scene = scenes[json.scene || 0]; + var animations = dependencies.animations || []; + var cameras = dependencies.cameras || []; + + onLoad(scene, scenes, cameras, animations, json); + + }).catch(onError); + + }; + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + GLTFParser.prototype.markDefs = function () { + + var nodeDefs = this.json.nodes || []; + var skinDefs = this.json.skins || []; + var meshDefs = this.json.meshes || []; + + var meshReferences = {}; + var meshUses = {}; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for (var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) { + + var joints = skinDefs[skinIndex].joints; + + for (var i = 0, il = joints.length; i < il; i++) { + + nodeDefs[joints[i]].isBone = true; + + } + + } + + // Meshes can (and should) be reused by multiple nodes in a glTF asset. To + // avoid having more than one THREE.Mesh with the same name, count + // references and rename instances below. + // + // Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + for (var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { + + var nodeDef = nodeDefs[nodeIndex]; + + if (nodeDef.mesh !== undefined) { + + if (meshReferences[nodeDef.mesh] === undefined) { + + meshReferences[nodeDef.mesh] = meshUses[nodeDef.mesh] = 0; + + } + + meshReferences[nodeDef.mesh]++; + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if (nodeDef.skin !== undefined) { + + meshDefs[nodeDef.mesh].isSkinnedMesh = true; + + } + + } + + } + + this.json.meshReferences = meshReferences; + this.json.meshUses = meshUses; + + }; + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise<Object>} + */ + GLTFParser.prototype.getDependency = function (type, index) { + + var cacheKey = type + ':' + index; + var dependency = this.cache.get(cacheKey); + + if (!dependency) { + + switch (type) { + + case 'scene': + dependency = this.loadScene(index); + break; + + case 'node': + dependency = this.loadNode(index); + break; + + case 'mesh': + dependency = this.loadMesh(index); + break; + + case 'accessor': + dependency = this.loadAccessor(index); + break; + + case 'bufferView': + dependency = this.loadBufferView(index); + break; + + case 'buffer': + dependency = this.loadBuffer(index); + break; + + case 'material': + dependency = this.loadMaterial(index); + break; + + case 'texture': + dependency = this.loadTexture(index); + break; + + case 'skin': + dependency = this.loadSkin(index); + break; + + case 'animation': + dependency = this.loadAnimation(index); + break; + + case 'camera': + dependency = this.loadCamera(index); + break; + + default: + throw new Error('Unknown type: ' + type); + + } + + this.cache.add(cacheKey, dependency); + + } + + return dependency; + + }; + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise<Array<Object>>} + */ + GLTFParser.prototype.getDependencies = function (type) { + + var dependencies = this.cache.get(type); + + if (!dependencies) { + + var parser = this; + var defs = this.json[type + (type === 'mesh' ? 'es' : 's')] || []; + + dependencies = Promise.all(defs.map(function (def, index) { + + return parser.getDependency(type, index); + + })); + + this.cache.add(type, dependencies); + + } + + return dependencies; + + }; + + /** + * Requests all multiple dependencies of the specified types asynchronously, with caching. + * @param {Array<string>} types + * @return {Promise<Object<Array<Object>>>} + */ + GLTFParser.prototype.getMultiDependencies = function (types) { + + var results = {}; + var pendings = []; + + for (var i = 0, il = types.length; i < il; i++) { + + var type = types[i]; + var value = this.getDependencies(type); + + value = value.then(function (key, value) { + + results[key] = value; + + }.bind(this, type + (type === 'mesh' ? 'es' : 's'))); + + pendings.push(value); + + } + + return Promise.all(pendings).then(function () { + + return results; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise<ArrayBuffer>} + */ + GLTFParser.prototype.loadBuffer = function (bufferIndex) { + + var bufferDef = this.json.buffers[bufferIndex]; + var loader = this.fileLoader; + + if (bufferDef.type && bufferDef.type !== 'arraybuffer') { + + throw new Error('THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.'); + + } + + // If present, GLB container is required to be the first buffer. + if (bufferDef.uri === undefined && bufferIndex === 0) { + + return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body); + + } + + var options = this.options; + + return new Promise(function (resolve, reject) { + + loader.load(resolveURL(bufferDef.uri, options.path), resolve, undefined, function () { + + reject(new Error('THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".')); + + }); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise<ArrayBuffer>} + */ + GLTFParser.prototype.loadBufferView = function (bufferViewIndex) { + + var bufferViewDef = this.json.bufferViews[bufferViewIndex]; + + return this.getDependency('buffer', bufferViewDef.buffer).then(function (buffer) { + + var byteLength = bufferViewDef.byteLength || 0; + var byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice(byteOffset, byteOffset + byteLength); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise<THREE.BufferAttribute|THREE.InterleavedBufferAttribute>} + */ + GLTFParser.prototype.loadAccessor = function (accessorIndex) { + + var parser = this; + var json = this.json; + + var accessorDef = this.json.accessors[accessorIndex]; + + if (accessorDef.bufferView === undefined && accessorDef.sparse === undefined) { + + // Ignore empty accessors, which may be used to declare runtime + // information about attributes coming from another source (e.g. Draco + // compression extension). + return null; + + } + + var pendingBufferViews = []; + + if (accessorDef.bufferView !== undefined) { + + pendingBufferViews.push(this.getDependency('bufferView', accessorDef.bufferView)); + + } else { + + pendingBufferViews.push(null); + + } + + if (accessorDef.sparse !== undefined) { + + pendingBufferViews.push(this.getDependency('bufferView', accessorDef.sparse.indices.bufferView)); + pendingBufferViews.push(this.getDependency('bufferView', accessorDef.sparse.values.bufferView)); + + } + + return Promise.all(pendingBufferViews).then(function (bufferViews) { + + var bufferView = bufferViews[0]; + + var itemSize = WEBGL_TYPE_SIZES[accessorDef.type]; + var TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; + + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + var elementBytes = TypedArray.BYTES_PER_ELEMENT; + var itemBytes = elementBytes * itemSize; + var byteOffset = accessorDef.byteOffset || 0; + var byteStride = json.bufferViews[accessorDef.bufferView].byteStride; + var normalized = accessorDef.normalized === true; + var array, bufferAttribute; + + // The buffer is not interleaved if the stride is the item size in bytes. + if (byteStride && byteStride !== itemBytes) { + + var ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType; + var ib = parser.cache.get(ibCacheKey); + + if (!ib) { + + // Use the full buffer if it's interleaved. + array = new TypedArray(bufferView); + + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new THREE.InterleavedBuffer(array, byteStride / elementBytes); + + parser.cache.add(ibCacheKey, ib); + + } + + bufferAttribute = new THREE.InterleavedBufferAttribute(ib, itemSize, byteOffset / elementBytes, normalized); + + } else { + + if (bufferView === null) { + + array = new TypedArray(accessorDef.count * itemSize); + + } else { + + array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize); + + } + + bufferAttribute = new THREE.BufferAttribute(array, itemSize, normalized); + + } + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if (accessorDef.sparse !== undefined) { + + var itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + var TypedArrayIndices = WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType]; + + var byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + var byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + + var sparseIndices = new TypedArrayIndices(bufferViews[1], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices); + var sparseValues = new TypedArray(bufferViews[2], byteOffsetValues, accessorDef.sparse.count * itemSize); + + if (bufferView !== null) { + + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute.setArray(bufferAttribute.array.slice()); + + } + + for (var i = 0, il = sparseIndices.length; i < il; i++) { + + var index = sparseIndices[i]; + + bufferAttribute.setX(index, sparseValues[i * itemSize]); + if (itemSize >= 2) bufferAttribute.setY(index, sparseValues[i * itemSize + 1]); + if (itemSize >= 3) bufferAttribute.setZ(index, sparseValues[i * itemSize + 2]); + if (itemSize >= 4) bufferAttribute.setW(index, sparseValues[i * itemSize + 3]); + if (itemSize >= 5) throw new Error('THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.'); + + } + + } + + return bufferAttribute; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise<THREE.Texture>} + */ + GLTFParser.prototype.loadTexture = function (textureIndex) { + + var parser = this; + var json = this.json; + var options = this.options; + var textureLoader = this.textureLoader; + + var URL = window.URL || window.webkitURL; + + var textureDef = json.textures[textureIndex]; + + var textureExtensions = textureDef.extensions || {}; + + var source; + + if (textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]) { + + source = json.images[textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS].source]; + + } else { + + source = json.images[textureDef.source]; + + } + + var sourceURI = source.uri; + var isObjectURL = false; + + if (source.bufferView !== undefined) { + + // Load binary image data from bufferView, if provided. + + sourceURI = parser.getDependency('bufferView', source.bufferView).then(function (bufferView) { + + isObjectURL = true; + var blob = new Blob([bufferView], { type: source.mimeType }); + sourceURI = URL.createObjectURL(blob); + return sourceURI; + + }); + + } + + return Promise.resolve(sourceURI).then(function (sourceURI) { + + // Load Texture resource. + + var loader = THREE.Loader.Handlers.get(sourceURI); + + if (!loader) { + + loader = textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS] + ? parser.extensions[EXTENSIONS.MSFT_TEXTURE_DDS].ddsLoader + : textureLoader; + + } + + return new Promise(function (resolve, reject) { + + loader.load(resolveURL(sourceURI, options.path), resolve, undefined, reject); + + }); + + }).then(function (texture) { + + // Clean up resources and configure Texture. + + if (isObjectURL === true) { + + URL.revokeObjectURL(sourceURI); + + } + + texture.flipY = false; + + if (textureDef.name !== undefined) texture.name = textureDef.name; + + // .format of dds texture is set in DDSLoader + if (!textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]) { + + texture.format = textureDef.format !== undefined ? WEBGL_TEXTURE_FORMATS[textureDef.format] : THREE.RGBAFormat; + + } + + if (textureDef.internalFormat !== undefined && texture.format !== WEBGL_TEXTURE_FORMATS[textureDef.internalFormat]) { + + console.warn('THREE.GLTFLoader: Three.js does not support texture internalFormat which is different from texture format. ' + + 'internalFormat will be forced to be the same value as format.'); + + } + + texture.type = textureDef.type !== undefined ? WEBGL_TEXTURE_DATATYPES[textureDef.type] : THREE.UnsignedByteType; + + var samplers = json.samplers || {}; + var sampler = samplers[textureDef.sampler] || {}; + + texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || THREE.LinearFilter; + texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || THREE.LinearMipMapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || THREE.RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || THREE.RepeatWrapping; + + return texture; + + }); + + }; + + /** + * Asynchronously assigns a texture to the given material parameters. + * @param {Object} materialParams + * @param {string} textureName + * @param {number} textureIndex + * @return {Promise} + */ + GLTFParser.prototype.assignTexture = function (materialParams, textureName, textureIndex) { + + return this.getDependency('texture', textureIndex).then(function (texture) { + + materialParams[textureName] = texture; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise<THREE.Material>} + */ + GLTFParser.prototype.loadMaterial = function (materialIndex) { + + var parser = this; + var json = this.json; + var extensions = this.extensions; + var materialDef = this.json.materials[materialIndex]; + + var materialType; + var materialParams = {}; + var materialExtensions = materialDef.extensions || {}; + + var pending = []; + + if (materialExtensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]) { + + var sgExtension = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]; + materialType = sgExtension.getMaterialType(materialDef); + pending.push(sgExtension.extendParams(materialParams, materialDef, parser)); + + } else if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) { + + var kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT]; + materialType = kmuExtension.getMaterialType(materialDef); + pending.push(kmuExtension.extendParams(materialParams, materialDef, parser)); + + } else { + + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material + + materialType = THREE.MeshStandardMaterial; + + var metallicRoughness = materialDef.pbrMetallicRoughness || {}; + + materialParams.color = new THREE.Color(1.0, 1.0, 1.0); + materialParams.opacity = 1.0; + + if (Array.isArray(metallicRoughness.baseColorFactor)) { + + var array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray(array); + materialParams.opacity = array[3]; + + } + + if (metallicRoughness.baseColorTexture !== undefined) { + + pending.push(parser.assignTexture(materialParams, 'map', metallicRoughness.baseColorTexture.index)); + + } + + materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; + + if (metallicRoughness.metallicRoughnessTexture !== undefined) { + + var textureIndex = metallicRoughness.metallicRoughnessTexture.index; + pending.push(parser.assignTexture(materialParams, 'metalnessMap', textureIndex)); + pending.push(parser.assignTexture(materialParams, 'roughnessMap', textureIndex)); + + } + + } + + if (materialDef.doubleSided === true) { + + materialParams.side = THREE.DoubleSide; + + } + + var alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if (alphaMode === ALPHA_MODES.BLEND) { + + materialParams.transparent = true; + + } else { + + materialParams.transparent = false; + + if (alphaMode === ALPHA_MODES.MASK) { + + materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; + + } + + } + + if (materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial) { + + pending.push(parser.assignTexture(materialParams, 'normalMap', materialDef.normalTexture.index)); + + materialParams.normalScale = new THREE.Vector2(1, 1); + + if (materialDef.normalTexture.scale !== undefined) { + + materialParams.normalScale.set(materialDef.normalTexture.scale, materialDef.normalTexture.scale); + + } + + } + + if (materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial) { + + pending.push(parser.assignTexture(materialParams, 'aoMap', materialDef.occlusionTexture.index)); + + if (materialDef.occlusionTexture.strength !== undefined) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + + } + + } + + if (materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial) { + + materialParams.emissive = new THREE.Color().fromArray(materialDef.emissiveFactor); + + } + + if (materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial) { + + pending.push(parser.assignTexture(materialParams, 'emissiveMap', materialDef.emissiveTexture.index)); + + } + + return Promise.all(pending).then(function () { + + var material; + + if (materialType === THREE.ShaderMaterial) { + + material = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(materialParams); + + } else { + + material = new materialType(materialParams); + + } + + if (materialDef.name !== undefined) material.name = materialDef.name; + + // Normal map textures use OpenGL conventions: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#materialnormaltexture + if (material.normalScale) { + + material.normalScale.y = -material.normalScale.y; + + } + + // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. + if (material.map) material.map.encoding = THREE.sRGBEncoding; + if (material.emissiveMap) material.emissiveMap.encoding = THREE.sRGBEncoding; + if (material.specularMap) material.specularMap.encoding = THREE.sRGBEncoding; + + if (materialDef.extras) material.userData = materialDef.extras; + + if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef); + + return material; + + }); + + }; + + /** + * @param {THREE.BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {Array<THREE.BufferAttribute>} accessors + */ + function addPrimitiveAttributes(geometry, primitiveDef, accessors) { + + var attributes = primitiveDef.attributes; + + for (var gltfAttributeName in attributes) { + + var threeAttributeName = ATTRIBUTES[gltfAttributeName]; + var bufferAttribute = accessors[attributes[gltfAttributeName]]; + + // Skip attributes already provided by e.g. Draco extension. + if (!threeAttributeName) continue; + if (threeAttributeName in geometry.attributes) continue; + + geometry.addAttribute(threeAttributeName, bufferAttribute); + + } + + if (primitiveDef.indices !== undefined && !geometry.index) { + + geometry.setIndex(accessors[primitiveDef.indices]); + + } + + if (primitiveDef.targets !== undefined) { + + addMorphTargets(geometry, primitiveDef.targets, accessors); + + } + + if (primitiveDef.extras !== undefined) { + + geometry.userData = primitiveDef.extras; + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * If we can build a single BufferGeometry with .groups from multiple primitives, returns one BufferGeometry. + * Otherwise, returns BufferGeometries without .groups as many as primitives. + * + * @param {Array<Object>} primitives + * @return {Promise<Array<THREE.BufferGeometry>>} + */ + GLTFParser.prototype.loadGeometries = function (primitives) { + + var parser = this; + var extensions = this.extensions; + var cache = this.primitiveCache; + + var isMultiPass = isMultiPassGeometry(primitives); + var originalPrimitives; + + if (isMultiPass) { + + originalPrimitives = primitives; // save original primitives and use later + + // We build a single BufferGeometry with .groups from multiple primitives + // because all primitives share the same attributes/morph/mode and have indices. + + primitives = [primitives[0]]; + + // Sets .groups and combined indices to a geometry later in this method. + + } + + return this.getDependencies('accessor').then(function (accessors) { + + var pending = []; + + for (var i = 0, il = primitives.length; i < il; i++) { + + var primitive = primitives[i]; + + // See if we've already created this geometry + var cached = getCachedGeometry(cache, primitive); + + if (cached) { + + // Use the cached geometry if it exists + pending.push(cached); + + } else if (primitive.extensions && primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) { + + // Use DRACO geometry if available + var geometryPromise = extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION] + .decodePrimitive(primitive, parser) + .then(function (geometry) { + + addPrimitiveAttributes(geometry, primitive, accessors); + + return geometry; + + }); + + cache.push({ primitive: primitive, promise: geometryPromise }); + + pending.push(geometryPromise); + + } else { + + // Otherwise create a new geometry + var geometry = new THREE.BufferGeometry(); + + addPrimitiveAttributes(geometry, primitive, accessors); + + var geometryPromise = Promise.resolve(geometry); + + // Cache this geometry + cache.push({ primitive: primitive, promise: geometryPromise }); + + pending.push(geometryPromise); + + } + + } + + return Promise.all(pending).then(function (geometries) { + + if (isMultiPass) { + + var baseGeometry = geometries[0]; + + // See if we've already created this combined geometry + var cache = parser.multiPassGeometryCache; + var cached = getCachedMultiPassGeometry(cache, baseGeometry, originalPrimitives); + + if (cached !== null) return [cached.geometry]; + + // Cloning geometry because of index override. + // Attributes can be reused so cloning by myself here. + var geometry = new THREE.BufferGeometry(); + + geometry.name = baseGeometry.name; + geometry.userData = baseGeometry.userData; + + for (var key in baseGeometry.attributes) geometry.addAttribute(key, baseGeometry.attributes[key]); + for (var key in baseGeometry.morphAttributes) geometry.morphAttributes[key] = baseGeometry.morphAttributes[key]; + + var indices = []; + var offset = 0; + + for (var i = 0, il = originalPrimitives.length; i < il; i++) { + + var accessor = accessors[originalPrimitives[i].indices]; + + for (var j = 0, jl = accessor.count; j < jl; j++) indices.push(accessor.array[j]); + + geometry.addGroup(offset, accessor.count, i); + + offset += accessor.count; + + } + + geometry.setIndex(indices); + + cache.push({ geometry: geometry, baseGeometry: baseGeometry, primitives: originalPrimitives }); + + return [geometry]; + + } else if (geometries.length > 1 && THREE.BufferGeometryUtils !== undefined) { + + // Tries to merge geometries with BufferGeometryUtils if possible + + for (var i = 1, il = primitives.length; i < il; i++) { + + // can't merge if draw mode is different + if (primitives[0].mode !== primitives[i].mode) return geometries; + + } + + // See if we've already created this combined geometry + var cache = parser.multiplePrimitivesCache; + var cached = getCachedCombinedGeometry(cache, geometries); + + if (cached) { + + if (cached.geometry !== null) return [cached.geometry]; + + } else { + + var geometry = THREE.BufferGeometryUtils.mergeBufferGeometries(geometries, true); + + cache.push({ geometry: geometry, baseGeometries: geometries }); + + if (geometry !== null) return [geometry]; + + } + + } + + return geometries; + + }); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise<THREE.Group|THREE.Mesh|THREE.SkinnedMesh>} + */ + GLTFParser.prototype.loadMesh = function (meshIndex) { + + var scope = this; + var json = this.json; + var extensions = this.extensions; + + var meshDef = this.json.meshes[meshIndex]; + + return this.getMultiDependencies([ + + 'accessor', + 'material' + + ]).then(function (dependencies) { + + var primitives = meshDef.primitives; + var originalMaterials = []; + + for (var i = 0, il = primitives.length; i < il; i++) { + + originalMaterials[i] = primitives[i].material === undefined + ? createDefaultMaterial() + : dependencies.materials[primitives[i].material]; + + } + + return scope.loadGeometries(primitives).then(function (geometries) { + + var isMultiMaterial = geometries.length === 1 && geometries[0].groups.length > 0; + + var meshes = []; + + for (var i = 0, il = geometries.length; i < il; i++) { + + var geometry = geometries[i]; + var primitive = primitives[i]; + + // 1. create Mesh + + var mesh; + + var material = isMultiMaterial ? originalMaterials : originalMaterials[i] + + if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || + primitive.mode === undefined) { + + // .isSkinnedMesh isn't in glTF spec. See .markDefs() + mesh = meshDef.isSkinnedMesh === true + ? new THREE.SkinnedMesh(geometry, material) + : new THREE.Mesh(geometry, material); + + if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) { + + mesh.drawMode = THREE.TriangleStripDrawMode; + + } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) { + + mesh.drawMode = THREE.TriangleFanDrawMode; + + } + + } else if (primitive.mode === WEBGL_CONSTANTS.LINES) { + + mesh = new THREE.LineSegments(geometry, material); + + } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) { + + mesh = new THREE.Line(geometry, material); + + } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) { + + mesh = new THREE.LineLoop(geometry, material); + + } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) { + + mesh = new THREE.Points(geometry, material); + + } else { + + throw new Error('THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode); + + } + + if (Object.keys(mesh.geometry.morphAttributes).length > 0) { + + updateMorphTargets(mesh, meshDef); + + } + + mesh.name = meshDef.name || ('mesh_' + meshIndex); + + if (geometries.length > 1) mesh.name += '_' + i; + + if (meshDef.extras !== undefined) mesh.userData = meshDef.extras; + + meshes.push(mesh); + + // 2. update Material depending on Mesh and BufferGeometry + + var materials = isMultiMaterial ? mesh.material : [mesh.material]; + + var useVertexColors = geometry.attributes.color !== undefined; + var useFlatShading = geometry.attributes.normal === undefined; + var useSkinning = mesh.isSkinnedMesh === true; + var useMorphTargets = Object.keys(geometry.morphAttributes).length > 0; + var useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined; + + for (var j = 0, jl = materials.length; j < jl; j++) { + + var material = materials[j]; + + if (mesh.isPoints) { + + var cacheKey = 'PointsMaterial:' + material.uuid; + + var pointsMaterial = scope.cache.get(cacheKey); + + if (!pointsMaterial) { + + pointsMaterial = new THREE.PointsMaterial(); + THREE.Material.prototype.copy.call(pointsMaterial, material); + pointsMaterial.color.copy(material.color); + pointsMaterial.map = material.map; + pointsMaterial.lights = false; // PointsMaterial doesn't support lights yet + + scope.cache.add(cacheKey, pointsMaterial); + + } + + material = pointsMaterial; + + } else if (mesh.isLine) { + + var cacheKey = 'LineBasicMaterial:' + material.uuid; + + var lineMaterial = scope.cache.get(cacheKey); + + if (!lineMaterial) { + + lineMaterial = new THREE.LineBasicMaterial(); + THREE.Material.prototype.copy.call(lineMaterial, material); + lineMaterial.color.copy(material.color); + lineMaterial.lights = false; // LineBasicMaterial doesn't support lights yet + + scope.cache.add(cacheKey, lineMaterial); + + } + + material = lineMaterial; + + } + + // Clone the material if it will be modified + if (useVertexColors || useFlatShading || useSkinning || useMorphTargets) { + + var cacheKey = 'ClonedMaterial:' + material.uuid + ':'; + + if (material.isGLTFSpecularGlossinessMaterial) cacheKey += 'specular-glossiness:'; + if (useSkinning) cacheKey += 'skinning:'; + if (useVertexColors) cacheKey += 'vertex-colors:'; + if (useFlatShading) cacheKey += 'flat-shading:'; + if (useMorphTargets) cacheKey += 'morph-targets:'; + if (useMorphNormals) cacheKey += 'morph-normals:'; + + var cachedMaterial = scope.cache.get(cacheKey); + + if (!cachedMaterial) { + + cachedMaterial = material.isGLTFSpecularGlossinessMaterial + ? extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].cloneMaterial(material) + : material.clone(); + + if (useSkinning) cachedMaterial.skinning = true; + if (useVertexColors) cachedMaterial.vertexColors = THREE.VertexColors; + if (useFlatShading) cachedMaterial.flatShading = true; + if (useMorphTargets) cachedMaterial.morphTargets = true; + if (useMorphNormals) cachedMaterial.morphNormals = true; + + scope.cache.add(cacheKey, cachedMaterial); + + } + + material = cachedMaterial; + + } + + materials[j] = material; + + // workarounds for mesh and geometry + + if (material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined) { + + console.log('THREE.GLTFLoader: Duplicating UVs to support aoMap.'); + geometry.addAttribute('uv2', new THREE.BufferAttribute(geometry.attributes.uv.array, 2)); + + } + + if (material.isGLTFSpecularGlossinessMaterial) { + + // for GLTFSpecularGlossinessMaterial(ShaderMaterial) uniforms runtime update + mesh.onBeforeRender = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].refreshUniforms; + + } + + } + + mesh.material = isMultiMaterial ? materials : materials[0]; + + } + + if (meshes.length === 1) { + + return meshes[0]; + + } + + var group = new THREE.Group(); + + for (var i = 0, il = meshes.length; i < il; i++) { + + group.add(meshes[i]); + + } + + return group; + + }); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise<THREE.Camera>} + */ + GLTFParser.prototype.loadCamera = function (cameraIndex) { + + var camera; + var cameraDef = this.json.cameras[cameraIndex]; + var params = cameraDef[cameraDef.type]; + + if (!params) { + + console.warn('THREE.GLTFLoader: Missing camera parameters.'); + return; + + } + + if (cameraDef.type === 'perspective') { + + camera = new THREE.PerspectiveCamera(THREE.Math.radToDeg(params.yfov), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6); + + } else if (cameraDef.type === 'orthographic') { + + camera = new THREE.OrthographicCamera(params.xmag / -2, params.xmag / 2, params.ymag / 2, params.ymag / -2, params.znear, params.zfar); + + } + + if (cameraDef.name !== undefined) camera.name = cameraDef.name; + if (cameraDef.extras) camera.userData = cameraDef.extras; + + return Promise.resolve(camera); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise<Object>} + */ + GLTFParser.prototype.loadSkin = function (skinIndex) { + + var skinDef = this.json.skins[skinIndex]; + + var skinEntry = { joints: skinDef.joints }; + + if (skinDef.inverseBindMatrices === undefined) { + + return Promise.resolve(skinEntry); + + } + + return this.getDependency('accessor', skinDef.inverseBindMatrices).then(function (accessor) { + + skinEntry.inverseBindMatrices = accessor; + + return skinEntry; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise<THREE.AnimationClip>} + */ + GLTFParser.prototype.loadAnimation = function (animationIndex) { + + var json = this.json; + + var animationDef = this.json.animations[animationIndex]; + + return this.getMultiDependencies([ + + 'accessor', + 'node' + + ]).then(function (dependencies) { + + var tracks = []; + + for (var i = 0, il = animationDef.channels.length; i < il; i++) { + + var channel = animationDef.channels[i]; + var sampler = animationDef.samplers[channel.sampler]; + + if (sampler) { + + var target = channel.target; + var name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. + var input = animationDef.parameters !== undefined ? animationDef.parameters[sampler.input] : sampler.input; + var output = animationDef.parameters !== undefined ? animationDef.parameters[sampler.output] : sampler.output; + + var inputAccessor = dependencies.accessors[input]; + var outputAccessor = dependencies.accessors[output]; + + var node = dependencies.nodes[name]; + + if (node) { + + node.updateMatrix(); + node.matrixAutoUpdate = true; + + var TypedKeyframeTrack; + + switch (PATH_PROPERTIES[target.path]) { + + case PATH_PROPERTIES.weights: + + TypedKeyframeTrack = THREE.NumberKeyframeTrack; + break; + + case PATH_PROPERTIES.rotation: + + TypedKeyframeTrack = THREE.QuaternionKeyframeTrack; + break; + + case PATH_PROPERTIES.position: + case PATH_PROPERTIES.scale: + default: + + TypedKeyframeTrack = THREE.VectorKeyframeTrack; + break; + + } + + var targetName = node.name ? node.name : node.uuid; + + var interpolation = sampler.interpolation !== undefined ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear; + + var targetNames = []; + + if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) { + + // node can be THREE.Group here but + // PATH_PROPERTIES.weights(morphTargetInfluences) should be + // the property of a mesh object under group. + + node.traverse(function (object) { + + if (object.isMesh === true && object.morphTargetInfluences) { + + targetNames.push(object.name ? object.name : object.uuid); + + } + + }); + + } else { + + targetNames.push(targetName); + + } + + // KeyframeTrack.optimize() will modify given 'times' and 'values' + // buffers before creating a truncated copy to keep. Because buffers may + // be reused by other tracks, make copies here. + for (var j = 0, jl = targetNames.length; j < jl; j++) { + + var track = new TypedKeyframeTrack( + targetNames[j] + '.' + PATH_PROPERTIES[target.path], + THREE.AnimationUtils.arraySlice(inputAccessor.array, 0), + THREE.AnimationUtils.arraySlice(outputAccessor.array, 0), + interpolation + ); + + // Here is the trick to enable custom interpolation. + // Overrides .createInterpolant in a factory method which creates custom interpolation. + if (sampler.interpolation === 'CUBICSPLINE') { + + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) { + + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. + + return new GLTFCubicSplineInterpolant(this.times, this.values, this.getValueSize() / 3, result); + + }; + + // Workaround, provide an alternate way to know if the interpolant type is cubis spline to track. + // track.getInterpolation() doesn't return valid value for custom interpolant. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + + } + + tracks.push(track); + + } + + } + + } + + } + + var name = animationDef.name !== undefined ? animationDef.name : 'animation_' + animationIndex; + + return new THREE.AnimationClip(name, undefined, tracks); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise<THREE.Object3D>} + */ + GLTFParser.prototype.loadNode = function (nodeIndex) { + + var json = this.json; + var extensions = this.extensions; + + var meshReferences = this.json.meshReferences; + var meshUses = this.json.meshUses; + + var nodeDef = this.json.nodes[nodeIndex]; + + return this.getMultiDependencies([ + + 'mesh', + 'skin', + 'camera', + 'light' + + ]).then(function (dependencies) { + + var node; + + // .isBone isn't in glTF spec. See .markDefs + if (nodeDef.isBone === true) { + + node = new THREE.Bone(); + + } else if (nodeDef.mesh !== undefined) { + + var mesh = dependencies.meshes[nodeDef.mesh]; + + node = mesh.clone(); + + // for Specular-Glossiness + if (mesh.isGroup === true) { + + for (var i = 0, il = mesh.children.length; i < il; i++) { + + var child = mesh.children[i]; + + if (child.material && child.material.isGLTFSpecularGlossinessMaterial === true) { + + node.children[i].onBeforeRender = child.onBeforeRender; + + } + + } + + } else { + + if (mesh.material && mesh.material.isGLTFSpecularGlossinessMaterial === true) { + + node.onBeforeRender = mesh.onBeforeRender; + + } + + } + + if (meshReferences[nodeDef.mesh] > 1) { + + node.name += '_instance_' + meshUses[nodeDef.mesh]++; + + } + + } else if (nodeDef.camera !== undefined) { + + node = dependencies.cameras[nodeDef.camera]; + + } else if (nodeDef.extensions + && nodeDef.extensions[EXTENSIONS.KHR_LIGHTS] + && nodeDef.extensions[EXTENSIONS.KHR_LIGHTS].light !== undefined) { + + var lights = extensions[EXTENSIONS.KHR_LIGHTS].lights; + node = lights[nodeDef.extensions[EXTENSIONS.KHR_LIGHTS].light]; + + } else { + + node = new THREE.Object3D(); + + } + + if (nodeDef.name !== undefined) { + + node.name = THREE.PropertyBinding.sanitizeNodeName(nodeDef.name); + + } + + if (nodeDef.extras) node.userData = nodeDef.extras; + + if (nodeDef.extensions) addUnknownExtensionsToUserData(extensions, node, nodeDef); + + if (nodeDef.matrix !== undefined) { + + var matrix = new THREE.Matrix4(); + matrix.fromArray(nodeDef.matrix); + node.applyMatrix(matrix); + + } else { + + if (nodeDef.translation !== undefined) { + + node.position.fromArray(nodeDef.translation); + + } + + if (nodeDef.rotation !== undefined) { + + node.quaternion.fromArray(nodeDef.rotation); + + } + + if (nodeDef.scale !== undefined) { + + node.scale.fromArray(nodeDef.scale); + + } + + } + + return node; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise<THREE.Scene>} + */ + GLTFParser.prototype.loadScene = function () { + + // scene node hierachy builder + + function buildNodeHierachy(nodeId, parentObject, json, allNodes, skins) { + + var node = allNodes[nodeId]; + var nodeDef = json.nodes[nodeId]; + + // build skeleton here as well + + if (nodeDef.skin !== undefined) { + + var meshes = node.isGroup === true ? node.children : [node]; + + for (var i = 0, il = meshes.length; i < il; i++) { + + var mesh = meshes[i]; + var skinEntry = skins[nodeDef.skin]; + + var bones = []; + var boneInverses = []; + + for (var j = 0, jl = skinEntry.joints.length; j < jl; j++) { + + var jointId = skinEntry.joints[j]; + var jointNode = allNodes[jointId]; + + if (jointNode) { + + bones.push(jointNode); + + var mat = new THREE.Matrix4(); + + if (skinEntry.inverseBindMatrices !== undefined) { + + mat.fromArray(skinEntry.inverseBindMatrices.array, j * 16); + + } + + boneInverses.push(mat); + + } else { + + console.warn('THREE.GLTFLoader: Joint "%s" could not be found.', jointId); + + } + + } + + mesh.bind(new THREE.Skeleton(bones, boneInverses), mesh.matrixWorld); + + } + + } + + // build node hierachy + + parentObject.add(node); + + if (nodeDef.children) { + + var children = nodeDef.children; + + for (var i = 0, il = children.length; i < il; i++) { + + var child = children[i]; + buildNodeHierachy(child, node, json, allNodes, skins); + + } + + } + + } + + return function loadScene(sceneIndex) { + + var json = this.json; + var extensions = this.extensions; + var sceneDef = this.json.scenes[sceneIndex]; + + return this.getMultiDependencies([ + + 'node', + 'skin' + + ]).then(function (dependencies) { + + var scene = new THREE.Scene(); + if (sceneDef.name !== undefined) scene.name = sceneDef.name; + + if (sceneDef.extras) scene.userData = sceneDef.extras; + + if (sceneDef.extensions) addUnknownExtensionsToUserData(extensions, scene, sceneDef); + + var nodeIds = sceneDef.nodes || []; + + for (var i = 0, il = nodeIds.length; i < il; i++) { + + buildNodeHierachy(nodeIds[i], scene, json, dependencies.nodes, dependencies.skins); + + } + + // Ambient lighting, if present, is always attached to the scene root. + if (sceneDef.extensions + && sceneDef.extensions[EXTENSIONS.KHR_LIGHTS] + && sceneDef.extensions[EXTENSIONS.KHR_LIGHTS].light !== undefined) { + + var lights = extensions[EXTENSIONS.KHR_LIGHTS].lights; + scene.add(lights[sceneDef.extensions[EXTENSIONS.KHR_LIGHTS].light]); + + } + + return scene; + + }); + + }; + + }(); + + return GLTFLoader; + +})(); diff --git a/public/static/modelView/js/loaders/MTLLoader.js b/public/static/modelView/js/loaders/MTLLoader.js new file mode 100644 index 0000000..7efa0b2 --- /dev/null +++ b/public/static/modelView/js/loaders/MTLLoader.js @@ -0,0 +1,533 @@ +锘�/** + * Loads a Wavefront .mtl file specifying materials + * + * @author angelxuanchang + */ + +THREE.MTLLoader = function (manager) { + + this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; + +}; + +Object.assign(THREE.MTLLoader.prototype, THREE.EventDispatcher.prototype, { + + /** + * Loads and parses a MTL asset from a URL. + * + * @param {String} url - URL to the MTL file. + * @param {Function} [onLoad] - Callback invoked with the loaded object. + * @param {Function} [onProgress] - Callback for download progress. + * @param {Function} [onError] - Callback for download errors. + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to load. + */ + load: function (url, onLoad, onProgress, onError) { + + var scope = this; + + var loader = new THREE.XHRLoader(this.manager); + loader.setPath(this.path); + loader.load(url, function (text) { + + onLoad(scope.parse(text)); + + }, onProgress, onError); + + }, + + /** + * Set base path for resolving references. + * If set this path will be prepended to each loaded and found reference. + * + * @see setTexturePath + * @param {String} path + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setPath: function (path) { + + this.path = path; + + }, + + /** + * Set base path for resolving texture references. + * If set this path will be prepended found texture reference. + * If not set and setPath is, it will be used as texture base path. + * + * @see setPath + * @param {String} path + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.setTexturePath( 'assets/textures/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setTexturePath: function (path) { + + this.texturePath = path; + + }, + + setBaseUrl: function (path) { + + console.warn('THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.'); + + this.setTexturePath(path); + + }, + + setCrossOrigin: function (value) { + + this.crossOrigin = value; + + }, + + setMaterialOptions: function (value) { + + this.materialOptions = value; + + }, + + /** + * Parses a MTL file. + * + * @param {String} text - Content of MTL file + * @return {THREE.MTLLoader.MaterialCreator} + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to parse. + */ + parse: function (text) { + + var lines = text.split('\n'); + var info = {}; + var delimiter_pattern = /\s+/; + var materialsInfo = {}; + + for (var i = 0; i < lines.length; i++) { + + var line = lines[i]; + line = line.trim(); + + if (line.length === 0 || line.charAt(0) === '#') { + + // Blank line or comment ignore + continue; + + } + + var pos = line.indexOf(' '); + + var key = (pos >= 0) ? line.substring(0, pos) : line; + key = key.toLowerCase(); + + var value = (pos >= 0) ? line.substring(pos + 1) : ''; + value = value.trim(); + + if (key === 'newmtl') { + + // New material + + info = { name: value }; + materialsInfo[value] = info; + + } else if (info) { + + if (key === 'ka' || key === 'kd' || key === 'ks') { + + var ss = value.split(delimiter_pattern, 3); + info[key] = [parseFloat(ss[0]), parseFloat(ss[1]), parseFloat(ss[2])]; + + } else { + + info[key] = value; + + } + + } + + } + + var materialCreator = new THREE.MTLLoader.MaterialCreator(this.texturePath || this.path, this.materialOptions); + materialCreator.setCrossOrigin(this.crossOrigin); + materialCreator.setManager(this.manager); + materialCreator.setMaterials(materialsInfo); + return materialCreator; + + } + +}); + +/** + * Create a new THREE-MTLLoader.MaterialCreator + * @param baseUrl - Url relative to which textures are loaded + * @param options - Set of options on how to construct the materials + * side: Which side to apply the material + * THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide + * wrap: What type of wrapping to apply for textures + * THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping + * normalizeRGB: RGBs need to be normalized to 0-1 from 0-255 + * Default: false, assumed to be already normalized + * ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's + * Default: false + * @constructor + */ + +THREE.MTLLoader.MaterialCreator = function (baseUrl, options) { + + this.baseUrl = baseUrl || ''; + this.options = options; + this.materialsInfo = {}; + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + this.side = (this.options && this.options.side) ? this.options.side : THREE.FrontSide; + this.wrap = (this.options && this.options.wrap) ? this.options.wrap : THREE.RepeatWrapping; + +}; + +THREE.MTLLoader.MaterialCreator.prototype = { + + constructor: THREE.MTLLoader.MaterialCreator, + + setCrossOrigin: function (value) { + + this.crossOrigin = value; + + }, + + setManager: function (value) { + + this.manager = value; + + }, + + setMaterials: function (materialsInfo) { + + this.materialsInfo = this.convert(materialsInfo); + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + }, + + convert: function (materialsInfo) { + + if (!this.options) return materialsInfo; + + var converted = {}; + + for (var mn in materialsInfo) { + + // Convert materials info into normalized form based on options + + var mat = materialsInfo[mn]; + + var covmat = {}; + + converted[mn] = covmat; + + for (var prop in mat) { + + var save = true; + var value = mat[prop]; + var lprop = prop.toLowerCase(); + + switch (lprop) { + + case 'kd': + case 'ka': + case 'ks': + + // Diffuse color (color under white light) using RGB values + + if (this.options && this.options.normalizeRGB) { + + value = [value[0] / 255, value[1] / 255, value[2] / 255]; + + } + + if (this.options && this.options.ignoreZeroRGBs) { + + if (value[0] === 0 && value[1] === 0 && value[2] === 0) { + + // ignore + + save = false; + + } + + } + + break; + + default: + + break; + } + + if (save) { + + covmat[lprop] = value; + + } + + } + + } + + return converted; + + }, + + preload: function () { + + for (var mn in this.materialsInfo) { + + this.create(mn); + + } + + }, + + getIndex: function (materialName) { + + return this.nameLookup[materialName]; + + }, + + getAsArray: function () { + + var index = 0; + + for (var mn in this.materialsInfo) { + + this.materialsArray[index] = this.create(mn); + this.nameLookup[mn] = index; + index++; + + } + + return this.materialsArray; + + }, + + create: function (materialName) { + + if (this.materials[materialName] === undefined) { + + this.createMaterial_(materialName); + + } + + return this.materials[materialName]; + + }, + + createMaterial_: function (materialName) { + + // Create material + + var scope = this; + var mat = this.materialsInfo[materialName]; + var params = { + + name: materialName, + side: this.side + + }; + + var resolveURL = function (baseUrl, url) { + + if (typeof url !== 'string' || url === '') + return ''; + + // Absolute URL + if (/^https?:\/\//i.test(url)) { + return url; + } + + return baseUrl + url; + }; + + function setMapForType(mapType, value) { + + if (params[mapType]) return; // Keep the first encountered texture + + var texParams = scope.getTextureParams(value, params); + var map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url)); + + map.repeat.copy(texParams.scale); + map.offset.copy(texParams.offset); + + map.wrapS = scope.wrap; + map.wrapT = scope.wrap; + + params[mapType] = map; + } + + for (var prop in mat) { + + var value = mat[prop]; + + if (value === '') continue; + + switch (prop.toLowerCase()) { + + // Ns is material specular exponent + + case 'kd': + + // Diffuse color (color under white light) using RGB values + + params.color = new THREE.Color().fromArray(value); + + break; + + case 'ks': + + // Specular color (color when light is reflected from shiny surface) using RGB values + params.specular = new THREE.Color().fromArray(value); + + break; + + case 'map_kd': + + // Diffuse texture map + + setMapForType("map", value); + + break; + + case 'map_ks': + + // Specular map + + setMapForType("specularMap", value); + + break; + + case 'map_bump': + case 'bump': + + // Bump texture map + + setMapForType("bumpMap", value); + + break; + + case 'ns': + + // The specular exponent (defines the focus of the specular highlight) + // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000. + + params.shininess = parseFloat(value); + + break; + + case 'd': + + if (value < 1) { + + params.opacity = value; + params.transparent = true; + + } + + break; + + case 'Tr': + + if (value > 0) { + + params.opacity = 1 - value; + params.transparent = true; + + } + + break; + + default: + break; + + } + + } + + this.materials[materialName] = new THREE.MeshPhongMaterial(params); + return this.materials[materialName]; + }, + + getTextureParams: function (value, matParams) { + + var texParams = { + + scale: new THREE.Vector2(1, 1), + offset: new THREE.Vector2(0, 0), + + }; + + var items = value.split(/\s+/); + var pos; + + pos = items.indexOf('-bm'); + if (pos >= 0) { + + matParams.bumpScale = parseFloat(items[pos + 1]); + items.splice(pos, 2); + + } + + pos = items.indexOf('-s'); + if (pos >= 0) { + + texParams.scale.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2])); + items.splice(pos, 4); // we expect 3 parameters here! + + } + + pos = items.indexOf('-o'); + if (pos >= 0) { + + texParams.offset.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2])); + items.splice(pos, 4); // we expect 3 parameters here! + + } + + texParams.url = items.join(' ').trim(); + return texParams; + + }, + + loadTexture: function (url, mapping, onLoad, onProgress, onError) { + + var texture; + var loader = THREE.Loader.Handlers.get(url); + var manager = (this.manager !== undefined) ? this.manager : THREE.DefaultLoadingManager; + + if (loader === null) { + + loader = new THREE.TextureLoader(manager); + + } + + if (loader.setCrossOrigin) loader.setCrossOrigin(this.crossOrigin); + texture = loader.load(url, onLoad, onProgress, onError); + + if (mapping !== undefined) texture.mapping = mapping; + + return texture; + + } + +}; \ No newline at end of file diff --git a/public/static/modelView/js/loaders/OBJLoader.js b/public/static/modelView/js/loaders/OBJLoader.js new file mode 100644 index 0000000..1c62088 --- /dev/null +++ b/public/static/modelView/js/loaders/OBJLoader.js @@ -0,0 +1,670 @@ +锘�/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.OBJLoader = (function () { + + // o object_name | g group_name + var object_pattern = /^[og]\s*(.+)?/; + // mtllib file_reference + var material_library_pattern = /^mtllib /; + // usemtl material_name + var material_use_pattern = /^usemtl /; + + function ParserState() { + + var state = { + objects: [], + object: {}, + + vertices: [], + normals: [], + uvs: [], + + materialLibraries: [], + + startObject: function (name, fromDeclaration) { + + // If the current object (initial from reset) is not from a g/o declaration in the parsed + // file. We need to use it for the first parsed g/o to keep things in sync. + if (this.object && this.object.fromDeclaration === false) { + + this.object.name = name; + this.object.fromDeclaration = (fromDeclaration !== false); + return; + + } + + var previousMaterial = (this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined); + + if (this.object && typeof this.object._finalize === 'function') { + + this.object._finalize(true); + + } + + this.object = { + name: name || '', + fromDeclaration: (fromDeclaration !== false), + + geometry: { + vertices: [], + normals: [], + uvs: [] + }, + materials: [], + smooth: true, + + startMaterial: function (name, libraries) { + + var previous = this._finalize(false); + + // New usemtl declaration overwrites an inherited material, except if faces were declared + // after the material, then it must be preserved for proper MultiMaterial continuation. + if (previous && (previous.inherited || previous.groupCount <= 0)) { + + this.materials.splice(previous.index, 1); + + } + + var material = { + index: this.materials.length, + name: name || '', + mtllib: (Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : ''), + smooth: (previous !== undefined ? previous.smooth : this.smooth), + groupStart: (previous !== undefined ? previous.groupEnd : 0), + groupEnd: -1, + groupCount: -1, + inherited: false, + + clone: function (index) { + var cloned = { + index: (typeof index === 'number' ? index : this.index), + name: this.name, + mtllib: this.mtllib, + smooth: this.smooth, + groupStart: 0, + groupEnd: -1, + groupCount: -1, + inherited: false + }; + cloned.clone = this.clone.bind(cloned); + return cloned; + } + }; + + this.materials.push(material); + + return material; + + }, + + currentMaterial: function () { + + if (this.materials.length > 0) { + return this.materials[this.materials.length - 1]; + } + + return undefined; + + }, + + _finalize: function (end) { + + var lastMultiMaterial = this.currentMaterial(); + if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) { + + lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3; + lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart; + lastMultiMaterial.inherited = false; + + } + + // Ignore objects tail materials if no face declarations followed them before a new o/g started. + if (end && this.materials.length > 1) { + + for (var mi = this.materials.length - 1; mi >= 0; mi--) { + if (this.materials[mi].groupCount <= 0) { + this.materials.splice(mi, 1); + } + } + + } + + // Guarantee at least one empty material, this makes the creation later more straight forward. + if (end && this.materials.length === 0) { + + this.materials.push({ + name: '', + smooth: this.smooth + }); + + } + + return lastMultiMaterial; + + } + }; + + // Inherit previous objects material. + // Spec tells us that a declared material must be set to all objects until a new material is declared. + // If a usemtl declaration is encountered while this new object is being parsed, it will + // overwrite the inherited material. Exception being that there was already face declarations + // to the inherited material, then it will be preserved for proper MultiMaterial continuation. + + if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function') { + + var declared = previousMaterial.clone(0); + declared.inherited = true; + this.object.materials.push(declared); + + } + + this.objects.push(this.object); + + }, + + finalize: function () { + + if (this.object && typeof this.object._finalize === 'function') { + + this.object._finalize(true); + + } + + }, + + parseVertexIndex: function (value, len) { + + var index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 3) * 3; + + }, + + parseNormalIndex: function (value, len) { + + var index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 3) * 3; + + }, + + parseUVIndex: function (value, len) { + + var index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 2) * 2; + + }, + + addVertex: function (a, b, c) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push(src[a + 0], src[a + 1], src[a + 2]); + dst.push(src[b + 0], src[b + 1], src[b + 2]); + dst.push(src[c + 0], src[c + 1], src[c + 2]); + + }, + + addVertexLine: function (a) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push(src[a + 0], src[a + 1], src[a + 2]); + + }, + + addNormal: function (a, b, c) { + + var src = this.normals; + var dst = this.object.geometry.normals; + + dst.push(src[a + 0], src[a + 1], src[a + 2]); + dst.push(src[b + 0], src[b + 1], src[b + 2]); + dst.push(src[c + 0], src[c + 1], src[c + 2]); + + }, + + addUV: function (a, b, c) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push(src[a + 0], src[a + 1]); + dst.push(src[b + 0], src[b + 1]); + dst.push(src[c + 0], src[c + 1]); + + }, + + addUVLine: function (a) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push(src[a + 0], src[a + 1]); + + }, + + addFace: function (a, b, c, ua, ub, uc, na, nb, nc) { + + var vLen = this.vertices.length; + + var ia = this.parseVertexIndex(a, vLen); + var ib = this.parseVertexIndex(b, vLen); + var ic = this.parseVertexIndex(c, vLen); + + this.addVertex(ia, ib, ic); + + if (ua !== undefined) { + + var uvLen = this.uvs.length; + + ia = this.parseUVIndex(ua, uvLen); + ib = this.parseUVIndex(ub, uvLen); + ic = this.parseUVIndex(uc, uvLen); + + this.addUV(ia, ib, ic); + + } + + if (na !== undefined) { + + // Normals are many times the same. If so, skip function call and parseInt. + var nLen = this.normals.length; + ia = this.parseNormalIndex(na, nLen); + + ib = na === nb ? ia : this.parseNormalIndex(nb, nLen); + ic = na === nc ? ia : this.parseNormalIndex(nc, nLen); + + this.addNormal(ia, ib, ic); + + } + + }, + + addLineGeometry: function (vertices, uvs) { + + this.object.geometry.type = 'Line'; + + var vLen = this.vertices.length; + var uvLen = this.uvs.length; + + for (var vi = 0, l = vertices.length; vi < l; vi++) { + + this.addVertexLine(this.parseVertexIndex(vertices[vi], vLen)); + + } + + for (var uvi = 0, l = uvs.length; uvi < l; uvi++) { + + this.addUVLine(this.parseUVIndex(uvs[uvi], uvLen)); + + } + + } + + }; + + state.startObject('', false); + + return state; + + } + + // + + function OBJLoader(manager) { + + this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; + + this.materials = null; + + }; + + OBJLoader.prototype = { + + constructor: OBJLoader, + + load: function (url, onLoad, onProgress, onError) { + + var scope = this; + + var loader = new THREE.FileLoader(scope.manager); + loader.setPath(this.path); + loader.load(url, function (text) { + + onLoad(scope.parse(text)); + + }, onProgress, onError); + + }, + + setPath: function (value) { + + this.path = value; + + }, + + setMaterials: function (materials) { + + this.materials = materials; + + return this; + + }, + + parse: function (text) { + + console.time('OBJLoader'); + + var state = new ParserState(); + + if (text.indexOf('\r\n') !== -1) { + + // This is faster than String.split with regex that splits on both + text = text.replace(/\r\n/g, '\n'); + + } + + if (text.indexOf('\\\n') !== -1) { + + // join lines separated by a line continuation character (\) + text = text.replace(/\\\n/g, ''); + + } + + var lines = text.split('\n'); + var line = '', lineFirstChar = ''; + var lineLength = 0; + var result = []; + + // Faster to just trim left side of the line. Use if available. + var trimLeft = (typeof ''.trimLeft === 'function'); + + for (var i = 0, l = lines.length; i < l; i++) { + + line = lines[i]; + + line = trimLeft ? line.trimLeft() : line.trim(); + + lineLength = line.length; + + if (lineLength === 0) continue; + + lineFirstChar = line.charAt(0); + + // @todo invoke passed in handler if any + if (lineFirstChar === '#') continue; + + if (lineFirstChar === 'v') { + + var data = line.split(/\s+/); + + switch (data[0]) { + + case 'v': + state.vertices.push( + parseFloat(data[1]), + parseFloat(data[2]), + parseFloat(data[3]) + ); + break; + case 'vn': + state.normals.push( + parseFloat(data[1]), + parseFloat(data[2]), + parseFloat(data[3]) + ); + break; + case 'vt': + state.uvs.push( + parseFloat(data[1]), + parseFloat(data[2]) + ); + break; + } + + } else if (lineFirstChar === 'f') { + + var lineData = line.substr(1).trim(); + var vertexData = lineData.split(/\s+/); + var faceVertices = []; + + // Parse the face vertex data into an easy to work with format + + for (var j = 0, jl = vertexData.length; j < jl; j++) { + + var vertex = vertexData[j]; + + if (vertex.length > 0) { + + var vertexParts = vertex.split('/'); + faceVertices.push(vertexParts); + + } + + } + + // Draw an edge between the first vertex and all subsequent vertices to form an n-gon + + var v1 = faceVertices[0]; + + for (var j = 1, jl = faceVertices.length - 1; j < jl; j++) { + + var v2 = faceVertices[j]; + var v3 = faceVertices[j + 1]; + + state.addFace( + v1[0], v2[0], v3[0], + v1[1], v2[1], v3[1], + v1[2], v2[2], v3[2] + ); + + } + + } else if (lineFirstChar === 'l') { + + var lineParts = line.substring(1).trim().split(" "); + var lineVertices = [], lineUVs = []; + + if (line.indexOf("/") === -1) { + + lineVertices = lineParts; + + } else { + + for (var li = 0, llen = lineParts.length; li < llen; li++) { + + var parts = lineParts[li].split("/"); + + if (parts[0] !== "") lineVertices.push(parts[0]); + if (parts[1] !== "") lineUVs.push(parts[1]); + + } + + } + state.addLineGeometry(lineVertices, lineUVs); + + } else if ((result = object_pattern.exec(line)) !== null) { + + // o object_name + // or + // g group_name + + // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869 + // var name = result[ 0 ].substr( 1 ).trim(); + var name = (" " + result[0].substr(1).trim()).substr(1); + + state.startObject(name); + + } else if (material_use_pattern.test(line)) { + + // material + + state.object.startMaterial(line.substring(7).trim(), state.materialLibraries); + + } else if (material_library_pattern.test(line)) { + + // mtl file + + state.materialLibraries.push(line.substring(7).trim()); + + } else if (lineFirstChar === 's') { + + result = line.split(' '); + + // smooth shading + + // @todo Handle files that have varying smooth values for a set of faces inside one geometry, + // but does not define a usemtl for each face set. + // This should be detected and a dummy material created (later MultiMaterial and geometry groups). + // This requires some care to not create extra material on each smooth value for "normal" obj files. + // where explicit usemtl defines geometry groups. + // Example asset: examples/models/obj/cerberus/Cerberus.obj + + /* + * http://paulbourke.net/dataformats/obj/ + * or + * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf + * + * From chapter "Grouping" Syntax explanation "s group_number": + * "group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off. + * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form + * surfaces, smoothing groups are either turned on or off; there is no difference between values greater + * than 0." + */ + if (result.length > 1) { + + var value = result[1].trim().toLowerCase(); + state.object.smooth = (value !== '0' && value !== 'off'); + + } else { + + // ZBrush can produce "s" lines #11707 + state.object.smooth = true; + + } + var material = state.object.currentMaterial(); + if (material) material.smooth = state.object.smooth; + + } else { + + // Handle null terminated files without exception + if (line === '\0') continue; + + throw new Error("Unexpected line: '" + line + "'"); + + } + + } + + state.finalize(); + + var container = new THREE.Group(); + container.materialLibraries = [].concat(state.materialLibraries); + + for (var i = 0, l = state.objects.length; i < l; i++) { + + var object = state.objects[i]; + var geometry = object.geometry; + var materials = object.materials; + var isLine = (geometry.type === 'Line'); + + // Skip o/g line declarations that did not follow with any faces + if (geometry.vertices.length === 0) continue; + + var buffergeometry = new THREE.BufferGeometry(); + + buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3)); + + if (geometry.normals.length > 0) { + + buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3)); + + } else { + + buffergeometry.computeVertexNormals(); + + } + + if (geometry.uvs.length > 0) { + + buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2)); + + } + + // Create materials + + var createdMaterials = []; + + for (var mi = 0, miLen = materials.length; mi < miLen ; mi++) { + + var sourceMaterial = materials[mi]; + var material = undefined; + + if (this.materials !== null) { + + material = this.materials.create(sourceMaterial.name); + + // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material. + if (isLine && material && !(material instanceof THREE.LineBasicMaterial)) { + + var materialLine = new THREE.LineBasicMaterial(); + materialLine.copy(material); + material = materialLine; + + } + + } + + if (!material) { + + material = (!isLine ? new THREE.MeshPhongMaterial() : new THREE.LineBasicMaterial()); + material.name = sourceMaterial.name; + + } + + material.flatShading = sourceMaterial.smooth ? false : true; + + createdMaterials.push(material); + + } + + // Create mesh + + var mesh; + + if (createdMaterials.length > 1) { + + for (var mi = 0, miLen = materials.length; mi < miLen ; mi++) { + + var sourceMaterial = materials[mi]; + buffergeometry.addGroup(sourceMaterial.groupStart, sourceMaterial.groupCount, mi); + + } + + mesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials) : new THREE.LineSegments(buffergeometry, createdMaterials)); + + } else { + + mesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials[0]) : new THREE.LineSegments(buffergeometry, createdMaterials[0])); + } + + mesh.name = object.name; + + container.add(mesh); + + } + + console.timeEnd('OBJLoader'); + + return container; + + } + + }; + + return OBJLoader; + +})(); \ No newline at end of file diff --git a/public/static/modelView/js/loaders/STLLoader.js b/public/static/modelView/js/loaders/STLLoader.js new file mode 100644 index 0000000..970fbfa --- /dev/null +++ b/public/static/modelView/js/loaders/STLLoader.js @@ -0,0 +1,323 @@ +锘�/** + * @author aleeper / http://adamleeper.com/ + * @author mrdoob / http://mrdoob.com/ + * @author gero3 / https://github.com/gero3 + * @author Mugen87 / https://github.com/Mugen87 + * + * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs. + * + * Supports both binary and ASCII encoded files, with automatic detection of type. + * + * The loader returns a non-indexed buffer geometry. + * + * Limitations: + * Binary decoding supports "Magics" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL). + * There is perhaps some question as to how valid it is to always assume little-endian-ness. + * ASCII decoding assumes file is UTF-8. + * + * Usage: + * var loader = new THREE.STLLoader(); + * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) { + * scene.add( new THREE.Mesh( geometry ) ); + * }); + * + * For binary STLs geometry might contain colors for vertices. To use it: + * // use the same code to load STL as above + * if (geometry.hasColors) { + * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: THREE.VertexColors }); + * } else { .... } + * var mesh = new THREE.Mesh( geometry, material ); + */ + + +THREE.STLLoader = function (manager) { + + this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.STLLoader.prototype = { + + constructor: THREE.STLLoader, + + load: function (url, onLoad, onProgress, onError) { + + var scope = this; + + var loader = new THREE.FileLoader(scope.manager); + loader.setResponseType('arraybuffer'); + loader.load(url, function (text) { + + onLoad(scope.parse(text)); + + }, onProgress, onError); + + }, + + parse: function (data) { + + function isBinary(data) { + + var expect, face_size, n_faces, reader; + reader = new DataView(data); + face_size = (32 / 8 * 3) + ((32 / 8 * 3) * 3) + (16 / 8); + n_faces = reader.getUint32(80, true); + expect = 80 + (32 / 8) + (n_faces * face_size); + + if (expect === reader.byteLength) { + + return true; + + } + + // An ASCII STL data must begin with 'solid ' as the first six bytes. + // However, ASCII STLs lacking the SPACE after the 'd' are known to be + // plentiful. So, check the first 5 bytes for 'solid'. + + // US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd' + + var solid = [115, 111, 108, 105, 100]; + + for (var i = 0; i < 5; i++) { + + // If solid[ i ] does not match the i-th byte, then it is not an + // ASCII STL; hence, it is binary and return true. + + if (solid[i] != reader.getUint8(i, false)) return true; + + } + + // First 5 bytes read "solid"; declare it to be an ASCII STL + + return false; + + } + + function parseBinary(data) { + + var reader = new DataView(data); + var faces = reader.getUint32(80, true); + + var r, g, b, hasColors = false, colors; + var defaultR, defaultG, defaultB, alpha; + + // process STL header + // check for default color in header ("COLOR=rgba" sequence). + + for (var index = 0; index < 80 - 10; index++) { + + if ((reader.getUint32(index, false) == 0x434F4C4F /*COLO*/) && + (reader.getUint8(index + 4) == 0x52 /*'R'*/) && + (reader.getUint8(index + 5) == 0x3D /*'='*/)) { + + hasColors = true; + colors = []; + + defaultR = reader.getUint8(index + 6) / 255; + defaultG = reader.getUint8(index + 7) / 255; + defaultB = reader.getUint8(index + 8) / 255; + alpha = reader.getUint8(index + 9) / 255; + + } + + } + + var dataOffset = 84; + var faceLength = 12 * 4 + 2; + + var geometry = new THREE.BufferGeometry(); + + var vertices = []; + var normals = []; + + for (var face = 0; face < faces; face++) { + + var start = dataOffset + face * faceLength; + var normalX = reader.getFloat32(start, true); + var normalY = reader.getFloat32(start + 4, true); + var normalZ = reader.getFloat32(start + 8, true); + + if (hasColors) { + + var packedColor = reader.getUint16(start + 48, true); + + if ((packedColor & 0x8000) === 0) { + + // facet has its own unique color + + r = (packedColor & 0x1F) / 31; + g = ((packedColor >> 5) & 0x1F) / 31; + b = ((packedColor >> 10) & 0x1F) / 31; + + } else { + + r = defaultR; + g = defaultG; + b = defaultB; + + } + + } + + for (var i = 1; i <= 3; i++) { + + var vertexstart = start + i * 12; + + vertices.push(reader.getFloat32(vertexstart, true)); + vertices.push(reader.getFloat32(vertexstart + 4, true)); + vertices.push(reader.getFloat32(vertexstart + 8, true)); + + normals.push(normalX, normalY, normalZ); + + if (hasColors) { + + colors.push(r, g, b); + + } + + } + + } + + geometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3)); + geometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3)); + + if (hasColors) { + + geometry.addAttribute('color', new THREE.BufferAttribute(new Float32Array(colors), 3)); + geometry.hasColors = true; + geometry.alpha = alpha; + + } + + return geometry; + + } + + function parseASCII(data) { + + var geometry = new THREE.BufferGeometry(); + var patternFace = /facet([\s\S]*?)endfacet/g; + var faceCounter = 0; + + var patternFloat = /[\s]+([+-]?(?:\d+.\d+|\d+.|\d+|.\d+)(?:[eE][+-]?\d+)?)/.source; + var patternVertex = new RegExp('vertex' + patternFloat + patternFloat + patternFloat, 'g'); + var patternNormal = new RegExp('normal' + patternFloat + patternFloat + patternFloat, 'g'); + + var vertices = []; + var normals = []; + + var normal = new THREE.Vector3(); + + var result; + + while ((result = patternFace.exec(data)) !== null) { + + var vertexCountPerFace = 0; + var normalCountPerFace = 0; + + var text = result[0]; + + while ((result = patternNormal.exec(text)) !== null) { + + normal.x = parseFloat(result[1]); + normal.y = parseFloat(result[2]); + normal.z = parseFloat(result[3]); + normalCountPerFace++; + + } + + while ((result = patternVertex.exec(text)) !== null) { + + vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])); + normals.push(normal.x, normal.y, normal.z); + vertexCountPerFace++; + + } + + // every face have to own ONE valid normal + + if (normalCountPerFace !== 1) { + + console.error('THREE.STLLoader: Something isn\'t right with the normal of face number ' + faceCounter); + + } + + // each face have to own THREE valid vertices + + if (vertexCountPerFace !== 3) { + + console.error('THREE.STLLoader: Something isn\'t right with the vertices of face number ' + faceCounter); + + } + + faceCounter++; + + } + + geometry.addAttribute('position', new THREE.Float32BufferAttribute(vertices, 3)); + geometry.addAttribute('normal', new THREE.Float32BufferAttribute(normals, 3)); + + return geometry; + + } + + function ensureString(buffer) { + + if (typeof buffer !== 'string') { + + var array_buffer = new Uint8Array(buffer); + + if (window.TextDecoder !== undefined) { + + return new TextDecoder().decode(array_buffer); + + } + + var str = ''; + + for (var i = 0, il = buffer.byteLength; i < il; i++) { + + str += String.fromCharCode(array_buffer[i]); // implicitly assumes little-endian + + } + + return str; + + } else { + + return buffer; + + } + + } + + function ensureBinary(buffer) { + + if (typeof buffer === 'string') { + + var array_buffer = new Uint8Array(buffer.length); + for (var i = 0; i < buffer.length; i++) { + + array_buffer[i] = buffer.charCodeAt(i) & 0xff; // implicitly assumes little-endian + + } + return array_buffer.buffer || array_buffer; + + } else { + + return buffer; + + } + + } + + // start + + var binData = ensureBinary(data); + + return isBinary(binData) ? parseBinary(binData) : parseASCII(ensureString(data)); + + } + +}; \ No newline at end of file diff --git a/public/static/modelView/js/loaders/inflate.min.js b/public/static/modelView/js/loaders/inflate.min.js new file mode 100644 index 0000000..291dba6 --- /dev/null +++ b/public/static/modelView/js/loaders/inflate.min.js @@ -0,0 +1,28 @@ +锘�/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function () { + 'use strict'; var l = void 0, aa = this; function r(c, d) { var a = c.split("."), b = aa; !(a[0] in b) && b.execScript && b.execScript("var " + a[0]); for (var e; a.length && (e = a.shift()) ;) !a.length && d !== l ? b[e] = d : b = b[e] ? b[e] : b[e] = {} }; var t = "undefined" !== typeof Uint8Array && "undefined" !== typeof Uint16Array && "undefined" !== typeof Uint32Array && "undefined" !== typeof DataView; function v(c) { var d = c.length, a = 0, b = Number.POSITIVE_INFINITY, e, f, g, h, k, m, n, p, s, x; for (p = 0; p < d; ++p) c[p] > a && (a = c[p]), c[p] < b && (b = c[p]); e = 1 << a; f = new (t ? Uint32Array : Array)(e); g = 1; h = 0; for (k = 2; g <= a;) { for (p = 0; p < d; ++p) if (c[p] === g) { m = 0; n = h; for (s = 0; s < g; ++s) m = m << 1 | n & 1, n >>= 1; x = g << 16 | p; for (s = m; s < e; s += k) f[s] = x; ++h } ++g; h <<= 1; k <<= 1 } return [f, a, b] }; function w(c, d) { + this.g = []; this.h = 32768; this.d = this.f = this.a = this.l = 0; this.input = t ? new Uint8Array(c) : c; this.m = !1; this.i = y; this.r = !1; if (d || !(d = {})) d.index && (this.a = d.index), d.bufferSize && (this.h = d.bufferSize), d.bufferType && (this.i = d.bufferType), d.resize && (this.r = d.resize); switch (this.i) { + case A: this.b = 32768; this.c = new (t ? Uint8Array : Array)(32768 + this.h + 258); break; case y: this.b = 0; this.c = new (t ? Uint8Array : Array)(this.h); this.e = this.z; this.n = this.v; this.j = this.w; break; default: throw Error("invalid inflate mode"); + } + } var A = 0, y = 1, B = { t: A, s: y }; + w.prototype.k = function () { + for (; !this.m;) { + var c = C(this, 3); c & 1 && (this.m = !0); c >>>= 1; switch (c) { + case 0: var d = this.input, a = this.a, b = this.c, e = this.b, f = d.length, g = l, h = l, k = b.length, m = l; this.d = this.f = 0; if (a + 1 >= f) throw Error("invalid uncompressed block header: LEN"); g = d[a++] | d[a++] << 8; if (a + 1 >= f) throw Error("invalid uncompressed block header: NLEN"); h = d[a++] | d[a++] << 8; if (g === ~h) throw Error("invalid uncompressed block header: length verify"); if (a + g > d.length) throw Error("input buffer is broken"); switch (this.i) { + case A: for (; e + + g > b.length;) { m = k - e; g -= m; if (t) b.set(d.subarray(a, a + m), e), e += m, a += m; else for (; m--;) b[e++] = d[a++]; this.b = e; b = this.e(); e = this.b } break; case y: for (; e + g > b.length;) b = this.e({ p: 2 }); break; default: throw Error("invalid inflate mode"); + } if (t) b.set(d.subarray(a, a + g), e), e += g, a += g; else for (; g--;) b[e++] = d[a++]; this.a = a; this.b = e; this.c = b; break; case 1: this.j(ba, ca); break; case 2: for (var n = C(this, 5) + 257, p = C(this, 5) + 1, s = C(this, 4) + 4, x = new (t ? Uint8Array : Array)(D.length), S = l, T = l, U = l, u = l, M = l, F = l, z = l, q = l, V = l, q = 0; q < s; ++q) x[D[q]] = + C(this, 3); if (!t) { q = s; for (s = x.length; q < s; ++q) x[D[q]] = 0 } S = v(x); u = new (t ? Uint8Array : Array)(n + p); q = 0; for (V = n + p; q < V;) switch (M = E(this, S), M) { case 16: for (z = 3 + C(this, 2) ; z--;) u[q++] = F; break; case 17: for (z = 3 + C(this, 3) ; z--;) u[q++] = 0; F = 0; break; case 18: for (z = 11 + C(this, 7) ; z--;) u[q++] = 0; F = 0; break; default: F = u[q++] = M } T = t ? v(u.subarray(0, n)) : v(u.slice(0, n)); U = t ? v(u.subarray(n)) : v(u.slice(n)); this.j(T, U); break; default: throw Error("unknown BTYPE: " + c); + } + } return this.n() + }; + var G = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], D = t ? new Uint16Array(G) : G, H = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 258, 258], I = t ? new Uint16Array(H) : H, J = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0], K = t ? new Uint8Array(J) : J, L = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577], da = t ? new Uint16Array(L) : L, ea = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, + 13, 13], N = t ? new Uint8Array(ea) : ea, O = new (t ? Uint8Array : Array)(288), P, fa; P = 0; for (fa = O.length; P < fa; ++P) O[P] = 143 >= P ? 8 : 255 >= P ? 9 : 279 >= P ? 7 : 8; var ba = v(O), Q = new (t ? Uint8Array : Array)(30), R, ga; R = 0; for (ga = Q.length; R < ga; ++R) Q[R] = 5; var ca = v(Q); function C(c, d) { for (var a = c.f, b = c.d, e = c.input, f = c.a, g = e.length, h; b < d;) { if (f >= g) throw Error("input buffer is broken"); a |= e[f++] << b; b += 8 } h = a & (1 << d) - 1; c.f = a >>> d; c.d = b - d; c.a = f; return h } + function E(c, d) { for (var a = c.f, b = c.d, e = c.input, f = c.a, g = e.length, h = d[0], k = d[1], m, n; b < k && !(f >= g) ;) a |= e[f++] << b, b += 8; m = h[a & (1 << k) - 1]; n = m >>> 16; if (n > b) throw Error("invalid code length: " + n); c.f = a >> n; c.d = b - n; c.a = f; return m & 65535 } + w.prototype.j = function (c, d) { var a = this.c, b = this.b; this.o = c; for (var e = a.length - 258, f, g, h, k; 256 !== (f = E(this, c)) ;) if (256 > f) b >= e && (this.b = b, a = this.e(), b = this.b), a[b++] = f; else { g = f - 257; k = I[g]; 0 < K[g] && (k += C(this, K[g])); f = E(this, d); h = da[f]; 0 < N[f] && (h += C(this, N[f])); b >= e && (this.b = b, a = this.e(), b = this.b); for (; k--;) a[b] = a[b++ - h] } for (; 8 <= this.d;) this.d -= 8, this.a--; this.b = b }; + w.prototype.w = function (c, d) { var a = this.c, b = this.b; this.o = c; for (var e = a.length, f, g, h, k; 256 !== (f = E(this, c)) ;) if (256 > f) b >= e && (a = this.e(), e = a.length), a[b++] = f; else { g = f - 257; k = I[g]; 0 < K[g] && (k += C(this, K[g])); f = E(this, d); h = da[f]; 0 < N[f] && (h += C(this, N[f])); b + k > e && (a = this.e(), e = a.length); for (; k--;) a[b] = a[b++ - h] } for (; 8 <= this.d;) this.d -= 8, this.a--; this.b = b }; + w.prototype.e = function () { var c = new (t ? Uint8Array : Array)(this.b - 32768), d = this.b - 32768, a, b, e = this.c; if (t) c.set(e.subarray(32768, c.length)); else { a = 0; for (b = c.length; a < b; ++a) c[a] = e[a + 32768] } this.g.push(c); this.l += c.length; if (t) e.set(e.subarray(d, d + 32768)); else for (a = 0; 32768 > a; ++a) e[a] = e[d + a]; this.b = 32768; return e }; + w.prototype.z = function (c) { var d, a = this.input.length / this.a + 1 | 0, b, e, f, g = this.input, h = this.c; c && ("number" === typeof c.p && (a = c.p), "number" === typeof c.u && (a += c.u)); 2 > a ? (b = (g.length - this.a) / this.o[2], f = 258 * (b / 2) | 0, e = f < h.length ? h.length + f : h.length << 1) : e = h.length * a; t ? (d = new Uint8Array(e), d.set(h)) : d = h; return this.c = d }; + w.prototype.n = function () { var c = 0, d = this.c, a = this.g, b, e = new (t ? Uint8Array : Array)(this.l + (this.b - 32768)), f, g, h, k; if (0 === a.length) return t ? this.c.subarray(32768, this.b) : this.c.slice(32768, this.b); f = 0; for (g = a.length; f < g; ++f) { b = a[f]; h = 0; for (k = b.length; h < k; ++h) e[c++] = b[h] } f = 32768; for (g = this.b; f < g; ++f) e[c++] = d[f]; this.g = []; return this.buffer = e }; + w.prototype.v = function () { var c, d = this.b; t ? this.r ? (c = new Uint8Array(d), c.set(this.c.subarray(0, d))) : c = this.c.subarray(0, d) : (this.c.length > d && (this.c.length = d), c = this.c); return this.buffer = c }; function W(c, d) { var a, b; this.input = c; this.a = 0; if (d || !(d = {})) d.index && (this.a = d.index), d.verify && (this.A = d.verify); a = c[this.a++]; b = c[this.a++]; switch (a & 15) { case ha: this.method = ha; break; default: throw Error("unsupported compression method"); } if (0 !== ((a << 8) + b) % 31) throw Error("invalid fcheck flag:" + ((a << 8) + b) % 31); if (b & 32) throw Error("fdict flag is not supported"); this.q = new w(c, { index: this.a, bufferSize: d.bufferSize, bufferType: d.bufferType, resize: d.resize }) } + W.prototype.k = function () { var c = this.input, d, a; d = this.q.k(); this.a = this.q.a; if (this.A) { a = (c[this.a++] << 24 | c[this.a++] << 16 | c[this.a++] << 8 | c[this.a++]) >>> 0; var b = d; if ("string" === typeof b) { var e = b.split(""), f, g; f = 0; for (g = e.length; f < g; f++) e[f] = (e[f].charCodeAt(0) & 255) >>> 0; b = e } for (var h = 1, k = 0, m = b.length, n, p = 0; 0 < m;) { n = 1024 < m ? 1024 : m; m -= n; do h += b[p++], k += h; while (--n); h %= 65521; k %= 65521 } if (a !== (k << 16 | h) >>> 0) throw Error("invalid adler-32 checksum"); } return d }; var ha = 8; r("Zlib.Inflate", W); r("Zlib.Inflate.prototype.decompress", W.prototype.k); var X = { ADAPTIVE: B.s, BLOCK: B.t }, Y, Z, $, ia; if (Object.keys) Y = Object.keys(X); else for (Z in Y = [], $ = 0, X) Y[$++] = Z; $ = 0; for (ia = Y.length; $ < ia; ++$) Z = Y[$], r("Zlib.Inflate.BufferType." + Z, X[Z]); +}).call(this); \ No newline at end of file diff --git a/public/static/modelView/js/main.js b/public/static/modelView/js/main.js new file mode 100644 index 0000000..6e50cc4 --- /dev/null +++ b/public/static/modelView/js/main.js @@ -0,0 +1,573 @@ +var container = document.getElementById("container"); +var view = document.getElementById("main_viewer"); + +function getUrlParams() { + const urlSearchParams = new URLSearchParams(window.location.search); + return Object.fromEntries(urlSearchParams); +} + +if (!Detector.webgl) Detector.addGetWebGLMessage(); + +var camera, + camerHelper, + scene, + renderer, + loader, + stats, + controls, + transformControls, + numOfMeshes = 0, + model, + modelDuplicate, + sample_model, + wireframe, + mat, + scale, + delta; + +const manager = new THREE.LoadingManager(); + +var modelLoaded = false, + sample_model_loaded = false; +var modelWithTextures = false, + fbxLoaded = false, + gltfLoaded = false; +var bg_Texture = false; + +var glow_value, + selectedObject, + composer, + effectFXAA, + position, + outlinePass, + ssaaRenderPass; +var clock = new THREE.Clock(); + +var ambient, + directionalLight, + directionalLight2, + directionalLight3, + pointLight, + bg_colour; +var backgroundScene, backgroundCamera, backgroundMesh; + +var amb = document.getElementById("ambient_light"); +var rot1 = document.getElementById("rotation"); +var wire = document.getElementById("wire_check"); +var model_wire = document.getElementById("model_wire"); +var phong = document.getElementById("phong_check"); +var xray = document.getElementById("xray_check"); +var glow = document.getElementById("glow_check"); +var grid = document.getElementById("grid"); +var polar_grid = document.getElementById("polar_grid"); +var axis = document.getElementById("axis"); +var bBox = document.getElementById("bBox"); + +var transform = document.getElementById("transform"); +var smooth = document.getElementById("smooth"); +var outline = document.getElementById("outline"); + +var statsNode = document.getElementById("stats"); + +//ANIMATION GLOBALS +var animations = {}, + animationsSelect = document.getElementById("animationSelect"), + animsDiv = document.getElementById("anims"), + mixer, + currentAnimation, + actions = {}; + +//X-RAY SHADER MATERIAL +//http://free-tutorials.org/shader-x-ray-effect-with-three-js/ +var materials = { + default_material: new THREE.MeshLambertMaterial({ side: THREE.DoubleSide }), + default_material2: new THREE.MeshLambertMaterial({ side: THREE.DoubleSide }), + wireframeMaterial: new THREE.MeshPhongMaterial({ + side: THREE.DoubleSide, + wireframe: true, + shininess: 100, + specular: 0x000, + emissive: 0x000, + flatShading: false, + depthWrite: true, + depthTest: true, + }), + wireframeMaterial2: new THREE.LineBasicMaterial({ + wireframe: true, + color: 0xffffff, + }), + wireframeAndModel: new THREE.LineBasicMaterial({ color: 0xffffff }), + phongMaterial: new THREE.MeshPhongMaterial({ + color: 0x555555, + specular: 0xffffff, + shininess: 10, + flatShading: false, + side: THREE.DoubleSide, + skinning: true, + }), + xrayMaterial: new THREE.ShaderMaterial({ + uniforms: { + p: { type: "f", value: 3 }, + glowColor: { type: "c", value: new THREE.Color(0x84ccff) }, + }, + vertexShader: document.getElementById("vertexShader").textContent, + fragmentShader: document.getElementById("fragmentShader").textContent, + side: THREE.DoubleSide, + blending: THREE.AdditiveBlending, + transparent: true, + depthWrite: false, + }), +}; + +var clock = new THREE.Clock(); +var winDims = [window.innerWidth * 0.8, window.innerHeight * 0.89]; //size of renderer + +function onload() { + // 鏄惁鏄剧ず鑿滃崟 + //window.addEventListener('resize', onWindowResize, false); + const dataStr = getUrlParams(); + if (!dataStr.target) { + document.getElementById("fullscreen").style.display = "block"; + document.getElementById("customSlide").style.display = "block"; + document.getElementById("collapse_side").style.display = "block"; + } else { + document.getElementById("fullscreen").style.display = "none"; + } + switchScene(0); + animate(); +} + +function initScene(index) { + scene = new THREE.Scene(); + + camera = new THREE.PerspectiveCamera( + 70, + window.innerWidth / window.innerHeight, + 0.1, + 500000 + ); + camera.position.set(0, 0, 20); + + //Setup renderer + //renderer = new THREE.CanvasRenderer({ alpha: true }); + renderer = new THREE.WebGLRenderer(); + renderer.setPixelRatio(window.devicePixelRatio); + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor(0x292121); //565646, 29212 + + view.appendChild(renderer.domElement); + + THREEx.WindowResize(renderer, camera); + + ambient = new THREE.AmbientLight(0x404040); + $("#ambient_light").change(function () { + if (amb.checked) { + scene.add(ambient); + } else { + scene.remove(ambient); + } + }); + + /*LIGHTS*/ + directionalLight = new THREE.DirectionalLight(0xffeedd); + directionalLight.position.set(0, 0, 1).normalize(); + scene.add(directionalLight); + + directionalLight2 = new THREE.DirectionalLight(0xffeedd); + directionalLight2.position.set(0, 0, -1).normalize(); + scene.add(directionalLight2); + + directionalLight3 = new THREE.DirectionalLight(0xffeedd); + directionalLight3.position.set(0, 1, 0).normalize(); + scene.add(directionalLight3); + + var ambientLight = new THREE.AmbientLight(0x808080, 0.2); //Grey colour, low intensity + scene.add(ambientLight); + + pointLight = new THREE.PointLight(0xcccccc, 0.5); + camera.add(pointLight); + + scene.add(camera); + + controls = new THREE.OrbitControls(camera, renderer.domElement); + controls.enableDamping = true; + controls.dampingFactor = 0.09; + controls.rotateSpeed = 0.09; + + transformControls = new THREE.TransformControls(camera, renderer.domElement); + transformControls.addEventListener("change", render); + scene.add(transformControls); + + transformControls.addEventListener("mouseDown", function () { + controls.enabled = false; + }); + transformControls.addEventListener("mouseUp", function () { + controls.enabled = true; + }); + + window.addEventListener("keydown", function (event) { + switch (event.keyCode) { + case 82: // R key pressed - set rotate mode + transformControls.setMode("rotate"); + break; + + case 84: // T key pressed - set translate mode + transformControls.setMode("translate"); + break; + + case 83: // S key pressed - set scale mode + transformControls.setMode("scale"); + break; + } + }); + + //Colour changer, to set background colour of renderer to user chosen colour + $(".bg_select").spectrum({ + color: "#fff", + change: function (color) { + $("#basic_log").text("Hex Colour Selected: " + color.toHexString()); //Log information + var bg_value = $(".bg_select").spectrum("get").toHexString(); //Get the colour selected + renderer.setClearColor(bg_value); //Set renderer colour to the selected hex value + ssaaRenderPass.clearColor = bg_value; + document.body.style.background = bg_value; //Set body of document to selected colour + }, + }); + + // postprocessing + var renderPass = new THREE.RenderPass(scene, camera); + + var fxaaPass = new THREE.ShaderPass(THREE.FXAAShader); + var pixelRatio = renderer.getPixelRatio(); + + fxaaPass.material.uniforms["resolution"].value.x = + 1 / (window.innerWidth * pixelRatio); + fxaaPass.material.uniforms["resolution"].value.y = + 1 / (window.innerHeight * pixelRatio); + fxaaPass.renderToScreen = true; + + outlinePass = new THREE.OutlinePass( + new THREE.Vector2(window.innerWidth, window.innerHeight), + scene, + camera + ); + outlinePass.edgeStrength = 1.5; + outlinePass.edgeGlow = 2; + + composer = new THREE.EffectComposer(renderer); + composer.addPass(renderPass); + composer.addPass(outlinePass); + composer.addPass(fxaaPass); + + /*LOAD SAMPLE MODELS*/ + const dataS = getUrlParams(); + // const str = dataS.domain + '/file/api/ApiDownload?md5=' + dataS.md5 + let str = ""; + if (dataS.token != null || dataS.token != undefined) { + str = + dataS.domain + + `/file/api/ApiDownloadForAuthorize?md5=${dataS.md5}&token=${dataS.token}`; + } else { + str = dataS.domain + `/file/api/ApiDownload?md5=${dataS.md5}`; + } + var modelList = [ + { + name: dataS.name, + url: str, + }, + ]; + var sceneInfo = modelList[index]; //index from array of sample models in html select options + loader = new THREE.FBXLoader(manager); + var url = sceneInfo.url; + + //progress/loading bar + var onProgress = function (data) { + if (data.lengthComputable) { + //if size of file transfer is known + var percentage = Math.round((data.loaded * 100) / data.total); + statsNode.innerHTML = + "Loaded : " + + percentage + + "%" + + " of " + + sceneInfo.name + + "<br>" + + '<progress value="0" max="100" class="progress"></progress>'; + $(".progress").css({ width: percentage + "%" }); + $(".progress").val(percentage); + } + }; + var onError = function (xhr) { + console.log("ERROR"); + }; + + loader.load( + url, + function (data) { + sample_model = data; + sample_model_loaded = true; + sample_model.traverse(function (child) { + if (child instanceof THREE.Mesh) { + numOfMeshes++; + var geometry = child.geometry; + stats(sceneInfo.name, geometry, numOfMeshes); + + child.material = materials.default_material; + + var wireframe2 = new THREE.WireframeGeometry(child.geometry); + var edges = new THREE.LineSegments( + wireframe2, + materials.wireframeAndModel + ); + materials.wireframeAndModel.visible = false; + sample_model.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + + setPhong(child); + setXray(child); + } + }); + + setCamera(sample_model); + + setSmooth(sample_model); + + setBoundBox(sample_model); + setPolarGrid(sample_model); + setGrid(sample_model); + setAxis(sample_model); + + scaleUp(sample_model); + scaleDown(sample_model); + + selectedObject = sample_model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(sample_model); + }, + onProgress, + onError + ); + + $("#transform").on("change", function () { + if (transform.checked) { + document.getElementById("transformKey").style.display = "block"; + if (modelLoaded) { + transformControls.attach(model); + } else if (sample_model_loaded) { + transformControls.attach(sample_model); + } + } else { + document.getElementById("transformKey").style.display = "none"; + transformControls.detach(scene); + } + }); +} + +function getUrlParams() { + const urlSearchParams = new URLSearchParams(window.location.search); + return Object.fromEntries(urlSearchParams); +} + +function toggleFullscreen(elem) { + elem = elem || document.documentElement; + if ( + !document.fullscreenElement && + !document.mozFullScreenElement && + !document.webkitFullscreenElement && + !document.msFullscreenElement + ) { + THREEx.FullScreen.request(container); + setTimeout(() => { + onload(); + }, 200); + } else { + THREEx.FullScreen.cancel(); + // if (document.exitFullscreen) { + // document.exitFullscreen() + // } else if (document.msExitFullscreen) { + // document.msExitFullscreen() + // //renderer.setSize(winDims[0], winDims[1]); //Reset renderer size on fullscreen exit + // } else if (document.mozCancelFullScreen) { + // document.mozCancelFullScreen() + // //renderer.setSize(winDims[0], winDims[1]); + // } else if (document.webkitExitFullscreen) { + // document.webkitExitFullscreen() + // // renderer.setSize(winDims[0], winDims[1]); + // } + } +} + +document.getElementById("fullscreenBtn").addEventListener("click", function () { + toggleFullscreen(document.getElementById("container")); +}); + +function removeModel() { + scene.remove(model); + scale = 1; + numOfMeshes = 0; + modelLoaded = false; + modelWithTextures = false; + fbxLoaded = false; + gltfLoaded = false; + + if (ambient) { + scene.remove(ambient); + } + + $("#point_light").slider("value", 0.5); + pointLight.intensity = 0.5; + + camera.position.set(0, 0, 20); //Reset camera to initial position + controls.reset(); //Reset controls, for when previous object has been moved around e.g. larger object = larger rotation + statsNode.innerHTML = ""; //Reset stats box (faces, vertices etc) + + $("#red, #green, #blue, #ambient_red, #ambient_green, #ambient_blue").slider( + "value", + 127 + ); //Reset colour sliders + + amb.checked = false; + rot1.checked = false; + wire.checked = false; + model_wire.checked = false; + phong.checked = false; + xray.checked = false; + glow.checked = false; + grid.checked = false; + polar_grid.checked = false; + axis.checked = false; + bBox.checked = false; + smooth.checked = false; + (transform.checked = false), (smooth.disabled = false); //Uncheck any checked boxes + + transformControls.detach(scene); + + document.getElementById("smooth-model").innerHTML = "Smooth Model"; + + $("#rot_slider").slider({ + disabled: true, //disable the rotation slider + }); + controls.autoRotate = false; //Stop model auto rotating if doing so on new file select + $("#shine").slider("value", 10); //Set phong shine level back to initial + + $('input[name="rotate"]').prop("checked", false); //uncheck rotate x, y or z checkboxes + + animsDiv.style.display = "none"; //Hide animation <div> +} + +$("#remove").click(function () { + removeModel(); +}); + +$("#red, #green, #blue, #ambient_red, #ambient_green, #ambient_blue").slider({ + change: function (event, ui) { + console.log(ui.value); + render(); + }, +}); + +var rotVal = [40, 80, 110, 140, 170, 200, 240, 280, 340, 400, 520]; //Rotation speeds low - high +var rotation_speed; + +$("#rot_slider").slider({ + orientation: "horizontal", + range: "min", + max: rotVal.length - 1, + value: 0, + disabled: true, + slide: function (event, ui) { + rotation_speed = rotVal[ui.value]; //Set speed variable to the current selected value of slider + }, +}); + +$("#rotation").change(function () { + if (rot1.checked) { + rotation_speed = rotVal[$("#rot_slider").slider("value")]; + //set the speed to the current slider value on initial use + controls.autoRotate = true; + + $("#rot_slider").slider({ + disabled: false, + change: function (event, ui) { + console.log(rotVal[ui.value]); + controls.autoRotate = true; + controls.autoRotateSpeed = delta * rotation_speed; + }, + }); + } else { + controls.autoRotate = false; + $("#rot_slider").slider({ + disabled: true, //disable the slider from being able to rotate object when rotation toggle is off + }); + } +}); + +function setColours() { + var colour = getColours( + $("#red").slider("value"), + $("#green").slider("value"), + $("#blue").slider("value") + ); + directionalLight.color.setRGB(colour[0], colour[1], colour[2]); + directionalLight2.color.setRGB(colour[0], colour[1], colour[2]); + directionalLight3.color.setRGB(colour[0], colour[1], colour[2]); + + var colour = getColours( + $("#ambient_red").slider("value"), + $("#ambient_green").slider("value"), + $("#ambient_blue").slider("value") + ); + ambient.color.setRGB(colour[0], colour[1], colour[2]); +} + +function getColours(r, g, b) { + var colour = [r.valueOf() / 255, g.valueOf() / 255, b.valueOf() / 255]; + return colour; +} + +function render() { + setColours(); + // renderer.render(scene, camera); +} + +function animate() { + delta = clock.getDelta(); + requestAnimationFrame(animate); + + if (mixer) { + mixer.update(delta); + } + controls.update(delta); + + composer.render(); + render(); +} + +function switchScene(index) { + clear(); + initScene(index); + var elt = document.getElementById("scenes_list"); + elt.selectedIndex = index; +} + +function selectModel() { + var select = document.getElementById("scenes_list"); + var index = select.selectedIndex; + + if (index >= 0) { + removeModel(); + switchScene(index); + } +} + +function clear() { + if (view && renderer) { + view.removeChild(renderer.domElement); + document.body.style.background = "#292121"; + } +} + +onload(); diff --git a/public/static/modelView/js/menu.js b/public/static/modelView/js/menu.js new file mode 100644 index 0000000..c37d538 --- /dev/null +++ b/public/static/modelView/js/menu.js @@ -0,0 +1,115 @@ +$(document).ready(function () { + + $(".menu_item > li > a").on("click", function (e) { + + if (!$(this).hasClass("active")) { + + // hide any open menus and remove all other classes + $(".menu_item li ul").slideUp(350); + $(".menu_item li a").removeClass("active"); + + // open new menu and add the open class + $(this).next("ul").slideDown(350); + $(this).addClass("active"); + //$(".side_menu").niceScroll({ horizrailenabled: false }); //add jquery nicescroll with horizontal scroll disabled + + } else if ($(this).hasClass("active")) { + + $(this).removeClass("active"); + $(this).next("ul").slideUp(350); + } + }); + + $(".bottom_menu_item > li > a").on("click", function (e) { + + if (!$(this).hasClass("active")) { + + // hide any open menus and remove all other classes + $(".bottom_menu_item li ul").slideUp(350); + $(".bottom_menu_item li a").removeClass("active"); + + // open new menu and add the open class + $(this).next("ul").slideDown(350); + $(this).addClass("active"); + //$("#bottom_menu").niceScroll(); + + } else if ($(this).hasClass("active")) { + + $(this).removeClass("active"); + $(this).next("ul").slideUp(350); + } + }); + + + var side_collapsed = false; + var btm_collapsed = false; + + //Collapse Side Menu + $('#collapse_side').on('click', function () { + + side_collapsed = !side_collapsed; + var arrow = document.getElementById('collapse_side'); + + if (side_collapsed) { + $('.side_menu').toggle('slide', 'left', 1200); + // move the left collapse arrow along with menu and set it to be a right arrow (bring back menu) + $('#collapse_side').css('position', 'absolute').animate({ + left: '-=270' + }, { + duration: 1500, + complete: function () { + arrow.innerHTML = "→"; + } + }); + } + else { + $('.side_menu').toggle('slide', 'left', 1200); + // move the right collapse back along with menu + $('#collapse_side').css('position', 'absolute').animate({ + left: '+=270' + }, { + duration: 1100, + complete: function () { + arrow.innerHTML = "←"; + } + }); + } + }); + + + //Collapse Bottom Menu + $('#collapse_btm').on('click', function () { + + btm_collapsed = !btm_collapsed; + var arrow = document.getElementById('collapse_btm'); + + if (btm_collapsed) { + //$('#bottom_menu').toggle('slide', 'down', 1200); + $("#bottom_menu").slideToggle("slow"); + // move the left collapse arrow along with menu and set it to be a right arrow (bring back menu) + $('#collapse_btm').css('position', 'absolute').animate({ + bottom: '-=270' + }, { + duration: 1500, + complete: function () { + arrow.innerHTML = "↑"; + } + }); + + } + else { + //$('#bottom_menu').toggle('slide', 'down', 1200); + $("#bottom_menu").slideToggle("slow"); + // move the right collapse back along with menu + $('#collapse_btm').css('position', 'absolute').animate({ + bottom: '+=270' + }, { + duration: 600, + complete: function () { + arrow.innerHTML = "↓"; + } + }); + } + }); + +}); diff --git a/public/static/modelView/js/screenfull.min.js b/public/static/modelView/js/screenfull.min.js new file mode 100644 index 0000000..f7f48fb --- /dev/null +++ b/public/static/modelView/js/screenfull.min.js @@ -0,0 +1,7 @@ +锘�/*! +* screenfull +* v3.3.1 - 2017-07-07 +* (c) Sindre Sorhus; MIT License +*/ + +!function () { "use strict"; var a = "undefined" != typeof window && void 0 !== window.document ? window.document : {}, b = "undefined" != typeof module && module.exports, c = "undefined" != typeof Element && "ALLOW_KEYBOARD_INPUT" in Element, d = function () { for (var b, c = [["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"], ["webkitRequestFullscreen", "webkitExitFullscreen", "webkitFullscreenElement", "webkitFullscreenEnabled", "webkitfullscreenchange", "webkitfullscreenerror"], ["webkitRequestFullScreen", "webkitCancelFullScreen", "webkitCurrentFullScreenElement", "webkitCancelFullScreen", "webkitfullscreenchange", "webkitfullscreenerror"], ["mozRequestFullScreen", "mozCancelFullScreen", "mozFullScreenElement", "mozFullScreenEnabled", "mozfullscreenchange", "mozfullscreenerror"], ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"]], d = 0, e = c.length, f = {}; d < e; d++) if ((b = c[d]) && b[1] in a) { for (d = 0; d < b.length; d++) f[c[0][d]] = b[d]; return f } return !1 }(), e = { change: d.fullscreenchange, error: d.fullscreenerror }, f = { request: function (b) { var e = d.requestFullscreen; b = b || a.documentElement, /5\.1[.\d]* Safari/.test(navigator.userAgent) ? b[e]() : b[e](c && Element.ALLOW_KEYBOARD_INPUT) }, exit: function () { a[d.exitFullscreen]() }, toggle: function (a) { this.isFullscreen ? this.exit() : this.request(a) }, onchange: function (a) { this.on("change", a) }, onerror: function (a) { this.on("error", a) }, on: function (b, c) { var d = e[b]; d && a.addEventListener(d, c, !1) }, off: function (b, c) { var d = e[b]; d && a.removeEventListener(d, c, !1) }, raw: d }; if (!d) return void (b ? module.exports = !1 : window.screenfull = !1); Object.defineProperties(f, { isFullscreen: { get: function () { return Boolean(a[d.fullscreenElement]) } }, element: { enumerable: !0, get: function () { return a[d.fullscreenElement] } }, enabled: { enumerable: !0, get: function () { return Boolean(a[d.fullscreenEnabled]) } } }), b ? module.exports = f : window.screenfull = f }(); \ No newline at end of file diff --git a/public/static/modelView/js/spectrum.js b/public/static/modelView/js/spectrum.js new file mode 100644 index 0000000..bc69a93 --- /dev/null +++ b/public/static/modelView/js/spectrum.js @@ -0,0 +1,2255 @@ +// Spectrum Colorpicker v1.5.1 +// https://github.com/bgrins/spectrum +// Author: Brian Grinstead +// License: MIT + +(function (window, $, undefined) { + "use strict"; + + var defaultOpts = { + + // Callbacks + beforeShow: noop, + move: noop, + change: noop, + show: noop, + hide: noop, + + // Options + color: false, + flat: false, + showInput: false, + allowEmpty: false, + showButtons: true, + clickoutFiresChange: false, + showInitial: false, + showPalette: false, + showPaletteOnly: false, + hideAfterPaletteSelect: false, + togglePaletteOnly: false, + showSelectionPalette: true, + localStorageKey: false, + appendTo: "body", + maxSelectionSize: 7, + cancelText: "鍏抽棴", + chooseText: "纭", + togglePaletteMoreText: "more", + togglePaletteLessText: "less", + clearText: "Clear Color Selection", + noColorSelectedText: "No Color Selected", + preferredFormat: false, + className: "", // Deprecated - use containerClassName and replacerClassName instead. + containerClassName: "", + replacerClassName: "", + showAlpha: false, + theme: "sp-light", + palette: [["#ffffff", "#000000", "#ff0000", "#ff8000", "#ffff00", "#008000", "#0000ff", "#4b0082", "#9400d3"]], + selectionPalette: [], + disabled: false + }, + spectrums = [], + IE = !!/msie/i.exec( window.navigator.userAgent ), + rgbaSupport = (function() { + function contains( str, substr ) { + return !!~('' + str).indexOf(substr); + } + + var elem = document.createElement('div'); + var style = elem.style; + style.cssText = 'background-color:rgba(0,0,0,.5)'; + return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla'); + })(), + inputTypeColorSupport = (function() { + var colorInput = $("<input type='color' value='!' />")[0]; + return colorInput.type === "color" && colorInput.value !== "!"; + })(), + replaceInput = [ + "<div class='sp-replacer'>", + "<div class='sp-preview'><div class='sp-preview-inner'></div></div>", + "<div class='sp-dd'>▼</div>", + "</div>" + ].join(''), + markup = (function () { + + // IE does not support gradients with multiple stops, so we need to simulate + // that for the rainbow slider with 8 divs that each have a single gradient + var gradientFix = ""; + if (IE) { + for (var i = 1; i <= 6; i++) { + gradientFix += "<div class='sp-" + i + "'></div>"; + } + } + + return [ + "<div class='sp-container sp-hidden'>", + "<div class='sp-palette-container'>", + "<div class='sp-palette sp-thumb sp-cf'></div>", + "<div class='sp-palette-button-container sp-cf'>", + "<button type='button' class='sp-palette-toggle'></button>", + "</div>", + "</div>", + "<div class='sp-picker-container'>", + "<div class='sp-top sp-cf'>", + "<div class='sp-fill'></div>", + "<div class='sp-top-inner'>", + "<div class='sp-color'>", + "<div class='sp-sat'>", + "<div class='sp-val'>", + "<div class='sp-dragger'></div>", + "</div>", + "</div>", + "</div>", + "<div class='sp-clear sp-clear-display'>", + "</div>", + "<div class='sp-hue'>", + "<div class='sp-slider'></div>", + gradientFix, + "</div>", + "</div>", + "<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>", + "</div>", + "<div class='sp-input-container sp-cf'>", + "<input class='sp-input' type='text' spellcheck='false' />", + "</div>", + "<div class='sp-initial sp-thumb sp-cf'></div>", + "<div class='sp-button-container sp-cf'>", + "<a class='sp-cancel' href='#'></a>", + "<button type='button' class='sp-choose'></button>", + "</div>", + "</div>", + "</div>" + ].join(""); + })(); + + function paletteTemplate (p, color, className, opts) { + var html = []; + for (var i = 0; i < p.length; i++) { + var current = p[i]; + if(current) { + var tiny = tinycolor(current); + var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light"; + c += (tinycolor.equals(color, current)) ? " sp-thumb-active" : ""; + var formattedString = tiny.toString(opts.preferredFormat || "rgb"); + var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter(); + html.push('<span title="' + formattedString + '" data-color="' + tiny.toRgbString() + '" class="' + c + '"><span class="sp-thumb-inner" style="' + swatchStyle + ';" /></span>'); + } else { + var cls = 'sp-clear-display'; + html.push($('<div />') + .append($('<span data-color="" style="background-color:transparent;" class="' + cls + '"></span>') + .attr('title', opts.noColorSelectedText) + ) + .html() + ); + } + } + return "<div class='sp-cf " + className + "'>" + html.join('') + "</div>"; + } + + function hideAll() { + for (var i = 0; i < spectrums.length; i++) { + if (spectrums[i]) { + spectrums[i].hide(); + } + } + } + + function instanceOptions(o, callbackContext) { + var opts = $.extend({}, defaultOpts, o); + opts.callbacks = { + 'move': bind(opts.move, callbackContext), + 'change': bind(opts.change, callbackContext), + 'show': bind(opts.show, callbackContext), + 'hide': bind(opts.hide, callbackContext), + 'beforeShow': bind(opts.beforeShow, callbackContext) + }; + + return opts; + } + + function spectrum(element, o) { + + var opts = instanceOptions(o, element), + flat = opts.flat, + showSelectionPalette = opts.showSelectionPalette, + localStorageKey = opts.localStorageKey, + theme = opts.theme, + callbacks = opts.callbacks, + resize = throttle(reflow, 10), + visible = false, + dragWidth = 0, + dragHeight = 0, + dragHelperHeight = 0, + slideHeight = 0, + slideWidth = 0, + alphaWidth = 0, + alphaSlideHelperWidth = 0, + slideHelperHeight = 0, + currentHue = 0, + currentSaturation = 0, + currentValue = 0, + currentAlpha = 1, + palette = [], + paletteArray = [], + paletteLookup = {}, + selectionPalette = opts.selectionPalette.slice(0), + maxSelectionSize = opts.maxSelectionSize, + draggingClass = "sp-dragging", + shiftMovementDirection = null; + + var doc = element.ownerDocument, + body = doc.body, + boundElement = $(element), + disabled = false, + container = $(markup, doc).addClass(theme), + pickerContainer = container.find(".sp-picker-container"), + dragger = container.find(".sp-color"), + dragHelper = container.find(".sp-dragger"), + slider = container.find(".sp-hue"), + slideHelper = container.find(".sp-slider"), + alphaSliderInner = container.find(".sp-alpha-inner"), + alphaSlider = container.find(".sp-alpha"), + alphaSlideHelper = container.find(".sp-alpha-handle"), + textInput = container.find(".sp-input"), + paletteContainer = container.find(".sp-palette"), + initialColorContainer = container.find(".sp-initial"), + cancelButton = container.find(".sp-cancel"), + clearButton = container.find(".sp-clear"), + chooseButton = container.find(".sp-choose"), + toggleButton = container.find(".sp-palette-toggle"), + isInput = boundElement.is("input"), + isInputTypeColor = isInput && inputTypeColorSupport && boundElement.attr("type") === "color", + shouldReplace = isInput && !flat, + replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className).addClass(opts.replacerClassName) : $([]), + offsetElement = (shouldReplace) ? replacer : boundElement, + previewElement = replacer.find(".sp-preview-inner"), + initialColor = opts.color || (isInput && boundElement.val()), + colorOnShow = false, + preferredFormat = opts.preferredFormat, + currentPreferredFormat = preferredFormat, + clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange, + isEmpty = !initialColor, + allowEmpty = opts.allowEmpty && !isInputTypeColor; + + function applyOptions() { + + if (opts.showPaletteOnly) { + opts.showPalette = true; + } + + toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText); + + if (opts.palette) { + palette = opts.palette.slice(0); + paletteArray = $.isArray(palette[0]) ? palette : [palette]; + paletteLookup = {}; + for (var i = 0; i < paletteArray.length; i++) { + for (var j = 0; j < paletteArray[i].length; j++) { + var rgb = tinycolor(paletteArray[i][j]).toRgbString(); + paletteLookup[rgb] = true; + } + } + } + + container.toggleClass("sp-flat", flat); + container.toggleClass("sp-input-disabled", !opts.showInput); + container.toggleClass("sp-alpha-enabled", opts.showAlpha); + container.toggleClass("sp-clear-enabled", allowEmpty); + container.toggleClass("sp-buttons-disabled", !opts.showButtons); + container.toggleClass("sp-palette-buttons-disabled", !opts.togglePaletteOnly); + container.toggleClass("sp-palette-disabled", !opts.showPalette); + container.toggleClass("sp-palette-only", opts.showPaletteOnly); + container.toggleClass("sp-initial-disabled", !opts.showInitial); + container.addClass(opts.className).addClass(opts.containerClassName); + + reflow(); + } + + function initialize() { + + if (IE) { + container.find("*:not(input)").attr("unselectable", "on"); + } + + applyOptions(); + + if (shouldReplace) { + boundElement.after(replacer).hide(); + } + + if (!allowEmpty) { + clearButton.hide(); + } + + if (flat) { + boundElement.after(container).hide(); + } + else { + + var appendTo = opts.appendTo === "parent" ? boundElement.parent() : $(opts.appendTo); + if (appendTo.length !== 1) { + appendTo = $("body"); + } + + appendTo.append(container); + } + + updateSelectionPaletteFromStorage(); + + offsetElement.bind("click.spectrum touchstart.spectrum", function (e) { + if (!disabled) { + toggle(); + } + + e.stopPropagation(); + + if (!$(e.target).is("input")) { + e.preventDefault(); + } + }); + + if(boundElement.is(":disabled") || (opts.disabled === true)) { + disable(); + } + + // Prevent clicks from bubbling up to document. This would cause it to be hidden. + container.click(stopPropagation); + + // Handle user typed input + textInput.change(setFromTextInput); + textInput.bind("paste", function () { + setTimeout(setFromTextInput, 1); + }); + textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } }); + + cancelButton.text(opts.cancelText); + cancelButton.bind("click.spectrum", function (e) { + e.stopPropagation(); + e.preventDefault(); + revert(); + hide(); + }); + + clearButton.attr("title", opts.clearText); + clearButton.bind("click.spectrum", function (e) { + e.stopPropagation(); + e.preventDefault(); + isEmpty = true; + move(); + + if(flat) { + //for the flat style, this is a change event + updateOriginalInput(true); + } + }); + + chooseButton.text(opts.chooseText); + chooseButton.bind("click.spectrum", function (e) { + e.stopPropagation(); + e.preventDefault(); + + if (isValid()) { + updateOriginalInput(true); + hide(); + } + }); + + toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText); + toggleButton.bind("click.spectrum", function (e) { + e.stopPropagation(); + e.preventDefault(); + + opts.showPaletteOnly = !opts.showPaletteOnly; + + // To make sure the Picker area is drawn on the right, next to the + // Palette area (and not below the palette), first move the Palette + // to the left to make space for the picker, plus 5px extra. + // The 'applyOptions' function puts the whole container back into place + // and takes care of the button-text and the sp-palette-only CSS class. + if (!opts.showPaletteOnly && !flat) { + container.css('left', '-=' + (pickerContainer.outerWidth(true) + 5)); + } + applyOptions(); + }); + + draggable(alphaSlider, function (dragX, dragY, e) { + currentAlpha = (dragX / alphaWidth); + isEmpty = false; + if (e.shiftKey) { + currentAlpha = Math.round(currentAlpha * 10) / 10; + } + + move(); + }, dragStart, dragStop); + + draggable(slider, function (dragX, dragY) { + currentHue = parseFloat(dragY / slideHeight); + isEmpty = false; + if (!opts.showAlpha) { + currentAlpha = 1; + } + move(); + }, dragStart, dragStop); + + draggable(dragger, function (dragX, dragY, e) { + + // shift+drag should snap the movement to either the x or y axis. + if (!e.shiftKey) { + shiftMovementDirection = null; + } + else if (!shiftMovementDirection) { + var oldDragX = currentSaturation * dragWidth; + var oldDragY = dragHeight - (currentValue * dragHeight); + var furtherFromX = Math.abs(dragX - oldDragX) > Math.abs(dragY - oldDragY); + + shiftMovementDirection = furtherFromX ? "x" : "y"; + } + + var setSaturation = !shiftMovementDirection || shiftMovementDirection === "x"; + var setValue = !shiftMovementDirection || shiftMovementDirection === "y"; + + if (setSaturation) { + currentSaturation = parseFloat(dragX / dragWidth); + } + if (setValue) { + currentValue = parseFloat((dragHeight - dragY) / dragHeight); + } + + isEmpty = false; + if (!opts.showAlpha) { + currentAlpha = 1; + } + + move(); + + }, dragStart, dragStop); + + if (!!initialColor) { + set(initialColor); + + // In case color was black - update the preview UI and set the format + // since the set function will not run (default color is black). + updateUI(); + currentPreferredFormat = preferredFormat || tinycolor(initialColor).format; + + addColorToSelectionPalette(initialColor); + } + else { + updateUI(); + } + + if (flat) { + show(); + } + + function paletteElementClick(e) { + if (e.data && e.data.ignore) { + set($(e.target).closest(".sp-thumb-el").data("color")); + move(); + } + else { + set($(e.target).closest(".sp-thumb-el").data("color")); + move(); + updateOriginalInput(true); + if (opts.hideAfterPaletteSelect) { + hide(); + } + } + + return false; + } + + var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum"; + paletteContainer.delegate(".sp-thumb-el", paletteEvent, paletteElementClick); + initialColorContainer.delegate(".sp-thumb-el:nth-child(1)", paletteEvent, { ignore: true }, paletteElementClick); + } + + function updateSelectionPaletteFromStorage() { + + if (localStorageKey && window.localStorage) { + + // Migrate old palettes over to new format. May want to remove this eventually. + try { + var oldPalette = window.localStorage[localStorageKey].split(",#"); + if (oldPalette.length > 1) { + delete window.localStorage[localStorageKey]; + $.each(oldPalette, function(i, c) { + addColorToSelectionPalette(c); + }); + } + } + catch(e) { } + + try { + selectionPalette = window.localStorage[localStorageKey].split(";"); + } + catch (e) { } + } + } + + function addColorToSelectionPalette(color) { + if (showSelectionPalette) { + var rgb = tinycolor(color).toRgbString(); + if (!paletteLookup[rgb] && $.inArray(rgb, selectionPalette) === -1) { + selectionPalette.push(rgb); + while(selectionPalette.length > maxSelectionSize) { + selectionPalette.shift(); + } + } + + if (localStorageKey && window.localStorage) { + try { + window.localStorage[localStorageKey] = selectionPalette.join(";"); + } + catch(e) { } + } + } + } + + function getUniqueSelectionPalette() { + var unique = []; + if (opts.showPalette) { + for (var i = 0; i < selectionPalette.length; i++) { + var rgb = tinycolor(selectionPalette[i]).toRgbString(); + + if (!paletteLookup[rgb]) { + unique.push(selectionPalette[i]); + } + } + } + + return unique.reverse().slice(0, opts.maxSelectionSize); + } + + function drawPalette() { + + var currentColor = get(); + + var html = $.map(paletteArray, function (palette, i) { + return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i, opts); + }); + + updateSelectionPaletteFromStorage(); + + if (selectionPalette) { + html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection", opts)); + } + + paletteContainer.html(html.join("")); + } + + function drawInitial() { + if (opts.showInitial) { + var initial = colorOnShow; + var current = get(); + initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial", opts)); + } + } + + function dragStart() { + if (dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0) { + reflow(); + } + container.addClass(draggingClass); + shiftMovementDirection = null; + boundElement.trigger('dragstart.spectrum', [ get() ]); + } + + function dragStop() { + container.removeClass(draggingClass); + boundElement.trigger('dragstop.spectrum', [ get() ]); + } + + function setFromTextInput() { + + var value = textInput.val(); + + if ((value === null || value === "") && allowEmpty) { + set(null); + updateOriginalInput(true); + } + else { + var tiny = tinycolor(value); + if (tiny.isValid()) { + set(tiny); + updateOriginalInput(true); + } + else { + textInput.addClass("sp-validation-error"); + } + } + } + + function toggle() { + if (visible) { + hide(); + } + else { + show(); + } + } + + function show() { + var event = $.Event('beforeShow.spectrum'); + + if (visible) { + reflow(); + return; + } + + boundElement.trigger(event, [ get() ]); + + if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) { + return; + } + + hideAll(); + visible = true; + + $(doc).bind("click.spectrum", clickout); + $(window).bind("resize.spectrum", resize); + replacer.addClass("sp-active"); + container.removeClass("sp-hidden"); + + reflow(); + updateUI(); + + colorOnShow = get(); + + drawInitial(); + callbacks.show(colorOnShow); + boundElement.trigger('show.spectrum', [ colorOnShow ]); + } + + function clickout(e) { + // Return on right click. + if (e && e.type == "click" && e.button == 2) { return; } + + if (clickoutFiresChange) { + updateOriginalInput(true); + } + else { + revert(); + } + hide(); + } + + function hide() { + // Return if hiding is unnecessary + if (!visible || flat) { return; } + visible = false; + + $(doc).unbind("click.spectrum", clickout); + $(window).unbind("resize.spectrum", resize); + + replacer.removeClass("sp-active"); + container.addClass("sp-hidden"); + + callbacks.hide(get()); + boundElement.trigger('hide.spectrum', [ get() ]); + } + + function revert() { + set(colorOnShow, true); + } + + function set(color, ignoreFormatChange) { + if (tinycolor.equals(color, get())) { + // Update UI just in case a validation error needs + // to be cleared. + updateUI(); + return; + } + + var newColor, newHsv; + if (!color && allowEmpty) { + isEmpty = true; + } else { + isEmpty = false; + newColor = tinycolor(color); + newHsv = newColor.toHsv(); + + currentHue = (newHsv.h % 360) / 360; + currentSaturation = newHsv.s; + currentValue = newHsv.v; + currentAlpha = newHsv.a; + } + updateUI(); + + if (newColor && newColor.isValid() && !ignoreFormatChange) { + currentPreferredFormat = preferredFormat || newColor.getFormat(); + } + } + + function get(opts) { + opts = opts || { }; + + if (allowEmpty && isEmpty) { + return null; + } + + return tinycolor.fromRatio({ + h: currentHue, + s: currentSaturation, + v: currentValue, + a: Math.round(currentAlpha * 100) / 100 + }, { format: opts.format || currentPreferredFormat }); + } + + function isValid() { + return !textInput.hasClass("sp-validation-error"); + } + + function move() { + updateUI(); + + callbacks.move(get()); + boundElement.trigger('move.spectrum', [ get() ]); + } + + function updateUI() { + + textInput.removeClass("sp-validation-error"); + + updateHelperLocations(); + + // Update dragger background color (gradients take care of saturation and value). + var flatColor = tinycolor.fromRatio({ h: currentHue, s: 1, v: 1 }); + dragger.css("background-color", flatColor.toHexString()); + + // Get a format that alpha will be included in (hex and names ignore alpha) + var format = currentPreferredFormat; + if (currentAlpha < 1 && !(currentAlpha === 0 && format === "name")) { + if (format === "hex" || format === "hex3" || format === "hex6" || format === "name") { + format = "rgb"; + } + } + + var realColor = get({ format: format }), + displayColor = ''; + + //reset background info for preview element + previewElement.removeClass("sp-clear-display"); + previewElement.css('background-color', 'transparent'); + + if (!realColor && allowEmpty) { + // Update the replaced elements background with icon indicating no color selection + previewElement.addClass("sp-clear-display"); + } + else { + var realHex = realColor.toHexString(), + realRgb = realColor.toRgbString(); + + // Update the replaced elements background color (with actual selected color) + if (rgbaSupport || realColor.alpha === 1) { + previewElement.css("background-color", realRgb); + } + else { + previewElement.css("background-color", "transparent"); + previewElement.css("filter", realColor.toFilter()); + } + + if (opts.showAlpha) { + var rgb = realColor.toRgb(); + rgb.a = 0; + var realAlpha = tinycolor(rgb).toRgbString(); + var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")"; + + if (IE) { + alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex)); + } + else { + alphaSliderInner.css("background", "-webkit-" + gradient); + alphaSliderInner.css("background", "-moz-" + gradient); + alphaSliderInner.css("background", "-ms-" + gradient); + // Use current syntax gradient on unprefixed property. + alphaSliderInner.css("background", + "linear-gradient(to right, " + realAlpha + ", " + realHex + ")"); + } + } + + displayColor = realColor.toString(format); + } + + // Update the text entry input as it changes happen + if (opts.showInput) { + textInput.val(displayColor); + } + + if (opts.showPalette) { + drawPalette(); + } + + drawInitial(); + } + + function updateHelperLocations() { + var s = currentSaturation; + var v = currentValue; + + if(allowEmpty && isEmpty) { + //if selected color is empty, hide the helpers + alphaSlideHelper.hide(); + slideHelper.hide(); + dragHelper.hide(); + } + else { + //make sure helpers are visible + alphaSlideHelper.show(); + slideHelper.show(); + dragHelper.show(); + + // Where to show the little circle in that displays your current selected color + var dragX = s * dragWidth; + var dragY = dragHeight - (v * dragHeight); + dragX = Math.max( + -dragHelperHeight, + Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight) + ); + dragY = Math.max( + -dragHelperHeight, + Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight) + ); + dragHelper.css({ + "top": dragY + "px", + "left": dragX + "px" + }); + + var alphaX = currentAlpha * alphaWidth; + alphaSlideHelper.css({ + "left": (alphaX - (alphaSlideHelperWidth / 2)) + "px" + }); + + // Where to show the bar that displays your current selected hue + var slideY = (currentHue) * slideHeight; + slideHelper.css({ + "top": (slideY - slideHelperHeight) + "px" + }); + } + } + + function updateOriginalInput(fireCallback) { + var color = get(), + displayColor = '', + hasChanged = !tinycolor.equals(color, colorOnShow); + + if (color) { + displayColor = color.toString(currentPreferredFormat); + // Update the selection palette with the current color + addColorToSelectionPalette(color); + } + + if (isInput) { + boundElement.val(displayColor); + } + + if (fireCallback && hasChanged) { + callbacks.change(color); + boundElement.trigger('change', [ color ]); + } + } + + function reflow() { + dragWidth = dragger.width(); + dragHeight = dragger.height(); + dragHelperHeight = dragHelper.height(); + slideWidth = slider.width(); + slideHeight = slider.height(); + slideHelperHeight = slideHelper.height(); + alphaWidth = alphaSlider.width(); + alphaSlideHelperWidth = alphaSlideHelper.width(); + + if (!flat) { + container.css("position", "absolute"); + container.offset(getOffset(container, offsetElement)); + } + + updateHelperLocations(); + + if (opts.showPalette) { + drawPalette(); + } + + boundElement.trigger('reflow.spectrum'); + } + + function destroy() { + boundElement.show(); + offsetElement.unbind("click.spectrum touchstart.spectrum"); + container.remove(); + replacer.remove(); + spectrums[spect.id] = null; + } + + function option(optionName, optionValue) { + if (optionName === undefined) { + return $.extend({}, opts); + } + if (optionValue === undefined) { + return opts[optionName]; + } + + opts[optionName] = optionValue; + applyOptions(); + } + + function enable() { + disabled = false; + boundElement.attr("disabled", false); + offsetElement.removeClass("sp-disabled"); + } + + function disable() { + hide(); + disabled = true; + boundElement.attr("disabled", true); + offsetElement.addClass("sp-disabled"); + } + + initialize(); + + var spect = { + show: show, + hide: hide, + toggle: toggle, + reflow: reflow, + option: option, + enable: enable, + disable: disable, + set: function (c) { + set(c); + updateOriginalInput(); + }, + get: get, + destroy: destroy, + container: container + }; + + spect.id = spectrums.push(spect) - 1; + + return spect; + } + + /** + * checkOffset - get the offset below/above and left/right element depending on screen position + * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js + */ + function getOffset(picker, input) { + var extraY = 0; + var dpWidth = picker.outerWidth(); + var dpHeight = picker.outerHeight(); + var inputHeight = input.outerHeight(); + var doc = picker[0].ownerDocument; + var docElem = doc.documentElement; + var viewWidth = docElem.clientWidth + $(doc).scrollLeft(); + var viewHeight = docElem.clientHeight + $(doc).scrollTop(); + var offset = input.offset(); + offset.top += inputHeight; + + offset.left -= + Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + + offset.top -= + Math.min(offset.top, ((offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight - extraY) : extraY)); + + return offset; + } + + /** + * noop - do nothing + */ + function noop() { + + } + + /** + * stopPropagation - makes the code only doing this a little easier to read in line + */ + function stopPropagation(e) { + e.stopPropagation(); + } + + /** + * Create a function bound to a given object + * Thanks to underscore.js + */ + function bind(func, obj) { + var slice = Array.prototype.slice; + var args = slice.call(arguments, 2); + return function () { + return func.apply(obj, args.concat(slice.call(arguments))); + }; + } + + /** + * Lightweight drag helper. Handles containment within the element, so that + * when dragging, the x is within [0,element.width] and y is within [0,element.height] + */ + function draggable(element, onmove, onstart, onstop) { + onmove = onmove || function () { }; + onstart = onstart || function () { }; + onstop = onstop || function () { }; + var doc = document; + var dragging = false; + var offset = {}; + var maxHeight = 0; + var maxWidth = 0; + var hasTouch = ('ontouchstart' in window); + + var duringDragEvents = {}; + duringDragEvents["selectstart"] = prevent; + duringDragEvents["dragstart"] = prevent; + duringDragEvents["touchmove mousemove"] = move; + duringDragEvents["touchend mouseup"] = stop; + + function prevent(e) { + if (e.stopPropagation) { + e.stopPropagation(); + } + if (e.preventDefault) { + e.preventDefault(); + } + e.returnValue = false; + } + + function move(e) { + if (dragging) { + // Mouseup happened outside of window + if (IE && doc.documentMode < 9 && !e.button) { + return stop(); + } + + var touches = e.originalEvent.touches; + var pageX = touches ? touches[0].pageX : e.pageX; + var pageY = touches ? touches[0].pageY : e.pageY; + + var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth)); + var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight)); + + if (hasTouch) { + // Stop scrolling in iOS + prevent(e); + } + + onmove.apply(element, [dragX, dragY, e]); + } + } + + function start(e) { + var rightclick = (e.which) ? (e.which == 3) : (e.button == 2); + + if (!rightclick && !dragging) { + if (onstart.apply(element, arguments) !== false) { + dragging = true; + maxHeight = $(element).height(); + maxWidth = $(element).width(); + offset = $(element).offset(); + + $(doc).bind(duringDragEvents); + $(doc.body).addClass("sp-dragging"); + + if (!hasTouch) { + move(e); + } + + prevent(e); + } + } + } + + function stop() { + if (dragging) { + $(doc).unbind(duringDragEvents); + $(doc.body).removeClass("sp-dragging"); + onstop.apply(element, arguments); + } + dragging = false; + } + + $(element).bind("touchstart mousedown", start); + } + + function throttle(func, wait, debounce) { + var timeout; + return function () { + var context = this, args = arguments; + var throttler = function () { + timeout = null; + func.apply(context, args); + }; + if (debounce) clearTimeout(timeout); + if (debounce || !timeout) timeout = setTimeout(throttler, wait); + }; + } + + /** + * Define a jQuery plugin + */ + var dataID = "spectrum.id"; + $.fn.spectrum = function (opts, extra) { + + if (typeof opts == "string") { + + var returnValue = this; + var args = Array.prototype.slice.call( arguments, 1 ); + + this.each(function () { + var spect = spectrums[$(this).data(dataID)]; + if (spect) { + var method = spect[opts]; + if (!method) { + throw new Error( "Spectrum: no such method: '" + opts + "'" ); + } + + if (opts == "get") { + returnValue = spect.get(); + } + else if (opts == "container") { + returnValue = spect.container; + } + else if (opts == "option") { + returnValue = spect.option.apply(spect, args); + } + else if (opts == "destroy") { + spect.destroy(); + $(this).removeData(dataID); + } + else { + method.apply(spect, args); + } + } + }); + + return returnValue; + } + + // Initializing a new instance of spectrum + return this.spectrum("destroy").each(function () { + var options = $.extend({}, opts, $(this).data()); + var spect = spectrum(this, options); + $(this).data(dataID, spect.id); + }); + }; + + $.fn.spectrum.load = true; + $.fn.spectrum.loadOpts = {}; + $.fn.spectrum.draggable = draggable; + $.fn.spectrum.defaults = defaultOpts; + + $.spectrum = { }; + $.spectrum.localization = { }; + $.spectrum.palettes = { }; + + $.fn.spectrum.processNativeColorInputs = function () { + if (!inputTypeColorSupport) { + $("input[type=color]").spectrum({ + preferredFormat: "hex6" + }); + } + }; + + // TinyColor v1.0.0 + // https://github.com/bgrins/TinyColor + // Brian Grinstead, MIT License + + (function() { + + var trimLeft = /^[\s,#]+/, + trimRight = /\s+$/, + tinyCounter = 0, + math = Math, + mathRound = math.round, + mathMin = math.min, + mathMax = math.max, + mathRandom = math.random; + + var tinycolor = function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (color instanceof tinycolor) { + return color; + } + // If we are called as a function, call using new instead + if (!(this instanceof tinycolor)) { + return new tinycolor(color, opts); + } + + var rgb = inputToRGB(color); + this._r = rgb.r, + this._g = rgb.g, + this._b = rgb.b, + this._a = rgb.a, + this._roundA = mathRound(100*this._a) / 100, + this._format = opts.format || rgb.format; + this._gradientType = opts.gradientType; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by `inputToRgb` + if (this._r < 1) { this._r = mathRound(this._r); } + if (this._g < 1) { this._g = mathRound(this._g); } + if (this._b < 1) { this._b = mathRound(this._b); } + + this._ok = rgb.ok; + this._tc_id = tinyCounter++; + }; + + tinycolor.prototype = { + isDark: function() { + return this.getBrightness() < 128; + }, + isLight: function() { + return !this.isDark(); + }, + isValid: function() { + return this._ok; + }, + getFormat: function() { + return this._format; + }, + getAlpha: function() { + return this._a; + }, + getBrightness: function() { + var rgb = this.toRgb(); + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; + }, + setAlpha: function(value) { + this._a = boundAlpha(value); + this._roundA = mathRound(100*this._a) / 100; + return this; + }, + toHsv: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (this._a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; + }, + toHslString: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (this._a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(this._r, this._g, this._b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function() { + return rgbaToHex(this._r, this._g, this._b, this._a); + }, + toHex8String: function() { + return '#' + this.toHex8(); + }, + toRgb: function() { + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; + }, + toRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; + }, + toPercentageRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; + }, + toName: function() { + if (this._a === 0) { + return "transparent"; + } + + if (this._a < 1) { + return false; + } + + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToHex(this._r, this._g, this._b, this._a); + var secondHex8String = hex8String; + var gradientType = this._gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = s.toHex8String(); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this._format; + + var formattedString = false; + var hasAlpha = this._a < 1 && this._a >= 0; + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "name"); + + if (needsAlphaFormat) { + // Special case for "transparent", all other non-alpha formats + // will return rgba when there is transparency. + if (format === "name" && this._a === 0) { + return this.toName(); + } + return this.toRgbString(); + } + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + return formattedString || this.toHexString(); + }, + + _applyModification: function(fn, args) { + var color = fn.apply(null, [this].concat([].slice.call(args))); + this._r = color._r; + this._g = color._g; + this._b = color._b; + this.setAlpha(color._a); + return this; + }, + lighten: function() { + return this._applyModification(lighten, arguments); + }, + brighten: function() { + return this._applyModification(brighten, arguments); + }, + darken: function() { + return this._applyModification(darken, arguments); + }, + desaturate: function() { + return this._applyModification(desaturate, arguments); + }, + saturate: function() { + return this._applyModification(saturate, arguments); + }, + greyscale: function() { + return this._applyModification(greyscale, arguments); + }, + spin: function() { + return this._applyModification(spin, arguments); + }, + + _applyCombination: function(fn, args) { + return fn.apply(null, [this].concat([].slice.call(args))); + }, + analogous: function() { + return this._applyCombination(analogous, arguments); + }, + complement: function() { + return this._applyCombination(complement, arguments); + }, + monochromatic: function() { + return this._applyCombination(monochromatic, arguments); + }, + splitcomplement: function() { + return this._applyCombination(splitcomplement, arguments); + }, + triad: function() { + return this._applyCombination(triad, arguments); + }, + tetrad: function() { + return this._applyCombination(tetrad, arguments); + } + }; + + // If input is an object, force 1 into "1.0" to handle ratios properly + // String input requires "1.0" as input, so 1 will be treated as 1 + tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); + }; + + // Given a string or object, convert that input to RGB + // Possible string inputs: + // + // "red" + // "#f00" or "f00" + // "#ff0000" or "ff0000" + // "#ff000000" or "ff000000" + // "rgb 255 0 0" or "rgb (255, 0, 0)" + // "rgb 1.0 0 0" or "rgb (1, 0, 0)" + // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" + // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" + // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" + // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" + // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" + // + function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) { + color.s = convertToPercentage(color.s); + color.v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, color.s, color.v); + ok = true; + format = "hsv"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) { + color.s = convertToPercentage(color.s); + color.l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, color.s, color.l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; + } + + + // Conversion Functions + // -------------------- + + // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: + // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript> + + // `rgbToRgb` + // Handle bounds / percentage checking to conform to CSS color spec + // <http://www.w3.org/TR/css3-color/> + // *Assumes:* r, g, b in [0, 255] or [0, 1] + // *Returns:* { r, g, b } in [0, 255] + function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; + } + + // `rgbToHsl` + // Converts an RGB color value to HSL. + // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] + // *Returns:* { h, s, l } in [0,1] + function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; + } + + // `hslToRgb` + // Converts an HSL color value to RGB. + // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] + // *Returns:* { r, g, b } in the set [0, 255] + function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; + } + + // `rgbToHsv` + // Converts an RGB color value to HSV + // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] + // *Returns:* { h, s, v } in [0,1] + function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; + } + + // `hsvToRgb` + // Converts an HSV color value to RGB. + // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] + // *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; + } + + // `rgbToHex` + // Converts an RGB color to hex + // Assumes r, g, and b are contained in the set [0, 255] + // Returns a 3 or 6 character hex + function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); + } + // `rgbaToHex` + // Converts an RGBA color plus alpha transparency to hex + // Assumes r, g, b and a are contained in the set [0, 255] + // Returns an 8 character hex + function rgbaToHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); + } + + // `equals` + // Can be called with any tinycolor input + tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); + }; + tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); + }; + + + // Modification Functions + // ---------------------- + // Thanks to less.js for some of the basics here + // <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js> + + function desaturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); + } + + function saturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); + } + + function greyscale(color) { + return tinycolor(color).desaturate(100); + } + + function lighten (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); + } + + function brighten(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var rgb = tinycolor(color).toRgb(); + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); + return tinycolor(rgb); + } + + function darken (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); + } + + // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. + // Values outside of this range will be wrapped into this range. + function spin(color, amount) { + var hsl = tinycolor(color).toHsl(); + var hue = (mathRound(hsl.h) + amount) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return tinycolor(hsl); + } + + // Combination Functions + // --------------------- + // Thanks to jQuery xColor for some of the ideas behind these + // <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js> + + function complement(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); + } + + function triad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; + } + + function tetrad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; + } + + function splitcomplement(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; + } + + function analogous(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; + } + + function monochromatic(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; + } + + // Utility Functions + // --------------------- + + tinycolor.mix = function(color1, color2, amount) { + amount = (amount === 0) ? 0 : (amount || 50); + + var rgb1 = tinycolor(color1).toRgb(); + var rgb2 = tinycolor(color2).toRgb(); + + var p = amount / 100; + var w = p * 2 - 1; + var a = rgb2.a - rgb1.a; + + var w1; + + if (w * a == -1) { + w1 = w; + } else { + w1 = (w + a) / (1 + w * a); + } + + w1 = (w1 + 1) / 2; + + var w2 = 1 - w1; + + var rgba = { + r: rgb2.r * w1 + rgb1.r * w2, + g: rgb2.g * w1 + rgb1.g * w2, + b: rgb2.b * w1 + rgb1.b * w2, + a: rgb2.a * p + rgb1.a * (1 - p) + }; + + return tinycolor(rgba); + }; + + + // Readability Functions + // --------------------- + // <http://www.w3.org/TR/AERT#color-contrast> + + // `readability` + // Analyze the 2 colors and returns an object with the following properties: + // `brightness`: difference in brightness between the two colors + // `color`: difference in color/hue between the two colors + tinycolor.readability = function(color1, color2) { + var c1 = tinycolor(color1); + var c2 = tinycolor(color2); + var rgb1 = c1.toRgb(); + var rgb2 = c2.toRgb(); + var brightnessA = c1.getBrightness(); + var brightnessB = c2.getBrightness(); + var colorDiff = ( + Math.max(rgb1.r, rgb2.r) - Math.min(rgb1.r, rgb2.r) + + Math.max(rgb1.g, rgb2.g) - Math.min(rgb1.g, rgb2.g) + + Math.max(rgb1.b, rgb2.b) - Math.min(rgb1.b, rgb2.b) + ); + + return { + brightness: Math.abs(brightnessA - brightnessB), + color: colorDiff + }; + }; + + // `readable` + // http://www.w3.org/TR/AERT#color-contrast + // Ensure that foreground and background color combinations provide sufficient contrast. + // *Example* + // tinycolor.isReadable("#000", "#111") => false + tinycolor.isReadable = function(color1, color2) { + var readability = tinycolor.readability(color1, color2); + return readability.brightness > 125 && readability.color > 500; + }; + + // `mostReadable` + // Given a base color and a list of possible foreground or background + // colors for that base, returns the most readable color. + // *Example* + // tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000" + tinycolor.mostReadable = function(baseColor, colorList) { + var bestColor = null; + var bestScore = 0; + var bestIsReadable = false; + for (var i=0; i < colorList.length; i++) { + + // We normalize both around the "acceptable" breaking point, + // but rank brightness constrast higher than hue. + + var readability = tinycolor.readability(baseColor, colorList[i]); + var readable = readability.brightness > 125 && readability.color > 500; + var score = 3 * (readability.brightness / 125) + (readability.color / 500); + + if ((readable && ! bestIsReadable) || + (readable && bestIsReadable && score > bestScore) || + ((! readable) && (! bestIsReadable) && score > bestScore)) { + bestIsReadable = readable; + bestScore = score; + bestColor = tinycolor(colorList[i]); + } + } + return bestColor; + }; + + + // Big List of Colors + // ------------------ + // <http://www.w3.org/TR/css3-color/#svg-color> + var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" + }; + + // Make it easy to access colors via `hexNames[hex]` + var hexNames = tinycolor.hexNames = flip(names); + + + // Utilities + // --------- + + // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` + function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; + } + + // Return a valid alpha value [0,1] with all invalid values being set to 1 + function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; + } + + // Take input from [0, n] and return it as [0, 1] + function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); + } + + // Force a number between 0 and 1 + function clamp01(val) { + return mathMin(1, mathMax(0, val)); + } + + // Parse a base-16 hex value into a base-10 integer + function parseIntFromHex(val) { + return parseInt(val, 16); + } + + // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 + // <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0> + function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; + } + + // Check to see if string passed in is a percentage + function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; + } + + // Force a hex value to have 2 characters + function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; + } + + // Replace a decimal with it's percentage value + function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; + } + + // Converts a decimal to a hex value + function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); + } + // Converts a hex value to a decimal + function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); + } + + var matchers = (function() { + + // <http://www.w3.org/TR/css3-values/#integers> + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // <http://www.w3.org/TR/css3-values/#number-value> + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; + })(); + + // `stringInputToObject` + // Permissive string parsing. Take in a number of formats, and output an object + // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` + function stringInputToObject(color) { + + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + a: convertHexToDecimal(match[1]), + r: parseIntFromHex(match[2]), + g: parseIntFromHex(match[3]), + b: parseIntFromHex(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; + } + + window.tinycolor = tinycolor; + })(); + + + $(function () { + if ($.fn.spectrum.load) { + $.fn.spectrum.processNativeColorInputs(); + } + }); + +})(window, jQuery); diff --git a/public/static/modelView/js/three.js b/public/static/modelView/js/three.js new file mode 100644 index 0000000..bacc020 --- /dev/null +++ b/public/static/modelView/js/three.js @@ -0,0 +1,39472 @@ +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + ? factory(exports) + : typeof define === 'function' && define.amd + ? define(['exports'], factory) + : factory((global.THREE = {})) +})(this, function (exports) { + 'use strict' + + // Polyfills + + if (Number.EPSILON === undefined) { + Number.EPSILON = Math.pow(2, -52) + } + + if (Number.isInteger === undefined) { + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + + Number.isInteger = function (value) { + return typeof value === 'number' && isFinite(value) && Math.floor(value) === value + } + } + + // + + if (Math.sign === undefined) { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function (x) { + return x < 0 ? -1 : x > 0 ? 1 : +x + } + } + + if ('name' in Function.prototype === false) { + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty(Function.prototype, 'name', { + get: function () { + return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1] + } + }) + } + + if (Object.assign === undefined) { + // Missing in IE + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ;(function () { + Object.assign = function (target) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object') + } + + var output = Object(target) + + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index] + + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (Object.prototype.hasOwnProperty.call(source, nextKey)) { + output[nextKey] = source[nextKey] + } + } + } + } + + return output + } + })() + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign(EventDispatcher.prototype, { + addEventListener: function (type, listener) { + if (this._listeners === undefined) this._listeners = {} + + var listeners = this._listeners + + if (listeners[type] === undefined) { + listeners[type] = [] + } + + if (listeners[type].indexOf(listener) === -1) { + listeners[type].push(listener) + } + }, + + hasEventListener: function (type, listener) { + if (this._listeners === undefined) return false + + var listeners = this._listeners + + return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1 + }, + + removeEventListener: function (type, listener) { + if (this._listeners === undefined) return + + var listeners = this._listeners + var listenerArray = listeners[type] + + if (listenerArray !== undefined) { + var index = listenerArray.indexOf(listener) + + if (index !== -1) { + listenerArray.splice(index, 1) + } + } + }, + + dispatchEvent: function (event) { + if (this._listeners === undefined) return + + var listeners = this._listeners + var listenerArray = listeners[event.type] + + if (listenerArray !== undefined) { + event.target = this + + var array = listenerArray.slice(0) + + for (var i = 0, l = array.length; i < l; i++) { + array[i].call(this, event) + } + } + } + }) + + var REVISION = '90' + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 } + var CullFaceNone = 0 + var CullFaceBack = 1 + var CullFaceFront = 2 + var CullFaceFrontBack = 3 + var FrontFaceDirectionCW = 0 + var FrontFaceDirectionCCW = 1 + var BasicShadowMap = 0 + var PCFShadowMap = 1 + var PCFSoftShadowMap = 2 + var FrontSide = 0 + var BackSide = 1 + var DoubleSide = 2 + var FlatShading = 1 + var SmoothShading = 2 + var NoColors = 0 + var FaceColors = 1 + var VertexColors = 2 + var NoBlending = 0 + var NormalBlending = 1 + var AdditiveBlending = 2 + var SubtractiveBlending = 3 + var MultiplyBlending = 4 + var CustomBlending = 5 + var AddEquation = 100 + var SubtractEquation = 101 + var ReverseSubtractEquation = 102 + var MinEquation = 103 + var MaxEquation = 104 + var ZeroFactor = 200 + var OneFactor = 201 + var SrcColorFactor = 202 + var OneMinusSrcColorFactor = 203 + var SrcAlphaFactor = 204 + var OneMinusSrcAlphaFactor = 205 + var DstAlphaFactor = 206 + var OneMinusDstAlphaFactor = 207 + var DstColorFactor = 208 + var OneMinusDstColorFactor = 209 + var SrcAlphaSaturateFactor = 210 + var NeverDepth = 0 + var AlwaysDepth = 1 + var LessDepth = 2 + var LessEqualDepth = 3 + var EqualDepth = 4 + var GreaterEqualDepth = 5 + var GreaterDepth = 6 + var NotEqualDepth = 7 + var MultiplyOperation = 0 + var MixOperation = 1 + var AddOperation = 2 + var NoToneMapping = 0 + var LinearToneMapping = 1 + var ReinhardToneMapping = 2 + var Uncharted2ToneMapping = 3 + var CineonToneMapping = 4 + var UVMapping = 300 + var CubeReflectionMapping = 301 + var CubeRefractionMapping = 302 + var EquirectangularReflectionMapping = 303 + var EquirectangularRefractionMapping = 304 + var SphericalReflectionMapping = 305 + var CubeUVReflectionMapping = 306 + var CubeUVRefractionMapping = 307 + var RepeatWrapping = 1000 + var ClampToEdgeWrapping = 1001 + var MirroredRepeatWrapping = 1002 + var NearestFilter = 1003 + var NearestMipMapNearestFilter = 1004 + var NearestMipMapLinearFilter = 1005 + var LinearFilter = 1006 + var LinearMipMapNearestFilter = 1007 + var LinearMipMapLinearFilter = 1008 + var UnsignedByteType = 1009 + var ByteType = 1010 + var ShortType = 1011 + var UnsignedShortType = 1012 + var IntType = 1013 + var UnsignedIntType = 1014 + var FloatType = 1015 + var HalfFloatType = 1016 + var UnsignedShort4444Type = 1017 + var UnsignedShort5551Type = 1018 + var UnsignedShort565Type = 1019 + var UnsignedInt248Type = 1020 + var AlphaFormat = 1021 + var RGBFormat = 1022 + var RGBAFormat = 1023 + var LuminanceFormat = 1024 + var LuminanceAlphaFormat = 1025 + var RGBEFormat = RGBAFormat + var DepthFormat = 1026 + var DepthStencilFormat = 1027 + var RGB_S3TC_DXT1_Format = 33776 + var RGBA_S3TC_DXT1_Format = 33777 + var RGBA_S3TC_DXT3_Format = 33778 + var RGBA_S3TC_DXT5_Format = 33779 + var RGB_PVRTC_4BPPV1_Format = 35840 + var RGB_PVRTC_2BPPV1_Format = 35841 + var RGBA_PVRTC_4BPPV1_Format = 35842 + var RGBA_PVRTC_2BPPV1_Format = 35843 + var RGB_ETC1_Format = 36196 + var RGBA_ASTC_4x4_Format = 37808 + var RGBA_ASTC_5x4_Format = 37809 + var RGBA_ASTC_5x5_Format = 37810 + var RGBA_ASTC_6x5_Format = 37811 + var RGBA_ASTC_6x6_Format = 37812 + var RGBA_ASTC_8x5_Format = 37813 + var RGBA_ASTC_8x6_Format = 37814 + var RGBA_ASTC_8x8_Format = 37815 + var RGBA_ASTC_10x5_Format = 37816 + var RGBA_ASTC_10x6_Format = 37817 + var RGBA_ASTC_10x8_Format = 37818 + var RGBA_ASTC_10x10_Format = 37819 + var RGBA_ASTC_12x10_Format = 37820 + var RGBA_ASTC_12x12_Format = 37821 + var LoopOnce = 2200 + var LoopRepeat = 2201 + var LoopPingPong = 2202 + var InterpolateDiscrete = 2300 + var InterpolateLinear = 2301 + var InterpolateSmooth = 2302 + var ZeroCurvatureEnding = 2400 + var ZeroSlopeEnding = 2401 + var WrapAroundEnding = 2402 + var TrianglesDrawMode = 0 + var TriangleStripDrawMode = 1 + var TriangleFanDrawMode = 2 + var LinearEncoding = 3000 + var sRGBEncoding = 3001 + var GammaEncoding = 3007 + var RGBEEncoding = 3002 + var LogLuvEncoding = 3003 + var RGBM7Encoding = 3004 + var RGBM16Encoding = 3005 + var RGBDEncoding = 3006 + var BasicDepthPacking = 3200 + var RGBADepthPacking = 3201 + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: (function () { + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 + + var lut = [] + + for (var i = 0; i < 256; i++) { + lut[i] = (i < 16 ? '0' : '') + i.toString(16).toUpperCase() + } + + return function generateUUID() { + var d0 = (Math.random() * 0xffffffff) | 0 + var d1 = (Math.random() * 0xffffffff) | 0 + var d2 = (Math.random() * 0xffffffff) | 0 + var d3 = (Math.random() * 0xffffffff) | 0 + return ( + lut[d0 & 0xff] + + lut[(d0 >> 8) & 0xff] + + lut[(d0 >> 16) & 0xff] + + lut[(d0 >> 24) & 0xff] + + '-' + + lut[d1 & 0xff] + + lut[(d1 >> 8) & 0xff] + + '-' + + lut[((d1 >> 16) & 0x0f) | 0x40] + + lut[(d1 >> 24) & 0xff] + + '-' + + lut[(d2 & 0x3f) | 0x80] + + lut[(d2 >> 8) & 0xff] + + '-' + + lut[(d2 >> 16) & 0xff] + + lut[(d2 >> 24) & 0xff] + + lut[d3 & 0xff] + + lut[(d3 >> 8) & 0xff] + + lut[(d3 >> 16) & 0xff] + + lut[(d3 >> 24) & 0xff] + ) + } + })(), + + clamp: function (value, min, max) { + return Math.max(min, Math.min(max, value)) + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function (n, m) { + return ((n % m) + m) % m + }, + + // Linear mapping from range <a1, a2> to range <b1, b2> + + mapLinear: function (x, a1, a2, b1, b2) { + return b1 + ((x - a1) * (b2 - b1)) / (a2 - a1) + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function (x, y, t) { + return (1 - t) * x + t * y + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function (x, min, max) { + if (x <= min) return 0 + if (x >= max) return 1 + + x = (x - min) / (max - min) + + return x * x * (3 - 2 * x) + }, + + smootherstep: function (x, min, max) { + if (x <= min) return 0 + if (x >= max) return 1 + + x = (x - min) / (max - min) + + return x * x * x * (x * (x * 6 - 15) + 10) + }, + + // Random integer from <low, high> interval + + randInt: function (low, high) { + return low + Math.floor(Math.random() * (high - low + 1)) + }, + + // Random float from <low, high> interval + + randFloat: function (low, high) { + return low + Math.random() * (high - low) + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function (range) { + return range * (0.5 - Math.random()) + }, + + degToRad: function (degrees) { + return degrees * _Math.DEG2RAD + }, + + radToDeg: function (radians) { + return radians * _Math.RAD2DEG + }, + + isPowerOfTwo: function (value) { + return (value & (value - 1)) === 0 && value !== 0 + }, + + ceilPowerOfTwo: function (value) { + return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)) + }, + + floorPowerOfTwo: function (value) { + return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)) + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2(x, y) { + this.x = x || 0 + this.y = y || 0 + } + + Object.defineProperties(Vector2.prototype, { + width: { + get: function () { + return this.x + }, + + set: function (value) { + this.x = value + } + }, + + height: { + get: function () { + return this.y + }, + + set: function (value) { + this.y = value + } + } + }) + + Object.assign(Vector2.prototype, { + isVector2: true, + + set: function (x, y) { + this.x = x + this.y = y + + return this + }, + + setScalar: function (scalar) { + this.x = scalar + this.y = scalar + + return this + }, + + setX: function (x) { + this.x = x + + return this + }, + + setY: function (y) { + this.y = y + + return this + }, + + setComponent: function (index, value) { + switch (index) { + case 0: + this.x = value + break + case 1: + this.y = value + break + default: + throw new Error('index is out of range: ' + index) + } + + return this + }, + + getComponent: function (index) { + switch (index) { + case 0: + return this.x + case 1: + return this.y + default: + throw new Error('index is out of range: ' + index) + } + }, + + clone: function () { + return new this.constructor(this.x, this.y) + }, + + copy: function (v) { + this.x = v.x + this.y = v.y + + return this + }, + + add: function (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' + ) + return this.addVectors(v, w) + } + + this.x += v.x + this.y += v.y + + return this + }, + + addScalar: function (s) { + this.x += s + this.y += s + + return this + }, + + addVectors: function (a, b) { + this.x = a.x + b.x + this.y = a.y + b.y + + return this + }, + + addScaledVector: function (v, s) { + this.x += v.x * s + this.y += v.y * s + + return this + }, + + sub: function (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' + ) + return this.subVectors(v, w) + } + + this.x -= v.x + this.y -= v.y + + return this + }, + + subScalar: function (s) { + this.x -= s + this.y -= s + + return this + }, + + subVectors: function (a, b) { + this.x = a.x - b.x + this.y = a.y - b.y + + return this + }, + + multiply: function (v) { + this.x *= v.x + this.y *= v.y + + return this + }, + + multiplyScalar: function (scalar) { + this.x *= scalar + this.y *= scalar + + return this + }, + + divide: function (v) { + this.x /= v.x + this.y /= v.y + + return this + }, + + divideScalar: function (scalar) { + return this.multiplyScalar(1 / scalar) + }, + + applyMatrix3: function (m) { + var x = this.x, + y = this.y + var e = m.elements + + this.x = e[0] * x + e[3] * y + e[6] + this.y = e[1] * x + e[4] * y + e[7] + + return this + }, + + min: function (v) { + this.x = Math.min(this.x, v.x) + this.y = Math.min(this.y, v.y) + + return this + }, + + max: function (v) { + this.x = Math.max(this.x, v.x) + this.y = Math.max(this.y, v.y) + + return this + }, + + clamp: function (min, max) { + // assumes min < max, componentwise + + this.x = Math.max(min.x, Math.min(max.x, this.x)) + this.y = Math.max(min.y, Math.min(max.y, this.y)) + + return this + }, + + clampScalar: (function () { + var min = new Vector2() + var max = new Vector2() + + return function clampScalar(minVal, maxVal) { + min.set(minVal, minVal) + max.set(maxVal, maxVal) + + return this.clamp(min, max) + } + })(), + + clampLength: function (min, max) { + var length = this.length() + + return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length))) + }, + + 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 + }, + + roundToZero: function () { + this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x) + this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y) + + return this + }, + + negate: function () { + this.x = -this.x + this.y = -this.y + + return this + }, + + dot: function (v) { + return this.x * v.x + this.y * v.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) + }, + + manhattanLength: function () { + return Math.abs(this.x) + Math.abs(this.y) + }, + + normalize: function () { + return this.divideScalar(this.length() || 1) + }, + + angle: function () { + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2(this.y, this.x) + + if (angle < 0) angle += 2 * Math.PI + + return angle + }, + + distanceTo: function (v) { + return Math.sqrt(this.distanceToSquared(v)) + }, + + distanceToSquared: function (v) { + var dx = this.x - v.x, + dy = this.y - v.y + return dx * dx + dy * dy + }, + + manhattanDistanceTo: function (v) { + return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + }, + + setLength: function (length) { + return this.normalize().multiplyScalar(length) + }, + + lerp: function (v, alpha) { + this.x += (v.x - this.x) * alpha + this.y += (v.y - this.y) * alpha + + return this + }, + + lerpVectors: function (v1, v2, alpha) { + return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1) + }, + + equals: function (v) { + return v.x === this.x && v.y === this.y + }, + + fromArray: function (array, offset) { + if (offset === undefined) offset = 0 + + this.x = array[offset] + this.y = array[offset + 1] + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + array[offset] = this.x + array[offset + 1] = this.y + + return array + }, + + fromBufferAttribute: function (attribute, index, offset) { + if (offset !== undefined) { + console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().') + } + + this.x = attribute.getX(index) + this.y = attribute.getY(index) + + return this + }, + + rotateAround: function (center, angle) { + var c = Math.cos(angle), + s = Math.sin(angle) + + var x = this.x - center.x + var y = this.y - center.y + + this.x = x * c - y * s + center.x + this.y = x * s + y * c + center.y + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] + + if (arguments.length > 0) { + console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.') + } + } + + Object.assign(Matrix4.prototype, { + isMatrix4: true, + + set: function (n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { + var te = this.elements + + te[0] = n11 + te[4] = n12 + te[8] = n13 + te[12] = n14 + te[1] = n21 + te[5] = n22 + te[9] = n23 + te[13] = n24 + te[2] = n31 + te[6] = n32 + te[10] = n33 + te[14] = n34 + te[3] = n41 + te[7] = n42 + te[11] = n43 + te[15] = n44 + + return this + }, + + identity: function () { + this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) + + return this + }, + + clone: function () { + return new Matrix4().fromArray(this.elements) + }, + + copy: function (m) { + var te = this.elements + var me = m.elements + + te[0] = me[0] + te[1] = me[1] + te[2] = me[2] + te[3] = me[3] + te[4] = me[4] + te[5] = me[5] + te[6] = me[6] + te[7] = me[7] + te[8] = me[8] + te[9] = me[9] + te[10] = me[10] + te[11] = me[11] + te[12] = me[12] + te[13] = me[13] + te[14] = me[14] + te[15] = me[15] + + return this + }, + + copyPosition: function (m) { + var te = this.elements, + me = m.elements + + te[12] = me[12] + te[13] = me[13] + te[14] = me[14] + + return this + }, + + extractBasis: function (xAxis, yAxis, zAxis) { + xAxis.setFromMatrixColumn(this, 0) + yAxis.setFromMatrixColumn(this, 1) + zAxis.setFromMatrixColumn(this, 2) + + return this + }, + + makeBasis: function (xAxis, yAxis, zAxis) { + this.set( + xAxis.x, + yAxis.x, + zAxis.x, + 0, + xAxis.y, + yAxis.y, + zAxis.y, + 0, + xAxis.z, + yAxis.z, + zAxis.z, + 0, + 0, + 0, + 0, + 1 + ) + + return this + }, + + extractRotation: (function () { + var v1 = new Vector3() + + return function extractRotation(m) { + var te = this.elements + var me = m.elements + + var scaleX = 1 / v1.setFromMatrixColumn(m, 0).length() + var scaleY = 1 / v1.setFromMatrixColumn(m, 1).length() + var scaleZ = 1 / v1.setFromMatrixColumn(m, 2).length() + + te[0] = me[0] * scaleX + te[1] = me[1] * scaleX + te[2] = me[2] * scaleX + + te[4] = me[4] * scaleY + te[5] = me[5] * scaleY + te[6] = me[6] * scaleY + + te[8] = me[8] * scaleZ + te[9] = me[9] * scaleZ + te[10] = me[10] * scaleZ + + return this + } + })(), + + makeRotationFromEuler: function (euler) { + if (!(euler && euler.isEuler)) { + console.error( + 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' + ) + } + + var te = this.elements + + var x = euler.x, + y = euler.y, + z = euler.z + var a = Math.cos(x), + b = Math.sin(x) + var c = Math.cos(y), + d = Math.sin(y) + var e = Math.cos(z), + f = Math.sin(z) + + if (euler.order === 'XYZ') { + var ae = a * e, + af = a * f, + be = b * e, + bf = b * f + + te[0] = c * e + te[4] = -c * f + te[8] = d + + te[1] = af + be * d + te[5] = ae - bf * d + te[9] = -b * c + + te[2] = bf - ae * d + te[6] = be + af * d + te[10] = a * c + } else if (euler.order === 'YXZ') { + var ce = c * e, + cf = c * f, + de = d * e, + df = d * f + + te[0] = ce + df * b + te[4] = de * b - cf + te[8] = a * d + + te[1] = a * f + te[5] = a * e + te[9] = -b + + te[2] = cf * b - de + te[6] = df + ce * b + te[10] = a * c + } else if (euler.order === 'ZXY') { + var ce = c * e, + cf = c * f, + de = d * e, + df = d * f + + te[0] = ce - df * b + te[4] = -a * f + te[8] = de + cf * b + + te[1] = cf + de * b + te[5] = a * e + te[9] = df - ce * b + + te[2] = -a * d + te[6] = b + te[10] = a * c + } else if (euler.order === 'ZYX') { + var ae = a * e, + af = a * f, + be = b * e, + bf = b * f + + te[0] = c * e + te[4] = be * d - af + te[8] = ae * d + bf + + te[1] = c * f + te[5] = bf * d + ae + te[9] = af * d - be + + te[2] = -d + te[6] = b * c + te[10] = a * c + } else if (euler.order === 'YZX') { + var ac = a * c, + ad = a * d, + bc = b * c, + bd = b * d + + te[0] = c * e + te[4] = bd - ac * f + te[8] = bc * f + ad + + te[1] = f + te[5] = a * e + te[9] = -b * e + + te[2] = -d * e + te[6] = ad * f + bc + te[10] = ac - bd * f + } else if (euler.order === 'XZY') { + var ac = a * c, + ad = a * d, + bc = b * c, + bd = b * d + + te[0] = c * e + te[4] = -f + te[8] = d * e + + te[1] = ac * f + bd + te[5] = a * e + te[9] = ad * f - bc + + te[2] = bc * f - ad + te[6] = b * e + te[10] = bd * f + ac + } + + // last column + te[3] = 0 + te[7] = 0 + te[11] = 0 + + // bottom row + te[12] = 0 + te[13] = 0 + te[14] = 0 + te[15] = 1 + + return this + }, + + makeRotationFromQuaternion: function (q) { + var te = this.elements + + var x = q._x, + y = q._y, + z = q._z, + w = q._w + var x2 = x + x, + y2 = y + y, + z2 = z + z + var xx = x * x2, + xy = x * y2, + xz = x * z2 + var yy = y * y2, + yz = y * z2, + zz = z * z2 + var wx = w * x2, + wy = w * y2, + wz = w * z2 + + te[0] = 1 - (yy + zz) + te[4] = xy - wz + te[8] = xz + wy + + te[1] = xy + wz + te[5] = 1 - (xx + zz) + te[9] = yz - wx + + te[2] = xz - wy + te[6] = yz + wx + te[10] = 1 - (xx + yy) + + // last column + te[3] = 0 + te[7] = 0 + te[11] = 0 + + // bottom row + te[12] = 0 + te[13] = 0 + te[14] = 0 + te[15] = 1 + + return this + }, + + lookAt: (function () { + var x = new Vector3() + var y = new Vector3() + var z = new Vector3() + + return function lookAt(eye, target, up) { + var te = this.elements + + z.subVectors(eye, target) + + if (z.lengthSq() === 0) { + // eye and target are in the same position + + z.z = 1 + } + + z.normalize() + x.crossVectors(up, z) + + if (x.lengthSq() === 0) { + // up and z are parallel + + if (Math.abs(up.z) === 1) { + z.x += 0.0001 + } else { + z.z += 0.0001 + } + + z.normalize() + x.crossVectors(up, z) + } + + x.normalize() + y.crossVectors(z, x) + + te[0] = x.x + te[4] = y.x + te[8] = z.x + te[1] = x.y + te[5] = y.y + te[9] = z.y + te[2] = x.z + te[6] = y.z + te[10] = z.z + + return this + } + })(), + + multiply: function (m, n) { + if (n !== undefined) { + console.warn( + 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' + ) + return this.multiplyMatrices(m, n) + } + + return this.multiplyMatrices(this, m) + }, + + premultiply: function (m) { + return this.multiplyMatrices(m, this) + }, + + multiplyMatrices: function (a, b) { + var ae = a.elements + var be = b.elements + var te = this.elements + + var a11 = ae[0], + a12 = ae[4], + a13 = ae[8], + a14 = ae[12] + var a21 = ae[1], + a22 = ae[5], + a23 = ae[9], + a24 = ae[13] + var a31 = ae[2], + a32 = ae[6], + a33 = ae[10], + a34 = ae[14] + var a41 = ae[3], + a42 = ae[7], + a43 = ae[11], + a44 = ae[15] + + var b11 = be[0], + b12 = be[4], + b13 = be[8], + b14 = be[12] + var b21 = be[1], + b22 = be[5], + b23 = be[9], + b24 = be[13] + var b31 = be[2], + b32 = be[6], + b33 = be[10], + b34 = be[14] + var b41 = be[3], + b42 = be[7], + b43 = be[11], + b44 = be[15] + + te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41 + te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42 + te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43 + te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44 + + te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41 + te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42 + te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43 + te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44 + + te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41 + te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42 + te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43 + te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44 + + te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41 + te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42 + te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43 + te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44 + + return this + }, + + multiplyScalar: function (s) { + var te = this.elements + + te[0] *= s + te[4] *= s + te[8] *= s + te[12] *= s + te[1] *= s + te[5] *= s + te[9] *= s + te[13] *= s + te[2] *= s + te[6] *= s + te[10] *= s + te[14] *= s + te[3] *= s + te[7] *= s + te[11] *= s + te[15] *= s + + return this + }, + + applyToBufferAttribute: (function () { + var v1 = new Vector3() + + return function applyToBufferAttribute(attribute) { + for (var i = 0, l = attribute.count; i < l; i++) { + v1.x = attribute.getX(i) + v1.y = attribute.getY(i) + v1.z = attribute.getZ(i) + + v1.applyMatrix4(this) + + attribute.setXYZ(i, v1.x, v1.y, v1.z) + } + + return attribute + } + })(), + + determinant: function () { + var te = this.elements + + var n11 = te[0], + n12 = te[4], + n13 = te[8], + n14 = te[12] + var n21 = te[1], + n22 = te[5], + n23 = te[9], + n24 = te[13] + var n31 = te[2], + n32 = te[6], + n33 = te[10], + n34 = te[14] + var n41 = te[3], + n42 = te[7], + n43 = te[11], + n44 = te[15] + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * + (+n14 * n23 * n32 - + n13 * n24 * n32 - + n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 - + n12 * n23 * n34) + + n42 * + (+n11 * n23 * n34 - + n11 * n24 * n33 + + n14 * n21 * n33 - + n13 * n21 * n34 + + n13 * n24 * n31 - + n14 * n23 * n31) + + n43 * + (+n11 * n24 * n32 - + n11 * n22 * n34 - + n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 - + n12 * n24 * n31) + + n44 * + (-n13 * n22 * n31 - + n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 - + n12 * n21 * n33 + + n12 * n23 * n31) + ) + }, + + transpose: function () { + var te = this.elements + var tmp + + tmp = te[1] + te[1] = te[4] + te[4] = tmp + tmp = te[2] + te[2] = te[8] + te[8] = tmp + tmp = te[6] + te[6] = te[9] + te[9] = tmp + + tmp = te[3] + te[3] = te[12] + te[12] = tmp + tmp = te[7] + te[7] = te[13] + te[13] = tmp + tmp = te[11] + te[11] = te[14] + te[14] = tmp + + return this + }, + + setPosition: function (v) { + var te = this.elements + + te[12] = v.x + te[13] = v.y + te[14] = v.z + + return this + }, + + getInverse: function (m, throwOnDegenerate) { + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + n11 = me[0], + n21 = me[1], + n31 = me[2], + n41 = me[3], + n12 = me[4], + n22 = me[5], + n32 = me[6], + n42 = me[7], + n13 = me[8], + n23 = me[9], + n33 = me[10], + n43 = me[11], + n14 = me[12], + n24 = me[13], + n34 = me[14], + n44 = me[15], + t11 = + n23 * n34 * n42 - + n24 * n33 * n42 + + n24 * n32 * n43 - + n22 * n34 * n43 - + n23 * n32 * n44 + + n22 * n33 * n44, + t12 = + n14 * n33 * n42 - + n13 * n34 * n42 - + n14 * n32 * n43 + + n12 * n34 * n43 + + n13 * n32 * n44 - + n12 * n33 * n44, + t13 = + n13 * n24 * n42 - + n14 * n23 * n42 + + n14 * n22 * n43 - + n12 * n24 * n43 - + n13 * n22 * n44 + + n12 * n23 * n44, + t14 = + n14 * n23 * n32 - + n13 * n24 * n32 - + n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 - + n12 * n23 * n34 + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14 + + if (det === 0) { + var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0" + + if (throwOnDegenerate === true) { + throw new Error(msg) + } else { + console.warn(msg) + } + + return this.identity() + } + + var detInv = 1 / det + + te[0] = t11 * detInv + te[1] = + (n24 * n33 * n41 - + n23 * n34 * n41 - + n24 * n31 * n43 + + n21 * n34 * n43 + + n23 * n31 * n44 - + n21 * n33 * n44) * + detInv + te[2] = + (n22 * n34 * n41 - + n24 * n32 * n41 + + n24 * n31 * n42 - + n21 * n34 * n42 - + n22 * n31 * n44 + + n21 * n32 * n44) * + detInv + te[3] = + (n23 * n32 * n41 - + n22 * n33 * n41 - + n23 * n31 * n42 + + n21 * n33 * n42 + + n22 * n31 * n43 - + n21 * n32 * n43) * + detInv + + te[4] = t12 * detInv + te[5] = + (n13 * n34 * n41 - + n14 * n33 * n41 + + n14 * n31 * n43 - + n11 * n34 * n43 - + n13 * n31 * n44 + + n11 * n33 * n44) * + detInv + te[6] = + (n14 * n32 * n41 - + n12 * n34 * n41 - + n14 * n31 * n42 + + n11 * n34 * n42 + + n12 * n31 * n44 - + n11 * n32 * n44) * + detInv + te[7] = + (n12 * n33 * n41 - + n13 * n32 * n41 + + n13 * n31 * n42 - + n11 * n33 * n42 - + n12 * n31 * n43 + + n11 * n32 * n43) * + detInv + + te[8] = t13 * detInv + te[9] = + (n14 * n23 * n41 - + n13 * n24 * n41 - + n14 * n21 * n43 + + n11 * n24 * n43 + + n13 * n21 * n44 - + n11 * n23 * n44) * + detInv + te[10] = + (n12 * n24 * n41 - + n14 * n22 * n41 + + n14 * n21 * n42 - + n11 * n24 * n42 - + n12 * n21 * n44 + + n11 * n22 * n44) * + detInv + te[11] = + (n13 * n22 * n41 - + n12 * n23 * n41 - + n13 * n21 * n42 + + n11 * n23 * n42 + + n12 * n21 * n43 - + n11 * n22 * n43) * + detInv + + te[12] = t14 * detInv + te[13] = + (n13 * n24 * n31 - + n14 * n23 * n31 + + n14 * n21 * n33 - + n11 * n24 * n33 - + n13 * n21 * n34 + + n11 * n23 * n34) * + detInv + te[14] = + (n14 * n22 * n31 - + n12 * n24 * n31 - + n14 * n21 * n32 + + n11 * n24 * n32 + + n12 * n21 * n34 - + n11 * n22 * n34) * + detInv + te[15] = + (n12 * n23 * n31 - + n13 * n22 * n31 + + n13 * n21 * n32 - + n11 * n23 * n32 - + n12 * n21 * n33 + + n11 * n22 * n33) * + detInv + + return this + }, + + scale: function (v) { + var te = this.elements + var x = v.x, + y = v.y, + z = v.z + + te[0] *= x + te[4] *= y + te[8] *= z + te[1] *= x + te[5] *= y + te[9] *= z + te[2] *= x + te[6] *= y + te[10] *= z + te[3] *= x + te[7] *= y + te[11] *= z + + return this + }, + + getMaxScaleOnAxis: function () { + var te = this.elements + + var scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2] + var scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6] + var scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10] + + return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)) + }, + + makeTranslation: function (x, y, z) { + this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1) + + return this + }, + + makeRotationX: function (theta) { + var c = Math.cos(theta), + s = Math.sin(theta) + + this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1) + + return this + }, + + makeRotationY: function (theta) { + var c = Math.cos(theta), + s = Math.sin(theta) + + this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1) + + return this + }, + + makeRotationZ: function (theta) { + var c = Math.cos(theta), + s = Math.sin(theta) + + this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) + + return this + }, + + makeRotationAxis: function (axis, angle) { + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos(angle) + var s = Math.sin(angle) + var t = 1 - c + var x = axis.x, + y = axis.y, + z = axis.z + var tx = t * x, + ty = t * y + + this.set( + tx * x + c, + tx * y - s * z, + tx * z + s * y, + 0, + tx * y + s * z, + ty * y + c, + ty * z - s * x, + 0, + tx * z - s * y, + ty * z + s * x, + t * z * z + c, + 0, + 0, + 0, + 0, + 1 + ) + + return this + }, + + makeScale: function (x, y, z) { + this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1) + + return this + }, + + makeShear: function (x, y, z) { + this.set(1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1) + + return this + }, + + compose: function (position, quaternion, scale) { + this.makeRotationFromQuaternion(quaternion) + this.scale(scale) + this.setPosition(position) + + return this + }, + + decompose: (function () { + var vector = new Vector3() + var matrix = new Matrix4() + + return function decompose(position, quaternion, scale) { + var te = this.elements + + var sx = vector.set(te[0], te[1], te[2]).length() + var sy = vector.set(te[4], te[5], te[6]).length() + var sz = vector.set(te[8], te[9], te[10]).length() + + // if determine is negative, we need to invert one scale + var det = this.determinant() + if (det < 0) sx = -sx + + position.x = te[12] + position.y = te[13] + position.z = te[14] + + // scale the rotation part + matrix.copy(this) + + var invSX = 1 / sx + var invSY = 1 / sy + var invSZ = 1 / sz + + matrix.elements[0] *= invSX + matrix.elements[1] *= invSX + matrix.elements[2] *= invSX + + matrix.elements[4] *= invSY + matrix.elements[5] *= invSY + matrix.elements[6] *= invSY + + matrix.elements[8] *= invSZ + matrix.elements[9] *= invSZ + matrix.elements[10] *= invSZ + + quaternion.setFromRotationMatrix(matrix) + + scale.x = sx + scale.y = sy + scale.z = sz + + return this + } + })(), + + makePerspective: function (left, right, top, bottom, near, far) { + if (far === undefined) { + console.warn( + 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' + ) + } + + var te = this.elements + var x = (2 * near) / (right - left) + var y = (2 * near) / (top - bottom) + + var a = (right + left) / (right - left) + var b = (top + bottom) / (top - bottom) + var c = -(far + near) / (far - near) + var d = (-2 * far * near) / (far - near) + + te[0] = x + te[4] = 0 + te[8] = a + te[12] = 0 + te[1] = 0 + te[5] = y + te[9] = b + te[13] = 0 + te[2] = 0 + te[6] = 0 + te[10] = c + te[14] = d + te[3] = 0 + te[7] = 0 + te[11] = -1 + te[15] = 0 + + return this + }, + + makeOrthographic: function (left, right, top, bottom, near, far) { + var te = this.elements + var w = 1.0 / (right - left) + var h = 1.0 / (top - bottom) + var p = 1.0 / (far - near) + + var x = (right + left) * w + var y = (top + bottom) * h + var z = (far + near) * p + + te[0] = 2 * w + te[4] = 0 + te[8] = 0 + te[12] = -x + te[1] = 0 + te[5] = 2 * h + te[9] = 0 + te[13] = -y + te[2] = 0 + te[6] = 0 + te[10] = -2 * p + te[14] = -z + te[3] = 0 + te[7] = 0 + te[11] = 0 + te[15] = 1 + + return this + }, + + equals: function (matrix) { + var te = this.elements + var me = matrix.elements + + for (var i = 0; i < 16; i++) { + if (te[i] !== me[i]) return false + } + + return true + }, + + fromArray: function (array, offset) { + if (offset === undefined) offset = 0 + + for (var i = 0; i < 16; i++) { + this.elements[i] = array[i + offset] + } + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + var te = this.elements + + array[offset] = te[0] + array[offset + 1] = te[1] + array[offset + 2] = te[2] + array[offset + 3] = te[3] + + array[offset + 4] = te[4] + array[offset + 5] = te[5] + array[offset + 6] = te[6] + array[offset + 7] = te[7] + + array[offset + 8] = te[8] + array[offset + 9] = te[9] + array[offset + 10] = te[10] + array[offset + 11] = te[11] + + array[offset + 12] = te[12] + array[offset + 13] = te[13] + array[offset + 14] = te[14] + array[offset + 15] = te[15] + + return array + } + }) + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion(x, y, z, w) { + this._x = x || 0 + this._y = y || 0 + this._z = z || 0 + this._w = w !== undefined ? w : 1 + } + + Object.assign(Quaternion, { + slerp: function (qa, qb, qm, t) { + return qm.copy(qa).slerp(qb, t) + }, + + slerpFlat: function (dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) { + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[srcOffset0 + 0], + y0 = src0[srcOffset0 + 1], + z0 = src0[srcOffset0 + 2], + w0 = src0[srcOffset0 + 3], + x1 = src1[srcOffset1 + 0], + y1 = src1[srcOffset1 + 1], + z1 = src1[srcOffset1 + 2], + w1 = src1[srcOffset1 + 3] + + if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { + var s = 1 - t, + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + dir = cos >= 0 ? 1 : -1, + sqrSin = 1 - cos * cos + + // Skip the Slerp for tiny steps to avoid numeric problems: + if (sqrSin > Number.EPSILON) { + var sin = Math.sqrt(sqrSin), + len = Math.atan2(sin, cos * dir) + + s = Math.sin(s * len) / sin + t = Math.sin(t * len) / sin + } + + var tDir = t * dir + + x0 = x0 * s + x1 * tDir + y0 = y0 * s + y1 * tDir + z0 = z0 * s + z1 * tDir + w0 = w0 * s + w1 * tDir + + // Normalize in case we just did a lerp: + if (s === 1 - t) { + var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0) + + x0 *= f + y0 *= f + z0 *= f + w0 *= f + } + } + + dst[dstOffset] = x0 + dst[dstOffset + 1] = y0 + dst[dstOffset + 2] = z0 + dst[dstOffset + 3] = w0 + } + }) + + Object.defineProperties(Quaternion.prototype, { + x: { + get: function () { + return this._x + }, + + set: function (value) { + this._x = value + this.onChangeCallback() + } + }, + + y: { + get: function () { + return this._y + }, + + set: function (value) { + this._y = value + this.onChangeCallback() + } + }, + + z: { + get: function () { + return this._z + }, + + set: function (value) { + this._z = value + this.onChangeCallback() + } + }, + + w: { + get: function () { + return this._w + }, + + set: function (value) { + this._w = value + this.onChangeCallback() + } + } + }) + + Object.assign(Quaternion.prototype, { + set: function (x, y, z, w) { + this._x = x + this._y = y + this._z = z + this._w = w + + this.onChangeCallback() + + return this + }, + + clone: function () { + return new this.constructor(this._x, this._y, this._z, this._w) + }, + + copy: function (quaternion) { + this._x = quaternion.x + this._y = quaternion.y + this._z = quaternion.z + this._w = quaternion.w + + this.onChangeCallback() + + return this + }, + + setFromEuler: function (euler, update) { + if (!(euler && euler.isEuler)) { + throw new Error( + 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' + ) + } + + var x = euler._x, + y = euler._y, + z = euler._z, + order = euler.order + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var cos = Math.cos + var sin = Math.sin + + var c1 = cos(x / 2) + var c2 = cos(y / 2) + var c3 = cos(z / 2) + + var s1 = sin(x / 2) + var s2 = sin(y / 2) + var s3 = sin(z / 2) + + if (order === 'XYZ') { + this._x = s1 * c2 * c3 + c1 * s2 * s3 + this._y = c1 * s2 * c3 - s1 * c2 * s3 + this._z = c1 * c2 * s3 + s1 * s2 * c3 + this._w = c1 * c2 * c3 - s1 * s2 * s3 + } else if (order === 'YXZ') { + this._x = s1 * c2 * c3 + c1 * s2 * s3 + this._y = c1 * s2 * c3 - s1 * c2 * s3 + this._z = c1 * c2 * s3 - s1 * s2 * c3 + this._w = c1 * c2 * c3 + s1 * s2 * s3 + } else if (order === 'ZXY') { + this._x = s1 * c2 * c3 - c1 * s2 * s3 + this._y = c1 * s2 * c3 + s1 * c2 * s3 + this._z = c1 * c2 * s3 + s1 * s2 * c3 + this._w = c1 * c2 * c3 - s1 * s2 * s3 + } else if (order === 'ZYX') { + this._x = s1 * c2 * c3 - c1 * s2 * s3 + this._y = c1 * s2 * c3 + s1 * c2 * s3 + this._z = c1 * c2 * s3 - s1 * s2 * c3 + this._w = c1 * c2 * c3 + s1 * s2 * s3 + } else if (order === 'YZX') { + this._x = s1 * c2 * c3 + c1 * s2 * s3 + this._y = c1 * s2 * c3 + s1 * c2 * s3 + this._z = c1 * c2 * s3 - s1 * s2 * c3 + this._w = c1 * c2 * c3 - s1 * s2 * s3 + } else if (order === 'XZY') { + this._x = s1 * c2 * c3 - c1 * s2 * s3 + this._y = c1 * s2 * c3 - s1 * c2 * s3 + this._z = c1 * c2 * s3 + s1 * s2 * c3 + this._w = c1 * c2 * c3 + s1 * s2 * s3 + } + + if (update !== false) this.onChangeCallback() + + return this + }, + + setFromAxisAngle: function (axis, angle) { + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, + s = Math.sin(halfAngle) + + this._x = axis.x * s + this._y = axis.y * s + this._z = axis.z * s + this._w = Math.cos(halfAngle) + + this.onChangeCallback() + + return this + }, + + setFromRotationMatrix: function (m) { + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + m11 = te[0], + m12 = te[4], + m13 = te[8], + m21 = te[1], + m22 = te[5], + m23 = te[9], + m31 = te[2], + m32 = te[6], + m33 = te[10], + trace = m11 + m22 + m33, + s + + if (trace > 0) { + s = 0.5 / Math.sqrt(trace + 1.0) + + this._w = 0.25 / s + this._x = (m32 - m23) * s + this._y = (m13 - m31) * s + this._z = (m21 - m12) * s + } else if (m11 > m22 && m11 > m33) { + s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33) + + this._w = (m32 - m23) / s + this._x = 0.25 * s + this._y = (m12 + m21) / s + this._z = (m13 + m31) / s + } else if (m22 > m33) { + s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33) + + this._w = (m13 - m31) / s + this._x = (m12 + m21) / s + this._y = 0.25 * s + this._z = (m23 + m32) / s + } else { + s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22) + + this._w = (m21 - m12) / s + this._x = (m13 + m31) / s + this._y = (m23 + m32) / s + this._z = 0.25 * s + } + + this.onChangeCallback() + + return this + }, + + setFromUnitVectors: (function () { + // assumes direction vectors vFrom and vTo are normalized + + var v1 = new Vector3() + var r + + var EPS = 0.000001 + + return function setFromUnitVectors(vFrom, vTo) { + if (v1 === undefined) v1 = new Vector3() + + r = vFrom.dot(vTo) + 1 + + if (r < EPS) { + r = 0 + + if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { + v1.set(-vFrom.y, vFrom.x, 0) + } else { + v1.set(0, -vFrom.z, vFrom.y) + } + } else { + v1.crossVectors(vFrom, vTo) + } + + this._x = v1.x + this._y = v1.y + this._z = v1.z + this._w = r + + return this.normalize() + } + })(), + + inverse: function () { + // quaternion is assumed to have unit length + + return this.conjugate() + }, + + conjugate: function () { + this._x *= -1 + this._y *= -1 + this._z *= -1 + + this.onChangeCallback() + + return this + }, + + dot: function (v) { + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._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 l = this.length() + + if (l === 0) { + this._x = 0 + this._y = 0 + this._z = 0 + this._w = 1 + } else { + l = 1 / l + + this._x = this._x * l + this._y = this._y * l + this._z = this._z * l + this._w = this._w * l + } + + this.onChangeCallback() + + return this + }, + + multiply: function (q, p) { + if (p !== undefined) { + console.warn( + 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' + ) + return this.multiplyQuaternions(q, p) + } + + return this.multiplyQuaternions(this, q) + }, + + premultiply: function (q) { + return this.multiplyQuaternions(q, this) + }, + + multiplyQuaternions: function (a, b) { + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, + qay = a._y, + qaz = a._z, + qaw = a._w + var qbx = b._x, + qby = b._y, + qbz = b._z, + qbw = b._w + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz + + this.onChangeCallback() + + return this + }, + + slerp: function (qb, t) { + if (t === 0) return this + if (t === 1) return this.copy(qb) + + var x = this._x, + y = this._y, + z = this._z, + w = this._w + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z + + if (cosHalfTheta < 0) { + this._w = -qb._w + this._x = -qb._x + this._y = -qb._y + this._z = -qb._z + + cosHalfTheta = -cosHalfTheta + } else { + this.copy(qb) + } + + if (cosHalfTheta >= 1.0) { + this._w = w + this._x = x + this._y = y + this._z = z + + return this + } + + var sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta) + + if (Math.abs(sinHalfTheta) < 0.001) { + this._w = 0.5 * (w + this._w) + this._x = 0.5 * (x + this._x) + this._y = 0.5 * (y + this._y) + this._z = 0.5 * (z + this._z) + + return this + } + + var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta) + var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta, + ratioB = Math.sin(t * halfTheta) / sinHalfTheta + + this._w = w * ratioA + this._w * ratioB + this._x = x * ratioA + this._x * ratioB + this._y = y * ratioA + this._y * ratioB + this._z = z * ratioA + this._z * ratioB + + this.onChangeCallback() + + return this + }, + + equals: function (quaternion) { + return ( + quaternion._x === this._x && + quaternion._y === this._y && + quaternion._z === this._z && + quaternion._w === this._w + ) + }, + + fromArray: function (array, offset) { + if (offset === undefined) offset = 0 + + this._x = array[offset] + this._y = array[offset + 1] + this._z = array[offset + 2] + this._w = array[offset + 3] + + this.onChangeCallback() + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + array[offset] = this._x + array[offset + 1] = this._y + array[offset + 2] = this._z + array[offset + 3] = this._w + + return array + }, + + onChange: function (callback) { + this.onChangeCallback = callback + + return this + }, + + onChangeCallback: function () {} + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3(x, y, z) { + this.x = x || 0 + this.y = y || 0 + this.z = z || 0 + } + + Object.assign(Vector3.prototype, { + isVector3: true, + + set: function (x, y, z) { + this.x = x + this.y = y + this.z = z + + return this + }, + + setScalar: function (scalar) { + this.x = scalar + this.y = scalar + this.z = scalar + + return this + }, + + setX: function (x) { + this.x = x + + return this + }, + + setY: function (y) { + this.y = y + + return this + }, + + setZ: function (z) { + this.z = z + + return this + }, + + setComponent: function (index, value) { + switch (index) { + case 0: + this.x = value + break + case 1: + this.y = value + break + case 2: + this.z = value + break + default: + throw new Error('index is out of range: ' + index) + } + + return this + }, + + getComponent: function (index) { + switch (index) { + case 0: + return this.x + case 1: + return this.y + case 2: + return this.z + default: + throw new Error('index is out of range: ' + index) + } + }, + + clone: function () { + return new this.constructor(this.x, this.y, this.z) + }, + + copy: function (v) { + this.x = v.x + this.y = v.y + this.z = v.z + + return this + }, + + add: function (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' + ) + return this.addVectors(v, w) + } + + this.x += v.x + this.y += v.y + this.z += v.z + + return this + }, + + addScalar: function (s) { + this.x += s + this.y += s + this.z += s + + 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 + }, + + addScaledVector: function (v, s) { + this.x += v.x * s + this.y += v.y * s + this.z += v.z * s + + return this + }, + + sub: function (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' + ) + return this.subVectors(v, w) + } + + this.x -= v.x + this.y -= v.y + this.z -= v.z + + return this + }, + + subScalar: function (s) { + this.x -= s + this.y -= s + this.z -= s + + 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 (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' + ) + return this.multiplyVectors(v, w) + } + + this.x *= v.x + this.y *= v.y + this.z *= v.z + + return this + }, + + multiplyScalar: function (scalar) { + this.x *= scalar + this.y *= scalar + this.z *= scalar + + return this + }, + + multiplyVectors: function (a, b) { + this.x = a.x * b.x + this.y = a.y * b.y + this.z = a.z * b.z + + return this + }, + + applyEuler: (function () { + var quaternion = new Quaternion() + + return function applyEuler(euler) { + if (!(euler && euler.isEuler)) { + console.error( + 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' + ) + } + + return this.applyQuaternion(quaternion.setFromEuler(euler)) + } + })(), + + applyAxisAngle: (function () { + var quaternion = new Quaternion() + + return function applyAxisAngle(axis, angle) { + return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle)) + } + })(), + + applyMatrix3: function (m) { + var x = this.x, + y = this.y, + z = this.z + var e = m.elements + + this.x = e[0] * x + e[3] * y + e[6] * z + this.y = e[1] * x + e[4] * y + e[7] * z + this.z = e[2] * x + e[5] * y + e[8] * z + + return this + }, + + applyMatrix4: function (m) { + var x = this.x, + y = this.y, + z = this.z + var e = m.elements + + var w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]) + + this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w + this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w + this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w + + return this + }, + + applyQuaternion: function (q) { + var x = this.x, + y = this.y, + z = this.z + var qx = q.x, + qy = q.y, + qz = q.z, + qw = q.w + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y + var iy = qw * y + qz * x - qx * z + var iz = qw * z + qx * y - qy * x + var iw = -qx * x - qy * y - qz * z + + // calculate result * inverse quat + + this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy + this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz + this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx + + return this + }, + + project: (function () { + var matrix = new Matrix4() + + return function project(camera) { + matrix.multiplyMatrices(camera.projectionMatrix, matrix.getInverse(camera.matrixWorld)) + return this.applyMatrix4(matrix) + } + })(), + + unproject: (function () { + var matrix = new Matrix4() + + return function unproject(camera) { + matrix.multiplyMatrices(camera.matrixWorld, matrix.getInverse(camera.projectionMatrix)) + return this.applyMatrix4(matrix) + } + })(), + + transformDirection: function (m) { + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, + y = this.y, + z = this.z + var e = m.elements + + this.x = e[0] * x + e[4] * y + e[8] * z + this.y = e[1] * x + e[5] * y + e[9] * z + this.z = e[2] * x + e[6] * y + e[10] * z + + return this.normalize() + }, + + divide: function (v) { + this.x /= v.x + this.y /= v.y + this.z /= v.z + + return this + }, + + divideScalar: function (scalar) { + return this.multiplyScalar(1 / scalar) + }, + + min: function (v) { + this.x = Math.min(this.x, v.x) + this.y = Math.min(this.y, v.y) + this.z = Math.min(this.z, v.z) + + return this + }, + + max: function (v) { + this.x = Math.max(this.x, v.x) + this.y = Math.max(this.y, v.y) + this.z = Math.max(this.z, v.z) + + return this + }, + + clamp: function (min, max) { + // assumes min < max, componentwise + + this.x = Math.max(min.x, Math.min(max.x, this.x)) + this.y = Math.max(min.y, Math.min(max.y, this.y)) + this.z = Math.max(min.z, Math.min(max.z, this.z)) + + return this + }, + + clampScalar: (function () { + var min = new Vector3() + var max = new Vector3() + + return function clampScalar(minVal, maxVal) { + min.set(minVal, minVal, minVal) + max.set(maxVal, maxVal, maxVal) + + return this.clamp(min, max) + } + })(), + + clampLength: function (min, max) { + var length = this.length() + + return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length))) + }, + + 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 = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x) + this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y) + this.z = this.z < 0 ? 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 (v) { + return this.x * v.x + this.y * v.y + this.z * v.z + }, + + // TODO lengthSquared? + + 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) + }, + + manhattanLength: function () { + return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + }, + + normalize: function () { + return this.divideScalar(this.length() || 1) + }, + + setLength: function (length) { + return this.normalize().multiplyScalar(length) + }, + + lerp: function (v, alpha) { + this.x += (v.x - this.x) * alpha + this.y += (v.y - this.y) * alpha + this.z += (v.z - this.z) * alpha + + return this + }, + + lerpVectors: function (v1, v2, alpha) { + return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1) + }, + + cross: function (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' + ) + return this.crossVectors(v, w) + } + + return this.crossVectors(this, v) + }, + + crossVectors: function (a, b) { + var ax = a.x, + ay = a.y, + az = a.z + var bx = b.x, + by = b.y, + bz = b.z + + this.x = ay * bz - az * by + this.y = az * bx - ax * bz + this.z = ax * by - ay * bx + + return this + }, + + projectOnVector: function (vector) { + var scalar = vector.dot(this) / vector.lengthSq() + + return this.copy(vector).multiplyScalar(scalar) + }, + + projectOnPlane: (function () { + var v1 = new Vector3() + + return function projectOnPlane(planeNormal) { + v1.copy(this).projectOnVector(planeNormal) + + return this.sub(v1) + } + })(), + + reflect: (function () { + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1 = new Vector3() + + return function reflect(normal) { + return this.sub(v1.copy(normal).multiplyScalar(2 * this.dot(normal))) + } + })(), + + angleTo: function (v) { + var theta = this.dot(v) / Math.sqrt(this.lengthSq() * v.lengthSq()) + + // clamp, to handle numerical problems + + return Math.acos(_Math.clamp(theta, -1, 1)) + }, + + distanceTo: function (v) { + return Math.sqrt(this.distanceToSquared(v)) + }, + + distanceToSquared: function (v) { + var dx = this.x - v.x, + dy = this.y - v.y, + dz = this.z - v.z + + return dx * dx + dy * dy + dz * dz + }, + + manhattanDistanceTo: function (v) { + return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z) + }, + + setFromSpherical: function (s) { + var sinPhiRadius = Math.sin(s.phi) * s.radius + + this.x = sinPhiRadius * Math.sin(s.theta) + this.y = Math.cos(s.phi) * s.radius + this.z = sinPhiRadius * Math.cos(s.theta) + + return this + }, + + setFromCylindrical: function (c) { + this.x = c.radius * Math.sin(c.theta) + this.y = c.y + this.z = c.radius * Math.cos(c.theta) + + return this + }, + + setFromMatrixPosition: function (m) { + var e = m.elements + + this.x = e[12] + this.y = e[13] + this.z = e[14] + + return this + }, + + setFromMatrixScale: function (m) { + var sx = this.setFromMatrixColumn(m, 0).length() + var sy = this.setFromMatrixColumn(m, 1).length() + var sz = this.setFromMatrixColumn(m, 2).length() + + this.x = sx + this.y = sy + this.z = sz + + return this + }, + + setFromMatrixColumn: function (m, index) { + return this.fromArray(m.elements, index * 4) + }, + + equals: function (v) { + return v.x === this.x && v.y === this.y && v.z === this.z + }, + + fromArray: function (array, offset) { + if (offset === undefined) offset = 0 + + this.x = array[offset] + this.y = array[offset + 1] + this.z = array[offset + 2] + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + array[offset] = this.x + array[offset + 1] = this.y + array[offset + 2] = this.z + + return array + }, + + fromBufferAttribute: function (attribute, index, offset) { + if (offset !== undefined) { + console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().') + } + + this.x = attribute.getX(index) + this.y = attribute.getY(index) + this.z = attribute.getZ(index) + + return this + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1] + + if (arguments.length > 0) { + console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.') + } + } + + Object.assign(Matrix3.prototype, { + isMatrix3: true, + + set: function (n11, n12, n13, n21, n22, n23, n31, n32, n33) { + var te = this.elements + + te[0] = n11 + te[1] = n21 + te[2] = n31 + te[3] = n12 + te[4] = n22 + te[5] = n32 + te[6] = n13 + te[7] = n23 + te[8] = n33 + + return this + }, + + identity: function () { + this.set(1, 0, 0, 0, 1, 0, 0, 0, 1) + + return this + }, + + clone: function () { + return new this.constructor().fromArray(this.elements) + }, + + copy: function (m) { + var te = this.elements + var me = m.elements + + te[0] = me[0] + te[1] = me[1] + te[2] = me[2] + te[3] = me[3] + te[4] = me[4] + te[5] = me[5] + te[6] = me[6] + te[7] = me[7] + te[8] = me[8] + + return this + }, + + setFromMatrix4: function (m) { + var me = m.elements + + this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]) + + return this + }, + + applyToBufferAttribute: (function () { + var v1 = new Vector3() + + return function applyToBufferAttribute(attribute) { + for (var i = 0, l = attribute.count; i < l; i++) { + v1.x = attribute.getX(i) + v1.y = attribute.getY(i) + v1.z = attribute.getZ(i) + + v1.applyMatrix3(this) + + attribute.setXYZ(i, v1.x, v1.y, v1.z) + } + + return attribute + } + })(), + + multiply: function (m) { + return this.multiplyMatrices(this, m) + }, + + premultiply: function (m) { + return this.multiplyMatrices(m, this) + }, + + multiplyMatrices: function (a, b) { + var ae = a.elements + var be = b.elements + var te = this.elements + + var a11 = ae[0], + a12 = ae[3], + a13 = ae[6] + var a21 = ae[1], + a22 = ae[4], + a23 = ae[7] + var a31 = ae[2], + a32 = ae[5], + a33 = ae[8] + + var b11 = be[0], + b12 = be[3], + b13 = be[6] + var b21 = be[1], + b22 = be[4], + b23 = be[7] + var b31 = be[2], + b32 = be[5], + b33 = be[8] + + te[0] = a11 * b11 + a12 * b21 + a13 * b31 + te[3] = a11 * b12 + a12 * b22 + a13 * b32 + te[6] = a11 * b13 + a12 * b23 + a13 * b33 + + te[1] = a21 * b11 + a22 * b21 + a23 * b31 + te[4] = a21 * b12 + a22 * b22 + a23 * b32 + te[7] = a21 * b13 + a22 * b23 + a23 * b33 + + te[2] = a31 * b11 + a32 * b21 + a33 * b31 + te[5] = a31 * b12 + a32 * b22 + a33 * b32 + te[8] = a31 * b13 + a32 * b23 + a33 * b33 + + return this + }, + + multiplyScalar: function (s) { + var te = this.elements + + te[0] *= s + te[3] *= s + te[6] *= s + te[1] *= s + te[4] *= s + te[7] *= s + te[2] *= s + te[5] *= s + te[8] *= s + + return this + }, + + determinant: function () { + var te = this.elements + + var a = te[0], + b = te[1], + c = te[2], + d = te[3], + e = te[4], + f = te[5], + g = te[6], + h = te[7], + i = te[8] + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g + }, + + getInverse: function (matrix, throwOnDegenerate) { + if (matrix && matrix.isMatrix4) { + console.error('THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.') + } + + var me = matrix.elements, + te = this.elements, + n11 = me[0], + n21 = me[1], + n31 = me[2], + n12 = me[3], + n22 = me[4], + n32 = me[5], + n13 = me[6], + n23 = me[7], + n33 = me[8], + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + det = n11 * t11 + n21 * t12 + n31 * t13 + + if (det === 0) { + var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0" + + if (throwOnDegenerate === true) { + throw new Error(msg) + } else { + console.warn(msg) + } + + return this.identity() + } + + var detInv = 1 / det + + te[0] = t11 * detInv + te[1] = (n31 * n23 - n33 * n21) * detInv + te[2] = (n32 * n21 - n31 * n22) * detInv + + te[3] = t12 * detInv + te[4] = (n33 * n11 - n31 * n13) * detInv + te[5] = (n31 * n12 - n32 * n11) * detInv + + te[6] = t13 * detInv + te[7] = (n21 * n13 - n23 * n11) * detInv + te[8] = (n22 * n11 - n21 * n12) * detInv + + return this + }, + + transpose: function () { + var tmp, + m = this.elements + + tmp = m[1] + m[1] = m[3] + m[3] = tmp + tmp = m[2] + m[2] = m[6] + m[6] = tmp + tmp = m[5] + m[5] = m[7] + m[7] = tmp + + return this + }, + + getNormalMatrix: function (matrix4) { + return this.setFromMatrix4(matrix4).getInverse(this).transpose() + }, + + transposeIntoArray: function (r) { + var m = this.elements + + r[0] = m[0] + r[1] = m[3] + r[2] = m[6] + r[3] = m[1] + r[4] = m[4] + r[5] = m[7] + r[6] = m[2] + r[7] = m[5] + r[8] = m[8] + + return this + }, + + setUvTransform: function (tx, ty, sx, sy, rotation, cx, cy) { + var c = Math.cos(rotation) + var s = Math.sin(rotation) + + this.set( + sx * c, + sx * s, + -sx * (c * cx + s * cy) + cx + tx, + -sy * s, + sy * c, + -sy * (-s * cx + c * cy) + cy + ty, + 0, + 0, + 1 + ) + }, + + scale: function (sx, sy) { + var te = this.elements + + te[0] *= sx + te[3] *= sx + te[6] *= sx + te[1] *= sy + te[4] *= sy + te[7] *= sy + + return this + }, + + rotate: function (theta) { + var c = Math.cos(theta) + var s = Math.sin(theta) + + var te = this.elements + + var a11 = te[0], + a12 = te[3], + a13 = te[6] + var a21 = te[1], + a22 = te[4], + a23 = te[7] + + te[0] = c * a11 + s * a21 + te[3] = c * a12 + s * a22 + te[6] = c * a13 + s * a23 + + te[1] = -s * a11 + c * a21 + te[4] = -s * a12 + c * a22 + te[7] = -s * a13 + c * a23 + + return this + }, + + translate: function (tx, ty) { + var te = this.elements + + te[0] += tx * te[2] + te[3] += tx * te[5] + te[6] += tx * te[8] + te[1] += ty * te[2] + te[4] += ty * te[5] + te[7] += ty * te[8] + + return this + }, + + equals: function (matrix) { + var te = this.elements + var me = matrix.elements + + for (var i = 0; i < 9; i++) { + if (te[i] !== me[i]) return false + } + + return true + }, + + fromArray: function (array, offset) { + if (offset === undefined) offset = 0 + + for (var i = 0; i < 9; i++) { + this.elements[i] = array[i + offset] + } + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + var te = this.elements + + array[offset] = te[0] + array[offset + 1] = te[1] + array[offset + 2] = te[2] + + array[offset + 3] = te[3] + array[offset + 4] = te[4] + array[offset + 5] = te[5] + + array[offset + 6] = te[6] + array[offset + 7] = te[7] + array[offset + 8] = te[8] + + return array + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + var textureId = 0 + + function Texture( + image, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy, + encoding + ) { + Object.defineProperty(this, 'id', { value: textureId++ }) + + this.uuid = _Math.generateUUID() + + this.name = '' + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE + this.mipmaps = [] + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1 + + this.format = format !== undefined ? format : RGBAFormat + this.type = type !== undefined ? type : UnsignedByteType + + this.offset = new Vector2(0, 0) + this.repeat = new Vector2(1, 1) + this.center = new Vector2(0, 0) + this.rotation = 0 + + this.matrixAutoUpdate = true + this.matrix = new Matrix3() + + this.generateMipmaps = true + this.premultiplyAlpha = false + this.flipY = true + this.unpackAlignment = 4 // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding + + this.version = 0 + this.onUpdate = null + } + + Texture.DEFAULT_IMAGE = undefined + Texture.DEFAULT_MAPPING = UVMapping + + Texture.prototype = Object.assign(Object.create(EventDispatcher.prototype), { + constructor: Texture, + + isTexture: true, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (source) { + this.name = source.name + + this.image = source.image + this.mipmaps = source.mipmaps.slice(0) + + this.mapping = source.mapping + + this.wrapS = source.wrapS + this.wrapT = source.wrapT + + this.magFilter = source.magFilter + this.minFilter = source.minFilter + + this.anisotropy = source.anisotropy + + this.format = source.format + this.type = source.type + + this.offset.copy(source.offset) + this.repeat.copy(source.repeat) + this.center.copy(source.center) + this.rotation = source.rotation + + this.matrixAutoUpdate = source.matrixAutoUpdate + this.matrix.copy(source.matrix) + + this.generateMipmaps = source.generateMipmaps + this.premultiplyAlpha = source.premultiplyAlpha + this.flipY = source.flipY + this.unpackAlignment = source.unpackAlignment + this.encoding = source.encoding + + return this + }, + + toJSON: function (meta) { + var isRootObject = meta === undefined || typeof meta === 'string' + + if (!isRootObject && meta.textures[this.uuid] !== undefined) { + return meta.textures[this.uuid] + } + + function getDataURL(image) { + var canvas + + if (image instanceof HTMLCanvasElement) { + canvas = image + } else { + canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas') + canvas.width = image.width + canvas.height = image.height + + var context = canvas.getContext('2d') + + if (image instanceof ImageData) { + context.putImageData(image, 0, 0) + } else { + context.drawImage(image, 0, 0, image.width, image.height) + } + } + + if (canvas.width > 2048 || canvas.height > 2048) { + return canvas.toDataURL('image/jpeg', 0.6) + } else { + return canvas.toDataURL('image/png') + } + } + + var output = { + metadata: { + version: 4.5, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [this.repeat.x, this.repeat.y], + offset: [this.offset.x, this.offset.y], + center: [this.center.x, this.center.y], + rotation: this.rotation, + + wrap: [this.wrapS, this.wrapT], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + } + + if (this.image !== undefined) { + // TODO: Move to THREE.Image + + var image = this.image + + if (image.uuid === undefined) { + image.uuid = _Math.generateUUID() // UGH + } + + if (!isRootObject && meta.images[image.uuid] === undefined) { + meta.images[image.uuid] = { + uuid: image.uuid, + url: getDataURL(image) + } + } + + output.image = image.uuid + } + + if (!isRootObject) { + meta.textures[this.uuid] = output + } + + return output + }, + + dispose: function () { + this.dispatchEvent({ type: 'dispose' }) + }, + + transformUv: function (uv) { + if (this.mapping !== UVMapping) return + + uv.applyMatrix3(this.matrix) + + if (uv.x < 0 || uv.x > 1) { + switch (this.wrapS) { + case RepeatWrapping: + uv.x = uv.x - Math.floor(uv.x) + break + + case ClampToEdgeWrapping: + uv.x = uv.x < 0 ? 0 : 1 + break + + case MirroredRepeatWrapping: + if (Math.abs(Math.floor(uv.x) % 2) === 1) { + uv.x = Math.ceil(uv.x) - uv.x + } else { + uv.x = uv.x - Math.floor(uv.x) + } + break + } + } + + if (uv.y < 0 || uv.y > 1) { + switch (this.wrapT) { + case RepeatWrapping: + uv.y = uv.y - Math.floor(uv.y) + break + + case ClampToEdgeWrapping: + uv.y = uv.y < 0 ? 0 : 1 + break + + case MirroredRepeatWrapping: + if (Math.abs(Math.floor(uv.y) % 2) === 1) { + uv.y = Math.ceil(uv.y) - uv.y + } else { + uv.y = uv.y - Math.floor(uv.y) + } + break + } + } + + if (this.flipY) { + uv.y = 1 - uv.y + } + } + }) + + Object.defineProperty(Texture.prototype, 'needsUpdate', { + set: function (value) { + if (value === true) this.version++ + } + }) + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4(x, y, z, w) { + this.x = x || 0 + this.y = y || 0 + this.z = z || 0 + this.w = w !== undefined ? w : 1 + } + + Object.assign(Vector4.prototype, { + isVector4: true, + + set: function (x, y, z, w) { + this.x = x + this.y = y + this.z = z + this.w = w + + return this + }, + + setScalar: function (scalar) { + this.x = scalar + this.y = scalar + this.z = scalar + this.w = scalar + + return this + }, + + setX: function (x) { + this.x = x + + return this + }, + + setY: function (y) { + this.y = y + + return this + }, + + setZ: function (z) { + this.z = z + + return this + }, + + setW: function (w) { + this.w = w + + return this + }, + + setComponent: function (index, value) { + switch (index) { + case 0: + this.x = value + break + case 1: + this.y = value + break + case 2: + this.z = value + break + case 3: + this.w = value + break + default: + throw new Error('index is out of range: ' + index) + } + + return this + }, + + getComponent: function (index) { + switch (index) { + case 0: + return this.x + case 1: + return this.y + case 2: + return this.z + case 3: + return this.w + default: + throw new Error('index is out of range: ' + index) + } + }, + + clone: function () { + return new this.constructor(this.x, this.y, this.z, this.w) + }, + + copy: function (v) { + this.x = v.x + this.y = v.y + this.z = v.z + this.w = v.w !== undefined ? v.w : 1 + + return this + }, + + add: function (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' + ) + return this.addVectors(v, w) + } + + this.x += v.x + this.y += v.y + this.z += v.z + this.w += v.w + + return this + }, + + addScalar: function (s) { + this.x += s + this.y += s + this.z += s + this.w += s + + return this + }, + + addVectors: 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 + }, + + addScaledVector: function (v, s) { + this.x += v.x * s + this.y += v.y * s + this.z += v.z * s + this.w += v.w * s + + return this + }, + + sub: function (v, w) { + if (w !== undefined) { + console.warn( + 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' + ) + return this.subVectors(v, w) + } + + this.x -= v.x + this.y -= v.y + this.z -= v.z + this.w -= v.w + + return this + }, + + subScalar: function (s) { + this.x -= s + this.y -= s + this.z -= s + this.w -= s + + 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 (scalar) { + this.x *= scalar + this.y *= scalar + this.z *= scalar + this.w *= scalar + + return this + }, + + applyMatrix4: function (m) { + var x = this.x, + y = this.y, + z = this.z, + w = this.w + var e = m.elements + + this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w + this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w + this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w + this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w + + return this + }, + + divideScalar: function (scalar) { + return this.multiplyScalar(1 / scalar) + }, + + setAxisAngleFromQuaternion: function (q) { + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos(q.w) + + var s = Math.sqrt(1 - q.w * q.w) + + if (s < 0.0001) { + this.x = 1 + this.y = 0 + this.z = 0 + } else { + this.x = q.x / s + this.y = q.y / s + this.z = q.z / s + } + + return this + }, + + setAxisAngleFromRotationMatrix: function (m) { + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, + x, + y, + z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + te = m.elements, + m11 = te[0], + m12 = te[4], + m13 = te[8], + m21 = te[1], + m22 = te[5], + m23 = te[9], + m31 = te[2], + m32 = te[6], + m33 = te[10] + + if ( + Math.abs(m12 - m21) < epsilon && + Math.abs(m13 - m31) < epsilon && + Math.abs(m23 - m32) < epsilon + ) { + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( + Math.abs(m12 + m21) < epsilon2 && + Math.abs(m13 + m31) < epsilon2 && + Math.abs(m23 + m32) < epsilon2 && + Math.abs(m11 + m22 + m33 - 3) < epsilon2 + ) { + // this singularity is identity matrix so angle = 0 + + this.set(1, 0, 0, 0) + + return this // zero angle, arbitrary axis + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI + + var xx = (m11 + 1) / 2 + var yy = (m22 + 1) / 2 + var zz = (m33 + 1) / 2 + var xy = (m12 + m21) / 4 + var xz = (m13 + m31) / 4 + var yz = (m23 + m32) / 4 + + if (xx > yy && xx > zz) { + // m11 is the largest diagonal term + + if (xx < epsilon) { + x = 0 + y = 0.707106781 + z = 0.707106781 + } else { + x = Math.sqrt(xx) + y = xy / x + z = xz / x + } + } else if (yy > zz) { + // m22 is the largest diagonal term + + if (yy < epsilon) { + x = 0.707106781 + y = 0 + z = 0.707106781 + } else { + y = Math.sqrt(yy) + x = xy / y + z = yz / y + } + } else { + // m33 is the largest diagonal term so base result on this + + if (zz < epsilon) { + x = 0.707106781 + y = 0.707106781 + z = 0 + } else { + z = Math.sqrt(zz) + x = xz / z + y = yz / z + } + } + + this.set(x, y, z, angle) + + return this // return 180 deg rotation + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( + (m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12) + ) // used to normalize + + if (Math.abs(s) < 0.001) s = 1 + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = (m32 - m23) / s + this.y = (m13 - m31) / s + this.z = (m21 - m12) / s + this.w = Math.acos((m11 + m22 + m33 - 1) / 2) + + return this + }, + + min: function (v) { + this.x = Math.min(this.x, v.x) + this.y = Math.min(this.y, v.y) + this.z = Math.min(this.z, v.z) + this.w = Math.min(this.w, v.w) + + return this + }, + + max: function (v) { + this.x = Math.max(this.x, v.x) + this.y = Math.max(this.y, v.y) + this.z = Math.max(this.z, v.z) + this.w = Math.max(this.w, v.w) + + return this + }, + + clamp: function (min, max) { + // assumes min < max, componentwise + + this.x = Math.max(min.x, Math.min(max.x, this.x)) + this.y = Math.max(min.y, Math.min(max.y, this.y)) + this.z = Math.max(min.z, Math.min(max.z, this.z)) + this.w = Math.max(min.w, Math.min(max.w, this.w)) + + return this + }, + + clampScalar: (function () { + var min, max + + return function clampScalar(minVal, maxVal) { + if (min === undefined) { + min = new Vector4() + max = new Vector4() + } + + min.set(minVal, minVal, minVal, minVal) + max.set(maxVal, maxVal, maxVal, maxVal) + + return this.clamp(min, max) + } + })(), + + clampLength: function (min, max) { + var length = this.length() + + return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length))) + }, + + 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) + + return 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 = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x) + this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y) + this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z) + this.w = this.w < 0 ? Math.ceil(this.w) : Math.floor(this.w) + + return this + }, + + negate: function () { + this.x = -this.x + this.y = -this.y + this.z = -this.z + this.w = -this.w + + return this + }, + + dot: function (v) { + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.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) + }, + + manhattanLength: 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() || 1) + }, + + setLength: function (length) { + return this.normalize().multiplyScalar(length) + }, + + lerp: function (v, alpha) { + this.x += (v.x - this.x) * alpha + this.y += (v.y - this.y) * alpha + this.z += (v.z - this.z) * alpha + this.w += (v.w - this.w) * alpha + + return this + }, + + lerpVectors: function (v1, v2, alpha) { + return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1) + }, + + equals: function (v) { + return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w + }, + + fromArray: function (array, offset) { + if (offset === undefined) offset = 0 + + this.x = array[offset] + this.y = array[offset + 1] + this.z = array[offset + 2] + this.w = array[offset + 3] + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + array[offset] = this.x + array[offset + 1] = this.y + array[offset + 2] = this.z + array[offset + 3] = this.w + + return array + }, + + fromBufferAttribute: function (attribute, index, offset) { + if (offset !== undefined) { + console.warn('THREE.Vector4: offset has been removed from .fromBufferAttribute().') + } + + this.x = attribute.getX(index) + this.y = attribute.getY(index) + this.z = attribute.getZ(index) + this.w = attribute.getW(index) + + return this + } + }) + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget(width, height, options) { + this.uuid = _Math.generateUUID() + + this.width = width + this.height = height + + this.scissor = new Vector4(0, 0, width, height) + this.scissorTest = false + + this.viewport = new Vector4(0, 0, width, height) + + options = options || {} + + if (options.minFilter === undefined) options.minFilter = LinearFilter + + this.texture = new Texture( + undefined, + undefined, + options.wrapS, + options.wrapT, + options.magFilter, + options.minFilter, + options.format, + options.type, + options.anisotropy, + options.encoding + ) + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null + } + + WebGLRenderTarget.prototype = Object.assign(Object.create(EventDispatcher.prototype), { + constructor: WebGLRenderTarget, + + isWebGLRenderTarget: true, + + setSize: function (width, height) { + if (this.width !== width || this.height !== height) { + this.width = width + this.height = height + + this.dispose() + } + + this.viewport.set(0, 0, width, height) + this.scissor.set(0, 0, width, height) + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (source) { + this.width = source.width + this.height = source.height + + this.viewport.copy(source.viewport) + + this.texture = source.texture.clone() + + this.depthBuffer = source.depthBuffer + this.stencilBuffer = source.stencilBuffer + this.depthTexture = source.depthTexture + + return this + }, + + dispose: function () { + this.dispatchEvent({ type: 'dispose' }) + } + }) + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube(width, height, options) { + WebGLRenderTarget.call(this, width, height, options) + + this.activeCubeFace = 0 // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0 + } + + WebGLRenderTargetCube.prototype = Object.create(WebGLRenderTarget.prototype) + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( + data, + width, + height, + format, + type, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + anisotropy, + encoding + ) { + Texture.call( + this, + null, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy, + encoding + ) + + this.image = { data: data, width: width, height: height } + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter + + this.generateMipmaps = false + this.flipY = false + this.unpackAlignment = 1 + } + + DataTexture.prototype = Object.create(Texture.prototype) + DataTexture.prototype.constructor = DataTexture + + DataTexture.prototype.isDataTexture = true + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( + images, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy, + encoding + ) { + images = images !== undefined ? images : [] + mapping = mapping !== undefined ? mapping : CubeReflectionMapping + + Texture.call( + this, + images, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy, + encoding + ) + + this.flipY = false + } + + CubeTexture.prototype = Object.create(Texture.prototype) + CubeTexture.prototype.constructor = CubeTexture + + CubeTexture.prototype.isCubeTexture = true + + Object.defineProperty(CubeTexture.prototype, 'images', { + get: function () { + return this.image + }, + + set: function (value) { + this.image = value + } + }) + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture() + var emptyCubeTexture = new CubeTexture() + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + this.seq = [] + this.map = {} + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = [] + var arrayCacheI32 = [] + + // Float32Array caches used for uploading Matrix uniforms + + var mat4array = new Float32Array(16) + var mat3array = new Float32Array(9) + + // Flattening for arrays of vectors and matrices + + function flatten(array, nBlocks, blockSize) { + var firstElem = array[0] + + if (firstElem <= 0 || firstElem > 0) return array + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[n] + + if (r === undefined) { + r = new Float32Array(n) + arrayCacheF32[n] = r + } + + if (nBlocks !== 0) { + firstElem.toArray(r, 0) + + for (var i = 1, offset = 0; i !== nBlocks; ++i) { + offset += blockSize + array[i].toArray(r, offset) + } + } + + return r + } + + // Texture unit allocation + + function allocTexUnits(renderer, n) { + var r = arrayCacheI32[n] + + if (r === undefined) { + r = new Int32Array(n) + arrayCacheI32[n] = r + } + + for (var i = 0; i !== n; ++i) r[i] = renderer.allocTextureUnit() + + return r + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f(gl, v) { + gl.uniform1f(this.addr, v) + } + + function setValue1i(gl, v) { + gl.uniform1i(this.addr, v) + } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv(gl, v) { + if (v.x === undefined) { + gl.uniform2fv(this.addr, v) + } else { + gl.uniform2f(this.addr, v.x, v.y) + } + } + + function setValue3fv(gl, v) { + if (v.x !== undefined) { + gl.uniform3f(this.addr, v.x, v.y, v.z) + } else if (v.r !== undefined) { + gl.uniform3f(this.addr, v.r, v.g, v.b) + } else { + gl.uniform3fv(this.addr, v) + } + } + + function setValue4fv(gl, v) { + if (v.x === undefined) { + gl.uniform4fv(this.addr, v) + } else { + gl.uniform4f(this.addr, v.x, v.y, v.z, v.w) + } + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm(gl, v) { + gl.uniformMatrix2fv(this.addr, false, v.elements || v) + } + + function setValue3fm(gl, v) { + if (v.elements === undefined) { + gl.uniformMatrix3fv(this.addr, false, v) + } else { + mat3array.set(v.elements) + gl.uniformMatrix3fv(this.addr, false, mat3array) + } + } + + function setValue4fm(gl, v) { + if (v.elements === undefined) { + gl.uniformMatrix4fv(this.addr, false, v) + } else { + mat4array.set(v.elements) + gl.uniformMatrix4fv(this.addr, false, mat4array) + } + } + + // Single texture (2D / Cube) + + function setValueT1(gl, v, renderer) { + var unit = renderer.allocTextureUnit() + gl.uniform1i(this.addr, unit) + renderer.setTexture2D(v || emptyTexture, unit) + } + + function setValueT6(gl, v, renderer) { + var unit = renderer.allocTextureUnit() + gl.uniform1i(this.addr, unit) + renderer.setTextureCube(v || emptyCubeTexture, unit) + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv(gl, v) { + gl.uniform2iv(this.addr, v) + } + + function setValue3iv(gl, v) { + gl.uniform3iv(this.addr, v) + } + + function setValue4iv(gl, v) { + gl.uniform4iv(this.addr, v) + } + + // Helper to pick the right setter for the singular case + + function getSingularSetter(type) { + switch (type) { + case 0x1406: + return setValue1f // FLOAT + case 0x8b50: + return setValue2fv // _VEC2 + case 0x8b51: + return setValue3fv // _VEC3 + case 0x8b52: + return setValue4fv // _VEC4 + + case 0x8b5a: + return setValue2fm // _MAT2 + case 0x8b5b: + return setValue3fm // _MAT3 + case 0x8b5c: + return setValue4fm // _MAT4 + + case 0x8b5e: + case 0x8d66: + return setValueT1 // SAMPLER_2D, SAMPLER_EXTERNAL_OES + case 0x8b60: + return setValueT6 // SAMPLER_CUBE + + case 0x1404: + case 0x8b56: + return setValue1i // INT, BOOL + case 0x8b53: + case 0x8b57: + return setValue2iv // _VEC2 + case 0x8b54: + case 0x8b58: + return setValue3iv // _VEC3 + case 0x8b55: + case 0x8b59: + return setValue4iv // _VEC4 + } + } + + // Array of scalars + + function setValue1fv(gl, v) { + gl.uniform1fv(this.addr, v) + } + function setValue1iv(gl, v) { + gl.uniform1iv(this.addr, v) + } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a(gl, v) { + gl.uniform2fv(this.addr, flatten(v, this.size, 2)) + } + + function setValueV3a(gl, v) { + gl.uniform3fv(this.addr, flatten(v, this.size, 3)) + } + + function setValueV4a(gl, v) { + gl.uniform4fv(this.addr, flatten(v, this.size, 4)) + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a(gl, v) { + gl.uniformMatrix2fv(this.addr, false, flatten(v, this.size, 4)) + } + + function setValueM3a(gl, v) { + gl.uniformMatrix3fv(this.addr, false, flatten(v, this.size, 9)) + } + + function setValueM4a(gl, v) { + gl.uniformMatrix4fv(this.addr, false, flatten(v, this.size, 16)) + } + + // Array of textures (2D / Cube) + + function setValueT1a(gl, v, renderer) { + var n = v.length, + units = allocTexUnits(renderer, n) + + gl.uniform1iv(this.addr, units) + + for (var i = 0; i !== n; ++i) { + renderer.setTexture2D(v[i] || emptyTexture, units[i]) + } + } + + function setValueT6a(gl, v, renderer) { + var n = v.length, + units = allocTexUnits(renderer, n) + + gl.uniform1iv(this.addr, units) + + for (var i = 0; i !== n; ++i) { + renderer.setTextureCube(v[i] || emptyCubeTexture, units[i]) + } + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter(type) { + switch (type) { + case 0x1406: + return setValue1fv // FLOAT + case 0x8b50: + return setValueV2a // _VEC2 + case 0x8b51: + return setValueV3a // _VEC3 + case 0x8b52: + return setValueV4a // _VEC4 + + case 0x8b5a: + return setValueM2a // _MAT2 + case 0x8b5b: + return setValueM3a // _MAT3 + case 0x8b5c: + return setValueM4a // _MAT4 + + case 0x8b5e: + return setValueT1a // SAMPLER_2D + case 0x8b60: + return setValueT6a // SAMPLER_CUBE + + case 0x1404: + case 0x8b56: + return setValue1iv // INT, BOOL + case 0x8b53: + case 0x8b57: + return setValue2iv // _VEC2 + case 0x8b54: + case 0x8b58: + return setValue3iv // _VEC3 + case 0x8b55: + case 0x8b59: + return setValue4iv // _VEC4 + } + } + + // --- Uniform Classes --- + + function SingleUniform(id, activeInfo, addr) { + this.id = id + this.addr = addr + this.setValue = getSingularSetter(activeInfo.type) + + // this.path = activeInfo.name; // DEBUG + } + + function PureArrayUniform(id, activeInfo, addr) { + this.id = id + this.addr = addr + this.size = activeInfo.size + this.setValue = getPureArraySetter(activeInfo.type) + + // this.path = activeInfo.name; // DEBUG + } + + function StructuredUniform(id) { + this.id = id + + UniformContainer.call(this) // mix-in + } + + StructuredUniform.prototype.setValue = function (gl, value) { + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq + + for (var i = 0, n = seq.length; i !== n; ++i) { + var u = seq[i] + u.setValue(gl, value[u.id]) + } + } + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform(container, uniformObject) { + container.seq.push(uniformObject) + container.map[uniformObject.id] = uniformObject + } + + function parseUniform(activeInfo, addr, container) { + var path = activeInfo.name, + pathLength = path.length + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0 + + for (;;) { + var match = RePathPart.exec(path), + matchEnd = RePathPart.lastIndex, + id = match[1], + idIsIndex = match[2] === ']', + subscript = match[3] + + if (idIsIndex) id = id | 0 // convert to integer + + if (subscript === undefined || (subscript === '[' && matchEnd + 2 === pathLength)) { + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( + container, + subscript === undefined + ? new SingleUniform(id, activeInfo, addr) + : new PureArrayUniform(id, activeInfo, addr) + ) + + break + } else { + // step into inner node / create it in case it doesn't exist + + var map = container.map, + next = map[id] + + if (next === undefined) { + next = new StructuredUniform(id) + addUniform(container, next) + } + + container = next + } + } + } + + // Root Container + + function WebGLUniforms(gl, program, renderer) { + UniformContainer.call(this) + + this.renderer = renderer + + var n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) + + for (var i = 0; i < n; ++i) { + var info = gl.getActiveUniform(program, i), + path = info.name, + addr = gl.getUniformLocation(program, path) + + parseUniform(info, addr, this) + } + } + + WebGLUniforms.prototype.setValue = function (gl, name, value) { + var u = this.map[name] + + if (u !== undefined) u.setValue(gl, value, this.renderer) + } + + WebGLUniforms.prototype.setOptional = function (gl, object, name) { + var v = object[name] + + if (v !== undefined) this.setValue(gl, name, v) + } + + // Static interface + + WebGLUniforms.upload = function (gl, seq, values, renderer) { + for (var i = 0, n = seq.length; i !== n; ++i) { + var u = seq[i], + v = values[u.id] + + if (v.needsUpdate !== false) { + // note: always updating when .needsUpdate is undefined + u.setValue(gl, v.value, renderer) + } + } + } + + WebGLUniforms.seqWithValue = function (seq, values) { + var r = [] + + for (var i = 0, n = seq.length; i !== n; ++i) { + var u = seq[i] + if (u.id in values) r.push(u) + } + + return r + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var ColorKeywords = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + } + + function Color(r, g, b) { + if (g === undefined && b === undefined) { + // r is THREE.Color, hex or string + return this.set(r) + } + + return this.setRGB(r, g, b) + } + + Object.assign(Color.prototype, { + isColor: true, + + r: 1, + g: 1, + b: 1, + + set: function (value) { + if (value && value.isColor) { + this.copy(value) + } else if (typeof value === 'number') { + this.setHex(value) + } else if (typeof value === 'string') { + this.setStyle(value) + } + + return this + }, + + setScalar: function (scalar) { + this.r = scalar + this.g = scalar + this.b = scalar + + return this + }, + + setHex: function (hex) { + hex = Math.floor(hex) + + this.r = ((hex >> 16) & 255) / 255 + this.g = ((hex >> 8) & 255) / 255 + this.b = (hex & 255) / 255 + + return this + }, + + setRGB: function (r, g, b) { + this.r = r + this.g = g + this.b = b + + return this + }, + + setHSL: (function () { + function hue2rgb(p, q, t) { + if (t < 0) t += 1 + if (t > 1) t -= 1 + if (t < 1 / 6) return p + (q - p) * 6 * t + if (t < 1 / 2) return q + if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t) + return p + } + + return function setHSL(h, s, l) { + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo(h, 1) + s = _Math.clamp(s, 0, 1) + l = _Math.clamp(l, 0, 1) + + if (s === 0) { + this.r = this.g = this.b = l + } else { + var p = l <= 0.5 ? l * (1 + s) : l + s - l * s + var q = 2 * l - p + + this.r = hue2rgb(q, p, h + 1 / 3) + this.g = hue2rgb(q, p, h) + this.b = hue2rgb(q, p, h - 1 / 3) + } + + return this + } + })(), + + setStyle: function (style) { + function handleAlpha(string) { + if (string === undefined) return + + if (parseFloat(string) < 1) { + console.warn('THREE.Color: Alpha component of ' + style + ' will be ignored.') + } + } + + var m + + if ((m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style))) { + // rgb / hsl + + var color + var name = m[1] + var components = m[2] + + switch (name) { + case 'rgb': + case 'rgba': + if ( + (color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( + components + )) + ) { + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min(255, parseInt(color[1], 10)) / 255 + this.g = Math.min(255, parseInt(color[2], 10)) / 255 + this.b = Math.min(255, parseInt(color[3], 10)) / 255 + + handleAlpha(color[5]) + + return this + } + + if ( + (color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( + components + )) + ) { + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min(100, parseInt(color[1], 10)) / 100 + this.g = Math.min(100, parseInt(color[2], 10)) / 100 + this.b = Math.min(100, parseInt(color[3], 10)) / 100 + + handleAlpha(color[5]) + + return this + } + + break + + case 'hsl': + case 'hsla': + if ( + (color = + /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( + components + )) + ) { + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat(color[1]) / 360 + var s = parseInt(color[2], 10) / 100 + var l = parseInt(color[3], 10) / 100 + + handleAlpha(color[5]) + + return this.setHSL(h, s, l) + } + + break + } + } else if ((m = /^\#([A-Fa-f0-9]+)$/.exec(style))) { + // hex color + + var hex = m[1] + var size = hex.length + + if (size === 3) { + // #ff0 + this.r = parseInt(hex.charAt(0) + hex.charAt(0), 16) / 255 + this.g = parseInt(hex.charAt(1) + hex.charAt(1), 16) / 255 + this.b = parseInt(hex.charAt(2) + hex.charAt(2), 16) / 255 + + return this + } else if (size === 6) { + // #ff0000 + this.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255 + this.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255 + this.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255 + + return this + } + } + + if (style && style.length > 0) { + // color keywords + var hex = ColorKeywords[style] + + if (hex !== undefined) { + // red + this.setHex(hex) + } else { + // unknown color + console.warn('THREE.Color: Unknown color ' + style) + } + } + + return this + }, + + clone: function () { + return new this.constructor(this.r, this.g, this.b) + }, + + copy: function (color) { + this.r = color.r + this.g = color.g + this.b = color.b + + return this + }, + + copyGammaToLinear: function (color, gammaFactor) { + if (gammaFactor === undefined) gammaFactor = 2.0 + + this.r = Math.pow(color.r, gammaFactor) + this.g = Math.pow(color.g, gammaFactor) + this.b = Math.pow(color.b, gammaFactor) + + return this + }, + + copyLinearToGamma: function (color, gammaFactor) { + if (gammaFactor === undefined) gammaFactor = 2.0 + + var safeInverse = gammaFactor > 0 ? 1.0 / gammaFactor : 1.0 + + this.r = Math.pow(color.r, safeInverse) + this.g = Math.pow(color.g, safeInverse) + this.b = Math.pow(color.b, safeInverse) + + return this + }, + + convertGammaToLinear: function () { + var r = this.r, + g = this.g, + b = this.b + + this.r = r * r + this.g = g * g + this.b = b * b + + 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 ((this.r * 255) << 16) ^ ((this.g * 255) << 8) ^ ((this.b * 255) << 0) + }, + + getHexString: function () { + return ('000000' + this.getHex().toString(16)).slice(-6) + }, + + getHSL: function (optionalTarget) { + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 } + + var r = this.r, + g = this.g, + b = this.b + + var max = Math.max(r, g, b) + var min = Math.min(r, g, b) + + var hue, saturation + var lightness = (min + max) / 2.0 + + if (min === max) { + hue = 0 + saturation = 0 + } else { + var delta = max - min + + saturation = lightness <= 0.5 ? delta / (max + min) : delta / (2 - max - min) + + switch (max) { + case r: + hue = (g - b) / delta + (g < b ? 6 : 0) + break + case g: + hue = (b - r) / delta + 2 + break + case b: + hue = (r - g) / delta + 4 + break + } + + hue /= 6 + } + + hsl.h = hue + hsl.s = saturation + hsl.l = lightness + + return hsl + }, + + getStyle: function () { + return ( + 'rgb(' + + ((this.r * 255) | 0) + + ',' + + ((this.g * 255) | 0) + + ',' + + ((this.b * 255) | 0) + + ')' + ) + }, + + offsetHSL: function (h, s, l) { + var hsl = this.getHSL() + + hsl.h += h + hsl.s += s + hsl.l += l + + this.setHSL(hsl.h, hsl.s, hsl.l) + + return this + }, + + add: function (color) { + this.r += color.r + this.g += color.g + this.b += color.b + + return this + }, + + addColors: function (color1, color2) { + this.r = color1.r + color2.r + this.g = color1.g + color2.g + this.b = color1.b + color2.b + + return this + }, + + addScalar: function (s) { + this.r += s + this.g += s + this.b += s + + return this + }, + + sub: function (color) { + this.r = Math.max(0, this.r - color.r) + this.g = Math.max(0, this.g - color.g) + this.b = Math.max(0, this.b - color.b) + + return this + }, + + multiply: function (color) { + this.r *= color.r + this.g *= color.g + this.b *= color.b + + return this + }, + + multiplyScalar: function (s) { + this.r *= s + this.g *= s + this.b *= s + + return this + }, + + lerp: function (color, alpha) { + this.r += (color.r - this.r) * alpha + this.g += (color.g - this.g) * alpha + this.b += (color.b - this.b) * alpha + + return this + }, + + equals: function (c) { + return c.r === this.r && c.g === this.g && c.b === this.b + }, + + fromArray: function (array, offset) { + if (offset === undefined) offset = 0 + + this.r = array[offset] + this.g = array[offset + 1] + this.b = array[offset + 2] + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + array[offset] = this.r + array[offset + 1] = this.g + array[offset + 2] = this.b + + return array + }, + + toJSON: function () { + return this.getHex() + } + }) + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + common: { + diffuse: { value: new Color(0xeeeeee) }, + opacity: { value: 1.0 }, + + map: { value: null }, + uvTransform: { value: new Matrix3() }, + + alphaMap: { value: null } + }, + + specularmap: { + specularMap: { value: null } + }, + + envmap: { + envMap: { value: null }, + flipEnvMap: { value: -1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 } + }, + + aomap: { + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + }, + + lightmap: { + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + }, + + emissivemap: { + emissiveMap: { value: null } + }, + + bumpmap: { + bumpMap: { value: null }, + bumpScale: { value: 1 } + }, + + normalmap: { + normalMap: { value: null }, + normalScale: { value: new Vector2(1, 1) } + }, + + displacementmap: { + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + }, + + roughnessmap: { + roughnessMap: { value: null } + }, + + metalnessmap: { + metalnessMap: { value: null } + }, + + gradientmap: { + gradientMap: { value: null } + }, + + fog: { + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color(0xffffff) } + }, + + lights: { + ambientLightColor: { value: [] }, + + directionalLights: { + value: [], + properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } + }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { + value: [], + properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } + }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { + value: [], + properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } + }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { + value: [], + properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } + }, + + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { + value: [], + properties: { + color: {}, + position: {}, + width: {}, + height: {} + } + } + }, + + points: { + diffuse: { value: new Color(0xeeeeee) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + uvTransform: { value: new Matrix3() } + } + } + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + merge: function (uniforms) { + var merged = {} + + for (var u = 0; u < uniforms.length; u++) { + var tmp = this.clone(uniforms[u]) + + for (var p in tmp) { + merged[p] = tmp[p] + } + } + + return merged + }, + + clone: function (uniforms_src) { + var uniforms_dst = {} + + for (var u in uniforms_src) { + uniforms_dst[u] = {} + + for (var p in uniforms_src[u]) { + var parameter_src = uniforms_src[u][p] + + if ( + parameter_src && + (parameter_src.isColor || + parameter_src.isMatrix3 || + parameter_src.isMatrix4 || + parameter_src.isVector2 || + parameter_src.isVector3 || + parameter_src.isVector4 || + parameter_src.isTexture) + ) { + uniforms_dst[u][p] = parameter_src.clone() + } else if (Array.isArray(parameter_src)) { + uniforms_dst[u][p] = parameter_src.slice() + } else { + uniforms_dst[u][p] = parameter_src + } + } + } + + return uniforms_dst + } + } + + var alphamap_fragment = + '#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n' + + var alphamap_pars_fragment = '#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n' + + var alphatest_fragment = + '#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n' + + var aomap_fragment = + '#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n' + + var aomap_pars_fragment = + '#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif' + + var begin_vertex = '\nvec3 transformed = vec3( position );\n' + + var beginnormal_vertex = '\nvec3 objectNormal = vec3( normal );\n' + + var bsdfs = + 'float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n' + + var bumpmap_pars_fragment = + '#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\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\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n' + + var clipping_planes_fragment = + '#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n' + + var clipping_planes_pars_fragment = + '#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n' + + var clipping_planes_pars_vertex = + '#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n' + + var clipping_planes_vertex = + '#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n' + + var color_fragment = '#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif' + + var color_pars_fragment = '#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n' + + var color_pars_vertex = '#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif' + + var color_vertex = '#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif' + + var common = + '#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n' + + var cube_uv_reflection_fragment = + '#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n' + + var defaultnormal_vertex = + 'vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n' + + var displacementmap_pars_vertex = + '#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n' + + var displacementmap_vertex = + '#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n' + + var emissivemap_fragment = + '#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n' + + var emissivemap_pars_fragment = + '#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n' + + var encodings_fragment = ' gl_FragColor = linearToOutputTexel( gl_FragColor );\n' + + var encodings_pars_fragment = + '\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n' + + var envmap_fragment = + '#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n' + + var envmap_pars_fragment = + '#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n' + + var envmap_pars_vertex = + '#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n' + + var envmap_vertex = + '#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n' + + var fog_vertex = '\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif' + + var fog_pars_vertex = '#ifdef USE_FOG\n varying float fogDepth;\n#endif\n' + + var fog_fragment = + '#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n' + + var fog_pars_fragment = + '#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n' + + var gradientmap_pars_fragment = + '#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n' + + var lightmap_fragment = + '#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n' + + var lightmap_pars_fragment = + '#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif' + + var lights_lambert_vertex = + 'vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n' + + var lights_pars = + 'uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n' + + var lights_phong_fragment = + 'BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n' + + var lights_phong_pars_fragment = + 'varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n' + + var lights_physical_fragment = + 'PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n' + + var lights_physical_pars_fragment = + 'struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n' + + var lights_template = + '\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n' + + var logdepthbuf_fragment = + '#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif' + + var logdepthbuf_pars_fragment = + '#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n' + + var logdepthbuf_pars_vertex = + '#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif' + + var logdepthbuf_vertex = + '#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n' + + var map_fragment = + '#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n' + + var map_pars_fragment = '#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n' + + var map_particle_fragment = + '#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n' + + var map_particle_pars_fragment = + '#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n' + + var metalnessmap_fragment = + 'float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n' + + var metalnessmap_pars_fragment = + '#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif' + + var morphnormal_vertex = + '#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n' + + var morphtarget_pars_vertex = + '#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif' + + var morphtarget_vertex = + '#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n' + + var normal_fragment = + '#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n' + + var normalmap_pars_fragment = + '#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\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\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\t}\n#endif\n' + + var packing = + 'vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n' + + var premultiplied_alpha_fragment = + '#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n' + + var project_vertex = + 'vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n' + + var dithering_fragment = + '#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n' + + var dithering_pars_fragment = + '#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n' + + var roughnessmap_fragment = + 'float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n' + + var roughnessmap_pars_fragment = + '#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif' + + var shadowmap_pars_fragment = + '#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\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\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n' + + var shadowmap_pars_vertex = + '#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n' + + var shadowmap_vertex = + '#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n' + + var shadowmask_pars_fragment = + 'float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n' + + var skinbase_vertex = + '#ifdef USE_SKINNING\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#endif' + + var skinning_pars_vertex = + '#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\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\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n' + + var skinning_vertex = + '#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\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\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n' + + var skinnormal_vertex = + '#ifdef USE_SKINNING\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\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n' + + var specularmap_fragment = + 'float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif' + + var specularmap_pars_fragment = '#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif' + + var tonemapping_fragment = + '#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n' + + var tonemapping_pars_fragment = + '#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n' + + var uv_pars_fragment = + '#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif' + + var uv_pars_vertex = + '#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n' + + var uv_vertex = + '#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif' + + var uv2_pars_fragment = + '#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif' + + var uv2_pars_vertex = + '#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif' + + var uv2_vertex = '#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif' + + var worldpos_vertex = + '#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n' + + var cube_frag = + 'uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n' + + var cube_vert = + 'varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n' + + var depth_frag = + '#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n' + + var depth_vert = + '#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n' + + var distanceRGBA_frag = + '#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n' + + var distanceRGBA_vert = + '#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n' + + var equirect_frag = + 'uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n' + + var equirect_vert = + 'varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n' + + var linedashed_frag = + 'uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n' + + var linedashed_vert = + 'uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n' + + var meshbasic_frag = + 'uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n' + + var meshbasic_vert = + '#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n' + + var meshlambert_frag = + 'uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n' + + var meshlambert_vert = + '#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n' + + var meshphong_frag = + '#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n' + + var meshphong_vert = + '#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n' + + var meshphysical_frag = + '#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n' + + var meshphysical_vert = + '#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n' + + var normal_frag = + '#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n' + + var normal_vert = + '#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n' + + var points_frag = + 'uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n' + + var points_vert = + 'uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n' + + var shadow_frag = + 'uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n' + + var shadow_vert = + '#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n' + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_vertex: fog_vertex, + fog_pars_vertex: fog_pars_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + gradientmap_pars_fragment: gradientmap_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars: lights_pars, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_template: lights_template, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_fragment: normal_fragment, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + dithering_fragment: dithering_fragment, + dithering_pars_fragment: dithering_pars_fragment, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + basic: { + uniforms: UniformsUtils.merge([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ]), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + }, + + lambert: { + uniforms: UniformsUtils.merge([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color(0x000000) } + } + ]), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + }, + + phong: { + uniforms: UniformsUtils.merge([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color(0x000000) }, + specular: { value: new Color(0x111111) }, + shininess: { value: 30 } + } + ]), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + }, + + standard: { + uniforms: UniformsUtils.merge([ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color(0x000000) }, + roughness: { value: 0.5 }, + metalness: { value: 0.5 }, + envMapIntensity: { value: 1 } // temporary + } + ]), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + }, + + points: { + uniforms: UniformsUtils.merge([UniformsLib.points, UniformsLib.fog]), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + }, + + dashed: { + uniforms: UniformsUtils.merge([ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ]), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + }, + + depth: { + uniforms: UniformsUtils.merge([UniformsLib.common, UniformsLib.displacementmap]), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + }, + + normal: { + uniforms: UniformsUtils.merge([ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1.0 } + } + ]), + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + uniforms: { + tCube: { value: null }, + tFlip: { value: -1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + }, + + equirect: { + uniforms: { + tEquirect: { value: null } + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + }, + + distanceRGBA: { + uniforms: UniformsUtils.merge([ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1000 } + } + ]), + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + }, + + shadow: { + uniforms: UniformsUtils.merge([ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color(0x00000) }, + opacity: { value: 1.0 } + } + ]), + + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + } + } + + ShaderLib.physical = { + uniforms: UniformsUtils.merge([ + ShaderLib.standard.uniforms, + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + ]), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( + canvas, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy + ) { + Texture.call( + this, + canvas, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy + ) + + this.needsUpdate = true + } + + CanvasTexture.prototype = Object.create(Texture.prototype) + CanvasTexture.prototype.constructor = CanvasTexture + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function WebGLSpriteRenderer(renderer, gl, state, textures, capabilities) { + var vertexBuffer, elementBuffer + var program, attributes, uniforms + + var texture + + // decompose matrixWorld + + var spritePosition = new Vector3() + var spriteRotation = new Quaternion() + var spriteScale = new Vector3() + + function init() { + var vertices = new Float32Array([ + -0.5, -0.5, 0, 0, 0.5, -0.5, 1, 0, 0.5, 0.5, 1, 1, -0.5, 0.5, 0, 1 + ]) + + var faces = new Uint16Array([0, 1, 2, 0, 2, 3]) + + vertexBuffer = gl.createBuffer() + elementBuffer = gl.createBuffer() + + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer) + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW) + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer) + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW) + + program = createProgram() + + attributes = { + position: gl.getAttribLocation(program, 'position'), + uv: gl.getAttribLocation(program, 'uv') + } + + uniforms = { + uvOffset: gl.getUniformLocation(program, 'uvOffset'), + uvScale: gl.getUniformLocation(program, 'uvScale'), + + rotation: gl.getUniformLocation(program, 'rotation'), + center: gl.getUniformLocation(program, 'center'), + scale: gl.getUniformLocation(program, 'scale'), + + color: gl.getUniformLocation(program, 'color'), + map: gl.getUniformLocation(program, 'map'), + opacity: gl.getUniformLocation(program, 'opacity'), + + modelViewMatrix: gl.getUniformLocation(program, 'modelViewMatrix'), + projectionMatrix: gl.getUniformLocation(program, 'projectionMatrix'), + + fogType: gl.getUniformLocation(program, 'fogType'), + fogDensity: gl.getUniformLocation(program, 'fogDensity'), + fogNear: gl.getUniformLocation(program, 'fogNear'), + fogFar: gl.getUniformLocation(program, 'fogFar'), + fogColor: gl.getUniformLocation(program, 'fogColor'), + fogDepth: gl.getUniformLocation(program, 'fogDepth'), + + alphaTest: gl.getUniformLocation(program, 'alphaTest') + } + + var canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas') + canvas.width = 8 + canvas.height = 8 + + var context = canvas.getContext('2d') + context.fillStyle = 'white' + context.fillRect(0, 0, 8, 8) + + texture = new CanvasTexture(canvas) + } + + this.render = function (sprites, scene, camera) { + if (sprites.length === 0) return + + // setup gl + + if (program === undefined) { + init() + } + + state.useProgram(program) + + state.initAttributes() + state.enableAttribute(attributes.position) + state.enableAttribute(attributes.uv) + state.disableUnusedAttributes() + + state.disable(gl.CULL_FACE) + state.enable(gl.BLEND) + + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer) + gl.vertexAttribPointer(attributes.position, 2, gl.FLOAT, false, 2 * 8, 0) + gl.vertexAttribPointer(attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8) + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer) + + gl.uniformMatrix4fv(uniforms.projectionMatrix, false, camera.projectionMatrix.elements) + + state.activeTexture(gl.TEXTURE0) + gl.uniform1i(uniforms.map, 0) + + var oldFogType = 0 + var sceneFogType = 0 + var fog = scene.fog + + if (fog) { + gl.uniform3f(uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b) + + if (fog.isFog) { + gl.uniform1f(uniforms.fogNear, fog.near) + gl.uniform1f(uniforms.fogFar, fog.far) + + gl.uniform1i(uniforms.fogType, 1) + oldFogType = 1 + sceneFogType = 1 + } else if (fog.isFogExp2) { + gl.uniform1f(uniforms.fogDensity, fog.density) + + gl.uniform1i(uniforms.fogType, 2) + oldFogType = 2 + sceneFogType = 2 + } + } else { + gl.uniform1i(uniforms.fogType, 0) + oldFogType = 0 + sceneFogType = 0 + } + + // update positions and sort + + for (var i = 0, l = sprites.length; i < l; i++) { + var sprite = sprites[i] + + sprite.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, sprite.matrixWorld) + sprite.z = -sprite.modelViewMatrix.elements[14] + } + + sprites.sort(painterSortStable) + + // render all sprites + + var scale = [] + var center = [] + + for (var i = 0, l = sprites.length; i < l; i++) { + var sprite = sprites[i] + var material = sprite.material + + if (material.visible === false) continue + + sprite.onBeforeRender(renderer, scene, camera, undefined, material, undefined) + + gl.uniform1f(uniforms.alphaTest, material.alphaTest) + gl.uniformMatrix4fv(uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements) + + sprite.matrixWorld.decompose(spritePosition, spriteRotation, spriteScale) + + scale[0] = spriteScale.x + scale[1] = spriteScale.y + + center[0] = sprite.center.x - 0.5 + center[1] = sprite.center.y - 0.5 + + var fogType = 0 + + if (scene.fog && material.fog) { + fogType = sceneFogType + } + + if (oldFogType !== fogType) { + gl.uniform1i(uniforms.fogType, fogType) + oldFogType = fogType + } + + if (material.map !== null) { + gl.uniform2f(uniforms.uvOffset, material.map.offset.x, material.map.offset.y) + gl.uniform2f(uniforms.uvScale, material.map.repeat.x, material.map.repeat.y) + } else { + gl.uniform2f(uniforms.uvOffset, 0, 0) + gl.uniform2f(uniforms.uvScale, 1, 1) + } + + gl.uniform1f(uniforms.opacity, material.opacity) + gl.uniform3f(uniforms.color, material.color.r, material.color.g, material.color.b) + + gl.uniform1f(uniforms.rotation, material.rotation) + gl.uniform2fv(uniforms.center, center) + gl.uniform2fv(uniforms.scale, scale) + + state.setBlending( + material.blending, + material.blendEquation, + material.blendSrc, + material.blendDst, + material.blendEquationAlpha, + material.blendSrcAlpha, + material.blendDstAlpha, + material.premultipliedAlpha + ) + state.buffers.depth.setTest(material.depthTest) + state.buffers.depth.setMask(material.depthWrite) + state.buffers.color.setMask(material.colorWrite) + + textures.setTexture2D(material.map || texture, 0) + + gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0) + + sprite.onAfterRender(renderer, scene, camera, undefined, material, undefined) + } + + // restore gl + + state.enable(gl.CULL_FACE) + + state.reset() + } + + function createProgram() { + var program = gl.createProgram() + + var vertexShader = gl.createShader(gl.VERTEX_SHADER) + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER) + + gl.shaderSource( + vertexShader, + [ + 'precision ' + capabilities.precision + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 center;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + 'varying float fogDepth;', + + 'void main() {', + + ' vUV = uvOffset + uv * uvScale;', + + ' vec2 alignedPosition = ( position - center ) * scale;', + + ' vec2 rotatedPosition;', + ' rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + ' rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + ' vec4 mvPosition;', + + ' mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + ' mvPosition.xy += rotatedPosition;', + + ' gl_Position = projectionMatrix * mvPosition;', + + ' fogDepth = - mvPosition.z;', + + '}' + ].join('\n') + ) + + gl.shaderSource( + fragmentShader, + [ + 'precision ' + capabilities.precision + ' float;', + + '#define SHADER_NAME ' + 'SpriteMaterial', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + 'varying float fogDepth;', + + 'void main() {', + + ' vec4 texture = texture2D( map, vUV );', + + ' gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + ' if ( gl_FragColor.a < alphaTest ) discard;', + + ' if ( fogType > 0 ) {', + + ' float fogFactor = 0.0;', + + ' if ( fogType == 1 ) {', + + ' fogFactor = smoothstep( fogNear, fogFar, fogDepth );', + + ' } else {', + + ' const float LOG2 = 1.442695;', + ' fogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );', + ' fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + ' }', + + ' gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );', + + ' }', + + '}' + ].join('\n') + ) + + gl.compileShader(vertexShader) + gl.compileShader(fragmentShader) + + gl.attachShader(program, vertexShader) + gl.attachShader(program, fragmentShader) + + gl.linkProgram(program) + + return program + } + + function painterSortStable(a, b) { + if (a.renderOrder !== b.renderOrder) { + return a.renderOrder - b.renderOrder + } else if (a.z !== b.z) { + return b.z - a.z + } else { + return b.id - a.id + } + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + var materialId = 0 + + function Material() { + Object.defineProperty(this, 'id', { value: materialId++ }) + + this.uuid = _Math.generateUUID() + + this.name = '' + this.type = 'Material' + + this.fog = true + this.lights = true + + this.blending = NormalBlending + this.side = FrontSide + this.flatShading = false + this.vertexColors = NoColors // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1 + this.transparent = false + + this.blendSrc = SrcAlphaFactor + this.blendDst = OneMinusSrcAlphaFactor + this.blendEquation = AddEquation + this.blendSrcAlpha = null + this.blendDstAlpha = null + this.blendEquationAlpha = null + + this.depthFunc = LessEqualDepth + this.depthTest = true + this.depthWrite = true + + this.clippingPlanes = null + this.clipIntersection = false + this.clipShadows = false + + this.shadowSide = null + + this.colorWrite = true + + this.precision = null // override the renderer's default precision for this material + + this.polygonOffset = false + this.polygonOffsetFactor = 0 + this.polygonOffsetUnits = 0 + + this.dithering = false + + this.alphaTest = 0 + this.premultipliedAlpha = false + + this.overdraw = 0 // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true + + this.userData = {} + + this.needsUpdate = true + } + + Material.prototype = Object.assign(Object.create(EventDispatcher.prototype), { + constructor: Material, + + isMaterial: true, + + onBeforeCompile: function () {}, + + setValues: function (values) { + if (values === undefined) return + + for (var key in values) { + var newValue = values[key] + + if (newValue === undefined) { + console.warn("THREE.Material: '" + key + "' parameter is undefined.") + continue + } + + // for backward compatability if shading is set in the constructor + if (key === 'shading') { + console.warn( + 'THREE.' + + this.type + + ': .shading has been removed. Use the boolean .flatShading instead.' + ) + this.flatShading = newValue === FlatShading ? true : false + continue + } + + var currentValue = this[key] + + if (currentValue === undefined) { + console.warn('THREE.' + this.type + ": '" + key + "' is not a property of this material.") + continue + } + + if (currentValue && currentValue.isColor) { + currentValue.set(newValue) + } else if (currentValue && currentValue.isVector3 && newValue && newValue.isVector3) { + currentValue.copy(newValue) + } else if (key === 'overdraw') { + // ensure overdraw is backwards-compatible with legacy boolean type + this[key] = Number(newValue) + } else { + this[key] = newValue + } + } + }, + + toJSON: function (meta) { + var isRoot = meta === undefined || typeof meta === 'string' + + if (isRoot) { + meta = { + textures: {}, + images: {} + } + } + + var data = { + metadata: { + version: 4.5, + type: 'Material', + generator: 'Material.toJSON' + } + } + + // standard Material serialization + data.uuid = this.uuid + data.type = this.type + + if (this.name !== '') data.name = this.name + + if (this.color && this.color.isColor) data.color = this.color.getHex() + + if (this.roughness !== undefined) data.roughness = this.roughness + if (this.metalness !== undefined) data.metalness = this.metalness + + if (this.emissive && this.emissive.isColor) data.emissive = this.emissive.getHex() + if (this.emissiveIntensity !== 1) data.emissiveIntensity = this.emissiveIntensity + + if (this.specular && this.specular.isColor) data.specular = this.specular.getHex() + if (this.shininess !== undefined) data.shininess = this.shininess + if (this.clearCoat !== undefined) data.clearCoat = this.clearCoat + if (this.clearCoatRoughness !== undefined) data.clearCoatRoughness = this.clearCoatRoughness + + if (this.map && this.map.isTexture) data.map = this.map.toJSON(meta).uuid + if (this.alphaMap && this.alphaMap.isTexture) data.alphaMap = this.alphaMap.toJSON(meta).uuid + if (this.lightMap && this.lightMap.isTexture) data.lightMap = this.lightMap.toJSON(meta).uuid + if (this.bumpMap && this.bumpMap.isTexture) { + data.bumpMap = this.bumpMap.toJSON(meta).uuid + data.bumpScale = this.bumpScale + } + if (this.normalMap && this.normalMap.isTexture) { + data.normalMap = this.normalMap.toJSON(meta).uuid + data.normalScale = this.normalScale.toArray() + } + if (this.displacementMap && this.displacementMap.isTexture) { + data.displacementMap = this.displacementMap.toJSON(meta).uuid + data.displacementScale = this.displacementScale + data.displacementBias = this.displacementBias + } + if (this.roughnessMap && this.roughnessMap.isTexture) + data.roughnessMap = this.roughnessMap.toJSON(meta).uuid + if (this.metalnessMap && this.metalnessMap.isTexture) + data.metalnessMap = this.metalnessMap.toJSON(meta).uuid + + if (this.emissiveMap && this.emissiveMap.isTexture) + data.emissiveMap = this.emissiveMap.toJSON(meta).uuid + if (this.specularMap && this.specularMap.isTexture) + data.specularMap = this.specularMap.toJSON(meta).uuid + + if (this.envMap && this.envMap.isTexture) { + data.envMap = this.envMap.toJSON(meta).uuid + data.reflectivity = this.reflectivity // Scale behind envMap + } + + if (this.gradientMap && this.gradientMap.isTexture) { + data.gradientMap = this.gradientMap.toJSON(meta).uuid + } + + if (this.size !== undefined) data.size = this.size + if (this.sizeAttenuation !== undefined) data.sizeAttenuation = this.sizeAttenuation + + if (this.blending !== NormalBlending) data.blending = this.blending + if (this.flatShading === true) data.flatShading = this.flatShading + if (this.side !== FrontSide) data.side = this.side + if (this.vertexColors !== NoColors) data.vertexColors = this.vertexColors + + if (this.opacity < 1) data.opacity = this.opacity + if (this.transparent === true) data.transparent = this.transparent + + data.depthFunc = this.depthFunc + data.depthTest = this.depthTest + data.depthWrite = this.depthWrite + + // rotation (SpriteMaterial) + if (this.rotation !== 0) data.rotation = this.rotation + + if (this.linewidth !== 1) data.linewidth = this.linewidth + if (this.dashSize !== undefined) data.dashSize = this.dashSize + if (this.gapSize !== undefined) data.gapSize = this.gapSize + if (this.scale !== undefined) data.scale = this.scale + + if (this.dithering === true) data.dithering = true + + if (this.alphaTest > 0) data.alphaTest = this.alphaTest + if (this.premultipliedAlpha === true) data.premultipliedAlpha = this.premultipliedAlpha + + if (this.wireframe === true) data.wireframe = this.wireframe + if (this.wireframeLinewidth > 1) data.wireframeLinewidth = this.wireframeLinewidth + if (this.wireframeLinecap !== 'round') data.wireframeLinecap = this.wireframeLinecap + if (this.wireframeLinejoin !== 'round') data.wireframeLinejoin = this.wireframeLinejoin + + if (this.morphTargets === true) data.morphTargets = true + if (this.skinning === true) data.skinning = true + + if (this.visible === false) data.visible = false + if (JSON.stringify(this.userData) !== '{}') data.userData = this.userData + + // TODO: Copied from Object3D.toJSON + + function extractFromCache(cache) { + var values = [] + + for (var key in cache) { + var data = cache[key] + delete data.metadata + values.push(data) + } + + return values + } + + if (isRoot) { + var textures = extractFromCache(meta.textures) + var images = extractFromCache(meta.images) + + if (textures.length > 0) data.textures = textures + if (images.length > 0) data.images = images + } + + return data + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (source) { + this.name = source.name + + this.fog = source.fog + this.lights = source.lights + + this.blending = source.blending + this.side = source.side + this.flatShading = source.flatShading + this.vertexColors = source.vertexColors + + this.opacity = source.opacity + this.transparent = source.transparent + + this.blendSrc = source.blendSrc + this.blendDst = source.blendDst + this.blendEquation = source.blendEquation + this.blendSrcAlpha = source.blendSrcAlpha + this.blendDstAlpha = source.blendDstAlpha + this.blendEquationAlpha = source.blendEquationAlpha + + this.depthFunc = source.depthFunc + this.depthTest = source.depthTest + this.depthWrite = source.depthWrite + + this.colorWrite = source.colorWrite + + this.precision = source.precision + + this.polygonOffset = source.polygonOffset + this.polygonOffsetFactor = source.polygonOffsetFactor + this.polygonOffsetUnits = source.polygonOffsetUnits + + this.dithering = source.dithering + + this.alphaTest = source.alphaTest + this.premultipliedAlpha = source.premultipliedAlpha + + this.overdraw = source.overdraw + + this.visible = source.visible + this.userData = JSON.parse(JSON.stringify(source.userData)) + + this.clipShadows = source.clipShadows + this.clipIntersection = source.clipIntersection + + var srcPlanes = source.clippingPlanes, + dstPlanes = null + + if (srcPlanes !== null) { + var n = srcPlanes.length + dstPlanes = new Array(n) + + for (var i = 0; i !== n; ++i) dstPlanes[i] = srcPlanes[i].clone() + } + + this.clippingPlanes = dstPlanes + + this.shadowSide = source.shadowSide + + return this + }, + + dispose: function () { + this.dispatchEvent({ type: 'dispose' }) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * } + */ + + function MeshDepthMaterial(parameters) { + Material.call(this) + + this.type = 'MeshDepthMaterial' + + this.depthPacking = BasicDepthPacking + + this.skinning = false + this.morphTargets = false + + this.map = null + + this.alphaMap = null + + this.displacementMap = null + this.displacementScale = 1 + this.displacementBias = 0 + + this.wireframe = false + this.wireframeLinewidth = 1 + + this.fog = false + this.lights = false + + this.setValues(parameters) + } + + MeshDepthMaterial.prototype = Object.create(Material.prototype) + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true + + MeshDepthMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.depthPacking = source.depthPacking + + this.skinning = source.skinning + this.morphTargets = source.morphTargets + + this.map = source.map + + this.alphaMap = source.alphaMap + + this.displacementMap = source.displacementMap + this.displacementScale = source.displacementScale + this.displacementBias = source.displacementBias + + this.wireframe = source.wireframe + this.wireframeLinewidth = source.wireframeLinewidth + + return this + } + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * referencePosition: <float>, + * nearDistance: <float>, + * farDistance: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * + * map: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float> + * + * } + */ + + function MeshDistanceMaterial(parameters) { + Material.call(this) + + this.type = 'MeshDistanceMaterial' + + this.referencePosition = new Vector3() + this.nearDistance = 1 + this.farDistance = 1000 + + this.skinning = false + this.morphTargets = false + + this.map = null + + this.alphaMap = null + + this.displacementMap = null + this.displacementScale = 1 + this.displacementBias = 0 + + this.fog = false + this.lights = false + + this.setValues(parameters) + } + + MeshDistanceMaterial.prototype = Object.create(Material.prototype) + MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial + + MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true + + MeshDistanceMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.referencePosition.copy(source.referencePosition) + this.nearDistance = source.nearDistance + this.farDistance = source.farDistance + + this.skinning = source.skinning + this.morphTargets = source.morphTargets + + this.map = source.map + + this.alphaMap = source.alphaMap + + this.displacementMap = source.displacementMap + this.displacementScale = source.displacementScale + this.displacementBias = source.displacementBias + + return this + } + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3(min, max) { + this.min = min !== undefined ? min : new Vector3(+Infinity, +Infinity, +Infinity) + this.max = max !== undefined ? max : new Vector3(-Infinity, -Infinity, -Infinity) + } + + Object.assign(Box3.prototype, { + isBox3: true, + + set: function (min, max) { + this.min.copy(min) + this.max.copy(max) + + return this + }, + + setFromArray: function (array) { + var minX = +Infinity + var minY = +Infinity + var minZ = +Infinity + + var maxX = -Infinity + var maxY = -Infinity + var maxZ = -Infinity + + for (var i = 0, l = array.length; i < l; i += 3) { + var x = array[i] + var y = array[i + 1] + var z = array[i + 2] + + if (x < minX) minX = x + if (y < minY) minY = y + if (z < minZ) minZ = z + + if (x > maxX) maxX = x + if (y > maxY) maxY = y + if (z > maxZ) maxZ = z + } + + this.min.set(minX, minY, minZ) + this.max.set(maxX, maxY, maxZ) + + return this + }, + + setFromBufferAttribute: function (attribute) { + var minX = +Infinity + var minY = +Infinity + var minZ = +Infinity + + var maxX = -Infinity + var maxY = -Infinity + var maxZ = -Infinity + + for (var i = 0, l = attribute.count; i < l; i++) { + var x = attribute.getX(i) + var y = attribute.getY(i) + var z = attribute.getZ(i) + + if (x < minX) minX = x + if (y < minY) minY = y + if (z < minZ) minZ = z + + if (x > maxX) maxX = x + if (y > maxY) maxY = y + if (z > maxZ) maxZ = z + } + + this.min.set(minX, minY, minZ) + this.max.set(maxX, maxY, maxZ) + + return this + }, + + setFromPoints: function (points) { + this.makeEmpty() + + for (var i = 0, il = points.length; i < il; i++) { + this.expandByPoint(points[i]) + } + + return this + }, + + setFromCenterAndSize: (function () { + var v1 = new Vector3() + + return function setFromCenterAndSize(center, size) { + var halfSize = v1.copy(size).multiplyScalar(0.5) + + this.min.copy(center).sub(halfSize) + this.max.copy(center).add(halfSize) + + return this + } + })(), + + setFromObject: function (object) { + this.makeEmpty() + + return this.expandByObject(object) + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (box) { + this.min.copy(box.min) + this.max.copy(box.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 + }, + + isEmpty: function () { + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z + }, + + getCenter: function (optionalTarget) { + var result = optionalTarget || new Vector3() + return this.isEmpty() + ? result.set(0, 0, 0) + : result.addVectors(this.min, this.max).multiplyScalar(0.5) + }, + + getSize: function (optionalTarget) { + var result = optionalTarget || new Vector3() + return this.isEmpty() ? result.set(0, 0, 0) : result.subVectors(this.max, this.min) + }, + + expandByPoint: function (point) { + this.min.min(point) + this.max.max(point) + + return this + }, + + expandByVector: function (vector) { + this.min.sub(vector) + this.max.add(vector) + + return this + }, + + expandByScalar: function (scalar) { + this.min.addScalar(-scalar) + this.max.addScalar(scalar) + + return this + }, + + expandByObject: (function () { + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var scope, i, l + + var v1 = new Vector3() + + function traverse(node) { + var geometry = node.geometry + + if (geometry !== undefined) { + if (geometry.isGeometry) { + var vertices = geometry.vertices + + for (i = 0, l = vertices.length; i < l; i++) { + v1.copy(vertices[i]) + v1.applyMatrix4(node.matrixWorld) + + scope.expandByPoint(v1) + } + } else if (geometry.isBufferGeometry) { + var attribute = geometry.attributes.position + + if (attribute !== undefined) { + for (i = 0, l = attribute.count; i < l; i++) { + v1.fromBufferAttribute(attribute, i).applyMatrix4(node.matrixWorld) + + scope.expandByPoint(v1) + } + } + } + } + } + + return function expandByObject(object) { + scope = this + + object.updateMatrixWorld(true) + + object.traverse(traverse) + + return this + } + })(), + + containsPoint: function (point) { + return point.x < this.min.x || + point.x > this.max.x || + point.y < this.min.y || + point.y > this.max.y || + point.z < this.min.z || + point.z > this.max.z + ? false + : true + }, + + containsBox: function (box) { + return ( + this.min.x <= box.min.x && + box.max.x <= this.max.x && + this.min.y <= box.min.y && + box.max.y <= this.max.y && + this.min.z <= box.min.z && + box.max.z <= this.max.z + ) + }, + + getParameter: function (point, optionalTarget) { + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector3() + + return result.set( + (point.x - this.min.x) / (this.max.x - this.min.x), + (point.y - this.min.y) / (this.max.y - this.min.y), + (point.z - this.min.z) / (this.max.z - this.min.z) + ) + }, + + intersectsBox: function (box) { + // using 6 splitting planes to rule out intersections. + return box.max.x < this.min.x || + box.min.x > this.max.x || + box.max.y < this.min.y || + box.min.y > this.max.y || + box.max.z < this.min.z || + box.min.z > this.max.z + ? false + : true + }, + + intersectsSphere: (function () { + var closestPoint = new Vector3() + + return function intersectsSphere(sphere) { + // Find the point on the AABB closest to the sphere center. + this.clampPoint(sphere.center, closestPoint) + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared(sphere.center) <= sphere.radius * sphere.radius + } + })(), + + intersectsPlane: function (plane) { + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max + + if (plane.normal.x > 0) { + min = plane.normal.x * this.min.x + max = plane.normal.x * this.max.x + } else { + min = plane.normal.x * this.max.x + max = plane.normal.x * this.min.x + } + + if (plane.normal.y > 0) { + min += plane.normal.y * this.min.y + max += plane.normal.y * this.max.y + } else { + min += plane.normal.y * this.max.y + max += plane.normal.y * this.min.y + } + + if (plane.normal.z > 0) { + min += plane.normal.z * this.min.z + max += plane.normal.z * this.max.z + } else { + min += plane.normal.z * this.max.z + max += plane.normal.z * this.min.z + } + + return min <= plane.constant && max >= plane.constant + }, + + intersectsTriangle: (function () { + // triangle centered vertices + var v0 = new Vector3() + var v1 = new Vector3() + var v2 = new Vector3() + + // triangle edge vectors + var f0 = new Vector3() + var f1 = new Vector3() + var f2 = new Vector3() + + var testAxis = new Vector3() + + var center = new Vector3() + var extents = new Vector3() + + var triangleNormal = new Vector3() + + function satForAxes(axes) { + var i, j + + for (i = 0, j = axes.length - 3; i <= j; i += 3) { + testAxis.fromArray(axes, i) + // project the aabb onto the seperating axis + var r = + extents.x * Math.abs(testAxis.x) + + extents.y * Math.abs(testAxis.y) + + extents.z * Math.abs(testAxis.z) + // project all 3 vertices of the triangle onto the seperating axis + var p0 = v0.dot(testAxis) + var p1 = v1.dot(testAxis) + var p2 = v2.dot(testAxis) + // actual test, basically see if either of the most extreme of the triangle points intersects r + if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) { + // points of the projected triangle are outside the projected half-length of the aabb + // the axis is seperating and we can exit + return false + } + } + + return true + } + + return function intersectsTriangle(triangle) { + if (this.isEmpty()) { + return false + } + + // compute box center and extents + this.getCenter(center) + extents.subVectors(this.max, center) + + // translate triangle to aabb origin + v0.subVectors(triangle.a, center) + v1.subVectors(triangle.b, center) + v2.subVectors(triangle.c, center) + + // compute edge vectors for triangle + f0.subVectors(v1, v0) + f1.subVectors(v2, v1) + f2.subVectors(v0, v2) + + // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb + // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation + // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) + var axes = [ + 0, + -f0.z, + f0.y, + 0, + -f1.z, + f1.y, + 0, + -f2.z, + f2.y, + f0.z, + 0, + -f0.x, + f1.z, + 0, + -f1.x, + f2.z, + 0, + -f2.x, + -f0.y, + f0.x, + 0, + -f1.y, + f1.x, + 0, + -f2.y, + f2.x, + 0 + ] + if (!satForAxes(axes)) { + return false + } + + // test 3 face normals from the aabb + axes = [1, 0, 0, 0, 1, 0, 0, 0, 1] + if (!satForAxes(axes)) { + return false + } + + // finally testing the face normal of the triangle + // use already existing triangle edge vectors here + triangleNormal.crossVectors(f0, f1) + axes = [triangleNormal.x, triangleNormal.y, triangleNormal.z] + return satForAxes(axes) + } + })(), + + clampPoint: function (point, optionalTarget) { + var result = optionalTarget || new Vector3() + return result.copy(point).clamp(this.min, this.max) + }, + + distanceToPoint: (function () { + var v1 = new Vector3() + + return function distanceToPoint(point) { + var clampedPoint = v1.copy(point).clamp(this.min, this.max) + return clampedPoint.sub(point).length() + } + })(), + + getBoundingSphere: (function () { + var v1 = new Vector3() + + return function getBoundingSphere(optionalTarget) { + var result = optionalTarget || new Sphere() + + this.getCenter(result.center) + + result.radius = this.getSize(v1).length() * 0.5 + + return result + } + })(), + + intersect: function (box) { + this.min.max(box.min) + this.max.min(box.max) + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if (this.isEmpty()) this.makeEmpty() + + return this + }, + + union: function (box) { + this.min.min(box.min) + this.max.max(box.max) + + return this + }, + + applyMatrix4: (function () { + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ] + + return function applyMatrix4(matrix) { + // transform of empty box is an empty box. + if (this.isEmpty()) return this + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix) // 000 + points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix) // 001 + points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix) // 010 + points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix) // 011 + points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix) // 100 + points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix) // 101 + points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix) // 110 + points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix) // 111 + + this.setFromPoints(points) + + return this + } + })(), + + translate: function (offset) { + this.min.add(offset) + this.max.add(offset) + + return this + }, + + equals: function (box) { + return box.min.equals(this.min) && box.max.equals(this.max) + } + }) + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere(center, radius) { + this.center = center !== undefined ? center : new Vector3() + this.radius = radius !== undefined ? radius : 0 + } + + Object.assign(Sphere.prototype, { + set: function (center, radius) { + this.center.copy(center) + this.radius = radius + + return this + }, + + setFromPoints: (function () { + var box = new Box3() + + return function setFromPoints(points, optionalCenter) { + var center = this.center + + if (optionalCenter !== undefined) { + center.copy(optionalCenter) + } else { + box.setFromPoints(points).getCenter(center) + } + + var maxRadiusSq = 0 + + for (var i = 0, il = points.length; i < il; i++) { + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i])) + } + + this.radius = Math.sqrt(maxRadiusSq) + + return this + } + })(), + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (sphere) { + this.center.copy(sphere.center) + this.radius = sphere.radius + + return this + }, + + empty: function () { + return this.radius <= 0 + }, + + containsPoint: function (point) { + return point.distanceToSquared(this.center) <= this.radius * this.radius + }, + + distanceToPoint: function (point) { + return point.distanceTo(this.center) - this.radius + }, + + intersectsSphere: function (sphere) { + var radiusSum = this.radius + sphere.radius + + return sphere.center.distanceToSquared(this.center) <= radiusSum * radiusSum + }, + + intersectsBox: function (box) { + return box.intersectsSphere(this) + }, + + intersectsPlane: function (plane) { + return Math.abs(plane.distanceToPoint(this.center)) <= this.radius + }, + + clampPoint: function (point, optionalTarget) { + var deltaLengthSq = this.center.distanceToSquared(point) + + var result = optionalTarget || new Vector3() + + result.copy(point) + + if (deltaLengthSq > this.radius * this.radius) { + result.sub(this.center).normalize() + result.multiplyScalar(this.radius).add(this.center) + } + + return result + }, + + getBoundingBox: function (optionalTarget) { + var box = optionalTarget || new Box3() + + box.set(this.center, this.center) + box.expandByScalar(this.radius) + + return box + }, + + applyMatrix4: function (matrix) { + this.center.applyMatrix4(matrix) + this.radius = this.radius * matrix.getMaxScaleOnAxis() + + return this + }, + + translate: function (offset) { + this.center.add(offset) + + return this + }, + + equals: function (sphere) { + return sphere.center.equals(this.center) && sphere.radius === this.radius + } + }) + + /** + * @author bhouston / http://clara.io + */ + + function Plane(normal, constant) { + // normal is assumed to be normalized + + this.normal = normal !== undefined ? normal : new Vector3(1, 0, 0) + this.constant = constant !== undefined ? constant : 0 + } + + Object.assign(Plane.prototype, { + set: function (normal, constant) { + this.normal.copy(normal) + this.constant = constant + + return this + }, + + setComponents: function (x, y, z, w) { + this.normal.set(x, y, z) + this.constant = w + + return this + }, + + setFromNormalAndCoplanarPoint: function (normal, point) { + this.normal.copy(normal) + this.constant = -point.dot(this.normal) + + return this + }, + + setFromCoplanarPoints: (function () { + var v1 = new Vector3() + var v2 = new Vector3() + + return function setFromCoplanarPoints(a, b, c) { + var normal = v1.subVectors(c, b).cross(v2.subVectors(a, b)).normalize() + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint(normal, a) + + return this + } + })(), + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (plane) { + this.normal.copy(plane.normal) + this.constant = plane.constant + + return this + }, + + normalize: function () { + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length() + this.normal.multiplyScalar(inverseNormalLength) + this.constant *= inverseNormalLength + + return this + }, + + negate: function () { + this.constant *= -1 + this.normal.negate() + + return this + }, + + distanceToPoint: function (point) { + return this.normal.dot(point) + this.constant + }, + + distanceToSphere: function (sphere) { + return this.distanceToPoint(sphere.center) - sphere.radius + }, + + projectPoint: function (point, optionalTarget) { + var result = optionalTarget || new Vector3() + + return result.copy(this.normal).multiplyScalar(-this.distanceToPoint(point)).add(point) + }, + + intersectLine: (function () { + var v1 = new Vector3() + + return function intersectLine(line, optionalTarget) { + var result = optionalTarget || new Vector3() + + var direction = line.delta(v1) + + var denominator = this.normal.dot(direction) + + if (denominator === 0) { + // line is coplanar, return origin + if (this.distanceToPoint(line.start) === 0) { + return result.copy(line.start) + } + + // Unsure if this is the correct method to handle this case. + return undefined + } + + var t = -(line.start.dot(this.normal) + this.constant) / denominator + + if (t < 0 || t > 1) { + return undefined + } + + return result.copy(direction).multiplyScalar(t).add(line.start) + } + })(), + + intersectsLine: function (line) { + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint(line.start) + var endSign = this.distanceToPoint(line.end) + + return (startSign < 0 && endSign > 0) || (endSign < 0 && startSign > 0) + }, + + intersectsBox: function (box) { + return box.intersectsPlane(this) + }, + + intersectsSphere: function (sphere) { + return sphere.intersectsPlane(this) + }, + + coplanarPoint: function (optionalTarget) { + var result = optionalTarget || new Vector3() + + return result.copy(this.normal).multiplyScalar(-this.constant) + }, + + applyMatrix4: (function () { + var v1 = new Vector3() + var m1 = new Matrix3() + + return function applyMatrix4(matrix, optionalNormalMatrix) { + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix(matrix) + + var referencePoint = this.coplanarPoint(v1).applyMatrix4(matrix) + + var normal = this.normal.applyMatrix3(normalMatrix).normalize() + + this.constant = -referencePoint.dot(normal) + + return this + } + })(), + + translate: function (offset) { + this.constant -= offset.dot(this.normal) + + return this + }, + + equals: function (plane) { + return plane.normal.equals(this.normal) && plane.constant === this.constant + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum(p0, p1, p2, p3, p4, p5) { + this.planes = [ + p0 !== undefined ? p0 : new Plane(), + p1 !== undefined ? p1 : new Plane(), + p2 !== undefined ? p2 : new Plane(), + p3 !== undefined ? p3 : new Plane(), + p4 !== undefined ? p4 : new Plane(), + p5 !== undefined ? p5 : new Plane() + ] + } + + Object.assign(Frustum.prototype, { + set: function (p0, p1, p2, p3, p4, p5) { + var planes = this.planes + + planes[0].copy(p0) + planes[1].copy(p1) + planes[2].copy(p2) + planes[3].copy(p3) + planes[4].copy(p4) + planes[5].copy(p5) + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (frustum) { + var planes = this.planes + + for (var i = 0; i < 6; i++) { + planes[i].copy(frustum.planes[i]) + } + + return this + }, + + setFromMatrix: function (m) { + var planes = this.planes + var me = m.elements + var me0 = me[0], + me1 = me[1], + me2 = me[2], + me3 = me[3] + var me4 = me[4], + me5 = me[5], + me6 = me[6], + me7 = me[7] + var me8 = me[8], + me9 = me[9], + me10 = me[10], + me11 = me[11] + var me12 = me[12], + me13 = me[13], + me14 = me[14], + me15 = me[15] + + planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize() + planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize() + planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize() + planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize() + planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize() + planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize() + + return this + }, + + intersectsObject: (function () { + var sphere = new Sphere() + + return function intersectsObject(object) { + var geometry = object.geometry + + if (geometry.boundingSphere === null) geometry.computeBoundingSphere() + + sphere.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld) + + return this.intersectsSphere(sphere) + } + })(), + + intersectsSprite: (function () { + var sphere = new Sphere() + + return function intersectsSprite(sprite) { + sphere.center.set(0, 0, 0) + sphere.radius = 0.7071067811865476 + sphere.applyMatrix4(sprite.matrixWorld) + + return this.intersectsSphere(sphere) + } + })(), + + intersectsSphere: function (sphere) { + var planes = this.planes + var center = sphere.center + var negRadius = -sphere.radius + + for (var i = 0; i < 6; i++) { + var distance = planes[i].distanceToPoint(center) + + if (distance < negRadius) { + return false + } + } + + return true + }, + + intersectsBox: (function () { + var p1 = new Vector3(), + p2 = new Vector3() + + return function intersectsBox(box) { + var planes = this.planes + + for (var i = 0; i < 6; i++) { + var plane = planes[i] + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z + + var d1 = plane.distanceToPoint(p1) + var d2 = plane.distanceToPoint(p2) + + // if both outside plane, no intersection + + if (d1 < 0 && d2 < 0) { + return false + } + } + + return true + } + })(), + + containsPoint: function (point) { + var planes = this.planes + + for (var i = 0; i < 6; i++) { + if (planes[i].distanceToPoint(point) < 0) { + return false + } + } + + return true + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap(_renderer, _objects, maxTextureSize) { + var _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2(maxTextureSize, maxTextureSize), + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + _MorphingFlag = 1, + _SkinningFlag = 2, + _NumberOfMaterialVariants = (_MorphingFlag | _SkinningFlag) + 1, + _depthMaterials = new Array(_NumberOfMaterialVariants), + _distanceMaterials = new Array(_NumberOfMaterialVariants), + _materialCache = {} + + var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide } + + var cubeDirections = [ + new Vector3(1, 0, 0), + new Vector3(-1, 0, 0), + new Vector3(0, 0, 1), + new Vector3(0, 0, -1), + new Vector3(0, 1, 0), + new Vector3(0, -1, 0) + ] + + var cubeUps = [ + new Vector3(0, 1, 0), + new Vector3(0, 1, 0), + new Vector3(0, 1, 0), + new Vector3(0, 1, 0), + new Vector3(0, 0, 1), + new Vector3(0, 0, -1) + ] + + var cube2DViewPorts = [ + new Vector4(), + new Vector4(), + new Vector4(), + new Vector4(), + new Vector4(), + new Vector4() + ] + + // init + + for (var i = 0; i !== _NumberOfMaterialVariants; ++i) { + var useMorphing = (i & _MorphingFlag) !== 0 + var useSkinning = (i & _SkinningFlag) !== 0 + + var depthMaterial = new MeshDepthMaterial({ + depthPacking: RGBADepthPacking, + + morphTargets: useMorphing, + skinning: useSkinning + }) + + _depthMaterials[i] = depthMaterial + + // + + var distanceMaterial = new MeshDistanceMaterial({ + morphTargets: useMorphing, + skinning: useSkinning + }) + + _distanceMaterials[i] = distanceMaterial + } + + // + + var scope = this + + this.enabled = false + + this.autoUpdate = true + this.needsUpdate = false + + this.type = PCFShadowMap + + this.render = function (lights, scene, camera) { + if (scope.enabled === false) return + if (scope.autoUpdate === false && scope.needsUpdate === false) return + + if (lights.length === 0) return + + // TODO Clean up (needed in case of contextlost) + var _gl = _renderer.context + var _state = _renderer.state + + // Set GL state for depth map. + _state.disable(_gl.BLEND) + _state.buffers.color.setClear(1, 1, 1, 1) + _state.buffers.depth.setTest(true) + _state.setScissorTest(false) + + // render depth map + + var faceCount + + for (var i = 0, il = lights.length; i < il; i++) { + var light = lights[i] + var shadow = light.shadow + var isPointLight = light && light.isPointLight + + if (shadow === undefined) { + console.warn('THREE.WebGLShadowMap:', light, 'has no shadow.') + continue + } + + var shadowCamera = shadow.camera + + _shadowMapSize.copy(shadow.mapSize) + _shadowMapSize.min(_maxShadowMapSize) + + if (isPointLight) { + var vpWidth = _shadowMapSize.x + var vpHeight = _shadowMapSize.y + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[0].set(vpWidth * 2, vpHeight, vpWidth, vpHeight) + // negative X + cube2DViewPorts[1].set(0, vpHeight, vpWidth, vpHeight) + // positive Z + cube2DViewPorts[2].set(vpWidth * 3, vpHeight, vpWidth, vpHeight) + // negative Z + cube2DViewPorts[3].set(vpWidth, vpHeight, vpWidth, vpHeight) + // positive Y + cube2DViewPorts[4].set(vpWidth * 3, 0, vpWidth, vpHeight) + // negative Y + cube2DViewPorts[5].set(vpWidth, 0, vpWidth, vpHeight) + + _shadowMapSize.x *= 4.0 + _shadowMapSize.y *= 2.0 + } + + if (shadow.map === null) { + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat } + + shadow.map = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, pars) + shadow.map.texture.name = light.name + '.shadowMap' + + shadowCamera.updateProjectionMatrix() + } + + if (shadow.isSpotLightShadow) { + shadow.update(light) + } + + var shadowMap = shadow.map + var shadowMatrix = shadow.matrix + + _lightPositionWorld.setFromMatrixPosition(light.matrixWorld) + shadowCamera.position.copy(_lightPositionWorld) + + if (isPointLight) { + faceCount = 6 + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + + shadowMatrix.makeTranslation( + -_lightPositionWorld.x, + -_lightPositionWorld.y, + -_lightPositionWorld.z + ) + } else { + faceCount = 1 + + _lookTarget.setFromMatrixPosition(light.target.matrixWorld) + shadowCamera.lookAt(_lookTarget) + shadowCamera.updateMatrixWorld() + + // compute shadow matrix + + shadowMatrix.set( + 0.5, + 0.0, + 0.0, + 0.5, + 0.0, + 0.5, + 0.0, + 0.5, + 0.0, + 0.0, + 0.5, + 0.5, + 0.0, + 0.0, + 0.0, + 1.0 + ) + + shadowMatrix.multiply(shadowCamera.projectionMatrix) + shadowMatrix.multiply(shadowCamera.matrixWorldInverse) + } + + _renderer.setRenderTarget(shadowMap) + _renderer.clear() + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for (var face = 0; face < faceCount; face++) { + if (isPointLight) { + _lookTarget.copy(shadowCamera.position) + _lookTarget.add(cubeDirections[face]) + shadowCamera.up.copy(cubeUps[face]) + shadowCamera.lookAt(_lookTarget) + shadowCamera.updateMatrixWorld() + + var vpDimensions = cube2DViewPorts[face] + _state.viewport(vpDimensions) + } + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( + shadowCamera.projectionMatrix, + shadowCamera.matrixWorldInverse + ) + _frustum.setFromMatrix(_projScreenMatrix) + + // set object matrices & frustum culling + + renderObject(scene, camera, shadowCamera, isPointLight) + } + } + + scope.needsUpdate = false + } + + function getDepthMaterial( + object, + material, + isPointLight, + lightPositionWorld, + shadowCameraNear, + shadowCameraFar + ) { + var geometry = object.geometry + + var result = null + + var materialVariants = _depthMaterials + var customMaterial = object.customDepthMaterial + + if (isPointLight) { + materialVariants = _distanceMaterials + customMaterial = object.customDistanceMaterial + } + + if (!customMaterial) { + var useMorphing = false + + if (material.morphTargets) { + if (geometry && geometry.isBufferGeometry) { + useMorphing = + geometry.morphAttributes && + geometry.morphAttributes.position && + geometry.morphAttributes.position.length > 0 + } else if (geometry && geometry.isGeometry) { + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0 + } + } + + if (object.isSkinnedMesh && material.skinning === false) { + console.warn( + 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', + object + ) + } + + var useSkinning = object.isSkinnedMesh && material.skinning + + var variantIndex = 0 + + if (useMorphing) variantIndex |= _MorphingFlag + if (useSkinning) variantIndex |= _SkinningFlag + + result = materialVariants[variantIndex] + } else { + result = customMaterial + } + + if ( + _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 + ) { + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, + keyB = material.uuid + + var materialsForVariant = _materialCache[keyA] + + if (materialsForVariant === undefined) { + materialsForVariant = {} + _materialCache[keyA] = materialsForVariant + } + + var cachedMaterial = materialsForVariant[keyB] + + if (cachedMaterial === undefined) { + cachedMaterial = result.clone() + materialsForVariant[keyB] = cachedMaterial + } + + result = cachedMaterial + } + + result.visible = material.visible + result.wireframe = material.wireframe + + result.side = material.shadowSide != null ? material.shadowSide : shadowSide[material.side] + + result.clipShadows = material.clipShadows + result.clippingPlanes = material.clippingPlanes + result.clipIntersection = material.clipIntersection + + result.wireframeLinewidth = material.wireframeLinewidth + result.linewidth = material.linewidth + + if (isPointLight && result.isMeshDistanceMaterial) { + result.referencePosition.copy(lightPositionWorld) + result.nearDistance = shadowCameraNear + result.farDistance = shadowCameraFar + } + + return result + } + + function renderObject(object, camera, shadowCamera, isPointLight) { + if (object.visible === false) return + + var visible = object.layers.test(camera.layers) + + if (visible && (object.isMesh || object.isLine || object.isPoints)) { + if (object.castShadow && (!object.frustumCulled || _frustum.intersectsObject(object))) { + object.modelViewMatrix.multiplyMatrices( + shadowCamera.matrixWorldInverse, + object.matrixWorld + ) + + var geometry = _objects.update(object) + var material = object.material + + if (Array.isArray(material)) { + var groups = geometry.groups + + for (var k = 0, kl = groups.length; k < kl; k++) { + var group = groups[k] + var groupMaterial = material[group.materialIndex] + + if (groupMaterial && groupMaterial.visible) { + var depthMaterial = getDepthMaterial( + object, + groupMaterial, + isPointLight, + _lightPositionWorld, + shadowCamera.near, + shadowCamera.far + ) + _renderer.renderBufferDirect( + shadowCamera, + null, + geometry, + depthMaterial, + object, + group + ) + } + } + } else if (material.visible) { + var depthMaterial = getDepthMaterial( + object, + material, + isPointLight, + _lightPositionWorld, + shadowCamera.near, + shadowCamera.far + ) + _renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, null) + } + } + } + + var children = object.children + + for (var i = 0, l = children.length; i < l; i++) { + renderObject(children[i], camera, shadowCamera, isPointLight) + } + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLAttributes(gl) { + var buffers = {} + + function createBuffer(attribute, bufferType) { + var array = attribute.array + var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW + + var buffer = gl.createBuffer() + + gl.bindBuffer(bufferType, buffer) + gl.bufferData(bufferType, array, usage) + + attribute.onUploadCallback() + + var type = gl.FLOAT + + if (array instanceof Float32Array) { + type = gl.FLOAT + } else if (array instanceof Float64Array) { + console.warn('THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.') + } else if (array instanceof Uint16Array) { + type = gl.UNSIGNED_SHORT + } else if (array instanceof Int16Array) { + type = gl.SHORT + } else if (array instanceof Uint32Array) { + type = gl.UNSIGNED_INT + } else if (array instanceof Int32Array) { + type = gl.INT + } else if (array instanceof Int8Array) { + type = gl.BYTE + } else if (array instanceof Uint8Array) { + type = gl.UNSIGNED_BYTE + } + + return { + buffer: buffer, + type: type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version + } + } + + function updateBuffer(buffer, attribute, bufferType) { + var array = attribute.array + var updateRange = attribute.updateRange + + gl.bindBuffer(bufferType, buffer) + + if (attribute.dynamic === false) { + gl.bufferData(bufferType, array, gl.STATIC_DRAW) + } else if (updateRange.count === -1) { + // Not using update ranges + + gl.bufferSubData(bufferType, 0, array) + } else if (updateRange.count === 0) { + console.error( + 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' + ) + } else { + gl.bufferSubData( + bufferType, + updateRange.offset * array.BYTES_PER_ELEMENT, + array.subarray(updateRange.offset, updateRange.offset + updateRange.count) + ) + + updateRange.count = -1 // reset range + } + } + + // + + function get(attribute) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data + + return buffers[attribute.uuid] + } + + function remove(attribute) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data + + var data = buffers[attribute.uuid] + + if (data) { + gl.deleteBuffer(data.buffer) + + delete buffers[attribute.uuid] + } + } + + function update(attribute, bufferType) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data + + var data = buffers[attribute.uuid] + + if (data === undefined) { + buffers[attribute.uuid] = createBuffer(attribute, bufferType) + } else if (data.version < attribute.version) { + updateBuffer(data.buffer, attribute, bufferType) + + data.version = attribute.version + } + } + + return { + get: get, + remove: remove, + update: update + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler(x, y, z, order) { + this._x = x || 0 + this._y = y || 0 + this._z = z || 0 + this._order = order || Euler.DefaultOrder + } + + Euler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX'] + + Euler.DefaultOrder = 'XYZ' + + Object.defineProperties(Euler.prototype, { + x: { + get: function () { + return this._x + }, + + set: function (value) { + this._x = value + this.onChangeCallback() + } + }, + + y: { + get: function () { + return this._y + }, + + set: function (value) { + this._y = value + this.onChangeCallback() + } + }, + + z: { + get: function () { + return this._z + }, + + set: function (value) { + this._z = value + this.onChangeCallback() + } + }, + + order: { + get: function () { + return this._order + }, + + set: function (value) { + this._order = value + this.onChangeCallback() + } + } + }) + + Object.assign(Euler.prototype, { + isEuler: true, + + set: function (x, y, z, order) { + this._x = x + this._y = y + this._z = z + this._order = order || this._order + + this.onChangeCallback() + + return this + }, + + clone: function () { + return new this.constructor(this._x, this._y, this._z, this._order) + }, + + copy: function (euler) { + this._x = euler._x + this._y = euler._y + this._z = euler._z + this._order = euler._order + + this.onChangeCallback() + + return this + }, + + setFromRotationMatrix: function (m, order, update) { + var clamp = _Math.clamp + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements + var m11 = te[0], + m12 = te[4], + m13 = te[8] + var m21 = te[1], + m22 = te[5], + m23 = te[9] + var m31 = te[2], + m32 = te[6], + m33 = te[10] + + order = order || this._order + + if (order === 'XYZ') { + this._y = Math.asin(clamp(m13, -1, 1)) + + if (Math.abs(m13) < 0.99999) { + this._x = Math.atan2(-m23, m33) + this._z = Math.atan2(-m12, m11) + } else { + this._x = Math.atan2(m32, m22) + this._z = 0 + } + } else if (order === 'YXZ') { + this._x = Math.asin(-clamp(m23, -1, 1)) + + if (Math.abs(m23) < 0.99999) { + this._y = Math.atan2(m13, m33) + this._z = Math.atan2(m21, m22) + } else { + this._y = Math.atan2(-m31, m11) + this._z = 0 + } + } else if (order === 'ZXY') { + this._x = Math.asin(clamp(m32, -1, 1)) + + if (Math.abs(m32) < 0.99999) { + this._y = Math.atan2(-m31, m33) + this._z = Math.atan2(-m12, m22) + } else { + this._y = 0 + this._z = Math.atan2(m21, m11) + } + } else if (order === 'ZYX') { + this._y = Math.asin(-clamp(m31, -1, 1)) + + if (Math.abs(m31) < 0.99999) { + this._x = Math.atan2(m32, m33) + this._z = Math.atan2(m21, m11) + } else { + this._x = 0 + this._z = Math.atan2(-m12, m22) + } + } else if (order === 'YZX') { + this._z = Math.asin(clamp(m21, -1, 1)) + + if (Math.abs(m21) < 0.99999) { + this._x = Math.atan2(-m23, m22) + this._y = Math.atan2(-m31, m11) + } else { + this._x = 0 + this._y = Math.atan2(m13, m33) + } + } else if (order === 'XZY') { + this._z = Math.asin(-clamp(m12, -1, 1)) + + if (Math.abs(m12) < 0.99999) { + this._x = Math.atan2(m32, m22) + this._y = Math.atan2(m13, m11) + } else { + this._x = Math.atan2(-m23, m33) + this._y = 0 + } + } else { + console.warn('THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order) + } + + this._order = order + + if (update !== false) this.onChangeCallback() + + return this + }, + + setFromQuaternion: (function () { + var matrix = new Matrix4() + + return function setFromQuaternion(q, order, update) { + matrix.makeRotationFromQuaternion(q) + + return this.setFromRotationMatrix(matrix, order, update) + } + })(), + + setFromVector3: function (v, order) { + return this.set(v.x, v.y, v.z, order || this._order) + }, + + reorder: (function () { + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion() + + return function reorder(newOrder) { + q.setFromEuler(this) + + return this.setFromQuaternion(q, newOrder) + } + })(), + + equals: function (euler) { + return ( + euler._x === this._x && + euler._y === this._y && + euler._z === this._z && + euler._order === this._order + ) + }, + + fromArray: function (array) { + this._x = array[0] + this._y = array[1] + this._z = array[2] + if (array[3] !== undefined) this._order = array[3] + + this.onChangeCallback() + + return this + }, + + toArray: function (array, offset) { + if (array === undefined) array = [] + if (offset === undefined) offset = 0 + + array[offset] = this._x + array[offset + 1] = this._y + array[offset + 2] = this._z + array[offset + 3] = this._order + + return array + }, + + toVector3: function (optionalResult) { + if (optionalResult) { + return optionalResult.set(this._x, this._y, this._z) + } else { + return new Vector3(this._x, this._y, this._z) + } + }, + + onChange: function (callback) { + this.onChangeCallback = callback + + return this + }, + + onChangeCallback: function () {} + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + this.mask = 1 | 0 + } + + Object.assign(Layers.prototype, { + set: function (channel) { + this.mask = (1 << channel) | 0 + }, + + enable: function (channel) { + this.mask |= (1 << channel) | 0 + }, + + toggle: function (channel) { + this.mask ^= (1 << channel) | 0 + }, + + disable: function (channel) { + this.mask &= ~((1 << channel) | 0) + }, + + test: function (layers) { + return (this.mask & layers.mask) !== 0 + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + var object3DId = 0 + + function Object3D() { + Object.defineProperty(this, 'id', { value: object3DId++ }) + + this.uuid = _Math.generateUUID() + + this.name = '' + this.type = 'Object3D' + + this.parent = null + this.children = [] + + this.up = Object3D.DefaultUp.clone() + + var position = new Vector3() + var rotation = new Euler() + var quaternion = new Quaternion() + var scale = new Vector3(1, 1, 1) + + function onRotationChange() { + quaternion.setFromEuler(rotation, false) + } + + function onQuaternionChange() { + rotation.setFromQuaternion(quaternion, undefined, false) + } + + rotation.onChange(onRotationChange) + quaternion.onChange(onQuaternionChange) + + Object.defineProperties(this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + }) + + this.matrix = new Matrix4() + this.matrixWorld = new Matrix4() + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate + this.matrixWorldNeedsUpdate = false + + this.layers = new Layers() + this.visible = true + + this.castShadow = false + this.receiveShadow = false + + this.frustumCulled = true + this.renderOrder = 0 + + this.userData = {} + } + + Object3D.DefaultUp = new Vector3(0, 1, 0) + Object3D.DefaultMatrixAutoUpdate = true + + Object3D.prototype = Object.assign(Object.create(EventDispatcher.prototype), { + constructor: Object3D, + + isObject3D: true, + + onBeforeRender: function () {}, + onAfterRender: function () {}, + + applyMatrix: function (matrix) { + this.matrix.multiplyMatrices(matrix, this.matrix) + + this.matrix.decompose(this.position, this.quaternion, this.scale) + }, + + applyQuaternion: function (q) { + this.quaternion.premultiply(q) + + return this + }, + + setRotationFromAxisAngle: function (axis, angle) { + // assumes axis is normalized + + this.quaternion.setFromAxisAngle(axis, angle) + }, + + setRotationFromEuler: function (euler) { + this.quaternion.setFromEuler(euler, true) + }, + + setRotationFromMatrix: function (m) { + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix(m) + }, + + setRotationFromQuaternion: function (q) { + // assumes q is normalized + + this.quaternion.copy(q) + }, + + rotateOnAxis: (function () { + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion() + + return function rotateOnAxis(axis, angle) { + q1.setFromAxisAngle(axis, angle) + + this.quaternion.multiply(q1) + + return this + } + })(), + + rotateOnWorldAxis: (function () { + // rotate object on axis in world space + // axis is assumed to be normalized + // method assumes no rotated parent + + var q1 = new Quaternion() + + return function rotateOnWorldAxis(axis, angle) { + q1.setFromAxisAngle(axis, angle) + + this.quaternion.premultiply(q1) + + return this + } + })(), + + rotateX: (function () { + var v1 = new Vector3(1, 0, 0) + + return function rotateX(angle) { + return this.rotateOnAxis(v1, angle) + } + })(), + + rotateY: (function () { + var v1 = new Vector3(0, 1, 0) + + return function rotateY(angle) { + return this.rotateOnAxis(v1, angle) + } + })(), + + rotateZ: (function () { + var v1 = new Vector3(0, 0, 1) + + return function rotateZ(angle) { + return this.rotateOnAxis(v1, angle) + } + })(), + + translateOnAxis: (function () { + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3() + + return function translateOnAxis(axis, distance) { + v1.copy(axis).applyQuaternion(this.quaternion) + + this.position.add(v1.multiplyScalar(distance)) + + return this + } + })(), + + translateX: (function () { + var v1 = new Vector3(1, 0, 0) + + return function translateX(distance) { + return this.translateOnAxis(v1, distance) + } + })(), + + translateY: (function () { + var v1 = new Vector3(0, 1, 0) + + return function translateY(distance) { + return this.translateOnAxis(v1, distance) + } + })(), + + translateZ: (function () { + var v1 = new Vector3(0, 0, 1) + + return function translateZ(distance) { + return this.translateOnAxis(v1, distance) + } + })(), + + localToWorld: function (vector) { + return vector.applyMatrix4(this.matrixWorld) + }, + + worldToLocal: (function () { + var m1 = new Matrix4() + + return function worldToLocal(vector) { + return vector.applyMatrix4(m1.getInverse(this.matrixWorld)) + } + })(), + + lookAt: (function () { + // This method does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4() + var vector = new Vector3() + + return function lookAt(x, y, z) { + if (x.isVector3) { + vector.copy(x) + } else { + vector.set(x, y, z) + } + + if (this.isCamera) { + m1.lookAt(this.position, vector, this.up) + } else { + m1.lookAt(vector, this.position, this.up) + } + + this.quaternion.setFromRotationMatrix(m1) + } + })(), + + add: function (object) { + if (arguments.length > 1) { + for (var i = 0; i < arguments.length; i++) { + this.add(arguments[i]) + } + + return this + } + + if (object === this) { + console.error("THREE.Object3D.add: object can't be added as a child of itself.", object) + return this + } + + if (object && object.isObject3D) { + if (object.parent !== null) { + object.parent.remove(object) + } + + object.parent = this + object.dispatchEvent({ type: 'added' }) + + this.children.push(object) + } else { + console.error('THREE.Object3D.add: object not an instance of THREE.Object3D.', object) + } + + return this + }, + + remove: function (object) { + if (arguments.length > 1) { + for (var i = 0; i < arguments.length; i++) { + this.remove(arguments[i]) + } + + return this + } + + var index = this.children.indexOf(object) + + if (index !== -1) { + object.parent = null + + object.dispatchEvent({ type: 'removed' }) + + this.children.splice(index, 1) + } + + return this + }, + + getObjectById: function (id) { + return this.getObjectByProperty('id', id) + }, + + getObjectByName: function (name) { + return this.getObjectByProperty('name', name) + }, + + getObjectByProperty: function (name, value) { + if (this[name] === value) return this + + for (var i = 0, l = this.children.length; i < l; i++) { + var child = this.children[i] + var object = child.getObjectByProperty(name, value) + + if (object !== undefined) { + return object + } + } + + return undefined + }, + + getWorldPosition: function (optionalTarget) { + var result = optionalTarget || new Vector3() + + this.updateMatrixWorld(true) + + return result.setFromMatrixPosition(this.matrixWorld) + }, + + getWorldQuaternion: (function () { + var position = new Vector3() + var scale = new Vector3() + + return function getWorldQuaternion(optionalTarget) { + var result = optionalTarget || new Quaternion() + + this.updateMatrixWorld(true) + + this.matrixWorld.decompose(position, result, scale) + + return result + } + })(), + + getWorldRotation: (function () { + var quaternion = new Quaternion() + + return function getWorldRotation(optionalTarget) { + var result = optionalTarget || new Euler() + + this.getWorldQuaternion(quaternion) + + return result.setFromQuaternion(quaternion, this.rotation.order, false) + } + })(), + + getWorldScale: (function () { + var position = new Vector3() + var quaternion = new Quaternion() + + return function getWorldScale(optionalTarget) { + var result = optionalTarget || new Vector3() + + this.updateMatrixWorld(true) + + this.matrixWorld.decompose(position, quaternion, result) + + return result + } + })(), + + getWorldDirection: (function () { + var quaternion = new Quaternion() + + return function getWorldDirection(optionalTarget) { + var result = optionalTarget || new Vector3() + + this.getWorldQuaternion(quaternion) + + return result.set(0, 0, 1).applyQuaternion(quaternion) + } + })(), + + raycast: function () {}, + + traverse: function (callback) { + callback(this) + + var children = this.children + + for (var i = 0, l = children.length; i < l; i++) { + children[i].traverse(callback) + } + }, + + traverseVisible: function (callback) { + if (this.visible === false) return + + callback(this) + + var children = this.children + + for (var i = 0, l = children.length; i < l; i++) { + children[i].traverseVisible(callback) + } + }, + + traverseAncestors: function (callback) { + var parent = this.parent + + if (parent !== null) { + callback(parent) + + parent.traverseAncestors(callback) + } + }, + + updateMatrix: function () { + this.matrix.compose(this.position, this.quaternion, this.scale) + + this.matrixWorldNeedsUpdate = true + }, + + updateMatrixWorld: function (force) { + if (this.matrixAutoUpdate) this.updateMatrix() + + if (this.matrixWorldNeedsUpdate || force) { + if (this.parent === null) { + this.matrixWorld.copy(this.matrix) + } else { + this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix) + } + + this.matrixWorldNeedsUpdate = false + + force = true + } + + // update children + + var children = this.children + + for (var i = 0, l = children.length; i < l; i++) { + children[i].updateMatrixWorld(force) + } + }, + + toJSON: function (meta) { + // meta is a string when called from JSON.stringify + var isRootObject = meta === undefined || typeof meta === 'string' + + var output = {} + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if (isRootObject) { + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {} + } + + output.metadata = { + version: 4.5, + type: 'Object', + generator: 'Object3D.toJSON' + } + } + + // standard Object3D serialization + + var object = {} + + object.uuid = this.uuid + object.type = this.type + + if (this.name !== '') object.name = this.name + if (this.castShadow === true) object.castShadow = true + if (this.receiveShadow === true) object.receiveShadow = true + if (this.visible === false) object.visible = false + if (JSON.stringify(this.userData) !== '{}') object.userData = this.userData + + object.matrix = this.matrix.toArray() + + // + + function serialize(library, element) { + if (library[element.uuid] === undefined) { + library[element.uuid] = element.toJSON(meta) + } + + return element.uuid + } + + if (this.geometry !== undefined) { + object.geometry = serialize(meta.geometries, this.geometry) + + var parameters = this.geometry.parameters + + if (parameters !== undefined && parameters.shapes !== undefined) { + var shapes = parameters.shapes + + if (Array.isArray(shapes)) { + for (var i = 0, l = shapes.length; i < l; i++) { + var shape = shapes[i] + + serialize(meta.shapes, shape) + } + } else { + serialize(meta.shapes, shapes) + } + } + } + + if (this.material !== undefined) { + if (Array.isArray(this.material)) { + var uuids = [] + + for (var i = 0, l = this.material.length; i < l; i++) { + uuids.push(serialize(meta.materials, this.material[i])) + } + + object.material = uuids + } else { + object.material = serialize(meta.materials, this.material) + } + } + + // + + if (this.children.length > 0) { + object.children = [] + + for (var i = 0; i < this.children.length; i++) { + object.children.push(this.children[i].toJSON(meta).object) + } + } + + if (isRootObject) { + var geometries = extractFromCache(meta.geometries) + var materials = extractFromCache(meta.materials) + var textures = extractFromCache(meta.textures) + var images = extractFromCache(meta.images) + var shapes = extractFromCache(meta.shapes) + + if (geometries.length > 0) output.geometries = geometries + if (materials.length > 0) output.materials = materials + if (textures.length > 0) output.textures = textures + if (images.length > 0) output.images = images + if (shapes.length > 0) output.shapes = shapes + } + + output.object = object + + return output + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache(cache) { + var values = [] + for (var key in cache) { + var data = cache[key] + delete data.metadata + values.push(data) + } + return values + } + }, + + clone: function (recursive) { + return new this.constructor().copy(this, recursive) + }, + + copy: function (source, recursive) { + if (recursive === undefined) recursive = true + + this.name = source.name + + this.up.copy(source.up) + + this.position.copy(source.position) + this.quaternion.copy(source.quaternion) + this.scale.copy(source.scale) + + this.matrix.copy(source.matrix) + this.matrixWorld.copy(source.matrixWorld) + + this.matrixAutoUpdate = source.matrixAutoUpdate + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate + + this.layers.mask = source.layers.mask + this.visible = source.visible + + this.castShadow = source.castShadow + this.receiveShadow = source.receiveShadow + + this.frustumCulled = source.frustumCulled + this.renderOrder = source.renderOrder + + this.userData = JSON.parse(JSON.stringify(source.userData)) + + if (recursive === true) { + for (var i = 0; i < source.children.length; i++) { + var child = source.children[i] + this.add(child.clone()) + } + } + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + Object3D.call(this) + + this.type = 'Camera' + + this.matrixWorldInverse = new Matrix4() + this.projectionMatrix = new Matrix4() + } + + Camera.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Camera, + + isCamera: true, + + copy: function (source, recursive) { + Object3D.prototype.copy.call(this, source, recursive) + + this.matrixWorldInverse.copy(source.matrixWorldInverse) + this.projectionMatrix.copy(source.projectionMatrix) + + return this + }, + + getWorldDirection: (function () { + var quaternion = new Quaternion() + + return function getWorldDirection(optionalTarget) { + var result = optionalTarget || new Vector3() + + this.getWorldQuaternion(quaternion) + + return result.set(0, 0, -1).applyQuaternion(quaternion) + } + })(), + + updateMatrixWorld: function (force) { + Object3D.prototype.updateMatrixWorld.call(this, force) + + this.matrixWorldInverse.getInverse(this.matrixWorld) + }, + + clone: function () { + return new this.constructor().copy(this) + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera(left, right, top, bottom, near, far) { + Camera.call(this) + + this.type = 'OrthographicCamera' + + this.zoom = 1 + this.view = null + + this.left = left + this.right = right + this.top = top + this.bottom = bottom + + this.near = near !== undefined ? near : 0.1 + this.far = far !== undefined ? far : 2000 + + this.updateProjectionMatrix() + } + + OrthographicCamera.prototype = Object.assign(Object.create(Camera.prototype), { + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function (source, recursive) { + Camera.prototype.copy.call(this, source, recursive) + + this.left = source.left + this.right = source.right + this.top = source.top + this.bottom = source.bottom + this.near = source.near + this.far = source.far + + this.zoom = source.zoom + this.view = source.view === null ? null : Object.assign({}, source.view) + + return this + }, + + setViewOffset: function (fullWidth, fullHeight, x, y, width, height) { + if (this.view === null) { + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + } + } + + this.view.enabled = true + this.view.fullWidth = fullWidth + this.view.fullHeight = fullHeight + this.view.offsetX = x + this.view.offsetY = y + this.view.width = width + this.view.height = height + + this.updateProjectionMatrix() + }, + + clearViewOffset: function () { + if (this.view !== null) { + this.view.enabled = false + } + + this.updateProjectionMatrix() + }, + + updateProjectionMatrix: function () { + var dx = (this.right - this.left) / (2 * this.zoom) + var dy = (this.top - this.bottom) / (2 * this.zoom) + var cx = (this.right + this.left) / 2 + var cy = (this.top + this.bottom) / 2 + + var left = cx - dx + var right = cx + dx + var top = cy + dy + var bottom = cy - dy + + if (this.view !== null && this.view.enabled) { + var zoomW = this.zoom / (this.view.width / this.view.fullWidth) + var zoomH = this.zoom / (this.view.height / this.view.fullHeight) + var scaleW = (this.right - this.left) / this.view.width + var scaleH = (this.top - this.bottom) / this.view.height + + left += scaleW * (this.view.offsetX / zoomW) + right = left + scaleW * (this.view.width / zoomW) + top -= scaleH * (this.view.offsetY / zoomH) + bottom = top - scaleH * (this.view.height / zoomH) + } + + this.projectionMatrix.makeOrthographic(left, right, top, bottom, this.near, this.far) + }, + + toJSON: function (meta) { + var data = Object3D.prototype.toJSON.call(this, meta) + + data.object.zoom = this.zoom + data.object.left = this.left + data.object.right = this.right + data.object.top = this.top + data.object.bottom = this.bottom + data.object.near = this.near + data.object.far = this.far + + if (this.view !== null) data.object.view = Object.assign({}, this.view) + + return data + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3(a, b, c, normal, color, materialIndex) { + this.a = a + this.b = b + this.c = c + + this.normal = normal && normal.isVector3 ? normal : new Vector3() + this.vertexNormals = Array.isArray(normal) ? normal : [] + + this.color = color && color.isColor ? color : new Color() + this.vertexColors = Array.isArray(color) ? color : [] + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0 + } + + Object.assign(Face3.prototype, { + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (source) { + this.a = source.a + this.b = source.b + this.c = source.c + + this.normal.copy(source.normal) + this.color.copy(source.color) + + this.materialIndex = source.materialIndex + + for (var i = 0, il = source.vertexNormals.length; i < il; i++) { + this.vertexNormals[i] = source.vertexNormals[i].clone() + } + + for (var i = 0, il = source.vertexColors.length; i < il; i++) { + this.vertexColors[i] = source.vertexColors[i].clone() + } + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + var geometryId = 0 // Geometry uses even numbers as Id + + function Geometry() { + Object.defineProperty(this, 'id', { value: (geometryId += 2) }) + + this.uuid = _Math.generateUUID() + + this.name = '' + this.type = 'Geometry' + + this.vertices = [] + this.colors = [] + this.faces = [] + this.faceVertexUvs = [[]] + + this.morphTargets = [] + this.morphNormals = [] + + this.skinWeights = [] + this.skinIndices = [] + + this.lineDistances = [] + + this.boundingBox = null + this.boundingSphere = null + + // update flags + + this.elementsNeedUpdate = false + this.verticesNeedUpdate = false + this.uvsNeedUpdate = false + this.normalsNeedUpdate = false + this.colorsNeedUpdate = false + this.lineDistancesNeedUpdate = false + this.groupsNeedUpdate = false + } + + Geometry.prototype = Object.assign(Object.create(EventDispatcher.prototype), { + constructor: Geometry, + + isGeometry: true, + + applyMatrix: function (matrix) { + var normalMatrix = new Matrix3().getNormalMatrix(matrix) + + for (var i = 0, il = this.vertices.length; i < il; i++) { + var vertex = this.vertices[i] + vertex.applyMatrix4(matrix) + } + + for (var i = 0, il = this.faces.length; i < il; i++) { + var face = this.faces[i] + face.normal.applyMatrix3(normalMatrix).normalize() + + for (var j = 0, jl = face.vertexNormals.length; j < jl; j++) { + face.vertexNormals[j].applyMatrix3(normalMatrix).normalize() + } + } + + if (this.boundingBox !== null) { + this.computeBoundingBox() + } + + if (this.boundingSphere !== null) { + this.computeBoundingSphere() + } + + this.verticesNeedUpdate = true + this.normalsNeedUpdate = true + + return this + }, + + rotateX: (function () { + // rotate geometry around world x-axis + + var m1 = new Matrix4() + + return function rotateX(angle) { + m1.makeRotationX(angle) + + this.applyMatrix(m1) + + return this + } + })(), + + rotateY: (function () { + // rotate geometry around world y-axis + + var m1 = new Matrix4() + + return function rotateY(angle) { + m1.makeRotationY(angle) + + this.applyMatrix(m1) + + return this + } + })(), + + rotateZ: (function () { + // rotate geometry around world z-axis + + var m1 = new Matrix4() + + return function rotateZ(angle) { + m1.makeRotationZ(angle) + + this.applyMatrix(m1) + + return this + } + })(), + + translate: (function () { + // translate geometry + + var m1 = new Matrix4() + + return function translate(x, y, z) { + m1.makeTranslation(x, y, z) + + this.applyMatrix(m1) + + return this + } + })(), + + scale: (function () { + // scale geometry + + var m1 = new Matrix4() + + return function scale(x, y, z) { + m1.makeScale(x, y, z) + + this.applyMatrix(m1) + + return this + } + })(), + + lookAt: (function () { + var obj = new Object3D() + + return function lookAt(vector) { + obj.lookAt(vector) + + obj.updateMatrix() + + this.applyMatrix(obj.matrix) + } + })(), + + fromBufferGeometry: function (geometry) { + var scope = this + + var indices = geometry.index !== null ? geometry.index.array : undefined + var attributes = geometry.attributes + + var positions = attributes.position.array + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined + var colors = attributes.color !== undefined ? attributes.color.array : undefined + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined + + if (uvs2 !== undefined) this.faceVertexUvs[1] = [] + + var tempNormals = [] + var tempUVs = [] + var tempUVs2 = [] + + for (var i = 0, j = 0; i < positions.length; i += 3, j += 2) { + scope.vertices.push(new Vector3(positions[i], positions[i + 1], positions[i + 2])) + + if (normals !== undefined) { + tempNormals.push(new Vector3(normals[i], normals[i + 1], normals[i + 2])) + } + + if (colors !== undefined) { + scope.colors.push(new Color(colors[i], colors[i + 1], colors[i + 2])) + } + + if (uvs !== undefined) { + tempUVs.push(new Vector2(uvs[j], uvs[j + 1])) + } + + if (uvs2 !== undefined) { + tempUVs2.push(new Vector2(uvs2[j], uvs2[j + 1])) + } + } + + function addFace(a, b, c, materialIndex) { + var vertexNormals = + normals !== undefined + ? [tempNormals[a].clone(), tempNormals[b].clone(), tempNormals[c].clone()] + : [] + var vertexColors = + colors !== undefined + ? [scope.colors[a].clone(), scope.colors[b].clone(), scope.colors[c].clone()] + : [] + + var face = new Face3(a, b, c, vertexNormals, vertexColors, materialIndex) + + scope.faces.push(face) + + if (uvs !== undefined) { + scope.faceVertexUvs[0].push([tempUVs[a].clone(), tempUVs[b].clone(), tempUVs[c].clone()]) + } + + if (uvs2 !== undefined) { + scope.faceVertexUvs[1].push([ + tempUVs2[a].clone(), + tempUVs2[b].clone(), + tempUVs2[c].clone() + ]) + } + } + + var groups = geometry.groups + + if (groups.length > 0) { + for (var i = 0; i < groups.length; i++) { + var group = groups[i] + + var start = group.start + var count = group.count + + for (var j = start, jl = start + count; j < jl; j += 3) { + if (indices !== undefined) { + addFace(indices[j], indices[j + 1], indices[j + 2], group.materialIndex) + } else { + addFace(j, j + 1, j + 2, group.materialIndex) + } + } + } + } else { + if (indices !== undefined) { + for (var i = 0; i < indices.length; i += 3) { + addFace(indices[i], indices[i + 1], indices[i + 2]) + } + } else { + for (var i = 0; i < positions.length / 3; i += 3) { + addFace(i, i + 1, i + 2) + } + } + } + + this.computeFaceNormals() + + if (geometry.boundingBox !== null) { + this.boundingBox = geometry.boundingBox.clone() + } + + if (geometry.boundingSphere !== null) { + this.boundingSphere = geometry.boundingSphere.clone() + } + + return this + }, + + center: function () { + this.computeBoundingBox() + + var offset = this.boundingBox.getCenter().negate() + + this.translate(offset.x, offset.y, offset.z) + + return offset + }, + + normalize: function () { + this.computeBoundingSphere() + + var center = this.boundingSphere.center + var radius = this.boundingSphere.radius + + var s = radius === 0 ? 1 : 1.0 / radius + + var matrix = new Matrix4() + matrix.set(s, 0, 0, -s * center.x, 0, s, 0, -s * center.y, 0, 0, s, -s * center.z, 0, 0, 0, 1) + + this.applyMatrix(matrix) + + return this + }, + + computeFaceNormals: function () { + var cb = new Vector3(), + ab = new Vector3() + + for (var f = 0, fl = this.faces.length; f < fl; f++) { + var face = this.faces[f] + + var vA = this.vertices[face.a] + var vB = this.vertices[face.b] + var vC = this.vertices[face.c] + + cb.subVectors(vC, vB) + ab.subVectors(vA, vB) + cb.cross(ab) + + cb.normalize() + + face.normal.copy(cb) + } + }, + + computeVertexNormals: function (areaWeighted) { + if (areaWeighted === undefined) areaWeighted = true + + var v, vl, f, fl, face, vertices + + vertices = new Array(this.vertices.length) + + for (v = 0, vl = this.vertices.length; v < vl; v++) { + vertices[v] = new Vector3() + } + + if (areaWeighted) { + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC + var cb = new Vector3(), + ab = new Vector3() + + for (f = 0, fl = this.faces.length; f < fl; f++) { + face = this.faces[f] + + vA = this.vertices[face.a] + vB = this.vertices[face.b] + vC = this.vertices[face.c] + + cb.subVectors(vC, vB) + ab.subVectors(vA, vB) + cb.cross(ab) + + vertices[face.a].add(cb) + vertices[face.b].add(cb) + vertices[face.c].add(cb) + } + } else { + this.computeFaceNormals() + + for (f = 0, fl = this.faces.length; f < fl; f++) { + face = this.faces[f] + + vertices[face.a].add(face.normal) + vertices[face.b].add(face.normal) + vertices[face.c].add(face.normal) + } + } + + for (v = 0, vl = this.vertices.length; v < vl; v++) { + vertices[v].normalize() + } + + for (f = 0, fl = this.faces.length; f < fl; f++) { + face = this.faces[f] + + var vertexNormals = face.vertexNormals + + if (vertexNormals.length === 3) { + vertexNormals[0].copy(vertices[face.a]) + vertexNormals[1].copy(vertices[face.b]) + vertexNormals[2].copy(vertices[face.c]) + } else { + vertexNormals[0] = vertices[face.a].clone() + vertexNormals[1] = vertices[face.b].clone() + vertexNormals[2] = vertices[face.c].clone() + } + } + + if (this.faces.length > 0) { + this.normalsNeedUpdate = true + } + }, + + computeFlatVertexNormals: function () { + var f, fl, face + + this.computeFaceNormals() + + for (f = 0, fl = this.faces.length; f < fl; f++) { + face = this.faces[f] + + var vertexNormals = face.vertexNormals + + if (vertexNormals.length === 3) { + vertexNormals[0].copy(face.normal) + vertexNormals[1].copy(face.normal) + vertexNormals[2].copy(face.normal) + } else { + vertexNormals[0] = face.normal.clone() + vertexNormals[1] = face.normal.clone() + vertexNormals[2] = face.normal.clone() + } + } + + if (this.faces.length > 0) { + this.normalsNeedUpdate = true + } + }, + + computeMorphNormals: function () { + var i, il, f, fl, face + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for (f = 0, fl = this.faces.length; f < fl; f++) { + face = this.faces[f] + + if (!face.__originalFaceNormal) { + face.__originalFaceNormal = face.normal.clone() + } else { + face.__originalFaceNormal.copy(face.normal) + } + + if (!face.__originalVertexNormals) face.__originalVertexNormals = [] + + for (i = 0, il = face.vertexNormals.length; i < il; i++) { + if (!face.__originalVertexNormals[i]) { + face.__originalVertexNormals[i] = face.vertexNormals[i].clone() + } else { + face.__originalVertexNormals[i].copy(face.vertexNormals[i]) + } + } + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry() + tmpGeo.faces = this.faces + + for (i = 0, il = this.morphTargets.length; i < il; i++) { + // create on first access + + if (!this.morphNormals[i]) { + this.morphNormals[i] = {} + this.morphNormals[i].faceNormals = [] + this.morphNormals[i].vertexNormals = [] + + var dstNormalsFace = this.morphNormals[i].faceNormals + var dstNormalsVertex = this.morphNormals[i].vertexNormals + + var faceNormal, vertexNormals + + for (f = 0, fl = this.faces.length; f < fl; f++) { + faceNormal = new Vector3() + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() } + + dstNormalsFace.push(faceNormal) + dstNormalsVertex.push(vertexNormals) + } + } + + var morphNormals = this.morphNormals[i] + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[i].vertices + + // compute morph normals + + tmpGeo.computeFaceNormals() + tmpGeo.computeVertexNormals() + + // store morph normals + + var faceNormal, vertexNormals + + for (f = 0, fl = this.faces.length; f < fl; f++) { + face = this.faces[f] + + faceNormal = morphNormals.faceNormals[f] + vertexNormals = morphNormals.vertexNormals[f] + + faceNormal.copy(face.normal) + + vertexNormals.a.copy(face.vertexNormals[0]) + vertexNormals.b.copy(face.vertexNormals[1]) + vertexNormals.c.copy(face.vertexNormals[2]) + } + } + + // restore original normals + + for (f = 0, fl = this.faces.length; f < fl; f++) { + face = this.faces[f] + + face.normal = face.__originalFaceNormal + face.vertexNormals = face.__originalVertexNormals + } + }, + + computeBoundingBox: function () { + if (this.boundingBox === null) { + this.boundingBox = new Box3() + } + + this.boundingBox.setFromPoints(this.vertices) + }, + + computeBoundingSphere: function () { + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere() + } + + this.boundingSphere.setFromPoints(this.vertices) + }, + + merge: function (geometry, matrix, materialIndexOffset) { + if (!(geometry && geometry.isGeometry)) { + console.error( + 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', + geometry + ) + return + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[0], + uvs2 = geometry.faceVertexUvs[0], + colors1 = this.colors, + colors2 = geometry.colors + + if (materialIndexOffset === undefined) materialIndexOffset = 0 + + if (matrix !== undefined) { + normalMatrix = new Matrix3().getNormalMatrix(matrix) + } + + // vertices + + for (var i = 0, il = vertices2.length; i < il; i++) { + var vertex = vertices2[i] + + var vertexCopy = vertex.clone() + + if (matrix !== undefined) vertexCopy.applyMatrix4(matrix) + + vertices1.push(vertexCopy) + } + + // colors + + for (var i = 0, il = colors2.length; i < il; i++) { + colors1.push(colors2[i].clone()) + } + + // faces + + for (i = 0, il = faces2.length; i < il; i++) { + var face = faces2[i], + faceCopy, + normal, + color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors + + faceCopy = new Face3(face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset) + faceCopy.normal.copy(face.normal) + + if (normalMatrix !== undefined) { + faceCopy.normal.applyMatrix3(normalMatrix).normalize() + } + + for (var j = 0, jl = faceVertexNormals.length; j < jl; j++) { + normal = faceVertexNormals[j].clone() + + if (normalMatrix !== undefined) { + normal.applyMatrix3(normalMatrix).normalize() + } + + faceCopy.vertexNormals.push(normal) + } + + faceCopy.color.copy(face.color) + + for (var j = 0, jl = faceVertexColors.length; j < jl; j++) { + color = faceVertexColors[j] + faceCopy.vertexColors.push(color.clone()) + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset + + faces1.push(faceCopy) + } + + // uvs + + for (i = 0, il = uvs2.length; i < il; i++) { + var uv = uvs2[i], + uvCopy = [] + + if (uv === undefined) { + continue + } + + for (var j = 0, jl = uv.length; j < jl; j++) { + uvCopy.push(uv[j].clone()) + } + + uvs1.push(uvCopy) + } + }, + + mergeMesh: function (mesh) { + if (!(mesh && mesh.isMesh)) { + console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh) + return + } + + mesh.matrixAutoUpdate && mesh.updateMatrix() + + this.merge(mesh.geometry, mesh.matrix) + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + var verticesMap = {} // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], + changes = [] + + var v, key + var precisionPoints = 4 // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow(10, precisionPoints) + var i, il, face + var indices, j, jl + + for (i = 0, il = this.vertices.length; i < il; i++) { + v = this.vertices[i] + key = + Math.round(v.x * precision) + + '_' + + Math.round(v.y * precision) + + '_' + + Math.round(v.z * precision) + + if (verticesMap[key] === undefined) { + verticesMap[key] = i + unique.push(this.vertices[i]) + changes[i] = unique.length - 1 + } else { + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[i] = changes[verticesMap[key]] + } + } + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = [] + + for (i = 0, il = this.faces.length; i < il; i++) { + face = this.faces[i] + + face.a = changes[face.a] + face.b = changes[face.b] + face.c = changes[face.c] + + indices = [face.a, face.b, face.c] + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for (var n = 0; n < 3; n++) { + if (indices[n] === indices[(n + 1) % 3]) { + faceIndicesToRemove.push(i) + break + } + } + } + + for (i = faceIndicesToRemove.length - 1; i >= 0; i--) { + var idx = faceIndicesToRemove[i] + + this.faces.splice(idx, 1) + + for (j = 0, jl = this.faceVertexUvs.length; j < jl; j++) { + this.faceVertexUvs[j].splice(idx, 1) + } + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length + this.vertices = unique + return diff + }, + + setFromPoints: function (points) { + this.vertices = [] + + for (var i = 0, l = points.length; i < l; i++) { + var point = points[i] + this.vertices.push(new Vector3(point.x, point.y, point.z || 0)) + } + + return this + }, + + sortFacesByMaterialIndex: function () { + var faces = this.faces + var length = faces.length + + // tag faces + + for (var i = 0; i < length; i++) { + faces[i]._id = i + } + + // sort faces + + function materialIndexSort(a, b) { + return a.materialIndex - b.materialIndex + } + + faces.sort(materialIndexSort) + + // sort uvs + + var uvs1 = this.faceVertexUvs[0] + var uvs2 = this.faceVertexUvs[1] + + var newUvs1, newUvs2 + + if (uvs1 && uvs1.length === length) newUvs1 = [] + if (uvs2 && uvs2.length === length) newUvs2 = [] + + for (var i = 0; i < length; i++) { + var id = faces[i]._id + + if (newUvs1) newUvs1.push(uvs1[id]) + if (newUvs2) newUvs2.push(uvs2[id]) + } + + if (newUvs1) this.faceVertexUvs[0] = newUvs1 + if (newUvs2) this.faceVertexUvs[1] = newUvs2 + }, + + toJSON: function () { + var data = { + metadata: { + version: 4.5, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + } + + // standard Geometry serialization + + data.uuid = this.uuid + data.type = this.type + if (this.name !== '') data.name = this.name + + if (this.parameters !== undefined) { + var parameters = this.parameters + + for (var key in parameters) { + if (parameters[key] !== undefined) data[key] = parameters[key] + } + + return data + } + + var vertices = [] + + for (var i = 0; i < this.vertices.length; i++) { + var vertex = this.vertices[i] + vertices.push(vertex.x, vertex.y, vertex.z) + } + + var faces = [] + var normals = [] + var normalsHash = {} + var colors = [] + var colorsHash = {} + var uvs = [] + var uvsHash = {} + + for (var i = 0; i < this.faces.length; i++) { + var face = this.faces[i] + + var hasMaterial = true + var hasFaceUv = false // deprecated + var hasFaceVertexUv = this.faceVertexUvs[0][i] !== undefined + var hasFaceNormal = face.normal.length() > 0 + var hasFaceVertexNormal = face.vertexNormals.length > 0 + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1 + var hasFaceVertexColor = face.vertexColors.length > 0 + + var faceType = 0 + + faceType = setBit(faceType, 0, 0) // isQuad + faceType = setBit(faceType, 1, hasMaterial) + faceType = setBit(faceType, 2, hasFaceUv) + faceType = setBit(faceType, 3, hasFaceVertexUv) + faceType = setBit(faceType, 4, hasFaceNormal) + faceType = setBit(faceType, 5, hasFaceVertexNormal) + faceType = setBit(faceType, 6, hasFaceColor) + faceType = setBit(faceType, 7, hasFaceVertexColor) + + faces.push(faceType) + faces.push(face.a, face.b, face.c) + faces.push(face.materialIndex) + + if (hasFaceVertexUv) { + var faceVertexUvs = this.faceVertexUvs[0][i] + + faces.push( + getUvIndex(faceVertexUvs[0]), + getUvIndex(faceVertexUvs[1]), + getUvIndex(faceVertexUvs[2]) + ) + } + + if (hasFaceNormal) { + faces.push(getNormalIndex(face.normal)) + } + + if (hasFaceVertexNormal) { + var vertexNormals = face.vertexNormals + + faces.push( + getNormalIndex(vertexNormals[0]), + getNormalIndex(vertexNormals[1]), + getNormalIndex(vertexNormals[2]) + ) + } + + if (hasFaceColor) { + faces.push(getColorIndex(face.color)) + } + + if (hasFaceVertexColor) { + var vertexColors = face.vertexColors + + faces.push( + getColorIndex(vertexColors[0]), + getColorIndex(vertexColors[1]), + getColorIndex(vertexColors[2]) + ) + } + } + + function setBit(value, position, enabled) { + return enabled ? value | (1 << position) : value & ~(1 << position) + } + + function getNormalIndex(normal) { + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString() + + if (normalsHash[hash] !== undefined) { + return normalsHash[hash] + } + + normalsHash[hash] = normals.length / 3 + normals.push(normal.x, normal.y, normal.z) + + return normalsHash[hash] + } + + function getColorIndex(color) { + var hash = color.r.toString() + color.g.toString() + color.b.toString() + + if (colorsHash[hash] !== undefined) { + return colorsHash[hash] + } + + colorsHash[hash] = colors.length + colors.push(color.getHex()) + + return colorsHash[hash] + } + + function getUvIndex(uv) { + var hash = uv.x.toString() + uv.y.toString() + + if (uvsHash[hash] !== undefined) { + return uvsHash[hash] + } + + uvsHash[hash] = uvs.length / 2 + uvs.push(uv.x, uv.y) + + return uvsHash[hash] + } + + data.data = {} + + data.data.vertices = vertices + data.data.normals = normals + if (colors.length > 0) data.data.colors = colors + if (uvs.length > 0) data.data.uvs = [uvs] // temporal backward compatibility + data.data.faces = faces + + return data + }, + + clone: function () { + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy(this) + }, + + copy: function (source) { + var i, il, j, jl, k, kl + + // reset + + this.vertices = [] + this.colors = [] + this.faces = [] + this.faceVertexUvs = [[]] + this.morphTargets = [] + this.morphNormals = [] + this.skinWeights = [] + this.skinIndices = [] + this.lineDistances = [] + this.boundingBox = null + this.boundingSphere = null + + // name + + this.name = source.name + + // vertices + + var vertices = source.vertices + + for (i = 0, il = vertices.length; i < il; i++) { + this.vertices.push(vertices[i].clone()) + } + + // colors + + var colors = source.colors + + for (i = 0, il = colors.length; i < il; i++) { + this.colors.push(colors[i].clone()) + } + + // faces + + var faces = source.faces + + for (i = 0, il = faces.length; i < il; i++) { + this.faces.push(faces[i].clone()) + } + + // face vertex uvs + + for (i = 0, il = source.faceVertexUvs.length; i < il; i++) { + var faceVertexUvs = source.faceVertexUvs[i] + + if (this.faceVertexUvs[i] === undefined) { + this.faceVertexUvs[i] = [] + } + + for (j = 0, jl = faceVertexUvs.length; j < jl; j++) { + var uvs = faceVertexUvs[j], + uvsCopy = [] + + for (k = 0, kl = uvs.length; k < kl; k++) { + var uv = uvs[k] + + uvsCopy.push(uv.clone()) + } + + this.faceVertexUvs[i].push(uvsCopy) + } + } + + // morph targets + + var morphTargets = source.morphTargets + + for (i = 0, il = morphTargets.length; i < il; i++) { + var morphTarget = {} + morphTarget.name = morphTargets[i].name + + // vertices + + if (morphTargets[i].vertices !== undefined) { + morphTarget.vertices = [] + + for (j = 0, jl = morphTargets[i].vertices.length; j < jl; j++) { + morphTarget.vertices.push(morphTargets[i].vertices[j].clone()) + } + } + + // normals + + if (morphTargets[i].normals !== undefined) { + morphTarget.normals = [] + + for (j = 0, jl = morphTargets[i].normals.length; j < jl; j++) { + morphTarget.normals.push(morphTargets[i].normals[j].clone()) + } + } + + this.morphTargets.push(morphTarget) + } + + // morph normals + + var morphNormals = source.morphNormals + + for (i = 0, il = morphNormals.length; i < il; i++) { + var morphNormal = {} + + // vertex normals + + if (morphNormals[i].vertexNormals !== undefined) { + morphNormal.vertexNormals = [] + + for (j = 0, jl = morphNormals[i].vertexNormals.length; j < jl; j++) { + var srcVertexNormal = morphNormals[i].vertexNormals[j] + var destVertexNormal = {} + + destVertexNormal.a = srcVertexNormal.a.clone() + destVertexNormal.b = srcVertexNormal.b.clone() + destVertexNormal.c = srcVertexNormal.c.clone() + + morphNormal.vertexNormals.push(destVertexNormal) + } + } + + // face normals + + if (morphNormals[i].faceNormals !== undefined) { + morphNormal.faceNormals = [] + + for (j = 0, jl = morphNormals[i].faceNormals.length; j < jl; j++) { + morphNormal.faceNormals.push(morphNormals[i].faceNormals[j].clone()) + } + } + + this.morphNormals.push(morphNormal) + } + + // skin weights + + var skinWeights = source.skinWeights + + for (i = 0, il = skinWeights.length; i < il; i++) { + this.skinWeights.push(skinWeights[i].clone()) + } + + // skin indices + + var skinIndices = source.skinIndices + + for (i = 0, il = skinIndices.length; i < il; i++) { + this.skinIndices.push(skinIndices[i].clone()) + } + + // line distances + + var lineDistances = source.lineDistances + + for (i = 0, il = lineDistances.length; i < il; i++) { + this.lineDistances.push(lineDistances[i]) + } + + // bounding box + + var boundingBox = source.boundingBox + + if (boundingBox !== null) { + this.boundingBox = boundingBox.clone() + } + + // bounding sphere + + var boundingSphere = source.boundingSphere + + if (boundingSphere !== null) { + this.boundingSphere = boundingSphere.clone() + } + + // update flags + + this.elementsNeedUpdate = source.elementsNeedUpdate + this.verticesNeedUpdate = source.verticesNeedUpdate + this.uvsNeedUpdate = source.uvsNeedUpdate + this.normalsNeedUpdate = source.normalsNeedUpdate + this.colorsNeedUpdate = source.colorsNeedUpdate + this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate + this.groupsNeedUpdate = source.groupsNeedUpdate + + return this + }, + + dispose: function () { + this.dispatchEvent({ type: 'dispose' }) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute(array, itemSize, normalized) { + if (Array.isArray(array)) { + throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.') + } + + this.uuid = _Math.generateUUID() + this.name = '' + + this.array = array + this.itemSize = itemSize + this.count = array !== undefined ? array.length / itemSize : 0 + this.normalized = normalized === true + + this.dynamic = false + this.updateRange = { offset: 0, count: -1 } + + this.onUploadCallback = function () {} + + this.version = 0 + } + + Object.defineProperty(BufferAttribute.prototype, 'needsUpdate', { + set: function (value) { + if (value === true) this.version++ + } + }) + + Object.assign(BufferAttribute.prototype, { + isBufferAttribute: true, + + setArray: function (array) { + if (Array.isArray(array)) { + throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.') + } + + this.count = array !== undefined ? array.length / this.itemSize : 0 + this.array = array + }, + + setDynamic: function (value) { + this.dynamic = value + + return this + }, + + copy: function (source) { + this.array = new source.array.constructor(source.array) + this.itemSize = source.itemSize + this.count = source.count + this.normalized = source.normalized + + this.dynamic = source.dynamic + + return this + }, + + copyAt: function (index1, attribute, index2) { + index1 *= this.itemSize + index2 *= attribute.itemSize + + for (var i = 0, l = this.itemSize; i < l; i++) { + this.array[index1 + i] = attribute.array[index2 + i] + } + + return this + }, + + copyArray: function (array) { + this.array.set(array) + + return this + }, + + copyColorsArray: function (colors) { + var array = this.array, + offset = 0 + + for (var i = 0, l = colors.length; i < l; i++) { + var color = colors[i] + + if (color === undefined) { + console.warn('THREE.BufferAttribute.copyColorsArray(): color is undefined', i) + color = new Color() + } + + array[offset++] = color.r + array[offset++] = color.g + array[offset++] = color.b + } + + return this + }, + + copyIndicesArray: function (indices) { + var array = this.array, + offset = 0 + + for (var i = 0, l = indices.length; i < l; i++) { + var index = indices[i] + + array[offset++] = index.a + array[offset++] = index.b + array[offset++] = index.c + } + + return this + }, + + copyVector2sArray: function (vectors) { + var array = this.array, + offset = 0 + + for (var i = 0, l = vectors.length; i < l; i++) { + var vector = vectors[i] + + if (vector === undefined) { + console.warn('THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i) + vector = new Vector2() + } + + array[offset++] = vector.x + array[offset++] = vector.y + } + + return this + }, + + copyVector3sArray: function (vectors) { + var array = this.array, + offset = 0 + + for (var i = 0, l = vectors.length; i < l; i++) { + var vector = vectors[i] + + if (vector === undefined) { + console.warn('THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i) + vector = new Vector3() + } + + array[offset++] = vector.x + array[offset++] = vector.y + array[offset++] = vector.z + } + + return this + }, + + copyVector4sArray: function (vectors) { + var array = this.array, + offset = 0 + + for (var i = 0, l = vectors.length; i < l; i++) { + var vector = vectors[i] + + if (vector === undefined) { + console.warn('THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i) + vector = new Vector4() + } + + array[offset++] = vector.x + array[offset++] = vector.y + array[offset++] = vector.z + array[offset++] = vector.w + } + + return this + }, + + set: function (value, offset) { + if (offset === undefined) offset = 0 + + this.array.set(value, offset) + + return this + }, + + getX: function (index) { + return this.array[index * this.itemSize] + }, + + setX: function (index, x) { + this.array[index * this.itemSize] = x + + return this + }, + + getY: function (index) { + return this.array[index * this.itemSize + 1] + }, + + setY: function (index, y) { + this.array[index * this.itemSize + 1] = y + + return this + }, + + getZ: function (index) { + return this.array[index * this.itemSize + 2] + }, + + setZ: function (index, z) { + this.array[index * this.itemSize + 2] = z + + return this + }, + + getW: function (index) { + return this.array[index * this.itemSize + 3] + }, + + setW: function (index, w) { + this.array[index * this.itemSize + 3] = w + + return this + }, + + setXY: function (index, x, y) { + index *= this.itemSize + + this.array[index + 0] = x + this.array[index + 1] = y + + return this + }, + + setXYZ: function (index, x, y, z) { + index *= this.itemSize + + this.array[index + 0] = x + this.array[index + 1] = y + this.array[index + 2] = z + + return this + }, + + setXYZW: function (index, x, y, z, w) { + index *= this.itemSize + + this.array[index + 0] = x + this.array[index + 1] = y + this.array[index + 2] = z + this.array[index + 3] = w + + return this + }, + + onUpload: function (callback) { + this.onUploadCallback = callback + + return this + }, + + clone: function () { + return new this.constructor(this.array, this.itemSize).copy(this) + } + }) + + // + + function Int8BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Int8Array(array), itemSize, normalized) + } + + Int8BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Int8BufferAttribute.prototype.constructor = Int8BufferAttribute + + function Uint8BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Uint8Array(array), itemSize, normalized) + } + + Uint8BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute + + function Uint8ClampedBufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Uint8ClampedArray(array), itemSize, normalized) + } + + Uint8ClampedBufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute + + function Int16BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Int16Array(array), itemSize, normalized) + } + + Int16BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Int16BufferAttribute.prototype.constructor = Int16BufferAttribute + + function Uint16BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Uint16Array(array), itemSize, normalized) + } + + Uint16BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute + + function Int32BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Int32Array(array), itemSize, normalized) + } + + Int32BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Int32BufferAttribute.prototype.constructor = Int32BufferAttribute + + function Uint32BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Uint32Array(array), itemSize, normalized) + } + + Uint32BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute + + function Float32BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Float32Array(array), itemSize, normalized) + } + + Float32BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Float32BufferAttribute.prototype.constructor = Float32BufferAttribute + + function Float64BufferAttribute(array, itemSize, normalized) { + BufferAttribute.call(this, new Float64Array(array), itemSize, normalized) + } + + Float64BufferAttribute.prototype = Object.create(BufferAttribute.prototype) + Float64BufferAttribute.prototype.constructor = Float64BufferAttribute + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + this.indices = [] + this.vertices = [] + this.normals = [] + this.colors = [] + this.uvs = [] + this.uvs2 = [] + + this.groups = [] + + this.morphTargets = {} + + this.skinWeights = [] + this.skinIndices = [] + + // this.lineDistances = []; + + this.boundingBox = null + this.boundingSphere = null + + // update flags + + this.verticesNeedUpdate = false + this.normalsNeedUpdate = false + this.colorsNeedUpdate = false + this.uvsNeedUpdate = false + this.groupsNeedUpdate = false + } + + Object.assign(DirectGeometry.prototype, { + computeGroups: function (geometry) { + var group + var groups = [] + var materialIndex = undefined + + var faces = geometry.faces + + for (var i = 0; i < faces.length; i++) { + var face = faces[i] + + // materials + + if (face.materialIndex !== materialIndex) { + materialIndex = face.materialIndex + + if (group !== undefined) { + group.count = i * 3 - group.start + groups.push(group) + } + + group = { + start: i * 3, + materialIndex: materialIndex + } + } + } + + if (group !== undefined) { + group.count = i * 3 - group.start + groups.push(group) + } + + this.groups = groups + }, + + fromGeometry: function (geometry) { + var faces = geometry.faces + var vertices = geometry.vertices + var faceVertexUvs = geometry.faceVertexUvs + + var hasFaceVertexUv = faceVertexUvs[0] && faceVertexUvs[0].length > 0 + var hasFaceVertexUv2 = faceVertexUvs[1] && faceVertexUvs[1].length > 0 + + // morphs + + var morphTargets = geometry.morphTargets + var morphTargetsLength = morphTargets.length + + var morphTargetsPosition + + if (morphTargetsLength > 0) { + morphTargetsPosition = [] + + for (var i = 0; i < morphTargetsLength; i++) { + morphTargetsPosition[i] = [] + } + + this.morphTargets.position = morphTargetsPosition + } + + var morphNormals = geometry.morphNormals + var morphNormalsLength = morphNormals.length + + var morphTargetsNormal + + if (morphNormalsLength > 0) { + morphTargetsNormal = [] + + for (var i = 0; i < morphNormalsLength; i++) { + morphTargetsNormal[i] = [] + } + + this.morphTargets.normal = morphTargetsNormal + } + + // skins + + var skinIndices = geometry.skinIndices + var skinWeights = geometry.skinWeights + + var hasSkinIndices = skinIndices.length === vertices.length + var hasSkinWeights = skinWeights.length === vertices.length + + // + + for (var i = 0; i < faces.length; i++) { + var face = faces[i] + + this.vertices.push(vertices[face.a], vertices[face.b], vertices[face.c]) + + var vertexNormals = face.vertexNormals + + if (vertexNormals.length === 3) { + this.normals.push(vertexNormals[0], vertexNormals[1], vertexNormals[2]) + } else { + var normal = face.normal + + this.normals.push(normal, normal, normal) + } + + var vertexColors = face.vertexColors + + if (vertexColors.length === 3) { + this.colors.push(vertexColors[0], vertexColors[1], vertexColors[2]) + } else { + var color = face.color + + this.colors.push(color, color, color) + } + + if (hasFaceVertexUv === true) { + var vertexUvs = faceVertexUvs[0][i] + + if (vertexUvs !== undefined) { + this.uvs.push(vertexUvs[0], vertexUvs[1], vertexUvs[2]) + } else { + console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i) + + this.uvs.push(new Vector2(), new Vector2(), new Vector2()) + } + } + + if (hasFaceVertexUv2 === true) { + var vertexUvs = faceVertexUvs[1][i] + + if (vertexUvs !== undefined) { + this.uvs2.push(vertexUvs[0], vertexUvs[1], vertexUvs[2]) + } else { + console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i) + + this.uvs2.push(new Vector2(), new Vector2(), new Vector2()) + } + } + + // morphs + + for (var j = 0; j < morphTargetsLength; j++) { + var morphTarget = morphTargets[j].vertices + + morphTargetsPosition[j].push( + morphTarget[face.a], + morphTarget[face.b], + morphTarget[face.c] + ) + } + + for (var j = 0; j < morphNormalsLength; j++) { + var morphNormal = morphNormals[j].vertexNormals[i] + + morphTargetsNormal[j].push(morphNormal.a, morphNormal.b, morphNormal.c) + } + + // skins + + if (hasSkinIndices) { + this.skinIndices.push(skinIndices[face.a], skinIndices[face.b], skinIndices[face.c]) + } + + if (hasSkinWeights) { + this.skinWeights.push(skinWeights[face.a], skinWeights[face.b], skinWeights[face.c]) + } + } + + this.computeGroups(geometry) + + this.verticesNeedUpdate = geometry.verticesNeedUpdate + this.normalsNeedUpdate = geometry.normalsNeedUpdate + this.colorsNeedUpdate = geometry.colorsNeedUpdate + this.uvsNeedUpdate = geometry.uvsNeedUpdate + this.groupsNeedUpdate = geometry.groupsNeedUpdate + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function arrayMax(array) { + if (array.length === 0) return -Infinity + + var max = array[0] + + for (var i = 1, l = array.length; i < l; ++i) { + if (array[i] > max) max = array[i] + } + + return max + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var bufferGeometryId = 1 // BufferGeometry uses odd numbers as Id + + function BufferGeometry() { + Object.defineProperty(this, 'id', { value: (bufferGeometryId += 2) }) + + this.uuid = _Math.generateUUID() + + this.name = '' + this.type = 'BufferGeometry' + + this.index = null + this.attributes = {} + + this.morphAttributes = {} + + this.groups = [] + + this.boundingBox = null + this.boundingSphere = null + + this.drawRange = { start: 0, count: Infinity } + } + + BufferGeometry.prototype = Object.assign(Object.create(EventDispatcher.prototype), { + constructor: BufferGeometry, + + isBufferGeometry: true, + + getIndex: function () { + return this.index + }, + + setIndex: function (index) { + if (Array.isArray(index)) { + this.index = new (arrayMax(index) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute)( + index, + 1 + ) + } else { + this.index = index + } + }, + + addAttribute: function (name, attribute) { + if ( + !(attribute && attribute.isBufferAttribute) && + !(attribute && attribute.isInterleavedBufferAttribute) + ) { + console.warn('THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).') + + this.addAttribute(name, new BufferAttribute(arguments[1], arguments[2])) + + return + } + + if (name === 'index') { + console.warn('THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.') + this.setIndex(attribute) + + return + } + + this.attributes[name] = attribute + + return this + }, + + getAttribute: function (name) { + return this.attributes[name] + }, + + removeAttribute: function (name) { + delete this.attributes[name] + + return this + }, + + addGroup: function (start, count, materialIndex) { + this.groups.push({ + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + }) + }, + + clearGroups: function () { + this.groups = [] + }, + + setDrawRange: function (start, count) { + this.drawRange.start = start + this.drawRange.count = count + }, + + applyMatrix: function (matrix) { + var position = this.attributes.position + + if (position !== undefined) { + matrix.applyToBufferAttribute(position) + position.needsUpdate = true + } + + var normal = this.attributes.normal + + if (normal !== undefined) { + var normalMatrix = new Matrix3().getNormalMatrix(matrix) + + normalMatrix.applyToBufferAttribute(normal) + normal.needsUpdate = true + } + + if (this.boundingBox !== null) { + this.computeBoundingBox() + } + + if (this.boundingSphere !== null) { + this.computeBoundingSphere() + } + + return this + }, + + rotateX: (function () { + // rotate geometry around world x-axis + + var m1 = new Matrix4() + + return function rotateX(angle) { + m1.makeRotationX(angle) + + this.applyMatrix(m1) + + return this + } + })(), + + rotateY: (function () { + // rotate geometry around world y-axis + + var m1 = new Matrix4() + + return function rotateY(angle) { + m1.makeRotationY(angle) + + this.applyMatrix(m1) + + return this + } + })(), + + rotateZ: (function () { + // rotate geometry around world z-axis + + var m1 = new Matrix4() + + return function rotateZ(angle) { + m1.makeRotationZ(angle) + + this.applyMatrix(m1) + + return this + } + })(), + + translate: (function () { + // translate geometry + + var m1 = new Matrix4() + + return function translate(x, y, z) { + m1.makeTranslation(x, y, z) + + this.applyMatrix(m1) + + return this + } + })(), + + scale: (function () { + // scale geometry + + var m1 = new Matrix4() + + return function scale(x, y, z) { + m1.makeScale(x, y, z) + + this.applyMatrix(m1) + + return this + } + })(), + + lookAt: (function () { + var obj = new Object3D() + + return function lookAt(vector) { + obj.lookAt(vector) + + obj.updateMatrix() + + this.applyMatrix(obj.matrix) + } + })(), + + center: function () { + this.computeBoundingBox() + + var offset = this.boundingBox.getCenter().negate() + + this.translate(offset.x, offset.y, offset.z) + + return offset + }, + + setFromObject: function (object) { + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry + + if (object.isPoints || object.isLine) { + var positions = new Float32BufferAttribute(geometry.vertices.length * 3, 3) + var colors = new Float32BufferAttribute(geometry.colors.length * 3, 3) + + this.addAttribute('position', positions.copyVector3sArray(geometry.vertices)) + this.addAttribute('color', colors.copyColorsArray(geometry.colors)) + + if (geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length) { + var lineDistances = new Float32BufferAttribute(geometry.lineDistances.length, 1) + + this.addAttribute('lineDistance', lineDistances.copyArray(geometry.lineDistances)) + } + + if (geometry.boundingSphere !== null) { + this.boundingSphere = geometry.boundingSphere.clone() + } + + if (geometry.boundingBox !== null) { + this.boundingBox = geometry.boundingBox.clone() + } + } else if (object.isMesh) { + if (geometry && geometry.isGeometry) { + this.fromGeometry(geometry) + } + } + + return this + }, + + setFromPoints: function (points) { + var position = [] + + for (var i = 0, l = points.length; i < l; i++) { + var point = points[i] + position.push(point.x, point.y, point.z || 0) + } + + this.addAttribute('position', new Float32BufferAttribute(position, 3)) + + return this + }, + + updateFromObject: function (object) { + var geometry = object.geometry + + if (object.isMesh) { + var direct = geometry.__directGeometry + + if (geometry.elementsNeedUpdate === true) { + direct = undefined + geometry.elementsNeedUpdate = false + } + + if (direct === undefined) { + return this.fromGeometry(geometry) + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate + direct.normalsNeedUpdate = geometry.normalsNeedUpdate + direct.colorsNeedUpdate = geometry.colorsNeedUpdate + direct.uvsNeedUpdate = geometry.uvsNeedUpdate + direct.groupsNeedUpdate = geometry.groupsNeedUpdate + + geometry.verticesNeedUpdate = false + geometry.normalsNeedUpdate = false + geometry.colorsNeedUpdate = false + geometry.uvsNeedUpdate = false + geometry.groupsNeedUpdate = false + + geometry = direct + } + + var attribute + + if (geometry.verticesNeedUpdate === true) { + attribute = this.attributes.position + + if (attribute !== undefined) { + attribute.copyVector3sArray(geometry.vertices) + attribute.needsUpdate = true + } + + geometry.verticesNeedUpdate = false + } + + if (geometry.normalsNeedUpdate === true) { + attribute = this.attributes.normal + + if (attribute !== undefined) { + attribute.copyVector3sArray(geometry.normals) + attribute.needsUpdate = true + } + + geometry.normalsNeedUpdate = false + } + + if (geometry.colorsNeedUpdate === true) { + attribute = this.attributes.color + + if (attribute !== undefined) { + attribute.copyColorsArray(geometry.colors) + attribute.needsUpdate = true + } + + geometry.colorsNeedUpdate = false + } + + if (geometry.uvsNeedUpdate) { + attribute = this.attributes.uv + + if (attribute !== undefined) { + attribute.copyVector2sArray(geometry.uvs) + attribute.needsUpdate = true + } + + geometry.uvsNeedUpdate = false + } + + if (geometry.lineDistancesNeedUpdate) { + attribute = this.attributes.lineDistance + + if (attribute !== undefined) { + attribute.copyArray(geometry.lineDistances) + attribute.needsUpdate = true + } + + geometry.lineDistancesNeedUpdate = false + } + + if (geometry.groupsNeedUpdate) { + geometry.computeGroups(object.geometry) + this.groups = geometry.groups + + geometry.groupsNeedUpdate = false + } + + return this + }, + + fromGeometry: function (geometry) { + geometry.__directGeometry = new DirectGeometry().fromGeometry(geometry) + + return this.fromDirectGeometry(geometry.__directGeometry) + }, + + fromDirectGeometry: function (geometry) { + var positions = new Float32Array(geometry.vertices.length * 3) + this.addAttribute( + 'position', + new BufferAttribute(positions, 3).copyVector3sArray(geometry.vertices) + ) + + if (geometry.normals.length > 0) { + var normals = new Float32Array(geometry.normals.length * 3) + this.addAttribute( + 'normal', + new BufferAttribute(normals, 3).copyVector3sArray(geometry.normals) + ) + } + + if (geometry.colors.length > 0) { + var colors = new Float32Array(geometry.colors.length * 3) + this.addAttribute('color', new BufferAttribute(colors, 3).copyColorsArray(geometry.colors)) + } + + if (geometry.uvs.length > 0) { + var uvs = new Float32Array(geometry.uvs.length * 2) + this.addAttribute('uv', new BufferAttribute(uvs, 2).copyVector2sArray(geometry.uvs)) + } + + if (geometry.uvs2.length > 0) { + var uvs2 = new Float32Array(geometry.uvs2.length * 2) + this.addAttribute('uv2', new BufferAttribute(uvs2, 2).copyVector2sArray(geometry.uvs2)) + } + + if (geometry.indices.length > 0) { + var TypeArray = arrayMax(geometry.indices) > 65535 ? Uint32Array : Uint16Array + var indices = new TypeArray(geometry.indices.length * 3) + this.setIndex(new BufferAttribute(indices, 1).copyIndicesArray(geometry.indices)) + } + + // groups + + this.groups = geometry.groups + + // morphs + + for (var name in geometry.morphTargets) { + var array = [] + var morphTargets = geometry.morphTargets[name] + + for (var i = 0, l = morphTargets.length; i < l; i++) { + var morphTarget = morphTargets[i] + + var attribute = new Float32BufferAttribute(morphTarget.length * 3, 3) + + array.push(attribute.copyVector3sArray(morphTarget)) + } + + this.morphAttributes[name] = array + } + + // skinning + + if (geometry.skinIndices.length > 0) { + var skinIndices = new Float32BufferAttribute(geometry.skinIndices.length * 4, 4) + this.addAttribute('skinIndex', skinIndices.copyVector4sArray(geometry.skinIndices)) + } + + if (geometry.skinWeights.length > 0) { + var skinWeights = new Float32BufferAttribute(geometry.skinWeights.length * 4, 4) + this.addAttribute('skinWeight', skinWeights.copyVector4sArray(geometry.skinWeights)) + } + + // + + if (geometry.boundingSphere !== null) { + this.boundingSphere = geometry.boundingSphere.clone() + } + + if (geometry.boundingBox !== null) { + this.boundingBox = geometry.boundingBox.clone() + } + + return this + }, + + computeBoundingBox: function () { + if (this.boundingBox === null) { + this.boundingBox = new Box3() + } + + var position = this.attributes.position + + if (position !== undefined) { + this.boundingBox.setFromBufferAttribute(position) + } else { + this.boundingBox.makeEmpty() + } + + if ( + 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.', + this + ) + } + }, + + computeBoundingSphere: (function () { + var box = new Box3() + var vector = new Vector3() + + return function computeBoundingSphere() { + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere() + } + + var position = this.attributes.position + + if (position) { + var center = this.boundingSphere.center + + box.setFromBufferAttribute(position) + box.getCenter(center) + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0 + + for (var i = 0, il = position.count; i < il; i++) { + vector.x = position.getX(i) + vector.y = position.getY(i) + vector.z = position.getZ(i) + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector)) + } + + this.boundingSphere.radius = Math.sqrt(maxRadiusSq) + + if (isNaN(this.boundingSphere.radius)) { + console.error( + 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', + this + ) + } + } + } + })(), + + computeFaceNormals: function () { + // backwards compatibility + }, + + computeVertexNormals: function () { + var index = this.index + var attributes = this.attributes + var groups = this.groups + + if (attributes.position) { + var positions = attributes.position.array + + if (attributes.normal === undefined) { + this.addAttribute('normal', new BufferAttribute(new Float32Array(positions.length), 3)) + } else { + // reset existing normals to zero + + var array = attributes.normal.array + + for (var i = 0, il = array.length; i < il; i++) { + array[i] = 0 + } + } + + var normals = attributes.normal.array + + var vA, vB, vC + var pA = new Vector3(), + pB = new Vector3(), + pC = new Vector3() + var cb = new Vector3(), + ab = new Vector3() + + // indexed elements + + if (index) { + var indices = index.array + + if (groups.length === 0) { + this.addGroup(0, indices.length) + } + + for (var j = 0, jl = groups.length; j < jl; ++j) { + var group = groups[j] + + var start = group.start + var count = group.count + + for (var i = start, il = start + count; i < il; i += 3) { + vA = indices[i + 0] * 3 + vB = indices[i + 1] * 3 + vC = indices[i + 2] * 3 + + pA.fromArray(positions, vA) + pB.fromArray(positions, vB) + pC.fromArray(positions, vC) + + cb.subVectors(pC, pB) + ab.subVectors(pA, pB) + cb.cross(ab) + + normals[vA] += cb.x + normals[vA + 1] += cb.y + normals[vA + 2] += cb.z + + normals[vB] += cb.x + normals[vB + 1] += cb.y + normals[vB + 2] += cb.z + + normals[vC] += cb.x + normals[vC + 1] += cb.y + normals[vC + 2] += cb.z + } + } + } else { + // non-indexed elements (unconnected triangle soup) + + for (var i = 0, il = positions.length; i < il; i += 9) { + pA.fromArray(positions, i) + pB.fromArray(positions, i + 3) + pC.fromArray(positions, i + 6) + + cb.subVectors(pC, pB) + ab.subVectors(pA, pB) + cb.cross(ab) + + normals[i] = cb.x + normals[i + 1] = cb.y + normals[i + 2] = cb.z + + normals[i + 3] = cb.x + normals[i + 4] = cb.y + normals[i + 5] = cb.z + + normals[i + 6] = cb.x + normals[i + 7] = cb.y + normals[i + 8] = cb.z + } + } + + this.normalizeNormals() + + attributes.normal.needsUpdate = true + } + }, + + merge: function (geometry, offset) { + if (!(geometry && geometry.isBufferGeometry)) { + console.error( + 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', + geometry + ) + return + } + + if (offset === undefined) offset = 0 + + var attributes = this.attributes + + for (var key in attributes) { + if (geometry.attributes[key] === undefined) continue + + var attribute1 = attributes[key] + var attributeArray1 = attribute1.array + + var attribute2 = geometry.attributes[key] + var attributeArray2 = attribute2.array + + var attributeSize = attribute2.itemSize + + for (var i = 0, j = attributeSize * offset; i < attributeArray2.length; i++, j++) { + attributeArray1[j] = attributeArray2[i] + } + } + + return this + }, + + normalizeNormals: (function () { + var vector = new Vector3() + + return function normalizeNormals() { + var normals = this.attributes.normal + + for (var i = 0, il = normals.count; i < il; i++) { + vector.x = normals.getX(i) + vector.y = normals.getY(i) + vector.z = normals.getZ(i) + + vector.normalize() + + normals.setXYZ(i, vector.x, vector.y, vector.z) + } + } + })(), + + toNonIndexed: function () { + if (this.index === null) { + console.warn('THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.') + return this + } + + var geometry2 = new BufferGeometry() + + var indices = this.index.array + var attributes = this.attributes + + for (var name in attributes) { + var attribute = attributes[name] + + var array = attribute.array + var itemSize = attribute.itemSize + + var array2 = new array.constructor(indices.length * itemSize) + + var index = 0, + index2 = 0 + + for (var i = 0, l = indices.length; i < l; i++) { + index = indices[i] * itemSize + + for (var j = 0; j < itemSize; j++) { + array2[index2++] = array[index++] + } + } + + geometry2.addAttribute(name, new BufferAttribute(array2, itemSize)) + } + + return geometry2 + }, + + toJSON: function () { + var data = { + metadata: { + version: 4.5, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + } + + // standard BufferGeometry serialization + + data.uuid = this.uuid + data.type = this.type + if (this.name !== '') data.name = this.name + + if (this.parameters !== undefined) { + var parameters = this.parameters + + for (var key in parameters) { + if (parameters[key] !== undefined) data[key] = parameters[key] + } + + return data + } + + data.data = { attributes: {} } + + var index = this.index + + if (index !== null) { + var array = Array.prototype.slice.call(index.array) + + data.data.index = { + type: index.array.constructor.name, + array: array + } + } + + var attributes = this.attributes + + for (var key in attributes) { + var attribute = attributes[key] + + var array = Array.prototype.slice.call(attribute.array) + + data.data.attributes[key] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + } + } + + var groups = this.groups + + if (groups.length > 0) { + data.data.groups = JSON.parse(JSON.stringify(groups)) + } + + var boundingSphere = this.boundingSphere + + if (boundingSphere !== null) { + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + } + } + + return data + }, + + clone: function () { + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy(this) + }, + + copy: function (source) { + var name, i, l + + // reset + + this.index = null + this.attributes = {} + this.morphAttributes = {} + this.groups = [] + this.boundingBox = null + this.boundingSphere = null + + // name + + this.name = source.name + + // index + + var index = source.index + + if (index !== null) { + this.setIndex(index.clone()) + } + + // attributes + + var attributes = source.attributes + + for (name in attributes) { + var attribute = attributes[name] + this.addAttribute(name, attribute.clone()) + } + + // morph attributes + + var morphAttributes = source.morphAttributes + + for (name in morphAttributes) { + var array = [] + var morphAttribute = morphAttributes[name] // morphAttribute: array of Float32BufferAttributes + + for (i = 0, l = morphAttribute.length; i < l; i++) { + array.push(morphAttribute[i].clone()) + } + + this.morphAttributes[name] = array + } + + // groups + + var groups = source.groups + + for (i = 0, l = groups.length; i < l; i++) { + var group = groups[i] + this.addGroup(group.start, group.count, group.materialIndex) + } + + // bounding box + + var boundingBox = source.boundingBox + + if (boundingBox !== null) { + this.boundingBox = boundingBox.clone() + } + + // bounding sphere + + var boundingSphere = source.boundingSphere + + if (boundingSphere !== null) { + this.boundingSphere = boundingSphere.clone() + } + + // draw range + + this.drawRange.start = source.drawRange.start + this.drawRange.count = source.drawRange.count + + return this + }, + + dispose: function () { + this.dispatchEvent({ type: 'dispose' }) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // BoxGeometry + + function BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) { + Geometry.call(this) + + this.type = 'BoxGeometry' + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + } + + this.fromBufferGeometry( + new BoxBufferGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) + ) + this.mergeVertices() + } + + BoxGeometry.prototype = Object.create(Geometry.prototype) + BoxGeometry.prototype.constructor = BoxGeometry + + // BoxBufferGeometry + + function BoxBufferGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) { + BufferGeometry.call(this) + + this.type = 'BoxBufferGeometry' + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + } + + var scope = this + + width = width || 1 + height = height || 1 + depth = depth || 1 + + // segments + + widthSegments = Math.floor(widthSegments) || 1 + heightSegments = Math.floor(heightSegments) || 1 + depthSegments = Math.floor(depthSegments) || 1 + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // helper variables + + var numberOfVertices = 0 + var groupStart = 0 + + // build each side of the box geometry + + buildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0) // px + buildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1) // nx + buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2) // py + buildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3) // ny + buildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4) // pz + buildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5) // nz + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + + function buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) { + var segmentWidth = width / gridX + var segmentHeight = height / gridY + + var widthHalf = width / 2 + var heightHalf = height / 2 + var depthHalf = depth / 2 + + var gridX1 = gridX + 1 + var gridY1 = gridY + 1 + + var vertexCounter = 0 + var groupCount = 0 + + var ix, iy + + var vector = new Vector3() + + // generate vertices, normals and uvs + + for (iy = 0; iy < gridY1; iy++) { + var y = iy * segmentHeight - heightHalf + + for (ix = 0; ix < gridX1; ix++) { + var x = ix * segmentWidth - widthHalf + + // set values to correct vector component + + vector[u] = x * udir + vector[v] = y * vdir + vector[w] = depthHalf + + // now apply vector to vertex buffer + + vertices.push(vector.x, vector.y, vector.z) + + // set values to correct vector component + + vector[u] = 0 + vector[v] = 0 + vector[w] = depth > 0 ? 1 : -1 + + // now apply vector to normal buffer + + normals.push(vector.x, vector.y, vector.z) + + // uvs + + uvs.push(ix / gridX) + uvs.push(1 - iy / gridY) + + // counters + + vertexCounter += 1 + } + } + + // indices + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for (iy = 0; iy < gridY; iy++) { + for (ix = 0; ix < gridX; ix++) { + var a = numberOfVertices + ix + gridX1 * iy + var b = numberOfVertices + ix + gridX1 * (iy + 1) + var c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1) + var d = numberOfVertices + (ix + 1) + gridX1 * iy + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + + // increase counter + + groupCount += 6 + } + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup(groupStart, groupCount, materialIndex) + + // calculate new start value for groups + + groupStart += groupCount + + // update total number of vertices + + numberOfVertices += vertexCounter + } + } + + BoxBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PlaneGeometry + + function PlaneGeometry(width, height, widthSegments, heightSegments) { + Geometry.call(this) + + this.type = 'PlaneGeometry' + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + } + + this.fromBufferGeometry(new PlaneBufferGeometry(width, height, widthSegments, heightSegments)) + this.mergeVertices() + } + + PlaneGeometry.prototype = Object.create(Geometry.prototype) + PlaneGeometry.prototype.constructor = PlaneGeometry + + // PlaneBufferGeometry + + function PlaneBufferGeometry(width, height, widthSegments, heightSegments) { + BufferGeometry.call(this) + + this.type = 'PlaneBufferGeometry' + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + } + + width = width || 1 + height = height || 1 + + var width_half = width / 2 + var height_half = height / 2 + + var gridX = Math.floor(widthSegments) || 1 + var gridY = Math.floor(heightSegments) || 1 + + var gridX1 = gridX + 1 + var gridY1 = gridY + 1 + + var segment_width = width / gridX + var segment_height = height / gridY + + var ix, iy + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // generate vertices, normals and uvs + + for (iy = 0; iy < gridY1; iy++) { + var y = iy * segment_height - height_half + + for (ix = 0; ix < gridX1; ix++) { + var x = ix * segment_width - width_half + + vertices.push(x, -y, 0) + + normals.push(0, 0, 1) + + uvs.push(ix / gridX) + uvs.push(1 - iy / gridY) + } + } + + // indices + + for (iy = 0; iy < gridY; iy++) { + for (ix = 0; ix < gridX; ix++) { + var a = ix + gridX1 * iy + var b = ix + gridX1 * (iy + 1) + var c = ix + 1 + gridX1 * (iy + 1) + var d = ix + 1 + gridX1 * iy + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + } + + PlaneBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * depthTest: <bool>, + * depthWrite: <bool>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool> + * } + */ + + function MeshBasicMaterial(parameters) { + Material.call(this) + + this.type = 'MeshBasicMaterial' + + this.color = new Color(0xffffff) // emissive + + this.map = null + + this.lightMap = null + this.lightMapIntensity = 1.0 + + this.aoMap = null + this.aoMapIntensity = 1.0 + + this.specularMap = null + + this.alphaMap = null + + this.envMap = null + this.combine = MultiplyOperation + this.reflectivity = 1 + this.refractionRatio = 0.98 + + this.wireframe = false + this.wireframeLinewidth = 1 + this.wireframeLinecap = 'round' + this.wireframeLinejoin = 'round' + + this.skinning = false + this.morphTargets = false + + this.lights = false + + this.setValues(parameters) + } + + MeshBasicMaterial.prototype = Object.create(Material.prototype) + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true + + MeshBasicMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.color.copy(source.color) + + this.map = source.map + + this.lightMap = source.lightMap + this.lightMapIntensity = source.lightMapIntensity + + this.aoMap = source.aoMap + this.aoMapIntensity = source.aoMapIntensity + + this.specularMap = source.specularMap + + this.alphaMap = source.alphaMap + + this.envMap = source.envMap + this.combine = source.combine + this.reflectivity = source.reflectivity + this.refractionRatio = source.refractionRatio + + this.wireframe = source.wireframe + this.wireframeLinewidth = source.wireframeLinewidth + this.wireframeLinecap = source.wireframeLinecap + this.wireframeLinejoin = source.wireframeLinejoin + + this.skinning = source.skinning + this.morphTargets = source.morphTargets + + return this + } + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: <string>, + * vertexShader: <string>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * lights: <bool>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function ShaderMaterial(parameters) { + Material.call(this) + + this.type = 'ShaderMaterial' + + this.defines = {} + this.uniforms = {} + + 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.linewidth = 1 + + this.wireframe = false + this.wireframeLinewidth = 1 + + this.fog = false // set to use scene fog + this.lights = false // set to use scene lights + this.clipping = false // set to use user-defined clipping planes + + this.skinning = false // set to use skinning attribute streams + this.morphTargets = false // set to use morph targets + this.morphNormals = false // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + } + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + color: [1, 1, 1], + uv: [0, 0], + uv2: [0, 0] + } + + this.index0AttributeName = undefined + this.uniformsNeedUpdate = false + + if (parameters !== undefined) { + if (parameters.attributes !== undefined) { + console.error( + 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' + ) + } + + this.setValues(parameters) + } + } + + ShaderMaterial.prototype = Object.create(Material.prototype) + ShaderMaterial.prototype.constructor = ShaderMaterial + + ShaderMaterial.prototype.isShaderMaterial = true + + ShaderMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.fragmentShader = source.fragmentShader + this.vertexShader = source.vertexShader + + this.uniforms = UniformsUtils.clone(source.uniforms) + + this.defines = source.defines + + this.wireframe = source.wireframe + this.wireframeLinewidth = source.wireframeLinewidth + + this.lights = source.lights + this.clipping = source.clipping + + this.skinning = source.skinning + + this.morphTargets = source.morphTargets + this.morphNormals = source.morphNormals + + this.extensions = source.extensions + + return this + } + + ShaderMaterial.prototype.toJSON = function (meta) { + var data = Material.prototype.toJSON.call(this, meta) + + data.uniforms = this.uniforms + data.vertexShader = this.vertexShader + data.fragmentShader = this.fragmentShader + + return data + } + + /** + * @author bhouston / http://clara.io + */ + + function Ray(origin, direction) { + this.origin = origin !== undefined ? origin : new Vector3() + this.direction = direction !== undefined ? direction : new Vector3() + } + + Object.assign(Ray.prototype, { + set: function (origin, direction) { + this.origin.copy(origin) + this.direction.copy(direction) + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (ray) { + this.origin.copy(ray.origin) + this.direction.copy(ray.direction) + + return this + }, + + at: function (t, optionalTarget) { + var result = optionalTarget || new Vector3() + + return result.copy(this.direction).multiplyScalar(t).add(this.origin) + }, + + lookAt: function (v) { + this.direction.copy(v).sub(this.origin).normalize() + + return this + }, + + recast: (function () { + var v1 = new Vector3() + + return function recast(t) { + this.origin.copy(this.at(t, v1)) + + return this + } + })(), + + closestPointToPoint: function (point, optionalTarget) { + var result = optionalTarget || new Vector3() + result.subVectors(point, this.origin) + var directionDistance = result.dot(this.direction) + + if (directionDistance < 0) { + return result.copy(this.origin) + } + + return result.copy(this.direction).multiplyScalar(directionDistance).add(this.origin) + }, + + distanceToPoint: function (point) { + return Math.sqrt(this.distanceSqToPoint(point)) + }, + + distanceSqToPoint: (function () { + var v1 = new Vector3() + + return function distanceSqToPoint(point) { + var directionDistance = v1.subVectors(point, this.origin).dot(this.direction) + + // point behind the ray + + if (directionDistance < 0) { + return this.origin.distanceToSquared(point) + } + + v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin) + + return v1.distanceToSquared(point) + } + })(), + + distanceSqToSegment: (function () { + var segCenter = new Vector3() + var segDir = new Vector3() + var diff = new Vector3() + + return function distanceSqToSegment(v0, v1, optionalPointOnRay, optionalPointOnSegment) { + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy(v0).add(v1).multiplyScalar(0.5) + segDir.copy(v1).sub(v0).normalize() + diff.copy(this.origin).sub(segCenter) + + var segExtent = v0.distanceTo(v1) * 0.5 + var a01 = -this.direction.dot(segDir) + var b0 = diff.dot(this.direction) + var b1 = -diff.dot(segDir) + var c = diff.lengthSq() + var det = Math.abs(1 - a01 * a01) + var s0, s1, sqrDist, extDet + + if (det > 0) { + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0 + s1 = a01 * b0 - b1 + extDet = segExtent * det + + if (s0 >= 0) { + if (s1 >= -extDet) { + if (s1 <= extDet) { + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det + s0 *= invDet + s1 *= invDet + sqrDist = s0 * (s0 + a01 * s1 + 2 * b0) + s1 * (a01 * s0 + s1 + 2 * b1) + c + } else { + // region 1 + + s1 = segExtent + s0 = Math.max(0, -(a01 * s1 + b0)) + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c + } + } else { + // region 5 + + s1 = -segExtent + s0 = Math.max(0, -(a01 * s1 + b0)) + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c + } + } else { + if (s1 <= -extDet) { + // region 4 + + s0 = Math.max(0, -(-a01 * segExtent + b0)) + s1 = s0 > 0 ? -segExtent : Math.min(Math.max(-segExtent, -b1), segExtent) + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c + } else if (s1 <= extDet) { + // region 3 + + s0 = 0 + s1 = Math.min(Math.max(-segExtent, -b1), segExtent) + sqrDist = s1 * (s1 + 2 * b1) + c + } else { + // region 2 + + s0 = Math.max(0, -(a01 * segExtent + b0)) + s1 = s0 > 0 ? segExtent : Math.min(Math.max(-segExtent, -b1), segExtent) + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c + } + } + } else { + // Ray and segment are parallel. + + s1 = a01 > 0 ? -segExtent : segExtent + s0 = Math.max(0, -(a01 * s1 + b0)) + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c + } + + if (optionalPointOnRay) { + optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin) + } + + if (optionalPointOnSegment) { + optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter) + } + + return sqrDist + } + })(), + + intersectSphere: (function () { + var v1 = new Vector3() + + return function intersectSphere(sphere, optionalTarget) { + v1.subVectors(sphere.center, this.origin) + var tca = v1.dot(this.direction) + var d2 = v1.dot(v1) - tca * tca + var radius2 = sphere.radius * sphere.radius + + if (d2 > radius2) return null + + var thc = Math.sqrt(radius2 - d2) + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc + + // test to see if both t0 and t1 are behind the ray - if so, return null + if (t0 < 0 && t1 < 0) return null + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if (t0 < 0) return this.at(t1, optionalTarget) + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at(t0, optionalTarget) + } + })(), + + intersectsSphere: function (sphere) { + return this.distanceToPoint(sphere.center) <= sphere.radius + }, + + distanceToPlane: function (plane) { + var denominator = plane.normal.dot(this.direction) + + if (denominator === 0) { + // line is coplanar, return origin + if (plane.distanceToPoint(this.origin) === 0) { + return 0 + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null + } + + var t = -(this.origin.dot(plane.normal) + plane.constant) / denominator + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null + }, + + intersectPlane: function (plane, optionalTarget) { + var t = this.distanceToPlane(plane) + + if (t === null) { + return null + } + + return this.at(t, optionalTarget) + }, + + intersectsPlane: function (plane) { + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint(this.origin) + + if (distToPoint === 0) { + return true + } + + var denominator = plane.normal.dot(this.direction) + + if (denominator * distToPoint < 0) { + return true + } + + // ray origin is behind the plane (and is pointing behind it) + + return false + }, + + intersectBox: function (box, optionalTarget) { + var tmin, tmax, tymin, tymax, tzmin, tzmax + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z + + var origin = this.origin + + if (invdirx >= 0) { + tmin = (box.min.x - origin.x) * invdirx + tmax = (box.max.x - origin.x) * invdirx + } else { + tmin = (box.max.x - origin.x) * invdirx + tmax = (box.min.x - origin.x) * invdirx + } + + if (invdiry >= 0) { + tymin = (box.min.y - origin.y) * invdiry + tymax = (box.max.y - origin.y) * invdiry + } else { + tymin = (box.max.y - origin.y) * invdiry + tymax = (box.min.y - origin.y) * invdiry + } + + if (tmin > tymax || tymin > tmax) return null + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if (tymin > tmin || tmin !== tmin) tmin = tymin + + if (tymax < tmax || tmax !== tmax) tmax = tymax + + if (invdirz >= 0) { + tzmin = (box.min.z - origin.z) * invdirz + tzmax = (box.max.z - origin.z) * invdirz + } else { + tzmin = (box.max.z - origin.z) * invdirz + tzmax = (box.min.z - origin.z) * invdirz + } + + if (tmin > tzmax || tzmin > tmax) return null + + if (tzmin > tmin || tmin !== tmin) tmin = tzmin + + if (tzmax < tmax || tmax !== tmax) tmax = tzmax + + //return point closest to the ray (positive side) + + if (tmax < 0) return null + + return this.at(tmin >= 0 ? tmin : tmax, optionalTarget) + }, + + intersectsBox: (function () { + var v = new Vector3() + + return function intersectsBox(box) { + return this.intersectBox(box, v) !== null + } + })(), + + intersectTriangle: (function () { + // Compute the offset origin, edges, and normal. + var diff = new Vector3() + var edge1 = new Vector3() + var edge2 = new Vector3() + var normal = new Vector3() + + return function intersectTriangle(a, b, c, backfaceCulling, optionalTarget) { + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors(b, a) + edge2.subVectors(c, a) + normal.crossVectors(edge1, edge2) + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot(normal) + var sign + + if (DdN > 0) { + if (backfaceCulling) return null + sign = 1 + } else if (DdN < 0) { + sign = -1 + DdN = -DdN + } else { + return null + } + + diff.subVectors(this.origin, a) + var DdQxE2 = sign * this.direction.dot(edge2.crossVectors(diff, edge2)) + + // b1 < 0, no intersection + if (DdQxE2 < 0) { + return null + } + + var DdE1xQ = sign * this.direction.dot(edge1.cross(diff)) + + // b2 < 0, no intersection + if (DdE1xQ < 0) { + return null + } + + // b1+b2 > 1, no intersection + if (DdQxE2 + DdE1xQ > DdN) { + return null + } + + // Line intersects triangle, check if ray does. + var QdN = -sign * diff.dot(normal) + + // t < 0, no intersection + if (QdN < 0) { + return null + } + + // Ray intersects triangle. + return this.at(QdN / DdN, optionalTarget) + } + })(), + + applyMatrix4: function (matrix4) { + this.origin.applyMatrix4(matrix4) + this.direction.transformDirection(matrix4) + + return this + }, + + equals: function (ray) { + return ray.origin.equals(this.origin) && ray.direction.equals(this.direction) + } + }) + + /** + * @author bhouston / http://clara.io + */ + + function Line3(start, end) { + this.start = start !== undefined ? start : new Vector3() + this.end = end !== undefined ? end : new Vector3() + } + + Object.assign(Line3.prototype, { + set: function (start, end) { + this.start.copy(start) + this.end.copy(end) + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (line) { + this.start.copy(line.start) + this.end.copy(line.end) + + return this + }, + + getCenter: function (optionalTarget) { + var result = optionalTarget || new Vector3() + return result.addVectors(this.start, this.end).multiplyScalar(0.5) + }, + + delta: function (optionalTarget) { + var result = optionalTarget || new Vector3() + return result.subVectors(this.end, this.start) + }, + + distanceSq: function () { + return this.start.distanceToSquared(this.end) + }, + + distance: function () { + return this.start.distanceTo(this.end) + }, + + at: function (t, optionalTarget) { + var result = optionalTarget || new Vector3() + + return this.delta(result).multiplyScalar(t).add(this.start) + }, + + closestPointToPointParameter: (function () { + var startP = new Vector3() + var startEnd = new Vector3() + + return function closestPointToPointParameter(point, clampToLine) { + startP.subVectors(point, this.start) + startEnd.subVectors(this.end, this.start) + + var startEnd2 = startEnd.dot(startEnd) + var startEnd_startP = startEnd.dot(startP) + + var t = startEnd_startP / startEnd2 + + if (clampToLine) { + t = _Math.clamp(t, 0, 1) + } + + return t + } + })(), + + closestPointToPoint: function (point, clampToLine, optionalTarget) { + var t = this.closestPointToPointParameter(point, clampToLine) + + var result = optionalTarget || new Vector3() + + return this.delta(result).multiplyScalar(t).add(this.start) + }, + + applyMatrix4: function (matrix) { + this.start.applyMatrix4(matrix) + this.end.applyMatrix4(matrix) + + return this + }, + + equals: function (line) { + return line.start.equals(this.start) && line.end.equals(this.end) + } + }) + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle(a, b, c) { + this.a = a !== undefined ? a : new Vector3() + this.b = b !== undefined ? b : new Vector3() + this.c = c !== undefined ? c : new Vector3() + } + + Object.assign(Triangle, { + normal: (function () { + var v0 = new Vector3() + + return function normal(a, b, c, optionalTarget) { + var result = optionalTarget || new Vector3() + + result.subVectors(c, b) + v0.subVectors(a, b) + result.cross(v0) + + var resultLengthSq = result.lengthSq() + if (resultLengthSq > 0) { + return result.multiplyScalar(1 / Math.sqrt(resultLengthSq)) + } + + return result.set(0, 0, 0) + } + })(), + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + barycoordFromPoint: (function () { + var v0 = new Vector3() + var v1 = new Vector3() + var v2 = new Vector3() + + return function barycoordFromPoint(point, a, b, c, optionalTarget) { + v0.subVectors(c, a) + v1.subVectors(b, a) + v2.subVectors(point, a) + + var dot00 = v0.dot(v0) + var dot01 = v0.dot(v1) + var dot02 = v0.dot(v2) + var dot11 = v1.dot(v1) + var dot12 = v1.dot(v2) + + var denom = dot00 * dot11 - dot01 * dot01 + + var result = optionalTarget || new Vector3() + + // collinear or singular triangle + if (denom === 0) { + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set(-2, -1, -1) + } + + var invDenom = 1 / denom + var u = (dot11 * dot02 - dot01 * dot12) * invDenom + var v = (dot00 * dot12 - dot01 * dot02) * invDenom + + // barycentric coordinates must always sum to 1 + return result.set(1 - u - v, v, u) + } + })(), + + containsPoint: (function () { + var v1 = new Vector3() + + return function containsPoint(point, a, b, c) { + var result = Triangle.barycoordFromPoint(point, a, b, c, v1) + + return result.x >= 0 && result.y >= 0 && result.x + result.y <= 1 + } + })() + }) + + Object.assign(Triangle.prototype, { + set: function (a, b, c) { + this.a.copy(a) + this.b.copy(b) + this.c.copy(c) + + return this + }, + + setFromPointsAndIndices: function (points, i0, i1, i2) { + this.a.copy(points[i0]) + this.b.copy(points[i1]) + this.c.copy(points[i2]) + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (triangle) { + this.a.copy(triangle.a) + this.b.copy(triangle.b) + this.c.copy(triangle.c) + + return this + }, + + area: (function () { + var v0 = new Vector3() + var v1 = new Vector3() + + return function area() { + v0.subVectors(this.c, this.b) + v1.subVectors(this.a, this.b) + + return v0.cross(v1).length() * 0.5 + } + })(), + + midpoint: function (optionalTarget) { + var result = optionalTarget || new Vector3() + return result + .addVectors(this.a, this.b) + .add(this.c) + .multiplyScalar(1 / 3) + }, + + normal: function (optionalTarget) { + return Triangle.normal(this.a, this.b, this.c, optionalTarget) + }, + + plane: function (optionalTarget) { + var result = optionalTarget || new Plane() + + return result.setFromCoplanarPoints(this.a, this.b, this.c) + }, + + barycoordFromPoint: function (point, optionalTarget) { + return Triangle.barycoordFromPoint(point, this.a, this.b, this.c, optionalTarget) + }, + + containsPoint: function (point) { + return Triangle.containsPoint(point, this.a, this.b, this.c) + }, + + intersectsBox: function (box) { + return box.intersectsTriangle(this) + }, + + closestPointToPoint: (function () { + var plane = new Plane() + var edgeList = [new Line3(), new Line3(), new Line3()] + var projectedPoint = new Vector3() + var closestPoint = new Vector3() + + return function closestPointToPoint(point, optionalTarget) { + var result = optionalTarget || new Vector3() + var minDistance = Infinity + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints(this.a, this.b, this.c) + plane.projectPoint(point, projectedPoint) + + // check if the projection lies within the triangle + + if (this.containsPoint(projectedPoint) === true) { + // if so, this is the closest point + + result.copy(projectedPoint) + } else { + // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices + + edgeList[0].set(this.a, this.b) + edgeList[1].set(this.b, this.c) + edgeList[2].set(this.c, this.a) + + for (var i = 0; i < edgeList.length; i++) { + edgeList[i].closestPointToPoint(projectedPoint, true, closestPoint) + + var distance = projectedPoint.distanceToSquared(closestPoint) + + if (distance < minDistance) { + minDistance = distance + + result.copy(closestPoint) + } + } + } + + return result + } + })(), + + equals: function (triangle) { + return triangle.a.equals(this.a) && triangle.b.equals(this.b) && triangle.c.equals(this.c) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh(geometry, material) { + Object3D.call(this) + + this.type = 'Mesh' + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry() + this.material = + material !== undefined ? material : new MeshBasicMaterial({ color: Math.random() * 0xffffff }) + + this.drawMode = TrianglesDrawMode + + this.updateMorphTargets() + } + + Mesh.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Mesh, + + isMesh: true, + + setDrawMode: function (value) { + this.drawMode = value + }, + + copy: function (source) { + Object3D.prototype.copy.call(this, source) + + this.drawMode = source.drawMode + + if (source.morphTargetInfluences !== undefined) { + this.morphTargetInfluences = source.morphTargetInfluences.slice() + } + + if (source.morphTargetDictionary !== undefined) { + this.morphTargetDictionary = Object.assign({}, source.morphTargetDictionary) + } + + return this + }, + + updateMorphTargets: function () { + var geometry = this.geometry + var m, ml, name + + if (geometry.isBufferGeometry) { + var morphAttributes = geometry.morphAttributes + var keys = Object.keys(morphAttributes) + + if (keys.length > 0) { + var morphAttribute = morphAttributes[keys[0]] + + if (morphAttribute !== undefined) { + this.morphTargetInfluences = [] + this.morphTargetDictionary = {} + + for (m = 0, ml = morphAttribute.length; m < ml; m++) { + name = morphAttribute[m].name || String(m) + + this.morphTargetInfluences.push(0) + this.morphTargetDictionary[name] = m + } + } + } + } else { + var morphTargets = geometry.morphTargets + + if (morphTargets !== undefined && morphTargets.length > 0) { + this.morphTargetInfluences = [] + this.morphTargetDictionary = {} + + for (m = 0, ml = morphTargets.length; m < ml; m++) { + name = morphTargets[m].name || String(m) + + this.morphTargetInfluences.push(0) + this.morphTargetDictionary[name] = m + } + } + } + }, + + raycast: (function () { + var inverseMatrix = new Matrix4() + var ray = new Ray() + var sphere = new Sphere() + + var vA = new Vector3() + var vB = new Vector3() + var vC = new Vector3() + + var tempA = new Vector3() + var tempB = new Vector3() + var tempC = new Vector3() + + var uvA = new Vector2() + var uvB = new Vector2() + var uvC = new Vector2() + + var barycoord = new Vector3() + + var intersectionPoint = new Vector3() + var intersectionPointWorld = new Vector3() + + function uvIntersection(point, p1, p2, p3, uv1, uv2, uv3) { + Triangle.barycoordFromPoint(point, p1, p2, p3, barycoord) + + uv1.multiplyScalar(barycoord.x) + uv2.multiplyScalar(barycoord.y) + uv3.multiplyScalar(barycoord.z) + + uv1.add(uv2).add(uv3) + + return uv1.clone() + } + + function checkIntersection(object, material, raycaster, ray, pA, pB, pC, point) { + var intersect + + if (material.side === BackSide) { + intersect = ray.intersectTriangle(pC, pB, pA, true, point) + } else { + intersect = ray.intersectTriangle(pA, pB, pC, material.side !== DoubleSide, point) + } + + if (intersect === null) return null + + intersectionPointWorld.copy(point) + intersectionPointWorld.applyMatrix4(object.matrixWorld) + + var distance = raycaster.ray.origin.distanceTo(intersectionPointWorld) + + if (distance < raycaster.near || distance > raycaster.far) return null + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + } + } + + function checkBufferGeometryIntersection(object, raycaster, ray, position, uv, a, b, c) { + vA.fromBufferAttribute(position, a) + vB.fromBufferAttribute(position, b) + vC.fromBufferAttribute(position, c) + + var intersection = checkIntersection( + object, + object.material, + raycaster, + ray, + vA, + vB, + vC, + intersectionPoint + ) + + if (intersection) { + if (uv) { + uvA.fromBufferAttribute(uv, a) + uvB.fromBufferAttribute(uv, b) + uvC.fromBufferAttribute(uv, c) + + intersection.uv = uvIntersection(intersectionPoint, vA, vB, vC, uvA, uvB, uvC) + } + + intersection.face = new Face3(a, b, c, Triangle.normal(vA, vB, vC)) + intersection.faceIndex = a + } + + return intersection + } + + return function raycast(raycaster, intersects) { + var geometry = this.geometry + var material = this.material + var matrixWorld = this.matrixWorld + + if (material === undefined) return + + // Checking boundingSphere distance to ray + + if (geometry.boundingSphere === null) geometry.computeBoundingSphere() + + sphere.copy(geometry.boundingSphere) + sphere.applyMatrix4(matrixWorld) + + if (raycaster.ray.intersectsSphere(sphere) === false) return + + // + + inverseMatrix.getInverse(matrixWorld) + ray.copy(raycaster.ray).applyMatrix4(inverseMatrix) + + // Check boundingBox before continuing + + if (geometry.boundingBox !== null) { + if (ray.intersectsBox(geometry.boundingBox) === false) return + } + + var intersection + + if (geometry.isBufferGeometry) { + var a, b, c + var index = geometry.index + var position = geometry.attributes.position + var uv = geometry.attributes.uv + var i, l + + if (index !== null) { + // indexed buffer geometry + + for (i = 0, l = index.count; i < l; i += 3) { + a = index.getX(i) + b = index.getX(i + 1) + c = index.getX(i + 2) + + intersection = checkBufferGeometryIntersection( + this, + raycaster, + ray, + position, + uv, + a, + b, + c + ) + + if (intersection) { + intersection.faceIndex = Math.floor(i / 3) // triangle number in indices buffer semantics + intersects.push(intersection) + } + } + } else if (position !== undefined) { + // non-indexed buffer geometry + + for (i = 0, l = position.count; i < l; i += 3) { + a = i + b = i + 1 + c = i + 2 + + intersection = checkBufferGeometryIntersection( + this, + raycaster, + ray, + position, + uv, + a, + b, + c + ) + + if (intersection) { + intersection.index = a // triangle number in positions buffer semantics + intersects.push(intersection) + } + } + } + } else if (geometry.isGeometry) { + var fvA, fvB, fvC + var isMultiMaterial = Array.isArray(material) + + var vertices = geometry.vertices + var faces = geometry.faces + var uvs + + var faceVertexUvs = geometry.faceVertexUvs[0] + if (faceVertexUvs.length > 0) uvs = faceVertexUvs + + for (var f = 0, fl = faces.length; f < fl; f++) { + var face = faces[f] + var faceMaterial = isMultiMaterial ? material[face.materialIndex] : material + + if (faceMaterial === undefined) continue + + fvA = vertices[face.a] + fvB = vertices[face.b] + fvC = vertices[face.c] + + if (faceMaterial.morphTargets === true) { + var morphTargets = geometry.morphTargets + var morphInfluences = this.morphTargetInfluences + + vA.set(0, 0, 0) + vB.set(0, 0, 0) + vC.set(0, 0, 0) + + for (var t = 0, tl = morphTargets.length; t < tl; t++) { + var influence = morphInfluences[t] + + if (influence === 0) continue + + var targets = morphTargets[t].vertices + + vA.addScaledVector(tempA.subVectors(targets[face.a], fvA), influence) + vB.addScaledVector(tempB.subVectors(targets[face.b], fvB), influence) + vC.addScaledVector(tempC.subVectors(targets[face.c], fvC), influence) + } + + vA.add(fvA) + vB.add(fvB) + vC.add(fvC) + + fvA = vA + fvB = vB + fvC = vC + } + + intersection = checkIntersection( + this, + faceMaterial, + raycaster, + ray, + fvA, + fvB, + fvC, + intersectionPoint + ) + + if (intersection) { + if (uvs && uvs[f]) { + var uvs_f = uvs[f] + uvA.copy(uvs_f[0]) + uvB.copy(uvs_f[1]) + uvC.copy(uvs_f[2]) + + intersection.uv = uvIntersection(intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC) + } + + intersection.face = face + intersection.faceIndex = f + intersects.push(intersection) + } + } + } + } + })(), + + clone: function () { + return new this.constructor(this.geometry, this.material).copy(this) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBackground(renderer, state, geometries, premultipliedAlpha) { + var clearColor = new Color(0x000000) + var clearAlpha = 0 + + var planeCamera, planeMesh + var boxMesh + + function render(renderList, scene, camera, forceClear) { + var background = scene.background + + if (background === null) { + setClear(clearColor, clearAlpha) + } else if (background && background.isColor) { + setClear(background, 1) + forceClear = true + } + + if (renderer.autoClear || forceClear) { + renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil) + } + + if (background && background.isCubeTexture) { + if (boxMesh === undefined) { + boxMesh = new Mesh( + new BoxBufferGeometry(1, 1, 1), + new ShaderMaterial({ + uniforms: ShaderLib.cube.uniforms, + vertexShader: ShaderLib.cube.vertexShader, + fragmentShader: ShaderLib.cube.fragmentShader, + side: BackSide, + depthTest: true, + depthWrite: false, + fog: false + }) + ) + + boxMesh.geometry.removeAttribute('normal') + boxMesh.geometry.removeAttribute('uv') + + boxMesh.onBeforeRender = function (renderer, scene, camera) { + this.matrixWorld.copyPosition(camera.matrixWorld) + } + + geometries.update(boxMesh.geometry) + } + + boxMesh.material.uniforms.tCube.value = background + + renderList.push(boxMesh, boxMesh.geometry, boxMesh.material, 0, null) + } else if (background && background.isTexture) { + if (planeCamera === undefined) { + planeCamera = new OrthographicCamera(-1, 1, 1, -1, 0, 1) + + planeMesh = new Mesh( + new PlaneBufferGeometry(2, 2), + new MeshBasicMaterial({ depthTest: false, depthWrite: false, fog: false }) + ) + + geometries.update(planeMesh.geometry) + } + + planeMesh.material.map = background + + // TODO Push this to renderList + + renderer.renderBufferDirect( + planeCamera, + null, + planeMesh.geometry, + planeMesh.material, + planeMesh, + null + ) + } + } + + function setClear(color, alpha) { + state.buffers.color.setClear(color.r, color.g, color.b, alpha, premultipliedAlpha) + } + + return { + getClearColor: function () { + return clearColor + }, + setClearColor: function (color, alpha) { + clearColor.set(color) + clearAlpha = alpha !== undefined ? alpha : 1 + setClear(clearColor, clearAlpha) + }, + getClearAlpha: function () { + return clearAlpha + }, + setClearAlpha: function (alpha) { + clearAlpha = alpha + setClear(clearColor, clearAlpha) + }, + render: render + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function painterSortStable(a, b) { + if (a.renderOrder !== b.renderOrder) { + return a.renderOrder - b.renderOrder + } else if (a.program && b.program && a.program !== b.program) { + return a.program.id - b.program.id + } else if (a.material.id !== b.material.id) { + return a.material.id - b.material.id + } else if (a.z !== b.z) { + return a.z - b.z + } else { + return a.id - b.id + } + } + + function reversePainterSortStable(a, b) { + if (a.renderOrder !== b.renderOrder) { + return a.renderOrder - b.renderOrder + } + if (a.z !== b.z) { + return b.z - a.z + } else { + return a.id - b.id + } + } + + function WebGLRenderList() { + var renderItems = [] + var renderItemsIndex = 0 + + var opaque = [] + var transparent = [] + + function init() { + renderItemsIndex = 0 + + opaque.length = 0 + transparent.length = 0 + } + + function push(object, geometry, material, z, group) { + var renderItem = renderItems[renderItemsIndex] + + if (renderItem === undefined) { + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + program: material.program, + renderOrder: object.renderOrder, + z: z, + group: group + } + + renderItems[renderItemsIndex] = renderItem + } else { + renderItem.id = object.id + renderItem.object = object + renderItem.geometry = geometry + renderItem.material = material + renderItem.program = material.program + renderItem.renderOrder = object.renderOrder + renderItem.z = z + renderItem.group = group + } + + ;(material.transparent === true ? transparent : opaque).push(renderItem) + + renderItemsIndex++ + } + + function sort() { + if (opaque.length > 1) opaque.sort(painterSortStable) + if (transparent.length > 1) transparent.sort(reversePainterSortStable) + } + + return { + opaque: opaque, + transparent: transparent, + + init: init, + push: push, + + sort: sort + } + } + + function WebGLRenderLists() { + var lists = {} + + function get(scene, camera) { + var hash = scene.id + ',' + camera.id + var list = lists[hash] + + if (list === undefined) { + // console.log( 'THREE.WebGLRenderLists:', hash ); + + list = new WebGLRenderList() + lists[hash] = list + } + + return list + } + + function dispose() { + lists = {} + } + + return { + get: get, + dispose: dispose + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function absNumericalSort(a, b) { + return Math.abs(b[1]) - Math.abs(a[1]) + } + + function WebGLMorphtargets(gl) { + var influencesList = {} + var morphInfluences = new Float32Array(8) + + function update(object, geometry, material, program) { + var objectInfluences = object.morphTargetInfluences + + var length = objectInfluences.length + + var influences = influencesList[geometry.id] + + if (influences === undefined) { + // initialise list + + influences = [] + + for (var i = 0; i < length; i++) { + influences[i] = [i, 0] + } + + influencesList[geometry.id] = influences + } + + var morphTargets = material.morphTargets && geometry.morphAttributes.position + var morphNormals = material.morphNormals && geometry.morphAttributes.normal + + // Remove current morphAttributes + + for (var i = 0; i < length; i++) { + var influence = influences[i] + + if (influence[1] !== 0) { + if (morphTargets) geometry.removeAttribute('morphTarget' + i) + if (morphNormals) geometry.removeAttribute('morphNormal' + i) + } + } + + // Collect influences + + for (var i = 0; i < length; i++) { + var influence = influences[i] + + influence[0] = i + influence[1] = objectInfluences[i] + } + + influences.sort(absNumericalSort) + + // Add morphAttributes + + for (var i = 0; i < 8; i++) { + var influence = influences[i] + + if (influence) { + var index = influence[0] + var value = influence[1] + + if (value) { + if (morphTargets) geometry.addAttribute('morphTarget' + i, morphTargets[index]) + if (morphNormals) geometry.addAttribute('morphNormal' + i, morphNormals[index]) + + morphInfluences[i] = value + continue + } + } + + morphInfluences[i] = 0 + } + + program.getUniforms().setValue(gl, 'morphTargetInfluences', morphInfluences) + } + + return { + update: update + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer(gl, extensions, infoRender) { + var mode + + function setMode(value) { + mode = value + } + + var type, bytesPerElement + + function setIndex(value) { + type = value.type + bytesPerElement = value.bytesPerElement + } + + function render(start, count) { + gl.drawElements(mode, count, type, start * bytesPerElement) + + infoRender.calls++ + infoRender.vertices += count + + if (mode === gl.TRIANGLES) infoRender.faces += count / 3 + else if (mode === gl.POINTS) infoRender.points += count + } + + function renderInstances(geometry, start, count) { + var extension = extensions.get('ANGLE_instanced_arrays') + + if (extension === null) { + console.error( + 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' + ) + return + } + + extension.drawElementsInstancedANGLE( + mode, + count, + type, + start * bytesPerElement, + geometry.maxInstancedCount + ) + + infoRender.calls++ + infoRender.vertices += count * geometry.maxInstancedCount + + if (mode === gl.TRIANGLES) infoRender.faces += (geometry.maxInstancedCount * count) / 3 + else if (mode === gl.POINTS) infoRender.points += geometry.maxInstancedCount * count + } + + // + + this.setMode = setMode + this.setIndex = setIndex + this.render = render + this.renderInstances = renderInstances + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer(gl, extensions, infoRender) { + var mode + + function setMode(value) { + mode = value + } + + function render(start, count) { + gl.drawArrays(mode, start, count) + + infoRender.calls++ + infoRender.vertices += count + + if (mode === gl.TRIANGLES) infoRender.faces += count / 3 + else if (mode === gl.POINTS) infoRender.points += count + } + + function renderInstances(geometry, start, count) { + var extension = extensions.get('ANGLE_instanced_arrays') + + if (extension === null) { + console.error( + 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' + ) + return + } + + var position = geometry.attributes.position + + if (position.isInterleavedBufferAttribute) { + count = position.data.count + + extension.drawArraysInstancedANGLE(mode, 0, count, geometry.maxInstancedCount) + } else { + extension.drawArraysInstancedANGLE(mode, start, count, geometry.maxInstancedCount) + } + + infoRender.calls++ + infoRender.vertices += count * geometry.maxInstancedCount + + if (mode === gl.TRIANGLES) infoRender.faces += (geometry.maxInstancedCount * count) / 3 + else if (mode === gl.POINTS) infoRender.points += geometry.maxInstancedCount * count + } + + // + + this.setMode = setMode + this.render = render + this.renderInstances = renderInstances + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries(gl, attributes, infoMemory) { + var geometries = {} + var wireframeAttributes = {} + + function onGeometryDispose(event) { + var geometry = event.target + var buffergeometry = geometries[geometry.id] + + if (buffergeometry.index !== null) { + attributes.remove(buffergeometry.index) + } + + for (var name in buffergeometry.attributes) { + attributes.remove(buffergeometry.attributes[name]) + } + + geometry.removeEventListener('dispose', onGeometryDispose) + + delete geometries[geometry.id] + + // TODO Remove duplicate code + + var attribute = wireframeAttributes[geometry.id] + + if (attribute) { + attributes.remove(attribute) + delete wireframeAttributes[geometry.id] + } + + attribute = wireframeAttributes[buffergeometry.id] + + if (attribute) { + attributes.remove(attribute) + delete wireframeAttributes[buffergeometry.id] + } + + // + + infoMemory.geometries-- + } + + function get(object, geometry) { + var buffergeometry = geometries[geometry.id] + + if (buffergeometry) return buffergeometry + + geometry.addEventListener('dispose', onGeometryDispose) + + if (geometry.isBufferGeometry) { + buffergeometry = geometry + } else if (geometry.isGeometry) { + if (geometry._bufferGeometry === undefined) { + geometry._bufferGeometry = new BufferGeometry().setFromObject(object) + } + + buffergeometry = geometry._bufferGeometry + } + + geometries[geometry.id] = buffergeometry + + infoMemory.geometries++ + + return buffergeometry + } + + function update(geometry) { + var index = geometry.index + var geometryAttributes = geometry.attributes + + if (index !== null) { + attributes.update(index, gl.ELEMENT_ARRAY_BUFFER) + } + + for (var name in geometryAttributes) { + attributes.update(geometryAttributes[name], gl.ARRAY_BUFFER) + } + + // morph targets + + var morphAttributes = geometry.morphAttributes + + for (var name in morphAttributes) { + var array = morphAttributes[name] + + for (var i = 0, l = array.length; i < l; i++) { + attributes.update(array[i], gl.ARRAY_BUFFER) + } + } + } + + function getWireframeAttribute(geometry) { + var attribute = wireframeAttributes[geometry.id] + + if (attribute) return attribute + + var indices = [] + + var geometryIndex = geometry.index + var geometryAttributes = geometry.attributes + + // console.time( 'wireframe' ); + + if (geometryIndex !== null) { + var array = geometryIndex.array + + for (var i = 0, l = array.length; i < l; i += 3) { + var a = array[i + 0] + var b = array[i + 1] + var c = array[i + 2] + + indices.push(a, b, b, c, c, a) + } + } else { + var array = geometryAttributes.position.array + + for (var i = 0, l = array.length / 3 - 1; i < l; i += 3) { + var a = i + 0 + var b = i + 1 + var c = i + 2 + + indices.push(a, b, b, c, c, a) + } + } + + // console.timeEnd( 'wireframe' ); + + attribute = new (arrayMax(indices) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute)( + indices, + 1 + ) + + attributes.update(attribute, gl.ELEMENT_ARRAY_BUFFER) + + wireframeAttributes[geometry.id] = attribute + + return attribute + } + + return { + get: get, + update: update, + + getWireframeAttribute: getWireframeAttribute + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects(geometries, infoRender) { + var updateList = {} + + function update(object) { + var frame = infoRender.frame + + var geometry = object.geometry + var buffergeometry = geometries.get(object, geometry) + + // Update once per frame + + if (updateList[buffergeometry.id] !== frame) { + if (geometry.isGeometry) { + buffergeometry.updateFromObject(object) + } + + geometries.update(buffergeometry) + + updateList[buffergeometry.id] = frame + } + + return buffergeometry + } + + function dispose() { + updateList = {} + } + + return { + update: update, + dispose: dispose + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers(string) { + var lines = string.split('\n') + + for (var i = 0; i < lines.length; i++) { + lines[i] = i + 1 + ': ' + lines[i] + } + + return lines.join('\n') + } + + function WebGLShader(gl, type, string) { + var shader = gl.createShader(type) + + gl.shaderSource(shader, string) + gl.compileShader(shader) + + if (gl.getShaderParameter(shader, gl.COMPILE_STATUS) === false) { + console.error("THREE.WebGLShader: Shader couldn't compile.") + } + + if (gl.getShaderInfoLog(shader) !== '') { + console.warn( + 'THREE.WebGLShader: gl.getShaderInfoLog()', + type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', + gl.getShaderInfoLog(shader), + addLineNumbers(string) + ) + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0 + + function getEncodingComponents(encoding) { + switch (encoding) { + case LinearEncoding: + return ['Linear', '( value )'] + case sRGBEncoding: + return ['sRGB', '( value )'] + case RGBEEncoding: + return ['RGBE', '( value )'] + case RGBM7Encoding: + return ['RGBM', '( value, 7.0 )'] + case RGBM16Encoding: + return ['RGBM', '( value, 16.0 )'] + case RGBDEncoding: + return ['RGBD', '( value, 256.0 )'] + case GammaEncoding: + return ['Gamma', '( value, float( GAMMA_FACTOR ) )'] + default: + throw new Error('unsupported encoding: ' + encoding) + } + } + + function getTexelDecodingFunction(functionName, encoding) { + var components = getEncodingComponents(encoding) + return ( + 'vec4 ' + + functionName + + '( vec4 value ) { return ' + + components[0] + + 'ToLinear' + + components[1] + + '; }' + ) + } + + function getTexelEncodingFunction(functionName, encoding) { + var components = getEncodingComponents(encoding) + return ( + 'vec4 ' + + functionName + + '( vec4 value ) { return LinearTo' + + components[0] + + components[1] + + '; }' + ) + } + + function getToneMappingFunction(functionName, toneMapping) { + var toneMappingName + + switch (toneMapping) { + case LinearToneMapping: + toneMappingName = 'Linear' + break + + case ReinhardToneMapping: + toneMappingName = 'Reinhard' + break + + case Uncharted2ToneMapping: + toneMappingName = 'Uncharted2' + break + + case CineonToneMapping: + toneMappingName = 'OptimizedCineon' + break + + default: + throw new Error('unsupported toneMapping: ' + toneMapping) + } + + return ( + 'vec3 ' + + functionName + + '( vec3 color ) { return ' + + toneMappingName + + 'ToneMapping( color ); }' + ) + } + + function generateExtensions(extensions, parameters, rendererExtensions) { + extensions = extensions || {} + + var chunks = [ + extensions.derivatives || + parameters.envMapCubeUV || + parameters.bumpMap || + parameters.normalMap || + parameters.flatShading + ? '#extension GL_OES_standard_derivatives : enable' + : '', + (extensions.fragDepth || parameters.logarithmicDepthBuffer) && + rendererExtensions.get('EXT_frag_depth') + ? '#extension GL_EXT_frag_depth : enable' + : '', + extensions.drawBuffers && rendererExtensions.get('WEBGL_draw_buffers') + ? '#extension GL_EXT_draw_buffers : require' + : '', + (extensions.shaderTextureLOD || parameters.envMap) && + rendererExtensions.get('EXT_shader_texture_lod') + ? '#extension GL_EXT_shader_texture_lod : enable' + : '' + ] + + return chunks.filter(filterEmptyLine).join('\n') + } + + function generateDefines(defines) { + var chunks = [] + + for (var name in defines) { + var value = defines[name] + + if (value === false) continue + + chunks.push('#define ' + name + ' ' + value) + } + + return chunks.join('\n') + } + + function fetchAttributeLocations(gl, program) { + var attributes = {} + + var n = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES) + + for (var i = 0; i < n; i++) { + var info = gl.getActiveAttrib(program, i) + var name = info.name + + // console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i ); + + attributes[name] = gl.getAttribLocation(program, name) + } + + return attributes + } + + function filterEmptyLine(string) { + return string !== '' + } + + function replaceLightNums(string, parameters) { + return string + .replace(/NUM_DIR_LIGHTS/g, parameters.numDirLights) + .replace(/NUM_SPOT_LIGHTS/g, parameters.numSpotLights) + .replace(/NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights) + .replace(/NUM_POINT_LIGHTS/g, parameters.numPointLights) + .replace(/NUM_HEMI_LIGHTS/g, parameters.numHemiLights) + } + + function replaceClippingPlaneNums(string, parameters) { + return string + .replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes) + .replace( + /UNION_CLIPPING_PLANES/g, + parameters.numClippingPlanes - parameters.numClipIntersection + ) + } + + function parseIncludes(string) { + var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm + + function replace(match, include) { + var replace = ShaderChunk[include] + + if (replace === undefined) { + throw new Error('Can not resolve #include <' + include + '>') + } + + return parseIncludes(replace) + } + + return string.replace(pattern, replace) + } + + function unrollLoops(string) { + var pattern = + /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g + + function replace(match, start, end, snippet) { + var unroll = '' + + for (var i = parseInt(start); i < parseInt(end); i++) { + unroll += snippet.replace(/\[ i \]/g, '[ ' + i + ' ]') + } + + return unroll + } + + return string.replace(pattern, replace) + } + + function WebGLProgram(renderer, extensions, code, material, shader, parameters) { + var gl = renderer.context + + var defines = material.defines + + var vertexShader = shader.vertexShader + var fragmentShader = shader.fragmentShader + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC' + + if (parameters.shadowMapType === PCFShadowMap) { + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF' + } else if (parameters.shadowMapType === PCFSoftShadowMap) { + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT' + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE' + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION' + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY' + + if (parameters.envMap) { + switch (material.envMap.mapping) { + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE' + break + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV' + break + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC' + break + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE' + break + } + + switch (material.envMap.mapping) { + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION' + break + } + + switch (material.combine) { + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY' + break + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX' + break + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD' + break + } + } + + var gammaFactorDefine = renderer.gammaFactor > 0 ? renderer.gammaFactor : 1.0 + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions(material.extensions, parameters, extensions) + + var customDefines = generateDefines(defines) + + // + + var program = gl.createProgram() + + var prefixVertex, prefixFragment + + if (material.isRawShaderMaterial) { + prefixVertex = [customDefines].filter(filterEmptyLine).join('\n') + + if (prefixVertex.length > 0) { + prefixVertex += '\n' + } + + prefixFragment = [customExtensions, customDefines].filter(filterEmptyLine).join('\n') + + if (prefixFragment.length > 0) { + prefixFragment += '\n' + } + } else { + prefixVertex = [ + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + parameters.useFog && parameters.fog ? '#define USE_FOG' : '', + parameters.useFog && parameters.fogExp ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures + ? '#define USE_DISPLACEMENTMAP' + : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false + ? '#define USE_MORPHNORMALS' + : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && extensions.get('EXT_frag_depth') + ? '#define USE_LOGDEPTHBUF_EXT' + : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + ] + .filter(filterEmptyLine) + .join('\n') + + prefixFragment = [ + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + shader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + parameters.useFog && parameters.fog ? '#define USE_FOG' : '', + parameters.useFog && parameters.fogExp ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', + + parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && extensions.get('EXT_frag_depth') + ? '#define USE_LOGDEPTHBUF_EXT' + : '', + + parameters.envMap && extensions.get('EXT_shader_texture_lod') + ? '#define TEXTURE_LOD_EXT' + : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + parameters.toneMapping !== NoToneMapping ? '#define TONE_MAPPING' : '', + parameters.toneMapping !== NoToneMapping ? ShaderChunk['tonemapping_pars_fragment'] : '', // this code is required here because it is used by the toneMapping() function defined below + parameters.toneMapping !== NoToneMapping + ? getToneMappingFunction('toneMapping', parameters.toneMapping) + : '', + + parameters.dithering ? '#define DITHERING' : '', + + parameters.outputEncoding || + parameters.mapEncoding || + parameters.envMapEncoding || + parameters.emissiveMapEncoding + ? ShaderChunk['encodings_pars_fragment'] + : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding + ? getTexelDecodingFunction('mapTexelToLinear', parameters.mapEncoding) + : '', + parameters.envMapEncoding + ? getTexelDecodingFunction('envMapTexelToLinear', parameters.envMapEncoding) + : '', + parameters.emissiveMapEncoding + ? getTexelDecodingFunction('emissiveMapTexelToLinear', parameters.emissiveMapEncoding) + : '', + parameters.outputEncoding + ? getTexelEncodingFunction('linearToOutputTexel', parameters.outputEncoding) + : '', + + parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', + + '\n' + ] + .filter(filterEmptyLine) + .join('\n') + } + + vertexShader = parseIncludes(vertexShader) + vertexShader = replaceLightNums(vertexShader, parameters) + vertexShader = replaceClippingPlaneNums(vertexShader, parameters) + + fragmentShader = parseIncludes(fragmentShader) + fragmentShader = replaceLightNums(fragmentShader, parameters) + fragmentShader = replaceClippingPlaneNums(fragmentShader, parameters) + + vertexShader = unrollLoops(vertexShader) + fragmentShader = unrollLoops(fragmentShader) + + var vertexGlsl = prefixVertex + vertexShader + var fragmentGlsl = prefixFragment + fragmentShader + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader(gl, gl.VERTEX_SHADER, vertexGlsl) + var glFragmentShader = WebGLShader(gl, gl.FRAGMENT_SHADER, fragmentGlsl) + + gl.attachShader(program, glVertexShader) + gl.attachShader(program, glFragmentShader) + + // Force a particular attribute to index 0. + + if (material.index0AttributeName !== undefined) { + gl.bindAttribLocation(program, 0, material.index0AttributeName) + } else if (parameters.morphTargets === true) { + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation(program, 0, 'position') + } + + gl.linkProgram(program) + + var programLog = gl.getProgramInfoLog(program).trim() + var vertexLog = gl.getShaderInfoLog(glVertexShader).trim() + var fragmentLog = gl.getShaderInfoLog(glFragmentShader).trim() + + var runnable = true + var haveDiagnostics = true + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { + runnable = false + + console.error( + 'THREE.WebGLProgram: shader error: ', + gl.getError(), + 'gl.VALIDATE_STATUS', + gl.getProgramParameter(program, gl.VALIDATE_STATUS), + 'gl.getProgramInfoLog', + programLog, + vertexLog, + fragmentLog + ) + } else if (programLog !== '') { + console.warn('THREE.WebGLProgram: gl.getProgramInfoLog()', programLog) + } else if (vertexLog === '' || fragmentLog === '') { + haveDiagnostics = false + } + + if (haveDiagnostics) { + this.diagnostics = { + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + log: vertexLog, + prefix: prefixVertex + }, + + fragmentShader: { + log: fragmentLog, + prefix: prefixFragment + } + } + } + + // clean up + + gl.deleteShader(glVertexShader) + gl.deleteShader(glFragmentShader) + + // set up caching for uniform locations + + var cachedUniforms + + this.getUniforms = function () { + if (cachedUniforms === undefined) { + cachedUniforms = new WebGLUniforms(gl, program, renderer) + } + + return cachedUniforms + } + + // set up caching for attribute locations + + var cachedAttributes + + this.getAttributes = function () { + if (cachedAttributes === undefined) { + cachedAttributes = fetchAttributeLocations(gl, program) + } + + return cachedAttributes + } + + // free resource + + this.destroy = function () { + gl.deleteProgram(program) + this.program = undefined + } + + // DEPRECATED + + Object.defineProperties(this, { + uniforms: { + get: function () { + console.warn('THREE.WebGLProgram: .uniforms is now .getUniforms().') + return this.getUniforms() + } + }, + + attributes: { + get: function () { + console.warn('THREE.WebGLProgram: .attributes is now .getAttributes().') + return this.getAttributes() + } + } + }) + + // + + this.id = programIdCount++ + this.code = code + this.usedTimes = 1 + this.program = program + this.vertexShader = glVertexShader + this.fragmentShader = glFragmentShader + + return this + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms(renderer, extensions, capabilities) { + var programs = [] + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshDistanceMaterial: 'distanceRGBA', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshToonMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points', + ShadowMaterial: 'shadow' + } + + var parameterNames = [ + 'precision', + 'supportsVertexTextures', + 'map', + 'mapEncoding', + 'envMap', + 'envMapMode', + 'envMapEncoding', + 'lightMap', + 'aoMap', + 'emissiveMap', + 'emissiveMapEncoding', + 'bumpMap', + 'normalMap', + 'displacementMap', + 'specularMap', + 'roughnessMap', + 'metalnessMap', + 'gradientMap', + 'alphaMap', + 'combine', + 'vertexColors', + 'fog', + 'useFog', + 'fogExp', + 'flatShading', + 'sizeAttenuation', + 'logarithmicDepthBuffer', + 'skinning', + 'maxBones', + 'useVertexTexture', + 'morphTargets', + 'morphNormals', + 'maxMorphTargets', + 'maxMorphNormals', + 'premultipliedAlpha', + 'numDirLights', + 'numPointLights', + 'numSpotLights', + 'numHemiLights', + 'numRectAreaLights', + 'shadowMapEnabled', + 'shadowMapType', + 'toneMapping', + 'physicallyCorrectLights', + 'alphaTest', + 'doubleSided', + 'flipSided', + 'numClippingPlanes', + 'numClipIntersection', + 'depthPacking', + 'dithering' + ] + + function allocateBones(object) { + var skeleton = object.skeleton + var bones = skeleton.bones + + if (capabilities.floatVertexTextures) { + return 1024 + } else { + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms + var nVertexMatrices = Math.floor((nVertexUniforms - 20) / 4) + + var maxBones = Math.min(nVertexMatrices, bones.length) + + if (maxBones < bones.length) { + console.warn( + 'THREE.WebGLRenderer: Skeleton has ' + + bones.length + + ' bones. This GPU supports ' + + maxBones + + '.' + ) + return 0 + } + + return maxBones + } + } + + function getTextureEncodingFromMap(map, gammaOverrideLinear) { + var encoding + + if (!map) { + encoding = LinearEncoding + } else if (map.isTexture) { + encoding = map.encoding + } else if (map.isWebGLRenderTarget) { + console.warn( + "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." + ) + encoding = map.texture.encoding + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if (encoding === LinearEncoding && gammaOverrideLinear) { + encoding = GammaEncoding + } + + return encoding + } + + this.getParameters = function ( + material, + lights, + shadows, + fog, + nClipPlanes, + nClipIntersection, + object + ) { + var shaderID = shaderIDs[material.type] + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = object.isSkinnedMesh ? allocateBones(object) : 0 + var precision = capabilities.precision + + if (material.precision !== null) { + precision = capabilities.getMaxPrecision(material.precision) + + if (precision !== material.precision) { + console.warn( + 'THREE.WebGLProgram.getParameters:', + material.precision, + 'not supported, using', + precision, + 'instead.' + ) + } + } + + var currentRenderTarget = renderer.getRenderTarget() + + var parameters = { + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( + !currentRenderTarget ? null : currentRenderTarget.texture, + renderer.gammaOutput + ), + map: !!material.map, + mapEncoding: getTextureEncodingFromMap(material.map, renderer.gammaInput), + envMap: !!material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap(material.envMap, renderer.gammaInput), + envMapCubeUV: + !!material.envMap && + (material.envMap.mapping === CubeUVReflectionMapping || + material.envMap.mapping === CubeUVRefractionMapping), + lightMap: !!material.lightMap, + aoMap: !!material.aoMap, + emissiveMap: !!material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap(material.emissiveMap, renderer.gammaInput), + bumpMap: !!material.bumpMap, + normalMap: !!material.normalMap, + displacementMap: !!material.displacementMap, + roughnessMap: !!material.roughnessMap, + metalnessMap: !!material.metalnessMap, + specularMap: !!material.specularMap, + alphaMap: !!material.alphaMap, + + gradientMap: !!material.gradientMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !!fog, + useFog: material.fog, + fogExp: fog && fog.isFogExp2, + + flatShading: material.flatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning && maxBones > 0, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + dithering: material.dithering, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: material.depthPacking !== undefined ? material.depthPacking : false + } + + return parameters + } + + this.getProgramCode = function (material, parameters) { + var array = [] + + if (parameters.shaderID) { + array.push(parameters.shaderID) + } else { + array.push(material.fragmentShader) + array.push(material.vertexShader) + } + + if (material.defines !== undefined) { + for (var name in material.defines) { + array.push(name) + array.push(material.defines[name]) + } + } + + for (var i = 0; i < parameterNames.length; i++) { + array.push(parameters[parameterNames[i]]) + } + + array.push(material.onBeforeCompile.toString()) + + array.push(renderer.gammaOutput) + + return array.join() + } + + this.acquireProgram = function (material, shader, parameters, code) { + var program + + // Check if code has been already compiled + for (var p = 0, pl = programs.length; p < pl; p++) { + var programInfo = programs[p] + + if (programInfo.code === code) { + program = programInfo + ++program.usedTimes + + break + } + } + + if (program === undefined) { + program = new WebGLProgram(renderer, extensions, code, material, shader, parameters) + programs.push(program) + } + + return program + } + + this.releaseProgram = function (program) { + if (--program.usedTimes === 0) { + // Remove from unordered set + var i = programs.indexOf(program) + programs[i] = programs[programs.length - 1] + programs.pop() + + // Free WebGL resources + program.destroy() + } + } + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( + _gl, + extensions, + state, + properties, + capabilities, + utils, + infoMemory, + infoRender + ) { + var _isWebGL2 = + typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext + var _videoTextures = {} + var _canvas + + // + + function clampToMaxSize(image, maxSize) { + if (image.width > maxSize || image.height > maxSize) { + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max(image.width, image.height) + + var canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas') + canvas.width = Math.floor(image.width * scale) + canvas.height = Math.floor(image.height * scale) + + var context = canvas.getContext('2d') + context.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height) + + console.warn( + 'THREE.WebGLRenderer: image is too big (' + + image.width + + 'x' + + image.height + + '). Resized to ' + + canvas.width + + 'x' + + canvas.height, + image + ) + + return canvas + } + + return image + } + + function isPowerOfTwo(image) { + return _Math.isPowerOfTwo(image.width) && _Math.isPowerOfTwo(image.height) + } + + function makePowerOfTwo(image) { + if ( + image instanceof HTMLImageElement || + image instanceof HTMLCanvasElement || + image instanceof ImageBitmap + ) { + if (_canvas === undefined) + _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas') + + _canvas.width = _Math.floorPowerOfTwo(image.width) + _canvas.height = _Math.floorPowerOfTwo(image.height) + + var context = _canvas.getContext('2d') + context.drawImage(image, 0, 0, _canvas.width, _canvas.height) + + console.warn( + 'THREE.WebGLRenderer: image is not power of two (' + + image.width + + 'x' + + image.height + + '). Resized to ' + + _canvas.width + + 'x' + + _canvas.height, + image + ) + + return _canvas + } + + return image + } + + function textureNeedsPowerOfTwo(texture) { + return ( + texture.wrapS !== ClampToEdgeWrapping || + texture.wrapT !== ClampToEdgeWrapping || + (texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter) + ) + } + + function textureNeedsGenerateMipmaps(texture, isPowerOfTwo) { + return ( + texture.generateMipmaps && + isPowerOfTwo && + texture.minFilter !== NearestFilter && + texture.minFilter !== LinearFilter + ) + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback(f) { + if ( + f === NearestFilter || + f === NearestMipMapNearestFilter || + f === NearestMipMapLinearFilter + ) { + return _gl.NEAREST + } + + return _gl.LINEAR + } + + // + + function onTextureDispose(event) { + var texture = event.target + + texture.removeEventListener('dispose', onTextureDispose) + + deallocateTexture(texture) + + if (texture.isVideoTexture) { + delete _videoTextures[texture.id] + } + + infoMemory.textures-- + } + + function onRenderTargetDispose(event) { + var renderTarget = event.target + + renderTarget.removeEventListener('dispose', onRenderTargetDispose) + + deallocateRenderTarget(renderTarget) + + infoMemory.textures-- + } + + // + + function deallocateTexture(texture) { + var textureProperties = properties.get(texture) + + if (texture.image && textureProperties.__image__webglTextureCube) { + // cube texture + + _gl.deleteTexture(textureProperties.__image__webglTextureCube) + } else { + // 2D texture + + if (textureProperties.__webglInit === undefined) return + + _gl.deleteTexture(textureProperties.__webglTexture) + } + + // remove all webgl properties + properties.remove(texture) + } + + function deallocateRenderTarget(renderTarget) { + var renderTargetProperties = properties.get(renderTarget) + var textureProperties = properties.get(renderTarget.texture) + + if (!renderTarget) return + + if (textureProperties.__webglTexture !== undefined) { + _gl.deleteTexture(textureProperties.__webglTexture) + } + + if (renderTarget.depthTexture) { + renderTarget.depthTexture.dispose() + } + + if (renderTarget.isWebGLRenderTargetCube) { + for (var i = 0; i < 6; i++) { + _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]) + if (renderTargetProperties.__webglDepthbuffer) + _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]) + } + } else { + _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer) + if (renderTargetProperties.__webglDepthbuffer) + _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer) + } + + properties.remove(renderTarget.texture) + properties.remove(renderTarget) + } + + // + + function setTexture2D(texture, slot) { + var textureProperties = properties.get(texture) + + if (texture.isVideoTexture) updateVideoTexture(texture) + + if (texture.version > 0 && textureProperties.__version !== texture.version) { + var image = texture.image + + if (image === undefined) { + console.warn( + 'THREE.WebGLRenderer: Texture marked for update but image is undefined', + texture + ) + } else if (image.complete === false) { + console.warn( + 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', + texture + ) + } else { + uploadTexture(textureProperties, texture, slot) + return + } + } + + state.activeTexture(_gl.TEXTURE0 + slot) + state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture) + } + + function setTextureCube(texture, slot) { + var textureProperties = properties.get(texture) + + if (texture.image.length === 6) { + if (texture.version > 0 && textureProperties.__version !== texture.version) { + if (!textureProperties.__image__webglTextureCube) { + texture.addEventListener('dispose', onTextureDispose) + + textureProperties.__image__webglTextureCube = _gl.createTexture() + + infoMemory.textures++ + } + + state.activeTexture(_gl.TEXTURE0 + slot) + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube) + + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY) + + var isCompressed = texture && texture.isCompressedTexture + var isDataTexture = texture.image[0] && texture.image[0].isDataTexture + + var cubeImage = [] + + for (var i = 0; i < 6; i++) { + if (!isCompressed && !isDataTexture) { + cubeImage[i] = clampToMaxSize(texture.image[i], capabilities.maxCubemapSize) + } else { + cubeImage[i] = isDataTexture ? texture.image[i].image : texture.image[i] + } + } + + var image = cubeImage[0], + isPowerOfTwoImage = isPowerOfTwo(image), + glFormat = utils.convert(texture.format), + glType = utils.convert(texture.type) + + setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage) + + for (var i = 0; i < 6; i++) { + if (!isCompressed) { + if (isDataTexture) { + state.texImage2D( + _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, + 0, + glFormat, + cubeImage[i].width, + cubeImage[i].height, + 0, + glFormat, + glType, + cubeImage[i].data + ) + } else { + state.texImage2D( + _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, + 0, + glFormat, + glFormat, + glType, + cubeImage[i] + ) + } + } else { + var mipmap, + mipmaps = cubeImage[i].mipmaps + + for (var j = 0, jl = mipmaps.length; j < jl; j++) { + mipmap = mipmaps[j] + + if (texture.format !== RGBAFormat && texture.format !== RGBFormat) { + if (state.getCompressedTextureFormats().indexOf(glFormat) > -1) { + state.compressedTexImage2D( + _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, + j, + glFormat, + mipmap.width, + mipmap.height, + 0, + mipmap.data + ) + } else { + console.warn( + 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' + ) + } + } else { + state.texImage2D( + _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, + j, + glFormat, + mipmap.width, + mipmap.height, + 0, + glFormat, + glType, + mipmap.data + ) + } + } + } + } + + if (textureNeedsGenerateMipmaps(texture, isPowerOfTwoImage)) { + _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP) + } + + textureProperties.__version = texture.version + + if (texture.onUpdate) texture.onUpdate(texture) + } else { + state.activeTexture(_gl.TEXTURE0 + slot) + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube) + } + } + } + + function setTextureCubeDynamic(texture, slot) { + state.activeTexture(_gl.TEXTURE0 + slot) + state.bindTexture(_gl.TEXTURE_CUBE_MAP, properties.get(texture).__webglTexture) + } + + function setTextureParameters(textureType, texture, isPowerOfTwoImage) { + var extension + + if (isPowerOfTwoImage) { + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_S, utils.convert(texture.wrapS)) + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_T, utils.convert(texture.wrapT)) + + _gl.texParameteri(textureType, _gl.TEXTURE_MAG_FILTER, utils.convert(texture.magFilter)) + _gl.texParameteri(textureType, _gl.TEXTURE_MIN_FILTER, utils.convert(texture.minFilter)) + } else { + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE) + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE) + + if (texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping) { + console.warn( + 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', + texture + ) + } + + _gl.texParameteri(textureType, _gl.TEXTURE_MAG_FILTER, filterFallback(texture.magFilter)) + _gl.texParameteri(textureType, _gl.TEXTURE_MIN_FILTER, filterFallback(texture.minFilter)) + + if (texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter) { + console.warn( + 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', + texture + ) + } + } + + extension = extensions.get('EXT_texture_filter_anisotropic') + + if (extension) { + if (texture.type === FloatType && extensions.get('OES_texture_float_linear') === null) + return + if ( + texture.type === HalfFloatType && + extensions.get('OES_texture_half_float_linear') === null + ) + return + + if (texture.anisotropy > 1 || properties.get(texture).__currentAnisotropy) { + _gl.texParameterf( + textureType, + extension.TEXTURE_MAX_ANISOTROPY_EXT, + Math.min(texture.anisotropy, capabilities.getMaxAnisotropy()) + ) + properties.get(texture).__currentAnisotropy = texture.anisotropy + } + } + } + + function uploadTexture(textureProperties, texture, slot) { + if (textureProperties.__webglInit === undefined) { + textureProperties.__webglInit = true + + texture.addEventListener('dispose', onTextureDispose) + + textureProperties.__webglTexture = _gl.createTexture() + + infoMemory.textures++ + } + + state.activeTexture(_gl.TEXTURE0 + slot) + state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture) + + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY) + _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha) + _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment) + + var image = clampToMaxSize(texture.image, capabilities.maxTextureSize) + + if (textureNeedsPowerOfTwo(texture) && isPowerOfTwo(image) === false) { + image = makePowerOfTwo(image) + } + + var isPowerOfTwoImage = isPowerOfTwo(image), + glFormat = utils.convert(texture.format), + glType = utils.convert(texture.type) + + setTextureParameters(_gl.TEXTURE_2D, texture, isPowerOfTwoImage) + + var mipmap, + mipmaps = texture.mipmaps + + if (texture.isDepthTexture) { + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT + + if (texture.type === FloatType) { + if (!_isWebGL2) throw new Error('Float Depth Texture only supported in WebGL2.0') + internalFormat = _gl.DEPTH_COMPONENT32F + } else if (_isWebGL2) { + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16 + } + + if (texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT) { + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if (texture.type !== UnsignedShortType && texture.type !== UnsignedIntType) { + console.warn( + 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' + ) + + texture.type = UnsignedShortType + glType = utils.convert(texture.type) + } + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if (texture.format === DepthStencilFormat) { + internalFormat = _gl.DEPTH_STENCIL + + // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are + // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if (texture.type !== UnsignedInt248Type) { + console.warn( + 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' + ) + + texture.type = UnsignedInt248Type + glType = utils.convert(texture.type) + } + } + + state.texImage2D( + _gl.TEXTURE_2D, + 0, + internalFormat, + image.width, + image.height, + 0, + glFormat, + glType, + null + ) + } else if (texture.isDataTexture) { + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if (mipmaps.length > 0 && isPowerOfTwoImage) { + for (var i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i] + state.texImage2D( + _gl.TEXTURE_2D, + i, + glFormat, + mipmap.width, + mipmap.height, + 0, + glFormat, + glType, + mipmap.data + ) + } + + texture.generateMipmaps = false + } else { + state.texImage2D( + _gl.TEXTURE_2D, + 0, + glFormat, + image.width, + image.height, + 0, + glFormat, + glType, + image.data + ) + } + } else if (texture.isCompressedTexture) { + for (var i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i] + + if (texture.format !== RGBAFormat && texture.format !== RGBFormat) { + if (state.getCompressedTextureFormats().indexOf(glFormat) > -1) { + state.compressedTexImage2D( + _gl.TEXTURE_2D, + i, + glFormat, + mipmap.width, + mipmap.height, + 0, + mipmap.data + ) + } else { + console.warn( + 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' + ) + } + } else { + state.texImage2D( + _gl.TEXTURE_2D, + i, + glFormat, + mipmap.width, + mipmap.height, + 0, + glFormat, + glType, + mipmap.data + ) + } + } + } else { + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if (mipmaps.length > 0 && isPowerOfTwoImage) { + for (var i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i] + state.texImage2D(_gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap) + } + + texture.generateMipmaps = false + } else { + state.texImage2D(_gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image) + } + } + + if (textureNeedsGenerateMipmaps(texture, isPowerOfTwoImage)) + _gl.generateMipmap(_gl.TEXTURE_2D) + + textureProperties.__version = texture.version + + if (texture.onUpdate) texture.onUpdate(texture) + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture(framebuffer, renderTarget, attachment, textureTarget) { + var glFormat = utils.convert(renderTarget.texture.format) + var glType = utils.convert(renderTarget.texture.type) + state.texImage2D( + textureTarget, + 0, + glFormat, + renderTarget.width, + renderTarget.height, + 0, + glFormat, + glType, + null + ) + _gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer) + _gl.framebufferTexture2D( + _gl.FRAMEBUFFER, + attachment, + textureTarget, + properties.get(renderTarget.texture).__webglTexture, + 0 + ) + _gl.bindFramebuffer(_gl.FRAMEBUFFER, null) + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage(renderbuffer, renderTarget) { + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer) + + if (renderTarget.depthBuffer && !renderTarget.stencilBuffer) { + _gl.renderbufferStorage( + _gl.RENDERBUFFER, + _gl.DEPTH_COMPONENT16, + renderTarget.width, + renderTarget.height + ) + _gl.framebufferRenderbuffer( + _gl.FRAMEBUFFER, + _gl.DEPTH_ATTACHMENT, + _gl.RENDERBUFFER, + renderbuffer + ) + } else if (renderTarget.depthBuffer && renderTarget.stencilBuffer) { + _gl.renderbufferStorage( + _gl.RENDERBUFFER, + _gl.DEPTH_STENCIL, + renderTarget.width, + renderTarget.height + ) + _gl.framebufferRenderbuffer( + _gl.FRAMEBUFFER, + _gl.DEPTH_STENCIL_ATTACHMENT, + _gl.RENDERBUFFER, + renderbuffer + ) + } else { + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( + _gl.RENDERBUFFER, + _gl.RGBA4, + renderTarget.width, + renderTarget.height + ) + } + + _gl.bindRenderbuffer(_gl.RENDERBUFFER, null) + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture(framebuffer, renderTarget) { + var isCube = renderTarget && renderTarget.isWebGLRenderTargetCube + if (isCube) throw new Error('Depth Texture with cube render targets is not supported') + + _gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer) + + if (!(renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture)) { + throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture') + } + + // upload an empty depth texture with framebuffer size + if ( + !properties.get(renderTarget.depthTexture).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height + ) { + renderTarget.depthTexture.image.width = renderTarget.width + renderTarget.depthTexture.image.height = renderTarget.height + renderTarget.depthTexture.needsUpdate = true + } + + setTexture2D(renderTarget.depthTexture, 0) + + var webglDepthTexture = properties.get(renderTarget.depthTexture).__webglTexture + + if (renderTarget.depthTexture.format === DepthFormat) { + _gl.framebufferTexture2D( + _gl.FRAMEBUFFER, + _gl.DEPTH_ATTACHMENT, + _gl.TEXTURE_2D, + webglDepthTexture, + 0 + ) + } else if (renderTarget.depthTexture.format === DepthStencilFormat) { + _gl.framebufferTexture2D( + _gl.FRAMEBUFFER, + _gl.DEPTH_STENCIL_ATTACHMENT, + _gl.TEXTURE_2D, + webglDepthTexture, + 0 + ) + } else { + throw new Error('Unknown depthTexture format') + } + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer(renderTarget) { + var renderTargetProperties = properties.get(renderTarget) + + var isCube = renderTarget.isWebGLRenderTargetCube === true + + if (renderTarget.depthTexture) { + if (isCube) throw new Error('target.depthTexture not supported in Cube render targets') + + setupDepthTexture(renderTargetProperties.__webglFramebuffer, renderTarget) + } else { + if (isCube) { + renderTargetProperties.__webglDepthbuffer = [] + + for (var i = 0; i < 6; i++) { + _gl.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[i]) + renderTargetProperties.__webglDepthbuffer[i] = _gl.createRenderbuffer() + setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[i], renderTarget) + } + } else { + _gl.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer) + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer() + setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer, renderTarget) + } + } + + _gl.bindFramebuffer(_gl.FRAMEBUFFER, null) + } + + // Set up GL resources for the render target + function setupRenderTarget(renderTarget) { + var renderTargetProperties = properties.get(renderTarget) + var textureProperties = properties.get(renderTarget.texture) + + renderTarget.addEventListener('dispose', onRenderTargetDispose) + + textureProperties.__webglTexture = _gl.createTexture() + + infoMemory.textures++ + + var isCube = renderTarget.isWebGLRenderTargetCube === true + var isTargetPowerOfTwo = isPowerOfTwo(renderTarget) + + // Setup framebuffer + + if (isCube) { + renderTargetProperties.__webglFramebuffer = [] + + for (var i = 0; i < 6; i++) { + renderTargetProperties.__webglFramebuffer[i] = _gl.createFramebuffer() + } + } else { + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer() + } + + // Setup color buffer + + if (isCube) { + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture) + setTextureParameters(_gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo) + + for (var i = 0; i < 6; i++) { + setupFrameBufferTexture( + renderTargetProperties.__webglFramebuffer[i], + renderTarget, + _gl.COLOR_ATTACHMENT0, + _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i + ) + } + + if (textureNeedsGenerateMipmaps(renderTarget.texture, isTargetPowerOfTwo)) + _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP) + state.bindTexture(_gl.TEXTURE_CUBE_MAP, null) + } else { + state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture) + setTextureParameters(_gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo) + setupFrameBufferTexture( + renderTargetProperties.__webglFramebuffer, + renderTarget, + _gl.COLOR_ATTACHMENT0, + _gl.TEXTURE_2D + ) + + if (textureNeedsGenerateMipmaps(renderTarget.texture, isTargetPowerOfTwo)) + _gl.generateMipmap(_gl.TEXTURE_2D) + state.bindTexture(_gl.TEXTURE_2D, null) + } + + // Setup depth and stencil buffers + + if (renderTarget.depthBuffer) { + setupDepthRenderbuffer(renderTarget) + } + } + + function updateRenderTargetMipmap(renderTarget) { + var texture = renderTarget.texture + var isTargetPowerOfTwo = isPowerOfTwo(renderTarget) + + if (textureNeedsGenerateMipmaps(texture, isTargetPowerOfTwo)) { + var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D + var webglTexture = properties.get(texture).__webglTexture + + state.bindTexture(target, webglTexture) + _gl.generateMipmap(target) + state.bindTexture(target, null) + } + } + + function updateVideoTexture(texture) { + var id = texture.id + var frame = infoRender.frame + + // Check the last frame we updated the VideoTexture + + if (_videoTextures[id] !== frame) { + _videoTextures[id] = frame + texture.update() + } + } + + this.setTexture2D = setTexture2D + this.setTextureCube = setTextureCube + this.setTextureCubeDynamic = setTextureCubeDynamic + this.setupRenderTarget = setupRenderTarget + this.updateRenderTargetMipmap = updateRenderTargetMipmap + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + var properties = {} + + function get(object) { + var uuid = object.uuid + var map = properties[uuid] + + if (map === undefined) { + map = {} + properties[uuid] = map + } + + return map + } + + function remove(object) { + delete properties[object.uuid] + } + + function update(object, key, value) { + var uuid = object.uuid + var map = properties[uuid] + + map[key] = value + } + + function dispose() { + properties = {} + } + + return { + get: get, + remove: remove, + update: update, + dispose: dispose + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState(gl, extensions, utils) { + function ColorBuffer() { + var locked = false + + var color = new Vector4() + var currentColorMask = null + var currentColorClear = new Vector4(0, 0, 0, 0) + + return { + setMask: function (colorMask) { + if (currentColorMask !== colorMask && !locked) { + gl.colorMask(colorMask, colorMask, colorMask, colorMask) + currentColorMask = colorMask + } + }, + + setLocked: function (lock) { + locked = lock + }, + + setClear: function (r, g, b, a, premultipliedAlpha) { + if (premultipliedAlpha === true) { + r *= a + g *= a + b *= a + } + + color.set(r, g, b, a) + + if (currentColorClear.equals(color) === false) { + gl.clearColor(r, g, b, a) + currentColorClear.copy(color) + } + }, + + reset: function () { + locked = false + + currentColorMask = null + currentColorClear.set(-1, 0, 0, 0) // set to invalid state + } + } + } + + function DepthBuffer() { + var locked = false + + var currentDepthMask = null + var currentDepthFunc = null + var currentDepthClear = null + + return { + setTest: function (depthTest) { + if (depthTest) { + enable(gl.DEPTH_TEST) + } else { + disable(gl.DEPTH_TEST) + } + }, + + setMask: function (depthMask) { + if (currentDepthMask !== depthMask && !locked) { + gl.depthMask(depthMask) + currentDepthMask = depthMask + } + }, + + setFunc: function (depthFunc) { + if (currentDepthFunc !== depthFunc) { + if (depthFunc) { + switch (depthFunc) { + case NeverDepth: + gl.depthFunc(gl.NEVER) + break + + case AlwaysDepth: + gl.depthFunc(gl.ALWAYS) + break + + case LessDepth: + gl.depthFunc(gl.LESS) + break + + case LessEqualDepth: + gl.depthFunc(gl.LEQUAL) + break + + case EqualDepth: + gl.depthFunc(gl.EQUAL) + break + + case GreaterEqualDepth: + gl.depthFunc(gl.GEQUAL) + break + + case GreaterDepth: + gl.depthFunc(gl.GREATER) + break + + case NotEqualDepth: + gl.depthFunc(gl.NOTEQUAL) + break + + default: + gl.depthFunc(gl.LEQUAL) + } + } else { + gl.depthFunc(gl.LEQUAL) + } + + currentDepthFunc = depthFunc + } + }, + + setLocked: function (lock) { + locked = lock + }, + + setClear: function (depth) { + if (currentDepthClear !== depth) { + gl.clearDepth(depth) + currentDepthClear = depth + } + }, + + reset: function () { + locked = false + + currentDepthMask = null + currentDepthFunc = null + currentDepthClear = null + } + } + } + + function StencilBuffer() { + var locked = false + + var currentStencilMask = null + var currentStencilFunc = null + var currentStencilRef = null + var currentStencilFuncMask = null + var currentStencilFail = null + var currentStencilZFail = null + var currentStencilZPass = null + var currentStencilClear = null + + return { + setTest: function (stencilTest) { + if (stencilTest) { + enable(gl.STENCIL_TEST) + } else { + disable(gl.STENCIL_TEST) + } + }, + + setMask: function (stencilMask) { + if (currentStencilMask !== stencilMask && !locked) { + gl.stencilMask(stencilMask) + currentStencilMask = stencilMask + } + }, + + setFunc: function (stencilFunc, stencilRef, stencilMask) { + if ( + currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask + ) { + gl.stencilFunc(stencilFunc, stencilRef, stencilMask) + + currentStencilFunc = stencilFunc + currentStencilRef = stencilRef + currentStencilFuncMask = stencilMask + } + }, + + setOp: function (stencilFail, stencilZFail, stencilZPass) { + if ( + currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass + ) { + gl.stencilOp(stencilFail, stencilZFail, stencilZPass) + + currentStencilFail = stencilFail + currentStencilZFail = stencilZFail + currentStencilZPass = stencilZPass + } + }, + + setLocked: function (lock) { + locked = lock + }, + + setClear: function (stencil) { + if (currentStencilClear !== stencil) { + gl.clearStencil(stencil) + currentStencilClear = stencil + } + }, + + reset: function () { + locked = false + + currentStencilMask = null + currentStencilFunc = null + currentStencilRef = null + currentStencilFuncMask = null + currentStencilFail = null + currentStencilZFail = null + currentStencilZPass = null + currentStencilClear = null + } + } + } + + // + + var colorBuffer = new ColorBuffer() + var depthBuffer = new DepthBuffer() + var stencilBuffer = new StencilBuffer() + + var maxVertexAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS) + var newAttributes = new Uint8Array(maxVertexAttributes) + var enabledAttributes = new Uint8Array(maxVertexAttributes) + var attributeDivisors = new Uint8Array(maxVertexAttributes) + + var capabilities = {} + + var compressedTextureFormats = null + + var currentProgram = null + + var currentBlending = null + var currentBlendEquation = null + var currentBlendSrc = null + var currentBlendDst = null + var currentBlendEquationAlpha = null + var currentBlendSrcAlpha = null + var currentBlendDstAlpha = null + var currentPremultipledAlpha = false + + var currentFlipSided = null + var currentCullFace = null + + var currentLineWidth = null + + var currentPolygonOffsetFactor = null + var currentPolygonOffsetUnits = null + + var maxTextures = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS) + + var lineWidthAvailable = false + var version = 0 + var glVersion = gl.getParameter(gl.VERSION) + + if (glVersion.indexOf('WebGL') !== -1) { + version = parseFloat(/^WebGL\ ([0-9])/.exec(glVersion)[1]) + lineWidthAvailable = version >= 1.0 + } else if (glVersion.indexOf('OpenGL ES') !== -1) { + version = parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(glVersion)[1]) + lineWidthAvailable = version >= 2.0 + } + + var currentTextureSlot = null + var currentBoundTextures = {} + + var currentScissor = new Vector4() + var currentViewport = new Vector4() + + function createTexture(type, target, count) { + var data = new Uint8Array(4) // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture() + + gl.bindTexture(type, texture) + gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST) + gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST) + + for (var i = 0; i < count; i++) { + gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data) + } + + return texture + } + + var emptyTextures = {} + emptyTextures[gl.TEXTURE_2D] = createTexture(gl.TEXTURE_2D, gl.TEXTURE_2D, 1) + emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture( + gl.TEXTURE_CUBE_MAP, + gl.TEXTURE_CUBE_MAP_POSITIVE_X, + 6 + ) + + // init + + colorBuffer.setClear(0, 0, 0, 1) + depthBuffer.setClear(1) + stencilBuffer.setClear(0) + + enable(gl.DEPTH_TEST) + depthBuffer.setFunc(LessEqualDepth) + + setFlipSided(false) + setCullFace(CullFaceBack) + enable(gl.CULL_FACE) + + enable(gl.BLEND) + setBlending(NormalBlending) + + // + + function initAttributes() { + for (var i = 0, l = newAttributes.length; i < l; i++) { + newAttributes[i] = 0 + } + } + + function enableAttribute(attribute) { + newAttributes[attribute] = 1 + + if (enabledAttributes[attribute] === 0) { + gl.enableVertexAttribArray(attribute) + enabledAttributes[attribute] = 1 + } + + if (attributeDivisors[attribute] !== 0) { + var extension = extensions.get('ANGLE_instanced_arrays') + + extension.vertexAttribDivisorANGLE(attribute, 0) + attributeDivisors[attribute] = 0 + } + } + + function enableAttributeAndDivisor(attribute, meshPerAttribute) { + newAttributes[attribute] = 1 + + if (enabledAttributes[attribute] === 0) { + gl.enableVertexAttribArray(attribute) + enabledAttributes[attribute] = 1 + } + + if (attributeDivisors[attribute] !== meshPerAttribute) { + var extension = extensions.get('ANGLE_instanced_arrays') + + extension.vertexAttribDivisorANGLE(attribute, meshPerAttribute) + attributeDivisors[attribute] = meshPerAttribute + } + } + + function disableUnusedAttributes() { + for (var i = 0, l = enabledAttributes.length; i !== l; ++i) { + if (enabledAttributes[i] !== newAttributes[i]) { + gl.disableVertexAttribArray(i) + enabledAttributes[i] = 0 + } + } + } + + function enable(id) { + if (capabilities[id] !== true) { + gl.enable(id) + capabilities[id] = true + } + } + + function disable(id) { + if (capabilities[id] !== false) { + gl.disable(id) + capabilities[id] = false + } + } + + function getCompressedTextureFormats() { + if (compressedTextureFormats === null) { + compressedTextureFormats = [] + + if ( + extensions.get('WEBGL_compressed_texture_pvrtc') || + extensions.get('WEBGL_compressed_texture_s3tc') || + extensions.get('WEBGL_compressed_texture_etc1') || + extensions.get('WEBGL_compressed_texture_astc') + ) { + var formats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS) + + for (var i = 0; i < formats.length; i++) { + compressedTextureFormats.push(formats[i]) + } + } + } + + return compressedTextureFormats + } + + function useProgram(program) { + if (currentProgram !== program) { + gl.useProgram(program) + + currentProgram = program + + return true + } + + return false + } + + function setBlending( + blending, + blendEquation, + blendSrc, + blendDst, + blendEquationAlpha, + blendSrcAlpha, + blendDstAlpha, + premultipliedAlpha + ) { + if (blending !== NoBlending) { + enable(gl.BLEND) + } else { + disable(gl.BLEND) + } + + if (blending !== CustomBlending) { + if (blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha) { + switch (blending) { + case AdditiveBlending: + if (premultipliedAlpha) { + gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD) + gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE) + } else { + gl.blendEquation(gl.FUNC_ADD) + gl.blendFunc(gl.SRC_ALPHA, gl.ONE) + } + break + + case SubtractiveBlending: + if (premultipliedAlpha) { + gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD) + gl.blendFuncSeparate( + gl.ZERO, + gl.ZERO, + gl.ONE_MINUS_SRC_COLOR, + gl.ONE_MINUS_SRC_ALPHA + ) + } else { + gl.blendEquation(gl.FUNC_ADD) + gl.blendFunc(gl.ZERO, gl.ONE_MINUS_SRC_COLOR) + } + break + + case MultiplyBlending: + if (premultipliedAlpha) { + gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD) + gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA) + } else { + gl.blendEquation(gl.FUNC_ADD) + gl.blendFunc(gl.ZERO, gl.SRC_COLOR) + } + break + + default: + if (premultipliedAlpha) { + gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD) + gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA) + } else { + gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD) + gl.blendFuncSeparate( + gl.SRC_ALPHA, + gl.ONE_MINUS_SRC_ALPHA, + gl.ONE, + gl.ONE_MINUS_SRC_ALPHA + ) + } + } + } + + currentBlendEquation = null + currentBlendSrc = null + currentBlendDst = null + currentBlendEquationAlpha = null + currentBlendSrcAlpha = null + currentBlendDstAlpha = null + } else { + blendEquationAlpha = blendEquationAlpha || blendEquation + blendSrcAlpha = blendSrcAlpha || blendSrc + blendDstAlpha = blendDstAlpha || blendDst + + if ( + blendEquation !== currentBlendEquation || + blendEquationAlpha !== currentBlendEquationAlpha + ) { + gl.blendEquationSeparate(utils.convert(blendEquation), utils.convert(blendEquationAlpha)) + + currentBlendEquation = blendEquation + currentBlendEquationAlpha = blendEquationAlpha + } + + if ( + blendSrc !== currentBlendSrc || + blendDst !== currentBlendDst || + blendSrcAlpha !== currentBlendSrcAlpha || + blendDstAlpha !== currentBlendDstAlpha + ) { + gl.blendFuncSeparate( + utils.convert(blendSrc), + utils.convert(blendDst), + utils.convert(blendSrcAlpha), + utils.convert(blendDstAlpha) + ) + + currentBlendSrc = blendSrc + currentBlendDst = blendDst + currentBlendSrcAlpha = blendSrcAlpha + currentBlendDstAlpha = blendDstAlpha + } + } + + currentBlending = blending + currentPremultipledAlpha = premultipliedAlpha + } + + function setMaterial(material, frontFaceCW) { + material.side === DoubleSide ? disable(gl.CULL_FACE) : enable(gl.CULL_FACE) + + var flipSided = material.side === BackSide + if (frontFaceCW) flipSided = !flipSided + + setFlipSided(flipSided) + + material.transparent === true + ? setBlending( + material.blending, + material.blendEquation, + material.blendSrc, + material.blendDst, + material.blendEquationAlpha, + material.blendSrcAlpha, + material.blendDstAlpha, + material.premultipliedAlpha + ) + : setBlending(NoBlending) + + depthBuffer.setFunc(material.depthFunc) + depthBuffer.setTest(material.depthTest) + depthBuffer.setMask(material.depthWrite) + colorBuffer.setMask(material.colorWrite) + + setPolygonOffset( + material.polygonOffset, + material.polygonOffsetFactor, + material.polygonOffsetUnits + ) + } + + // + + function setFlipSided(flipSided) { + if (currentFlipSided !== flipSided) { + if (flipSided) { + gl.frontFace(gl.CW) + } else { + gl.frontFace(gl.CCW) + } + + currentFlipSided = flipSided + } + } + + function setCullFace(cullFace) { + if (cullFace !== CullFaceNone) { + enable(gl.CULL_FACE) + + if (cullFace !== currentCullFace) { + if (cullFace === CullFaceBack) { + gl.cullFace(gl.BACK) + } else if (cullFace === CullFaceFront) { + gl.cullFace(gl.FRONT) + } else { + gl.cullFace(gl.FRONT_AND_BACK) + } + } + } else { + disable(gl.CULL_FACE) + } + + currentCullFace = cullFace + } + + function setLineWidth(width) { + if (width !== currentLineWidth) { + if (lineWidthAvailable) gl.lineWidth(width) + + currentLineWidth = width + } + } + + function setPolygonOffset(polygonOffset, factor, units) { + if (polygonOffset) { + enable(gl.POLYGON_OFFSET_FILL) + + if (currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units) { + gl.polygonOffset(factor, units) + + currentPolygonOffsetFactor = factor + currentPolygonOffsetUnits = units + } + } else { + disable(gl.POLYGON_OFFSET_FILL) + } + } + + function setScissorTest(scissorTest) { + if (scissorTest) { + enable(gl.SCISSOR_TEST) + } else { + disable(gl.SCISSOR_TEST) + } + } + + // texture + + function activeTexture(webglSlot) { + if (webglSlot === undefined) webglSlot = gl.TEXTURE0 + maxTextures - 1 + + if (currentTextureSlot !== webglSlot) { + gl.activeTexture(webglSlot) + currentTextureSlot = webglSlot + } + } + + function bindTexture(webglType, webglTexture) { + if (currentTextureSlot === null) { + activeTexture() + } + + var boundTexture = currentBoundTextures[currentTextureSlot] + + if (boundTexture === undefined) { + boundTexture = { type: undefined, texture: undefined } + currentBoundTextures[currentTextureSlot] = boundTexture + } + + if (boundTexture.type !== webglType || boundTexture.texture !== webglTexture) { + gl.bindTexture(webglType, webglTexture || emptyTextures[webglType]) + + boundTexture.type = webglType + boundTexture.texture = webglTexture + } + } + + function compressedTexImage2D() { + try { + gl.compressedTexImage2D.apply(gl, arguments) + } catch (error) { + console.error('THREE.WebGLState:', error) + } + } + + function texImage2D() { + try { + gl.texImage2D.apply(gl, arguments) + } catch (error) { + console.error('THREE.WebGLState:', error) + } + } + + // + + function scissor(scissor) { + if (currentScissor.equals(scissor) === false) { + gl.scissor(scissor.x, scissor.y, scissor.z, scissor.w) + currentScissor.copy(scissor) + } + } + + function viewport(viewport) { + if (currentViewport.equals(viewport) === false) { + gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w) + currentViewport.copy(viewport) + } + } + + // + + function reset() { + for (var i = 0; i < enabledAttributes.length; i++) { + if (enabledAttributes[i] === 1) { + gl.disableVertexAttribArray(i) + enabledAttributes[i] = 0 + } + } + + capabilities = {} + + compressedTextureFormats = null + + currentTextureSlot = null + currentBoundTextures = {} + + currentProgram = null + + currentBlending = null + + currentFlipSided = null + currentCullFace = null + + colorBuffer.reset() + depthBuffer.reset() + stencilBuffer.reset() + } + + return { + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + useProgram: useProgram, + + setBlending: setBlending, + setMaterial: setMaterial, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + scissor: scissor, + viewport: viewport, + + reset: reset + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities(gl, extensions, parameters) { + var maxAnisotropy + + function getMaxAnisotropy() { + if (maxAnisotropy !== undefined) return maxAnisotropy + + var extension = extensions.get('EXT_texture_filter_anisotropic') + + if (extension !== null) { + maxAnisotropy = gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) + } else { + maxAnisotropy = 0 + } + + return maxAnisotropy + } + + function getMaxPrecision(precision) { + if (precision === 'highp') { + if ( + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0 + ) { + return 'highp' + } + + precision = 'mediump' + } + + if (precision === 'mediump') { + if ( + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0 + ) { + return 'mediump' + } + } + + return 'lowp' + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp' + var maxPrecision = getMaxPrecision(precision) + + if (maxPrecision !== precision) { + console.warn( + 'THREE.WebGLRenderer:', + precision, + 'not supported, using', + maxPrecision, + 'instead.' + ) + precision = maxPrecision + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true + + var maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) + var maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS) + var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE) + var maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE) + + var maxAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS) + var maxVertexUniforms = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS) + var maxVaryings = gl.getParameter(gl.MAX_VARYING_VECTORS) + var maxFragmentUniforms = gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS) + + var vertexTextures = maxVertexTextures > 0 + var floatFragmentTextures = !!extensions.get('OES_texture_float') + var floatVertexTextures = vertexTextures && floatFragmentTextures + + return { + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera(fov, aspect, near, far) { + Camera.call(this) + + this.type = 'PerspectiveCamera' + + this.fov = fov !== undefined ? fov : 50 + this.zoom = 1 + + this.near = near !== undefined ? near : 0.1 + this.far = far !== undefined ? far : 2000 + this.focus = 10 + + this.aspect = aspect !== undefined ? aspect : 1 + this.view = null + + this.filmGauge = 35 // width of the film (default in millimeters) + this.filmOffset = 0 // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix() + } + + PerspectiveCamera.prototype = Object.assign(Object.create(Camera.prototype), { + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function (source, recursive) { + Camera.prototype.copy.call(this, source, recursive) + + this.fov = source.fov + this.zoom = source.zoom + + this.near = source.near + this.far = source.far + this.focus = source.focus + + this.aspect = source.aspect + this.view = source.view === null ? null : Object.assign({}, source.view) + + this.filmGauge = source.filmGauge + this.filmOffset = source.filmOffset + + return this + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function (focalLength) { + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = (0.5 * this.getFilmHeight()) / focalLength + + this.fov = _Math.RAD2DEG * 2 * Math.atan(vExtentSlope) + this.updateProjectionMatrix() + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + var vExtentSlope = Math.tan(_Math.DEG2RAD * 0.5 * this.fov) + + return (0.5 * this.getFilmHeight()) / vExtentSlope + }, + + getEffectiveFOV: function () { + return _Math.RAD2DEG * 2 * Math.atan(Math.tan(_Math.DEG2RAD * 0.5 * this.fov) / this.zoom) + }, + + getFilmWidth: function () { + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min(this.aspect, 1) + }, + + getFilmHeight: function () { + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max(this.aspect, 1) + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function (fullWidth, fullHeight, x, y, width, height) { + this.aspect = fullWidth / fullHeight + + if (this.view === null) { + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + } + } + + this.view.enabled = true + this.view.fullWidth = fullWidth + this.view.fullHeight = fullHeight + this.view.offsetX = x + this.view.offsetY = y + this.view.width = width + this.view.height = height + + this.updateProjectionMatrix() + }, + + clearViewOffset: function () { + if (this.view !== null) { + this.view.enabled = false + } + + this.updateProjectionMatrix() + }, + + updateProjectionMatrix: function () { + var near = this.near, + top = (near * Math.tan(_Math.DEG2RAD * 0.5 * this.fov)) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = -0.5 * width, + view = this.view + + if (this.view !== null && this.view.enabled) { + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight + + left += (view.offsetX * width) / fullWidth + top -= (view.offsetY * height) / fullHeight + width *= view.width / fullWidth + height *= view.height / fullHeight + } + + var skew = this.filmOffset + if (skew !== 0) left += (near * skew) / this.getFilmWidth() + + this.projectionMatrix.makePerspective(left, left + width, top, top - height, near, this.far) + }, + + toJSON: function (meta) { + var data = Object3D.prototype.toJSON.call(this, meta) + + data.object.fov = this.fov + data.object.zoom = this.zoom + + data.object.near = this.near + data.object.far = this.far + data.object.focus = this.focus + + data.object.aspect = this.aspect + + if (this.view !== null) data.object.view = Object.assign({}, this.view) + + data.object.filmGauge = this.filmGauge + data.object.filmOffset = this.filmOffset + + return data + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ArrayCamera(array) { + PerspectiveCamera.call(this) + + this.cameras = array || [] + } + + ArrayCamera.prototype = Object.assign(Object.create(PerspectiveCamera.prototype), { + constructor: ArrayCamera, + + isArrayCamera: true + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebVRManager(renderer) { + var scope = this + + var device = null + var frameData = null + + var poseTarget = null + + var standingMatrix = new Matrix4() + var standingMatrixInverse = new Matrix4() + + if (typeof window !== 'undefined' && 'VRFrameData' in window) { + frameData = new window.VRFrameData() + } + + var matrixWorldInverse = new Matrix4() + + var cameraL = new PerspectiveCamera() + cameraL.bounds = new Vector4(0.0, 0.0, 0.5, 1.0) + cameraL.layers.enable(1) + + var cameraR = new PerspectiveCamera() + cameraR.bounds = new Vector4(0.5, 0.0, 0.5, 1.0) + cameraR.layers.enable(2) + + var cameraVR = new ArrayCamera([cameraL, cameraR]) + cameraVR.layers.enable(1) + cameraVR.layers.enable(2) + + // + + var currentSize, currentPixelRatio + + function onVRDisplayPresentChange() { + if (device !== null && device.isPresenting) { + var eyeParameters = device.getEyeParameters('left') + var renderWidth = eyeParameters.renderWidth + var renderHeight = eyeParameters.renderHeight + + currentPixelRatio = renderer.getPixelRatio() + currentSize = renderer.getSize() + + renderer.setDrawingBufferSize(renderWidth * 2, renderHeight, 1) + } else if (scope.enabled) { + renderer.setDrawingBufferSize(currentSize.width, currentSize.height, currentPixelRatio) + } + } + + if (typeof window !== 'undefined') { + window.addEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false) + } + + // + + this.enabled = false + this.userHeight = 1.6 + + this.getDevice = function () { + return device + } + + this.setDevice = function (value) { + if (value !== undefined) device = value + } + + this.setPoseTarget = function (object) { + if (object !== undefined) poseTarget = object + } + + this.getCamera = function (camera) { + if (device === null) return camera + + device.depthNear = camera.near + device.depthFar = camera.far + + device.getFrameData(frameData) + + // + + var pose = frameData.pose + var poseObject = poseTarget !== null ? poseTarget : camera + + if (pose.position !== null) { + poseObject.position.fromArray(pose.position) + } else { + poseObject.position.set(0, 0, 0) + } + + if (pose.orientation !== null) { + poseObject.quaternion.fromArray(pose.orientation) + } + + var stageParameters = device.stageParameters + + if (stageParameters) { + standingMatrix.fromArray(stageParameters.sittingToStandingTransform) + } else { + standingMatrix.makeTranslation(0, scope.userHeight, 0) + } + + poseObject.position.applyMatrix4(standingMatrix) + poseObject.updateMatrixWorld() + + if (device.isPresenting === false) return camera + + // + + cameraL.near = camera.near + cameraR.near = camera.near + + cameraL.far = camera.far + cameraR.far = camera.far + + cameraVR.matrixWorld.copy(camera.matrixWorld) + cameraVR.matrixWorldInverse.copy(camera.matrixWorldInverse) + + cameraL.matrixWorldInverse.fromArray(frameData.leftViewMatrix) + cameraR.matrixWorldInverse.fromArray(frameData.rightViewMatrix) + + // TODO (mrdoob) Double check this code + + standingMatrixInverse.getInverse(standingMatrix) + + cameraL.matrixWorldInverse.multiply(standingMatrixInverse) + cameraR.matrixWorldInverse.multiply(standingMatrixInverse) + + var parent = poseObject.parent + + if (parent !== null) { + matrixWorldInverse.getInverse(parent.matrixWorld) + + cameraL.matrixWorldInverse.multiply(matrixWorldInverse) + cameraR.matrixWorldInverse.multiply(matrixWorldInverse) + } + + // envMap and Mirror needs camera.matrixWorld + + cameraL.matrixWorld.getInverse(cameraL.matrixWorldInverse) + cameraR.matrixWorld.getInverse(cameraR.matrixWorldInverse) + + cameraL.projectionMatrix.fromArray(frameData.leftProjectionMatrix) + cameraR.projectionMatrix.fromArray(frameData.rightProjectionMatrix) + + // HACK (mrdoob) + // https://github.com/w3c/webvr/issues/203 + + cameraVR.projectionMatrix.copy(cameraL.projectionMatrix) + + // + + var layers = device.getLayers() + + if (layers.length) { + var layer = layers[0] + + if (layer.leftBounds !== null && layer.leftBounds.length === 4) { + cameraL.bounds.fromArray(layer.leftBounds) + } + + if (layer.rightBounds !== null && layer.rightBounds.length === 4) { + cameraR.bounds.fromArray(layer.rightBounds) + } + } + + return cameraVR + } + + this.getStandingMatrix = function () { + return standingMatrix + } + + this.submitFrame = function () { + if (device && device.isPresenting) device.submitFrame() + } + + this.dispose = function () { + if (typeof window !== 'undefined') { + window.removeEventListener('vrdisplaypresentchange', onVRDisplayPresentChange) + } + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions(gl) { + var extensions = {} + + return { + get: function (name) { + if (extensions[name] !== undefined) { + return extensions[name] + } + + var extension + + switch (name) { + case 'WEBGL_depth_texture': + extension = + gl.getExtension('WEBGL_depth_texture') || + gl.getExtension('MOZ_WEBGL_depth_texture') || + gl.getExtension('WEBKIT_WEBGL_depth_texture') + break + + case 'EXT_texture_filter_anisotropic': + extension = + gl.getExtension('EXT_texture_filter_anisotropic') || + gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || + gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') + break + + case 'WEBGL_compressed_texture_s3tc': + extension = + gl.getExtension('WEBGL_compressed_texture_s3tc') || + gl.getExtension('MOZ_WEBGL_compressed_texture_s3tc') || + gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc') + break + + case 'WEBGL_compressed_texture_pvrtc': + extension = + gl.getExtension('WEBGL_compressed_texture_pvrtc') || + gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc') + break + + case 'WEBGL_compressed_texture_etc1': + extension = gl.getExtension('WEBGL_compressed_texture_etc1') + break + + default: + extension = gl.getExtension(name) + } + + if (extension === null) { + console.warn('THREE.WebGLRenderer: ' + name + ' extension not supported.') + } + + extensions[name] = extension + + return extension + } + } + } + + /** + * @author tschw + */ + + function WebGLClipping() { + var scope = this, + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + uniform = { value: null, needsUpdate: false } + + this.uniform = uniform + this.numPlanes = 0 + this.numIntersection = 0 + + this.init = function (planes, enableLocalClipping, camera) { + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled + + localClippingEnabled = enableLocalClipping + + globalState = projectPlanes(planes, camera, 0) + numGlobalPlanes = planes.length + + return enabled + } + + this.beginShadows = function () { + renderingShadows = true + projectPlanes(null) + } + + this.endShadows = function () { + renderingShadows = false + resetGlobalState() + } + + this.setState = function (planes, clipIntersection, clipShadows, camera, cache, fromCache) { + if ( + !localClippingEnabled || + planes === null || + planes.length === 0 || + (renderingShadows && !clipShadows) + ) { + // there's no local clipping + + if (renderingShadows) { + // there's no global clipping + + projectPlanes(null) + } else { + resetGlobalState() + } + } else { + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + dstArray = cache.clippingState || null + + uniform.value = dstArray // ensure unique state + + dstArray = projectPlanes(planes, camera, lGlobal, fromCache) + + for (var i = 0; i !== lGlobal; ++i) { + dstArray[i] = globalState[i] + } + + cache.clippingState = dstArray + this.numIntersection = clipIntersection ? this.numPlanes : 0 + this.numPlanes += nGlobal + } + } + + function resetGlobalState() { + if (uniform.value !== globalState) { + uniform.value = globalState + uniform.needsUpdate = numGlobalPlanes > 0 + } + + scope.numPlanes = numGlobalPlanes + scope.numIntersection = 0 + } + + function projectPlanes(planes, camera, dstOffset, skipTransform) { + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null + + if (nPlanes !== 0) { + dstArray = uniform.value + + if (skipTransform !== true || dstArray === null) { + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse + + viewNormalMatrix.getNormalMatrix(viewMatrix) + + if (dstArray === null || dstArray.length < flatSize) { + dstArray = new Float32Array(flatSize) + } + + for (var i = 0, i4 = dstOffset; i !== nPlanes; ++i, i4 += 4) { + plane.copy(planes[i]).applyMatrix4(viewMatrix, viewNormalMatrix) + + plane.normal.toArray(dstArray, i4) + dstArray[i4 + 3] = plane.constant + } + } + + uniform.value = dstArray + uniform.needsUpdate = true + } + + scope.numPlanes = nPlanes + + return dstArray + } + } + + /** + * @author thespite / http://www.twitter.com/thespite + */ + + function WebGLUtils(gl, extensions) { + function convert(p) { + var extension + + if (p === RepeatWrapping) return gl.REPEAT + if (p === ClampToEdgeWrapping) return gl.CLAMP_TO_EDGE + if (p === MirroredRepeatWrapping) return gl.MIRRORED_REPEAT + + if (p === NearestFilter) return gl.NEAREST + if (p === NearestMipMapNearestFilter) return gl.NEAREST_MIPMAP_NEAREST + if (p === NearestMipMapLinearFilter) return gl.NEAREST_MIPMAP_LINEAR + + if (p === LinearFilter) return gl.LINEAR + if (p === LinearMipMapNearestFilter) return gl.LINEAR_MIPMAP_NEAREST + if (p === LinearMipMapLinearFilter) return gl.LINEAR_MIPMAP_LINEAR + + if (p === UnsignedByteType) return gl.UNSIGNED_BYTE + if (p === UnsignedShort4444Type) return gl.UNSIGNED_SHORT_4_4_4_4 + if (p === UnsignedShort5551Type) return gl.UNSIGNED_SHORT_5_5_5_1 + if (p === UnsignedShort565Type) return gl.UNSIGNED_SHORT_5_6_5 + + if (p === ByteType) return gl.BYTE + if (p === ShortType) return gl.SHORT + if (p === UnsignedShortType) return gl.UNSIGNED_SHORT + if (p === IntType) return gl.INT + if (p === UnsignedIntType) return gl.UNSIGNED_INT + if (p === FloatType) return gl.FLOAT + + if (p === HalfFloatType) { + extension = extensions.get('OES_texture_half_float') + + if (extension !== null) return extension.HALF_FLOAT_OES + } + + if (p === AlphaFormat) return gl.ALPHA + if (p === RGBFormat) return gl.RGB + if (p === RGBAFormat) return gl.RGBA + if (p === LuminanceFormat) return gl.LUMINANCE + if (p === LuminanceAlphaFormat) return gl.LUMINANCE_ALPHA + if (p === DepthFormat) return gl.DEPTH_COMPONENT + if (p === DepthStencilFormat) return gl.DEPTH_STENCIL + + if (p === AddEquation) return gl.FUNC_ADD + if (p === SubtractEquation) return gl.FUNC_SUBTRACT + if (p === ReverseSubtractEquation) return gl.FUNC_REVERSE_SUBTRACT + + if (p === ZeroFactor) return gl.ZERO + if (p === OneFactor) return gl.ONE + if (p === SrcColorFactor) return gl.SRC_COLOR + if (p === OneMinusSrcColorFactor) return gl.ONE_MINUS_SRC_COLOR + if (p === SrcAlphaFactor) return gl.SRC_ALPHA + if (p === OneMinusSrcAlphaFactor) return gl.ONE_MINUS_SRC_ALPHA + if (p === DstAlphaFactor) return gl.DST_ALPHA + if (p === OneMinusDstAlphaFactor) return gl.ONE_MINUS_DST_ALPHA + + if (p === DstColorFactor) return gl.DST_COLOR + if (p === OneMinusDstColorFactor) return gl.ONE_MINUS_DST_COLOR + if (p === SrcAlphaSaturateFactor) return gl.SRC_ALPHA_SATURATE + + if ( + p === RGB_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || + p === RGBA_S3TC_DXT5_Format + ) { + extension = extensions.get('WEBGL_compressed_texture_s3tc') + + if (extension !== null) { + if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT + if (p === RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT + if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT + if (p === RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT + } + } + + if ( + p === RGB_PVRTC_4BPPV1_Format || + p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || + p === RGBA_PVRTC_2BPPV1_Format + ) { + extension = extensions.get('WEBGL_compressed_texture_pvrtc') + + if (extension !== null) { + if (p === RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG + if (p === RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG + if (p === RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG + if (p === RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG + } + } + + if (p === RGB_ETC1_Format) { + extension = extensions.get('WEBGL_compressed_texture_etc1') + + if (extension !== null) return extension.COMPRESSED_RGB_ETC1_WEBGL + } + + if ( + p === RGBA_ASTC_4x4_Format || + p === RGBA_ASTC_5x4_Format || + p === RGBA_ASTC_5x5_Format || + p === RGBA_ASTC_6x5_Format || + p === RGBA_ASTC_6x6_Format || + p === RGBA_ASTC_8x5_Format || + p === RGBA_ASTC_8x6_Format || + p === RGBA_ASTC_8x8_Format || + p === RGBA_ASTC_10x5_Format || + p === RGBA_ASTC_10x6_Format || + p === RGBA_ASTC_10x8_Format || + p === RGBA_ASTC_10x10_Format || + p === RGBA_ASTC_12x10_Format || + p === RGBA_ASTC_12x12_Format + ) { + extension = extensions.get('WEBGL_compressed_texture_astc') + + if (extension !== null) { + return p + } + } + + if (p === MinEquation || p === MaxEquation) { + extension = extensions.get('EXT_blend_minmax') + + if (extension !== null) { + if (p === MinEquation) return extension.MIN_EXT + if (p === MaxEquation) return extension.MAX_EXT + } + } + + if (p === UnsignedInt248Type) { + extension = extensions.get('WEBGL_depth_texture') + + if (extension !== null) return extension.UNSIGNED_INT_24_8_WEBGL + } + + return 0 + } + + return { convert: convert } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function UniformsCache() { + var lights = {} + + return { + get: function (light) { + if (lights[light.id] !== undefined) { + return lights[light.id] + } + + var uniforms + + switch (light.type) { + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + } + break + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + } + break + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1000 + } + break + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + } + break + + case 'RectAreaLight': + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + // TODO (abelnation): set RectAreaLight shadow uniforms + } + break + } + + lights[light.id] = uniforms + + return uniforms + } + } + } + + var count = 0 + + function WebGLLights() { + var cache = new UniformsCache() + + var state = { + id: count++, + + hash: '', + + ambient: [0, 0, 0], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + rectArea: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [] + } + + var vector3 = new Vector3() + var matrix4 = new Matrix4() + var matrix42 = new Matrix4() + + function setup(lights, shadows, camera) { + var r = 0, + g = 0, + b = 0 + + var directionalLength = 0 + var pointLength = 0 + var spotLength = 0 + var rectAreaLength = 0 + var hemiLength = 0 + + var viewMatrix = camera.matrixWorldInverse + + for (var i = 0, l = lights.length; i < l; i++) { + var light = lights[i] + + var color = light.color + var intensity = light.intensity + var distance = light.distance + + var shadowMap = light.shadow && light.shadow.map ? light.shadow.map.texture : null + + if (light.isAmbientLight) { + r += color.r * intensity + g += color.g * intensity + b += color.b * intensity + } else if (light.isDirectionalLight) { + var uniforms = cache.get(light) + + uniforms.color.copy(light.color).multiplyScalar(light.intensity) + uniforms.direction.setFromMatrixPosition(light.matrixWorld) + vector3.setFromMatrixPosition(light.target.matrixWorld) + uniforms.direction.sub(vector3) + uniforms.direction.transformDirection(viewMatrix) + + uniforms.shadow = light.castShadow + + if (light.castShadow) { + var shadow = light.shadow + + uniforms.shadowBias = shadow.bias + uniforms.shadowRadius = shadow.radius + uniforms.shadowMapSize = shadow.mapSize + } + + state.directionalShadowMap[directionalLength] = shadowMap + state.directionalShadowMatrix[directionalLength] = light.shadow.matrix + state.directional[directionalLength] = uniforms + + directionalLength++ + } else if (light.isSpotLight) { + var uniforms = cache.get(light) + + uniforms.position.setFromMatrixPosition(light.matrixWorld) + uniforms.position.applyMatrix4(viewMatrix) + + uniforms.color.copy(color).multiplyScalar(intensity) + uniforms.distance = distance + + uniforms.direction.setFromMatrixPosition(light.matrixWorld) + vector3.setFromMatrixPosition(light.target.matrixWorld) + uniforms.direction.sub(vector3) + uniforms.direction.transformDirection(viewMatrix) + + uniforms.coneCos = Math.cos(light.angle) + uniforms.penumbraCos = Math.cos(light.angle * (1 - light.penumbra)) + uniforms.decay = light.distance === 0 ? 0.0 : light.decay + + uniforms.shadow = light.castShadow + + if (light.castShadow) { + var shadow = light.shadow + + uniforms.shadowBias = shadow.bias + uniforms.shadowRadius = shadow.radius + uniforms.shadowMapSize = shadow.mapSize + } + + state.spotShadowMap[spotLength] = shadowMap + state.spotShadowMatrix[spotLength] = light.shadow.matrix + state.spot[spotLength] = uniforms + + spotLength++ + } else if (light.isRectAreaLight) { + var uniforms = cache.get(light) + + // (a) intensity is the total visible light emitted + //uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) ); + + // (b) intensity is the brightness of the light + uniforms.color.copy(color).multiplyScalar(intensity) + + uniforms.position.setFromMatrixPosition(light.matrixWorld) + uniforms.position.applyMatrix4(viewMatrix) + + // extract local rotation of light to derive width/height half vectors + matrix42.identity() + matrix4.copy(light.matrixWorld) + matrix4.premultiply(viewMatrix) + matrix42.extractRotation(matrix4) + + uniforms.halfWidth.set(light.width * 0.5, 0.0, 0.0) + uniforms.halfHeight.set(0.0, light.height * 0.5, 0.0) + + uniforms.halfWidth.applyMatrix4(matrix42) + uniforms.halfHeight.applyMatrix4(matrix42) + + // TODO (abelnation): RectAreaLight distance? + // uniforms.distance = distance; + + state.rectArea[rectAreaLength] = uniforms + + rectAreaLength++ + } else if (light.isPointLight) { + var uniforms = cache.get(light) + + uniforms.position.setFromMatrixPosition(light.matrixWorld) + uniforms.position.applyMatrix4(viewMatrix) + + uniforms.color.copy(light.color).multiplyScalar(light.intensity) + uniforms.distance = light.distance + uniforms.decay = light.distance === 0 ? 0.0 : light.decay + + uniforms.shadow = light.castShadow + + if (light.castShadow) { + var shadow = light.shadow + + uniforms.shadowBias = shadow.bias + uniforms.shadowRadius = shadow.radius + uniforms.shadowMapSize = shadow.mapSize + uniforms.shadowCameraNear = shadow.camera.near + uniforms.shadowCameraFar = shadow.camera.far + } + + state.pointShadowMap[pointLength] = shadowMap + state.pointShadowMatrix[pointLength] = light.shadow.matrix + state.point[pointLength] = uniforms + + pointLength++ + } else if (light.isHemisphereLight) { + var uniforms = cache.get(light) + + uniforms.direction.setFromMatrixPosition(light.matrixWorld) + uniforms.direction.transformDirection(viewMatrix) + uniforms.direction.normalize() + + uniforms.skyColor.copy(light.color).multiplyScalar(intensity) + uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity) + + state.hemi[hemiLength] = uniforms + + hemiLength++ + } + } + + state.ambient[0] = r + state.ambient[1] = g + state.ambient[2] = b + + state.directional.length = directionalLength + state.spot.length = spotLength + state.rectArea.length = rectAreaLength + state.point.length = pointLength + state.hemi.length = hemiLength + + state.hash = + state.id + + ',' + + directionalLength + + ',' + + pointLength + + ',' + + spotLength + + ',' + + rectAreaLength + + ',' + + hemiLength + + ',' + + shadows.length + } + + return { + setup: setup, + state: state + } + } + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WebGLRenderState() { + var lights = new WebGLLights() + + var lightsArray = [] + var shadowsArray = [] + var spritesArray = [] + + function init() { + lightsArray.length = 0 + shadowsArray.length = 0 + spritesArray.length = 0 + } + + function pushLight(light) { + lightsArray.push(light) + } + + function pushShadow(shadowLight) { + shadowsArray.push(shadowLight) + } + + function pushSprite(shadowLight) { + spritesArray.push(shadowLight) + } + + function setupLights(camera) { + lights.setup(lightsArray, shadowsArray, camera) + } + + var state = { + lightsArray: lightsArray, + shadowsArray: shadowsArray, + spritesArray: spritesArray, + + lights: lights + } + + return { + init: init, + state: state, + setupLights: setupLights, + + pushLight: pushLight, + pushShadow: pushShadow, + pushSprite: pushSprite + } + } + + function WebGLRenderStates() { + var renderStates = {} + + function get(scene, camera) { + var hash = scene.id + ',' + camera.id + + var renderState = renderStates[hash] + + if (renderState === undefined) { + renderState = new WebGLRenderState() + renderStates[hash] = renderState + } + + return renderState + } + + function dispose() { + renderStates = {} + } + + return { + get: get, + dispose: dispose + } + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer(parameters) { + console.log('THREE.WebGLRenderer', REVISION) + + parameters = parameters || {} + + var _canvas = + parameters.canvas !== undefined + ? parameters.canvas + : document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'), + _context = parameters.context !== undefined ? parameters.context : null, + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = + parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = + parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + _powerPreference = + parameters.powerPreference !== undefined ? parameters.powerPreference : 'default' + + var currentRenderList = null + var currentRenderState = null + + // public properties + + this.domElement = _canvas + this.context = null + + // clearing + + this.autoClear = true + this.autoClearColor = true + this.autoClearDepth = true + this.autoClearStencil = true + + // scene graph + + this.sortObjects = true + + // user-defined clipping + + this.clippingPlanes = [] + this.localClippingEnabled = false + + // physically based shading + + this.gammaFactor = 2.0 // for backwards compatibility + this.gammaInput = false + this.gammaOutput = false + + // physical lights + + this.physicallyCorrectLights = false + + // tone mapping + + this.toneMapping = LinearToneMapping + this.toneMappingExposure = 1.0 + this.toneMappingWhitePoint = 1.0 + + // morphs + + this.maxMorphTargets = 8 + this.maxMorphNormals = 4 + + // internal properties + + var _this = this, + _isContextLost = false, + // internal state cache + + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = -1, + _currentGeometryProgram = '', + _currentCamera = null, + _currentArrayCamera = null, + _currentViewport = new Vector4(), + _currentScissor = new Vector4(), + _currentScissorTest = null, + // + + _usedTextureUnits = 0, + // + + _width = _canvas.width, + _height = _canvas.height, + _pixelRatio = 1, + _viewport = new Vector4(0, 0, _width, _height), + _scissor = new Vector4(0, 0, _width, _height), + _scissorTest = false, + // frustum + + _frustum = new Frustum(), + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + _vector3 = new Vector3(), + // info + + _infoMemory = { + geometries: 0, + textures: 0 + }, + _infoRender = { + frame: 0, + calls: 0, + vertices: 0, + faces: 0, + points: 0 + } + + this.info = { + render: _infoRender, + memory: _infoMemory, + programs: null, + autoReset: true, + reset: resetInfo + } + + function resetInfo() { + _infoRender.frame++ + _infoRender.calls = 0 + _infoRender.vertices = 0 + _infoRender.faces = 0 + _infoRender.points = 0 + } + + function getTargetPixelRatio() { + return _currentRenderTarget === null ? _pixelRatio : 1 + } + + // initialize + + var _gl + + try { + var contextAttributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer, + powerPreference: _powerPreference + } + + // event listeners must be registered before WebGL context is created, see #12753 + + _canvas.addEventListener('webglcontextlost', onContextLost, false) + _canvas.addEventListener('webglcontextrestored', onContextRestore, false) + + _gl = + _context || + _canvas.getContext('webgl', contextAttributes) || + _canvas.getContext('experimental-webgl', contextAttributes) + + if (_gl === null) { + if (_canvas.getContext('webgl') !== null) { + throw new Error('Error creating WebGL context with your selected attributes.') + } else { + throw new Error('Error creating WebGL context.') + } + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if (_gl.getShaderPrecisionFormat === undefined) { + _gl.getShaderPrecisionFormat = function () { + return { rangeMin: 1, rangeMax: 1, precision: 1 } + } + } + } catch (error) { + console.error('THREE.WebGLRenderer: ' + error.message) + } + + var extensions, capabilities, state + var properties, textures, attributes, geometries, objects + var programCache, renderLists, renderStates + + var background, morphtargets, bufferRenderer, indexedBufferRenderer + var spriteRenderer + + var utils + + function initGLContext() { + extensions = new WebGLExtensions(_gl) + extensions.get('WEBGL_depth_texture') + extensions.get('OES_texture_float') + extensions.get('OES_texture_float_linear') + extensions.get('OES_texture_half_float') + extensions.get('OES_texture_half_float_linear') + extensions.get('OES_standard_derivatives') + extensions.get('OES_element_index_uint') + extensions.get('ANGLE_instanced_arrays') + + utils = new WebGLUtils(_gl, extensions) + + capabilities = new WebGLCapabilities(_gl, extensions, parameters) + + state = new WebGLState(_gl, extensions, utils) + state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio)) + state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio)) + + properties = new WebGLProperties() + textures = new WebGLTextures( + _gl, + extensions, + state, + properties, + capabilities, + utils, + _infoMemory, + _infoRender + ) + attributes = new WebGLAttributes(_gl) + geometries = new WebGLGeometries(_gl, attributes, _infoMemory) + objects = new WebGLObjects(geometries, _infoRender) + morphtargets = new WebGLMorphtargets(_gl) + programCache = new WebGLPrograms(_this, extensions, capabilities) + renderLists = new WebGLRenderLists() + renderStates = new WebGLRenderStates() + + background = new WebGLBackground(_this, state, geometries, _premultipliedAlpha) + + bufferRenderer = new WebGLBufferRenderer(_gl, extensions, _infoRender) + indexedBufferRenderer = new WebGLIndexedBufferRenderer(_gl, extensions, _infoRender) + + spriteRenderer = new WebGLSpriteRenderer(_this, _gl, state, textures, capabilities) + + _this.info.programs = programCache.programs + + _this.context = _gl + _this.capabilities = capabilities + _this.extensions = extensions + _this.properties = properties + _this.renderLists = renderLists + _this.state = state + } + + initGLContext() + + // vr + + var vr = new WebVRManager(_this) + + this.vr = vr + + // shadow map + + var shadowMap = new WebGLShadowMap(_this, objects, capabilities.maxTextureSize) + + this.shadowMap = shadowMap + + // API + + this.getContext = function () { + return _gl + } + + this.getContextAttributes = function () { + return _gl.getContextAttributes() + } + + this.forceContextLoss = function () { + var extension = extensions.get('WEBGL_lose_context') + if (extension) extension.loseContext() + } + + this.forceContextRestore = function () { + var extension = extensions.get('WEBGL_lose_context') + if (extension) extension.restoreContext() + } + + this.getPixelRatio = function () { + return _pixelRatio + } + + this.setPixelRatio = function (value) { + if (value === undefined) return + + _pixelRatio = value + + this.setSize(_width, _height, false) + } + + this.getSize = function () { + return { + width: _width, + height: _height + } + } + + this.setSize = function (width, height, updateStyle) { + var device = vr.getDevice() + + if (device && device.isPresenting) { + console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.") + return + } + + _width = width + _height = height + + _canvas.width = width * _pixelRatio + _canvas.height = height * _pixelRatio + + if (updateStyle !== false) { + _canvas.style.width = width + 'px' + _canvas.style.height = height + 'px' + } + + this.setViewport(0, 0, width, height) + } + + this.getDrawingBufferSize = function () { + return { + width: _width * _pixelRatio, + height: _height * _pixelRatio + } + } + + this.setDrawingBufferSize = function (width, height, pixelRatio) { + _width = width + _height = height + + _pixelRatio = pixelRatio + + _canvas.width = width * pixelRatio + _canvas.height = height * pixelRatio + + this.setViewport(0, 0, width, height) + } + + this.getCurrentViewport = function () { + return _currentViewport + } + + this.setViewport = function (x, y, width, height) { + _viewport.set(x, _height - y - height, width, height) + state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio)) + } + + this.setScissor = function (x, y, width, height) { + _scissor.set(x, _height - y - height, width, height) + state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio)) + } + + this.setScissorTest = function (boolean) { + state.setScissorTest((_scissorTest = boolean)) + } + + // Clearing + + this.getClearColor = function () { + return background.getClearColor() + } + + this.setClearColor = function () { + background.setClearColor.apply(background, arguments) + } + + this.getClearAlpha = function () { + return background.getClearAlpha() + } + + this.setClearAlpha = function () { + background.setClearAlpha.apply(background, arguments) + } + + this.clear = function (color, depth, stencil) { + var bits = 0 + + if (color === undefined || color) bits |= _gl.COLOR_BUFFER_BIT + if (depth === undefined || depth) bits |= _gl.DEPTH_BUFFER_BIT + if (stencil === undefined || stencil) bits |= _gl.STENCIL_BUFFER_BIT + + _gl.clear(bits) + } + + this.clearColor = function () { + this.clear(true, false, false) + } + + this.clearDepth = function () { + this.clear(false, true, false) + } + + this.clearStencil = function () { + this.clear(false, false, true) + } + + this.clearTarget = function (renderTarget, color, depth, stencil) { + this.setRenderTarget(renderTarget) + this.clear(color, depth, stencil) + } + + // + + this.dispose = function () { + _canvas.removeEventListener('webglcontextlost', onContextLost, false) + _canvas.removeEventListener('webglcontextrestored', onContextRestore, false) + + renderLists.dispose() + renderStates.dispose() + properties.dispose() + objects.dispose() + + vr.dispose() + + stopAnimation() + } + + // Events + + function onContextLost(event) { + event.preventDefault() + + console.log('THREE.WebGLRenderer: Context Lost.') + + _isContextLost = true + } + + function onContextRestore(/* event */) { + console.log('THREE.WebGLRenderer: Context Restored.') + + _isContextLost = false + + initGLContext() + } + + function onMaterialDispose(event) { + var material = event.target + + material.removeEventListener('dispose', onMaterialDispose) + + deallocateMaterial(material) + } + + // Buffer deallocation + + function deallocateMaterial(material) { + releaseMaterialProgramReference(material) + + properties.remove(material) + } + + function releaseMaterialProgramReference(material) { + var programInfo = properties.get(material).program + + material.program = undefined + + if (programInfo !== undefined) { + programCache.releaseProgram(programInfo) + } + } + + // Buffer rendering + + function renderObjectImmediate(object, program, material) { + object.render(function (object) { + _this.renderBufferImmediate(object, program, material) + }) + } + + this.renderBufferImmediate = function (object, program, material) { + state.initAttributes() + + var buffers = properties.get(object) + + if (object.hasPositions && !buffers.position) buffers.position = _gl.createBuffer() + if (object.hasNormals && !buffers.normal) buffers.normal = _gl.createBuffer() + if (object.hasUvs && !buffers.uv) buffers.uv = _gl.createBuffer() + if (object.hasColors && !buffers.color) buffers.color = _gl.createBuffer() + + var programAttributes = program.getAttributes() + + if (object.hasPositions) { + _gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.position) + _gl.bufferData(_gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW) + + state.enableAttribute(programAttributes.position) + _gl.vertexAttribPointer(programAttributes.position, 3, _gl.FLOAT, false, 0, 0) + } + + if (object.hasNormals) { + _gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.normal) + + if ( + !material.isMeshPhongMaterial && + !material.isMeshStandardMaterial && + !material.isMeshNormalMaterial && + material.flatShading === true + ) { + for (var i = 0, l = object.count * 3; i < l; i += 9) { + var array = object.normalArray + + var nx = (array[i + 0] + array[i + 3] + array[i + 6]) / 3 + var ny = (array[i + 1] + array[i + 4] + array[i + 7]) / 3 + var nz = (array[i + 2] + array[i + 5] + array[i + 8]) / 3 + + array[i + 0] = nx + array[i + 1] = ny + array[i + 2] = nz + + array[i + 3] = nx + array[i + 4] = ny + array[i + 5] = nz + + array[i + 6] = nx + array[i + 7] = ny + array[i + 8] = nz + } + } + + _gl.bufferData(_gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW) + + state.enableAttribute(programAttributes.normal) + + _gl.vertexAttribPointer(programAttributes.normal, 3, _gl.FLOAT, false, 0, 0) + } + + if (object.hasUvs && material.map) { + _gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.uv) + _gl.bufferData(_gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW) + + state.enableAttribute(programAttributes.uv) + + _gl.vertexAttribPointer(programAttributes.uv, 2, _gl.FLOAT, false, 0, 0) + } + + if (object.hasColors && material.vertexColors !== NoColors) { + _gl.bindBuffer(_gl.ARRAY_BUFFER, buffers.color) + _gl.bufferData(_gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW) + + state.enableAttribute(programAttributes.color) + + _gl.vertexAttribPointer(programAttributes.color, 3, _gl.FLOAT, false, 0, 0) + } + + state.disableUnusedAttributes() + + _gl.drawArrays(_gl.TRIANGLES, 0, object.count) + + object.count = 0 + } + + this.renderBufferDirect = function (camera, fog, geometry, material, object, group) { + var frontFaceCW = object.isMesh && object.matrixWorld.determinant() < 0 + + state.setMaterial(material, frontFaceCW) + + var program = setProgram(camera, fog, material, object) + var geometryProgram = geometry.id + '_' + program.id + '_' + (material.wireframe === true) + + var updateBuffers = false + + if (geometryProgram !== _currentGeometryProgram) { + _currentGeometryProgram = geometryProgram + updateBuffers = true + } + + if (object.morphTargetInfluences) { + morphtargets.update(object, geometry, material, program) + + updateBuffers = true + } + + // + + var index = geometry.index + var position = geometry.attributes.position + var rangeFactor = 1 + + if (material.wireframe === true) { + index = geometries.getWireframeAttribute(geometry) + rangeFactor = 2 + } + + var attribute + var renderer = bufferRenderer + + if (index !== null) { + attribute = attributes.get(index) + + renderer = indexedBufferRenderer + renderer.setIndex(attribute) + } + + if (updateBuffers) { + setupVertexAttributes(material, program, geometry) + + if (index !== null) { + _gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER, attribute.buffer) + } + } + + // + + var dataCount = Infinity + + if (index !== null) { + dataCount = index.count + } else if (position !== undefined) { + dataCount = position.count + } + + var rangeStart = geometry.drawRange.start * rangeFactor + var rangeCount = geometry.drawRange.count * rangeFactor + + var groupStart = group !== null ? group.start * rangeFactor : 0 + var groupCount = group !== null ? group.count * rangeFactor : Infinity + + var drawStart = Math.max(rangeStart, groupStart) + var drawEnd = Math.min(dataCount, rangeStart + rangeCount, groupStart + groupCount) - 1 + + var drawCount = Math.max(0, drawEnd - drawStart + 1) + + if (drawCount === 0) return + + // + + if (object.isMesh) { + if (material.wireframe === true) { + state.setLineWidth(material.wireframeLinewidth * getTargetPixelRatio()) + renderer.setMode(_gl.LINES) + } else { + switch (object.drawMode) { + case TrianglesDrawMode: + renderer.setMode(_gl.TRIANGLES) + break + + case TriangleStripDrawMode: + renderer.setMode(_gl.TRIANGLE_STRIP) + break + + case TriangleFanDrawMode: + renderer.setMode(_gl.TRIANGLE_FAN) + break + } + } + } else if (object.isLine) { + var lineWidth = material.linewidth + + if (lineWidth === undefined) lineWidth = 1 // Not using Line*Material + + state.setLineWidth(lineWidth * getTargetPixelRatio()) + + if (object.isLineSegments) { + renderer.setMode(_gl.LINES) + } else if (object.isLineLoop) { + renderer.setMode(_gl.LINE_LOOP) + } else { + renderer.setMode(_gl.LINE_STRIP) + } + } else if (object.isPoints) { + renderer.setMode(_gl.POINTS) + } + + if (geometry && geometry.isInstancedBufferGeometry) { + if (geometry.maxInstancedCount > 0) { + renderer.renderInstances(geometry, drawStart, drawCount) + } + } else { + renderer.render(drawStart, drawCount) + } + } + + function setupVertexAttributes(material, program, geometry, startIndex) { + if (geometry && geometry.isInstancedBufferGeometry) { + if (extensions.get('ANGLE_instanced_arrays') === null) { + console.error( + 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' + ) + return + } + } + + if (startIndex === undefined) startIndex = 0 + + state.initAttributes() + + var geometryAttributes = geometry.attributes + + var programAttributes = program.getAttributes() + + var materialDefaultAttributeValues = material.defaultAttributeValues + + for (var name in programAttributes) { + var programAttribute = programAttributes[name] + + if (programAttribute >= 0) { + var geometryAttribute = geometryAttributes[name] + + if (geometryAttribute !== undefined) { + var normalized = geometryAttribute.normalized + var size = geometryAttribute.itemSize + + var attribute = attributes.get(geometryAttribute) + + // TODO Attribute may not be available on context restore + + if (attribute === undefined) continue + + var buffer = attribute.buffer + var type = attribute.type + var bytesPerElement = attribute.bytesPerElement + + if (geometryAttribute.isInterleavedBufferAttribute) { + var data = geometryAttribute.data + var stride = data.stride + var offset = geometryAttribute.offset + + if (data && data.isInstancedInterleavedBuffer) { + state.enableAttributeAndDivisor(programAttribute, data.meshPerAttribute) + + if (geometry.maxInstancedCount === undefined) { + geometry.maxInstancedCount = data.meshPerAttribute * data.count + } + } else { + state.enableAttribute(programAttribute) + } + + _gl.bindBuffer(_gl.ARRAY_BUFFER, buffer) + _gl.vertexAttribPointer( + programAttribute, + size, + type, + normalized, + stride * bytesPerElement, + (startIndex * stride + offset) * bytesPerElement + ) + } else { + if (geometryAttribute.isInstancedBufferAttribute) { + state.enableAttributeAndDivisor( + programAttribute, + geometryAttribute.meshPerAttribute + ) + + if (geometry.maxInstancedCount === undefined) { + geometry.maxInstancedCount = + geometryAttribute.meshPerAttribute * geometryAttribute.count + } + } else { + state.enableAttribute(programAttribute) + } + + _gl.bindBuffer(_gl.ARRAY_BUFFER, buffer) + _gl.vertexAttribPointer( + programAttribute, + size, + type, + normalized, + 0, + startIndex * size * bytesPerElement + ) + } + } else if (materialDefaultAttributeValues !== undefined) { + var value = materialDefaultAttributeValues[name] + + if (value !== undefined) { + switch (value.length) { + case 2: + _gl.vertexAttrib2fv(programAttribute, value) + break + + case 3: + _gl.vertexAttrib3fv(programAttribute, value) + break + + case 4: + _gl.vertexAttrib4fv(programAttribute, value) + break + + default: + _gl.vertexAttrib1fv(programAttribute, value) + } + } + } + } + } + + state.disableUnusedAttributes() + } + + // Compile + + this.compile = function (scene, camera) { + currentRenderState = renderStates.get(scene, camera) + currentRenderState.init() + + scene.traverse(function (object) { + if (object.isLight) { + currentRenderState.pushLight(object) + + if (object.castShadow) { + currentRenderState.pushShadow(object) + } + } + }) + + currentRenderState.setupLights(camera) + + scene.traverse(function (object) { + if (object.material) { + if (Array.isArray(object.material)) { + for (var i = 0; i < object.material.length; i++) { + initMaterial(object.material[i], scene.fog, object) + } + } else { + initMaterial(object.material, scene.fog, object) + } + } + }) + } + + // Animation Loop + + var isAnimating = false + var onAnimationFrame = null + + function startAnimation() { + if (isAnimating) return + + requestAnimationLoopFrame() + + isAnimating = true + } + + function stopAnimation() { + isAnimating = false + } + + function requestAnimationLoopFrame() { + var device = vr.getDevice() + + if (device && device.isPresenting) { + device.requestAnimationFrame(animationLoop) + } else { + window.requestAnimationFrame(animationLoop) + } + } + + function animationLoop(time) { + if (isAnimating === false) return + + onAnimationFrame(time) + + requestAnimationLoopFrame() + } + + this.animate = function (callback) { + onAnimationFrame = callback + onAnimationFrame !== null ? startAnimation() : stopAnimation() + } + + // Rendering + + this.render = function (scene, camera, renderTarget, forceClear) { + if (!(camera && camera.isCamera)) { + console.error('THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.') + return + } + + if (_isContextLost) return + + // reset caching for this frame + + _currentGeometryProgram = '' + _currentMaterialId = -1 + _currentCamera = null + + // update scene graph + + if (scene.autoUpdate === true) scene.updateMatrixWorld() + + // update camera matrices and frustum + + if (camera.parent === null) camera.updateMatrixWorld() + + if (vr.enabled) { + camera = vr.getCamera(camera) + } + + // + + currentRenderState = renderStates.get(scene, camera) + currentRenderState.init() + + scene.onBeforeRender(_this, scene, camera, renderTarget) + + _projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse) + _frustum.setFromMatrix(_projScreenMatrix) + + _localClippingEnabled = this.localClippingEnabled + _clippingEnabled = _clipping.init(this.clippingPlanes, _localClippingEnabled, camera) + + currentRenderList = renderLists.get(scene, camera) + currentRenderList.init() + + projectObject(scene, camera, _this.sortObjects) + + if (_this.sortObjects === true) { + currentRenderList.sort() + } + + // + + if (_clippingEnabled) _clipping.beginShadows() + + var shadowsArray = currentRenderState.state.shadowsArray + + shadowMap.render(shadowsArray, scene, camera) + + currentRenderState.setupLights(camera) + + if (_clippingEnabled) _clipping.endShadows() + + // + + if (this.info.autoReset) this.info.reset() + + if (renderTarget === undefined) { + renderTarget = null + } + + this.setRenderTarget(renderTarget) + + // + + background.render(currentRenderList, scene, camera, forceClear) + + // render scene + + var opaqueObjects = currentRenderList.opaque + var transparentObjects = currentRenderList.transparent + + if (scene.overrideMaterial) { + var overrideMaterial = scene.overrideMaterial + + if (opaqueObjects.length) renderObjects(opaqueObjects, scene, camera, overrideMaterial) + if (transparentObjects.length) + renderObjects(transparentObjects, scene, camera, overrideMaterial) + } else { + // opaque pass (front-to-back order) + + if (opaqueObjects.length) renderObjects(opaqueObjects, scene, camera) + + // transparent pass (back-to-front order) + + if (transparentObjects.length) renderObjects(transparentObjects, scene, camera) + } + + // custom renderers + + var spritesArray = currentRenderState.state.spritesArray + + spriteRenderer.render(spritesArray, scene, camera) + + // Generate mipmap if we're using any kind of mipmap filtering + + if (renderTarget) { + textures.updateRenderTargetMipmap(renderTarget) + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.buffers.depth.setTest(true) + state.buffers.depth.setMask(true) + state.buffers.color.setMask(true) + + state.setPolygonOffset(false) + + scene.onAfterRender(_this, scene, camera) + + if (vr.enabled) { + vr.submitFrame() + } + + // _gl.finish(); + + currentRenderList = null + currentRenderState = null + } + + /* + // TODO Duplicated code (Frustum) + + var _sphere = new Sphere(); + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + */ + + function projectObject(object, camera, sortObjects) { + if (object.visible === false) return + + var visible = object.layers.test(camera.layers) + + if (visible) { + if (object.isLight) { + currentRenderState.pushLight(object) + + if (object.castShadow) { + currentRenderState.pushShadow(object) + } + } else if (object.isSprite) { + if (!object.frustumCulled || _frustum.intersectsSprite(object)) { + currentRenderState.pushSprite(object) + } + } else if (object.isImmediateRenderObject) { + if (sortObjects) { + _vector3.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix) + } + + currentRenderList.push(object, null, object.material, _vector3.z, null) + } else if (object.isMesh || object.isLine || object.isPoints) { + if (object.isSkinnedMesh) { + object.skeleton.update() + } + + if (!object.frustumCulled || _frustum.intersectsObject(object)) { + if (sortObjects) { + _vector3.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix) + } + + var geometry = objects.update(object) + var material = object.material + + if (Array.isArray(material)) { + var groups = geometry.groups + + for (var i = 0, l = groups.length; i < l; i++) { + var group = groups[i] + var groupMaterial = material[group.materialIndex] + + if (groupMaterial && groupMaterial.visible) { + currentRenderList.push(object, geometry, groupMaterial, _vector3.z, group) + } + } + } else if (material.visible) { + currentRenderList.push(object, geometry, material, _vector3.z, null) + } + } + } + } + + var children = object.children + + for (var i = 0, l = children.length; i < l; i++) { + projectObject(children[i], camera, sortObjects) + } + } + + function renderObjects(renderList, scene, camera, overrideMaterial) { + for (var i = 0, l = renderList.length; i < l; i++) { + var renderItem = renderList[i] + + var object = renderItem.object + var geometry = renderItem.geometry + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial + var group = renderItem.group + + if (camera.isArrayCamera) { + _currentArrayCamera = camera + + var cameras = camera.cameras + + for (var j = 0, jl = cameras.length; j < jl; j++) { + var camera2 = cameras[j] + + if (object.layers.test(camera2.layers)) { + var bounds = camera2.bounds + + var x = bounds.x * _width + var y = bounds.y * _height + var width = bounds.z * _width + var height = bounds.w * _height + + state.viewport(_currentViewport.set(x, y, width, height).multiplyScalar(_pixelRatio)) + + renderObject(object, scene, camera2, geometry, material, group) + } + } + } else { + _currentArrayCamera = null + + renderObject(object, scene, camera, geometry, material, group) + } + } + } + + function renderObject(object, scene, camera, geometry, material, group) { + object.onBeforeRender(_this, scene, camera, geometry, material, group) + currentRenderState = renderStates.get(scene, _currentArrayCamera || camera) + + object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld) + object.normalMatrix.getNormalMatrix(object.modelViewMatrix) + + if (object.isImmediateRenderObject) { + var frontFaceCW = object.isMesh && object.matrixWorld.determinant() < 0 + + state.setMaterial(material, frontFaceCW) + + var program = setProgram(camera, scene.fog, material, object) + + _currentGeometryProgram = '' + + renderObjectImmediate(object, program, material) + } else { + _this.renderBufferDirect(camera, scene.fog, geometry, material, object, group) + } + + object.onAfterRender(_this, scene, camera, geometry, material, group) + currentRenderState = renderStates.get(scene, _currentArrayCamera || camera) + } + + function initMaterial(material, fog, object) { + var materialProperties = properties.get(material) + + var lights = currentRenderState.state.lights + var shadowsArray = currentRenderState.state.shadowsArray + + var parameters = programCache.getParameters( + material, + lights.state, + shadowsArray, + fog, + _clipping.numPlanes, + _clipping.numIntersection, + object + ) + + var code = programCache.getProgramCode(material, parameters) + + var program = materialProperties.program + var programChange = true + + if (program === undefined) { + // new material + material.addEventListener('dispose', onMaterialDispose) + } else if (program.code !== code) { + // changed glsl or parameters + releaseMaterialProgramReference(material) + } else if (materialProperties.lightsHash !== lights.state.hash) { + properties.update(material, 'lightsHash', lights.state.hash) + programChange = false + } else if (parameters.shaderID !== undefined) { + // same glsl and uniform list + return + } else { + // only rebuild uniform list + programChange = false + } + + if (programChange) { + if (parameters.shaderID) { + var shader = ShaderLib[parameters.shaderID] + + materialProperties.shader = { + name: material.type, + uniforms: UniformsUtils.clone(shader.uniforms), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + } + } else { + materialProperties.shader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + } + } + + material.onBeforeCompile(materialProperties.shader) + + program = programCache.acquireProgram(material, materialProperties.shader, parameters, code) + + materialProperties.program = program + material.program = program + } + + var programAttributes = program.getAttributes() + + if (material.morphTargets) { + material.numSupportedMorphTargets = 0 + + for (var i = 0; i < _this.maxMorphTargets; i++) { + if (programAttributes['morphTarget' + i] >= 0) { + material.numSupportedMorphTargets++ + } + } + } + + if (material.morphNormals) { + material.numSupportedMorphNormals = 0 + + for (var i = 0; i < _this.maxMorphNormals; i++) { + if (programAttributes['morphNormal' + i] >= 0) { + material.numSupportedMorphNormals++ + } + } + } + + var uniforms = materialProperties.shader.uniforms + + if ( + (!material.isShaderMaterial && !material.isRawShaderMaterial) || + material.clipping === true + ) { + materialProperties.numClippingPlanes = _clipping.numPlanes + materialProperties.numIntersection = _clipping.numIntersection + uniforms.clippingPlanes = _clipping.uniform + } + + materialProperties.fog = fog + + // store the light setup it was created for + + materialProperties.lightsHash = lights.state.hash + + if (material.lights) { + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = lights.state.ambient + uniforms.directionalLights.value = lights.state.directional + uniforms.spotLights.value = lights.state.spot + uniforms.rectAreaLights.value = lights.state.rectArea + uniforms.pointLights.value = lights.state.point + uniforms.hemisphereLights.value = lights.state.hemi + + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix + uniforms.spotShadowMap.value = lights.state.spotShadowMap + uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix + uniforms.pointShadowMap.value = lights.state.pointShadowMap + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix + // TODO (abelnation): add area lights shadow info to uniforms + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = WebGLUniforms.seqWithValue(progUniforms.seq, uniforms) + + materialProperties.uniformsList = uniformsList + } + + function setProgram(camera, fog, material, object) { + _usedTextureUnits = 0 + + var materialProperties = properties.get(material) + var lights = currentRenderState.state.lights + + if (_clippingEnabled) { + if (_localClippingEnabled || camera !== _currentCamera) { + var useCache = camera === _currentCamera && material.id === _currentMaterialId + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, + material.clipIntersection, + material.clipShadows, + camera, + materialProperties, + useCache + ) + } + } + + if (material.needsUpdate === false) { + if (materialProperties.program === undefined) { + material.needsUpdate = true + } else if (material.fog && materialProperties.fog !== fog) { + material.needsUpdate = true + } else if (material.lights && materialProperties.lightsHash !== lights.state.hash) { + material.needsUpdate = true + } else if ( + materialProperties.numClippingPlanes !== undefined && + (materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection) + ) { + material.needsUpdate = true + } + } + + if (material.needsUpdate) { + initMaterial(material, fog, object) + material.needsUpdate = false + } + + var refreshProgram = false + var refreshMaterial = false + var refreshLights = false + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.shader.uniforms + + if (state.useProgram(program.program)) { + refreshProgram = true + refreshMaterial = true + refreshLights = true + } + + if (material.id !== _currentMaterialId) { + _currentMaterialId = material.id + + refreshMaterial = true + } + + if (refreshProgram || camera !== _currentCamera) { + p_uniforms.setValue(_gl, 'projectionMatrix', camera.projectionMatrix) + + if (capabilities.logarithmicDepthBuffer) { + p_uniforms.setValue(_gl, 'logDepthBufFC', 2.0 / (Math.log(camera.far + 1.0) / Math.LN2)) + } + + // Avoid unneeded uniform updates per ArrayCamera's sub-camera + + if (_currentCamera !== (_currentArrayCamera || camera)) { + _currentCamera = _currentArrayCamera || camera + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true // set to true on material change + refreshLights = true // remains set until update done + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( + material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap + ) { + var uCamPos = p_uniforms.map.cameraPosition + + if (uCamPos !== undefined) { + uCamPos.setValue(_gl, _vector3.setFromMatrixPosition(camera.matrixWorld)) + } + } + + if ( + material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning + ) { + p_uniforms.setValue(_gl, 'viewMatrix', camera.matrixWorldInverse) + } + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if (material.skinning) { + p_uniforms.setOptional(_gl, object, 'bindMatrix') + p_uniforms.setOptional(_gl, object, 'bindMatrixInverse') + + var skeleton = object.skeleton + + if (skeleton) { + var bones = skeleton.bones + + if (capabilities.floatVertexTextures) { + if (skeleton.boneTexture === undefined) { + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + var size = Math.sqrt(bones.length * 4) // 4 pixels needed for 1 matrix + size = _Math.ceilPowerOfTwo(size) + size = Math.max(size, 4) + + var boneMatrices = new Float32Array(size * size * 4) // 4 floats per RGBA pixel + boneMatrices.set(skeleton.boneMatrices) // copy current values + + var boneTexture = new DataTexture(boneMatrices, size, size, RGBAFormat, FloatType) + boneTexture.needsUpdate = true + + skeleton.boneMatrices = boneMatrices + skeleton.boneTexture = boneTexture + skeleton.boneTextureSize = size + } + + p_uniforms.setValue(_gl, 'boneTexture', skeleton.boneTexture) + p_uniforms.setValue(_gl, 'boneTextureSize', skeleton.boneTextureSize) + } else { + p_uniforms.setOptional(_gl, skeleton, 'boneMatrices') + } + } + } + + if (refreshMaterial) { + p_uniforms.setValue(_gl, 'toneMappingExposure', _this.toneMappingExposure) + p_uniforms.setValue(_gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint) + + if (material.lights) { + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate(m_uniforms, refreshLights) + } + + // refresh uniforms common to several materials + + if (fog && material.fog) { + refreshUniformsFog(m_uniforms, fog) + } + + if (material.isMeshBasicMaterial) { + refreshUniformsCommon(m_uniforms, material) + } else if (material.isMeshLambertMaterial) { + refreshUniformsCommon(m_uniforms, material) + refreshUniformsLambert(m_uniforms, material) + } else if (material.isMeshPhongMaterial) { + refreshUniformsCommon(m_uniforms, material) + + if (material.isMeshToonMaterial) { + refreshUniformsToon(m_uniforms, material) + } else { + refreshUniformsPhong(m_uniforms, material) + } + } else if (material.isMeshStandardMaterial) { + refreshUniformsCommon(m_uniforms, material) + + if (material.isMeshPhysicalMaterial) { + refreshUniformsPhysical(m_uniforms, material) + } else { + refreshUniformsStandard(m_uniforms, material) + } + } else if (material.isMeshDepthMaterial) { + refreshUniformsCommon(m_uniforms, material) + refreshUniformsDepth(m_uniforms, material) + } else if (material.isMeshDistanceMaterial) { + refreshUniformsCommon(m_uniforms, material) + refreshUniformsDistance(m_uniforms, material) + } else if (material.isMeshNormalMaterial) { + refreshUniformsCommon(m_uniforms, material) + refreshUniformsNormal(m_uniforms, material) + } else if (material.isLineBasicMaterial) { + refreshUniformsLine(m_uniforms, material) + + if (material.isLineDashedMaterial) { + refreshUniformsDash(m_uniforms, material) + } + } else if (material.isPointsMaterial) { + refreshUniformsPoints(m_uniforms, material) + } else if (material.isShadowMaterial) { + m_uniforms.color.value = material.color + m_uniforms.opacity.value = material.opacity + } + + // RectAreaLight Texture + // TODO (mrdoob): Find a nicer implementation + + if (m_uniforms.ltc_1 !== undefined) m_uniforms.ltc_1.value = UniformsLib.LTC_1 + if (m_uniforms.ltc_2 !== undefined) m_uniforms.ltc_2.value = UniformsLib.LTC_2 + + WebGLUniforms.upload(_gl, materialProperties.uniformsList, m_uniforms, _this) + } + + if (material.isShaderMaterial && material.uniformsNeedUpdate === true) { + WebGLUniforms.upload(_gl, materialProperties.uniformsList, m_uniforms, _this) + material.uniformsNeedUpdate = false + } + + // common matrices + + p_uniforms.setValue(_gl, 'modelViewMatrix', object.modelViewMatrix) + p_uniforms.setValue(_gl, 'normalMatrix', object.normalMatrix) + p_uniforms.setValue(_gl, 'modelMatrix', object.matrixWorld) + + return program + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon(uniforms, material) { + uniforms.opacity.value = material.opacity + + if (material.color) { + uniforms.diffuse.value = material.color + } + + if (material.emissive) { + uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity) + } + + if (material.map) { + uniforms.map.value = material.map + } + + if (material.alphaMap) { + uniforms.alphaMap.value = material.alphaMap + } + + if (material.specularMap) { + uniforms.specularMap.value = material.specularMap + } + + if (material.envMap) { + uniforms.envMap.value = material.envMap + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = !(material.envMap && material.envMap.isCubeTexture) ? 1 : -1 + + uniforms.reflectivity.value = material.reflectivity + uniforms.refractionRatio.value = material.refractionRatio + } + + if (material.lightMap) { + uniforms.lightMap.value = material.lightMap + uniforms.lightMapIntensity.value = material.lightMapIntensity + } + + if (material.aoMap) { + uniforms.aoMap.value = material.aoMap + uniforms.aoMapIntensity.value = material.aoMapIntensity + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap + + if (material.map) { + uvScaleMap = material.map + } else if (material.specularMap) { + uvScaleMap = material.specularMap + } else if (material.displacementMap) { + uvScaleMap = material.displacementMap + } else if (material.normalMap) { + uvScaleMap = material.normalMap + } else if (material.bumpMap) { + uvScaleMap = material.bumpMap + } else if (material.roughnessMap) { + uvScaleMap = material.roughnessMap + } else if (material.metalnessMap) { + uvScaleMap = material.metalnessMap + } else if (material.alphaMap) { + uvScaleMap = material.alphaMap + } else if (material.emissiveMap) { + uvScaleMap = material.emissiveMap + } + + if (uvScaleMap !== undefined) { + // backwards compatibility + if (uvScaleMap.isWebGLRenderTarget) { + uvScaleMap = uvScaleMap.texture + } + + if (uvScaleMap.matrixAutoUpdate === true) { + var offset = uvScaleMap.offset + var repeat = uvScaleMap.repeat + var rotation = uvScaleMap.rotation + var center = uvScaleMap.center + + uvScaleMap.matrix.setUvTransform( + offset.x, + offset.y, + repeat.x, + repeat.y, + rotation, + center.x, + center.y + ) + } + + uniforms.uvTransform.value.copy(uvScaleMap.matrix) + } + } + + function refreshUniformsLine(uniforms, material) { + uniforms.diffuse.value = material.color + uniforms.opacity.value = material.opacity + } + + function refreshUniformsDash(uniforms, material) { + uniforms.dashSize.value = material.dashSize + uniforms.totalSize.value = material.dashSize + material.gapSize + uniforms.scale.value = material.scale + } + + function refreshUniformsPoints(uniforms, material) { + uniforms.diffuse.value = material.color + uniforms.opacity.value = material.opacity + uniforms.size.value = material.size * _pixelRatio + uniforms.scale.value = _height * 0.5 + + uniforms.map.value = material.map + + if (material.map !== null) { + if (material.map.matrixAutoUpdate === true) { + var offset = material.map.offset + var repeat = material.map.repeat + var rotation = material.map.rotation + var center = material.map.center + + material.map.matrix.setUvTransform( + offset.x, + offset.y, + repeat.x, + repeat.y, + rotation, + center.x, + center.y + ) + } + + uniforms.uvTransform.value.copy(material.map.matrix) + } + } + + function refreshUniformsFog(uniforms, fog) { + uniforms.fogColor.value = fog.color + + if (fog.isFog) { + uniforms.fogNear.value = fog.near + uniforms.fogFar.value = fog.far + } else if (fog.isFogExp2) { + uniforms.fogDensity.value = fog.density + } + } + + function refreshUniformsLambert(uniforms, material) { + if (material.emissiveMap) { + uniforms.emissiveMap.value = material.emissiveMap + } + } + + function refreshUniformsPhong(uniforms, material) { + uniforms.specular.value = material.specular + uniforms.shininess.value = Math.max(material.shininess, 1e-4) // to prevent pow( 0.0, 0.0 ) + + if (material.emissiveMap) { + uniforms.emissiveMap.value = material.emissiveMap + } + + if (material.bumpMap) { + uniforms.bumpMap.value = material.bumpMap + uniforms.bumpScale.value = material.bumpScale + } + + if (material.normalMap) { + uniforms.normalMap.value = material.normalMap + uniforms.normalScale.value.copy(material.normalScale) + } + + if (material.displacementMap) { + uniforms.displacementMap.value = material.displacementMap + uniforms.displacementScale.value = material.displacementScale + uniforms.displacementBias.value = material.displacementBias + } + } + + function refreshUniformsToon(uniforms, material) { + refreshUniformsPhong(uniforms, material) + + if (material.gradientMap) { + uniforms.gradientMap.value = material.gradientMap + } + } + + function refreshUniformsStandard(uniforms, material) { + uniforms.roughness.value = material.roughness + uniforms.metalness.value = material.metalness + + if (material.roughnessMap) { + uniforms.roughnessMap.value = material.roughnessMap + } + + if (material.metalnessMap) { + uniforms.metalnessMap.value = material.metalnessMap + } + + if (material.emissiveMap) { + uniforms.emissiveMap.value = material.emissiveMap + } + + if (material.bumpMap) { + uniforms.bumpMap.value = material.bumpMap + uniforms.bumpScale.value = material.bumpScale + } + + if (material.normalMap) { + uniforms.normalMap.value = material.normalMap + uniforms.normalScale.value.copy(material.normalScale) + } + + if (material.displacementMap) { + uniforms.displacementMap.value = material.displacementMap + uniforms.displacementScale.value = material.displacementScale + uniforms.displacementBias.value = material.displacementBias + } + + if (material.envMap) { + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity + } + } + + function refreshUniformsPhysical(uniforms, material) { + uniforms.clearCoat.value = material.clearCoat + uniforms.clearCoatRoughness.value = material.clearCoatRoughness + + refreshUniformsStandard(uniforms, material) + } + + function refreshUniformsDepth(uniforms, material) { + if (material.displacementMap) { + uniforms.displacementMap.value = material.displacementMap + uniforms.displacementScale.value = material.displacementScale + uniforms.displacementBias.value = material.displacementBias + } + } + + function refreshUniformsDistance(uniforms, material) { + if (material.displacementMap) { + uniforms.displacementMap.value = material.displacementMap + uniforms.displacementScale.value = material.displacementScale + uniforms.displacementBias.value = material.displacementBias + } + + uniforms.referencePosition.value.copy(material.referencePosition) + uniforms.nearDistance.value = material.nearDistance + uniforms.farDistance.value = material.farDistance + } + + function refreshUniformsNormal(uniforms, material) { + if (material.bumpMap) { + uniforms.bumpMap.value = material.bumpMap + uniforms.bumpScale.value = material.bumpScale + } + + if (material.normalMap) { + uniforms.normalMap.value = material.normalMap + uniforms.normalScale.value.copy(material.normalScale) + } + + if (material.displacementMap) { + uniforms.displacementMap.value = material.displacementMap + uniforms.displacementScale.value = material.displacementScale + uniforms.displacementBias.value = material.displacementBias + } + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate(uniforms, value) { + uniforms.ambientLightColor.needsUpdate = value + + uniforms.directionalLights.needsUpdate = value + uniforms.pointLights.needsUpdate = value + uniforms.spotLights.needsUpdate = value + uniforms.rectAreaLights.needsUpdate = value + uniforms.hemisphereLights.needsUpdate = value + } + + // Textures + + function allocTextureUnit() { + var textureUnit = _usedTextureUnits + + if (textureUnit >= capabilities.maxTextures) { + console.warn( + 'THREE.WebGLRenderer: Trying to use ' + + textureUnit + + ' texture units while this GPU supports only ' + + capabilities.maxTextures + ) + } + + _usedTextureUnits += 1 + + return textureUnit + } + + this.allocTextureUnit = allocTextureUnit + + // this.setTexture2D = setTexture2D; + this.setTexture2D = (function () { + var warned = false + + // backwards compatibility: peel texture.texture + return function setTexture2D(texture, slot) { + if (texture && texture.isWebGLRenderTarget) { + if (!warned) { + console.warn( + "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." + ) + warned = true + } + + texture = texture.texture + } + + textures.setTexture2D(texture, slot) + } + })() + + this.setTexture = (function () { + var warned = false + + return function setTexture(texture, slot) { + if (!warned) { + console.warn('THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.') + warned = true + } + + textures.setTexture2D(texture, slot) + } + })() + + this.setTextureCube = (function () { + var warned = false + + return function setTextureCube(texture, slot) { + // backwards compatibility: peel texture.texture + if (texture && texture.isWebGLRenderTargetCube) { + if (!warned) { + console.warn( + "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." + ) + warned = true + } + + texture = texture.texture + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( + (texture && texture.isCubeTexture) || + (Array.isArray(texture.image) && texture.image.length === 6) + ) { + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube(texture, slot) + } else { + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic(texture, slot) + } + } + })() + + this.getRenderTarget = function () { + return _currentRenderTarget + } + + this.setRenderTarget = function (renderTarget) { + _currentRenderTarget = renderTarget + + if (renderTarget && properties.get(renderTarget).__webglFramebuffer === undefined) { + textures.setupRenderTarget(renderTarget) + } + + var framebuffer = null + var isCube = false + + if (renderTarget) { + var __webglFramebuffer = properties.get(renderTarget).__webglFramebuffer + + if (renderTarget.isWebGLRenderTargetCube) { + framebuffer = __webglFramebuffer[renderTarget.activeCubeFace] + isCube = true + } else { + framebuffer = __webglFramebuffer + } + + _currentViewport.copy(renderTarget.viewport) + _currentScissor.copy(renderTarget.scissor) + _currentScissorTest = renderTarget.scissorTest + } else { + _currentViewport.copy(_viewport).multiplyScalar(_pixelRatio) + _currentScissor.copy(_scissor).multiplyScalar(_pixelRatio) + _currentScissorTest = _scissorTest + } + + if (_currentFramebuffer !== framebuffer) { + _gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer) + _currentFramebuffer = framebuffer + } + + state.viewport(_currentViewport) + state.scissor(_currentScissor) + state.setScissorTest(_currentScissorTest) + + if (isCube) { + var textureProperties = properties.get(renderTarget.texture) + _gl.framebufferTexture2D( + _gl.FRAMEBUFFER, + _gl.COLOR_ATTACHMENT0, + _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, + textureProperties.__webglTexture, + renderTarget.activeMipMapLevel + ) + } + } + + this.readRenderTargetPixels = function (renderTarget, x, y, width, height, buffer) { + if (!(renderTarget && renderTarget.isWebGLRenderTarget)) { + console.error( + 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' + ) + return + } + + var framebuffer = properties.get(renderTarget).__webglFramebuffer + + if (framebuffer) { + var restore = false + + if (framebuffer !== _currentFramebuffer) { + _gl.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer) + + restore = true + } + + try { + var texture = renderTarget.texture + var textureFormat = texture.format + var textureType = texture.type + + if ( + textureFormat !== RGBAFormat && + utils.convert(textureFormat) !== _gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_FORMAT) + ) { + console.error( + 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' + ) + return + } + + if ( + textureType !== UnsignedByteType && + utils.convert(textureType) !== _gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE) && // IE11, Edge and Chrome Mac < 52 (#9513) + !( + textureType === FloatType && + (extensions.get('OES_texture_float') || extensions.get('WEBGL_color_buffer_float')) + ) && // Chrome Mac >= 52 and Firefox + !(textureType === HalfFloatType && extensions.get('EXT_color_buffer_half_float')) + ) { + console.error( + 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' + ) + return + } + + if (_gl.checkFramebufferStatus(_gl.FRAMEBUFFER) === _gl.FRAMEBUFFER_COMPLETE) { + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( + x >= 0 && + x <= renderTarget.width - width && + y >= 0 && + y <= renderTarget.height - height + ) { + _gl.readPixels( + x, + y, + width, + height, + utils.convert(textureFormat), + utils.convert(textureType), + buffer + ) + } + } else { + console.error( + 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' + ) + } + } finally { + if (restore) { + _gl.bindFramebuffer(_gl.FRAMEBUFFER, _currentFramebuffer) + } + } + } + } + + this.copyFramebufferToTexture = function (position, texture, level) { + var width = texture.image.width + var height = texture.image.height + var internalFormat = utils.convert(texture.format) + + this.setTexture2D(texture, 0) + + _gl.copyTexImage2D( + _gl.TEXTURE_2D, + level || 0, + internalFormat, + position.x, + position.y, + width, + height, + 0 + ) + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2(color, density) { + this.name = '' + + this.color = new Color(color) + this.density = density !== undefined ? density : 0.00025 + } + + FogExp2.prototype.isFogExp2 = true + + FogExp2.prototype.clone = function () { + return new FogExp2(this.color.getHex(), this.density) + } + + FogExp2.prototype.toJSON = function (/* meta */) { + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog(color, near, far) { + this.name = '' + + this.color = new Color(color) + + this.near = near !== undefined ? near : 1 + this.far = far !== undefined ? far : 1000 + } + + Fog.prototype.isFog = true + + Fog.prototype.clone = function () { + return new Fog(this.color.getHex(), this.near, this.far) + } + + Fog.prototype.toJSON = function (/* meta */) { + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene() { + Object3D.call(this) + + this.type = 'Scene' + + this.background = null + this.fog = null + this.overrideMaterial = null + + this.autoUpdate = true // checked by the renderer + } + + Scene.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Scene, + + copy: function (source, recursive) { + Object3D.prototype.copy.call(this, source, recursive) + + if (source.background !== null) this.background = source.background.clone() + if (source.fog !== null) this.fog = source.fog.clone() + if (source.overrideMaterial !== null) this.overrideMaterial = source.overrideMaterial.clone() + + this.autoUpdate = source.autoUpdate + this.matrixAutoUpdate = source.matrixAutoUpdate + + return this + }, + + toJSON: function (meta) { + var data = Object3D.prototype.toJSON.call(this, meta) + + if (this.background !== null) data.object.background = this.background.toJSON(meta) + if (this.fog !== null) data.object.fog = this.fog.toJSON() + + return data + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial(parameters) { + Material.call(this) + + this.type = 'SpriteMaterial' + + this.color = new Color(0xffffff) + this.map = null + + this.rotation = 0 + + this.fog = false + this.lights = false + + this.setValues(parameters) + } + + SpriteMaterial.prototype = Object.create(Material.prototype) + SpriteMaterial.prototype.constructor = SpriteMaterial + SpriteMaterial.prototype.isSpriteMaterial = true + + SpriteMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.color.copy(source.color) + this.map = source.map + + this.rotation = source.rotation + + return this + } + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite(material) { + Object3D.call(this) + + this.type = 'Sprite' + + this.material = material !== undefined ? material : new SpriteMaterial() + + this.center = new Vector2(0.5, 0.5) + } + + Sprite.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Sprite, + + isSprite: true, + + raycast: (function () { + var intersectPoint = new Vector3() + var worldPosition = new Vector3() + var worldScale = new Vector3() + + return function raycast(raycaster, intersects) { + worldPosition.setFromMatrixPosition(this.matrixWorld) + raycaster.ray.closestPointToPoint(worldPosition, intersectPoint) + + worldScale.setFromMatrixScale(this.matrixWorld) + var guessSizeSq = (worldScale.x * worldScale.y) / 4 + + if (worldPosition.distanceToSquared(intersectPoint) > guessSizeSq) return + + var distance = raycaster.ray.origin.distanceTo(intersectPoint) + + if (distance < raycaster.near || distance > raycaster.far) return + + intersects.push({ + distance: distance, + point: intersectPoint.clone(), + face: null, + object: this + }) + } + })(), + + clone: function () { + return new this.constructor(this.material).copy(this) + }, + + copy: function (source) { + Object3D.prototype.copy.call(this, source) + + if (source.center !== undefined) this.center.copy(source.center) + + return this + } + }) + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + Object3D.call(this) + + this.type = 'LOD' + + Object.defineProperties(this, { + levels: { + enumerable: true, + value: [] + } + }) + } + + LOD.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: LOD, + + copy: function (source) { + Object3D.prototype.copy.call(this, source, false) + + var levels = source.levels + + for (var i = 0, l = levels.length; i < l; i++) { + var level = levels[i] + + this.addLevel(level.object.clone(), level.distance) + } + + return this + }, + + addLevel: function (object, distance) { + if (distance === undefined) distance = 0 + + distance = Math.abs(distance) + + var levels = this.levels + + for (var l = 0; l < levels.length; l++) { + if (distance < levels[l].distance) { + break + } + } + + levels.splice(l, 0, { distance: distance, object: object }) + + this.add(object) + }, + + getObjectForDistance: function (distance) { + var levels = this.levels + + for (var i = 1, l = levels.length; i < l; i++) { + if (distance < levels[i].distance) { + break + } + } + + return levels[i - 1].object + }, + + raycast: (function () { + var matrixPosition = new Vector3() + + return function raycast(raycaster, intersects) { + matrixPosition.setFromMatrixPosition(this.matrixWorld) + + var distance = raycaster.ray.origin.distanceTo(matrixPosition) + + this.getObjectForDistance(distance).raycast(raycaster, intersects) + } + })(), + + update: (function () { + var v1 = new Vector3() + var v2 = new Vector3() + + return function update(camera) { + var levels = this.levels + + if (levels.length > 1) { + v1.setFromMatrixPosition(camera.matrixWorld) + v2.setFromMatrixPosition(this.matrixWorld) + + var distance = v1.distanceTo(v2) + + levels[0].object.visible = true + + for (var i = 1, l = levels.length; i < l; i++) { + if (distance >= levels[i].distance) { + levels[i - 1].object.visible = false + levels[i].object.visible = true + } else { + break + } + } + + for (; i < l; i++) { + levels[i].object.visible = false + } + } + } + })(), + + toJSON: function (meta) { + var data = Object3D.prototype.toJSON.call(this, meta) + + data.object.levels = [] + + var levels = this.levels + + for (var i = 0, l = levels.length; i < l; i++) { + var level = levels[i] + + data.object.levels.push({ + object: level.object.uuid, + distance: level.distance + }) + } + + return data + } + }) + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton(bones, boneInverses) { + // copy the bone array + + bones = bones || [] + + this.bones = bones.slice(0) + this.boneMatrices = new Float32Array(this.bones.length * 16) + + // use the supplied bone inverses or calculate the inverses + + if (boneInverses === undefined) { + this.calculateInverses() + } else { + if (this.bones.length === boneInverses.length) { + this.boneInverses = boneInverses.slice(0) + } else { + console.warn('THREE.Skeleton boneInverses is the wrong length.') + + this.boneInverses = [] + + for (var i = 0, il = this.bones.length; i < il; i++) { + this.boneInverses.push(new Matrix4()) + } + } + } + } + + Object.assign(Skeleton.prototype, { + calculateInverses: function () { + this.boneInverses = [] + + for (var i = 0, il = this.bones.length; i < il; i++) { + var inverse = new Matrix4() + + if (this.bones[i]) { + inverse.getInverse(this.bones[i].matrixWorld) + } + + this.boneInverses.push(inverse) + } + }, + + pose: function () { + var bone, i, il + + // recover the bind-time world matrices + + for (i = 0, il = this.bones.length; i < il; i++) { + bone = this.bones[i] + + if (bone) { + bone.matrixWorld.getInverse(this.boneInverses[i]) + } + } + + // compute the local matrices, positions, rotations and scales + + for (i = 0, il = this.bones.length; i < il; i++) { + bone = this.bones[i] + + if (bone) { + if (bone.parent && bone.parent.isBone) { + bone.matrix.getInverse(bone.parent.matrixWorld) + bone.matrix.multiply(bone.matrixWorld) + } else { + bone.matrix.copy(bone.matrixWorld) + } + + bone.matrix.decompose(bone.position, bone.quaternion, bone.scale) + } + } + }, + + update: (function () { + var offsetMatrix = new Matrix4() + var identityMatrix = new Matrix4() + + return function update() { + var bones = this.bones + var boneInverses = this.boneInverses + var boneMatrices = this.boneMatrices + var boneTexture = this.boneTexture + + // flatten bone matrices to array + + for (var i = 0, il = bones.length; i < il; i++) { + // compute the offset between the current and the original transform + + var matrix = bones[i] ? bones[i].matrixWorld : identityMatrix + + offsetMatrix.multiplyMatrices(matrix, boneInverses[i]) + offsetMatrix.toArray(boneMatrices, i * 16) + } + + if (boneTexture !== undefined) { + boneTexture.needsUpdate = true + } + } + })(), + + clone: function () { + return new Skeleton(this.bones, this.boneInverses) + }, + + getBoneByName: function (name) { + for (var i = 0, il = this.bones.length; i < il; i++) { + var bone = this.bones[i] + + if (bone.name === name) { + return bone + } + } + + return undefined + } + }) + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone() { + Object3D.call(this) + + this.type = 'Bone' + } + + Bone.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Bone, + + isBone: true + }) + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh(geometry, material) { + Mesh.call(this, geometry, material) + + this.type = 'SkinnedMesh' + + this.bindMode = 'attached' + this.bindMatrix = new Matrix4() + this.bindMatrixInverse = new Matrix4() + + var bones = this.initBones() + var skeleton = new Skeleton(bones) + + this.bind(skeleton, this.matrixWorld) + + this.normalizeSkinWeights() + } + + SkinnedMesh.prototype = Object.assign(Object.create(Mesh.prototype), { + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + initBones: function () { + var bones = [], + bone, + gbone + var i, il + + if (this.geometry && this.geometry.bones !== undefined) { + // first, create array of 'Bone' objects from geometry data + + for (i = 0, il = this.geometry.bones.length; i < il; i++) { + gbone = this.geometry.bones[i] + + // create new 'Bone' object + + bone = new Bone() + bones.push(bone) + + // apply values + + bone.name = gbone.name + bone.position.fromArray(gbone.pos) + bone.quaternion.fromArray(gbone.rotq) + if (gbone.scl !== undefined) bone.scale.fromArray(gbone.scl) + } + + // second, create bone hierarchy + + for (i = 0, il = this.geometry.bones.length; i < il; i++) { + gbone = this.geometry.bones[i] + + if (gbone.parent !== -1 && gbone.parent !== null && bones[gbone.parent] !== undefined) { + // subsequent bones in the hierarchy + + bones[gbone.parent].add(bones[i]) + } else { + // topmost bone, immediate child of the skinned mesh + + this.add(bones[i]) + } + } + } + + // now the bones are part of the scene graph and children of the skinned mesh. + // let's update the corresponding matrices + + this.updateMatrixWorld(true) + + return bones + }, + + bind: function (skeleton, bindMatrix) { + this.skeleton = skeleton + + if (bindMatrix === undefined) { + this.updateMatrixWorld(true) + + this.skeleton.calculateInverses() + + bindMatrix = this.matrixWorld + } + + this.bindMatrix.copy(bindMatrix) + this.bindMatrixInverse.getInverse(bindMatrix) + }, + + pose: function () { + this.skeleton.pose() + }, + + normalizeSkinWeights: function () { + var scale, i + + if (this.geometry && this.geometry.isGeometry) { + for (i = 0; i < this.geometry.skinWeights.length; i++) { + var sw = this.geometry.skinWeights[i] + + scale = 1.0 / sw.manhattanLength() + + if (scale !== Infinity) { + sw.multiplyScalar(scale) + } else { + sw.set(1, 0, 0, 0) // do something reasonable + } + } + } else if (this.geometry && this.geometry.isBufferGeometry) { + var vec = new Vector4() + + var skinWeight = this.geometry.attributes.skinWeight + + for (i = 0; i < skinWeight.count; i++) { + vec.x = skinWeight.getX(i) + vec.y = skinWeight.getY(i) + vec.z = skinWeight.getZ(i) + vec.w = skinWeight.getW(i) + + scale = 1.0 / vec.manhattanLength() + + if (scale !== Infinity) { + vec.multiplyScalar(scale) + } else { + vec.set(1, 0, 0, 0) // do something reasonable + } + + skinWeight.setXYZW(i, vec.x, vec.y, vec.z, vec.w) + } + } + }, + + updateMatrixWorld: function (force) { + Mesh.prototype.updateMatrixWorld.call(this, force) + + if (this.bindMode === 'attached') { + this.bindMatrixInverse.getInverse(this.matrixWorld) + } else if (this.bindMode === 'detached') { + this.bindMatrixInverse.getInverse(this.bindMatrix) + } else { + console.warn('THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode) + } + }, + + clone: function () { + return new this.constructor(this.geometry, this.material).copy(this) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial(parameters) { + Material.call(this) + + this.type = 'LineBasicMaterial' + + this.color = new Color(0xffffff) + + this.linewidth = 1 + this.linecap = 'round' + this.linejoin = 'round' + + this.lights = false + + this.setValues(parameters) + } + + LineBasicMaterial.prototype = Object.create(Material.prototype) + LineBasicMaterial.prototype.constructor = LineBasicMaterial + + LineBasicMaterial.prototype.isLineBasicMaterial = true + + LineBasicMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.color.copy(source.color) + + this.linewidth = source.linewidth + this.linecap = source.linecap + this.linejoin = source.linejoin + + return this + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line(geometry, material, mode) { + if (mode === 1) { + console.warn( + 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' + ) + return new LineSegments(geometry, material) + } + + Object3D.call(this) + + this.type = 'Line' + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry() + this.material = + material !== undefined ? material : new LineBasicMaterial({ color: Math.random() * 0xffffff }) + } + + Line.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Line, + + isLine: true, + + computeLineDistances: (function () { + var start = new Vector3() + var end = new Vector3() + + return function computeLineDistances() { + var geometry = this.geometry + + if (geometry.isBufferGeometry) { + // we assume non-indexed geometry + + if (geometry.index === null) { + var positionAttribute = geometry.attributes.position + var lineDistances = [0] + + for (var i = 1, l = positionAttribute.count; i < l; i++) { + start.fromBufferAttribute(positionAttribute, i - 1) + end.fromBufferAttribute(positionAttribute, i) + + lineDistances[i] = lineDistances[i - 1] + lineDistances[i] += start.distanceTo(end) + } + + geometry.addAttribute( + 'lineDistance', + new THREE.Float32BufferAttribute(lineDistances, 1) + ) + } else { + console.warn( + 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' + ) + } + } else if (geometry.isGeometry) { + var vertices = geometry.vertices + var lineDistances = geometry.lineDistances + + lineDistances[0] = 0 + + for (var i = 1, l = vertices.length; i < l; i++) { + lineDistances[i] = lineDistances[i - 1] + lineDistances[i] += vertices[i - 1].distanceTo(vertices[i]) + } + } + + return this + } + })(), + + raycast: (function () { + var inverseMatrix = new Matrix4() + var ray = new Ray() + var sphere = new Sphere() + + return function raycast(raycaster, intersects) { + var precision = raycaster.linePrecision + var precisionSq = precision * precision + + var geometry = this.geometry + var matrixWorld = this.matrixWorld + + // Checking boundingSphere distance to ray + + if (geometry.boundingSphere === null) geometry.computeBoundingSphere() + + sphere.copy(geometry.boundingSphere) + sphere.applyMatrix4(matrixWorld) + + if (raycaster.ray.intersectsSphere(sphere) === false) return + + // + + inverseMatrix.getInverse(matrixWorld) + ray.copy(raycaster.ray).applyMatrix4(inverseMatrix) + + var vStart = new Vector3() + var vEnd = new Vector3() + var interSegment = new Vector3() + var interRay = new Vector3() + var step = this && this.isLineSegments ? 2 : 1 + + if (geometry.isBufferGeometry) { + var index = geometry.index + var attributes = geometry.attributes + var positions = attributes.position.array + + if (index !== null) { + var indices = index.array + + for (var i = 0, l = indices.length - 1; i < l; i += step) { + var a = indices[i] + var b = indices[i + 1] + + vStart.fromArray(positions, a * 3) + vEnd.fromArray(positions, b * 3) + + var distSq = ray.distanceSqToSegment(vStart, vEnd, interRay, interSegment) + + if (distSq > precisionSq) continue + + interRay.applyMatrix4(this.matrixWorld) //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo(interRay) + + if (distance < raycaster.near || distance > raycaster.far) continue + + intersects.push({ + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4(this.matrixWorld), + index: i, + face: null, + faceIndex: null, + object: this + }) + } + } else { + for (var i = 0, l = positions.length / 3 - 1; i < l; i += step) { + vStart.fromArray(positions, 3 * i) + vEnd.fromArray(positions, 3 * i + 3) + + var distSq = ray.distanceSqToSegment(vStart, vEnd, interRay, interSegment) + + if (distSq > precisionSq) continue + + interRay.applyMatrix4(this.matrixWorld) //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo(interRay) + + if (distance < raycaster.near || distance > raycaster.far) continue + + intersects.push({ + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4(this.matrixWorld), + index: i, + face: null, + faceIndex: null, + object: this + }) + } + } + } else if (geometry.isGeometry) { + var vertices = geometry.vertices + var nbVertices = vertices.length + + for (var i = 0; i < nbVertices - 1; i += step) { + var distSq = ray.distanceSqToSegment( + vertices[i], + vertices[i + 1], + interRay, + interSegment + ) + + if (distSq > precisionSq) continue + + interRay.applyMatrix4(this.matrixWorld) //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo(interRay) + + if (distance < raycaster.near || distance > raycaster.far) continue + + intersects.push({ + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4(this.matrixWorld), + index: i, + face: null, + faceIndex: null, + object: this + }) + } + } + } + })(), + + clone: function () { + return new this.constructor(this.geometry, this.material).copy(this) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments(geometry, material) { + Line.call(this, geometry, material) + + this.type = 'LineSegments' + } + + LineSegments.prototype = Object.assign(Object.create(Line.prototype), { + constructor: LineSegments, + + isLineSegments: true, + + computeLineDistances: (function () { + var start = new Vector3() + var end = new Vector3() + + return function computeLineDistances() { + var geometry = this.geometry + + if (geometry.isBufferGeometry) { + // we assume non-indexed geometry + + if (geometry.index === null) { + var positionAttribute = geometry.attributes.position + var lineDistances = [] + + for (var i = 0, l = positionAttribute.count; i < l; i += 2) { + start.fromBufferAttribute(positionAttribute, i) + end.fromBufferAttribute(positionAttribute, i + 1) + + lineDistances[i] = i === 0 ? 0 : lineDistances[i - 1] + lineDistances[i + 1] = lineDistances[i] + start.distanceTo(end) + } + + geometry.addAttribute( + 'lineDistance', + new THREE.Float32BufferAttribute(lineDistances, 1) + ) + } else { + console.warn( + 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' + ) + } + } else if (geometry.isGeometry) { + var vertices = geometry.vertices + var lineDistances = geometry.lineDistances + + for (var i = 0, l = vertices.length; i < l; i += 2) { + start.copy(vertices[i]) + end.copy(vertices[i + 1]) + + lineDistances[i] = i === 0 ? 0 : lineDistances[i - 1] + lineDistances[i + 1] = lineDistances[i] + start.distanceTo(end) + } + } + + return this + } + })() + }) + + /** + * @author mgreter / http://github.com/mgreter + */ + + function LineLoop(geometry, material) { + Line.call(this, geometry, material) + + this.type = 'LineLoop' + } + + LineLoop.prototype = Object.assign(Object.create(Line.prototype), { + constructor: LineLoop, + + isLineLoop: true + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * map: new THREE.Texture( <Image> ), + * + * size: <float>, + * sizeAttenuation: <bool> + * } + */ + + function PointsMaterial(parameters) { + Material.call(this) + + this.type = 'PointsMaterial' + + this.color = new Color(0xffffff) + + this.map = null + + this.size = 1 + this.sizeAttenuation = true + + this.lights = false + + this.setValues(parameters) + } + + PointsMaterial.prototype = Object.create(Material.prototype) + PointsMaterial.prototype.constructor = PointsMaterial + + PointsMaterial.prototype.isPointsMaterial = true + + PointsMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.color.copy(source.color) + + this.map = source.map + + this.size = source.size + this.sizeAttenuation = source.sizeAttenuation + + return this + } + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points(geometry, material) { + Object3D.call(this) + + this.type = 'Points' + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry() + this.material = + material !== undefined ? material : new PointsMaterial({ color: Math.random() * 0xffffff }) + } + + Points.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Points, + + isPoints: true, + + raycast: (function () { + var inverseMatrix = new Matrix4() + var ray = new Ray() + var sphere = new Sphere() + + return function raycast(raycaster, intersects) { + var object = this + var geometry = this.geometry + var matrixWorld = this.matrixWorld + var threshold = raycaster.params.Points.threshold + + // Checking boundingSphere distance to ray + + if (geometry.boundingSphere === null) geometry.computeBoundingSphere() + + sphere.copy(geometry.boundingSphere) + sphere.applyMatrix4(matrixWorld) + sphere.radius += threshold + + if (raycaster.ray.intersectsSphere(sphere) === false) return + + // + + inverseMatrix.getInverse(matrixWorld) + ray.copy(raycaster.ray).applyMatrix4(inverseMatrix) + + var localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3) + var localThresholdSq = localThreshold * localThreshold + var position = new Vector3() + + function testPoint(point, index) { + var rayPointDistanceSq = ray.distanceSqToPoint(point) + + if (rayPointDistanceSq < localThresholdSq) { + var intersectPoint = ray.closestPointToPoint(point) + intersectPoint.applyMatrix4(matrixWorld) + + var distance = raycaster.ray.origin.distanceTo(intersectPoint) + + if (distance < raycaster.near || distance > raycaster.far) return + + intersects.push({ + distance: distance, + distanceToRay: Math.sqrt(rayPointDistanceSq), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + }) + } + } + + if (geometry.isBufferGeometry) { + var index = geometry.index + var attributes = geometry.attributes + var positions = attributes.position.array + + if (index !== null) { + var indices = index.array + + for (var i = 0, il = indices.length; i < il; i++) { + var a = indices[i] + + position.fromArray(positions, a * 3) + + testPoint(position, a) + } + } else { + for (var i = 0, l = positions.length / 3; i < l; i++) { + position.fromArray(positions, i * 3) + + testPoint(position, i) + } + } + } else { + var vertices = geometry.vertices + + for (var i = 0, l = vertices.length; i < l; i++) { + testPoint(vertices[i], i) + } + } + } + })(), + + clone: function () { + return new this.constructor(this.geometry, this.material).copy(this) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + Object3D.call(this) + + this.type = 'Group' + } + + Group.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Group, + + isGroup: true + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( + video, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy + ) { + Texture.call(this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) + + this.generateMipmaps = false + } + + VideoTexture.prototype = Object.assign(Object.create(Texture.prototype), { + constructor: VideoTexture, + + isVideoTexture: true, + + update: function () { + var video = this.image + + if (video.readyState >= video.HAVE_CURRENT_DATA) { + this.needsUpdate = true + } + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( + mipmaps, + width, + height, + format, + type, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + anisotropy, + encoding + ) { + Texture.call( + this, + null, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + format, + type, + anisotropy, + encoding + ) + + this.image = { width: width, height: height } + this.mipmaps = mipmaps + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false + } + + CompressedTexture.prototype = Object.create(Texture.prototype) + CompressedTexture.prototype.constructor = CompressedTexture + + CompressedTexture.prototype.isCompressedTexture = true + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( + width, + height, + type, + mapping, + wrapS, + wrapT, + magFilter, + minFilter, + anisotropy, + format + ) { + format = format !== undefined ? format : DepthFormat + + if (format !== DepthFormat && format !== DepthStencilFormat) { + throw new Error( + 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' + ) + } + + if (type === undefined && format === DepthFormat) type = UnsignedShortType + if (type === undefined && format === DepthStencilFormat) type = UnsignedInt248Type + + Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) + + this.image = { width: width, height: height } + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter + + this.flipY = false + this.generateMipmaps = false + } + + DepthTexture.prototype = Object.create(Texture.prototype) + DepthTexture.prototype.constructor = DepthTexture + DepthTexture.prototype.isDepthTexture = true + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function WireframeGeometry(geometry) { + BufferGeometry.call(this) + + this.type = 'WireframeGeometry' + + // buffer + + var vertices = [] + + // helper variables + + var i, j, l, o, ol + var edge = [0, 0], + edges = {}, + e, + edge1, + edge2 + var key, + keys = ['a', 'b', 'c'] + var vertex + + // different logic for Geometry and BufferGeometry + + if (geometry && geometry.isGeometry) { + // create a data structure that contains all edges without duplicates + + var faces = geometry.faces + + for (i = 0, l = faces.length; i < l; i++) { + var face = faces[i] + + for (j = 0; j < 3; j++) { + edge1 = face[keys[j]] + edge2 = face[keys[(j + 1) % 3]] + edge[0] = Math.min(edge1, edge2) // sorting prevents duplicates + edge[1] = Math.max(edge1, edge2) + + key = edge[0] + ',' + edge[1] + + if (edges[key] === undefined) { + edges[key] = { index1: edge[0], index2: edge[1] } + } + } + } + + // generate vertices + + for (key in edges) { + e = edges[key] + + vertex = geometry.vertices[e.index1] + vertices.push(vertex.x, vertex.y, vertex.z) + + vertex = geometry.vertices[e.index2] + vertices.push(vertex.x, vertex.y, vertex.z) + } + } else if (geometry && geometry.isBufferGeometry) { + var position, indices, groups + var group, start, count + var index1, index2 + + vertex = new Vector3() + + if (geometry.index !== null) { + // indexed BufferGeometry + + position = geometry.attributes.position + indices = geometry.index + groups = geometry.groups + + if (groups.length === 0) { + groups = [{ start: 0, count: indices.count, materialIndex: 0 }] + } + + // create a data structure that contains all eges without duplicates + + for (o = 0, ol = groups.length; o < ol; ++o) { + group = groups[o] + + start = group.start + count = group.count + + for (i = start, l = start + count; i < l; i += 3) { + for (j = 0; j < 3; j++) { + edge1 = indices.getX(i + j) + edge2 = indices.getX(i + ((j + 1) % 3)) + edge[0] = Math.min(edge1, edge2) // sorting prevents duplicates + edge[1] = Math.max(edge1, edge2) + + key = edge[0] + ',' + edge[1] + + if (edges[key] === undefined) { + edges[key] = { index1: edge[0], index2: edge[1] } + } + } + } + } + + // generate vertices + + for (key in edges) { + e = edges[key] + + vertex.fromBufferAttribute(position, e.index1) + vertices.push(vertex.x, vertex.y, vertex.z) + + vertex.fromBufferAttribute(position, e.index2) + vertices.push(vertex.x, vertex.y, vertex.z) + } + } else { + // non-indexed BufferGeometry + + position = geometry.attributes.position + + for (i = 0, l = position.count / 3; i < l; i++) { + for (j = 0; j < 3; j++) { + // three edges per triangle, an edge is represented as (index1, index2) + // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) + + index1 = 3 * i + j + vertex.fromBufferAttribute(position, index1) + vertices.push(vertex.x, vertex.y, vertex.z) + + index2 = 3 * i + ((j + 1) % 3) + vertex.fromBufferAttribute(position, index2) + vertices.push(vertex.x, vertex.y, vertex.z) + } + } + } + } + + // build geometry + + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + } + + WireframeGeometry.prototype = Object.create(BufferGeometry.prototype) + WireframeGeometry.prototype.constructor = WireframeGeometry + + /** + * @author zz85 / https://github.com/zz85 + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + // ParametricGeometry + + function ParametricGeometry(func, slices, stacks) { + Geometry.call(this) + + this.type = 'ParametricGeometry' + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + } + + this.fromBufferGeometry(new ParametricBufferGeometry(func, slices, stacks)) + this.mergeVertices() + } + + ParametricGeometry.prototype = Object.create(Geometry.prototype) + ParametricGeometry.prototype.constructor = ParametricGeometry + + // ParametricBufferGeometry + + function ParametricBufferGeometry(func, slices, stacks) { + BufferGeometry.call(this) + + this.type = 'ParametricBufferGeometry' + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + } + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + var EPS = 0.00001 + + var normal = new Vector3() + + var p0 = new Vector3(), + p1 = new Vector3() + var pu = new Vector3(), + pv = new Vector3() + + var i, j + + // generate vertices, normals and uvs + + var sliceCount = slices + 1 + + for (i = 0; i <= stacks; i++) { + var v = i / stacks + + for (j = 0; j <= slices; j++) { + var u = j / slices + + // vertex + + p0 = func(u, v, p0) + vertices.push(p0.x, p0.y, p0.z) + + // normal + + // approximate tangent vectors via finite differences + + if (u - EPS >= 0) { + p1 = func(u - EPS, v, p1) + pu.subVectors(p0, p1) + } else { + p1 = func(u + EPS, v, p1) + pu.subVectors(p1, p0) + } + + if (v - EPS >= 0) { + p1 = func(u, v - EPS, p1) + pv.subVectors(p0, p1) + } else { + p1 = func(u, v + EPS, p1) + pv.subVectors(p1, p0) + } + + // cross product of tangent vectors returns surface normal + + normal.crossVectors(pu, pv).normalize() + normals.push(normal.x, normal.y, normal.z) + + // uv + + uvs.push(u, v) + } + } + + // generate indices + + for (i = 0; i < stacks; i++) { + for (j = 0; j < slices; j++) { + var a = i * sliceCount + j + var b = i * sliceCount + j + 1 + var c = (i + 1) * sliceCount + j + 1 + var d = (i + 1) * sliceCount + j + + // faces one and two + + indices.push(a, b, d) + indices.push(b, c, d) + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + } + + ParametricBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // PolyhedronGeometry + + function PolyhedronGeometry(vertices, indices, radius, detail) { + Geometry.call(this) + + this.type = 'PolyhedronGeometry' + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + } + + this.fromBufferGeometry(new PolyhedronBufferGeometry(vertices, indices, radius, detail)) + this.mergeVertices() + } + + PolyhedronGeometry.prototype = Object.create(Geometry.prototype) + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry + + // PolyhedronBufferGeometry + + function PolyhedronBufferGeometry(vertices, indices, radius, detail) { + BufferGeometry.call(this) + + this.type = 'PolyhedronBufferGeometry' + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + } + + radius = radius || 1 + detail = detail || 0 + + // default buffer data + + var vertexBuffer = [] + var uvBuffer = [] + + // the subdivision creates the vertex buffer data + + subdivide(detail) + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius(radius) + + // finally, create the uv data + + generateUVs() + + // build non-indexed geometry + + this.addAttribute('position', new Float32BufferAttribute(vertexBuffer, 3)) + this.addAttribute('normal', new Float32BufferAttribute(vertexBuffer.slice(), 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvBuffer, 2)) + + if (detail === 0) { + this.computeVertexNormals() // flat normals + } else { + this.normalizeNormals() // smooth normals + } + + // helper functions + + function subdivide(detail) { + var a = new Vector3() + var b = new Vector3() + var c = new Vector3() + + // iterate over all faces and apply a subdivison with the given detail value + + for (var i = 0; i < indices.length; i += 3) { + // get the vertices of the face + + getVertexByIndex(indices[i + 0], a) + getVertexByIndex(indices[i + 1], b) + getVertexByIndex(indices[i + 2], c) + + // perform subdivision + + subdivideFace(a, b, c, detail) + } + } + + function subdivideFace(a, b, c, detail) { + var cols = Math.pow(2, detail) + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = [] + + var i, j + + // construct all of the vertices for this subdivision + + for (i = 0; i <= cols; i++) { + v[i] = [] + + var aj = a.clone().lerp(c, i / cols) + var bj = b.clone().lerp(c, i / cols) + + var rows = cols - i + + for (j = 0; j <= rows; j++) { + if (j === 0 && i === cols) { + v[i][j] = aj + } else { + v[i][j] = aj.clone().lerp(bj, j / rows) + } + } + } + + // construct all of the faces + + for (i = 0; i < cols; i++) { + for (j = 0; j < 2 * (cols - i) - 1; j++) { + var k = Math.floor(j / 2) + + if (j % 2 === 0) { + pushVertex(v[i][k + 1]) + pushVertex(v[i + 1][k]) + pushVertex(v[i][k]) + } else { + pushVertex(v[i][k + 1]) + pushVertex(v[i + 1][k + 1]) + pushVertex(v[i + 1][k]) + } + } + } + } + + function appplyRadius(radius) { + var vertex = new Vector3() + + // iterate over the entire buffer and apply the radius to each vertex + + for (var i = 0; i < vertexBuffer.length; i += 3) { + vertex.x = vertexBuffer[i + 0] + vertex.y = vertexBuffer[i + 1] + vertex.z = vertexBuffer[i + 2] + + vertex.normalize().multiplyScalar(radius) + + vertexBuffer[i + 0] = vertex.x + vertexBuffer[i + 1] = vertex.y + vertexBuffer[i + 2] = vertex.z + } + } + + function generateUVs() { + var vertex = new Vector3() + + for (var i = 0; i < vertexBuffer.length; i += 3) { + vertex.x = vertexBuffer[i + 0] + vertex.y = vertexBuffer[i + 1] + vertex.z = vertexBuffer[i + 2] + + var u = azimuth(vertex) / 2 / Math.PI + 0.5 + var v = inclination(vertex) / Math.PI + 0.5 + uvBuffer.push(u, 1 - v) + } + + correctUVs() + + correctSeam() + } + + function correctSeam() { + // handle case when face straddles the seam, see #3269 + + for (var i = 0; i < uvBuffer.length; i += 6) { + // uv data of a single face + + var x0 = uvBuffer[i + 0] + var x1 = uvBuffer[i + 2] + var x2 = uvBuffer[i + 4] + + var max = Math.max(x0, x1, x2) + var min = Math.min(x0, x1, x2) + + // 0.9 is somewhat arbitrary + + if (max > 0.9 && min < 0.1) { + if (x0 < 0.2) uvBuffer[i + 0] += 1 + if (x1 < 0.2) uvBuffer[i + 2] += 1 + if (x2 < 0.2) uvBuffer[i + 4] += 1 + } + } + } + + function pushVertex(vertex) { + vertexBuffer.push(vertex.x, vertex.y, vertex.z) + } + + function getVertexByIndex(index, vertex) { + var stride = index * 3 + + vertex.x = vertices[stride + 0] + vertex.y = vertices[stride + 1] + vertex.z = vertices[stride + 2] + } + + function correctUVs() { + var a = new Vector3() + var b = new Vector3() + var c = new Vector3() + + var centroid = new Vector3() + + var uvA = new Vector2() + var uvB = new Vector2() + var uvC = new Vector2() + + for (var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6) { + a.set(vertexBuffer[i + 0], vertexBuffer[i + 1], vertexBuffer[i + 2]) + b.set(vertexBuffer[i + 3], vertexBuffer[i + 4], vertexBuffer[i + 5]) + c.set(vertexBuffer[i + 6], vertexBuffer[i + 7], vertexBuffer[i + 8]) + + uvA.set(uvBuffer[j + 0], uvBuffer[j + 1]) + uvB.set(uvBuffer[j + 2], uvBuffer[j + 3]) + uvC.set(uvBuffer[j + 4], uvBuffer[j + 5]) + + centroid.copy(a).add(b).add(c).divideScalar(3) + + var azi = azimuth(centroid) + + correctUV(uvA, j + 0, a, azi) + correctUV(uvB, j + 2, b, azi) + correctUV(uvC, j + 4, c, azi) + } + } + + function correctUV(uv, stride, vector, azimuth) { + if (azimuth < 0 && uv.x === 1) { + uvBuffer[stride] = uv.x - 1 + } + + if (vector.x === 0 && vector.z === 0) { + uvBuffer[stride] = azimuth / 2 / Math.PI + 0.5 + } + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth(vector) { + return Math.atan2(vector.z, -vector.x) + } + + // Angle above the XZ plane. + + function inclination(vector) { + return Math.atan2(-vector.y, Math.sqrt(vector.x * vector.x + vector.z * vector.z)) + } + } + + PolyhedronBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TetrahedronGeometry + + function TetrahedronGeometry(radius, detail) { + Geometry.call(this) + + this.type = 'TetrahedronGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + + this.fromBufferGeometry(new TetrahedronBufferGeometry(radius, detail)) + this.mergeVertices() + } + + TetrahedronGeometry.prototype = Object.create(Geometry.prototype) + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry + + // TetrahedronBufferGeometry + + function TetrahedronBufferGeometry(radius, detail) { + var vertices = [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1] + + var indices = [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1] + + PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail) + + this.type = 'TetrahedronBufferGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + } + + TetrahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype) + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // OctahedronGeometry + + function OctahedronGeometry(radius, detail) { + Geometry.call(this) + + this.type = 'OctahedronGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + + this.fromBufferGeometry(new OctahedronBufferGeometry(radius, detail)) + this.mergeVertices() + } + + OctahedronGeometry.prototype = Object.create(Geometry.prototype) + OctahedronGeometry.prototype.constructor = OctahedronGeometry + + // OctahedronBufferGeometry + + function OctahedronBufferGeometry(radius, detail) { + var vertices = [1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1] + + var indices = [0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2] + + PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail) + + this.type = 'OctahedronBufferGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + } + + OctahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype) + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry + + /** + * @author timothypratley / https://github.com/timothypratley + * @author Mugen87 / https://github.com/Mugen87 + */ + + // IcosahedronGeometry + + function IcosahedronGeometry(radius, detail) { + Geometry.call(this) + + this.type = 'IcosahedronGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + + this.fromBufferGeometry(new IcosahedronBufferGeometry(radius, detail)) + this.mergeVertices() + } + + IcosahedronGeometry.prototype = Object.create(Geometry.prototype) + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry + + // IcosahedronBufferGeometry + + function IcosahedronBufferGeometry(radius, detail) { + var t = (1 + Math.sqrt(5)) / 2 + + var vertices = [ + -1, + t, + 0, + 1, + t, + 0, + -1, + -t, + 0, + 1, + -t, + 0, + 0, + -1, + t, + 0, + 1, + t, + 0, + -1, + -t, + 0, + 1, + -t, + t, + 0, + -1, + t, + 0, + 1, + -t, + 0, + -1, + -t, + 0, + 1 + ] + + var indices = [ + 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 + ] + + PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail) + + this.type = 'IcosahedronBufferGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + } + + IcosahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype) + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry + + /** + * @author Abe Pazos / https://hamoid.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // DodecahedronGeometry + + function DodecahedronGeometry(radius, detail) { + Geometry.call(this) + + this.type = 'DodecahedronGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + + this.fromBufferGeometry(new DodecahedronBufferGeometry(radius, detail)) + this.mergeVertices() + } + + DodecahedronGeometry.prototype = Object.create(Geometry.prototype) + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry + + // DodecahedronBufferGeometry + + function DodecahedronBufferGeometry(radius, detail) { + var t = (1 + Math.sqrt(5)) / 2 + var r = 1 / t + + var vertices = [ + // (卤1, 卤1, 卤1) + -1, + -1, + -1, + -1, + -1, + 1, + -1, + 1, + -1, + -1, + 1, + 1, + 1, + -1, + -1, + 1, + -1, + 1, + 1, + 1, + -1, + 1, + 1, + 1, + + // (0, 卤1/蠁, 卤蠁) + 0, + -r, + -t, + 0, + -r, + t, + 0, + r, + -t, + 0, + r, + t, + + // (卤1/蠁, 卤蠁, 0) + -r, + -t, + 0, + -r, + t, + 0, + r, + -t, + 0, + r, + t, + 0, + + // (卤蠁, 0, 卤1/蠁) + -t, + 0, + -r, + t, + 0, + -r, + -t, + 0, + r, + t, + 0, + r + ] + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, 7, 19, 17, 7, 17, 6, 7, 6, 15, 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, 0, 12, 1, 0, 1, 18, 0, 18, 16, 6, 10, 2, 6, 2, 13, 6, 13, 15, 2, + 16, 18, 2, 18, 3, 2, 3, 13, 18, 1, 9, 18, 9, 11, 18, 11, 3, 4, 14, 12, 4, 12, 0, 4, 0, 8, 11, + 9, 5, 11, 5, 19, 11, 19, 7, 19, 5, 14, 19, 14, 4, 19, 4, 17, 1, 12, 14, 1, 14, 5, 1, 5, 9 + ] + + PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail) + + this.type = 'DodecahedronBufferGeometry' + + this.parameters = { + radius: radius, + detail: detail + } + } + + DodecahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype) + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * @author Mugen87 / https://github.com/Mugen87 + * + */ + + // TubeGeometry + + function TubeGeometry(path, tubularSegments, radius, radialSegments, closed, taper) { + Geometry.call(this) + + this.type = 'TubeGeometry' + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + } + + if (taper !== undefined) console.warn('THREE.TubeGeometry: taper has been removed.') + + var bufferGeometry = new TubeBufferGeometry( + path, + tubularSegments, + radius, + radialSegments, + closed + ) + + // expose internals + + this.tangents = bufferGeometry.tangents + this.normals = bufferGeometry.normals + this.binormals = bufferGeometry.binormals + + // create geometry + + this.fromBufferGeometry(bufferGeometry) + this.mergeVertices() + } + + TubeGeometry.prototype = Object.create(Geometry.prototype) + TubeGeometry.prototype.constructor = TubeGeometry + + // TubeBufferGeometry + + function TubeBufferGeometry(path, tubularSegments, radius, radialSegments, closed) { + BufferGeometry.call(this) + + this.type = 'TubeBufferGeometry' + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + } + + tubularSegments = tubularSegments || 64 + radius = radius || 1 + radialSegments = radialSegments || 8 + closed = closed || false + + var frames = path.computeFrenetFrames(tubularSegments, closed) + + // expose internals + + this.tangents = frames.tangents + this.normals = frames.normals + this.binormals = frames.binormals + + // helper variables + + var vertex = new Vector3() + var normal = new Vector3() + var uv = new Vector2() + var P = new Vector3() + + var i, j + + // buffer + + var vertices = [] + var normals = [] + var uvs = [] + var indices = [] + + // create buffer data + + generateBufferData() + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + + // functions + + function generateBufferData() { + for (i = 0; i < tubularSegments; i++) { + generateSegment(i) + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment(closed === false ? tubularSegments : 0) + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs() + + // finally create faces + + generateIndices() + } + + function generateSegment(i) { + // we use getPointAt to sample evenly distributed points from the given path + + P = path.getPointAt(i / tubularSegments, P) + + // retrieve corresponding normal and binormal + + var N = frames.normals[i] + var B = frames.binormals[i] + + // generate normals and vertices for the current segment + + for (j = 0; j <= radialSegments; j++) { + var v = (j / radialSegments) * Math.PI * 2 + + var sin = Math.sin(v) + var cos = -Math.cos(v) + + // normal + + normal.x = cos * N.x + sin * B.x + normal.y = cos * N.y + sin * B.y + normal.z = cos * N.z + sin * B.z + normal.normalize() + + normals.push(normal.x, normal.y, normal.z) + + // vertex + + vertex.x = P.x + radius * normal.x + vertex.y = P.y + radius * normal.y + vertex.z = P.z + radius * normal.z + + vertices.push(vertex.x, vertex.y, vertex.z) + } + } + + function generateIndices() { + for (j = 1; j <= tubularSegments; j++) { + for (i = 1; i <= radialSegments; i++) { + var a = (radialSegments + 1) * (j - 1) + (i - 1) + var b = (radialSegments + 1) * j + (i - 1) + var c = (radialSegments + 1) * j + i + var d = (radialSegments + 1) * (j - 1) + i + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + } + } + } + + function generateUVs() { + for (i = 0; i <= tubularSegments; i++) { + for (j = 0; j <= radialSegments; j++) { + uv.x = i / tubularSegments + uv.y = j / radialSegments + + uvs.push(uv.x, uv.y) + } + } + } + } + + TubeBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry + + /** + * @author oosmoxiecode + * @author Mugen87 / https://github.com/Mugen87 + * + * based on http://www.blackpawn.com/texts/pqtorus/ + */ + + // TorusKnotGeometry + + function TorusKnotGeometry(radius, tube, tubularSegments, radialSegments, p, q, heightScale) { + Geometry.call(this) + + this.type = 'TorusKnotGeometry' + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + } + + if (heightScale !== undefined) + console.warn( + 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' + ) + + this.fromBufferGeometry( + new TorusKnotBufferGeometry(radius, tube, tubularSegments, radialSegments, p, q) + ) + this.mergeVertices() + } + + TorusKnotGeometry.prototype = Object.create(Geometry.prototype) + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry + + // TorusKnotBufferGeometry + + function TorusKnotBufferGeometry(radius, tube, tubularSegments, radialSegments, p, q) { + BufferGeometry.call(this) + + this.type = 'TorusKnotBufferGeometry' + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + } + + radius = radius || 1 + tube = tube || 0.4 + tubularSegments = Math.floor(tubularSegments) || 64 + radialSegments = Math.floor(radialSegments) || 8 + p = p || 2 + q = q || 3 + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // helper variables + + var i, j + + var vertex = new Vector3() + var normal = new Vector3() + + var P1 = new Vector3() + var P2 = new Vector3() + + var B = new Vector3() + var T = new Vector3() + var N = new Vector3() + + // generate vertices, normals and uvs + + for (i = 0; i <= tubularSegments; ++i) { + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = (i / tubularSegments) * p * Math.PI * 2 + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve(u, p, q, radius, P1) + calculatePositionOnCurve(u + 0.01, p, q, radius, P2) + + // calculate orthonormal basis + + T.subVectors(P2, P1) + N.addVectors(P2, P1) + B.crossVectors(T, N) + N.crossVectors(B, T) + + // normalize B, N. T can be ignored, we don't use it + + B.normalize() + N.normalize() + + for (j = 0; j <= radialSegments; ++j) { + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = (j / radialSegments) * Math.PI * 2 + var cx = -tube * Math.cos(v) + var cy = tube * Math.sin(v) + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + (cx * N.x + cy * B.x) + vertex.y = P1.y + (cx * N.y + cy * B.y) + vertex.z = P1.z + (cx * N.z + cy * B.z) + + vertices.push(vertex.x, vertex.y, vertex.z) + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + + normal.subVectors(vertex, P1).normalize() + + normals.push(normal.x, normal.y, normal.z) + + // uv + + uvs.push(i / tubularSegments) + uvs.push(j / radialSegments) + } + } + + // generate indices + + for (j = 1; j <= tubularSegments; j++) { + for (i = 1; i <= radialSegments; i++) { + // indices + + var a = (radialSegments + 1) * (j - 1) + (i - 1) + var b = (radialSegments + 1) * j + (i - 1) + var c = (radialSegments + 1) * j + i + var d = (radialSegments + 1) * (j - 1) + i + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve(u, p, q, radius, position) { + var cu = Math.cos(u) + var su = Math.sin(u) + var quOverP = (q / p) * u + var cs = Math.cos(quOverP) + + position.x = radius * (2 + cs) * 0.5 * cu + position.y = radius * (2 + cs) * su * 0.5 + position.z = radius * Math.sin(quOverP) * 0.5 + } + } + + TorusKnotBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // TorusGeometry + + function TorusGeometry(radius, tube, radialSegments, tubularSegments, arc) { + Geometry.call(this) + + this.type = 'TorusGeometry' + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + } + + this.fromBufferGeometry( + new TorusBufferGeometry(radius, tube, radialSegments, tubularSegments, arc) + ) + this.mergeVertices() + } + + TorusGeometry.prototype = Object.create(Geometry.prototype) + TorusGeometry.prototype.constructor = TorusGeometry + + // TorusBufferGeometry + + function TorusBufferGeometry(radius, tube, radialSegments, tubularSegments, arc) { + BufferGeometry.call(this) + + this.type = 'TorusBufferGeometry' + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + } + + radius = radius || 1 + tube = tube || 0.4 + radialSegments = Math.floor(radialSegments) || 8 + tubularSegments = Math.floor(tubularSegments) || 6 + arc = arc || Math.PI * 2 + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // helper variables + + var center = new Vector3() + var vertex = new Vector3() + var normal = new Vector3() + + var j, i + + // generate vertices, normals and uvs + + for (j = 0; j <= radialSegments; j++) { + for (i = 0; i <= tubularSegments; i++) { + var u = (i / tubularSegments) * arc + var v = (j / radialSegments) * Math.PI * 2 + + // vertex + + vertex.x = (radius + tube * Math.cos(v)) * Math.cos(u) + vertex.y = (radius + tube * Math.cos(v)) * Math.sin(u) + vertex.z = tube * Math.sin(v) + + vertices.push(vertex.x, vertex.y, vertex.z) + + // normal + + center.x = radius * Math.cos(u) + center.y = radius * Math.sin(u) + normal.subVectors(vertex, center).normalize() + + normals.push(normal.x, normal.y, normal.z) + + // uv + + uvs.push(i / tubularSegments) + uvs.push(j / radialSegments) + } + } + + // generate indices + + for (j = 1; j <= radialSegments; j++) { + for (i = 1; i <= tubularSegments; i++) { + // indices + + var a = (tubularSegments + 1) * j + i - 1 + var b = (tubularSegments + 1) * (j - 1) + i - 1 + var c = (tubularSegments + 1) * (j - 1) + i + var d = (tubularSegments + 1) * j + i + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + } + + TorusBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry + + /** + * @author Mugen87 / https://github.com/Mugen87 + * Port from https://github.com/mapbox/earcut (v2.1.2) + */ + + var Earcut = { + triangulate: function (data, holeIndices, dim) { + dim = dim || 2 + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[0] * dim : data.length, + outerNode = linkedList(data, 0, outerLen, dim, true), + triangles = [] + + if (!outerNode) return triangles + + var minX, minY, maxX, maxY, x, y, invSize + + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim) + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + + if (data.length > 80 * dim) { + minX = maxX = data[0] + minY = maxY = data[1] + + for (var i = dim; i < outerLen; i += dim) { + x = data[i] + y = data[i + 1] + if (x < minX) minX = x + if (y < minY) minY = y + if (x > maxX) maxX = x + if (y > maxY) maxY = y + } + + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + + invSize = Math.max(maxX - minX, maxY - minY) + invSize = invSize !== 0 ? 1 / invSize : 0 + } + + earcutLinked(outerNode, triangles, dim, minX, minY, invSize) + + return triangles + } + } + + // create a circular doubly linked list from polygon points in the specified winding order + + function linkedList(data, start, end, dim, clockwise) { + var i, last + + if (clockwise === signedArea(data, start, end, dim) > 0) { + for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last) + } else { + for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last) + } + + if (last && equals(last, last.next)) { + removeNode(last) + last = last.next + } + + return last + } + + // eliminate colinear or duplicate points + + function filterPoints(start, end) { + if (!start) return start + if (!end) end = start + + var p = start, + again + + do { + again = false + + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p) + p = end = p.prev + if (p === p.next) break + again = true + } else { + p = p.next + } + } while (again || p !== end) + + return end + } + + // main ear slicing loop which triangulates a polygon (given as a linked list) + + function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { + if (!ear) return + + // interlink polygon nodes in z-order + + if (!pass && invSize) indexCurve(ear, minX, minY, invSize) + + var stop = ear, + prev, + next + + // iterate through ears, slicing them one by one + + while (ear.prev !== ear.next) { + prev = ear.prev + next = ear.next + + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + // cut off the triangle + triangles.push(prev.i / dim) + triangles.push(ear.i / dim) + triangles.push(next.i / dim) + + removeNode(ear) + + // skipping the next vertice leads to less sliver triangles + ear = next.next + stop = next.next + + continue + } + + ear = next + + // if we looped through the whole remaining polygon and can't find any more ears + + if (ear === stop) { + // try filtering points and slicing again + + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1) + + // if this didn't work, try curing all small self-intersections locally + } else if (pass === 1) { + ear = cureLocalIntersections(ear, triangles, dim) + earcutLinked(ear, triangles, dim, minX, minY, invSize, 2) + + // as a last resort, try splitting the remaining polygon into two + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, invSize) + } + + break + } + } + } + + // check whether a polygon node forms a valid ear with adjacent nodes + + function isEar(ear) { + var a = ear.prev, + b = ear, + c = ear.next + + if (area(a, b, c) >= 0) return false // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + var p = ear.next.next + + while (p !== ear.prev) { + if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) { + return false + } + + p = p.next + } + + return true + } + + function isEarHashed(ear, minX, minY, invSize) { + var a = ear.prev, + b = ear, + c = ear.next + + if (area(a, b, c) >= 0) return false // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + + var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : b.x < c.x ? b.x : c.x, + minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : b.y < c.y ? b.y : c.y, + maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : b.x > c.x ? b.x : c.x, + maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : b.y > c.y ? b.y : c.y + + // z-order range for the current triangle bbox; + + var minZ = zOrder(minTX, minTY, minX, minY, invSize), + maxZ = zOrder(maxTX, maxTY, minX, minY, invSize) + + // first look for points inside the triangle in increasing z-order + + var p = ear.nextZ + + while (p && p.z <= maxZ) { + if ( + p !== ear.prev && + p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0 + ) + return false + p = p.nextZ + } + + // then look for points in decreasing z-order + + p = ear.prevZ + + while (p && p.z >= minZ) { + if ( + p !== ear.prev && + p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0 + ) + return false + + p = p.prevZ + } + + return true + } + + // go through all polygon nodes and cure small local self-intersections + + function cureLocalIntersections(start, triangles, dim) { + var p = start + + do { + var a = p.prev, + b = p.next.next + + if ( + !equals(a, b) && + intersects(a, p, p.next, b) && + locallyInside(a, b) && + locallyInside(b, a) + ) { + triangles.push(a.i / dim) + triangles.push(p.i / dim) + triangles.push(b.i / dim) + + // remove two nodes involved + + removeNode(p) + removeNode(p.next) + + p = start = b + } + + p = p.next + } while (p !== start) + + return p + } + + // try splitting polygon into two and triangulate them independently + + function splitEarcut(start, triangles, dim, minX, minY, invSize) { + // look for a valid diagonal that divides the polygon into two + + var a = start + + do { + var b = a.next.next + + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + + var c = splitPolygon(a, b) + + // filter colinear points around the cuts + + a = filterPoints(a, a.next) + c = filterPoints(c, c.next) + + // run earcut on each half + + earcutLinked(a, triangles, dim, minX, minY, invSize) + earcutLinked(c, triangles, dim, minX, minY, invSize) + return + } + + b = b.next + } + + a = a.next + } while (a !== start) + } + + // link every hole into the outer loop, producing a single-ring polygon without holes + + function eliminateHoles(data, holeIndices, outerNode, dim) { + var queue = [], + i, + len, + start, + end, + list + + for (i = 0, len = holeIndices.length; i < len; i++) { + start = holeIndices[i] * dim + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length + list = linkedList(data, start, end, dim, false) + if (list === list.next) list.steiner = true + queue.push(getLeftmost(list)) + } + + queue.sort(compareX) + + // process holes from left to right + + for (i = 0; i < queue.length; i++) { + eliminateHole(queue[i], outerNode) + outerNode = filterPoints(outerNode, outerNode.next) + } + + return outerNode + } + + function compareX(a, b) { + return a.x - b.x + } + + // find a bridge between vertices that connects hole with an outer ring and and link it + + function eliminateHole(hole, outerNode) { + outerNode = findHoleBridge(hole, outerNode) + + if (outerNode) { + var b = splitPolygon(outerNode, hole) + + filterPoints(b, b.next) + } + } + + // David Eberly's algorithm for finding a bridge between hole and outer polygon + + function findHoleBridge(hole, outerNode) { + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = -Infinity, + m + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + + do { + if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + var x = p.x + ((hy - p.y) * (p.next.x - p.x)) / (p.next.y - p.y) + + if (x <= hx && x > qx) { + qx = x + + if (x === hx) { + if (hy === p.y) return p + if (hy === p.next.y) return p.next + } + + m = p.x < p.next.x ? p : p.next + } + } + + p = p.next + } while (p !== outerNode) + + if (!m) return null + + if (hx === qx) return m.prev // hole touches outer segment; pick lower endpoint + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan + + p = m.next + + while (p !== stop) { + if ( + hx >= p.x && + p.x >= mx && + hx !== p.x && + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y) + ) { + tan = Math.abs(hy - p.y) / (hx - p.x) // tangential + + if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) { + m = p + tanMin = tan + } + } + + p = p.next + } + + return m + } + + // interlink polygon nodes in z-order + + function indexCurve(start, minX, minY, invSize) { + var p = start + + do { + if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize) + p.prevZ = p.prev + p.nextZ = p.next + p = p.next + } while (p !== start) + + p.prevZ.nextZ = null + p.prevZ = null + + sortLinked(p) + } + + // Simon Tatham's linked list merge sort algorithm + // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html + + function sortLinked(list) { + var i, + p, + q, + e, + tail, + numMerges, + pSize, + qSize, + inSize = 1 + + do { + p = list + list = null + tail = null + numMerges = 0 + + while (p) { + numMerges++ + q = p + pSize = 0 + + for (i = 0; i < inSize; i++) { + pSize++ + q = q.nextZ + if (!q) break + } + + qSize = inSize + + while (pSize > 0 || (qSize > 0 && q)) { + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { + e = p + p = p.nextZ + pSize-- + } else { + e = q + q = q.nextZ + qSize-- + } + + if (tail) tail.nextZ = e + else list = e + + e.prevZ = tail + tail = e + } + + p = q + } + + tail.nextZ = null + inSize *= 2 + } while (numMerges > 1) + + return list + } + + // z-order of a point given coords and inverse of the longer side of data bbox + + function zOrder(x, y, minX, minY, invSize) { + // coords are transformed into non-negative 15-bit integer range + + x = 32767 * (x - minX) * invSize + y = 32767 * (y - minY) * invSize + + x = (x | (x << 8)) & 0x00ff00ff + x = (x | (x << 4)) & 0x0f0f0f0f + x = (x | (x << 2)) & 0x33333333 + x = (x | (x << 1)) & 0x55555555 + + y = (y | (y << 8)) & 0x00ff00ff + y = (y | (y << 4)) & 0x0f0f0f0f + y = (y | (y << 2)) & 0x33333333 + y = (y | (y << 1)) & 0x55555555 + + return x | (y << 1) + } + + // find the leftmost node of a polygon ring + + function getLeftmost(start) { + var p = start, + leftmost = start + + do { + if (p.x < leftmost.x) leftmost = p + p = p.next + } while (p !== start) + + return leftmost + } + + // check if a point lies within a convex triangle + + function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return ( + (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && + (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && + (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0 + ) + } + + // check if a diagonal between two polygon nodes is valid (lies in polygon interior) + + function isValidDiagonal(a, b) { + return ( + a.next.i !== b.i && + a.prev.i !== b.i && + !intersectsPolygon(a, b) && + locallyInside(a, b) && + locallyInside(b, a) && + middleInside(a, b) + ) + } + + // signed area of a triangle + + function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y) + } + + // check if two points are equal + + function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y + } + + // check if two segments intersect + + function intersects(p1, q1, p2, q2) { + if ((equals(p1, q1) && equals(p2, q2)) || (equals(p1, q2) && equals(p2, q1))) return true + + return ( + area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0 + ) + } + + // check if a polygon diagonal intersects any polygon segments + + function intersectsPolygon(a, b) { + var p = a + + do { + if ( + p.i !== a.i && + p.next.i !== a.i && + p.i !== b.i && + p.next.i !== b.i && + intersects(p, p.next, a, b) + ) { + return true + } + + p = p.next + } while (p !== a) + + return false + } + + // check if a polygon diagonal is locally inside the polygon + + function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 + ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 + : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0 + } + + // check if the middle point of a polygon diagonal is inside the polygon + + function middleInside(a, b) { + var p = a, + inside = false, + px = (a.x + b.x) / 2, + py = (a.y + b.y) / 2 + + do { + if ( + p.y > py !== p.next.y > py && + p.next.y !== p.y && + px < ((p.next.x - p.x) * (py - p.y)) / (p.next.y - p.y) + p.x + ) { + inside = !inside + } + + p = p.next + } while (p !== a) + + return inside + } + + // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; + // if one belongs to the outer ring and another to a hole, it merges it into a single ring + + function splitPolygon(a, b) { + var a2 = new Node(a.i, a.x, a.y), + b2 = new Node(b.i, b.x, b.y), + an = a.next, + bp = b.prev + + a.next = b + b.prev = a + + a2.next = an + an.prev = a2 + + b2.next = a2 + a2.prev = b2 + + bp.next = b2 + b2.prev = bp + + return b2 + } + + // create a node and optionally link it with previous one (in a circular doubly linked list) + + function insertNode(i, x, y, last) { + var p = new Node(i, x, y) + + if (!last) { + p.prev = p + p.next = p + } else { + p.next = last.next + p.prev = last + last.next.prev = p + last.next = p + } + + return p + } + + function removeNode(p) { + p.next.prev = p.prev + p.prev.next = p.next + + if (p.prevZ) p.prevZ.nextZ = p.nextZ + if (p.nextZ) p.nextZ.prevZ = p.prevZ + } + + function Node(i, x, y) { + // vertice index in coordinates array + this.i = i + + // vertex coordinates + this.x = x + this.y = y + + // previous and next vertice nodes in a polygon ring + this.prev = null + this.next = null + + // z-order curve value + this.z = null + + // previous and next nodes in z-order + this.prevZ = null + this.nextZ = null + + // indicates whether this is a steiner point + this.steiner = false + } + + function signedArea(data, start, end, dim) { + var sum = 0 + + for (var i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]) + j = i + } + + return sum + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + // calculate area of the contour polygon + + area: function (contour) { + var n = contour.length + var a = 0.0 + + for (var p = n - 1, q = 0; q < n; p = q++) { + a += contour[p].x * contour[q].y - contour[q].x * contour[p].y + } + + return a * 0.5 + }, + + isClockWise: function (pts) { + return ShapeUtils.area(pts) < 0 + }, + + triangulateShape: function (contour, holes) { + var vertices = [] // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] + var holeIndices = [] // array of hole indices + var faces = [] // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ] + + removeDupEndPts(contour) + addContour(vertices, contour) + + // + + var holeIndex = contour.length + + holes.forEach(removeDupEndPts) + + for (var i = 0; i < holes.length; i++) { + holeIndices.push(holeIndex) + holeIndex += holes[i].length + addContour(vertices, holes[i]) + } + + // + + var triangles = Earcut.triangulate(vertices, holeIndices) + + // + + for (var i = 0; i < triangles.length; i += 3) { + faces.push(triangles.slice(i, i + 3)) + } + + return faces + } + } + + function removeDupEndPts(points) { + var l = points.length + + if (l > 2 && points[l - 1].equals(points[0])) { + points.pop() + } + } + + function addContour(vertices, contour) { + for (var i = 0; i < contour.length; i++) { + vertices.push(contour[i].x) + vertices.push(contour[i].y) + } + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: <int>, // number of points on the curves + * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: <int>, // Depth to extrude the shape + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into the original shape bevel goes + * bevelSize: <float>, // how far from shape outline is bevel + * bevelSegments: <int>, // number of bevel layers + * + * extrudePath: <THREE.Curve> // curve to extrude shape along + * frames: <Object> // containing arrays of tangents, normals, binormals + * + * UVGenerator: <Object> // object that provides UV generator functions + * + * } + */ + + // ExtrudeGeometry + + function ExtrudeGeometry(shapes, options) { + Geometry.call(this) + + this.type = 'ExtrudeGeometry' + + this.parameters = { + shapes: shapes, + options: options + } + + this.fromBufferGeometry(new ExtrudeBufferGeometry(shapes, options)) + this.mergeVertices() + } + + ExtrudeGeometry.prototype = Object.create(Geometry.prototype) + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry + + // ExtrudeBufferGeometry + + function ExtrudeBufferGeometry(shapes, options) { + if (typeof shapes === 'undefined') { + return + } + + BufferGeometry.call(this) + + this.type = 'ExtrudeBufferGeometry' + + shapes = Array.isArray(shapes) ? shapes : [shapes] + + this.addShapeList(shapes, options) + + this.computeVertexNormals() + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + } + + ExtrudeBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry + + ExtrudeBufferGeometry.prototype.getArrays = function () { + var positionAttribute = this.getAttribute('position') + var verticesArray = positionAttribute ? Array.prototype.slice.call(positionAttribute.array) : [] + + var uvAttribute = this.getAttribute('uv') + var uvArray = uvAttribute ? Array.prototype.slice.call(uvAttribute.array) : [] + + var IndexAttribute = this.index + var indicesArray = IndexAttribute ? Array.prototype.slice.call(IndexAttribute.array) : [] + + return { + position: verticesArray, + uv: uvArray, + index: indicesArray + } + } + + ExtrudeBufferGeometry.prototype.addShapeList = function (shapes, options) { + var sl = shapes.length + options.arrays = this.getArrays() + + for (var s = 0; s < sl; s++) { + var shape = shapes[s] + this.addShape(shape, options) + } + + this.setIndex(options.arrays.index) + this.addAttribute('position', new Float32BufferAttribute(options.arrays.position, 3)) + this.addAttribute('uv', new Float32BufferAttribute(options.arrays.uv, 2)) + } + + ExtrudeBufferGeometry.prototype.addShape = function (shape, options) { + var arrays = options.arrays ? options.arrays : this.getArrays() + var verticesArray = arrays.position + var indicesArray = arrays.index + var uvArray = arrays.uv + + var placeholder = [] + + var amount = options.amount !== undefined ? options.amount : 100 + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6 // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2 // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3 + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12 + + var steps = options.steps !== undefined ? options.steps : 1 + + var extrudePath = options.extrudePath + var extrudePts, + extrudeByPath = false + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = + options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator + + var splineTube, binormal, normal, position2 + if (extrudePath) { + extrudePts = extrudePath.getSpacedPoints(steps) + + extrudeByPath = true + bevelEnabled = false // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = + options.frames !== undefined + ? options.frames + : extrudePath.computeFrenetFrames(steps, false) + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3() + normal = new Vector3() + position2 = new Vector3() + } + + // Safeguards if bevels are not enabled + + if (!bevelEnabled) { + bevelSegments = 0 + bevelThickness = 0 + bevelSize = 0 + } + + // Variables initialization + + var ahole, h, hl // looping of holes + var scope = this + + var shapePoints = shape.extractPoints(curveSegments) + + var vertices = shapePoints.shape + var holes = shapePoints.holes + + var reverse = !ShapeUtils.isClockWise(vertices) + + if (reverse) { + vertices = vertices.reverse() + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for (h = 0, hl = holes.length; h < hl; h++) { + ahole = holes[h] + + if (ShapeUtils.isClockWise(ahole)) { + holes[h] = ahole.reverse() + } + } + } + + var faces = ShapeUtils.triangulateShape(vertices, holes) + + /* Vertices */ + + var contour = vertices // vertices has all points but contour has only points of circumference + + for (h = 0, hl = holes.length; h < hl; h++) { + ahole = holes[h] + + vertices = vertices.concat(ahole) + } + + function scalePt2(pt, vec, size) { + if (!vec) console.error('THREE.ExtrudeGeometry: vec does not exist') + + return vec.clone().multiplyScalar(size).add(pt) + } + + var b, + bs, + t, + z, + vert, + vlen = vertices.length, + face, + flen = faces.length + + // Find directions for point movement + + function getBevelVec(inPt, inPrev, inNext) { + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, + v_prev_y = inPt.y - inPrev.y + var v_next_x = inNext.x - inPt.x, + v_next_y = inNext.y - inPt.y + + var v_prev_lensq = v_prev_x * v_prev_x + v_prev_y * v_prev_y + + // check for collinear edges + var collinear0 = v_prev_x * v_next_y - v_prev_y * v_next_x + + if (Math.abs(collinear0) > Number.EPSILON) { + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt(v_prev_lensq) + var v_next_len = Math.sqrt(v_next_x * v_next_x + v_next_y * v_next_y) + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = inPrev.x - v_prev_y / v_prev_len + var ptPrevShift_y = inPrev.y + v_prev_x / v_prev_len + + var ptNextShift_x = inNext.x - v_next_y / v_next_len + var ptNextShift_y = inNext.y + v_next_x / v_next_len + + // scaling factor for v_prev to intersection point + + var sf = + ((ptNextShift_x - ptPrevShift_x) * v_next_y - + (ptNextShift_y - ptPrevShift_y) * v_next_x) / + (v_prev_x * v_next_y - v_prev_y * v_next_x) + + // vector from inPt to intersection point + + v_trans_x = ptPrevShift_x + v_prev_x * sf - inPt.x + v_trans_y = ptPrevShift_y + v_prev_y * sf - inPt.y + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = v_trans_x * v_trans_x + v_trans_y * v_trans_y + if (v_trans_lensq <= 2) { + return new Vector2(v_trans_x, v_trans_y) + } else { + shrink_by = Math.sqrt(v_trans_lensq / 2) + } + } else { + // handle special case of collinear edges + + var direction_eq = false // assumes: opposite + if (v_prev_x > Number.EPSILON) { + if (v_next_x > Number.EPSILON) { + direction_eq = true + } + } else { + if (v_prev_x < -Number.EPSILON) { + if (v_next_x < -Number.EPSILON) { + direction_eq = true + } + } else { + if (Math.sign(v_prev_y) === Math.sign(v_next_y)) { + direction_eq = true + } + } + } + + if (direction_eq) { + // console.log("Warning: lines are a straight sequence"); + v_trans_x = -v_prev_y + v_trans_y = v_prev_x + shrink_by = Math.sqrt(v_prev_lensq) + } else { + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x + v_trans_y = v_prev_y + shrink_by = Math.sqrt(v_prev_lensq / 2) + } + } + + return new Vector2(v_trans_x / shrink_by, v_trans_y / shrink_by) + } + + var contourMovements = [] + + for (var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { + if (j === il) j = 0 + if (k === il) k = 0 + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[i] = getBevelVec(contour[i], contour[j], contour[k]) + } + + var holesMovements = [], + oneHoleMovements, + verticesMovements = contourMovements.concat() + + for (h = 0, hl = holes.length; h < hl; h++) { + ahole = holes[h] + + oneHoleMovements = [] + + for (i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { + if (j === il) j = 0 + if (k === il) k = 0 + + // (j)---(i)---(k) + oneHoleMovements[i] = getBevelVec(ahole[i], ahole[j], ahole[k]) + } + + holesMovements.push(oneHoleMovements) + verticesMovements = verticesMovements.concat(oneHoleMovements) + } + + // Loop bevelSegments, 1 for the front, 1 for the back + + for (b = 0; b < bevelSegments; b++) { + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments + z = bevelThickness * Math.cos((t * Math.PI) / 2) + bs = bevelSize * Math.sin((t * Math.PI) / 2) + + // contract shape + + for (i = 0, il = contour.length; i < il; i++) { + vert = scalePt2(contour[i], contourMovements[i], bs) + + v(vert.x, vert.y, -z) + } + + // expand holes + + for (h = 0, hl = holes.length; h < hl; h++) { + ahole = holes[h] + oneHoleMovements = holesMovements[h] + + for (i = 0, il = ahole.length; i < il; i++) { + vert = scalePt2(ahole[i], oneHoleMovements[i], bs) + + v(vert.x, vert.y, -z) + } + } + } + + bs = bevelSize + + // Back facing vertices + + for (i = 0; i < vlen; i++) { + vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i] + + if (!extrudeByPath) { + v(vert.x, vert.y, 0) + } else { + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy(splineTube.normals[0]).multiplyScalar(vert.x) + binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y) + + position2.copy(extrudePts[0]).add(normal).add(binormal) + + v(position2.x, position2.y, position2.z) + } + } + + // Add stepped vertices... + // Including front facing vertices + + var s + + for (s = 1; s <= steps; s++) { + for (i = 0; i < vlen; i++) { + vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i] + + if (!extrudeByPath) { + v(vert.x, vert.y, (amount / steps) * s) + } else { + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy(splineTube.normals[s]).multiplyScalar(vert.x) + binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y) + + position2.copy(extrudePts[s]).add(normal).add(binormal) + + v(position2.x, position2.y, position2.z) + } + } + } + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for (b = bevelSegments - 1; b >= 0; b--) { + t = b / bevelSegments + z = bevelThickness * Math.cos((t * Math.PI) / 2) + bs = bevelSize * Math.sin((t * Math.PI) / 2) + + // contract shape + + for (i = 0, il = contour.length; i < il; i++) { + vert = scalePt2(contour[i], contourMovements[i], bs) + v(vert.x, vert.y, amount + z) + } + + // expand holes + + for (h = 0, hl = holes.length; h < hl; h++) { + ahole = holes[h] + oneHoleMovements = holesMovements[h] + + for (i = 0, il = ahole.length; i < il; i++) { + vert = scalePt2(ahole[i], oneHoleMovements[i], bs) + + if (!extrudeByPath) { + v(vert.x, vert.y, amount + z) + } else { + v(vert.x, vert.y + extrudePts[steps - 1].y, extrudePts[steps - 1].x + z) + } + } + } + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces() + + // Sides faces + + buildSideFaces() + + ///// Internal functions + + function buildLidFaces() { + var start = verticesArray.length / 3 + + if (bevelEnabled) { + var layer = 0 // steps + 1 + var offset = vlen * layer + + // Bottom faces + + for (i = 0; i < flen; i++) { + face = faces[i] + f3(face[2] + offset, face[1] + offset, face[0] + offset) + } + + layer = steps + bevelSegments * 2 + offset = vlen * layer + + // Top faces + + for (i = 0; i < flen; i++) { + face = faces[i] + f3(face[0] + offset, face[1] + offset, face[2] + offset) + } + } else { + // Bottom faces + + for (i = 0; i < flen; i++) { + face = faces[i] + f3(face[2], face[1], face[0]) + } + + // Top faces + + for (i = 0; i < flen; i++) { + face = faces[i] + f3(face[0] + vlen * steps, face[1] + vlen * steps, face[2] + vlen * steps) + } + } + + scope.addGroup( + start, + verticesArray.length / 3 - start, + options.material !== undefined ? options.material : 0 + ) + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + var start = verticesArray.length / 3 + var layeroffset = 0 + sidewalls(contour, layeroffset) + layeroffset += contour.length + + for (h = 0, hl = holes.length; h < hl; h++) { + ahole = holes[h] + sidewalls(ahole, layeroffset) + + //, true + layeroffset += ahole.length + } + + scope.addGroup( + start, + verticesArray.length / 3 - start, + options.extrudeMaterial !== undefined ? options.extrudeMaterial : 1 + ) + } + + function sidewalls(contour, layeroffset) { + var j, k + i = contour.length + + while (--i >= 0) { + j = i + k = i - 1 + if (k < 0) k = contour.length - 1 + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, + sl = steps + bevelSegments * 2 + + for (s = 0; s < sl; s++) { + var slen1 = vlen * s + var slen2 = vlen * (s + 1) + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2 + + f4(a, b, c, d) + } + } + } + + function v(x, y, z) { + placeholder.push(x) + placeholder.push(y) + placeholder.push(z) + } + + function f3(a, b, c) { + addVertex(a) + addVertex(b) + addVertex(c) + + var nextIndex = verticesArray.length / 3 + var uvs = uvgen.generateTopUV( + scope, + verticesArray, + nextIndex - 3, + nextIndex - 2, + nextIndex - 1 + ) + + addUV(uvs[0]) + addUV(uvs[1]) + addUV(uvs[2]) + } + + function f4(a, b, c, d) { + addVertex(a) + addVertex(b) + addVertex(d) + + addVertex(b) + addVertex(c) + addVertex(d) + + var nextIndex = verticesArray.length / 3 + var uvs = uvgen.generateSideWallUV( + scope, + verticesArray, + nextIndex - 6, + nextIndex - 3, + nextIndex - 2, + nextIndex - 1 + ) + + addUV(uvs[0]) + addUV(uvs[1]) + addUV(uvs[3]) + + addUV(uvs[1]) + addUV(uvs[2]) + addUV(uvs[3]) + } + + function addVertex(index) { + indicesArray.push(verticesArray.length / 3) + verticesArray.push(placeholder[index * 3 + 0]) + verticesArray.push(placeholder[index * 3 + 1]) + verticesArray.push(placeholder[index * 3 + 2]) + } + + function addUV(vector2) { + uvArray.push(vector2.x) + uvArray.push(vector2.y) + } + + if (!options.arrays) { + this.setIndex(indicesArray) + this.addAttribute('position', new Float32BufferAttribute(verticesArray, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvArray, 2)) + } + } + + ExtrudeGeometry.WorldUVGenerator = { + generateTopUV: function (geometry, vertices, indexA, indexB, indexC) { + var a_x = vertices[indexA * 3] + var a_y = vertices[indexA * 3 + 1] + var b_x = vertices[indexB * 3] + var b_y = vertices[indexB * 3 + 1] + var c_x = vertices[indexC * 3] + var c_y = vertices[indexC * 3 + 1] + + return [new Vector2(a_x, a_y), new Vector2(b_x, b_y), new Vector2(c_x, c_y)] + }, + + generateSideWallUV: function (geometry, vertices, indexA, indexB, indexC, indexD) { + var a_x = vertices[indexA * 3] + var a_y = vertices[indexA * 3 + 1] + var a_z = vertices[indexA * 3 + 2] + var b_x = vertices[indexB * 3] + var b_y = vertices[indexB * 3 + 1] + var b_z = vertices[indexB * 3 + 2] + var c_x = vertices[indexC * 3] + var c_y = vertices[indexC * 3 + 1] + var c_z = vertices[indexC * 3 + 2] + var d_x = vertices[indexD * 3] + var d_y = vertices[indexD * 3 + 1] + var d_z = vertices[indexD * 3 + 2] + + if (Math.abs(a_y - b_y) < 0.01) { + return [ + new Vector2(a_x, 1 - a_z), + new Vector2(b_x, 1 - b_z), + new Vector2(c_x, 1 - c_z), + new Vector2(d_x, 1 - d_z) + ] + } else { + return [ + new Vector2(a_y, 1 - a_z), + new Vector2(b_y, 1 - b_z), + new Vector2(c_y, 1 - c_z), + new Vector2(d_y, 1 - d_z) + ] + } + } + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: <THREE.Font>, // font + * + * size: <float>, // size of the text + * height: <float>, // thickness to extrude text + * curveSegments: <int>, // number of points on the curves + * + * bevelEnabled: <bool>, // turn on bevel + * bevelThickness: <float>, // how deep into text bevel goes + * bevelSize: <float> // how far from text outline is bevel + * } + */ + + // TextGeometry + + function TextGeometry(text, parameters) { + Geometry.call(this) + + this.type = 'TextGeometry' + + this.parameters = { + text: text, + parameters: parameters + } + + this.fromBufferGeometry(new TextBufferGeometry(text, parameters)) + this.mergeVertices() + } + + TextGeometry.prototype = Object.create(Geometry.prototype) + TextGeometry.prototype.constructor = TextGeometry + + // TextBufferGeometry + + function TextBufferGeometry(text, parameters) { + parameters = parameters || {} + + var font = parameters.font + + if (!(font && font.isFont)) { + console.error('THREE.TextGeometry: font parameter is not an instance of THREE.Font.') + return new Geometry() + } + + var shapes = font.generateShapes(text, parameters.size, parameters.curveSegments) + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50 + + // defaults + + if (parameters.bevelThickness === undefined) parameters.bevelThickness = 10 + if (parameters.bevelSize === undefined) parameters.bevelSize = 8 + if (parameters.bevelEnabled === undefined) parameters.bevelEnabled = false + + ExtrudeBufferGeometry.call(this, shapes, parameters) + + this.type = 'TextBufferGeometry' + } + + TextBufferGeometry.prototype = Object.create(ExtrudeBufferGeometry.prototype) + TextBufferGeometry.prototype.constructor = TextBufferGeometry + + /** + * @author mrdoob / http://mrdoob.com/ + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + */ + + // SphereGeometry + + function SphereGeometry( + radius, + widthSegments, + heightSegments, + phiStart, + phiLength, + thetaStart, + thetaLength + ) { + Geometry.call(this) + + this.type = 'SphereGeometry' + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + this.fromBufferGeometry( + new SphereBufferGeometry( + radius, + widthSegments, + heightSegments, + phiStart, + phiLength, + thetaStart, + thetaLength + ) + ) + this.mergeVertices() + } + + SphereGeometry.prototype = Object.create(Geometry.prototype) + SphereGeometry.prototype.constructor = SphereGeometry + + // SphereBufferGeometry + + function SphereBufferGeometry( + radius, + widthSegments, + heightSegments, + phiStart, + phiLength, + thetaStart, + thetaLength + ) { + BufferGeometry.call(this) + + this.type = 'SphereBufferGeometry' + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + radius = radius || 1 + + widthSegments = Math.max(3, Math.floor(widthSegments) || 8) + heightSegments = Math.max(2, Math.floor(heightSegments) || 6) + + phiStart = phiStart !== undefined ? phiStart : 0 + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2 + + thetaStart = thetaStart !== undefined ? thetaStart : 0 + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI + + var thetaEnd = thetaStart + thetaLength + + var ix, iy + + var index = 0 + var grid = [] + + var vertex = new Vector3() + var normal = new Vector3() + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // generate vertices, normals and uvs + + for (iy = 0; iy <= heightSegments; iy++) { + var verticesRow = [] + + var v = iy / heightSegments + + for (ix = 0; ix <= widthSegments; ix++) { + var u = ix / widthSegments + + // vertex + + vertex.x = + -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength) + vertex.y = radius * Math.cos(thetaStart + v * thetaLength) + vertex.z = + radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength) + + vertices.push(vertex.x, vertex.y, vertex.z) + + // normal + + normal.set(vertex.x, vertex.y, vertex.z).normalize() + normals.push(normal.x, normal.y, normal.z) + + // uv + + uvs.push(u, 1 - v) + + verticesRow.push(index++) + } + + grid.push(verticesRow) + } + + // indices + + for (iy = 0; iy < heightSegments; iy++) { + for (ix = 0; ix < widthSegments; ix++) { + var a = grid[iy][ix + 1] + var b = grid[iy][ix] + var c = grid[iy + 1][ix] + var d = grid[iy + 1][ix + 1] + + if (iy !== 0 || thetaStart > 0) indices.push(a, b, d) + if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d) + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + } + + SphereBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry + + /** + * @author Kaleb Murphy + * @author Mugen87 / https://github.com/Mugen87 + */ + + // RingGeometry + + function RingGeometry( + innerRadius, + outerRadius, + thetaSegments, + phiSegments, + thetaStart, + thetaLength + ) { + Geometry.call(this) + + this.type = 'RingGeometry' + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + this.fromBufferGeometry( + new RingBufferGeometry( + innerRadius, + outerRadius, + thetaSegments, + phiSegments, + thetaStart, + thetaLength + ) + ) + this.mergeVertices() + } + + RingGeometry.prototype = Object.create(Geometry.prototype) + RingGeometry.prototype.constructor = RingGeometry + + // RingBufferGeometry + + function RingBufferGeometry( + innerRadius, + outerRadius, + thetaSegments, + phiSegments, + thetaStart, + thetaLength + ) { + BufferGeometry.call(this) + + this.type = 'RingBufferGeometry' + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + innerRadius = innerRadius || 0.5 + outerRadius = outerRadius || 1 + + thetaStart = thetaStart !== undefined ? thetaStart : 0 + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2 + + thetaSegments = thetaSegments !== undefined ? Math.max(3, thetaSegments) : 8 + phiSegments = phiSegments !== undefined ? Math.max(1, phiSegments) : 1 + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // some helper variables + + var segment + var radius = innerRadius + var radiusStep = (outerRadius - innerRadius) / phiSegments + var vertex = new Vector3() + var uv = new Vector2() + var j, i + + // generate vertices, normals and uvs + + for (j = 0; j <= phiSegments; j++) { + for (i = 0; i <= thetaSegments; i++) { + // values are generate from the inside of the ring to the outside + + segment = thetaStart + (i / thetaSegments) * thetaLength + + // vertex + + vertex.x = radius * Math.cos(segment) + vertex.y = radius * Math.sin(segment) + + vertices.push(vertex.x, vertex.y, vertex.z) + + // normal + + normals.push(0, 0, 1) + + // uv + + uv.x = (vertex.x / outerRadius + 1) / 2 + uv.y = (vertex.y / outerRadius + 1) / 2 + + uvs.push(uv.x, uv.y) + } + + // increase the radius for next row of vertices + + radius += radiusStep + } + + // indices + + for (j = 0; j < phiSegments; j++) { + var thetaSegmentLevel = j * (thetaSegments + 1) + + for (i = 0; i < thetaSegments; i++) { + segment = i + thetaSegmentLevel + + var a = segment + var b = segment + thetaSegments + 1 + var c = segment + thetaSegments + 2 + var d = segment + 1 + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + } + + RingBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + RingBufferGeometry.prototype.constructor = RingBufferGeometry + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + * @author Mugen87 / https://github.com/Mugen87 + */ + + // LatheGeometry + + function LatheGeometry(points, segments, phiStart, phiLength) { + Geometry.call(this) + + this.type = 'LatheGeometry' + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + } + + this.fromBufferGeometry(new LatheBufferGeometry(points, segments, phiStart, phiLength)) + this.mergeVertices() + } + + LatheGeometry.prototype = Object.create(Geometry.prototype) + LatheGeometry.prototype.constructor = LatheGeometry + + // LatheBufferGeometry + + function LatheBufferGeometry(points, segments, phiStart, phiLength) { + BufferGeometry.call(this) + + this.type = 'LatheBufferGeometry' + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + } + + segments = Math.floor(segments) || 12 + phiStart = phiStart || 0 + phiLength = phiLength || Math.PI * 2 + + // clamp phiLength so it's in range of [ 0, 2PI ] + + phiLength = _Math.clamp(phiLength, 0, Math.PI * 2) + + // buffers + + var indices = [] + var vertices = [] + var uvs = [] + + // helper variables + + var base + var inverseSegments = 1.0 / segments + var vertex = new Vector3() + var uv = new Vector2() + var i, j + + // generate vertices and uvs + + for (i = 0; i <= segments; i++) { + var phi = phiStart + i * inverseSegments * phiLength + + var sin = Math.sin(phi) + var cos = Math.cos(phi) + + for (j = 0; j <= points.length - 1; j++) { + // vertex + + vertex.x = points[j].x * sin + vertex.y = points[j].y + vertex.z = points[j].x * cos + + vertices.push(vertex.x, vertex.y, vertex.z) + + // uv + + uv.x = i / segments + uv.y = j / (points.length - 1) + + uvs.push(uv.x, uv.y) + } + } + + // indices + + for (i = 0; i < segments; i++) { + for (j = 0; j < points.length - 1; j++) { + base = j + i * points.length + + var a = base + var b = base + points.length + var c = base + points.length + 1 + var d = base + 1 + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + + // generate normals + + this.computeVertexNormals() + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if (phiLength === Math.PI * 2) { + var normals = this.attributes.normal.array + var n1 = new Vector3() + var n2 = new Vector3() + var n = new Vector3() + + // this is the buffer offset for the last line of vertices + + base = segments * points.length * 3 + + for (i = 0, j = 0; i < points.length; i++, j += 3) { + // select the normal of the vertex in the first line + + n1.x = normals[j + 0] + n1.y = normals[j + 1] + n1.z = normals[j + 2] + + // select the normal of the vertex in the last line + + n2.x = normals[base + j + 0] + n2.y = normals[base + j + 1] + n2.z = normals[base + j + 2] + + // average normals + + n.addVectors(n1, n2).normalize() + + // assign the new values to both normals + + normals[j + 0] = normals[base + j + 0] = n.x + normals[j + 1] = normals[base + j + 1] = n.y + normals[j + 2] = normals[base + j + 2] = n.z + } + } + } + + LatheBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry + + /** + * @author jonobr1 / http://jonobr1.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + // ShapeGeometry + + function ShapeGeometry(shapes, curveSegments) { + Geometry.call(this) + + this.type = 'ShapeGeometry' + + if (typeof curveSegments === 'object') { + console.warn('THREE.ShapeGeometry: Options parameter has been removed.') + + curveSegments = curveSegments.curveSegments + } + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + } + + this.fromBufferGeometry(new ShapeBufferGeometry(shapes, curveSegments)) + this.mergeVertices() + } + + ShapeGeometry.prototype = Object.create(Geometry.prototype) + ShapeGeometry.prototype.constructor = ShapeGeometry + + ShapeGeometry.prototype.toJSON = function () { + var data = Geometry.prototype.toJSON.call(this) + + var shapes = this.parameters.shapes + + return toJSON(shapes, data) + } + + // ShapeBufferGeometry + + function ShapeBufferGeometry(shapes, curveSegments) { + BufferGeometry.call(this) + + this.type = 'ShapeBufferGeometry' + + this.parameters = { + shapes: shapes, + curveSegments: curveSegments + } + + curveSegments = curveSegments || 12 + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // helper variables + + var groupStart = 0 + var groupCount = 0 + + // allow single and array values for "shapes" parameter + + if (Array.isArray(shapes) === false) { + addShape(shapes) + } else { + for (var i = 0; i < shapes.length; i++) { + addShape(shapes[i]) + + this.addGroup(groupStart, groupCount, i) // enables MultiMaterial support + + groupStart += groupCount + groupCount = 0 + } + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + + // helper functions + + function addShape(shape) { + var i, l, shapeHole + + var indexOffset = vertices.length / 3 + var points = shape.extractPoints(curveSegments) + + var shapeVertices = points.shape + var shapeHoles = points.holes + + // check direction of vertices + + if (ShapeUtils.isClockWise(shapeVertices) === false) { + shapeVertices = shapeVertices.reverse() + + // also check if holes are in the opposite direction + + for (i = 0, l = shapeHoles.length; i < l; i++) { + shapeHole = shapeHoles[i] + + if (ShapeUtils.isClockWise(shapeHole) === true) { + shapeHoles[i] = shapeHole.reverse() + } + } + } + + var faces = ShapeUtils.triangulateShape(shapeVertices, shapeHoles) + + // join vertices of inner and outer paths to a single array + + for (i = 0, l = shapeHoles.length; i < l; i++) { + shapeHole = shapeHoles[i] + shapeVertices = shapeVertices.concat(shapeHole) + } + + // vertices, normals, uvs + + for (i = 0, l = shapeVertices.length; i < l; i++) { + var vertex = shapeVertices[i] + + vertices.push(vertex.x, vertex.y, 0) + normals.push(0, 0, 1) + uvs.push(vertex.x, vertex.y) // world uvs + } + + // incides + + for (i = 0, l = faces.length; i < l; i++) { + var face = faces[i] + + var a = face[0] + indexOffset + var b = face[1] + indexOffset + var c = face[2] + indexOffset + + indices.push(a, b, c) + groupCount += 3 + } + } + } + + ShapeBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry + + ShapeBufferGeometry.prototype.toJSON = function () { + var data = BufferGeometry.prototype.toJSON.call(this) + + var shapes = this.parameters.shapes + + return toJSON(shapes, data) + } + + // + + function toJSON(shapes, data) { + data.shapes = [] + + if (Array.isArray(shapes)) { + for (var i = 0, l = shapes.length; i < l; i++) { + var shape = shapes[i] + + data.shapes.push(shape.uuid) + } + } else { + data.shapes.push(shapes.uuid) + } + + return data + } + + /** + * @author WestLangley / http://github.com/WestLangley + * @author Mugen87 / https://github.com/Mugen87 + */ + + function EdgesGeometry(geometry, thresholdAngle) { + BufferGeometry.call(this) + + this.type = 'EdgesGeometry' + + this.parameters = { + thresholdAngle: thresholdAngle + } + + thresholdAngle = thresholdAngle !== undefined ? thresholdAngle : 1 + + // buffer + + var vertices = [] + + // helper variables + + var thresholdDot = Math.cos(_Math.DEG2RAD * thresholdAngle) + var edge = [0, 0], + edges = {}, + edge1, + edge2 + var key, + keys = ['a', 'b', 'c'] + + // prepare source geometry + + var geometry2 + + if (geometry.isBufferGeometry) { + geometry2 = new Geometry() + geometry2.fromBufferGeometry(geometry) + } else { + geometry2 = geometry.clone() + } + + geometry2.mergeVertices() + geometry2.computeFaceNormals() + + var sourceVertices = geometry2.vertices + var faces = geometry2.faces + + // now create a data structure where each entry represents an edge with its adjoining faces + + for (var i = 0, l = faces.length; i < l; i++) { + var face = faces[i] + + for (var j = 0; j < 3; j++) { + edge1 = face[keys[j]] + edge2 = face[keys[(j + 1) % 3]] + edge[0] = Math.min(edge1, edge2) + edge[1] = Math.max(edge1, edge2) + + key = edge[0] + ',' + edge[1] + + if (edges[key] === undefined) { + edges[key] = { index1: edge[0], index2: edge[1], face1: i, face2: undefined } + } else { + edges[key].face2 = i + } + } + } + + // generate vertices + + for (key in edges) { + var e = edges[key] + + // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. + + if ( + e.face2 === undefined || + faces[e.face1].normal.dot(faces[e.face2].normal) <= thresholdDot + ) { + var vertex = sourceVertices[e.index1] + vertices.push(vertex.x, vertex.y, vertex.z) + + vertex = sourceVertices[e.index2] + vertices.push(vertex.x, vertex.y, vertex.z) + } + } + + // build geometry + + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + } + + EdgesGeometry.prototype = Object.create(BufferGeometry.prototype) + EdgesGeometry.prototype.constructor = EdgesGeometry + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + // CylinderGeometry + + function CylinderGeometry( + radiusTop, + radiusBottom, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + ) { + Geometry.call(this) + + this.type = 'CylinderGeometry' + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + this.fromBufferGeometry( + new CylinderBufferGeometry( + radiusTop, + radiusBottom, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + ) + ) + this.mergeVertices() + } + + CylinderGeometry.prototype = Object.create(Geometry.prototype) + CylinderGeometry.prototype.constructor = CylinderGeometry + + // CylinderBufferGeometry + + function CylinderBufferGeometry( + radiusTop, + radiusBottom, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + ) { + BufferGeometry.call(this) + + this.type = 'CylinderBufferGeometry' + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + var scope = this + + radiusTop = radiusTop !== undefined ? radiusTop : 1 + radiusBottom = radiusBottom !== undefined ? radiusBottom : 1 + height = height || 1 + + radialSegments = Math.floor(radialSegments) || 8 + heightSegments = Math.floor(heightSegments) || 1 + + openEnded = openEnded !== undefined ? openEnded : false + thetaStart = thetaStart !== undefined ? thetaStart : 0.0 + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2 + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // helper variables + + var index = 0 + var indexArray = [] + var halfHeight = height / 2 + var groupStart = 0 + + // generate geometry + + generateTorso() + + if (openEnded === false) { + if (radiusTop > 0) generateCap(true) + if (radiusBottom > 0) generateCap(false) + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + + function generateTorso() { + var x, y + var normal = new Vector3() + var vertex = new Vector3() + + var groupCount = 0 + + // this will be used to calculate the normal + var slope = (radiusBottom - radiusTop) / height + + // generate vertices, normals and uvs + + for (y = 0; y <= heightSegments; y++) { + var indexRow = [] + + var v = y / heightSegments + + // calculate the radius of the current row + + var radius = v * (radiusBottom - radiusTop) + radiusTop + + for (x = 0; x <= radialSegments; x++) { + var u = x / radialSegments + + var theta = u * thetaLength + thetaStart + + var sinTheta = Math.sin(theta) + var cosTheta = Math.cos(theta) + + // vertex + + vertex.x = radius * sinTheta + vertex.y = -v * height + halfHeight + vertex.z = radius * cosTheta + vertices.push(vertex.x, vertex.y, vertex.z) + + // normal + + normal.set(sinTheta, slope, cosTheta).normalize() + normals.push(normal.x, normal.y, normal.z) + + // uv + + uvs.push(u, 1 - v) + + // save index of vertex in respective row + + indexRow.push(index++) + } + + // now save vertices of the row in our index array + + indexArray.push(indexRow) + } + + // generate indices + + for (x = 0; x < radialSegments; x++) { + for (y = 0; y < heightSegments; y++) { + // we use the index array to access the correct indices + + var a = indexArray[y][x] + var b = indexArray[y + 1][x] + var c = indexArray[y + 1][x + 1] + var d = indexArray[y][x + 1] + + // faces + + indices.push(a, b, d) + indices.push(b, c, d) + + // update group counter + + groupCount += 6 + } + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup(groupStart, groupCount, 0) + + // calculate new start value for groups + + groupStart += groupCount + } + + function generateCap(top) { + var x, centerIndexStart, centerIndexEnd + + var uv = new Vector2() + var vertex = new Vector3() + + var groupCount = 0 + + var radius = top === true ? radiusTop : radiusBottom + var sign = top === true ? 1 : -1 + + // save the index of the first center vertex + centerIndexStart = index + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for (x = 1; x <= radialSegments; x++) { + // vertex + + vertices.push(0, halfHeight * sign, 0) + + // normal + + normals.push(0, sign, 0) + + // uv + + uvs.push(0.5, 0.5) + + // increase index + + index++ + } + + // save the index of the last center vertex + + centerIndexEnd = index + + // now we generate the surrounding vertices, normals and uvs + + for (x = 0; x <= radialSegments; x++) { + var u = x / radialSegments + var theta = u * thetaLength + thetaStart + + var cosTheta = Math.cos(theta) + var sinTheta = Math.sin(theta) + + // vertex + + vertex.x = radius * sinTheta + vertex.y = halfHeight * sign + vertex.z = radius * cosTheta + vertices.push(vertex.x, vertex.y, vertex.z) + + // normal + + normals.push(0, sign, 0) + + // uv + + uv.x = cosTheta * 0.5 + 0.5 + uv.y = sinTheta * 0.5 * sign + 0.5 + uvs.push(uv.x, uv.y) + + // increase index + + index++ + } + + // generate indices + + for (x = 0; x < radialSegments; x++) { + var c = centerIndexStart + x + var i = centerIndexEnd + x + + if (top === true) { + // face top + + indices.push(i, i + 1, c) + } else { + // face bottom + + indices.push(i + 1, i, c) + } + + groupCount += 3 + } + + // add a group to the geometry. this will ensure multi material support + + scope.addGroup(groupStart, groupCount, top === true ? 1 : 2) + + // calculate new start value for groups + + groupStart += groupCount + } + } + + CylinderBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry + + /** + * @author abelnation / http://github.com/abelnation + */ + + // ConeGeometry + + function ConeGeometry( + radius, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + ) { + CylinderGeometry.call( + this, + 0, + radius, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + ) + + this.type = 'ConeGeometry' + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + } + } + + ConeGeometry.prototype = Object.create(CylinderGeometry.prototype) + ConeGeometry.prototype.constructor = ConeGeometry + + // ConeBufferGeometry + + function ConeBufferGeometry( + radius, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + ) { + CylinderBufferGeometry.call( + this, + 0, + radius, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + ) + + this.type = 'ConeBufferGeometry' + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + } + } + + ConeBufferGeometry.prototype = Object.create(CylinderBufferGeometry.prototype) + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * @author Mugen87 / https://github.com/Mugen87 + * @author hughes + */ + + // CircleGeometry + + function CircleGeometry(radius, segments, thetaStart, thetaLength) { + Geometry.call(this) + + this.type = 'CircleGeometry' + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + this.fromBufferGeometry(new CircleBufferGeometry(radius, segments, thetaStart, thetaLength)) + this.mergeVertices() + } + + CircleGeometry.prototype = Object.create(Geometry.prototype) + CircleGeometry.prototype.constructor = CircleGeometry + + // CircleBufferGeometry + + function CircleBufferGeometry(radius, segments, thetaStart, thetaLength) { + BufferGeometry.call(this) + + this.type = 'CircleBufferGeometry' + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + } + + radius = radius || 1 + segments = segments !== undefined ? Math.max(3, segments) : 8 + + thetaStart = thetaStart !== undefined ? thetaStart : 0 + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2 + + // buffers + + var indices = [] + var vertices = [] + var normals = [] + var uvs = [] + + // helper variables + + var i, s + var vertex = new Vector3() + var uv = new Vector2() + + // center point + + vertices.push(0, 0, 0) + normals.push(0, 0, 1) + uvs.push(0.5, 0.5) + + for (s = 0, i = 3; s <= segments; s++, i += 3) { + var segment = thetaStart + (s / segments) * thetaLength + + // vertex + + vertex.x = radius * Math.cos(segment) + vertex.y = radius * Math.sin(segment) + + vertices.push(vertex.x, vertex.y, vertex.z) + + // normal + + normals.push(0, 0, 1) + + // uvs + + uv.x = (vertices[i] / radius + 1) / 2 + uv.y = (vertices[i + 1] / radius + 1) / 2 + + uvs.push(uv.x, uv.y) + } + + // indices + + for (i = 1; i <= segments; i++) { + indices.push(i, i + 1, 0) + } + + // build geometry + + this.setIndex(indices) + this.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + this.addAttribute('normal', new Float32BufferAttribute(normals, 3)) + this.addAttribute('uv', new Float32BufferAttribute(uvs, 2)) + } + + CircleBufferGeometry.prototype = Object.create(BufferGeometry.prototype) + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + TextBufferGeometry: TextBufferGeometry, + SphereGeometry: SphereGeometry, + SphereBufferGeometry: SphereBufferGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneGeometry: PlaneGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ShapeBufferGeometry: ShapeBufferGeometry, + ExtrudeGeometry: ExtrudeGeometry, + ExtrudeBufferGeometry: ExtrudeBufferGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleGeometry: CircleGeometry, + CircleBufferGeometry: CircleBufferGeometry, + BoxGeometry: BoxGeometry, + BoxBufferGeometry: BoxBufferGeometry + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * color: <THREE.Color>, + * opacity: <float> + * } + */ + + function ShadowMaterial(parameters) { + Material.call(this) + + this.type = 'ShadowMaterial' + + this.color = new Color(0x000000) + this.opacity = 1.0 + + this.lights = true + this.transparent = true + + this.setValues(parameters) + } + + ShadowMaterial.prototype = Object.create(Material.prototype) + ShadowMaterial.prototype.constructor = ShadowMaterial + + ShadowMaterial.prototype.isShadowMaterial = true + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial(parameters) { + ShaderMaterial.call(this, parameters) + + this.type = 'RawShaderMaterial' + } + + RawShaderMaterial.prototype = Object.create(ShaderMaterial.prototype) + RawShaderMaterial.prototype.constructor = RawShaderMaterial + + RawShaderMaterial.prototype.isRawShaderMaterial = true + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: <hex>, + * roughness: <float>, + * metalness: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * roughnessMap: new THREE.Texture( <Image> ), + * + * metalnessMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: <float> + * + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshStandardMaterial(parameters) { + Material.call(this) + + this.defines = { STANDARD: '' } + + this.type = 'MeshStandardMaterial' + + this.color = new Color(0xffffff) // diffuse + this.roughness = 0.5 + this.metalness = 0.5 + + this.map = null + + this.lightMap = null + this.lightMapIntensity = 1.0 + + this.aoMap = null + this.aoMapIntensity = 1.0 + + this.emissive = new Color(0x000000) + this.emissiveIntensity = 1.0 + this.emissiveMap = null + + this.bumpMap = null + this.bumpScale = 1 + + this.normalMap = null + this.normalScale = new Vector2(1, 1) + + this.displacementMap = null + this.displacementScale = 1 + this.displacementBias = 0 + + this.roughnessMap = null + + this.metalnessMap = null + + this.alphaMap = null + + this.envMap = null + this.envMapIntensity = 1.0 + + this.refractionRatio = 0.98 + + this.wireframe = false + this.wireframeLinewidth = 1 + this.wireframeLinecap = 'round' + this.wireframeLinejoin = 'round' + + this.skinning = false + this.morphTargets = false + this.morphNormals = false + + this.setValues(parameters) + } + + MeshStandardMaterial.prototype = Object.create(Material.prototype) + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true + + MeshStandardMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.defines = { STANDARD: '' } + + this.color.copy(source.color) + this.roughness = source.roughness + this.metalness = source.metalness + + this.map = source.map + + this.lightMap = source.lightMap + this.lightMapIntensity = source.lightMapIntensity + + this.aoMap = source.aoMap + this.aoMapIntensity = source.aoMapIntensity + + this.emissive.copy(source.emissive) + this.emissiveMap = source.emissiveMap + this.emissiveIntensity = source.emissiveIntensity + + this.bumpMap = source.bumpMap + this.bumpScale = source.bumpScale + + this.normalMap = source.normalMap + this.normalScale.copy(source.normalScale) + + this.displacementMap = source.displacementMap + this.displacementScale = source.displacementScale + this.displacementBias = source.displacementBias + + this.roughnessMap = source.roughnessMap + + this.metalnessMap = source.metalnessMap + + this.alphaMap = source.alphaMap + + this.envMap = source.envMap + this.envMapIntensity = source.envMapIntensity + + this.refractionRatio = source.refractionRatio + + this.wireframe = source.wireframe + this.wireframeLinewidth = source.wireframeLinewidth + this.wireframeLinecap = source.wireframeLinecap + this.wireframeLinejoin = source.wireframeLinejoin + + this.skinning = source.skinning + this.morphTargets = source.morphTargets + this.morphNormals = source.morphNormals + + return this + } + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: <float> + * } + */ + + function MeshPhysicalMaterial(parameters) { + MeshStandardMaterial.call(this) + + this.defines = { PHYSICAL: '' } + + this.type = 'MeshPhysicalMaterial' + + this.reflectivity = 0.5 // maps to F0 = 0.04 + + this.clearCoat = 0.0 + this.clearCoatRoughness = 0.0 + + this.setValues(parameters) + } + + MeshPhysicalMaterial.prototype = Object.create(MeshStandardMaterial.prototype) + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true + + MeshPhysicalMaterial.prototype.copy = function (source) { + MeshStandardMaterial.prototype.copy.call(this, source) + + this.defines = { PHYSICAL: '' } + + this.reflectivity = source.reflectivity + + this.clearCoat = source.clearCoat + this.clearCoatRoughness = source.clearCoatRoughness + + return this + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * specular: <hex>, + * shininess: <float>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshPhongMaterial(parameters) { + Material.call(this) + + this.type = 'MeshPhongMaterial' + + this.color = new Color(0xffffff) // diffuse + this.specular = new Color(0x111111) + this.shininess = 30 + + this.map = null + + this.lightMap = null + this.lightMapIntensity = 1.0 + + this.aoMap = null + this.aoMapIntensity = 1.0 + + this.emissive = new Color(0x000000) + this.emissiveIntensity = 1.0 + this.emissiveMap = null + + this.bumpMap = null + this.bumpScale = 1 + + this.normalMap = null + this.normalScale = new Vector2(1, 1) + + this.displacementMap = null + this.displacementScale = 1 + this.displacementBias = 0 + + this.specularMap = null + + this.alphaMap = null + + this.envMap = null + this.combine = MultiplyOperation + this.reflectivity = 1 + this.refractionRatio = 0.98 + + this.wireframe = false + this.wireframeLinewidth = 1 + this.wireframeLinecap = 'round' + this.wireframeLinejoin = 'round' + + this.skinning = false + this.morphTargets = false + this.morphNormals = false + + this.setValues(parameters) + } + + MeshPhongMaterial.prototype = Object.create(Material.prototype) + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true + + MeshPhongMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.color.copy(source.color) + this.specular.copy(source.specular) + this.shininess = source.shininess + + this.map = source.map + + this.lightMap = source.lightMap + this.lightMapIntensity = source.lightMapIntensity + + this.aoMap = source.aoMap + this.aoMapIntensity = source.aoMapIntensity + + this.emissive.copy(source.emissive) + this.emissiveMap = source.emissiveMap + this.emissiveIntensity = source.emissiveIntensity + + this.bumpMap = source.bumpMap + this.bumpScale = source.bumpScale + + this.normalMap = source.normalMap + this.normalScale.copy(source.normalScale) + + this.displacementMap = source.displacementMap + this.displacementScale = source.displacementScale + this.displacementBias = source.displacementBias + + this.specularMap = source.specularMap + + this.alphaMap = source.alphaMap + + this.envMap = source.envMap + this.combine = source.combine + this.reflectivity = source.reflectivity + this.refractionRatio = source.refractionRatio + + this.wireframe = source.wireframe + this.wireframeLinewidth = source.wireframeLinewidth + this.wireframeLinecap = source.wireframeLinecap + this.wireframeLinejoin = source.wireframeLinejoin + + this.skinning = source.skinning + this.morphTargets = source.morphTargets + this.morphNormals = source.morphNormals + + return this + } + + /** + * @author takahirox / http://github.com/takahirox + * + * parameters = { + * gradientMap: new THREE.Texture( <Image> ) + * } + */ + + function MeshToonMaterial(parameters) { + MeshPhongMaterial.call(this) + + this.defines = { TOON: '' } + + this.type = 'MeshToonMaterial' + + this.gradientMap = null + + this.setValues(parameters) + } + + MeshToonMaterial.prototype = Object.create(MeshPhongMaterial.prototype) + MeshToonMaterial.prototype.constructor = MeshToonMaterial + + MeshToonMaterial.prototype.isMeshToonMaterial = true + + MeshToonMaterial.prototype.copy = function (source) { + MeshPhongMaterial.prototype.copy.call(this, source) + + this.gradientMap = source.gradientMap + + return this + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * opacity: <float>, + * + * bumpMap: new THREE.Texture( <Image> ), + * bumpScale: <float>, + * + * normalMap: new THREE.Texture( <Image> ), + * normalScale: <Vector2>, + * + * displacementMap: new THREE.Texture( <Image> ), + * displacementScale: <float>, + * displacementBias: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float> + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshNormalMaterial(parameters) { + Material.call(this) + + this.type = 'MeshNormalMaterial' + + this.bumpMap = null + this.bumpScale = 1 + + this.normalMap = null + this.normalScale = new Vector2(1, 1) + + this.displacementMap = null + this.displacementScale = 1 + this.displacementBias = 0 + + this.wireframe = false + this.wireframeLinewidth = 1 + + this.fog = false + this.lights = false + + this.skinning = false + this.morphTargets = false + this.morphNormals = false + + this.setValues(parameters) + } + + MeshNormalMaterial.prototype = Object.create(Material.prototype) + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true + + MeshNormalMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.bumpMap = source.bumpMap + this.bumpScale = source.bumpScale + + this.normalMap = source.normalMap + this.normalScale.copy(source.normalScale) + + this.displacementMap = source.displacementMap + this.displacementScale = source.displacementScale + this.displacementBias = source.displacementBias + + this.wireframe = source.wireframe + this.wireframeLinewidth = source.wireframeLinewidth + + this.skinning = source.skinning + this.morphTargets = source.morphTargets + this.morphNormals = source.morphNormals + + return this + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * map: new THREE.Texture( <Image> ), + * + * lightMap: new THREE.Texture( <Image> ), + * lightMapIntensity: <float> + * + * aoMap: new THREE.Texture( <Image> ), + * aoMapIntensity: <float> + * + * emissive: <hex>, + * emissiveIntensity: <float> + * emissiveMap: new THREE.Texture( <Image> ), + * + * specularMap: new THREE.Texture( <Image> ), + * + * alphaMap: new THREE.Texture( <Image> ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: <float>, + * refractionRatio: <float>, + * + * wireframe: <boolean>, + * wireframeLinewidth: <float>, + * + * skinning: <bool>, + * morphTargets: <bool>, + * morphNormals: <bool> + * } + */ + + function MeshLambertMaterial(parameters) { + Material.call(this) + + this.type = 'MeshLambertMaterial' + + this.color = new Color(0xffffff) // diffuse + + this.map = null + + this.lightMap = null + this.lightMapIntensity = 1.0 + + this.aoMap = null + this.aoMapIntensity = 1.0 + + this.emissive = new Color(0x000000) + this.emissiveIntensity = 1.0 + this.emissiveMap = null + + this.specularMap = null + + this.alphaMap = null + + this.envMap = null + this.combine = MultiplyOperation + this.reflectivity = 1 + this.refractionRatio = 0.98 + + this.wireframe = false + this.wireframeLinewidth = 1 + this.wireframeLinecap = 'round' + this.wireframeLinejoin = 'round' + + this.skinning = false + this.morphTargets = false + this.morphNormals = false + + this.setValues(parameters) + } + + MeshLambertMaterial.prototype = Object.create(Material.prototype) + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true + + MeshLambertMaterial.prototype.copy = function (source) { + Material.prototype.copy.call(this, source) + + this.color.copy(source.color) + + this.map = source.map + + this.lightMap = source.lightMap + this.lightMapIntensity = source.lightMapIntensity + + this.aoMap = source.aoMap + this.aoMapIntensity = source.aoMapIntensity + + this.emissive.copy(source.emissive) + this.emissiveMap = source.emissiveMap + this.emissiveIntensity = source.emissiveIntensity + + this.specularMap = source.specularMap + + this.alphaMap = source.alphaMap + + this.envMap = source.envMap + this.combine = source.combine + this.reflectivity = source.reflectivity + this.refractionRatio = source.refractionRatio + + this.wireframe = source.wireframe + this.wireframeLinewidth = source.wireframeLinewidth + this.wireframeLinecap = source.wireframeLinecap + this.wireframeLinejoin = source.wireframeLinejoin + + this.skinning = source.skinning + this.morphTargets = source.morphTargets + this.morphNormals = source.morphNormals + + return this + } + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: <hex>, + * opacity: <float>, + * + * linewidth: <float>, + * + * scale: <float>, + * dashSize: <float>, + * gapSize: <float> + * } + */ + + function LineDashedMaterial(parameters) { + LineBasicMaterial.call(this) + + this.type = 'LineDashedMaterial' + + this.scale = 1 + this.dashSize = 3 + this.gapSize = 1 + + this.setValues(parameters) + } + + LineDashedMaterial.prototype = Object.create(LineBasicMaterial.prototype) + LineDashedMaterial.prototype.constructor = LineDashedMaterial + + LineDashedMaterial.prototype.isLineDashedMaterial = true + + LineDashedMaterial.prototype.copy = function (source) { + LineBasicMaterial.prototype.copy.call(this, source) + + this.scale = source.scale + this.dashSize = source.dashSize + this.gapSize = source.gapSize + + return this + } + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshToonMaterial: MeshToonMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshDistanceMaterial: MeshDistanceMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + enabled: false, + + files: {}, + + add: function (key, file) { + if (this.enabled === false) return + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[key] = file + }, + + get: function (key) { + if (this.enabled === false) return + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[key] + }, + + remove: function (key) { + delete this.files[key] + }, + + clear: function () { + this.files = {} + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager(onLoad, onProgress, onError) { + var scope = this + + var isLoading = false + var itemsLoaded = 0 + var itemsTotal = 0 + var urlModifier = undefined + + this.onStart = undefined + this.onLoad = onLoad + this.onProgress = onProgress + this.onError = onError + + this.itemStart = function (url) { + itemsTotal++ + + if (isLoading === false) { + if (scope.onStart !== undefined) { + scope.onStart(url, itemsLoaded, itemsTotal) + } + } + + isLoading = true + } + + this.itemEnd = function (url) { + itemsLoaded++ + + if (scope.onProgress !== undefined) { + scope.onProgress(url, itemsLoaded, itemsTotal) + } + + if (itemsLoaded === itemsTotal) { + isLoading = false + + if (scope.onLoad !== undefined) { + scope.onLoad() + } + } + } + + this.itemError = function (url) { + if (scope.onError !== undefined) { + scope.onError(url) + } + } + + this.resolveURL = function (url) { + if (urlModifier) { + return urlModifier(url) + } + + return url + } + + this.setURLModifier = function (transform) { + urlModifier = transform + return this + } + } + + var DefaultLoadingManager = new LoadingManager() + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var loading = {} + + function FileLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + } + + Object.assign(FileLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + if (url === undefined) url = '' + + if (this.path !== undefined) url = this.path + url + + url = this.manager.resolveURL(url) + + var scope = this + + var cached = Cache.get(url) + + if (cached !== undefined) { + scope.manager.itemStart(url) + + setTimeout(function () { + if (onLoad) onLoad(cached) + + scope.manager.itemEnd(url) + }, 0) + + return cached + } + + // Check if request is duplicate + + if (loading[url] !== undefined) { + loading[url].push({ + onLoad: onLoad, + onProgress: onProgress, + onError: onError + }) + + return + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/ + var dataUriRegexResult = url.match(dataUriRegex) + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if (dataUriRegexResult) { + var mimeType = dataUriRegexResult[1] + var isBase64 = !!dataUriRegexResult[2] + var data = dataUriRegexResult[3] + + data = window.decodeURIComponent(data) + + if (isBase64) data = window.atob(data) + + try { + var response + var responseType = (this.responseType || '').toLowerCase() + + switch (responseType) { + case 'arraybuffer': + case 'blob': + var view = new Uint8Array(data.length) + + for (var i = 0; i < data.length; i++) { + view[i] = data.charCodeAt(i) + } + + if (responseType === 'blob') { + response = new Blob([view.buffer], { type: mimeType }) + } else { + response = view.buffer + } + + break + + case 'document': + var parser = new DOMParser() + response = parser.parseFromString(data, mimeType) + + break + + case 'json': + response = JSON.parse(data) + + break + + default: // 'text' or other + response = data + + break + } + + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + window.setTimeout(function () { + if (onLoad) onLoad(response) + + scope.manager.itemEnd(url) + }, 0) + } catch (error) { + // Wait for next browser tick like standard XMLHttpRequest event dispatching does + window.setTimeout(function () { + if (onError) onError(error) + + scope.manager.itemEnd(url) + scope.manager.itemError(url) + }, 0) + } + } else { + // Initialise array for duplicate requests + + loading[url] = [] + + loading[url].push({ + onLoad: onLoad, + onProgress: onProgress, + onError: onError + }) + + var request = new XMLHttpRequest() + + request.open('GET', url, true) + + request.addEventListener( + 'load', + function (event) { + var response = this.response + + Cache.add(url, response) + + var callbacks = loading[url] + + delete loading[url] + + if (this.status === 200) { + for (var i = 0, il = callbacks.length; i < il; i++) { + var callback = callbacks[i] + if (callback.onLoad) callback.onLoad(response) + } + + scope.manager.itemEnd(url) + } else if (this.status === 0) { + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn('THREE.FileLoader: HTTP Status 0 received.') + + for (var i = 0, il = callbacks.length; i < il; i++) { + var callback = callbacks[i] + if (callback.onLoad) callback.onLoad(response) + } + + scope.manager.itemEnd(url) + } else { + for (var i = 0, il = callbacks.length; i < il; i++) { + var callback = callbacks[i] + if (callback.onError) callback.onError(event) + } + + scope.manager.itemEnd(url) + scope.manager.itemError(url) + } + }, + false + ) + + request.addEventListener( + 'progress', + function (event) { + var callbacks = loading[url] + + for (var i = 0, il = callbacks.length; i < il; i++) { + var callback = callbacks[i] + if (callback.onProgress) callback.onProgress(event) + } + }, + false + ) + + request.addEventListener( + 'error', + function (event) { + var callbacks = loading[url] + + delete loading[url] + + for (var i = 0, il = callbacks.length; i < il; i++) { + var callback = callbacks[i] + if (callback.onError) callback.onError(event) + } + + scope.manager.itemEnd(url) + scope.manager.itemError(url) + }, + false + ) + + if (this.responseType !== undefined) request.responseType = this.responseType + if (this.withCredentials !== undefined) request.withCredentials = this.withCredentials + + if (request.overrideMimeType) + request.overrideMimeType(this.mimeType !== undefined ? this.mimeType : 'text/plain') + + for (var header in this.requestHeader) { + request.setRequestHeader(header, this.requestHeader[header]) + } + + request.send(null) + } + + scope.manager.itemStart(url) + + return request + }, + + setPath: function (value) { + this.path = value + return this + }, + + setResponseType: function (value) { + this.responseType = value + return this + }, + + setWithCredentials: function (value) { + this.withCredentials = value + return this + }, + + setMimeType: function (value) { + this.mimeType = value + return this + }, + + setRequestHeader: function (value) { + this.requestHeader = value + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + + // override in sub classes + this._parser = null + } + + Object.assign(CompressedTextureLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + var scope = this + + var images = [] + + var texture = new CompressedTexture() + texture.image = images + + var loader = new FileLoader(this.manager) + loader.setPath(this.path) + loader.setResponseType('arraybuffer') + + function loadTexture(i) { + loader.load( + url[i], + function (buffer) { + var texDatas = scope._parser(buffer, true) + + images[i] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + } + + loaded += 1 + + if (loaded === 6) { + if (texDatas.mipmapCount === 1) texture.minFilter = LinearFilter + + texture.format = texDatas.format + texture.needsUpdate = true + + if (onLoad) onLoad(texture) + } + }, + onProgress, + onError + ) + } + + if (Array.isArray(url)) { + var loaded = 0 + + for (var i = 0, il = url.length; i < il; ++i) { + loadTexture(i) + } + } else { + // compressed cubemap texture stored in a single DDS file + + loader.load( + url, + function (buffer) { + var texDatas = scope._parser(buffer, true) + + if (texDatas.isCubemap) { + var faces = texDatas.mipmaps.length / texDatas.mipmapCount + + for (var f = 0; f < faces; f++) { + images[f] = { mipmaps: [] } + + for (var i = 0; i < texDatas.mipmapCount; i++) { + images[f].mipmaps.push(texDatas.mipmaps[f * texDatas.mipmapCount + i]) + images[f].format = texDatas.format + images[f].width = texDatas.width + images[f].height = texDatas.height + } + } + } else { + texture.image.width = texDatas.width + texture.image.height = texDatas.height + texture.mipmaps = texDatas.mipmaps + } + + if (texDatas.mipmapCount === 1) { + texture.minFilter = LinearFilter + } + + texture.format = texDatas.format + texture.needsUpdate = true + + if (onLoad) onLoad(texture) + }, + onProgress, + onError + ) + } + + return texture + }, + + setPath: function (value) { + this.path = value + return this + } + }) + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + function DataTextureLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + + // override in sub classes + this._parser = null + } + + Object.assign(DataTextureLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + var scope = this + + var texture = new DataTexture() + + var loader = new FileLoader(this.manager) + loader.setResponseType('arraybuffer') + + loader.load( + url, + function (buffer) { + var texData = scope._parser(buffer) + + if (!texData) return + + if (undefined !== texData.image) { + texture.image = texData.image + } else if (undefined !== texData.data) { + texture.image.width = texData.width + texture.image.height = texData.height + texture.image.data = texData.data + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter + texture.minFilter = + undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1 + + if (undefined !== texData.format) { + texture.format = texData.format + } + if (undefined !== texData.type) { + texture.type = texData.type + } + + if (undefined !== texData.mipmaps) { + texture.mipmaps = texData.mipmaps + } + + if (1 === texData.mipmapCount) { + texture.minFilter = LinearFilter + } + + texture.needsUpdate = true + + if (onLoad) onLoad(texture, texData) + }, + onProgress, + onError + ) + + return texture + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + } + + Object.assign(ImageLoader.prototype, { + crossOrigin: 'Anonymous', + + load: function (url, onLoad, onProgress, onError) { + if (url === undefined) url = '' + + if (this.path !== undefined) url = this.path + url + + url = this.manager.resolveURL(url) + + var scope = this + + var cached = Cache.get(url) + + if (cached !== undefined) { + scope.manager.itemStart(url) + + setTimeout(function () { + if (onLoad) onLoad(cached) + + scope.manager.itemEnd(url) + }, 0) + + return cached + } + + var image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img') + + image.addEventListener( + 'load', + function () { + Cache.add(url, this) + + if (onLoad) onLoad(this) + + scope.manager.itemEnd(url) + }, + false + ) + + /* + image.addEventListener( 'progress', function ( event ) { + + if ( onProgress ) onProgress( event ); + + }, false ); + */ + + image.addEventListener( + 'error', + function (event) { + if (onError) onError(event) + + scope.manager.itemEnd(url) + scope.manager.itemError(url) + }, + false + ) + + if (url.substr(0, 5) !== 'data:') { + if (this.crossOrigin !== undefined) image.crossOrigin = this.crossOrigin + } + + scope.manager.itemStart(url) + + image.src = url + + return image + }, + + setCrossOrigin: function (value) { + this.crossOrigin = value + return this + }, + + setPath: function (value) { + this.path = value + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + } + + Object.assign(CubeTextureLoader.prototype, { + crossOrigin: 'Anonymous', + + load: function (urls, onLoad, onProgress, onError) { + var texture = new CubeTexture() + + var loader = new ImageLoader(this.manager) + loader.setCrossOrigin(this.crossOrigin) + loader.setPath(this.path) + + var loaded = 0 + + function loadTexture(i) { + loader.load( + urls[i], + function (image) { + texture.images[i] = image + + loaded++ + + if (loaded === 6) { + texture.needsUpdate = true + + if (onLoad) onLoad(texture) + } + }, + undefined, + onError + ) + } + + for (var i = 0; i < urls.length; ++i) { + loadTexture(i) + } + + return texture + }, + + setCrossOrigin: function (value) { + this.crossOrigin = value + return this + }, + + setPath: function (value) { + this.path = value + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + } + + Object.assign(TextureLoader.prototype, { + crossOrigin: 'Anonymous', + + load: function (url, onLoad, onProgress, onError) { + var texture = new Texture() + + var loader = new ImageLoader(this.manager) + loader.setCrossOrigin(this.crossOrigin) + loader.setPath(this.path) + + loader.load( + url, + function (image) { + texture.image = image + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search(/\.(jpg|jpeg)$/) > 0 || url.search(/^data\:image\/jpeg/) === 0 + + texture.format = isJPEG ? RGBFormat : RGBAFormat + texture.needsUpdate = true + + if (onLoad !== undefined) { + onLoad(texture) + } + }, + onProgress, + onError + ) + + return texture + }, + + setCrossOrigin: function (value) { + this.crossOrigin = value + return this + }, + + setPath: function (value) { + this.path = value + return this + } + }) + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of curve methods: + * .getPoint( t, optionalTarget ), .getTangent( t ) + * .getPointAt( u, optionalTarget ), .getTangentAt( u ) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following curves inherit from THREE.Curve: + * + * -- 2D curves -- + * THREE.ArcCurve + * THREE.CubicBezierCurve + * THREE.EllipseCurve + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.SplineCurve + * + * -- 3D curves -- + * THREE.CatmullRomCurve3 + * THREE.CubicBezierCurve3 + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * + * A series of curves can be represented as a THREE.CurvePath. + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() { + this.type = 'Curve' + + this.arcLengthDivisions = 200 + } + + Object.assign(Curve.prototype, { + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function (/* t, optionalTarget */) { + console.warn('THREE.Curve: .getPoint() not implemented.') + return null + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function (u, optionalTarget) { + var t = this.getUtoTmapping(u) + return this.getPoint(t, optionalTarget) + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function (divisions) { + if (divisions === undefined) divisions = 5 + + var points = [] + + for (var d = 0; d <= divisions; d++) { + points.push(this.getPoint(d / divisions)) + } + + return points + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function (divisions) { + if (divisions === undefined) divisions = 5 + + var points = [] + + for (var d = 0; d <= divisions; d++) { + points.push(this.getPointAt(d / divisions)) + } + + return points + }, + + // Get total curve arc length + + getLength: function () { + var lengths = this.getLengths() + return lengths[lengths.length - 1] + }, + + // Get list of cumulative segment lengths + + getLengths: function (divisions) { + if (divisions === undefined) divisions = this.arcLengthDivisions + + if ( + this.cacheArcLengths && + this.cacheArcLengths.length === divisions + 1 && + !this.needsUpdate + ) { + return this.cacheArcLengths + } + + this.needsUpdate = false + + var cache = [] + var current, + last = this.getPoint(0) + var p, + sum = 0 + + cache.push(0) + + for (p = 1; p <= divisions; p++) { + current = this.getPoint(p / divisions) + sum += current.distanceTo(last) + cache.push(sum) + last = current + } + + this.cacheArcLengths = cache + + return cache // { sums: cache, sum: sum }; Sum is in the last element. + }, + + updateArcLengths: function () { + this.needsUpdate = true + this.getLengths() + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function (u, distance) { + var arcLengths = this.getLengths() + + var i = 0, + il = arcLengths.length + + var targetArcLength // The targeted u distance value to get + + if (distance) { + targetArcLength = distance + } else { + targetArcLength = u * arcLengths[il - 1] + } + + // binary search for the index with largest value smaller than target u distance + + var low = 0, + high = il - 1, + comparison + + while (low <= high) { + i = Math.floor(low + (high - low) / 2) // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[i] - targetArcLength + + if (comparison < 0) { + low = i + 1 + } else if (comparison > 0) { + high = i - 1 + } else { + high = i + break + + // DONE + } + } + + i = high + + if (arcLengths[i] === targetArcLength) { + return i / (il - 1) + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[i] + var lengthAfter = arcLengths[i + 1] + + var segmentLength = lengthAfter - lengthBefore + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = (targetArcLength - lengthBefore) / segmentLength + + // add that fractional amount to t + + var t = (i + segmentFraction) / (il - 1) + + return t + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function (t) { + var delta = 0.0001 + var t1 = t - delta + var t2 = t + delta + + // Capping in case of danger + + if (t1 < 0) t1 = 0 + if (t2 > 1) t2 = 1 + + var pt1 = this.getPoint(t1) + var pt2 = this.getPoint(t2) + + var vec = pt2.clone().sub(pt1) + return vec.normalize() + }, + + getTangentAt: function (u) { + var t = this.getUtoTmapping(u) + return this.getTangent(t) + }, + + computeFrenetFrames: function (segments, closed) { + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3() + + var tangents = [] + var normals = [] + var binormals = [] + + var vec = new Vector3() + var mat = new Matrix4() + + var i, u, theta + + // compute the tangent vectors for each segment on the curve + + for (i = 0; i <= segments; i++) { + u = i / segments + + tangents[i] = this.getTangentAt(u) + tangents[i].normalize() + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[0] = new Vector3() + binormals[0] = new Vector3() + var min = Number.MAX_VALUE + var tx = Math.abs(tangents[0].x) + var ty = Math.abs(tangents[0].y) + var tz = Math.abs(tangents[0].z) + + if (tx <= min) { + min = tx + normal.set(1, 0, 0) + } + + if (ty <= min) { + min = ty + normal.set(0, 1, 0) + } + + if (tz <= min) { + normal.set(0, 0, 1) + } + + vec.crossVectors(tangents[0], normal).normalize() + + normals[0].crossVectors(tangents[0], vec) + binormals[0].crossVectors(tangents[0], normals[0]) + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for (i = 1; i <= segments; i++) { + normals[i] = normals[i - 1].clone() + + binormals[i] = binormals[i - 1].clone() + + vec.crossVectors(tangents[i - 1], tangents[i]) + + if (vec.length() > Number.EPSILON) { + vec.normalize() + + theta = Math.acos(_Math.clamp(tangents[i - 1].dot(tangents[i]), -1, 1)) // clamp for floating pt errors + + normals[i].applyMatrix4(mat.makeRotationAxis(vec, theta)) + } + + binormals[i].crossVectors(tangents[i], normals[i]) + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if (closed === true) { + theta = Math.acos(_Math.clamp(normals[0].dot(normals[segments]), -1, 1)) + theta /= segments + + if (tangents[0].dot(vec.crossVectors(normals[0], normals[segments])) > 0) { + theta = -theta + } + + for (i = 1; i <= segments; i++) { + // twist a little... + normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i], theta * i)) + binormals[i].crossVectors(tangents[i], normals[i]) + } + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + } + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (source) { + this.arcLengthDivisions = source.arcLengthDivisions + + return this + }, + + toJSON: function () { + var data = { + metadata: { + version: 4.5, + type: 'Curve', + generator: 'Curve.toJSON' + } + } + + data.arcLengthDivisions = this.arcLengthDivisions + data.type = this.type + + return data + }, + + fromJSON: function (json) { + this.arcLengthDivisions = json.arcLengthDivisions + + return this + } + }) + + function EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { + Curve.call(this) + + this.type = 'EllipseCurve' + + this.aX = aX || 0 + this.aY = aY || 0 + + this.xRadius = xRadius || 1 + this.yRadius = yRadius || 1 + + this.aStartAngle = aStartAngle || 0 + this.aEndAngle = aEndAngle || 2 * Math.PI + + this.aClockwise = aClockwise || false + + this.aRotation = aRotation || 0 + } + + EllipseCurve.prototype = Object.create(Curve.prototype) + EllipseCurve.prototype.constructor = EllipseCurve + + EllipseCurve.prototype.isEllipseCurve = true + + EllipseCurve.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector2() + + var twoPi = Math.PI * 2 + var deltaAngle = this.aEndAngle - this.aStartAngle + var samePoints = Math.abs(deltaAngle) < Number.EPSILON + + // ensures that deltaAngle is 0 .. 2 PI + while (deltaAngle < 0) deltaAngle += twoPi + while (deltaAngle > twoPi) deltaAngle -= twoPi + + if (deltaAngle < Number.EPSILON) { + if (samePoints) { + deltaAngle = 0 + } else { + deltaAngle = twoPi + } + } + + if (this.aClockwise === true && !samePoints) { + if (deltaAngle === twoPi) { + deltaAngle = -twoPi + } else { + deltaAngle = deltaAngle - twoPi + } + } + + var angle = this.aStartAngle + t * deltaAngle + var x = this.aX + this.xRadius * Math.cos(angle) + var y = this.aY + this.yRadius * Math.sin(angle) + + if (this.aRotation !== 0) { + var cos = Math.cos(this.aRotation) + var sin = Math.sin(this.aRotation) + + var tx = x - this.aX + var ty = y - this.aY + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX + y = tx * sin + ty * cos + this.aY + } + + return point.set(x, y) + } + + EllipseCurve.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.aX = source.aX + this.aY = source.aY + + this.xRadius = source.xRadius + this.yRadius = source.yRadius + + this.aStartAngle = source.aStartAngle + this.aEndAngle = source.aEndAngle + + this.aClockwise = source.aClockwise + + this.aRotation = source.aRotation + + return this + } + + EllipseCurve.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.aX = this.aX + data.aY = this.aY + + data.xRadius = this.xRadius + data.yRadius = this.yRadius + + data.aStartAngle = this.aStartAngle + data.aEndAngle = this.aEndAngle + + data.aClockwise = this.aClockwise + + data.aRotation = this.aRotation + + return data + } + + EllipseCurve.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.aX = json.aX + this.aY = json.aY + + this.xRadius = json.xRadius + this.yRadius = json.yRadius + + this.aStartAngle = json.aStartAngle + this.aEndAngle = json.aEndAngle + + this.aClockwise = json.aClockwise + + this.aRotation = json.aRotation + + return this + } + + function ArcCurve(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + EllipseCurve.call(this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise) + + this.type = 'ArcCurve' + } + + ArcCurve.prototype = Object.create(EllipseCurve.prototype) + ArcCurve.prototype.constructor = ArcCurve + + ArcCurve.prototype.isArcCurve = true + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + var c0 = 0, + c1 = 0, + c2 = 0, + c3 = 0 + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + function init(x0, x1, t0, t1) { + c0 = x0 + c1 = t0 + c2 = -3 * x0 + 3 * x1 - 2 * t0 - t1 + c3 = 2 * x0 - 2 * x1 + t0 + t1 + } + + return { + initCatmullRom: function (x0, x1, x2, x3, tension) { + init(x1, x2, tension * (x2 - x0), tension * (x3 - x1)) + }, + + initNonuniformCatmullRom: function (x0, x1, x2, x3, dt0, dt1, dt2) { + // compute tangents when parameterized in [t1,t2] + var t1 = (x1 - x0) / dt0 - (x2 - x0) / (dt0 + dt1) + (x2 - x1) / dt1 + var t2 = (x2 - x1) / dt1 - (x3 - x1) / (dt1 + dt2) + (x3 - x2) / dt2 + + // rescale tangents for parametrization in [0,1] + t1 *= dt1 + t2 *= dt1 + + init(x1, x2, t1, t2) + }, + + calc: function (t) { + var t2 = t * t + var t3 = t2 * t + return c0 + c1 * t + c2 * t2 + c3 * t3 + } + } + } + + // + + var tmp = new Vector3() + var px = new CubicPoly() + var py = new CubicPoly() + var pz = new CubicPoly() + + function CatmullRomCurve3(points, closed, curveType, tension) { + Curve.call(this) + + this.type = 'CatmullRomCurve3' + + this.points = points || [] + this.closed = closed || false + this.curveType = curveType || 'centripetal' + this.tension = tension || 0.5 + } + + CatmullRomCurve3.prototype = Object.create(Curve.prototype) + CatmullRomCurve3.prototype.constructor = CatmullRomCurve3 + + CatmullRomCurve3.prototype.isCatmullRomCurve3 = true + + CatmullRomCurve3.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector3() + + var points = this.points + var l = points.length + + var p = (l - (this.closed ? 0 : 1)) * t + var intPoint = Math.floor(p) + var weight = p - intPoint + + if (this.closed) { + intPoint += + intPoint > 0 ? 0 : (Math.floor(Math.abs(intPoint) / points.length) + 1) * points.length + } else if (weight === 0 && intPoint === l - 1) { + intPoint = l - 2 + weight = 1 + } + + var p0, p1, p2, p3 // 4 points + + if (this.closed || intPoint > 0) { + p0 = points[(intPoint - 1) % l] + } else { + // extrapolate first point + tmp.subVectors(points[0], points[1]).add(points[0]) + p0 = tmp + } + + p1 = points[intPoint % l] + p2 = points[(intPoint + 1) % l] + + if (this.closed || intPoint + 2 < l) { + p3 = points[(intPoint + 2) % l] + } else { + // extrapolate last point + tmp.subVectors(points[l - 1], points[l - 2]).add(points[l - 1]) + p3 = tmp + } + + if (this.curveType === 'centripetal' || this.curveType === 'chordal') { + // init Centripetal / Chordal Catmull-Rom + var pow = this.curveType === 'chordal' ? 0.5 : 0.25 + var dt0 = Math.pow(p0.distanceToSquared(p1), pow) + var dt1 = Math.pow(p1.distanceToSquared(p2), pow) + var dt2 = Math.pow(p2.distanceToSquared(p3), pow) + + // safety check for repeated points + if (dt1 < 1e-4) dt1 = 1.0 + if (dt0 < 1e-4) dt0 = dt1 + if (dt2 < 1e-4) dt2 = dt1 + + px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2) + py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2) + pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2) + } else if (this.curveType === 'catmullrom') { + px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, this.tension) + py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, this.tension) + pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, this.tension) + } + + point.set(px.calc(weight), py.calc(weight), pz.calc(weight)) + + return point + } + + CatmullRomCurve3.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.points = [] + + for (var i = 0, l = source.points.length; i < l; i++) { + var point = source.points[i] + + this.points.push(point.clone()) + } + + this.closed = source.closed + this.curveType = source.curveType + this.tension = source.tension + + return this + } + + CatmullRomCurve3.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.points = [] + + for (var i = 0, l = this.points.length; i < l; i++) { + var point = this.points[i] + data.points.push(point.toArray()) + } + + data.closed = this.closed + data.curveType = this.curveType + data.tension = this.tension + + return data + } + + CatmullRomCurve3.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.points = [] + + for (var i = 0, l = json.points.length; i < l; i++) { + var point = json.points[i] + this.points.push(new Vector3().fromArray(point)) + } + + this.closed = json.closed + this.curveType = json.curveType + this.tension = json.tension + + return this + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Bezier Curves formulas obtained from + * http://en.wikipedia.org/wiki/B茅zier_curve + */ + + function CatmullRom(t, p0, p1, p2, p3) { + var v0 = (p2 - p0) * 0.5 + var v1 = (p3 - p1) * 0.5 + var t2 = t * t + var t3 = t * t2 + return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1 + } + + // + + function QuadraticBezierP0(t, p) { + var k = 1 - t + return k * k * p + } + + function QuadraticBezierP1(t, p) { + return 2 * (1 - t) * t * p + } + + function QuadraticBezierP2(t, p) { + return t * t * p + } + + function QuadraticBezier(t, p0, p1, p2) { + return QuadraticBezierP0(t, p0) + QuadraticBezierP1(t, p1) + QuadraticBezierP2(t, p2) + } + + // + + function CubicBezierP0(t, p) { + var k = 1 - t + return k * k * k * p + } + + function CubicBezierP1(t, p) { + var k = 1 - t + return 3 * k * k * t * p + } + + function CubicBezierP2(t, p) { + return 3 * (1 - t) * t * t * p + } + + function CubicBezierP3(t, p) { + return t * t * t * p + } + + function CubicBezier(t, p0, p1, p2, p3) { + return CubicBezierP0(t, p0) + CubicBezierP1(t, p1) + CubicBezierP2(t, p2) + CubicBezierP3(t, p3) + } + + function CubicBezierCurve(v0, v1, v2, v3) { + Curve.call(this) + + this.type = 'CubicBezierCurve' + + this.v0 = v0 || new Vector2() + this.v1 = v1 || new Vector2() + this.v2 = v2 || new Vector2() + this.v3 = v3 || new Vector2() + } + + CubicBezierCurve.prototype = Object.create(Curve.prototype) + CubicBezierCurve.prototype.constructor = CubicBezierCurve + + CubicBezierCurve.prototype.isCubicBezierCurve = true + + CubicBezierCurve.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector2() + + var v0 = this.v0, + v1 = this.v1, + v2 = this.v2, + v3 = this.v3 + + point.set(CubicBezier(t, v0.x, v1.x, v2.x, v3.x), CubicBezier(t, v0.y, v1.y, v2.y, v3.y)) + + return point + } + + CubicBezierCurve.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.v0.copy(source.v0) + this.v1.copy(source.v1) + this.v2.copy(source.v2) + this.v3.copy(source.v3) + + return this + } + + CubicBezierCurve.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.v0 = this.v0.toArray() + data.v1 = this.v1.toArray() + data.v2 = this.v2.toArray() + data.v3 = this.v3.toArray() + + return data + } + + CubicBezierCurve.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.v0.fromArray(json.v0) + this.v1.fromArray(json.v1) + this.v2.fromArray(json.v2) + this.v3.fromArray(json.v3) + + return this + } + + function CubicBezierCurve3(v0, v1, v2, v3) { + Curve.call(this) + + this.type = 'CubicBezierCurve3' + + this.v0 = v0 || new Vector3() + this.v1 = v1 || new Vector3() + this.v2 = v2 || new Vector3() + this.v3 = v3 || new Vector3() + } + + CubicBezierCurve3.prototype = Object.create(Curve.prototype) + CubicBezierCurve3.prototype.constructor = CubicBezierCurve3 + + CubicBezierCurve3.prototype.isCubicBezierCurve3 = true + + CubicBezierCurve3.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector3() + + var v0 = this.v0, + v1 = this.v1, + v2 = this.v2, + v3 = this.v3 + + point.set( + CubicBezier(t, v0.x, v1.x, v2.x, v3.x), + CubicBezier(t, v0.y, v1.y, v2.y, v3.y), + CubicBezier(t, v0.z, v1.z, v2.z, v3.z) + ) + + return point + } + + CubicBezierCurve3.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.v0.copy(source.v0) + this.v1.copy(source.v1) + this.v2.copy(source.v2) + this.v3.copy(source.v3) + + return this + } + + CubicBezierCurve3.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.v0 = this.v0.toArray() + data.v1 = this.v1.toArray() + data.v2 = this.v2.toArray() + data.v3 = this.v3.toArray() + + return data + } + + CubicBezierCurve3.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.v0.fromArray(json.v0) + this.v1.fromArray(json.v1) + this.v2.fromArray(json.v2) + this.v3.fromArray(json.v3) + + return this + } + + function LineCurve(v1, v2) { + Curve.call(this) + + this.type = 'LineCurve' + + this.v1 = v1 || new Vector2() + this.v2 = v2 || new Vector2() + } + + LineCurve.prototype = Object.create(Curve.prototype) + LineCurve.prototype.constructor = LineCurve + + LineCurve.prototype.isLineCurve = true + + LineCurve.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector2() + + if (t === 1) { + point.copy(this.v2) + } else { + point.copy(this.v2).sub(this.v1) + point.multiplyScalar(t).add(this.v1) + } + + return point + } + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function (u, optionalTarget) { + return this.getPoint(u, optionalTarget) + } + + LineCurve.prototype.getTangent = function (/* t */) { + var tangent = this.v2.clone().sub(this.v1) + + return tangent.normalize() + } + + LineCurve.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.v1.copy(source.v1) + this.v2.copy(source.v2) + + return this + } + + LineCurve.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.v1 = this.v1.toArray() + data.v2 = this.v2.toArray() + + return data + } + + LineCurve.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.v1.fromArray(json.v1) + this.v2.fromArray(json.v2) + + return this + } + + function LineCurve3(v1, v2) { + Curve.call(this) + + this.type = 'LineCurve3' + + this.v1 = v1 || new Vector3() + this.v2 = v2 || new Vector3() + } + + LineCurve3.prototype = Object.create(Curve.prototype) + LineCurve3.prototype.constructor = LineCurve3 + + LineCurve3.prototype.isLineCurve3 = true + + LineCurve3.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector3() + + if (t === 1) { + point.copy(this.v2) + } else { + point.copy(this.v2).sub(this.v1) + point.multiplyScalar(t).add(this.v1) + } + + return point + } + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve3.prototype.getPointAt = function (u, optionalTarget) { + return this.getPoint(u, optionalTarget) + } + + LineCurve3.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.v1.copy(source.v1) + this.v2.copy(source.v2) + + return this + } + + LineCurve3.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.v1 = this.v1.toArray() + data.v2 = this.v2.toArray() + + return data + } + + LineCurve3.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.v1.fromArray(json.v1) + this.v2.fromArray(json.v2) + + return this + } + + function QuadraticBezierCurve(v0, v1, v2) { + Curve.call(this) + + this.type = 'QuadraticBezierCurve' + + this.v0 = v0 || new Vector2() + this.v1 = v1 || new Vector2() + this.v2 = v2 || new Vector2() + } + + QuadraticBezierCurve.prototype = Object.create(Curve.prototype) + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve + + QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true + + QuadraticBezierCurve.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector2() + + var v0 = this.v0, + v1 = this.v1, + v2 = this.v2 + + point.set(QuadraticBezier(t, v0.x, v1.x, v2.x), QuadraticBezier(t, v0.y, v1.y, v2.y)) + + return point + } + + QuadraticBezierCurve.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.v0.copy(source.v0) + this.v1.copy(source.v1) + this.v2.copy(source.v2) + + return this + } + + QuadraticBezierCurve.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.v0 = this.v0.toArray() + data.v1 = this.v1.toArray() + data.v2 = this.v2.toArray() + + return data + } + + QuadraticBezierCurve.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.v0.fromArray(json.v0) + this.v1.fromArray(json.v1) + this.v2.fromArray(json.v2) + + return this + } + + function QuadraticBezierCurve3(v0, v1, v2) { + Curve.call(this) + + this.type = 'QuadraticBezierCurve3' + + this.v0 = v0 || new Vector3() + this.v1 = v1 || new Vector3() + this.v2 = v2 || new Vector3() + } + + QuadraticBezierCurve3.prototype = Object.create(Curve.prototype) + QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3 + + QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true + + QuadraticBezierCurve3.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector3() + + var v0 = this.v0, + v1 = this.v1, + v2 = this.v2 + + point.set( + QuadraticBezier(t, v0.x, v1.x, v2.x), + QuadraticBezier(t, v0.y, v1.y, v2.y), + QuadraticBezier(t, v0.z, v1.z, v2.z) + ) + + return point + } + + QuadraticBezierCurve3.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.v0.copy(source.v0) + this.v1.copy(source.v1) + this.v2.copy(source.v2) + + return this + } + + QuadraticBezierCurve3.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.v0 = this.v0.toArray() + data.v1 = this.v1.toArray() + data.v2 = this.v2.toArray() + + return data + } + + QuadraticBezierCurve3.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.v0.fromArray(json.v0) + this.v1.fromArray(json.v1) + this.v2.fromArray(json.v2) + + return this + } + + function SplineCurve(points /* array of Vector2 */) { + Curve.call(this) + + this.type = 'SplineCurve' + + this.points = points || [] + } + + SplineCurve.prototype = Object.create(Curve.prototype) + SplineCurve.prototype.constructor = SplineCurve + + SplineCurve.prototype.isSplineCurve = true + + SplineCurve.prototype.getPoint = function (t, optionalTarget) { + var point = optionalTarget || new Vector2() + + var points = this.points + var p = (points.length - 1) * t + + var intPoint = Math.floor(p) + var weight = p - intPoint + + var p0 = points[intPoint === 0 ? intPoint : intPoint - 1] + var p1 = points[intPoint] + var p2 = points[intPoint > points.length - 2 ? points.length - 1 : intPoint + 1] + var p3 = points[intPoint > points.length - 3 ? points.length - 1 : intPoint + 2] + + point.set( + CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), + CatmullRom(weight, p0.y, p1.y, p2.y, p3.y) + ) + + return point + } + + SplineCurve.prototype.copy = function (source) { + Curve.prototype.copy.call(this, source) + + this.points = [] + + for (var i = 0, l = source.points.length; i < l; i++) { + var point = source.points[i] + + this.points.push(point.clone()) + } + + return this + } + + SplineCurve.prototype.toJSON = function () { + var data = Curve.prototype.toJSON.call(this) + + data.points = [] + + for (var i = 0, l = this.points.length; i < l; i++) { + var point = this.points[i] + data.points.push(point.toArray()) + } + + return data + } + + SplineCurve.prototype.fromJSON = function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.points = [] + + for (var i = 0, l = json.points.length; i < l; i++) { + var point = json.points[i] + this.points.push(new Vector2().fromArray(point)) + } + + return this + } + + var Curves = Object.freeze({ + ArcCurve: ArcCurve, + CatmullRomCurve3: CatmullRomCurve3, + CubicBezierCurve: CubicBezierCurve, + CubicBezierCurve3: CubicBezierCurve3, + EllipseCurve: EllipseCurve, + LineCurve: LineCurve, + LineCurve3: LineCurve3, + QuadraticBezierCurve: QuadraticBezierCurve, + QuadraticBezierCurve3: QuadraticBezierCurve3, + SplineCurve: SplineCurve + }) + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + Curve.call(this) + + this.type = 'CurvePath' + + this.curves = [] + this.autoClose = false // Automatically closes the path + } + + CurvePath.prototype = Object.assign(Object.create(Curve.prototype), { + constructor: CurvePath, + + add: function (curve) { + this.curves.push(curve) + }, + + closePath: function () { + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[0].getPoint(0) + var endPoint = this.curves[this.curves.length - 1].getPoint(1) + + if (!startPoint.equals(endPoint)) { + this.curves.push(new LineCurve(endPoint, startPoint)) + } + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function (t) { + var d = t * this.getLength() + var curveLengths = this.getCurveLengths() + var i = 0 + + // To think about boundaries points. + + while (i < curveLengths.length) { + if (curveLengths[i] >= d) { + var diff = curveLengths[i] - d + var curve = this.curves[i] + + var segmentLength = curve.getLength() + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength + + return curve.getPointAt(u) + } + + i++ + } + + return null + + // loop where sum != 0, sum > d , sum+1 <d + }, + + // We cannot use the default THREE.Curve getPoint() with getLength() because in + // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath + // getPoint() depends on getLength + + getLength: function () { + var lens = this.getCurveLengths() + return lens[lens.length - 1] + }, + + // cacheLengths must be recalculated. + updateArcLengths: function () { + this.needsUpdate = true + this.cacheLengths = null + this.getCurveLengths() + }, + + // Compute lengths and cache them + // We cannot overwrite getLengths() because UtoT mapping uses it. + + getCurveLengths: function () { + // We use cache values if curves and cache array are same length + + if (this.cacheLengths && this.cacheLengths.length === this.curves.length) { + return this.cacheLengths + } + + // Get length of sub-curve + // Push sums into cached array + + var lengths = [], + sums = 0 + + for (var i = 0, l = this.curves.length; i < l; i++) { + sums += this.curves[i].getLength() + lengths.push(sums) + } + + this.cacheLengths = lengths + + return lengths + }, + + getSpacedPoints: function (divisions) { + if (divisions === undefined) divisions = 40 + + var points = [] + + for (var i = 0; i <= divisions; i++) { + points.push(this.getPoint(i / divisions)) + } + + if (this.autoClose) { + points.push(points[0]) + } + + return points + }, + + getPoints: function (divisions) { + divisions = divisions || 12 + + var points = [], + last + + for (var i = 0, curves = this.curves; i < curves.length; i++) { + var curve = curves[i] + var resolution = + curve && curve.isEllipseCurve + ? divisions * 2 + : curve && curve.isLineCurve + ? 1 + : curve && curve.isSplineCurve + ? divisions * curve.points.length + : divisions + + var pts = curve.getPoints(resolution) + + for (var j = 0; j < pts.length; j++) { + var point = pts[j] + + if (last && last.equals(point)) continue // ensures no consecutive points are duplicates + + points.push(point) + last = point + } + } + + if (this.autoClose && points.length > 1 && !points[points.length - 1].equals(points[0])) { + points.push(points[0]) + } + + return points + }, + + copy: function (source) { + Curve.prototype.copy.call(this, source) + + this.curves = [] + + for (var i = 0, l = source.curves.length; i < l; i++) { + var curve = source.curves[i] + + this.curves.push(curve.clone()) + } + + this.autoClose = source.autoClose + + return this + }, + + toJSON: function () { + var data = Curve.prototype.toJSON.call(this) + + data.autoClose = this.autoClose + data.curves = [] + + for (var i = 0, l = this.curves.length; i < l; i++) { + var curve = this.curves[i] + data.curves.push(curve.toJSON()) + } + + return data + }, + + fromJSON: function (json) { + Curve.prototype.fromJSON.call(this, json) + + this.autoClose = json.autoClose + this.curves = [] + + for (var i = 0, l = json.curves.length; i < l; i++) { + var curve = json.curves[i] + this.curves.push(new Curves[curve.type]().fromJSON(curve)) + } + + return this + } + }) + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + **/ + + function Path(points) { + CurvePath.call(this) + + this.type = 'Path' + + this.currentPoint = new Vector2() + + if (points) { + this.setFromPoints(points) + } + } + + Path.prototype = Object.assign(Object.create(CurvePath.prototype), { + constructor: Path, + + setFromPoints: function (points) { + this.moveTo(points[0].x, points[0].y) + + for (var i = 1, l = points.length; i < l; i++) { + this.lineTo(points[i].x, points[i].y) + } + }, + + moveTo: function (x, y) { + this.currentPoint.set(x, y) // TODO consider referencing vectors instead of copying? + }, + + lineTo: function (x, y) { + var curve = new LineCurve(this.currentPoint.clone(), new Vector2(x, y)) + this.curves.push(curve) + + this.currentPoint.set(x, y) + }, + + quadraticCurveTo: function (aCPx, aCPy, aX, aY) { + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2(aCPx, aCPy), + new Vector2(aX, aY) + ) + + this.curves.push(curve) + + this.currentPoint.set(aX, aY) + }, + + bezierCurveTo: function (aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2(aCP1x, aCP1y), + new Vector2(aCP2x, aCP2y), + new Vector2(aX, aY) + ) + + this.curves.push(curve) + + this.currentPoint.set(aX, aY) + }, + + splineThru: function (pts /*Array of Vector*/) { + var npts = [this.currentPoint.clone()].concat(pts) + + var curve = new SplineCurve(npts) + this.curves.push(curve) + + this.currentPoint.copy(pts[pts.length - 1]) + }, + + arc: function (aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + var x0 = this.currentPoint.x + var y0 = this.currentPoint.y + + this.absarc(aX + x0, aY + y0, aRadius, aStartAngle, aEndAngle, aClockwise) + }, + + absarc: function (aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise) + }, + + ellipse: function (aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { + var x0 = this.currentPoint.x + var y0 = this.currentPoint.y + + this.absellipse( + aX + x0, + aY + y0, + xRadius, + yRadius, + aStartAngle, + aEndAngle, + aClockwise, + aRotation + ) + }, + + absellipse: function (aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { + var curve = new EllipseCurve( + aX, + aY, + xRadius, + yRadius, + aStartAngle, + aEndAngle, + aClockwise, + aRotation + ) + + if (this.curves.length > 0) { + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint(0) + + if (!firstPoint.equals(this.currentPoint)) { + this.lineTo(firstPoint.x, firstPoint.y) + } + } + + this.curves.push(curve) + + var lastPoint = curve.getPoint(1) + this.currentPoint.copy(lastPoint) + }, + + copy: function (source) { + CurvePath.prototype.copy.call(this, source) + + this.currentPoint.copy(source.currentPoint) + + return this + }, + + toJSON: function () { + var data = CurvePath.prototype.toJSON.call(this) + + data.currentPoint = this.currentPoint.toArray() + + return data + }, + + fromJSON: function (json) { + CurvePath.prototype.fromJSON.call(this, json) + + this.currentPoint.fromArray(json.currentPoint) + + return this + } + }) + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape(points) { + Path.call(this, points) + + this.uuid = _Math.generateUUID() + + this.type = 'Shape' + + this.holes = [] + } + + Shape.prototype = Object.assign(Object.create(Path.prototype), { + constructor: Shape, + + getPointsHoles: function (divisions) { + var holesPts = [] + + for (var i = 0, l = this.holes.length; i < l; i++) { + holesPts[i] = this.holes[i].getPoints(divisions) + } + + return holesPts + }, + + // get points of shape and holes (keypoints based on segments parameter) + + extractPoints: function (divisions) { + return { + shape: this.getPoints(divisions), + holes: this.getPointsHoles(divisions) + } + }, + + copy: function (source) { + Path.prototype.copy.call(this, source) + + this.holes = [] + + for (var i = 0, l = source.holes.length; i < l; i++) { + var hole = source.holes[i] + + this.holes.push(hole.clone()) + } + + return this + }, + + toJSON: function () { + var data = Path.prototype.toJSON.call(this) + + data.uuid = this.uuid + data.holes = [] + + for (var i = 0, l = this.holes.length; i < l; i++) { + var hole = this.holes[i] + data.holes.push(hole.toJSON()) + } + + return data + }, + + fromJSON: function (json) { + Path.prototype.fromJSON.call(this, json) + + this.uuid = json.uuid + this.holes = [] + + for (var i = 0, l = json.holes.length; i < l; i++) { + var hole = json.holes[i] + this.holes.push(new Path().fromJSON(hole)) + } + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light(color, intensity) { + Object3D.call(this) + + this.type = 'Light' + + this.color = new Color(color) + this.intensity = intensity !== undefined ? intensity : 1 + + this.receiveShadow = undefined + } + + Light.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Light, + + isLight: true, + + copy: function (source) { + Object3D.prototype.copy.call(this, source) + + this.color.copy(source.color) + this.intensity = source.intensity + + return this + }, + + toJSON: function (meta) { + var data = Object3D.prototype.toJSON.call(this, meta) + + data.object.color = this.color.getHex() + data.object.intensity = this.intensity + + if (this.groundColor !== undefined) data.object.groundColor = this.groundColor.getHex() + + if (this.distance !== undefined) data.object.distance = this.distance + if (this.angle !== undefined) data.object.angle = this.angle + if (this.decay !== undefined) data.object.decay = this.decay + if (this.penumbra !== undefined) data.object.penumbra = this.penumbra + + if (this.shadow !== undefined) data.object.shadow = this.shadow.toJSON() + + return data + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight(skyColor, groundColor, intensity) { + Light.call(this, skyColor, intensity) + + this.type = 'HemisphereLight' + + this.castShadow = undefined + + this.position.copy(Object3D.DefaultUp) + this.updateMatrix() + + this.groundColor = new Color(groundColor) + } + + HemisphereLight.prototype = Object.assign(Object.create(Light.prototype), { + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function (source) { + Light.prototype.copy.call(this, source) + + this.groundColor.copy(source.groundColor) + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow(camera) { + this.camera = camera + + this.bias = 0 + this.radius = 1 + + this.mapSize = new Vector2(512, 512) + + this.map = null + this.matrix = new Matrix4() + } + + Object.assign(LightShadow.prototype, { + copy: function (source) { + this.camera = source.camera.clone() + + this.bias = source.bias + this.radius = source.radius + + this.mapSize.copy(source.mapSize) + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + toJSON: function () { + var object = {} + + if (this.bias !== 0) object.bias = this.bias + if (this.radius !== 1) object.radius = this.radius + if (this.mapSize.x !== 512 || this.mapSize.y !== 512) object.mapSize = this.mapSize.toArray() + + object.camera = this.camera.toJSON(false).object + delete object.camera.matrix + + return object + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + LightShadow.call(this, new PerspectiveCamera(50, 1, 0.5, 500)) + } + + SpotLightShadow.prototype = Object.assign(Object.create(LightShadow.prototype), { + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function (light) { + var camera = this.camera + + var fov = _Math.RAD2DEG * 2 * light.angle + var aspect = this.mapSize.width / this.mapSize.height + var far = light.distance || camera.far + + if (fov !== camera.fov || aspect !== camera.aspect || far !== camera.far) { + camera.fov = fov + camera.aspect = aspect + camera.far = far + camera.updateProjectionMatrix() + } + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight(color, intensity, distance, angle, penumbra, decay) { + Light.call(this, color, intensity) + + this.type = 'SpotLight' + + this.position.copy(Object3D.DefaultUp) + this.updateMatrix() + + this.target = new Object3D() + + Object.defineProperty(this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * Math.PI + }, + set: function (power) { + // intensity = power per solid angle. + // ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / Math.PI + } + }) + + this.distance = distance !== undefined ? distance : 0 + this.angle = angle !== undefined ? angle : Math.PI / 3 + this.penumbra = penumbra !== undefined ? penumbra : 0 + this.decay = decay !== undefined ? decay : 1 // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow() + } + + SpotLight.prototype = Object.assign(Object.create(Light.prototype), { + constructor: SpotLight, + + isSpotLight: true, + + copy: function (source) { + Light.prototype.copy.call(this, source) + + this.distance = source.distance + this.angle = source.angle + this.penumbra = source.penumbra + this.decay = source.decay + + this.target = source.target.clone() + + this.shadow = source.shadow.clone() + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLight(color, intensity, distance, decay) { + Light.call(this, color, intensity) + + this.type = 'PointLight' + + Object.defineProperty(this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + return this.intensity * 4 * Math.PI + }, + set: function (power) { + // intensity = power per solid angle. + // ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf + this.intensity = power / (4 * Math.PI) + } + }) + + this.distance = distance !== undefined ? distance : 0 + this.decay = decay !== undefined ? decay : 1 // for physically correct lights, should be 2. + + this.shadow = new LightShadow(new PerspectiveCamera(90, 1, 0.5, 500)) + } + + PointLight.prototype = Object.assign(Object.create(Light.prototype), { + constructor: PointLight, + + isPointLight: true, + + copy: function (source) { + Light.prototype.copy.call(this, source) + + this.distance = source.distance + this.decay = source.decay + + this.shadow = source.shadow.clone() + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow() { + LightShadow.call(this, new OrthographicCamera(-5, 5, 5, -5, 0.5, 500)) + } + + DirectionalLightShadow.prototype = Object.assign(Object.create(LightShadow.prototype), { + constructor: DirectionalLightShadow + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight(color, intensity) { + Light.call(this, color, intensity) + + this.type = 'DirectionalLight' + + this.position.copy(Object3D.DefaultUp) + this.updateMatrix() + + this.target = new Object3D() + + this.shadow = new DirectionalLightShadow() + } + + DirectionalLight.prototype = Object.assign(Object.create(Light.prototype), { + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function (source) { + Light.prototype.copy.call(this, source) + + this.target = source.target.clone() + + this.shadow = source.shadow.clone() + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight(color, intensity) { + Light.call(this, color, intensity) + + this.type = 'AmbientLight' + + this.castShadow = undefined + } + + AmbientLight.prototype = Object.assign(Object.create(Light.prototype), { + constructor: AmbientLight, + + isAmbientLight: true + }) + + /** + * @author abelnation / http://github.com/abelnation + */ + + function RectAreaLight(color, intensity, width, height) { + Light.call(this, color, intensity) + + this.type = 'RectAreaLight' + + this.width = width !== undefined ? width : 10 + this.height = height !== undefined ? height : 10 + } + + RectAreaLight.prototype = Object.assign(Object.create(Light.prototype), { + constructor: RectAreaLight, + + isRectAreaLight: true, + + copy: function (source) { + Light.prototype.copy.call(this, source) + + this.width = source.width + this.height = source.height + + return this + }, + + toJSON: function (meta) { + var data = Light.prototype.toJSON.call(this, meta) + + data.object.width = this.width + data.object.height = this.height + + return data + } + }) + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack(name, times, values, interpolation) { + KeyframeTrack.call(this, name, times, values, interpolation) + } + + StringKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), { + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + }) + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack(name, times, values) { + KeyframeTrack.call(this, name, times, values) + } + + BooleanKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), { + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + }) + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) { + this.parameterPositions = parameterPositions + this._cachedIndex = 0 + + this.resultBuffer = + resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor(sampleSize) + this.sampleValues = sampleValues + this.valueSize = sampleSize + } + + Object.assign(Interpolant.prototype, { + evaluate: function (t) { + var pp = this.parameterPositions, + i1 = this._cachedIndex, + t1 = pp[i1], + t0 = pp[i1 - 1] + + validate_interval: { + seek: { + var right + + linear_scan: { + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if (!(t < t1)) { + for (var giveUpAt = i1 + 2; ; ) { + if (t1 === undefined) { + if (t < t0) break forward_scan + + // after end + + i1 = pp.length + this._cachedIndex = i1 + return this.afterEnd_(i1 - 1, t, t0) + } + + if (i1 === giveUpAt) break // this loop + + t0 = t1 + t1 = pp[++i1] + + if (t < t1) { + // we have arrived at the sought interval + break seek + } + } + + // prepare binary search on the right side of the index + right = pp.length + break linear_scan + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if (!(t >= t0)) { + // looping? + + var t1global = pp[1] + + if (t < t1global) { + i1 = 2 // + 1, using the scan for the details + t0 = t1global + } + + // linear reverse scan + + for (var giveUpAt = i1 - 2; ; ) { + if (t0 === undefined) { + // before start + + this._cachedIndex = 0 + return this.beforeStart_(0, t, t1) + } + + if (i1 === giveUpAt) break // this loop + + t1 = t0 + t0 = pp[--i1 - 1] + + if (t >= t0) { + // we have arrived at the sought interval + break seek + } + } + + // prepare binary search on the left side of the index + right = i1 + i1 = 0 + break linear_scan + } + + // the interval is valid + + break validate_interval + } // linear scan + + // binary search + + while (i1 < right) { + var mid = (i1 + right) >>> 1 + + if (t < pp[mid]) { + right = mid + } else { + i1 = mid + 1 + } + } + + t1 = pp[i1] + t0 = pp[i1 - 1] + + // check boundary cases, again + + if (t0 === undefined) { + this._cachedIndex = 0 + return this.beforeStart_(0, t, t1) + } + + if (t1 === undefined) { + i1 = pp.length + this._cachedIndex = i1 + return this.afterEnd_(i1 - 1, t0, t) + } + } // seek + + this._cachedIndex = i1 + + this.intervalChanged_(i1, t0, t1) + } // validate_interval + + return this.interpolate_(i1, t0, t, t1) + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function () { + return this.settings || this.DefaultSettings_ + }, + + copySampleValue_: function (index) { + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride + + for (var i = 0; i !== stride; ++i) { + result[i] = values[offset + i] + } + + return result + }, + + // Template methods for derived classes: + + interpolate_: function (/* i1, t0, t, t1 */) { + throw new Error('call to abstract method') + // implementations shall return this.resultBuffer + }, + + intervalChanged_: function (/* i1, t0, t1 */) { + // empty + } + }) + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign(Interpolant.prototype, { + //( 0, t, t0 ), returns this.resultBuffer + beforeStart_: Interpolant.prototype.copySampleValue_, + + //( N-1, tN-1, t ), returns this.resultBuffer + afterEnd_: Interpolant.prototype.copySampleValue_ + }) + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) { + Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer) + } + + QuaternionLinearInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), { + constructor: QuaternionLinearInterpolant, + + interpolate_: function (i1, t0, t, t1) { + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = i1 * stride, + alpha = (t - t0) / (t1 - t0) + + for (var end = offset + stride; offset !== end; offset += 4) { + Quaternion.slerpFlat(result, 0, values, offset - stride, values, offset, alpha) + } + + return result + } + }) + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack(name, times, values, interpolation) { + KeyframeTrack.call(this, name, times, values, interpolation) + } + + QuaternionKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), { + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function (result) { + return new QuaternionLinearInterpolant(this.times, this.values, this.getValueSize(), result) + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + }) + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack(name, times, values, interpolation) { + KeyframeTrack.call(this, name, times, values, interpolation) + } + + ColorKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), { + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + }) + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack(name, times, values, interpolation) { + KeyframeTrack.call(this, name, times, values, interpolation) + } + + NumberKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), { + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + }) + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) { + Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer) + + this._weightPrev = -0 + this._offsetPrev = -0 + this._weightNext = -0 + this._offsetNext = -0 + } + + CubicInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), { + constructor: CubicInterpolant, + + DefaultSettings_: { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }, + + intervalChanged_: function (i1, t0, t1) { + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + tPrev = pp[iPrev], + tNext = pp[iNext] + + if (tPrev === undefined) { + switch (this.getSettings_().endingStart) { + case ZeroSlopeEnding: + // f'(t0) = 0 + iPrev = i1 + tPrev = 2 * t0 - t1 + + break + + case WrapAroundEnding: + // use the other end of the curve + iPrev = pp.length - 2 + tPrev = t0 + pp[iPrev] - pp[iPrev + 1] + + break + + default: // ZeroCurvatureEnding + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1 + tPrev = t1 + } + } + + if (tNext === undefined) { + switch (this.getSettings_().endingEnd) { + case ZeroSlopeEnding: + // f'(tN) = 0 + iNext = i1 + tNext = 2 * t1 - t0 + + break + + case WrapAroundEnding: + // use the other end of the curve + iNext = 1 + tNext = t1 + pp[1] - pp[0] + + break + + default: // ZeroCurvatureEnding + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1 + tNext = t0 + } + } + + var halfDt = (t1 - t0) * 0.5, + stride = this.valueSize + + this._weightPrev = halfDt / (t0 - tPrev) + this._weightNext = halfDt / (tNext - t1) + this._offsetPrev = iPrev * stride + this._offsetNext = iNext * stride + }, + + interpolate_: function (i1, t0, t, t1) { + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + o1 = i1 * stride, + o0 = o1 - stride, + oP = this._offsetPrev, + oN = this._offsetNext, + wP = this._weightPrev, + wN = this._weightNext, + p = (t - t0) / (t1 - t0), + pp = p * p, + ppp = pp * p + + // evaluate polynomials + + var sP = -wP * ppp + 2 * wP * pp - wP * p + var s0 = (1 + wP) * ppp + (-1.5 - 2 * wP) * pp + (-0.5 + wP) * p + 1 + var s1 = (-1 - wN) * ppp + (1.5 + wN) * pp + 0.5 * p + var sN = wN * ppp - wN * pp + + // combine data linearly + + for (var i = 0; i !== stride; ++i) { + result[i] = + sP * values[oP + i] + s0 * values[o0 + i] + s1 * values[o1 + i] + sN * values[oN + i] + } + + return result + } + }) + + /** + * @author tschw + */ + + function LinearInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) { + Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer) + } + + LinearInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), { + constructor: LinearInterpolant, + + interpolate_: function (i1, t0, t, t1) { + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset1 = i1 * stride, + offset0 = offset1 - stride, + weight1 = (t - t0) / (t1 - t0), + weight0 = 1 - weight1 + + for (var i = 0; i !== stride; ++i) { + result[i] = values[offset0 + i] * weight0 + values[offset1 + i] * weight1 + } + + return result + } + }) + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) { + Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer) + } + + DiscreteInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), { + constructor: DiscreteInterpolant, + + interpolate_: function (i1 /*, t0, t, t1 */) { + return this.copySampleValue_(i1 - 1) + } + }) + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function (array, from, to) { + if (AnimationUtils.isTypedArray(array)) { + // in ios9 array.subarray(from, undefined) will return empty array + // but array.subarray(from) or array.subarray(from, len) is correct + return new array.constructor(array.subarray(from, to !== undefined ? to : array.length)) + } + + return array.slice(from, to) + }, + + // converts an array to a specific type + convertArray: function (array, type, forceClone) { + if ( + !array || // let 'undefined' and 'null' pass + (!forceClone && array.constructor === type) + ) + return array + + if (typeof type.BYTES_PER_ELEMENT === 'number') { + return new type(array) // create typed array + } + + return Array.prototype.slice.call(array) // create Array + }, + + isTypedArray: function (object) { + return ArrayBuffer.isView(object) && !(object instanceof DataView) + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function (times) { + function compareTime(i, j) { + return times[i] - times[j] + } + + var n = times.length + var result = new Array(n) + for (var i = 0; i !== n; ++i) result[i] = i + + result.sort(compareTime) + + return result + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function (values, stride, order) { + var nValues = values.length + var result = new values.constructor(nValues) + + for (var i = 0, dstOffset = 0; dstOffset !== nValues; ++i) { + var srcOffset = order[i] * stride + + for (var j = 0; j !== stride; ++j) { + result[dstOffset++] = values[srcOffset + j] + } + } + + return result + }, + + // function for parsing AOS keyframe formats + flattenJSON: function (jsonKeys, times, values, valuePropertyName) { + var i = 1, + key = jsonKeys[0] + + while (key !== undefined && key[valuePropertyName] === undefined) { + key = jsonKeys[i++] + } + + if (key === undefined) return // no data + + var value = key[valuePropertyName] + if (value === undefined) return // no data + + if (Array.isArray(value)) { + do { + value = key[valuePropertyName] + + if (value !== undefined) { + times.push(key.time) + values.push.apply(values, value) // push all elements + } + + key = jsonKeys[i++] + } while (key !== undefined) + } else if (value.toArray !== undefined) { + // ...assume THREE.Math-ish + + do { + value = key[valuePropertyName] + + if (value !== undefined) { + times.push(key.time) + value.toArray(values, values.length) + } + + key = jsonKeys[i++] + } while (key !== undefined) + } else { + // otherwise push as-is + + do { + value = key[valuePropertyName] + + if (value !== undefined) { + times.push(key.time) + values.push(value) + } + + key = jsonKeys[i++] + } while (key !== undefined) + } + } + } + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack(name, times, values, interpolation) { + if (name === undefined) throw new Error('THREE.KeyframeTrack: track name is undefined') + if (times === undefined || times.length === 0) + throw new Error('THREE.KeyframeTrack: no keyframes in track named ' + name) + + this.name = name + + this.times = AnimationUtils.convertArray(times, this.TimeBufferType) + this.values = AnimationUtils.convertArray(values, this.ValueBufferType) + + this.setInterpolation(interpolation || this.DefaultInterpolation) + + this.validate() + this.optimize() + } + + // Static methods: + + Object.assign(KeyframeTrack, { + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function (json) { + if (json.type === undefined) { + throw new Error('THREE.KeyframeTrack: track type undefined, can not parse') + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName(json.type) + + if (json.times === undefined) { + var times = [], + values = [] + + AnimationUtils.flattenJSON(json.keys, times, values, 'value') + + json.times = times + json.values = values + } + + // derived classes can define a static parse method + if (trackType.parse !== undefined) { + return trackType.parse(json) + } else { + // by default, we assume a constructor compatible with the base + return new trackType(json.name, json.times, json.values, json.interpolation) + } + }, + + toJSON: function (track) { + var trackType = track.constructor + + var json + + // derived classes can define a static toJSON method + if (trackType.toJSON !== undefined) { + json = trackType.toJSON(track) + } else { + // by default, we assume the data can be serialized as-is + json = { + name: track.name, + times: AnimationUtils.convertArray(track.times, Array), + values: AnimationUtils.convertArray(track.values, Array) + } + + var interpolation = track.getInterpolation() + + if (interpolation !== track.DefaultInterpolation) { + json.interpolation = interpolation + } + } + + json.type = track.ValueTypeName // mandatory + + return json + }, + + _getTrackTypeForValueTypeName: function (typeName) { + switch (typeName.toLowerCase()) { + case 'scalar': + case 'double': + case 'float': + case 'number': + case 'integer': + return NumberKeyframeTrack + + case 'vector': + case 'vector2': + case 'vector3': + case 'vector4': + return VectorKeyframeTrack + + case 'color': + return ColorKeyframeTrack + + case 'quaternion': + return QuaternionKeyframeTrack + + case 'bool': + case 'boolean': + return BooleanKeyframeTrack + + case 'string': + return StringKeyframeTrack + } + + throw new Error('THREE.KeyframeTrack: Unsupported typeName: ' + typeName) + } + }) + + Object.assign(KeyframeTrack.prototype, { + constructor: KeyframeTrack, + + TimeBufferType: Float32Array, + + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function (result) { + return new DiscreteInterpolant(this.times, this.values, this.getValueSize(), result) + }, + + InterpolantFactoryMethodLinear: function (result) { + return new LinearInterpolant(this.times, this.values, this.getValueSize(), result) + }, + + InterpolantFactoryMethodSmooth: function (result) { + return new CubicInterpolant(this.times, this.values, this.getValueSize(), result) + }, + + setInterpolation: function (interpolation) { + var factoryMethod + + switch (interpolation) { + case InterpolateDiscrete: + factoryMethod = this.InterpolantFactoryMethodDiscrete + + break + + case InterpolateLinear: + factoryMethod = this.InterpolantFactoryMethodLinear + + break + + case InterpolateSmooth: + factoryMethod = this.InterpolantFactoryMethodSmooth + + break + } + + if (factoryMethod === undefined) { + var message = + 'unsupported interpolation for ' + + this.ValueTypeName + + ' keyframe track named ' + + this.name + + if (this.createInterpolant === undefined) { + // fall back to default, unless the default itself is messed up + if (interpolation !== this.DefaultInterpolation) { + this.setInterpolation(this.DefaultInterpolation) + } else { + throw new Error(message) // fatal, in this case + } + } + + console.warn('THREE.KeyframeTrack:', message) + return + } + + this.createInterpolant = factoryMethod + }, + + getInterpolation: function () { + switch (this.createInterpolant) { + case this.InterpolantFactoryMethodDiscrete: + return InterpolateDiscrete + + case this.InterpolantFactoryMethodLinear: + return InterpolateLinear + + case this.InterpolantFactoryMethodSmooth: + return InterpolateSmooth + } + }, + + getValueSize: function () { + return this.values.length / this.times.length + }, + + // move all keyframes either forwards or backwards in time + shift: function (timeOffset) { + if (timeOffset !== 0.0) { + var times = this.times + + for (var i = 0, n = times.length; i !== n; ++i) { + times[i] += timeOffset + } + } + + return this + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function (timeScale) { + if (timeScale !== 1.0) { + var times = this.times + + for (var i = 0, n = times.length; i !== n; ++i) { + times[i] *= timeScale + } + } + + return this + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function (startTime, endTime) { + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1 + + while (from !== nKeys && times[from] < startTime) { + ++from + } + + while (to !== -1 && times[to] > endTime) { + --to + } + + ++to // inclusive -> exclusive bound + + if (from !== 0 || to !== nKeys) { + // empty tracks are forbidden, so keep at least one keyframe + if (from >= to) (to = Math.max(to, 1)), (from = to - 1) + + var stride = this.getValueSize() + this.times = AnimationUtils.arraySlice(times, from, to) + this.values = AnimationUtils.arraySlice(this.values, from * stride, to * stride) + } + + return this + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function () { + var valid = true + + var valueSize = this.getValueSize() + if (valueSize - Math.floor(valueSize) !== 0) { + console.error('THREE.KeyframeTrack: Invalid value size in track.', this) + valid = false + } + + var times = this.times, + values = this.values, + nKeys = times.length + + if (nKeys === 0) { + console.error('THREE.KeyframeTrack: Track is empty.', this) + valid = false + } + + var prevTime = null + + for (var i = 0; i !== nKeys; i++) { + var currTime = times[i] + + if (typeof currTime === 'number' && isNaN(currTime)) { + console.error('THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime) + valid = false + break + } + + if (prevTime !== null && prevTime > currTime) { + console.error('THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime) + valid = false + break + } + + prevTime = currTime + } + + if (values !== undefined) { + if (AnimationUtils.isTypedArray(values)) { + for (var i = 0, n = values.length; i !== n; ++i) { + var value = values[i] + + if (isNaN(value)) { + console.error('THREE.KeyframeTrack: Value is not a valid number.', this, i, value) + valid = false + break + } + } + } + } + + return valid + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function () { + var times = this.times, + values = this.values, + stride = this.getValueSize(), + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + writeIndex = 1, + lastIndex = times.length - 1 + + for (var i = 1; i < lastIndex; ++i) { + var keep = false + + var time = times[i] + var timeNext = times[i + 1] + + // remove adjacent keyframes scheduled at the same time + + if (time !== timeNext && (i !== 1 || time !== time[0])) { + if (!smoothInterpolation) { + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride + + for (var j = 0; j !== stride; ++j) { + var value = values[offset + j] + + if (value !== values[offsetP + j] || value !== values[offsetN + j]) { + keep = true + break + } + } + } else { + keep = true + } + } + + // in-place compaction + + if (keep) { + if (i !== writeIndex) { + times[writeIndex] = times[i] + + var readOffset = i * stride, + writeOffset = writeIndex * stride + + for (var j = 0; j !== stride; ++j) { + values[writeOffset + j] = values[readOffset + j] + } + } + + ++writeIndex + } + } + + // flush last keyframe (compaction looks ahead) + + if (lastIndex > 0) { + times[writeIndex] = times[lastIndex] + + for ( + var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; + j !== stride; + ++j + ) { + values[writeOffset + j] = values[readOffset + j] + } + + ++writeIndex + } + + if (writeIndex !== times.length) { + this.times = AnimationUtils.arraySlice(times, 0, writeIndex) + this.values = AnimationUtils.arraySlice(values, 0, writeIndex * stride) + } + + return this + } + }) + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack(name, times, values, interpolation) { + KeyframeTrack.call(this, name, times, values, interpolation) + } + + VectorKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), { + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + }) + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip(name, duration, tracks) { + this.name = name + this.tracks = tracks + this.duration = duration !== undefined ? duration : -1 + + this.uuid = _Math.generateUUID() + + // this means it should figure out its duration by scanning the tracks + if (this.duration < 0) { + this.resetDuration() + } + + this.optimize() + } + + Object.assign(AnimationClip, { + parse: function (json) { + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / (json.fps || 1.0) + + for (var i = 0, n = jsonTracks.length; i !== n; ++i) { + tracks.push(KeyframeTrack.parse(jsonTracks[i]).scale(frameTime)) + } + + return new AnimationClip(json.name, json.duration, tracks) + }, + + toJSON: function (clip) { + var tracks = [], + clipTracks = clip.tracks + + var json = { + name: clip.name, + duration: clip.duration, + tracks: tracks + } + + for (var i = 0, n = clipTracks.length; i !== n; ++i) { + tracks.push(KeyframeTrack.toJSON(clipTracks[i])) + } + + return json + }, + + CreateFromMorphTargetSequence: function (name, morphTargetSequence, fps, noLoop) { + var numMorphTargets = morphTargetSequence.length + var tracks = [] + + for (var i = 0; i < numMorphTargets; i++) { + var times = [] + var values = [] + + times.push((i + numMorphTargets - 1) % numMorphTargets, i, (i + 1) % numMorphTargets) + + values.push(0, 1, 0) + + var order = AnimationUtils.getKeyframeOrder(times) + times = AnimationUtils.sortedArray(times, 1, order) + values = AnimationUtils.sortedArray(values, 1, order) + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if (!noLoop && times[0] === 0) { + times.push(numMorphTargets) + values.push(values[0]) + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[i].name + ']', + times, + values + ).scale(1.0 / fps) + ) + } + + return new AnimationClip(name, -1, tracks) + }, + + findByName: function (objectOrClipArray, name) { + var clipArray = objectOrClipArray + + if (!Array.isArray(objectOrClipArray)) { + var o = objectOrClipArray + clipArray = (o.geometry && o.geometry.animations) || o.animations + } + + for (var i = 0; i < clipArray.length; i++) { + if (clipArray[i].name === name) { + return clipArray[i] + } + } + + return null + }, + + CreateClipsFromMorphTargetSequences: function (morphTargets, fps, noLoop) { + var animationToMorphTargets = {} + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/ + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for (var i = 0, il = morphTargets.length; i < il; i++) { + var morphTarget = morphTargets[i] + var parts = morphTarget.name.match(pattern) + + if (parts && parts.length > 1) { + var name = parts[1] + + var animationMorphTargets = animationToMorphTargets[name] + if (!animationMorphTargets) { + animationToMorphTargets[name] = animationMorphTargets = [] + } + + animationMorphTargets.push(morphTarget) + } + } + + var clips = [] + + for (var name in animationToMorphTargets) { + clips.push( + AnimationClip.CreateFromMorphTargetSequence( + name, + animationToMorphTargets[name], + fps, + noLoop + ) + ) + } + + return clips + }, + + // parse the animation.hierarchy format + parseAnimation: function (animation, bones) { + if (!animation) { + console.error('THREE.AnimationClip: No animation in JSONLoader data.') + return null + } + + var addNonemptyTrack = function ( + trackType, + trackName, + animationKeys, + propertyName, + destTracks + ) { + // only return track if there are actually keys. + if (animationKeys.length !== 0) { + var times = [] + var values = [] + + AnimationUtils.flattenJSON(animationKeys, times, values, propertyName) + + // empty keys are filtered out, so check again + if (times.length !== 0) { + destTracks.push(new trackType(trackName, times, values)) + } + } + } + + var tracks = [] + + var clipName = animation.name || 'default' + // automatic length determination in AnimationClip. + var duration = animation.length || -1 + var fps = animation.fps || 30 + + var hierarchyTracks = animation.hierarchy || [] + + for (var h = 0; h < hierarchyTracks.length; h++) { + var animationKeys = hierarchyTracks[h].keys + + // skip empty tracks + if (!animationKeys || animationKeys.length === 0) continue + + // process morph targets + if (animationKeys[0].morphTargets) { + // figure out all morph targets used in this track + var morphTargetNames = {} + + for (var k = 0; k < animationKeys.length; k++) { + if (animationKeys[k].morphTargets) { + for (var m = 0; m < animationKeys[k].morphTargets.length; m++) { + morphTargetNames[animationKeys[k].morphTargets[m]] = -1 + } + } + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for (var morphTargetName in morphTargetNames) { + var times = [] + var values = [] + + for (var m = 0; m !== animationKeys[k].morphTargets.length; ++m) { + var animationKey = animationKeys[k] + + times.push(animationKey.time) + values.push(animationKey.morphTarget === morphTargetName ? 1 : 0) + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluence[' + morphTargetName + ']', + times, + values + ) + ) + } + + duration = morphTargetNames.length * (fps || 1.0) + } else { + // ...assume skeletal animation + + var boneName = '.bones[' + bones[h].name + ']' + + addNonemptyTrack( + VectorKeyframeTrack, + boneName + '.position', + animationKeys, + 'pos', + tracks + ) + + addNonemptyTrack( + QuaternionKeyframeTrack, + boneName + '.quaternion', + animationKeys, + 'rot', + tracks + ) + + addNonemptyTrack(VectorKeyframeTrack, boneName + '.scale', animationKeys, 'scl', tracks) + } + } + + if (tracks.length === 0) { + return null + } + + var clip = new AnimationClip(clipName, duration, tracks) + + return clip + } + }) + + Object.assign(AnimationClip.prototype, { + resetDuration: function () { + var tracks = this.tracks, + duration = 0 + + for (var i = 0, n = tracks.length; i !== n; ++i) { + var track = this.tracks[i] + + duration = Math.max(duration, track.times[track.times.length - 1]) + } + + this.duration = duration + }, + + trim: function () { + for (var i = 0; i < this.tracks.length; i++) { + this.tracks[i].trim(0, this.duration) + } + + return this + }, + + optimize: function () { + for (var i = 0; i < this.tracks.length; i++) { + this.tracks[i].optimize() + } + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + this.textures = {} + } + + Object.assign(MaterialLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + var scope = this + + var loader = new FileLoader(scope.manager) + loader.load( + url, + function (text) { + onLoad(scope.parse(JSON.parse(text))) + }, + onProgress, + onError + ) + }, + + setTextures: function (value) { + this.textures = value + }, + + parse: function (json) { + var textures = this.textures + + function getTexture(name) { + if (textures[name] === undefined) { + console.warn('THREE.MaterialLoader: Undefined texture', name) + } + + return textures[name] + } + + var material = new Materials[json.type]() + + if (json.uuid !== undefined) material.uuid = json.uuid + if (json.name !== undefined) material.name = json.name + if (json.color !== undefined) material.color.setHex(json.color) + if (json.roughness !== undefined) material.roughness = json.roughness + if (json.metalness !== undefined) material.metalness = json.metalness + if (json.emissive !== undefined) material.emissive.setHex(json.emissive) + if (json.specular !== undefined) material.specular.setHex(json.specular) + if (json.shininess !== undefined) material.shininess = json.shininess + if (json.clearCoat !== undefined) material.clearCoat = json.clearCoat + if (json.clearCoatRoughness !== undefined) + material.clearCoatRoughness = json.clearCoatRoughness + if (json.uniforms !== undefined) material.uniforms = json.uniforms + if (json.vertexShader !== undefined) material.vertexShader = json.vertexShader + if (json.fragmentShader !== undefined) material.fragmentShader = json.fragmentShader + if (json.vertexColors !== undefined) material.vertexColors = json.vertexColors + if (json.fog !== undefined) material.fog = json.fog + if (json.flatShading !== undefined) material.flatShading = json.flatShading + if (json.blending !== undefined) material.blending = json.blending + if (json.side !== undefined) material.side = json.side + if (json.opacity !== undefined) material.opacity = json.opacity + if (json.transparent !== undefined) material.transparent = json.transparent + if (json.alphaTest !== undefined) material.alphaTest = json.alphaTest + if (json.depthTest !== undefined) material.depthTest = json.depthTest + if (json.depthWrite !== undefined) material.depthWrite = json.depthWrite + if (json.colorWrite !== undefined) material.colorWrite = json.colorWrite + if (json.wireframe !== undefined) material.wireframe = json.wireframe + if (json.wireframeLinewidth !== undefined) + material.wireframeLinewidth = json.wireframeLinewidth + if (json.wireframeLinecap !== undefined) material.wireframeLinecap = json.wireframeLinecap + if (json.wireframeLinejoin !== undefined) material.wireframeLinejoin = json.wireframeLinejoin + + if (json.rotation !== undefined) material.rotation = json.rotation + + if (json.linewidth !== 1) material.linewidth = json.linewidth + if (json.dashSize !== undefined) material.dashSize = json.dashSize + if (json.gapSize !== undefined) material.gapSize = json.gapSize + if (json.scale !== undefined) material.scale = json.scale + + if (json.skinning !== undefined) material.skinning = json.skinning + if (json.morphTargets !== undefined) material.morphTargets = json.morphTargets + if (json.dithering !== undefined) material.dithering = json.dithering + + if (json.visible !== undefined) material.visible = json.visible + if (json.userData !== undefined) material.userData = json.userData + + // Deprecated + + if (json.shading !== undefined) material.flatShading = json.shading === 1 // THREE.FlatShading + + // for PointsMaterial + + if (json.size !== undefined) material.size = json.size + if (json.sizeAttenuation !== undefined) material.sizeAttenuation = json.sizeAttenuation + + // maps + + if (json.map !== undefined) material.map = getTexture(json.map) + + if (json.alphaMap !== undefined) { + material.alphaMap = getTexture(json.alphaMap) + material.transparent = true + } + + if (json.bumpMap !== undefined) material.bumpMap = getTexture(json.bumpMap) + if (json.bumpScale !== undefined) material.bumpScale = json.bumpScale + + if (json.normalMap !== undefined) material.normalMap = getTexture(json.normalMap) + if (json.normalScale !== undefined) { + var normalScale = json.normalScale + + if (Array.isArray(normalScale) === false) { + // Blender exporter used to export a scalar. See #7459 + + normalScale = [normalScale, normalScale] + } + + material.normalScale = new Vector2().fromArray(normalScale) + } + + if (json.displacementMap !== undefined) + material.displacementMap = getTexture(json.displacementMap) + if (json.displacementScale !== undefined) material.displacementScale = json.displacementScale + if (json.displacementBias !== undefined) material.displacementBias = json.displacementBias + + if (json.roughnessMap !== undefined) material.roughnessMap = getTexture(json.roughnessMap) + if (json.metalnessMap !== undefined) material.metalnessMap = getTexture(json.metalnessMap) + + if (json.emissiveMap !== undefined) material.emissiveMap = getTexture(json.emissiveMap) + if (json.emissiveIntensity !== undefined) material.emissiveIntensity = json.emissiveIntensity + + if (json.specularMap !== undefined) material.specularMap = getTexture(json.specularMap) + + if (json.envMap !== undefined) material.envMap = getTexture(json.envMap) + + if (json.reflectivity !== undefined) material.reflectivity = json.reflectivity + + if (json.lightMap !== undefined) material.lightMap = getTexture(json.lightMap) + if (json.lightMapIntensity !== undefined) material.lightMapIntensity = json.lightMapIntensity + + if (json.aoMap !== undefined) material.aoMap = getTexture(json.aoMap) + if (json.aoMapIntensity !== undefined) material.aoMapIntensity = json.aoMapIntensity + + if (json.gradientMap !== undefined) material.gradientMap = getTexture(json.gradientMap) + + return material + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + } + + Object.assign(BufferGeometryLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + var scope = this + + var loader = new FileLoader(scope.manager) + loader.load( + url, + function (text) { + onLoad(scope.parse(JSON.parse(text))) + }, + onProgress, + onError + ) + }, + + parse: function (json) { + var geometry = new BufferGeometry() + + var index = json.data.index + + if (index !== undefined) { + var typedArray = new TYPED_ARRAYS[index.type](index.array) + geometry.setIndex(new BufferAttribute(typedArray, 1)) + } + + var attributes = json.data.attributes + + for (var key in attributes) { + var attribute = attributes[key] + var typedArray = new TYPED_ARRAYS[attribute.type](attribute.array) + + geometry.addAttribute( + key, + new BufferAttribute(typedArray, attribute.itemSize, attribute.normalized) + ) + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets + + if (groups !== undefined) { + for (var i = 0, n = groups.length; i !== n; ++i) { + var group = groups[i] + + geometry.addGroup(group.start, group.count, group.materialIndex) + } + } + + var boundingSphere = json.data.boundingSphere + + if (boundingSphere !== undefined) { + var center = new Vector3() + + if (boundingSphere.center !== undefined) { + center.fromArray(boundingSphere.center) + } + + geometry.boundingSphere = new Sphere(center, boundingSphere.radius) + } + + return geometry + } + }) + + var TYPED_ARRAYS = { + Int8Array: Int8Array, + Uint8Array: Uint8Array, + // Workaround for IE11 pre KB2929437. See #11440 + Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array, + Int16Array: Int16Array, + Uint16Array: Uint16Array, + Int32Array: Int32Array, + Uint32Array: Uint32Array, + Float32Array: Float32Array, + Float64Array: Float64Array + } + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() { + this.onLoadStart = function () {} + this.onLoadProgress = function () {} + this.onLoadComplete = function () {} + } + + Loader.Handlers = { + handlers: [], + + add: function (regex, loader) { + this.handlers.push(regex, loader) + }, + + get: function (file) { + var handlers = this.handlers + + for (var i = 0, l = handlers.length; i < l; i += 2) { + var regex = handlers[i] + var loader = handlers[i + 1] + + if (regex.test(file)) { + return loader + } + } + + return null + } + } + + Object.assign(Loader.prototype, { + crossOrigin: undefined, + + initMaterials: function (materials, texturePath, crossOrigin) { + var array = [] + + for (var i = 0; i < materials.length; ++i) { + array[i] = this.createMaterial(materials[i], texturePath, crossOrigin) + } + + return array + }, + + createMaterial: (function () { + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + } + + var color = new Color() + var textureLoader = new TextureLoader() + var materialLoader = new MaterialLoader() + + return function createMaterial(m, texturePath, crossOrigin) { + // convert from old material format + + var textures = {} + + function loadTexture(path, repeat, offset, wrap, anisotropy) { + var fullPath = texturePath + path + var loader = Loader.Handlers.get(fullPath) + + var texture + + if (loader !== null) { + texture = loader.load(fullPath) + } else { + textureLoader.setCrossOrigin(crossOrigin) + texture = textureLoader.load(fullPath) + } + + if (repeat !== undefined) { + texture.repeat.fromArray(repeat) + + if (repeat[0] !== 1) texture.wrapS = RepeatWrapping + if (repeat[1] !== 1) texture.wrapT = RepeatWrapping + } + + if (offset !== undefined) { + texture.offset.fromArray(offset) + } + + if (wrap !== undefined) { + if (wrap[0] === 'repeat') texture.wrapS = RepeatWrapping + if (wrap[0] === 'mirror') texture.wrapS = MirroredRepeatWrapping + + if (wrap[1] === 'repeat') texture.wrapT = RepeatWrapping + if (wrap[1] === 'mirror') texture.wrapT = MirroredRepeatWrapping + } + + if (anisotropy !== undefined) { + texture.anisotropy = anisotropy + } + + var uuid = _Math.generateUUID() + + textures[uuid] = texture + + return uuid + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + } + + for (var name in m) { + var value = m[name] + + switch (name) { + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break + case 'DbgName': + json.name = value + break + case 'blending': + json.blending = BlendingMode[value] + break + case 'colorAmbient': + case 'mapAmbient': + console.warn('THREE.Loader.createMaterial:', name, 'is no longer supported.') + break + case 'colorDiffuse': + json.color = color.fromArray(value).getHex() + break + case 'colorSpecular': + json.specular = color.fromArray(value).getHex() + break + case 'colorEmissive': + json.emissive = color.fromArray(value).getHex() + break + case 'specularCoef': + json.shininess = value + break + case 'shading': + if (value.toLowerCase() === 'basic') json.type = 'MeshBasicMaterial' + if (value.toLowerCase() === 'phong') json.type = 'MeshPhongMaterial' + if (value.toLowerCase() === 'standard') json.type = 'MeshStandardMaterial' + break + case 'mapDiffuse': + json.map = loadTexture( + value, + m.mapDiffuseRepeat, + m.mapDiffuseOffset, + m.mapDiffuseWrap, + m.mapDiffuseAnisotropy + ) + break + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break + case 'mapEmissive': + json.emissiveMap = loadTexture( + value, + m.mapEmissiveRepeat, + m.mapEmissiveOffset, + m.mapEmissiveWrap, + m.mapEmissiveAnisotropy + ) + break + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break + case 'mapLight': + json.lightMap = loadTexture( + value, + m.mapLightRepeat, + m.mapLightOffset, + m.mapLightWrap, + m.mapLightAnisotropy + ) + break + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break + case 'mapAO': + json.aoMap = loadTexture( + value, + m.mapAORepeat, + m.mapAOOffset, + m.mapAOWrap, + m.mapAOAnisotropy + ) + break + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break + case 'mapBump': + json.bumpMap = loadTexture( + value, + m.mapBumpRepeat, + m.mapBumpOffset, + m.mapBumpWrap, + m.mapBumpAnisotropy + ) + break + case 'mapBumpScale': + json.bumpScale = value + break + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break + case 'mapNormal': + json.normalMap = loadTexture( + value, + m.mapNormalRepeat, + m.mapNormalOffset, + m.mapNormalWrap, + m.mapNormalAnisotropy + ) + break + case 'mapNormalFactor': + json.normalScale = [value, value] + break + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break + case 'mapSpecular': + json.specularMap = loadTexture( + value, + m.mapSpecularRepeat, + m.mapSpecularOffset, + m.mapSpecularWrap, + m.mapSpecularAnisotropy + ) + break + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break + case 'mapMetalness': + json.metalnessMap = loadTexture( + value, + m.mapMetalnessRepeat, + m.mapMetalnessOffset, + m.mapMetalnessWrap, + m.mapMetalnessAnisotropy + ) + break + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break + case 'mapRoughness': + json.roughnessMap = loadTexture( + value, + m.mapRoughnessRepeat, + m.mapRoughnessOffset, + m.mapRoughnessWrap, + m.mapRoughnessAnisotropy + ) + break + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break + case 'mapAlpha': + json.alphaMap = loadTexture( + value, + m.mapAlphaRepeat, + m.mapAlphaOffset, + m.mapAlphaWrap, + m.mapAlphaAnisotropy + ) + break + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break + case 'flipSided': + json.side = BackSide + break + case 'doubleSided': + json.side = DoubleSide + break + case 'transparency': + console.warn('THREE.Loader.createMaterial: transparency has been renamed to opacity') + json.opacity = value + break + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[name] = value + break + case 'vertexColors': + if (value === true) json.vertexColors = VertexColors + if (value === 'face') json.vertexColors = FaceColors + break + default: + console.error('THREE.Loader.createMaterial: Unsupported', name, value) + break + } + } + + if (json.type === 'MeshBasicMaterial') delete json.emissive + if (json.type !== 'MeshPhongMaterial') delete json.specular + + if (json.opacity < 1) json.transparent = true + + materialLoader.setTextures(textures) + + return materialLoader.parse(json) + } + })() + }) + + /** + * @author Don McCurdy / https://www.donmccurdy.com + */ + + var LoaderUtils = { + decodeText: function (array) { + if (typeof TextDecoder !== 'undefined') { + return new TextDecoder().decode(array) + } + + // Avoid the String.fromCharCode.apply(null, array) shortcut, which + // throws a "maximum call stack size exceeded" error for large arrays. + + var s = '' + + for (var i = 0, il = array.length; i < il; i++) { + // Implicitly assumes little-endian. + s += String.fromCharCode(array[i]) + } + + // Merges multi-byte utf-8 characters. + return decodeURIComponent(escape(s)) + }, + + extractUrlBase: function (url) { + var parts = url.split('/') + + if (parts.length === 1) return './' + + parts.pop() + + return parts.join('/') + '/' + } + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader(manager) { + if (typeof manager === 'boolean') { + console.warn('THREE.JSONLoader: showStatus parameter has been removed from constructor.') + manager = undefined + } + + this.manager = manager !== undefined ? manager : DefaultLoadingManager + + this.withCredentials = false + } + + Object.assign(JSONLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + var scope = this + + var texturePath = + this.texturePath && typeof this.texturePath === 'string' + ? this.texturePath + : LoaderUtils.extractUrlBase(url) + + var loader = new FileLoader(this.manager) + loader.setWithCredentials(this.withCredentials) + loader.load( + url, + function (text) { + var json = JSON.parse(text) + var metadata = json.metadata + + if (metadata !== undefined) { + var type = metadata.type + + if (type !== undefined) { + if (type.toLowerCase() === 'object') { + console.error( + 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' + ) + return + } + + if (type.toLowerCase() === 'scene') { + console.error( + 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' + ) + return + } + } + } + + var object = scope.parse(json, texturePath) + onLoad(object.geometry, object.materials) + }, + onProgress, + onError + ) + }, + + setTexturePath: function (value) { + this.texturePath = value + }, + + parse: (function () { + function parseModel(json, geometry) { + function isBitSet(value, position) { + return value & (1 << position) + } + + var i, + j, + fi, + offset, + zLength, + colorIndex, + normalIndex, + uvIndex, + materialIndex, + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, + hasFaceVertexNormal, + hasFaceColor, + hasFaceVertexColor, + vertex, + face, + faceA, + faceB, + hex, + normal, + uvLayer, + uv, + u, + v, + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + scale = json.scale, + nUvLayers = 0 + + if (json.uvs !== undefined) { + // disregard empty arrays + + for (i = 0; i < json.uvs.length; i++) { + if (json.uvs[i].length) nUvLayers++ + } + + for (i = 0; i < nUvLayers; i++) { + geometry.faceVertexUvs[i] = [] + } + } + + offset = 0 + zLength = vertices.length + + while (offset < zLength) { + vertex = new Vector3() + + vertex.x = vertices[offset++] * scale + vertex.y = vertices[offset++] * scale + vertex.z = vertices[offset++] * scale + + geometry.vertices.push(vertex) + } + + offset = 0 + zLength = faces.length + + while (offset < zLength) { + type = faces[offset++] + + isQuad = isBitSet(type, 0) + hasMaterial = isBitSet(type, 1) + hasFaceVertexUv = isBitSet(type, 3) + hasFaceNormal = isBitSet(type, 4) + hasFaceVertexNormal = isBitSet(type, 5) + hasFaceColor = isBitSet(type, 6) + hasFaceVertexColor = isBitSet(type, 7) + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if (isQuad) { + faceA = new Face3() + faceA.a = faces[offset] + faceA.b = faces[offset + 1] + faceA.c = faces[offset + 3] + + faceB = new Face3() + faceB.a = faces[offset + 1] + faceB.b = faces[offset + 2] + faceB.c = faces[offset + 3] + + offset += 4 + + if (hasMaterial) { + materialIndex = faces[offset++] + faceA.materialIndex = materialIndex + faceB.materialIndex = materialIndex + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length + + if (hasFaceVertexUv) { + for (i = 0; i < nUvLayers; i++) { + uvLayer = json.uvs[i] + + geometry.faceVertexUvs[i][fi] = [] + geometry.faceVertexUvs[i][fi + 1] = [] + + for (j = 0; j < 4; j++) { + uvIndex = faces[offset++] + + u = uvLayer[uvIndex * 2] + v = uvLayer[uvIndex * 2 + 1] + + uv = new Vector2(u, v) + + if (j !== 2) geometry.faceVertexUvs[i][fi].push(uv) + if (j !== 0) geometry.faceVertexUvs[i][fi + 1].push(uv) + } + } + } + + if (hasFaceNormal) { + normalIndex = faces[offset++] * 3 + + faceA.normal.set(normals[normalIndex++], normals[normalIndex++], normals[normalIndex]) + + faceB.normal.copy(faceA.normal) + } + + if (hasFaceVertexNormal) { + for (i = 0; i < 4; i++) { + normalIndex = faces[offset++] * 3 + + normal = new Vector3( + normals[normalIndex++], + normals[normalIndex++], + normals[normalIndex] + ) + + if (i !== 2) faceA.vertexNormals.push(normal) + if (i !== 0) faceB.vertexNormals.push(normal) + } + } + + if (hasFaceColor) { + colorIndex = faces[offset++] + hex = colors[colorIndex] + + faceA.color.setHex(hex) + faceB.color.setHex(hex) + } + + if (hasFaceVertexColor) { + for (i = 0; i < 4; i++) { + colorIndex = faces[offset++] + hex = colors[colorIndex] + + if (i !== 2) faceA.vertexColors.push(new Color(hex)) + if (i !== 0) faceB.vertexColors.push(new Color(hex)) + } + } + + geometry.faces.push(faceA) + geometry.faces.push(faceB) + } else { + face = new Face3() + face.a = faces[offset++] + face.b = faces[offset++] + face.c = faces[offset++] + + if (hasMaterial) { + materialIndex = faces[offset++] + face.materialIndex = materialIndex + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length + + if (hasFaceVertexUv) { + for (i = 0; i < nUvLayers; i++) { + uvLayer = json.uvs[i] + + geometry.faceVertexUvs[i][fi] = [] + + for (j = 0; j < 3; j++) { + uvIndex = faces[offset++] + + u = uvLayer[uvIndex * 2] + v = uvLayer[uvIndex * 2 + 1] + + uv = new Vector2(u, v) + + geometry.faceVertexUvs[i][fi].push(uv) + } + } + } + + if (hasFaceNormal) { + normalIndex = faces[offset++] * 3 + + face.normal.set(normals[normalIndex++], normals[normalIndex++], normals[normalIndex]) + } + + if (hasFaceVertexNormal) { + for (i = 0; i < 3; i++) { + normalIndex = faces[offset++] * 3 + + normal = new Vector3( + normals[normalIndex++], + normals[normalIndex++], + normals[normalIndex] + ) + + face.vertexNormals.push(normal) + } + } + + if (hasFaceColor) { + colorIndex = faces[offset++] + face.color.setHex(colors[colorIndex]) + } + + if (hasFaceVertexColor) { + for (i = 0; i < 3; i++) { + colorIndex = faces[offset++] + face.vertexColors.push(new Color(colors[colorIndex])) + } + } + + geometry.faces.push(face) + } + } + } + + function parseSkin(json, geometry) { + var influencesPerVertex = + json.influencesPerVertex !== undefined ? json.influencesPerVertex : 2 + + if (json.skinWeights) { + for (var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex) { + var x = json.skinWeights[i] + var y = influencesPerVertex > 1 ? json.skinWeights[i + 1] : 0 + var z = influencesPerVertex > 2 ? json.skinWeights[i + 2] : 0 + var w = influencesPerVertex > 3 ? json.skinWeights[i + 3] : 0 + + geometry.skinWeights.push(new Vector4(x, y, z, w)) + } + } + + if (json.skinIndices) { + for (var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex) { + var a = json.skinIndices[i] + var b = influencesPerVertex > 1 ? json.skinIndices[i + 1] : 0 + var c = influencesPerVertex > 2 ? json.skinIndices[i + 2] : 0 + var d = influencesPerVertex > 3 ? json.skinIndices[i + 3] : 0 + + geometry.skinIndices.push(new Vector4(a, b, c, d)) + } + } + + geometry.bones = json.bones + + if ( + geometry.bones && + geometry.bones.length > 0 && + (geometry.skinWeights.length !== geometry.skinIndices.length || + geometry.skinIndices.length !== geometry.vertices.length) + ) { + console.warn( + 'When skinning, number of vertices (' + + geometry.vertices.length + + '), skinIndices (' + + geometry.skinIndices.length + + '), and skinWeights (' + + geometry.skinWeights.length + + ') should match.' + ) + } + } + + function parseMorphing(json, geometry) { + var scale = json.scale + + if (json.morphTargets !== undefined) { + for (var i = 0, l = json.morphTargets.length; i < l; i++) { + geometry.morphTargets[i] = {} + geometry.morphTargets[i].name = json.morphTargets[i].name + geometry.morphTargets[i].vertices = [] + + var dstVertices = geometry.morphTargets[i].vertices + var srcVertices = json.morphTargets[i].vertices + + for (var v = 0, vl = srcVertices.length; v < vl; v += 3) { + var vertex = new Vector3() + vertex.x = srcVertices[v] * scale + vertex.y = srcVertices[v + 1] * scale + vertex.z = srcVertices[v + 2] * scale + + dstVertices.push(vertex) + } + } + } + + if (json.morphColors !== undefined && json.morphColors.length > 0) { + console.warn( + 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' + ) + + var faces = geometry.faces + var morphColors = json.morphColors[0].colors + + for (var i = 0, l = faces.length; i < l; i++) { + faces[i].color.fromArray(morphColors, i * 3) + } + } + } + + function parseAnimations(json, geometry) { + var outputAnimations = [] + + // parse old style Bone/Hierarchy animations + var animations = [] + + if (json.animation !== undefined) { + animations.push(json.animation) + } + + if (json.animations !== undefined) { + if (json.animations.length) { + animations = animations.concat(json.animations) + } else { + animations.push(json.animations) + } + } + + for (var i = 0; i < animations.length; i++) { + var clip = AnimationClip.parseAnimation(animations[i], geometry.bones) + if (clip) outputAnimations.push(clip) + } + + // parse implicit morph animations + if (geometry.morphTargets) { + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( + geometry.morphTargets, + 10 + ) + outputAnimations = outputAnimations.concat(morphAnimationClips) + } + + if (outputAnimations.length > 0) geometry.animations = outputAnimations + } + + return function parse(json, texturePath) { + if (json.data !== undefined) { + // Geometry 4.0 spec + json = json.data + } + + if (json.scale !== undefined) { + json.scale = 1.0 / json.scale + } else { + json.scale = 1.0 + } + + var geometry = new Geometry() + + parseModel(json, geometry) + parseSkin(json, geometry) + parseMorphing(json, geometry) + parseAnimations(json, geometry) + + geometry.computeFaceNormals() + geometry.computeBoundingSphere() + + if (json.materials === undefined || json.materials.length === 0) { + return { geometry: geometry } + } else { + var materials = Loader.prototype.initMaterials( + json.materials, + texturePath, + this.crossOrigin + ) + + return { geometry: geometry, materials: materials } + } + } + })() + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + this.texturePath = '' + } + + Object.assign(ObjectLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + if (this.texturePath === '') { + this.texturePath = url.substring(0, url.lastIndexOf('/') + 1) + } + + var scope = this + + var loader = new FileLoader(scope.manager) + loader.load( + url, + function (text) { + var json = null + + try { + json = JSON.parse(text) + } catch (error) { + if (onError !== undefined) onError(error) + + console.error("THREE:ObjectLoader: Can't parse " + url + '.', error.message) + + return + } + + var metadata = json.metadata + + if ( + metadata === undefined || + metadata.type === undefined || + metadata.type.toLowerCase() === 'geometry' + ) { + console.error( + "THREE.ObjectLoader: Can't load " + url + '. Use THREE.JSONLoader instead.' + ) + return + } + + scope.parse(json, onLoad) + }, + onProgress, + onError + ) + }, + + setTexturePath: function (value) { + this.texturePath = value + }, + + setCrossOrigin: function (value) { + this.crossOrigin = value + }, + + parse: function (json, onLoad) { + var shapes = this.parseShape(json.shapes) + var geometries = this.parseGeometries(json.geometries, shapes) + + var images = this.parseImages(json.images, function () { + if (onLoad !== undefined) onLoad(object) + }) + + var textures = this.parseTextures(json.textures, images) + var materials = this.parseMaterials(json.materials, textures) + + var object = this.parseObject(json.object, geometries, materials) + + if (json.animations) { + object.animations = this.parseAnimations(json.animations) + } + + if (json.images === undefined || json.images.length === 0) { + if (onLoad !== undefined) onLoad(object) + } + + return object + }, + + parseShape: function (json) { + var shapes = {} + + if (json !== undefined) { + for (var i = 0, l = json.length; i < l; i++) { + var shape = new Shape().fromJSON(json[i]) + + shapes[shape.uuid] = shape + } + } + + return shapes + }, + + parseGeometries: function (json, shapes) { + var geometries = {} + + if (json !== undefined) { + var geometryLoader = new JSONLoader() + var bufferGeometryLoader = new BufferGeometryLoader() + + for (var i = 0, l = json.length; i < l; i++) { + var geometry + var data = json[i] + + switch (data.type) { + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + geometry = new Geometries[data.type]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ) + + break + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + geometry = new Geometries[data.type]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ) + + break + + case 'CircleGeometry': + case 'CircleBufferGeometry': + geometry = new Geometries[data.type]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ) + + break + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + geometry = new Geometries[data.type]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ) + + break + + case 'ConeGeometry': + case 'ConeBufferGeometry': + geometry = new Geometries[data.type]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ) + + break + + case 'SphereGeometry': + case 'SphereBufferGeometry': + geometry = new Geometries[data.type]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ) + + break + + case 'DodecahedronGeometry': + case 'DodecahedronBufferGeometry': + case 'IcosahedronGeometry': + case 'IcosahedronBufferGeometry': + case 'OctahedronGeometry': + case 'OctahedronBufferGeometry': + case 'TetrahedronGeometry': + case 'TetrahedronBufferGeometry': + geometry = new Geometries[data.type](data.radius, data.detail) + + break + + case 'RingGeometry': + case 'RingBufferGeometry': + geometry = new Geometries[data.type]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ) + + break + + case 'TorusGeometry': + case 'TorusBufferGeometry': + geometry = new Geometries[data.type]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ) + + break + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + geometry = new Geometries[data.type]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ) + + break + + case 'LatheGeometry': + case 'LatheBufferGeometry': + geometry = new Geometries[data.type]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ) + + break + + case 'PolyhedronGeometry': + case 'PolyhedronBufferGeometry': + geometry = new Geometries[data.type]( + data.vertices, + data.indices, + data.radius, + data.details + ) + + break + + case 'ShapeGeometry': + case 'ShapeBufferGeometry': + var geometryShapes = [] + + for (var i = 0, l = data.shapes.length; i < l; i++) { + var shape = shapes[data.shapes[i]] + + geometryShapes.push(shape) + } + + geometry = new Geometries[data.type](geometryShapes, data.curveSegments) + + break + + case 'BufferGeometry': + geometry = bufferGeometryLoader.parse(data) + + break + + case 'Geometry': + geometry = geometryLoader.parse(data, this.texturePath).geometry + + break + + default: + console.warn('THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"') + + continue + } + + geometry.uuid = data.uuid + + if (data.name !== undefined) geometry.name = data.name + + geometries[data.uuid] = geometry + } + } + + return geometries + }, + + parseMaterials: function (json, textures) { + var materials = {} + + if (json !== undefined) { + var loader = new MaterialLoader() + loader.setTextures(textures) + + for (var i = 0, l = json.length; i < l; i++) { + var data = json[i] + + if (data.type === 'MultiMaterial') { + // Deprecated + + var array = [] + + for (var j = 0; j < data.materials.length; j++) { + array.push(loader.parse(data.materials[j])) + } + + materials[data.uuid] = array + } else { + materials[data.uuid] = loader.parse(data) + } + } + } + + return materials + }, + + parseAnimations: function (json) { + var animations = [] + + for (var i = 0; i < json.length; i++) { + var clip = AnimationClip.parse(json[i]) + + animations.push(clip) + } + + return animations + }, + + parseImages: function (json, onLoad) { + var scope = this + var images = {} + + function loadImage(url) { + scope.manager.itemStart(url) + + return loader.load( + url, + function () { + scope.manager.itemEnd(url) + }, + undefined, + function () { + scope.manager.itemEnd(url) + scope.manager.itemError(url) + } + ) + } + + if (json !== undefined && json.length > 0) { + var manager = new LoadingManager(onLoad) + + var loader = new ImageLoader(manager) + loader.setCrossOrigin(this.crossOrigin) + + for (var i = 0, l = json.length; i < l; i++) { + var image = json[i] + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url) + ? image.url + : scope.texturePath + image.url + + images[image.uuid] = loadImage(path) + } + } + + return images + }, + + parseTextures: function (json, images) { + function parseConstant(value, type) { + if (typeof value === 'number') return value + + console.warn('THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value) + + return type[value] + } + + var textures = {} + + if (json !== undefined) { + for (var i = 0, l = json.length; i < l; i++) { + var data = json[i] + + if (data.image === undefined) { + console.warn('THREE.ObjectLoader: No "image" specified for', data.uuid) + } + + if (images[data.image] === undefined) { + console.warn('THREE.ObjectLoader: Undefined image', data.image) + } + + var texture = new Texture(images[data.image]) + texture.needsUpdate = true + + texture.uuid = data.uuid + + if (data.name !== undefined) texture.name = data.name + + if (data.mapping !== undefined) + texture.mapping = parseConstant(data.mapping, TEXTURE_MAPPING) + + if (data.offset !== undefined) texture.offset.fromArray(data.offset) + if (data.repeat !== undefined) texture.repeat.fromArray(data.repeat) + if (data.center !== undefined) texture.center.fromArray(data.center) + if (data.rotation !== undefined) texture.rotation = data.rotation + + if (data.wrap !== undefined) { + texture.wrapS = parseConstant(data.wrap[0], TEXTURE_WRAPPING) + texture.wrapT = parseConstant(data.wrap[1], TEXTURE_WRAPPING) + } + + if (data.minFilter !== undefined) + texture.minFilter = parseConstant(data.minFilter, TEXTURE_FILTER) + if (data.magFilter !== undefined) + texture.magFilter = parseConstant(data.magFilter, TEXTURE_FILTER) + if (data.anisotropy !== undefined) texture.anisotropy = data.anisotropy + + if (data.flipY !== undefined) texture.flipY = data.flipY + + textures[data.uuid] = texture + } + } + + return textures + }, + + parseObject: function (data, geometries, materials) { + var object + + function getGeometry(name) { + if (geometries[name] === undefined) { + console.warn('THREE.ObjectLoader: Undefined geometry', name) + } + + return geometries[name] + } + + function getMaterial(name) { + if (name === undefined) return undefined + + if (Array.isArray(name)) { + var array = [] + + for (var i = 0, l = name.length; i < l; i++) { + var uuid = name[i] + + if (materials[uuid] === undefined) { + console.warn('THREE.ObjectLoader: Undefined material', uuid) + } + + array.push(materials[uuid]) + } + + return array + } + + if (materials[name] === undefined) { + console.warn('THREE.ObjectLoader: Undefined material', name) + } + + return materials[name] + } + + switch (data.type) { + case 'Scene': + object = new Scene() + + if (data.background !== undefined) { + if (Number.isInteger(data.background)) { + object.background = new Color(data.background) + } + } + + if (data.fog !== undefined) { + if (data.fog.type === 'Fog') { + object.fog = new Fog(data.fog.color, data.fog.near, data.fog.far) + } else if (data.fog.type === 'FogExp2') { + object.fog = new FogExp2(data.fog.color, data.fog.density) + } + } + + break + + case 'PerspectiveCamera': + object = new PerspectiveCamera(data.fov, data.aspect, data.near, data.far) + + if (data.focus !== undefined) object.focus = data.focus + if (data.zoom !== undefined) object.zoom = data.zoom + if (data.filmGauge !== undefined) object.filmGauge = data.filmGauge + if (data.filmOffset !== undefined) object.filmOffset = data.filmOffset + if (data.view !== undefined) object.view = Object.assign({}, data.view) + + break + + case 'OrthographicCamera': + object = new OrthographicCamera( + data.left, + data.right, + data.top, + data.bottom, + data.near, + data.far + ) + + break + + case 'AmbientLight': + object = new AmbientLight(data.color, data.intensity) + + break + + case 'DirectionalLight': + object = new DirectionalLight(data.color, data.intensity) + + break + + case 'PointLight': + object = new PointLight(data.color, data.intensity, data.distance, data.decay) + + break + + case 'RectAreaLight': + object = new RectAreaLight(data.color, data.intensity, data.width, data.height) + + break + + case 'SpotLight': + object = new SpotLight( + data.color, + data.intensity, + data.distance, + data.angle, + data.penumbra, + data.decay + ) + + break + + case 'HemisphereLight': + object = new HemisphereLight(data.color, data.groundColor, data.intensity) + + break + + case 'SkinnedMesh': + console.warn('THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.') + + case 'Mesh': + var geometry = getGeometry(data.geometry) + var material = getMaterial(data.material) + + if (geometry.bones && geometry.bones.length > 0) { + object = new SkinnedMesh(geometry, material) + } else { + object = new Mesh(geometry, material) + } + + break + + case 'LOD': + object = new LOD() + + break + + case 'Line': + object = new Line(getGeometry(data.geometry), getMaterial(data.material), data.mode) + + break + + case 'LineLoop': + object = new LineLoop(getGeometry(data.geometry), getMaterial(data.material)) + + break + + case 'LineSegments': + object = new LineSegments(getGeometry(data.geometry), getMaterial(data.material)) + + break + + case 'PointCloud': + case 'Points': + object = new Points(getGeometry(data.geometry), getMaterial(data.material)) + + break + + case 'Sprite': + object = new Sprite(getMaterial(data.material)) + + break + + case 'Group': + object = new Group() + + break + + default: + object = new Object3D() + } + + object.uuid = data.uuid + + if (data.name !== undefined) object.name = data.name + if (data.matrix !== undefined) { + object.matrix.fromArray(data.matrix) + object.matrix.decompose(object.position, object.quaternion, object.scale) + } else { + if (data.position !== undefined) object.position.fromArray(data.position) + if (data.rotation !== undefined) object.rotation.fromArray(data.rotation) + if (data.quaternion !== undefined) object.quaternion.fromArray(data.quaternion) + if (data.scale !== undefined) object.scale.fromArray(data.scale) + } + + if (data.castShadow !== undefined) object.castShadow = data.castShadow + if (data.receiveShadow !== undefined) object.receiveShadow = data.receiveShadow + + if (data.shadow) { + if (data.shadow.bias !== undefined) object.shadow.bias = data.shadow.bias + if (data.shadow.radius !== undefined) object.shadow.radius = data.shadow.radius + if (data.shadow.mapSize !== undefined) object.shadow.mapSize.fromArray(data.shadow.mapSize) + if (data.shadow.camera !== undefined) + object.shadow.camera = this.parseObject(data.shadow.camera) + } + + if (data.visible !== undefined) object.visible = data.visible + if (data.userData !== undefined) object.userData = data.userData + + if (data.children !== undefined) { + var children = data.children + + for (var i = 0; i < children.length; i++) { + object.add(this.parseObject(children[i], geometries, materials)) + } + } + + if (data.type === 'LOD') { + var levels = data.levels + + for (var l = 0; l < levels.length; l++) { + var level = levels[l] + var child = object.getObjectByProperty('uuid', level.object) + + if (child !== undefined) { + object.addLevel(child, level.distance) + } + } + } + + return object + } + }) + + var TEXTURE_MAPPING = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + } + + var TEXTURE_WRAPPING = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + } + + var TEXTURE_FILTER = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + } + + /** + * @author thespite / http://clicktorelease.com/ + */ + + function ImageBitmapLoader(manager) { + if (typeof createImageBitmap === 'undefined') { + console.warn('THREE.ImageBitmapLoader: createImageBitmap() not supported.') + } + + if (typeof fetch === 'undefined') { + console.warn('THREE.ImageBitmapLoader: fetch() not supported.') + } + + this.manager = manager !== undefined ? manager : DefaultLoadingManager + this.options = undefined + } + + ImageBitmapLoader.prototype = { + constructor: ImageBitmapLoader, + + setOptions: function setOptions(options) { + this.options = options + + return this + }, + + load: function load(url, onLoad, onProgress, onError) { + if (url === undefined) url = '' + + if (this.path !== undefined) url = this.path + url + + var scope = this + + var cached = Cache.get(url) + + if (cached !== undefined) { + scope.manager.itemStart(url) + + setTimeout(function () { + if (onLoad) onLoad(cached) + + scope.manager.itemEnd(url) + }, 0) + + return cached + } + + fetch(url) + .then(function (res) { + return res.blob() + }) + .then(function (blob) { + return createImageBitmap(blob, scope.options) + }) + .then(function (imageBitmap) { + Cache.add(url, imageBitmap) + + if (onLoad) onLoad(imageBitmap) + + scope.manager.itemEnd(url) + }) + .catch(function (e) { + if (onError) onError(e) + + scope.manager.itemEnd(url) + scope.manager.itemError(url) + }) + }, + + setCrossOrigin: function (/* value */) { + return this + }, + + setPath: function (value) { + this.path = value + return this + } + } + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + **/ + + function ShapePath() { + this.type = 'ShapePath' + + this.subPaths = [] + this.currentPath = null + } + + Object.assign(ShapePath.prototype, { + moveTo: function (x, y) { + this.currentPath = new Path() + this.subPaths.push(this.currentPath) + this.currentPath.moveTo(x, y) + }, + + lineTo: function (x, y) { + this.currentPath.lineTo(x, y) + }, + + quadraticCurveTo: function (aCPx, aCPy, aX, aY) { + this.currentPath.quadraticCurveTo(aCPx, aCPy, aX, aY) + }, + + bezierCurveTo: function (aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { + this.currentPath.bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) + }, + + splineThru: function (pts) { + this.currentPath.splineThru(pts) + }, + + toShapes: function (isCCW, noHoles) { + function toShapesNoHoles(inSubpaths) { + var shapes = [] + + for (var i = 0, l = inSubpaths.length; i < l; i++) { + var tmpPath = inSubpaths[i] + + var tmpShape = new Shape() + tmpShape.curves = tmpPath.curves + + shapes.push(tmpShape) + } + + return shapes + } + + function isPointInsidePolygon(inPt, inPolygon) { + var polyLen = inPolygon.length + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false + for (var p = polyLen - 1, q = 0; q < polyLen; p = q++) { + var edgeLowPt = inPolygon[p] + var edgeHighPt = inPolygon[q] + + var edgeDx = edgeHighPt.x - edgeLowPt.x + var edgeDy = edgeHighPt.y - edgeLowPt.y + + if (Math.abs(edgeDy) > Number.EPSILON) { + // not parallel + if (edgeDy < 0) { + edgeLowPt = inPolygon[q] + edgeDx = -edgeDx + edgeHighPt = inPolygon[p] + edgeDy = -edgeDy + } + if (inPt.y < edgeLowPt.y || inPt.y > edgeHighPt.y) continue + + if (inPt.y === edgeLowPt.y) { + if (inPt.x === edgeLowPt.x) return true // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + } else { + var perpEdge = edgeDy * (inPt.x - edgeLowPt.x) - edgeDx * (inPt.y - edgeLowPt.y) + if (perpEdge === 0) return true // inPt is on contour ? + if (perpEdge < 0) continue + inside = !inside // true intersection left of inPt + } + } else { + // parallel or collinear + if (inPt.y !== edgeLowPt.y) continue // parallel + // edge lies on the same horizontal line as inPt + if ( + (edgeHighPt.x <= inPt.x && inPt.x <= edgeLowPt.x) || + (edgeLowPt.x <= inPt.x && inPt.x <= edgeHighPt.x) + ) + return true // inPt: Point on contour ! + // continue; + } + } + + return inside + } + + var isClockWise = ShapeUtils.isClockWise + + var subPaths = this.subPaths + if (subPaths.length === 0) return [] + + if (noHoles === true) return toShapesNoHoles(subPaths) + + var solid, + tmpPath, + tmpShape, + shapes = [] + + if (subPaths.length === 1) { + tmpPath = subPaths[0] + tmpShape = new Shape() + tmpShape.curves = tmpPath.curves + shapes.push(tmpShape) + return shapes + } + + var holesFirst = !isClockWise(subPaths[0].getPoints()) + holesFirst = isCCW ? !holesFirst : holesFirst + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = [] + var newShapes = [] + var newShapeHoles = [] + var mainIdx = 0 + var tmpPoints + + newShapes[mainIdx] = undefined + newShapeHoles[mainIdx] = [] + + for (var i = 0, l = subPaths.length; i < l; i++) { + tmpPath = subPaths[i] + tmpPoints = tmpPath.getPoints() + solid = isClockWise(tmpPoints) + solid = isCCW ? !solid : solid + + if (solid) { + if (!holesFirst && newShapes[mainIdx]) mainIdx++ + + newShapes[mainIdx] = { s: new Shape(), p: tmpPoints } + newShapes[mainIdx].s.curves = tmpPath.curves + + if (holesFirst) mainIdx++ + newShapeHoles[mainIdx] = [] + + //console.log('cw', i); + } else { + newShapeHoles[mainIdx].push({ h: tmpPath, p: tmpPoints[0] }) + + //console.log('ccw', i); + } + } + + // only Holes? -> probably all Shapes with wrong orientation + if (!newShapes[0]) return toShapesNoHoles(subPaths) + + if (newShapes.length > 1) { + var ambiguous = false + var toChange = [] + + for (var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { + betterShapeHoles[sIdx] = [] + } + + for (var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { + var sho = newShapeHoles[sIdx] + + for (var hIdx = 0; hIdx < sho.length; hIdx++) { + var ho = sho[hIdx] + var hole_unassigned = true + + for (var s2Idx = 0; s2Idx < newShapes.length; s2Idx++) { + if (isPointInsidePolygon(ho.p, newShapes[s2Idx].p)) { + if (sIdx !== s2Idx) toChange.push({ froms: sIdx, tos: s2Idx, hole: hIdx }) + if (hole_unassigned) { + hole_unassigned = false + betterShapeHoles[s2Idx].push(ho) + } else { + ambiguous = true + } + } + } + if (hole_unassigned) { + betterShapeHoles[sIdx].push(ho) + } + } + } + // console.log("ambiguous: ", ambiguous); + if (toChange.length > 0) { + // console.log("to change: ", toChange); + if (!ambiguous) newShapeHoles = betterShapeHoles + } + } + + var tmpHoles + + for (var i = 0, il = newShapes.length; i < il; i++) { + tmpShape = newShapes[i].s + shapes.push(tmpShape) + tmpHoles = newShapeHoles[i] + + for (var j = 0, jl = tmpHoles.length; j < jl; j++) { + tmpShape.holes.push(tmpHoles[j].h) + } + } + + //console.log("shape", shapes); + + return shapes + } + }) + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font(data) { + this.type = 'Font' + + this.data = data + } + + Object.assign(Font.prototype, { + isFont: true, + + generateShapes: function (text, size, divisions) { + if (size === undefined) size = 100 + if (divisions === undefined) divisions = 4 + + var shapes = [] + var paths = createPaths(text, size, divisions, this.data) + + for (var p = 0, pl = paths.length; p < pl; p++) { + Array.prototype.push.apply(shapes, paths[p].toShapes()) + } + + return shapes + } + }) + + function createPaths(text, size, divisions, data) { + var chars = String(text).split('') + var scale = size / data.resolution + var line_height = + (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale + + var paths = [] + + var offsetX = 0, + offsetY = 0 + + for (var i = 0; i < chars.length; i++) { + var char = chars[i] + + if (char === '\n') { + offsetX = 0 + offsetY -= line_height + } else { + var ret = createPath(char, divisions, scale, offsetX, offsetY, data) + offsetX += ret.offsetX + paths.push(ret.path) + } + } + + return paths + } + + function createPath(char, divisions, scale, offsetX, offsetY, data) { + var glyph = data.glyphs[char] || data.glyphs['?'] + + if (!glyph) return + + var path = new ShapePath() + + var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2 + + if (glyph.o) { + var outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' ')) + + for (var i = 0, l = outline.length; i < l; ) { + var action = outline[i++] + + switch (action) { + case 'm': // moveTo + x = outline[i++] * scale + offsetX + y = outline[i++] * scale + offsetY + + path.moveTo(x, y) + + break + + case 'l': // lineTo + x = outline[i++] * scale + offsetX + y = outline[i++] * scale + offsetY + + path.lineTo(x, y) + + break + + case 'q': // quadraticCurveTo + cpx = outline[i++] * scale + offsetX + cpy = outline[i++] * scale + offsetY + cpx1 = outline[i++] * scale + offsetX + cpy1 = outline[i++] * scale + offsetY + + path.quadraticCurveTo(cpx1, cpy1, cpx, cpy) + + break + + case 'b': // bezierCurveTo + cpx = outline[i++] * scale + offsetX + cpy = outline[i++] * scale + offsetY + cpx1 = outline[i++] * scale + offsetX + cpy1 = outline[i++] * scale + offsetY + cpx2 = outline[i++] * scale + offsetX + cpy2 = outline[i++] * scale + offsetY + + path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy) + + break + } + } + } + + return { offsetX: glyph.ha * scale, path: path } + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + } + + Object.assign(FontLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + var scope = this + + var loader = new FileLoader(this.manager) + loader.setPath(this.path) + loader.load( + url, + function (text) { + var json + + try { + json = JSON.parse(text) + } catch (e) { + console.warn( + 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' + ) + json = JSON.parse(text.substring(65, text.length - 2)) + } + + var font = scope.parse(json) + + if (onLoad) onLoad(font) + }, + onProgress, + onError + ) + }, + + parse: function (json) { + return new Font(json) + }, + + setPath: function (value) { + this.path = value + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var context + + var AudioContext = { + getContext: function () { + if (context === undefined) { + context = new (window.AudioContext || window.webkitAudioContext)() + } + + return context + }, + + setContext: function (value) { + context = value + } + } + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader(manager) { + this.manager = manager !== undefined ? manager : DefaultLoadingManager + } + + Object.assign(AudioLoader.prototype, { + load: function (url, onLoad, onProgress, onError) { + var loader = new FileLoader(this.manager) + loader.setResponseType('arraybuffer') + loader.load( + url, + function (buffer) { + var context = AudioContext.getContext() + + context.decodeAudioData(buffer, function (audioBuffer) { + onLoad(audioBuffer) + }) + }, + onProgress, + onError + ) + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + this.type = 'StereoCamera' + + this.aspect = 1 + + this.eyeSep = 0.064 + + this.cameraL = new PerspectiveCamera() + this.cameraL.layers.enable(1) + this.cameraL.matrixAutoUpdate = false + + this.cameraR = new PerspectiveCamera() + this.cameraR.layers.enable(2) + this.cameraR.matrixAutoUpdate = false + } + + Object.assign(StereoCamera.prototype, { + update: (function () { + var instance, focus, fov, aspect, near, far, zoom, eyeSep + + var eyeRight = new Matrix4() + var eyeLeft = new Matrix4() + + return function update(camera) { + var needsUpdate = + instance !== this || + focus !== camera.focus || + fov !== camera.fov || + aspect !== camera.aspect * this.aspect || + near !== camera.near || + far !== camera.far || + zoom !== camera.zoom || + eyeSep !== this.eyeSep + + if (needsUpdate) { + instance = this + focus = camera.focus + fov = camera.fov + aspect = camera.aspect * this.aspect + near = camera.near + far = camera.far + zoom = camera.zoom + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone() + eyeSep = this.eyeSep / 2 + var eyeSepOnProjection = (eyeSep * near) / focus + var ymax = (near * Math.tan(_Math.DEG2RAD * fov * 0.5)) / zoom + var xmin, xmax + + // translate xOffset + + eyeLeft.elements[12] = -eyeSep + eyeRight.elements[12] = eyeSep + + // for left eye + + xmin = -ymax * aspect + eyeSepOnProjection + xmax = ymax * aspect + eyeSepOnProjection + + projectionMatrix.elements[0] = (2 * near) / (xmax - xmin) + projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin) + + this.cameraL.projectionMatrix.copy(projectionMatrix) + + // for right eye + + xmin = -ymax * aspect - eyeSepOnProjection + xmax = ymax * aspect - eyeSepOnProjection + + projectionMatrix.elements[0] = (2 * near) / (xmax - xmin) + projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin) + + this.cameraR.projectionMatrix.copy(projectionMatrix) + } + + this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(eyeLeft) + this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(eyeRight) + } + })() + }) + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera(near, far, cubeResolution) { + Object3D.call(this) + + this.type = 'CubeCamera' + + var fov = 90, + aspect = 1 + + var cameraPX = new PerspectiveCamera(fov, aspect, near, far) + cameraPX.up.set(0, -1, 0) + cameraPX.lookAt(new Vector3(1, 0, 0)) + this.add(cameraPX) + + var cameraNX = new PerspectiveCamera(fov, aspect, near, far) + cameraNX.up.set(0, -1, 0) + cameraNX.lookAt(new Vector3(-1, 0, 0)) + this.add(cameraNX) + + var cameraPY = new PerspectiveCamera(fov, aspect, near, far) + cameraPY.up.set(0, 0, 1) + cameraPY.lookAt(new Vector3(0, 1, 0)) + this.add(cameraPY) + + var cameraNY = new PerspectiveCamera(fov, aspect, near, far) + cameraNY.up.set(0, 0, -1) + cameraNY.lookAt(new Vector3(0, -1, 0)) + this.add(cameraNY) + + var cameraPZ = new PerspectiveCamera(fov, aspect, near, far) + cameraPZ.up.set(0, -1, 0) + cameraPZ.lookAt(new Vector3(0, 0, 1)) + this.add(cameraPZ) + + var cameraNZ = new PerspectiveCamera(fov, aspect, near, far) + cameraNZ.up.set(0, -1, 0) + cameraNZ.lookAt(new Vector3(0, 0, -1)) + this.add(cameraNZ) + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter } + + this.renderTarget = new WebGLRenderTargetCube(cubeResolution, cubeResolution, options) + this.renderTarget.texture.name = 'CubeCamera' + + this.update = function (renderer, scene) { + if (this.parent === null) this.updateMatrixWorld() + + var renderTarget = this.renderTarget + var generateMipmaps = renderTarget.texture.generateMipmaps + + renderTarget.texture.generateMipmaps = false + + renderTarget.activeCubeFace = 0 + renderer.render(scene, cameraPX, renderTarget) + + renderTarget.activeCubeFace = 1 + renderer.render(scene, cameraNX, renderTarget) + + renderTarget.activeCubeFace = 2 + renderer.render(scene, cameraPY, renderTarget) + + renderTarget.activeCubeFace = 3 + renderer.render(scene, cameraNY, renderTarget) + + renderTarget.activeCubeFace = 4 + renderer.render(scene, cameraPZ, renderTarget) + + renderTarget.texture.generateMipmaps = generateMipmaps + + renderTarget.activeCubeFace = 5 + renderer.render(scene, cameraNZ, renderTarget) + + renderer.setRenderTarget(null) + } + + this.clear = function (renderer, color, depth, stencil) { + var renderTarget = this.renderTarget + + for (var i = 0; i < 6; i++) { + renderTarget.activeCubeFace = i + renderer.setRenderTarget(renderTarget) + + renderer.clear(color, depth, stencil) + } + + renderer.setRenderTarget(null) + } + } + + CubeCamera.prototype = Object.create(Object3D.prototype) + CubeCamera.prototype.constructor = CubeCamera + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + Object3D.call(this) + + this.type = 'AudioListener' + + this.context = AudioContext.getContext() + + this.gain = this.context.createGain() + this.gain.connect(this.context.destination) + + this.filter = null + } + + AudioListener.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: AudioListener, + + getInput: function () { + return this.gain + }, + + removeFilter: function () { + if (this.filter !== null) { + this.gain.disconnect(this.filter) + this.filter.disconnect(this.context.destination) + this.gain.connect(this.context.destination) + this.filter = null + } + }, + + getFilter: function () { + return this.filter + }, + + setFilter: function (value) { + if (this.filter !== null) { + this.gain.disconnect(this.filter) + this.filter.disconnect(this.context.destination) + } else { + this.gain.disconnect(this.context.destination) + } + + this.filter = value + this.gain.connect(this.filter) + this.filter.connect(this.context.destination) + }, + + getMasterVolume: function () { + return this.gain.gain.value + }, + + setMasterVolume: function (value) { + this.gain.gain.value = value + }, + + updateMatrixWorld: (function () { + var position = new Vector3() + var quaternion = new Quaternion() + var scale = new Vector3() + + var orientation = new Vector3() + + return function updateMatrixWorld(force) { + Object3D.prototype.updateMatrixWorld.call(this, force) + + var listener = this.context.listener + var up = this.up + + this.matrixWorld.decompose(position, quaternion, scale) + + orientation.set(0, 0, -1).applyQuaternion(quaternion) + + if (listener.positionX) { + listener.positionX.setValueAtTime(position.x, this.context.currentTime) + listener.positionY.setValueAtTime(position.y, this.context.currentTime) + listener.positionZ.setValueAtTime(position.z, this.context.currentTime) + listener.forwardX.setValueAtTime(orientation.x, this.context.currentTime) + listener.forwardY.setValueAtTime(orientation.y, this.context.currentTime) + listener.forwardZ.setValueAtTime(orientation.z, this.context.currentTime) + listener.upX.setValueAtTime(up.x, this.context.currentTime) + listener.upY.setValueAtTime(up.y, this.context.currentTime) + listener.upZ.setValueAtTime(up.z, this.context.currentTime) + } else { + listener.setPosition(position.x, position.y, position.z) + listener.setOrientation(orientation.x, orientation.y, orientation.z, up.x, up.y, up.z) + } + } + })() + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio(listener) { + Object3D.call(this) + + this.type = 'Audio' + + this.context = listener.context + + this.gain = this.context.createGain() + this.gain.connect(listener.getInput()) + + this.autoplay = false + + this.buffer = null + this.loop = false + this.startTime = 0 + this.offset = 0 + this.playbackRate = 1 + this.isPlaying = false + this.hasPlaybackControl = true + this.sourceType = 'empty' + + this.filters = [] + } + + Audio.prototype = Object.assign(Object.create(Object3D.prototype), { + constructor: Audio, + + getOutput: function () { + return this.gain + }, + + setNodeSource: function (audioNode) { + this.hasPlaybackControl = false + this.sourceType = 'audioNode' + this.source = audioNode + this.connect() + + return this + }, + + setBuffer: function (audioBuffer) { + this.buffer = audioBuffer + this.sourceType = 'buffer' + + if (this.autoplay) this.play() + + return this + }, + + play: function () { + if (this.isPlaying === true) { + console.warn('THREE.Audio: Audio is already playing.') + return + } + + if (this.hasPlaybackControl === false) { + console.warn('THREE.Audio: this Audio has no playback control.') + return + } + + var source = this.context.createBufferSource() + + source.buffer = this.buffer + source.loop = this.loop + source.onended = this.onEnded.bind(this) + source.playbackRate.setValueAtTime(this.playbackRate, this.startTime) + this.startTime = this.context.currentTime + source.start(this.startTime, this.offset) + + this.isPlaying = true + + this.source = source + + return this.connect() + }, + + pause: function () { + if (this.hasPlaybackControl === false) { + console.warn('THREE.Audio: this Audio has no playback control.') + return + } + + if (this.isPlaying === true) { + this.source.stop() + this.offset += (this.context.currentTime - this.startTime) * this.playbackRate + this.isPlaying = false + } + + return this + }, + + stop: function () { + if (this.hasPlaybackControl === false) { + console.warn('THREE.Audio: this Audio has no playback control.') + return + } + + this.source.stop() + this.offset = 0 + this.isPlaying = false + + return this + }, + + connect: function () { + if (this.filters.length > 0) { + this.source.connect(this.filters[0]) + + for (var i = 1, l = this.filters.length; i < l; i++) { + this.filters[i - 1].connect(this.filters[i]) + } + + this.filters[this.filters.length - 1].connect(this.getOutput()) + } else { + this.source.connect(this.getOutput()) + } + + return this + }, + + disconnect: function () { + if (this.filters.length > 0) { + this.source.disconnect(this.filters[0]) + + for (var i = 1, l = this.filters.length; i < l; i++) { + this.filters[i - 1].disconnect(this.filters[i]) + } + + this.filters[this.filters.length - 1].disconnect(this.getOutput()) + } else { + this.source.disconnect(this.getOutput()) + } + + return this + }, + + getFilters: function () { + return this.filters + }, + + setFilters: function (value) { + if (!value) value = [] + + if (this.isPlaying === true) { + this.disconnect() + this.filters = value + this.connect() + } else { + this.filters = value + } + + return this + }, + + getFilter: function () { + return this.getFilters()[0] + }, + + setFilter: function (filter) { + return this.setFilters(filter ? [filter] : []) + }, + + setPlaybackRate: function (value) { + if (this.hasPlaybackControl === false) { + console.warn('THREE.Audio: this Audio has no playback control.') + return + } + + this.playbackRate = value + + if (this.isPlaying === true) { + this.source.playbackRate.setValueAtTime(this.playbackRate, this.context.currentTime) + } + + return this + }, + + getPlaybackRate: function () { + return this.playbackRate + }, + + onEnded: function () { + this.isPlaying = false + }, + + getLoop: function () { + if (this.hasPlaybackControl === false) { + console.warn('THREE.Audio: this Audio has no playback control.') + return false + } + + return this.loop + }, + + setLoop: function (value) { + if (this.hasPlaybackControl === false) { + console.warn('THREE.Audio: this Audio has no playback control.') + return + } + + this.loop = value + + if (this.isPlaying === true) { + this.source.loop = this.loop + } + + return this + }, + + getVolume: function () { + return this.gain.gain.value + }, + + setVolume: function (value) { + this.gain.gain.value = value + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio(listener) { + Audio.call(this, listener) + + this.panner = this.context.createPanner() + this.panner.connect(this.gain) + } + + PositionalAudio.prototype = Object.assign(Object.create(Audio.prototype), { + constructor: PositionalAudio, + + getOutput: function () { + return this.panner + }, + + getRefDistance: function () { + return this.panner.refDistance + }, + + setRefDistance: function (value) { + this.panner.refDistance = value + }, + + getRolloffFactor: function () { + return this.panner.rolloffFactor + }, + + setRolloffFactor: function (value) { + this.panner.rolloffFactor = value + }, + + getDistanceModel: function () { + return this.panner.distanceModel + }, + + setDistanceModel: function (value) { + this.panner.distanceModel = value + }, + + getMaxDistance: function () { + return this.panner.maxDistance + }, + + setMaxDistance: function (value) { + this.panner.maxDistance = value + }, + + updateMatrixWorld: (function () { + var position = new Vector3() + + return function updateMatrixWorld(force) { + Object3D.prototype.updateMatrixWorld.call(this, force) + + position.setFromMatrixPosition(this.matrixWorld) + + this.panner.setPosition(position.x, position.y, position.z) + } + })() + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser(audio, fftSize) { + this.analyser = audio.context.createAnalyser() + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048 + + this.data = new Uint8Array(this.analyser.frequencyBinCount) + + audio.getOutput().connect(this.analyser) + } + + Object.assign(AudioAnalyser.prototype, { + getFrequencyData: function () { + this.analyser.getByteFrequencyData(this.data) + + return this.data + }, + + getAverageFrequency: function () { + var value = 0, + data = this.getFrequencyData() + + for (var i = 0; i < data.length; i++) { + value += data[i] + } + + return value / data.length + } + }) + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer(binding, typeName, valueSize) { + this.binding = binding + this.valueSize = valueSize + + var bufferType = Float64Array, + mixFunction + + switch (typeName) { + case 'quaternion': + mixFunction = this._slerp + break + + case 'string': + case 'bool': + bufferType = Array + mixFunction = this._select + break + + default: + mixFunction = this._lerp + } + + this.buffer = new bufferType(valueSize * 4) + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction + + this.cumulativeWeight = 0 + + this.useCount = 0 + this.referenceCount = 0 + } + + Object.assign(PropertyMixer.prototype, { + // accumulate data in the 'incoming' region into 'accu<i>' + accumulate: function (accuIndex, weight) { + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + currentWeight = this.cumulativeWeight + + if (currentWeight === 0) { + // accuN := incoming * weight + + for (var i = 0; i !== stride; ++i) { + buffer[offset + i] = buffer[i] + } + + currentWeight = weight + } else { + // accuN := accuN + incoming * weight + + currentWeight += weight + var mix = weight / currentWeight + this._mixBufferRegion(buffer, offset, 0, mix, stride) + } + + this.cumulativeWeight = currentWeight + }, + + // apply the state of 'accu<i>' to the binding when accus differ + apply: function (accuIndex) { + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + weight = this.cumulativeWeight, + binding = this.binding + + this.cumulativeWeight = 0 + + if (weight < 1) { + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3 + + this._mixBufferRegion(buffer, offset, originalValueOffset, 1 - weight, stride) + } + + for (var i = stride, e = stride + stride; i !== e; ++i) { + if (buffer[i] !== buffer[i + stride]) { + // value has changed -> update scene graph + + binding.setValue(buffer, offset) + break + } + } + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function () { + var binding = this.binding + + var buffer = this.buffer, + stride = this.valueSize, + originalValueOffset = stride * 3 + + binding.getValue(buffer, originalValueOffset) + + // accu[0..1] := orig -- initially detect changes against the original + for (var i = stride, e = originalValueOffset; i !== e; ++i) { + buffer[i] = buffer[originalValueOffset + (i % stride)] + } + + this.cumulativeWeight = 0 + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function () { + var originalValueOffset = this.valueSize * 3 + this.binding.setValue(this.buffer, originalValueOffset) + }, + + // mix functions + + _select: function (buffer, dstOffset, srcOffset, t, stride) { + if (t >= 0.5) { + for (var i = 0; i !== stride; ++i) { + buffer[dstOffset + i] = buffer[srcOffset + i] + } + } + }, + + _slerp: function (buffer, dstOffset, srcOffset, t) { + Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t) + }, + + _lerp: function (buffer, dstOffset, srcOffset, t, stride) { + var s = 1 - t + + for (var i = 0; i !== stride; ++i) { + var j = dstOffset + i + + buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t + } + } + }) + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + // Characters [].:/ are reserved for track binding syntax. + var RESERVED_CHARS_RE = '\\[\\]\\.:\\/' + + function Composite(targetGroup, path, optionalParsedPath) { + var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName(path) + + this._targetGroup = targetGroup + this._bindings = targetGroup.subscribe_(path, parsedPath) + } + + Object.assign(Composite.prototype, { + getValue: function (array, offset) { + this.bind() // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[firstValidIndex] + + // and only call .getValue on the first + if (binding !== undefined) binding.getValue(array, offset) + }, + + setValue: function (array, offset) { + var bindings = this._bindings + + for (var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].setValue(array, offset) + } + }, + + bind: function () { + var bindings = this._bindings + + for (var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].bind() + } + }, + + unbind: function () { + var bindings = this._bindings + + for (var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].unbind() + } + } + }) + + function PropertyBinding(rootNode, path, parsedPath) { + this.path = path + this.parsedPath = parsedPath || PropertyBinding.parseTrackName(path) + + this.node = PropertyBinding.findNode(rootNode, this.parsedPath.nodeName) || rootNode + + this.rootNode = rootNode + } + + Object.assign(PropertyBinding, { + Composite: Composite, + + create: function (root, path, parsedPath) { + if (!(root && root.isAnimationObjectGroup)) { + return new PropertyBinding(root, path, parsedPath) + } else { + return new PropertyBinding.Composite(root, path, parsedPath) + } + }, + + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name Node name to be sanitized. + * @return {string} + */ + sanitizeNodeName: (function () { + var reservedRe = new RegExp('[' + RESERVED_CHARS_RE + ']', 'g') + + return function sanitizeNodeName(name) { + return name.replace(/\s/g, '_').replace(reservedRe, '') + } + })(), + + parseTrackName: (function () { + // Attempts to allow node names from any language. ES5's `\w` regexp matches + // only latin characters, and the unicode \p{L} is not yet supported. So + // instead, we exclude reserved characters and match everything else. + var wordChar = '[^' + RESERVED_CHARS_RE + ']' + var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace('\\.', '') + ']' + + // Parent directories, delimited by '/' or ':'. Currently unused, but must + // be matched to parse the rest of the track name. + var directoryRe = /((?:WC+[\/:])*)/.source.replace('WC', wordChar) + + // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. + var nodeRe = /(WCOD+)?/.source.replace('WCOD', wordCharOrDot) + + // Object on target node, and accessor. May not contain reserved + // characters. Accessor may contain any character except closing bracket. + var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace('WC', wordChar) + + // Property and accessor. May not contain reserved characters. Accessor may + // contain any non-bracket characters. + var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace('WC', wordChar) + + var trackRe = new RegExp('' + '^' + directoryRe + nodeRe + objectRe + propertyRe + '$') + + var supportedObjectNames = ['material', 'materials', 'bones'] + + return function parseTrackName(trackName) { + var matches = trackRe.exec(trackName) + + if (!matches) { + throw new Error('PropertyBinding: Cannot parse trackName: ' + trackName) + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[2], + objectName: matches[3], + objectIndex: matches[4], + propertyName: matches[5], // required + propertyIndex: matches[6] + } + + var lastDot = results.nodeName && results.nodeName.lastIndexOf('.') + + if (lastDot !== undefined && lastDot !== -1) { + var objectName = results.nodeName.substring(lastDot + 1) + + // Object names must be checked against a whitelist. Otherwise, there + // is no way to parse 'foo.bar.baz': 'baz' must be a property, but + // 'bar' could be the objectName, or part of a nodeName (which can + // include '.' characters). + if (supportedObjectNames.indexOf(objectName) !== -1) { + results.nodeName = results.nodeName.substring(0, lastDot) + results.objectName = objectName + } + } + + if (results.propertyName === null || results.propertyName.length === 0) { + throw new Error( + 'PropertyBinding: can not parse propertyName from trackName: ' + trackName + ) + } + + return results + } + })(), + + findNode: function (root, nodeName) { + if ( + !nodeName || + nodeName === '' || + nodeName === 'root' || + nodeName === '.' || + nodeName === -1 || + nodeName === root.name || + nodeName === root.uuid + ) { + return root + } + + // search into skeleton bones. + if (root.skeleton) { + var bone = root.skeleton.getBoneByName(nodeName) + + if (bone !== undefined) { + return bone + } + } + + // search into node subtree. + if (root.children) { + var searchNodeSubtree = function (children) { + for (var i = 0; i < children.length; i++) { + var childNode = children[i] + + if (childNode.name === nodeName || childNode.uuid === nodeName) { + return childNode + } + + var result = searchNodeSubtree(childNode.children) + + if (result) return result + } + + return null + } + + var subTreeNode = searchNodeSubtree(root.children) + + if (subTreeNode) { + return subTreeNode + } + } + + return null + } + }) + + Object.assign(PropertyBinding.prototype, { + // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function () {}, + _setValue_unavailable: function () {}, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + function getValue_direct(buffer, offset) { + buffer[offset] = this.node[this.propertyName] + }, + + function getValue_array(buffer, offset) { + var source = this.resolvedProperty + + for (var i = 0, n = source.length; i !== n; ++i) { + buffer[offset++] = source[i] + } + }, + + function getValue_arrayElement(buffer, offset) { + buffer[offset] = this.resolvedProperty[this.propertyIndex] + }, + + function getValue_toArray(buffer, offset) { + this.resolvedProperty.toArray(buffer, offset) + } + ], + + SetterByBindingTypeAndVersioning: [ + [ + // Direct + + function setValue_direct(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset] + }, + + function setValue_direct_setNeedsUpdate(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset] + this.targetObject.needsUpdate = true + }, + + function setValue_direct_setMatrixWorldNeedsUpdate(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset] + this.targetObject.matrixWorldNeedsUpdate = true + } + ], + [ + // EntireArray + + function setValue_array(buffer, offset) { + var dest = this.resolvedProperty + + for (var i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++] + } + }, + + function setValue_array_setNeedsUpdate(buffer, offset) { + var dest = this.resolvedProperty + + for (var i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++] + } + + this.targetObject.needsUpdate = true + }, + + function setValue_array_setMatrixWorldNeedsUpdate(buffer, offset) { + var dest = this.resolvedProperty + + for (var i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++] + } + + this.targetObject.matrixWorldNeedsUpdate = true + } + ], + [ + // ArrayElement + + function setValue_arrayElement(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset] + }, + + function setValue_arrayElement_setNeedsUpdate(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset] + this.targetObject.needsUpdate = true + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset] + this.targetObject.matrixWorldNeedsUpdate = true + } + ], + [ + // HasToFromArray + + function setValue_fromArray(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset) + }, + + function setValue_fromArray_setNeedsUpdate(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset) + this.targetObject.needsUpdate = true + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset) + this.targetObject.matrixWorldNeedsUpdate = true + } + ] + ], + + getValue: function getValue_unbound(targetArray, offset) { + this.bind() + this.getValue(targetArray, offset) + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + }, + + setValue: function getValue_unbound(sourceArray, offset) { + this.bind() + this.setValue(sourceArray, offset) + }, + + // create getter / setter pair for a property in the scene graph + bind: function () { + var targetObject = this.node, + parsedPath = this.parsedPath, + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex + + if (!targetObject) { + targetObject = PropertyBinding.findNode(this.rootNode, parsedPath.nodeName) || this.rootNode + + this.node = targetObject + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable + this.setValue = this._setValue_unavailable + + // ensure there is a value node + if (!targetObject) { + console.error( + 'THREE.PropertyBinding: Trying to update node for track: ' + + this.path + + " but it wasn't found." + ) + return + } + + if (objectName) { + var objectIndex = parsedPath.objectIndex + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch (objectName) { + case 'materials': + if (!targetObject.material) { + console.error( + 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', + this + ) + return + } + + if (!targetObject.material.materials) { + console.error( + 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', + this + ) + return + } + + targetObject = targetObject.material.materials + + break + + case 'bones': + if (!targetObject.skeleton) { + console.error( + 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', + this + ) + return + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones + + // support resolving morphTarget names into indices. + for (var i = 0; i < targetObject.length; i++) { + if (targetObject[i].name === objectIndex) { + objectIndex = i + break + } + } + + break + + default: + if (targetObject[objectName] === undefined) { + console.error( + 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', + this + ) + return + } + + targetObject = targetObject[objectName] + } + + if (objectIndex !== undefined) { + if (targetObject[objectIndex] === undefined) { + console.error( + 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', + this, + targetObject + ) + return + } + + targetObject = targetObject[objectIndex] + } + } + + // resolve property + var nodeProperty = targetObject[propertyName] + + if (nodeProperty === undefined) { + var nodeName = parsedPath.nodeName + + console.error( + 'THREE.PropertyBinding: Trying to update property for track: ' + + nodeName + + '.' + + propertyName + + " but it wasn't found.", + targetObject + ) + return + } + + // determine versioning scheme + var versioning = this.Versioning.None + + if (targetObject.needsUpdate !== undefined) { + // material + + versioning = this.Versioning.NeedsUpdate + this.targetObject = targetObject + } else if (targetObject.matrixWorldNeedsUpdate !== undefined) { + // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate + this.targetObject = targetObject + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct + + if (propertyIndex !== undefined) { + // access a sub element of the property array (only primitives are supported right now) + + if (propertyName === 'morphTargetInfluences') { + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if (!targetObject.geometry) { + console.error( + 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', + this + ) + return + } + + if (targetObject.geometry.isBufferGeometry) { + if (!targetObject.geometry.morphAttributes) { + console.error( + 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', + this + ) + return + } + + for (var i = 0; i < this.node.geometry.morphAttributes.position.length; i++) { + if (targetObject.geometry.morphAttributes.position[i].name === propertyIndex) { + propertyIndex = i + break + } + } + } else { + if (!targetObject.geometry.morphTargets) { + console.error( + 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', + this + ) + return + } + + for (var i = 0; i < this.node.geometry.morphTargets.length; i++) { + if (targetObject.geometry.morphTargets[i].name === propertyIndex) { + propertyIndex = i + break + } + } + } + } + + bindingType = this.BindingType.ArrayElement + + this.resolvedProperty = nodeProperty + this.propertyIndex = propertyIndex + } else if (nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined) { + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray + + this.resolvedProperty = nodeProperty + } else if (Array.isArray(nodeProperty)) { + bindingType = this.BindingType.EntireArray + + this.resolvedProperty = nodeProperty + } else { + this.propertyName = propertyName + } + + // select getter / setter + this.getValue = this.GetterByBindingType[bindingType] + this.setValue = this.SetterByBindingTypeAndVersioning[bindingType][versioning] + }, + + unbind: function () { + this.node = null + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound + this.setValue = this._setValue_unbound + } + }) + + //!\ DECLARE ALIAS AFTER assign prototype ! + Object.assign(PropertyBinding.prototype, { + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue + }) + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup() { + this.uuid = _Math.generateUUID() + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call(arguments) + + this.nCachedObjects_ = 0 // threshold + // note: read by PropertyBinding.Composite + + var indices = {} + this._indicesByUUID = indices // for bookkeeping + + for (var i = 0, n = arguments.length; i !== n; ++i) { + indices[arguments[i].uuid] = i + } + + this._paths = [] // inside: string + this._parsedPaths = [] // inside: { we don't care, here } + this._bindings = [] // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {} // inside: indices in these arrays + + var scope = this + + this.stats = { + objects: { + get total() { + return scope._objects.length + }, + get inUse() { + return this.total - scope.nCachedObjects_ + } + }, + get bindingsPerObject() { + return scope._bindings.length + } + } + } + + Object.assign(AnimationObjectGroup.prototype, { + isAnimationObjectGroup: true, + + add: function () { + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length, + knownObject = undefined + + for (var i = 0, n = arguments.length; i !== n; ++i) { + var object = arguments[i], + uuid = object.uuid, + index = indicesByUUID[uuid] + + if (index === undefined) { + // unknown object -> add it to the ACTIVE region + + index = nObjects++ + indicesByUUID[uuid] = index + objects.push(object) + + // accounting is done, now do the same for all bindings + + for (var j = 0, m = nBindings; j !== m; ++j) { + bindings[j].push(new PropertyBinding(object, paths[j], parsedPaths[j])) + } + } else if (index < nCachedObjects) { + knownObject = objects[index] + + // move existing object to the ACTIVE region + + var firstActiveIndex = --nCachedObjects, + lastCachedObject = objects[firstActiveIndex] + + indicesByUUID[lastCachedObject.uuid] = index + objects[index] = lastCachedObject + + indicesByUUID[uuid] = firstActiveIndex + objects[firstActiveIndex] = object + + // accounting is done, now do the same for all bindings + + for (var j = 0, m = nBindings; j !== m; ++j) { + var bindingsForPath = bindings[j], + lastCached = bindingsForPath[firstActiveIndex], + binding = bindingsForPath[index] + + bindingsForPath[index] = lastCached + + if (binding === undefined) { + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding(object, paths[j], parsedPaths[j]) + } + + bindingsForPath[firstActiveIndex] = binding + } + } else if (objects[index] !== knownObject) { + console.error( + 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' + ) + } // else the object is already where we want it to be + } // for arguments + + this.nCachedObjects_ = nCachedObjects + }, + + remove: function () { + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length + + for (var i = 0, n = arguments.length; i !== n; ++i) { + var object = arguments[i], + uuid = object.uuid, + index = indicesByUUID[uuid] + + if (index !== undefined && index >= nCachedObjects) { + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects++, + firstActiveObject = objects[lastCachedIndex] + + indicesByUUID[firstActiveObject.uuid] = index + objects[index] = firstActiveObject + + indicesByUUID[uuid] = lastCachedIndex + objects[lastCachedIndex] = object + + // accounting is done, now do the same for all bindings + + for (var j = 0, m = nBindings; j !== m; ++j) { + var bindingsForPath = bindings[j], + firstActive = bindingsForPath[lastCachedIndex], + binding = bindingsForPath[index] + + bindingsForPath[index] = firstActive + bindingsForPath[lastCachedIndex] = binding + } + } + } // for arguments + + this.nCachedObjects_ = nCachedObjects + }, + + // remove & forget + uncache: function () { + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length + + for (var i = 0, n = arguments.length; i !== n; ++i) { + var object = arguments[i], + uuid = object.uuid, + index = indicesByUUID[uuid] + + if (index !== undefined) { + delete indicesByUUID[uuid] + + if (index < nCachedObjects) { + // object is cached, shrink the CACHED region + + var firstActiveIndex = --nCachedObjects, + lastCachedObject = objects[firstActiveIndex], + lastIndex = --nObjects, + lastObject = objects[lastIndex] + + // last cached object takes this object's place + indicesByUUID[lastCachedObject.uuid] = index + objects[index] = lastCachedObject + + // last object goes to the activated slot and pop + indicesByUUID[lastObject.uuid] = firstActiveIndex + objects[firstActiveIndex] = lastObject + objects.pop() + + // accounting is done, now do the same for all bindings + + for (var j = 0, m = nBindings; j !== m; ++j) { + var bindingsForPath = bindings[j], + lastCached = bindingsForPath[firstActiveIndex], + last = bindingsForPath[lastIndex] + + bindingsForPath[index] = lastCached + bindingsForPath[firstActiveIndex] = last + bindingsForPath.pop() + } + } else { + // object is active, just swap with the last and pop + + var lastIndex = --nObjects, + lastObject = objects[lastIndex] + + indicesByUUID[lastObject.uuid] = index + objects[index] = lastObject + objects.pop() + + // accounting is done, now do the same for all bindings + + for (var j = 0, m = nBindings; j !== m; ++j) { + var bindingsForPath = bindings[j] + + bindingsForPath[index] = bindingsForPath[lastIndex] + bindingsForPath.pop() + } + } // cached or active + } // if object is known + } // for arguments + + this.nCachedObjects_ = nCachedObjects + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function (path, parsedPath) { + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[path], + bindings = this._bindings + + if (index !== undefined) return bindings[index] + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array(nObjects) + + index = bindings.length + + indicesByPath[path] = index + + paths.push(path) + parsedPaths.push(parsedPath) + bindings.push(bindingsForPath) + + for (var i = nCachedObjects, n = objects.length; i !== n; ++i) { + var object = objects[i] + bindingsForPath[i] = new PropertyBinding(object, path, parsedPath) + } + + return bindingsForPath + }, + + unsubscribe_: function (path) { + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[path] + + if (index !== undefined) { + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[lastBindingsIndex], + lastBindingsPath = path[lastBindingsIndex] + + indicesByPath[lastBindingsPath] = index + + bindings[index] = lastBindings + bindings.pop() + + parsedPaths[index] = parsedPaths[lastBindingsIndex] + parsedPaths.pop() + + paths[index] = paths[lastBindingsIndex] + paths.pop() + } + } + }) + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction(mixer, clip, localRoot) { + this._mixer = mixer + this._clip = clip + this._localRoot = localRoot || null + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array(nTracks) + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + } + + for (var i = 0; i !== nTracks; ++i) { + var interpolant = tracks[i].createInterpolant(null) + interpolants[i] = interpolant + interpolant.settings = interpolantSettings + } + + this._interpolantSettings = interpolantSettings + + this._interpolants = interpolants // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array(nTracks) + + this._cacheIndex = null // for the memory manager + this._byClipCacheIndex = null // for the memory manager + + this._timeScaleInterpolant = null + this._weightInterpolant = null + + this.loop = LoopRepeat + this._loopCount = -1 + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0 + + this.timeScale = 1 + this._effectiveTimeScale = 1 + + this.weight = 1 + this._effectiveWeight = 1 + + this.repetitions = Infinity // no. of repetitions when looping + + this.paused = false // true -> zero effective time scale + this.enabled = true // false -> zero effective weight + + this.clampWhenFinished = false // keep feeding the last frame? + + this.zeroSlopeAtStart = true // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true // clips for start, loop and end + } + + Object.assign(AnimationAction.prototype, { + // State & Scheduling + + play: function () { + this._mixer._activateAction(this) + + return this + }, + + stop: function () { + this._mixer._deactivateAction(this) + + return this.reset() + }, + + reset: function () { + this.paused = false + this.enabled = true + + this.time = 0 // restart clip + this._loopCount = -1 // forget previous loops + this._startTime = null // forget scheduling + + return this.stopFading().stopWarping() + }, + + isRunning: function () { + return ( + this.enabled && + !this.paused && + this.timeScale !== 0 && + this._startTime === null && + this._mixer._isActiveAction(this) + ) + }, + + // return true when play has been called + isScheduled: function () { + return this._mixer._isActiveAction(this) + }, + + startAt: function (time) { + this._startTime = time + + return this + }, + + setLoop: function (mode, repetitions) { + this.loop = mode + this.repetitions = repetitions + + return this + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function (weight) { + this.weight = weight + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0 + + return this.stopFading() + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function () { + return this._effectiveWeight + }, + + fadeIn: function (duration) { + return this._scheduleFading(duration, 0, 1) + }, + + fadeOut: function (duration) { + return this._scheduleFading(duration, 1, 0) + }, + + crossFadeFrom: function (fadeOutAction, duration, warp) { + fadeOutAction.fadeOut(duration) + this.fadeIn(duration) + + if (warp) { + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration + + fadeOutAction.warp(1.0, startEndRatio, duration) + this.warp(endStartRatio, 1.0, duration) + } + + return this + }, + + crossFadeTo: function (fadeInAction, duration, warp) { + return fadeInAction.crossFadeFrom(this, duration, warp) + }, + + stopFading: function () { + var weightInterpolant = this._weightInterpolant + + if (weightInterpolant !== null) { + this._weightInterpolant = null + this._mixer._takeBackControlInterpolant(weightInterpolant) + } + + return this + }, + + // Time Scale Control + + // set the time scale stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function (timeScale) { + this.timeScale = timeScale + this._effectiveTimeScale = this.paused ? 0 : timeScale + + return this.stopWarping() + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function () { + return this._effectiveTimeScale + }, + + setDuration: function (duration) { + this.timeScale = this._clip.duration / duration + + return this.stopWarping() + }, + + syncWith: function (action) { + this.time = action.time + this.timeScale = action.timeScale + + return this.stopWarping() + }, + + halt: function (duration) { + return this.warp(this._effectiveTimeScale, 0, duration) + }, + + warp: function (startTimeScale, endTimeScale, duration) { + var mixer = this._mixer, + now = mixer.time, + interpolant = this._timeScaleInterpolant, + timeScale = this.timeScale + + if (interpolant === null) { + interpolant = mixer._lendControlInterpolant() + this._timeScaleInterpolant = interpolant + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues + + times[0] = now + times[1] = now + duration + + values[0] = startTimeScale / timeScale + values[1] = endTimeScale / timeScale + + return this + }, + + stopWarping: function () { + var timeScaleInterpolant = this._timeScaleInterpolant + + if (timeScaleInterpolant !== null) { + this._timeScaleInterpolant = null + this._mixer._takeBackControlInterpolant(timeScaleInterpolant) + } + + return this + }, + + // Object Accessors + + getMixer: function () { + return this._mixer + }, + + getClip: function () { + return this._clip + }, + + getRoot: function () { + return this._localRoot || this._mixer._root + }, + + // Interna + + _update: function (time, deltaTime, timeDirection, accuIndex) { + // called by the mixer + + if (!this.enabled) { + // call ._updateWeight() to update ._effectiveWeight + + this._updateWeight(time) + return + } + + var startTime = this._startTime + + if (startTime !== null) { + // check for scheduled start of action + + var timeRunning = (time - startTime) * timeDirection + if (timeRunning < 0 || timeDirection === 0) { + return // yet to come / don't decide when delta = 0 + } + + // start + + this._startTime = null // unschedule + deltaTime = timeDirection * timeRunning + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale(time) + var clipTime = this._updateTime(deltaTime) + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight(time) + + if (weight > 0) { + var interpolants = this._interpolants + var propertyMixers = this._propertyBindings + + for (var j = 0, m = interpolants.length; j !== m; ++j) { + interpolants[j].evaluate(clipTime) + propertyMixers[j].accumulate(accuIndex, weight) + } + } + }, + + _updateWeight: function (time) { + var weight = 0 + + if (this.enabled) { + weight = this.weight + var interpolant = this._weightInterpolant + + if (interpolant !== null) { + var interpolantValue = interpolant.evaluate(time)[0] + + weight *= interpolantValue + + if (time > interpolant.parameterPositions[1]) { + this.stopFading() + + if (interpolantValue === 0) { + // faded out, disable + this.enabled = false + } + } + } + } + + this._effectiveWeight = weight + return weight + }, + + _updateTimeScale: function (time) { + var timeScale = 0 + + if (!this.paused) { + timeScale = this.timeScale + + var interpolant = this._timeScaleInterpolant + + if (interpolant !== null) { + var interpolantValue = interpolant.evaluate(time)[0] + + timeScale *= interpolantValue + + if (time > interpolant.parameterPositions[1]) { + this.stopWarping() + + if (timeScale === 0) { + // motion has halted, pause + this.paused = true + } else { + // warp done - apply final time scale + this.timeScale = timeScale + } + } + } + } + + this._effectiveTimeScale = timeScale + return timeScale + }, + + _updateTime: function (deltaTime) { + var time = this.time + deltaTime + + if (deltaTime === 0) return time + + var duration = this._clip.duration, + loop = this.loop, + loopCount = this._loopCount + + if (loop === LoopOnce) { + if (loopCount === -1) { + // just started + + this._loopCount = 0 + this._setEndings(true, true, false) + } + + handle_stop: { + if (time >= duration) { + time = duration + } else if (time < 0) { + time = 0 + } else break handle_stop + + if (this.clampWhenFinished) this.paused = true + else this.enabled = false + + this._mixer.dispatchEvent({ + type: 'finished', + action: this, + direction: deltaTime < 0 ? -1 : 1 + }) + } + } else { + // repetitive Repeat or PingPong + + var pingPong = loop === LoopPingPong + + if (loopCount === -1) { + // just started + + if (deltaTime >= 0) { + loopCount = 0 + + this._setEndings(true, this.repetitions === 0, pingPong) + } else { + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings(this.repetitions === 0, true, pingPong) + } + } + + if (time >= duration || time < 0) { + // wrap around + + var loopDelta = Math.floor(time / duration) // signed + time -= duration * loopDelta + + loopCount += Math.abs(loopDelta) + + var pending = this.repetitions - loopCount + + if (pending < 0) { + // have to stop (switch state, clamp time, fire event) + + if (this.clampWhenFinished) this.paused = true + else this.enabled = false + + time = deltaTime > 0 ? duration : 0 + + this._mixer.dispatchEvent({ + type: 'finished', + action: this, + direction: deltaTime > 0 ? 1 : -1 + }) + } else { + // keep running + + if (pending === 0) { + // entering the last round + + var atStart = deltaTime < 0 + this._setEndings(atStart, !atStart, pingPong) + } else { + this._setEndings(false, false, pingPong) + } + + this._loopCount = loopCount + + this._mixer.dispatchEvent({ + type: 'loop', + action: this, + loopDelta: loopDelta + }) + } + } + + if (pingPong && (loopCount & 1) === 1) { + // invert time for the "pong round" + + this.time = time + return duration - time + } + } + + this.time = time + return time + }, + + _setEndings: function (atStart, atEnd, pingPong) { + var settings = this._interpolantSettings + + if (pingPong) { + settings.endingStart = ZeroSlopeEnding + settings.endingEnd = ZeroSlopeEnding + } else { + // assuming for LoopOnce atStart == atEnd == true + + if (atStart) { + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding + } else { + settings.endingStart = WrapAroundEnding + } + + if (atEnd) { + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding + } else { + settings.endingEnd = WrapAroundEnding + } + } + }, + + _scheduleFading: function (duration, weightNow, weightThen) { + var mixer = this._mixer, + now = mixer.time, + interpolant = this._weightInterpolant + + if (interpolant === null) { + interpolant = mixer._lendControlInterpolant() + this._weightInterpolant = interpolant + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues + + times[0] = now + values[0] = weightNow + times[1] = now + duration + values[1] = weightThen + + return this + } + }) + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer(root) { + this._root = root + this._initMemoryManager() + this._accuIndex = 0 + + this.time = 0 + + this.timeScale = 1.0 + } + + AnimationMixer.prototype = Object.assign(Object.create(EventDispatcher.prototype), { + constructor: AnimationMixer, + + _bindAction: function (action, prototypeAction) { + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[rootUuid] + + if (bindingsByName === undefined) { + bindingsByName = {} + bindingsByRoot[rootUuid] = bindingsByName + } + + for (var i = 0; i !== nTracks; ++i) { + var track = tracks[i], + trackName = track.name, + binding = bindingsByName[trackName] + + if (binding !== undefined) { + bindings[i] = binding + } else { + binding = bindings[i] + + if (binding !== undefined) { + // existing binding, make sure the cache knows + + if (binding._cacheIndex === null) { + ++binding.referenceCount + this._addInactiveBinding(binding, rootUuid, trackName) + } + + continue + } + + var path = prototypeAction && prototypeAction._propertyBindings[i].binding.parsedPath + + binding = new PropertyMixer( + PropertyBinding.create(root, trackName, path), + track.ValueTypeName, + track.getValueSize() + ) + + ++binding.referenceCount + this._addInactiveBinding(binding, rootUuid, trackName) + + bindings[i] = binding + } + + interpolants[i].resultBuffer = binding.buffer + } + }, + + _activateAction: function (action) { + if (!this._isActiveAction(action)) { + if (action._cacheIndex === null) { + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = (action._localRoot || this._root).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[clipUuid] + + this._bindAction(action, actionsForClip && actionsForClip.knownActions[0]) + + this._addInactiveAction(action, clipUuid, rootUuid) + } + + var bindings = action._propertyBindings + + // increment reference counts / sort out state + for (var i = 0, n = bindings.length; i !== n; ++i) { + var binding = bindings[i] + + if (binding.useCount++ === 0) { + this._lendBinding(binding) + binding.saveOriginalState() + } + } + + this._lendAction(action) + } + }, + + _deactivateAction: function (action) { + if (this._isActiveAction(action)) { + var bindings = action._propertyBindings + + // decrement reference counts / sort out state + for (var i = 0, n = bindings.length; i !== n; ++i) { + var binding = bindings[i] + + if (--binding.useCount === 0) { + binding.restoreOriginalState() + this._takeBackBinding(binding) + } + } + + this._takeBackAction(action) + } + }, + + // Memory manager + + _initMemoryManager: function () { + this._actions = [] // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0 + + this._actionsByClip = {} + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + this._bindings = [] // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0 + + this._bindingsByRootAndName = {} // inside: Map< name, PropertyMixer > + + this._controlInterpolants = [] // same game as above + this._nActiveControlInterpolants = 0 + + var scope = this + + this.stats = { + actions: { + get total() { + return scope._actions.length + }, + get inUse() { + return scope._nActiveActions + } + }, + bindings: { + get total() { + return scope._bindings.length + }, + get inUse() { + return scope._nActiveBindings + } + }, + controlInterpolants: { + get total() { + return scope._controlInterpolants.length + }, + get inUse() { + return scope._nActiveControlInterpolants + } + } + } + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function (action) { + var index = action._cacheIndex + return index !== null && index < this._nActiveActions + }, + + _addInactiveAction: function (action, clipUuid, rootUuid) { + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[clipUuid] + + if (actionsForClip === undefined) { + actionsForClip = { + knownActions: [action], + actionByRoot: {} + } + + action._byClipCacheIndex = 0 + + actionsByClip[clipUuid] = actionsForClip + } else { + var knownActions = actionsForClip.knownActions + + action._byClipCacheIndex = knownActions.length + knownActions.push(action) + } + + action._cacheIndex = actions.length + actions.push(action) + + actionsForClip.actionByRoot[rootUuid] = action + }, + + _removeInactiveAction: function (action) { + var actions = this._actions, + lastInactiveAction = actions[actions.length - 1], + cacheIndex = action._cacheIndex + + lastInactiveAction._cacheIndex = cacheIndex + actions[cacheIndex] = lastInactiveAction + actions.pop() + + action._cacheIndex = null + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[clipUuid], + knownActionsForClip = actionsForClip.knownActions, + lastKnownAction = knownActionsForClip[knownActionsForClip.length - 1], + byClipCacheIndex = action._byClipCacheIndex + + lastKnownAction._byClipCacheIndex = byClipCacheIndex + knownActionsForClip[byClipCacheIndex] = lastKnownAction + knownActionsForClip.pop() + + action._byClipCacheIndex = null + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = (action._localRoot || this._root).uuid + + delete actionByRoot[rootUuid] + + if (knownActionsForClip.length === 0) { + delete actionsByClip[clipUuid] + } + + this._removeInactiveBindingsForAction(action) + }, + + _removeInactiveBindingsForAction: function (action) { + var bindings = action._propertyBindings + for (var i = 0, n = bindings.length; i !== n; ++i) { + var binding = bindings[i] + + if (--binding.referenceCount === 0) { + this._removeInactiveBinding(binding) + } + } + }, + + _lendAction: function (action) { + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + lastActiveIndex = this._nActiveActions++, + firstInactiveAction = actions[lastActiveIndex] + + action._cacheIndex = lastActiveIndex + actions[lastActiveIndex] = action + + firstInactiveAction._cacheIndex = prevIndex + actions[prevIndex] = firstInactiveAction + }, + + _takeBackAction: function (action) { + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + firstInactiveIndex = --this._nActiveActions, + lastActiveAction = actions[firstInactiveIndex] + + action._cacheIndex = firstInactiveIndex + actions[firstInactiveIndex] = action + + lastActiveAction._cacheIndex = prevIndex + actions[prevIndex] = lastActiveAction + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function (binding, rootUuid, trackName) { + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[rootUuid], + bindings = this._bindings + + if (bindingByName === undefined) { + bindingByName = {} + bindingsByRoot[rootUuid] = bindingByName + } + + bindingByName[trackName] = binding + + binding._cacheIndex = bindings.length + bindings.push(binding) + }, + + _removeInactiveBinding: function (binding) { + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[rootUuid], + lastInactiveBinding = bindings[bindings.length - 1], + cacheIndex = binding._cacheIndex + + lastInactiveBinding._cacheIndex = cacheIndex + bindings[cacheIndex] = lastInactiveBinding + bindings.pop() + + delete bindingByName[trackName] + + remove_empty_map: { + for (var _ in bindingByName) break remove_empty_map // eslint-disable-line no-unused-vars + + delete bindingsByRoot[rootUuid] + } + }, + + _lendBinding: function (binding) { + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + lastActiveIndex = this._nActiveBindings++, + firstInactiveBinding = bindings[lastActiveIndex] + + binding._cacheIndex = lastActiveIndex + bindings[lastActiveIndex] = binding + + firstInactiveBinding._cacheIndex = prevIndex + bindings[prevIndex] = firstInactiveBinding + }, + + _takeBackBinding: function (binding) { + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + firstInactiveIndex = --this._nActiveBindings, + lastActiveBinding = bindings[firstInactiveIndex] + + binding._cacheIndex = firstInactiveIndex + bindings[firstInactiveIndex] = binding + + lastActiveBinding._cacheIndex = prevIndex + bindings[prevIndex] = lastActiveBinding + }, + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function () { + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants++, + interpolant = interpolants[lastActiveIndex] + + if (interpolant === undefined) { + interpolant = new LinearInterpolant( + new Float32Array(2), + new Float32Array(2), + 1, + this._controlInterpolantsResultBuffer + ) + + interpolant.__cacheIndex = lastActiveIndex + interpolants[lastActiveIndex] = interpolant + } + + return interpolant + }, + + _takeBackControlInterpolant: function (interpolant) { + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + firstInactiveIndex = --this._nActiveControlInterpolants, + lastActiveInterpolant = interpolants[firstInactiveIndex] + + interpolant.__cacheIndex = firstInactiveIndex + interpolants[firstInactiveIndex] = interpolant + + lastActiveInterpolant.__cacheIndex = prevIndex + interpolants[prevIndex] = lastActiveInterpolant + }, + + _controlInterpolantsResultBuffer: new Float32Array(1), + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function (clip, optionalRoot) { + var root = optionalRoot || this._root, + rootUuid = root.uuid, + clipObject = typeof clip === 'string' ? AnimationClip.findByName(root, clip) : clip, + clipUuid = clipObject !== null ? clipObject.uuid : clip, + actionsForClip = this._actionsByClip[clipUuid], + prototypeAction = null + + if (actionsForClip !== undefined) { + var existingAction = actionsForClip.actionByRoot[rootUuid] + + if (existingAction !== undefined) { + return existingAction + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[0] + + // also, take the clip from the prototype action + if (clipObject === null) clipObject = prototypeAction._clip + } + + // clip must be known when specified via string + if (clipObject === null) return null + + // allocate all resources required to run it + var newAction = new AnimationAction(this, clipObject, optionalRoot) + + this._bindAction(newAction, prototypeAction) + + // and make the action known to the memory manager + this._addInactiveAction(newAction, clipUuid, rootUuid) + + return newAction + }, + + // get an existing action + existingAction: function (clip, optionalRoot) { + var root = optionalRoot || this._root, + rootUuid = root.uuid, + clipObject = typeof clip === 'string' ? AnimationClip.findByName(root, clip) : clip, + clipUuid = clipObject ? clipObject.uuid : clip, + actionsForClip = this._actionsByClip[clipUuid] + + if (actionsForClip !== undefined) { + return actionsForClip.actionByRoot[rootUuid] || null + } + + return null + }, + + // deactivates all previously scheduled actions + stopAllAction: function () { + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings + + this._nActiveActions = 0 + this._nActiveBindings = 0 + + for (var i = 0; i !== nActions; ++i) { + actions[i].reset() + } + + for (var i = 0; i !== nBindings; ++i) { + bindings[i].useCount = 0 + } + + return this + }, + + // advance the time and update apply the animation + update: function (deltaTime) { + deltaTime *= this.timeScale + + var actions = this._actions, + nActions = this._nActiveActions, + time = (this.time += deltaTime), + timeDirection = Math.sign(deltaTime), + accuIndex = (this._accuIndex ^= 1) + + // run active actions + + for (var i = 0; i !== nActions; ++i) { + var action = actions[i] + + action._update(time, deltaTime, timeDirection, accuIndex) + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings + + for (var i = 0; i !== nBindings; ++i) { + bindings[i].apply(accuIndex) + } + + return this + }, + + // return this mixer's root target object + getRoot: function () { + return this._root + }, + + // free all resources specific to a particular clip + uncacheClip: function (clip) { + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[clipUuid] + + if (actionsForClip !== undefined) { + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions + + for (var i = 0, n = actionsToRemove.length; i !== n; ++i) { + var action = actionsToRemove[i] + + this._deactivateAction(action) + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[actions.length - 1] + + action._cacheIndex = null + action._byClipCacheIndex = null + + lastInactiveAction._cacheIndex = cacheIndex + actions[cacheIndex] = lastInactiveAction + actions.pop() + + this._removeInactiveBindingsForAction(action) + } + + delete actionsByClip[clipUuid] + } + }, + + // free all resources specific to a particular root target object + uncacheRoot: function (root) { + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip + + for (var clipUuid in actionsByClip) { + var actionByRoot = actionsByClip[clipUuid].actionByRoot, + action = actionByRoot[rootUuid] + + if (action !== undefined) { + this._deactivateAction(action) + this._removeInactiveAction(action) + } + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[rootUuid] + + if (bindingByName !== undefined) { + for (var trackName in bindingByName) { + var binding = bindingByName[trackName] + binding.restoreOriginalState() + this._removeInactiveBinding(binding) + } + } + }, + + // remove a targeted clip from the cache + uncacheAction: function (clip, optionalRoot) { + var action = this.existingAction(clip, optionalRoot) + + if (action !== null) { + this._deactivateAction(action) + this._removeInactiveAction(action) + } + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform(value) { + if (typeof value === 'string') { + console.warn('THREE.Uniform: Type parameter is no longer needed.') + value = arguments[1] + } + + this.value = value + } + + Uniform.prototype.clone = function () { + return new Uniform(this.value.clone === undefined ? this.value : this.value.clone()) + } + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + BufferGeometry.call(this) + + this.type = 'InstancedBufferGeometry' + this.maxInstancedCount = undefined + } + + InstancedBufferGeometry.prototype = Object.assign(Object.create(BufferGeometry.prototype), { + constructor: InstancedBufferGeometry, + + isInstancedBufferGeometry: true, + + copy: function (source) { + BufferGeometry.prototype.copy.call(this, source) + + this.maxInstancedCount = source.maxInstancedCount + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + } + }) + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, normalized) { + this.uuid = _Math.generateUUID() + + this.data = interleavedBuffer + this.itemSize = itemSize + this.offset = offset + + this.normalized = normalized === true + } + + Object.defineProperties(InterleavedBufferAttribute.prototype, { + count: { + get: function () { + return this.data.count + } + }, + + array: { + get: function () { + return this.data.array + } + } + }) + + Object.assign(InterleavedBufferAttribute.prototype, { + isInterleavedBufferAttribute: true, + + setX: function (index, x) { + this.data.array[index * this.data.stride + this.offset] = x + + return this + }, + + setY: function (index, y) { + this.data.array[index * this.data.stride + this.offset + 1] = y + + return this + }, + + setZ: function (index, z) { + this.data.array[index * this.data.stride + this.offset + 2] = z + + return this + }, + + setW: function (index, w) { + this.data.array[index * this.data.stride + this.offset + 3] = w + + return this + }, + + getX: function (index) { + return this.data.array[index * this.data.stride + this.offset] + }, + + getY: function (index) { + return this.data.array[index * this.data.stride + this.offset + 1] + }, + + getZ: function (index) { + return this.data.array[index * this.data.stride + this.offset + 2] + }, + + getW: function (index) { + return this.data.array[index * this.data.stride + this.offset + 3] + }, + + setXY: function (index, x, y) { + index = index * this.data.stride + this.offset + + this.data.array[index + 0] = x + this.data.array[index + 1] = y + + return this + }, + + setXYZ: function (index, x, y, z) { + index = index * this.data.stride + this.offset + + this.data.array[index + 0] = x + this.data.array[index + 1] = y + this.data.array[index + 2] = z + + return this + }, + + setXYZW: function (index, x, y, z, w) { + index = index * this.data.stride + this.offset + + this.data.array[index + 0] = x + this.data.array[index + 1] = y + this.data.array[index + 2] = z + this.data.array[index + 3] = w + + return this + } + }) + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer(array, stride) { + this.uuid = _Math.generateUUID() + + this.array = array + this.stride = stride + this.count = array !== undefined ? array.length / stride : 0 + + this.dynamic = false + this.updateRange = { offset: 0, count: -1 } + + this.onUploadCallback = function () {} + + this.version = 0 + } + + Object.defineProperty(InterleavedBuffer.prototype, 'needsUpdate', { + set: function (value) { + if (value === true) this.version++ + } + }) + + Object.assign(InterleavedBuffer.prototype, { + isInterleavedBuffer: true, + + setArray: function (array) { + if (Array.isArray(array)) { + throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.') + } + + this.count = array !== undefined ? array.length / this.stride : 0 + this.array = array + }, + + setDynamic: function (value) { + this.dynamic = value + + return this + }, + + copy: function (source) { + this.array = new source.array.constructor(source.array) + this.count = source.count + this.stride = source.stride + this.dynamic = source.dynamic + + return this + }, + + copyAt: function (index1, attribute, index2) { + index1 *= this.stride + index2 *= attribute.stride + + for (var i = 0, l = this.stride; i < l; i++) { + this.array[index1 + i] = attribute.array[index2 + i] + } + + return this + }, + + set: function (value, offset) { + if (offset === undefined) offset = 0 + + this.array.set(value, offset) + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + onUpload: function (callback) { + this.onUploadCallback = callback + + return this + } + }) + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer(array, stride, meshPerAttribute) { + InterleavedBuffer.call(this, array, stride) + + this.meshPerAttribute = meshPerAttribute || 1 + } + + InstancedInterleavedBuffer.prototype = Object.assign(Object.create(InterleavedBuffer.prototype), { + constructor: InstancedInterleavedBuffer, + + isInstancedInterleavedBuffer: true, + + copy: function (source) { + InterleavedBuffer.prototype.copy.call(this, source) + + this.meshPerAttribute = source.meshPerAttribute + + return this + } + }) + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute(array, itemSize, meshPerAttribute) { + BufferAttribute.call(this, array, itemSize) + + this.meshPerAttribute = meshPerAttribute || 1 + } + + InstancedBufferAttribute.prototype = Object.assign(Object.create(BufferAttribute.prototype), { + constructor: InstancedBufferAttribute, + + isInstancedBufferAttribute: true, + + copy: function (source) { + BufferAttribute.prototype.copy.call(this, source) + + this.meshPerAttribute = source.meshPerAttribute + + return this + } + }) + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster(origin, direction, near, far) { + this.ray = new Ray(origin, direction) + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0 + this.far = far || Infinity + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + } + + Object.defineProperties(this.params, { + PointCloud: { + get: function () { + console.warn('THREE.Raycaster: params.PointCloud has been renamed to params.Points.') + return this.Points + } + } + }) + } + + function ascSort(a, b) { + return a.distance - b.distance + } + + function intersectObject(object, raycaster, intersects, recursive) { + if (object.visible === false) return + + object.raycast(raycaster, intersects) + + if (recursive === true) { + var children = object.children + + for (var i = 0, l = children.length; i < l; i++) { + intersectObject(children[i], raycaster, intersects, true) + } + } + } + + Object.assign(Raycaster.prototype, { + linePrecision: 1, + + set: function (origin, direction) { + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set(origin, direction) + }, + + setFromCamera: function (coords, camera) { + if (camera && camera.isPerspectiveCamera) { + this.ray.origin.setFromMatrixPosition(camera.matrixWorld) + this.ray.direction + .set(coords.x, coords.y, 0.5) + .unproject(camera) + .sub(this.ray.origin) + .normalize() + } else if (camera && camera.isOrthographicCamera) { + this.ray.origin + .set(coords.x, coords.y, (camera.near + camera.far) / (camera.near - camera.far)) + .unproject(camera) // set origin in plane of camera + this.ray.direction.set(0, 0, -1).transformDirection(camera.matrixWorld) + } else { + console.error('THREE.Raycaster: Unsupported camera type.') + } + }, + + intersectObject: function (object, recursive) { + var intersects = [] + + intersectObject(object, this, intersects, recursive) + + intersects.sort(ascSort) + + return intersects + }, + + intersectObjects: function (objects, recursive) { + var intersects = [] + + if (Array.isArray(objects) === false) { + console.warn('THREE.Raycaster.intersectObjects: objects is not an Array.') + return intersects + } + + for (var i = 0, l = objects.length; i < l; i++) { + intersectObject(objects[i], this, intersects, recursive) + } + + intersects.sort(ascSort) + + return intersects + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock(autoStart) { + this.autoStart = autoStart !== undefined ? autoStart : true + + this.startTime = 0 + this.oldTime = 0 + this.elapsedTime = 0 + + this.running = false + } + + Object.assign(Clock.prototype, { + start: function () { + this.startTime = (typeof performance === 'undefined' ? Date : performance).now() // see #10732 + + this.oldTime = this.startTime + this.elapsedTime = 0 + this.running = true + }, + + stop: function () { + this.getElapsedTime() + this.running = false + this.autoStart = false + }, + + getElapsedTime: function () { + this.getDelta() + return this.elapsedTime + }, + + getDelta: function () { + var diff = 0 + + if (this.autoStart && !this.running) { + this.start() + return 0 + } + + if (this.running) { + var newTime = (typeof performance === 'undefined' ? Date : performance).now() + + diff = (newTime - this.oldTime) / 1000 + this.oldTime = newTime + + this.elapsedTime += diff + } + + return diff + } + }) + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical(radius, phi, theta) { + this.radius = radius !== undefined ? radius : 1.0 + this.phi = phi !== undefined ? phi : 0 // up / down towards top and bottom pole + this.theta = theta !== undefined ? theta : 0 // around the equator of the sphere + + return this + } + + Object.assign(Spherical.prototype, { + set: function (radius, phi, theta) { + this.radius = radius + this.phi = phi + this.theta = theta + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (other) { + this.radius = other.radius + this.phi = other.phi + this.theta = other.theta + + return this + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function () { + var EPS = 0.000001 + this.phi = Math.max(EPS, Math.min(Math.PI - EPS, this.phi)) + + return this + }, + + setFromVector3: function (vec3) { + this.radius = vec3.length() + + if (this.radius === 0) { + this.theta = 0 + this.phi = 0 + } else { + this.theta = Math.atan2(vec3.x, vec3.z) // equator angle around y-up axis + this.phi = Math.acos(_Math.clamp(vec3.y / this.radius, -1, 1)) // polar angle + } + + return this + } + }) + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system + * + */ + + function Cylindrical(radius, theta, y) { + this.radius = radius !== undefined ? radius : 1.0 // distance from the origin to a point in the x-z plane + this.theta = theta !== undefined ? theta : 0 // counterclockwise angle in the x-z plane measured in radians from the positive z-axis + this.y = y !== undefined ? y : 0 // height above the x-z plane + + return this + } + + Object.assign(Cylindrical.prototype, { + set: function (radius, theta, y) { + this.radius = radius + this.theta = theta + this.y = y + + return this + }, + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (other) { + this.radius = other.radius + this.theta = other.theta + this.y = other.y + + return this + }, + + setFromVector3: function (vec3) { + this.radius = Math.sqrt(vec3.x * vec3.x + vec3.z * vec3.z) + this.theta = Math.atan2(vec3.x, vec3.z) + this.y = vec3.y + + return this + } + }) + + /** + * @author bhouston / http://clara.io + */ + + function Box2(min, max) { + this.min = min !== undefined ? min : new Vector2(+Infinity, +Infinity) + this.max = max !== undefined ? max : new Vector2(-Infinity, -Infinity) + } + + Object.assign(Box2.prototype, { + set: function (min, max) { + this.min.copy(min) + this.max.copy(max) + + return this + }, + + setFromPoints: function (points) { + this.makeEmpty() + + for (var i = 0, il = points.length; i < il; i++) { + this.expandByPoint(points[i]) + } + + return this + }, + + setFromCenterAndSize: (function () { + var v1 = new Vector2() + + return function setFromCenterAndSize(center, size) { + var halfSize = v1.copy(size).multiplyScalar(0.5) + this.min.copy(center).sub(halfSize) + this.max.copy(center).add(halfSize) + + return this + } + })(), + + clone: function () { + return new this.constructor().copy(this) + }, + + copy: function (box) { + this.min.copy(box.min) + this.max.copy(box.max) + + return this + }, + + makeEmpty: function () { + this.min.x = this.min.y = +Infinity + this.max.x = this.max.y = -Infinity + + return this + }, + + isEmpty: function () { + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return this.max.x < this.min.x || this.max.y < this.min.y + }, + + getCenter: function (optionalTarget) { + var result = optionalTarget || new Vector2() + return this.isEmpty() + ? result.set(0, 0) + : result.addVectors(this.min, this.max).multiplyScalar(0.5) + }, + + getSize: function (optionalTarget) { + var result = optionalTarget || new Vector2() + return this.isEmpty() ? result.set(0, 0) : result.subVectors(this.max, this.min) + }, + + expandByPoint: function (point) { + this.min.min(point) + this.max.max(point) + + return this + }, + + expandByVector: function (vector) { + this.min.sub(vector) + this.max.add(vector) + + return this + }, + + expandByScalar: function (scalar) { + this.min.addScalar(-scalar) + this.max.addScalar(scalar) + + return this + }, + + containsPoint: function (point) { + return point.x < this.min.x || + point.x > this.max.x || + point.y < this.min.y || + point.y > this.max.y + ? false + : true + }, + + containsBox: function (box) { + return ( + this.min.x <= box.min.x && + box.max.x <= this.max.x && + this.min.y <= box.min.y && + box.max.y <= this.max.y + ) + }, + + getParameter: function (point, optionalTarget) { + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector2() + + return result.set( + (point.x - this.min.x) / (this.max.x - this.min.x), + (point.y - this.min.y) / (this.max.y - this.min.y) + ) + }, + + intersectsBox: function (box) { + // using 4 splitting planes to rule out intersections + + return box.max.x < this.min.x || + box.min.x > this.max.x || + box.max.y < this.min.y || + box.min.y > this.max.y + ? false + : true + }, + + clampPoint: function (point, optionalTarget) { + var result = optionalTarget || new Vector2() + return result.copy(point).clamp(this.min, this.max) + }, + + distanceToPoint: (function () { + var v1 = new Vector2() + + return function distanceToPoint(point) { + var clampedPoint = v1.copy(point).clamp(this.min, this.max) + return clampedPoint.sub(point).length() + } + })(), + + intersect: function (box) { + this.min.max(box.min) + this.max.min(box.max) + + return this + }, + + union: function (box) { + this.min.min(box.min) + this.max.max(box.max) + + return this + }, + + translate: function (offset) { + this.min.add(offset) + this.max.add(offset) + + return this + }, + + equals: function (box) { + return box.min.equals(this.min) && box.max.equals(this.max) + } + }) + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject(material) { + Object3D.call(this) + + this.material = material + this.render = function (/* renderCallback */) {} + } + + ImmediateRenderObject.prototype = Object.create(Object3D.prototype) + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject + + ImmediateRenderObject.prototype.isImmediateRenderObject = true + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper(object, size, hex, linewidth) { + this.object = object + + this.size = size !== undefined ? size : 1 + + var color = hex !== undefined ? hex : 0xff0000 + + var width = linewidth !== undefined ? linewidth : 1 + + // + + var nNormals = 0 + + var objGeometry = this.object.geometry + + if (objGeometry && objGeometry.isGeometry) { + nNormals = objGeometry.faces.length * 3 + } else if (objGeometry && objGeometry.isBufferGeometry) { + nNormals = objGeometry.attributes.normal.count + } + + // + + var geometry = new BufferGeometry() + + var positions = new Float32BufferAttribute(nNormals * 2 * 3, 3) + + geometry.addAttribute('position', positions) + + LineSegments.call(this, geometry, new LineBasicMaterial({ color: color, linewidth: width })) + + // + + this.matrixAutoUpdate = false + + this.update() + } + + VertexNormalsHelper.prototype = Object.create(LineSegments.prototype) + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper + + VertexNormalsHelper.prototype.update = (function () { + var v1 = new Vector3() + var v2 = new Vector3() + var normalMatrix = new Matrix3() + + return function update() { + var keys = ['a', 'b', 'c'] + + this.object.updateMatrixWorld(true) + + normalMatrix.getNormalMatrix(this.object.matrixWorld) + + var matrixWorld = this.object.matrixWorld + + var position = this.geometry.attributes.position + + // + + var objGeometry = this.object.geometry + + if (objGeometry && objGeometry.isGeometry) { + var vertices = objGeometry.vertices + + var faces = objGeometry.faces + + var idx = 0 + + for (var i = 0, l = faces.length; i < l; i++) { + var face = faces[i] + + for (var j = 0, jl = face.vertexNormals.length; j < jl; j++) { + var vertex = vertices[face[keys[j]]] + + var normal = face.vertexNormals[j] + + v1.copy(vertex).applyMatrix4(matrixWorld) + + v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1) + + position.setXYZ(idx, v1.x, v1.y, v1.z) + + idx = idx + 1 + + position.setXYZ(idx, v2.x, v2.y, v2.z) + + idx = idx + 1 + } + } + } else if (objGeometry && objGeometry.isBufferGeometry) { + var objPos = objGeometry.attributes.position + + var objNorm = objGeometry.attributes.normal + + var idx = 0 + + // for simplicity, ignore index and drawcalls, and render every normal + + for (var j = 0, jl = objPos.count; j < jl; j++) { + v1.set(objPos.getX(j), objPos.getY(j), objPos.getZ(j)).applyMatrix4(matrixWorld) + + v2.set(objNorm.getX(j), objNorm.getY(j), objNorm.getZ(j)) + + v2.applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1) + + position.setXYZ(idx, v1.x, v1.y, v1.z) + + idx = idx + 1 + + position.setXYZ(idx, v2.x, v2.y, v2.z) + + idx = idx + 1 + } + } + + position.needsUpdate = true + } + })() + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper(light, color) { + Object3D.call(this) + + this.light = light + this.light.updateMatrixWorld() + + this.matrix = light.matrixWorld + this.matrixAutoUpdate = false + + this.color = color + + var geometry = new BufferGeometry() + + var positions = [ + 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 1 + ] + + for (var i = 0, j = 1, l = 32; i < l; i++, j++) { + var p1 = (i / l) * Math.PI * 2 + var p2 = (j / l) * Math.PI * 2 + + positions.push(Math.cos(p1), Math.sin(p1), 1, Math.cos(p2), Math.sin(p2), 1) + } + + geometry.addAttribute('position', new Float32BufferAttribute(positions, 3)) + + var material = new LineBasicMaterial({ fog: false }) + + this.cone = new LineSegments(geometry, material) + this.add(this.cone) + + this.update() + } + + SpotLightHelper.prototype = Object.create(Object3D.prototype) + SpotLightHelper.prototype.constructor = SpotLightHelper + + SpotLightHelper.prototype.dispose = function () { + this.cone.geometry.dispose() + this.cone.material.dispose() + } + + SpotLightHelper.prototype.update = (function () { + var vector = new Vector3() + var vector2 = new Vector3() + + return function update() { + this.light.updateMatrixWorld() + + var coneLength = this.light.distance ? this.light.distance : 1000 + var coneWidth = coneLength * Math.tan(this.light.angle) + + this.cone.scale.set(coneWidth, coneWidth, coneLength) + + vector.setFromMatrixPosition(this.light.matrixWorld) + vector2.setFromMatrixPosition(this.light.target.matrixWorld) + + this.cone.lookAt(vector2.sub(vector)) + + if (this.color !== undefined) { + this.cone.material.color.set(this.color) + } else { + this.cone.material.color.copy(this.light.color) + } + } + })() + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + * @author Mugen87 / https://github.com/Mugen87 + */ + + function getBoneList(object) { + var boneList = [] + + if (object && object.isBone) { + boneList.push(object) + } + + for (var i = 0; i < object.children.length; i++) { + boneList.push.apply(boneList, getBoneList(object.children[i])) + } + + return boneList + } + + function SkeletonHelper(object) { + var bones = getBoneList(object) + + var geometry = new BufferGeometry() + + var vertices = [] + var colors = [] + + var color1 = new Color(0, 0, 1) + var color2 = new Color(0, 1, 0) + + for (var i = 0; i < bones.length; i++) { + var bone = bones[i] + + if (bone.parent && bone.parent.isBone) { + vertices.push(0, 0, 0) + vertices.push(0, 0, 0) + colors.push(color1.r, color1.g, color1.b) + colors.push(color2.r, color2.g, color2.b) + } + } + + geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + geometry.addAttribute('color', new Float32BufferAttribute(colors, 3)) + + var material = new LineBasicMaterial({ + vertexColors: VertexColors, + depthTest: false, + depthWrite: false, + transparent: true + }) + + LineSegments.call(this, geometry, material) + + this.root = object + this.bones = bones + + this.matrix = object.matrixWorld + this.matrixAutoUpdate = false + } + + SkeletonHelper.prototype = Object.create(LineSegments.prototype) + SkeletonHelper.prototype.constructor = SkeletonHelper + + SkeletonHelper.prototype.updateMatrixWorld = (function () { + var vector = new Vector3() + + var boneMatrix = new Matrix4() + var matrixWorldInv = new Matrix4() + + return function updateMatrixWorld(force) { + var bones = this.bones + + var geometry = this.geometry + var position = geometry.getAttribute('position') + + matrixWorldInv.getInverse(this.root.matrixWorld) + + for (var i = 0, j = 0; i < bones.length; i++) { + var bone = bones[i] + + if (bone.parent && bone.parent.isBone) { + boneMatrix.multiplyMatrices(matrixWorldInv, bone.matrixWorld) + vector.setFromMatrixPosition(boneMatrix) + position.setXYZ(j, vector.x, vector.y, vector.z) + + boneMatrix.multiplyMatrices(matrixWorldInv, bone.parent.matrixWorld) + vector.setFromMatrixPosition(boneMatrix) + position.setXYZ(j + 1, vector.x, vector.y, vector.z) + + j += 2 + } + } + + geometry.getAttribute('position').needsUpdate = true + + Object3D.prototype.updateMatrixWorld.call(this, force) + } + })() + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper(light, sphereSize, color) { + this.light = light + this.light.updateMatrixWorld() + + this.color = color + + var geometry = new SphereBufferGeometry(sphereSize, 4, 2) + var material = new MeshBasicMaterial({ wireframe: true, fog: false }) + + Mesh.call(this, geometry, material) + + this.matrix = this.light.matrixWorld + this.matrixAutoUpdate = false + + this.update() + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + } + + PointLightHelper.prototype = Object.create(Mesh.prototype) + PointLightHelper.prototype.constructor = PointLightHelper + + PointLightHelper.prototype.dispose = function () { + this.geometry.dispose() + this.material.dispose() + } + + PointLightHelper.prototype.update = function () { + if (this.color !== undefined) { + this.material.color.set(this.color) + } else { + this.material.color.copy(this.light.color) + } + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + } + + /** + * @author abelnation / http://github.com/abelnation + * @author Mugen87 / http://github.com/Mugen87 + * @author WestLangley / http://github.com/WestLangley + */ + + function RectAreaLightHelper(light, color) { + Object3D.call(this) + + this.light = light + this.light.updateMatrixWorld() + + this.matrix = light.matrixWorld + this.matrixAutoUpdate = false + + this.color = color + + var material = new LineBasicMaterial({ fog: false }) + + var geometry = new BufferGeometry() + + geometry.addAttribute('position', new BufferAttribute(new Float32Array(5 * 3), 3)) + + this.line = new Line(geometry, material) + this.add(this.line) + + this.update() + } + + RectAreaLightHelper.prototype = Object.create(Object3D.prototype) + RectAreaLightHelper.prototype.constructor = RectAreaLightHelper + + RectAreaLightHelper.prototype.dispose = function () { + this.children[0].geometry.dispose() + this.children[0].material.dispose() + } + + RectAreaLightHelper.prototype.update = function () { + // calculate new dimensions of the helper + + var hx = this.light.width * 0.5 + var hy = this.light.height * 0.5 + + var position = this.line.geometry.attributes.position + var array = position.array + + // update vertices + + array[0] = hx + array[1] = -hy + array[2] = 0 + array[3] = hx + array[4] = hy + array[5] = 0 + array[6] = -hx + array[7] = hy + array[8] = 0 + array[9] = -hx + array[10] = -hy + array[11] = 0 + array[12] = hx + array[13] = -hy + array[14] = 0 + + position.needsUpdate = true + + if (this.color !== undefined) { + this.line.material.color.set(this.color) + } else { + this.line.material.color.copy(this.light.color) + } + } + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / https://github.com/Mugen87 + */ + + function HemisphereLightHelper(light, size, color) { + Object3D.call(this) + + this.light = light + this.light.updateMatrixWorld() + + this.matrix = light.matrixWorld + this.matrixAutoUpdate = false + + this.color = color + + var geometry = new OctahedronBufferGeometry(size) + geometry.rotateY(Math.PI * 0.5) + + this.material = new MeshBasicMaterial({ wireframe: true, fog: false }) + if (this.color === undefined) this.material.vertexColors = VertexColors + + var position = geometry.getAttribute('position') + var colors = new Float32Array(position.count * 3) + + geometry.addAttribute('color', new BufferAttribute(colors, 3)) + + this.add(new Mesh(geometry, this.material)) + + this.update() + } + + HemisphereLightHelper.prototype = Object.create(Object3D.prototype) + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper + + HemisphereLightHelper.prototype.dispose = function () { + this.children[0].geometry.dispose() + this.children[0].material.dispose() + } + + HemisphereLightHelper.prototype.update = (function () { + var vector = new Vector3() + + var color1 = new Color() + var color2 = new Color() + + return function update() { + var mesh = this.children[0] + + if (this.color !== undefined) { + this.material.color.set(this.color) + } else { + var colors = mesh.geometry.getAttribute('color') + + color1.copy(this.light.color) + color2.copy(this.light.groundColor) + + for (var i = 0, l = colors.count; i < l; i++) { + var color = i < l / 2 ? color1 : color2 + + colors.setXYZ(i, color.r, color.g, color.b) + } + + colors.needsUpdate = true + } + + mesh.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate()) + } + })() + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper(size, divisions, color1, color2) { + size = size || 10 + divisions = divisions || 10 + color1 = new Color(color1 !== undefined ? color1 : 0x444444) + color2 = new Color(color2 !== undefined ? color2 : 0x888888) + + var center = divisions / 2 + var step = size / divisions + var halfSize = size / 2 + + var vertices = [], + colors = [] + + for (var i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) { + vertices.push(-halfSize, 0, k, halfSize, 0, k) + vertices.push(k, 0, -halfSize, k, 0, halfSize) + + var color = i === center ? color1 : color2 + + color.toArray(colors, j) + j += 3 + color.toArray(colors, j) + j += 3 + color.toArray(colors, j) + j += 3 + color.toArray(colors, j) + j += 3 + } + + var geometry = new BufferGeometry() + geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + geometry.addAttribute('color', new Float32BufferAttribute(colors, 3)) + + var material = new LineBasicMaterial({ vertexColors: VertexColors }) + + LineSegments.call(this, geometry, material) + } + + GridHelper.prototype = Object.create(LineSegments.prototype) + GridHelper.prototype.constructor = GridHelper + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + * @author Hectate / http://www.github.com/Hectate + */ + + function PolarGridHelper(radius, radials, circles, divisions, color1, color2) { + radius = radius || 10 + radials = radials || 16 + circles = circles || 8 + divisions = divisions || 64 + color1 = new Color(color1 !== undefined ? color1 : 0x444444) + color2 = new Color(color2 !== undefined ? color2 : 0x888888) + + var vertices = [] + var colors = [] + + var x, z + var v, i, j, r, color + + // create the radials + + for (i = 0; i <= radials; i++) { + v = (i / radials) * (Math.PI * 2) + + x = Math.sin(v) * radius + z = Math.cos(v) * radius + + vertices.push(0, 0, 0) + vertices.push(x, 0, z) + + color = i & 1 ? color1 : color2 + + colors.push(color.r, color.g, color.b) + colors.push(color.r, color.g, color.b) + } + + // create the circles + + for (i = 0; i <= circles; i++) { + color = i & 1 ? color1 : color2 + + r = radius - (radius / circles) * i + + for (j = 0; j < divisions; j++) { + // first vertex + + v = (j / divisions) * (Math.PI * 2) + + x = Math.sin(v) * r + z = Math.cos(v) * r + + vertices.push(x, 0, z) + colors.push(color.r, color.g, color.b) + + // second vertex + + v = ((j + 1) / divisions) * (Math.PI * 2) + + x = Math.sin(v) * r + z = Math.cos(v) * r + + vertices.push(x, 0, z) + colors.push(color.r, color.g, color.b) + } + } + + var geometry = new BufferGeometry() + geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + geometry.addAttribute('color', new Float32BufferAttribute(colors, 3)) + + var material = new LineBasicMaterial({ vertexColors: VertexColors }) + + LineSegments.call(this, geometry, material) + } + + PolarGridHelper.prototype = Object.create(LineSegments.prototype) + PolarGridHelper.prototype.constructor = PolarGridHelper + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper(object, size, hex, linewidth) { + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object + + this.size = size !== undefined ? size : 1 + + var color = hex !== undefined ? hex : 0xffff00 + + var width = linewidth !== undefined ? linewidth : 1 + + // + + var nNormals = 0 + + var objGeometry = this.object.geometry + + if (objGeometry && objGeometry.isGeometry) { + nNormals = objGeometry.faces.length + } else { + console.warn( + 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' + ) + } + + // + + var geometry = new BufferGeometry() + + var positions = new Float32BufferAttribute(nNormals * 2 * 3, 3) + + geometry.addAttribute('position', positions) + + LineSegments.call(this, geometry, new LineBasicMaterial({ color: color, linewidth: width })) + + // + + this.matrixAutoUpdate = false + this.update() + } + + FaceNormalsHelper.prototype = Object.create(LineSegments.prototype) + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper + + FaceNormalsHelper.prototype.update = (function () { + var v1 = new Vector3() + var v2 = new Vector3() + var normalMatrix = new Matrix3() + + return function update() { + this.object.updateMatrixWorld(true) + + normalMatrix.getNormalMatrix(this.object.matrixWorld) + + var matrixWorld = this.object.matrixWorld + + var position = this.geometry.attributes.position + + // + + var objGeometry = this.object.geometry + + var vertices = objGeometry.vertices + + var faces = objGeometry.faces + + var idx = 0 + + for (var i = 0, l = faces.length; i < l; i++) { + var face = faces[i] + + var normal = face.normal + + v1.copy(vertices[face.a]) + .add(vertices[face.b]) + .add(vertices[face.c]) + .divideScalar(3) + .applyMatrix4(matrixWorld) + + v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1) + + position.setXYZ(idx, v1.x, v1.y, v1.z) + + idx = idx + 1 + + position.setXYZ(idx, v2.x, v2.y, v2.z) + + idx = idx + 1 + } + + position.needsUpdate = true + } + })() + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper(light, size, color) { + Object3D.call(this) + + this.light = light + this.light.updateMatrixWorld() + + this.matrix = light.matrixWorld + this.matrixAutoUpdate = false + + this.color = color + + if (size === undefined) size = 1 + + var geometry = new BufferGeometry() + geometry.addAttribute( + 'position', + new Float32BufferAttribute( + [-size, size, 0, size, size, 0, size, -size, 0, -size, -size, 0, -size, size, 0], + 3 + ) + ) + + var material = new LineBasicMaterial({ fog: false }) + + this.lightPlane = new Line(geometry, material) + this.add(this.lightPlane) + + geometry = new BufferGeometry() + geometry.addAttribute('position', new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3)) + + this.targetLine = new Line(geometry, material) + this.add(this.targetLine) + + this.update() + } + + DirectionalLightHelper.prototype = Object.create(Object3D.prototype) + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper + + DirectionalLightHelper.prototype.dispose = function () { + this.lightPlane.geometry.dispose() + this.lightPlane.material.dispose() + this.targetLine.geometry.dispose() + this.targetLine.material.dispose() + } + + DirectionalLightHelper.prototype.update = (function () { + var v1 = new Vector3() + var v2 = new Vector3() + var v3 = new Vector3() + + return function update() { + v1.setFromMatrixPosition(this.light.matrixWorld) + v2.setFromMatrixPosition(this.light.target.matrixWorld) + v3.subVectors(v2, v1) + + this.lightPlane.lookAt(v3) + + if (this.color !== undefined) { + this.lightPlane.material.color.set(this.color) + this.targetLine.material.color.set(this.color) + } else { + this.lightPlane.material.color.copy(this.light.color) + this.targetLine.material.color.copy(this.light.color) + } + + this.targetLine.lookAt(v3) + this.targetLine.scale.z = v3.length() + } + })() + + /** + * @author alteredq / http://alteredqualia.com/ + * @author Mugen87 / https://github.com/Mugen87 + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper(camera) { + var geometry = new BufferGeometry() + var material = new LineBasicMaterial({ color: 0xffffff, vertexColors: FaceColors }) + + var vertices = [] + var colors = [] + + var pointMap = {} + + // colors + + var colorFrustum = new Color(0xffaa00) + var colorCone = new Color(0xff0000) + var colorUp = new Color(0x00aaff) + var colorTarget = new Color(0xffffff) + var colorCross = new Color(0x333333) + + // near + + addLine('n1', 'n2', colorFrustum) + addLine('n2', 'n4', colorFrustum) + addLine('n4', 'n3', colorFrustum) + addLine('n3', 'n1', colorFrustum) + + // far + + addLine('f1', 'f2', colorFrustum) + addLine('f2', 'f4', colorFrustum) + addLine('f4', 'f3', colorFrustum) + addLine('f3', 'f1', colorFrustum) + + // sides + + addLine('n1', 'f1', colorFrustum) + addLine('n2', 'f2', colorFrustum) + addLine('n3', 'f3', colorFrustum) + addLine('n4', 'f4', colorFrustum) + + // cone + + addLine('p', 'n1', colorCone) + addLine('p', 'n2', colorCone) + addLine('p', 'n3', colorCone) + addLine('p', 'n4', colorCone) + + // up + + addLine('u1', 'u2', colorUp) + addLine('u2', 'u3', colorUp) + addLine('u3', 'u1', colorUp) + + // target + + addLine('c', 't', colorTarget) + addLine('p', 'c', colorCross) + + // cross + + addLine('cn1', 'cn2', colorCross) + addLine('cn3', 'cn4', colorCross) + + addLine('cf1', 'cf2', colorCross) + addLine('cf3', 'cf4', colorCross) + + function addLine(a, b, color) { + addPoint(a, color) + addPoint(b, color) + } + + function addPoint(id, color) { + vertices.push(0, 0, 0) + colors.push(color.r, color.g, color.b) + + if (pointMap[id] === undefined) { + pointMap[id] = [] + } + + pointMap[id].push(vertices.length / 3 - 1) + } + + geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + geometry.addAttribute('color', new Float32BufferAttribute(colors, 3)) + + LineSegments.call(this, geometry, material) + + this.camera = camera + if (this.camera.updateProjectionMatrix) this.camera.updateProjectionMatrix() + + this.matrix = camera.matrixWorld + this.matrixAutoUpdate = false + + this.pointMap = pointMap + + this.update() + } + + CameraHelper.prototype = Object.create(LineSegments.prototype) + CameraHelper.prototype.constructor = CameraHelper + + CameraHelper.prototype.update = (function () { + var geometry, pointMap + + var vector = new Vector3() + var camera = new Camera() + + function setPoint(point, x, y, z) { + vector.set(x, y, z).unproject(camera) + + var points = pointMap[point] + + if (points !== undefined) { + var position = geometry.getAttribute('position') + + for (var i = 0, l = points.length; i < l; i++) { + position.setXYZ(points[i], vector.x, vector.y, vector.z) + } + } + } + + return function update() { + geometry = this.geometry + pointMap = this.pointMap + + var w = 1, + h = 1 + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy(this.camera.projectionMatrix) + + // center / target + + setPoint('c', 0, 0, -1) + setPoint('t', 0, 0, 1) + + // near + + setPoint('n1', -w, -h, -1) + setPoint('n2', w, -h, -1) + setPoint('n3', -w, h, -1) + setPoint('n4', w, h, -1) + + // far + + setPoint('f1', -w, -h, 1) + setPoint('f2', w, -h, 1) + setPoint('f3', -w, h, 1) + setPoint('f4', w, h, 1) + + // up + + setPoint('u1', w * 0.7, h * 1.1, -1) + setPoint('u2', -w * 0.7, h * 1.1, -1) + setPoint('u3', 0, h * 2, -1) + + // cross + + setPoint('cf1', -w, 0, 1) + setPoint('cf2', w, 0, 1) + setPoint('cf3', 0, -h, 1) + setPoint('cf4', 0, h, 1) + + setPoint('cn1', -w, 0, -1) + setPoint('cn2', w, 0, -1) + setPoint('cn3', 0, -h, -1) + setPoint('cn4', 0, h, -1) + + geometry.getAttribute('position').needsUpdate = true + } + })() + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Mugen87 / http://github.com/Mugen87 + */ + + function BoxHelper(object, color) { + this.object = object + + if (color === undefined) color = 0xffff00 + + var indices = new Uint16Array([ + 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 + ]) + var positions = new Float32Array(8 * 3) + + var geometry = new BufferGeometry() + geometry.setIndex(new BufferAttribute(indices, 1)) + geometry.addAttribute('position', new BufferAttribute(positions, 3)) + + LineSegments.call(this, geometry, new LineBasicMaterial({ color: color })) + + this.matrixAutoUpdate = false + + this.update() + } + + BoxHelper.prototype = Object.create(LineSegments.prototype) + BoxHelper.prototype.constructor = BoxHelper + + BoxHelper.prototype.update = (function () { + var box = new Box3() + + return function update(object) { + if (object !== undefined) { + console.warn('THREE.BoxHelper: .update() has no longer arguments.') + } + + if (this.object !== undefined) { + box.setFromObject(this.object) + } + + if (box.isEmpty()) return + + var min = box.min + var max = box.max + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position + var array = position.array + + array[0] = max.x + array[1] = max.y + array[2] = max.z + array[3] = min.x + array[4] = max.y + array[5] = max.z + array[6] = min.x + array[7] = min.y + array[8] = max.z + array[9] = max.x + array[10] = min.y + array[11] = max.z + array[12] = max.x + array[13] = max.y + array[14] = min.z + array[15] = min.x + array[16] = max.y + array[17] = min.z + array[18] = min.x + array[19] = min.y + array[20] = min.z + array[21] = max.x + array[22] = min.y + array[23] = min.z + + position.needsUpdate = true + + this.geometry.computeBoundingSphere() + } + })() + + BoxHelper.prototype.setFromObject = function (object) { + this.object = object + this.update() + + return this + } + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3Helper(box, hex) { + this.type = 'Box3Helper' + + this.box = box + + var color = hex !== undefined ? hex : 0xffff00 + + var indices = new Uint16Array([ + 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 + ]) + + var positions = [ + 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 + ] + + var geometry = new BufferGeometry() + + geometry.setIndex(new BufferAttribute(indices, 1)) + + geometry.addAttribute('position', new Float32BufferAttribute(positions, 3)) + + LineSegments.call(this, geometry, new LineBasicMaterial({ color: color })) + + this.geometry.computeBoundingSphere() + } + + Box3Helper.prototype = Object.create(LineSegments.prototype) + Box3Helper.prototype.constructor = Box3Helper + + Box3Helper.prototype.updateMatrixWorld = function (force) { + var box = this.box + + if (box.isEmpty()) return + + box.getCenter(this.position) + + box.getSize(this.scale) + + this.scale.multiplyScalar(0.5) + + Object3D.prototype.updateMatrixWorld.call(this, force) + } + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function PlaneHelper(plane, size, hex) { + this.type = 'PlaneHelper' + + this.plane = plane + + this.size = size === undefined ? 1 : size + + var color = hex !== undefined ? hex : 0xffff00 + + var positions = [ + 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 0, 0, 1, 0, 0, + 0 + ] + + var geometry = new BufferGeometry() + geometry.addAttribute('position', new Float32BufferAttribute(positions, 3)) + geometry.computeBoundingSphere() + + Line.call(this, geometry, new LineBasicMaterial({ color: color })) + + // + + var positions2 = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1] + + var geometry2 = new BufferGeometry() + geometry2.addAttribute('position', new Float32BufferAttribute(positions2, 3)) + geometry2.computeBoundingSphere() + + this.add( + new Mesh( + geometry2, + new MeshBasicMaterial({ color: color, opacity: 0.2, transparent: true, depthWrite: false }) + ) + ) + } + + PlaneHelper.prototype = Object.create(Line.prototype) + PlaneHelper.prototype.constructor = PlaneHelper + + PlaneHelper.prototype.updateMatrixWorld = function (force) { + var scale = -this.plane.constant + + if (Math.abs(scale) < 1e-8) scale = 1e-8 // sign does not matter + + this.scale.set(0.5 * this.size, 0.5 * this.size, scale) + + this.lookAt(this.plane.normal) + + Object3D.prototype.updateMatrixWorld.call(this, force) + } + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry + var coneGeometry + + function ArrowHelper(dir, origin, length, color, headLength, headWidth) { + // dir is assumed to be normalized + + Object3D.call(this) + + if (color === undefined) color = 0xffff00 + if (length === undefined) length = 1 + if (headLength === undefined) headLength = 0.2 * length + if (headWidth === undefined) headWidth = 0.2 * headLength + + if (lineGeometry === undefined) { + lineGeometry = new BufferGeometry() + lineGeometry.addAttribute('position', new Float32BufferAttribute([0, 0, 0, 0, 1, 0], 3)) + + coneGeometry = new CylinderBufferGeometry(0, 0.5, 1, 5, 1) + coneGeometry.translate(0, -0.5, 0) + } + + this.position.copy(origin) + + this.line = new Line(lineGeometry, new LineBasicMaterial({ color: color })) + this.line.matrixAutoUpdate = false + this.add(this.line) + + this.cone = new Mesh(coneGeometry, new MeshBasicMaterial({ color: color })) + this.cone.matrixAutoUpdate = false + this.add(this.cone) + + this.setDirection(dir) + this.setLength(length, headLength, headWidth) + } + + ArrowHelper.prototype = Object.create(Object3D.prototype) + ArrowHelper.prototype.constructor = ArrowHelper + + ArrowHelper.prototype.setDirection = (function () { + var axis = new Vector3() + var radians + + return function setDirection(dir) { + // dir is assumed to be normalized + + if (dir.y > 0.99999) { + this.quaternion.set(0, 0, 0, 1) + } else if (dir.y < -0.99999) { + this.quaternion.set(1, 0, 0, 0) + } else { + axis.set(dir.z, 0, -dir.x).normalize() + + radians = Math.acos(dir.y) + + this.quaternion.setFromAxisAngle(axis, radians) + } + } + })() + + ArrowHelper.prototype.setLength = function (length, headLength, headWidth) { + if (headLength === undefined) headLength = 0.2 * length + if (headWidth === undefined) headWidth = 0.2 * headLength + + this.line.scale.set(1, Math.max(0, length - headLength), 1) + this.line.updateMatrix() + + this.cone.scale.set(headWidth, headLength, headWidth) + this.cone.position.y = length + this.cone.updateMatrix() + } + + ArrowHelper.prototype.setColor = function (color) { + this.line.material.color.copy(color) + this.cone.material.color.copy(color) + } + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxesHelper(size) { + size = size || 1 + + var vertices = [0, 0, 0, size, 0, 0, 0, 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size] + + var colors = [1, 0, 0, 1, 0.6, 0, 0, 1, 0, 0.6, 1, 0, 0, 0, 1, 0, 0.6, 1] + + var geometry = new BufferGeometry() + geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3)) + geometry.addAttribute('color', new Float32BufferAttribute(colors, 3)) + + var material = new LineBasicMaterial({ vertexColors: VertexColors }) + + LineSegments.call(this, geometry, material) + } + + AxesHelper.prototype = Object.create(LineSegments.prototype) + AxesHelper.prototype.constructor = AxesHelper + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4(a, b, c, d, normal, color, materialIndex) { + console.warn('THREE.Face4 has been removed. A THREE.Face3 will be created instead.') + return new Face3(a, b, c, normal, color, materialIndex) + } + + var LineStrip = 0 + + var LinePieces = 1 + + function MeshFaceMaterial(materials) { + console.warn('THREE.MeshFaceMaterial has been removed. Use an Array instead.') + return materials + } + + function MultiMaterial(materials) { + if (materials === undefined) materials = [] + + console.warn('THREE.MultiMaterial has been removed. Use an Array instead.') + materials.isMultiMaterial = true + materials.materials = materials + materials.clone = function () { + return materials.slice() + } + return materials + } + + function PointCloud(geometry, material) { + console.warn('THREE.PointCloud has been renamed to THREE.Points.') + return new Points(geometry, material) + } + + function Particle(material) { + console.warn('THREE.Particle has been renamed to THREE.Sprite.') + return new Sprite(material) + } + + function ParticleSystem(geometry, material) { + console.warn('THREE.ParticleSystem has been renamed to THREE.Points.') + return new Points(geometry, material) + } + + function PointCloudMaterial(parameters) { + console.warn('THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.') + return new PointsMaterial(parameters) + } + + function ParticleBasicMaterial(parameters) { + console.warn('THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.') + return new PointsMaterial(parameters) + } + + function ParticleSystemMaterial(parameters) { + console.warn('THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.') + return new PointsMaterial(parameters) + } + + function Vertex(x, y, z) { + console.warn('THREE.Vertex has been removed. Use THREE.Vector3 instead.') + return new Vector3(x, y, z) + } + + // + + function DynamicBufferAttribute(array, itemSize) { + console.warn( + 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' + ) + return new BufferAttribute(array, itemSize).setDynamic(true) + } + + function Int8Attribute(array, itemSize) { + console.warn( + 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' + ) + return new Int8BufferAttribute(array, itemSize) + } + + function Uint8Attribute(array, itemSize) { + console.warn( + 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' + ) + return new Uint8BufferAttribute(array, itemSize) + } + + function Uint8ClampedAttribute(array, itemSize) { + console.warn( + 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' + ) + return new Uint8ClampedBufferAttribute(array, itemSize) + } + + function Int16Attribute(array, itemSize) { + console.warn( + 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' + ) + return new Int16BufferAttribute(array, itemSize) + } + + function Uint16Attribute(array, itemSize) { + console.warn( + 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' + ) + return new Uint16BufferAttribute(array, itemSize) + } + + function Int32Attribute(array, itemSize) { + console.warn( + 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' + ) + return new Int32BufferAttribute(array, itemSize) + } + + function Uint32Attribute(array, itemSize) { + console.warn( + 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' + ) + return new Uint32BufferAttribute(array, itemSize) + } + + function Float32Attribute(array, itemSize) { + console.warn( + 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' + ) + return new Float32BufferAttribute(array, itemSize) + } + + function Float64Attribute(array, itemSize) { + console.warn( + 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' + ) + return new Float64BufferAttribute(array, itemSize) + } + + // + + Curve.create = function (construct, getPoint) { + console.log('THREE.Curve.create() has been deprecated') + + construct.prototype = Object.create(Curve.prototype) + construct.prototype.constructor = construct + construct.prototype.getPoint = getPoint + + return construct + } + + // + + Object.assign(CurvePath.prototype, { + createPointsGeometry: function (divisions) { + console.warn( + 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' + ) + + // generate geometry from path points (for Line or Points objects) + + var pts = this.getPoints(divisions) + return this.createGeometry(pts) + }, + + createSpacedPointsGeometry: function (divisions) { + console.warn( + 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' + ) + + // generate geometry from equidistant sampling along the path + + var pts = this.getSpacedPoints(divisions) + return this.createGeometry(pts) + }, + + createGeometry: function (points) { + console.warn( + 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' + ) + + var geometry = new Geometry() + + for (var i = 0, l = points.length; i < l; i++) { + var point = points[i] + geometry.vertices.push(new Vector3(point.x, point.y, point.z || 0)) + } + + return geometry + } + }) + + // + + Object.assign(Path.prototype, { + fromPoints: function (points) { + console.warn('THREE.Path: .fromPoints() has been renamed to .setFromPoints().') + this.setFromPoints(points) + } + }) + + // + + function ClosedSplineCurve3(points) { + console.warn( + 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' + ) + + CatmullRomCurve3.call(this, points) + this.type = 'catmullrom' + this.closed = true + } + + ClosedSplineCurve3.prototype = Object.create(CatmullRomCurve3.prototype) + + // + + function SplineCurve3(points) { + console.warn('THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.') + + CatmullRomCurve3.call(this, points) + this.type = 'catmullrom' + } + + SplineCurve3.prototype = Object.create(CatmullRomCurve3.prototype) + + // + + function Spline(points) { + console.warn('THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.') + + CatmullRomCurve3.call(this, points) + this.type = 'catmullrom' + } + + Spline.prototype = Object.create(CatmullRomCurve3.prototype) + + Object.assign(Spline.prototype, { + initFromArray: function (/* a */) { + console.error('THREE.Spline: .initFromArray() has been removed.') + }, + getControlPointsArray: function (/* optionalTarget */) { + console.error('THREE.Spline: .getControlPointsArray() has been removed.') + }, + reparametrizeByArcLength: function (/* samplingCoef */) { + console.error('THREE.Spline: .reparametrizeByArcLength() has been removed.') + } + }) + + // + + function AxisHelper(size) { + console.warn('THREE.AxisHelper has been renamed to THREE.AxesHelper.') + return new AxesHelper(size) + } + + function BoundingBoxHelper(object, color) { + console.warn('THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.') + return new BoxHelper(object, color) + } + + function EdgesHelper(object, hex) { + console.warn('THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.') + return new LineSegments( + new EdgesGeometry(object.geometry), + new LineBasicMaterial({ color: hex !== undefined ? hex : 0xffffff }) + ) + } + + GridHelper.prototype.setColors = function () { + console.error( + 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' + ) + } + + SkeletonHelper.prototype.update = function () { + console.error('THREE.SkeletonHelper: update() no longer needs to be called.') + } + + function WireframeHelper(object, hex) { + console.warn('THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.') + return new LineSegments( + new WireframeGeometry(object.geometry), + new LineBasicMaterial({ color: hex !== undefined ? hex : 0xffffff }) + ) + } + + // + + Object.assign(Loader.prototype, { + extractUrlBase: function (url) { + console.warn( + 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' + ) + return LoaderUtils.extractUrlBase(url) + } + }) + + function XHRLoader(manager) { + console.warn('THREE.XHRLoader has been renamed to THREE.FileLoader.') + return new FileLoader(manager) + } + + function BinaryTextureLoader(manager) { + console.warn('THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.') + return new DataTextureLoader(manager) + } + + // + + Object.assign(Box2.prototype, { + center: function (optionalTarget) { + console.warn('THREE.Box2: .center() has been renamed to .getCenter().') + return this.getCenter(optionalTarget) + }, + empty: function () { + console.warn('THREE.Box2: .empty() has been renamed to .isEmpty().') + return this.isEmpty() + }, + isIntersectionBox: function (box) { + console.warn('THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().') + return this.intersectsBox(box) + }, + size: function (optionalTarget) { + console.warn('THREE.Box2: .size() has been renamed to .getSize().') + return this.getSize(optionalTarget) + } + }) + + Object.assign(Box3.prototype, { + center: function (optionalTarget) { + console.warn('THREE.Box3: .center() has been renamed to .getCenter().') + return this.getCenter(optionalTarget) + }, + empty: function () { + console.warn('THREE.Box3: .empty() has been renamed to .isEmpty().') + return this.isEmpty() + }, + isIntersectionBox: function (box) { + console.warn('THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().') + return this.intersectsBox(box) + }, + isIntersectionSphere: function (sphere) { + console.warn('THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().') + return this.intersectsSphere(sphere) + }, + size: function (optionalTarget) { + console.warn('THREE.Box3: .size() has been renamed to .getSize().') + return this.getSize(optionalTarget) + } + }) + + Line3.prototype.center = function (optionalTarget) { + console.warn('THREE.Line3: .center() has been renamed to .getCenter().') + return this.getCenter(optionalTarget) + } + + Object.assign(_Math, { + random16: function () { + console.warn('THREE.Math: .random16() has been deprecated. Use Math.random() instead.') + return Math.random() + }, + + nearestPowerOfTwo: function (value) { + console.warn('THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().') + return _Math.floorPowerOfTwo(value) + }, + + nextPowerOfTwo: function (value) { + console.warn('THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().') + return _Math.ceilPowerOfTwo(value) + } + }) + + Object.assign(Matrix3.prototype, { + flattenToArrayOffset: function (array, offset) { + console.warn( + 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' + ) + return this.toArray(array, offset) + }, + multiplyVector3: function (vector) { + console.warn( + 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' + ) + return vector.applyMatrix3(this) + }, + multiplyVector3Array: function (/* a */) { + console.error('THREE.Matrix3: .multiplyVector3Array() has been removed.') + }, + applyToBuffer: function (buffer /*, offset, length */) { + console.warn( + 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' + ) + return this.applyToBufferAttribute(buffer) + }, + applyToVector3Array: function (/* array, offset, length */) { + console.error('THREE.Matrix3: .applyToVector3Array() has been removed.') + } + }) + + Object.assign(Matrix4.prototype, { + extractPosition: function (m) { + console.warn('THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().') + return this.copyPosition(m) + }, + flattenToArrayOffset: function (array, offset) { + console.warn( + 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' + ) + return this.toArray(array, offset) + }, + getPosition: (function () { + var v1 + + return function getPosition() { + if (v1 === undefined) v1 = new Vector3() + console.warn( + 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' + ) + return v1.setFromMatrixColumn(this, 3) + } + })(), + setRotationFromQuaternion: function (q) { + console.warn( + 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' + ) + return this.makeRotationFromQuaternion(q) + }, + multiplyToArray: function () { + console.warn('THREE.Matrix4: .multiplyToArray() has been removed.') + }, + multiplyVector3: function (vector) { + console.warn( + 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' + ) + return vector.applyMatrix4(this) + }, + multiplyVector4: function (vector) { + console.warn( + 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' + ) + return vector.applyMatrix4(this) + }, + multiplyVector3Array: function (/* a */) { + console.error('THREE.Matrix4: .multiplyVector3Array() has been removed.') + }, + rotateAxis: function (v) { + console.warn( + 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' + ) + v.transformDirection(this) + }, + crossVector: function (vector) { + console.warn( + 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' + ) + return vector.applyMatrix4(this) + }, + translate: function () { + console.error('THREE.Matrix4: .translate() has been removed.') + }, + rotateX: function () { + console.error('THREE.Matrix4: .rotateX() has been removed.') + }, + rotateY: function () { + console.error('THREE.Matrix4: .rotateY() has been removed.') + }, + rotateZ: function () { + console.error('THREE.Matrix4: .rotateZ() has been removed.') + }, + rotateByAxis: function () { + console.error('THREE.Matrix4: .rotateByAxis() has been removed.') + }, + applyToBuffer: function (buffer /*, offset, length */) { + console.warn( + 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' + ) + return this.applyToBufferAttribute(buffer) + }, + applyToVector3Array: function (/* array, offset, length */) { + console.error('THREE.Matrix4: .applyToVector3Array() has been removed.') + }, + makeFrustum: function (left, right, bottom, top, near, far) { + console.warn( + 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' + ) + return this.makePerspective(left, right, top, bottom, near, far) + } + }) + + Plane.prototype.isIntersectionLine = function (line) { + console.warn('THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().') + return this.intersectsLine(line) + } + + Quaternion.prototype.multiplyVector3 = function (vector) { + console.warn( + 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' + ) + return vector.applyQuaternion(this) + } + + Object.assign(Ray.prototype, { + isIntersectionBox: function (box) { + console.warn('THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().') + return this.intersectsBox(box) + }, + isIntersectionPlane: function (plane) { + console.warn('THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().') + return this.intersectsPlane(plane) + }, + isIntersectionSphere: function (sphere) { + console.warn('THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().') + return this.intersectsSphere(sphere) + } + }) + + Object.assign(Shape.prototype, { + extractAllPoints: function (divisions) { + console.warn( + 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' + ) + return this.extractPoints(divisions) + }, + extrude: function (options) { + console.warn('THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.') + return new ExtrudeGeometry(this, options) + }, + makeGeometry: function (options) { + console.warn('THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.') + return new ShapeGeometry(this, options) + } + }) + + Object.assign(Vector2.prototype, { + fromAttribute: function (attribute, index, offset) { + console.warn('THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().') + return this.fromBufferAttribute(attribute, index, offset) + }, + distanceToManhattan: function (v) { + console.warn( + 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' + ) + return this.manhattanDistanceTo(v) + }, + lengthManhattan: function () { + console.warn('THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().') + return this.manhattanLength() + } + }) + + Object.assign(Vector3.prototype, { + setEulerFromRotationMatrix: function () { + console.error( + 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' + ) + }, + setEulerFromQuaternion: function () { + console.error( + 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' + ) + }, + getPositionFromMatrix: function (m) { + console.warn( + 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' + ) + return this.setFromMatrixPosition(m) + }, + getScaleFromMatrix: function (m) { + console.warn( + 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' + ) + return this.setFromMatrixScale(m) + }, + getColumnFromMatrix: function (index, matrix) { + console.warn( + 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' + ) + return this.setFromMatrixColumn(matrix, index) + }, + applyProjection: function (m) { + console.warn( + 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' + ) + return this.applyMatrix4(m) + }, + fromAttribute: function (attribute, index, offset) { + console.warn('THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().') + return this.fromBufferAttribute(attribute, index, offset) + }, + distanceToManhattan: function (v) { + console.warn( + 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' + ) + return this.manhattanDistanceTo(v) + }, + lengthManhattan: function () { + console.warn('THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().') + return this.manhattanLength() + } + }) + + Object.assign(Vector4.prototype, { + fromAttribute: function (attribute, index, offset) { + console.warn('THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().') + return this.fromBufferAttribute(attribute, index, offset) + }, + lengthManhattan: function () { + console.warn('THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().') + return this.manhattanLength() + } + }) + + // + + Object.assign(Geometry.prototype, { + computeTangents: function () { + console.error('THREE.Geometry: .computeTangents() has been removed.') + }, + computeLineDistances: function () { + console.error( + 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' + ) + } + }) + + Object.assign(Object3D.prototype, { + getChildByName: function (name) { + console.warn('THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().') + return this.getObjectByName(name) + }, + renderDepth: function () { + console.warn('THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.') + }, + translate: function (distance, axis) { + console.warn( + 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' + ) + return this.translateOnAxis(axis, distance) + } + }) + + Object.defineProperties(Object3D.prototype, { + eulerOrder: { + get: function () { + console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.') + return this.rotation.order + }, + set: function (value) { + console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.') + this.rotation.order = value + } + }, + useQuaternion: { + get: function () { + console.warn( + 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' + ) + }, + set: function () { + console.warn( + 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' + ) + } + } + }) + + Object.defineProperties(LOD.prototype, { + objects: { + get: function () { + console.warn('THREE.LOD: .objects has been renamed to .levels.') + return this.levels + } + } + }) + + Object.defineProperty(Skeleton.prototype, 'useVertexTexture', { + get: function () { + console.warn('THREE.Skeleton: useVertexTexture has been removed.') + }, + set: function () { + console.warn('THREE.Skeleton: useVertexTexture has been removed.') + } + }) + + Object.defineProperty(Curve.prototype, '__arcLengthDivisions', { + get: function () { + console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.') + return this.arcLengthDivisions + }, + set: function (value) { + console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.') + this.arcLengthDivisions = value + } + }) + + // + + PerspectiveCamera.prototype.setLens = function (focalLength, filmGauge) { + console.warn( + 'THREE.PerspectiveCamera.setLens is deprecated. ' + + 'Use .setFocalLength and .filmGauge for a photographic setup.' + ) + + if (filmGauge !== undefined) this.filmGauge = filmGauge + this.setFocalLength(focalLength) + } + + // + + Object.defineProperties(Light.prototype, { + onlyShadow: { + set: function () { + console.warn('THREE.Light: .onlyShadow has been removed.') + } + }, + shadowCameraFov: { + set: function (value) { + console.warn('THREE.Light: .shadowCameraFov is now .shadow.camera.fov.') + this.shadow.camera.fov = value + } + }, + shadowCameraLeft: { + set: function (value) { + console.warn('THREE.Light: .shadowCameraLeft is now .shadow.camera.left.') + this.shadow.camera.left = value + } + }, + shadowCameraRight: { + set: function (value) { + console.warn('THREE.Light: .shadowCameraRight is now .shadow.camera.right.') + this.shadow.camera.right = value + } + }, + shadowCameraTop: { + set: function (value) { + console.warn('THREE.Light: .shadowCameraTop is now .shadow.camera.top.') + this.shadow.camera.top = value + } + }, + shadowCameraBottom: { + set: function (value) { + console.warn('THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.') + this.shadow.camera.bottom = value + } + }, + shadowCameraNear: { + set: function (value) { + console.warn('THREE.Light: .shadowCameraNear is now .shadow.camera.near.') + this.shadow.camera.near = value + } + }, + shadowCameraFar: { + set: function (value) { + console.warn('THREE.Light: .shadowCameraFar is now .shadow.camera.far.') + this.shadow.camera.far = value + } + }, + shadowCameraVisible: { + set: function () { + console.warn( + 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' + ) + } + }, + shadowBias: { + set: function (value) { + console.warn('THREE.Light: .shadowBias is now .shadow.bias.') + this.shadow.bias = value + } + }, + shadowDarkness: { + set: function () { + console.warn('THREE.Light: .shadowDarkness has been removed.') + } + }, + shadowMapWidth: { + set: function (value) { + console.warn('THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.') + this.shadow.mapSize.width = value + } + }, + shadowMapHeight: { + set: function (value) { + console.warn('THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.') + this.shadow.mapSize.height = value + } + } + }) + + // + + Object.defineProperties(BufferAttribute.prototype, { + length: { + get: function () { + console.warn('THREE.BufferAttribute: .length has been deprecated. Use .count instead.') + return this.array.length + } + } + }) + + Object.assign(BufferGeometry.prototype, { + addIndex: function (index) { + console.warn('THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().') + this.setIndex(index) + }, + addDrawCall: function (start, count, indexOffset) { + if (indexOffset !== undefined) { + console.warn('THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.') + } + console.warn('THREE.BufferGeometry: .addDrawCall() is now .addGroup().') + this.addGroup(start, count) + }, + clearDrawCalls: function () { + console.warn('THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().') + this.clearGroups() + }, + computeTangents: function () { + console.warn('THREE.BufferGeometry: .computeTangents() has been removed.') + }, + computeOffsets: function () { + console.warn('THREE.BufferGeometry: .computeOffsets() has been removed.') + } + }) + + Object.defineProperties(BufferGeometry.prototype, { + drawcalls: { + get: function () { + console.error('THREE.BufferGeometry: .drawcalls has been renamed to .groups.') + return this.groups + } + }, + offsets: { + get: function () { + console.warn('THREE.BufferGeometry: .offsets has been renamed to .groups.') + return this.groups + } + } + }) + + // + + Object.defineProperties(Uniform.prototype, { + dynamic: { + set: function () { + console.warn( + 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' + ) + } + }, + onUpdate: { + value: function () { + console.warn( + 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' + ) + return this + } + } + }) + + // + + Object.defineProperties(Material.prototype, { + wrapAround: { + get: function () { + console.warn('THREE.Material: .wrapAround has been removed.') + }, + set: function () { + console.warn('THREE.Material: .wrapAround has been removed.') + } + }, + wrapRGB: { + get: function () { + console.warn('THREE.Material: .wrapRGB has been removed.') + return new Color() + } + }, + + shading: { + get: function () { + console.error( + 'THREE.' + + this.type + + ': .shading has been removed. Use the boolean .flatShading instead.' + ) + }, + set: function (value) { + console.warn( + 'THREE.' + + this.type + + ': .shading has been removed. Use the boolean .flatShading instead.' + ) + this.flatShading = value === FlatShading + } + } + }) + + Object.defineProperties(MeshPhongMaterial.prototype, { + metal: { + get: function () { + console.warn( + 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' + ) + return false + }, + set: function () { + console.warn( + 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' + ) + } + } + }) + + Object.defineProperties(ShaderMaterial.prototype, { + derivatives: { + get: function () { + console.warn( + 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' + ) + return this.extensions.derivatives + }, + set: function (value) { + console.warn( + 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' + ) + this.extensions.derivatives = value + } + } + }) + + // + + Object.assign(WebGLRenderer.prototype, { + getCurrentRenderTarget: function () { + console.warn('THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().') + return this.getRenderTarget() + }, + + getMaxAnisotropy: function () { + console.warn( + 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' + ) + return this.capabilities.getMaxAnisotropy() + }, + + getPrecision: function () { + console.warn('THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.') + return this.capabilities.precision + }, + + resetGLState: function () { + console.warn('THREE.WebGLRenderer: .resetGLState() is now .state.reset().') + return this.state.reset() + }, + + supportsFloatTextures: function () { + console.warn( + "THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )." + ) + return this.extensions.get('OES_texture_float') + }, + supportsHalfFloatTextures: function () { + console.warn( + "THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )." + ) + return this.extensions.get('OES_texture_half_float') + }, + supportsStandardDerivatives: function () { + console.warn( + "THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )." + ) + return this.extensions.get('OES_standard_derivatives') + }, + supportsCompressedTextureS3TC: function () { + console.warn( + "THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )." + ) + return this.extensions.get('WEBGL_compressed_texture_s3tc') + }, + supportsCompressedTexturePVRTC: function () { + console.warn( + "THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )." + ) + return this.extensions.get('WEBGL_compressed_texture_pvrtc') + }, + supportsBlendMinMax: function () { + console.warn( + "THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )." + ) + return this.extensions.get('EXT_blend_minmax') + }, + supportsVertexTextures: function () { + console.warn( + 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' + ) + return this.capabilities.vertexTextures + }, + supportsInstancedArrays: function () { + console.warn( + "THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )." + ) + return this.extensions.get('ANGLE_instanced_arrays') + }, + enableScissorTest: function (boolean) { + console.warn('THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().') + this.setScissorTest(boolean) + }, + initMaterial: function () { + console.warn('THREE.WebGLRenderer: .initMaterial() has been removed.') + }, + addPrePlugin: function () { + console.warn('THREE.WebGLRenderer: .addPrePlugin() has been removed.') + }, + addPostPlugin: function () { + console.warn('THREE.WebGLRenderer: .addPostPlugin() has been removed.') + }, + updateShadowMap: function () { + console.warn('THREE.WebGLRenderer: .updateShadowMap() has been removed.') + }, + setFaceCulling: function () { + console.warn('THREE.WebGLRenderer: .setFaceCulling() has been removed.') + } + }) + + Object.defineProperties(WebGLRenderer.prototype, { + shadowMapEnabled: { + get: function () { + return this.shadowMap.enabled + }, + set: function (value) { + console.warn('THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.') + this.shadowMap.enabled = value + } + }, + shadowMapType: { + get: function () { + return this.shadowMap.type + }, + set: function (value) { + console.warn('THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.') + this.shadowMap.type = value + } + }, + shadowMapCullFace: { + get: function () { + console.warn( + 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' + ) + return undefined + }, + set: function (/* value */) { + console.warn( + 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' + ) + } + } + }) + + Object.defineProperties(WebGLShadowMap.prototype, { + cullFace: { + get: function () { + console.warn( + 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' + ) + return undefined + }, + set: function (/* cullFace */) { + console.warn( + 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' + ) + } + }, + renderReverseSided: { + get: function () { + console.warn( + 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' + ) + return undefined + }, + set: function () { + console.warn( + 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' + ) + } + }, + renderSingleSided: { + get: function () { + console.warn( + 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' + ) + return undefined + }, + set: function () { + console.warn( + 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' + ) + } + } + }) + + // + + Object.defineProperties(WebGLRenderTarget.prototype, { + wrapS: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.') + return this.texture.wrapS + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.') + this.texture.wrapS = value + } + }, + wrapT: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.') + return this.texture.wrapT + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.') + this.texture.wrapT = value + } + }, + magFilter: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.') + return this.texture.magFilter + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.') + this.texture.magFilter = value + } + }, + minFilter: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.') + return this.texture.minFilter + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.') + this.texture.minFilter = value + } + }, + anisotropy: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.') + return this.texture.anisotropy + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.') + this.texture.anisotropy = value + } + }, + offset: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.') + return this.texture.offset + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.') + this.texture.offset = value + } + }, + repeat: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.') + return this.texture.repeat + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.') + this.texture.repeat = value + } + }, + format: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.') + return this.texture.format + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.') + this.texture.format = value + } + }, + type: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.') + return this.texture.type + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.') + this.texture.type = value + } + }, + generateMipmaps: { + get: function () { + console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.') + return this.texture.generateMipmaps + }, + set: function (value) { + console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.') + this.texture.generateMipmaps = value + } + } + }) + + // + + Object.defineProperties(WebVRManager.prototype, { + standing: { + set: function (/* value */) { + console.warn('THREE.WebVRManager: .standing has been removed.') + } + } + }) + + // + + Audio.prototype.load = function (file) { + console.warn('THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.') + var scope = this + var audioLoader = new AudioLoader() + audioLoader.load(file, function (buffer) { + scope.setBuffer(buffer) + }) + return this + } + + AudioAnalyser.prototype.getData = function () { + console.warn('THREE.AudioAnalyser: .getData() is now .getFrequencyData().') + return this.getFrequencyData() + } + + // + + CubeCamera.prototype.updateCubeMap = function (renderer, scene) { + console.warn('THREE.CubeCamera: .updateCubeMap() is now .update().') + return this.update(renderer, scene) + } + + // + + var GeometryUtils = { + merge: function (geometry1, geometry2, materialIndexOffset) { + console.warn( + 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' + ) + var matrix + + if (geometry2.isMesh) { + geometry2.matrixAutoUpdate && geometry2.updateMatrix() + + matrix = geometry2.matrix + geometry2 = geometry2.geometry + } + + geometry1.merge(geometry2, matrix, materialIndexOffset) + }, + + center: function (geometry) { + console.warn( + 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' + ) + return geometry.center() + } + } + + var ImageUtils = { + crossOrigin: undefined, + + loadTexture: function (url, mapping, onLoad, onError) { + console.warn( + 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' + ) + + var loader = new TextureLoader() + loader.setCrossOrigin(this.crossOrigin) + + var texture = loader.load(url, onLoad, undefined, onError) + + if (mapping) texture.mapping = mapping + + return texture + }, + + loadTextureCube: function (urls, mapping, onLoad, onError) { + console.warn( + 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' + ) + + var loader = new CubeTextureLoader() + loader.setCrossOrigin(this.crossOrigin) + + var texture = loader.load(urls, onLoad, undefined, onError) + + if (mapping) texture.mapping = mapping + + return texture + }, + + 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.' + ) + } + } + + // + + function Projector() { + console.error('THREE.Projector has been moved to /examples/js/renderers/Projector.js.') + + this.projectVector = function (vector, camera) { + console.warn('THREE.Projector: .projectVector() is now vector.project().') + vector.project(camera) + } + + this.unprojectVector = function (vector, camera) { + console.warn('THREE.Projector: .unprojectVector() is now vector.unproject().') + vector.unproject(camera) + } + + this.pickingRay = function () { + console.error('THREE.Projector: .pickingRay() is now raycaster.setFromCamera().') + } + } + + // + + function CanvasRenderer() { + console.error('THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js') + + this.domElement = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas') + this.clear = function () {} + this.render = function () {} + this.setClearColor = function () {} + this.setSize = function () {} + } + + // + + var SceneUtils = { + createMultiMaterialObject: function (/* geometry, materials */) { + console.error('THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js') + }, + + detach: function (/* child, parent, scene */) { + console.error('THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js') + }, + + attach: function (/* child, scene, parent */) { + console.error('THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js') + } + } + + // + + function LensFlare() { + console.error('THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js') + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube + exports.WebGLRenderTarget = WebGLRenderTarget + exports.WebGLRenderer = WebGLRenderer + exports.ShaderLib = ShaderLib + exports.UniformsLib = UniformsLib + exports.UniformsUtils = UniformsUtils + exports.ShaderChunk = ShaderChunk + exports.FogExp2 = FogExp2 + exports.Fog = Fog + exports.Scene = Scene + exports.Sprite = Sprite + exports.LOD = LOD + exports.SkinnedMesh = SkinnedMesh + exports.Skeleton = Skeleton + exports.Bone = Bone + exports.Mesh = Mesh + exports.LineSegments = LineSegments + exports.LineLoop = LineLoop + exports.Line = Line + exports.Points = Points + exports.Group = Group + exports.VideoTexture = VideoTexture + exports.DataTexture = DataTexture + exports.CompressedTexture = CompressedTexture + exports.CubeTexture = CubeTexture + exports.CanvasTexture = CanvasTexture + exports.DepthTexture = DepthTexture + exports.Texture = Texture + exports.CompressedTextureLoader = CompressedTextureLoader + exports.DataTextureLoader = DataTextureLoader + exports.CubeTextureLoader = CubeTextureLoader + exports.TextureLoader = TextureLoader + exports.ObjectLoader = ObjectLoader + exports.MaterialLoader = MaterialLoader + exports.BufferGeometryLoader = BufferGeometryLoader + exports.DefaultLoadingManager = DefaultLoadingManager + exports.LoadingManager = LoadingManager + exports.JSONLoader = JSONLoader + exports.ImageLoader = ImageLoader + exports.ImageBitmapLoader = ImageBitmapLoader + exports.FontLoader = FontLoader + exports.FileLoader = FileLoader + exports.Loader = Loader + exports.LoaderUtils = LoaderUtils + exports.Cache = Cache + exports.AudioLoader = AudioLoader + exports.SpotLightShadow = SpotLightShadow + exports.SpotLight = SpotLight + exports.PointLight = PointLight + exports.RectAreaLight = RectAreaLight + exports.HemisphereLight = HemisphereLight + exports.DirectionalLightShadow = DirectionalLightShadow + exports.DirectionalLight = DirectionalLight + exports.AmbientLight = AmbientLight + exports.LightShadow = LightShadow + exports.Light = Light + exports.StereoCamera = StereoCamera + exports.PerspectiveCamera = PerspectiveCamera + exports.OrthographicCamera = OrthographicCamera + exports.CubeCamera = CubeCamera + exports.ArrayCamera = ArrayCamera + exports.Camera = Camera + exports.AudioListener = AudioListener + exports.PositionalAudio = PositionalAudio + exports.AudioContext = AudioContext + exports.AudioAnalyser = AudioAnalyser + exports.Audio = Audio + exports.VectorKeyframeTrack = VectorKeyframeTrack + exports.StringKeyframeTrack = StringKeyframeTrack + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack + exports.NumberKeyframeTrack = NumberKeyframeTrack + exports.ColorKeyframeTrack = ColorKeyframeTrack + exports.BooleanKeyframeTrack = BooleanKeyframeTrack + exports.PropertyMixer = PropertyMixer + exports.PropertyBinding = PropertyBinding + exports.KeyframeTrack = KeyframeTrack + exports.AnimationUtils = AnimationUtils + exports.AnimationObjectGroup = AnimationObjectGroup + exports.AnimationMixer = AnimationMixer + exports.AnimationClip = AnimationClip + exports.Uniform = Uniform + exports.InstancedBufferGeometry = InstancedBufferGeometry + exports.BufferGeometry = BufferGeometry + exports.Geometry = Geometry + exports.InterleavedBufferAttribute = InterleavedBufferAttribute + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer + exports.InterleavedBuffer = InterleavedBuffer + exports.InstancedBufferAttribute = InstancedBufferAttribute + exports.Face3 = Face3 + exports.Object3D = Object3D + exports.Raycaster = Raycaster + exports.Layers = Layers + exports.EventDispatcher = EventDispatcher + exports.Clock = Clock + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant + exports.LinearInterpolant = LinearInterpolant + exports.DiscreteInterpolant = DiscreteInterpolant + exports.CubicInterpolant = CubicInterpolant + exports.Interpolant = Interpolant + exports.Triangle = Triangle + exports.Math = _Math + exports.Spherical = Spherical + exports.Cylindrical = Cylindrical + exports.Plane = Plane + exports.Frustum = Frustum + exports.Sphere = Sphere + exports.Ray = Ray + exports.Matrix4 = Matrix4 + exports.Matrix3 = Matrix3 + exports.Box3 = Box3 + exports.Box2 = Box2 + exports.Line3 = Line3 + exports.Euler = Euler + exports.Vector4 = Vector4 + exports.Vector3 = Vector3 + exports.Vector2 = Vector2 + exports.Quaternion = Quaternion + exports.Color = Color + exports.ImmediateRenderObject = ImmediateRenderObject + exports.VertexNormalsHelper = VertexNormalsHelper + exports.SpotLightHelper = SpotLightHelper + exports.SkeletonHelper = SkeletonHelper + exports.PointLightHelper = PointLightHelper + exports.RectAreaLightHelper = RectAreaLightHelper + exports.HemisphereLightHelper = HemisphereLightHelper + exports.GridHelper = GridHelper + exports.PolarGridHelper = PolarGridHelper + exports.FaceNormalsHelper = FaceNormalsHelper + exports.DirectionalLightHelper = DirectionalLightHelper + exports.CameraHelper = CameraHelper + exports.BoxHelper = BoxHelper + exports.Box3Helper = Box3Helper + exports.PlaneHelper = PlaneHelper + exports.ArrowHelper = ArrowHelper + exports.AxesHelper = AxesHelper + exports.Shape = Shape + exports.Path = Path + exports.ShapePath = ShapePath + exports.Font = Font + exports.CurvePath = CurvePath + exports.Curve = Curve + exports.ShapeUtils = ShapeUtils + exports.WebGLUtils = WebGLUtils + exports.WireframeGeometry = WireframeGeometry + exports.ParametricGeometry = ParametricGeometry + exports.ParametricBufferGeometry = ParametricBufferGeometry + exports.TetrahedronGeometry = TetrahedronGeometry + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry + exports.OctahedronGeometry = OctahedronGeometry + exports.OctahedronBufferGeometry = OctahedronBufferGeometry + exports.IcosahedronGeometry = IcosahedronGeometry + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry + exports.DodecahedronGeometry = DodecahedronGeometry + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry + exports.PolyhedronGeometry = PolyhedronGeometry + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry + exports.TubeGeometry = TubeGeometry + exports.TubeBufferGeometry = TubeBufferGeometry + exports.TorusKnotGeometry = TorusKnotGeometry + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry + exports.TorusGeometry = TorusGeometry + exports.TorusBufferGeometry = TorusBufferGeometry + exports.TextGeometry = TextGeometry + exports.TextBufferGeometry = TextBufferGeometry + exports.SphereGeometry = SphereGeometry + exports.SphereBufferGeometry = SphereBufferGeometry + exports.RingGeometry = RingGeometry + exports.RingBufferGeometry = RingBufferGeometry + exports.PlaneGeometry = PlaneGeometry + exports.PlaneBufferGeometry = PlaneBufferGeometry + exports.LatheGeometry = LatheGeometry + exports.LatheBufferGeometry = LatheBufferGeometry + exports.ShapeGeometry = ShapeGeometry + exports.ShapeBufferGeometry = ShapeBufferGeometry + exports.ExtrudeGeometry = ExtrudeGeometry + exports.ExtrudeBufferGeometry = ExtrudeBufferGeometry + exports.EdgesGeometry = EdgesGeometry + exports.ConeGeometry = ConeGeometry + exports.ConeBufferGeometry = ConeBufferGeometry + exports.CylinderGeometry = CylinderGeometry + exports.CylinderBufferGeometry = CylinderBufferGeometry + exports.CircleGeometry = CircleGeometry + exports.CircleBufferGeometry = CircleBufferGeometry + exports.BoxGeometry = BoxGeometry + exports.BoxBufferGeometry = BoxBufferGeometry + exports.ShadowMaterial = ShadowMaterial + exports.SpriteMaterial = SpriteMaterial + exports.RawShaderMaterial = RawShaderMaterial + exports.ShaderMaterial = ShaderMaterial + exports.PointsMaterial = PointsMaterial + exports.MeshPhysicalMaterial = MeshPhysicalMaterial + exports.MeshStandardMaterial = MeshStandardMaterial + exports.MeshPhongMaterial = MeshPhongMaterial + exports.MeshToonMaterial = MeshToonMaterial + exports.MeshNormalMaterial = MeshNormalMaterial + exports.MeshLambertMaterial = MeshLambertMaterial + exports.MeshDepthMaterial = MeshDepthMaterial + exports.MeshDistanceMaterial = MeshDistanceMaterial + exports.MeshBasicMaterial = MeshBasicMaterial + exports.LineDashedMaterial = LineDashedMaterial + exports.LineBasicMaterial = LineBasicMaterial + exports.Material = Material + exports.Float64BufferAttribute = Float64BufferAttribute + exports.Float32BufferAttribute = Float32BufferAttribute + exports.Uint32BufferAttribute = Uint32BufferAttribute + exports.Int32BufferAttribute = Int32BufferAttribute + exports.Uint16BufferAttribute = Uint16BufferAttribute + exports.Int16BufferAttribute = Int16BufferAttribute + exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute + exports.Uint8BufferAttribute = Uint8BufferAttribute + exports.Int8BufferAttribute = Int8BufferAttribute + exports.BufferAttribute = BufferAttribute + exports.ArcCurve = ArcCurve + exports.CatmullRomCurve3 = CatmullRomCurve3 + exports.CubicBezierCurve = CubicBezierCurve + exports.CubicBezierCurve3 = CubicBezierCurve3 + exports.EllipseCurve = EllipseCurve + exports.LineCurve = LineCurve + exports.LineCurve3 = LineCurve3 + exports.QuadraticBezierCurve = QuadraticBezierCurve + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3 + exports.SplineCurve = SplineCurve + exports.REVISION = REVISION + exports.MOUSE = MOUSE + exports.CullFaceNone = CullFaceNone + exports.CullFaceBack = CullFaceBack + exports.CullFaceFront = CullFaceFront + exports.CullFaceFrontBack = CullFaceFrontBack + exports.FrontFaceDirectionCW = FrontFaceDirectionCW + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW + exports.BasicShadowMap = BasicShadowMap + exports.PCFShadowMap = PCFShadowMap + exports.PCFSoftShadowMap = PCFSoftShadowMap + exports.FrontSide = FrontSide + exports.BackSide = BackSide + exports.DoubleSide = DoubleSide + exports.FlatShading = FlatShading + exports.SmoothShading = SmoothShading + exports.NoColors = NoColors + exports.FaceColors = FaceColors + exports.VertexColors = VertexColors + exports.NoBlending = NoBlending + exports.NormalBlending = NormalBlending + exports.AdditiveBlending = AdditiveBlending + exports.SubtractiveBlending = SubtractiveBlending + exports.MultiplyBlending = MultiplyBlending + exports.CustomBlending = CustomBlending + exports.AddEquation = AddEquation + exports.SubtractEquation = SubtractEquation + exports.ReverseSubtractEquation = ReverseSubtractEquation + exports.MinEquation = MinEquation + exports.MaxEquation = MaxEquation + exports.ZeroFactor = ZeroFactor + exports.OneFactor = OneFactor + exports.SrcColorFactor = SrcColorFactor + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor + exports.SrcAlphaFactor = SrcAlphaFactor + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor + exports.DstAlphaFactor = DstAlphaFactor + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor + exports.DstColorFactor = DstColorFactor + exports.OneMinusDstColorFactor = OneMinusDstColorFactor + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor + exports.NeverDepth = NeverDepth + exports.AlwaysDepth = AlwaysDepth + exports.LessDepth = LessDepth + exports.LessEqualDepth = LessEqualDepth + exports.EqualDepth = EqualDepth + exports.GreaterEqualDepth = GreaterEqualDepth + exports.GreaterDepth = GreaterDepth + exports.NotEqualDepth = NotEqualDepth + exports.MultiplyOperation = MultiplyOperation + exports.MixOperation = MixOperation + exports.AddOperation = AddOperation + exports.NoToneMapping = NoToneMapping + exports.LinearToneMapping = LinearToneMapping + exports.ReinhardToneMapping = ReinhardToneMapping + exports.Uncharted2ToneMapping = Uncharted2ToneMapping + exports.CineonToneMapping = CineonToneMapping + exports.UVMapping = UVMapping + exports.CubeReflectionMapping = CubeReflectionMapping + exports.CubeRefractionMapping = CubeRefractionMapping + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping + exports.SphericalReflectionMapping = SphericalReflectionMapping + exports.CubeUVReflectionMapping = CubeUVReflectionMapping + exports.CubeUVRefractionMapping = CubeUVRefractionMapping + exports.RepeatWrapping = RepeatWrapping + exports.ClampToEdgeWrapping = ClampToEdgeWrapping + exports.MirroredRepeatWrapping = MirroredRepeatWrapping + exports.NearestFilter = NearestFilter + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter + exports.LinearFilter = LinearFilter + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter + exports.UnsignedByteType = UnsignedByteType + exports.ByteType = ByteType + exports.ShortType = ShortType + exports.UnsignedShortType = UnsignedShortType + exports.IntType = IntType + exports.UnsignedIntType = UnsignedIntType + exports.FloatType = FloatType + exports.HalfFloatType = HalfFloatType + exports.UnsignedShort4444Type = UnsignedShort4444Type + exports.UnsignedShort5551Type = UnsignedShort5551Type + exports.UnsignedShort565Type = UnsignedShort565Type + exports.UnsignedInt248Type = UnsignedInt248Type + exports.AlphaFormat = AlphaFormat + exports.RGBFormat = RGBFormat + exports.RGBAFormat = RGBAFormat + exports.LuminanceFormat = LuminanceFormat + exports.LuminanceAlphaFormat = LuminanceAlphaFormat + exports.RGBEFormat = RGBEFormat + exports.DepthFormat = DepthFormat + exports.DepthStencilFormat = DepthStencilFormat + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format + exports.RGB_ETC1_Format = RGB_ETC1_Format + exports.RGBA_ASTC_4x4_Format = RGBA_ASTC_4x4_Format + exports.RGBA_ASTC_5x4_Format = RGBA_ASTC_5x4_Format + exports.RGBA_ASTC_5x5_Format = RGBA_ASTC_5x5_Format + exports.RGBA_ASTC_6x5_Format = RGBA_ASTC_6x5_Format + exports.RGBA_ASTC_6x6_Format = RGBA_ASTC_6x6_Format + exports.RGBA_ASTC_8x5_Format = RGBA_ASTC_8x5_Format + exports.RGBA_ASTC_8x6_Format = RGBA_ASTC_8x6_Format + exports.RGBA_ASTC_8x8_Format = RGBA_ASTC_8x8_Format + exports.RGBA_ASTC_10x5_Format = RGBA_ASTC_10x5_Format + exports.RGBA_ASTC_10x6_Format = RGBA_ASTC_10x6_Format + exports.RGBA_ASTC_10x8_Format = RGBA_ASTC_10x8_Format + exports.RGBA_ASTC_10x10_Format = RGBA_ASTC_10x10_Format + exports.RGBA_ASTC_12x10_Format = RGBA_ASTC_12x10_Format + exports.RGBA_ASTC_12x12_Format = RGBA_ASTC_12x12_Format + exports.LoopOnce = LoopOnce + exports.LoopRepeat = LoopRepeat + exports.LoopPingPong = LoopPingPong + exports.InterpolateDiscrete = InterpolateDiscrete + exports.InterpolateLinear = InterpolateLinear + exports.InterpolateSmooth = InterpolateSmooth + exports.ZeroCurvatureEnding = ZeroCurvatureEnding + exports.ZeroSlopeEnding = ZeroSlopeEnding + exports.WrapAroundEnding = WrapAroundEnding + exports.TrianglesDrawMode = TrianglesDrawMode + exports.TriangleStripDrawMode = TriangleStripDrawMode + exports.TriangleFanDrawMode = TriangleFanDrawMode + exports.LinearEncoding = LinearEncoding + exports.sRGBEncoding = sRGBEncoding + exports.GammaEncoding = GammaEncoding + exports.RGBEEncoding = RGBEEncoding + exports.LogLuvEncoding = LogLuvEncoding + exports.RGBM7Encoding = RGBM7Encoding + exports.RGBM16Encoding = RGBM16Encoding + exports.RGBDEncoding = RGBDEncoding + exports.BasicDepthPacking = BasicDepthPacking + exports.RGBADepthPacking = RGBADepthPacking + exports.CubeGeometry = BoxGeometry + exports.Face4 = Face4 + exports.LineStrip = LineStrip + exports.LinePieces = LinePieces + exports.MeshFaceMaterial = MeshFaceMaterial + exports.MultiMaterial = MultiMaterial + exports.PointCloud = PointCloud + exports.Particle = Particle + exports.ParticleSystem = ParticleSystem + exports.PointCloudMaterial = PointCloudMaterial + exports.ParticleBasicMaterial = ParticleBasicMaterial + exports.ParticleSystemMaterial = ParticleSystemMaterial + exports.Vertex = Vertex + exports.DynamicBufferAttribute = DynamicBufferAttribute + exports.Int8Attribute = Int8Attribute + exports.Uint8Attribute = Uint8Attribute + exports.Uint8ClampedAttribute = Uint8ClampedAttribute + exports.Int16Attribute = Int16Attribute + exports.Uint16Attribute = Uint16Attribute + exports.Int32Attribute = Int32Attribute + exports.Uint32Attribute = Uint32Attribute + exports.Float32Attribute = Float32Attribute + exports.Float64Attribute = Float64Attribute + exports.ClosedSplineCurve3 = ClosedSplineCurve3 + exports.SplineCurve3 = SplineCurve3 + exports.Spline = Spline + exports.AxisHelper = AxisHelper + exports.BoundingBoxHelper = BoundingBoxHelper + exports.EdgesHelper = EdgesHelper + exports.WireframeHelper = WireframeHelper + exports.XHRLoader = XHRLoader + exports.BinaryTextureLoader = BinaryTextureLoader + exports.GeometryUtils = GeometryUtils + exports.ImageUtils = ImageUtils + exports.Projector = Projector + exports.CanvasRenderer = CanvasRenderer + exports.SceneUtils = SceneUtils + exports.LensFlare = LensFlare + + Object.defineProperty(exports, '__esModule', { value: true }) +}) diff --git a/public/static/modelView/js/three.min.js b/public/static/modelView/js/three.min.js new file mode 100644 index 0000000..36e34ce --- /dev/null +++ b/public/static/modelView/js/three.min.js @@ -0,0 +1,838 @@ +锘�// threejs.org/license +(function(k,pa){"object"===typeof exports&&"undefined"!==typeof module?pa(exports):"function"===typeof define&&define.amd?define(["exports"],pa):pa(k.THREE=k.THREE||{})})(this,function(k){function pa(){}function B(a,b){this.x=a||0;this.y=b||0}function da(a,b,c,d,e,f,g,h,l,p){Object.defineProperty(this,"id",{value:Xd++});this.uuid=k.Math.generateUUID();this.sourceFile=this.name="";this.image=void 0!==a?a:da.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:da.DEFAULT_MAPPING;this.wrapS=void 0!== +c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==l?l:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new B(0,0);this.repeat=new B(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==p?p:3E3;this.version=0;this.onUpdate=null}function ga(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function yb(a,b,c){this.uuid=k.Math.generateUUID(); +this.width=a;this.height=b;this.scissor=new ga(0,0,a,b);this.scissorTest=!1;this.viewport=new ga(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new da(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function zb(a,b,c){yb.call(this,a,b,c);this.activeMipMapLevel= +this.activeCubeFace=0}function ca(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function q(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function H(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Ra(a,b,c,d,e,f,g,h,l,p){a=void 0!==a?a:[];da.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,l,p);this.flipY=!1}function Ab(a,b,c){var d=a[0];if(0>= +d||0<d)return a;var e=b*c,f=Yd[e];void 0===f&&(f=new Float32Array(e),Yd[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function Zd(a,b){var c=$d[b];void 0===c&&(c=new Int32Array(b),$d[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}function ze(a,b){a.uniform1f(this.addr,b)}function Ae(a,b){a.uniform1i(this.addr,b)}function Be(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function Ce(a,b){void 0!==b.x?a.uniform3f(this.addr, +b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,b)}function De(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function Ee(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function Fe(a,b){a.uniformMatrix3fv(this.addr,!1,b.elements||b)}function Ge(a,b){a.uniformMatrix4fv(this.addr,!1,b.elements||b)}function He(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||ae,d)}function Ie(a,b,c){var d=c.allocTextureUnit(); +a.uniform1i(this.addr,d);c.setTextureCube(b||be,d)}function ce(a,b){a.uniform2iv(this.addr,b)}function de(a,b){a.uniform3iv(this.addr,b)}function ee(a,b){a.uniform4iv(this.addr,b)}function Je(a){switch(a){case 5126:return ze;case 35664:return Be;case 35665:return Ce;case 35666:return De;case 35674:return Ee;case 35675:return Fe;case 35676:return Ge;case 35678:return He;case 35680:return Ie;case 5124:case 35670:return Ae;case 35667:case 35671:return ce;case 35668:case 35672:return de;case 35669:case 35673:return ee}} +function Ke(a,b){a.uniform1fv(this.addr,b)}function Le(a,b){a.uniform1iv(this.addr,b)}function Me(a,b){a.uniform2fv(this.addr,Ab(b,this.size,2))}function Ne(a,b){a.uniform3fv(this.addr,Ab(b,this.size,3))}function Oe(a,b){a.uniform4fv(this.addr,Ab(b,this.size,4))}function Pe(a,b){a.uniformMatrix2fv(this.addr,!1,Ab(b,this.size,4))}function Qe(a,b){a.uniformMatrix3fv(this.addr,!1,Ab(b,this.size,9))}function Re(a,b){a.uniformMatrix4fv(this.addr,!1,Ab(b,this.size,16))}function Se(a,b,c){var d=b.length, +e=Zd(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||ae,e[a])}function Te(a,b,c){var d=b.length,e=Zd(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||be,e[a])}function Ue(a){switch(a){case 5126:return Ke;case 35664:return Me;case 35665:return Ne;case 35666:return Oe;case 35674:return Pe;case 35675:return Qe;case 35676:return Re;case 35678:return Se;case 35680:return Te;case 5124:case 35670:return Le;case 35667:case 35671:return ce;case 35668:case 35672:return de; +case 35669:case 35673:return ee}}function Ve(a,b,c){this.id=a;this.addr=c;this.setValue=Je(b.type)}function We(a,b,c){this.id=a;this.addr=c;this.size=b.size;this.setValue=Ue(b.type)}function fe(a){this.id=a;this.seq=[];this.map={}}function Sa(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d!==c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,l=h.length;for(td.lastIndex=0;;){var p=td.exec(h),E=td.lastIndex, +m=p[1],n=p[3];"]"===p[2]&&(m|=0);if(void 0===n||"["===n&&E+2===l){h=g;e=void 0===n?new Ve(m,e,f):new We(m,e,f);h.seq.push(e);h.map[e.id]=e;break}else n=g.map[m],void 0===n&&(n=new fe(m),m=g,g=n,m.seq.push(g),m.map[g.id]=g),g=n}}}function M(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function dc(a,b){this.min=void 0!==a?a:new B(Infinity,Infinity);this.max=void 0!==b?b:new B(-Infinity,-Infinity)}function Xe(a,b){var c,d,e,f,g,h,l,p,E,m,n=a.context,k=a.state,t,v,z,u,w,I;this.render= +function(x,F,G){if(0!==b.length){x=new q;var C=G.w/G.z,L=.5*G.z,Ka=.5*G.w,Q=16/G.w,ba=new B(Q*C,Q),xa=new q(1,1,0),$a=new B(1,1),Ea=new dc;Ea.min.set(0,0);Ea.max.set(G.z-16,G.w-16);if(void 0===u){var Q=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),N=new Uint16Array([0,1,2,0,2,3]);t=n.createBuffer();v=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,t);n.bufferData(n.ARRAY_BUFFER,Q,n.STATIC_DRAW);n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,v);n.bufferData(n.ELEMENT_ARRAY_BUFFER,N,n.STATIC_DRAW);w=n.createTexture(); +I=n.createTexture();k.bindTexture(n.TEXTURE_2D,w);n.texImage2D(n.TEXTURE_2D,0,n.RGB,16,16,0,n.RGB,n.UNSIGNED_BYTE,null);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST);k.bindTexture(n.TEXTURE_2D,I);n.texImage2D(n.TEXTURE_2D,0,n.RGBA,16,16,0,n.RGBA,n.UNSIGNED_BYTE,null);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S, +n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST);var Q=z={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}"},N=n.createProgram(),O=n.createShader(n.FRAGMENT_SHADER), +R=n.createShader(n.VERTEX_SHADER),S="precision "+a.getPrecision()+" float;\n";n.shaderSource(O,S+Q.fragmentShader);n.shaderSource(R,S+Q.vertexShader);n.compileShader(O);n.compileShader(R);n.attachShader(N,O);n.attachShader(N,R);n.linkProgram(N);u=N;E=n.getAttribLocation(u,"position");m=n.getAttribLocation(u,"uv");c=n.getUniformLocation(u,"renderType");d=n.getUniformLocation(u,"map");e=n.getUniformLocation(u,"occlusionMap");f=n.getUniformLocation(u,"opacity");g=n.getUniformLocation(u,"color");h=n.getUniformLocation(u, +"scale");l=n.getUniformLocation(u,"rotation");p=n.getUniformLocation(u,"screenPosition")}n.useProgram(u);k.initAttributes();k.enableAttribute(E);k.enableAttribute(m);k.disableUnusedAttributes();n.uniform1i(e,0);n.uniform1i(d,1);n.bindBuffer(n.ARRAY_BUFFER,t);n.vertexAttribPointer(E,2,n.FLOAT,!1,16,0);n.vertexAttribPointer(m,2,n.FLOAT,!1,16,8);n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,v);k.disable(n.CULL_FACE);k.setDepthWrite(!1);N=0;for(O=b.length;N<O;N++)if(Q=16/G.w,ba.set(Q*C,Q),R=b[N],x.set(R.matrixWorld.elements[12], +R.matrixWorld.elements[13],R.matrixWorld.elements[14]),x.applyMatrix4(F.matrixWorldInverse),x.applyProjection(F.projectionMatrix),xa.copy(x),$a.x=G.x+xa.x*L+L-8,$a.y=G.y+xa.y*Ka+Ka-8,!0===Ea.containsPoint($a)){k.activeTexture(n.TEXTURE0);k.bindTexture(n.TEXTURE_2D,null);k.activeTexture(n.TEXTURE1);k.bindTexture(n.TEXTURE_2D,w);n.copyTexImage2D(n.TEXTURE_2D,0,n.RGB,$a.x,$a.y,16,16,0);n.uniform1i(c,0);n.uniform2f(h,ba.x,ba.y);n.uniform3f(p,xa.x,xa.y,xa.z);k.disable(n.BLEND);k.enable(n.DEPTH_TEST);n.drawElements(n.TRIANGLES, +6,n.UNSIGNED_SHORT,0);k.activeTexture(n.TEXTURE0);k.bindTexture(n.TEXTURE_2D,I);n.copyTexImage2D(n.TEXTURE_2D,0,n.RGBA,$a.x,$a.y,16,16,0);n.uniform1i(c,1);k.disable(n.DEPTH_TEST);k.activeTexture(n.TEXTURE1);k.bindTexture(n.TEXTURE_2D,w);n.drawElements(n.TRIANGLES,6,n.UNSIGNED_SHORT,0);R.positionScreen.copy(xa);R.customUpdateCallback?R.customUpdateCallback(R):R.updateLensFlares();n.uniform1i(c,2);k.enable(n.BLEND);for(var S=0,Ye=R.lensFlares.length;S<Ye;S++){var U=R.lensFlares[S];.001<U.opacity&&.001< +U.scale&&(xa.x=U.x,xa.y=U.y,xa.z=U.z,Q=U.size*U.scale/G.w,ba.x=Q*C,ba.y=Q,n.uniform3f(p,xa.x,xa.y,xa.z),n.uniform2f(h,ba.x,ba.y),n.uniform1f(l,U.rotation),n.uniform1f(f,U.opacity),n.uniform3f(g,U.color.r,U.color.g,U.color.b),k.setBlending(U.blending,U.blendEquation,U.blendSrc,U.blendDst),a.setTexture2D(U.texture,1),n.drawElements(n.TRIANGLES,6,n.UNSIGNED_SHORT,0))}}k.enable(n.CULL_FACE);k.enable(n.DEPTH_TEST);k.setDepthWrite(!0);a.resetGLState()}}}function Ze(a,b){var c,d,e,f,g,h,l,p,E,m,n,k,t,v, +z,u,w;function I(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var x=a.context,F=a.state,G,C,L,Ka,Q=new q,ba=new ca,xa=new q;this.render=function(q,Ea){if(0!==b.length){if(void 0===L){var N=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),O=new Uint16Array([0,1,2,0,2,3]);G=x.createBuffer();C=x.createBuffer();x.bindBuffer(x.ARRAY_BUFFER,G);x.bufferData(x.ARRAY_BUFFER,N,x.STATIC_DRAW);x.bindBuffer(x.ELEMENT_ARRAY_BUFFER,C);x.bufferData(x.ELEMENT_ARRAY_BUFFER, +O,x.STATIC_DRAW);var N=x.createProgram(),O=x.createShader(x.VERTEX_SHADER),R=x.createShader(x.FRAGMENT_SHADER);x.shaderSource(O,["precision "+a.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")); +x.shaderSource(R,["precision "+a.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;\nfogFactor = 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")); +x.compileShader(O);x.compileShader(R);x.attachShader(N,O);x.attachShader(N,R);x.linkProgram(N);L=N;u=x.getAttribLocation(L,"position");w=x.getAttribLocation(L,"uv");c=x.getUniformLocation(L,"uvOffset");d=x.getUniformLocation(L,"uvScale");e=x.getUniformLocation(L,"rotation");f=x.getUniformLocation(L,"scale");g=x.getUniformLocation(L,"color");h=x.getUniformLocation(L,"map");l=x.getUniformLocation(L,"opacity");p=x.getUniformLocation(L,"modelViewMatrix");E=x.getUniformLocation(L,"projectionMatrix");m= +x.getUniformLocation(L,"fogType");n=x.getUniformLocation(L,"fogDensity");k=x.getUniformLocation(L,"fogNear");t=x.getUniformLocation(L,"fogFar");v=x.getUniformLocation(L,"fogColor");z=x.getUniformLocation(L,"alphaTest");N=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");N.width=8;N.height=8;O=N.getContext("2d");O.fillStyle="white";O.fillRect(0,0,8,8);Ka=new da(N);Ka.needsUpdate=!0}x.useProgram(L);F.initAttributes();F.enableAttribute(u);F.enableAttribute(w);F.disableUnusedAttributes(); +F.disable(x.CULL_FACE);F.enable(x.BLEND);x.bindBuffer(x.ARRAY_BUFFER,G);x.vertexAttribPointer(u,2,x.FLOAT,!1,16,0);x.vertexAttribPointer(w,2,x.FLOAT,!1,16,8);x.bindBuffer(x.ELEMENT_ARRAY_BUFFER,C);x.uniformMatrix4fv(E,!1,Ea.projectionMatrix.elements);F.activeTexture(x.TEXTURE0);x.uniform1i(h,0);O=N=0;(R=q.fog)?(x.uniform3f(v,R.color.r,R.color.g,R.color.b),R&&R.isFog?(x.uniform1f(k,R.near),x.uniform1f(t,R.far),x.uniform1i(m,1),O=N=1):R&&R.isFogExp2&&(x.uniform1f(n,R.density),x.uniform1i(m,2),O=N=2)): +(x.uniform1i(m,0),O=N=0);for(var R=0,S=b.length;R<S;R++){var B=b[R];B.modelViewMatrix.multiplyMatrices(Ea.matrixWorldInverse,B.matrixWorld);B.z=-B.modelViewMatrix.elements[14]}b.sort(I);for(var U=[],R=0,S=b.length;R<S;R++){var B=b[R],V=B.material;!1!==V.visible&&(x.uniform1f(z,V.alphaTest),x.uniformMatrix4fv(p,!1,B.modelViewMatrix.elements),B.matrixWorld.decompose(Q,ba,xa),U[0]=xa.x,U[1]=xa.y,B=0,q.fog&&V.fog&&(B=O),N!==B&&(x.uniform1i(m,B),N=B),null!==V.map?(x.uniform2f(c,V.map.offset.x,V.map.offset.y), +x.uniform2f(d,V.map.repeat.x,V.map.repeat.y)):(x.uniform2f(c,0,0),x.uniform2f(d,1,1)),x.uniform1f(l,V.opacity),x.uniform3f(g,V.color.r,V.color.g,V.color.b),x.uniform1f(e,V.rotation),x.uniform2fv(f,U),F.setBlending(V.blending,V.blendEquation,V.blendSrc,V.blendDst),F.setDepthTest(V.depthTest),F.setDepthWrite(V.depthWrite),V.map?a.setTexture2D(V.map,0):a.setTexture2D(Ka,0),x.drawElements(x.TRIANGLES,6,x.UNSIGNED_SHORT,0))}F.enable(x.CULL_FACE);a.resetGLState()}}}function T(){Object.defineProperty(this, +"id",{value:ge++});this.uuid=k.Math.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.shading=2;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset= +!1;this.alphaTest=this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.premultipliedAlpha=!1;this.overdraw=0;this._needsUpdate=this.visible=!0}function Da(a){T.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};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.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals= +this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}function Ta(a){T.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets= +this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Ga(a,b){this.min=void 0!==a?a:new q(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new q(-Infinity,-Infinity,-Infinity)}function Aa(a,b){this.center=void 0!==a?a:new q;this.radius=void 0!==b?b:0}function ya(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")} +function sa(a,b){this.normal=void 0!==a?a:new q(1,0,0);this.constant=void 0!==b?b:0}function ec(a,b,c,d,e,f){this.planes=[void 0!==a?a:new sa,void 0!==b?b:new sa,void 0!==c?c:new sa,void 0!==d?d:new sa,void 0!==e?e:new sa,void 0!==f?f:new sa]}function he(a,b,c,d){function e(b,c,d,e){var f=b.geometry,g;g=z;var h=b.customDepthMaterial;d&&(g=u,h=b.customDistanceMaterial);h?g=h:(h=!1,c.morphTargets&&(f&&f.isBufferGeometry?h=f.morphAttributes&&f.morphAttributes.position&&0<f.morphAttributes.position.length: +f&&f.isGeometry&&(h=f.morphTargets&&0<f.morphTargets.length)),b=b.isSkinnedMesh&&c.skinning,f=0,h&&(f|=1),b&&(f|=2),g=g[f]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(f=g.uuid,h=c.uuid,b=w[f],void 0===b&&(b={},w[f]=b),f=b[h],void 0===f&&(f=g.clone(),b[h]=f),g=f);g.visible=c.visible;g.wireframe=c.wireframe;h=c.side;ba.renderSingleSided&&2==h&&(h=0);ba.renderReverseSided&&(0===h?h=1:1===h&&(h=0));g.side=h;g.clipShadows=c.clipShadows;g.clippingPlanes=c.clippingPlanes;g.wireframeLinewidth= +c.wireframeLinewidth;g.linewidth=c.linewidth;d&&void 0!==g.uniforms.lightPos&&g.uniforms.lightPos.value.copy(e);return g}function f(a,b,c){if(!1!==a.visible){0!==(a.layers.mask&b.layers.mask)&&(a.isMesh||a.isLine||a.isPoints)&&a.castShadow&&(!1===a.frustumCulled||!0===l.intersectsObject(a))&&!0===a.material.visible&&(a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,a.matrixWorld),v.push(a));a=a.children;for(var d=0,e=a.length;d<e;d++)f(a[d],b,c)}}var g=a.context,h=a.state,l=new ec,p=new H, +E=b.shadows,m=new B,n=new B(d.maxTextureSize,d.maxTextureSize),r=new q,t=new q,v=[],z=Array(4),u=Array(4),w={},I=[new q(1,0,0),new q(-1,0,0),new q(0,0,1),new q(0,0,-1),new q(0,1,0),new q(0,-1,0)],x=[new q(0,1,0),new q(0,1,0),new q(0,1,0),new q(0,1,0),new q(0,0,1),new q(0,0,-1)],F=[new ga,new ga,new ga,new ga,new ga,new ga];b=new Ta;b.depthPacking=3201;b.clipping=!0;d=Bb.distanceRGBA;for(var G=k.UniformsUtils.clone(d.uniforms),C=0;4!==C;++C){var L=0!==(C&1),Ka=0!==(C&2),Q=b.clone();Q.morphTargets= +L;Q.skinning=Ka;z[C]=Q;L=new Da({defines:{USE_SHADOWMAP:""},uniforms:G,vertexShader:d.vertexShader,fragmentShader:d.fragmentShader,morphTargets:L,skinning:Ka,clipping:!0});u[C]=L}var ba=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,d){if(!1!==ba.enabled&&(!1!==ba.autoUpdate||!1!==ba.needsUpdate)&&0!==E.length){h.clearColor(1,1,1,1);h.disable(g.BLEND);h.setDepthTest(!0);h.setScissorTest(!1);for(var k, +w,u=0,q=E.length;u<q;u++){var z=E[u],G=z.shadow;if(void 0===G)console.warn("THREE.WebGLShadowMap:",z,"has no shadow.");else{var C=G.camera;m.copy(G.mapSize);m.min(n);if(z&&z.isPointLight){k=6;w=!0;var L=m.x,Q=m.y;F[0].set(2*L,Q,L,Q);F[1].set(0,Q,L,Q);F[2].set(3*L,Q,L,Q);F[3].set(L,Q,L,Q);F[4].set(3*L,0,L,Q);F[5].set(L,0,L,Q);m.x*=4;m.y*=2}else k=1,w=!1;null===G.map&&(G.map=new yb(m.x,m.y,{minFilter:1003,magFilter:1003,format:1023}),C.updateProjectionMatrix());G&&G.isSpotLightShadow&&G.update(z);L= +G.map;G=G.matrix;t.setFromMatrixPosition(z.matrixWorld);C.position.copy(t);a.setRenderTarget(L);a.clear();for(L=0;L<k;L++){w?(r.copy(C.position),r.add(I[L]),C.up.copy(x[L]),C.lookAt(r),h.viewport(F[L])):(r.setFromMatrixPosition(z.target.matrixWorld),C.lookAt(r));C.updateMatrixWorld();C.matrixWorldInverse.getInverse(C.matrixWorld);G.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);G.multiply(C.projectionMatrix);G.multiply(C.matrixWorldInverse);p.multiplyMatrices(C.projectionMatrix,C.matrixWorldInverse); +l.setFromMatrix(p);v.length=0;f(b,d,C);for(var Q=0,Ka=v.length;Q<Ka;Q++){var B=v[Q],D=c.update(B),y=B.material;if(y&&y.isMultiMaterial)for(var Ua=D.groups,y=y.materials,ud=0,Ba=Ua.length;ud<Ba;ud++){var Pa=Ua[ud],La=y[Pa.materialIndex];!0===La.visible&&(La=e(B,La,w,t),a.renderBufferDirect(C,null,D,La,B,Pa))}else La=e(B,y,w,t),a.renderBufferDirect(C,null,D,La,B,null)}}}}k=a.getClearColor();w=a.getClearAlpha();a.setClearColor(k,w);ba.needsUpdate=!1}}}function Va(a,b){this.origin=void 0!==a?a:new q; +this.direction=void 0!==b?b:new q}function Wa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Wa.DefaultOrder}function Sc(){this.mask=1}function y(){Object.defineProperty(this,"id",{value:ie++});this.uuid=k.Math.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=y.DefaultUp.clone();var a=new q,b=new Wa,c=new ca,d=new q(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},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new H},normalMatrix:{value:new ya}});this.matrix=new H;this.matrixWorld=new H;this.matrixAutoUpdate=y.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Sc;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={};this.onBeforeRender=function(){};this.onAfterRender=function(){}} +function bb(a,b){this.start=void 0!==a?a:new q;this.end=void 0!==b?b:new q}function Fa(a,b,c){this.a=void 0!==a?a:new q;this.b=void 0!==b?b:new q;this.c=void 0!==c?c:new q}function oa(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new q;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new M;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function Ha(a){T.call(this);this.type="MeshBasicMaterial";this.color=new M(16777215);this.aoMap= +this.map=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function D(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=k.Math.generateUUID();this.array=a;this.itemSize=b;this.count=void 0!== +a?a.length/b:0;this.normalized=!0===c;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function Tc(a,b){return new D(new Uint16Array(a),b)}function Uc(a,b){return new D(new Uint32Array(a),b)}function ha(a,b){return new D(new Float32Array(a),b)}function P(){Object.defineProperty(this,"id",{value:Vc++});this.uuid=k.Math.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights= +[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function je(){Object.defineProperty(this,"id",{value:Vc++});this.uuid=k.Math.generateUUID();this.name="";this.type="DirectGeometry";this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets= +{};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function K(){Object.defineProperty(this,"id",{value:Vc++});this.uuid=k.Math.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function ua(a,b){y.call(this); +this.type="Mesh";this.geometry=void 0!==a?a:new K;this.material=void 0!==b?b:new Ha({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function cb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,p,B,y){var D=f/p,N=g/B,O=f/2,R=g/2,S=l/2;g=p+1;for(var K=B+1,U=f=0,V=new q,J=0;J<K;J++)for(var M=J*N-R,H=0;H<g;H++)V[a]=(H*D-O)*d,V[b]=M*e,V[c]=S,m[t]=V.x,m[t+1]=V.y,m[t+2]=V.z,V[a]=0,V[b]=0,V[c]=0<l?1:-1,n[t]=V.x,n[t+1]=V.y,n[t+2]=V.z,k[v]=H/p,k[v+1]=1-J/B,t+=3,v+=2,f+=1;for(J=0;J<B;J++)for(H= +0;H<p;H++)a=u+H+g*(J+1),b=u+(H+1)+g*(J+1),c=u+(H+1)+g*J,E[z]=u+H+g*J,E[z+1]=a,E[z+2]=c,E[z+3]=a,E[z+4]=b,E[z+5]=c,z+=6,U+=6;h.addGroup(w,U,y);w+=U;u+=f}K.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};var h=this;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var l=function(a,b,c){return a=0+(a+1)*(b+1)*2+(a+1)*(c+1)*2+(c+1)*(b+1)*2}(d,e,f),p=function(a,b,c){a=0+a*b*2+a*c*2+c*b*2;return 6*a}(d,e,f),E=new (65535< +p?Uint32Array:Uint16Array)(p),m=new Float32Array(3*l),n=new Float32Array(3*l),k=new Float32Array(2*l),t=0,v=0,z=0,u=0,w=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x","z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y","z",-1,-1,a,b,-c,d,e,5);this.setIndex(new D(E,1));this.addAttribute("position",new D(m,3));this.addAttribute("normal",new D(n,3));this.addAttribute("uv",new D(k,2))}function db(a,b,c,d){K.call(this);this.type= +"PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,l=a/c,p=b/d;b=new Float32Array(g*h*3);a=new Float32Array(g*h*3);for(var E=new Float32Array(g*h*2),m=0,n=0,k=0;k<h;k++)for(var t=k*p-f,v=0;v<g;v++)b[m]=v*l-e,b[m+1]=-t,a[m+2]=1,E[n]=v/c,E[n+1]=1-k/d,m+=3,n+=2;m=0;e=new (65535<b.length/3?Uint32Array:Uint16Array)(c*d*6);for(k=0;k<d;k++)for(v=0;v<c;v++)f=v+g*(k+1),h=v+1+g*(k+1),l=v+1+g*k,e[m]= +v+g*k,e[m+1]=f,e[m+2]=l,e[m+3]=f,e[m+4]=h,e[m+5]=l,m+=6;this.setIndex(new D(e,1));this.addAttribute("position",new D(b,3));this.addAttribute("normal",new D(a,3));this.addAttribute("uv",new D(E,2))}function qa(){y.call(this);this.type="Camera";this.matrixWorldInverse=new H;this.projectionMatrix=new H}function Ca(a,b,c,d){qa.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view= +null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function Cb(a,b,c,d,e,f){qa.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;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()}function $e(a,b,c){var d,e,f;return{setMode:function(a){d=a},setIndex:function(c){c.array instanceof Uint32Array&&b.get("OES_element_index_uint")?(e=a.UNSIGNED_INT,f=4):(e=a.UNSIGNED_SHORT,f=2)},render:function(b, +h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES&&(c.faces+=h/3)},renderInstances:function(g,h,l){var p=b.get("ANGLE_instanced_arrays");null===p?console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(p.drawElementsInstancedANGLE(d,l,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=l*g.maxInstancedCount,d===a.TRIANGLES&&(c.faces+=g.maxInstancedCount*l/3))}}}function af(a,b,c){var d;return{setMode:function(a){d= +a},render:function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES&&(c.faces+=f/3)},renderInstances:function(e){var f=b.get("ANGLE_instanced_arrays");if(null===f)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{var g=e.attributes.position,g=g&&g.isInterleavedBufferAttribute?g.data.count:g.count;f.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount; +d===a.TRIANGLES&&(c.faces+=e.maxInstancedCount*g/3)}}}}function bf(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];var c;switch(b.type){case "DirectionalLight":c={direction:new q,color:new M,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new B};break;case "SpotLight":c={position:new q,direction:new q,color:new M,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new B};break;case "PointLight":c={position:new q,color:new M,distance:0, +decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new B};break;case "HemisphereLight":c={direction:new q,skyColor:new M,groundColor:new M}}return a[b.id]=c}}}function cf(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function ke(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()", +b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),cf(c));return d}function le(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+a);}}function vd(a,b){var c=le(b);return"vec4 "+a+"( vec4 value ) { return "+ +c[0]+"ToLinear"+c[1]+"; }"}function df(a,b){var c=le(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+c[0]+c[1]+"; }"}function ef(a,b){var c;switch(b){case 1:c="Linear";break;case 2:c="Reinhard";break;case 3:c="Uncharted2";break;case 4:c="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+c+"ToneMapping( color ); }"}function ff(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable": +"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(fc).join("\n")}function gf(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function fc(a){return""!==a}function me(a,b){return a.replace(/NUM_DIR_LIGHTS/g, +b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function wd(a){return a.replace(/#include +<([\w\d.]+)>/g,function(a,c){var d=X[c];if(void 0===d)throw Error("Can not resolve #include <"+c+">");return wd(d)})}function ne(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+ +" ]");return a})}function hf(a,b,c,d){var e=a.context,f=c.extensions,g=c.defines,h=c.__webglShader.vertexShader,l=c.__webglShader.fragmentShader,p="SHADOWMAP_TYPE_BASIC";1===d.shadowMapType?p="SHADOWMAP_TYPE_PCF":2===d.shadowMapType&&(p="SHADOWMAP_TYPE_PCF_SOFT");var k="ENVMAP_TYPE_CUBE",m="ENVMAP_MODE_REFLECTION",n="ENVMAP_BLENDING_MULTIPLY";if(d.envMap){switch(c.envMap.mapping){case 301:case 302:k="ENVMAP_TYPE_CUBE";break;case 306:case 307:k="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:k="ENVMAP_TYPE_EQUIREC"; +break;case 305:k="ENVMAP_TYPE_SPHERE"}switch(c.envMap.mapping){case 302:case 304:m="ENVMAP_MODE_REFRACTION"}switch(c.combine){case 0:n="ENVMAP_BLENDING_MULTIPLY";break;case 1:n="ENVMAP_BLENDING_MIX";break;case 2:n="ENVMAP_BLENDING_ADD"}}var r=0<a.gammaFactor?a.gammaFactor:1,f=ff(f,d,a.extensions),t=gf(g),v=e.createProgram();c.isRawShaderMaterial?(g=[t,"\n"].filter(fc).join("\n"),p=[f,t,"\n"].filter(fc).join("\n")):(g=["precision "+d.precision+" float;","precision "+d.precision+" int;","#define SHADER_NAME "+ +c.__webglShader.name,t,d.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+r,"#define MAX_BONES "+d.maxBones,d.map?"#define USE_MAP":"",d.envMap?"#define USE_ENVMAP":"",d.envMap?"#define "+m:"",d.lightMap?"#define USE_LIGHTMAP":"",d.aoMap?"#define USE_AOMAP":"",d.emissiveMap?"#define USE_EMISSIVEMAP":"",d.bumpMap?"#define USE_BUMPMAP":"",d.normalMap?"#define USE_NORMALMAP":"",d.displacementMap&&d.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",d.specularMap?"#define USE_SPECULARMAP": +"",d.roughnessMap?"#define USE_ROUGHNESSMAP":"",d.metalnessMap?"#define USE_METALNESSMAP":"",d.alphaMap?"#define USE_ALPHAMAP":"",d.vertexColors?"#define USE_COLOR":"",d.flatShading?"#define FLAT_SHADED":"",d.skinning?"#define USE_SKINNING":"",d.useVertexTexture?"#define BONE_TEXTURE":"",d.morphTargets?"#define USE_MORPHTARGETS":"",d.morphNormals&&!1===d.flatShading?"#define USE_MORPHNORMALS":"",d.doubleSided?"#define DOUBLE_SIDED":"",d.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+ +d.numClippingPlanes,d.shadowMapEnabled?"#define USE_SHADOWMAP":"",d.shadowMapEnabled?"#define "+p:"",d.sizeAttenuation?"#define USE_SIZEATTENUATION":"",d.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",d.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;", +"attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;", +"\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(fc).join("\n"),p=[f,"precision "+d.precision+" float;","precision "+d.precision+" int;","#define SHADER_NAME "+c.__webglShader.name,t,d.alphaTest?"#define ALPHATEST "+d.alphaTest:"","#define GAMMA_FACTOR "+r,d.useFog&&d.fog?"#define USE_FOG":"",d.useFog&&d.fogExp?"#define FOG_EXP2":"",d.map?"#define USE_MAP": +"",d.envMap?"#define USE_ENVMAP":"",d.envMap?"#define "+k:"",d.envMap?"#define "+m:"",d.envMap?"#define "+n:"",d.lightMap?"#define USE_LIGHTMAP":"",d.aoMap?"#define USE_AOMAP":"",d.emissiveMap?"#define USE_EMISSIVEMAP":"",d.bumpMap?"#define USE_BUMPMAP":"",d.normalMap?"#define USE_NORMALMAP":"",d.specularMap?"#define USE_SPECULARMAP":"",d.roughnessMap?"#define USE_ROUGHNESSMAP":"",d.metalnessMap?"#define USE_METALNESSMAP":"",d.alphaMap?"#define USE_ALPHAMAP":"",d.vertexColors?"#define USE_COLOR": +"",d.flatShading?"#define FLAT_SHADED":"",d.doubleSided?"#define DOUBLE_SIDED":"",d.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+d.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+(d.numClippingPlanes-d.numClipIntersection),d.shadowMapEnabled?"#define USE_SHADOWMAP":"",d.shadowMapEnabled?"#define "+p:"",d.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",d.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",d.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",d.logarithmicDepthBuffer&& +a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",d.envMap&&a.extensions.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==d.toneMapping?"#define TONE_MAPPING":"",0!==d.toneMapping?X.tonemapping_pars_fragment:"",0!==d.toneMapping?ef("toneMapping",d.toneMapping):"",d.outputEncoding||d.mapEncoding||d.envMapEncoding||d.emissiveMapEncoding?X.encodings_pars_fragment:"",d.mapEncoding?vd("mapTexelToLinear",d.mapEncoding): +"",d.envMapEncoding?vd("envMapTexelToLinear",d.envMapEncoding):"",d.emissiveMapEncoding?vd("emissiveMapTexelToLinear",d.emissiveMapEncoding):"",d.outputEncoding?df("linearToOutputTexel",d.outputEncoding):"",d.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(fc).join("\n"));h=wd(h,d);h=me(h,d);l=wd(l,d);l=me(l,d);c.isShaderMaterial||(h=ne(h),l=ne(l));l=p+l;h=ke(e,e.VERTEX_SHADER,g+h);l=ke(e,e.FRAGMENT_SHADER,l);e.attachShader(v,h);e.attachShader(v,l);void 0!==c.index0AttributeName? +e.bindAttribLocation(v,0,c.index0AttributeName):!0===d.morphTargets&&e.bindAttribLocation(v,0,"position");e.linkProgram(v);d=e.getProgramInfoLog(v);k=e.getShaderInfoLog(h);m=e.getShaderInfoLog(l);r=n=!0;if(!1===e.getProgramParameter(v,e.LINK_STATUS))n=!1,console.error("THREE.WebGLProgram: shader error: ",e.getError(),"gl.VALIDATE_STATUS",e.getProgramParameter(v,e.VALIDATE_STATUS),"gl.getProgramInfoLog",d,k,m);else if(""!==d)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",d);else if(""=== +k||""===m)r=!1;r&&(this.diagnostics={runnable:n,material:c,programLog:d,vertexShader:{log:k,prefix:g},fragmentShader:{log:m,prefix:p}});e.deleteShader(h);e.deleteShader(l);var z;this.getUniforms=function(){void 0===z&&(z=new Sa(e,v,a));return z};var u;this.getAttributes=function(){if(void 0===u){for(var a={},b=e.getProgramParameter(v,e.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=e.getActiveAttrib(v,c).name;a[d]=e.getAttribLocation(v,d)}u=a}return u};this.destroy=function(){e.deleteProgram(v);this.program= +void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.id=jf++;this.code=b;this.usedTimes=1;this.program=v;this.vertexShader=h;this.fragmentShader=l;return this}function kf(a,b){function c(a,b){var c;a?a&&a.isTexture?c=a.encoding:a&&a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."), +c=a.texture.encoding):c=3E3;3E3===c&&b&&(c=3007);return c}var d=[],e={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},f="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking".split(" "); +this.getParameters=function(d,f,l,p,k,m){var n=e[d.type],r;b.floatVertexTextures&&m&&m.skeleton&&m.skeleton.useVertexTexture?r=1024:(r=Math.floor((b.maxVertexUniforms-20)/4),void 0!==m&&m&&m.isSkinnedMesh&&(r=Math.min(m.skeleton.bones.length,r),r<m.skeleton.bones.length&&console.warn("WebGLRenderer: too many bones - "+m.skeleton.bones.length+", this GPU supports just "+r+" (try OpenGL instead of ANGLE)")));var t=a.getPrecision();null!==d.precision&&(t=b.getMaxPrecision(d.precision),t!==d.precision&& +console.warn("THREE.WebGLProgram.getParameters:",d.precision,"not supported, using",t,"instead."));var v=a.getCurrentRenderTarget();return{shaderID:n,precision:t,supportsVertexTextures:b.vertexTextures,outputEncoding:c(v?v.texture:null,a.gammaOutput),map:!!d.map,mapEncoding:c(d.map,a.gammaInput),envMap:!!d.envMap,envMapMode:d.envMap&&d.envMap.mapping,envMapEncoding:c(d.envMap,a.gammaInput),envMapCubeUV:!!d.envMap&&(306===d.envMap.mapping||307===d.envMap.mapping),lightMap:!!d.lightMap,aoMap:!!d.aoMap, +emissiveMap:!!d.emissiveMap,emissiveMapEncoding:c(d.emissiveMap,a.gammaInput),bumpMap:!!d.bumpMap,normalMap:!!d.normalMap,displacementMap:!!d.displacementMap,roughnessMap:!!d.roughnessMap,metalnessMap:!!d.metalnessMap,specularMap:!!d.specularMap,alphaMap:!!d.alphaMap,combine:d.combine,vertexColors:d.vertexColors,fog:!!l,useFog:d.fog,fogExp:l&&l.isFogExp2,flatShading:1===d.shading,sizeAttenuation:d.sizeAttenuation,logarithmicDepthBuffer:b.logarithmicDepthBuffer,skinning:d.skinning,maxBones:r,useVertexTexture:b.floatVertexTextures&& +m&&m.skeleton&&m.skeleton.useVertexTexture,morphTargets:d.morphTargets,morphNormals:d.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:f.directional.length,numPointLights:f.point.length,numSpotLights:f.spot.length,numHemiLights:f.hemi.length,numClippingPlanes:p,numClipIntersection:k,shadowMapEnabled:a.shadowMap.enabled&&m.receiveShadow&&0<f.shadows.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights, +premultipliedAlpha:d.premultipliedAlpha,alphaTest:d.alphaTest,doubleSided:2===d.side,flipSided:1===d.side,depthPacking:void 0!==d.depthPacking?d.depthPacking:!1}};this.getProgramCode=function(a,b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(a.fragmentShader),c.push(a.vertexShader));if(void 0!==a.defines)for(var d in a.defines)c.push(d),c.push(a.defines[d]);for(d=0;d<f.length;d++)c.push(b[f[d]]);return c.join()};this.acquireProgram=function(b,c,e){for(var f,k=0,m=d.length;k<m;k++){var n=d[k];if(n.code=== +e){f=n;++f.usedTimes;break}}void 0===f&&(f=new hf(a,e,b,c),d.push(f));return f};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=d.indexOf(a);d[b]=d[d.length-1];d.pop();a.destroy()}};this.programs=d}function lf(a,b,c){function d(a){var h=a.target;a=f[h.id];null!==a.index&&e(a.index);var l=a.attributes,p;for(p in l)e(l[p]);h.removeEventListener("dispose",d);delete f[h.id];p=b.get(h);p.wireframe&&e(p.wireframe);b["delete"](h);h=b.get(a);h.wireframe&&e(h.wireframe);b["delete"](a);c.memory.geometries--} +function e(c){var d;d=c.isInterleavedBufferAttribute?b.get(c.data).__webglBuffer:b.get(c).__webglBuffer;void 0!==d&&(a.deleteBuffer(d),c.isInterleavedBufferAttribute?b["delete"](c.data):b["delete"](c))}var f={};return{get:function(a){var b=a.geometry;if(void 0!==f[b.id])return f[b.id];b.addEventListener("dispose",d);var e;b.isBufferGeometry?e=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new K).setFromObject(a)),e=b._bufferGeometry);f[b.id]=e;c.memory.geometries++;return e}}}function mf(a, +b,c){function d(c,d){var e=c.isInterleavedBufferAttribute?c.data:c,l=b.get(e);void 0===l.__webglBuffer?(l.__webglBuffer=a.createBuffer(),a.bindBuffer(d,l.__webglBuffer),a.bufferData(d,e.array,e.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW),l.version=e.version):l.version!==e.version&&(a.bindBuffer(d,l.__webglBuffer),!1===e.dynamic||-1===e.updateRange.count?a.bufferSubData(d,0,e.array):0===e.updateRange.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."): +(a.bufferSubData(d,e.updateRange.offset*e.array.BYTES_PER_ELEMENT,e.array.subarray(e.updateRange.offset,e.updateRange.offset+e.updateRange.count)),e.updateRange.count=0),l.version=e.version)}var e=new lf(a,b,c);return{getAttributeBuffer:function(a){return a.isInterleavedBufferAttribute?b.get(a.data).__webglBuffer:b.get(a).__webglBuffer},getWireframeAttribute:function(c){var e=b.get(c);if(void 0!==e.wireframe)return e.wireframe;var h=[],l=c.index,p=c.attributes;c=p.position;if(null!==l)for(var l=l.array, +p=0,k=l.length;p<k;p+=3){var m=l[p+0],n=l[p+1],r=l[p+2];h.push(m,n,n,r,r,m)}else for(l=p.position.array,p=0,k=l.length/3-1;p<k;p+=3)m=p+0,n=p+1,r=p+2,h.push(m,n,n,r,r,m);h=new D(new (65535<c.count?Uint32Array:Uint16Array)(h),1);d(h,a.ELEMENT_ARRAY_BUFFER);return e.wireframe=h},update:function(b){var c=e.get(b);b.geometry.isGeometry&&c.updateFromObject(b);b=c.index;var h=c.attributes;null!==b&&d(b,a.ELEMENT_ARRAY_BUFFER);for(var l in h)d(h[l],a.ARRAY_BUFFER);b=c.morphAttributes;for(l in b)for(var h= +b[l],p=0,k=h.length;p<k;p++)d(h[p],a.ARRAY_BUFFER);return c}}}function nf(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a} +function l(a){return k.Math.isPowerOfTwo(a.width)&&k.Math.isPowerOfTwo(a.height)}function p(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function E(b){b=b.target;b.removeEventListener("dispose",E);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d["delete"](b)}z.textures--}function m(b){b=b.target;b.removeEventListener("dispose",m);var c=d.get(b),e=d.get(b.texture); +if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b&&b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d["delete"](b.texture);d["delete"](b)}z.textures--}function n(b,g){var p=d.get(b);if(0<b.version&&p.__version!==b.version){var n= +b.image;if(void 0===n)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",b);else if(!1===n.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",b);else{void 0===p.__webglInit&&(p.__webglInit=!0,b.addEventListener("dispose",E),p.__webglTexture=a.createTexture(),z.textures++);c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_2D,p.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL, +b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var m=h(b.image,e.maxTextureSize);if((1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===l(m))if(n=m,n instanceof HTMLImageElement||n instanceof HTMLCanvasElement){var t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");t.width=k.Math.nearestPowerOfTwo(n.width);t.height=k.Math.nearestPowerOfTwo(n.height);t.getContext("2d").drawImage(n,0,0,t.width,t.height);console.warn("THREE.WebGLRenderer: image is not power of two ("+ +n.width+"x"+n.height+"). Resized to "+t.width+"x"+t.height,n);m=t}else m=n;var n=l(m),t=f(b.format),v=f(b.type);r(a.TEXTURE_2D,b,n);var q=b.mipmaps;if(b&&b.isDepthTexture){q=a.DEPTH_COMPONENT;if(1015===b.type){if(!u)throw Error("Float Depth Texture only supported in WebGL2.0");q=a.DEPTH_COMPONENT32F}else u&&(q=a.DEPTH_COMPONENT16);1027===b.format&&(q=a.DEPTH_STENCIL);c.texImage2D(a.TEXTURE_2D,0,q,m.width,m.height,0,t,v,null)}else if(b&&b.isDataTexture)if(0<q.length&&n){for(var Q=0,ba=q.length;Q<ba;Q++)m= +q[Q],c.texImage2D(a.TEXTURE_2D,Q,t,m.width,m.height,0,t,v,m.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,t,m.width,m.height,0,t,v,m.data);else if(b&&b.isCompressedTexture)for(Q=0,ba=q.length;Q<ba;Q++)m=q[Q],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(t)?c.compressedTexImage2D(a.TEXTURE_2D,Q,t,m.width,m.height,0,m.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(a.TEXTURE_2D, +Q,t,m.width,m.height,0,t,v,m.data);else if(0<q.length&&n){Q=0;for(ba=q.length;Q<ba;Q++)m=q[Q],c.texImage2D(a.TEXTURE_2D,Q,t,t,v,m);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,t,t,v,m);b.generateMipmaps&&n&&a.generateMipmap(a.TEXTURE_2D);p.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_2D,p.__webglTexture)}function r(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f(g.wrapT)),a.texParameteri(c, +a.TEXTURE_MAG_FILTER,f(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,p(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,p(g.minFilter)),1003!==g.minFilter&& +1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",g));!(h=b.get("EXT_texture_filter_anisotropic"))||1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===b.get("OES_texture_half_float_linear")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy= +g.anisotropy)}function t(b,e,g,h){var l=f(e.texture.format),p=f(e.texture.type);c.texImage2D(h,0,l,e.width,e.height,0,l,p,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function v(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER, +b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var z=g.memory,u="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext;this.setTexture2D=n;this.setTextureCube=function(b,g){var p=d.get(b);if(6===b.image.length)if(0<b.version&& +p.__version!==b.version){p.__image__webglTextureCube||(b.addEventListener("dispose",E),p.__image__webglTextureCube=a.createTexture(),z.textures++);c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_CUBE_MAP,p.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);for(var n=b&&b.isCompressedTexture,m=b.image[0]&&b.image[0].isDataTexture,k=[],t=0;6>t;t++)k[t]=n||m?m?b.image[t].image:b.image[t]:h(b.image[t],e.maxCubemapSize);var v=l(k[0]),q=f(b.format),u=f(b.type);r(a.TEXTURE_CUBE_MAP, +b,v);for(t=0;6>t;t++)if(n)for(var B,y=k[t].mipmaps,D=0,N=y.length;D<N;D++)B=y[D],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(q)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+t,D,q,B.width,B.height,0,B.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+t,D,q,B.width,B.height,0,q,u,B.data);else m?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,q,k[t].width, +k[t].height,0,q,u,k[t].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,q,q,u,k[t]);b.generateMipmaps&&v&&a.generateMipmap(a.TEXTURE_CUBE_MAP);p.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+g),c.bindTexture(a.TEXTURE_CUBE_MAP,p.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose", +m);f.__webglTexture=a.createTexture();z.textures++;var g=b&&b.isWebGLRenderTargetCube,h=l(b);if(g){e.__webglFramebuffer=[];for(var p=0;6>p;p++)e.__webglFramebuffer[p]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(g){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);r(a.TEXTURE_CUBE_MAP,b.texture,h);for(p=0;6>p;p++)t(e.__webglFramebuffer[p],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+p);b.texture.generateMipmaps&&h&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP, +null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),r(a.TEXTURE_2D,b.texture,h),t(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),b.texture.generateMipmaps&&h&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=b&&b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");a.bindFramebuffer(a.FRAMEBUFFER, +e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);n(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER, +a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),v(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),v(e.__webglDepthbuffer, +b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture;e.generateMipmaps&&l(b)&&1003!==e.minFilter&&1006!==e.minFilter&&(b=b&&b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function of(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},"delete":function(b){delete a[b.uuid]},clear:function(){a={}}}}function pf(a,b,c){function d(b, +c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==F[b]&&(a.enable(b),F[b]=!0)}function f(b){!1!==F[b]&&(a.disable(b),F[b]=!1)}function g(b,d,g,h,l,p,n,m){0!==b?e(a.BLEND):f(a.BLEND);if(b!==C||m!==Ea)2===b?m?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE, +a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.SRC_ALPHA,a.ONE)):3===b?m?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR)):4===b?m?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR)):m?(a.blendEquationSeparate(a.FUNC_ADD, +a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)),C=b,Ea=m;if(5===b){l=l||d;p=p||g;n=n||h;if(d!==L||l!==ba)a.blendEquationSeparate(c(d),c(l)),L=d,ba=l;if(g!==B||h!==Q||p!==D||n!==y)a.blendFuncSeparate(c(g),c(h),c(p),c(n)),B=g,Q=h,D=p,y=n}else y=D=ba=Q=B=L=null}function h(a){v.setFunc(a)}function l(b){N!==b&&(b?a.frontFace(a.CW): +a.frontFace(a.CCW),N=b)}function p(b){0!==b?(e(a.CULL_FACE),b!==O&&(1===b?a.cullFace(a.BACK):2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);O=b}function k(b){void 0===b&&(b=a.TEXTURE0+V-1);J!==b&&(a.activeTexture(b),J=b)}function m(a,b,c,d){t.setClear(a,b,c,d)}function n(a){v.setClear(a)}function r(a){q.setClear(a)}var t=new function(){var b=!1,c=new ga,d=null,e=new ga;return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b, +d,f,g){c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(0,0,0,1)}}},v=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL); +break;case 6:a.depthFunc(a.GREATER);break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},q=new function(){var b=!1,c=null,d=null,g=null,h=null,l=null,p=null,n=null,m=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!== +e)a.stencilFunc(b,c,e),d=b,g=c,h=e},setOp:function(b,c,d){if(l!==b||p!==c||n!==d)a.stencilOp(b,c,d),l=b,p=c,n=d},setLocked:function(a){b=a},setClear:function(b){m!==b&&(a.clearStencil(b),m=b)},reset:function(){b=!1;m=n=p=l=h=g=d=c=null}}},u=a.getParameter(a.MAX_VERTEX_ATTRIBS),w=new Uint8Array(u),I=new Uint8Array(u),x=new Uint8Array(u),F={},G=null,C=null,L=null,B=null,Q=null,ba=null,D=null,y=null,Ea=!1,N=null,O=null,R=null,S=null,H=null,U=null,V=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),J=null,K= +{},M=new ga,P=new ga,ab={};ab[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);ab[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);return{buffers:{color:t,depth:v,stencil:q},init:function(){m(0,0,0,1);n(1);r(0);e(a.DEPTH_TEST);h(3);l(!1);p(1);e(a.CULL_FACE);e(a.BLEND);g(1)},initAttributes:function(){for(var a=0,b=w.length;a<b;a++)w[a]=0},enableAttribute:function(c){w[c]=1;0===I[c]&&(a.enableVertexAttribArray(c),I[c]=1);0!==x[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c, +0),x[c]=0)},enableAttributeAndDivisor:function(b,c,d){w[b]=1;0===I[b]&&(a.enableVertexAttribArray(b),I[b]=1);x[b]!==c&&(d.vertexAttribDivisorANGLE(b,c),x[b]=c)},disableUnusedAttributes:function(){for(var b=0,c=I.length;b!==c;++b)I[b]!==w[b]&&(a.disableVertexAttribArray(b),I[b]=0)},enable:e,disable:f,getCompressedTextureFormats:function(){if(null===G&&(G=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS), +d=0;d<c.length;d++)G.push(c[d]);return G},setBlending:g,setColorWrite:function(a){t.setMask(a)},setDepthTest:function(a){v.setTest(a)},setDepthWrite:function(a){v.setMask(a)},setDepthFunc:h,setStencilTest:function(a){q.setTest(a)},setStencilWrite:function(a){q.setMask(a)},setStencilFunc:function(a,b,c){q.setFunc(a,b,c)},setStencilOp:function(a,b,c){q.setOp(a,b,c)},setFlipSided:l,setCullFace:p,setLineWidth:function(b){b!==R&&(a.lineWidth(b),R=b)},setPolygonOffset:function(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL), +S!==c||H!==d)a.polygonOffset(c,d),S=c,H=d}else f(a.POLYGON_OFFSET_FILL)},getScissorTest:function(){return U},setScissorTest:function(b){(U=b)?e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:k,bindTexture:function(b,c){null===J&&k();var d=K[J];void 0===d&&(d={type:void 0,texture:void 0},K[J]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||ab[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(b){console.error(b)}},texImage2D:function(){try{a.texImage2D.apply(a, +arguments)}catch(b){console.error(b)}},clearColor:m,clearDepth:n,clearStencil:r,scissor:function(b){!1===M.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),M.copy(b))},viewport:function(b){!1===P.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),P.copy(b))},reset:function(){for(var b=0;b<I.length;b++)1===I[b]&&(a.disableVertexAttribArray(b),I[b]=0);F={};J=G=null;K={};O=N=C=null;t.reset();v.reset();q.reset()}}}function qf(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&& +0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f=void 0!==c.precision?c.precision:"highp",g=d(f);g!==f&&(console.warn("THREE.WebGLRenderer:",f,"not supported, using",g,"instead."),f=g);c=!0===c.logarithmicDepthBuffer&&!!b.get("EXT_frag_depth");var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS), +h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),l=a.getParameter(a.MAX_TEXTURE_SIZE),p=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),k=a.getParameter(a.MAX_VERTEX_ATTRIBS),m=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),n=a.getParameter(a.MAX_VARYING_VECTORS),r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),t=0<h,v=!!b.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT): +0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:l,maxCubemapSize:p,maxAttributes:k,maxVertexUniforms:m,maxVaryings:n,maxFragmentUniforms:r,vertexTextures:t,floatFragmentTextures:v,floatVertexTextures:t&&v}}function rf(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];var d;switch(c){case "WEBGL_depth_texture":d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture"); +break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")|| +a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case "WEBGL_compressed_texture_etc1":d=a.getExtension("WEBGL_compressed_texture_etc1");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function sf(){function a(){p.value!==d&&(p.value=d,p.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=p.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse; +l.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,l),h.normal.toArray(g,d),g[d+3]=h.constant}p.value=g;p.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new sa,l=new ya,p={value:null,needsUpdate:!1};this.uniform=p;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g= +!1;a()};this.setState=function(c,h,l,k,t,v){if(!f||null===c||0===c.length||g&&!l)g?b(null):a();else{l=g?0:e;var q=4*l,u=t.clippingState||null;p.value=u;u=b(c,k,q,v);for(c=0;c!==q;++c)u[c]=d[c];t.clippingState=u;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=l}}}function xd(a){function b(a,b,c,d){!0===L&&(a*=d,b*=d,c*=d);Y.clearColor(a,b,c,d)}function c(){Y.init();Y.scissor(X.copy(ha).multiplyScalar(Ma));Y.viewport(Ua.copy(fa).multiplyScalar(Ma));b(Ba.r,Ba.g,Ba.b,Pa)}function d(){W=P=null; +T="";J=-1;Y.reset()}function e(a){a.preventDefault();d();c();ea.clear()}function f(a){a=a.target;a.removeEventListener("dispose",f);g(a);ea["delete"](a)}function g(a){var b=ea.get(a).program;a.program=void 0;void 0!==b&&ta.releaseProgram(b)}function h(a,b){return Math.abs(b[0])-Math.abs(a[0])}function l(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.material.program&&b.material.program&&a.material.program!==b.material.program?a.material.program.id- +b.material.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function p(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function E(a,b,c,d,e){var f;c.transparent?(d=y,f=++Ea):(d=ba,f=++D);f=d[f];void 0!==f?(f.id=a.id,f.object=a,f.geometry=b,f.material=c,f.z=aa.z,f.group=e):(f={id:a.id,object:a,geometry:b,material:c,z:aa.z,group:e},d.push(f))}function m(a){if(!ma.intersectsSphere(a))return!1; +var b=ca.numPlanes;if(0===b)return!0;var c=S.clippingPlanes,d=a.center;a=-a.radius;var e=0;do if(c[e].distanceToPoint(d)<a)return!1;while(++e!==b);return!0}function n(a,b){if(!1!==a.visible){if(0!==(a.layers.mask&b.layers.mask))if(a.isLight)Q.push(a);else if(a.isSprite){var c;(c=!1===a.frustumCulled)||(la.center.set(0,0,0),la.radius=.7071067811865476,la.applyMatrix4(a.matrixWorld),c=!0===m(la));c&&O.push(a)}else if(a.isLensFlare)R.push(a);else if(a.isImmediateRenderObject)!0===S.sortObjects&&(aa.setFromMatrixPosition(a.matrixWorld), +aa.applyProjection(qa)),E(a,null,a.material,aa.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),(c=!1===a.frustumCulled)||(c=a.geometry,null===c.boundingSphere&&c.computeBoundingSphere(),la.copy(c.boundingSphere).applyMatrix4(a.matrixWorld),c=!0===m(la)),c){var d=a.material;if(!0===d.visible)if(!0===S.sortObjects&&(aa.setFromMatrixPosition(a.matrixWorld),aa.applyProjection(qa)),c=ra.update(a),d.isMultiMaterial)for(var e=c.groups,f=d.materials,d=0,g=e.length;d< +g;d++){var h=e[d],l=f[h.materialIndex];!0===l.visible&&E(a,c,l,aa.z,h)}else E(a,c,d,aa.z,null)}c=a.children;d=0;for(g=c.length;d<g;d++)n(c[d],b)}}function r(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,p=void 0===d?g.material:d,g=g.group;h.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,h.matrixWorld);h.normalMatrix.getNormalMatrix(h.modelViewMatrix);h.onBeforeRender(S,b,c,l,p,g);if(h.isImmediateRenderObject){t(p);var k=v(c,b.fog,p,h);T="";h.render(function(a){S.renderBufferImmediate(a, +k,p)})}else S.renderBufferDirect(c,b.fog,l,p,h,g);h.onAfterRender(S,b,c,l,p,g)}}function t(a){2===a.side?Y.disable(A.CULL_FACE):Y.enable(A.CULL_FACE);Y.setFlipSided(1===a.side);!0===a.transparent?Y.setBlending(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha,a.premultipliedAlpha):Y.setBlending(0);Y.setDepthFunc(a.depthFunc);Y.setDepthTest(a.depthTest);Y.setDepthWrite(a.depthWrite);Y.setColorWrite(a.colorWrite);Y.setPolygonOffset(a.polygonOffset, +a.polygonOffsetFactor,a.polygonOffsetUnits)}function v(a,b,c,d){da=0;var e=ea.get(c);na&&(pa||a!==W)&&ca.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,e,a===W&&c.id===J);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==Z.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===ca.numPlanes&&e.numIntersection===ca.numIntersection||(c.needsUpdate=!0));if(c.needsUpdate){a:{var h=ea.get(c),l=ta.getParameters(c, +Z,b,ca.numPlanes,ca.numIntersection,d),p=ta.getProgramCode(c,l),n=h.program,m=!0;if(void 0===n)c.addEventListener("dispose",f);else if(n.code!==p)g(c);else if(void 0!==l.shaderID)break a;else m=!1;m&&(l.shaderID?(n=Bb[l.shaderID],h.__webglShader={name:c.type,uniforms:k.UniformsUtils.clone(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader}):h.__webglShader={name:c.type,uniforms:c.uniforms,vertexShader:c.vertexShader,fragmentShader:c.fragmentShader},c.__webglShader=h.__webglShader, +n=ta.acquireProgram(c,l,p),h.program=n,c.program=n);l=n.getAttributes();if(c.morphTargets)for(p=c.numSupportedMorphTargets=0;p<S.maxMorphTargets;p++)0<=l["morphTarget"+p]&&c.numSupportedMorphTargets++;if(c.morphNormals)for(p=c.numSupportedMorphNormals=0;p<S.maxMorphNormals;p++)0<=l["morphNormal"+p]&&c.numSupportedMorphNormals++;l=h.__webglShader.uniforms;if(!c.isShaderMaterial&&!c.isRawShaderMaterial||!0===c.clipping)h.numClippingPlanes=ca.numPlanes,h.numIntersection=ca.numIntersection,l.clippingPlanes= +ca.uniform;h.fog=b;h.lightsHash=Z.hash;c.lights&&(l.ambientLightColor.value=Z.ambient,l.directionalLights.value=Z.directional,l.spotLights.value=Z.spot,l.pointLights.value=Z.point,l.hemisphereLights.value=Z.hemi,l.directionalShadowMap.value=Z.directionalShadowMap,l.directionalShadowMatrix.value=Z.directionalShadowMatrix,l.spotShadowMap.value=Z.spotShadowMap,l.spotShadowMatrix.value=Z.spotShadowMatrix,l.pointShadowMap.value=Z.pointShadowMap,l.pointShadowMatrix.value=Z.pointShadowMatrix);p=h.program.getUniforms(); +l=Sa.seqWithValue(p.seq,l);h.uniformsList=l}c.needsUpdate=!1}var E=!1,m=n=!1,h=e.program,l=h.getUniforms(),p=e.__webglShader.uniforms;h.id!==P&&(A.useProgram(h.program),P=h.id,m=n=E=!0);c.id!==J&&(J=c.id,n=!0);if(E||a!==W){l.set(A,a,"projectionMatrix");ka.logarithmicDepthBuffer&&l.setValue(A,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));a!==W&&(W=a,m=n=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)E=l.map.cameraPosition,void 0!==E&&E.setValue(A,aa.setFromMatrixPosition(a.matrixWorld)); +(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&l.setValue(A,"viewMatrix",a.matrixWorldInverse);l.set(A,S,"toneMappingExposure");l.set(A,S,"toneMappingWhitePoint")}c.skinning&&(l.setOptional(A,d,"bindMatrix"),l.setOptional(A,d,"bindMatrixInverse"),a=d.skeleton)&&(ka.floatVertexTextures&&a.useVertexTexture?(l.set(A,a,"boneTexture"),l.set(A,a,"boneTextureWidth"),l.set(A,a,"boneTextureHeight")):l.setOptional(A,a,"boneMatrices")); +if(n){c.lights&&(a=m,p.ambientLightColor.needsUpdate=a,p.directionalLights.needsUpdate=a,p.pointLights.needsUpdate=a,p.spotLights.needsUpdate=a,p.hemisphereLights.needsUpdate=a);b&&c.fog&&(p.fogColor.value=b.color,b.isFog?(p.fogNear.value=b.near,p.fogFar.value=b.far):b.isFogExp2&&(p.fogDensity.value=b.density));if(c.isMeshBasicMaterial||c.isMeshLambertMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.isMeshDepthMaterial){p.opacity.value=c.opacity;p.diffuse.value=c.color;c.emissive&&p.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity); +p.map.value=c.map;p.specularMap.value=c.specularMap;p.alphaMap.value=c.alphaMap;c.aoMap&&(p.aoMap.value=c.aoMap,p.aoMapIntensity.value=c.aoMapIntensity);var r;c.map?r=c.map:c.specularMap?r=c.specularMap:c.displacementMap?r=c.displacementMap:c.normalMap?r=c.normalMap:c.bumpMap?r=c.bumpMap:c.roughnessMap?r=c.roughnessMap:c.metalnessMap?r=c.metalnessMap:c.alphaMap?r=c.alphaMap:c.emissiveMap&&(r=c.emissiveMap);void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),b=r.offset,r=r.repeat,p.offsetRepeat.value.set(b.x, +b.y,r.x,r.y));p.envMap.value=c.envMap;p.flipEnvMap.value=c.envMap&&c.envMap.isCubeTexture?-1:1;p.reflectivity.value=c.reflectivity;p.refractionRatio.value=c.refractionRatio}c.isLineBasicMaterial?(p.diffuse.value=c.color,p.opacity.value=c.opacity):c.isLineDashedMaterial?(p.diffuse.value=c.color,p.opacity.value=c.opacity,p.dashSize.value=c.dashSize,p.totalSize.value=c.dashSize+c.gapSize,p.scale.value=c.scale):c.isPointsMaterial?(p.diffuse.value=c.color,p.opacity.value=c.opacity,p.size.value=c.size* +Ma,p.scale.value=.5*gc,p.map.value=c.map,null!==c.map&&(r=c.map.offset,c=c.map.repeat,p.offsetRepeat.value.set(r.x,r.y,c.x,c.y))):c.isMeshLambertMaterial?(c.lightMap&&(p.lightMap.value=c.lightMap,p.lightMapIntensity.value=c.lightMapIntensity),c.emissiveMap&&(p.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(p.specular.value=c.specular,p.shininess.value=Math.max(c.shininess,1E-4),c.lightMap&&(p.lightMap.value=c.lightMap,p.lightMapIntensity.value=c.lightMapIntensity),c.emissiveMap&&(p.emissiveMap.value= +c.emissiveMap),c.bumpMap&&(p.bumpMap.value=c.bumpMap,p.bumpScale.value=c.bumpScale),c.normalMap&&(p.normalMap.value=c.normalMap,p.normalScale.value.copy(c.normalScale)),c.displacementMap&&(p.displacementMap.value=c.displacementMap,p.displacementScale.value=c.displacementScale,p.displacementBias.value=c.displacementBias)):c.isMeshPhysicalMaterial?(p.clearCoat.value=c.clearCoat,p.clearCoatRoughness.value=c.clearCoatRoughness,z(p,c)):c.isMeshStandardMaterial?z(p,c):c.isMeshDepthMaterial?c.displacementMap&& +(p.displacementMap.value=c.displacementMap,p.displacementScale.value=c.displacementScale,p.displacementBias.value=c.displacementBias):c.isMeshNormalMaterial&&(p.opacity.value=c.opacity);Sa.upload(A,e.uniformsList,p,S)}l.set(A,d,"modelViewMatrix");l.set(A,d,"normalMatrix");l.setValue(A,"modelMatrix",d.matrixWorld);return h}function z(a,b){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap); +b.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}function u(a){var b; +if(1E3===a)return A.REPEAT;if(1001===a)return A.CLAMP_TO_EDGE;if(1002===a)return A.MIRRORED_REPEAT;if(1003===a)return A.NEAREST;if(1004===a)return A.NEAREST_MIPMAP_NEAREST;if(1005===a)return A.NEAREST_MIPMAP_LINEAR;if(1006===a)return A.LINEAR;if(1007===a)return A.LINEAR_MIPMAP_NEAREST;if(1008===a)return A.LINEAR_MIPMAP_LINEAR;if(1009===a)return A.UNSIGNED_BYTE;if(1017===a)return A.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return A.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return A.UNSIGNED_SHORT_5_6_5;if(1010=== +a)return A.BYTE;if(1011===a)return A.SHORT;if(1012===a)return A.UNSIGNED_SHORT;if(1013===a)return A.INT;if(1014===a)return A.UNSIGNED_INT;if(1015===a)return A.FLOAT;if(1016===a&&(b=ia.get("OES_texture_half_float"),null!==b))return b.HALF_FLOAT_OES;if(1021===a)return A.ALPHA;if(1022===a)return A.RGB;if(1023===a)return A.RGBA;if(1024===a)return A.LUMINANCE;if(1025===a)return A.LUMINANCE_ALPHA;if(1026===a)return A.DEPTH_COMPONENT;if(1027===a)return A.DEPTH_STENCIL;if(100===a)return A.FUNC_ADD;if(101=== +a)return A.FUNC_SUBTRACT;if(102===a)return A.FUNC_REVERSE_SUBTRACT;if(200===a)return A.ZERO;if(201===a)return A.ONE;if(202===a)return A.SRC_COLOR;if(203===a)return A.ONE_MINUS_SRC_COLOR;if(204===a)return A.SRC_ALPHA;if(205===a)return A.ONE_MINUS_SRC_ALPHA;if(206===a)return A.DST_ALPHA;if(207===a)return A.ONE_MINUS_DST_ALPHA;if(208===a)return A.DST_COLOR;if(209===a)return A.ONE_MINUS_DST_COLOR;if(210===a)return A.SRC_ALPHA_SATURATE;if(2001===a||2002===a||2003===a||2004===a)if(b=ia.get("WEBGL_compressed_texture_s3tc"), +null!==b){if(2001===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===a||2101===a||2102===a||2103===a)if(b=ia.get("WEBGL_compressed_texture_pvrtc"),null!==b){if(2100===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(2102===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151=== +a&&(b=ia.get("WEBGL_compressed_texture_etc1"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(103===a||104===a)if(b=ia.get("EXT_blend_minmax"),null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=ia.get("WEBGL_depth_texture"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}console.log("THREE.WebGLRenderer","82dev");a=a||{};var w=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),I=void 0!==a.context?a.context:null,x=void 0!==a.alpha? +a.alpha:!1,F=void 0!==a.depth?a.depth:!0,G=void 0!==a.stencil?a.stencil:!0,C=void 0!==a.antialias?a.antialias:!1,L=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,B=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,Q=[],ba=[],D=-1,y=[],Ea=-1,N=new Float32Array(8),O=[],R=[];this.domElement=w;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights= +this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var S=this,P=null,U=null,V=null,J=-1,T="",W=null,X=new ga,ab=null,Ua=new ga,da=0,Ba=new M(0),Pa=0,La=w.width,gc=w.height,Ma=1,ha=new ga(0,0,La,gc),ja=!1,fa=new ga(0,0,La,gc),ma=new ec,ca=new sf,na=!1,pa=!1,la=new Aa,qa=new H,aa=new q,Z={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[], +spotShadowMatrix:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],shadows:[]},oa={calls:0,vertices:0,faces:0,points:0};this.info={render:oa,memory:{geometries:0,textures:0},programs:null};var A;try{x={alpha:x,depth:F,stencil:G,antialias:C,premultipliedAlpha:L,preserveDrawingBuffer:B};A=I||w.getContext("webgl",x)||w.getContext("experimental-webgl",x);if(null===A){if(null!==w.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";throw"Error creating WebGL context."; +}void 0===A.getShaderPrecisionFormat&&(A.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});w.addEventListener("webglcontextlost",e,!1)}catch(tf){console.error("THREE.WebGLRenderer: "+tf)}var ia=new rf(A);ia.get("WEBGL_depth_texture");ia.get("OES_texture_float");ia.get("OES_texture_float_linear");ia.get("OES_texture_half_float");ia.get("OES_texture_half_float_linear");ia.get("OES_standard_derivatives");ia.get("ANGLE_instanced_arrays");ia.get("OES_element_index_uint")&& +(K.MaxIndex=4294967296);var ka=new qf(A,ia,a),Y=new pf(A,ia,u),ea=new of,sa=new nf(A,ia,Y,ea,ka,u,this.info),ra=new mf(A,ea,this.info),ta=new kf(this,ka),ya=new bf;this.info.programs=ta.programs;var Fa=new af(A,ia,oa),Ga=new $e(A,ia,oa),Ia=new Cb(-1,1,1,-1,0,1),wa=new Ca,za=new ua(new db(2,2),new Ha({depthTest:!1,depthWrite:!1,fog:!1}));a=Bb.cube;var va=new ua(new cb(5,5,5),new Da({uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})); +c();this.context=A;this.capabilities=ka;this.extensions=ia;this.properties=ea;this.state=Y;var Ja=new he(this,Z,ra,ka);this.shadowMap=Ja;var Na=new Ze(this,O),Oa=new Xe(this,R);this.getContext=function(){return A};this.getContextAttributes=function(){return A.getContextAttributes()};this.forceContextLoss=function(){ia.get("WEBGL_lose_context").loseContext()};this.getMaxAnisotropy=function(){return ka.getMaxAnisotropy()};this.getPrecision=function(){return ka.precision};this.getPixelRatio=function(){return Ma}; +this.setPixelRatio=function(a){void 0!==a&&(Ma=a,this.setSize(fa.z,fa.w,!1))};this.getSize=function(){return{width:La,height:gc}};this.setSize=function(a,b,c){La=a;gc=b;w.width=a*Ma;w.height=b*Ma;!1!==c&&(w.style.width=a+"px",w.style.height=b+"px");this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){Y.viewport(fa.set(a,b,c,d))};this.setScissor=function(a,b,c,d){Y.scissor(ha.set(a,b,c,d))};this.setScissorTest=function(a){Y.setScissorTest(ja=a)};this.getClearColor=function(){return Ba};this.setClearColor= +function(a,c){Ba.set(a);Pa=void 0!==c?c:1;b(Ba.r,Ba.g,Ba.b,Pa)};this.getClearAlpha=function(){return Pa};this.setClearAlpha=function(a){Pa=a;b(Ba.r,Ba.g,Ba.b,Pa)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=A.COLOR_BUFFER_BIT;if(void 0===b||b)d|=A.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=A.STENCIL_BUFFER_BIT;A.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a, +b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.resetGLState=d;this.dispose=function(){y=[];Ea=-1;ba=[];D=-1;w.removeEventListener("webglcontextlost",e,!1)};this.renderBufferImmediate=function(a,b,c){Y.initAttributes();var d=ea.get(a);a.hasPositions&&!d.position&&(d.position=A.createBuffer());a.hasNormals&&!d.normal&&(d.normal=A.createBuffer());a.hasUvs&&!d.uv&&(d.uv=A.createBuffer());a.hasColors&&!d.color&&(d.color=A.createBuffer());b=b.getAttributes();a.hasPositions&&(A.bindBuffer(A.ARRAY_BUFFER, +d.position),A.bufferData(A.ARRAY_BUFFER,a.positionArray,A.DYNAMIC_DRAW),Y.enableAttribute(b.position),A.vertexAttribPointer(b.position,3,A.FLOAT,!1,0,0));if(a.hasNormals){A.bindBuffer(A.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&1===c.shading)for(var e=0,f=3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,l=(g[e+1]+g[e+4]+g[e+7])/3,p=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=l;g[e+2]=p;g[e+3]=h;g[e+4]=l;g[e+5]=p;g[e+6]=h;g[e+7]=l;g[e+8]=p}A.bufferData(A.ARRAY_BUFFER, +a.normalArray,A.DYNAMIC_DRAW);Y.enableAttribute(b.normal);A.vertexAttribPointer(b.normal,3,A.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(A.bindBuffer(A.ARRAY_BUFFER,d.uv),A.bufferData(A.ARRAY_BUFFER,a.uvArray,A.DYNAMIC_DRAW),Y.enableAttribute(b.uv),A.vertexAttribPointer(b.uv,2,A.FLOAT,!1,0,0));a.hasColors&&0!==c.vertexColors&&(A.bindBuffer(A.ARRAY_BUFFER,d.color),A.bufferData(A.ARRAY_BUFFER,a.colorArray,A.DYNAMIC_DRAW),Y.enableAttribute(b.color),A.vertexAttribPointer(b.color,3,A.FLOAT,!1,0,0));Y.disableUnusedAttributes(); +A.drawArrays(A.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){t(d);var g=v(a,b,d,e),l=!1;a=c.id+"_"+g.id+"_"+d.wireframe;a!==T&&(T=a,l=!0);b=e.morphTargetInfluences;if(void 0!==b){var p=[];a=0;for(var n=b.length;a<n;a++)l=b[a],p.push([l,a]);p.sort(h);8<p.length&&(p.length=8);var m=c.morphAttributes;a=0;for(n=p.length;a<n;a++)l=p[a],N[a]=l[0],0!==l[0]?(b=l[1],!0===d.morphTargets&&m.position&&c.addAttribute("morphTarget"+a,m.position[b]),!0===d.morphNormals&&m.normal&& +c.addAttribute("morphNormal"+a,m.normal[b])):(!0===d.morphTargets&&c.removeAttribute("morphTarget"+a),!0===d.morphNormals&&c.removeAttribute("morphNormal"+a));a=p.length;for(b=N.length;a<b;a++)N[a]=0;g.getUniforms().setValue(A,"morphTargetInfluences",N);l=!0}b=c.index;n=c.attributes.position;p=1;!0===d.wireframe&&(b=ra.getWireframeAttribute(c),p=2);null!==b?(a=Ga,a.setIndex(b)):a=Fa;if(l){a:{var l=void 0,k;if(c&&c.isInstancedBufferGeometry&&(k=ia.get("ANGLE_instanced_arrays"),null===k)){console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); +break a}void 0===l&&(l=0);Y.initAttributes();var m=c.attributes,g=g.getAttributes(),E=d.defaultAttributeValues,r;for(r in g){var w=g[r];if(0<=w){var q=m[r];if(void 0!==q){var u=A.FLOAT,x=q.array,z=q.normalized;x instanceof Float32Array?u=A.FLOAT:x instanceof Float64Array?console.warn("Unsupported data buffer format: Float64Array"):x instanceof Uint16Array?u=A.UNSIGNED_SHORT:x instanceof Int16Array?u=A.SHORT:x instanceof Uint32Array?u=A.UNSIGNED_INT:x instanceof Int32Array?u=A.INT:x instanceof Int8Array? +u=A.BYTE:x instanceof Uint8Array&&(u=A.UNSIGNED_BYTE);var x=q.itemSize,G=ra.getAttributeBuffer(q);if(q.isInterleavedBufferAttribute){var C=q.data,I=C.stride,q=q.offset;C&&C.isInstancedInterleavedBuffer?(Y.enableAttributeAndDivisor(w,C.meshPerAttribute,k),void 0===c.maxInstancedCount&&(c.maxInstancedCount=C.meshPerAttribute*C.count)):Y.enableAttribute(w);A.bindBuffer(A.ARRAY_BUFFER,G);A.vertexAttribPointer(w,x,u,z,I*C.array.BYTES_PER_ELEMENT,(l*I+q)*C.array.BYTES_PER_ELEMENT)}else q.isInstancedBufferAttribute? +(Y.enableAttributeAndDivisor(w,q.meshPerAttribute,k),void 0===c.maxInstancedCount&&(c.maxInstancedCount=q.meshPerAttribute*q.count)):Y.enableAttribute(w),A.bindBuffer(A.ARRAY_BUFFER,G),A.vertexAttribPointer(w,x,u,z,0,l*x*q.array.BYTES_PER_ELEMENT)}else if(void 0!==E&&(u=E[r],void 0!==u))switch(u.length){case 2:A.vertexAttrib2fv(w,u);break;case 3:A.vertexAttrib3fv(w,u);break;case 4:A.vertexAttrib4fv(w,u);break;default:A.vertexAttrib1fv(w,u)}}}Y.disableUnusedAttributes()}null!==b&&A.bindBuffer(A.ELEMENT_ARRAY_BUFFER, +ra.getAttributeBuffer(b))}k=0;null!==b?k=b.count:void 0!==n&&(k=n.count);b=c.drawRange.start*p;n=null!==f?f.start*p:0;r=Math.max(b,n);f=Math.max(0,Math.min(k,b+c.drawRange.count*p,n+(null!==f?f.count*p:Infinity))-1-r+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)Y.setLineWidth(d.wireframeLinewidth*(null===U?Ma:1)),a.setMode(A.LINES);else switch(e.drawMode){case 0:a.setMode(A.TRIANGLES);break;case 1:a.setMode(A.TRIANGLE_STRIP);break;case 2:a.setMode(A.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0=== +d&&(d=1),Y.setLineWidth(d*(null===U?Ma:1)),e.isLineSegments?a.setMode(A.LINES):a.setMode(A.LINE_STRIP)):e.isPoints&&a.setMode(A.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,r,f):a.render(r,f)}};this.render=function(a,c,d,e){if(void 0!==c&&!0!==c.isCamera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else{T="";J=-1;W=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===c.parent&&c.updateMatrixWorld();c.matrixWorldInverse.getInverse(c.matrixWorld); +qa.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse);ma.setFromMatrix(qa);Q.length=0;Ea=D=-1;O.length=0;R.length=0;pa=this.localClippingEnabled;na=ca.init(this.clippingPlanes,pa,c);n(a,c);ba.length=D+1;y.length=Ea+1;!0===S.sortObjects&&(ba.sort(l),y.sort(p));na&&ca.beginShadows();for(var f=Q,g=0,h=0,m=f.length;h<m;h++){var k=f[h];k.castShadow&&(Z.shadows[g++]=k)}Z.shadows.length=g;Ja.render(a,c);for(var f=Q,E=k=0,t=0,v,q,w,u,x=c.matrixWorldInverse,z=0,G=0,C=0,I=0,g=0,h=f.length;g<h;g++)if(m= +f[g],v=m.color,q=m.intensity,w=m.distance,u=m.shadow&&m.shadow.map?m.shadow.map.texture:null,m.isAmbientLight)k+=v.r*q,E+=v.g*q,t+=v.b*q;else if(m.isDirectionalLight){var F=ya.get(m);F.color.copy(m.color).multiplyScalar(m.intensity);F.direction.setFromMatrixPosition(m.matrixWorld);aa.setFromMatrixPosition(m.target.matrixWorld);F.direction.sub(aa);F.direction.transformDirection(x);if(F.shadow=m.castShadow)F.shadowBias=m.shadow.bias,F.shadowRadius=m.shadow.radius,F.shadowMapSize=m.shadow.mapSize;Z.directionalShadowMap[z]= +u;Z.directionalShadowMatrix[z]=m.shadow.matrix;Z.directional[z++]=F}else if(m.isSpotLight){F=ya.get(m);F.position.setFromMatrixPosition(m.matrixWorld);F.position.applyMatrix4(x);F.color.copy(v).multiplyScalar(q);F.distance=w;F.direction.setFromMatrixPosition(m.matrixWorld);aa.setFromMatrixPosition(m.target.matrixWorld);F.direction.sub(aa);F.direction.transformDirection(x);F.coneCos=Math.cos(m.angle);F.penumbraCos=Math.cos(m.angle*(1-m.penumbra));F.decay=0===m.distance?0:m.decay;if(F.shadow=m.castShadow)F.shadowBias= +m.shadow.bias,F.shadowRadius=m.shadow.radius,F.shadowMapSize=m.shadow.mapSize;Z.spotShadowMap[C]=u;Z.spotShadowMatrix[C]=m.shadow.matrix;Z.spot[C++]=F}else if(m.isPointLight){F=ya.get(m);F.position.setFromMatrixPosition(m.matrixWorld);F.position.applyMatrix4(x);F.color.copy(m.color).multiplyScalar(m.intensity);F.distance=m.distance;F.decay=0===m.distance?0:m.decay;if(F.shadow=m.castShadow)F.shadowBias=m.shadow.bias,F.shadowRadius=m.shadow.radius,F.shadowMapSize=m.shadow.mapSize;Z.pointShadowMap[G]= +u;void 0===Z.pointShadowMatrix[G]&&(Z.pointShadowMatrix[G]=new H);aa.setFromMatrixPosition(m.matrixWorld).negate();Z.pointShadowMatrix[G].identity().setPosition(aa);Z.point[G++]=F}else m.isHemisphereLight&&(F=ya.get(m),F.direction.setFromMatrixPosition(m.matrixWorld),F.direction.transformDirection(x),F.direction.normalize(),F.skyColor.copy(m.color).multiplyScalar(q),F.groundColor.copy(m.groundColor).multiplyScalar(q),Z.hemi[I++]=F);Z.ambient[0]=k;Z.ambient[1]=E;Z.ambient[2]=t;Z.directional.length= +z;Z.spot.length=C;Z.point.length=G;Z.hemi.length=I;Z.hash=z+","+G+","+C+","+I+","+Z.shadows.length;na&&ca.endShadows();oa.calls=0;oa.vertices=0;oa.faces=0;oa.points=0;void 0===d&&(d=null);this.setRenderTarget(d);f=a.background;null===f?b(Ba.r,Ba.g,Ba.b,Pa):f&&f.isColor&&(b(f.r,f.g,f.b,1),e=!0);(this.autoClear||e)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);f&&f.isCubeTexture?(wa.projectionMatrix.copy(c.projectionMatrix),wa.matrixWorld.extractRotation(c.matrixWorld), +wa.matrixWorldInverse.getInverse(wa.matrixWorld),va.material.uniforms.tCube.value=f,va.modelViewMatrix.multiplyMatrices(wa.matrixWorldInverse,va.matrixWorld),ra.update(va),S.renderBufferDirect(wa,null,va.geometry,va.material,va,null)):f&&f.isTexture&&(za.material.map=f,ra.update(za),S.renderBufferDirect(Ia,null,za.geometry,za.material,za,null));a.overrideMaterial?(e=a.overrideMaterial,r(ba,a,c,e),r(y,a,c,e)):(Y.setBlending(0),r(ba,a,c),r(y,a,c));Na.render(a,c);Oa.render(a,c,Ua);d&&sa.updateRenderTargetMipmap(d); +Y.setDepthTest(!0);Y.setDepthWrite(!0);Y.setColorWrite(!0)}};this.setFaceCulling=function(a,b){Y.setCullFace(a);Y.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=da;a>=ka.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+ka.maxTextures);da+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."), +a=!0),b=b.texture);sa.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);sa.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&& +6===b.image.length?sa.setTextureCube(b,c):sa.setTextureCubeDynamic(b,c)}}();this.getCurrentRenderTarget=function(){return U};this.setRenderTarget=function(a){(U=a)&&void 0===ea.get(a).__webglFramebuffer&&sa.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,c;a?(c=ea.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,X.copy(a.scissor),ab=a.scissorTest,Ua.copy(a.viewport)):(c=null,X.copy(ha).multiplyScalar(Ma),ab=ja,Ua.copy(fa).multiplyScalar(Ma));V!==c&&(A.bindFramebuffer(A.FRAMEBUFFER, +c),V=c);Y.scissor(X);Y.setScissorTest(ab);Y.viewport(Ua);b&&(b=ea.get(a.texture),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(!1===(a&&a.isWebGLRenderTarget))console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");else{var g=ea.get(a).__webglFramebuffer;if(g){var h=!1;g!==V&&(A.bindFramebuffer(A.FRAMEBUFFER, +g),h=!0);try{var l=a.texture,p=l.format,m=l.type;1023!==p&&u(p)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===m||u(m)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===m&&(ia.get("OES_texture_float")||ia.get("WEBGL_color_buffer_float"))||1016===m&&ia.get("EXT_color_buffer_half_float")?A.checkFramebufferStatus(A.FRAMEBUFFER)===A.FRAMEBUFFER_COMPLETE?0<=b&& +b<=a.width-d&&0<=c&&c<=a.height-e&&A.readPixels(b,c,d,e,u(p),u(m),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&A.bindFramebuffer(A.FRAMEBUFFER,V)}}}}}function Db(a,b){this.name="";this.color=new M(a);this.density=void 0!==b?b:2.5E-4}function Eb(a,b,c){this.name="";this.color= +new M(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function eb(){y.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function yd(a,b,c,d,e){y.call(this);this.lensFlares=[];this.positionScreen=new q;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function fb(a){T.call(this);this.type="SpriteMaterial";this.color=new M(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function hc(a){y.call(this); +this.type="Sprite";this.material=void 0!==a?a:new fb}function ic(){y.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function gb(a,b,c,d,e,f,g,h,l,p,k,m){da.call(this,null,f,g,h,l,p,d,e,k,m);this.image={data:a,width:b,height:c};this.magFilter=void 0!==l?l:1003;this.minFilter=void 0!==p?p:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function Wc(a,b,c){this.useVertexTexture=void 0!==c?c:!0;this.identityMatrix=new H;a=a||[];this.bones=a.slice(0); +this.useVertexTexture?(a=Math.sqrt(4*this.bones.length),a=k.Math.nextPowerOfTwo(Math.ceil(a)),this.boneTextureHeight=this.boneTextureWidth=a=Math.max(a,4),this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new gb(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,1023,1015)):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 H)}function Xc(a){y.call(this);this.type="Bone";this.skin=a}function Yc(a,b,c){ua.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new H;this.bindMatrixInverse=new H;a=[];if(this.geometry&&void 0!==this.geometry.bones){for(var d,e=0,f=this.geometry.bones.length;e<f;++e)d=this.geometry.bones[e],b=new Xc(this),a.push(b),b.name=d.name,b.position.fromArray(d.pos),b.quaternion.fromArray(d.rotq), +void 0!==d.scl&&b.scale.fromArray(d.scl);e=0;for(f=this.geometry.bones.length;e<f;++e)d=this.geometry.bones[e],-1!==d.parent&&null!==d.parent&&void 0!==a[d.parent]?a[d.parent].add(a[e]):this.add(a[e])}this.normalizeSkinWeights();this.updateMatrixWorld(!0);this.bind(new Wc(a,void 0,c),this.matrixWorld)}function ma(a){T.call(this);this.type="LineBasicMaterial";this.color=new M(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.lights=!1;this.setValues(a)}function Na(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."), +new ja(a,b);y.call(this);this.type="Line";this.geometry=void 0!==a?a:new K;this.material=void 0!==b?b:new ma({color:16777215*Math.random()})}function ja(a,b){Na.call(this,a,b);this.type="LineSegments"}function Ia(a){T.call(this);this.type="PointsMaterial";this.color=new M(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Fb(a,b){y.call(this);this.type="Points";this.geometry=void 0!==a?a:new K;this.material=void 0!==b?b:new Ia({color:16777215*Math.random()})} +function jc(){y.call(this);this.type="Group"}function Zc(a,b,c,d,e,f,g,h,l){function p(){requestAnimationFrame(p);a.readyState>=a.HAVE_CURRENT_DATA&&(k.needsUpdate=!0)}da.call(this,a,b,c,d,e,f,g,h,l);this.generateMipmaps=!1;var k=this;p()}function Gb(a,b,c,d,e,f,g,h,l,p,k,m){da.call(this,null,f,g,h,l,p,d,e,k,m);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function $c(a,b,c,d,e,f,g,h,l){da.call(this,a,b,c,d,e,f,g,h,l);this.needsUpdate=!0}function kc(a,b,c,d,e,f,g, +h,l,p){p=void 0!==p?p:1026;if(1026!==p&&1027!==p)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");da.call(this,null,d,e,f,g,h,p,c,l);this.image={width:a,height:b};this.type=void 0!==c?c:1012;this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Hb(a){function b(a,b){return a-b}K.call(this);var c=[0,0],d={},e=["a","b","c"];if(a&&a.isGeometry){var f=a.vertices,g=a.faces,h=0,l=new Uint32Array(6*g.length); +a=0;for(var p=g.length;a<p;a++)for(var k=g[a],m=0;3>m;m++){c[0]=k[e[m]];c[1]=k[e[(m+1)%3]];c.sort(b);var n=c.toString();void 0===d[n]&&(l[2*h]=c[0],l[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(p=h;a<p;a++)for(m=0;2>m;m++)d=f[l[2*a+m]],h=6*a+3*m,c[h+0]=d.x,c[h+1]=d.y,c[h+2]=d.z;this.addAttribute("position",new D(c,3))}else if(a&&a.isBufferGeometry){if(null!==a.index){p=a.index.array;f=a.attributes.position;e=a.groups;h=0;0===e.length&&a.addGroup(0,p.length);l=new Uint32Array(2*p.length); +g=0;for(k=e.length;g<k;++g){a=e[g];m=a.start;n=a.count;a=m;for(var r=m+n;a<r;a+=3)for(m=0;3>m;m++)c[0]=p[a+m],c[1]=p[a+(m+1)%3],c.sort(b),n=c.toString(),void 0===d[n]&&(l[2*h]=c[0],l[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(p=h;a<p;a++)for(m=0;2>m;m++)h=6*a+3*m,d=l[2*a+m],c[h+0]=f.getX(d),c[h+1]=f.getY(d),c[h+2]=f.getZ(d)}else for(f=a.attributes.position.array,h=f.length/3,l=h/3,c=new Float32Array(6*h),a=0,p=l;a<p;a++)for(m=0;3>m;m++)h=18*a+6*m,l=9*a+3*m,c[h+0]=f[l],c[h+1]=f[l+1], +c[h+2]=f[l+2],d=9*a+(m+1)%3*3,c[h+3]=f[d],c[h+4]=f[d+1],c[h+5]=f[d+2];this.addAttribute("position",new D(c,3))}}function Ib(a,b,c){K.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f,g,h,l,p,k=b+1;for(f=0;f<=c;f++)for(p=f/c,g=0;g<=b;g++)l=g/b,h=a(l,p),d.push(h.x,h.y,h.z),e.push(l,p);a=[];var m;for(f=0;f<c;f++)for(g=0;g<b;g++)h=f*k+g,l=f*k+g+1,p=(f+1)*k+g+1,m=(f+1)*k+g,a.push(h,l,m),a.push(l,p,m);this.setIndex((65535<a.length?Uc:Tc)(a,1));this.addAttribute("position", +ha(d,3));this.addAttribute("uv",ha(e,2));this.computeVertexNormals()}function lc(a,b,c){P.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Ib(a,b,c));this.mergeVertices()}function ka(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){var d=3*b;c.x=a[d+0];c.y=a[d+1];c.z=a[d+2]}function g(a,b,c,d){0>d&&1===a.x&&(l[b]=a.x-1);0===c.x&&0===c.z&&(l[b]=d/2/Math.PI+.5)}K.call(this);this.type="PolyhedronBufferGeometry";this.parameters= +{vertices:a,indices:b,radius:c,detail:d};c=c||1;var h=[],l=[];(function(a){for(var c=new q,d=new q,g=new q,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var l=c,k=d,z=g,u=Math.pow(2,a),w=[],I,x;for(I=0;I<=u;I++){w[I]=[];var F=l.clone().lerp(z,I/u),G=k.clone().lerp(z,I/u),C=u-I;for(x=0;x<=C;x++)w[I][x]=0===x&&I===u?F:F.clone().lerp(G,x/C)}for(I=0;I<u;I++)for(x=0;x<2*(u-I)-1;x++)l=Math.floor(x/2),0===x%2?(e(w[I][l+1]),e(w[I+1][l]),e(w[I][l])):(e(w[I][l+1]),e(w[I+1][l+1]),e(w[I+1][l]))}})(d|| +0);(function(a){for(var b=new q,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new q,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],l.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));for(var a=new q,b=new q,c=new q,d=new q,e=new B,f=new B,k=new B,z=0,u=0;z<h.length;z+=9,u+=6){a.set(h[z+0],h[z+1],h[z+2]);b.set(h[z+3],h[z+4],h[z+5]);c.set(h[z+6],h[z+ +7],h[z+8]);e.set(l[u+0],l[u+1]);f.set(l[u+2],l[u+3]);k.set(l[u+4],l[u+5]);d.copy(a).add(b).add(c).divideScalar(3);var w=Math.atan2(d.z,-d.x);g(e,u+0,a,w);g(f,u+2,b,w);g(k,u+4,c,w)}for(a=0;a<l.length;a+=6)b=l[a+0],c=l[a+2],d=l[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(l[a+0]+=1),.2>c&&(l[a+2]+=1),.2>d&&(l[a+4]+=1))})();this.addAttribute("position",ha(h,3));this.addAttribute("normal",ha(h.slice(),3));this.addAttribute("uv",ha(l,2));this.normalizeNormals();this.boundingSphere=new Aa(new q, +c)}function mc(a,b){ka.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);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function nc(a,b){P.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new THREE.TetrahedronBufferGeometry(a,b));this.mergeVertices()}function oc(a,b){ka.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);this.type="OctahedronBufferGeometry"; +this.parameters={radius:a,detail:b}}function pc(a,b){P.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new THREE.OctahedronBufferGeometry(a,b));this.mergeVertices()}function qc(a,b){var c=(1+Math.sqrt(5))/2;ka.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);this.type= +"IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function rc(a,b){P.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new THREE.IcosahedronBufferGeometry(a,b));this.mergeVertices()}function sc(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;ka.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15, +17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function tc(a,b){P.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new THREE.DodecahedronBufferGeometry(a,b));this.mergeVertices()}function uc(a, +b,c,d){P.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new ka(a,b,c,d));this.mergeVertices()}function Jb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),p=g.normals[e];e=g.binormals[e];for(m=0;m<=d;m++){var k=m/d*Math.PI*2,E=Math.sin(k),k=-Math.cos(k);l.x=k*p.x+E*e.x;l.y=k*p.y+E*e.y;l.z=k*p.z+E*e.z;l.normalize();r.push(l.x,l.y,l.z);h.x=f.x+c*l.x;h.y=f.y+c*l.y;h.z=f.z+c*l.z;n.push(h.x,h.y,h.z)}}K.call(this);this.type="TubeBufferGeometry"; +this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new q,l=new q,p=new B,k,m,n=[],r=[],t=[],v=[];for(k=0;k<b;k++)f(k);f(!1===e?b:0);for(k=0;k<=b;k++)for(m=0;m<=d;m++)p.x=k/b,p.y=m/d,t.push(p.x,p.y);(function(){for(m=1;m<=b;m++)for(k=1;k<=d;k++){var a=(d+1)*m+(k-1),c=(d+1)*m+k,e=(d+1)*(m-1)+k;v.push((d+1)*(m-1)+(k-1),a,e);v.push(a, +c,e)}})();this.setIndex((65535<v.length?Uc:Tc)(v,1));this.addAttribute("position",ha(n,3));this.addAttribute("normal",ha(r,3));this.addAttribute("uv",ha(t,2))}function vc(a,b,c,d,e,f){P.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Jb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()} +function Kb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}K.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||100;b=b||40;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=(d+1)*(c+1),l=d*c*6,l=new D(new (65535<l?Uint32Array:Uint16Array)(l),1),p=new D(new Float32Array(3*h),3),k=new D(new Float32Array(3*h),3),h=new D(new Float32Array(2* +h),2),m,n,r=0,t=0,v=new q,z=new q,u=new B,w=new q,I=new q,x=new q,F=new q,G=new q;for(m=0;m<=c;++m)for(n=m/c*e*Math.PI*2,g(n,e,f,a,w),g(n+.01,e,f,a,I),F.subVectors(I,w),G.addVectors(I,w),x.crossVectors(F,G),G.crossVectors(x,F),x.normalize(),G.normalize(),n=0;n<=d;++n){var C=n/d*Math.PI*2,L=-b*Math.cos(C),C=b*Math.sin(C);v.x=w.x+(L*G.x+C*x.x);v.y=w.y+(L*G.y+C*x.y);v.z=w.z+(L*G.z+C*x.z);p.setXYZ(r,v.x,v.y,v.z);z.subVectors(v,w).normalize();k.setXYZ(r,z.x,z.y,z.z);u.x=m/c;u.y=n/d;h.setXY(r,u.x,u.y); +r++}for(n=1;n<=c;n++)for(m=1;m<=d;m++)a=(d+1)*n+(m-1),b=(d+1)*n+m,e=(d+1)*(n-1)+m,l.setX(t,(d+1)*(n-1)+(m-1)),t++,l.setX(t,a),t++,l.setX(t,e),t++,l.setX(t,a),t++,l.setX(t,b),t++,l.setX(t,e),t++;this.setIndex(l);this.addAttribute("position",p);this.addAttribute("normal",k);this.addAttribute("uv",h)}function wc(a,b,c,d,e,f,g){P.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead."); +this.fromBufferGeometry(new Kb(a,b,c,d,e,f));this.mergeVertices()}function Lb(a,b,c,d,e){K.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=b||40;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=(c+1)*(d+1),g=c*d*6,g=new (65535<g?Uint32Array:Uint16Array)(g),h=new Float32Array(3*f),l=new Float32Array(3*f),f=new Float32Array(2*f),p=0,k=0,m=0,n=new q,r=new q,t=new q,v,z;for(v=0;v<=c;v++)for(z=0;z<=d;z++){var u= +z/d*e,w=v/c*Math.PI*2;r.x=(a+b*Math.cos(w))*Math.cos(u);r.y=(a+b*Math.cos(w))*Math.sin(u);r.z=b*Math.sin(w);h[p]=r.x;h[p+1]=r.y;h[p+2]=r.z;n.x=a*Math.cos(u);n.y=a*Math.sin(u);t.subVectors(r,n).normalize();l[p]=t.x;l[p+1]=t.y;l[p+2]=t.z;f[k]=z/d;f[k+1]=v/c;p+=3;k+=2}for(v=1;v<=c;v++)for(z=1;z<=d;z++)a=(d+1)*(v-1)+z-1,b=(d+1)*(v-1)+z,e=(d+1)*v+z,g[m]=(d+1)*v+z-1,g[m+1]=a,g[m+2]=e,g[m+3]=a,g[m+4]=b,g[m+5]=e,m+=6;this.setIndex(new D(g,1));this.addAttribute("position",new D(h,3));this.addAttribute("normal", +new D(l,3));this.addAttribute("uv",new D(f,2))}function xc(a,b,c,d,e){P.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Lb(a,b,c,d,e))}function ra(a,b){"undefined"!==typeof a&&(P.call(this),this.type="ExtrudeGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeFaceNormals())}function yc(a,b){b=b||{};var c=b.font;if(!1===(c&&c.isFont))return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."), +new P;c=c.generateShapes(a,b.size,b.curveSegments);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);ra.call(this,c,b);this.type="TextGeometry"}function hb(a,b,c,d,e,f,g){K.call(this);this.type="SphereBufferGeometry";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;for(var h=f+g,l=(b+1)*(c+1),p=new D(new Float32Array(3*l),3),k=new D(new Float32Array(3*l),3),l=new D(new Float32Array(2*l),2),m=0,n=[],r=new q,t=0;t<=c;t++){for(var v=[],z=t/c,u=0;u<=b;u++){var w=u/b,I=-a*Math.cos(d+w*e)*Math.sin(f+z*g),x=a*Math.cos(f+z*g),F=a*Math.sin(d+w*e)*Math.sin(f+z*g);r.set(I,x,F).normalize();p.setXYZ(m,I,x,F);k.setXYZ(m,r.x,r.y,r.z);l.setXY(m,w,1-z);v.push(m);m++}n.push(v)}d=[];for(t=0;t< +c;t++)for(u=0;u<b;u++)e=n[t][u+1],g=n[t][u],m=n[t+1][u],r=n[t+1][u+1],(0!==t||0<f)&&d.push(e,g,r),(t!==c-1||h<Math.PI)&&d.push(g,m,r);this.setIndex(new (65535<p.count?Uc:Tc)(d,1));this.addAttribute("position",p);this.addAttribute("normal",k);this.addAttribute("uv",l);this.boundingSphere=new Aa(new q,a)}function Mb(a,b,c,d,e,f,g){P.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new hb(a, +b,c,d,e,f,g))}function Nb(a,b,c,d,e,f){K.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||20;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):1;var g=(c+1)*(d+1),h=c*d*6,h=new D(new (65535<h?Uint32Array:Uint16Array)(h),1),l=new D(new Float32Array(3*g),3),p=new D(new Float32Array(3*g),3),g=new D(new Float32Array(2*g),2),k=0,m=0,n,r=a,t=(b-a)/ +d,v=new q,z=new B,u;for(a=0;a<=d;a++){for(u=0;u<=c;u++)n=e+u/c*f,v.x=r*Math.cos(n),v.y=r*Math.sin(n),l.setXYZ(k,v.x,v.y,v.z),p.setXYZ(k,0,0,1),z.x=(v.x/b+1)/2,z.y=(v.y/b+1)/2,g.setXY(k,z.x,z.y),k++;r+=t}for(a=0;a<d;a++)for(b=a*(c+1),u=0;u<c;u++)e=n=u+b,f=n+c+1,k=n+c+2,n+=1,h.setX(m,e),m++,h.setX(m,f),m++,h.setX(m,k),m++,h.setX(m,e),m++,h.setX(m,k),m++,h.setX(m,n),m++;this.setIndex(h);this.addAttribute("position",l);this.addAttribute("normal",p);this.addAttribute("uv",g)}function zc(a,b,c,d,e,f){P.call(this); +this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Nb(a,b,c,d,e,f))}function Ac(a,b,c,d){P.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new db(a,b,c,d))}function Ob(a,b,c,d){K.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d|| +2*Math.PI;d=k.Math.clamp(d,0,2*Math.PI);for(var e=(b+1)*a.length,f=b*a.length*6,g=new D(new (65535<f?Uint32Array:Uint16Array)(f),1),h=new D(new Float32Array(3*e),3),l=new D(new Float32Array(2*e),2),p=0,E=0,m=1/b,n=new q,r=new B,e=0;e<=b;e++)for(var f=c+e*m*d,t=Math.sin(f),v=Math.cos(f),f=0;f<=a.length-1;f++)n.x=a[f].x*t,n.y=a[f].y,n.z=a[f].x*v,h.setXYZ(p,n.x,n.y,n.z),r.x=e/b,r.y=f/(a.length-1),l.setXY(p,r.x,r.y),p++;for(e=0;e<b;e++)for(f=0;f<a.length-1;f++)c=f+e*a.length,p=c+a.length,m=c+a.length+ +1,n=c+1,g.setX(E,c),E++,g.setX(E,p),E++,g.setX(E,n),E++,g.setX(E,p),E++,g.setX(E,m),E++,g.setX(E,n),E++;this.setIndex(g);this.addAttribute("position",h);this.addAttribute("uv",l);this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,g=new q,h=new q,l=new q,c=b*a.length*3,f=e=0;e<a.length;e++,f+=3)g.x=d[f+0],g.y=d[f+1],g.z=d[f+2],h.x=d[c+f+0],h.y=d[c+f+1],h.z=d[c+f+2],l.addVectors(g,h).normalize(),d[f+0]=d[c+f+0]=l.x,d[f+1]=d[c+f+1]=l.y,d[f+2]=d[c+f+2]=l.z}function Bc(a,b, +c,d){P.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Ob(a,b,c,d));this.mergeVertices()}function Xa(a,b){P.call(this);this.type="ShapeGeometry";!1===Array.isArray(a)&&(a=[a]);this.addShapeList(a,b);this.computeFaceNormals()}function Pb(a,b){function c(a,b){return a-b}K.call(this);var d=Math.cos(k.Math.DEG2RAD*(void 0!==b?b:1)),e=[0,0],f={},g=["a","b","c"],h;a&&a.isBufferGeometry?(h=new P,h.fromBufferGeometry(a)):h=a.clone(); +h.mergeVertices();h.computeFaceNormals();var l=h.vertices;h=h.faces;for(var p=0,E=h.length;p<E;p++)for(var m=h[p],n=0;3>n;n++){e[0]=m[g[n]];e[1]=m[g[(n+1)%3]];e.sort(c);var r=e.toString();void 0===f[r]?f[r]={vert1:e[0],vert2:e[1],face1:p,face2:void 0}:f[r].face2=p}e=[];for(r in f)if(g=f[r],void 0===g.face2||h[g.face1].normal.dot(h[g.face2].normal)<=d)p=l[g.vert1],e.push(p.x),e.push(p.y),e.push(p.z),p=l[g.vert2],e.push(p.x),e.push(p.y),e.push(p.z);this.addAttribute("position",new D(new Float32Array(e), +3))}function Ya(a,b,c,d,e,f,g,h){function l(c){var e,f,l,k=new B,m=new q,n=0,E=!0===c?a:b,I=!0===c?1:-1;f=u;for(e=1;e<=d;e++)t.setXYZ(u,0,x*I,0),v.setXYZ(u,0,I,0),k.x=.5,k.y=.5,z.setXY(u,k.x,k.y),u++;l=u;for(e=0;e<=d;e++){var y=e/d*h+g,D=Math.cos(y),y=Math.sin(y);m.x=E*y;m.y=x*I;m.z=E*D;t.setXYZ(u,m.x,m.y,m.z);v.setXYZ(u,0,I,0);k.x=.5*D+.5;k.y=.5*y*I+.5;z.setXY(u,k.x,k.y);u++}for(e=0;e<d;e++)k=f+e,m=l+e,!0===c?(r.setX(w,m),w++,r.setX(w,m+1)):(r.setX(w,m+1),w++,r.setX(w,m)),w++,r.setX(w,k),w++,n+= +3;p.addGroup(F,n,!0===c?1:2);F+=n}K.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var p=this;a=void 0!==a?a:20;b=void 0!==b?b:20;c=void 0!==c?c:100;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var k=0;!1===f&&(0<a&&k++,0<b&&k++);var m=function(){var a=(d+1)*(e+1);!1===f&&(a+=(d+1)*k+d*k);return a}(),n=function(){var a=d* +e*6;!1===f&&(a+=d*k*3);return a}(),r=new D(new (65535<n?Uint32Array:Uint16Array)(n),1),t=new D(new Float32Array(3*m),3),v=new D(new Float32Array(3*m),3),z=new D(new Float32Array(2*m),2),u=0,w=0,I=[],x=c/2,F=0;(function(){var f,l,k=new q,m=new q,n=0,E=(b-a)/c;for(l=0;l<=e;l++){var B=[],y=l/e,D=y*(b-a)+a;for(f=0;f<=d;f++){var N=f/d,O=N*h+g,R=Math.sin(O),O=Math.cos(O);m.x=D*R;m.y=-y*c+x;m.z=D*O;t.setXYZ(u,m.x,m.y,m.z);k.set(R,E,O).normalize();v.setXYZ(u,k.x,k.y,k.z);z.setXY(u,N,1-y);B.push(u);u++}I.push(B)}for(f= +0;f<d;f++)for(l=0;l<e;l++)k=I[l+1][f],m=I[l+1][f+1],E=I[l][f+1],r.setX(w,I[l][f]),w++,r.setX(w,k),w++,r.setX(w,E),w++,r.setX(w,k),w++,r.setX(w,m),w++,r.setX(w,E),w++,n+=6;p.addGroup(F,n,0);F+=n})();!1===f&&(0<a&&l(!0),0<b&&l(!1));this.setIndex(r);this.addAttribute("position",t);this.addAttribute("normal",v);this.addAttribute("uv",z)}function ib(a,b,c,d,e,f,g,h){P.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f, +thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Ya(a,b,c,d,e,f,g,h));this.mergeVertices()}function Cc(a,b,c,d,e,f,g){ib.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Dc(a,b,c,d,e,f,g){Ya.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,thetaStart:f,thetaLength:g}}function Qb(a,b,c,d){K.call(this); +this.type="CircleBufferGeometry";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=b+2,f=new Float32Array(3*e),g=new Float32Array(3*e),e=new Float32Array(2*e);g[2]=1;e[0]=.5;e[1]=.5;for(var h=0,l=3,p=2;h<=b;h++,l+=3,p+=2){var k=c+h/b*d;f[l]=a*Math.cos(k);f[l+1]=a*Math.sin(k);g[l+2]=1;e[p]=(f[l]/a+1)/2;e[p+1]=(f[l+1]/a+1)/2}c=[];for(l=1;l<=b;l++)c.push(l,l+1,0);this.setIndex(new D(new Uint16Array(c), +1));this.addAttribute("position",new D(f,3));this.addAttribute("normal",new D(g,3));this.addAttribute("uv",new D(e,2));this.boundingSphere=new Aa(new q,a)}function Ec(a,b,c,d){P.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new Qb(a,b,c,d))}function jb(a,b,c,d,e,f){P.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new cb(a, +b,c,d,e,f));this.mergeVertices()}function Rb(){Da.call(this,{uniforms:k.UniformsUtils.merge([W.lights,{opacity:{value:1}}]),vertexShader:X.shadow_vert,fragmentShader:X.shadow_frag});this.transparent=this.lights=!0;Object.defineProperties(this,{opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(a){this.uniforms.opacity.value=a}}})}function Sb(a){Da.call(this,a);this.type="RawShaderMaterial"}function Fc(a){this.uuid=k.Math.generateUUID();this.type="MultiMaterial"; +this.materials=a instanceof Array?a:[];this.visible=!0}function va(a){T.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=new M(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new M(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new B(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias= +0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function kb(a){va.call(this);this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Za(a){T.call(this);this.type="MeshPhongMaterial"; +this.color=new M(16777215);this.specular=new M(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new M(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new B(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe= +!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function lb(a){T.call(this,a);this.type="MeshNormalMaterial";this.wireframe=!1;this.wireframeLinewidth=1;this.morphTargets=this.lights=this.fog=!1;this.setValues(a)}function mb(a){T.call(this);this.type="MeshLambertMaterial";this.color=new M(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive= +new M(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function nb(a){T.call(this);this.type="LineDashedMaterial";this.color=new M(16777215);this.scale=this.linewidth=1;this.dashSize=3;this.gapSize=1;this.lights=!1;this.setValues(a)} +function zd(a,b,c){var d=this,e=!1,f=0,g=0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)}}function wa(a){this.manager=void 0!==a?a:k.DefaultLoadingManager}function oe(a){this.manager=void 0!==a?a:k.DefaultLoadingManager; +this._parser=null}function Ad(a){this.manager=void 0!==a?a:k.DefaultLoadingManager;this._parser=null}function Gc(a){this.manager=void 0!==a?a:k.DefaultLoadingManager}function Bd(a){this.manager=void 0!==a?a:k.DefaultLoadingManager}function ad(a){this.manager=void 0!==a?a:k.DefaultLoadingManager}function na(a,b){y.call(this);this.type="Light";this.color=new M(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function bd(a,b,c){na.call(this,a,c);this.type="HemisphereLight";this.castShadow= +void 0;this.position.copy(y.DefaultUp);this.updateMatrix();this.groundColor=new M(b)}function ob(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new B(512,512);this.map=null;this.matrix=new H}function cd(){ob.call(this,new Ca(50,1,.5,500))}function dd(a,b,c,d,e,f){na.call(this,a,b);this.type="SpotLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}}); +this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new cd}function ed(a,b,c,d){na.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new ob(new Ca(90,1,.5,500))}function fd(a){ob.call(this,new Cb(-5,5,5,-5,.5,500))}function gd(a,b){na.call(this, +a,b);this.type="DirectionalLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;this.shadow=new fd}function hd(a,b){na.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function ea(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function id(a,b,c,d){ea.call(this,a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function Hc(a,b,c,d){ea.call(this, +a,b,c,d)}function jd(a,b,c,d){ea.call(this,a,b,c,d)}function pb(a,b,c,d){if(void 0===a)throw Error("track name is undefined");if(void 0===b||0===b.length)throw Error("no keyframes in track named "+a);this.name=a;this.times=k.AnimationUtils.convertArray(b,this.TimeBufferType);this.values=k.AnimationUtils.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function Tb(a,b,c,d){pb.call(this,a,b,c,d)}function kd(a,b,c,d){ea.call(this, +a,b,c,d)}function Ic(a,b,c,d){pb.call(this,a,b,c,d)}function Ub(a,b,c,d){pb.call(this,a,b,c,d)}function ld(a,b,c,d){pb.call(this,a,b,c,d)}function md(a,b,c){pb.call(this,a,b,c)}function nd(a,b,c,d){pb.call(this,a,b,c,d)}function qb(a,b,c,d){pb.apply(this,arguments)}function ta(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=k.Math.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function od(a){this.manager=void 0!==a?a:k.DefaultLoadingManager;this.textures= +{}}function Cd(a){this.manager=void 0!==a?a:k.DefaultLoadingManager}function rb(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function Dd(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:k.DefaultLoadingManager;this.withCredentials=!1}function pe(a){this.manager=void 0!==a?a:k.DefaultLoadingManager;this.texturePath=""}function aa(){}function Ja(a, +b){this.v1=a;this.v2=b}function Jc(){this.curves=[];this.autoClose=!1}function Oa(a,b,c,d,e,f,g,h){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g;this.aRotation=h||0}function sb(a){this.points=void 0===a?[]:a}function tb(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d}function ub(a,b,c){this.v0=a;this.v1=b;this.v2=c}function vb(){Kc.apply(this,arguments);this.holes=[]}function Kc(a){Jc.call(this);this.currentPoint=new B;a&&this.fromPoints(a)} +function Ed(){this.subPaths=[];this.currentPath=null}function Fd(a){this.data=a}function qe(a){this.manager=void 0!==a?a:k.DefaultLoadingManager}function Gd(){void 0===Hd&&(Hd=new (window.AudioContext||window.webkitAudioContext));return Hd}function Id(a){this.manager=void 0!==a?a:k.DefaultLoadingManager}function re(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Ca;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Ca;this.cameraR.layers.enable(2); +this.cameraR.matrixAutoUpdate=!1}function pd(a,b,c){y.call(this);this.type="CubeCamera";var d=new Ca(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new q(1,0,0));this.add(d);var e=new Ca(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new q(-1,0,0));this.add(e);var f=new Ca(90,1,a,b);f.up.set(0,0,1);f.lookAt(new q(0,1,0));this.add(f);var g=new Ca(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new q(0,-1,0));this.add(g);var h=new Ca(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new q(0,0,1));this.add(h);var l=new Ca(90,1,a,b);l.up.set(0,-1, +0);l.lookAt(new q(0,0,-1));this.add(l);this.renderTarget=new zb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,k=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=k;c.activeCubeFace=5;a.render(b, +l,c);a.setRenderTarget(null)}}function Jd(){y.call(this);this.type="AudioListener";this.context=Gd();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function Vb(a){y.call(this);this.type="Audio";this.context=a.context;this.source=this.context.createBufferSource();this.source.onended=this.onEnded.bind(this);this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl= +!0;this.sourceType="empty";this.filters=[]}function Kd(a){Vb.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function Ld(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function qd(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select; +break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function fa(a,b,c){this.path=b;this.parsedPath=c||fa.parseTrackName(b);this.node=fa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Md(a){this.uuid=k.Math.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!==d;++c)b[arguments[c].uuid]=c;this._paths= +[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function Nd(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants= +c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Od(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function se(a, +b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function wb(){K.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function Pd(a,b,c,d){this.uuid=k.Math.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function Wb(a,b){this.uuid=k.Math.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function Xb(a, +b,c){Wb.call(this,a,b);this.meshPerAttribute=c||1}function Yb(a,b,c){D.call(this,a,b);this.meshPerAttribute=c||1}function Qd(a,b,c,d){this.ray=new Va(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function te(a,b){return a.distance-b.distance}function Rd(a,b,c,d){if(!1!== +a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)Rd(a[d],b,c,!0)}}function Sd(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function Td(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function la(a,b){ua.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)}function Lc(a){y.call(this);this.material=a;this.render=function(a){}}function Mc(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new K;b=new ha(6*b,3);c.addAttribute("position",b);ja.call(this,c,new ma({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function Zb(a){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix= +a.matrixWorld;this.matrixAutoUpdate=!1;a=new K;for(var b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new ha(b,3));b=new ma({fog:!1});this.cone=new ja(a,b);this.add(this.cone);this.update()}function $b(a){this.bones=this.getBoneList(a);for(var b=new P,c=0;c<this.bones.length;c++){var d=this.bones[c];d.parent&&d.parent.isBone&&(b.vertices.push(new q), +b.vertices.push(new q),b.colors.push(new M(0,0,1)),b.colors.push(new M(0,1,0)))}b.dynamic=!0;c=new ma({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});ja.call(this,b,c);this.root=a;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.update()}function ac(a,b){this.light=a;this.light.updateMatrixWorld();var c=new hb(b,4,2),d=new Ha({wireframe:!0,fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);ua.call(this,c,d);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate= +!1}function bc(a,b){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.colors=[new M,new M];var c=new Mb(b,4,2);c.rotateX(-Math.PI/2);for(var d=0;8>d;d++)c.faces[d].color=this.colors[4>d?0:1];d=new Ha({vertexColors:1,wireframe:!0});this.lightSphere=new ua(c,d);this.add(this.lightSphere);this.update()}function Nc(a,b,c,d){b=b||1;c=new M(void 0!==c?c:4473924);d=new M(void 0!==d?d:8947848);for(var e=b/2,f=2*a/b,g=[],h=[],l=0,p=0,k=-a;l<=b;l++, +k+=f){g.push(-a,0,k,a,0,k);g.push(k,0,-a,k,0,a);var m=l===e?c:d;m.toArray(h,p);p+=3;m.toArray(h,p);p+=3;m.toArray(h,p);p+=3;m.toArray(h,p);p+=3}a=new K;a.addAttribute("position",new ha(g,3));a.addAttribute("color",new ha(h,3));g=new ma({vertexColors:2});ja.call(this,a,g)}function Oc(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=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead."); +c=new K;b=new ha(6*b,3);c.addAttribute("position",b);ja.call(this,c,new ma({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function cc(a,b){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;void 0===b&&(b=1);var c=new K;c.addAttribute("position",new ha([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));var d=new ma({fog:!1});this.add(new Na(c,d));c=new K;c.addAttribute("position",new ha([0,0,0,0,0,1],3));this.add(new Na(c,d));this.update()} +function Pc(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.vertices.push(new q);d.colors.push(new M(b));void 0===f[a]&&(f[a]=[]);f[a].push(d.vertices.length-1)}var d=new P,e=new ma({color:16777215,vertexColors:1}),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);b("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);ja.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=f;this.update()}function Qc(a,b){var c=void 0!==b?b:8947848;this.object=a;this.box= +new Ga;ua.call(this,new jb(1,1,1),new Ha({color:c,wireframe:!0}))}function Rc(a,b){void 0===b&&(b=16776960);var c=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),d=new Float32Array(24),e=new K;e.setIndex(new D(c,1));e.addAttribute("position",new D(d,3));ja.call(this,e,new ma({color:b}));void 0!==a&&this.update(a)}function xb(a,b,c,d,e,f){y.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);this.position.copy(b);this.line=new Na(ue,new ma({color:d})); +this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new ua(ve,new Ha({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function rd(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 K;a.addAttribute("position",new D(b,3));a.addAttribute("color",new D(c,3));b=new ma({vertexColors:2});ja.call(this,a,b)}function we(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3."); +k.CatmullRomCurve3.call(this,a);this.type="catmullrom";this.closed=!0}function sd(a,b,c,d,e,f){Oa.call(this,a,b,c,c,d,e,f)}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});void 0===Function.prototype.name&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1]}});void 0===Object.assign&&function(){Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object"); +for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(pa.prototype,{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)&&c[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;var c=[],d,e=b.length;for(d=0;d<e;d++)c[d]=b[d];for(d=0;d<e;d++)c[d].call(this,a)}}}});var xe={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},ye={UVMapping:300,CubeReflectionMapping:301, +CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},Ud={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Vd={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};k.Math={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,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 Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a, +b,c){if(a<=b)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(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead.");return Math.random()},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())},degToRad:function(a){return a* +k.Math.DEG2RAD},radToDeg:function(a){return a*k.Math.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};B.prototype={constructor:B,isVector2:!0,get width(){return this.x},set width(a){this.x=a},get height(){return this.y},set height(a){this.y=a},set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y= +this.x=a;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);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a, +b){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},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;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},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors: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){isFinite(a)?(this.x*=a,this.y*=a):this.y=this.x=0;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y, +a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new B,b=new B);a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},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},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);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)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.multiplyScalar(a/ +this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+ +1];return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}};da.DEFAULT_IMAGE=void 0;da.DEFAULT_MAPPING=300;da.prototype={constructor:da,isTexture:!0,set needsUpdate(a){!0===a&&this.version++},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter= +a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.4,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping, +repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=k.Math.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),g.width=c.width,g.height=c.height,g.getContext("2d").drawImage(c, +0,0,c.width,c.height));g=2048<g.width||2048<g.height?g.toDataURL("image/jpeg",.6):g.toDataURL("image/png");d[e]={uuid:f,url:g}}b.image=c.uuid}return a.textures[this.uuid]=b},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300===this.mapping){a.multiply(this.repeat);a.add(this.offset);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0> +a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}};Object.assign(da.prototype,pa.prototype);var Xd=0;ga.prototype={constructor:ga,isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;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);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x, +this.y,this.z,this.w)},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},addVectors: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}, +addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;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},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;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){isFinite(a)? +(this.x*=a,this.y*=a,this.z*=a,this.w*=a):this.w=this.z=this.y=this.x=0;return this},applyMatrix4:function(a){var b=this.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){return this.multiplyScalar(1/a)},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},setAxisAngleFromRotationMatrix: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],l=a[9];c=a[2];b=a[6];var p=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(l-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(l+b)&&.1>Math.abs(e+h+p-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;p=(p+1)/2;d=(d+g)/4;f=(f+c)/4;l=(l+b)/4;e>h&&e>p?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b): +h>p?.01>h?(b=.707106781,c=0,d=.707106781):(c=Math.sqrt(h),b=d/c,d=l/c):.01>p?(c=b=.707106781,d=0):(d=Math.sqrt(p),b=f/d,c=l/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-l)*(b-l)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-l)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+p-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x); +this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new ga,b=new ga);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);return 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);return 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())},setLength:function(a){return this.multiplyScalar(a/this.length())},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},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w= +a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];this.w=a.array[b+3];return this}};Object.assign(yb.prototype,pa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0, +0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});zb.prototype=Object.create(yb.prototype);zb.prototype.constructor=zb;zb.prototype.isWebGLRenderTargetCube=!0;ca.prototype={constructor:ca,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},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback(); +return this},setFromEuler:function(a,b){if(!1===(a&&a.isEuler))throw Error("THREE.Quaternion: .setFromEuler() now expects an 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),l=a.order;"XYZ"===l?(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"===l?(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):"ZXY"===l?(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"===l?(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"===l?(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"===l&&(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,b){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],l=b[6],b=b[10],p=c+f+b;0<p?(c=.5/Math.sqrt(p+1),this._w=.25/c,this._x=(l-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=(l-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=.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+ +h)/c,this._y=(g+l)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a,b;return function(c,d){void 0===a&&(a=new q);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;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*=-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},multiply: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)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,l=b._z,p=b._w;this._x=c*p+f*g+d*l-e*h;this._y=d*p+f*h+e*g-c*l;this._z=e*p+f*l+c*h-d*g;this._w=f*p-c*g-d*h-e*l;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);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.sqrt(1-g*g);if(.001>Math.abs(h))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;var l=Math.atan2(h,g),g=Math.sin((1-b)*l)/h,h=Math.sin(b*l)/h;this._w=f*g+this._w*h;this._x=c*g+this._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,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};Object.assign(ca,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a, +b,c,d,e,f,g){var h=c[d+0],l=c[d+1],p=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],m=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||p!==m){f=1-g;var n=h*d+l*k+p*m+c*e,r=0<=n?1:-1,t=1-n*n;t>Number.EPSILON&&(t=Math.sqrt(t),n=Math.atan2(t,n*r),f=Math.sin(f*n)/t,g=Math.sin(g*n)/t);r*=g;h=h*f+d*r;l=l*f+k*r;p=p*f+m*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+l*l+p*p+c*c),h*=g,l*=g,p*=g,c*=g)}a[b]=h;a[b+1]=l;a[b+2]=p;a[b+3]=c}});q.prototype={constructor:q,isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this}, +setScalar:function(a){this.z=this.y=this.x=a;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);}return this},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: "+a);}},clone:function(){return new this.constructor(this.x, +this.y,this.z)},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},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+= +a.z*b;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."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;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){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a;return function(b){!1===(b&&b.isEuler)&&console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");void 0===a&&(a=new ca);return this.applyQuaternion(a.setFromEuler(b))}}(), +applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new ca);return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=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=(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,l=a*c+g*b-e*d,p=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-p*-f;this.y=l*a+b*-f+p*-e-h*-g;this.z=p*a+b*-g+h*-f-l*-e;return this},project:function(){var a;return function(b){void 0===a&&(a=new H); +a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyProjection(a)}}(),unproject:function(){var a;return function(b){void 0===a&&(a=new H);a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyProjection(a)}}(),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;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/= +a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a,b;return function(c, +d){void 0===a&&(a=new q,b=new q);a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},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=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);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)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},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},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},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=e*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(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a;return function(b){void 0===a&&(a=new q);a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a;return function(b){void 0=== +a&&(a=new q);return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(k.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},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)* +a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){return this.setFromMatrixColumn(a,3)},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){if("number"===typeof a){console.warn("THREE.Vector3: setFromMatrixColumn now expects ( matrix, index )."); +var c=a;a=b;b=c}return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];return this}};H.prototype={constructor:H,isMatrix4:!0, +set:function(a,b,c,d,e,f,g,h,l,p,k,m,n,r,t,v){var q=this.elements;q[0]=a;q[4]=b;q[8]=c;q[12]=d;q[1]=e;q[5]=f;q[9]=g;q[13]=h;q[2]=l;q[6]=p;q[10]=k;q[14]=m;q[3]=n;q[7]=r;q[11]=t;q[15]=v;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new H).fromArray(this.elements)},copy:function(a){this.elements.set(a.elements);return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a, +b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a;return function(b){void 0===a&&(a=new q);var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]* +f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){!1===(a&&a.isEuler)&&console.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 l=f*e,p=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+p*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=p+l*d;b[10]=f*g}else"YXZ"=== +a.order?(a=g*h,l=g*e,p=d*h,k=d*e,b[0]=a+k*c,b[4]=p*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-p,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,p=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=p+l*c,b[1]=l+p*c,b[5]=f*h,b[9]=k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,p=c*h,k=c*e,b[0]=g*h,b[4]=p*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-p,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,p=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=p*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l* +e+p,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,p=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-p,b[2]=p*e-l,b[6]=c*h,b[10]=k*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},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,l=e+e;a=c*g;var p=c*h,c=c*l,k=d*h,d=d*l,e=e*l,g=f*g,h=f*h,f=f*l;b[0]=1-(k+e);b[4]=p-f;b[8]=c+h;b[1]=p+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);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,b,c;return function(d,e,f){void 0===a&&(a=new q,b=new q,c=new q);var g=this.elements;c.subVectors(d,e).normalize();0===c.lengthSq()&&(c.z=1);a.crossVectors(f,c).normalize();0===a.lengthSq()&&(c.z+=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}}(),multiply: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)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],l=c[12],p=c[1],k=c[5],m=c[9],n=c[13],r=c[2],t=c[6],v=c[10],q=c[14],u=c[3],w=c[7],I=c[11],c=c[15],x=d[0],F=d[4],G=d[8],C=d[12],L=d[1],B=d[5],Q=d[9],y=d[13],D=d[2],H=d[6],K=d[10],N=d[14],O=d[3],R=d[7],S=d[11],d=d[15];e[0]=f*x+g*L+h*D+l*O;e[4]=f*F+g*B+h*H+l*R;e[8]=f*G+g*Q+h*K+l*S;e[12]= +f*C+g*y+h*N+l*d;e[1]=p*x+k*L+m*D+n*O;e[5]=p*F+k*B+m*H+n*R;e[9]=p*G+k*Q+m*K+n*S;e[13]=p*C+k*y+m*N+n*d;e[2]=r*x+t*L+v*D+q*O;e[6]=r*F+t*B+v*H+q*R;e[10]=r*G+t*Q+v*K+q*S;e[14]=r*C+t*y+v*N+q*d;e[3]=u*x+w*L+I*D+c*O;e[7]=u*F+w*B+I*H+c*R;e[11]=u*G+w*Q+I*K+c*S;e[15]=u*C+w*y+I*N+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];c[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},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix4(this),a.toArray(b,c);return b}}(),applyToBuffer:function(){var a;return function(b, +c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length/b.itemSize);for(var e=0;e<d;e++,c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(a.x,a.y,a.z);return b}}(),determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],l=a[13],p=a[2],k=a[6],m=a[10],n=a[14];return a[3]*(+e*h*k-d*l*k-e*g*m+c*l*m+d*g*n-c*h*n)+a[7]*(+b*h*n-b*l*m+e*f*m-d*f*n+d*l*p-e*h*p)+a[11]*(+b*l*k-b*g*n-e*f*k+c*f*n+e*g*p-c*l*p)+a[15]*(-d*g*p-b*h*k+b*g*m+d* +f*k-c*f*m+c*h*p)},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,b){console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated - just use .toArray instead.");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new q);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."); +return a.setFromMatrixColumn(this,3)}}(),setPosition:function(a){var b=this.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[1],g=d[2],h=d[3],l=d[4],p=d[5],k=d[6],m=d[7],n=d[8],r=d[9],t=d[10],q=d[11],z=d[12],u=d[13],w=d[14],d=d[15],I=r*w*m-u*t*m+u*k*q-p*w*q-r*k*d+p*t*d,x=z*t*m-n*w*m-z*k*q+l*w*q+n*k*d-l*t*d,F=n*u*m-z*r*m+z*p*q-l*u*q-n*p*d+l*r*d,G=z*r*k-n*u*k-z*p*t+l*u*t+n*p*w-l*r*w,C=e*I+f*x+g*F+h*G;if(0===C){if(!0===b)throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"); +console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");return this.identity()}C=1/C;c[0]=I*C;c[1]=(u*t*h-r*w*h-u*g*q+f*w*q+r*g*d-f*t*d)*C;c[2]=(p*w*h-u*k*h+u*g*m-f*w*m-p*g*d+f*k*d)*C;c[3]=(r*k*h-p*t*h-r*g*m+f*t*m+p*g*q-f*k*q)*C;c[4]=x*C;c[5]=(n*w*h-z*t*h+z*g*q-e*w*q-n*g*d+e*t*d)*C;c[6]=(z*k*h-l*w*h-z*g*m+e*w*m+l*g*d-e*k*d)*C;c[7]=(l*t*h-n*k*h+n*g*m-e*t*m-l*g*q+e*k*q)*C;c[8]=F*C;c[9]=(z*r*h-n*u*h-z*f*q+e*u*q+n*f*d-e*r*d)*C;c[10]=(l*u*h-z*p*h+z*f*m-e*u*m-l*f*d+e*p*d)*C;c[11]= +(n*p*h-l*r*h-n*f*m+e*r*m+l*f*q-e*p*q)*C;c[12]=G*C;c[13]=(n*u*g-z*r*g+z*f*t-e*u*t-n*f*w+e*r*w)*C;c[14]=(z*p*g-l*u*g-z*f*k+e*u*k+l*f*w-e*p*w)*C;c[15]=(l*r*g-n*p*g+n*f*k-e*r*k-l*f*t+e*p*t)*C;return this},scale: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],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,0,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,l=e*f,k=e*g;this.set(l*f+c,l*g-d*h,l*h+d*g,0,l*g+d*h,k*g+c,k*h-d*f,0,l*h-d*g,k*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,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,b;return function(c,d,e){void 0===a&&(a=new q,b=new H);var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4], +f[5],f[6]).length(),l=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,k=1/l;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=k;b.elements[9]*=k;b.elements[10]*=k;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=l;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(k.Math.DEG2RAD*a*.5);var 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=1/(b-a),l=1/(c-d),k=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*l;g[9]=0;g[13]=-((c+d)*l);g[2]=0;g[6]=0;g[10]=-2*k;g[14]=-((f+e)*k);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b= +this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);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}};Ra.prototype=Object.create(da.prototype); +Ra.prototype.constructor=Ra;Ra.prototype.isCubeTexture=!0;Object.defineProperty(Ra.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var ae=new da,be=new Ra,Yd=[],$d=[];fe.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var td=/([\w\d_]+)(\])?(\[|\.)?/g;Sa.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};Sa.prototype.set=function(a,b,c){var d=this.map[c]; +void 0!==d&&d.setValue(a,b[c],this.renderer)};Sa.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Sa.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};Sa.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};k.UniformsUtils={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b= +{},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&e.isColor||e&&e.isVector2||e&&e.isVector3||e&&e.isVector4||e&&e.isMatrix3||e&&e.isMatrix4||e&&e.isTexture?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}};var X={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n", +aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif", +begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\n\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", +bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\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\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", +clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n", +clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n", +color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\n", +cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n", +defaultnormal_vertex:"#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n", +emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n float maxComponent = max( max( value.r, value.g ), value.b );\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n M = ceil( M * 255.0 ) / 255.0;\n return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float D = max( maxRange / maxRGB, 1.0 );\n D = min( floor( D ) / 255.0, 1.0 );\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n vec4 vResult;\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n vResult.w = fract(Le);\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n return vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n float Le = value.z * 255.0 + value.w;\n vec3 Xp_Y_XYZp;\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n return vec4( max(vRGB, 0.0), 1.0 );\n}\n", +envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", +envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntenstiy;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n", +envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n", +fog_fragment:"#ifdef USE_FOG\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\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif", +lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n", +lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\n\t\t\tdirectLight.color = pointLight.color;\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\t#include <normal_flip>\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\t#include <normal_flip>\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", +lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", +lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n", +lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n", +lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n", +logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n", +map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n", +metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n", +morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n", +normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", +normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\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\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\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\t}\n#endif\n", +packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", +premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n", +roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\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\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", +shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n", +shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n", +shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", +skinbase_vertex:"#ifdef USE_SKINNING\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#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\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\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\t\t\ty = dy * ( y + 0.5 );\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\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n", +skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\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#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\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\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", +specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", +uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n", +uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", +cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", +depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n", +distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n", +linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight;\n\treflectedLight.directDiffuse = vec3( 0.0 );\n\treflectedLight.directSpecular = vec3( 0.0 );\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\n\treflectedLight.indirectSpecular = vec3( 0.0 );\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n}\n", +meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n}\n", +meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nuniform float envMapIntensity;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n", +normal_frag:"uniform float opacity;\nvarying vec3 vNormal;\n#include <common>\n#include <packing>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\n\t#include <logdepthbuf_fragment>\n}\n",normal_vert:"varying vec3 vNormal;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n", +points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", +points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n", +shadow_frag:"uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n",shadow_vert:"#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"};M.prototype={constructor:M, +isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a},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(){function a(a,c,d){0>d&&(d+=1);1<d&&--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b, +c,d){b=k.Math.euclideanModulo(b,1);c=k.Math.clamp(c,0,1);d=k.Math.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r= +Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/ +360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=k.ColorKeywords[a], +void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);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<<8^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 l=e-f,f=.5>=h?l/(e+f): +l/(2-e-f);switch(e){case b:g=(c-d)/l+(c<d?6:0);break;case c:g=(d-b)/l+2;break;case d:g=(b-c)/l+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,b,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},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);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;this.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,b){void 0===b&&(b= +0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}};k.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,darkolivegreen: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,grey: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,lime: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,palegreen: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,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};var W={common:{diffuse:{value:new M(15658734)},opacity:{value:1},map:{value:null},offsetRepeat:{value:new ga(0,0,1,1)},specularMap:{value:null},alphaMap:{value:null}, +envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new B(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}}, +metalnessmap:{metalnessMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},fogFar:{value:2E3},fogColor:{value:new M(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{}, +shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}}},points:{diffuse:{value:new M(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},offsetRepeat:{value:new ga(0,0,1,1)}}}, +Bb={basic:{uniforms:k.UniformsUtils.merge([W.common,W.aomap,W.fog]),vertexShader:X.meshbasic_vert,fragmentShader:X.meshbasic_frag},lambert:{uniforms:k.UniformsUtils.merge([W.common,W.aomap,W.lightmap,W.emissivemap,W.fog,W.lights,{emissive:{value:new M(0)}}]),vertexShader:X.meshlambert_vert,fragmentShader:X.meshlambert_frag},phong:{uniforms:k.UniformsUtils.merge([W.common,W.aomap,W.lightmap,W.emissivemap,W.bumpmap,W.normalmap,W.displacementmap,W.fog,W.lights,{emissive:{value:new M(0)},specular:{value:new M(1118481)}, +shininess:{value:30}}]),vertexShader:X.meshphong_vert,fragmentShader:X.meshphong_frag},standard:{uniforms:k.UniformsUtils.merge([W.common,W.aomap,W.lightmap,W.emissivemap,W.bumpmap,W.normalmap,W.displacementmap,W.roughnessmap,W.metalnessmap,W.fog,W.lights,{emissive:{value:new M(0)},roughness:{value:.5},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag},points:{uniforms:k.UniformsUtils.merge([W.points,W.fog]),vertexShader:X.points_vert, +fragmentShader:X.points_frag},dashed:{uniforms:k.UniformsUtils.merge([W.common,W.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:X.linedashed_vert,fragmentShader:X.linedashed_frag},depth:{uniforms:k.UniformsUtils.merge([W.common,W.displacementmap]),vertexShader:X.depth_vert,fragmentShader:X.depth_frag},normal:{uniforms:{opacity:{value:1}},vertexShader:X.normal_vert,fragmentShader:X.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:X.cube_vert, +fragmentShader:X.cube_frag},equirect:{uniforms:{tEquirect:{value:null},tFlip:{value:-1}},vertexShader:X.equirect_vert,fragmentShader:X.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new q}},vertexShader:X.distanceRGBA_vert,fragmentShader:X.distanceRGBA_frag}};Bb.physical={uniforms:k.UniformsUtils.merge([Bb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag};dc.prototype={constructor:dc,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 B;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}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y= +-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){a=a||new B;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new B;return this.isEmpty()?a.set(0,0):a.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?!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 B).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox: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? +!1:!0},clampPoint:function(a,b){return(b||new B).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new B;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)&&a.max.equals(this.max)}};T.prototype= +{constructor:T,isMaterial:!0,get needsUpdate(){return this._needsUpdate},set needsUpdate(a){!0===a&&this.update();this._needsUpdate=a},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{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b= +[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.4,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex()); +this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&& +(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&& +(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);2!==this.shading&&(d.shading=this.shading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&& +(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap= +this.wireframeLinecap);"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);d.skinning=this.skinning;d.morphTargets=this.morphTargets;c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;this.lights=a.lights;this.blending=a.blending;this.side=a.side;this.shading=a.shading;this.vertexColors=a.vertexColors;this.opacity=a.opacity; +this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.alphaTest= +a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;a=a.clippingPlanes;var b=null;if(null!==a)for(var c=a.length,b=Array(c),d=0;d!==c;++d)b[d]=a[d].clone();this.clippingPlanes=b;return this},update:function(){this.dispatchEvent({type:"update"})},dispose:function(){this.dispatchEvent({type:"dispose"})}};Object.assign(T.prototype,pa.prototype);var ge=0;Da.prototype=Object.create(T.prototype); +Da.prototype.constructor=Da;Da.prototype.isShaderMaterial=!0;Da.prototype.copy=function(a){T.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=k.UniformsUtils.clone(a.uniforms);this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=a.extensions;return this}; +Da.prototype.toJSON=function(a){a=T.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Ta.prototype=Object.create(T.prototype);Ta.prototype.constructor=Ta;Ta.prototype.isMeshDepthMaterial=!0;Ta.prototype.copy=function(a){T.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap; +this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Ga.prototype={constructor:Ga,isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.length;h<l;h+=3){var k=a[h],q=a[h+1],m=a[h+2];k<b&&(b=k);q<c&&(c=q);m<d&&(d=m);k>e&&(e=k);q>f&&(f=q);m>g&&(g=m)}this.min.set(b, +c,d);this.max.set(e,f,g)},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 q;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 q;return function(b){var c=this;b.updateMatrixWorld(!0);this.makeEmpty();b.traverse(function(b){var e=b.geometry;if(void 0!==e)if(e&&e.isGeometry)for(var e=e.vertices, +f=0,g=e.length;f<g;f++)a.copy(e[f]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a);else if(e&&e.isBufferGeometry&&(g=e.attributes.position,void 0!==g)){var h;g&&g.isInterleavedBufferAttribute?(e=g.data.array,f=g.offset,h=g.data.stride):(e=g.array,f=0,h=3);for(g=e.length;f<g;f+=h)a.fromArray(e,f),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)}});return this}}(),clone:function(){return(new this.constructor).copy(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},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){a=a||new q;return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new q;return this.isEmpty()?a.set(0,0,0):a.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<this.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 q).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))},intersectsBox: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<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a;return function(b){void 0===a&&(a=new q);this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0<a.normal.x?(b=a.normal.x*this.min.x,c=a.normal.x*this.max.x): +(b=a.normal.x*this.max.x,c=a.normal.x*this.min.x);0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},clampPoint:function(a,b){return(b||new q).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new q;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(), +getBoundingSphere:function(){var a=new q;return function(b){b=b||new Aa;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new q,new q,new q,new q,new q,new q,new q,new q];return function(b){if(this.isEmpty())return this;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);a[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.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)}};Aa.prototype={constructor:Aa,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Ga;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(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}}(),clone:function(){return(new this.constructor).copy(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)<=this.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},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(this.center.dot(a.normal)-a.constant)<=this.radius}, +clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new q;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 Ga;a.set(this.center,this.center);a.expandByScalar(this.radius);return 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}};ya.prototype={constructor:ya,isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var k=this.elements;k[0]=a;k[1]=d;k[2]=g;k[3]=b;k[4]=e;k[5]=h;k[6]=c;k[7]=f;k[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},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},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9], +a[2],a[6],a[10]);return this},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix3(this),a.toArray(b,c);return b}}(),applyToBuffer:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length/b.itemSize);for(var e=0;e<d;e++,c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(a.x,a.y,a.z);return b}}(),multiplyScalar:function(a){var b= +this.elements;b[0]*=a;b[3]*=a;b[6]*=a;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],l=a[7],a=a[8];return b*f*a-b*g*l-c*e*a+c*g*h+d*e*l-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument.");var c=a.elements,d=this.elements,e=c[0],f=c[1],g=c[2],h=c[3],l=c[4],k=c[5],q=c[6],m=c[7],c=c[8],n=c*l-k*m,r=k*q-c*h,t=m*h-l*q,v=e*n+f* +r+g*t;if(0===v){if(!0===b)throw Error("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");return this.identity()}v=1/v;d[0]=n*v;d[1]=(g*m-c*f)*v;d[2]=(k*f-g*l)*v;d[3]=r*v;d[4]=(c*e-g*q)*v;d[5]=(g*h-k*e)*v;d[6]=t*v;d[7]=(f*q-m*e)*v;d[8]=(l*e-f*h)*v;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){console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated - just use .toArray instead.");return this.toArray(a,b)},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},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,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a= +[]);void 0===b&&(b=0);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];return a}};sa.prototype={constructor:sa,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 q,b=new q; +return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(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,b){var c=this.distanceToPoint(a);return(b||new q).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new q;return function(b,c){var d=c||new q,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)}}(),intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){return(a||new q).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new q,b=new ya;return function(c,d){var e=this.coplanarPoint(a).applyMatrix4(c), +f=d||b.getNormalMatrix(c),f=this.normal.applyMatrix3(f).normalize();this.constant=-e.dot(f);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}};ec.prototype={constructor:ec,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},clone:function(){return(new this.constructor).copy(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],l=c[6],k=c[7],q=c[8],m=c[9],n=c[10],r=c[11],t=c[12],v=c[13],z=c[14],c=c[15];b[0].setComponents(f-a,k-g,r-q,c-t).normalize();b[1].setComponents(f+a,k+g,r+q,c+t).normalize();b[2].setComponents(f+d,k+h,r+m,c+v).normalize();b[3].setComponents(f-d,k-h,r-m,c-v).normalize();b[4].setComponents(f-e,k-l,r-n,c-z).normalize();b[5].setComponents(f+e, +k+l,r+n,c+z).normalize();return this},intersectsObject:function(){var a=new Aa;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Aa;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=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 q,b=new q;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}}(),containsPoint:function(a){for(var b=this.planes,c=0;6> +c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}};Va.prototype={constructor:Va,set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new q).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a= +new q;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new q;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new q;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b); +a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new q,b=new q,c=new q;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),l=-this.direction.dot(b),k=c.dot(this.direction),q=-c.dot(b),m=c.lengthSq(),n=Math.abs(1-l*l),r;0<n?(d=l*q-k,e=l*k-q,r=h*n,0<=d?e>=-r?e<=r?(h=1/n,d*=h,e*=h,l=d*(d+l*e+2*k)+e*(l*d+e+2*q)+m):(e=h,d=Math.max(0,-(l* +e+k)),l=-d*d+e*(e+2*q)+m):(e=-h,d=Math.max(0,-(l*e+k)),l=-d*d+e*(e+2*q)+m):e<=-r?(d=Math.max(0,-(-l*h+k)),e=0<d?-h:Math.min(Math.max(-h,-q),h),l=-d*d+e*(e+2*q)+m):e<=r?(d=0,e=Math.min(Math.max(-h,-q),h),l=e*(e+2*q)+m):(d=Math.max(0,-(l*h+k)),e=0<d?h:Math.min(Math.max(-h,-q),h),l=-d*d+e*(e+2*q)+m)):(e=0<l?-h:h,d=Math.max(0,-(l*e+k)),l=-d*d+e*(e+2*q)+m);f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return l}}(),intersectSphere:function(){var a=new q; +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;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},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)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},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!==c)c=e;if(g<d||d!==d)d=g;return 0>d?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new q;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new q,b=new q,c=new q,d=new q;return function(e,f,g,h,l){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;e=-h*a.dot(d);return 0>e?null:this.at(e/f,l)}}(),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)}};Wa.RotationOrders= +"XYZ YZX ZXY XZY YXZ ZYX".split(" ");Wa.DefaultOrder="XYZ";Wa.prototype={constructor:Wa,isEuler:!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 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}, +clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=k.Math.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],l=e[5],p=e[9],q=e[2],m=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-p,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(m,l),this._z=0)):"YXZ"=== +b?(this._x=Math.asin(-d(p,-1,1)),.99999>Math.abs(p)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-q,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f,l)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(q,-1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(m,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,l))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x= +Math.atan2(-p,l),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(m,l),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-p,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a, +c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new ca;return function(b){a.setFromEuler(this);return this.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(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]= +this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new q(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};Sc.prototype={constructor:Sc,set:function(a){this.mask=1<<a},enable:function(a){this.mask|=1<<a},toggle:function(a){this.mask^=1<<a},disable:function(a){this.mask&=~(1<<a)},test:function(a){return 0!==(this.mask&a.mask)}};y.DefaultUp=new q(0,1,0);y.DefaultMatrixAutoUpdate= +!0;Object.assign(y.prototype,pa.prototype,{isObject3D:!0,applyMatrix: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 ca;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new q(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=new q(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new q(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new q;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c)); +return this}}(),translateX:function(){var a=new q(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new q(0,1,0);return function(b){return this.translateOnAxis(a,b)}}(),translateZ:function(){var a=new q(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new H;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a= +new H;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: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:"added"}),this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", +a);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);-1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1))},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a, +b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new q;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=new q,b=new q;return function(c){c=c||new ca;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new ca;return function(b){b=b||new Wa;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new q,b=new ca; +return function(c){c=c||new q;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new ca;return function(b){b=b||new q;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b= +this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){!0===this.matrixAutoUpdate&&this.updateMatrix();if(!0===this.matrixWorldNeedsUpdate||!0===a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)}, +toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a||""===a,d={};c&&(a={geometries:{},materials:{},textures:{},images:{}},d.metadata={version:4.4,type:"Object",generator:"Object3D.toJSON"});var e={};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);"{}"!==JSON.stringify(this.userData)&&(e.userData=this.userData);!0===this.castShadow&&(e.castShadow=!0);!0===this.receiveShadow&&(e.receiveShadow=!0);!1===this.visible&& +(e.visible=!1);e.matrix=this.matrix.toArray();void 0!==this.geometry&&(void 0===a.geometries[this.geometry.uuid]&&(a.geometries[this.geometry.uuid]=this.geometry.toJSON(a)),e.geometry=this.geometry.uuid);void 0!==this.material&&(void 0===a.materials[this.material.uuid]&&(a.materials[this.material.uuid]=this.material.toJSON(a)),e.material=this.material.uuid);if(0<this.children.length){e.children=[];for(var f=0;f<this.children.length;f++)e.children.push(this.children[f].toJSON(a).object)}if(c){var c= +b(a.geometries),f=b(a.materials),g=b(a.textures);a=b(a.images);0<c.length&&(d.geometries=c);0<f.length&&(d.materials=f);0<g.length&&(d.textures=g);0<a.length&&(d.images=a)}d.object=e;return d},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate= +a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(var c=0;c<a.children.length;c++)this.add(a.children[c].clone());return this}});var ie=0;bb.prototype={constructor:bb,set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){return(a||new q).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new q).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){var c=b||new q;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new q, +b=new q;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=k.Math.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new q;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}};Fa.normal=function(){var a=new q; +return function(b,c,d,e){e=e||new q;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)}}();Fa.barycoordFromPoint=function(){var a=new q,b=new q,c=new q;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 l=b.dot(b);g=b.dot(c);var k=d*l-e*e;h=h||new q;if(0===k)return h.set(-2,-1,-1);k=1/k;l=(l*f-e*g)*k;d=(d*g-e*f)*k;return h.set(1-l-d,d,l)}}();Fa.containsPoint=function(){var a= +new q;return function(b,c,d,e){b=Fa.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}();Fa.prototype={constructor:Fa,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},clone:function(){return(new this.constructor).copy(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 q,b=new q;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||new q).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Fa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new sa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Fa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return Fa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a, +b,c,d;return function(e,f){void 0===a&&(a=new sa,b=[new bb,new bb,new bb],c=new q,d=new q);var g=f||new q,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var l=0;l<b.length;l++){b[l].closestPointToPoint(c,!0,d);var k=c.distanceToSquared(d);k<h&&(h=k,g.copy(d))}}return g}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}}; +oa.prototype={constructor:oa,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}};Ha.prototype=Object.create(T.prototype);Ha.prototype.constructor=Ha;Ha.prototype.isMeshBasicMaterial= +!0;Ha.prototype.copy=function(a){T.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning= +a.skinning;this.morphTargets=a.morphTargets;return this};D.prototype={constructor:D,isBufferAttribute:!0,set needsUpdate(a){!0===a&&this.version++},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this}, +copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new M);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f= +a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new B);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new q);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined", +d),f=new ga);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a* +this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},clone:function(){return(new this.constructor).copy(this)}};Object.assign(P.prototype,pa.prototype, +{isGeometry:!0,applyMatrix:function(a){for(var b=(new ya).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()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a; +return function(b){void 0===a&&(a=new H);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b, +c,d){void 0===a&&(a=new H);a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a=new y);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[E[a].clone(),E[b].clone(),E[d].clone()]:[],r=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new oa(a,b,d,f,r,e);c.faces.push(e);void 0!==l&&c.faceVertexUvs[0].push([m[a].clone(),m[b].clone(),m[d].clone()]); +void 0!==k&&c.faceVertexUvs[1].push([n[a].clone(),n[b].clone(),n[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,l=void 0!==e.uv?e.uv.array:void 0,k=void 0!==e.uv2?e.uv2.array:void 0;void 0!==k&&(this.faceVertexUvs[1]=[]);for(var E=[],m=[],n=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new q(f[e],f[e+1],f[e+2])),void 0!==g&&E.push(new q(g[e],g[e+1],g[e+2])),void 0!==h&& +c.colors.push(new M(h[e],h[e+1],h[e+2])),void 0!==l&&m.push(new B(l[r],l[r+1])),void 0!==k&&n.push(new B(k[r],k[r+1]));if(void 0!==d)if(f=a.groups,0<f.length)for(e=0;e<f.length;e++)for(var t=f[e],v=t.start,z=t.count,r=v,v=v+z;r<v;r+=3)b(d[r],d[r+1],d[r+2],t.materialIndex);else for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere= +a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new H;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new q,b=new q,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)}},computeVertexNormals:function(a){void 0===a&&(a=!0);var b,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new q;if(a){var e,f,g,h=new q,l=new q;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),l.subVectors(e,f),h.cross(l),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(this.computeFaceNormals(), +a=0,b=this.faces.length;a<b;a++)c=this.faces[a],d[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],e=c.vertexNormals,3===e.length?(e[0].copy(d[c.a]),e[1].copy(d[c.b]),e[2].copy(d[c.c])):(e[0]=d[c.a].clone(),e[1]=d[c.b].clone(),e[2]=d[c.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a,b,c;this.computeFaceNormals();a=0;for(b=this.faces.length;a< +b;a++){c=this.faces[a];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},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||(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 P;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,l;c=0;for(d=this.faces.length;c<d;c++)h=new q,l={a:new q, +b:new q,c:new q},e.push(h),g.push(l)}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],l=g.vertexNormals[c],h.copy(e.normal),l.a.copy(e.vertexNormals[0]),l.b.copy(e.vertexNormals[1]),l.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=e.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeTangents:function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")}, +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 Ga);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Aa);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(!1===(a&&a.isGeometry))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,l=a.faces,k=this.faceVertexUvs[0],q=a.faceVertexUvs[0],m=this.colors,n=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ya).getNormalMatrix(b));a=0;for(var r=g.length;a<r;a++){var t=g[a].clone();void 0!==b&&t.applyMatrix4(b);f.push(t)}a=0;for(r=n.length;a<r;a++)m.push(n[a].clone());a=0;for(r=l.length;a<r;a++){var g=l[a],v=g.vertexNormals,n=g.vertexColors,m=new oa(g.a+e,g.b+e,g.c+e);m.normal.copy(g.normal);void 0!==d&&m.normal.applyMatrix3(d).normalize(); +b=0;for(f=v.length;b<f;b++)t=v[b].clone(),void 0!==d&&t.applyMatrix3(d).normalize(),m.vertexNormals.push(t);m.color.copy(g.color);b=0;for(f=n.length;b<f;b++)t=n[b],m.vertexColors.push(t.clone());m.materialIndex=g.materialIndex+c;h.push(m)}a=0;for(r=q.length;a<r;a++)if(c=q[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());k.push(d)}}},mergeMesh:function(a){!1===(a&&a.isMesh)?console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a):(a.matrixAutoUpdate&&a.updateMatrix(), +this.merge(a.geometry,a.matrix))},mergeVertices:function(){var a={},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,1);f=this.vertices.length-b.length;this.vertices=b;return f},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]= +g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==k[b])return k[b];k[b]=l.length/3;l.push(a.x,a.y,a.z);return k[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==m[b])return m[b];m[b]=q.length;q.push(a.getHex());return m[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=n.length/2;n.push(a.x,a.y);return r[b]}var e={metadata:{version:4.4,type:"Geometry", +generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}var h=[],l=[],k={},q=[],m={},n=[],r={};for(g=0;g<this.faces.length;g++){var t=this.faces[g],v=void 0!==this.faceVertexUvs[0][g],z=0<t.normal.length(),u=0<t.vertexNormals.length,w=1!==t.color.r||1!==t.color.g||1!==t.color.b, +I=0<t.vertexColors.length,x=0,x=a(x,0,0),x=a(x,1,!0),x=a(x,2,!1),x=a(x,3,v),x=a(x,4,z),x=a(x,5,u),x=a(x,6,w),x=a(x,7,I);h.push(x);h.push(t.a,t.b,t.c);h.push(t.materialIndex);v&&(v=this.faceVertexUvs[0][g],h.push(d(v[0]),d(v[1]),d(v[2])));z&&h.push(b(t.normal));u&&(z=t.vertexNormals,h.push(b(z[0]),b(z[1]),b(z[2])));w&&h.push(c(t.color));I&&(t=t.vertexColors,h.push(c(t[0]),c(t[1]),c(t[2])))}e.data={};e.data.vertices=f;e.data.normals=l;0<q.length&&(e.data.colors=q);0<n.length&&(e.data.uvs=[n]);e.data.faces= +h;return e},clone:function(){return(new P).copy(this)},copy:function(a){this.vertices=[];this.faces=[];this.faceVertexUvs=[[]];this.colors=[];for(var b=a.vertices,c=0,d=b.length;c<d;c++)this.vertices.push(b[c].clone());b=a.colors;c=0;for(d=b.length;c<d;c++)this.colors.push(b[c].clone());b=a.faces;c=0;for(d=b.length;c<d;c++)this.faces.push(b[c].clone());c=0;for(d=a.faceVertexUvs.length;c<d;c++){b=a.faceVertexUvs[c];void 0===this.faceVertexUvs[c]&&(this.faceVertexUvs[c]=[]);for(var e=0,f=b.length;e< +f;e++){for(var g=b[e],h=[],l=0,k=g.length;l<k;l++)h.push(g[l].clone());this.faceVertexUvs[c].push(h)}}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var Vc=0;Object.assign(je.prototype,pa.prototype,{computeBoundingBox:P.prototype.computeBoundingBox,computeBoundingSphere:P.prototype.computeBoundingSphere,computeFaceNormals:function(){console.warn("THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.")},computeVertexNormals:function(){console.warn("THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.")}, +computeGroups:function(a){var b,c=[],d;a=a.faces;for(var e=0;e<a.length;e++){var f=a[e];f.materialIndex!==d&&(d=f.materialIndex,void 0!==b&&(b.count=3*e-b.start,c.push(b)),b={start:3*e,materialIndex:d})}void 0!==b&&(b.count=3*e-b.start,c.push(b));this.groups=c},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length,l;if(0<h){l=[];for(var k=0;k<h;k++)l[k]=[];this.morphTargets.position=l}var q=a.morphNormals,m=q.length, +n;if(0<m){n=[];for(k=0;k<m;k++)n[k]=[];this.morphTargets.normal=n}for(var r=a.skinIndices,t=a.skinWeights,v=r.length===c.length,z=t.length===c.length,k=0;k<b.length;k++){var u=b[k];this.vertices.push(c[u.a],c[u.b],c[u.c]);var w=u.vertexNormals;3===w.length?this.normals.push(w[0],w[1],w[2]):(w=u.normal,this.normals.push(w,w,w));w=u.vertexColors;3===w.length?this.colors.push(w[0],w[1],w[2]):(w=u.color,this.colors.push(w,w,w));!0===e&&(w=d[0][k],void 0!==w?this.uvs.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ", +k),this.uvs.push(new B,new B,new B)));!0===f&&(w=d[1][k],void 0!==w?this.uvs2.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",k),this.uvs2.push(new B,new B,new B)));for(w=0;w<h;w++){var I=g[w].vertices;l[w].push(I[u.a],I[u.b],I[u.c])}for(w=0;w<m;w++)I=q[w].vertexNormals[k],n[w].push(I.a,I.b,I.c);v&&this.skinIndices.push(r[u.a],r[u.b],r[u.c]);z&&this.skinWeights.push(t[u.a],t[u.b],t[u.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate; +this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.assign(K.prototype,pa.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){this.index=a},addAttribute:function(a,b,c){if(!1===(b&&b.isBufferAttribute)&&!1===(b&&b.isInterleavedBufferAttribute))console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."), +this.addAttribute(a,new D(b,c));else if("index"===a)console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b);else return this.attributes[a]=b,this},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count= +b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToVector3Array(b.array),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new ya).getNormalMatrix(a).applyToVector3Array(b.array),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;return function(b){void 0=== +a&&(a=new H);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a= +new y);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a&&a.isPoints||a&&a.isLine){a=new ha(3*b.vertices.length,3);var c=new ha(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&& +(a=new ha(b.lineDistances.length,1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a&&a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},updateFromObject:function(a){var b=a.geometry;if(a&&a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate= +b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals), +c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups= +b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new je).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new D(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new D(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length), +this.addAttribute("color",(new D(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new D(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new D(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<a.vertices.length?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new D(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b= +[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new ha(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new ha(4*a.skinIndices.length,4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new ha(4*a.skinWeights.length,4),this.addAttribute("skinWeight",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox= +a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Ga);var a=this.attributes.position.array;void 0!==a?this.boundingBox.setFromArray(a):this.boundingBox.makeEmpty();(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.',this)},computeBoundingSphere:function(){var a= +new Ga,b=new q;return function(){null===this.boundingSphere&&(this.boundingSphere=new Aa);var c=this.attributes.position;if(c){var c=c.array,d=this.boundingSphere.center;a.setFromArray(c);a.getCenter(d);for(var e=0,f=0,g=c.length;f<g;f+=3)b.fromArray(c,f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', +this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute("normal",new D(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h,l,k,E=new q,m=new q,n=new q,r=new q,t=new q;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var v=0,z=c.length;v<z;++v)for(f=c[v],g=f.start,h=f.count,f=g,g+=h;f< +g;f+=3)h=3*a[f+0],l=3*a[f+1],k=3*a[f+2],E.fromArray(d,h),m.fromArray(d,l),n.fromArray(d,k),r.subVectors(n,m),t.subVectors(E,m),r.cross(t),e[h]+=r.x,e[h+1]+=r.y,e[h+2]+=r.z,e[l]+=r.x,e[l+1]+=r.y,e[l+2]+=r.z,e[k]+=r.x,e[k+1]+=r.y,e[k+2]+=r.z}else for(f=0,g=d.length;f<g;f+=9)E.fromArray(d,f),m.fromArray(d,f+3),n.fromArray(d,f+6),r.subVectors(n,m),t.subVectors(E,m),r.cross(t),e[f]=r.x,e[f+1]=r.y,e[f+2]=r.z,e[f+3]=r.x,e[f+4]=r.y,e[f+5]=r.z,e[f+6]=r.x,e[f+7]=r.y,e[f+8]=r.z;this.normalizeNormals();b.normal.needsUpdate= +!0}},merge:function(a,b){if(!1===(a&&a.isBufferGeometry))console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a);else{void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=c[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}},normalizeNormals:function(){for(var a=this.attributes.normal.array,b,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},toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var a=new K,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,l=0,k=0,q=b.length;k<q;k++){h=b[k]*e;for(var m=0;m<e;m++)g[l++]=f[h++]}a.addAttribute(d,new D(g,e))}return a},toJSON:function(){var a={metadata:{version:4.4,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}}; +a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters,c;for(c in b)void 0!==b[c]&&(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c],b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups; +0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));c=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),radius:c.radius});return a},clone:function(){return(new K).copy(this)},copy:function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.materialIndex)}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}}); +K.MaxIndex=65535;ua.prototype=Object.assign(Object.create(y.prototype),{constructor:ua,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){y.prototype.copy.call(this,a);this.drawMode=a.drawMode;return this},updateMorphTargets:function(){var a=this.geometry.morphTargets;if(void 0!==a&&0<a.length){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var b=0,c=a.length;b<c;b++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[a[b].name]=b}},raycast:function(){function a(a, +b,c,d,e,f,g){Fa.barycoordFromPoint(a,b,c,d,v);e.multiplyScalar(v.x);f.multiplyScalar(v.y);g.multiplyScalar(v.z);e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g){var h=a.material;if(null===(1===h.side?c.intersectTriangle(f,e,d,!0,g):c.intersectTriangle(d,e,f,2!==h.side,g)))return null;u.copy(g);u.applyMatrix4(a.matrixWorld);c=b.ray.origin.distanceTo(u);return c<b.near||c>b.far?null:{distance:c,point:u.clone(),object:a}}function c(c,d,e,f,k,p,m,q){g.fromArray(f,3*p);h.fromArray(f,3*m);l.fromArray(f, +3*q);if(c=b(c,d,e,g,h,l,z))k&&(n.fromArray(k,2*p),r.fromArray(k,2*m),t.fromArray(k,2*q),c.uv=a(z,g,h,l,n,r,t)),c.face=new oa(p,m,q,Fa.normal(g,h,l)),c.faceIndex=p;return c}var d=new H,e=new Va,f=new Aa,g=new q,h=new q,l=new q,k=new q,E=new q,m=new q,n=new B,r=new B,t=new B,v=new q,z=new q,u=new q;return function(q,v){var u=this.geometry,F=this.material,G=this.matrixWorld;if(void 0!==F&&(null===u.boundingSphere&&u.computeBoundingSphere(),f.copy(u.boundingSphere),f.applyMatrix4(G),!1!==q.ray.intersectsSphere(f)&& +(d.getInverse(G),e.copy(q.ray).applyMatrix4(d),null===u.boundingBox||!1!==e.intersectsBox(u.boundingBox)))){var C,L;if(u&&u.isBufferGeometry){var B,y,F=u.index,G=u.attributes,u=G.position.array;void 0!==G.uv&&(C=G.uv.array);if(null!==F)for(var G=F.array,D=0,H=G.length;D<H;D+=3){if(F=G[D],B=G[D+1],y=G[D+2],L=c(this,q,e,u,C,F,B,y))L.faceIndex=Math.floor(D/3),v.push(L)}else for(D=0,H=u.length;D<H;D+=9)if(F=D/3,B=F+1,y=F+2,L=c(this,q,e,u,C,F,B,y))L.index=F,v.push(L)}else if(u&&u.isGeometry){var K,P,G= +F&&F.isMultiMaterial,D=!0===G?F.materials:null,H=u.vertices;B=u.faces;y=u.faceVertexUvs[0];0<y.length&&(C=y);for(var N=0,O=B.length;N<O;N++){var R=B[N];L=!0===G?D[R.materialIndex]:F;if(void 0!==L){y=H[R.a];K=H[R.b];P=H[R.c];if(!0===L.morphTargets){L=u.morphTargets;var S=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);l.set(0,0,0);for(var M=0,U=L.length;M<U;M++){var V=S[M];if(0!==V){var J=L[M].vertices;g.addScaledVector(k.subVectors(J[R.a],y),V);h.addScaledVector(E.subVectors(J[R.b],K),V);l.addScaledVector(m.subVectors(J[R.c], +P),V)}}g.add(y);h.add(K);l.add(P);y=g;K=h;P=l}if(L=b(this,q,e,y,K,P,z))C&&(S=C[N],n.copy(S[0]),r.copy(S[1]),t.copy(S[2]),L.uv=a(z,y,K,P,n,r,t)),L.face=R,L.faceIndex=N,v.push(L)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});cb.prototype=Object.create(K.prototype);cb.prototype.constructor=cb;db.prototype=Object.create(K.prototype);db.prototype.constructor=db;qa.prototype=Object.create(y.prototype);qa.prototype.constructor=qa;qa.prototype.isCamera=!0; +qa.prototype.getWorldDirection=function(){var a=new ca;return function(b){b=b||new q;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}();qa.prototype.lookAt=function(){var a=new H;return function(b){a.lookAt(this.position,b,this.up);this.quaternion.setFromRotationMatrix(a)}}();qa.prototype.clone=function(){return(new this.constructor).copy(this)};qa.prototype.copy=function(a){y.prototype.copy.call(this,a);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix); +return this};Ca.prototype=Object.assign(Object.create(qa.prototype),{constructor:Ca,isPerspectiveCamera:!0,copy:function(a){qa.prototype.copy.call(this,a);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*k.Math.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()}, +getFocalLength:function(){var a=Math.tan(.5*k.Math.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*k.Math.RAD2DEG*Math.atan(Math.tan(.5*k.Math.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()}, +clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*k.Math.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==f)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/g,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makeFrustum(e,e+d,b-c,b,a,this.far)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.fov= +this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});Cb.prototype=Object.assign(Object.create(qa.prototype),{constructor:Cb,isOrthographicCamera:!0,copy:function(a){qa.prototype.copy.call(this,a);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near= +a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a,c=c+a, +a=d+b,b=d-b;if(null!==this.view)var c=this.zoom/(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/this.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right= +this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});var jf=0;Db.prototype.isFogExp2=!0;Db.prototype.clone=function(){return new Db(this.color.getHex(),this.density)};Db.prototype.toJSON=function(a){return{type:"FogExp2",color:this.color.getHex(),density:this.density}};Eb.prototype.isFog=!0;Eb.prototype.clone=function(){return new Eb(this.color.getHex(),this.near,this.far)}; +Eb.prototype.toJSON=function(a){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}};eb.prototype=Object.create(y.prototype);eb.prototype.constructor=eb;eb.prototype.copy=function(a,b){y.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this};eb.prototype.toJSON= +function(a){var b=y.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b};yd.prototype=Object.assign(Object.create(y.prototype),{constructor:yd,isLensFlare:!0,copy:function(a){y.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=a.customUpdateCallback;for(var b=0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},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 M(16777215));void 0===d&&(d=1);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:0,opacity:f,color:e,blending:d})},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)}});fb.prototype=Object.create(T.prototype);fb.prototype.constructor=fb;fb.prototype.copy=function(a){T.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};hc.prototype=Object.assign(Object.create(y.prototype),{constructor:hc,isSprite:!0,raycast:function(){var a=new q;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.distanceSqToPoint(a);d>this.scale.x*this.scale.y/ +4||c.push({distance:Math.sqrt(d),point:this.position,face:null,object:this})}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});ic.prototype=Object.assign(Object.create(y.prototype),{constructor:ic,copy:function(a){y.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++); +c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new q;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new q,b=new q;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld); +c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});gb.prototype=Object.create(da.prototype);gb.prototype.constructor=gb;gb.prototype.isDataTexture=!0;Object.assign(Wc.prototype, +{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new H;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},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.parent.isBone?(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)},update:function(){var a=new H;return function(){for(var b=0,c=this.bones.length;b<c;b++)a.multiplyMatrices(this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix,this.boneInverses[b]),a.toArray(this.boneMatrices,16*b);this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)}}(),clone:function(){return new Wc(this.bones,this.boneInverses,this.useVertexTexture)}});Xc.prototype=Object.assign(Object.create(y.prototype),{constructor:Xc,isBone:!0,copy:function(a){y.prototype.copy.call(this, +a);this.skin=a.skin;return this}});Yc.prototype=Object.assign(Object.create(ua.prototype),{constructor:Yc,isSkinnedMesh:!0,bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){if(this.geometry&&this.geometry.isGeometry)for(var a=0;a<this.geometry.skinWeights.length;a++){var b=this.geometry.skinWeights[a], +c=1/b.lengthManhattan();Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry)for(var b=new ga,d=this.geometry.attributes.skinWeight,a=0;a<d.count;a++)b.x=d.getX(a),b.y=d.getY(a),b.z=d.getZ(a),b.w=d.getW(a),c=1/b.lengthManhattan(),Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0),d.setXYZW(a,b.x,b.y,b.z,b.w)},updateMatrixWorld:function(a){ua.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 unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material,this.skeleton.useVertexTexture)).copy(this)}});ma.prototype=Object.create(T.prototype);ma.prototype.constructor=ma;ma.prototype.isLineBasicMaterial=!0;ma.prototype.copy=function(a){T.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap; +this.linejoin=a.linejoin;return this};Na.prototype=Object.assign(Object.create(y.prototype),{constructor:Na,isLine:!0,raycast:function(){var a=new H,b=new Va,c=new Aa;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var l=new q,k=new q,h=new q,E=new q,m=this&&this.isLineSegments?2:1;if(g&&g.isBufferGeometry){var n= +g.index,r=g.attributes.position.array;if(null!==n)for(var n=n.array,g=0,t=n.length-1;g<t;g+=m){var v=n[g+1];l.fromArray(r,3*n[g]);k.fromArray(r,3*v);v=b.distanceSqToSegment(l,k,E,h);v>f||(E.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(E),v<d.near||v>d.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,t=r.length/3-1;g<t;g+=m)l.fromArray(r,3*g),k.fromArray(r,3*g+3),v=b.distanceSqToSegment(l,k,E,h),v>f||(E.applyMatrix4(this.matrixWorld), +v=d.ray.origin.distanceTo(E),v<d.near||v>d.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g&&g.isGeometry)for(l=g.vertices,k=l.length,g=0;g<k-1;g+=m)v=b.distanceSqToSegment(l[g],l[g+1],E,h),v>f||(E.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(E),v<d.near||v>d.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry, +this.material)).copy(this)}});ja.prototype=Object.assign(Object.create(Na.prototype),{constructor:ja,isLineSegments:!0});Ia.prototype=Object.create(T.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isPointsMaterial=!0;Ia.prototype.copy=function(a){T.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Fb.prototype=Object.assign(Object.create(y.prototype),{constructor:Fb,isPoints:!0,raycast:function(){var a=new H, +b=new Va,c=new Aa;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<E){var h=b.closestPointToPoint(a);h.applyMatrix4(l);var k=d.ray.origin.distanceTo(h);k<d.near||k>d.far||e.push({distance:k,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,l=this.matrixWorld,k=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(l);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(l); +b.copy(d.ray).applyMatrix4(a);var k=k/((this.scale.x+this.scale.y+this.scale.z)/3),E=k*k,k=new q;if(h&&h.isBufferGeometry){var m=h.index,h=h.attributes.position.array;if(null!==m)for(var n=m.array,m=0,r=n.length;m<r;m++){var t=n[m];k.fromArray(h,3*t);f(k,t)}else for(m=0,n=h.length/3;m<n;m++)k.fromArray(h,3*m),f(k,m)}else for(k=h.vertices,m=0,n=k.length;m<n;m++)f(k[m],m)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});jc.prototype=Object.assign(Object.create(y.prototype), +{constructor:jc});Zc.prototype=Object.create(da.prototype);Zc.prototype.constructor=Zc;Gb.prototype=Object.create(da.prototype);Gb.prototype.constructor=Gb;Gb.prototype.isCompressedTexture=!0;$c.prototype=Object.create(da.prototype);$c.prototype.constructor=$c;kc.prototype=Object.create(da.prototype);kc.prototype.constructor=kc;kc.prototype.isDepthTexture=!0;Hb.prototype=Object.create(K.prototype);Hb.prototype.constructor=Hb;Ib.prototype=Object.create(K.prototype);Ib.prototype.constructor=Ib;lc.prototype= +Object.create(P.prototype);lc.prototype.constructor=lc;ka.prototype=Object.create(K.prototype);ka.prototype.constructor=ka;mc.prototype=Object.create(ka.prototype);mc.prototype.constructor=mc;nc.prototype=Object.create(P.prototype);nc.prototype.constructor=nc;oc.prototype=Object.create(ka.prototype);oc.prototype.constructor=oc;pc.prototype=Object.create(P.prototype);pc.prototype.constructor=pc;qc.prototype=Object.create(ka.prototype);qc.prototype.constructor=qc;rc.prototype=Object.create(P.prototype); +rc.prototype.constructor=rc;sc.prototype=Object.create(ka.prototype);sc.prototype.constructor=sc;tc.prototype=Object.create(P.prototype);tc.prototype.constructor=tc;uc.prototype=Object.create(P.prototype);uc.prototype.constructor=uc;Jb.prototype=Object.create(K.prototype);Jb.prototype.constructor=Jb;vc.prototype=Object.create(P.prototype);vc.prototype.constructor=vc;Kb.prototype=Object.create(K.prototype);Kb.prototype.constructor=Kb;wc.prototype=Object.create(P.prototype);wc.prototype.constructor= +wc;Lb.prototype=Object.create(K.prototype);Lb.prototype.constructor=Lb;xc.prototype=Object.create(P.prototype);xc.prototype.constructor=xc;k.ShapeUtils={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g,h,l;if(0<k.ShapeUtils.area(a))for(h=0;h<c;h++)e[h]=h;else for(h=0;h<c;h++)e[h]=c-1-h;var p=2*c;for(h=c-1;2<c;){if(0>=p--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()"); +break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);l=h+1;c<=l&&(l=0);var q;a:{var m,n,r,t,v,z,u,w;m=a[e[g]].x;n=a[e[g]].y;r=a[e[h]].x;t=a[e[h]].y;v=a[e[l]].x;z=a[e[l]].y;if(0>=(r-m)*(z-n)-(t-n)*(v-m))q=!1;else{var I,x,F,G,C,L,B,y,D,H;I=v-r;x=z-t;F=m-v;G=n-z;C=r-m;L=t-n;for(q=0;q<c;q++)if(u=a[e[q]].x,w=a[e[q]].y,!(u===m&&w===n||u===r&&w===t||u===v&&w===z)&&(B=u-m,y=w-n,D=u-r,H=w-t,u-=v,w-=z,D=I*H-x*D,B=C*y-L*B,y=F*w-G*u,D>=-Number.EPSILON&&y>=-Number.EPSILON&&B>=-Number.EPSILON)){q=!1;break a}q=!0}}if(q){d.push([a[e[g]], +a[e[h]],a[e[l]]]);f.push([e[g],e[h],e[l]]);g=h;for(l=h+1;l<c;g++,l++)e[g]=e[l];c--;p=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function d(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 e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,l=e.x-c.x,k=e.y-c.y,m=a.x-c.x,p=a.y-c.y,n=h*l-g*k,q=h*m-g*p;if(Math.abs(n)>Number.EPSILON){if(0<n){if(0>q||q>n)return[];l=k*m-l* +p;if(0>l||l>n)return[]}else{if(0<q||q<n)return[];l=k*m-l*p;if(0<l||l<n)return[]}if(0===l)return!f||0!==q&&q!==n?[a]:[];if(l===n)return!f||0!==q&&q!==n?[b]:[];if(0===q)return[c];if(q===n)return[e];f=l/n;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==q||k*m!==l*p)return[];h=0===g&&0===h;l=0===l&&0===k;if(h&&l)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(l)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,l=a.x,h=b,a=b.x):(g=b,l=b.x,h=a,a=a.x),c.x<e.x?(b=c,n=c.x,k=e,c=e.x):(b=e,n=e.x,k=c,c=c.x)): +(a.y<b.y?(g=a,l=a.y,h=b,a=b.y):(g=b,l=b.y,h=a,a=a.y),c.y<e.y?(b=c,n=c.y,k=e,c=e.y):(b=e,n=e.y,k=c,c=c.y));return l<=n?a<n?[]:a===n?f?[]:[b]:a<=c?[b,h]:[b,k]:l>c?[]:l===c?f?[]:[g]:a<=c?[g,h]:[g,k]}function f(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 Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h,l,p,q,m={};l=a.concat();g=0;for(h=b.length;g<h;g++)Array.prototype.push.apply(l,b[g]);g=0;for(h= +l.length;g<h;g++)q=l[g].x+":"+l[g].y,void 0!==m[q]&&console.warn("THREE.ShapeUtils: Duplicate point",q,g),m[q]=g;g=function(a,b){function c(a,b){var d=h.length-1,e=a-1;0>e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],l[b]);if(!d)return!1;d=l.length-1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(l[b],l[e],l[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;c<h.length;c++)if(f=c+1,f%=h.length,f=e(a,b,h[c],h[f],!0),0<f.length)return!0;return!1}function g(a,c){var d,f,h,l;for(d=0;d<k.length;d++)for(f= +b[k[d]],h=0;h<f.length;h++)if(l=h+1,l%=f.length,l=e(a,c,f[h],f[l],!0),0<l.length)return!0;return!1}var h=a.concat(),l,k=[],m,p,n,q,E,B=[],y,D,H,K=0;for(m=b.length;K<m;K++)k.push(K);y=0;for(var N=2*k.length;0<k.length;){N--;if(0>N){console.log("Infinite Loop! Holes left:"+k.length+", Probably Hole outside Shape!");break}for(p=y;p<h.length;p++){n=h[p];m=-1;for(K=0;K<k.length;K++)if(q=k[K],E=n.x+":"+n.y+":"+q,void 0===B[E]){l=b[q];for(D=0;D<l.length;D++)if(q=l[D],c(p,D)&&!d(n,q)&&!g(n,q)){m=D;k.splice(K, +1);y=h.slice(0,p+1);q=h.slice(p);D=l.slice(m);H=l.slice(0,m+1);h=y.concat(D).concat(H).concat(q);y=p;break}if(0<=m)break;B[E]=!0}if(0<=m)break}}return h}(a,b);var n=k.ShapeUtils.triangulate(g,!1);g=0;for(h=n.length;g<h;g++)for(p=n[g],l=0;3>l;l++)q=p[l].x+":"+p[l].y,q=m[q],void 0!==q&&(p[l]=q);return n.concat()},isClockWise:function(a){return 0>k.ShapeUtils.area(a)},b2:function(){return function(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}}(),b3:function(){return function(a,b,c,d,e){var f=1- +a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}}()};ra.prototype=Object.create(P.prototype);ra.prototype.constructor=ra;ra.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};ra.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d,e,f;e=a.x-b.x;f=a.y-b.y;d=c.x-a.x;var g=c.y-a.y,h=e*e+f*f;if(Math.abs(e*g-f*d)>Number.EPSILON){var l= +Math.sqrt(h),k=Math.sqrt(d*d+g*g),h=b.x-f/l;b=b.y+e/l;g=((c.x-g/k-h)*g-(c.y+d/k-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new B(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new B(d/f,e/f)}function e(a,b){var c,d;for(J=a.length;0<=--J;){c=J;d=J-1;0>d&&(d=a.length-1);var e,f=r+2*E;for(e=0;e<f;e++){var g=T*e,h=T* +(e+1),l=b+c+g,g=b+d+g,k=b+d+h,h=b+c+h,l=l+Q,g=g+Q,k=k+Q,h=h+Q;D.faces.push(new oa(l,g,h,null,null,1));D.faces.push(new oa(g,k,h,null,null,1));l=u.generateSideWallUV(D,l,g,k,h);D.faceVertexUvs[0].push([l[0],l[1],l[3]]);D.faceVertexUvs[0].push([l[1],l[2],l[3]])}}}function f(a,b,c){D.vertices.push(new q(a,b,c))}function g(a,b,c){a+=Q;b+=Q;c+=Q;D.faces.push(new oa(a,b,c,null,null,0));a=u.generateTopUV(D,a,b,c);D.faceVertexUvs[0].push(a)}var h=void 0!==b.amount?b.amount:100,l=void 0!==b.bevelThickness? +b.bevelThickness:6,p=void 0!==b.bevelSize?b.bevelSize:l-2,E=void 0!==b.bevelSegments?b.bevelSegments:3,m=void 0!==b.bevelEnabled?b.bevelEnabled:!0,n=void 0!==b.curveSegments?b.curveSegments:12,r=void 0!==b.steps?b.steps:1,t=b.extrudePath,v,z=!1,u=void 0!==b.UVGenerator?b.UVGenerator:ra.WorldUVGenerator,w,I,x,F;t&&(v=t.getSpacedPoints(r),z=!0,m=!1,w=void 0!==b.frames?b.frames:t.computeFrenetFrames(r,!1),I=new q,x=new q,F=new q);m||(p=l=E=0);var G,C,y,D=this,Q=this.vertices.length,t=a.extractPoints(n), +n=t.shape,H=t.holes;if(t=!k.ShapeUtils.isClockWise(n)){n=n.reverse();C=0;for(y=H.length;C<y;C++)G=H[C],k.ShapeUtils.isClockWise(G)&&(H[C]=G.reverse());t=!1}var K=k.ShapeUtils.triangulateShape(n,H),P=n;C=0;for(y=H.length;C<y;C++)G=H[C],n=n.concat(G);var M,N,O,R,S,T=n.length,U,V=K.length,t=[],J=0;O=P.length;M=O-1;for(N=J+1;J<O;J++,M++,N++)M===O&&(M=0),N===O&&(N=0),t[J]=d(P[J],P[M],P[N]);var W=[],X,aa=t.concat();C=0;for(y=H.length;C<y;C++){G=H[C];X=[];J=0;O=G.length;M=O-1;for(N=J+1;J<O;J++,M++,N++)M=== +O&&(M=0),N===O&&(N=0),X[J]=d(G[J],G[M],G[N]);W.push(X);aa=aa.concat(X)}for(M=0;M<E;M++){O=M/E;R=l*Math.cos(O*Math.PI/2);N=p*Math.sin(O*Math.PI/2);J=0;for(O=P.length;J<O;J++)S=c(P[J],t[J],N),f(S.x,S.y,-R);C=0;for(y=H.length;C<y;C++)for(G=H[C],X=W[C],J=0,O=G.length;J<O;J++)S=c(G[J],X[J],N),f(S.x,S.y,-R)}N=p;for(J=0;J<T;J++)S=m?c(n[J],aa[J],N):n[J],z?(x.copy(w.normals[0]).multiplyScalar(S.x),I.copy(w.binormals[0]).multiplyScalar(S.y),F.copy(v[0]).add(x).add(I),f(F.x,F.y,F.z)):f(S.x,S.y,0);for(O=1;O<= +r;O++)for(J=0;J<T;J++)S=m?c(n[J],aa[J],N):n[J],z?(x.copy(w.normals[O]).multiplyScalar(S.x),I.copy(w.binormals[O]).multiplyScalar(S.y),F.copy(v[O]).add(x).add(I),f(F.x,F.y,F.z)):f(S.x,S.y,h/r*O);for(M=E-1;0<=M;M--){O=M/E;R=l*Math.cos(O*Math.PI/2);N=p*Math.sin(O*Math.PI/2);J=0;for(O=P.length;J<O;J++)S=c(P[J],t[J],N),f(S.x,S.y,h+R);C=0;for(y=H.length;C<y;C++)for(G=H[C],X=W[C],J=0,O=G.length;J<O;J++)S=c(G[J],X[J],N),z?f(S.x,S.y+v[r-1].y,v[r-1].x+R):f(S.x,S.y,h+R)}(function(){if(m){var a=0*T;for(J=0;J< +V;J++)U=K[J],g(U[2]+a,U[1]+a,U[0]+a);a=T*(r+2*E);for(J=0;J<V;J++)U=K[J],g(U[0]+a,U[1]+a,U[2]+a)}else{for(J=0;J<V;J++)U=K[J],g(U[2],U[1],U[0]);for(J=0;J<V;J++)U=K[J],g(U[0]+T*r,U[1]+T*r,U[2]+T*r)}})();(function(){var a=0;e(P,a);a+=P.length;C=0;for(y=H.length;C<y;C++)G=H[C],e(G,a),a+=G.length})()};ra.WorldUVGenerator={generateTopUV:function(a,b,c,d){a=a.vertices;b=a[b];c=a[c];d=a[d];return[new B(b.x,b.y),new B(c.x,c.y),new B(d.x,d.y)]},generateSideWallUV:function(a,b,c,d,e){a=a.vertices;b=a[b];c=a[c]; +d=a[d];e=a[e];return.01>Math.abs(b.y-c.y)?[new B(b.x,1-b.z),new B(c.x,1-c.z),new B(d.x,1-d.z),new B(e.x,1-e.z)]:[new B(b.y,1-b.z),new B(c.y,1-c.z),new B(d.y,1-d.z),new B(e.y,1-e.z)]}};yc.prototype=Object.create(ra.prototype);yc.prototype.constructor=yc;hb.prototype=Object.create(K.prototype);hb.prototype.constructor=hb;Mb.prototype=Object.create(P.prototype);Mb.prototype.constructor=Mb;Nb.prototype=Object.create(K.prototype);Nb.prototype.constructor=Nb;zc.prototype=Object.create(P.prototype);zc.prototype.constructor= +zc;Ac.prototype=Object.create(P.prototype);Ac.prototype.constructor=Ac;Ob.prototype=Object.create(K.prototype);Ob.prototype.constructor=Ob;Bc.prototype=Object.create(P.prototype);Bc.prototype.constructor=Bc;Xa.prototype=Object.create(P.prototype);Xa.prototype.constructor=Xa;Xa.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;c<d;c++)this.addShape(a[c],b);return this};Xa.prototype.addShape=function(a,b){void 0===b&&(b={});var c=b.material,d=void 0===b.UVGenerator?ra.WorldUVGenerator:b.UVGenerator, +e,f,g,h=this.vertices.length;e=a.extractPoints(void 0!==b.curveSegments?b.curveSegments:12);var l=e.shape,p=e.holes;if(!k.ShapeUtils.isClockWise(l))for(l=l.reverse(),e=0,f=p.length;e<f;e++)g=p[e],k.ShapeUtils.isClockWise(g)&&(p[e]=g.reverse());var E=k.ShapeUtils.triangulateShape(l,p);e=0;for(f=p.length;e<f;e++)g=p[e],l=l.concat(g);p=l.length;f=E.length;for(e=0;e<p;e++)g=l[e],this.vertices.push(new q(g.x,g.y,0));for(e=0;e<f;e++)p=E[e],l=p[0]+h,g=p[1]+h,p=p[2]+h,this.faces.push(new oa(l,g,p,null,null, +c)),this.faceVertexUvs[0].push(d.generateTopUV(this,l,g,p))};Pb.prototype=Object.create(K.prototype);Pb.prototype.constructor=Pb;Ya.prototype=Object.create(K.prototype);Ya.prototype.constructor=Ya;ib.prototype=Object.create(P.prototype);ib.prototype.constructor=ib;Cc.prototype=Object.create(ib.prototype);Cc.prototype.constructor=Cc;Dc.prototype=Object.create(K.prototype);Dc.prototype.constructor=Dc;Qb.prototype=Object.create(K.prototype);Qb.prototype.constructor=Qb;Ec.prototype=Object.create(P.prototype); +Ec.prototype.constructor=Ec;jb.prototype=Object.create(P.prototype);jb.prototype.constructor=jb;var za=Object.freeze({WireframeGeometry:Hb,ParametricGeometry:lc,ParametricBufferGeometry:Ib,TetrahedronGeometry:nc,TetrahedronBufferGeometry:mc,OctahedronGeometry:pc,OctahedronBufferGeometry:oc,IcosahedronGeometry:rc,IcosahedronBufferGeometry:qc,DodecahedronGeometry:tc,DodecahedronBufferGeometry:sc,PolyhedronGeometry:uc,PolyhedronBufferGeometry:ka,TubeGeometry:vc,TubeBufferGeometry:Jb,TorusKnotGeometry:wc, +TorusKnotBufferGeometry:Kb,TorusGeometry:xc,TorusBufferGeometry:Lb,TextGeometry:yc,SphereBufferGeometry:hb,SphereGeometry:Mb,RingGeometry:zc,RingBufferGeometry:Nb,PlaneBufferGeometry:db,PlaneGeometry:Ac,LatheGeometry:Bc,LatheBufferGeometry:Ob,ShapeGeometry:Xa,ExtrudeGeometry:ra,EdgesGeometry:Pb,ConeGeometry:Cc,ConeBufferGeometry:Dc,CylinderGeometry:ib,CylinderBufferGeometry:Ya,CircleBufferGeometry:Qb,CircleGeometry:Ec,BoxBufferGeometry:cb,BoxGeometry:jb});Rb.prototype=Object.create(Da.prototype); +Rb.prototype.constructor=Rb;Rb.prototype.isShadowMaterial=!0;Sb.prototype=Object.create(Da.prototype);Sb.prototype.constructor=Sb;Sb.prototype.isRawShaderMaterial=!0;Fc.prototype={constructor:Fc,isMultiMaterial:!0,toJSON:function(a){for(var b={metadata:{version:4.2,type:"material",generator:"MaterialExporter"},uuid:this.uuid,type:this.type,materials:[]},c=this.materials,d=0,e=c.length;d<e;d++){var f=c[d].toJSON(a);delete f.metadata;b.materials.push(f)}b.visible=this.visible;return b},clone:function(){for(var a= +new this.constructor,b=0;b<this.materials.length;b++)a.materials.push(this.materials[b].clone());a.visible=this.visible;return a}};va.prototype=Object.create(T.prototype);va.prototype.constructor=va;va.prototype.isMeshStandardMaterial=!0;va.prototype.copy=function(a){T.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap; +this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity= +a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};kb.prototype=Object.create(va.prototype);kb.prototype.constructor=kb;kb.prototype.isMeshPhysicalMaterial=!0;kb.prototype.copy=function(a){va.prototype.copy.call(this,a);this.defines={PHYSICAL:""}; +this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Za.prototype=Object.create(T.prototype);Za.prototype.constructor=Za;Za.prototype.isMeshPhongMaterial=!0;Za.prototype.copy=function(a){T.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity; +this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio; +this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};lb.prototype=Object.create(T.prototype);lb.prototype.constructor=lb;lb.prototype.isMeshNormalMaterial=!0;lb.prototype.copy=function(a){T.prototype.copy.call(this,a);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this}; +mb.prototype=Object.create(T.prototype);mb.prototype.constructor=mb;mb.prototype.isMeshLambertMaterial=!0;mb.prototype.copy=function(a){T.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap= +a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};nb.prototype=Object.create(T.prototype);nb.prototype.constructor=nb;nb.prototype.isLineDashedMaterial=!0;nb.prototype.copy=function(a){T.prototype.copy.call(this, +a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var uf=Object.freeze({ShadowMaterial:Rb,SpriteMaterial:fb,RawShaderMaterial:Sb,ShaderMaterial:Da,PointsMaterial:Ia,MultiMaterial:Fc,MeshPhysicalMaterial:kb,MeshStandardMaterial:va,MeshPhongMaterial:Za,MeshNormalMaterial:lb,MeshLambertMaterial:mb,MeshDepthMaterial:Ta,MeshBasicMaterial:Ha,LineDashedMaterial:nb,LineBasicMaterial:ma,Material:T});k.Cache={enabled:!1,files:{}, +add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}};k.DefaultLoadingManager=new zd;Object.assign(wa.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=k.Cache.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h= +g[1],l=!!g[2],g=g[3],g=window.decodeURIComponent(g);l&&(g=window.atob(g));try{var p,q=(this.responseType||"").toLowerCase();switch(q){case "arraybuffer":case "blob":p=new ArrayBuffer(g.length);for(var m=new Uint8Array(p),l=0;l<g.length;l++)m[l]=g.charCodeAt(l);"blob"===q&&(p=new Blob([p],{type:h}));break;case "document":p=(new DOMParser).parseFromString(g,h);break;case "json":p=JSON.parse(g);break;default:p=g}window.setTimeout(function(){b&&b(p);e.manager.itemEnd(a)},0)}catch(r){window.setTimeout(function(){d&& +d(r);e.manager.itemError(a)},0)}}else{var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(c){var f=c.target.response;k.Cache.add(a,f);200===this.status?(b&&b(f),e.manager.itemEnd(a)):0===this.status?(console.warn("THREE.XHRLoader: HTTP Status 0 received."),b&&b(f),e.manager.itemEnd(a)):(d&&d(c),e.manager.itemError(a))},!1);void 0!==c&&n.addEventListener("progress",function(a){c(a)},!1);n.addEventListener("error",function(b){d&&d(b);e.manager.itemError(a)},!1);void 0!==this.responseType&& +(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials);n.overrideMimeType&&n.overrideMimeType("text/plain");n.send(null)}e.manager.itemStart(a);return n},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this}});Object.assign(oe.prototype,{load:function(a,b,c,d){function e(e){l.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width, +height:a.height,format:a.format,mipmaps:a.mipmaps};k+=1;6===k&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Gb;h.image=g;var l=new wa(this.manager);l.setPath(this.path);l.setResponseType("arraybuffer");if(Array.isArray(a))for(var k=0,q=0,m=a.length;q<m;++q)e(q);else l.load(a,function(a){a=f._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d* +a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h},setPath:function(a){this.path=a;return this}});Object.assign(Ad.prototype,{load:function(a,b,c,d){var e=this,f=new gb,g=new wa(this.manager);g.setResponseType("arraybuffer");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!== +a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Gc.prototype, +{load:function(a,b,c,d){var e=this,f=document.createElementNS("http://www.w3.org/1999/xhtml","img");f.onload=function(){f.onload=null;URL.revokeObjectURL(f.src);b&&b(f);e.manager.itemEnd(a)};f.onerror=d;if(0===a.indexOf("data:"))f.src=a;else{var g=new wa;g.setPath(this.path);g.setResponseType("blob");g.setWithCredentials(this.withCredentials);g.load(a,function(a){f.src=URL.createObjectURL(a)},c,d)}e.manager.itemStart(a);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setWithCredentials:function(a){this.withCredentials= +a;return this},setPath:function(a){this.path=a;return this}});Object.assign(Bd.prototype,{load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Ra,g=new Gc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(ad.prototype,{load:function(a, +b,c,d){var e=new da,f=new Gc(this.manager);f.setCrossOrigin(this.crossOrigin);f.setWithCredentials(this.withCredentials);f.setPath(this.path);f.load(a,function(c){var d=0<a.search(/\.(jpg|jpeg)$/)||0===a.search(/^data\:image\/jpeg/);e.format=d?1022:1023;e.image=c;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e},setCrossOrigin:function(a){this.crossOrigin=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setPath:function(a){this.path=a;return this}});na.prototype=Object.assign(Object.create(y.prototype), +{constructor:na,isLight:!0,copy:function(a){y.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!== +this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});bd.prototype=Object.assign(Object.create(na.prototype),{constructor:bd,isHemisphereLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);return this}});Object.assign(ob.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)}, +toJSON:function(){var a={};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});cd.prototype=Object.assign(Object.create(ob.prototype),{constructor:cd,isSpotLightShadow:!0,update:function(a){var b=2*k.Math.RAD2DEG*a.angle,c=this.mapSize.width/this.mapSize.height;a=a.distance||500;var d=this.camera;if(b!==d.fov||c!==d.aspect|| +a!==d.far)d.fov=b,d.aspect=c,d.far=a,d.updateProjectionMatrix()}});dd.prototype=Object.assign(Object.create(na.prototype),{constructor:dd,isSpotLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});ed.prototype=Object.assign(Object.create(na.prototype),{constructor:ed,isPointLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance= +a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});fd.prototype=Object.assign(Object.create(ob.prototype),{constructor:fd});gd.prototype=Object.assign(Object.create(na.prototype),{constructor:gd,isDirectionalLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});hd.prototype=Object.assign(Object.create(na.prototype),{constructor:hd,isAmbientLight:!0});k.AnimationUtils={arraySlice:function(a,b,c){return k.AnimationUtils.isTypedArray(a)? +new a.constructor(a.subarray(b,c)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]* +b,l=0;l!==b;++l)e[g++]=a[h+l];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];while(void 0!==f)}}}};ea.prototype={constructor:ea,evaluate:function(a){var b= +this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex= +0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(a,b,c,d){throw Error("call to abstract method");},intervalChanged_:function(a, +b,c){}};Object.assign(ea.prototype,{beforeStart_:ea.prototype.copySampleValue_,afterEnd_:ea.prototype.copySampleValue_});id.prototype=Object.assign(Object.create(ea.prototype),{constructor:id,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f= +a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,l=this._offsetPrev,k=this._offsetNext,q=this._weightPrev,m=this._weightNext,n=(c-b)/(d-b);c=n*n;d=c*n;b=-q*d+2*q*c-q*n;q=(1+q)*d+(-1.5-2*q)*c+(-.5+q)*n+1;n=(-1-m)*d+(1.5+m)*c+.5*n;m=m*d-m*c;for(c=0;c!==g;++c)e[c]= +b*f[l+c]+q*f[h+c]+n*f[a+c]+m*f[k+c];return e}});Hc.prototype=Object.assign(Object.create(ea.prototype),{constructor:Hc,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});jd.prototype=Object.assign(Object.create(ea.prototype),{constructor:jd,interpolate_:function(a,b,c,d){return this.copySampleValue_(a-1)}});var Qa;Qa={TimeBufferType:Float32Array,ValueBufferType:Float32Array, +DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new jd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Hc(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new id(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){var b;switch(a){case 2300:b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b= +this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw Error(b);console.warn(b)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}}, +getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),d=this.getValueSize(),this.times=k.AnimationUtils.arraySlice(c,e,f),this.values=k.AnimationUtils.arraySlice(this.values, +e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("invalid value size in track",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("track is empty",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("time is not a valid number",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("out of order keys",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&k.AnimationUtils.isTypedArray(b))for(f= +0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("value is not a valid number",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,l=a[g];if(l!==a[g+1]&&(1!==g||l!==l[0]))if(d)h=!0;else for(var p=g*c,q=p-c,m=p+c,l=0;l!==c;++l){var n=b[p+l];if(n!==b[q+l]||n!==b[m+l]){h=!0;break}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,p=e*c,l=0;l!==c;++l)b[p+l]=b[h+l];++e}}if(0<f){a[e]= +a[f];h=f*c;p=e*c;for(l=0;l!==c;++l)b[p+l]=b[h+l];++e}e!==a.length&&(this.times=k.AnimationUtils.arraySlice(a,0,e),this.values=k.AnimationUtils.arraySlice(b,0,e*c));return this}};Tb.prototype=Object.assign(Object.create(Qa),{constructor:Tb,ValueTypeName:"vector"});kd.prototype=Object.assign(Object.create(ea.prototype),{constructor:kd,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)ca.slerpFlat(e,0,f,a-g,f,a,b);return e}}); +Ic.prototype=Object.assign(Object.create(Qa),{constructor:Ic,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new kd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});Ub.prototype=Object.assign(Object.create(Qa),{constructor:Ub,ValueTypeName:"number"});ld.prototype=Object.assign(Object.create(Qa),{constructor:ld,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0, +InterpolantFactoryMethodSmooth:void 0});md.prototype=Object.assign(Object.create(Qa),{constructor:md,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});nd.prototype=Object.assign(Object.create(Qa),{constructor:nd,ValueTypeName:"color"});qb.prototype=Qa;Qa.constructor=qb;Object.assign(qb,{parse:function(a){if(void 0===a.type)throw Error("track type undefined, can not parse");var b=qb._getTrackTypeForValueTypeName(a.type); +if(void 0===a.times){var c=[],d=[];k.AnimationUtils.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,a.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{var b={name:a.name,times:k.AnimationUtils.convertArray(a.times,Array),values:k.AnimationUtils.convertArray(a.values,Array)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return Ub; +case "vector":case "vector2":case "vector3":case "vector4":return Tb;case "color":return nd;case "quaternion":return Ic;case "bool":case "boolean":return md;case "string":return ld}throw Error("Unsupported typeName: "+a);}});ta.prototype={constructor:ta,resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b)var d=this.tracks[b],a=Math.max(a,d.times[d.times.length-1]);this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this}, +optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}};Object.assign(ta,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(qb.parse(c[e]).scale(d));return new ta(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(qb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h= +[],l=[];h.push((g+e-1)%e,g,(g+1)%e);l.push(0,1,0);var p=k.AnimationUtils.getKeyframeOrder(h),h=k.AnimationUtils.sortedArray(h,1,p),l=k.AnimationUtils.sortedArray(l,1,p);d||0!==h[0]||(h.push(e),l.push(l[0]));f.push((new Ub(".morphTargetInfluences["+b[g].name+"]",h,l)).scale(1/c))}return new ta(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(var d=0;d<c.length;d++)if(c[d].name===b)return c[d];return null},CreateClipsFromMorphTargetSequences:function(a, +b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],l=h.name.match(e);if(l&&1<l.length){var k=l[1];(l=d[k])||(d[k]=l=[]);l.push(h)}}a=[];for(k in d)a.push(ta.CreateFromMorphTargetSequence(k,d[k],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error(" no animation in JSONLoader data"),null;for(var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];k.AnimationUtils.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length|| +-1,g=a.fps||30,h=a.hierarchy||[],l=0;l<h.length;l++){var p=h[l].keys;if(p&&0!==p.length)if(p[0].morphTargets){for(var f={},q=0;q<p.length;q++)if(p[q].morphTargets)for(var m=0;m<p[q].morphTargets.length;m++)f[p[q].morphTargets[m]]=-1;for(var n in f){for(var r=[],t=[],m=0;m!==p[q].morphTargets.length;++m){var v=p[q];r.push(v.time);t.push(v.morphTarget===n?1:0)}d.push(new Ub(".morphTargetInfluence["+n+"]",r,t))}f=f.length*(g||1)}else q=".bones["+b[l].name+"]",c(Tb,q+".position",p,"pos",d),c(Ic,q+".quaternion", +p,"rot",d),c(Tb,q+".scale",p,"scl",d)}return 0===d.length?null:new ta(e,f,d)}});Object.assign(od.prototype,{load:function(a,b,c,d){var e=this;(new wa(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new uf[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color); +void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=a.fog);void 0!== +a.shading&&(d.shading=a.shading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth= +a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap)); +void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&(e=[e,e]);d.normalScale=(new B).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&& +(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&& +(d.aoMapIntensity=a.aoMapIntensity);if(void 0!==a.materials)for(var e=0,f=a.materials.length;e<f;e++)d.materials.push(this.parse(a.materials[e]));return d}});Object.assign(Cd.prototype,{load:function(a,b,c,d){var e=this;(new wa(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new K,c=a.data.index,d={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array, +Float32Array:Float32Array,Float64Array:Float64Array};void 0!==c&&(c=new d[c.type](c.array),b.setIndex(new D(c,1)));var e=a.data.attributes,f;for(f in e){var g=e[f],c=new d[g.type](g.array);b.addAttribute(f,new D(c,g.itemSize,g.normalized))}d=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==d)for(f=0,c=d.length;f!==c;++f)e=d[f],b.addGroup(e.start,e.count,e.materialIndex);a=a.data.boundingSphere;void 0!==a&&(d=new q,void 0!==a.center&&d.fromArray(a.center),b.boundingSphere=new Aa(d,a.radius)); +return b}});rb.prototype={constructor:rb,crossOrigin:void 0,extractUrlBase:function(a){a=a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a,b,c;return function(d,e,f){function g(a,c,d,g,l){a=e+a;var p=rb.Handlers.get(a);null!==p?a=p.load(a):(b.setCrossOrigin(f),a=b.load(a));void 0!==c&&(a.repeat.fromArray(c),1!==c[0]&&(a.wrapS=1E3),1!==c[1]&& +(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==g&&("repeat"===g[0]&&(a.wrapS=1E3),"mirror"===g[0]&&(a.wrapS=1002),"repeat"===g[1]&&(a.wrapT=1E3),"mirror"===g[1]&&(a.wrapT=1002));void 0!==l&&(a.anisotropy=l);c=k.Math.generateUUID();h[c]=a;return c}void 0===a&&(a=new M);void 0===b&&(b=new ad);void 0===c&&(c=new od);var h={},l={uuid:k.Math.generateUUID(),type:"MeshLambertMaterial"},p;for(p in d){var q=d[p];switch(p){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break; +case "DbgName":l.name=q;break;case "blending":l.blending=xe[q];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",p,"is no longer supported.");break;case "colorDiffuse":l.color=a.fromArray(q).getHex();break;case "colorSpecular":l.specular=a.fromArray(q).getHex();break;case "colorEmissive":l.emissive=a.fromArray(q).getHex();break;case "specularCoef":l.shininess=q;break;case "shading":"basic"===q.toLowerCase()&&(l.type="MeshBasicMaterial");"phong"===q.toLowerCase()&& +(l.type="MeshPhongMaterial");"standard"===q.toLowerCase()&&(l.type="MeshStandardMaterial");break;case "mapDiffuse":l.map=g(q,d.mapDiffuseRepeat,d.mapDiffuseOffset,d.mapDiffuseWrap,d.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;case "mapEmissive":l.emissiveMap=g(q,d.mapEmissiveRepeat,d.mapEmissiveOffset,d.mapEmissiveWrap,d.mapEmissiveAnisotropy);break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break; +case "mapLight":l.lightMap=g(q,d.mapLightRepeat,d.mapLightOffset,d.mapLightWrap,d.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;case "mapAO":l.aoMap=g(q,d.mapAORepeat,d.mapAOOffset,d.mapAOWrap,d.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":l.bumpMap=g(q,d.mapBumpRepeat,d.mapBumpOffset,d.mapBumpWrap,d.mapBumpAnisotropy);break;case "mapBumpScale":l.bumpScale= +q;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":l.normalMap=g(q,d.mapNormalRepeat,d.mapNormalOffset,d.mapNormalWrap,d.mapNormalAnisotropy);break;case "mapNormalFactor":l.normalScale=[q,q];break;case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":l.specularMap=g(q,d.mapSpecularRepeat,d.mapSpecularOffset,d.mapSpecularWrap,d.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break; +case "mapMetalness":l.metalnessMap=g(q,d.mapMetalnessRepeat,d.mapMetalnessOffset,d.mapMetalnessWrap,d.mapMetalnessAnisotropy);break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;case "mapRoughness":l.roughnessMap=g(q,d.mapRoughnessRepeat,d.mapRoughnessOffset,d.mapRoughnessWrap,d.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":l.alphaMap= +g(q,d.mapAlphaRepeat,d.mapAlphaOffset,d.mapAlphaWrap,d.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;case "flipSided":l.side=1;break;case "doubleSided":l.side=2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");l.opacity=q;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":l[p]= +q;break;case "vertexColors":!0===q&&(l.vertexColors=2);"face"===q&&(l.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",p,q)}}"MeshBasicMaterial"===l.type&&delete l.emissive;"MeshPhongMaterial"!==l.type&&delete l.specular;1>l.opacity&&(l.transparent=!0);c.setTextures(h);return c.parse(l)}}()};rb.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}}; +Object.assign(Dd.prototype,{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:rb.prototype.extractUrlBase(a),g=new wa(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+ +a+" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(a,b){var c=new P,d=void 0!==a.scale?1/a.scale:1;(function(b){var d,g,h,l,k,E,m,n,r,t,v,z,u,w=a.faces;E=a.vertices;var y=a.normals,x=a.colors,F=0;if(void 0!==a.uvs){for(d=0;d<a.uvs.length;d++)a.uvs[d].length&&F++;for(d=0;d<F;d++)c.faceVertexUvs[d]=[]}l=0;for(k=E.length;l<k;)d=new q,d.x=E[l++]*b,d.y=E[l++]*b,d.z=E[l++]*b,c.vertices.push(d); +l=0;for(k=w.length;l<k;)if(b=w[l++],r=b&1,h=b&2,d=b&8,m=b&16,t=b&32,E=b&64,b&=128,r){r=new oa;r.a=w[l];r.b=w[l+1];r.c=w[l+3];v=new oa;v.a=w[l+1];v.b=w[l+2];v.c=w[l+3];l+=4;h&&(h=w[l++],r.materialIndex=h,v.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<F;d++)for(z=a.uvs[d],c.faceVertexUvs[d][h]=[],c.faceVertexUvs[d][h+1]=[],g=0;4>g;g++)n=w[l++],u=z[2*n],n=z[2*n+1],u=new B(u,n),2!==g&&c.faceVertexUvs[d][h].push(u),0!==g&&c.faceVertexUvs[d][h+1].push(u);m&&(m=3*w[l++],r.normal.set(y[m++],y[m++],y[m]), +v.normal.copy(r.normal));if(t)for(d=0;4>d;d++)m=3*w[l++],t=new q(y[m++],y[m++],y[m]),2!==d&&r.vertexNormals.push(t),0!==d&&v.vertexNormals.push(t);E&&(E=w[l++],E=x[E],r.color.setHex(E),v.color.setHex(E));if(b)for(d=0;4>d;d++)E=w[l++],E=x[E],2!==d&&r.vertexColors.push(new M(E)),0!==d&&v.vertexColors.push(new M(E));c.faces.push(r);c.faces.push(v)}else{r=new oa;r.a=w[l++];r.b=w[l++];r.c=w[l++];h&&(h=w[l++],r.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<F;d++)for(z=a.uvs[d],c.faceVertexUvs[d][h]= +[],g=0;3>g;g++)n=w[l++],u=z[2*n],n=z[2*n+1],u=new B(u,n),c.faceVertexUvs[d][h].push(u);m&&(m=3*w[l++],r.normal.set(y[m++],y[m++],y[m]));if(t)for(d=0;3>d;d++)m=3*w[l++],t=new q(y[m++],y[m++],y[m]),r.vertexNormals.push(t);E&&(E=w[l++],r.color.setHex(x[E]));if(b)for(d=0;3>d;d++)E=w[l++],r.vertexColors.push(new M(x[E]));c.faces.push(r)}})(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 ga(a.skinWeights[d], +1<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 ga(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+"), and skinWeights ("+ +c.skinWeights.length+") should match.")})();(function(b){if(void 0!==a.morphTargets)for(var d=0,g=a.morphTargets.length;d<g;d++){c.morphTargets[d]={};c.morphTargets[d].name=a.morphTargets[d].name;c.morphTargets[d].vertices=[];for(var h=c.morphTargets[d].vertices,l=a.morphTargets[d].vertices,k=0,E=l.length;k<E;k+=3){var m=new q;m.x=l[k]*b;m.y=l[k+1]*b;m.z=l[k+2]*b;h.push(m)}}if(void 0!==a.morphColors&&0<a.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'), +b=c.faces,h=a.morphColors[0].colors,d=0,g=b.length;d<g;d++)b[d].color.fromArray(h,3*d)})(d);(function(){var b=[],d=[];void 0!==a.animation&&d.push(a.animation);void 0!==a.animations&&(a.animations.length?d=d.concat(a.animations):d.push(a.animations));for(var g=0;g<d.length;g++){var h=ta.parseAnimation(d[g],c.bones);h&&b.push(h)}c.morphTargets&&(d=ta.CreateClipsFromMorphTargetSequences(c.morphTargets,10),b=b.concat(d));0<b.length&&(c.animations=b)})();c.computeFaceNormals();c.computeBoundingSphere(); +if(void 0===a.materials||0===a.materials.length)return{geometry:c};d=rb.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:d}}});Object.assign(pe.prototype,{load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new wa(e.manager)).load(a,function(a){e.parse(JSON.parse(a),b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries), +d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new Dd,d=new Cd,e=0,f=a.length;e<f;e++){var g,h=a[e];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":g=new za[h.type](h.width,h.height, +h.widthSegments,h.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":g=new za[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":g=new za[h.type](h.radius,h.segments,h.thetaStart,h.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":g=new za[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength); +break;case "ConeGeometry":case "ConeBufferGeometry":g=new za[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":g=new za[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":case "IcosahedronGeometry":case "OctahedronGeometry":case "TetrahedronGeometry":g=new za[h.type](h.radius,h.detail);break;case "RingGeometry":case "RingBufferGeometry":g= +new za[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":g=new za[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":g=new za[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case "LatheGeometry":case "LatheBufferGeometry":g=new za[h.type](h.points,h.segments,h.phiStart,h.phiLength);break;case "BufferGeometry":g= +d.parse(h);break;case "Geometry":g=c.parse(h.data,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+h.type+'"');continue}g.uuid=h.uuid;void 0!==h.name&&(g.name=h.name);b[h.uuid]=g}return b},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new od;d.setTextures(b);for(var e=0,f=a.length;e<f;e++){var g=d.parse(a[e]);c[g.uuid]=g}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=ta.parse(a[c]);b.push(d)}return b}, +parseImages:function(a,b){function c(a){d.manager.itemStart(a);return g.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemError(a)})}var d=this,e={};if(void 0!==a&&0<a.length){var f=new zd(b),g=new Gc(f);g.setCrossOrigin(this.crossOrigin);for(var f=0,h=a.length;f<h;f++){var l=a[f],k=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(l.url)?l.url:d.texturePath+l.url;e[l.uuid]=c(k)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.", +a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=new da(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,ye));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.wrap&&(h.wrapS= +c(g.wrap[0],Ud),h.wrapT=c(g.wrap[1],Ud));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,Vd));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,Vd));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new H;return function(b,c,d){function e(a){void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return c[a]}function f(a){if(void 0!==a)return void 0===d[a]&&console.warn("THREE.ObjectLoader: Undefined material", +a),d[a]}var g;switch(b.type){case "Scene":g=new eb;void 0!==b.background&&Number.isInteger(b.background)&&(g.background=new M(b.background));void 0!==b.fog&&("Fog"===b.fog.type?g.fog=new Eb(b.fog.color,b.fog.near,b.fog.far):"FogExp2"===b.fog.type&&(g.fog=new Db(b.fog.color,b.fog.density)));break;case "PerspectiveCamera":g=new Ca(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==b.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset= +b.filmOffset);void 0!==b.view&&(g.view=Object.assign({},b.view));break;case "OrthographicCamera":g=new Cb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case "AmbientLight":g=new hd(b.color,b.intensity);break;case "DirectionalLight":g=new gd(b.color,b.intensity);break;case "PointLight":g=new ed(b.color,b.intensity,b.distance,b.decay);break;case "SpotLight":g=new dd(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case "HemisphereLight":g=new bd(b.color,b.groundColor,b.intensity); +break;case "Mesh":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new Yc(g,h):new ua(g,h);break;case "LOD":g=new ic;break;case "Line":g=new Na(e(b.geometry),f(b.material),b.mode);break;case "LineSegments":g=new ja(e(b.geometry),f(b.material));break;case "PointCloud":case "Points":g=new Fb(e(b.geometry),f(b.material));break;case "Sprite":g=new hc(f(b.material));break;case "Group":g=new jc;break;default:g=new y}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix), +a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),void 0!==b.scale&&g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);void 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!== +b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=b.userData);if(void 0!==b.children)for(var l in b.children)g.add(this.parseObject(b.children[l],c,d));if("LOD"===b.type)for(b=b.levels,h=0;h<b.length;h++){var k=b[h];l=g.getObjectByProperty("uuid",k.object);void 0!==l&&g.addLevel(l,k.distance)}return g}}()});aa.prototype={constructor:aa, +getPoint:function(a){console.warn("THREE.Curve: Warning, getPoint() not implemented!");return null},getPointAt:function(a){a=this.getUtoTmapping(a);return this.getPoint(a)},getPoints:function(a){a||(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){a||(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},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},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,l;g<=h;)if(d=Math.floor(g+(h-g)/2),l=c[d]-f,0>l)g=d+1; +else if(0<l)h=d-1;else{h=d;break}d=h;if(c[d]===f)return d/(e-1);g=c[d];return(d+(f-g)/(c[d+1]-g))/(e-1)},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()},getTangentAt:function(a){a=this.getUtoTmapping(a);return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new q,d=[],e=[],f=[],g=new q,h=new H,l,p;for(l=0;l<=a;l++)p=l/a,d[l]=this.getTangentAt(p),d[l].normalize();e[0]=new q;f[0]=new q;l=Number.MAX_VALUE; +p=Math.abs(d[0].x);var E=Math.abs(d[0].y),m=Math.abs(d[0].z);p<=l&&(l=p,c.set(1,0,0));E<=l&&(l=E,c.set(0,1,0));m<=l&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(l=1;l<=a;l++)e[l]=e[l-1].clone(),f[l]=f[l-1].clone(),g.crossVectors(d[l-1],d[l]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(k.Math.clamp(d[l-1].dot(d[l]),-1,1)),e[l].applyMatrix4(h.makeRotationAxis(g,c))),f[l].crossVectors(d[l],e[l]);if(!0===b)for(c=Math.acos(k.Math.clamp(e[0].dot(e[a]), +-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),l=1;l<=a;l++)e[l].applyMatrix4(h.makeRotationAxis(d[l],c*l)),f[l].crossVectors(d[l],e[l]);return{tangents:d,normals:e,binormals:f}}};aa.create=function(a,b){a.prototype=Object.create(aa.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Ja.prototype=Object.create(aa.prototype);Ja.prototype.constructor=Ja;Ja.prototype.isLineCurve=!0;Ja.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=this.v2.clone().sub(this.v1); +b.multiplyScalar(a).add(this.v1);return b};Ja.prototype.getPointAt=function(a){return this.getPoint(a)};Ja.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};Jc.prototype=Object.assign(Object.create(aa.prototype),{constructor:Jc,add:function(a){this.curves.push(a)},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 Ja(b,a))},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],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths= +a},getSpacedPoints:function(a){a||(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++)for(var f=e[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},createPointsGeometry:function(a){a= +this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){for(var b=new P,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new q(e.x,e.y,e.z||0))}return b}});Oa.prototype=Object.create(aa.prototype);Oa.prototype.constructor=Oa;Oa.prototype.isEllipseCurve=!0;Oa.prototype.getPoint=function(a){for(var b=2*Math.PI,c=this.aEndAngle-this.aStartAngle,d=Math.abs(c)<Number.EPSILON;0>c;)c+=b; +for(;c>b;)c-=b;c<Number.EPSILON&&(c=d?0:b);!0!==this.aClockwise||d||(c=c===b?-b:c-b);b=this.aStartAngle+a*c;a=this.aX+this.xRadius*Math.cos(b);var e=this.aY+this.yRadius*Math.sin(b);0!==this.aRotation&&(b=Math.cos(this.aRotation),c=Math.sin(this.aRotation),d=a-this.aX,e-=this.aY,a=d*b-e*c+this.aX,e=d*c+e*b+this.aY);return new B(a,e)};k.CurveUtils={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}};sb.prototype=Object.create(aa.prototype);sb.prototype.constructor=sb;sb.prototype.isSplineCurve=!0;sb.prototype.getPoint=function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0===c?c:c-1],e=b[c],f=b[c>b.length-2?b.length-1:c+1],b=b[c> +b.length-3?b.length-1:c+2],c=k.CurveUtils.interpolate;return new B(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a))};tb.prototype=Object.create(aa.prototype);tb.prototype.constructor=tb;tb.prototype.getPoint=function(a){var b=k.ShapeUtils.b3;return new B(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))};tb.prototype.getTangent=function(a){var b=k.CurveUtils.tangentCubicBezier;return(new B(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y, +this.v3.y))).normalize()};ub.prototype=Object.create(aa.prototype);ub.prototype.constructor=ub;ub.prototype.getPoint=function(a){var b=k.ShapeUtils.b2;return new B(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))};ub.prototype.getTangent=function(a){var b=k.CurveUtils.tangentQuadraticBezier;return(new B(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))).normalize()};var Wd=Object.assign(Object.create(Jc.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)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Ja(this.currentPoint.clone(),new B(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,b,c,d){a=new ub(this.currentPoint.clone(),new B(a,b),new B(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new tb(this.currentPoint.clone(),new B(a,b),new B(c,d),new B(e,f));this.curves.push(a); +this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new sb(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new Oa(a,b,c,d,e,f,g,h);0<this.curves.length&& +(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)}});vb.prototype=Object.assign(Object.create(Wd),{constructor:vb,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractAllPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},extractPoints:function(a){return this.extractAllPoints(a)}});Kc.prototype=Wd;Wd.constructor=Kc;Ed.prototype= +{moveTo:function(a,b){this.currentPath=new Kc;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new vb;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],l=h.x-g.x,k=h.y-g.y;if(Math.abs(k)>Number.EPSILON){if(0>k&&(g=b[f],l=-l,h=b[e],k=-k),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=k*(a.x-g.x)-l*(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<=h.x))return!0}return d}var e=k.ShapeUtils.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,l,p=[];if(1===f.length)return h=f[0],l= +new vb,l.curves=h.curves,p.push(l),p;var q=!e(f[0].getPoints()),q=a?!q:q;l=[];var m=[],n=[],r=0,t;m[r]=void 0;n[r]=[];for(var v=0,z=f.length;v<z;v++)h=f[v],t=h.getPoints(),g=e(t),(g=a?!g:g)?(!q&&m[r]&&r++,m[r]={s:new vb,p:t},m[r].s.curves=h.curves,q&&r++,n[r]=[]):n[r].push({h:h,p:t[0]});if(!m[0])return c(f);if(1<m.length){v=!1;h=[];e=0;for(f=m.length;e<f;e++)l[e]=[];e=0;for(f=m.length;e<f;e++)for(g=n[e],q=0;q<g.length;q++){r=g[q];t=!0;for(z=0;z<m.length;z++)d(r.p,m[z].p)&&(e!==z&&h.push({froms:e, +tos:z,hole:q}),t?(t=!1,l[z].push(r)):v=!0);t&&l[e].push(r)}0<h.length&&(v||(n=l))}v=0;for(e=m.length;v<e;v++)for(l=m[v].s,p.push(l),h=n[v],f=0,g=h.length;f<g;f++)l.holes.push(h[f].h);return p}};Object.assign(Fd.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=100);void 0===c&&(c=4);var d=this.data;a=String(a).split("");var e=b/d.resolution,f=0;b=[];for(var g=0;g<a.length;g++){var h;h=e;var l=f,p=d.glyphs[a[g]]||d.glyphs["?"];if(p){var q=new Ed,m=[],n=k.ShapeUtils.b2,r=k.ShapeUtils.b3, +t,v,z,u,w,y,x,F;if(p.o)for(var B=p._cachedOutline||(p._cachedOutline=p.o.split(" ")),C=0,D=B.length;C<D;)switch(B[C++]){case "m":t=B[C++]*h+l;v=B[C++]*h;q.moveTo(t,v);break;case "l":t=B[C++]*h+l;v=B[C++]*h;q.lineTo(t,v);break;case "q":t=B[C++]*h+l;v=B[C++]*h;w=B[C++]*h+l;y=B[C++]*h;q.quadraticCurveTo(w,y,t,v);if(u=m[m.length-1]){z=u.x;u=u.y;for(var H=1;H<=c;H++){var K=H/c;n(K,z,w,t);n(K,u,y,v)}}break;case "b":if(t=B[C++]*h+l,v=B[C++]*h,w=B[C++]*h+l,y=B[C++]*h,x=B[C++]*h+l,F=B[C++]*h,q.bezierCurveTo(w, +y,x,F,t,v),u=m[m.length-1])for(z=u.x,u=u.y,H=1;H<=c;H++)K=H/c,r(K,z,w,x,t),r(K,u,y,F,v)}h={offset:p.ha*h,path:q}}else h=void 0;f+=h.offset;b.push(h.path)}c=[];d=0;for(a=b.length;d<a;d++)Array.prototype.push.apply(c,b[d].toShapes());return c}});Object.assign(qe.prototype,{load:function(a,b,c,d){var e=this;(new wa(this.manager)).load(a,function(a){var c;try{c=JSON.parse(a)}catch(d){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65, +a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new Fd(a)}});var Hd;Object.assign(Id.prototype,{load:function(a,b,c,d){var e=new wa(this.manager);e.setResponseType("arraybuffer");e.load(a,function(a){Gd().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(re.prototype,{update:function(){var a,b,c,d,e,f,g,h=new H,l=new H;return function(p){if(a!==this||b!==p.focus||c!==p.fov||d!==p.aspect*this.aspect||e!==p.near||f!==p.far||g!==p.zoom){a=this;b=p.focus;c=p.fov;d=p.aspect* +this.aspect;e=p.near;f=p.far;g=p.zoom;var q=p.projectionMatrix.clone(),m=this.eyeSep/2,n=m*e/b,r=e*Math.tan(k.Math.DEG2RAD*c*.5)/g,t;l.elements[12]=-m;h.elements[12]=m;m=-r*d+n;t=r*d+n;q.elements[0]=2*e/(t-m);q.elements[8]=(t+m)/(t-m);this.cameraL.projectionMatrix.copy(q);m=-r*d-n;t=r*d-n;q.elements[0]=2*e/(t-m);q.elements[8]=(t+m)/(t-m);this.cameraR.projectionMatrix.copy(q)}this.cameraL.matrixWorld.copy(p.matrixWorld).multiply(l);this.cameraR.matrixWorld.copy(p.matrixWorld).multiply(h)}}()});pd.prototype= +Object.create(y.prototype);pd.prototype.constructor=pd;Jd.prototype=Object.assign(Object.create(y.prototype),{constructor:Jd,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)): +this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new q,b=new ca,c=new q,d=new q;return function(e){y.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.setPosition(a.x,a.y, +a.z);e.setOrientation(d.x,d.y,d.z,f.x,f.y,f.z)}}()});Vb.prototype=Object.assign(Object.create(y.prototype),{constructor:Vb,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setBuffer:function(a){this.source.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control."); +else{var a=this.context.createBufferSource();a.buffer=this.source.buffer;a.loop=this.source.loop;a.onended=this.source.onended;a.start(0,this.startTime);a.playbackRate.value=this.playbackRate;this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.startTime=this.context.currentTime,this.isPlaying=!1,this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control."); +else return this.source.stop(),this.startTime=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a- +1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control."); +else return this.playbackRate=a,!0===this.isPlaying&&(this.source.playbackRate.value=this.playbackRate),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.source.loop},setLoop:function(a){!1===this.hasPlaybackControl?console.warn("THREE.Audio: this Audio has no playback control."):this.source.loop=a},getVolume:function(){return this.gain.gain.value}, +setVolume:function(a){this.gain.gain.value=a;return this}});Kd.prototype=Object.assign(Object.create(Vb.prototype),{constructor:Kd,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel= +a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a},updateMatrixWorld:function(){var a=new q;return function(b){y.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}()});Object.assign(Ld.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+= +b[c];return a/b.length}});qd.prototype={constructor:qd,accumulate:function(a,b){var c=this.buffer,d=this.valueSize,e=a*d+d,f=this.cumulativeWeight;if(0===f){for(f=0;f!==d;++f)c[e+f]=c[f];f=b}else f+=b,this._mixBufferRegion(c,e,0,b/f,d);this.cumulativeWeight=f},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}}, +saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d,e){ca.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}};fa.prototype={constructor:fa,getValue:function(a, +b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=fa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error(" can not bind to material as node does not have a material",this);return}if(!a.material.materials){console.error(" can not bind to material.materials as node.material does not have a materials array", +this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error(" can not bind to bones as node does not have a skeleton",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error(" can not bind to objectName of node, undefined",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error(" trying to bind to objectIndex of objectName, but is undefined:",this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error(" trying to update property for track: "+ +b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error(" can not bind to morphTargetInfluences becasuse node does not have a geometry",this);return}if(!a.geometry.morphTargets){console.error(" can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets", +this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):void 0!==f.length?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error(" trying to update node for track: "+ +this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}};Object.assign(fa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},_getValue_unbound:fa.prototype.getValue,_setValue_unbound:fa.prototype.setValue,BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]}, +function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.node[this.propertyName]=a[b]},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty, +d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]; +this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]]});fa.Composite=function(a,b,c){c=c||fa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)};fa.Composite.prototype={constructor:fa.Composite,getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_]; +void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}};fa.create=function(a,b,c){return a&&a.isAnimationObjectGroup?new fa.Composite(a,b,c):new fa(a,b,c)};fa.parseTrackName=function(a){var b= +/^((?:\w+[\/:])*)(\w+)?(?:\.(\w+)(?:\[(.+)\])?)?\.(\w+)(?:\[(.+)\])?$/.exec(a);if(!b)throw Error("cannot parse trackName at all: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};if(null===b.propertyName||0===b.propertyName.length)throw Error("can not parse propertyName from trackName: "+a);return b};fa.findNode=function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d= +a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var g=a[c];if(g.name===b||g.uuid===b||(g=d(g.children)))return g}return null};if(c=d(a.children))return c}return null};Md.prototype={constructor:Md,isAnimationObjectGroup:!0,add:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._paths,g=this._parsedPaths,h=this._bindings,l=h.length,k=0,q=arguments.length;k!==q;++k){var m= +arguments[k],n=m.uuid,r=e[n];if(void 0===r){r=c++;e[n]=r;b.push(m);for(var n=0,t=l;n!==t;++n)h[n].push(new fa(m,f[n],g[n]))}else if(r<d){var v=b[r],z=--d,t=b[z];e[t.uuid]=r;b[r]=t;e[n]=z;b[z]=m;n=0;for(t=l;n!==t;++n){var u=h[n],w=u[r];u[r]=u[z];void 0===w&&(w=new fa(m,f[n],g[n]));u[z]=w}}else b[r]!==v&&console.error("Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes...")}this.nCachedObjects_=d},remove:function(a){for(var b=this._objects, +c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var l=arguments[g],k=l.uuid,q=d[k];if(void 0!==q&&q>=c){var m=c++,n=b[m];d[n.uuid]=q;b[q]=n;d[k]=m;b[m]=l;l=0;for(k=f;l!==k;++l){var n=e[l],r=n[q];n[q]=n[m];n[m]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,l=arguments.length;h!==l;++h){var k=arguments[h].uuid,q=e[k];if(void 0!== +q)if(delete e[k],q<d){var k=--d,m=b[k],n=--c,r=b[n];e[m.uuid]=q;b[q]=m;e[r.uuid]=k;b[k]=r;b.pop();m=0;for(r=g;m!==r;++m){var t=f[m],v=t[n];t[q]=t[k];t[k]=v;t.pop()}}else for(n=--c,r=b[n],e[r.uuid]=q,b[q]=r,b.pop(),m=0,r=g;m!==r;++m)t=f[m],t[q]=t[n],t.pop()}this.nCachedObjects_=d},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,p=Array(h.length),d=e.length;c[a]= +d;f.push(a);g.push(b);e.push(p);c=k;for(d=h.length;c!==d;++c)p[c]=new fa(h[c],a,b);return p},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}};Nd.prototype={constructor:Nd,play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused= +!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled? +a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant= +null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a, +b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot|| +this._mixer._root},_update:function(a,b,c,d){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;for(var e=this._propertyBindings,f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&& +(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===d)a:{if(-1===e&&(this.loopCount= +0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?c:0,this._mixer.dispatchEvent({type:"finished", +action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time, +f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}};Object.assign(Od.prototype,pa.prototype,{clipAction:function(a,b){var c=b||this._root,d=c.uuid,e="string"===typeof a?ta.findByName(c,a):a,c=null!==e?e.uuid:a,f=this._actionsByClip[c],g=null;if(void 0!==f){g=f.actionByRoot[d];if(void 0!==g)return g;g=f.knownActions[0];null===e&&(e=g._clip)}if(null===e)return null;e=new Nd(this, +e,b);this._bindAction(e,g);this._addInactiveAction(e,c,d);return e},existingAction:function(a,b){var c=b||this._root,d=c.uuid,c="string"===typeof a?ta.findByName(c,a):a,c=this._actionsByClip[c?c.uuid:a];return void 0!==c?c.actionByRoot[d]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*= +this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g){var h=b[g];h.enabled&&h._update(d,a,e,f)}a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex, +k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip,c;for(c in b){var d=b[c].actionByRoot[a];void 0!==d&&(this._deactivateAction(d),this._removeInactiveAction(d))}c=this._bindingsByRootAndName[a];if(void 0!==c)for(var e in c)a=c[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){var c=this.existingAction(a,b); +null!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}});Object.assign(Od.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,p=k[h];void 0===p&&(p={},k[h]=p);for(k=0;k!==e;++k){var q=d[k],m=q.name,n=p[m];if(void 0===n){n=f[k];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,h,m));continue}n=new qd(fa.create(c,m,b&&b._propertyBindings[k].binding.parsedPath), +q.ValueTypeName,q.getValueSize());++n.referenceCount;this._addInactiveBinding(n,h,m)}f[k]=n;g[k].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}}, +_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length}, +get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b= +f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;var c=a._clip.uuid,d=this._actionsByClip,e=d[c],f=e.knownActions,g=f[f.length-1],h=a._byClipCacheIndex;g._byClipCacheIndex=h;f[h]=g;f.pop();a._byClipCacheIndex=null;delete e.actionByRoot[(b._localRoot||this._root).uuid];0===f.length&&delete d[c];this._removeInactiveBindingsForAction(a)}, +_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName, +e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid,c=c.path,e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b= +this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new Hc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex= +d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1)});wb.prototype=Object.create(K.prototype);wb.prototype.constructor=wb;wb.prototype.isInstancedBufferGeometry=!0;wb.prototype.addGroup=function(a,b,c){this.groups.push({start:a,count:b,materialIndex:c})};wb.prototype.copy=function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start, +d.count,d.materialIndex)}return this};Pd.prototype={constructor:Pd,isInterleavedBufferAttribute:!0,get count(){return this.data.count},get array(){return this.data.array},setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this}, +getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+ +1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}};Wb.prototype={constructor:Wb,isInterleavedBuffer:!0,set needsUpdate(a){!0===a&&this.version++},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a, +b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)}};Xb.prototype=Object.create(Wb.prototype);Xb.prototype.constructor=Xb;Xb.prototype.isInstancedInterleavedBuffer=!0;Xb.prototype.copy=function(a){Wb.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this};Yb.prototype=Object.create(D.prototype); +Yb.prototype.constructor=Yb;Yb.prototype.isInstancedBufferAttribute=!0;Yb.prototype.copy=function(a){D.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this};Qd.prototype={constructor:Qd,linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x, +a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b){var c=[];Rd(a,this,c,b);c.sort(te);return c},intersectObjects:function(a,b){var c=[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)Rd(a[d],this,c,b);c.sort(te);return c}};Sd.prototype={constructor:Sd,start:function(){this.oldTime= +this.startTime=(performance||Date).now();this.elapsedTime=0;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=(performance||Date).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}};Td.prototype={constructor:Td,set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(k.Math.clamp(a.y/this.radius,-1,1)));return this}};la.prototype=Object.create(ua.prototype);la.prototype.constructor=la;la.prototype.createAnimation=function(a,b,c,d){b={start:b,end: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)};la.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\d+)/i,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};la.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};la.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};la.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};la.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a]; +c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};la.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};la.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};la.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};la.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};la.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time= +0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+a+"] undefined in .playAnimation()")};la.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};la.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.start+k.Math.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;f!==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);d.currentFrame!==d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1- +e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};Lc.prototype=Object.create(y.prototype);Lc.prototype.constructor=Lc;Lc.prototype.isImmediateRenderObject=!0;Mc.prototype=Object.create(ja.prototype);Mc.prototype.constructor=Mc;Mc.prototype.update=function(){var a=new q,b=new q,c=new ya;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&& +g.isGeometry)for(var h=g.vertices,k=g.faces,p=g=0,q=k.length;p<q;p++)for(var m=k[p],n=0,r=m.vertexNormals.length;n<r;n++){var t=m.vertexNormals[n];a.copy(h[m[d[n]]]).applyMatrix4(e);b.copy(t).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=g.attributes.position,h=g.attributes.normal,n=g=0,r=d.count;n<r;n++)a.set(d.getX(n),d.getY(n),d.getZ(n)).applyMatrix4(e),b.set(h.getX(n),h.getY(n),h.getZ(n)), +b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,b.z),g+=1;f.needsUpdate=!0;return this}}();Zb.prototype=Object.create(y.prototype);Zb.prototype.constructor=Zb;Zb.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};Zb.prototype.update=function(){var a=new q,b=new q;return function(){var c=this.light.distance?this.light.distance:1E3,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)}}();$b.prototype=Object.create(ja.prototype);$b.prototype.constructor=$b;$b.prototype.getBoneList=function(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,this.getBoneList(a.children[c]));return b};$b.prototype.update=function(){for(var a=this.geometry,b=(new H).getInverse(this.root.matrixWorld), +c=new H,d=0,e=0;e<this.bones.length;e++){var f=this.bones[e];f.parent&&f.parent.isBone&&(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()};ac.prototype=Object.create(ua.prototype);ac.prototype.constructor=ac;ac.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};ac.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)}; +bc.prototype=Object.create(y.prototype);bc.prototype.constructor=bc;bc.prototype.dispose=function(){this.lightSphere.geometry.dispose();this.lightSphere.material.dispose()};bc.prototype.update=function(){var a=new q;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}}();Nc.prototype=Object.create(ja.prototype);Nc.prototype.constructor=Nc;Nc.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};Oc.prototype=Object.create(ja.prototype);Oc.prototype.constructor=Oc;Oc.prototype.update=function(){var a=new q,b=new q,c=new ya;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position, +f=this.object.geometry,g=f.vertices,f=f.faces,h=0,k=0,p=f.length;k<p;k++){var q=f[k],m=q.normal;a.copy(g[q.a]).add(g[q.b]).add(g[q.c]).divideScalar(3).applyMatrix4(d);b.copy(m).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0;return this}}();cc.prototype=Object.create(y.prototype);cc.prototype.constructor=cc;cc.prototype.dispose=function(){var a=this.children[0],b=this.children[1];a.geometry.dispose();a.material.dispose(); +b.geometry.dispose();b.material.dispose()};cc.prototype.update=function(){var a=new q,b=new q,c=new q;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);var d=this.children[0],e=this.children[1];d.lookAt(c);d.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);e.lookAt(c);e.scale.z=c.length()}}();Pc.prototype=Object.create(ja.prototype);Pc.prototype.constructor=Pc;Pc.prototype.update=function(){function a(a, +g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=0,h=a.length;g<h;g++)b.vertices[a[g]].copy(d)}var b,c,d=new q,e=new qa;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1,1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1", +-1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",0,1,-1);b.verticesNeedUpdate=!0}}();Qc.prototype=Object.create(ua.prototype);Qc.prototype.constructor=Qc;Qc.prototype.update=function(){this.box.setFromObject(this.object);this.box.getSize(this.scale);this.box.getCenter(this.position)};Rc.prototype=Object.create(ja.prototype);Rc.prototype.constructor=Rc;Rc.prototype.update=function(){var a=new Ga;return function(b){b&&b.isBox3?a.copy(b):a.setFromObject(b);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position, +e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();var ue=new K;ue.addAttribute("position",new ha([0,0,0,0,1,0],3));var ve=new Ya(0,.5,1,5,1);ve.translate(0,-.5,0);xb.prototype=Object.create(y.prototype);xb.prototype.constructor=xb;xb.prototype.setDirection= +function(){var a=new q,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))}}();xb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};xb.prototype.setColor=function(a){this.line.material.color.copy(a); +this.cone.material.color.copy(a)};rd.prototype=Object.create(ja.prototype);rd.prototype.constructor=rd;k.CatmullRomCurve3=function(){function a(){}var b=new q,c=new a,d=new a,e=new a;a.prototype.init=function(a,b,c,d){this.c0=a;this.c1=c;this.c2=-3*a+3*b-2*c-d;this.c3=2*a-2*b+c+d};a.prototype.initNonuniformCatmullRom=function(a,b,c,d,e,k,m){this.init(b,c,((b-a)/e-(c-a)/(e+k)+(c-b)/k)*k,((c-b)/k-(d-b)/(k+m)+(d-c)/m)*k)};a.prototype.initCatmullRom=function(a,b,c,d,e){this.init(b,c,e*(c-a),e*(d-b))}; +a.prototype.calc=function(a){var b=a*a;return this.c0+this.c1*a+this.c2*b+this.c3*b*a};return aa.create(function(a){this.points=a||[];this.closed=!1},function(a){var g=this.points,h,k;k=g.length;2>k&&console.log("duh, you need at least 2 points");a*=k-(this.closed?0:1);h=Math.floor(a);a-=h;this.closed?h+=0<h?0:(Math.floor(Math.abs(h)/g.length)+1)*g.length:0===a&&h===k-1&&(h=k-2,a=1);var p,y,m;this.closed||0<h?p=g[(h-1)%k]:(b.subVectors(g[0],g[1]).add(g[0]),p=b);y=g[h%k];m=g[(h+1)%k];this.closed|| +h+2<k?g=g[(h+2)%k]:(b.subVectors(g[k-1],g[k-2]).add(g[k-1]),g=b);if(void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var n="chordal"===this.type?.5:.25;k=Math.pow(p.distanceToSquared(y),n);h=Math.pow(y.distanceToSquared(m),n);n=Math.pow(m.distanceToSquared(g),n);1E-4>h&&(h=1);1E-4>k&&(k=h);1E-4>n&&(n=h);c.initNonuniformCatmullRom(p.x,y.x,m.x,g.x,k,h,n);d.initNonuniformCatmullRom(p.y,y.y,m.y,g.y,k,h,n);e.initNonuniformCatmullRom(p.z,y.z,m.z,g.z,k,h,n)}else"catmullrom"===this.type&& +(k=void 0!==this.tension?this.tension:.5,c.initCatmullRom(p.x,y.x,m.x,g.x,k),d.initCatmullRom(p.y,y.y,m.y,g.y,k),e.initCatmullRom(p.z,y.z,m.z,g.z,k));return new q(c.calc(a),d.calc(a),e.calc(a))})}();we.prototype=Object.create(k.CatmullRomCurve3.prototype);var vf=aa.create(function(a){console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3");this.points=void 0===a?[]:a},function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0==c?c:c-1],e=b[c],f= +b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=k.CurveUtils.interpolate;return new q(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a),c(d.z,e.z,f.z,b.z,a))});k.CubicBezierCurve3=aa.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b=k.ShapeUtils.b3;return new q(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y),b(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z))});k.QuadraticBezierCurve3=aa.create(function(a,b,c){this.v0= +a;this.v1=b;this.v2=c},function(a){var b=k.ShapeUtils.b2;return new q(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y),b(a,this.v0.z,this.v1.z,this.v2.z))});k.LineCurve3=aa.create(function(a,b){this.v1=a;this.v2=b},function(a){if(1===a)return this.v2.clone();var b=new q;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b});sd.prototype=Object.create(Oa.prototype);sd.prototype.constructor=sd;k.SceneUtils={createMultiMaterialObject:function(a,b){for(var c= +new jc,d=0,e=b.length;d<e;d++)c.add(new ua(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 H;d.getInverse(c.matrixWorld);a.applyMatrix(d);b.remove(a);c.add(a)}};Object.assign(dc.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."); +return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Ga.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."); +return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(bb.prototype,{center:function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)}});Object.assign(ya.prototype,{multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."); +return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");return this.applyToVector3Array(a)}});Object.assign(H.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."); +return this.makeRotationFromQuaternion(a)},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");return 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)},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)},translate:function(a){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(a){console.error("THREE.Matrix4: .rotateX() has been removed.")}, +rotateY:function(a){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(a){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(a,b){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")}});Object.assign(sa.prototype,{isIntersectionLine:function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)}});Object.assign(ca.prototype,{multiplyVector3:function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."); +return a.applyQuaternion(this)}});Object.assign(Va.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}}); +Object.assign(vb.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new ra(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Xa(this,a)}});Object.assign(q.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){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,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b, +a)}});Object.assign(y.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(a){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(y.prototype, +{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(a){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}); +Object.defineProperties(ic.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Ca.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(na.prototype,{onlyShadow:{set:function(a){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."); +this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."); +this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(a){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias."); +this.shadow.bias=a}},shadowDarkness:{set:function(a){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(D.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count."); +return this.array.length}}});Object.assign(K.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."); +this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}});Object.defineProperties(K.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}}); +Object.defineProperties(T.prototype,{wrapAround:{get:function(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set:function(a){console.warn("THREE."+this.type+": .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE."+this.type+": .wrapRGB has been removed.");return new M}}});Object.defineProperties(Za.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(a){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}); +Object.defineProperties(Da.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});pa.prototype=Object.assign(Object.create({constructor:pa,apply:function(a){console.warn("THREE.EventDispatcher: .apply is deprecated, just inherit or Object.assign the prototype to mix-in."); +Object.assign(a,this)}}),pa.prototype);Object.defineProperties(se.prototype,{dynamic:{set:function(a){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");return this}}});Object.assign(xd.prototype,{supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."); +return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."); +return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return this.capabilities.vertexTextures}, +supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")}, +addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}});Object.defineProperties(xd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."); +this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");this.shadowMap.cullFace=a}}});Object.defineProperties(he.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(yb.prototype, +{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."); +return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."); +return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat}, +set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."); +this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.assign(Vb.prototype,{load:function(a){console.warn("THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.");var b=this;(new Id).load(a,function(a){b.setBuffer(a)}); +return this}});Object.assign(Ld.prototype,{getData:function(a){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()}});Object.defineProperty(k,"AudioContext",{get:function(){return k.getAudioContext()}});k.WebGLRenderTargetCube=zb;k.WebGLRenderTarget=yb;k.WebGLRenderer=xd;k.ShaderLib=Bb;k.UniformsLib=W;k.ShaderChunk=X;k.FogExp2=Db;k.Fog=Eb;k.Scene=eb;k.LensFlare=yd;k.Sprite=hc;k.LOD=ic;k.SkinnedMesh=Yc;k.Skeleton=Wc;k.Bone=Xc;k.Mesh=ua;k.LineSegments= +ja;k.Line=Na;k.Points=Fb;k.Group=jc;k.VideoTexture=Zc;k.DataTexture=gb;k.CompressedTexture=Gb;k.CubeTexture=Ra;k.CanvasTexture=$c;k.DepthTexture=kc;k.TextureIdCount=function(){return Xd++};k.Texture=da;k.MaterialIdCount=function(){return ge++};k.CompressedTextureLoader=oe;k.BinaryTextureLoader=Ad;k.DataTextureLoader=Ad;k.CubeTextureLoader=Bd;k.TextureLoader=ad;k.ObjectLoader=pe;k.MaterialLoader=od;k.BufferGeometryLoader=Cd;k.LoadingManager=zd;k.JSONLoader=Dd;k.ImageLoader=Gc;k.FontLoader=qe;k.XHRLoader= +wa;k.Loader=rb;k.AudioLoader=Id;k.SpotLightShadow=cd;k.SpotLight=dd;k.PointLight=ed;k.HemisphereLight=bd;k.DirectionalLightShadow=fd;k.DirectionalLight=gd;k.AmbientLight=hd;k.LightShadow=ob;k.Light=na;k.StereoCamera=re;k.PerspectiveCamera=Ca;k.OrthographicCamera=Cb;k.CubeCamera=pd;k.Camera=qa;k.AudioListener=Jd;k.PositionalAudio=Kd;k.getAudioContext=Gd;k.AudioAnalyser=Ld;k.Audio=Vb;k.VectorKeyframeTrack=Tb;k.StringKeyframeTrack=ld;k.QuaternionKeyframeTrack=Ic;k.NumberKeyframeTrack=Ub;k.ColorKeyframeTrack= +nd;k.BooleanKeyframeTrack=md;k.PropertyMixer=qd;k.PropertyBinding=fa;k.KeyframeTrack=qb;k.AnimationObjectGroup=Md;k.AnimationMixer=Od;k.AnimationClip=ta;k.Uniform=se;k.InstancedBufferGeometry=wb;k.BufferGeometry=K;k.GeometryIdCount=function(){return Vc++};k.Geometry=P;k.InterleavedBufferAttribute=Pd;k.InstancedInterleavedBuffer=Xb;k.InterleavedBuffer=Wb;k.InstancedBufferAttribute=Yb;k.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead."); +return(new D(a,b)).setDynamic(!0)};k.Float64Attribute=function(a,b){return new D(new Float64Array(a),b)};k.Float32Attribute=ha;k.Uint32Attribute=Uc;k.Int32Attribute=function(a,b){return new D(new Int32Array(a),b)};k.Uint16Attribute=Tc;k.Int16Attribute=function(a,b){return new D(new Int16Array(a),b)};k.Uint8ClampedAttribute=function(a,b){return new D(new Uint8ClampedArray(a),b)};k.Uint8Attribute=function(a,b){return new D(new Uint8Array(a),b)};k.Int8Attribute=function(a,b){return new D(new Int8Array(a), +b)};k.BufferAttribute=D;k.Face3=oa;k.Object3DIdCount=function(){return ie++};k.Object3D=y;k.Raycaster=Qd;k.Layers=Sc;k.EventDispatcher=pa;k.Clock=Sd;k.QuaternionLinearInterpolant=kd;k.LinearInterpolant=Hc;k.DiscreteInterpolant=jd;k.CubicInterpolant=id;k.Interpolant=ea;k.Triangle=Fa;k.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,p,y,m,n;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+2;p=this.points[c[0]];y=this.points[c[1]];m=this.points[c[2]];n=this.points[c[3]];h=g*g;k=g*h;d.x=b(p.x,y.x,m.x,n.x,g,h,k);d.y=b(p.y,y.y,m.y,n.y,g,h,k);d.z=b(p.z,y.z,m.z,n.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=0,f=new q,g=new q,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=a/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 q,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());h.push(k.copy(this.points[b]).clone())}this.points=h}};k.Spherical=Td;k.Plane=sa;k.Frustum=ec;k.Sphere=Aa;k.Ray=Va;k.Matrix4=H;k.Matrix3=ya;k.Box3=Ga;k.Box2=dc;k.Line3=bb;k.Euler=Wa;k.Vector4=ga;k.Vector3=q;k.Vector2=B;k.Quaternion=ca;k.Color=M;k.MorphBlendMesh=la;k.ImmediateRenderObject= +Lc;k.VertexNormalsHelper=Mc;k.SpotLightHelper=Zb;k.SkeletonHelper=$b;k.PointLightHelper=ac;k.HemisphereLightHelper=bc;k.GridHelper=Nc;k.FaceNormalsHelper=Oc;k.DirectionalLightHelper=cc;k.CameraHelper=Pc;k.BoundingBoxHelper=Qc;k.BoxHelper=Rc;k.ArrowHelper=xb;k.AxisHelper=rd;k.ClosedSplineCurve3=we;k.SplineCurve3=vf;k.ArcCurve=sd;k.EllipseCurve=Oa;k.SplineCurve=sb;k.CubicBezierCurve=tb;k.QuadraticBezierCurve=ub;k.LineCurve=Ja;k.Shape=vb;k.ShapePath=Ed;k.Path=Kc;k.Font=Fd;k.CurvePath=Jc;k.Curve=aa;k.WireframeGeometry= +Hb;k.ParametricGeometry=lc;k.ParametricBufferGeometry=Ib;k.TetrahedronGeometry=nc;k.TetrahedronBufferGeometry=mc;k.OctahedronGeometry=pc;k.OctahedronBufferGeometry=oc;k.IcosahedronGeometry=rc;k.IcosahedronBufferGeometry=qc;k.DodecahedronGeometry=tc;k.DodecahedronBufferGeometry=sc;k.PolyhedronGeometry=uc;k.PolyhedronBufferGeometry=ka;k.TubeGeometry=vc;k.TubeBufferGeometry=Jb;k.TorusKnotGeometry=wc;k.TorusKnotBufferGeometry=Kb;k.TorusGeometry=xc;k.TorusBufferGeometry=Lb;k.TextGeometry=yc;k.SphereBufferGeometry= +hb;k.SphereGeometry=Mb;k.RingGeometry=zc;k.RingBufferGeometry=Nb;k.PlaneBufferGeometry=db;k.PlaneGeometry=Ac;k.LatheGeometry=Bc;k.LatheBufferGeometry=Ob;k.ShapeGeometry=Xa;k.ExtrudeGeometry=ra;k.EdgesGeometry=Pb;k.ConeGeometry=Cc;k.ConeBufferGeometry=Dc;k.CylinderGeometry=ib;k.CylinderBufferGeometry=Ya;k.CircleBufferGeometry=Qb;k.CircleGeometry=Ec;k.BoxBufferGeometry=cb;k.BoxGeometry=jb;k.ShadowMaterial=Rb;k.SpriteMaterial=fb;k.RawShaderMaterial=Sb;k.ShaderMaterial=Da;k.PointsMaterial=Ia;k.MultiMaterial= +Fc;k.MeshPhysicalMaterial=kb;k.MeshStandardMaterial=va;k.MeshPhongMaterial=Za;k.MeshNormalMaterial=lb;k.MeshLambertMaterial=mb;k.MeshDepthMaterial=Ta;k.MeshBasicMaterial=Ha;k.LineDashedMaterial=nb;k.LineBasicMaterial=ma;k.Material=T;k.REVISION="82dev";k.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};k.CullFaceNone=0;k.CullFaceBack=1;k.CullFaceFront=2;k.CullFaceFrontBack=3;k.FrontFaceDirectionCW=0;k.FrontFaceDirectionCCW=1;k.BasicShadowMap=0;k.PCFShadowMap=1;k.PCFSoftShadowMap=2;k.FrontSide=0;k.BackSide=1;k.DoubleSide= +2;k.FlatShading=1;k.SmoothShading=2;k.NoColors=0;k.FaceColors=1;k.VertexColors=2;k.NoBlending=0;k.NormalBlending=1;k.AdditiveBlending=2;k.SubtractiveBlending=3;k.MultiplyBlending=4;k.CustomBlending=5;k.BlendingMode=xe;k.AddEquation=100;k.SubtractEquation=101;k.ReverseSubtractEquation=102;k.MinEquation=103;k.MaxEquation=104;k.ZeroFactor=200;k.OneFactor=201;k.SrcColorFactor=202;k.OneMinusSrcColorFactor=203;k.SrcAlphaFactor=204;k.OneMinusSrcAlphaFactor=205;k.DstAlphaFactor=206;k.OneMinusDstAlphaFactor= +207;k.DstColorFactor=208;k.OneMinusDstColorFactor=209;k.SrcAlphaSaturateFactor=210;k.NeverDepth=0;k.AlwaysDepth=1;k.LessDepth=2;k.LessEqualDepth=3;k.EqualDepth=4;k.GreaterEqualDepth=5;k.GreaterDepth=6;k.NotEqualDepth=7;k.MultiplyOperation=0;k.MixOperation=1;k.AddOperation=2;k.NoToneMapping=0;k.LinearToneMapping=1;k.ReinhardToneMapping=2;k.Uncharted2ToneMapping=3;k.CineonToneMapping=4;k.UVMapping=300;k.CubeReflectionMapping=301;k.CubeRefractionMapping=302;k.EquirectangularReflectionMapping=303;k.EquirectangularRefractionMapping= +304;k.SphericalReflectionMapping=305;k.CubeUVReflectionMapping=306;k.CubeUVRefractionMapping=307;k.TextureMapping=ye;k.RepeatWrapping=1E3;k.ClampToEdgeWrapping=1001;k.MirroredRepeatWrapping=1002;k.TextureWrapping=Ud;k.NearestFilter=1003;k.NearestMipMapNearestFilter=1004;k.NearestMipMapLinearFilter=1005;k.LinearFilter=1006;k.LinearMipMapNearestFilter=1007;k.LinearMipMapLinearFilter=1008;k.TextureFilter=Vd;k.UnsignedByteType=1009;k.ByteType=1010;k.ShortType=1011;k.UnsignedShortType=1012;k.IntType=1013; +k.UnsignedIntType=1014;k.FloatType=1015;k.HalfFloatType=1016;k.UnsignedShort4444Type=1017;k.UnsignedShort5551Type=1018;k.UnsignedShort565Type=1019;k.UnsignedInt248Type=1020;k.AlphaFormat=1021;k.RGBFormat=1022;k.RGBAFormat=1023;k.LuminanceFormat=1024;k.LuminanceAlphaFormat=1025;k.RGBEFormat=1023;k.DepthFormat=1026;k.DepthStencilFormat=1027;k.RGB_S3TC_DXT1_Format=2001;k.RGBA_S3TC_DXT1_Format=2002;k.RGBA_S3TC_DXT3_Format=2003;k.RGBA_S3TC_DXT5_Format=2004;k.RGB_PVRTC_4BPPV1_Format=2100;k.RGB_PVRTC_2BPPV1_Format= +2101;k.RGBA_PVRTC_4BPPV1_Format=2102;k.RGBA_PVRTC_2BPPV1_Format=2103;k.RGB_ETC1_Format=2151;k.LoopOnce=2200;k.LoopRepeat=2201;k.LoopPingPong=2202;k.InterpolateDiscrete=2300;k.InterpolateLinear=2301;k.InterpolateSmooth=2302;k.ZeroCurvatureEnding=2400;k.ZeroSlopeEnding=2401;k.WrapAroundEnding=2402;k.TrianglesDrawMode=0;k.TriangleStripDrawMode=1;k.TriangleFanDrawMode=2;k.LinearEncoding=3E3;k.sRGBEncoding=3001;k.GammaEncoding=3007;k.RGBEEncoding=3002;k.LogLuvEncoding=3003;k.RGBM7Encoding=3004;k.RGBM16Encoding= +3005;k.RGBDEncoding=3006;k.BasicDepthPacking=3200;k.RGBADepthPacking=3201;k.CubeGeometry=jb;k.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 oa(a,b,c,e,f,g)};k.LineStrip=0;k.LinePieces=1;k.MeshFaceMaterial=Fc;k.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Fb(a,b)};k.Particle=hc;k.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points."); +return new Fb(a,b)};k.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Ia(a)};k.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new Ia(a)};k.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Ia(a)};k.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."); +return new q(a,b,c)};k.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new ja(new Pb(a.geometry),new ma({color:void 0!==b?b:16777215}))};k.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new ja(new Hb(a.geometry),new ma({color:void 0!==b?b:16777215}))};k.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.isMesh&&(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()}};k.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new ad;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a}, +loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new Bd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},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.")}}; +k.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(a,b){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};k.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"); +this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(k,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/public/static/modelView/js/userModel.js b/public/static/modelView/js/userModel.js new file mode 100644 index 0000000..83c6d37 --- /dev/null +++ b/public/static/modelView/js/userModel.js @@ -0,0 +1,448 @@ +//Read file from input button +var model_file = document.getElementById('obj_file'); + +model_file?.addEventListener('change', function (event) { + + var file = event.target.files[0]; + loadFile(file); + +}); + +//Drag and drop files anywhere onto the viewer +document.addEventListener('dragover', function (event) { + + event.stopPropagation(); + event.preventDefault(); + event.dataTransfer.dropEffect = "copy"; + +}, false); + +document.addEventListener('drop', function (event) { + + event.stopPropagation(); //Only call loadFile function on drop event (default is to display file as plain text file). + event.preventDefault(); + + if (event.dataTransfer.files.length > 0 && event.dataTransfer.files.length < 2) { + + //Just one file selected e.g. .obj, .dae, .stl + loadFile(event.dataTransfer.files[0]); + } + + //More than 1 file (minimum two for model plus texture) + else if (event.dataTransfer.files.length > 1) { + + //Send to file manager in userModelTextures.js + var files = event.dataTransfer.files; + loadFiles(files); + } + +}, false); + + +var loadFile = function (file) { + + var filename = file.name; + var extension = filename.split('.').pop().toLowerCase(); + + var reader = new FileReader(); + + reader.addEventListener('progress', function (data) { + + if (data.lengthComputable) { //if size of file transfer is known + var percentage = Math.round((data.loaded * 100) / data.total); + console.log(percentage); + statsNode.innerHTML = 'Loaded : ' + percentage + '%' + ' of ' + filename + + '<br>' + + '<progress value="0" max="100" class="progress"></progress>'; + $('.progress').css({ 'width': percentage + '%' });////Width of progress bar set to the current percentage of model loaded (progress bar therefore increases in width as model loads) + $('.progress').val(percentage); //Set progress bar value to the current amount loaded + } + + }); + + switch (extension) { + + case 'obj': + + //When file type matches case - remove sample model or remove previously loaded model from user file + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + + reader.addEventListener( 'load', function ( event ) { + + var contents = event.target.result; + // model = loader.parse(contents); + + try { + model = loader.parse(contents); + } + catch (err) { + //Model fails to load due to parsing error + alert("Problem parsing file: " + filename + "\n\n" + "ERROR MESSAGE: " + err.message); + } + + model.traverse(function (child) { + if (child instanceof THREE.Mesh) { + + numOfMeshes++; + var geometry = child.geometry; + stats(filename, geometry, numOfMeshes); + + child.material = materials.default_material; + + var wireframe2 = new THREE.WireframeGeometry(child.geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + model.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + + setPhong(child); + setXray(child); + + } + }); + + setCamera(model); + + setSmooth(model); + + model.position.set(0, 0, 0); + + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); + scaleDown(model); + + console.log(renderer.info.memory.geometries); + + //Some models may load in with incorrect rotation on X axis + fixRotation(model); + resetRotation(model); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + + }, false ); + reader.readAsText( file ); + + break; + + case 'stl': + + reader.addEventListener('load', function (event) { + + //When file type matches case - remove sample model or remove previously loaded model from user file + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + + var contents = event.target.result; + + try { + var geometry = new THREE.STLLoader(manager).parse(contents); + console.log(geometry); + } + catch (err) { + //Model fails to load due to parsing error + alert("Problem parsing file: " + filename + "\n\n" + "ERROR MESSAGE: " + err.message); + } + + model = new THREE.Mesh(geometry, materials.default_material); + console.log(renderer.info.memory.geometries); + + model.traverse(function (child) { + + if (child instanceof THREE.Mesh) { + + numOfMeshes++; + var geometry = child.geometry; + stats(filename, geometry, numOfMeshes); + + child.material = materials.default_material; + + var wireframe2 = new THREE.WireframeGeometry(child.geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + model.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + + setPhong(child); + setXray(child); + + } + }); + + setCamera(model); + setSmooth(model); + + model.position.set(0, 0, 0); + + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); + scaleDown(model); + + fixRotation(model); + resetRotation(model); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + + }, false); + + if (reader.readAsBinaryString !== undefined) { + + reader.readAsBinaryString(file); + + } else { + + reader.readAsArrayBuffer(file); + } + + break; + + case 'dae': + + var onError = function (xhr) { + console.log('ERROR'); + }; + + reader.addEventListener('load', function (event) { + + //When file type matches case - remove sample model or remove previously loaded model from user file + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + + var contents = event.target.result; + + var loader = new THREE.ColladaLoader(manager); + + try { + var collada = loader.parse(contents); + } + catch (err) { + //Model fails to load due to parsing error + alert("Problem parsing file: " + filename + "\n\n" + "ERROR MESSAGE: " + err.message); + } + + var dae = collada.scene; + console.log(dae); + + colladaMerge(dae, filename); + + setCamera(model); + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); + scaleDown(model); + + fixRotation(model); + resetRotation(model); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + + }, false); + reader.readAsText(file); + + break; + + case 'fbx': + + reader.addEventListener('load', function (event) { + + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + fbxLoaded = true; + + var contents = event.target.result; + + var loader = new THREE.FBXLoader(manager); + try { + model = loader.parse(contents); + //console.log(fbx); + } + catch (err) { + //Model fails to load due to parsing error + alert("Problem parsing file: " + filename + "\n\n" + "ERROR MESSAGE: " + err.message); + } + + if(model.animations){ + var anims = model.animations; + addAnimation( model, anims ); + animControl( model ); + playAllAnimation(anims); + } + + model.traverse(function (child) { + + if (child.isMesh) { + + numOfMeshes++; + var geometry = child.geometry; + stats(filename, geometry, numOfMeshes); + + child.material.side = THREE.DoubleSide; + + var wireframe2 = new THREE.WireframeGeometry(geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + model.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + + var originalMaterial = child.material; + //child.material = materials.default_material3; + setPhong(child, originalMaterial); + setXray(child, originalMaterial); + } + + }); + + setCamera(model); + smooth.disabled = true; + document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)"; + + model.position.set(0, 0, 0); + + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); + scaleDown(model); + + fixRotation(model); + resetRotation(model); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + + }, false); + reader.readAsArrayBuffer(file); + + break; + + case 'glb': + case 'gltf': + + reader.addEventListener('load', function (event) { + + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + gltfLoaded = true; + + var contents = event.target.result; + var loader = new THREE.GLTFLoader(manager); + + var onError = function (err) { + alert("Problem parsing file: " + filename + "\n\n" + "ERROR MESSAGE: " + err.message); + }; + + loader.parse(contents, '', function (gltf) { + + model = gltf.scene; + console.log(model); + + var anims = gltf.animations; + addAnimation( model, anims ); + animControl( model ); + playAllAnimation(anims); + + model.traverse(function (child) { + + if (child.isMesh) { + + numOfMeshes++; + var geometry = child.geometry; + stats(filename, geometry, numOfMeshes); + + child.material.side = THREE.DoubleSide; + + var wireframe2 = new THREE.WireframeGeometry(geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + model.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + //child.material = materials.phongMaterial; + + var originalMaterial = child.material; + console.log(originalMaterial); + setPhong(child, originalMaterial); + setXray(child, originalMaterial); + } + + }); + + + setCamera(model); + smooth.disabled = true; + document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)"; + + model.position.set(0, 0, 0); + + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); + scaleDown(model); + + fixRotation(model); + resetRotation(model); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + + }, onError); + + }, false); + reader.readAsArrayBuffer(file); + + break; + + default: + + alert( 'Unsupported file format (' + extension + ').' ); + + break; + } + +}; diff --git a/public/static/modelView/js/userModelTextures.js b/public/static/modelView/js/userModelTextures.js new file mode 100644 index 0000000..09cbd6b --- /dev/null +++ b/public/static/modelView/js/userModelTextures.js @@ -0,0 +1,387 @@ +var modelAndTextures = document.getElementById('modelPlusTexture'); + +modelAndTextures?.addEventListener('change', function (event) { + + var files = event.currentTarget.files; + loadFiles(files); + +}); + +//LOAD AND ADD TO SCENE -> .OBJ, .MTL, .DAE AND ASSOCIATED IMAGE FILES +var loadFiles = function (files) { + + var obj_path, mtl_path, dae_path, gltf_path, fbx_path;; + var loadingObj = false, loadingDae = false, loadingGLTF = false, loadingFBX = false; + + var extraFiles = {}, file, imageFiles = [], image; + for (var i = 0; i < files.length; i++) { + file = files[i]; + extraFiles[file.name] = file; + + console.log("Filename: " + files[i].name); + console.log("Type: " + files[i].type); + console.log(files[i]); + console.log("Size: " + files[i].size + " bytes"); + + //Filenames that end in .obj/.OBJ or .mtl/.MTL + if (files[i].name.match(/\w*.obj\b/i)) { + + obj_path = files[i].name; + // loadingDae = false; + loadingObj = true; + + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + console.log(obj_path); + } + + if (files[i].name.match(/\w*.mtl\b/i)) { + + mtl_path = files[i].name; + console.log(mtl_path); + } + + if (files[i].name.match(/\w*.dae\b/i)) { + + dae_path = files[i].name; + // loadingObj = false; + loadingDae = true; + + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + console.log(dae_path); + } + + if (files[i].name.match(/\w*.gltf\b/i)) { + + gltf_path = files[i].name; + loadingGLTF = true; + + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + console.log(gltf_path); + } + + if (files[i].name.match(/\w*.fbx\b/i)) { + + fbx_path = files[i].name; + loadingFBX = true; + + scene.remove(sample_model); + removeModel(); + modelLoaded = true; + console.log(fbx_path); + } + + } + + manager.setURLModifier(function (url, path) { + + url = url.replace('data:application/', ''); + url = url.split(/[\/\\]/); + url = url[url.length - 1]; + + if (extraFiles[url] !== undefined) { + + const blobURL = URL.createObjectURL(extraFiles[url]); + return blobURL; + } + + return url; + }); + + if (loadingGLTF) { + + var gltf_loader = new THREE.GLTFLoader(manager); + gltf_loader.load(gltf_path, function (gltf) { + + console.log(gltf); + model = gltf.scene; + modelWithTextures = true; + console.log(model); + + //clone and animations + // var clone = AnimationUtils.clone(model); + var anims = gltf.animations; + + console.log(anims); + addAnimation( model, anims ); + animControl( model ); + playAllAnimation(anims); + + model.traverse(function (child) { + + if (child.isMesh) { + + if (child.material.length > 1) { + for (var i = 0; i < child.material.length; i++) { + + child.material[i].side = THREE.DoubleSide; + } + } else { + child.material.side = THREE.DoubleSide; + } + + console.log(child); + + console.log(child.material.map); + + numOfMeshes++; + var geometry = child.geometry; + stats(gltf_path, geometry, numOfMeshes); + + var wireframe2 = new THREE.WireframeGeometry(geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + child.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + + var originalMaterial = child.material; + setPhong(child, originalMaterial); + setXray(child, originalMaterial); + + } + + }); + + setCamera(model); + smooth.disabled = true; + document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)"; + + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); + scaleDown(model); + + fixRotation(model); + resetRotation(model); + + model.position.set(0, 0, 0); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + }); + + } + + if (loadingFBX) { + + var fbx_loader = new THREE.FBXLoader(manager); + fbx_loader.load(fbx_path, function (fbx) { + + console.log(fbx); + model = fbx; + modelWithTextures = true; + console.log(model); + + var anims = fbx.animations; + addAnimation( model, anims ); + animControl( model ); + playAllAnimation(anims); + + model.traverse(function (child) { + + if (child.isMesh) { + + if (child.material.length > 1) { + for (var i = 0; i < child.material.length; i++) { + + child.material[i].side = THREE.DoubleSide; + } + } else { + child.material.side = THREE.DoubleSide; + } + + console.log(child); + + numOfMeshes++; + var geometry = child.geometry; + stats(fbx_path, geometry, numOfMeshes); + + var wireframe2 = new THREE.WireframeGeometry(geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + child.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + + var originalMaterial = child.material; + setPhong(child, originalMaterial); + setXray(child, originalMaterial); + } + + }); + + setCamera(model); + smooth.disabled = true; + document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)"; + + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); scaleDown(model); + + fixRotation(model); + resetRotation(model); + + model.position.set(0, 0, 0); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + }); + } + + if (loadingDae) { + var collada_loader = new THREE.ColladaLoader(manager); + collada_loader.load(dae_path, function (collada) { + + model = collada.scene; + modelWithTextures = true; + + var anims = collada.animations + addAnimation( model, anims ); + animControl( model ); + playAllAnimation(anims); + + console.log(model); + + model.traverse(function (child) { + + if (child.isMesh) { + + if (child.material.length > 1) { + for (var i = 0; i < child.material.length; i++) { + + child.material[i].side = THREE.DoubleSide; + //child.material[i].skinning = false; + } + } + else { + child.material.side = THREE.DoubleSide; + // child.material.skinning = false; + } + + + numOfMeshes++; + var geometry = child.geometry; + stats(dae_path, geometry, numOfMeshes); + + var wireframe2 = new THREE.WireframeGeometry(child.geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + + model.rotation.set(0, 0, 0); + + + setWireFrame(child); + setWireframeAndModel(child); + + var originalMaterial = child.material; + setXray(child, originalMaterial); + setPhong(child, originalMaterial); + + setBoundBox(child); + setGrid(child); + setPolarGrid(child); + setAxis(child); + + smooth.disabled = true; + document.getElementById('smooth-model').innerHTML = "Smooth Model (Disabled)"; + } + + }); + + model.position.set(0, 0, 0); + + setCamera(model); + scaleUp(model); scaleDown(model); + + fixRotation(model); + resetRotation(model); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + }); + } + + if (loadingObj) { + var mtlloader = new THREE.MTLLoader(manager); + mtlloader.load(mtl_path, function (materials_load) { + var loader = new THREE.OBJLoader(manager); + loader.setMaterials(materials_load); + loader.load(obj_path, function (obj) { + + model = obj; + modelWithTextures = true; + + model.traverse(function (child) { + if (child instanceof THREE.Mesh) { + + if (child.material) { + child.material.side = THREE.DoubleSide; + } + + numOfMeshes++; + var geometry = child.geometry; + stats(obj_path, geometry, numOfMeshes); + + var wireframe2 = new THREE.WireframeGeometry(child.geometry); + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + model.add(edges); + + setWireFrame(child); + setWireframeAndModel(child); + + var originalMaterial = child.material; + setXray(child, originalMaterial); + setPhong(child, originalMaterial); + + } + }); + + setCamera(model); + setSmooth(model); + + model.position.set(0, 0, 0); + + setBoundBox(model); + setPolarGrid(model); + setGrid(model); + setAxis(model); + + scaleUp(model); + scaleDown(model); + + fixRotation(model); + resetRotation(model); + + selectedObject = model; + outlinePass.selectedObjects = [selectedObject]; + outlinePass.enabled = false; + + scene.add(model); + }); + }); + } +}; diff --git a/public/static/modelView/js/utils.js b/public/static/modelView/js/utils.js new file mode 100644 index 0000000..a24b54c --- /dev/null +++ b/public/static/modelView/js/utils.js @@ -0,0 +1,579 @@ +function stats(modelName, geometry, numOfMeshes) { + + if (geometry !== undefined) { + statsNode.innerHTML = 'Name of model/file: ' + '<span class="statsText">' + modelName + '</span>' + + '<br>' + + 'Number of vertices: ' + '<span class="statsText">' + geometry.attributes.position.count + '</span>' + + '<br>' + + 'Number of faces: ' + '<span class="statsText">' + geometry.attributes.position.count / 3 + '</span>' + + '<br>' + + 'Number of Meshes: ' + '<span class="statsText">' + numOfMeshes + '</span>'; + } + +} + +function colladaMerge(dae, filename) { + + dae.traverse(function (child) { + + if (child instanceof THREE.Mesh) { + + numOfMeshes++; + var geometry = child.geometry; + stats(filename, geometry, numOfMeshes); + + // console.log(child.geometry); // BufferGeometry + + //child.geometry = new THREE.BufferGeometry().fromGeometry(child.geometry); + var wireframe2; + var collada_geometry = new THREE.Geometry(); + + if (dae.children.length > 1) { + for (var i = 0; i < dae.children.length; i++) { + var col_child = dae.children[i]; + + //console.log(dae.children.length); + + if (col_child instanceof THREE.Mesh) { + + //When there is more than one child BufferGeometry, create a new geometry + //and merge it with the main new geometry (defined above as collada_geometry) + var geom = new THREE.Geometry().fromBufferGeometry(col_child.geometry); + + collada_geometry.merge(geom); + console.log(collada_geometry); + + var buffer_collada_geometry = new THREE.BufferGeometry().fromGeometry(collada_geometry); + console.log(buffer_collada_geometry); + } + } + + model = new THREE.Mesh(buffer_collada_geometry, materials.default_material); + wireframe2 = new THREE.WireframeGeometry(buffer_collada_geometry); + console.log("More than one Geometry"); + + setSmooth(model); + } + else { + // var single_geom = new THREE.Geometry().fromBufferGeometry(child.geometry); + + model = new THREE.Mesh(child.geometry, materials.default_material); + wireframe2 = new THREE.WireframeGeometry(child.geometry); + console.log("One Geometry"); + + setSmooth(model); + } + + child.material = materials.default_material; + + var edges = new THREE.LineSegments(wireframe2, materials.wireframeAndModel); + materials.wireframeAndModel.visible = false; + model.add(edges); + + setWireFrame(model); + setWireframeAndModel(model); + setPhong(model); + setXray(model); + } + + }); +} + +function setCamera(mod) { + var bbox = new THREE.Box3().setFromObject(mod); + + /*MODELS OF DIFFERENT SIZES TO FIT IN CAMERA VIEW*/ + var height = bbox.getSize().y; + var dist = height / (2 * Math.tan(camera.fov * Math.PI / 360)); + var pos = scene.position; + camera.position.set(pos.x, pos.y, dist * 3.50); + camera.lookAt(pos); +} + +$('#glow_check').on('change', function () { + + if (glow.checked) { + $('input.check').not(this).prop('checked', false); + outlinePass.enabled = true; + } + else { + outlinePass.enabled = false; + } + +}); + +function setWireFrame(mod) { + + if (modelWithTextures || fbxLoaded || gltfLoaded) { + + $('#wire_check').on('change', function () { + + $('input.check').not(this).prop('checked', false); + + if (wire.checked) { + + materials.wireframeAndModel.visible = false; + if (mod.material.length > 1) { + for (var i = 0; i < mod.material.length; i++) { + + mod.material[i].wireframe = true; + } + } + else { + mod.material.wireframe = true; + } + + } + else { + if (mod.material.length > 1) { + for (var i = 0; i < mod.material.length; i++) { + + mod.material[i].wireframe = false; + } + } + else { + mod.material.wireframe = false; + } + } + }); + + } + else { + + $('#wire_check').on('change', function () { + + $('input.check').not(this).prop('checked', false); + + if (wire.checked) { + materials.wireframeAndModel.visible = false; + mod.material = materials.wireframeMaterial; + } + else { + mod.material = materials.default_material; + } + }); + } +} + +function setWireframeAndModel(mod) { + + $('#model_wire').on('change', function () { + + $('input.check').not(this).prop('checked', false); + + if (modelWithTextures || fbxLoaded || gltfLoaded) { + if (mod.material.length > 1) { + for (var i = 0; i < mod.material.length; i++) { + + mod.material[i].wireframe = false; + } + } + else { + mod.material.wireframe = false; + } + + if (model_wire.checked) { + materials.wireframeAndModel.visible = true; + } + else { + materials.wireframeAndModel.visible = false; + } + } + //model without textures + else { + mod.material = materials.default_material; + + if (model_wire.checked) { + materials.wireframeAndModel.visible = true; + } + else { + materials.wireframeAndModel.visible = false; + mod.material = materials.default_material; + } + } + + }); + +} + +function setSmooth(mod) { + + var smooth_geom; + + mod.traverse(function (child) { + + if (child instanceof THREE.Mesh) { + + $('#smooth').change(function () { + + if (child.geometry.isGeometry) { + //Merged collada geometry + smooth_geom = child.geometry; + } + else { + smooth_geom = new THREE.Geometry().fromBufferGeometry(child.geometry); + } + + if (smooth.checked) { + document.getElementById('smooth-model').innerHTML = "骞虫暣妯″瀷"; //Flatten Model + + smooth_geom.mergeVertices(); + smooth_geom.computeVertexNormals(); + smooth_geom.computeFaceNormals(); + child.geometry = new THREE.BufferGeometry().fromGeometry(smooth_geom); + //console.log(child.geometry); + } + else { + document.getElementById('smooth-model').innerHTML = "鍏夋粦妯″瀷"; // Smooth Model + + smooth_geom.computeFlatVertexNormals(); + child.geometry = new THREE.BufferGeometry().fromGeometry(smooth_geom); + } + }); + + } + + }); + +} + +function setPhong(mod, originalMat) { + + $('#phong_check').on('change', function () { + + if (modelWithTextures || fbxLoaded || gltfLoaded) { + phong.checked ? mod.material = materials.phongMaterial : mod.material = originalMat; + } + else{ + phong.checked ? mod.material = materials.phongMaterial : mod.material = materials.default_material; + } + }); + +} + +function setXray(mod, originalMat) { + + $('#xray_check').on('change', function () { + + if (modelWithTextures || fbxLoaded || gltfLoaded) { + xray.checked ? mod.material = materials.xrayMaterial : mod.material = originalMat; + } + else{ + xray.checked ? mod.material = materials.xrayMaterial : mod.material = materials.default_material; + } + }); +} + +var bound_box; +function setBoundBox(mod) { + /*bound_box = new THREE.BoxHelper(mod); //, 0xffffff + bound_box.visible = false; + mod.add(bound_box); //Add bounding box helper to model (for when checkbox is checked)*/ + + var box = new THREE.Box3().setFromObject(mod); + bound_box = new THREE.Box3Helper(box); + bound_box.visible = false; + mod.add(bound_box); +} + +$('#bBox').change(function () { + if (bBox.checked) { + bound_box.visible = true; + } + else { + bound_box.visible = false; + } +}); + +function setPolarGrid(mod) { + + var bbox = new THREE.Box3().setFromObject(mod); + console.log(bbox.min.y); + + /*POLAR GRID HELPER*/ + var radius = 10; + var radials = 16; + var circles = 8; + var divisions = 64; + + polar_grid_helper = new THREE.PolarGridHelper(bbox.max.x * 4, radials, circles, divisions); + polar_grid_helper.position.y = bbox.min.y; + polar_grid_helper.visible = false; + mod.add(polar_grid_helper); +} + +var polar_grid_helper; +$('#polar_grid').change(function () { + if (polar_grid.checked) { + polar_grid_helper.visible = true; + } + else { + polar_grid_helper.visible = false; + } +}); + + +function setGrid(mod) { + + var bbox2 = new THREE.Box3().setFromObject(mod); + + /*NORMAL GRID HELPER*/ + gridHelper = new THREE.GridHelper(bbox2.max.x * 4, 40, 0xe6e600, 0x808080); + //Set size of grid to cover objects of all sizes based on the non visible box3() size. + gridHelper.position.y = bbox2.min.y; //Set grid underneath loaded model object + gridHelper.visible = false; //Grid visibility initially false, until grid checkbox is selected + mod.add(gridHelper); +} + +var gridHelper; +$('#grid').change(function () { + if (grid.checked) { + gridHelper.visible = true; + } + else { + gridHelper.visible = false; + } +}); + +var axis_view; +function setAxis(mod) { + + var bbox3 = new THREE.Box3().setFromObject(mod); + + /*AXIS HELPER*/ + axis_view = new THREE.AxesHelper(bbox3.max.z * 10); //Set axis size based on the non visible box3() size. + axis_view.position.y = bbox3.min.y; //Set axis underneath loaded model object + axis_view.visible = false; //axis visibility initially false, until axis checkbox is selected + mod.add(axis_view); +} + +$('#axis').change(function () { + if (axis.checked) { + axis_view.visible = true; + } + else { + axis_view.visible = false; + } +}); + +//jQuery slider for phong shininess level +$("#shine").slider({ + orientation: "horizontal", + min: 10, + max: 500, + value: 10, + slide: function (event, ui) { + materials.phongMaterial.shininess = ui.value; //Set shininess parameter to the current selected value of slider + }, + change: function (event, ui) { + console.log(ui.value); + materials.phongMaterial.shininess = ui.value; //Set shininess of phong material to value from the slider + } +}); + +//Strength of glow outine +$("#edgeStrength").slider({ + orientation: "horizontal", + min: 1, + max: 10, + value: 1, + slide: function (event, ui) { + outlinePass.edgeStrength = ui.value; + }, + change: function (event, ui) { + outlinePass.edgeStrength = ui.value; + } +}); + +//PointLight intensity slider +$("#point_light").slider({ + orientation: "horizontal", + min: 0, + max: 1, + step: 0.1, + value: 0.5, + slide: function (event, ui) { + pointLight.intensity = ui.value; + }, + change: function (event, ui) { + pointLight.intensity = ui.value; + } +}); + +//Set colour of glow model to value from colour +$(".glow_select").spectrum({ + color: "#fff", + change: function (color) { + $("#basic-log").text("Hex Colour Selected: " + color.toHexString()); //Log information + glow_value = $(".glow_select").spectrum('get').toHexString(); //Get the colour selected + //Set outlinePass effect edge colour to selected value + outlinePass.visibleEdgeColor.set(glow_value); + } +}); + +/*SCALE FUNCTIONS*/ +var loopScale = 0; +scale = 1; + +function scaleUp(mod) { + + // User clicks scale button once at a time, scale applied once + $('#scale_up').click(function (e) { + if (modelLoaded || sample_model_loaded) { + + if (mod.scale.z < 25) { + + scale += (scale * 0.45); + mod.scale.x = mod.scale.y = mod.scale.z = scale; + } + } + }); +} + +function scaleDown(mod) { + + //User clicks scale button once at a time, scale applied once + $('#scale_down').click(function (e) { + if (modelLoaded || sample_model_loaded) { + + scale -= (scale * 0.35); + mod.scale.x = mod.scale.y = mod.scale.z = scale; + } + }); +} + +function fixRotation(mod) { + + $("input:radio[name=rotate]").click(function () { + var rotAxis = $("input:radio[name=rotate]:checked").val(); + + switch (rotAxis) { + + case 'rotateX': + mod.rotation.x = -Math.PI / 2; + polar_grid_helper.rotation.x = Math.PI / 2; + gridHelper.rotation.x = Math.PI / 2; + axis_view.rotation.x = Math.PI / 2; + break; + + case 'rotateY': + mod.rotation.y = -Math.PI / 2; + polar_grid_helper.rotation.y = Math.PI / 2; + gridHelper.rotation.y = Math.PI / 2; + axis_view.rotation.y = Math.PI / 2; + break; + + case 'rotateZ': + mod.rotation.z = -Math.PI / 2; + polar_grid_helper.rotation.z = Math.PI / 2; + gridHelper.rotation.z = Math.PI / 2; + axis_view.rotation.z = Math.PI / 2; + break; + } + + }); +} + +function resetRotation(mod) { + $("#reset_rot").click(function () { + mod.rotation.set(0, 0, 0); + polar_grid_helper.rotation.set(0, 0, 0); + gridHelper.rotation.set(0, 0, 0); + axis_view.rotation.set(0, 0, 0); + $('input[name="rotate"]').prop('checked', false); + }); +} + +/*Animation Controls */ +//credit: https://raw.githubusercontent.com/mrdoob/three.js/dev/editor/js/Sidebar.Animation.js + +function addAnimation( object, model_animations ) { + + animations[ object.uuid ] = model_animations; + + if(model_animations.length > 0 ){ + animsDiv.style.display = "block"; + } + else{ + animsDiv.style.display = "none"; + } +} + +function animControl( object ) { + + var uuid = object !== null ? object.uuid : ''; + var anims = animations[ uuid ]; + + if ( anims !== undefined ) { + + mixer = new THREE.AnimationMixer( object ); + var options = {}; + for ( var animation of anims ) { + + options[ animation.name ] = animation.name; + + var action = mixer.clipAction( animation ); + actions[ animation.name ] = action; + } + + setOptions( options ); + } +} + +function playAnimation() { + + currentAnimation = actions[ animationsSelect.value ]; + if ( currentAnimation !== undefined ) { + + stopAnimations(); + currentAnimation.play(); + // updateAnimation(); + + } +} + +function playAllAnimation(anims) { + + if(anims !== undefined){ + + document.getElementById("playAll").onclick = function(){ + anims.forEach(function (clip) { + mixer.clipAction(clip).reset().play(); + }); + } + } +} + +function stopAnimations() { + + if ( mixer !== undefined ) { + + mixer.stopAllAction(); + + } +} + + function setOptions( options ) { + + var selected = animationsSelect.value; + + while ( animationsSelect.children.length > 0 ) { + + animationsSelect.removeChild( animationsSelect.firstChild ); + + } + + for ( var key in options ) { + + var option = document.createElement( 'option' ); + option.value = key; + option.innerHTML = options[ key ]; + animationsSelect.appendChild( option ); + + } + + animationsSelect.value = selected; +} + +document.getElementById("play").onclick = playAnimation; +document.getElementById("stop").onclick = stopAnimations; diff --git a/src/App.vue b/src/App.vue index 90366c4..27106df 100644 --- a/src/App.vue +++ b/src/App.vue @@ -71,7 +71,7 @@ process.env.VUE_APP_RESOURCE_CTX + (process.env.VUE_APP_ENV == "product" ? process.env.VUE_APP_BOOK_ID - : "mathBook") + : "artAndDrama") ); // this.activeBook = await this.config.getBookConfig( diff --git a/src/books/artAndDrama/assets/main.less b/src/books/artAndDrama/assets/main.less index ece392e..343b587 100644 --- a/src/books/artAndDrama/assets/main.less +++ b/src/books/artAndDrama/assets/main.less @@ -14,10 +14,19 @@ text-emphasis-position: under; } - // audio{ - // width: 300px; - // height: 54px; - // } + .w90{ + width: 90%; + } + + .ma-l-40{ + margin-left: 40px; + max-width: 490px; + } + + audio{ + width: 300px; + height: 54px; + } .rhombusFather { position: relative; @@ -682,6 +691,8 @@ .headerimg { margin-left: 5%; + width: 90%; + height: auto; } .page-footer { @@ -818,6 +829,31 @@ .page-box { min-height: 500px; } + + audio{ + width: 250px; + } + + .img-gn1 { + height: 2em; + } + + h3.lefth3 { + text-align: left; + margin-top: 0.2em; + margin-bottom: 1.2em; + text-indent: 0em; + } + .ma-l-40{ + margin-left: 15px; + // max-width: 100px; + } + .rhombusFather { + text-indent: 0em; + } + .folder { + margin-right: 4%; + } } } diff --git a/src/books/artAndDrama/view/components/chapter001.vue b/src/books/artAndDrama/view/components/chapter001.vue index 391ad8d..b3b1c75 100644 --- a/src/books/artAndDrama/view/components/chapter001.vue +++ b/src/books/artAndDrama/view/components/chapter001.vue @@ -202,13 +202,13 @@ </p> <p class="text t-l">姝d箟闃熼暱锛� <textarea v-model="questionData.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" @change="setBookQuestion" + class="w90 ma-l-40" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'one' }" @focus="handleFocus('one')" @blur="handleBlur('one')"></textarea> </p> <p class="text t-l">榛戞殫闃熼暱锛� <textarea v-model="questionData.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" @change="setBookQuestion" + class="w90 ma-l-40" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'two' }" @focus="handleFocus('two')" @blur="handleBlur('two')"></textarea> </p> diff --git a/src/books/artAndDrama/view/components/chapter002.vue b/src/books/artAndDrama/view/components/chapter002.vue index fd20564..694ab50 100644 --- a/src/books/artAndDrama/view/components/chapter002.vue +++ b/src/books/artAndDrama/view/components/chapter002.vue @@ -115,12 +115,12 @@ <p class="text">甯歌█閬擄細鑹█涓�鍙ヤ笁鍐殩锛屾伓璇激浜哄叚鏈堝瘨銆傝瑷�鍦ㄤ汉涓庝汉鐨勪氦寰�涓捣鐫�閲嶈鐨勪綔鐢紝鏈夌潃鏃犵┓鐨勫姏閲忋��</p> <p class="text t-l rhombusFather" ><span class="hs1 rhombus">鈼�</span>濡傛灉鏈嬪弸蹇冩儏涓嶅ソ锛屼綘璇ユ�庝箞瀹夋叞浠�/濂瑰憿锛� <textarea v-model="questionData.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'one' }" @focus="handleFocus('one')" @blur="handleBlur('one')" ></textarea> + class="w90 ma-l-40" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'one' }" @focus="handleFocus('one')" @blur="handleBlur('one')" ></textarea> </p> <p class="text t-l rhombusFather"><span class="hs1 rhombus">鈼�</span>濡傛灉浣犻個璇峰ソ鏈嬪弸鏉ュ閲屽仛瀹紝浣犺璇翠粈涔堟潵娆㈣繋浠�/濂瑰憿锛� <textarea v-model="questionData.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'two' }" @focus="handleFocus('two')" @blur="handleBlur('two')" ></textarea> + class="w90 ma-l-40" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'two' }" @focus="handleFocus('two')" @blur="handleBlur('two')" ></textarea> </p> <h3 class="lefth3" id="c016" style="margin-top: 7%;"><img class="img-gn1" alt="" diff --git a/src/books/artAndDrama/view/components/chapter003.vue b/src/books/artAndDrama/view/components/chapter003.vue index 7b813aa..003fbf2 100644 --- a/src/books/artAndDrama/view/components/chapter003.vue +++ b/src/books/artAndDrama/view/components/chapter003.vue @@ -125,7 +125,7 @@ <p class="text t-l rhombusFather"> <span class="hs1 rhombus">鈼�</span>鍦ㄣ�婁竴鍧楀ザ閰�嬬殑鏁呬簨涓紝铓傝殎闃熼暱涔熻捣杩囪椽蹇冿紝浣嗕粬鏈�缁堟垚鍔熷厠鏈嶄簡璐績锛屼綘璁や负浠栨槸鎬庝箞鍋氬埌鐨勫憿锛� <textarea v-model="questionData.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="fz-16 fm-son" @change="setBookQuestion" + class="w90 ma-l-40 fz-16 fm-son" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'one' }" @focus="handleFocus('one')" @blur="handleBlur('one')"> </textarea> @@ -187,7 +187,7 @@ <p class="text2 t-l"> 璧峰洜锛� <textarea v-model="questionData.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="fz-16 fm-son" @change="setBookQuestion" + class="w90 ma-l-40 fz-16 fm-son" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'two' }" @focus="handleFocus('two')" @blur="handleBlur('two')"> </textarea> @@ -195,7 +195,7 @@ <p class="text2 t-l"> 缁忚繃锛� <textarea v-model="questionData.reading.three" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="fz-16 fm-son" @change="setBookQuestion" + class="w90 ma-l-40 fz-16 fm-son" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'three' }" @focus="handleFocus('three')" @blur="handleBlur('three')"> </textarea> @@ -203,7 +203,7 @@ <p class="text2 t-l"> 缁撴灉锛� <textarea v-model="questionData.reading.four" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="fz-16 fm-son" @change="setBookQuestion" + class="w90 ma-l-40 fz-16 fm-son" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'four' }" @focus="handleFocus('four')" @blur="handleBlur('four')"> </textarea> @@ -211,7 +211,7 @@ <p class="text t-l rhombusFather" style="margin-top: 7%"> <span class="hs1 rhombus">鈼�</span>浣犳湁鐑︽伡鍚楋紵璇翠竴璇存槸浠�涔堬紝浣犳槸鎬庝箞澶勭悊瀹冪殑锛� <textarea v-model="questionData.reading.five" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="fz-16 fm-son" @change="setBookQuestion" + class="w90 ma-l-40 fz-16 fm-son" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'five' }" @focus="handleFocus('five')" @blur="handleBlur('five')"> </textarea> diff --git a/src/books/artAndDrama/view/components/chapter004.vue b/src/books/artAndDrama/view/components/chapter004.vue index dde03c4..6b45bc8 100644 --- a/src/books/artAndDrama/view/components/chapter004.vue +++ b/src/books/artAndDrama/view/components/chapter004.vue @@ -36,7 +36,7 @@ <p class="text rhombusFather"><span class="hs1 rhombus">鈼�</span>浠ュ皬缁勪负鍗曚綅鍥存垚涓�鍦堬紝闈㈡湞鍦堝韫蹭笅锛岀浉閭讳袱浜轰簰鎸庢墜鑷傦紝缁勫憳鍚屾椂绔欒捣鏉ワ紝鐪嬬湅鍝釜缁勬渶蹇紒</p> <p class="text t-l rhombusFather"><span class="hs1 rhombus">鈼�</span>璇翠竴璇达細蹇�熺珯璧锋潵鐨勭璇�鏄粈涔堬紵 <textarea v-model="questionData.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" - style="margin-left: 40px; width: 92%" class="fz-16 fm-son" @change="setBookQuestion" + class="w90 ma-l-40 fz-16 fm-son" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused === 'one' }" @focus="handleFocus('one')" @blur="handleBlur('one')"> </textarea> diff --git a/src/books/civilAviation/assets/images/0071-01.jpg b/src/books/civilAviation/assets/images/0071-01.jpg new file mode 100644 index 0000000..4dc6cbb --- /dev/null +++ b/src/books/civilAviation/assets/images/0071-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0071-02.jpg b/src/books/civilAviation/assets/images/0071-02.jpg new file mode 100644 index 0000000..2a61e93 --- /dev/null +++ b/src/books/civilAviation/assets/images/0071-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0071-03.jpg b/src/books/civilAviation/assets/images/0071-03.jpg new file mode 100644 index 0000000..0e589e9 --- /dev/null +++ b/src/books/civilAviation/assets/images/0071-03.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0071-04.jpg b/src/books/civilAviation/assets/images/0071-04.jpg new file mode 100644 index 0000000..ad26b68 --- /dev/null +++ b/src/books/civilAviation/assets/images/0071-04.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0071-05.jpg b/src/books/civilAviation/assets/images/0071-05.jpg new file mode 100644 index 0000000..120f2c8 --- /dev/null +++ b/src/books/civilAviation/assets/images/0071-05.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0075-01.jpg b/src/books/civilAviation/assets/images/0075-01.jpg new file mode 100644 index 0000000..29bee58 --- /dev/null +++ b/src/books/civilAviation/assets/images/0075-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0075-02.jpg b/src/books/civilAviation/assets/images/0075-02.jpg new file mode 100644 index 0000000..94d5bb4 --- /dev/null +++ b/src/books/civilAviation/assets/images/0075-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0078-01.jpg b/src/books/civilAviation/assets/images/0078-01.jpg new file mode 100644 index 0000000..2be410d --- /dev/null +++ b/src/books/civilAviation/assets/images/0078-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0078-02.jpg b/src/books/civilAviation/assets/images/0078-02.jpg new file mode 100644 index 0000000..9a9da0a --- /dev/null +++ b/src/books/civilAviation/assets/images/0078-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0078-03.jpg b/src/books/civilAviation/assets/images/0078-03.jpg new file mode 100644 index 0000000..b8b2054 --- /dev/null +++ b/src/books/civilAviation/assets/images/0078-03.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0080-01.jpg b/src/books/civilAviation/assets/images/0080-01.jpg new file mode 100644 index 0000000..b1e9755 --- /dev/null +++ b/src/books/civilAviation/assets/images/0080-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0080-02.jpg b/src/books/civilAviation/assets/images/0080-02.jpg new file mode 100644 index 0000000..0b97e97 --- /dev/null +++ b/src/books/civilAviation/assets/images/0080-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0092-01.jpg b/src/books/civilAviation/assets/images/0092-01.jpg new file mode 100644 index 0000000..ad42c7d --- /dev/null +++ b/src/books/civilAviation/assets/images/0092-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0092-02.jpg b/src/books/civilAviation/assets/images/0092-02.jpg new file mode 100644 index 0000000..d061988 --- /dev/null +++ b/src/books/civilAviation/assets/images/0092-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0092-03.jpg b/src/books/civilAviation/assets/images/0092-03.jpg new file mode 100644 index 0000000..af22d10 --- /dev/null +++ b/src/books/civilAviation/assets/images/0092-03.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0099-01.jpg b/src/books/civilAviation/assets/images/0099-01.jpg new file mode 100644 index 0000000..cf4aa4b --- /dev/null +++ b/src/books/civilAviation/assets/images/0099-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0099-02.jpg b/src/books/civilAviation/assets/images/0099-02.jpg new file mode 100644 index 0000000..66b0651 --- /dev/null +++ b/src/books/civilAviation/assets/images/0099-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0111-01.jpg b/src/books/civilAviation/assets/images/0111-01.jpg new file mode 100644 index 0000000..37d3c29 --- /dev/null +++ b/src/books/civilAviation/assets/images/0111-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0111-02.jpg b/src/books/civilAviation/assets/images/0111-02.jpg new file mode 100644 index 0000000..556c474 --- /dev/null +++ b/src/books/civilAviation/assets/images/0111-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0118-01.jpg b/src/books/civilAviation/assets/images/0118-01.jpg new file mode 100644 index 0000000..7144b10 --- /dev/null +++ b/src/books/civilAviation/assets/images/0118-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0118-02.jpg b/src/books/civilAviation/assets/images/0118-02.jpg new file mode 100644 index 0000000..9218e9d --- /dev/null +++ b/src/books/civilAviation/assets/images/0118-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0120-01.jpg b/src/books/civilAviation/assets/images/0120-01.jpg new file mode 100644 index 0000000..32f0d64 --- /dev/null +++ b/src/books/civilAviation/assets/images/0120-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0120-02.jpg b/src/books/civilAviation/assets/images/0120-02.jpg new file mode 100644 index 0000000..371810b --- /dev/null +++ b/src/books/civilAviation/assets/images/0120-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0123-01.jpg b/src/books/civilAviation/assets/images/0123-01.jpg new file mode 100644 index 0000000..784d7fa --- /dev/null +++ b/src/books/civilAviation/assets/images/0123-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0123-02.jpg b/src/books/civilAviation/assets/images/0123-02.jpg new file mode 100644 index 0000000..49be049 --- /dev/null +++ b/src/books/civilAviation/assets/images/0123-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0194-01.jpg b/src/books/civilAviation/assets/images/0194-01.jpg new file mode 100644 index 0000000..f0e977c --- /dev/null +++ b/src/books/civilAviation/assets/images/0194-01.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0194-02.jpg b/src/books/civilAviation/assets/images/0194-02.jpg new file mode 100644 index 0000000..80981fa --- /dev/null +++ b/src/books/civilAviation/assets/images/0194-02.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0194-03.jpg b/src/books/civilAviation/assets/images/0194-03.jpg new file mode 100644 index 0000000..3473a15 --- /dev/null +++ b/src/books/civilAviation/assets/images/0194-03.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/0194-04.jpg b/src/books/civilAviation/assets/images/0194-04.jpg new file mode 100644 index 0000000..16d9b91 --- /dev/null +++ b/src/books/civilAviation/assets/images/0194-04.jpg Binary files differ diff --git a/src/books/civilAviation/assets/images/fengdi.png b/src/books/civilAviation/assets/images/fengdi.png new file mode 100644 index 0000000..71a99a7 --- /dev/null +++ b/src/books/civilAviation/assets/images/fengdi.png Binary files differ diff --git a/src/books/civilAviation/assets/main.less b/src/books/civilAviation/assets/main.less index 24c3c09..9a2fb69 100644 --- a/src/books/civilAviation/assets/main.less +++ b/src/books/civilAviation/assets/main.less @@ -11,11 +11,11 @@ background-color: #fff; } - .c-g{ + .c-g { color: green; } - .c-r{ + .c-r { color: red; } @@ -32,7 +32,11 @@ } .mt-30 { - margin-top: 30px ; + margin-top: 30px; + } + + .mb-30{ + margin-bottom: 30px; } .mb-10 { @@ -41,14 +45,35 @@ .pd-5 { padding: 0 5px; - } + } .w100 { width: 100%; } + .w90 { + width: 90%; + } + + .w80 { width: 80%; + } + + hr{ + margin-left: 0; + margin-bottom: 4px; + width: 15.5%; + border: none; + height: 2px; + background-color: #000; + } + + sup{ + vertical-align: super; /* 淇濇寔涓婃爣瀵归綈鏂瑰紡 */ + font-size: smaller; + // position: relative; /* 鐩稿浜庢甯镐綅缃皟鏁� */ + // top: -0.2em; /* 鏍规嵁闇�瑕佽皟鏁磋繖涓�� */ } .fz-13 { @@ -72,16 +97,12 @@ width: 100%; } - .img-c { - width: 70%; - } - .pt-20 { padding-top: 20px; } .td-0 { - text-indent: 0em; + text-indent: 0em !important; } .fl { @@ -108,6 +129,10 @@ align-items: center; } + .al-fe { + align-items: flex-end; + } + .ac-f { align-content: flex-end; } @@ -120,7 +145,7 @@ justify-content: center; } - .jc-sa{ + .jc-sa { justify-content: space-around } @@ -128,8 +153,16 @@ margin-right: 70px; } + .mr-45{ + margin-right: 45px; + } + .mr-10 { margin-right: 10px; + } + + .ma-l { + margin-left: 10%; } .pad-t-55 { @@ -180,12 +213,42 @@ } .task { - width: 12%; - margin-bottom: 5em; + width: 16%; + margin-bottom: 3.5em; margin-top: 0; border-top: 0.7em solid #5192C6; } + .task-u2-c { + width: 16%; + margin-bottom: 3.5em; + margin-top: 0; + border-top: 0.7em solid #F89C1C; + } + + .task-u3-c { + width: 16%; + margin-bottom: 3.5em; + margin-top: 0; + border-top: 0.7em solid #0A9CAC; + } + + .task-u4-c { + width: 16%; + margin-bottom: 3.5em; + margin-top: 0; + border-top: 0.7em solid #92B03D; + } + + .task-u5-c { + width: 16%; + margin-bottom: 3.5em; + margin-top: 0; + border-top: 0.7em solid #0180CD; + } + + + .p-odd { padding-right: 10%; } @@ -193,6 +256,24 @@ .p-even { padding-left: 10%; } + + .img-float-smaller { + width: 200px; + float: left; + height: auto; + margin: auto; + margin-right: 20px; + } + + .img-float-medium { + width: 250px; + float: left; + height: auto; + margin: auto; + margin-right: 20px; + } + + .img-float { width: 310px; @@ -204,6 +285,19 @@ img { width: 100%; } + + p { + margin: 0; + } + } + + + .img-float-formula { + width: 310px; + float: left; + height: auto; + margin: auto; + margin-right: 20px; p { margin: 0; @@ -225,6 +319,75 @@ margin: 0 !important; } } + + .references { + margin-top: 140px; + hr { + font-weight: bold; + margin-left: 0; + width: 15%; + } + } + + .w395 { + width: 395px; + } + + .w430 { + width: 430px; + } + + .w280{ + width: 280px; + } + + .w270 { + width: 270px; + } + + .w250 { + width: 250px; + } + + .w230{ + width: 230px; + } + + .w220 { + width: 220px; + } + + .w200 { + width: 200px; + } + + .w180{ + width: 180px; + } + + .w115 { + width: 115px; + } + + + + .text-rights { + width: 230px; + float: right; + height: auto; + margin: auto; + margin-left: 20px; + + img { + width: 100%; + } + + p { + margin: 0 !important; + } + } + + .pdf-text { display: flex; @@ -298,7 +461,7 @@ div.bk-ztgs { border: 0.15em dotted #5192c6; - padding: 0.5em; + padding: 1.5em 0.5em; margin-bottom: 2em; margin-top: 2em; border-radius: 1em; @@ -317,7 +480,7 @@ text-align: center; text-indent: 0em; position: absolute; - top: -2em; + top: -1.2em; } @@ -339,7 +502,22 @@ // 棰樼洰 .textarea-box { background-color: transparent; - margin-left: 80px; + max-width: 85%; + min-width: 85%; + outline: none; + } + + .textarea-box-left { + background-color: transparent; + margin-left: 12%; + max-width: 85%; + min-width: 85%; + outline: none; + } + + .textarea-box-right{ + background-color: transparent; + margin-left: 8%; max-width: 85%; min-width: 85%; outline: none; @@ -399,7 +577,7 @@ .event-header-text-bc { background-color: #bbd4ec; - } + } // 杩佺Щ .bk-bwh { @@ -631,7 +809,9 @@ } .note { - font-size: 0.85em; + margin: 0; + font-size: 14px; + line-height: 22px; } @@ -652,7 +832,7 @@ .img { font-family: 'FZLTXIHJW'; text-align: center; - font-size: 0.85em; + font-size: 14px; margin-left: 0%; margin-right: 0%; text-indent: 0em; @@ -674,7 +854,6 @@ margin-bottom: 0.2em !important; text-indent: 2em; line-height: 30px; - // font-size: 18px; text-align: justify; } @@ -699,17 +878,15 @@ text-indent: 0em; } - - - .left{ + .left { text-indent: 0em; margin: 0 !important; line-height: 20px; } - .left3{ - margin: 20 0 0 0 !important; - line-height: 20px; + .left3 { + margin: 20 0 0 0 !important; + line-height: 20px; } .left2 { @@ -791,13 +968,29 @@ h3 { font-family: 'FZHTJW'; color: #5192C6; - font-weight: 300; - font-size: 1.2em; - margin-top: 1.5em; + font-weight: 500; + font-size: 1.6em; + margin-top: 0.5em; margin-bottom: 5px; text-indent: 0em; } + .unit2-c { + color: #F89C1C !important; + } + + .unit3-c { + color: #0A9CAC !important; + } + + .unit4-c { + color: #92B03D !important; + } + + .unit5-c { + color: #0180CD !important; + } + h4 { font-family: 'FZHTJW'; color: #5192C6; @@ -816,22 +1009,20 @@ font-weight: 400; margin-bottom: 0.5em; margin-top: 0.5em; - font-size: 0.9em; + font-size: 18px; text-indent: 0em; } h6 { - font-family: 'FZHTJW'; - font-weight: bold; - margin-bottom: 0.5em; - margin-top: 2em; - font-size: 1em; + font-weight: 400; + margin-bottom: 5px; + margin-top: 10px; + font-size: 18px; text-indent: 2em; } .zt-h6 { - font-family: 'FZHTJW'; color: #65C097; margin-bottom: 0.5em; @@ -922,6 +1113,12 @@ margin-bottom: -0.5em; } + .inline2 { + height: 1.5em; + margin-top: 0.5em; + margin-bottom: -0.5em; + } + .inline4 { height: 2em; margin-left: -2em; @@ -995,6 +1192,14 @@ position: relative; } + .bk1 { + border: 0.15em dotted #F89C1C; + padding: 0.5em; + margin-bottom: 2em; + margin-top: 0.5em; + border-radius: 1em; + position: relative; + } p.bj1-qjms { background-color: #5392C7; @@ -1026,28 +1231,29 @@ } .bj3 { - background-color: #FDE6BC; - padding: 20px; - border-radius: 1.5em; - margin-bottom: 2em; - margin-top: 2.5em; + background-color: #FEDDB4; + padding: 20px 10px 10px 10px; + border-radius: 10px; + margin-bottom: 10pxem; + margin-top: 10px; + position: relative; } span.bj3-xyx { background-color: #F5A101; color: #FFFFFF; - box-shadow: 0.3em 0.3em 0px 0px #FDF0D8; - border-radius: 1.5em; - padding: 5px 20px 5px 20px; + border-radius: 5px; + padding: 5px 10px 5px 10px; font-size: 1em; font-weight: bold; } div.bj3-xyx { - margin-top: -3em; - margin-bottom: 1.5em; - margin-left: -3em; + position: absolute; + top: -15px; + left: -25px; + } .ts-1 { @@ -1089,8 +1295,20 @@ border-radius: 5px; } + .bj4-xyx-pd { + font-size: 16px; + color: #fff; + line-height: 20px; + padding: 22px 10px 22px 10px; + background-color: #5192C6; + margin-right: 10px; + border-radius: 5px; + flex-wrap: nowrap; + } + .bj4-xyx-icon { color: #5192C6; + text-wrap: nowrap; } .bj5 { @@ -1220,11 +1438,14 @@ .custom-dialog { overflow: hidden !important; + .el-dialog__body { padding: 0; } + .el-dialog__header { background-color: rgba(0, 0, 0, 0.8); + .header_title { display: flex; justify-content: space-between; @@ -1238,6 +1459,7 @@ cursor: pointer; } } + .el-dialog__title, .el-dialog__headerbtn .el-dialog__close { color: #fff; @@ -1322,10 +1544,12 @@ .img-float { width: 130px; } + .img-rights { width: 130px; } - .btn-w{ + + .btn-w { width: 42px; } } diff --git a/src/books/civilAviation/view/components/chapter001.vue b/src/books/civilAviation/view/components/chapter001.vue index 20f8ea5..90765c2 100644 --- a/src/books/civilAviation/view/components/chapter001.vue +++ b/src/books/civilAviation/view/components/chapter001.vue @@ -1,5 +1,6 @@ <template> <div class="chapter" num="2"> + <!-- 绗竴鍗曞厓灏侀潰 --> <div class="page-box" page="9"> <div v-if="showPageList.indexOf(9) > -1"> <div style="background-color: #5192C6; padding-top: 50px"> @@ -46,9 +47,855 @@ </div> </div> </div> - <!-- 19椤� --> + <!-- 2椤� --> <div class="page-box" page="10"> <div v-if="showPageList.indexOf(10) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">002</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h2 id="b003" class="p-even"><img class="inline1" alt="" src="../../assets/images/zszb.jpg" /></h2> + <h3 id="c001" class="p-even">瀛︿範浠诲姟涓�<br />浜嗚В鑸┖鍙戝睍绠�鍙�</h3> + <div class="task ma-l"></div> + <div class="img-float-smaller openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0014-1.jpg" /> + <p class="img">鍥�1-1 鍒楀瓙寰¢</p> + </div> + <p><br></p> + <span> + <p class="p-even"> + 闀夸箙浠ユ潵锛屾旦娓洪暱澶╀究浠ョ嫭鐗圭殑榄呭姏鍚稿紩鐫�浜轰滑瀵瑰叾杩涜鏃犲敖鐨勬兂璞′笌鎺㈢储銆傚湪鍙よ�佺殑骞翠唬锛屼汉绫诲氨宸茬粡浜х敓浜嗛琛岀殑鎰挎湜锛屾棤璁烘槸瀚﹀ē濂旀湀銆佸垪瀛愬尽椋庯紙鍥�1-1锛夛紝杩樻槸鑲栧彶鍜屽紕鐜変箻榫欒法鍑ら涓婂ぉ鈥︹�﹁繖浜涙暟涓嶆竻鐨勭璇濆拰浼犺锛岄兘鏄汉绫绘湡鐩肩潃鍗囩┖椋炵繑鐨勭編濂芥効鏈涘拰鏈﹁儳骞绘兂鐨勪綋鐜般�備负浜嗗疄鐜拌繖涓�姊︽兂锛屽崈鐧惧勾鏉ヤ汉浠繘琛屼簡鍚勭鍚勬牱鐨勫皾璇曪紝鏈�缁堝彇寰椾簡鎴愬姛锛屽疄鐜颁簡姣旈笩鍎块寰楁洿楂樸�侀寰楁洿蹇殑缇庡ソ鎰挎湜銆� + </p> + </span> + <h4 id="d001" class="p-even">涓�銆佹垜鍥藉彜浜哄叧浜庨琛岀殑灏濊瘯</h4> + <p class="p-even"> + 鎴戝浗鍏堟皯寰堟棭灏卞紑濮嬩簡鍏充簬椋炶鐨勫皾璇曪紝鐩镐紶涓婂彜鏃舵湡鐨勮垳鏄娇鐢ㄥ櫒鐗╅琛岀殑绗竴浜恒�傛嵁銆婂彶璁般�嬭杞斤紝鑸滅殑姣嶄翰寰堟棭渚垮幓涓栦簡锛岀户姣嶅父鍦ㄨ垳鐨勭埗浜查潰鍓嶈鑸滅殑鍧忚瘽銆備竴鏃ワ紝鑸滀慨琛ヨ胺浠撳眿椤讹紝鍒氫笂鍘讳笉涓�浼氬効锛屽叾鐖朵究鍦ㄧ户姣嶆暀鍞嗕笅鎮勬倓鎾ゆ帀浜嗘瀛愶紝鐐圭噧浜嗚胺浠撱�傛儏鎬ヤ箣涓嬶紝鑸滈殢鎵嬫嬁浜嗕袱椤舵枟绗狅紝楂橀珮涓捐捣锛屼粠璋蜂粨涓婃粦缈旇�屼笅銆傚緢鏄剧劧锛岃垳鐨勬枟绗犲氨鐩稿綋浜庝粖澶╃殑闄嶈惤浼炪��<sup>鈶�</sup> + </p> + <p class="p-even">鍏厓鍓�22涓栫邯锛屾墖瀛愩�佸竼绛夊伐鍏峰湪鎴戝浗寰楀埌浜嗗簲鐢紝杩欐槸涓庣┖姘斿姩鍔涘鏈夊叧鐨勩�佹渶鍘熷鐨勬皯闂村疄璺点��</p> + <p class="p-even"> + 椋庣瓭锛屽彜浜虹О涓洪涪銆傛棭鍦ㄦ槬绉嬫垬鍥芥椂鏈燂紝鎴戝浗渚垮彂鏄庝簡鏈ㄥ埗鐨勯绛濄�傛牴鎹彶鏂欒杞斤紝鏄ョ鎴樺浗鏃舵湡澧ㄧ繜浠ユ湪閫犻涪锛岄鍗囧叆澶╋紝璺濅粖鏈�2400浣欏勾銆傚埌浜嗕笢姹夛紝闅忕潃閫犵焊鏈湪姘戦棿鎺ㄥ箍锛岀焊绯婄殑椋庣瓭鍦ㄦ垜鍥藉寳鏂瑰箍娉涙祦浼犮�傛嵁鏂囩尞璁拌浇锛�13涓栫邯鐨勬椂鍊欙紝閲戜汉鍜岃挋鍙や汉浣滄垬锛岄噾浜鸿繕鏇炬斁鍑洪绛濓紝浠庣┖涓暎鎾紶鍗曪紝榧撳姳琚繕鐨勯噾鍥藉+鍏甸�冭窇銆傚叕鍏�19骞达紝涓烘敾鎵撳寛濂�, + </p> + <hr class="ma-l"> + <p class="p-even note td-0"><a id="m1">鈶�</a> 娌堟捣鍐涳細銆婁腑鍥借埅绌虹畝鍙层�嬶紝3椤碉紝鍖椾含锛岃埅绌哄伐涓氬嚭鐗堢ぞ锛�2020銆�</p> + </div> + </div> + </div> + <!-- 3椤� --> + <div class="page-box" page="11"> + <div v-if="showPageList.indexOf(11) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">003</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鐜嬭幗涓嬩护鎷涘嫙寮傝兘涔嬪+銆備竴鏃ワ紝鏈変汉绉颁細椋烇紝鐜嬭幗寰堥珮鍏达紝浜庢槸璁╀粬褰撳満璇曢獙銆傛浜轰究鍦ㄩ暱瀹変妇琛岄琛岃〃婕斻�傘�婃眽涔β风帇鑾戒紶銆嬫槸杩欐牱璁拌浇姝や簨鐨勶細鈥滃彇澶ч笩缈负涓ょ考锛屽ご涓庤韩鐨嗚憲姣涳紝閫氬紩鐜航锛岄鏁扮櫨姝ワ紝鍫曘�傗�濆悗浜虹寽娴嬶紝姝や汉鏋佹湁鍙兘鍒╃敤浜嗛绛濇粦缈旂殑鍘熺悊銆�<sup>鈶�</sup> + </p> + <p class="p-odd"> + 鍏厓鍓�141鈥斿叕鍏冨墠87骞存眽姝﹀笣鏃朵唬锛屼腑鍥戒汉鍙戞槑浜嗏�滅儧鐏鈥濄�傚畠鍙互鍒╃敤绌烘皵鐨勬诞鍔涢涓婂ぉ绌猴紝鏈�鏃╀綔涓哄啗闃熶紶閫掍俊鍙风殑宸ュ叿锛屽悗浜哄皢瀹冨懡鍚嶄负鈥滃瓟鏄庣伅鈥濓紝灏嗗畠鐨勫彂鏄庢潈寮哄姞缁欎簡涓滄眽鏈勾鐨勮钁涗寒銆傜浉浼犺繖涓�鏃舵湡锛屽湪娣崡杩樻湁浜烘妸鐑┖姘旀敞鍏ラ浮铔嬪3鍐咃紝鍦ㄥぇ椋庝腑杩涜鏀鹃銆傝繖浜涢兘鏄埄鐢ㄧ儹绌烘皵瀵嗗害鍑忓皬銆佸�熷姪绌烘皵娴姏鍗囩┖鐨勬渶鏃╄杞姐�� + </p> + <p class="p-odd">涓滄眽鏃舵湡锛岀浉浼犲彂鏄庘�滄祽澶╀华鈥濆拰鈥滃湴鍔ㄤ华鈥濈殑钁楀悕鍙戞槑瀹跺紶琛″埗浣滃嚭浜嗕竴鍙細椋炵殑鏈ㄩ笩锛岃繖鐩稿綋浜庡師濮嬬殑椋炴満妯″瀷銆�</p> + <p class="p-odd">鏅嬫湞鏃讹紝钁涙椽鍙戠幇浜嗚�侀拱鍦ㄤ竴瀹氶珮搴︿笂涓嶆墖鍔ㄧ繀鑶�涔熻兘婊戠繑锛屽苟瑙i噴浜嗗叾鍘熺悊銆傝繖涓�鏃舵湡锛屼腑鍥戒汉杩樺彂鏄庝簡鈥滅铚昏湏鈥濓紝浣滀负鐩村崌鏈虹殑闆忓舰寰楀埌浜嗕笘浜虹殑璁ゅ彲銆�</p> + <p class="p-odd"> + 549骞达紝鍗楁湞姊佸浗鐨勯閮藉缓搴疯鏁屽啗鍥村洶锛屽お瀛愯惂绾茬敤椋庣瓭鎼哄甫璇忎功鍚戝煄澶栧憡鎬ワ紝鍙儨椋庣瓭琚晫鍐涘皠涓嬶紝杩欐槸椋庣瓭鐢ㄤ簬鍐涗簨琛屽姩鐨勯娆¤杞姐�傚湪782骞寸殑鍞愭湞锛岀敯鎮﹀洿鏀讳复娲烘椂锛屼复娲哄畧灏嗗紶浼句篃鏀鹃绛濆悜鍩庡姹傛晳锛岃繖娆¤幏寰椾簡鎴愬姛銆� + </p> + <p class="p-odd"> + 浜斾唬鏃讹紝鐩镐紶闅忓悓涓堝か涓�璧峰嚭寰佷綔鎴樼殑鑾樹竷濞樺埗浣滀簡鐢ㄦ澗鑴傜偣鐕冨姞鐑殑绫讳技浜庡瓟鏄庣伅鐨勨�滄澗鑴傜悆鈥濄�傚湪鍏冩湞鐨勬垬浜変腑宸茬粡杩愮敤涓嶅悓棰滆壊鐨勬澗鑴傜悆浣滀负浜掔浉鑱旂粶銆佷紶閫掍俊鍙风殑宸ュ叿锛屼粬浠皢杩欑鐑皵鐞冪殑鍘熷褰㈡�佸箍娉涜繍鐢ㄣ�� + </p> + <p class="p-odd">1308骞达紝鍏冩湞鐨囧笣鐧诲熀澶у吀涓婅〃婕斾簡绾镐紴椋炰汉銆傝繖涔熻鏄汉绫绘渶鏃╃殑鈥滆烦浼炩�濇椿鍔ㄣ��</p> + <p class="p-odd">1326骞达紝涓浗鐨勯绛濆湪娆ф床寰楀埌娴佷紶锛屽苟閫愭笎鐢ㄤ簬鍐涗簨娲诲姩銆�</p> + <p class="p-odd"> + 鍦ㄦ槑鏈濓紝鏈変綅瀹樺悘涓囨埛璇曞浘鍒╃敤鐏鐨勫姏閲忔潵瀹炵幇杞戒汉椋炶銆備粬鍦ㄤ竴鎶婃瀛愬悗闈㈣涓婁簡46鏋氬ぇ鐏锛屼汉鍧愬湪妞呭瓙涓婏紝涓ゆ墜鍚勬嬁涓�涓ぇ椋庣瓭锛岀劧鍚庡彨浜虹偣鐕冭繖浜涚伀绠�備粬甯屾湜鍊熺潃鐏鎺ㄨ繘鐨勫姏閲忥紝鍐嶅姞涓婇绛濅笂鍗囩殑鍔涢噺,浣胯嚜宸遍璧锋潵銆傚緢閬楁喚锛屽疄楠屽け璐ヤ簡锛屼絾涓囨埛椋炲ぉ鐨勭簿绁炰护浜烘暚浣┿��<sup>鈶�</sup> + </p> + <hr class=""> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 娌堟捣鍐涳細銆婁腑鍥借埅绌虹畝鍙层�嬶紝4椤碉紝鍖椾含锛岃埅绌哄伐涓氬嚭鐗堢ぞ锛�2020銆�</p> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 娌堟捣鍐涳細銆婁腑鍥借埅绌虹畝鍙层�嬶紝5椤碉紝鍖椾含锛岃埅绌哄伐涓氬嚭鐗堢ぞ锛�2020銆�</p> + </div> + </div> + </div> + <!-- 4椤� --> + <div class="page-box" page="12"> + <div v-if="showPageList.indexOf(12) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">004</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">绉戝瀹朵滑涓虹邯蹇典竾鎴风尞韬埅澶╀簨涓氱殑浼熷ぇ鍒涗妇灏卞皢鏈堢悆鑳岄潰鐨勪竴搴х幆褰㈠北鍛藉悕涓轰竾鎴峰北銆�<sup>鈶�</sup></p> + <p class="p-even"> + 鎴愪功浜�1621骞寸殑銆婃澶囧織銆嬩腑璁拌浇浜嗗悕涓衡�滅伀榫欏嚭姘粹�濈殑鍒濆涓ょ骇鐏銆傝繖鏄渶鏃╃殑涓ょ骇鐏锛岀害1.6m闀匡紝鐢辨瘺绔瑰埗鎴愶紝鍓嶈竟瑁呮湁涓�涓湪鍒剁殑榫欏ご锛屽悗杈硅鏈夋湪鍒剁殑榫欒韩榫欏熬锛屼笅杈逛竴鍓嶄竴鍚庤浜嗕袱鏋氬ぇ鐏锛岃�岃倸瀛愬唴鍙堝彟瑁呭嚑鏋氱伀绠�傚叾鑲氬瓙鍐呭嚑鏋氱伀绠殑寮曠伀绾挎帴鍒伴緳韬笅闈袱鏋氬ぇ鐏鐨勫簳閮ㄣ�傝繖绉嶄袱绾т覆鑱斿紡鐏鐨勫師鐞嗕笌鎴戝浗闀垮緛涓夊彿涓茶仈寮忚繍杞界伀绠浉浼笺�� + </p> + <p class="p-even"> + 娓呮湞鏃舵湡锛岃嫃宸炲伐鍖犲緪姝f槑缁忓崄浣欏勾鍔姏锛屽埗鎴愨�滄牪鏍虫鈥濆紡鏍风殑鈥滈杞︹�濓紝涓嬭鏈哄叧锛屽叾涓�滈娇鐗欓敊鍚堚�濓紝浜虹敤涓よ剼韪忔澘鍚庯紝绂诲湴鍙昂浣欙紝椋炴浮娓眾銆傝繖鍙畻鏄洿鍗囨満鍨嬮琛屽櫒鐨勬渶鍘熷璇曢獙銆�</p> + <p class="p-even"> + 涓轰簡瀹炵幇椋炲ぉ鐨勬ⅵ鎯筹紝鍦ㄦ妧鏈惤鍚庣殑鏃朵唬锛屾垜浠殑绁栧厛鍒涢�犱簡璁稿鍏堜緥锛屽緢澶氭妧鏈鍏堜笘鐣屻�備粬浠殑杩欑澶ф棤鐣忕簿绁烇紝婵�鍔辩潃鎴戜滑鍕囧線鐩村墠銆傛垜浠櫧鐒朵笉蹇呭儚涓囨埛閭h埇鐚韩鑸┖鎺㈢储锛屼絾鏄鍙戞壃杩欑绮剧锛屽湪姘戣埅鐨勫矖浣嶄笂淇濇寔鍥㈢粨鍗忎綔鐨勫伐浣滀綔椋庛�佹暚涓氬鐚殑鑱屼笟鎿嶅畧锛屾暚涓氫箰缇わ紝璐$尞鑷繁鐨勫姏閲忋�� + </p> + <div class="bj4"> + <div class="fl al-c mb-10"> + <div class="bj4-xyx-pd"> + 璇讳竴璇� + </div> + <div class="bj4-xyx-icon"> + 鈻� 鈻� + </div> + <p class="td-0"><b style="color: #5192C6">銆婇灞卞皬蹇椼�嬪叧浜庡緪姝f槑鈥滄牪鏍虫鈥濆紡鏍封�滈杞︹�濈殑璁拌浇</b> <sup + style="color: #5192C6">鈶�</sup></p> + </div> + <p class="block">閫犻杞︿箣鏌愮敳锛屾绀句汉涔燂紝鎬ф晱蹇椾笓涓�锛屽钩鐢熶笉浜嬮厭椋熴�傚緛閫愭瘡宸ユ暎鍚庯紝浜哄閱夐ケ娓告垙锛岀敳鐙棴闂ㄥ瘋鍧愶紝鎬濆垱涓�濂囧埗浠ラ福浜庡ぉ涓嬨��</p> + <p class="block">闂讳汉璋堛�婂北娴风粡銆嬶紝鎰熷強濂囪偙涔嬫晠浜嬨�備竴鏃ュ憡褰掞紝鐬戠洰娣辨�濓紝浼哥焊鐢诲浘锛屽薄鍥惧薄鏀癸紝瀵濋淇卞繕銆傛湡骞寸濮嬪氨锛屾寜鍥炬搷鏂紝鏈変笉鍚堣�咃紝鍓婁箣锛岃櫧鐧炬槗涓嶆倲銆�</p> + <p class="block"> + 瀹舵晠璐紝鏃犳媴鐭冲偍銆傝嚦鏄瀛愬暭鍙凤紝鐏剁伀涓嶄妇锛屼笉寰楀凡鑰岄ゥ椹辫荡鍩庛�傜敳鏁呮湁宸у悕锛屽伐鑲嗛椈鍏跺嚭灞憋紝浜夎嚧涔嬶紝涓板叾钖扛銆備笉鍗婂勾锛屽泭钃勬湁浣欙紝澶嶅綊閫犺溅濡傛晠锛屽泭鍊惧鍑恒�傚鏄�呭崄鏈変綑骞达紝鑰岃溅濮嬫垚銆�</p> + <p class="block"> + 鍏跺埗濡傛牪鏍虫瀛愬紡锛屼笅鏈夋満鍏筹紝榻跨墮閿欏悎锛屼汉鍧愭涓紝浠ヤ袱瓒冲嚮鏉匡紝涓婁笅涔嬫満杞紝椋庢棆鐤鹃┌鑰屽幓锛岀鍦板彲灏轰綑锛岄娓℃腐姹娿�傜敳鐘逛笉婊′簬蹇冦�傝皳椤婚珮杩囨ゼ灞嬶紝鑳借秺澶箹涔嬫箹闈㈠洓浜斿崄閲岋紝寰�鏉ョ讥缂堛�佽帿鍘樺嘲锛岃嚧鍙繙鎭冦�傛鍦ㄨ笇韬囧啀鍥捐繘姝ワ紝鑰屽勾宸茶�佺煟锛屾湭鍑犵梾 + </p> + </div> + <hr class="ma-l"> + <p class="p-even note td-0"><a id="m1">鈶�</a> 濮氬缓鏄庛�佺▼闆嫻锛氥�婄瀛︽妧鏈璁恒��2鐗堬紝323椤碉紝鍖椾含锛屽寳浜偖鐢靛ぇ瀛﹀嚭鐗堢ぞ锛�2015銆�</p> + <p class="p-even note td-0"><a id="m1">鈶�</a> 寮犲織鏂帮細銆婂惔涓暎璁般�嬶紝159锝�160椤碉紝鑻忓窞锛屽彜鍚磋僵鍑虹増绀撅紝2006銆�</p> + </div> + </div> + </div> + <!-- 5椤� --> + <div class="page-box" page="13"> + <div v-if="showPageList.indexOf(13) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">005</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <p class="block td-0"> + 鍗掋�傚叾濡诲棓鍏朵竴鐢熸潗鍔涘績鎬濇秷鑰椾簬姝わ紝浠ヨ嚦楗垮~娌熷锛岀殕姝よ溅涓轰篃銆傛枾涔嬩粯鐐婏紝鍏跺埗閬傜粷鐒夈�傛煇鐢插姘忚帿鑰冿紝鎴栨洶锛氬緪锛屽叾濮擄紱姝f槑锛屽叾瀛椼�� + </p> + </div> + <h4 id="d002">浜屻�佸浗澶栫殑椋炶姊︽兂鍜屽皾璇�</h4> + <p class="p-odd">瑗挎柟浜哄湪鎺㈢储椋炶鐨勯亾璺笂涔熷仛浜嗗緢澶氬皾璇曪紝浠栦滑鏇村�惧悜浜庝緷闈犱汉鍔涢琛屻��</p> + <p class="p-odd">鍏厓鍓�850骞达紝鑻卞浗浜哄竷鎷夊痉灏卞皢浜虹被鐨勯琛屾ⅵ鎯充粯璇稿疄鏂姐�備粬缁戜笂楦熺繀浠庣綏绁炴涓婁竴璺冭�屼笅锛岃瘯鍥鹃瓒婁鸡鏁﹀煄锛岀粨鏋滃潬鍦拌韩浜°��</p> + <p class="p-odd">鍏厓鍓�668鈥斿叕鍏冨墠625骞达紝浼犺涓�浣嶅眳浣忓湪宸存瘮浼︾殑鍩冨閭f皬涔熷皾璇曢琛岋紝涓嶈繃浠栨槸鎯冲�熷姪澶栧姏鍗囩┖锛岃瘯鍥鹃獞涓婅�侀拱缈辩繑澶╃┖锛岀粨鏋滃綋鐒朵笉浼氭垚鍔熴��</p> + <p class="p-odd">鍏厓鍓�400骞村乏鍙筹紝鐩镐紶鏅哄埄瀛﹁�呴樋鍑鏂篃鍒堕�犲苟璇曢杩囦竴鍙湪楦燂紝鍜屾垜鍥界殑椴佺彮銆佸ⅷ瀛愬嚑涔庢槸鍚屼竴鏃朵唬銆�</p> + <p class="p-odd">鍏厓鍓�287鈥斿叕鍏冨墠212骞达紝鍙ゅ笇鑵婂摬瀛﹀銆佹暟瀛﹀銆佺墿鐞嗗瀹堕樋鍩虹背寰峰彂鐜颁簡娴佷綋涓诞鍔涗骇鐢熺殑鍘熺悊锛屼负鍚庢潵鍙戞槑鍜屽埗閫犺交浜庣┖姘旂殑鑸┖鍣ㄦ彁渚涗簡鐞嗚渚濇嵁銆�</p> + <span> + <p class="p-odd"> + 875骞达紝瑗跨彮鐗欎汉闃垮竷灏斅峰崱甯屽鐢ㄧ窘姣涚矘鎴愪竴瀵圭繀鑶�锛屼粠楂樺璺充笅锛屾粦缈斾簡鈥滅浉褰撲竴娈佃窛绂烩�濄��1002鈥�1010骞达紝闃挎媺浼汉闃垮皵杈剧摝閲屽皾璇曚粠楂樺璺充笅鏃剁敤涓�瀵规湪鍒剁繀鑶�椋炶锛屼篃浠ュけ璐ヨ韩浜″憡缁堛��1010骞达紝鑻卞浗淇亾澹焹灏旈粯鍒嗗埆鍦ㄥ洓鑲笂鎹嗙粦浜嗕袱瀵逛汉閫犵繀鑶�锛屼粠濉旈《璺充笅灏濊瘯椋炶锛屽湪鍚戝墠婊戠繑浜嗙害200m鍚庡潬鍦帮紝鑵块鍙椾激銆�1162骞达紝涓�鍚嶅湡鑰冲叾浜哄皢缈呰唨鎹嗙粦鍦ㄦ墜 + </p> + </span> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0017-1.jpg" /> + <p class="img">鍥�1-2 杈韭疯姮濂囪璁$殑鈥滆灪鏃嬮潰鈥濈洿鍗囨満</p> + </div> + <span> + <p class="p-odd td-0"> + 鑷備笂锛屽皾璇曟粦缈旈琛屾椂澶辫触锛屾墍骞镐粎鍙楄交浼も�︹�﹀湪鍚庢潵鐨勫嚑鐧惧勾閲岋紝鍙堟湁澶氫汉灏濊瘯渚濋潬浜洪�犵繀鑶�瀹炵幇浜哄姏椋炶锛岄兘鏄互闈炴鍗充激鍛婄粓銆� + </p> + </span> + <span> + <p class="p-odd">1325骞达紝鍦ㄤ經鍏板痉鍑虹幇浜嗕竴绉嶉潬鎷夌怀椹卞姩鏃嬭浆鐨勭铚昏湏锛岀被浼间簬鎴戝浗鐨勭铚昏湏鐜╁叿銆傝タ鏂硅涓鸿繖鏄渶鏃╃殑鈥滃姩鍔涒�濇ā鍨嬮琛屽櫒銆�</p> + </span> + <span> + <p class="p-odd">1480骞村乏鍙筹紝杈韭疯姮濂囩粯鍒跺嚭鍘熷鐨勨�滆灪鏃嬮潰鈥濈洿鍗囨満鍘熺悊鑽夊浘锛堝浘1-2锛� + </p> + </span> + </div> + </div> + </div> + <!-- 6椤� --> + <div class="page-box" page="14"> + <div v-if="showPageList.indexOf(14) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">006</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 杩欐槸宸ョ▼瀛﹀巻鍙蹭笂姣旇緝鏈夊悕鐨勪竴骞呰埅绌烘満鍣ㄨ璁″浘銆�1505骞达紝浠栧啓鎴愩�婅楦熺殑椋炶銆嬩竴鏂囥�備綔涓轰紵澶х殑鑸┖鍏堥┍锛岃揪路鑺鍏堝悗鐢昏繃200浣欏箙鏈夊叧椋炶鍣ㄨ鎯崇殑鑽夊浘銆� + </p> + <p class="p-even"> + 1606鈥�1679骞达紝鎰忓ぇ鍒╄嚜鐒跺瀹跺崥闆峰埄鐮旂┒浜嗛笩鐨勯琛岋紝鍙戠幇楦熸墖鍔ㄧ繀鑶�鏃跺姏閲忛潪甯稿ぇ锛岃繖鍔涢噺涓庨笩鑷韩閲嶉噺鐨勬瘮渚嬫槸浜哄姏杩滆繙涓嶈兘杈惧埌鐨勩�備粬璁よ瘑鍒颁簡闈犱汉鐨勪綋鍔涙槸涓嶅彲鑳介涓婂ぉ绌虹殑锛岃繖鏍风殑缁撹鏈夊姪浜庣粨鏉熷嚑鐧惧勾鏉ヤ汉浠洸鐩殑鍐掗櫓璇曢獙銆� + </p> + <p class="p-even"> + 1686骞达紝娉曞浗浜洪┈鐣ョ壒鍐欐垚浜嗕汉绫绘渶鏃╃殑娴佷綋鍔涘涓撹憲鈥斺�斻�婅姘村拰鍏朵粬娴佷綋鐨勮繍鍔ㄣ�嬨��1738骞达紝鐟炲+鐗╃悊瀛﹀涓瑰凹灏斅蜂集鍔埄鍑虹増浜嗐�婃祦浣撳姩鍔涘銆嬩竴涔︼紝鍦ㄥ叾涓槓杩颁簡娴佷綋杩愬姩閫熷害鍜屽帇鍔涚殑鍏崇郴锛屽苟棣栨鎻愬嚭浜嗚灪鏃嬫〃鐞嗚銆� + </p> + <p class="p-even">1749骞达紝鏍兼媺鏂摜澶у澶╂枃瀛︽暀鎺堝▉灏旈�婄敤6鍙绛濓紝鍚婄潃姘旇薄浠櫒鍗囧叆绌轰腑杩涜鎺㈡祴锛岃繖鏄巻鍙蹭笂绗竴娆″皢椋庣瓭杩愮敤浜庢皵璞¤娴嬨��</p> + <h4 id="d003" class="p-even">涓夈�侀潤鍔涢琛屸�斺�� 鈥斺�旀皵鐞冩椂浠�</h4> + <p class="p-even">鍦ㄤ汉绫绘剰璇嗗埌渚濋潬鑷韩浣撳姏闅句互瀹炵幇椋炶姊︽兂鍚庯紝璁稿灏濊瘯鑰呭紑濮嬫�濈储閫氳繃鍙﹀鐨勯�斿緞鎺㈢储椋炶锛岀敤寰楁渶澶氱殑鏄潤姝㈢┖姘斾骇鐢熺殑娴姏锛屽嵆闈欏姏椋炶銆�</p> + <p class="p-even"> + 1670骞达紝鎰忓ぇ鍒╀慨閬撳+鎷夌撼璁炬兂鍒╃敤鐪熺┖閾滅悆浜х敓鐨勬诞鍔涘崌绌猴紝骞剁粯鍒跺嚭浜嗏�滅湡绌虹悆鈥濊璁″浘锛岃繖鏄汉绫荤涓�骞呯幇浠f皵鐞冭璁″浘銆備粬璁″垝鍒╃敤4涓娊鎴愮湡绌虹殑閾滅悆浜х敓鐨勬诞鍔涙潵鍚婅捣涓�鍙悐鑸憋紝浣嗘媺绾虫病鏈夎�冭檻鍒板ぇ姘旂殑鍘嬪姏鏄摐鐞冪殑寮哄害涓嶈兘鎵垮彈鐨勶紝鍦ㄢ�滅湡绌虹悆鈥濋璧锋潵涔嬪墠锛屽ぇ姘斿帇鏃╁凡鎶婇摐鐞冨帇鎵佷簡銆� + </p> + <p class="p-even"> + 1709骞�8鏈�5鏃ワ紙涔熸湁鐨勮鏄�8鏈�8鏃ワ級锛屽反瑗夸汉鍙ゆ柉鑺掔鐖剁敤绮楀竼甯冨埗鎴愪竴涓湁鍚婅埍鐨勭儹姘旂悆锛屼互楹︾鍜岀緤姣涗负鐕冩枡锛屽湪钁¤悇鐗欎负绾︾堪浜斾笘鍥界帇浣滀簡鐑皵鐞冮鍗囪〃婕旓紝杩欎釜鐑皵鐞冨彿绉扳�滀笘鐣屼笂鏈�鏃╃殑鐑皵鐞冣�濄�傜儹姘旂悆涓�鐩翠笂鍗囧埌3.6m楂樼殑澶╄姳鏉垮锛屼絾涓嬮檷杩囩▼骞朵笉瀹岀編锛屼笉骞稿紩鐕冧簡绐楀笜锛屼笉杩囧浗鐜嬬害缈颁簲涓栬涓鸿繖骞朵笉鏄竴浠跺潖浜嬶紝鑰屾槸涓�椤逛紵澶х殑鍙戞槑銆� + </p> + <p class="p-even">1731骞达紝淇勫浗浜哄厠鎷夊簱鐗硅浼娐疯垂灏旀枃鍒堕�犲苟璇曢浜嗛潬鐕冪儳鏉傜墿浜х敓鐑┖姘旂殑灏忓瀷鐑皵鐞冿紝杩欎釜鐑皵鐞冩湭寰楀埌涓栦汉鍙婂彶鏂欑殑璁ゅ彲銆�</p> + <p class="p-even">1782骞�11鏈�25鏃ワ紝娉曞浗鐨勮挋鍝ュ皵鑿插厔寮熷埄鐢ㄧ偣鐕冮害绉嗗悗浜х敓鐨勭儹姘旓紝浣夸竴鍙洿寰�1m銆侀珮17m銆佷互鏌虫潯涓洪鏋躲�佸閮ㄨ挋鏈夌焊鐨殑鐑皵鐞冨崌绌恒�傝繖鍙� + </p> + </div> + </div> + </div> + <!-- 7椤� --> + <div class="page-box" page="15"> + <div v-if="showPageList.indexOf(15) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">007</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">姘旂悆琚叕璁や负涓栫晫涓婄涓�鍙琛屾垚鍔熺殑鐑皵鐞冿紝浣嗚繖鍙儹姘旂悆骞舵病鏈夎揪鍒板疄鐢ㄩ樁娈点��</p> + <p class="p-odd"></p> + <p class="p-odd"> + 1783骞存槸椋炶鍙蹭笂璁╀汉婵�鍔ㄧ殑涓�骞淬�傝繖涓�骞存硶鍥戒汉鍙戞槑浜嗙儹姘旂悆鍜屾阿姘旂悆锛屼箻鍧愮潃杩欎袱绉嶆皵鐞冿紝浜虹被绗竴娆$湡姝h繘鍏ヤ簡澶╃┖銆傚湪椋炶鍕囧+浠姫鍔涗簤鍙栦汉绫荤涓�娆♀�滃幓鎺ヨ繎涓婂笣浣忕殑鍦版柟鈥濅箣鍚庯紝姘旂悆鏃朵唬鍗庝附寮�鍚�傝繖鏄汉绫婚琛屽彶涓婄湡姝g殑寮�绡囥�� + </p> + <p class="p-odd"> + 1783骞�6鏈�4鏃ワ紝钂欏摜灏旇彶鍏勫紵鍦ㄥ反榛庢槀璇哄唴骞垮満涓婅繘琛屼簡鐑皵鐞冩斁椋炵殑鍏紑琛ㄦ紨銆備粬浠敤缇婃瘺鍜岀ɑ鑽夊仛鐕冩枡锛屽皢涓�鍙簹楹诲竷鏉愯川鐨勭儹姘旂悆鏀鹃鍒�457m楂樺害锛岀粡杩囩害10min椋橀浜嗗ぇ绾�2.3km锛屼负浜虹被寰佹湇澶╃┖鎻愪緵浜嗗垏瀹炲彲琛岀殑宸ュ叿锛屽骞村悗浜轰滑鍦ㄦ鍦扮珛纰戠邯蹇佃繖涓�浼熷ぇ澹妇銆傚悓骞�9鏈�19鏃ワ紝浠栦滑濂夊懡涓鸿矾鏄撳崄鍏か濡囪繘琛岀儹姘旂悆琛ㄦ紨锛屽綋鐫�3涓囧瑙備紬鐨勯潰锛屽皢涓�鍙腑瀛愩�佷竴鍙叕楦″拰涓�鍙坏缇婅浇鍏ョ儹姘旂悆锛屼笂鍗囧埌绾�518m锛堜篃鏈夎祫鏂欒450m锛夐珮搴︼紝缁忚繃绾�8min鏃堕棿椋橀浜�3.2km宸﹀彸锛岄檷钀藉湪涓�鐗囨爲鏋椾腑銆傝姘旂悆鍚嶅0澶у櫔锛岃鍥界帇璺槗鍗佸叚璧愬悕涓衡�滆挋鍝ュ皵鑿叉皵鐞冣�濓紙鍥�1-3锛夈�� + </p> + <p class="center openImgBox"><img class="img-b" alt="" src="../../assets/images/0019-1.jpg" /></p> + <p class="img">鍥�1-3 鈥滆挋鍝ュ皵鑿叉皵鐞冣�濆疄楠�</p> + <p class="p-odd"> + 1783骞�11鏈�21鏃ワ紝钂欏摜灏旇彶鐑皵鐞冪涓�娆″疄鐜颁簡杞戒汉椋炶锛堝浘1-4锛夈�備粬浠妸姘旂悆鐩村緞澧炲姞鍒�15m锛岄珮搴﹀鍔犲埌23m锛屾皵鐞冨绉害鏈�2200m<sup>3</sup>锛屽苟涓旀皵鐞冪殑琛ㄩ潰琚粯涓婁簡鐨囧寰界珷鍜屽娈垮浘妗堛�傛皵鐞冧笅闈㈠悐鐫�涓�涓洖寤婂紡鐨勫悐绡紝鍙互璁╂惌杞借�呭湪鍥炲粖鍐呮椿鍔ㄣ�傚簳閮ㄤ腑绌哄鍚婄潃涓�涓伀鐩掞紝鐢ㄤ互涓�杈归琛屼竴杈圭粰姘旂悆鐨勭┖姘斿姞鐑�傚洖寤婇噷杩樺噯澶囦簡涓�浜涚噧鏂欙紝鐢ㄤ互鍦ㄩ�斾腑缁欑伀鐩� + </p> + </div> + </div> + </div> + <!-- 8椤� --> + <div class="page-box" page="16"> + <div v-if="showPageList.indexOf(16) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">008</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0020-1.jpg" /> + <p class="img">鍥�1-4 鐑皵鐞冮娆¤浇浜洪琛�</p> + </div> + <span> + <p class="p-even td-0"> + 娣诲姞銆傝矾鏄撳崄鍏浗鐜嬫渶鍒濅笉鍏佽鐢ㄤ汉鐨勭敓鍛藉幓鍐掗櫓锛屾墍浠ヤ笉鍚屾剰杩涜杞戒汉椋炶锛屽悗鏉ュ悓鎰忕敤姝诲洑鏉ヨ繘琛岃瘯楠岋紝骞剁瓟搴斿鏋滆瘯楠屾垚鍔熷彲浠ュ厤鍘讳粬浠殑姝荤姜銆備絾鏄硶鍏板痉渚埖鎹悊鍔涗簤锛岃涓轰汉姘戞瘮缃姱鏇存湁璧勬牸鍘婚仺娓稿ぉ绌猴紝鈥滃幓鎺ヨ繎涓婂笣灞呬綇鐨勫湴鏂光�濄�傚浗鐜嬫渶缁堝悓鎰忕敱娉曞浗闈掑勾绉戝瀹剁綏榻愯�跺拰寰烽樋鍏板痉浣滀负杩欐椋炶瀹為獙鐨勭涓�鎵瑰媷澹�傝繖鍙崕涓借�屽法澶х殑姘旂悆椋炶浜嗙害25min锛屾渶鍚庨檷钀藉湪宸撮粠鐨勬剰澶у埄骞垮満涓娿�傝繖鏄汉绫荤涓�娆″埄鐢ㄧ儹姘旂悆鑷敱椋橀锛屼负浜虹被寰佹湇钃濆ぉ鐨勫巻鍙插啓涓嬩簡娴撳ⅷ閲嶅僵鐨勪竴绗旓紝浜虹被鐨勬椿鍔ㄧ┖闂翠粠姝ゆ寮忚繘鍏ョ┖涓�� + </p> + </span> + <p class="p-even"> + 闄ら噰鐢ㄧ儹绌烘皵鎵樹妇姘旂悆鍗囩┖澶栵紝浜轰滑杩樺湪灏濊瘯鐢ㄥ瘑搴﹁緝灏忕殑姘㈡皵浣滀负姘旂悆鐨勫~鍏呯墿銆備汉浠彂鐜帮紝姘㈡皵鐞冪殑鎬ц兘鏄庢樉濂戒簬鐑皵鐞冿紝姘㈡皵姣�100鈩冪殑鐑┖姘斾骇鐢熺殑娴姏瑕佸ぇ4鍊嶃��1783骞�1鏈�9鏃ワ紝娉曞浗浜哄竷鏈楀灏斿湪缇庡浗璐瑰煄涓哄崕鐩涢】鎬荤粺鍏紑琛ㄦ紨浜嗘阿姘旂悆椋炶锛岄琛岄珮搴﹁揪鍒颁簡1524m锛岃繖鏄編娲插ぇ闄嗙涓�娆℃斁椋為琛屽櫒銆傚氨鍦ㄨ挋鍝ュ皵鑿插厔寮熺殑鐑皵鐞冮娆″崌绌哄悗涓嶄箙锛屾硶鍥界墿鐞嗗瀹堕泤鍏嬄锋煡灏旀柉鍜屼粬鐨勫姪鎵嬩滑鐢ㄦ湁姗¤兌娑傚眰鐨勫澶桓锛屽埗浣滀簡涓�鍙洿寰勭害37m鐨勬皵鐞冦��1783骞�8鏈�27鏃ワ紝鏌ュ皵鏂湪鎴愬崈涓婁竾鐨勫反榛庝汉闈㈠墠鏀鹃浜嗕粬鐨勬阿姘旂悆銆備絾鍥犱负浠栦滑灏嗘皵鐞冨簳閮ㄥ瘑灏佷簡璧锋潵锛屾皵鐞冩渶缁堝湪绌轰腑鐖嗙偢浜嗐�傚氨鍦ㄧ儹姘旂悆棣栨杞戒汉椋炶涔嬪悗鐨勭10澶╋紝鍗�1783骞�12鏈�1鏃ワ紝鏌ュ皵鏂拰浠栫殑鍔╂墜涔樺潗姘㈡皵鐞冧篃瀹屾垚浜嗚浇浜洪琛屻�備粬浠埗浣滅殑姘㈡皵鐞冪洿寰勬湁84m锛岄琛岃窛绂�40km浠ヤ笂锛岃繙杩滆秴杩囦簡鐩村緞15m鐨勭儹姘旂悆銆備粬淇╂垚浜嗕汉绫诲巻鍙蹭笂棣栨鍒╃敤姘㈡皵鐞冮琛岀殑灏濊瘯鑰呫�傜揣鎺ョ潃浜屼汉鍐嶆鍗囩┖锛岄琛岄珮搴﹁揪鍒颁簡2750m锛岄椋炰簡澶х害35min锛屾垚涓衡�滀竴澶╁唴涓ゆ鐪嬪埌鏅氶湠鐨勪汉鈥濄�� + </p> + <p class="p-even">鏌ュ皵鏂拰钂欏摜灏旇彶鍏勫紵鍏堥┍鎬х殑姘旂悆璁″垝鍦ㄥ悇鍦伴兘寮曡捣浜嗚桨鍔紝姘旂悆杩涘叆浜嗗悇涓鍩熴�傚埌浜�1784骞达紝涔熷氨鏄垝鏃朵唬鐨勬皵鐞冮琛屼箣鍚庣殑1骞达紝浜轰滑鍏卞畬浜�52娆℃皵鐞冨崌绌恒��</p> + <p class="p-even">姘旂悆鍑虹幇鍚庯紝寰堝揩灏辫搴旂敤鍒板啗浜嬮鍩熴�傚氨鍦ㄦ皵鐞冭浇浜洪琛岀殑绗簩骞达紙1784骞达級锛屾硶鍥藉ぇ闈╁懡鏈熼棿锛屼汉浠氨鍒╃敤绯荤暀寮忚浇浜烘皵鐞冭繘琛屾垬鍦鸿 + </p> + </div> + </div> + </div> + <!-- 9椤� --> + <div class="page-box" page="17"> + <div v-if="showPageList.indexOf(17) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">009</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 娴嬨��1789骞达紝娉曞浗闄嗗啗缁勫缓浜嗕竴鏀皵鐞冧睛瀵熼儴闃燂紝浠庢鑸┖鍣ㄥ湪鍐涢槦涓湁浜嗘寮忕紪鍒躲��1849骞�8鏈�22鏃ワ紝鍦ㄦ剰澶у埄鐙珛鎴樹簤涓紝濂ュ湴鍒╁啗闃熷埄鐢�200鍙悐鏈夌偢寮圭殑绾歌川鐑皵鐞冿紝鏈熸湜瀵规按鍩庡▉灏兼柉杩涜杞扮偢锛屽悗鍥犻鍚戞敼鍙樺鑷磋桨鐐稿け璐ャ�備粠姝わ紝椋炶鍣ㄩ�愭笎婕斿彉鎴愭潃浼ゆ�ф鍣ㄣ�� + </p> + <p class="p-odd">1794骞�10鏈堬紝娉曞浗鍦ㄦ矙閲岀背椤挎垚绔嬩簡涓�鎵�鈥滃浗姘戣埅绌哄鏍♀�濓紝鐢ㄤ簬鍩瑰吇姘旂悆椋炶鍛橈紝杩欐槸涓栫晫涓婄涓�鎵�鑸┖瀛︽牎銆�</p> + <p class="p-odd"> + 姘旂悆寰堝揩琚簲鐢ㄤ簬绉戝瀹為獙棰嗗煙銆�1803骞达紝姣斿埄鏃朵汉缃椾集閫婂埄鐢ㄧ郴鐣欏紡姘旂悆灏嗚澶囪浇鍏�7000m楂樼┖杩涜浜嗙數鐏姳璇曢獙銆傛骞�6鏈�30鏃ワ紝淇勫浗钀ㄥ搱娲涘か闄㈠+涓庣綏浼�婂悎浣滆繘琛屼簡棣栨绉戝鎺㈢┖椋炶锛屼粬浠箻鍧愭皵鐞冮鍒颁簡2500m鐨勯珮绌猴紝杩涜浜嗙數纾佹晥搴斻�侀煶鍝嶇瓑绉戝瀹為獙锛屽苟澶氭閲囬泦绌烘皵鏍峰搧銆� + </p> + <h4 id="d004" class="p-odd">鍥涖�侀潤鍔涢琛屸�斺�旈鑹囨椂浠�</h4> + <p class="p-odd">灏界浜虹被鍒╃敤姘旂悆瀹炵幇浜嗛涓婅摑澶╃殑鎰挎湜锛屼絾鍦ㄥぉ绌轰腑鍙兘椋橀锛屽緢闅惧疄鐜板彲鎺у埗椋炶锛屼汉浠帰绱㈤琛岀殑鑴氭杩橀渶瑕佺户缁線鍓嶈繄杩涖��</p> + <p class="p-odd"> + 1784骞达紝娉曞浗闄嗗啗鍐涘畼姊呮柉娑呰鎯冲皢鍔ㄥ姏瑁呯疆瀹夎鍦ㄦ皵鐞冧笂锛屼娇涔嬫垚涓哄彲浠ヨ嚜鐢遍琛岀殑椋炶鍣紝骞剁粯鍒朵簡鑽夊浘銆備粬鍦ㄤ竴鍙洩鑼勫舰姘旂悆涓嬪畨瑁呭姩鍔涜缃紝杩欑椋炶鍣ㄨ绉颁负鈥滈鑹団�濓紙涔熸湁璧勬枡绉颁负鈥滄苯鑹団�濃�滈鑸光�濓級銆� + </p> + <p class="p-odd"> + 鍚屽勾锛屾硶鍥戒汉甯冩湕澶忓皵灏嗚繖绉嶈鎯充粯璇稿疄璺碉紝鍦ㄦ皵鐞冧笅鏂瑰畨瑁呬簡鐢ㄦ墜鎽囧姩鐨勮灪鏃嬫〃锛屽够鎯崇潃闈犲畠浜х敓鐨勬媺鍔涢瓒婅嫳鍚夊埄娴峰场銆傝櫧鐒惰繖绉嶈鎯充互澶辫触鍛婄粓锛屼絾瀹冩槸鍒╃敤椋炶墖鑷敱椋炶鐨勬渶鏃╁皾璇曘�傚悓骞�9鏈堬紝娉曞浗鐨勭綏浼壒鍏勫紵鍒堕�犲嚭涓�鑹樹互姘㈡皵涓哄~鍏呯墿鐨勨�滈鑹団�濓紝姘斿泭鍛堟祦绾垮瀷锛屽绉�940m<sup>3</sup>锛岀洿寰�2m鐨勭桓鍒剁┖姘旀〃闇�7浜烘憞鍔ㄣ�傝鈥滈鑹団�濊垂鍔涘湴銆佹姝壄鎵湴鑺�7灏忔椂鈥滈琛屸�濅簡鍑犲崈绫筹紝浠嶇劧杈句笉鍒拌嚜鐢遍琛岀殑鍒濊》銆� + </p> + <p class="p-odd"> + 1837骞达紝鑻卞浗浜轰箶娌宦峰嚡鍒╁紑濮嬬爺鍒堕鑹囥�備粬璁捐浜嗕互钂告苯鏈轰负鍔ㄥ姏甯﹀姩涓ゅ壇5鍙惰灪鏃嬫〃鐨勫師濮嬮鑹囷紝骞堕娆℃彁鍑轰簡椋炶墖鍒堕�犱腑瀵规皵鐞冪粨鏋勫竷灞�鍋氫竴瀹氭敼鍙樼殑鐞嗗康锛氱‖寮忕粨鏋勩�佸叏閲戝睘姘斿泭銆侀暱鍦嗗舰鍒嗛殧鑸便�傚敖绠¤璁℃渶鍚庢湭鑳藉疄鐜帮紝浣嗚繖涓�璁捐浣垮嚡鍒╂垚涓虹幇浠i鑹囪璁$殑榧荤銆� + </p> + <p class="p-odd">1852骞�9鏈�24鏃ワ紝娉曞浗浜轰酣鍒┞峰悏娉曞皵鎴愬姛璇曢浜嗕汉绫诲巻鍙蹭笂绗竴鑹樼湡 + </p> + </div> + </div> + </div> + <!-- 10椤� --> + <div class="page-box" page="18"> + <div v-if="showPageList.indexOf(18) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">010</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0022-1.jpg" /> + <p class="img">鍥�1-5 涓栫晫涓婄涓�鑹橀鑹�</p> + </div> + <span> + <p class="p-even td-0"> + 姝f剰涔変笂鐨勯鑹囷紙鍥�1-5锛夈�傞鑹囨憭寮冧簡鐞冨舰姘斿泭锛岄噰鐢ㄦ灒鏍稿舰姘斿泭锛岀敤涓�鍙�2200W鐨勮捀姹芥満椹卞姩鐩村緞涓�2.13m鐨勪笁鍙惰灪鏃嬫〃锛岄鑹囧畨瑁呬簡涓夎褰㈠熬鑸点�傚綋鏃ラ鑹囦粠宸撮粠璧烽锛屾椂閫熻揪鍒颁簡9.4km銆傜敱浜庢湭鑰冭檻鎿嶇旱闂锛岄鑹囪捣椋炲悗涓嶈兘杩斿洖鍑哄彂鍦扮偣锛岃�楁椂3h宸﹀彸椋炶浜嗙害28km锛岄檷钀藉湪鐗规媺鏅柉銆� + </p> + </span> + <p class="p-even"> + 1884骞�8鏈�9鏃ワ紝娉曞浗鍐涘畼璺撼寰峰拰鍏嬮噷甯冭瘯椋炰簡涓�鑹樹互钃勭數姹犱緵鐢电殑鈥滄硶鍏拌タ鈥濆彿鐢靛姩椋炶墖銆傝椋炶墖椋炵鍑哄彂鐐�4km鍚庤繑鑸紝椋炶楂樺害300m锛岄琛屾椂闂�25min锛屾渶楂樻椂閫熻揪鍒颁簡24km銆傞檷钀借繃绋嬩腑杩涜浜嗘暟娆″墠鍚庤浆鍔紝浠ュ鍑嗙潃闄嗗湴鐐癸紝椋炶墖缁堜簬杩涘叆浜嗗彲鎿嶇旱闃舵銆� + </p> + <p class="p-even">椋炶墖鐨勫嚭鐜帮紝浣夸汉绫昏繘鍏ヤ簡鑷敱椋炶鐨勬椂浠c��</p> + <p class="p-even"> + 鍦ㄩ鑹囩殑鍘嗗彶涓婏紝寰峰浗閫�褰瑰皢鍐涖�佺‖寮忛鑹囩殑鍙戞槑鑰呴綈鏌忔灄锛堝浘1-6锛夊皢椋炶墖鎺ㄥ埌浜嗗畠鐨勫彂灞曢《宄般�傞綈鏌忔灄浜�1900骞村埗閫犱簡绗竴鑹樼‖寮忛鑹囷紝1908骞村埗閫犱簡褰撴椂涓栫晫涓婃渶澶х殑椋炶墖LZ-4鍙枫�傚悗鏉ュ張鍒堕�犱簡LZ-5銆丩Z-6鍜孡Z-7鍙凤紝骞朵笌鑹捐偗绾冲崥澹悎浣滄垚绔嬩簡涓栫晫涓婄涓�瀹惰埅绌哄叕鍙糕�斺�斿痉鎷夋牸鍏徃锛�1909骞村紑濮嬩娇鐢ㄩ鑹囦粠浜嬭埅绌鸿繍杈撱�傞綈鏌忔灄閫濅笘鍚庯紝鑹捐偗绾冲崥澹喅瀹氬缓閫犲ぇ鍨嬪彲鐜悆椋炶鐨勯鑹囷紝寮�杈熸床闄呴暱閫斿杩愶紝骞朵簬1927骞�7鏈堝缓鎴愪簡鈥滄牸鎷夊か路榻愭煆鏋椻�濆彿椋炶墖锛�1929骞�8鏈堝畬鎴愪簡鐜悆椋炶銆傝繖涓�鏃舵湡鎴愪簡椋炶墖鐨勨�滈粍閲戞椂浠b�濄��1937骞�5鏈�6鏃ワ紝鐢卞痉鎷夋牸鍏徃鍒堕�犵殑鍙浇杩戠櫨浜鸿繘琛岃法娲嬮琛岀殑澶у瀷椋炶墖鈥滃叴鐧诲牎鈥濆彿鍦ㄧ編鍥芥柊娉借タ宸炶幈鍏嬭但鏂壒娴峰啗鍩哄湴鐫�闄嗘椂鍥犻潤鐢电伀鑺卞紩璧风垎鐐革紙鍥�1-7锛夛紝鍔犱笂杩欐椂椋炴満鎬ц兘鏈夋瀬澶ф彁楂橈紝椋炶墖閫�鍑轰簡鑸┖杩愯緭鐨勮垶鍙般�� + </p> + <div class="fl p-even"> + <span> + <p class="center openImgBox"><img class="img-b" alt="" + src="../../assets/images/0022-2.jpg" /></p> + <p class="img">鍥�1-6 榻愭煆鏋�</p> + </span> + <span> + <p class="center openImgBox"><img class="img-b" alt="" + src="../../assets/images/0022-3.jpg" /></p> + <p class="img">鍥�1-7 鈥滃叴鐧诲牎鈥濆彿椋炶墖澶变簨</p> + </span> + </div> + </div> + </div> + </div> + <!-- 11椤� --> + <div class="page-box" page="19"> + <div v-if="showPageList.indexOf(19) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">011</li> + </ul> + <div class="bodystyle"> + <h4 id="d005" class="p-odd">浜斻�佸姩鍔涢琛屾椂浠�</h4> + <p class="p-odd"> + 浜轰滑鍒╃敤杞讳簬绌烘皵鐨勬皵鐞冨拰椋炶墖瀹炵幇浜嗙勘缈旇摑澶╃殑鎰挎湜锛屼絾骞舵湭婊¤冻浜庣幇鐘惰�屽仠姝㈡帰绱㈤琛岀殑鑴氭銆傛帰绱㈣�呬滑鍙戠幇楦熸槸閲嶄簬绌烘皵鐨勶紝閭e氨蹇呯劧鑳藉鍒堕�犲嚭閲嶄簬绌烘皵鐨勮埅绌哄櫒锛屼娇浜哄儚楦熷効涓�鏍疯嚜鐢遍缈斻�備汉浠湭鑳藉埗閫犲嚭閲嶄簬绌烘皵鐨勮埅绌哄櫒锛屼笉鏄洜涓洪噸浜庣┖姘旂殑鑸┖鍣ㄤ笉鍙兘瀹炵幇锛岃�屾槸鎴戜滑杩樻湭鎵惧埌椋炶鐨勭湡璋涖�傝埅绌哄厛椹变滑缁忚繃涓嶅仠鍦版帰绱㈠拰涓嶆噲鍦板姫鍔涳紝寮�鍒涗簡鍔ㄥ姏锛堝埄鐢ㄧ┖姘斿拰鑸┖鍣ㄧ殑鐩稿杩愬姩浜х敓鐨勭┖姘斿姩鍔涳級椋炶鏃朵唬銆� + </p> + <p class="p-odd">鍦ㄩ噸浜庣┖姘旂殑鑸┖鍣ㄥ彂灞曞巻绋嬩笂锛岃绉颁负鈥滀笘鐣岃埅绌哄厛椹扁�濃�滆嫳鍥借埅绌轰箣鐖垛�濈殑钁楀悕绉戝瀹朵箶娌宦峰嚡鍒╋紙鍥�1-8锛夌殑鎴愬氨璁╀汉浠繄鍑轰簡瀹炶川鎬х殑 + </p> + <div class="img-float-medium openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0023-1.jpg" /> + <p class="img">鍥�1-8 涔旀不路鍑埄鍜岀涓�鏋跺叏灏哄杞戒汉婊戠繑鏈�</p> + </div> + <span> + <p class="p-odd td-0"> + 涓�姝ャ��1796骞达紝灏卞湪姘旂悆杞戒汉椋炶鎴愬姛鍚庝笉涔咃紝涔旀不路鍑埄璁捐銆佸埗閫犱簡浠ュ脊绨т负鍔ㄥ姏鐨勭洿鍗囨満妯″瀷锛屽苟璇曢鎴愬姛锛屾嵁璇村叾涓竴鏋舵浘椋炲埌25.5m鐨勯珮搴︺��3骞翠箣鍚庯紝浠栧張寮�濮嬭璁℃粦缈旀満锛�1804骞达紝浠栨妸椋庣瓭鏀瑰埗鎴愭満缈硷紝鍒舵垚浜嗙涓�鏋跺浐瀹氱考婊戠繑鏈烘ā鍨嬨�傚綋骞村勾搴曪紝涓轰簡娴嬮噺骞虫澘鏈虹考鐨勫崌鍔涘拰闃诲姏锛屼粬鍙堣嚜鍒朵簡鏃嬭噦鏈恒�傝繖浜涙棭鏈熺殑绌烘皵鍔ㄥ姏瀹為獙璁惧锛屽紑鍒涗簡鑸┖瀹為獙鐨勫厛娌炽��1809骞村瀛o紝鍑埄鍙堝湪绾﹀厠閮″埗鎴愪簡涓栫晫涓婄涓�鏋跺叏灏哄杞戒汉婊戠繑鏈恒�備粬鍒╃敤杩欐灦婊戠繑鏈鸿繘琛屾粦缈旇瘯楠岋紝澶氭鎴愬姛婊戠繑鍒扳�滃嚑鐮佽繙鈥濈殑鍦版柟鍘汇�傚洜姝ゆ湁浜虹О鍑埄涓衡�滄粦缈旀満鍒涘浜衡�濓紝灏辫繛鍚庢潵鐨勮幈鐗瑰厔寮熷浠栫殑鎴愬氨涔熷ぇ鍔犺禐瑾夈�傚悓骞达紝鍑埄杩樺彂琛ㄤ簡钁楀悕璁烘枃鈥斺�斻�婅绌轰腑鑸銆嬨�� + </p> + </span> + <p class="p-odd"> + 1849骞达紝涓�鍚�10宀佺敺瀛╀箻鍧愬嚡鍒╁埗閫犵殑绗竴鏋惰浇浜烘粦缈旀満锛岄�氳繃浜哄姏鐗靛紩銆佷粠灞卞潯涓婂悜涓嬫粦缈旈琛屾垚鍔燂紝椋炶楂樺害鍙湁鏁扮背銆�1853骞�8鏈堬紝宸茬粡80宀侀珮榫勭殑鍑埄鍒堕�犲嚭绗簩鏋跺彲杞戒汉鐨勬粦缈旀満锛屽苟鐢变粬鐨勯┈杞﹀か鍧愮潃杩欐灦婊戠繑鏈洪椋炶繃涓�涓皬灞辫胺锛岃繖鏄渶鏃╂湁鏄庣‘璁拌浇鐨勬垚骞翠汉涔樻粦缈旀満鑷敱椋炶銆� + </p> + <p class="p-odd">鍦ㄥ墠浜虹悊璁哄拰瀹炶返鐨勫奖鍝嶄笅锛屼竴浜涘皾璇曡�呰繕鍒朵綔浜嗗悇绉嶅悇鏍风殑椋炴満妯″瀷鏉ユ帰绱㈤琛屻��1840骞达紝鍦ㄥ嚡鍒╃殑褰卞搷涓嬶紝鑻卞浗鑸┖鍏堥┍濞佸粔路钀ㄥ鐖卞皵 + </p> + </div> + </div> + </div> + <!-- 12椤� --> + <div class="page-box" page="20"> + <div v-if="showPageList.indexOf(20) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">012</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 路浜ㄦ.寮�濮嬭瘯鍒堕鏈猴紝骞舵垚绔嬩簡鑷繁鐨勮埅绌鸿繍杈撳叕鍙搞��1847骞达紝浠栧埗閫犱簡涓�鏋跺悕涓衡�滈樋閲屽焹灏斺�濄�侀噸4.5kg鐨勭缉姣旈鏈烘ā鍨嬨�傚湪璇曢涓畠鍊熷姪鏂滃潯鍔╄窇璧烽锛屾浘椋炲埌19锝�24m杩溿��1858骞达紝娉曞浗娴峰啗鍐涘畼寰锋媺鍏嬮瞾鐡﹀埗閫犲嚭鐢卞彂鏉¢┍鍔ㄨ捣椋炵殑鍗曠考椋炴満妯″瀷锛屽崌绌哄悗鏀圭敤寰瀷钂告苯鏈烘帹鍔ㄥ墠杩涳紝杩欐槸绗竴鏋朵緷闈犺嚜韬姩鍔涜捣椋炵殑椋炴満妯″瀷銆� + </p> + <p class="p-even"> + 鍦ㄨ秺鏉ヨ秺澶氱殑婊戠繑鏈哄拰鏈夊姩鍔涚殑椋炴満妯″瀷璇曢鎴愬姛鍚庯紝浜轰滑鎰忚瘑鍒板彧瑕佸湪婊戠繑鏈轰笂瀹夎鍚堥�傜殑鍙戝姩鏈猴紝椋炴満椋炶鎴愬姛鐨勬ⅵ鎯冲氨鑳藉疄鐜般�備絾褰撴椂鐨勫姩鍔涘彧鑳介�夋嫨钂告苯鏈猴紝鍦ㄨ嫳鍥界殑浜ㄦ.鍒堕�犲嚭鈥滈樋閲屽焹灏斺�濋鏈烘ā鍨嬩箣鍓嶏紝浠栧拰鍔╂墜浜�1842骞村氨璁捐鍑哄悕涓衡�滅┖涓捀姹借溅鈥濈殑椋炴満锛堝浘1-9锛夛紝骞剁敵璇蜂簡鈥滈噸浜庣┖姘旂殑椋炶鍣ㄢ�濅笓鍒┿�傚敖绠¤繖鏋朵互钂告苯鏈轰负鍔ㄥ姏鐨勯琛屽櫒浠ュけ璐ュ憡缁堬紝浣嗗畠鏄汉绫诲椋炴満鎵�鍋氱殑鏃╂湡鐮旂┒鍜屾帰绱㈣瘯楠屼箣涓�銆傜洿鍒�1860 + </p> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0024-1.jpg" /> + <p class="img">鍥�1-9 浜ㄦ.鐨勨�滅┖涓捀姹借溅鈥�</p> + </div> + <span> + <p class="p-even td-0"> + 骞达紝娉曞浗浜鸿壘路鍕掑姫鐡﹀彂鏄庝簡浠ユ苯娌逛负鐕冩枡鐨勫唴鐕冩満锛屼娇浜虹被鍦ㄥ姩鍔涢鍩熷彂鐢熶簡闈╁懡鎬х殑椋炶穬锛屾墠浣跨湡姝f剰涔変笂鐨勯鏈鸿癁鐢熸垚涓哄彲鑳姐��1862骞达紝娉曞浗浜哄痉缃楀焹鎻愬嚭浜嗗洓鍐茬▼鍐呯噧鏈哄伐浣滃師鐞嗭紝骞跺湪4骞村悗鐢卞痉鍥戒汉濂ユ嫇鎴愬姛鍒堕�犲嚭涓栫晫涓婄涓�鍙板洓鍐茬▼姹芥补鍙戝姩鏈猴紝涓哄悗鏉ラ鏈虹殑鍙戞槑濂犲畾浜嗗姩鍔涘熀纭�銆傚湪椋炴満鍙戞槑鍚庣殑鍗婁釜涓栫邯閲岋紝娲诲寮忓彂鍔ㄦ満锛堟苯娌瑰唴鐕冩満锛夊嚑涔庢槸椋炴満鐨勫敮涓�鍔ㄥ姏銆� + </p> + </span> + <p class="p-even"> + 1891骞达紝缇庡浗鑸┖鍏堥┍鑰呭叞鍒╂暀鎺堝嚭鐗堜簡銆婄┖姘斿姩鍔涘璇曢獙銆嬩竴涔︺�備粬鍦ㄨ繛缁瘯楠屼簡鍑犲崄涓鏈烘ā鍨嬩箣鍚庯紝缁堜簬鍦�1896骞磋瘯椋炰簡绗竴鏋堕噰鐢ㄥ姛鐜囦负1hp<sup>鈶�</sup>鐨勮捀姹藉彂鍔ㄦ満椹卞姩鐨勯鏈烘ā鍨嬶紝缁忓脊灏勮捣椋炲悗鍙鍑�1600m杩溿��1898骞达紝浠栧緱鍒版斂搴�5涓囩編鍏冪殑璧勫姪锛岀敤浜庤浇浜洪鏈虹殑鐮斿埗锛屼絾鏈幏寰楁垚鍔熴�傚悗鏉ョ編鍥芥斂搴滃張澶氭娉ㄨ祫閲戝埌杞戒汉椋炴満鐨勭爺绌朵腑锛岄兘浠ュけ璐ュ憡缁堛��1901骞达紝鍏板埄鐮斿埗鐨勪互姹芥补鍐呯噧鏈轰负鍔ㄥ姏鐨勨�滅┖涓梾琛岃�呪�濆叏灏哄杞戒汉椋炴満澶氭璇曢鍧囧け璐ワ紝鏈�缁堟湭鑳介涓婂ぉ绌恒�傜編鍥芥斂搴滅粓姝簡瀵逛粬鐨勭粡娴庤祫鍔╋紝骞跺緱鍑虹粨璁猴細閲嶄簬绌烘皵鐨勮浇浜洪琛屽櫒鏄笉鍙兘鎴愬姛鐨勩�� + </p> + <p class="p-even">1903骞�12鏈�17鏃ワ紝寰疯缇庡浗浜恒�佽嚜琛岃溅淇悊鑰呭▉灏斾集路鑾辩壒鍜屽ゥ缁� + </p> + <hr class="ma-l"> + <p class="p-even note td-0"><a id="m1">鈶�</a> 1hp 鈮� 735W銆�</p> + </div> + </div> + </div> + <!-- 13椤� --> + <div class="page-box" page="21"> + <div v-if="showPageList.indexOf(21) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">013</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 灏斅疯幈鐗瑰厔寮熷湪缇庡浗鍖楀崱缃楁潵绾冲窞鐨勪竴涓彨鍩鸿拏闇嶅厠灏忛晣澶栫殑灞卞潯涓婏紝鎴愬姛璇曢浜嗕粬淇╃粡杩囧娆¤瘯楠屽悗鍒堕�犲嚭鐨勯潬鑷韩鍔ㄥ姏璧烽鐨勨�滈琛岃�呬竴鍙封�濓紙鍥�1-10鍜屽浘1-11锛夈�傜涓�娆¤瘯椋炵敱鍝ュ摜濞佸皵浼湪涓婂崍10鐐�35鍒嗗紑濮嬶紝椋炶浜�12s锛岄琛岃窛绂�36m銆備笅鍗堝紵寮熷ゥ缁村皵涔熻繘琛屼簡璇曢锛屽綋澶╀竴鍏辫瘯椋炰簡4娆★紝鐣欑┖鏈�闀跨殑涓�娆℃椂闂磋揪59s锛岄琛岃窛绂�260m銆傝繖鏋惰鏈�12hp娲诲寮忓彂鍔ㄦ満銆侀潬鑷韩鍔ㄥ姏璧烽鐨勨�滈琛岃�呬竴鍙封�濊鍏涓轰汉绫荤殑绗竴鏋堕鏈猴紝鑾辩壒鍏勫紵琚叕璁や负椋炴満鐨勫彂鏄庝汉銆傚彲鎯滃綋鏃剁編鍥芥斂搴滃垰寰楀嚭浜嗚浇浜洪鏈轰笉鍙兘鎴愬姛鐨勭粨璁猴紝濯掍綋涔熶笉鐩镐俊涓や釜鑷杞︿慨鐞嗗伐鑳芥垚灏变汉绫荤殑椋炶姊︽兂锛屾墍浠ョ涓�澶╄瘯椋炴病鏈夊獟浣撳弬涓庯紝鍙湁鍦ㄩ檮杩戝共娲荤殑鍑犱釜鍐滃か瑙佽瘉浜嗕汉绫昏繖涓�璺ㄦ椂浠e.涓俱�備粠姝わ紝浜虹被寰佹湇钃濆ぉ鐨勫ぇ骞曢�愭笎鎷夊紑鈥︹�� + </p> + <div class="fl"> + <span> + <p class="center openImgBox"><img class="img-a" alt="" + src="../../assets/images/0025-1.jpg" /></p> + <p class="img">鍥�1-10 鑾辩壒鍏勫紵鍜屸�滈琛岃�呬竴鍙封��</p> + </span> + <span> + <p class="center openImgBox"><img class="img-a" alt="" + src="../../assets/images/0025-2.jpg" /></p> + <p class="img">鍥�1-11 绗竴鏋堕鏈鸿瘯椋�</p> + </span> + </div> + <p class="p-odd"> + 鑾辩壒鍏勫紵鎺㈢储椋炶鎴愬姛涔嬪悗锛岄檰闄嗙画缁湁鏇村鐨勫厛椹变滑涔熷埗閫犲苟鎴愬姛璇曢浜嗚嚜宸辩殑椋炴満锛岄鏈烘�ц兘瓒婃潵瓒婂ソ锛氶�熷害瓒婃潵瓒婂揩銆侀珮搴﹁秺鏉ヨ秺楂樸�佽埅绋嬭秺鏉ヨ秺杩溾�︹��1909骞�7鏈�25鏃ワ紝娉曞浗鏃╂湡椋炶瀹跺竷鑾遍噷濂ラ┚椹惰嚜宸卞埗閫犵殑鈥滃竷鑾遍噷濂モ叀鍨嬧�濋鏈猴紙鍥�1-12锛夛紝鍘嗘椂37min浠庢硶鍥藉姞鑾遍鍒拌嫳鍥藉浣涳紝鎴愬姛椋炶秺鑻卞悏鍒╂捣宄★紝鎴愬氨浜嗕汉绫荤殑绗竴娆″浗闄呴琛岋紝涔熷洜姝よ幏寰椾簡鑻卞浗銆婃瘡鏃ラ偖鎶ャ�嬫彁渚涚殑1000鑻遍晳濂栭噾銆� + </p> + <p class="p-odd"> + 娓呮湞鏈勾锛岃タ鏂圭殑鑸┖鐭ヨ瘑闄嗙画浼犲叆鎴戝浗銆傚厛鏄姤绾搞�佹潅蹇椾笂鍑虹幇浜嗚埅绌烘柊闂汇�佺粯鐢诲拰鐩稿叧鏂囩珷锛岀劧鍚庢槸涓�浜涘鍥介琛屽鏉ユ垜鍥借繘琛岄琛岃〃婕旓紱鎴戝浗鏀垮簻娲剧暀瀛︾敓鍑哄浗瀛︿範鑸┖涓撲笟鐭ヨ瘑锛岃喘涔版皵鐞冨拰椋炴満銆傛鍚庯紝渚挎槸鏃呭眳娴峰鐨勪腑鍥戒汉寮�濮嬭璁°�佸埗閫犻鑹囧拰椋炴満锛屽苟灏嗛鏈鸿璁°�佸埗閫犳妧鏈紩鍏ュ浗鍐呫�傝繖浜涙帰绱㈣�呭皢鑷繁鐨勫悕瀛楀啓鍏ヤ簡鎴戝浗鑸┖鍙插唽锛屼粬浠槸鍗� + </p> + </div> + </div> + </div> + <!-- 14椤� --> + <div class="page-box" page="22"> + <div v-if="showPageList.indexOf(22) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">014</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">铇呰姵銆佽阿缂垫嘲銆佸垬浣愭垚銆佹潕瀹濈剬銆佸啹濡傘�佽碍鏍广�佹灄绂忎簯銆佸帀姹濈嚂銆佹綐涓栧繝銆佺帇鏌扁�︹��</p> + <p class="p-even"> + 20涓栫邯鍒濓紝浠庝簨椋炴満璁捐鍒堕�犲拰瀛︿範椋炶鐨勫崕渚ㄤ笌涓浗鐣欏鐢熶腑锛屽啹濡傦紙鍥�1-13锛夌殑鎴愬氨鏈�涓虹獊鍑恒�傚啹濡傛槸鎴戝浗鍒涘椋炶澶у锛屼篃鏄垜鍥芥渶鏃╃殑椋炴満璁捐甯堛�傚啹濡�1883骞村嚭鐢熶簬骞夸笢鏈夊悕鐨勪鲸涔♀�斺�旀仼骞筹紝浠庡皬灏卞椋炲ぉ绁炶瘽婊″績鍚戝線锛屼粬鍗佸嚑宀佹椂闅忚垍鐖舵紓娲嬭繃娴凤紝鍒扮編鍥借皨鐢熴�傚悗鏉ョ粡杩囧崄骞寸殑瀛︿範鍜岀Н绱紝鍐绮鹃�氫簡鏈烘鍜岀數鏈烘柟闈㈢殑涓撲笟鐭ヨ瘑锛屽苟鑳界啛缁冨湴璁捐鍜屽埗閫犲皬鍨嬪彂鐢垫満銆佹娊姘存満浠ュ強鏃犵嚎鐢垫姤鏈虹瓑锛屽湪缇庡浗棰囨湁澹版湜銆�1903骞达紝鑾辩壒鍏勫紵鐨勯鏈鸿瘯椋炴垚鍔燂紝鍐娣卞彈榧撹垶锛岀珛蹇楀埗閫犻鏈恒�傚湪褰撳湴鍗庝鲸鐨勫府鍔╀笅锛屽啹濡備簬1907骞村湪缇庡浗寤洪鏈哄巶锛屽紑濮嬪埗閫犻鏈恒��1909骞达紝鍐鐮斿埗鍑轰竴鏋跺弻缈奸鏈猴紝骞朵簬褰撳勾9鏈堟垚鍔熻瘯椋炪�傝繖鏄腑鍥戒汉绗竴娆¢┚椹惰嚜宸辫璁°�佸埗閫犵殑椋炴満椋炶銆傛嵁璁拌浇锛岃椋炴満鐨勬�ц兘宸茶揪鍒板綋鏃朵笘鐣屾渶鍏堣繘姘村钩銆傚啹濡傜殑椋炴満璇曢鎴愬姛鍚庯紝瀛欎腑灞遍椈涔嬫鍠滆嫢鐙傦紝浠诲懡鍐涓哄箍涓滈潻鍛藉啗椋炶闃熼暱锛屾嫑鍏跺洖鍥姐�傚洖鍥藉悗锛屽啹濡傚湪骞夸笢鐕曞寤虹珛璧峰箍涓滈琛屽櫒鍏徃锛岃繖鏄垜鍥界浜屽椋炴満鍒堕�犲叕鍙革紙绗竴瀹朵负1910骞存竻鏀垮簻寮�鍔炵殑鍗楄嫅椋炴満宸ュ巶锛夈��1912骞�3鏈堬紝鍐鍦ㄧ嚂濉樺埗閫犲嚭浜嗘垜鍥芥湰鍦熺殑绗竴鏋堕鏈恒�備笉骞哥殑鏄紝1912骞�8鏈堬紝鍐鍦ㄧ嚂濉樿繘琛岄琛岃〃婕旀椂鍥犻鏈哄け浜嬮亣闅撅紝骞翠粎29宀併��<sup>鈶�</sup> + </p> + <div class="fl"> + <span> + <p class="center openImgBox"><img class="img-a" alt="" + src="../../assets/images/0026-1.jpg" /></p> + <p class="img">鍥�1-12 甯冭幈閲屽ゥ鈪″瀷椋炴満浠垮埗鍝�</p> + </span> + <span> + <p class="center openImgBox"><img class="img-a" alt="" + src="../../assets/images/0026-2.jpg" /></p> + <p class="img">鍥�1-13 鍐閾滃儚</p> + </span> + </div> + <p class="p-even"> + 鎺㈢储绮剧鏄垜浠汉绫绘墍鍏辨湁鐨勶紝骞朵笉鏄彂鏄庡銆佺瀛﹀鐨勪笓鍒┿�備妇涓畝鍗曠殑浜嬩緥锛屽皬鏃跺�欙紝浣犵涓�娆℃嬁鍒版牳妗冿紝鐪嬪埌鍒汉鍦ㄥ悆锛岃嚜宸变篃寰堟兂鍚冦�備絾鏍告鏈夌‖澹筹紝浣犲彲鑳界敤鐭冲ご绛夌‖鐗╁幓鐮哥鏍告锛岀劧鍚庝綘鍙戠幇杩欐牱鏍告浠佷篃琚牳纰庝簡銆備綘鎯崇敤鍏朵粬鐨勬柟娉曞幓鎵撳紑鏍告锛岃繖灏辨槸鎺㈢储銆� + </p> + <hr class="ma-l"> + <p class="p-even note td-0"><a id="m1">鈶�</a> 娌堟捣鍐涳細銆婁腑鍥借埅绌虹畝鍙层�嬶紝9锝�10椤碉紝鍖椾含锛岃埅绌哄伐涓氬嚭鐗堢ぞ锛�2020銆�</p> + </div> + </div> + </div> + <!-- 15椤� --> + <div class="page-box" page="23"> + <div v-if="showPageList.indexOf(23) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">015</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 浜烘湁鍒簬鍦扮悆涓婄殑鍏朵粬鍔ㄧ墿锛屼汉鏄細涓嶆柇瀛︿範銆佷笉鏂帰绱㈢殑銆傚ぇ鍗冧笘鐣岋紝鏃犲涓嶆湁銆備笘鐣屼笂杩樻湁寰堝鏈В涔嬭皽姝g瓑寰呬汉浠幓鎺㈢储銆佺牬瑙c�傚彜鑰佺殑鏃朵唬锛屼汉浠�绘槸琚竴浜涘鎬殑銆佽嚜宸变笉鑳借В閲婄殑鐜拌薄鎵�鍚稿紩锛岀劧鍚庨�氳繃鑷繁鐨勫姫鍔涘幓鎻紑璋滃洟锛岃繖浠庝晶闈㈠弽鏄犱簡浜轰滑瀵圭绉樹笘鐣岃繘琛屾帰绱㈢殑娓存湜銆傛墍浠ワ紝涓�涓汉濡傛灉鏈夊緢寮虹殑鎺㈢储鎰忓康锛屾垨璁镐細鍙戠幇涓�浜涜鍏朵粬浜哄拷鐣ョ殑涓滆タ銆傚笇鏈涘ぇ瀹堕兘鑳藉涔犲厛椹变滑鐨勬帰绱㈢簿绁烇紝鍘绘帰绱㈠拰鍙戠幇鏈煡涓栫晫鐨勫ゥ绉樸�� + </p> + </div> + </div> + </div> + <!-- 16椤� --> + <div class="page-box" page="24"> + <div v-if="showPageList.indexOf(24) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">016</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even">瀛︿範浠诲姟浜�<br />璁よ瘑鑸┖涓氱殑绉嶇被</h3> + <div class="task ma-l"></div> + <p class="p-even"> + 鑸┖涓氬彂灞曞垵鏈燂紝鍙槸涓�涓崟涓�鐨勮涓氾紝鑸┖鐖卞ソ鑰呰嚜宸辫璁¢鏈恒�佸埗閫犻鏈恒�侀┚椹堕鏈哄拰缁存姢椋炴満銆傞殢鐫�鑸┖鍒堕�犳妧鏈殑涓嶆柇鍙戝睍锛岄鏈虹殑鏁伴噺瓒婃潵瓒婂锛岃埅绌哄櫒琚箍娉涘簲鐢ㄥ埌浜嗗悇涓鍩燂紝浠庝簨鑸┖涓氱殑浜哄憳瓒婃潵瓒婂锛岃埅绌轰笟鎴愪负20涓栫邯浜虹被璁よ瘑鍜屾敼閫犺嚜鐒舵椿鍔ㄦ渶娲昏穬銆佹渶鏈夊奖鍝嶇殑浜т笟锛屼篃鏄汉绫绘枃鏄庨珮搴﹀彂杈剧殑閲嶈鏍囧織锛岃埅绌轰笟鐨勫垎宸ヤ篃瓒婃潵瓒婄粏鍖栥�� + </p> + <h4 id="d006" class="p-even">涓�銆佽埅绌轰笟鐨勫垎绫�</h4> + <p class="p-even">浠�20涓栫邯20骞翠唬寮�濮嬶紝鑸┖涓氬垎鎴愪簡涓変釜鏃㈢浉瀵圭嫭绔嬪張绱у瘑鑱旂郴鐨勮涓氾細鑸┖鍣ㄥ埗閫犱笟銆佸啗浜嬭埅绌恒�佹皯鐢ㄨ埅绌恒��</p> + <p class="p-even"> + 鑸┖鍣ㄥ埗閫犱笟鏄暣涓埅绌轰笟鐨勫熀纭�锛屾病鏈夎埅绌哄櫒鍒堕�犱笟锛屾墍鏈夌殑鑸┖娲诲姩閮芥垚浜嗘棤婧愪箣姘淬�佹棤鏈箣鏈ㄣ�傝埅绌哄櫒鍒堕�犱笟鏄満姊板埗閫犻鍩熶腑鐨勯噸瑕佺粍鎴愰儴鍒嗭紝瀹冪爺绌跺拰浣跨敤鏈�鏂版妧鏈紝鍒堕�犲嚭閫傜敤浜庡悇绉嶇洰鐨勭殑鑸┖鍣ㄤ互鍙婇厤濂楄澶囷紝渚涙皯鐢ㄨ埅绌恒�佸啗浜嬭埅绌轰娇鐢ㄣ�傛皯鐢ㄨ埅绌哄櫒鐨勪袱澶у埗閫犲晢鏄編鍥界殑娉㈤煶鍏徃鍜屾娲茬殑绌轰腑瀹㈣溅鍏徃锛屼腑鍥藉晢鐢ㄩ鏈烘湁闄愯矗浠诲叕鍙告鍦ㄥ璧风洿杩斤紝鏈夋湜鎴愪负鍏ㄧ悆绗笁澶ф皯鐢ㄨ埅绌哄櫒鍒堕�犲晢銆� + </p> + <p class="p-even"> + 鍐涗簨鑸┖鏄敤浜庡啗浜嬬洰鐨勭殑涓�鍒囪埅绌烘椿鍔紝涓昏鍖呮嫭浣滄垬銆佷睛瀵熴�佽繍杈撱�佽鎴掋�佽缁冨拰鑱旂粶鏁戠敓绛夋柟闈€�傚啗浜嬭埅绌虹殑涓昏閮ㄥ垎鏄┖鍐涳紝娴峰啗鍜岄檰鍐涜埅绌哄叺涔熷崰鏈夐噸瑕佺殑鍦颁綅锛岃瀵熷拰娴峰叧鍒╃敤鑸┖鍣ㄦ墦鍑荤姱缃拰璧扮锛屼篃灞炰簬鍐涗簨鑸┖鐨勮寖鐣淬�� + </p> + <p class="p-even">姘戠敤鑸┖绠�绉版皯鑸紝鏄埄鐢ㄥ悇绉嶈埅绌哄櫒浠庝簨鍐涗簨鎬ц川浠ュ鐨勬墍鏈夎埅绌烘椿鍔ㄧ殑鎬荤О銆傚浘1-14锝炲浘1-17鍧囧睘浜庢皯鐢ㄨ埅绌鸿涓氥��</p> + <div class="bk"> + <p><b>鑰冭瘉鎸囧崡锛氱┖娓湇鍔$鐞嗗笀鑰冮</b></p> + <p class="block">浠�20涓栫邯20骞翠唬寮�濮嬶紝鑸┖涓氬垎鎴愪簡涓変釜鏃㈢浉瀵圭嫭绔嬪張绱у瘑鑱旂郴鐨勮涓氾紝鍒嗗埆鏄紙銆�銆�锛夈�傦紙澶氶�夐锛� + </p> + <p class="block"> + <input type="checkbox" value="A" name="ball1" :disabled="questionData.check.isComplete" + v-model="questionData.check.value" @change="saveCheckChoice" /> + A.鑸┖鍣ㄥ埗閫犱笟 + <span> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'A' + ) + " t="1716986419862" class="icon" viewBox="0 0 1820 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="18767" + xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'A' + ) == false + " t="1716987085767" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + <p class="block"> + <input type="checkbox" value="B" name="ball2" :disabled="questionData.check.isComplete" + v-model="questionData.check.value" @change="saveCheckChoice" /> + B.鍐涗簨鑸┖ + <span> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'B' + ) + " t="1716986419862" class="icon" viewBox="0 0 1820 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="18767" + xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'B' + ) == false + " t="1716987085767" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + <p class="block"> + <input type="checkbox" value="C" name="ball3" :disabled="questionData.check.isComplete" + v-model="questionData.check.value" @change="saveCheckChoice" /> + C.姘戠敤鑸┖ + <span> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'C' + ) + " t="1716986419862" class="icon" viewBox="0 0 1820 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="18767" + xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'C' + ) == false + " t="1716987085767" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + <p class="block"> + <input type="checkbox" value="D" name="ball4" :disabled="questionData.check.isComplete" + v-model="questionData.check.value" @change="saveCheckChoice" /> + D.閫氱敤鑸┖ + <span> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'D' + ) + " t="1716986419862" class="icon" viewBox="0 0 1820 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="18767" + xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if=" + questionData.check.isComplete && + isShowRight( + questionData.check.answer, + questionData.check.value, + 'D' + ) == false + " t="1716987085767" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + <p class="event-header-text-bc pd-5 fl jc-sa" style="margin-left: 8px; width: 93%" + v-if="showCheckAnswer"> + <span class="c-g"> 绛旀锛欰BC </span> + <span>鎮ㄧ殑绛旀锛� + <span v-for="(item, index) in questionData.check.value" :key="index"> + {{ item }} + </span> + </span> + </p> + <!-- 鎻愪氦鎸夐挳 --> + <div class="w100 fl ju-cn"> + <ul class="fl ju-ev w80 choice"> + <li> + <button class="btn-border btn-w" @click="goCheckJudge"> + 鎻愪氦 + </button> + </li> + <li> + <button @click="changeCheckData" class="btn-border btn-w"> + 閲嶅仛 + </button> + </li> + <li> + <button @click="showCheckAnswer = !showCheckAnswer" class="parimary-btn"> + 鏌ョ湅绛旀 + </button> + </li> + </ul> + </div> + </div> + </div> + </div> + </div> + <!-- 17椤� --> + <div class="page-box" page="25"> + <div v-if="showPageList.indexOf(25) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">璧拌繘鑸┖涓�</li> + <li class="headerNumber">017</li> + </ul> + <div class="bodystyle"> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox "> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0029-1.jpg" /> + <p class="img">鍥�1-14 鑸┖杩愯緭</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0029-2.jpg" /> + <p class="img">鍥�1-15 妫灄鐏伀</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0029-3.jpg" /> + <p class="img">鍥�1-16 鎶㈤櫓鏁戠伨</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <h4 id="d007" class="p-odd">浜屻�佹皯鐢ㄨ埅绌虹殑鍒嗙被</h4> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0029-4.jpg" /> + <p class="img">鍥�1-17 椋炶鍛樺煿璁�</p> + </div> + <span> + <p class="p-odd"> + 鏍规嵁涓氬姟鑼冨洿涓嶅悓锛屾皯鐢ㄨ埅绌哄彲鍒嗕负鍟嗕笟鑸┖鍜岄�氱敤鑸┖涓ゅぇ绫汇�� + </p> + </span> + <span> + <p class="p-odd"> + 鍟嗕笟鑸┖鍙堝彨鑸┖杩愯緭锛屾槸鍒╃敤鑸┖鍣ㄤ粠浜嬬殑浠ヨ惀鍒╀负鐩殑鐨勫璐ц繍杈撴椿鍔ㄣ�傚晢涓氳埅绌烘槸浜ら�氳繍杈撲笟鐨勪竴涓噸瑕佺粍鎴愰儴鍒嗭紝涓庨搧璺�佸叕璺�佹按璺拰绠¢亾杩愯緭鍏卞悓缁勬垚浜嗗浗瀹剁殑浜ら�氳繍杈撶郴缁熴�傜敱浜庡叾杈冨揩鐨勯�熷害銆佽繙璺濈杩愯緭鑳藉姏寮恒�佸缓璁惧懆鏈熺煭浠ュ強鍏锋湁杈冮珮鐨勬晥鐩婄瓑浼樼偣锛屽晢涓氳埅绌哄湪杩愯緭涓氫腑鎵�鍗犵殑姣旈噸涓嶆柇鎻愬崌锛屽苟涓斿湪缁忔祹鍏ㄧ悆鍖栫殑娴疆涓拰鍥介檯浜ゅ線涓彂鎸ョ潃涓嶅彲鏇夸唬鐨勪綔鐢ㄣ�� + </p> + </span> + <p class="p-odd">闄ゅ晢涓氳埅绌哄鐨勬皯鐢ㄨ埅绌洪儴鍒嗙粺绉伴�氱敤鑸┖锛屽畠鍖呯綏鐨勫唴瀹广�佽寖鍥撮潪甯稿箍娉涖�傛寜鐓у浗闄呮皯鑸粍缁囷紙International Civil Aviation + Organization锛孖CAO锛夌殑鍒嗙被锛岄�氱敤鑸┖鍙堝垎涓鸿埅绌轰綔涓氬拰鍏朵粬绫婚�氱敤鑸┖涓や釜閮ㄥ垎銆�</p> + <p class="p-odd"> + 鑸┖浣滀笟鏄寚鍒╃敤鑸┖鍣ㄨ繘琛屼笓涓氭�ф搷浣滐紝涓哄伐涓氥�佸啘涓氫互鍙婂叾浠栬涓氭彁渚涜埅绌烘敮鎻寸殑娲诲姩锛屼富瑕佸寘鎷伐涓氳埅绌恒�佸啘涓氳埅绌恒�佽埅绌虹鐮斿拰鎺㈤櫓娲诲姩浠ュ強鍦ㄦ悳瀵汇�佹晳鍔┿�佽埅鎷嶇瓑鍏朵粬棰嗗煙鐨勮繍鐢ㄣ�傚叾浠栫被閫氱敤鑸┖鍖呮嫭鍏姟鑸┖銆佺浜鸿埅绌恒�侀琛岃缁冨拰鑸┖浣撹偛娲诲姩绛夈�� + </p> + <div class="bk"> + <p><b>鑰冭瘉鎸囧崡锛氱┖娓湇鍔$鐞嗗笀鑰冮</b></p> + <p class="block">鍥介檯姘戣埅缁勭粐绠�绉帮紙銆�銆�锛夈�傦紙鍗曢�夐锛� + </p> + <p class="block"> + <input type="radio" value="A" name="toobusy" + :disabled="questionData.inputChoiceData.isComplete" + v-model="questionData.inputChoiceData.value.userAnswer" @change="saveInputChoice" /> + A.IATA + </p> + <p class="block"> + <input type="radio" value="B" name="toobusy" + :disabled="questionData.inputChoiceData.isComplete" + v-model="questionData.inputChoiceData.value.userAnswer" @change="saveInputChoice" /> + B.ICAO + </p> + <p class="block"> + <input type="radio" value="C" name="toobusy" + :disabled="questionData.inputChoiceData.isComplete" + v-model="questionData.inputChoiceData.value.userAnswer" @change="saveInputChoice" /> + C.SITA + </p> + <p class="block"> + <input type="radio" value="D" name="toobusy" + :disabled="questionData.inputChoiceData.isComplete" + v-model="questionData.inputChoiceData.value.userAnswer" @change="saveInputChoice" /> + D.STAR + </p> + <p class="event-header-text-bc pd-5 fl jc-sa" style="margin-left: 8px; width: 93%" + v-if="showChoiceAnswer"> + <span class="c-g"> 绛旀锛欱 </span> + <span + :class="{ 'c-g': questionData.inputChoiceData.value.isRight, 'c-r': questionData.inputChoiceData.value.isRight == false }">鎮ㄧ殑绛旀锛歿{ + questionData.inputChoiceData.value.userAnswer + }}</span> + <span class="icon-box-big fl al-c"> + <svg v-if="questionData.inputChoiceData.value.isRight" t="1716986419862" class="icon" + viewBox="0 0 1820 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" + p-id="18767" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if="questionData.inputChoiceData.value.isRight == false" t="1716987085767" + class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + <!-- 鎻愪氦鎸夐挳 --> + <div class="w100 fl ju-cn"> + <ul class="fl ju-ev w80 choice"> + <li> + <button class="btn-border btn-w" @click="goChoiceJudge"> + 鎻愪氦 + </button> + </li> + <li> + <button @click="changeChoiceData" class="btn-border btn-w"> + 閲嶅仛 + </button> + </li> + <li> + <button @click="showChoiceAnswer = !showChoiceAnswer" class="parimary-btn"> + 鏌ョ湅绛旀 + </button> + </li> + </ul> + </div> + </div> + </div> + </div> + </div> + <!-- 18椤� --> + <div class="page-box" page="26"> + <div v-if="showPageList.indexOf(26) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">018</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <div class="fl al-c mb-10"> + <div class="bj4-xyx"> + 鐩稿叧<br>閾炬帴 + </div> + <div class="bj4-xyx-icon"> + 鈻� 鈻� + </div> + <p><b style="color: #5192C6">鑸┖浣滀笟</b></p> + </div> + <p class="block">宸ヤ笟鑸┖锛氫娇鐢ㄨ埅绌哄櫒杩涜鐨勪笌宸ョ熆鏈夊叧鐨勬椿鍔紝涓昏鏈夎埅绌烘媿鎽勩�佽埅绌烘祴缁橈紙鍥�1-18锛夌瓑銆�</p> + <p class="block">鍐滀笟鑸┖锛氫娇鐢ㄨ埅绌哄櫒杩涜鐨勪笌鍐滄灄鐗ф笖鏈夊叧鐨勬椿鍔紝涓昏鏈夐鎾�佹.鏋楃伃鐏�佸柗娲掑啘鑽紙鍥�1-19锛夌瓑銆�</p> + <p class="block">鑸┖绉戠爺鍜屾帰闄╂椿鍔細涓昏鍖呮嫭鏂伴鏈虹殑璇曢銆佹柊鎶�鏈殑楠岃瘉銆佸ぉ鏂囪娴嬶紝濡傛皵璞¤娴嬶紙鍥�1-20锛夈�佺┖涓�冨彜銆�</p> + <p class="block">闅忕潃鏃犱汉鏈虹殑蹇�熷彂灞曪紝鐜板湪鐭窛绂荤殑閫氱敤鑸┖涓氬姟锛屽閬ユ劅銆佽埅鎷嶃�侀鎾�佸柗娲掑啘鑽瓑涓氬姟宸查�愭笎琚棤浜烘満鍙栦唬銆�</p> + <div class="fl"> + <span> + <p class="center openImgBox"><img class="img-a" alt="" + src="../../assets/images/0030-1.jpg" /></p> + <p class="img">鍥�1-18 鑸┖娴嬬粯</p> + </span> + <span> + <p class="center openImgBox"><img class="img-a" alt="" + src="../../assets/images/0030-2.jpg" /></p> + <p class="img">鍥�1-19 鍠锋磼鍐滆嵂</p> + </span> + <span> + <p class="center openImgBox"><img class="img-a" alt="" + src="../../assets/images/0030-3.jpg" /></p> + <p class="img">鍥�1-20 姘旇薄瑙傛祴</p> + </span> + </div> + </div> + <h4 id="d008" class="p-even">涓夈�佹皯鑸郴缁熺殑缁勬垚</h4> + <p class="p-even">姘戣埅绯荤粺鐢辨斂搴滈儴闂ㄣ�佹皯鑸紒涓氬拰姘戠敤鏈哄満涓夊ぇ閮ㄥ垎缁勬垚銆�</p> + <p class="p-even"> + 鏀垮簻閮ㄩ棬涓昏瀹炴柦瀵规皯鑸殑绠$悊銆傛皯鑸瀹夊叏瑕佹眰楂橈紝涓旀秹鍙婂浗瀹朵富鏉冨拰浜ゅ線鐨勪簨鍔″锛屽繀椤昏繘琛屼弗鏍兼湁鏁堢殑绠$悊銆佽繀閫熺殑鍗忚皟鍜岀粺涓�璋冨害锛屽洜姝ゅ嚑涔庢墍鏈夊浗瀹堕兘璁剧珛浜嗙嫭绔嬬殑鏀垮簻鏈烘瀯鏉ョ鐞嗘皯鑸紝鎴戝浗鐢变腑鍥芥皯鐢ㄨ埅绌哄眬鏉ヨ礋璐f皯鑸鐞嗐�� + </p> + <p class="p-even"> + 姘戣埅浼佷笟鍖呮嫭浠庝簨鍜屾皯鑸湁鍏充笟鍔$殑鍚勭被浼佷笟锛屾渶涓昏鐨勬槸鎴戜滑甯歌鐨勮埅绌哄叕鍙革紝瀹冧滑鍒╃敤鑸┖鍣ㄤ粠浜嬬敓浜ц繍杈擄紝鏄皯鑸敓浜ф敹鍏ョ殑涓昏鏉ユ簮銆傞櫎鑸┖鍏徃澶栵紝姘戣埅浼佷笟杩樻湁璇稿鑸潗銆侀攢鍞�侀�氱敤鑸┖绛夐儴鍒嗐��</p> + <p class="p-even"> + 鏈哄満鏄皯鑸拰鏁翠釜绀句細鐨勭粨鍚堢偣锛屼篃鏄竴涓湴鍖虹殑鍏紬鏈嶅姟璁炬柦涔嬩竴锛屽洜姝ゅ畠鏃㈠甫鏈夎惀鍒╃殑浼佷笟鎬ц川锛屽張鏈変负鍦板尯鍏紬鏈嶅姟鐨勪簨涓氭�ц川銆備笘鐣屼笂澶у鏁版皯鐢ㄦ満鍦烘槸鍦ㄥ湴鏂规斂搴滅杈栦箣涓嬬殑鍗婁紒涓氬崐鍏叡鏈嶅姟鎬ц川鐨勬満鏋勩�� + </p> + </div> + </div> + </div> + <!-- 19椤� --> + <div class="page-box" page="27"> + <div v-if="showPageList.indexOf(27) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -78,8 +925,8 @@ </div> </div> <!-- 20椤� --> - <div class="page-box" page="11"> - <div v-if="showPageList.indexOf(11) > -1"> + <div class="page-box" page="28"> + <div v-if="showPageList.indexOf(28) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">020</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> @@ -95,9 +942,6 @@ 闅忓悗锛屾皯鐢ㄨ埅绌鸿埅绾跨綉缁滆繀閫熶粠娆ф床鎵╁睍鍒颁簡鍖楃編銆佷簹娲层�侀潪娲诧紝鏈�鍚庡彂灞曞埌鍏ㄧ悆鍚勫湴锛屾垜鍥戒簬1920骞村紑閫氫簡鍖椾含鍜屽ぉ娲ヤ箣闂寸殑绗竴鏉″浗鍐呰埅绾裤�傜劧鑰岃繖涓�鏃舵湡鐨勬皯鑸繍杈擄紝鍑犱箮閮戒簭鏈紝闈犳斂搴滃拰鍏朵粬鏈烘瀯鐨勮ˉ璐寸淮鎸佺潃锛屽叾鏀挎不鍜屽啗浜嬫剰涔夎繙澶т簬缁忔祹鎰忎箟銆傜洿鍒扮編鍥介亾鏍兼媺鏂琛屽櫒鍏徃1935骞村埗閫犵殑DC-3椋炴満锛堝浘1-21锛夊嚭鐜版墠鎵浆浜嗚繖涓�灞�闈紝椋炴満閫氳繃鑸┖杩愯緭涔熻兘璧氶挶锛孌C-3椋炴満鍥犳鑾峰緱浜嗏�滅涓�绉嶈兘璧氶挶鐨勯鏈衡�濈殑缇庡悕銆�1937骞达紝澶у瀷椋炶墖鈥滃叴鐧诲牎鈥濆彿澶变簨锛屼娇椋炶墖閫�鍑轰簡鑸┖杩愯緭鑸炲彴锛屽競鍦轰唤棰濊椋炴満鐙徑锛屼績杩涗簡DC-3杩愯緭鏈虹殑鎺ㄥ箍銆� </p> </span> - <p class="p-even"> - 闅忓悗锛屾皯鐢ㄨ埅绌鸿埅绾跨綉缁滆繀閫熶粠娆ф床鎵╁睍鍒颁簡鍖楃編銆佷簹娲层�侀潪娲诧紝鏈�鍚庡彂灞曞埌鍏ㄧ悆鍚勫湴锛屾垜鍥戒簬1920骞村紑閫氫簡鍖椾含鍜屽ぉ娲ヤ箣闂寸殑绗竴鏉″浗鍐呰埅绾裤�傜劧鑰岃繖涓�鏃舵湡鐨勬皯鑸繍杈擄紝鍑犱箮閮戒簭鏈紝闈犳斂搴滃拰鍏朵粬鏈烘瀯鐨勮ˉ璐寸淮鎸佺潃锛屽叾鏀挎不鍜屽啗浜嬫剰涔夎繙澶т簬缁忔祹鎰忎箟銆傜洿鍒扮編鍥介亾鏍兼媺鏂琛屽櫒鍏徃1935骞村埗閫犵殑DC-3椋炴満锛堝浘1-21锛夊嚭鐜版墠鎵浆浜嗚繖涓�灞�闈紝椋炴満閫氳繃鑸┖杩愯緭涔熻兘璧氶挶锛孌C-3椋炴満鍥犳鑾峰緱浜嗏�滅涓�绉嶈兘璧氶挶鐨勯鏈衡�濈殑缇庡悕銆�1937骞达紝澶у瀷椋炶墖鈥滃叴鐧诲牎鈥濆彿澶变簨锛屼娇椋炶墖閫�鍑轰簡鑸┖杩愯緭鑸炲彴锛屽競鍦轰唤棰濊椋炴満鐙徑锛屼績杩涗簡DC-3杩愯緭鏈虹殑鎺ㄥ箍銆� - </p> <div class="bj4"> <div class=" link-float fl al-c"> <div class="bj4-xyx"> @@ -108,14 +952,14 @@ </div> </div> <span> - <p class="block" > + <p class="block"> 閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙革紝鐢卞叾鍒涘浜哄攼绾冲痉路缁村皵鏂烽亾鏍兼媺鏂垱寤轰簬1921骞�7鏈堛��1924骞�4鏈�6鏃ワ紝閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙歌璁$殑鍙岀考鏈洪娆$幆鐞冮琛屽彇寰楁垚鍔燂紝鍚屽勾9鏈�28鏃ワ紝璇ュ瀷鍙烽鏈哄啀娆$幆鐞冮琛屽彇寰楁垚鍔燂紝浣块亾鏍兼媺鏂湰浜哄拰閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙稿悕澹板ぇ鍣�� </p> </span> - <p class="block" > + <p class="block"> 閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙告渶钁楀悕鐨勪骇鍝佷负DC-3杩愯緭鏈猴紝鏄埅绌哄彶涓婂叿鏈変唬琛ㄦ�х殑椋炴満銆傝鏈哄瀷浜�1935骞存帹鍑猴紝鍙繍杞�30鍚嶆梾瀹紝鑸▼杈惧埌3420km锛屽苟棣栨鍦ㄩ鏈轰笂閰嶇疆浜嗗帹鎴裤�傜浜屾涓栫晫澶ф垬鐖嗗彂鍚庯紝DC-3杩愯緭鏈哄張琛嶇敓鍑轰簡鍐涚敤鍨婥-47杩愯緭鏈猴紝鍏堝悗鍏辩敓浜т簡涓�涓囧鏋讹紝鎷呰礋杩囩殑浠诲姟鏁颁笉鑳滄暟锛屽叏鐞冨悇鍦扮殑鏈哄満閮界暀涓嬭繃瀹冪殑韬奖銆傝嫃鑱斿ぇ鍚嶉紟榧庣殑閲�-2椋炴満鏄畠鐨勪豢鍒跺搧銆� </p> - <p class="block" > + <p class="block"> 1967骞达紝閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙歌繃鍒嗘墿灞旸C-8銆丏C-9杩愯緭鏈哄拰A-4鈥滃ぉ楣扳�濇敾鍑绘満锛屽鑷村叕鍙歌祫閲戦摼鍜屼骇鍝佽川閲忓彂鐢熼棶棰橈紝鏈�缁堜笉寰椾笉涓庨害鍏嬪攼绾抽琛屽櫒鍏徃鍚堝苟涓洪害鍏嬪攼绾陈烽亾鏍兼媺鏂叕鍙革紝绠�绉伴害閬撳叕鍙搞��1996骞�12鏈�15鏃ワ紝浠呮浜庢尝闊冲叕鍙稿拰绌轰腑瀹㈣溅鍏徃锛屽湪涓栫晫姘戠敤鑸┖鍣ㄥ埗閫犱笟涓帓鍚嶇涓夌殑楹﹂亾鍏徃琚尝闊冲叕鍙告敹璐紝鏋佸ぇ鍦板寮轰簡娉㈤煶鍏徃鐨勭珵浜夊姏锛屼篃鏀瑰彉浜嗘皯鐢ㄨ埅绌哄櫒鍒堕�犻鍩熶笁瓒抽紟绔嬬殑灞�闈€�� </p> </div> @@ -123,8 +967,8 @@ </div> </div> <!-- 21椤� --> - <div class="page-box" page="12"> - <div v-if="showPageList.indexOf(12) > -1"> + <div class="page-box" page="29"> + <div v-if="showPageList.indexOf(29) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -144,30 +988,30 @@ <p class="p-odd">绗洓锛屽柗姘斿紡姘戠敤椋炴満杩涘叆浜嗗疄鐢ㄩ樁娈碉紝涓烘皯鑸殑澶у彂灞曞瀹氫簡鍩虹銆�</p> <div class="bk"> <p><b>鑰冭瘉鎸囧崡锛氱┖娓湇鍔$鐞嗗笀鑰冮</b></p> - <p class="block" >1944骞�54涓浗瀹跺湪缇庡浗鑺濆姞鍝ヤ妇琛屼細璁紝鍏卞悓绛剧讲浜嗗浗闄呮皯鐢ㄨ埅绌哄叕绾︹�斺�旓紙 锛夈�傦紙鍗曢�夐锛� + <p class="block">1944骞�54涓浗瀹跺湪缇庡浗鑺濆姞鍝ヤ妇琛屼細璁紝鍏卞悓绛剧讲浜嗗浗闄呮皯鐢ㄨ埅绌哄叕绾︹�斺�旓紙 锛夈�傦紙鍗曢�夐锛� </p> - <p class="block" > + <p class="block"> <input type="radio" value="A" name="toobusy" :disabled="questionData.dropdownChoiceData.isComplete" v-model="questionData.dropdownChoiceData.value.userAnswer" @change="saveChoiceQuestion" /> A.銆婁笢浜潯绾︺�� </p> - <p class="block" > + <p class="block"> <input type="radio" value="B" name="toobusy" :disabled="questionData.dropdownChoiceData.isComplete" v-model="questionData.dropdownChoiceData.value.userAnswer" @change="saveChoiceQuestion" /> B.銆婅姖鍔犲摜鍏害銆� </p> - <p class="block" > + <p class="block"> <input type="radio" value="C" name="toobusy" :disabled="questionData.dropdownChoiceData.isComplete" v-model="questionData.dropdownChoiceData.value.userAnswer" @change="saveChoiceQuestion" /> C.銆婃捣鐗欏叕绾︺�� </p> - <p class="block" > + <p class="block"> <input type="radio" value="D" name="toobusy" :disabled="questionData.dropdownChoiceData.isComplete" v-model="questionData.dropdownChoiceData.value.userAnswer" @@ -177,7 +1021,10 @@ <p class="event-header-text-bc pd-5 fl jc-sa" style="margin-left: 8px; width: 93%" v-if="showQuestionAnswer"> <span class="c-g"> 绛旀锛欱 </span> - <span :class="{'c-g':questionData.dropdownChoiceData.value.isRight,'c-r':questionData.dropdownChoiceData.value.isRight == false}">鎮ㄧ殑绛旀锛歿{questionData.dropdownChoiceData.value.userAnswer }}</span> + <span + :class="{ 'c-g': questionData.dropdownChoiceData.value.isRight, 'c-r': questionData.dropdownChoiceData.value.isRight == false }">鎮ㄧ殑绛旀锛歿{ + questionData.dropdownChoiceData.value.userAnswer + }}</span> <span class="icon-box-big fl al-c"> <svg v-if="questionData.dropdownChoiceData.value.isRight" t="1716986419862" class="icon" viewBox="0 0 1820 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" @@ -227,7 +1074,7 @@ </div> <p><b style="color: #5192C6">鍠锋皵寮忛鏈虹殑璇炵敓</b></p> </div> - <p class="block" > + <p class="block"> 鍦ㄥ彂鏄庡柗姘斿紡椋炴満涔嬪墠锛岄鏈洪兘鏄噧娌规椿濉炲紡鍙戝姩鏈烘彁渚涘姩鍔涖�傚彂鍔ㄦ満宸ヤ綔鏃讹紝鍓嶉潰鐨勮灪鏃嬫〃楂橀�熸棆杞紝浠庤�岀粰椋炴満甯︽潵鍓嶈繘鐨勫姩鍔涖�傜敱浜庤灪鏃嬫〃鐨勫眬闄愭�э紝褰撴椂閫熻揪鍒�600km锛岄鏈虹殑閫熷害灏卞緢闅炬彁楂樹簡銆� </p> </div> @@ -235,19 +1082,19 @@ </div> </div> <!-- 22椤� --> - <div class="page-box" page="13"> - <div v-if="showPageList.indexOf(13) > -1"> + <div class="page-box" page="30"> + <div v-if="showPageList.indexOf(30) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">022</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> </ul> <div class="bodystyle"> <div class="bj4"> - <p class="block" > + <p class="block"> 涓栫晫涓婃渶鏃╃殑鍠锋皵鎺ㄨ繘鐞嗚鏄敱浜ㄥ埄路绉戝畨杈炬彁鍑虹殑銆�1910骞�10鏈堬紝浠栬璁$殑椋炴満鍦ㄥ反榛庡睍瑙堜細涓婂紩璧蜂簡杞板姩鈥斺�旇繖鏋堕鏈洪噰鐢ㄤ簡鍏ㄦ柊鐨勫彂鍔ㄦ満璁捐锛岀敤涓�鍙�50hp鐨勫彂鍔ㄦ満浣块鎵囧悜鍚庢帹鍔ㄧ┖姘旓紝鍚屾椂澧炶浜嗕竴涓姞鍔涚噧鐑у锛屼娇鐕冩皵鍦ㄥ熬鍠风涓厖鍒嗚啫鑳�锛屼互姝ゆ潵澧炲ぇ鍙嶆帹鍔涖�傚柗姘斿紡椋炴満鐨勯洀褰㈠凡缁忓垵瑙佺鍊�傚悓骞�12鏈堬紝绉戝畨杈惧湪涓洪鏈哄仛鏃ュ父妫�娴嬫椂锛屼笉灏忓績瑙﹀強椋炴満鐨勫惎鍔ㄨ缃紝鐪肩湅椋炴満灏辫鎾炲埌鍩庡浜嗭紝绉戝畨杈炬�ヤ腑鐢熸櫤锛屾媺鍔ㄦ搷绾垫潌锛岄┚椹堕鏈鸿捣椋炰簡銆備絾鏄敱浜庣己涔忛┚椹堕鏈虹殑缁忛獙锛岄鏈烘病澶氫箙灏辨牻鍚戜簡鍦伴潰锛屾墍骞哥瀹夎揪鍦ㄥ潬鍦板墠琚姏鍑轰簡椋炴満锛屾病鏈夊彈浼ゃ�傛煇绉嶆剰涔変笂锛屽彲浠ヨ绉戝畨杈炬槸涓栫晫涓婄涓�浣嶉┚椹跺柗姘斿紡椋炴満鐨勪汉銆� </p> <span> - <p class="block" >鐪熸鐨勫柗姘斿紡椋炴満鐨勫彂鏄庣涓嶅紑鑻卞浗浜哄紬鍏板厠路鎯犵壒灏旓紙Frank + <p class="block">鐪熸鐨勫柗姘斿紡椋炴満鐨勫彂鏄庣涓嶅紑鑻卞浗浜哄紬鍏板厠路鎯犵壒灏旓紙Frank Whittle锛夛紙鍥�1-22锛夈��20涓栫邯20骞翠唬鏈紝鎯犵壒灏斿彂鐜颁簡娲诲寮忓彂鍔ㄦ満瀛樺湪灞�闄愭�э紝浜庢槸锛屼骇鐢熶簡鐢ㄥ彂鍔ㄦ満浜х敓鐨勫柗姘旀潵鎺ㄥ姩椋炴満鐨勮鎯炽�傚彲鏄綋鎯犵壒灏旀彁鍑轰粬鐨勮鎯虫椂锛屽綋鏃剁殑浜轰滑閮借涓哄崄鍒嗚崚璇烇紝涓嶇敤铻烘棆妗ㄥ氨鑳戒笂澶╋紝杩欑畝鐩存槸澶╂柟澶滆碍銆備絾鏄紝鎯犵壒灏旀墍鍦ㄧ殑鐨囧绌哄啗鍩哄湴鐨勬暀瀹樼害缈伴�婂浠栫殑鎯虫硶寰堟璧忋�備粬璁╂儬鐗瑰皵鎶婃柟妗堟嬁鍒拌嫳鍥戒笓鍒╁眬杩涜鐧昏锛屽張鍦ㄥ悗闈㈢殑鍑犲勾鏃堕棿鍐呴櫔浠栧洓澶勬父璇淬�傚彧鏄粛鐒舵病鏈変汉瀵规儬鐗瑰皵鐨勬柟妗堟劅鍏磋叮锛屽洜姝ゅ柗姘斿紡鍙戝姩鏈虹殑鏂规鍙ソ鏆傛椂鏉熶箣楂橀榿銆� </p> </span> @@ -256,12 +1103,12 @@ <p class="img">鍥�1-22 寮楀叞鍏嬄锋儬鐗瑰皵</p> </div> <span> - <p class="block" > + <p class="block"> 1939骞达紝绗簩娆′笘鐣屽ぇ鎴樼垎鍙戯紝鎯犵壒灏斿湪姝ゆ椂杩庢潵浜嗕粬鐨勬満閬囥�傜┖鍐涢儴鍜屼粬绛剧讲浜嗕竴浠藉悎鍚岋紝瑕佹眰浠栧敖蹇璁″嚭渚涗綔鎴橀鏈轰娇鐢ㄧ殑杞诲瀷寮曟搸銆傛鍓嶏紝鎯犵壒灏旂殑鐮旂┒鍑犱箮鍒颁簡灞辩┓姘村敖鐨勫湴姝ワ紝杩欎唤鍚堝悓涓轰粬甯︽潵浜嗚浆鏈恒�備笉鍒颁竴骞寸殑鏃堕棿锛屾儬鐗瑰皵鐮斿埗鐨勫紩鎿庡凡缁忚兘澶熸甯歌繍杞紝鍙堣繃浜嗕竴骞达紝鎯犵壒灏旂殑椋炴満鎴愬姛椋炰笂浜嗗ぉ绌猴紝鐩存帴椋炲埌浜嗕笜鍚夊皵棣栫浉鐨勯潰鍓嶆帴鍙楁闃呫�� </p> </span> - <p class="block" > + <p class="block"> 鍠锋皵寮忓彂鍔ㄦ満鐨勪骇鐢燂紝缁欎笘鐣岃埅绌哄伐涓氬甫鏉ヤ簡涓�鍦洪潻鍛姐�傜敱浜庡畠閲囩敤浜嗗叏鏂扮殑宸ヤ綔鍘熺悊锛屽彲涓洪鏈烘彁渚涜繙杩滆秴杩囧叾鍓嶈緢鈥斺�旀椿濉炲紡鍙戝姩鏈虹殑寮哄ぇ鍔ㄥ姏锛岃�屼笖瀹冭繕鎽掑純浜嗗墠鑰呮墍鈥滈毦浠ュ壊鑸嶁�濈殑鐥肩柧鈥斺�旇灪鏃嬫〃锛屽洜鑰屽ぇ骞呭害鎻愰珮浜嗛鏈虹殑鎬ц兘銆傚浠婏紝鍠锋皵鎶�鏈緱鍒拌秺鏉ヨ秺骞挎硾鐨勫簲鐢紝涓嶈鏄啗鐢ㄨ繕鏄皯鐢ㄩ鏈猴紝鐢氳嚦鏌愪簺鑸ā涔熼噰鐢ㄥ皬鍨嬭剦鍐插柗姘斿彂鍔ㄦ満浣滀负鑷繁鐨勫姩鍔涜缃�� </p> </div> @@ -269,8 +1116,8 @@ </div> </div> <!-- 23椤� --> - <div class="page-box" page="14"> - <div v-if="showPageList.indexOf(14) > -1"> + <div class="page-box" page="31"> + <div v-if="showPageList.indexOf(31) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -330,8 +1177,8 @@ </div> </div> <!-- 24椤� --> - <div class="page-box" page="15"> - <div v-if="showPageList.indexOf(15) > -1"> + <div class="page-box" page="32"> + <div v-if="showPageList.indexOf(32) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">024</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> @@ -347,7 +1194,7 @@ </div> </div> <span> - <p class="block" > + <p class="block"> B707瀹㈡満鏄編鍥芥尝闊冲叕鍙镐簬1957骞村湪鍘熺┖涓姞娌规満KC-135鐨勫熀纭�涓婄爺鍒惰�屾垚鐨勶紝1958骞翠氦浠樹娇鐢ㄣ�傝嚦1991骞村叧闂敓浜х嚎锛孊707鍏辫幏寰�1010鏋惰鍗曪紝涓浗姘戣埅涔熸浘璐拱10鏋惰鍨嬮鏈恒�傚悗鏉ユ垜鍥借繕鏇句豢鍒惰繃B707锛岀О涓衡�滆繍鍗佲�濓紙鍥�1-27锛夈�傗�滆繍鍗佲�濇槸鎴戝浗鑷鐮斿埗鐨勫ぇ椋炴満锛屼唬鍙封�淵-10鈥濄�傜爺鍒垛�滆繍鍗佲�濈殑浠诲姟鏄�1970骞�8鏈堜笅杈剧殑锛屾晠椤圭洰浠e彿涓衡��708宸ョ▼鈥濄�備换鍔$洰鏍囨槸鐮斿埗鍏氬拰鍥藉棰嗗浜虹殑鍑鸿涓撴満锛屾�ц兘瑕佹眰涓昏鏄珮鑸�熴�佸ぇ鑸▼銆傚澶ц埅绋嬫湁涓舰璞$殑鏍囧噯锛屽氨鏄笢鑳介鍒扮編鍥斤紝璁╁浗瀹堕瀵间汉鍧愬畠鍘诲紑鑱斿ぇ浼氳锛涜タ瑕佽兘椋炲埌褰撴椂娆ф床鐨勨�滅ぞ浼氫富涔夋槑鐏�濃�斺�旈樋灏斿反灏间簹銆傛牴鎹繖绉嶆爣鍑嗭紝鑸▼鍦�7000km宸﹀彸銆� </p> </span> @@ -356,28 +1203,25 @@ <p class="img">鍥�1-27 鈥滆繍鍗佲�濋鏈�</p> </div> <span> - <p class="block" > + <p class="block"> 1975骞�1鏈堬紝鈥滆繍鍗佲�濋鏈虹殑鍥剧焊璁捐鍩烘湰瀹屾垚銆�1976骞�7鏈堝埗閫犲嚭浜嗙涓�鏋剁敤浜庨潤鍔涜瘯楠岀殑椋炴満锛�1978骞�11鏈堝叏鏈洪潤鍔涜瘯楠屼竴娆℃垚鍔熴��1979骞�12鏈堝埗閫犲嚭绗簩鏋剁敤浜庨琛岃瘯楠岀殑椋炴満锛屼簬1980骞�9鏈�26鏃ラ娆¤瘯椋烇紝涓�娆℃垚鍔燂紝姝ゅ悗杩涜浜嗗悇绉嶇鐮旇瘯椋炪�傚厛鍚庤浆鍦哄寳浜�佸悎鑲ャ�佸搱灏旀花銆佷箤椴佹湪榻愩�佹槅鏄庛�佹垚閮界瓑鍦帮紝骞跺厛鍚�7娆¢鎶佃捣闄嶉毦搴︽渶澶х殑瑗胯棌鎷夎惃璐″槑鏈哄満锛岄瑗胯棌鏃垛�滀竴鍛ㄩ琛�5娆★紝杩炵画鍑哄嫟鏃犱簨鏁呪�濄�傚埌1985骞达紝鈥滆繍鍗佲�濆叡椋炰簡130涓捣钀斤紝170h锛屾渶杩滆埅绋�3600km锛屾渶澶ф椂閫�930km锛屾渶楂橀琛屽崌闄�11000m锛屾渶闀跨┖涓琛屾椂闂�4灏忔椂49鍒嗐�備粠鎬ц兘涓婄湅锛屸�滆繍鍗佲�濆鑸辨寜缁忔祹鑸�178搴э紝娣峰悎绾�124搴у竷缃紝鏈�澶ц捣椋炶川閲�110t锛屽凡缁忚揪鍒颁簡鈥滃ぇ椋炴満鈥濈殑鏍囧噯銆傗�滆繍鍗佲�濈殑鎴愬姛璇曢锛岃瘉鏄庝簡鎴戝浗鏈夎兘鍔涜璁″嚭涓庡綋鏃惰緝涓哄厛杩涚殑澶у瀷椋炴満姘村钩鐩稿綋鐨勫ぇ椋炴満銆傗�滆繍鍗佲�濆悗鏉ョ敱浜庣粡璐圭瓑鍘熷洜鍋滄鐮斿埗锛屽氨杩欐牱闈欓潤鍦伴殣鍏ヤ簡鍘嗗彶鐨勭儫灏樸�� </p> </span> - <p class="block" > + <p class="block"> B707浠�4鍙版丁杞鎵囧彂鍔ㄦ満涓哄姩鍔涳紝鏈�澶у贰鑸椂閫�972km锛屾渶澶х埇鍗囩巼姣忕17.9m锛屽疄鐢ㄥ崌闄�11818m锛岃埅绋�6317km銆傞┚椹惰埍鏈虹粍浜哄憳4鍚嶏紝缁忔祹鑸便�佸叕鍔¤埍涓ょ骇甯冨眬杞藉219浜猴紝鍏ㄧ粡娴庤埍杞藉258浜猴紝涓昏甯傚満瀹氫綅浜庨暱閫斿共绾胯繍杈撱�� </p> - <p class="block" > - 閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙哥殑DC-8瀹㈡満锛屼簬1955骞�6鏈堝紑濮嬭璁★紝1958骞�5鏈�30鏃ラ椋炴垚鍔燂紝娆″勾9鏈堜氦浠樹娇鐢ㄣ�傚寘鎷悗鏉ュ悎骞跺悗鐨勯害閬撳叕鍙哥敓浜х殑DC-8-70绯诲垪瀹㈡満锛岀洿鑷�1987骞村叏閮ㄤ氦浠樺畬姣曪紝鍏辩敓浜�666鏋躲�� - </p> - <p class="block" > - DC-8閲囩敤4鍙版丁杞鎵囧彂鍔ㄦ満锛屽厛鍚庣敓浜т簡5涓壒娆★紝涓嶅悓鎵规鏇存崲杩囧彂鍔ㄦ満锛屾帹鍔涚暐鏈変笉鍚屻�備笉鍚屾壒娆C-8杞藉閲忎笉鍚岋紝浠�176浜哄埌259浜轰笉绛夛紝鏈�澶ф椂閫�946km锛岃埅绋�7400km銆傚畠瑙咮707涓烘渶澶х珵浜夊鎵嬶紝绋嶆櫄浜嶣707鎶曞叆杩愯惀銆侱C-8鐨勫鑸辨洿瀹藉ぇ锛屽彲浠ヤ笉缁忓仠妯法澶цタ娲嬮琛屻�� + <p class="block"> + 閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙哥殑DC-8瀹㈡満锛屼簬1955骞�6鏈堝紑濮嬭璁★紝1958骞�5鏈�30鏃ラ椋炴垚 </p> </div> </div> </div> </div> <!-- 25椤� --> - <div class="page-box" page="16"> - <div v-if="showPageList.indexOf(16) > -1"> + <div class="page-box" page="33"> + <div v-if="showPageList.indexOf(33) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -386,10 +1230,9 @@ </ul> <div class="bodystyle"> <div class="bj4"> - <p class="block" > - 閬撴牸鎷夋柉椋炶鍣ㄥ叕鍙哥殑DC-8瀹㈡満锛屼簬1955骞�6鏈堝紑濮嬭璁★紝1958骞�5鏈�30鏃ラ椋炴垚鍔燂紝娆″勾9鏈堜氦浠樹娇鐢ㄣ�傚寘鎷悗鏉ュ悎骞跺悗鐨勯害閬撳叕鍙哥敓浜х殑DC-8-70绯诲垪瀹㈡満锛岀洿鑷�1987骞村叏閮ㄤ氦浠樺畬姣曪紝鍏辩敓浜�666鏋躲�� - </p> - <p class="block" > + <p class="block td-0"> + 鍔燂紝娆″勾9鏈堜氦浠樹娇鐢ㄣ�傚寘鎷悗鏉ュ悎骞跺悗鐨勯害閬撳叕鍙哥敓浜х殑DC-8-70绯诲垪瀹㈡満锛岀洿鑷�1987骞村叏閮ㄤ氦浠樺畬姣曪紝鍏辩敓浜�666鏋躲�� </p> + <p class="block"> DC-8閲囩敤4鍙版丁杞鎵囧彂鍔ㄦ満锛屽厛鍚庣敓浜т簡5涓壒娆★紝涓嶅悓鎵规鏇存崲杩囧彂鍔ㄦ満锛屾帹鍔涚暐鏈変笉鍚屻�備笉鍚屾壒娆C-8杞藉閲忎笉鍚岋紝浠�176浜哄埌259浜轰笉绛夛紝鏈�澶ф椂閫�946km锛岃埅绋�7400km銆傚畠瑙咮707涓烘渶澶х珵浜夊鎵嬶紝绋嶆櫄浜嶣707鎶曞叆杩愯惀銆侱C-8鐨勫鑸辨洿瀹藉ぇ锛屽彲浠ヤ笉缁忓仠妯法澶цタ娲嬮琛屻�� </p> </div> @@ -409,8 +1252,8 @@ </div> </div> <!-- 26椤� --> - <div class="page-box" page="17"> - <div v-if="showPageList.indexOf(17) > -1"> + <div class="page-box" page="34"> + <div v-if="showPageList.indexOf(34) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">026</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> @@ -426,7 +1269,7 @@ </div> </div> <span> - <p class="block" > + <p class="block"> B747瀹㈡満锛堝浘1-28锛夋槸1/3鍙屽眰鐨勫浣撳鏈猴紝涔熸槸涓栫晫涓婄涓�绉嶅弻灞傚鏈恒�侀娆惧浣撳鏈猴紝杞藉閲忔槸灏嗘皯鑸甫鍏ュ柗姘斿紡鏃朵唬鐨凚707鐨勪袱鍊嶃��</p> </span> <div class="img-rights openImgBox"> @@ -434,14 +1277,14 @@ <p class="img">鍥�1-28 B747瀹㈡満</p> </div> <span> - <p class="block" > + <p class="block"> B747浜�1965骞�8鏈堝紑濮嬬爺鍒讹紝1969骞�2鏈堣瘯椋炴垚鍔燂紝1970骞�1鏈堢編鍥芥硾缇庤埅绌哄叕鍙歌幏寰楅鏋惰鍨嬮鏈哄苟鎶曞叆浣跨敤銆侭747璁炬湁涓ゅ眰瀹㈣埍锛岃緝鐭殑涓婂眰鍓嶆柟涓洪┚椹惰埍锛屽悗鏂规爣鍑嗗竷缃负鍏姟鑸憋紝涓嬪眰鍓嶆柟涓哄ご绛夎埍銆佸悗鏂逛负缁忔祹鑸便�侭747鍏辨湁100鍨嬨��200鍨嬨��300鍨嬨��400鍨嬬瓑鍨嬪彿銆�1990骞�5鏈堝悗锛岄櫎400鍨嬪锛屽叾浠栧瀷鍙峰潎宸插仠浜с�備负鍥炲簲绔炰簤瀵规墜A380椋炴満锛�2005骞�11鏈�14鏃ワ紝娉㈤煶鍏徃鍚姩浜咮747-8椤圭洰锛�2011骞�2鏈�13鏃ワ紝绗竴鏋禕747-8鍨嬫床闄呭鏈烘寮忎笅绾裤�� </p> </span> - <p class="block" > + <p class="block"> B747浠�4鍙版丁杞鎵囧彂鍔ㄦ満涓哄姩鍔涳紝涓嶅悓鍨嬪彿鍜屾壒娆″垎鍒噰鐢ㄤ簡鎯犳櫘銆侀�氱敤鐢垫皵鍜岀綏缃楀叕鍙哥敓浜х殑鍙戝姩鏈猴紝400鍨嬫渶澶у贰鑸椂閫�945km锛屽吀鍨嬪贰鑸椂閫�895km锛岃埅绋�13570km銆傚吀鍨嬬殑涓夌骇搴ц埍甯冨眬杞藉416浜猴紝鍏ㄧ粡娴庤埍杞藉568浜恒�侭747-8鍨嬫床闄呭鏈哄湪B747-400鍩虹涓婃湁鎵�鍔犻暱锛岃繍钀ユ垚鏈湁鎵�闄嶄綆锛屽吀鍨嬬殑涓夌骇搴ц埍甯冨眬鍙浇瀹�467浜猴紝鏈�澶ц埅绋�14815km銆� </p> - <p class="block" > + <p class="block"> 2020骞�7鏈堬紝娉㈤煶鍏徃瀹e竷灏嗕簬2022骞村仠浜ф墍鏈塀747绯诲垪椋炴満銆傚綋鍦版椂闂�2022骞�12鏈�6鏃ワ紝鏈�鍚庝竴鏋禕747椋炴満锛堢紪鍙蜂负1572锛変粠娉㈤煶鍏徃鐨勫焹寮楅浄鐗瑰伐鍘備笅绾裤�傝繖鏋堕鏈烘槸涓轰簹鐗规媺鏂埅绌哄埗閫犵殑锛屼簬2023骞�1鏈�31鏃ヤ氦浠樸�� </p> <div class="img-float openImgBox"> @@ -449,19 +1292,19 @@ <p class="img">鍥�1-29 A380瀹㈡満</p> </div> <span> - <p class="block" > + <p class="block"> A380瀹㈡満锛堝浘1-29锛夋槸娉曘�佽嫳銆佸痉鍜岃タ鐝墮鍥涘浗鑱斿悎鐨勭┖涓杞﹀叕鍙哥爺鍙戠殑550搴х骇鍏ㄥ弻灞傘�佽秴澶у瀷杩滅▼瀹㈡満锛屾湁鈥滅┖涓法鏃犻湼鈥濅箣绉般��</p> </span> - <p class="block" > - 1994骞�6鏈堬紝绌轰腑瀹㈣溅鍏徃瀹e竷浜嗚秴澶у瀷瀹㈡満鈥淎3脳脳鈥濈爺鍒惰鍒掞紝2000骞�12鏈堟寮忔敼绉扳�淎380鈥濓紝2005骞�4鏈�27鏃ラ椋炴垚鍔燂紝2006骞�12鏈堣幏寰楅�傝埅璁よ瘉銆�2007骞�10鏈堬紝棣栨灦A380瀹㈡満浜や粯鏂板姞鍧¤埅绌哄叕鍙稿苟浜庡綋鏈�25鏃ユ姇鍏ュ晢涓氳繍钀ワ紝棣栨鍟嗕笟椋炶浠庢柊鍔犲潯妯熷疁鍥介檯鏈哄満椋炲線婢冲ぇ鍒╀簹鎮夊凹鍥介檯鏈哄満銆� + <p class="block"> + 1994骞�6鏈堬紝绌轰腑瀹㈣溅鍏徃瀹e竷浜嗚秴澶у瀷瀹㈡満鈥淎3脳脳鈥濈爺鍒惰鍒掞紝2000骞�12鏈堟寮忔敼绉扳�淎380鈥濓紝2005骞�4鏈�27鏃ラ椋炴垚鍔燂紝2006骞�12鏈堣幏寰楅�傝埅璁よ瘉銆�2007骞�10鏈堬紝棣栨灦A380瀹㈡満浜や粯鏂板姞鍧¤埅绌哄叕鍙稿苟浜庡綋鏈�25鏃ユ姇鍏ュ晢涓氳繍钀ワ紝棣栨鍟嗕笟 </p> </div> </div> </div> </div> <!-- 27椤� --> - <div class="page-box" page="18"> - <div v-if="showPageList.indexOf(18) > -1"> + <div class="page-box" page="35"> + <div v-if="showPageList.indexOf(35) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -470,48 +1313,57 @@ </ul> <div class="bodystyle"> <div class="bj4"> - <p class="block" > + <p class="block td-0"> + 椋炶浠庢柊鍔犲潯妯熷疁鍥介檯鏈哄満椋炲線婢冲ぇ鍒╀簹鎮夊凹鍥介檯鏈哄満銆� + </p> + <p class="block"> A380瀹㈡満瀹夎浜�4鍙版丁杞鎵囧彂鍔ㄦ満锛屾渶楂樺贰鑸椂閫�945km锛屾甯稿贰鑸椂閫�902km锛屽崌闄�13100m锛岃埅绋�15100km銆傛爣鍑嗙殑涓夌骇搴ц埍甯冨眬杞藉555浜猴紝涓ょ骇搴ц埍甯冨眬杞藉644浜猴紝鍏ㄧ粡娴庤埍杞藉861浜恒�� </p> - <p class="block" > + <p class="block"> A380瀹㈡満浜�2006骞�11鏈�22鏃ラ娆¢涓翠腑鍥斤紝鎶佃揪骞垮窞鐧戒簯鍥介檯鏈哄満锛�2008骞�5鏈�31鏃ワ紝绌轰腑瀹㈣溅鍏徃瑁呴厤鐨凙380瀹㈡満瑁呰浇2000浣欓《甯愮鎶佃揪鎴愰兘鍙屾祦鍥介檯鏈哄満锛屽弬鍔犱簡姹跺窛澶у湴闇囨晳鐏炬椿鍔紱2008骞�11鏈�3鏃ラ娆″弬鍔犱腑鍥界彔娴疯埅灞曪紱2010骞�8鏈�1鏃ワ紝闅跺睘浜庨樋鑱旈厠鑸┖鐨凙380瀹㈡満鎶佃揪鍖椾含棣栭兘鍥介檯鏈哄満锛屽紑杈熶簡涓浗绗竴鏉$敱A380瀹㈡満鎵ч鐨勫畾鏈熻埅绾裤��2011骞�10鏈�15鏃ヤ腑鍥藉崡鏂硅埅绌哄叕鍙告帴鏀朵簡棣栨灦A380瀹㈡満锛屾垚涓轰腑鍥介瀹躲�佸叏鐞冪涓冨鎷ユ湁A380瀹㈡満鐨勮埅绌哄叕鍙搞�� </p> - <p class="block" > - 鐢变簬鑹ソ鐨勬皵鍔ㄨ璁★紝浣跨敤鏂颁竴浠e彂鍔ㄦ満锛岄噰鐢ㄦ洿澶氱殑澶嶅悎鏉愭枡锛屽噺杞讳簡椋炴満鐨勭粨鏋勮川閲忥紝A380瀹㈡満鐨勫崟浣嶆补鑰楀拰浜屾哀鍖栫⒊鎺掓斁閲忛兘寰堜綆銆傚畠鏄笘鐣屼笂棣栨姣忔梾瀹紙搴э級鐧惧崈绫虫补鑰椾笉鍒�3L鐨勮繙绋嬮鏈猴紝杩欎竴鏁板瓧涓庝竴杈嗙粡娴庡瀷瀹剁敤姹借溅鐨勬补鑰楃浉褰撱�傚湪褰撴椂鍏跺洜鏃犲彲鍖规晫鐨勮浇瀹㈤噺锛岃绉颁负鈥滅┖涓法鏃犻湼鈥濄�備笌鐩存帴绔炰簤鏈哄瀷B747-400鐩告瘮锛孉380瀹㈡満鍙鎻愪緵绾�35%鐨勫骇浣嶅拰49%鐨勫湴鏉跨┖闂达紝杩愯惀鎴愭湰鍙檷浣�13%銆傚湪鈥滃ぇ鈥濈殑绔炰簤涓紝绌轰腑瀹㈣溅鍏徃璧簡娉㈤煶鍏徃銆�<a - id="w1"></a></p> - <p class="block" > + <p class="block"> + 鐢变簬鑹ソ鐨勬皵鍔ㄨ璁★紝浣跨敤鏂颁竴浠e彂鍔ㄦ満锛岄噰鐢ㄦ洿澶氱殑澶嶅悎鏉愭枡锛屽噺杞讳簡椋炴満鐨勭粨鏋勮川閲忥紝A380瀹㈡満鐨勫崟浣嶆补鑰楀拰浜屾哀鍖栫⒊鎺掓斁閲忛兘寰堜綆銆傚畠鏄笘鐣屼笂棣栨姣忔梾瀹紙搴э級鐧惧崈绫虫补鑰椾笉鍒�3L鐨勮繙绋嬮鏈猴紝杩欎竴鏁板瓧涓庝竴杈嗙粡娴庡瀷瀹剁敤姹借溅鐨勬补鑰楃浉褰撱�傚湪褰撴椂鍏跺洜鏃犲彲鍖规晫鐨勮浇瀹㈤噺锛岃绉颁负鈥滅┖涓法鏃犻湼鈥濄�備笌鐩存帴绔炰簤鏈哄瀷B747-400鐩告瘮锛孉380瀹㈡満鍙鎻愪緵绾�35%鐨勫骇浣嶅拰49%鐨勫湴鏉跨┖闂达紝杩愯惀鎴愭湰鍙檷浣�13%銆傚湪鈥滃ぇ鈥濈殑绔炰簤涓紝绌轰腑瀹㈣溅鍏徃璧簡娉㈤煶鍏徃銆�<sup>鈶�</sup> + </p> + <p class="block"> A380椤圭洰鐮斿彂鎬绘姇鍏ヨ揪200浜挎鍏冿紝2006骞达紝鍗曟満鍞环2.45浜跨編鍏冿紱2016骞寸殑鎶ヤ环鏄�5.47浜挎鍏冦�傛寜娴嬬畻锛岀泩浜忓钩琛$偣涓�350鏋跺鏈恒�傚綋鍒濇湡鏈涜兘鍞嚭750鏋讹紝鍚庢彁鍑哄湪20骞村唴鐢熶骇1200鏋剁殑鐩爣銆備絾鍒�2018骞�4鏈堝簳锛屽疄闄呮帴鍒拌鍗曚粎331鏋躲�傚凡浜や粯226鏋躲�� </p> - <p class="block" > + <p class="block"> 2019骞�2鏈�14鏃ワ紝绌轰腑瀹㈣溅鍏徃瀹e竷锛岀敱浜庨攢鍞姸鍐典笉浣筹紝灏嗕簬2021骞存殏鍋淎380椋炴満鐨勭敓浜с�傚疄闄呬笂锛屼簬2021骞�12鏈�16鏃ヤ氦浠樻渶鍚庝竴鏋禔380鍚庡仠浜э紝鍏变氦浠�251鏋躲��</p> - <p class="block" > + <p class="block"> 2022骞�12鏈�21鏃ワ紝鍗楁柟鑸┖鏈�鍚庝袱鏋禔380瀹㈡満绂诲紑骞垮窞鐧戒簯鏈哄満锛岄寰�缇庡浗鑾搱缁撮鏈哄潫鍦恒�傝繖浠h〃鐫�鑷涓浗姘戣埅鍐嶆棤A380瀹㈡満銆�</p> - <p class="block" > + <p class="block"> 鑻便�佹硶鑱斿悎鐮斿埗鐨勨�滃崗鍜屸�濊秴澹伴�熷鏈猴紙鍥�1-30锛変簬1969骞寸爺鍒舵垚鍔燂紝1976骞�1鏈�21鏃ユ寮忎粠浜嬪晢涓氳繍钀ワ紝鐢辫嫳鍥借埅绌哄叕鍙稿拰娉曞浗鑸┖鍏徃鐢ㄤ簬妯法澶цタ娲嬬殑椋炶銆傚畠鏄縿浠婁负姝笘鐣屼笂鍞竴鎶曞叆杩愯惀鐨勮秴澹伴�熷鏈猴紝涓�鍏辩敓浜т簡20鏋躲�� </p> </div> + <hr class=""> + <p class="note td-0"><a id="m1">鈶�</a> 寮犺仛鎭╋細銆婂ぇ鍥借埅绌猴細浠庣櫨骞村鍙戝埌涓栫邯杈夌厡銆嬶紝177椤碉紝鍖椾含锛岀瀛﹀嚭鐗堢ぞ锛�2018銆�</p> + </div> </div> </div> <!-- 28椤� --> - <div class="page-box" page="19"> - <div v-if="showPageList.indexOf(19) > -1"> + <div class="page-box" page="36"> + <div v-if="showPageList.indexOf(36) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">028</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> </ul> <div class="bodystyle"> <div class="bj4"> - <p class="block" > + <p class="block"> 鈥滃崗鍜屸�濊秴澹伴�熷鏈洪噰鐢ㄤ笁瑙掔考甯冨眬锛岃鏈�4鍙版丁杞柗姘斿彂鍔ㄦ満锛屽贰鑸椂閫�2150km锛岃埅绋�5110km锛屽彲杞�100鍚嶆梾瀹€�傜敱浜庨�熷害瓒呰繃浜嗗湴鐞冭嚜杞�熷害锛屾梾瀹箻鍧愬畠浠庢娲查寰�缇庢床鏃讹紝甯稿父鏄�滆繕娌″嚭鍙戝凡缁忓埌杈句簡鈥濄�傚鏋滄槸鍦ㄦ棩钀芥椂鍒嗚捣椋炲悜瑗块琛岋紝鐢氳嚦杩樿兘鐪嬪埌鈥滃お闃充粠瑗胯竟鍗囪捣鈥濈殑鐜拌薄銆� + </p> + <p class="block"> + 2000骞�7鏈�25鏃ワ紝涓�鏋垛�滃崗鍜屸�濊秴澹伴�熷鏈哄湪宸撮粠鎴撮珮涔愭満鍦虹⒕杩囦簡涓�鏋禗C-10椋炴満鑴辫惤鐨勯噾灞炵墖锛屽紩璧风垎鑳庯紝鐖嗚儙鐨勭鐗囦互瓒呭0閫熷嚮涓満缈兼补绠卞悗寮曡捣椋炴満澶辩伀鍧犳瘉锛岀粓 </p> <div class="img-rights openImgBox"> <img class="img-0" alt="" src="../../assets/images/0040-1.jpg" /> <p class="img">鍥�1-30 鈥滃崗鍜屸�濊秴澹伴�熷鏈�</p> </div> <span> - <p class="block" > - 2000骞�7鏈�25鏃ワ紝涓�鏋垛�滃崗鍜屸�濊秴澹伴�熷鏈哄湪宸撮粠鎴撮珮涔愭満鍦虹⒕杩囦簡涓�鏋禗C-10椋炴満鑴辫惤鐨勯噾灞炵墖锛屽紩璧风垎鑳庯紝鐖嗚儙鐨勭鐗囦互瓒呭0閫熷嚮涓満缈兼补绠卞悗寮曡捣椋炴満澶辩伀鍧犳瘉锛岀粓缁撲簡鈥滃崗鍜屸�濊秴澹伴�熷鏈�25骞寸殑鏃犱簨鏁呰褰曪紝閫犳垚鏈轰笂109浜哄叏閮ㄩ亣闅俱�佸湴闈�4浜烘浜$殑鎯ㄥ墽銆傝繖娆′簨鏁呭湪浜轰滑蹇冪洰涓暀涓嬩簡鏋佸ぇ鐨勯槾褰憋紝浠庢瓒呭0閫熻埅鐝笂搴х巼涓�韫朵笉鎸紝鑷翠娇鑸┖鍏徃涓ラ噸浜忔崯锛屼笉寰椾笉鍦�2003骞�10鏈�24鏃ュ皢鈥滃崗鍜屸�濊秴澹伴�熷鏈哄叏閮ㄩ��褰癸紝缁堟浜嗚秴澹伴�熷鏈虹殑杩愯惀銆� + <p class="block td-0"> + 缁撲簡鈥滃崗鍜屸�濊秴澹伴�熷鏈�25骞寸殑鏃犱簨鏁呰褰曪紝閫犳垚鏈轰笂109浜哄叏閮ㄩ亣闅俱�佸湴闈�4浜烘浜$殑鎯ㄥ墽銆傝繖娆′簨鏁呭湪浜轰滑蹇冪洰涓暀涓嬩簡鏋佸ぇ鐨勯槾褰憋紝浠庢瓒呭0閫熻埅鐝笂搴х巼涓�韫朵笉鎸紝鑷翠娇鑸┖鍏徃涓ラ噸浜忔崯锛屼笉寰椾笉鍦�2003骞�10鏈�24鏃ュ皢鈥滃崗鍜屸�濊秴澹伴�熷鏈哄叏閮ㄩ��褰癸紝缁堟浜嗚秴澹伴�熷鏈虹殑杩愯惀銆� </p> </span> </div> @@ -519,8 +1371,8 @@ </div> </div> <!-- 29椤� --> - <div class="page-box" page="20"> - <div v-if="showPageList.indexOf(20) > -1"> + <div class="page-box" page="37"> + <div v-if="showPageList.indexOf(37) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -548,8 +1400,8 @@ </div> </div> <!-- 30椤� --> - <div class="page-box" page="21"> - <div v-if="showPageList.indexOf(21) > -1"> + <div class="page-box" page="38"> + <div v-if="showPageList.indexOf(38) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">030</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> @@ -579,8 +1431,8 @@ </div> </div> <!-- 31椤� --> - <div class="page-box" page="22"> - <div v-if="showPageList.indexOf(22) > -1"> + <div class="page-box" page="39"> + <div v-if="showPageList.indexOf(39) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -626,8 +1478,8 @@ </div> </div> <!-- 32椤� --> - <div class="page-box" page="23"> - <div v-if="showPageList.indexOf(23) > -1"> + <div class="page-box" page="40"> + <div v-if="showPageList.indexOf(40) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">032</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> @@ -658,8 +1510,8 @@ </div> </div> <!-- 33椤� --> - <div class="page-box" page="24"> - <div v-if="showPageList.indexOf(24) > -1"> + <div class="page-box" page="41"> + <div v-if="showPageList.indexOf(41) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -692,8 +1544,8 @@ </div> </div> <!-- 34椤� --> - <div class="page-box" page="25"> - <div v-if="showPageList.indexOf(25) > -1"> + <div class="page-box" page="42"> + <div v-if="showPageList.indexOf(42) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">034</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> @@ -721,8 +1573,8 @@ </div> </div> <!-- 35椤� --> - <div class="page-box" page="26"> - <div v-if="showPageList.indexOf(26) > -1"> + <div class="page-box" page="43"> + <div v-if="showPageList.indexOf(43) > -1"> <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt=""> <li class="headerText">椤圭洰涓�</li> @@ -769,8 +1621,8 @@ </div> </div> <!-- 36椤� --> - <div class="page-box" page="27"> - <div v-if="showPageList.indexOf(27) > -1"> + <div class="page-box" page="44"> + <div v-if="showPageList.indexOf(44) > -1"> <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> <li class="header-left-Number">036</li> <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> @@ -809,40 +1661,44 @@ </p> <!-- 鎷撳睍搴旂敤 --> <h2 id="b004 "><img class="inline1 p-even" alt="" src="../../assets/images/tzyy.jpg" /></h2> - <p class="block p-even">1.鑸┖涓氱敱鍝嚑涓儴鍒嗙粍鎴愶紵</p> - <textarea v-model="questionData.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" class="textarea-box" + <p class="block p-even td-0">1.鑸┖涓氱敱鍝嚑涓儴鍒嗙粍鎴愶紵</p> + <textarea v-model="questionData.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" class="textarea-box-left" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused == 'one' }" @focus="handleFocus('one')" @blur="handleBlur()"></textarea> - <p class="block p-even">2.浠�涔堟槸姘戠敤鑸┖锛熸皯鐢ㄨ埅绌哄彲鍒嗕负鍝嚑涓儴鍒嗭紵</p> - <textarea v-model="questionData.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" class="textarea-box" + <p class="block p-even td-0">2.浠�涔堟槸姘戠敤鑸┖锛熸皯鐢ㄨ埅绌哄彲鍒嗕负鍝嚑涓儴鍒嗭紵</p> + <textarea v-model="questionData.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" class="textarea-box-left" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused == 'two' }" @focus="handleFocus('two')" @blur="handleBlur()"></textarea> - <p class="block p-even">3.姘戣埅绯荤粺鐢卞摢鍑犱釜閮ㄥ垎缁勬垚锛�</p> - <textarea v-model="questionData.reading.three" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" class="textarea-box" - @change="setBookQuestion" :class="{ 'textarea-focused': isFocused == 'three' }" - @focus="handleFocus('three')" @blur="handleBlur()"></textarea> - <p class="block p-even">4.浣犳墍鐭ラ亾鐨勬皯鐢ㄨ埅绌哄櫒鍒堕�犱笟鏈夊摢浜涳紵</p> - <textarea v-model="questionData.reading.four" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" class="textarea-box" + <p class="block p-even td-0">3.姘戣埅绯荤粺鐢卞摢鍑犱釜閮ㄥ垎缁勬垚锛�</p> + <textarea v-model="questionData.reading.three" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'three' }" @focus="handleFocus('three')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">4.浣犳墍鐭ラ亾鐨勬皯鐢ㄨ埅绌哄櫒鍒堕�犱笟鏈夊摢浜涳紵</p> + <textarea v-model="questionData.reading.four" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" class="textarea-box-left" @change="setBookQuestion" :class="{ 'textarea-focused': isFocused == 'four' }" @focus="handleFocus('four')" @blur="handleBlur()"></textarea> <!-- 棰樼洰 --> <!-- <div class="bk-ztgs"> <p class="bj1-ztgs">姘戣埅姒傝璇曢01</p> - </div> --> </div> </div> </div> - <el-dialog :visible.sync="dialogVisible" width="60vw" top="2vh" append-to-body lock-scroll :show-close="false" - class="custom-dialog"> - <div slot="title" class="header_title"> - <span>{{ pdfTitle }}</span> - <span @click="closeDialog"> x </span> + <!-- 37椤� --> + <div class="page-box" page="44"> + <div v-if="showPageList.indexOf(44) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">036</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div style="min-height:800px"><iframe :src="iframSrc" frameborder="0" + style="width: 100%; height: 800px"></iframe></div> + </div> </div> - <div class="pdfModal" v-if="dialogVisible"> - <preView :isClear="dialogVisible" :md5="p_md5"></preView> - </div> - </el-dialog> + </div> + <preView :isClear="dialogVisible" :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> </div> </template> @@ -854,14 +1710,19 @@ showPageList: { type: Array, }, + }, components: { preView, }, data() { return { + pdfDialogRef:"", + iframSrc: "", + showChoiceAnswer: false, showQuestionAnswer: false, - pdfTitle: '', + showCheckAnswer: false, + somePdfTitleValue: '', p_md5: '', dialogVisible: false, isFocused: null, @@ -881,6 +1742,20 @@ isRight: null, }, }, + inputChoiceData: { + isComplete: false, + value: { // 鐩存帴浣跨敤userAnswer鏉ュ瓨鍌ㄧ敤鎴风殑閫夋嫨 + userAnswer: "", + answer: "B", + isRight: null, + }, + }, + check: { + isComplete: false, + isRight: null, + answer: ["A", "B", "C"], + value: [], + } }, chapter001: { pdfMd5: { @@ -898,7 +1773,6 @@ } }, mounted() { - const bookQuestion = localStorage.getItem("civilAviatyon-book-chapter01-question-one"); if (bookQuestion) { this.questionData = JSON.parse(bookQuestion); @@ -907,16 +1781,24 @@ if (choiceQuestion) { this.questionData.dropdownChoiceData = JSON.parse(choiceQuestion); } + + const choiceInputQuestion = localStorage.getItem("civilAviatyon-book-chapter01-choice-two"); + if (choiceInputQuestion) { + this.questionData.inputChoiceData = JSON.parse(choiceInputQuestion); + } + + const CheckQuestion = localStorage.getItem("civilAviatyon-book-chapter01-choice-three"); + if (CheckQuestion) { + this.questionData.check = JSON.parse(CheckQuestion); + } + this.getModel() }, methods: { - closeDialog() { - this.dialogVisible = false - }, toUrl(val) { if (val) { - this.dialogVisible = true this.p_md5 = this.chapter001.pdfMd5[val].md5 - this.pdfTitle = this.chapter001.pdfMd5[val].name + this.somePdfTitleValue = this.chapter001.pdfMd5[val].name + this.$refs.pdfDialogRef.openDialog() } }, setBookQuestion() { @@ -927,13 +1809,27 @@ }, handleFocus(id) { this.isFocused = id; // 褰搕extarea鑱氱劍鏃讹紝璁剧疆涓簍rue - }, handleBlur() { this.isFocused = null; // 褰搕extarea澶卞幓鐒︾偣鏃讹紝璁剧疆涓篺alse }, saveChoiceQuestion() { localStorage.setItem('civilAviatyon-book-chapter01-choice-one', JSON.stringify(this.questionData.dropdownChoiceData)) + }, + saveInputChoice() { + localStorage.setItem('civilAviatyon-book-chapter01-choice-two', JSON.stringify(this.questionData.inputChoiceData)) + }, + saveCheckChoice() { + localStorage.setItem('civilAviatyon-book-chapter01-choice-three', JSON.stringify(this.questionData.check)) + }, + goChoiceJudge() { + if (this.questionData.inputChoiceData.value.userAnswer == this.questionData.inputChoiceData.value.answer) { + this.questionData.inputChoiceData.value.isRight = true + } else { + this.questionData.inputChoiceData.value.isRight = false + } + this.questionData.inputChoiceData.isComplete = true + this.showChoiceAnswer = true }, goJudge() { if (this.questionData.dropdownChoiceData.value.userAnswer == this.questionData.dropdownChoiceData.value.answer) { @@ -944,6 +1840,19 @@ this.questionData.dropdownChoiceData.isComplete = true this.showQuestionAnswer = true }, + // 澶氶�夐 + goCheckJudge() { + this.questionData.check.isComplete = true + this.showCheckAnswer = true + }, + + isShowRight(answer, userAnswer, data) { + let flag = null; + if (userAnswer.indexOf(data) > -1) { + flag = answer.indexOf(data) > -1 ? true : false; + } + return flag; + }, changeTestData() { localStorage.removeItem("civilAviatyon-book-chapter01-choice-one") this.questionData.dropdownChoiceData.value.userAnswer = "", @@ -951,7 +1860,34 @@ this.questionData.dropdownChoiceData.isComplete = false this.showQuestionAnswer = false }, + + changeChoiceData() { + localStorage.removeItem("civilAviatyon-book-chapter01-choice-two") + this.questionData.inputChoiceData.value.userAnswer = "", + this.questionData.inputChoiceData.value.isRight = null, + this.questionData.inputChoiceData.isComplete = false + this.showChoiceAnswer = false + }, + changeCheckData() { + localStorage.removeItem("civilAviatyon-book-chapter01-choice-three") + this.questionData.check.value = [], + this.questionData.check.isRight = null, + this.questionData.check.isComplete = false + this.showCheckAnswer = false + }, + // 涓夌淮妯″瀷 + getModel() { + const ctx = 'https://jsek.bnuic.com' + let localStr = + './static/modelView/index.html?md5=e405ef70e49088f167a0fd613b85b7b3' + + '&name=je' + + '&domain=' + + ctx + + '&target=iframe' + this.iframSrc = localStr + } } + } </script> @@ -968,9 +1904,9 @@ .img { margin: 0 !important; - font-size: 14px !important; + font-size: 16px !important; position: absolute !important; - left: 35% !important; + left: 40% !important; bottom: -2% !important; } diff --git a/src/books/civilAviation/view/components/chapter002.vue b/src/books/civilAviation/view/components/chapter002.vue new file mode 100644 index 0000000..5ae9685 --- /dev/null +++ b/src/books/civilAviation/view/components/chapter002.vue @@ -0,0 +1,4485 @@ +<template> + <div class="chapter" num="3"> + <!-- 绗簩鍗曞厓灏侀潰 --> + <div class="page-box" style="min-height: 1108px !important" page="45"> + <div v-if="showPageList.indexOf(45) > -1" class="fl"> + <img class="img-0" alt="" src="../../assets/images/0049.jpg" /> + </div> + </div> + <!-- 38椤� --> + <div class="page-box" page="46"> + <div v-if="showPageList.indexOf(46) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">038</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h2 id="b003" class="p-even unit2-c"> + <img class="inline1" alt="" src="../../assets/images/zszb.jpg" /> + </h2> + <h3 id="c001" class="p-even unit2-c"> + 瀛︿範浠诲姟涓�<br />姘戠敤鑸┖鍣ㄧ殑鍒嗙被鍜屽簲鐢� + </h3> + <div class="task-u2-c ma-l"></div> + <p class="p-even"> + 鑸┖鍣ㄧ绫荤箒澶氾紝璐ㄩ噺浠庡嚑鍏嬪埌鍑犵櫨鍚紝椋炶楂樺害浠庡嚑绫冲埌涓婁竾绫筹紝澶栧舰涔熸槸鍗冨鐧炬�紝涓嶅悓鐨勮埅绌哄櫒鐢ㄩ�斾篃涓嶅敖鐩稿悓銆備负浜嗗鑸┖鍣ㄦ湁杈冨叏闈㈢殑浜嗚В锛屾垜浠牴鎹笉鍚岀殑鐩殑锛岄噰鍙栦笉鍚岀殑鏂瑰紡锛屽鑸┖鍣ㄨ繘琛屽垎绫汇�� + </p> + <h4 id="d015" class="unit2-c p-even">涓�銆佽埅绌哄櫒鐨勫垎绫�</h4> + <p class="p-even"> + 浠讳綍鐢变汉鍒堕�犮�佽兘椋炵鍦伴潰骞剁敱浜烘潵鎺у埗鐨勯琛岀墿浣撻兘绉颁负椋炶鍣ㄣ�傚湪澶ф皵灞備腑椋炶鐨勯琛屽櫒绉颁负鑸┖鍣紝椋炲嚭澶ф皵灞傜殑椋炶鍣ㄧО涓鸿埅澶╁櫒銆傞鏈恒�侀鑹囩瓑涓鸿埅绌哄櫒锛屼汉閫犲崼鏄熴�佸畤瀹欓鑸圭瓑涓鸿埅澶╁櫒銆傝埅澶╁張绉扮┖闂撮琛屾垨瀹囧畽鑸锛屾硾鎸囪埅澶╁櫒鍦ㄥ湴鐞冨ぇ姘斿眰浠ュ锛堝寘鎷お闃崇郴鍐咃級鐨勮埅琛屾椿鍔ㄣ�傛寜鏄惁鍙浇浜哄垎涓烘棤浜鸿埅澶┿�佽浇浜鸿埅澶╋紱鎸夌敤閫斿彲鍒嗕负姘戠敤鑸ぉ鍜屽啗浜嬭埅澶╋紱鎸夎埅澶╁櫒绉嶇被鍙垎涓哄绉嶏紝濡傚崼鏄熻埅澶┿�佽浇浜洪鑸硅埅澶╃瓑銆傝埅澶╄繖涓汉绫诲巻鍙查暱娌充腑鐨勬柊浜嬬墿搴旂敤浜嗕紬澶氭秹鍙婂熀鏈蹇电殑鍚嶈瘝锛岃繖浜涘悕璇嶄笌鑸┖鏈夊緢澶у樊鍒�� + </p> + <p class="p-even"> + 鑸┖鏄寚椋炶鍣ㄥ湪澶ф皵灞備腑鐨勯琛屾椿鍔紝鍖呮嫭浣跨敤椋炴満銆侀鑹囥�佹阿姘旂悆绛夊悇绉嶉琛屽櫒锛屼竴鑸鎸囦娇鐢ㄩ鏈恒�� + </p> + <p class="p-even"> + 鍥介檯姘戣埅缁勭粐瀵硅埅绌哄櫒鐨勫畾涔夋槸锛氫换浣曞彲浠ヤ粠绌烘皵鐨勫弽浣滅敤鍔涘彇寰楁敮鎾戝姏鐨勬満鍣紝杩欓噷鐨勭┖姘斿弽浣滅敤鍔涗笉鍖呮嫭绌烘皵瀵瑰湴闈㈢殑鍙嶄綔鐢ㄥ姏銆傝繖涓畾涔夊鑸┖鍣ㄥ仛浜嗚繘涓�姝ョ殑鐣屽畾锛屾妸纾佹偓娴垪杞︺�佹皵鍨埞銆佸湴鏁堥琛屽櫒绛変緷闈犵鍔涖�佺┖姘斿拰鍦伴潰鐨勫弽浣滅敤鍔涚寮�鍦伴潰鐨勬満姊版帓闄ゅ湪鑸┖鍣ㄧ殑鑼冪暣涔嬪銆� + </p> + <p class="p-even"> + 鏍规嵁鑾峰緱鍏嬫湇閲嶅姏鐨勬敮鎾戝姏鏂瑰紡鐨勪笉鍚岋紝鍥介檯姘戣埅缁勭粐灏嗚埅绌哄櫒鍒嗕负涓ゅぇ绫伙細涓�绫绘槸杞讳簬绌烘皵鐨勮埅绌哄櫒锛屽畠涓嶉渶瑕佸拰绌烘皵鏈夌浉瀵硅繍鍔紝渚濋潬娴姏鍏嬫湇閲嶅姏锛屼篃鍙潤鍔涢琛屽櫒锛涘彟涓�绫绘槸閲嶄簬绌烘皵鐨勮埅绌哄櫒锛屽畠闇�瑕佸拰绌烘皵鏈夌浉瀵硅繍鍔紝闈犺繍鍔ㄧ┖姘斾骇鐢熺殑绌烘皵鍔ㄥ姏鏉ュ厠鏈嶉噸鍔涳紝涔熷彨鍔ㄥ姏椋炶鍣ㄣ�� + </p> + </div> + </div> + </div> + <!-- 39椤� --> + <div class="page-box" page="47"> + <div v-if="showPageList.indexOf(47) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">039</li> + </ul> + <div class="bodystyle"> + <p class="p-odd">甯歌鐨勮埅绌哄櫒绉嶇被濡傚浘2-1鎵�绀恒��</p> + <p class="center openImgBox p-odd"> + <img class="w80" alt="" src="../../assets/images/0051-1.jpg" /> + </p> + <p class="img p-odd">鍥�2-1 甯歌鐨勮埅绌哄櫒绉嶇被</p> + <h5 id="e005" class="unit2-c">锛堜竴锛夎交浜庣┖姘旂殑鑸┖鍣�</h5> + <p class="p-odd"> + 杞讳簬绌烘皵鐨勮埅绌哄櫒鐨勪富浣撴槸涓�涓皵鍥婏紝鍏朵腑鍏呬互瀵嗗害杈冪┖姘斿皬鐨勬皵浣擄紝鍒╃敤澶ф皵鐨勬诞鍔涗娇鑸┖鍣ㄥ崌绌恒�傛皵鐞冨拰椋炶墖閮芥槸杞讳簬绌烘皵鐨勮埅绌哄櫒锛屼簩鑰呯殑涓昏鍖哄埆鏄細鍓嶈�呮病鏈夊姩鍔涜缃紝鍗囩┖鍚庡彧鑳介殢椋庨鍔紝鎴栬�呰绯荤暀鍦ㄦ煇涓�鍥哄畾浣嶇疆涓婏紝涓嶈兘鑷敱椋炶锛涘悗鑰呰鏈夊彂鍔ㄦ満銆佸畨瀹氶潰鍜屾搷绾甸潰锛屽彲浠ユ帶鍒堕琛屾柟鍚戝拰璺嚎銆� + </p> + <h6 id="f001">1.姘旂悆</h6> + <p class="p-odd"> + 姘旂悆鏈変竴涓法澶х殑姘斿泭锛屽ぇ澶氭暟涓虹悆褰紝渚濋潬瀹冨湪绌烘皵涓骇鐢熺殑娴姏鏉ュ厠鏈嶉噸鍔涘崌绌恒�傞潬鍔犵儹姘斿泭涓┖姘斾娇涔嬪瘑搴﹀彉灏忚�屽崌绌虹殑鍙儹姘旂悆锛屾皵鍥婁腑濉厖姣旂┖姘斿瘑搴﹀皬鐨勬阿姘斻�佹唉姘旀垨澶╃劧姘旂殑缁熺О姘㈡皵鐞冦�備汉绫绘渶鏃╀緷闈犵儹姘旂悆锛堝浘2-2锛夐涓婂ぉ绌猴紝浣嗙幇鍦ㄦ皵鐞冧粎浠呭湪姘旇薄瑙傛祴銆佸簡鍏告椿鍔ㄣ�佷綋鑲叉椿鍔ㄧ瓑棰嗗煙涓娇鐢ㄤ簡銆傛皵鐞冨崌绌哄悗涓嶅姞鎺у埗锛屽彧鑳介殢椋庨绉荤殑锛屽彨鑷敱姘旂悆锛屼富瑕佺敤浜庢皵璞¤娴嬨�佸簡鍏告椿鍔ㄧ瓑锛涘崌绌哄悗鏈夌怀绱㈢郴鐣欏湪鍦伴潰鐨勫彨绯荤暀寮忔皵鐞冿紙鍥�2-3锛夛紝涓昏鐢ㄤ簬骞垮憡銆佸簡鍏告椿鍔ㄧ瓑銆� + </p> + <div class="fl p-odd"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0051-2.jpg" /> + </p> + <p class="img">鍥�2-2 鐑皵鐞�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0051-3.jpg" /> + </p> + <p class="img">鍥�2-3 绯荤暀寮忔皵鐞�</p> + </span> + </div> + </div> + </div> + </div> + <!-- 40椤� --> + <div class="page-box" page="48"> + <div v-if="showPageList.indexOf(48) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">040</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h6 id="f002" class="p-even">2.椋炶墖</h6> + <p class="p-even"> + 椋炶墖鍜屾皵鐞冧竴鏍凤紝涔熸槸渚濋潬绌烘皵鐨勬诞鍔涘疄鐜板崌绌虹殑锛屼絾瀹冨畨瑁呮湁浠ヨ灪鏃嬫〃涓烘帹杩涜缃殑鍙戝姩鏈猴紝鍙互鎸夌収鎿嶇旱鑰呯殑鎰忔効椋炲線鐩殑鍦般�傛牴鎹鑹囨皵鍥婄粨鏋勪笉鍚岋紝鍙皢椋炶墖鍒嗕负鍒氭�ч鑹囥�佸崐鍒氭�ч鑹囧拰闈炲垰鎬ч鑹囥�� + </p> + <p class="p-even"> + 椋炶墖鏄汉绫绘渶鏃╃敤浜庤埅绌鸿繍杈撶殑浜ら�氬伐鍏凤紝鍏朵腑鏈�鏈夊悕鐨勬槸鍓嶆枃鎻愬埌鐨勨�滃叴鐧诲牎鈥濆彿椋炶墖锛屽彲鎼哄甫杩�100鍚嶄箻鍛樿繘琛岃法娲嬮琛屻�傗�滃叴鐧诲牎鈥濆彿椋炶墖澶变簨浠ュ悗锛岃埅绌鸿繍杈撻鍩熸墠瀹屽叏琚鏈哄彇浠c�傜幇鍦ㄩ鑹囦富瑕佺敤浜庡箍鍛娿�佸簡鍏告椿鍔ㄧ瓑棰嗗煙銆� + </p> + <h5 id="e006" class="p-even unit2-c">锛堜簩锛夐噸浜庣┖姘旂殑鑸┖鍣�</h5> + <p class="p-even"> + 閲嶄簬绌烘皵鐨勮埅绌哄櫒鏄緷闈犺埅绌哄櫒鑷韩涓庣┖姘旂浉瀵硅繍鍔ㄤ骇鐢熺殑绌烘皵鍔ㄥ姏鍏嬫湇閲嶅姏鏉ュ疄鐜板崌绌洪琛岀殑銆� + </p> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0052-1.jpg" /> + <p class="img">鍥�2-4 閫犲瀷鍚勫紓鐨勭幇浠i绛�</p> + </div> + <span> + <h6 id="f003" class="p-even">1.椋庣瓭</h6> + <p class="p-even"> + 椋庣瓭鏄渶鏃╁嚭鐜扮殑閲嶄簬绌烘皵鐨勮埅绌哄櫒锛岃縿浠婂凡鏈�4000骞村巻鍙层�傞绛濈殑鍑虹幇璇佹槑浜嗛噸浜庣┖姘旂殑鐗╀綋椋炰笂澶╃┖鐨勫彲鑳芥�с�傚湪鑸┖鍙戝睍鍒濇湡锛岄绛濈粡甯告槸鐢ㄦ潵楠岃瘉绌烘皵鍔ㄥ姏鐨勬墜娈点�傜幇浠i绛濓紙鍥�2-4锛夐�犲瀷缇庤锛屽鐢ㄤ簬濞变箰銆佸簡鍏哥瓑娲诲姩銆� + </p> + </span> + <div class="bk"> + <p><b>鑰冭瘉鎸囧崡锛氱┖娓湇鍔$鐞嗗笀鑰冮</b></p> + <div v-for="(item,index) in singleChoiceOne" :key="index"> + <p class="block">{{index+1}}.{{ item.txt }}</p> + <p class="block" v-for="(citem,cindex) in item.option" :key="cindex"> + <input type="radio" :value="citem.zm" name="toobusy" + :disabled="item.isComplete" + v-model="item.userAnswer" @change="saveChoiceOne" /> + {{ citem.txt }} + </p> + <p class="event-header-text-bc pd-5 fl jc-sa" style="margin-left: 8px; width: 93%" + v-if="showSingleChoice"> + <span class="c-g"> 绛旀锛歿{ item.answer }} </span> + <span + :class="{ 'c-g': item.isRight, 'c-r': item.isRight == false }">鎮ㄧ殑绛旀锛歿{ + item.userAnswer + }}</span> + <span class="icon-box-big fl al-c"> + <svg v-if="item.isRight" t="1716986419862" class="icon" + viewBox="0 0 1820 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" + p-id="18767" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if="item.isRight == false" t="1716987085767" + class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + </div> + <!-- 鎻愪氦鎸夐挳 --> + <div class="w100 fl ju-cn"> + <ul class="fl ju-ev w80 choice"> + <li> + <button class="btn-border btn-w" @click="goSingleChoice"> + 鎻愪氦 + </button> + </li> + <li> + <button @click="changeSingleChoice" class="btn-border btn-w"> + 閲嶅仛 + </button> + </li> + <li> + <button @click="showSingleChoice = !showSingleChoice" class="parimary-btn"> + 鏌ョ湅绛旀 + </button> + </li> + </ul> + </div> + </div> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0052-2.jpg" /> + <p class="img">鍥�2-5 婊戠繑鏈�</p> + </div> + <span> + <h6 id="f004" class="p-even">2.婊戠繑鏈�</h6> + <p class="p-even"> + 婊戠繑鏈猴紙鍥�2-5锛夋槸涓嶅畨瑁呭姩鍔涜缃�佸甫鏈夊浐瀹氭満缈笺�侀噸浜庣┖姘旂殑鑸┖鍣ㄣ�傚畠鐨勫崌绌轰富瑕侀潬鍏朵粬鏈烘锛堝椋炴満銆佺粸鐩樿溅绛夛級鐨勭壍寮曟垨鏄粠楂樺涓嬫粦鏉ュ疄鐜帮紝瀹冮潬婊戠繑鏃朵笌绌烘皵鐨勭浉瀵硅繍鍔ㄨ幏寰楀崌鍔涳紝缁存寔鍦ㄧ┖涓殑椋炶銆傛粦缈旀満鐨勬湰璐ㄥ氨鏄笉甯﹀姩鍔涜缃殑椋炴満銆傛粦缈旀満鏄鏈哄嚭鐜颁互鍓嶅敮涓�鍙互杞戒汉椋炶鐨勯噸浜庣┖姘旂殑鑸┖鍣紝浜轰滑閫氳繃瀹冩懜绱㈠嚭浜嗗姩鍔涢琛岀殑鍩烘湰鍘熺悊鍙婇鏈虹殑鍩烘湰鎿嶇旱鏂规硶锛屼负椋炴満鐨勫彂鏄庡仛鍑轰簡 + </p> + </span> + </div> + </div> + </div> + <!-- 41椤� --> + <div class="page-box" page="49"> + <div v-if="showPageList.indexOf(49) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">041</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 宸ㄥぇ璐$尞銆傛粦缈旀満涓昏搴旂敤浜庝綋鑲茶繍鍔ㄣ�佽埅绌虹煡璇嗘櫘鍙婄瓑锛�20涓栫邯70骞翠唬鍚庡嚭鐜颁簡閫犱环浣庡粔鐨勬煍鎬ф満缈煎拰浼炵考婊戠繑鏈猴紙鍥�2-6锛夛紝鍏朵腑浠ユ粦缈斾紴锛堝浘2-7锛夊眳澶氾紝浣挎粦缈旇繍鍔ㄦ洿鍔犳櫘鍙娿�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0053-1.jpg" /> + <p class="img">鍥�2-6 浼炵考婊戠繑鏈�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0053-2.jpg" /> + <p class="img">鍥�2-7 婊戠繑浼�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <h6 id="f005" class="p-odd">3.椋炴満</h6> + <p class="p-odd"> + 缁忚繃鍏ㄥ浗绉戝鎶�鏈悕璇嶅瀹氬鍛樹細瀹℃牳鐨勯鏈虹殑瀹氫箟鏄細鐢卞浐瀹氱考浜х敓鍗囧姏锛岀敱鎺ㄨ繘瑁呯疆浜х敓鎺紙鎷夛級鍔涳紝鍦ㄥぇ姘斿眰涓琛岀殑閲嶄簬绌烘皵鐨勮埅绌哄櫒銆備粠瀹氫箟涓婄湅锛岀洿鍗囨満娌℃湁鍥哄畾鐨勬満缈硷紝鍥犳涓嶅睘浜庨鏈鸿寖鐣淬�� + </p> + <p class="p-odd"> + 椋炴満鏄綋鍓嶆渶涓昏鐨勮埅绌哄櫒锛岃櫧鐒跺畠鐨勫彂鏄庢櫄浜庨潤鍔涜埅绌哄櫒涓�鐧惧骞达紝浣嗗彧鏈夊畠鎵嶇湡姝f妸浜虹被甯﹀叆鑸┖鏃朵唬锛屽苟浣夸汉绫荤殑鑸┖浜嬩笟澶ф杩� + </p> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0053-3.jpg" /> + <p class="img">鍥�2-8 AG600</p> + </div> + <span> + <p class="p-odd td-0"> + 杩涖�傛皯鐢ㄨ埅绌哄櫒涓紝椋炴満鐨勬暟閲忓崰鍒颁簡98%浠ヤ笂銆� + </p> + </span> + <span> + <p class="p-odd"> + 椋炴満鎸夌敤閫斾笉鍚屽彲鍒嗕负姘戠敤椋炴満鍜屽啗鐢ㄩ鏈猴紝鎸夎捣闄嶅満鍦颁笉鍚屽彲鍒嗕负闄嗕笂椋炴満銆佹按涓婇鏈哄拰姘撮檰涓ょ敤椋炴満锛屽浘2-8涓烘垜鍥借璁$敓浜х殑AG600鈥滈膊榫欌�濆ぇ鍨嬫按闄嗕袱鐢ㄩ鏈恒�傛皯鐢ㄨ埅绌哄櫒涓昏鏄檰涓婇鏈恒�� + </p> + </span> + <div class="pdf-text"> + <div class="pdf-con"> + <div class="pdf-view"> + <span> + <svg t="1717640665152" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="11009" width="25.098" height="24.098"> + <path + d="M896.152 336.108l0 576.229c0 26.511-21.508 48.019-48.018 48.019L175.866 960.356c-26.511 0-48.019-21.508-48.019-48.019L127.847 112.019c0-26.511 21.508-48.019 48.019-48.019l448.179 0c26.512 0 63.527 15.508 82.031 34.013l156.064 156.064C880.645 272.582 896.152 309.597 896.152 336.108zM832.127 384.127 624.045 384.127c-26.512 0-48.02-21.508-48.02-48.019L576.025 128.025 191.873 128.025l0 768.306 640.254 0L832.127 384.127zM335.93 448.153l352.14 0c9.004 0 16.006 7.003 16.006 16.006l0 32.013c0 9.003-7.002 16.007-16.006 16.007L335.93 512.179c-9.003 0-16.006-7.003-16.006-16.007l0-32.013C319.924 455.156 326.927 448.153 335.93 448.153zM704.076 592.21l0 32.013c0 9.004-7.002 16.007-16.006 16.007L335.93 640.23c-9.003 0-16.006-7.003-16.006-16.007L319.924 592.21c0-9.003 7.003-16.006 16.006-16.006l352.14 0C697.074 576.204 704.076 583.207 704.076 592.21zM704.076 720.262l0 32.013c0 9.003-7.002 16.006-16.006 16.006L335.93 768.281c-9.003 0-16.006-7.003-16.006-16.006l0-32.013c0-9.004 7.003-16.007 16.006-16.007l352.14 0C697.074 704.255 704.076 711.258 704.076 720.262zM640.051 320.102l188.076 0c-3.002-8.505-7.502-17.009-11.002-20.511L660.563 143.029c-3.502-3.501-12.006-8-20.512-11.003L640.051 320.102z" + p-id="11010"></path> + </svg> + </span> + <span @click="toUrl(1)">{{ chapter002.pdfMd5[1].name }}.pdf</span> + </div> + </div> + </div> + <h6 id="f006" class="p-odd">4.鏃嬬考鑸┖鍣�</h6> + <p class="p-odd"> + 鍜屽浐瀹氱考椋炴満涓嶅悓锛屾棆缈艰埅绌哄櫒娌℃湁鍥哄畾鐨勬満缈硷紝瀹冧骇鐢熷崌鍔涚殑閮ㄥ垎鏄彲浠ユ棆杞殑鍙剁墖锛岀被浼间簬铻烘棆妗ㄣ�傛棆缈艰埅绌哄櫒涓昏鏈夋棆缈兼満鍜岀洿鍗囨満涓ょ銆� + </p> + <p class="p-odd"> + 鏃嬬考鏈猴紙鍥�2-9锛夋槸涓�绉嶅埄鐢ㄥ墠椋炴椂鐨勭浉瀵规皵娴佸惞鍔ㄦ棆缈艰嚜杞互浜х敓鍗囧姏鐨勬棆缈艰埅绌哄櫒銆傚畠鍓嶈繘鐨勫姩鍔涚敱鍙戝姩鏈哄甫鍔ㄨ灪鏃嬫〃鐩存帴鎻愪緵锛屾棆缈兼満蹇� + </p> + </div> + </div> + </div> + <!-- 42椤� --> + <div class="page-box" page="50"> + <div v-if="showPageList.indexOf(50) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">042</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0054-1.jpg" /> + <p class="img">鍥�2-9 鏃嬬考鏈�</p> + </div> + <span> + <p class="p-even td-0"> + 椤绘粦璺戝姞閫熸墠鑳借捣椋炪�傛棆缈兼満鍑虹幇鍦�1923骞达紝鐢变簬鍏跺彧鑳界煭璺濈椋炶锛岀伒娲绘�т笉濡傜洿鍗囨満锛屽叾浠栨�ц兘鍙堟瘮椋炴満宸簡寰堝锛屾墍浠ュ彧鐢ㄤ簬浣撹偛娲诲姩鍜岄儴鍒嗙壒娈婂啗浜嬫椿鍔ㄣ�� + </p> + </span> + <span> + <p class="p-even"> + 鐩村崌鏈虹被浼间簬鏃嬬考鏈猴紝鍏嬫湇閲嶅姏鐨勫姏閲忎篃鏉ヨ嚜鏃嬬考銆傚畠浠殑鍖哄埆鏄洿鍗囨満鐨勬棆缈肩洿鎺ョ敱鍙戝姩鏈哄甫鍔紝鑰屼笉鏄潬鐩稿姘旀祦鍚瑰姩銆傜涓�鏋剁洿鍗囨満锛堝浘2-9锛夎癁鐢熶簬1907骞达紝鍏锋湁浣跨敤浠峰�肩殑鐩村崌鏈哄彂鏄庝簬1936骞淬�� + </p> + </span> + <p class="p-even"> + 鐩村崌鏈轰互鍏跺彲浠ュ瀭鐩磋捣闄嶃�佸鏈哄満鏉′欢瑕佹眰浣庛�佸彲浠ユ偓鍋滃苟鑳藉墠鍚庡乏鍙崇Щ鍔ㄧ殑鐏垫椿椋炶鐗规�э紝鍦ㄨ埅绌哄櫒棰嗗煙鏈夌潃涓嶅彲鏇夸唬鐨勪綅缃�備絾鍜岄鏈虹浉姣旓紝鐩村崌鏈鸿埅绋嬬煭銆佷娇鐢ㄥ拰缁存姢璐圭敤楂樸�佹尟鍔ㄥぇ銆佹湁鏁堣浇鑽峰皬锛岄檺鍒朵簡瀹冪殑骞挎硾搴旂敤锛屽彧鑳戒綔涓洪鏈虹殑琛ュ厖锛屼笉鑳戒綔涓烘皯鑸殑涓诲姏鏈虹銆傜洿鍗囨満鏁伴噺鍦ㄦ皯鐢ㄨ埅绌哄櫒涓崰涓嶈冻2%鐨勪唤棰濓紝涓昏鐢ㄤ簬鍖荤枟鏁戞姢銆佸湴璐ㄥ嫎娴嬨�佹.鏋楅槻鐏�佹捣涓婇噰娌广�佸悐瑁呰澶囩瓑棰嗗煙锛屽浘2-10涓�2022骞村洓宸濇掣瀹氬湴闇囧彂鐢熷悗鍙備笌鎶楅渿鏁戠伨鐨勭洿鍗囨満銆� + </p> + <div class="fl"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0054-2.jpg" /> + </p> + <p class="img">鍥�2-10 浜虹被绗竴鏋剁洿鍗囨満</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0054-3.jpg" /> + </p> + <p class="img">鍥�2-11 鍙備笌鎶楅渿鏁戠伨鐨勭洿鍗囨満</p> + </span> + </div> + <h6 id="f007" class="p-even">5.鎵戠考鏈�</h6> + <p class="p-even"> + 鎵戠考鏈猴紙鍥�2-12锛夋槸浜虹被鏃╂湡璇曞浘妯′豢楦熺被椋炶鑰屽埗閫犵殑涓�绉嶈埅绌哄櫒銆傚畠鐢ㄥ儚椋為笩缈呰唨閭f牱鎵戝姩鐨勭考闈骇鐢熷崌鍔涘拰鎷夊姏锛屼絾鏄紝鐢变簬浜轰滑瀵归笩绫婚琛屾椂缈呰唨鐨勫鏉傝繍鍔ㄨ繕娌℃湁瀹屽叏浜嗚В娓呮锛屽姞涔嬪埗閫犲儚楦熺繀鑶�閭f牱鎵戝姩鐨勭考闈㈣繕鏈夎澶氭妧鏈笂鐨勫洶闅撅紝鎵戠考鏈鸿繕娌℃湁鑾峰緱鎴愬姛銆� + </p> + </div> + </div> + </div> + <!-- 43椤� --> + <div class="page-box" page="51"> + <div v-if="showPageList.indexOf(51) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">043</li> + </ul> + <div class="bodystyle"> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0055-01.jpg" /> + <p class="img">鍥�2-12 鎵戠考鏈�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0055-02.jpg" /> + <p class="img">鍥�2-12 鎵戠考鏈�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="p-odd"> + 缁间笂鎵�杩帮紝鑸┖鍣ㄨ櫧鐒剁绫荤箒澶氾紝浣嗙湡姝e湪姘戣埅涓箍娉涘簲鐢ㄧ殑鍙槸椋炴満锛屽湪涓埆棰嗗煙涓敤鍒板皯閲忕殑鐩村崌鏈恒�傚洜姝わ紝鏈功璁ㄨ鐨勮埅绌哄櫒涓昏閽堝姘戠敤椋炴満銆� + </p> + <h4 id="d016" class="p-odd unit2-c">浜屻�佹皯鐢ㄩ鏈虹殑鍒嗙被</h4> + <p class="p-odd"> + 姘戠敤椋炴満鎸夌敤閫旓紝鍙互鍒嗕负鐢ㄤ簬鍟嗕笟椋炶鐨勮埅绾块鏈哄拰鐢ㄤ簬閫氱敤鑸┖鐨勯�氱敤鑸┖椋炴満涓ゅぇ绫汇�傚湪鑸嚎椋炴満鍜岄�氱敤鑸┖椋炴満鐨勫垎绫讳笅锛岃繕鏈夋洿缁嗙殑鍒嗙被銆� + </p> + <h5 id="e007" class="p-odd unit2-c">锛堜竴锛夎埅绾块鏈�</h5> + <p class="p-odd"> + 鑸嚎椋炴満鍙堢О杩愯緭鏈猴紝鍙垎涓鸿繍杈撴梾瀹㈢殑瀹㈡満銆佽繍閫佽揣鐗╃殑璐ф満鍜屽璐у吋杞界殑瀹㈣揣涓ょ敤鏈恒�� + </p> + <p class="p-odd"> + 鑷�2022骞村勾搴曪紝鍏ㄧ悆鍦ㄩ鐨勮埅绾块鏈烘�绘暟瓒呰繃3涓囨灦锛屼笉鍒版皯鐢ㄩ鏈烘�绘暟鐨�7%锛屼絾瀹冧滑鐨勯琛岃埅绾挎瀯鎴愪簡鍏ㄧ悆鑼冨洿鍐呯殑鑸┖杩愯緭缃戯紝鏈虹兢鐨勮嚜韬环鍊煎拰浜у�奸兘鍗犳皯鑸笟鍔$殑95%浠ヤ笂銆傝埅绾块鏈哄挨鍏舵槸瀹㈡満鏄皯鑸繍杈撶殑涓讳綋锛屼互涓嬪鑸嚎椋炴満鐨勮璁轰互鐜颁唬瀹㈡満涓轰富銆� + </p> + <div class="text-rights"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">鎯充竴鎯斥柤</span></p> + </div> + <p class="block"> + 鑸▼鏄寚椋炴満鍦ㄦ棤椋庡ぇ姘斾腑锛屾部棰勫畾鐨勮埅绾块琛岋紝浣跨敤瀹岃瀹氱殑鐕冩补鎵�缁忚繃鐨勬按骞宠窛绂汇�� + </p> + </div> + </div> + <span> + <p class="p-odd">瀹㈡満鏍规嵁涓嶅悓鐨勫垎绫绘爣鍑嗭紝鍙互鍒嗗嚭涓嶅悓鐨勭被鍒��</p> + </span> + <span> + <p class="p-odd"> + 鎸夎埅绋嬪垎锛屽彲浠ュ垎涓鸿繙绋嬪鏈恒�佷腑绋嬪鏈哄拰杩戠▼瀹㈡満锛堜篃绉扮煭绋嬪鏈猴級銆傚叾涓繙绋嬪鏈虹殑鑸▼鍦�8000km浠ヤ笂锛屽彲浠ュ畬鎴愪笉闂存柇鐨勬床闄呮垨璺ㄦ磱椋炶锛� + </p> + </span> + </div> + </div> + </div> + <!-- 44椤� --> + <div class="page-box" page="52"> + <div v-if="showPageList.indexOf(52) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">044</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鎵ц杩滆窛绂荤殑鍥介檯鑸嚎椋炶浠诲姟銆備腑绋嬪鏈鸿埅绋嬪湪3000锝�8000km锛屽彲鎵ц鍥藉唴鑸嚎鍜屼腑鐭窛绂荤殑鍥介檯鑸嚎椋炶浠诲姟銆傝繎绋嬪鏈虹殑鑸▼涓�鑸湪3000km浠ヤ笅锛屽鐢ㄤ簬鎵ц鍥藉唴鑸嚎鍜岄寰�閭昏繎鍥藉鐨勭煭绋嬪浗闄呰埅绾块琛屼换鍔°�傛垜鍥芥妸杩滅▼瀹㈡満銆佷腑绋嬪鏈虹О涓哄共绾垮鏈猴紝鐢ㄤ簬鎵ц鍥藉唴骞茬嚎鍜屽浗闄呰埅绾块琛屼换鍔★紱鎶婅緝灏忕殑杩戠▼瀹㈡満绉颁负鏀嚎瀹㈡満锛岀敤浜庢墽琛屾敮绾块琛屼换鍔°�� + </p> + <div class="bk"> + <p><b>鑰冭瘉鎸囧崡锛氱┖娓湇鍔$鐞嗗笀鑰冮</b></p> + <div v-for="(item,index) in singleChoice" :key="index"> + <p class="block">{{index+1}}.{{ item.txt }}</p> + <p class="block" v-for="(citem,cindex) in item.option" :key="cindex"> + <input type="radio" :value="citem.zm" name="toobusy" + :disabled="item.isComplete" + v-model="item.userAnswer" @change="saveInputChoice" /> + {{ citem.txt }} + </p> + <p class="event-header-text-bc pd-5 fl jc-sa" style="margin-left: 8px; width: 93%" + v-if="showChoiceAnswer"> + <span class="c-g"> 绛旀锛歿{ item.answer }} </span> + <span + :class="{ 'c-g': item.isRight, 'c-r': item.isRight == false }">鎮ㄧ殑绛旀锛歿{ + item.userAnswer + }}</span> + <span class="icon-box-big fl al-c"> + <svg v-if="item.isRight" t="1716986419862" class="icon" + viewBox="0 0 1820 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" + p-id="18767" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if="item.isRight == false" t="1716987085767" + class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + </div> + + <!-- 鎻愪氦鎸夐挳 --> + <div class="w100 fl ju-cn"> + <ul class="fl ju-ev w80 choice"> + <li> + <button class="btn-border btn-w" @click="goChoiceJudge"> + 鎻愪氦 + </button> + </li> + <li> + <button @click="changeChoiceData" class="btn-border btn-w"> + 閲嶅仛 + </button> + </li> + <li> + <button @click="showChoiceAnswer = !showChoiceAnswer" class="parimary-btn"> + 鏌ョ湅绛旀 + </button> + </li> + </ul> + </div> + </div> + <p class="p-even"> + 鎸夊彂鍔ㄦ満绫诲瀷涓嶅悓锛屽鏈哄彲浠ュ垎涓烘椿濉炲紡椋炴満鍜屽柗姘斿紡椋炴満銆傛椿濉炲紡椋炴満閲囩敤鍥涘啿绋嬫苯娌规椿濉炲紡鍙戝姩鏈猴紝鍠锋皵寮忛鏈洪噰鐢ㄤ互鑸┖鐓ゆ补涓虹噧鏂欑殑鍠锋皵寮忓彂鍔ㄦ満锛屾垜鍥芥皯鑸粠浜嬪璐ц繍杈撻琛岀殑閮芥槸鍠锋皵寮忛鏈恒�� + </p> + <p class="p-even"> + 鎸夋渶澶ч琛岄�熷害涓嶅悓锛岀幇浠e鏈哄彲鍒嗕负浜氬0閫熴�侀珮浜氬0閫熴�佽法澹伴�熴�佽秴澹伴�熷鏈恒�備簹澹伴�熷鏈虹殑鏈�澶ч琛岄�熷害涓哄0閫熺殑70%锛岄珮浜氬0閫熷鏈虹殑鏈�澶ч琛岄�熷害涓哄0閫熺殑70%锝�90%锛岃秴澹伴�熷鏈虹殑鏈�澶ч琛岄�熷害瓒呰繃澹伴�熺殑1.3鍊嶃�傝澶氭敮绾块鏈轰负浜氬0閫熼鏈猴紝骞茬嚎椋炴満澶氫负楂樹簹澹伴�熼鏈猴紝澶氭暟鍠锋皵寮忛鏈轰篃涓洪珮浜氬0閫熼鏈恒�傝秴澹伴�熷鏈哄彧鏈夎嫳娉曡仈鍚堢爺鍒剁殑鈥滃崗鍜屸�濊秴澹伴�熷鏈哄強鑻忚仈鐨勫浘-144瓒呭0閫熷鏈猴紝鐜板湪宸茬粡鍏ㄩ儴閫�褰广�� + </p> + <p class="p-even"> + 鎸夊骇浣嶆暟涓嶅悓锛屽彲浠ュ皢瀹㈡満鍒嗕负灏忓瀷銆佷腑鍨嬪拰澶у瀷瀹㈡満銆傚皬鍨嬪鏈哄骇浣嶆暟鍦�100浠ヤ笅锛屼竴鑸敤浜庢敮绾块琛屻�備腑鍨嬪鏈哄骇浣嶆暟涓�100锝�200锛屽ぇ鍨嬪鏈哄骇浣嶆暟鍦�200浠ヤ笂锛屼腑鍨嬪拰澶у瀷瀹㈡満涓�鑸敤浜庡共绾块琛屻�備絾鍒嗙被鏍囧噯鏄浉瀵硅�岃█鐨勩�� + </p> + <p class="p-even"> + 鎸夋満韬洿寰勪笉鍚岋紝鍙皢鐜颁唬瀹㈡満鍒嗕负瀹戒綋瀹㈡満鍜岀獎浣撳鏈恒�傚浣撳鏈烘満韬洿寰勮秴杩�3.75m锛屽鑸卞唴璁炬湁涓ゆ潯閫氶亾锛屽張绉板弻閫氶亾瀹㈡満锛屽ぇ鍨嬪鏈轰竴鑸槸瀹戒綋瀹㈡満锛堝浘2-13锛夈�傜獎浣撳鏈烘満韬洿寰勫湪3.75m浠ヤ笅锛屽鑸卞唴鍙兘璁句竴鏉¢�氶亾锛屽張鍙崟閫氶亾瀹㈡満锛屼腑鍨嬨�佸皬鍨嬪鏈轰竴鑸槸绐勪綋瀹㈡満銆傚浘2-14涓哄崟閫氶亾瀹㈡満C919鐨勫鑸便�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0056-1.jpg" /> + <p class="img">鍥�2-13 瀹戒綋瀹㈡満瀹㈣埍</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0056-2.jpg" /> + <p class="img">鍥�2-14 鍗曢�氶亾瀹㈡満C919鐨勫鑸变紴</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + </div> + </div> + </div> + <!-- 45椤� --> + <div class="page-box" page="53"> + <div v-if="showPageList.indexOf(53) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">045</li> + </ul> + <div class="bodystyle"> + <h5 id="e008" class="p-odd unit2-c">锛堜簩锛夐�氱敤鑸┖椋炴満</h5> + <p class="p-odd"> + 閫氱敤鑸┖鐨勬�ц川鍐冲畾浜嗛�氱敤鑸┖椋炴満浣撶Н灏忋�侀�犱环浣庯紙鍜岃埅绾块鏈虹浉姣旓級銆佹暟閲忓銆傚湪姘戣埅鐨勮埅绌哄櫒鏁伴噺涓紝閫氱敤鑸┖椋炴満瓒呰繃93%锛屼絾鍏惰嚜韬环鍊煎拰浜у�间粎鍗�5%锛屽拰鑸嚎椋炴満涓嶅悓銆傞�氱敤鑸┖椋炴満鏍规嵁鐢ㄩ�斾笉鍚岋紝鍙垎涓哄叕鍔℃満銆佸啘涓氭満銆佹暀缁冩満鍜屽鐢ㄩ�旇交鍨嬫満鍥涘ぇ绫汇�� + </p> + <p class="p-odd"> + 鍏姟鏈烘槸鍦ㄥ晢鍔℃椿鍔ㄥ拰琛屾斂浜嬪姟娲诲姩涓敤浣滀氦閫氬伐鍏风殑涓撶敤椋炴満锛屼篃绉颁綔琛屾斂鏈烘垨鍟嗗姟鏈猴紙鍥�2-15銆佸浘2-16锛夈�傚叕鍔℃満涓�鑸槸灏忓瀷椋炴満锛屽畠鐨勮捣椋炶川閲忎笉瓒呰繃10t锛岃浇瀹笉瓒呰繃15浜恒�傜敱浜庡ぇ鍨嬭法鍥介泦鍥㈠叕鍙搞�佸浗闄呬氦寰�绛夊彂灞曡緝蹇紝涓�浜涜繙璺濈鍏姟鏈虹殑鏈�澶ц捣椋炶川閲忓彲杈�30t銆佽埅绋嬭兘鍦�5000km浠ヤ笂銆傚叾鎬ц兘宸茬粡閫愭笎鎺ヨ繎鑸嚎椋炴満锛岀敋鑷充釜鍒湁瀹炲姏鐨勯泦鍥㈣喘涔颁簡鑸嚎椋炴満浣滀负鍏姟鏈恒�傛垜鍥戒娇鐢ㄥ叕鍔℃満澶у鏄粠涓撻棬缁忚惀鍏姟鏈哄寘鏈轰笟鍔$殑鍏徃绉熻祦锛屼篃鏈変釜鍒紒涓氳喘杩涗簡鑷繁鐨勫叕鍔℃満銆� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0057-1.jpg" /> + <p class="img">鍥�2-15 鍏姟鏈鸿埍</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0057-2.jpg" /> + <p class="img">鍥�2-16 鍏姟鏈�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="p-odd"> + 鍐滀笟鏈猴紙鍥�2-17锛夋槸涓撻棬涓哄啘鏋楃墽娓斾笟鏈嶅姟鐨勯鏈猴紝杩欑被椋炴満鏈夌殑鏄笓闂ㄤ负鍐滄灄鐗ф笖涓氳璁$殑锛岃繕鏈変竴浜涙槸鐢卞鐢ㄩ�旈鏈烘敼瑁呰�屾垚鐨勩�傝繖绫婚鏈轰竴鑸槸鍙畨瑁呬竴鍙板彂鍔ㄦ満鐨勫皬鍨嬮鏈猴紝椋炴満鏃堕�熷湪400km浠ヤ笅锛岄鏈虹殑璁惧姣旇緝绠�鍗曪紝浣嗕綆绌恒�佽秴浣庣┖鎬ц兘濂斤紝鎶楀潬姣佹�ц兘濂姐�傞殢鐫�鏃犱汉鏈虹殑鏅強锛岃澶氬湴鏂圭殑鍐滀笟鏈哄凡琚棤浜哄啘涓氭満鍙栦唬銆� + </p> + <p class="p-odd"> + 鏁欑粌鏈猴紙鍥�2-18锛夋槸鐢ㄤ簬鍩瑰吇椋炶鍛樼殑椋炴満锛屽彲鍒嗕负鍒濈骇鏁欑粌鏈哄拰楂樼骇鏁欑粌鏈恒�傚垵绾ф暀缁冩満鐢ㄤ簬璁粌鏂伴琛屽鍛樻帉鎻¢鏈洪┚椹舵妧鏈紝閫氬父鍙湁涓�鍙板彂鍔ㄦ満锛岀粨鏋勭畝鍗曪紝鏄撲簬鎿嶇旱锛涢珮绾ф暀缁冩満鐢ㄤ簬鍩硅缁忓垵绾ф暀缁冩満鍩� + </p> + </div> + </div> + </div> + <!-- 46椤� --> + <div class="page-box" page="54"> + <div v-if="showPageList.indexOf(54) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">046</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 璁悎鏍肩殑椋炶瀛﹀憳锛屼竴鑸湁涓ゅ彴鍙戝姩鏈猴紝鏈轰笂鐨勪华琛ㄨ澶囥�侀琛屾�ц兘涓庡叕鍔℃満鐩歌繎銆傛暀缁冩満鑷冲皯鏈変袱涓骇浣嶏紝涓ゅ鎿嶇旱绯荤粺瀹屽叏鑱斿姩锛屽湪椋炶涓浉褰撲簬鏁欏憳鍦ㄢ�滄墜鎶婃墜鈥濇暀瀛︺�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0058-1.jpg" /> + <p class="img">鍥�2-17 鍥戒骇N5B鍐滀笟鏈�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0058-2.jpg" /> + <p class="img">鍥�2-18 鈥滈捇鐭斥�濆弻鍙戞暀缁冩満</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="p-even"> + 澶氱敤閫旇交鍨嬫満锛堝浘2-19銆佸浘2-20锛夌敤浜庡寘鎷┖涓父瑙堛�佹晳鎶ゃ�佺煭閫旇繍杈撱�佽埅鎷嶃�佸搴瓑鐨勯鏈猴紝涔熷彲鐢ㄤ綔鏁欏鍜屽啘涓氥�佸叕鍔$瓑鏂归潰銆傝繖绫婚鏈鸿捣椋炶川閲忎竴鑸笉瓒呰繃5t锛屾渶灏忕殑鍖呮嫭鍙湁鍑犵櫨鍗冨厠鐨勮秴杞诲瀷椋炴満銆� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0058-3.jpg" /> + <p class="img">鍥�2-19 鍔ㄥ姏涓夎缈煎鐢ㄩ�旇交鍨嬫満</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0058-4.jpg" /> + <p class="img">鍥�2-20 杩愯緭5鍨嬪鐢ㄩ�旇交鍨嬫満</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <h4 id="d017" class="p-even unit2-c"> + 涓夈�佹皯鐢ㄨ埅绌哄櫒鐨勪娇鐢ㄦ鍐靛拰瑕佹眰 + </h4> + <p class="p-even"> + 鍏ㄧ悆姘戠敤鑸┖鍣�98%浠ヤ笂鏄鏈猴紝鐩村崌鏈虹殑鏁伴噺涓嶈冻2%锛屽叾浠栫被鍨嬬殑鑸┖鍣ㄦ暟閲忔洿灏戙�傚悇绉嶆渶鏂般�佹渶鍏堣繘鐨勬皯鐢ㄨ埅绌烘妧鏈鍏堜娇鐢ㄥ湪鑸嚎椋炴満涓婏紝鎵�浠ワ紝鑸嚎椋炴満鐨勬按骞充唬琛ㄤ簡姘戠敤鑸┖鍣ㄧ殑鏈�楂樻妧鏈按骞炽�� + </p> + <p class="p-even"> + 鎴戝浗瀵规皯鐢ㄨ埅绌哄櫒鐨勪娇鐢ㄨ姹傛槸瀹夊叏鎬с�佸揩閫熸�с�佽垝閫傛�с�佺粡娴庢�у拰绗﹀悎鐜繚瑕佹眰銆� + </p> + </div> + </div> + </div> + <!-- 47椤� --> + <div class="page-box" page="55"> + <div v-if="showPageList.indexOf(55) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">047</li> + </ul> + <div class="bodystyle"> + <h5 id="e009" class="p-odd unit2-c">锛堜竴锛夊畨鍏ㄦ��</h5> + <p class="p-odd"> + 瀹夊叏鎬ф槸瀵硅埅绌鸿繍杈撶殑棣栬瑕佹眰锛屼繚闅滃畨鍏ㄦ槸鏁翠釜姘戣埅绯荤粺鐨勯噸瑕佷换鍔°�傛皯鑸鏈虹殑瀹夊叏绋嬪害鍦ㄤ笉鏂彁楂橈紝鍏朵腑鎻愰珮鏈�蹇殑鏄鏈虹殑閫氫俊瀵艰埅銆佺數瀛愯澶囧拰鍔ㄥ姏绯荤粺鐨勯潻鍛芥�ф敼杩涳紝瀹冧滑浣块鏈烘満浣撳拰鍙戝姩鏈虹殑鍙潬鎬уぇ澶у寮恒�佸澶╂皵鐨勪緷璧栫姸鍐垫湁浜嗘瀬澶х殑鏀瑰杽銆傞鏈烘搷绾靛拰鏁版嵁澶勭悊鑷姩鍖栫▼搴﹁秺鏉ヨ秺楂橈紝鑳芥湁鏁堝噺灏戜汉涓哄洜绱犻�犳垚鐨勫畨鍏ㄩ殣鎮c�傞鏈虹殑瀹夊叏鎸囨爣鈥斺�斾嚎鍗冪背姝讳骸浜烘暟宸查檷鑷�0.04宸﹀彸锛岃繙杩滀綆浜庢櫘閫氫氦閫氫簨鏁呮浜$巼銆傛垜鍥介亾璺氦閫氫簨鏁呮浜′汉鏁帮紝姣忓ぉ澶х害170浜恒�傛墍浠ワ紝椋炴満鐨勫畨鍏ㄦ�ц繙杩滈珮浜庡叾浠栦氦閫氬伐鍏枫�備絾鐢变簬浜轰滑瀵归琛岀殑浜嗚В绋嬪害涓嶉珮銆侀琛屼簨鏁呬竴鑸槸涓ラ噸浜嬫晠锛屾墍浠ワ紝浜轰滑璐ㄧ枒椋炴満鐨勫畨鍏ㄦ�с�� + </p> + <p class="p-odd"> + 鐢熷懡鑷充笂锛屾垜浠鐗㈢墷瀹堜綇鑸┖瀹夊叏搴曠嚎涓嶆斁鏉撅紝纭繚姘戣埅瀹夊叏杩愯骞崇ǔ鍙帶銆傝娣卞埢璁よ瘑鑸┖瀹夊叏鏄浗瀹跺畨鍏ㄤ綋绯荤殑閲嶈缁勬垚閮ㄥ垎锛屽缁堜繚鎸佸綊闆跺績鎬侊紝鐙犳姄瀹夊叏涓嶆澗鎳堬紝甯哥环瀹夊叏杩欐牴寮︼紝鍒囧疄鍋氬埌瀹堝湡鏈夎矗銆佸畧鍦熻礋璐c�傛寜鐓р�滄眰鐪熴�佸姟瀹炪�佸惊瑙勫緥鈥濈殑瑕佹眰锛岃鐪熷垎鏋愬拰鐮斿垽鍙兘闈复鐨勫悇绉嶉闄╀笌鎸戞垬锛屽強鏃堕噰鍙栭拡瀵规�х殑椋庨櫓闃茶寖涓炬帾锛屽己鍖栫郴缁熸�у畨鍏ㄩ闄╅槻鑼冨拰鍖栬В鑳藉姏锛屽垏瀹炵瓚鐗㈠畨鍏ㄩ槻绾裤�� + </p> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 2022骞�3鏈�21鏃ワ紝鎴戝浗涓滄柟鑸┖鍏徃鐨勪竴鏋禕737-800鍦ㄦ墽琛孧U5735鑸彮鏃讹紝鍧犳瘉浜庡箍瑗挎ⅶ宸烇紝閫犳垚132浜烘浜$殑鎯ㄥ墽銆傛垜鍥芥皯鑸笂涓�娆″畨鍏ㄩ琛屼簨鏁呭彂鐢熷湪2010骞�8鏈�24鏃ワ紝娌冲崡鑸┖鏈夐檺鍏徃娉ㄥ唽缂栧彿涓築-3130鐨勬満鍨嬩负ERJ-190鐨勬敮绾垮鏈猴紝鍦ㄦ墽琛屽搱灏旀花鈥斾紛鏄ョ殑VD8387鑸彮鏃讹紝鍦ㄤ紛鏄ョ潃闄嗘帴鍦板悗鏂垚涓ゆ埅鍧犳瘉锛屼簨鏁呴�犳垚43浜烘浜★紝鏈�53浜虹敓杩樸�備袱娆′簨鏁呯浉璺�4227澶╋紝浠庡彟涓�涓搴﹀弽鏄犱簡鑸┖杩愯緭浜嬫晠鐜囬潪甯镐綆銆� + </p> + </span> + </div> + <h5 id="e010" class="p-odd unit2-c">锛堜簩锛夊揩閫熸��</h5> + <p class="p-odd"> + 姘戣埅杩涘叆鍠锋皵寮忔椂浠d互鏉ワ紝骞茬嚎椋炴満鐨勯�熷害绋冲畾鍦�800锝�1000km/h锛屾槸鍏朵粬浜ら�氬伐鍏锋棤娉曟瘮鎷熺殑銆� + </p> + <p class="p-odd"> + 鈥滃崗鍜屸�濊秴澹伴�熷鏈烘浘灏嗘皯鐢ㄨ埅绌哄櫒鐨勯�熷害鎻愰珮鍒颁簡2鍊嶅0閫燂紝杈惧埌浜嗘椂閫�2150km銆傝鍨嬮鏈哄湪2003骞村叏闈㈠仠杩愶紝姘戠敤鑸┖棰嗗煙鍐呭凡鏃犺秴澹伴�熼鏈恒�傝秴澹伴�熼琛岀粡娴庢�ц繃宸紝鐜姹℃煋鍜屾潗鏂欑柌鍔抽棶棰樹笉鏄撹В鍐筹紝閮芥槸鍏堕毦浠ユ帹骞跨殑鍘熷洜銆傚皢鏉ュ鏋滆兘澧炲己瓒呭0閫熼琛岀殑缁忔祹鎬с�佸噺灏戠幆澧冩薄鏌撱�� + </p> + </div> + </div> + </div> + <!-- 48椤� --> + <div class="page-box" page="56"> + <div v-if="showPageList.indexOf(56) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">048</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 寮哄寲鏉愭枡鎶楃柌鍔虫�э紝瓒呭0閫熷鏈烘湁鏈涘啀娆$勘缈旇摑澶┿�� + </p> + <h5 id="e011" class="p-even unit2-c">锛堜笁锛夎垝閫傛��</h5> + <p class="p-even"> + 鐜颁唬鑸嚎椋炴満瀹㈣埍瀹芥暈銆佸璁炬湁椁愰ギ鍜屽ū涔愯澶囷紝鑸掗�傜▼搴﹂珮浜庡叾浠栦氦閫氳繍杈撳伐鍏枫�傚湪婵�鐑堢殑绔炰簤涓紝鑸掗�傛�у凡鏄埅绌哄叕鍙搁�夋嫨椋炴満銆佹梾瀹㈤�夋嫨鑸┖鍏徃鐨勯噸瑕佸洜绱犮�� + </p> + <h5 id="e012" class="p-even unit2-c">锛堝洓锛夌粡娴庢��</h5> + <p class="p-even"> + 缁忔祹鎬ф槸姘戣埅杩愯惀瀵归鏈虹殑涓昏瑕佹眰涔嬩竴銆傜粡娴庢�т笉浠呰姹傝�冭檻璐満鎴愭湰鍜屾补鑰楋紝鑰屼笖瑕佹眰鑰冭檻椋炴満鍦ㄤ娇鐢ㄥ鍛芥湡闂寸殑鍏ㄩ儴鎴愭湰銆傜幇浠i鏈洪�氳繃閲囩敤鑰楁补鐜囦綆銆佹帹鍔涘ぇ鐨勫彂鍔ㄦ満锛屽ぇ閲忎娇鐢ㄥ己搴﹀ぇ銆佽川閲忚交鐨勫鍚堟潗鏂欙紝鏀瑰杽椋炴満姘斿姩澶栧舰绛夋柟寮忥紝浣块琛屾�ц兘鍙婄粡娴庢�ф湁浜嗗緢澶у寮恒�� + </p> + <h5 id="e013" class="p-even unit2-c">锛堜簲锛夌幆淇濊姹�</h5> + <p class="p-even"> + 椋炴満浜х敓鐨勬薄鏌撲富瑕佷綋鐜板湪鍣0鍜屾帓鏀句笂銆備笉灏戝浗瀹跺埗瀹氫簡鍣0閫傝埅鏍囧噯锛岃揪涓嶅埌鏍囧噯鐨勯鏈虹姝㈣繘鍏ヨ鍥介绌洪琛屻�傞殢鐫�椋炴満鍒堕�犳妧鏈殑杩涙锛屽鏁拌埅绾块鏈鸿兘杈惧埌鍣0鏍囧噯銆備笘鐣屼笂灏氭湭鍒跺畾寮哄埗鎬ф帓鏀炬爣鍑嗭紝浣嗗彂鍔ㄦ満鍜岄鏈哄埗閫犲巶鍟嗛兘鍦ㄩ�氳繃鍚勭閫斿緞鍑忓皯鎺掓斁姹℃煋鐗╋紝鍑忚交瀵瑰ぇ姘斿眰鐨勭牬鍧忋�� + </p> + <p class="p-even"> + 鍦ㄦ垜浠殑鏃ュ父鐢熸椿涓紝鐢熸椿鐜鏄崄鍒嗛噸瑕佺殑銆備汉绫诲彧鏈変竴涓湴鐞冿紝瀹冩槸浜虹被璧栦互鐢熷瓨鐨勮嚜鐒惰祫婧愶紝鐖辨姢鍦扮悆锛屽氨绛変簬鐖辨姢鑷繁鐨勫鍥�傜劧鑰岋紝杩戝勾鏉ワ紝鍦扮悆鐨勭幆澧冭秺鏉ヨ秺鎭跺姡锛屽叏鐞冩�ф皵鍊欏彉鏆栵紝鍙伴銆佹毚闆ㄧ瓑鐏惧鎬уぉ姘旈绻佸嚭鐜帮紝绂芥祦鎰熴�佹柊鍐犵梾姣掓劅鏌撶瓑浼犳煋鎬х柧鐥呮椂鏈夊彂鐢燂紝缁欎汉绫荤殑鐢熸椿鍜屽伐浣滃甫鏉ヤ弗閲嶅▉鑳佸拰璁稿涓嶄究銆傝繖浜涢兘鏄汉浠笉鏂湴鈥滀激瀹斥�濆湴鐞冪殑缁撴灉銆備繚鎶ょ幆澧冿紝浜轰汉鏈夎矗锛佽櫧鐒惰埅绌哄櫒鐨勫櫔澹般�佹帓鏀剧瓑姹℃煋姘村钩鍙栧喅浜庤埅绌哄櫒鍒堕�犱笟鎶�鏈彂灞曪紝鐭椂闂村唴寰堥毦鏈夋槑鏄炬敼瑙傦紝浣嗘垜浠彲浠ヤ粠鎴戝仛璧凤紝浠庡皬浜嬪仛璧凤紝鍏绘垚鑹ソ鐨勫崼鐢熶範鎯紝涓嶉殢鍦颁贡鎵斿瀮鍦撅紝瑙佸埌鍨冨溇鑳藉集鑵版崱涓�鎹★紝閭d箞锛屾垜浠殑鐜灏变細鏇寸編涓斤紒 + </p> + </div> + </div> + </div> + <!-- 49椤� --> + <div class="page-box" page="57"> + <div v-if="showPageList.indexOf(57) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">049</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="unit2-c">瀛︿範浠诲姟浜�<br />椋炶鍩烘湰鍘熺悊</h3> + <div class="task-u2-c"></div> + <p class="p-odd"> + 椋炴満鐨勮川閲忎粠鍑犲崄鍗冨厠鍒板嚑鐧惧惃涓嶇瓑锛屽宸茬粡琚垬鐏瘉鍧忕殑銆佷汉绫诲埗閫犵殑鏈�澶х殑椋炴満瀹�-225鐨勬渶澶ц捣椋炶川閲忛珮杈�700t銆傚姝ゅ簽鐒跺ぇ鐗╄兘鍦ㄧ┖涓嚜鐢辩勘缈旇�屼笉鎺変笅鏉ワ紝灏辨槸鍥犱负椋炴満鍦ㄩ琛屼腑浜х敓浜嗚冻澶熺殑鍗囧姏鈥滄墭涓锯�濈潃瀹冦�� + </p> + <p class="p-odd"> + 椋炴満鐨勫崌鍔涗富瑕侀潬鏈虹考浜х敓锛岃浜х敓鍗囧姏锛屾満缈煎拰绌烘皵灏卞繀椤绘湁鐩稿杩愬姩銆傛垜浠亣璁剧┖姘旀槸闈欐鐨勶紝椋炴満鍦ㄧ┖姘旈噷杩愬姩锛屽湪鐮旂┒鏃堕�氬父鏍规嵁杩愬姩鐨勭浉瀵规�у師鐞嗭紝浠ラ鏈轰负鍙傜収鐗╋紝灏辨槸绌烘皵浠ュ拰椋炶閫熷害澶у皬鐩哥瓑銆佹柟鍚戠浉鍙嶇殑閫熷害娴佽繃椋炴満锛岀┖姘旂浉瀵逛簬椋炴満鐨勬祦鍔ㄧО涓虹浉瀵规皵娴侊紙鍥�2-21锛夛紝绠�绉版皵娴併�傚崌鍔涚殑澶у皬鍜屾皵娴佺姸鍐点�佺墿鐞嗗弬鏁般�佹満缈煎舰鐘剁瓑鏈夊緢澶у叧绯汇�備笅闈紝鎴戜滑灏变粠姘旀祦鐨勭壒鎬у叆鎵嬶紝鏉ユ帰璁ㄩ鏈轰负浠�涔堣兘椋炪�佹�庝箞鎺у埗椋炴満椋炶绛夐棶棰樸�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0061-01.jpg" /> + <p class="img">鍥�2-21 鐩稿姘旀祦</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0061-02.jpg" /> + <p class="img">鍥�2-21 鐩稿姘旀祦</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <h4 id="d018" class="p-odd unit2-c">涓�銆佹皵浣撴祦鍔ㄧ殑鍩烘湰瑙勫緥</h4> + <p class="p-odd"> + 姘斾綋鍦ㄦ祦鍔ㄨ繃绋嬩腑锛岄殢鐫�娴佸姩绌洪棿鐨勫彉鍖栵紝姘旀祦鐨勭姸鎬佸弬鏁帮紙閫熷害銆� + </p> + <div class="img-rights w200 openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0061-2.jpg" /> + <p class="img">鍥�2-22 娴佺</p> + </div> + <span> + <p class="p-odd">鍘嬪姏銆佸瘑搴︺�佹俯搴︼級绛変篃浼氬彂鐢熺浉搴旂殑鍙樺寲銆�</p> + <p class="p-odd"> + 鎴戜滑鍏堢湅鐪嬫祦鍔ㄧ┖闂村彉鍖栧閫熷害鐨勫奖鍝嶃�傚綋姘斾綋杩炵画绋冲畾鍦版祦杩囦竴涓矖缁嗕笉鍧囩殑娴佺锛堝浘2-22锛夋椂锛岀敱浜庣涓换浣曚竴閮ㄥ垎姘斾綋閮戒笉鑳藉爢绉捣鏉ワ紝涔熶笉浼氫腑鏂紝鍥� + </p> + </span> + </div> + </div> + </div> + <!-- 50椤� --> + <div class="page-box" page="58"> + <div v-if="showPageList.indexOf(58) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">050</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 姝ゅ湪鍚屼竴鏃堕棿鍐咃紝娴佽繘娴佺鍜屾祦鍑烘祦绠$殑绌烘皵璐ㄩ噺搴旇鏄浉绛夌殑锛岃繕鍙互寤朵几涓哄湪鍚屼竴鏃堕棿鍐咃紝娴佽繃娴佺浠讳竴鎴潰鐨勭┖姘旇川閲忕浉绛夛紝杩欏氨鏄繛缁�х殑鍘熺悊銆� + </p> + <p class="p-even"> + 鍗曚綅鏃堕棿鍐呮祦杩囨埅闈紙鎴潰绉负<i>A</i>锛夌殑绌烘皵璐ㄩ噺涓猴細<i>m</i> =<i></i><i>蟻vA</i>銆� + </p> + <p class="p-even"> + 鏍规嵁杩炵画鎬у師鐞嗭紝鍙煡鍚屼竴鏃堕棿鍐呮祦杩囨埅闈⑩厾鍜屾埅闈⑩叀鐨勭┖姘旇川閲忕浉绛夛紝鍗�<i>蟻</i><sub>1</sub><i>v</i><sub>1</sub><i>A</i><sub>1</sub>=<i>蟻</i><sub>2</sub><i>v</i><sub>2</sub><i>A</i><sub>2</sub>銆� + </p> + <p class="p-even"> + 鍦ㄤ綆閫燂紙閫熷害灏忎簬0.4鍊嶉煶閫燂級娴佸姩鏃讹紝鍙互璁や负绌烘皵涓嶄細琚帇缂╋紝鍗虫祦鍔ㄨ繃绋嬩腑瀵嗗害涓嶉殢娴佸姩閫熷害鏀瑰彉锛屽垯<i>vA</i>=甯告暟銆� + </p> + <p class="p-even"> + 杩欏氨鏄綆閫熸皵娴佺殑杩炵画鏂圭▼锛岀敱浜庡幓鎺変簡绌烘皵瀵嗗害锛屽皢娴佽繃娴佺鎴潰鐨勭┖姘旇川閲忓彉鎹㈡垚浜嗙┖姘斾綋绉�備粠杩炵画鏂圭▼鍙煡锛岀ǔ瀹氱殑浣庨�熸皵娴佸湪鍗曚綅鏃堕棿鍐呮祦杩囨祦绠′换鎰忔埅闈㈢殑浣撶Н鐩哥瓑銆傛崲涓�鍙ヨ瘽璇达細娴佺鎴潰绉皬鐨勫湴鏂癸紝姘旀祦娴侀�熷ぇ锛涙祦绠℃埅闈㈢Н澶х殑鍦版柟锛屾皵娴佹祦閫熷皬銆傛按娴佷篃涓�鏍凤紝鎴戜滑鍙互鐪嬪埌绋冲畾娴佸姩鐨勬渤娴佷腑锛屾渤閬撶嫮绐勶紙鎴潰绉皬锛夌殑鍦版柟姘存祦婀嶆�ワ紙娴侀�熷ぇ锛夛紝娌抽亾寮�闃旂殑鍦版柟姘存祦骞崇ǔ銆傚澶╀汉浠湪杩囬亾涓箻鍑夛紝鎰熻椋庡緢澶э紝涔熸槸杩欎釜鍘熷洜銆� + </p> + <p class="p-even"> + 闅忕潃娴佺鎴潰绉彉鍖栵紝涓嶄粎姘旀祦鐨勯�熷害浼氬彂鐢熷彉鍖栵紝姘旀祦鐨勫帇鍔涗篃浼氱浉搴斿湴鍙戠敓鍙樺寲銆傛皵浣撴祦鍔ㄩ�熷害涓庡帇鍔涗箣闂寸殑鍏崇郴锛屽彲閫氳繃濡傚浘2-23鎵�绀虹殑瀹為獙缁撴灉鏉ヨ鏄庛�傚綋瀹為獙绠¢亾涓殑姘斾綋闈欐鏃讹紝绠¢亾涓悇鎴潰鐨勬皵浣撳帇鍔涢兘鐩稿悓锛岄兘绛変簬褰撳湴澶ф皵鍘嬶紝娴嬪帇绠′腑鐨勬恫闈㈤珮搴﹂兘涓�鏍穂鍥�2-23锛坅锛塢銆傚綋姘旀祦绋冲畾銆佽繛缁湴娴佽繃瀹為獙绠¢亾鏃讹紝閫氳繃杩炵画鏂圭▼鍙煡锛屾埅闈㈢Н澶х殑鍦版柟娴侀�熷皬锛屾埅闈㈢Н灏忕殑鍦版柟娴侀�熷ぇ銆傚疄楠屼腑锛屽瀹為獙绠¢亾鍚归锛� + 鏈夋皵娴佹祦杩囧疄楠岀閬撴椂锛屾祴鍘嬬涓殑娑查潰涔熷彂鐢熶簡鍙樺寲锛屾恫闈㈡櫘閬嶅崌楂樹簡锛屼絾鎴潰绉皬鐨勫湴鏂规恫闈㈠崌楂樿緝澶氾紝鎴潰绉ぇ鐨勫湴鏂规恫闈㈠崌楂樿緝灏慬鍥�2-23锛坆锛塢銆傝繖涓疄楠岃〃鏄庯細鎴潰绉ぇ鐨勫湴鏂规皵浣撴祦閫熷皬锛屽帇鍔涘ぇ锛涙埅闈㈢Н灏忕殑鍦版柟姘斾綋娴侀�熷ぇ锛屽帇鍔涘皬銆� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0062-01.jpg" /> + <p class="img">鍥�2-21 鐩稿姘旀祦</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0062-02.jpg" /> + <p class="img">鍥�2-21 鐩稿姘旀祦</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="p-even"> + 涓瑰凹灏斅蜂集鍔埄鐮旂┒浜嗕笂杩板疄楠岋紝骞朵簬1738骞存�荤粨鍑鸿憲鍚嶇殑浼姫鍒╁畾鐞嗭紙涔熺О浼姫鍒╂柟绋嬶級锛� + </p> + </div> + </div> + </div> + <!-- 51椤� --> + <div class="page-box" page="59"> + <div v-if="showPageList.indexOf(59) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">051</li> + </ul> + <div class="bodystyle"> + <p class="center"> + <img class="img-0" alt="" src="../../assets/images/0063-1.jpg" /> + </p> + <p> + 鍏朵腑<i>P</i>绉颁綔闈欏帇锛屼篃灏辨槸鏌愮偣鐨勫ぇ姘斿帇锛�<img class="inline2" alt="" + src="../../assets/images/0063-2.jpg" />绉颁綔鍔ㄥ帇锛�<i>P</i><sub>0</sub>绉颁綔鍏ㄥ帇銆備集鍔埄瀹氱悊璇存槑锛屾祦浣擄紙鍖呮嫭娑蹭綋鍜屾皵浣擄級鍦ㄧǔ瀹氥�佽繛缁祦鍔ㄤ腑锛屾祦鍦哄悇澶勭殑鍏ㄥ帇涓嶅彉锛屽鏌愮偣鐨勬祦浣撻�熷害澶э紙鍔ㄥ帇澶э級锛岃鐐圭殑闈欏帇灏卞皬锛屽弽涔嬪垯鍙嶃�� + </p> + <p class="p-odd"> + 灏嗚繛缁�у師鐞嗗拰浼姫鍒╁畾鐞嗙粨鍚堣捣鏉ワ紝鍙互寰楀嚭杩欐牱鐨勭粨璁猴細娴佷綋绋冲畾鍦版祦杩囩閬撴椂锛屽湪绠¢亾鎴潰绉皬鐨勫湴鏂癸紝娴佷綋鐨勬祦閫熷ぇ锛岄潤鍘嬶紙鍘嬪姏锛夊皬锛涘湪绠¢亾鎴潰绉ぇ鐨勫湴鏂癸紝娴佷綋娴侀�熷皬锛岄潤鍘嬶紙鍘嬪姏锛夊ぇ銆� + </p> + <h4 id="d019" class="p-odd unit2-c">浜屻�侀鏈哄崌鍔涚殑浜х敓</h4> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0063-3.jpg" /> + <p class="img">鍥�2-24 缈煎瀷</p> + </div> + <span> + <p class="p-odd"> + 椋炴満鐨勫崌鍔涗富瑕侀潬鏈虹考涓庣┖姘旂殑鐩稿杩愬姩浜х敓銆傚拰绌烘皵鏈夌浉瀵硅繍鍔紝鏈虹考涓轰粈涔堣兘澶熶骇鐢熷崌鍔涘憿锛熻繖鍜屾満缈肩殑褰㈢姸鏈夊緢澶у叧绯汇�� + </p> + <p class="p-odd"> + 鏈虹考鐨勫墫闈㈠舰鐘跺彨浣滅考鍨嬨�傜考鍨嬬殑鍓嶇鐐瑰彨鍓嶇紭锛屽悗绔偣鍙悗缂橈紝缈煎瀷鍓嶅悗缂樹箣闂寸殑杩炵嚎鍙綔缈煎鸡銆傞�氬父缈煎瀷鐨勪笂琛ㄩ潰寮洸搴﹁緝澶э紝涓嬭〃闈㈠集鏇插害杈冨皬鐢氳嚦骞崇洿锛堝浘2-24锛夈�� + </p> + <p class="p-odd"> + 鍦ㄩ琛屼腑锛岄鏈烘湁涓�瀹氶�熷害锛岀┖姘斿氨浼氫互涓庨琛岄�熷害澶у皬鐩稿悓鐨勯�熷害娴佽繃椋炴満锛屼笌鏈虹考涔嬮棿涔熷氨鏈夌浉瀵硅繍鍔ㄣ�傜浉瀵规皵娴侊紙椋炶閫熷害锛変笌缈煎鸡涔嬮棿鐨勫す瑙掑彨浣滆繋瑙� + </p> + </span> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0063-4.jpg" /> + <p class="img">鍥�2-25 杩庤</p> + </div> + <span> + <p class="p-odd td-0"> + 锛堝浘2-25锛夛紝鐢�<i>伪</i>琛ㄧず銆傜浉瀵规皵娴佹寚鍚戠考寮︿笅鏂癸紝杩庤涓烘锛涚浉瀵规皵娴佹寚鍚戠考寮︿笂鏂癸紝杩庤涓鸿礋銆� + </p> + <p class="p-odd"> + 姘旀祦娴佽繃鏈虹考鐨勬儏鍐碉紝鍙敤娴佽氨鍥撅紙鍥�2-26锛夌洿瑙傚湴琛ㄧず鍑烘潵銆傛祦璋卞浘鏄敱璁稿娴佺嚎鍜屾丁娴佺粍鎴愮殑銆佸弽鏄犳祦鍔ㄥ叏璨岀殑鍥惧舰锛岀被浼间簬涓鐗╃悊閲岄潰璁插埌鐨勭鍦哄浘銆佺數鍦哄浘銆傚湪绋冲畾姘旀祦涓紝绌烘皵鍒嗗瓙娴佸姩鐨勮矾绾垮氨鏄祦绾裤�傚洜涓虹┖姘斿垎瀛愭槸娌跨潃娴佺嚎娴佸姩鐨勶紝鎵�浠ュ湪娴佺嚎涓�渚х殑绌烘皵鍒嗗瓙涓嶄細绌胯繃娴佺嚎娴佸埌鍙︿竴渚у幓锛屼篃灏辨槸璇达紝娴佺嚎涓嶄細鐩镐氦銆備换鎰忎袱鏉℃祦绾夸箣闂寸殑绌烘皵閮戒笉浼氱┛杩囪繖涓ゆ潯娴佺嚎 + </p> + </span> + </div> + </div> + </div> + <!-- 52椤� --> + <div class="page-box" page="60"> + <div v-if="showPageList.indexOf(60) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">052</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 娴佸埌澶栭潰鍘伙紝鎴戜滑鍙互鎶婁换鎰忎袱鏉℃祦绾垮洿鎴愮殑绌洪棿鐪嬩綔涓�鏉℃祦绠★紝娴佺灏卞儚姘寸涓�鏍凤紝鎶婁袱鏉℃祦绾夸箣闂寸殑绌烘皵闄愬埗鍦ㄨ繖鏉$瀛愬唴娴佸姩銆� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0064-01.jpg" /> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0064-02.jpg" /> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0064-03.jpg" /> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0064-04.jpg" /> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="center">鍥�2-26 鍑犵鍏稿瀷鐗╀綋鐨勬祦璋卞浘</p> + <p class="p-even"> + 鍗囧姏涓昏鐢辨満缈间骇鐢燂紝鎴戜滑閫氳繃鏈虹考鐨勬祦璋卞浘鏉ュ垎鏋愬崌鍔涙槸鎬庢牱浜х敓鐨勩�備粠鍥�2-27鍙互鐪嬪嚭锛岀┖姘旀祦杩囨湁涓�瀹氭杩庤鐨勬満缈硷紝鐢变簬鏈虹考涓婅〃闈㈡瘮杈冪獊鍑猴紝鍦ㄦ満缈间笂琛ㄩ潰锛屾祦鍔ㄧ┖闂村彈鍒版満缈肩殑鎸ゅ帇鍙樺皬锛屾祦绠″彉缁嗐�傜敱浜庢満缈间笅琛ㄩ潰寮洸搴﹁緝灏忥紝娴佸姩绌洪棿姣斾笂琛ㄩ潰澶э紝娴佺杈冪矖銆傛牴鎹皵娴佺殑鍩烘湰瑙勫緥锛氬湪鏈虹考涓婅〃闈紝鐢变簬娴佺缁嗭紝娴佺鍐呯┖姘旀祦閫熷揩锛岄潤鍘嬪皬锛涙満缈间笅琛ㄩ潰鐢变簬娴佺绮楋紝娴佺鍐呯┖姘旀祦閫熸參锛岄潤鍘嬪ぇ銆備簬鏄満缈间笂涓嬭〃闈箣闂翠骇鐢熶簡鍚戜笂鐨勫帇鍔涘樊锛岃繖涓悜涓婄殑鍘嬪姏宸氨鏄満缈肩殑鍗囧姏锛屽嵆鍥�2-27涓殑<i>Y</i><sub>缈�</sub>锛岄鏈哄叾浠栭儴浣嶅鏈鸿韩銆佸熬缈肩瓑涔熻兘浜х敓閮ㄥ垎鍗囧姏锛屽叏鏈轰笂涓嬭〃闈㈢殑鍘嬪姏宸氨鏄鏈虹殑鍗囧姏銆傚崌鍔涚殑鏂瑰悜鍨傜洿浜庨琛岄�熷害锛堢浉瀵规皵娴侀�熷害锛夛紝 + </p> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0064-2.jpg" /> + <p class="img">鍥�2-27 鍗囧姏鐨勪骇鐢�</p> + </div> + <span> + <p class="p-even td-0">鍗囧姏鐨勫ぇ灏忓彲鐢ㄥ崌鍔涘叕寮忚〃绀哄涓嬶細</p> + <p class="center"> + <img class="img-g" alt="" src="../../assets/images/0064-3.jpg" /> + </p> + <p> + 鍏朵腑锛�<i>v</i>鏄琛岄�熷害锛堢浉瀵规皵娴侀�熷害锛夛紝<i>S</i>鏄満缈奸潰绉��<i>c<sub>y</sub></i>鏄崌鍔涚郴鏁帮紝瀹冩槸瀹為獙娴嬪緱鐨勬棤鍥犳鍊硷紝杩庤涓嶅悓銆佺考鍨嬩笉鍚岋紝鍗囧姏绯绘暟灏变笉鍚屻�� + </p> + <p>濡傛灉浣犵湅杩囬琛岃〃婕旓紝浣犱竴瀹氫細琚�</p> + </span> + </div> + </div> + </div> + <!-- 53椤� --> + <div class="page-box" page="61"> + <div v-if="showPageList.indexOf(61) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">053</li> + </ul> + <div class="bodystyle"> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0065-1.jpg" /> + <p class="img">鍥�2-28 鍗囧姏绯绘暟闅忚繋瑙掑彉鍖�</p> + </div> + <span> + <p class="p-odd td-0"> + 椋炴満鐨勪紭寮傛�ц兘浠ュ強椋炶鍛樼殑濞寸啛鎶�鏈墍闇囨捈銆備簨瀹炰笂锛屾棤璁洪鏈哄仛浠�涔堟牱鐨勫鏉傚姩浣滐紝閮芥槸闈犻琛屽憳鎿嶇旱椋炴満鏀瑰彉鍗囧姏鐨勫ぇ灏忓拰鏂瑰悜鏉ュ畬鎴愮殑銆備粠鍗囧姏鍏紡鍙湅鍑猴紝鍗囧姏鐨勫ぇ灏忎笌绌烘皵瀵嗗害銆侀琛岄�熷害銆佽繋瑙掋�佺考鍨嬪拰鏈虹考闈㈢Н鏈夊叧锛屼絾鏄湪姝e父椋炶涓紝缈煎瀷鍜屾満缈奸潰绉槸涓嶈兘鏀瑰彉鐨勶紝鍙椋炶楂樺害涓�瀹氾紝鎴戜滑涔熸病娉曟敼鍙樼┖姘斿瘑搴︼紝椋炶鍛樺彧鏈夐�氳繃鏀瑰彉杩庤鍜岄琛岄�熷害鏉ユ敼鍙樺崌鍔涖�傚崌鍔涗笌椋炶閫熷害鐨勫钩鏂规垚姝f瘮锛涘湪涓皬杩庤涓嬶紝闅忚繋瑙掑澶э紝鍗囧姏绯绘暟澧炲ぇ锛屽崌鍔涘澶э紙鍥�2-28锛夈�� + </p> + </span> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 杩庤锛岃嫳鏂囧悕瀛椾负angle of + attack锛屾湁浜涜祫鏂欐牴鎹嫳鏂囩洿璇戜负鍐茶銆佹敾瑙掞紝鐢ㄥ笇鑵婂瓧姣嵨辫〃绀猴紝鑻辨枃绠�绉癆OA銆傚畠鏄埅绌洪鍩熺殑閲嶈瑙掑害涔嬩竴锛屽椋炴満鐨勫彈鍔涘強鍚勬柟闈㈡�ц兘閮芥湁鐩存帴褰卞搷銆傛皯鐢ㄩ鏈哄湪椋炶涓紝杩庤涓�鑸负涓�涓笉澶х殑姝h繋瑙掞紝鍙湁鍐涚敤椋炴満鍦ㄦ煇浜涚壒娈婃儏鍐典笅锛屾墠浼氬嚭鐜拌礋杩庤銆� + </p> + </span> + <p class="block"> + 椋炴満鐨勫崌鍔涚郴鏁板彈杩庤鍜岀考鍨嬬殑褰卞搷锛屾甯哥殑椋炶涓考鍨嬩笉浼氭敼鍙橈紝鍗囧姏绯绘暟灏卞彧鍙楄繋瑙掔殑褰卞搷銆備腑灏忚繋瑙掍笅锛岄殢杩庤澧炲ぇ锛屽崌鍔涚郴鏁板澶э紱澶ц繋瑙掍笅鍗囧姏绯绘暟鐨勫骞呭噺缂擄紝鍒版煇涓�杩庤锛屽崌鍔涚郴鏁拌揪鍒版渶澶э紱瓒呰繃杩欎竴杩庤锛屽崌鍔涚郴鏁伴殢杩庤鐨勫澶ц�屽噺灏忋�傚崌鍔涚郴鏁拌揪鍒版渶澶ф椂鍊欑殑杩庤鍙綔涓寸晫杩庤锛岃秴杩囦复鐣岃繋瑙掞紝椋炴満灏嗗嚭鐜伴潪鎿嶇旱鎬х殑寮傚父鐜拌薄锛屼笉鑳界淮鎸佹甯搁琛岋紝杩欐牱鐨勫紓甯哥姸鎬佸湪鑸┖鐣岀О涓衡�滃け閫熲�濄�� + </p> + </div> + <h4 id="d020" class="unit2-c p-odd">涓夈�侀琛屼腑椋炴満鍙楀姏</h4> + <p class="p-odd"> + 浠庡墠闈㈢殑璁茶堪涓垜浠彲浠ョ湅鍑猴紝椋炴満涔嬫墍浠ヨ兘澶熼琛岋紝鏄洜涓洪鏈哄湪椋炶涓骇鐢熶簡鍏嬫湇閲嶅姏鐨勫崌鍔涖�備粠鍗囧姏浜х敓鐨勫師鍥犳潵鐪嬶紝骞舵病鏈夋彁鍒板彂鍔ㄦ満锛岃�屽ぇ瀹堕兘鐭ラ亾锛屽彂鍔ㄦ満鏄鏈虹殑蹇冭剰锛屼换浣曚竴鏋堕鏈洪兘绂讳笉寮�鍙戝姩鏈猴紝鏃㈢劧浜х敓鍗囧姏涓庡彂鍔ㄦ満鏃犲叧锛岄偅鍙戝姩鏈哄湪椋炶涓埌搴曡捣浠�涔堜綔鐢ㄥ憿锛熷洖绛旇繖涓棶棰橈紝鎴戜滑灏卞緱浠庨琛屼腑椋炴満鐨勫彈鍔涜皥璧枫�� + </p> + <p class="p-odd"> + 浠ュ钩椋炰负渚嬶紝椋炶涓紝椋炴満瑕佹湁涓�瀹氶�熷害鎵嶈兘浜х敓瓒冲鐨勫崌鍔涙潵鍏嬫湇閲嶅姏锛屼絾椋炴満浠ヤ竴瀹氱殑閫熷害鍦ㄧ┖姘斾腑绌挎锛岀┖姘斾篃浼氫骇鐢熼樆纰嶉鏈哄墠杩涚殑 + </p> + </div> + </div> + </div> + <!-- 54椤� --> + <div class="page-box" page="62"> + <div v-if="showPageList.indexOf(62) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">054</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0066-1.jpg" /> + <p class="img">鍥�2-29 骞抽涓鏈虹殑鍙楀姏</p> + </div> + <span> + <p class="p-even td-0"> + 闃诲姏锛岃繖灏遍渶瑕佸彂鍔ㄦ満浜х敓鍚戝墠鐨勬帹鍔涳紙鎷夊姏锛夋潵骞宠 闃诲姏锛屼繚鎸侀�熷害銆傚钩椋炰腑椋炴満鐨勫彈鍔涘鍥�2-29鎵�绀恒�� + </p> + <p class="p-even"> + 鏍规嵁闃诲姏鐨勪骇鐢熷師鍥犱笉鍚岋紝浣庨�熴�佷簹澹伴�熼琛屾椂闃诲姏鍙垎涓烘懇鎿﹂樆鍔涖�佸帇宸樆鍔涘拰璇卞闃诲姏涓夌銆傞鏈哄湪璺ㄥ0閫熴�佽秴澹伴�熼琛屾椂锛岃繕浼氫骇鐢熸縺娉㈤樆鍔涖�� + </p> + </span> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 椋炶閫熷害涓庨鏈烘墍鍦ㄩ珮搴﹀0閫熺殑姣斿�煎彨椹但鏁版垨椋炶<i>M</i>鏁帮紝绠�绉�<i>M</i>鏁般�傛牴鎹�<i>M</i>鏁板彲灏嗛鏈虹殑閫熷害鍒嗕负浣庨�熴�佷簹澹伴�熴�佽法澹伴�熷拰瓒呭0閫熴�� + </p> + </span> + <p class="block"> + 浣庨�熸槸鎸�<i>M </i>鏁板皬浜�0.4锛堜篃鏈夌殑璇�0.3锛�<sup>鈶�</sup>鐨勯�熷害锛屼綆閫熸椂鍙互璁や负绌烘皵涓嶅彲鍘嬬缉锛氱┖姘旀祦閫熷噺灏忋�佸帇鍔涘澶ф椂锛岀┖姘斾笉浼氳鍘嬬缉锛屼娇浣撶Н鍑忓皬銆佸瘑搴﹀澶э紱绌烘皵娴侀�熷澶с�佸帇鍔涘噺灏忔椂锛岀┖姘斾篃涓嶄細鑶ㄨ儉锛屼娇浣撶Н澧炲ぇ銆佸瘑搴﹀噺灏忋�備篃灏辨槸绌烘皵鐨勫瘑搴︿笉闅忛�熷害鍙樺寲鑰屽彉鍖栥�傝繖浠呬粎鏄竴绉嶅亣璁撅紝瀹為檯涓婇�熷害鍙樺寲寮曡捣鍘嬪姏鍙樺寲锛屼細瀵艰嚧绌烘皵瀵嗗害鍙戠敓鏀瑰彉锛屼絾鍦ㄥ皬M鏁颁笅锛屽瘑搴﹀彉鍖栭噺寰堝皬锛屽彲浠ュ拷鐣ヤ笉璁★紝鎵嶆湁浜嗚繖鏍风殑鍋囪銆� + </p> + <p class="block"> + 浜氬0閫熸槸鎸嘙鏁板ぇ浜�0.4锛�0.3锛夈�佸皬浜�0.8锛�0.7鎴�0.9锛夌殑閫熷害鑼冨洿銆傛鏃剁┖姘斿帇缂╂�у椋炴満鎬ц兘宸茬粡鏈夋槑鏄惧奖鍝嶏紝鍦ㄨ�冭檻椋炴満鎬ц兘鏃朵笉鑳藉拷鐣ワ紝浣嗛鏈鸿〃闈㈤�熷害鏈�蹇鏈揪鍒板0閫燂紝椋炴満琛ㄩ潰鍏ㄦ槸浜氬0閫熸皵娴併�� + </p> + <p class="block"> + 椋炶閫熷害杩樻湭杈惧埌澹伴�燂紝浣嗛鏈鸿〃闈㈡祦閫熸渶蹇鐨勬皵娴侀�熷害灏卞彲鑳借揪鍒板0閫燂紱椋炶閫熷害瓒呰繃澹伴�熶笉澶氭椂锛岄鏈鸿〃闈㈡祦閫熸渶鎱㈠鐨勬皵娴侀�熷害杩樻湭杈惧埌澹伴�熴�傝繖涓ょ鎯呭喌涓嬮鏈鸿〃闈㈡棦鏈夎秴澹伴�熸皵娴佸張鏈変簹澹伴�熸皵娴侊紝杩欎釜鑼冨洿鐨勯�熷害绉颁负璺ㄥ0閫燂紝瀵瑰簲鐨凪鏁颁负0.8锛�0.7鎴�0.9锛夛綖1.3锛�1.2鎴�1.4锛夈�傞鏈鸿〃闈㈡祦閫熸渶蹇鐨勬皵娴侀�熷害鍒氳揪鍒板0閫熸椂锛屽搴旂殑M鏁板彨涓寸晫M鏁帮紝鏍囧織鐫�椋炴満琛ㄩ潰鐨勬皵娴佺壒鐐瑰皢鍙戠敓鏈川鍙樺寲锛屼篃灏嗕骇鐢熸縺娉㈤樆鍔涖�� + </p> + <p class="block"> + 褰揗鏁拌緝澶ф椂锛岄鏈鸿〃闈㈡祦閫熸渶鎱㈠鐨勬皵娴侀�熷害涔熻揪鍒颁簡澹伴�燂紝椋炴満琛ㄩ潰鍏ㄦ槸瓒呭0閫熸皵娴佹椂锛岄鏈烘墠杩涘叆瓒呭0閫熻寖鍥达紝閫氬父瀵瑰簲鐨凪鏁板ぇ浜�1.3锛�1.2鎴�1.4锛夈�� + </p> + </div> + <hr class="ma-l"> + <p class="p-even note td-0"><a + id="m1">鈶�</a> 鍑犱釜鍒嗙晫鐐�<i>M </i>鏁颁负涓嶇‘瀹氬�硷紝鍏朵腑0.3鎴�0.4鏄洜涓哄拷鐣ョ殑鈥滆緝灏忓�尖�濅笉鍚岋紝鍑犱釜姣旇緝澶х殑鏁板�兼槸鍥犱负涓嶅悓鐨勯鏈烘垨鍚屼竴鏋堕鏈哄湪涓嶅悓濮挎�佹椂锛岃〃闈㈡皵娴侀�熷害澧炲姞鎴栧噺灏戦噺涓嶅悓銆� + </p> + </div> + </div> + </div> + <!-- 55椤� --> + <div class="page-box" page="63"> + <div v-if="showPageList.indexOf(63) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">055</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 鎽╂摝闃诲姏浜х敓鐨勫師鍥犳槸椋炴満琛ㄩ潰涓嶇粷瀵瑰厜婊戯紝姘旀祦缁忚繃椋炴満琛ㄩ潰鏃朵細鍙戠敓鎽╂摝銆備负浜嗗噺灏忛鏈虹殑鎽╂摝闃诲姏锛屾垜浠櫎浜嗗敖鍙兘鎻愰珮鍒堕�犲伐鑹烘按骞冲锛屽湪浣跨敤椋炴満鐨勮繃绋嬩腑锛屼繚鎸侀鏈鸿〃闈笉浜х敓鍙樺舰涔熸槸寰堥噸瑕佺殑銆� + </p> + <p class="p-odd"> + 鍘嬪樊闃诲姏鏄鏈哄墠鍚庡帇鍔涘樊褰㈡垚鐨勯樆鍔涖�備互鏈虹考浜х敓鍘嬪樊闃诲姏涓轰緥鏉ヨ鏄庯紙鍥�2-27锛夛細绌烘皵娴佺粡鏈虹考鏃讹紝鍦ㄥ墠缂橀檮杩戞皵娴佸彈鍒版満缈肩殑闃绘尅锛岄�熷害鍑忓皬锛屾牴鎹集鍔埄鏂圭▼鍙煡锛岃繖鐗囧尯鍩熷帇鍔涘澶э紝鍘嬪姏鏈�澶х殑涓�鐐归�熷害闄嶅埌闆讹紝绉颁负椹荤偣锛涘湪鍚庣紭閮ㄥ垎鏄丁娴佸尯锛屽帇鍔涜緝灏忋�傛満缈煎墠鍚庡氨瀛樺湪涓�涓帇鍔涘樊锛岃鍘嬪姏宸樆纰嶉鏈哄墠杩涳紝灏辨槸鍘嬪樊闃诲姏銆傚彟澶栵紝鍦ㄦ満缈煎拰鏈鸿韩鐨勬帴鍚堥儴銆佹満缈煎拰鍙戝姩鏈哄悐鑸辩殑鎺ュ悎閮ㄧ瓑锛岀敱浜庤繖浜涢儴浠剁殑鐩镐簰骞叉壈锛屼細浣挎帴鍚堥儴鍓嶆柟姘旀祦鏇村姞鍙楅樆锛屽帇鍔涘澶ф洿澶氾紝鍚庢柟娑℃祦鍖哄澶э紝鍘嬪姏鍑忓皬鏇村锛岃嚧浣垮帇宸樆鍔涘澶э紝瀵艰嚧鍏ㄦ満鐨勯樆鍔涙瘮鎵�鏈夐儴浠跺崟鐙骇鐢熺殑闃诲姏涔嬪拰杩樺ぇ銆傞澶栧鍔犵殑杩欓儴鍒嗛樆鍔涘氨鏄鏈哄悇閮ㄤ欢鎺ュ悎澶勭浉浜掑共鎵拌�屼骇鐢熺殑锛屾垜浠О涓哄共鎵伴樆鍔涳紝骞叉壈闃诲姏鏄帇宸樆鍔涚殑涓�閮ㄥ垎銆� + </p> + <p class="p-odd"> + 璇卞闃诲姏鏄即闅忕潃鍗囧姏鐨勪骇鐢熻�屼骇鐢熺殑闃诲姏锛屾垨鑰呰鏄敱鍗囧姏鈥滆瀵尖�濆嚭鏉ョ殑闃诲姏銆傞鏈哄湪椋炶杩囩▼涓浜х敓鍗囧姏锛屾満缈间笅琛ㄩ潰姘旀祦鐨勫帇鍔涘ぇ浜庝笂琛ㄩ潰姘旀祦鍘嬪姏锛岀┖姘旂敱浜庢祦浣撶殑鐗规�т細浠庡帇鍔涢珮鐨勫湴鏂瑰線鍘嬪姏浣庣殑鍦版柟娴佸姩锛屾満缈间笅琛ㄩ潰鐨勬皵娴佷細缁曡繃缈煎皷寰�鏈虹考涓婅〃闈㈡祦鍔ㄣ�傛祦杩囨満缈间笅琛ㄩ潰鐨勬皵娴侊紝闄や簡鏈夊線鍚庣殑閫熷害涔嬪锛岃繕鏈変竴涓線缈煎皷鏂瑰悜娴佸姩鐨勯�熷害锛屾皵娴佹部鐫�浜岃�呯殑鍚堥�熷害鏂瑰悜娴佸姩銆傜浉瀵逛簬椋炶閫熷害鏉ヨ锛屾満缈间笅琛ㄩ潰姘旀祦鏄線缈煎皷鏂瑰悜鍋忔枩鐨勶紙鍥�2-30锛夈�傚悓鐞嗭紝鏈虹考涓婅〃闈㈢殑姘旀祦鏄線缈兼牴鏂瑰悜鍋忔枩鐨勩�傛祦缁忔満缈间笂涓嬭〃闈㈢殑姘旀祦鍦ㄦ満缈煎悗缂樻眹鍚堟椂锛屽叿鏈変笉鍚岀殑娴佸姩鏂瑰悜锛屼細鍦ㄦ満缈煎悗鏂瑰舰鎴愪竴鎺掓棆娑¢潰銆傜敱浜庢棆娑$殑鐩镐簰浣滅敤锛岃繖鎺掓棆娑¢潰浼氬湪鏈虹考鍚庢柟涓嶈繙澶勬眹鍚堟垚涓ゆ潫澶х殑鏃嬫丁锛屽彨缈煎皷娑℃祦锛岀畝绉扮考灏栨丁锛堝浘2-31锛夈�� + </p> + <div class="fl al-fe p-odd"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0067-1.jpg" /> + </p> + <p class="img">鍥�2-30 鏈虹考涓娿�佷笅琛ㄩ潰鐨勬皵娴�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0067-2.jpg" /> + </p> + <p class="img">鍥�2-31 缈煎皷娑℃祦</p> + </span> + </div> + </div> + </div> + </div> + <!-- 56椤� --> + <div class="page-box" page="64"> + <div v-if="showPageList.indexOf(64) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">056</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 绌烘皵娴佽繃鏈虹考锛屼細娌跨潃鐩稿姘旀祦閫熷害锛堥琛岄�熷害锛変笌缈煎皷娑″紩璧风殑閫熷害鐨勫悎閫熷害鏂瑰悜娴佸姩銆傚湪鏈虹考鑼冨洿涔嬪唴锛岀考灏栨丁鐨勬柟鍚戞槸寰�涓嬬殑锛堝浘2-30锛夛紝缈煎皷娑¢檮鍔犵殑寰�涓嬬殑閫熷害鍙綔涓嬫礂閫熷害锛屽疄闄呮祦杩囨満缈肩殑姘旀祦鏄部鐫�椋炶 + </p> + <div class="img-float w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0068-1.jpg" /> + <p class="img">鍥�2-32 璇卞闃诲姏鐨勪骇鐢�</p> + </div> + <span> + <p class="p-even td-0"> + 閫熷害鍜屼笅娲楅�熷害鐨勫悎閫熷害鏂瑰悜娴佸姩鐨勩�傜浉瀵逛簬椋炶閫熷害鏉ヨ锛屽畠鍚戜笅鍊炬枩浜嗕竴涓搴︼紝杩欑鍚戜笅鍊炬枩鐨勬皵娴佸彨浣滀笅娲楁祦锛屽悜涓嬪�炬枩鐨勮搴﹀彨涓嬫礂瑙掞紙<i>蔚</i>锛夈�傛祦杩囨満缈肩殑姘旀祦鏄笅娲楁祦锛岄鏈轰骇鐢熺殑瀹為檯鍗囧姏涔熷氨鏄瀭鐩翠簬涓嬫礂娴佹柟鍚戠殑锛岀浉瀵逛簬鍨傜洿浜庨琛岄�熷害鏂瑰悜鐨勬湁鏁堝崌鍔涙潵璇达紝瀹為檯鍗囧姏鍚戝悗鍊炬枩浜嗕竴涓搴︼紙<i>蔚</i>锛夈�傚疄闄呭崌鍔涘湪鍨傜洿浜庨琛岄�熷害鏂瑰悜鐨勫垎鍔涗负鏈夋晥鍗囧姏锛屽湪骞宠浜庨琛岄�熷害鏂瑰悜涓婄殑鍒嗗姏灏辨槸璇卞闃诲姏锛堝浘2-32锛夈�� + </p> + </span> + <div class="bj4"> + <div class="img-rights w270 openImgBox"> + <img class="img" alt="" src="../../assets/images/0068-2.jpg" /> + <p class="img">鍥�2-33 杩佸緳鐨勯泚缇ゅ湪椋炶涓繚鎸佲�滀汉鈥濆瓧闃熷舰</p> + </div> + <span> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 缈煎皷娑″湪鏈虹考鑼冨洿涔嬪唴鐨勯�熷害鏄線涓嬬殑涓嬫礂閫熷害锛屽湪鏈虹考鑼冨洿涔嬪鐨勯�熷害灏辨槸寰�涓婄殑涓婃礂閫熷害銆傞暱閫旇縼寰欑殑闆佺兢鍦ㄩ琛屼腑淇濇寔鈥滀汉鈥濆瓧锛堝浘2-33锛夋垨鈥滀竴鈥濆瓧闃熷舰锛屽苟鐢辫韩寮哄姏澹殑澶ч泚浣滀负棰嗗ご闆侊紝灏辨槸璁╁渚х殑澶ч泚鍏呭垎鍒╃敤鍐呬晶澶ч泚缈煎皷澶栫殑涓婃礂閫熷害浜х敓鎵樹妇浣滅敤锛岄琛岃捣鏉ヨ緝涓虹渷鍔涖�傚湪椋炶涓�娈垫椂闂村悗锛屾洿鎹竴鍙澶撮泚锛屾湁鍒╀簬鏁翠釜闆佺兢鐨勯暱閫旈琛屻�� + </p> + </span> + </span> + </div> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 鍦ㄩ鏈烘妧鏈彂灞曡繃绋嬩腑锛岄殢鐫�椋炶閫熷害瓒婃潵瓒婂揩锛岄鏈鸿秺鏉ヨ秺缁嗛暱锛岃�屽埗閫犲ぇ鍨傚熬锛堝瀭鐩村熬缈硷紝绠�绉板瀭灏撅級鐨勫伐鑹鸿窡涓嶄笂锛岄�犳垚椋炴満鐨勭旱鍚戠ǔ瀹氭�т笉瓒炽�備负寮ヨˉ杩欎竴缂洪櫡锛岃璁″笀鍦ㄦ満缈肩殑缈煎皷閮ㄥ垎鍔犺浜嗙考灏栧皬缈硷紙鍥�2-34锛夈�傚湪椋庢礊瀹為獙涓紝鎯婂枩鍦板彂鐜伴鏈虹殑闃诲姏闈炲父灏忥紝鍘熸潵鏄考灏栧皬缈奸樆鎸′簡鏈虹考涓嬭〃闈㈢殑姘旀祦寰�涓婅〃闈㈡祦鍔紝鍑忓急浜嗙考灏栨丁锛屽噺灏忎簡涓嬫礂閫熷害鍜屼笅娲楄锛屼篃灏卞噺灏忎簡瀹為檯鍗囧姏鍚戝悗鍊炬枩鐨勮搴︼紝鏈夋晥鍦板噺灏忎簡璇卞闃诲姏銆傚悗鏉ラ鏈虹殑璁捐鍒堕�犲伐鑹烘彁楂橈紝宸蹭笉闇�瑕佺考灏栧皬缈兼潵澧炲己椋炴満鐨勭ǔ瀹氭�т簡锛岃�屽緢澶氭皯鐢ㄩ鏈轰粛鐒朵繚鐣欎簡缈煎皷灏忕考锛屽叾鐩殑灏辨槸鍑忓皬璇卞闃诲姏銆傞笩绫讳腑缁忓父鐙嚜椋炶鐨勯拱锛堝浘2-35锛夛紝鍦ㄩ琛岃繃绋嬩腑缈煎皷鏈夊嚑鐗囩窘姣涙槸涓婄繕鐨勶紝涔熸槸杩欎釜鍘熷洜銆� + </p> + </span> + </div> + </div> + </div> + </div> + <!-- 57椤� --> + <div class="page-box" page="65"> + <div v-if="showPageList.indexOf(65) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">057</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <div class="fl"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0069-1.jpg" /> + </p> + <p class="img">鍥�2-34 缈煎皷灏忕考</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0069-2.jpg" /> + </p> + <p class="img">鍥�2-35 楣�</p> + </span> + </div> + </div> + <h4 id="d021" class="unit2-c p-odd">鍥涖�侀鏈虹殑閲嶅績涓庡钩琛�</h4> + <p class="p-odd"> + 鍦ㄧǔ瀹氶琛屼腑锛屼笉浠呴鏈哄彈鍔涜鍙栧緱骞宠 锛岃繖浜涘姏瀵归噸蹇冨舰鎴愮殑鍔涚煩涔熻鍙栧緱骞宠 锛岄鏈烘墠鑳戒繚鎸佺ǔ瀹氱殑椋炶鐘舵�併�� + </p> + <p class="p-odd"> + 椋炴満鐨勯噸鍔涙槸椋炴満鍚勯儴浠朵笌瑁呰浇閲嶅姏涔嬪拰锛岄鏈洪噸鍔涚殑浣滅敤鐐瑰彨椋炴満鐨勯噸蹇冦�� + </p> + <p class="p-odd"> + 椋炶涓紝椋炴満鍚勯儴鍒嗙殑鍙楀姏閮戒細瀵归噸蹇冨舰鎴愬姏鐭┿�傚墠闈㈣鍒扮殑骞抽鍙楀姏鏄竴绉嶇畝鍗曠殑鍒嗘瀽锛屽疄闄呬笂鏈虹考鍗囧姏鐨勪綔鐢ㄧ偣骞朵笉鍦ㄩ噸蹇冧笂銆傚崌鍔涗綔鐢ㄧ偣鍙帇鍔涗腑蹇冿紝鍦ㄩ噸蹇冧箣鍚庯紝绂婚噸蹇冩湁涓�灏忔璺濈銆傝繖鏍凤紝鏈虹考鐨勫崌鍔涘皢瀵归噸蹇冩瀯鎴愪笅淇姏鐭╋紝浣挎満澶翠笅淇紝涓嶈兘缁存寔绋冲畾鐨勯琛岀姸鎬併�傛皯鐢ㄨ繍杈撴満閮芥槸閲囩敤鍦ㄦ満韬熬閮ㄥ畨瑁呮按骞冲熬缈肩殑甯歌甯冨眬銆備负浜嗗钩琛″崌鍔涗骇鐢熺殑涓嬩刊鍔涚煩锛岄鏈虹殑姘村钩灏剧考锛堝钩灏撅級浼氫骇鐢熶竴涓悜涓嬬殑鍔涳紙璐熷崌鍔�<i>Y</i><sub>t</sub>锛夛紝瀹� + </p> + <div class="img-rights w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0069-3.jpg" /> + <p class="img">鍥�2-36 淇话鍔涚煩骞宠 </p> + </div> + <span> + <p class="p-odd td-0"> + 浣滅敤鍦ㄩ噸蹇冨悗闈㈣緝杩滅殑鍦版柟锛岃繕瀵归噸蹇冩瀯鎴愪笂浠板姏鐭╋紝鎶垫秷鏈虹考鍗囧姏鏋勬垚鐨勪笅淇姏鐭╋紝淇濇寔椋炴満鐨勫钩琛★紙鍥�2-36锛夈�傚钩灏句骇鐢熺殑璐熷崌鍔涗笌鏈虹考浜х敓鐨勫崌鍔涚殑鍚堝姏鎵嶆槸鍏ㄦ満鐨勫崌鍔涳紝鍦ㄥ钩椋炰腑璧峰厠鏈嶉鏈洪噸鍔涚殑浣滅敤銆� + </p> + <p class="p-odd"> + 椋炶涓紝濡傛灉椋炴満鐨勯噸蹇冧綅缃彂鐢熷彉鍖栵紝瀵归鏈虹殑骞宠 浼氫骇鐢熸槑鏄剧殑褰卞搷銆傚鏋滈鏈虹殑閲嶅績闈犲墠锛屾満缈煎崌鍔涗笌閲嶅績涔嬮棿鐨勮窛绂诲姞闀匡紝鍗囧姏鐨勫姏鑷傚闀匡紝涓嬩刊鍔涚煩灏嗗鍔犲緢澶氾紝灏界 + </p> + </span> + </div> + </div> + </div> + <!-- 58椤� --> + <div class="page-box" page="66"> + <div v-if="showPageList.indexOf(66) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">058</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 骞冲熬鐨勮礋鍗囧姏鐨勫姏鑷備篃鏈夋墍澧炲姞锛屼絾褰卞搷杈冨皬锛屼笂浠板姏鐭╁鍔犳湁闄愶紝椋炴満鐨勪笅淇姏鐭╁皢澶т簬涓婁话鍔涚煩锛屽繀椤绘搷绾靛钩灏炬垨鍗囬檷鑸靛澶у钩灏剧殑璐熷崌鍔涙墠鑳藉钩琛¢鏈恒�傚钩灏捐礋鍗囧姏鐨勫澶у張浼氬墛寮卞叏鏈虹殑鍗囧姏骞跺鍔犻鏈洪樆鍔涳紝浣块鏈虹殑缁忔祹鎬т笅闄嶃�傚鏋滈噸蹇冭繃浜庨潬鍓嶏紝闈犳搷绾典篃涓嶈兘骞宠 椋炴満锛岄鏈哄氨涓嶈兘缁存寔姝e父椋炶銆傞鏈洪噸蹇冮潬鍚庡垯鐩稿弽锛岄琛屼腑杩樹細鍓婂急椋炴満鐨勭ǔ瀹氭�э紝鐢氳嚦閫犳垚椋炴満涓嶇ǔ瀹氥�傚洜姝わ紝鍦ㄩ琛屼腑锛屽繀椤讳繚璇侀鏈虹殑閲嶅績鍦ㄤ竴瀹氱殑鑼冨洿涔嬪唴锛岃繖灏辫姹傚湪浜哄憳銆佽揣鐗╄杞芥椂锛屽繀椤讳弗鏍兼寜瑕佹眰杩涜锛屽皢椋炴満鐨勯噸蹇冩帶鍒跺湪瑙勫畾鐨勮寖鍥翠箣鍐呫�� + </p> + <p class="p-even"> + 椋炴満鐨勯噸蹇冨乏鍙崇Щ鍔ㄥ骞宠 涔熸湁褰卞搷銆備絾鐢变簬椋炴満宸﹀彸瀵圭О锛岄噸蹇冨熀鏈湪瀵圭О闈箣鍐咃紝绉诲姩璺濈寰堝皬锛岄鏈哄乏鍙虫満缈笺�佸熬缈间骇鐢熺殑鍗囧姏涔熷熀鏈钩琛★紝涓�鑸儏鍐典笅涓嶄細閫犳垚宸﹀彸鍔涚煩涓嶅钩琛★紝鏁呭湪姝や笉鍋氳璁恒�� + </p> + <h4 id="d022" class="p-even unit2-c">浜斻�侀鏈虹殑鍩烘湰鎿嶇旱鏂规硶</h4> + <p class="p-even"> + 涓轰簡渚夸簬鍒嗘瀽椋炴満鐨勬搷绾电壒鐐癸紝鎴戜滑鍏堝湪椋炴満涓婂缓绔嬩竴涓満浣撳潗鏍囩郴锛屽皢瀵归鏈虹殑鍚勭鎿嶇旱鍜岄鏈虹殑杩愬姩閮藉垎瑙e埌瀵瑰簲鐨勫潗鏍囪酱涓娿�� + </p> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0070-1.jpg" /> + <p class="img">鍥�2-37 鏈轰綋杞寸郴</p> + </div> + <span> + <p class="p-even"> + 鏈轰綋鍧愭爣绯荤殑鍘熺偣涓洪鏈虹殑閲嶅績銆傝繃閲嶅績銆佸湪椋炴満瀵圭О闈㈠唴銆佷笌鏈鸿韩瀵圭О杞村钩琛岀殑杞寸嚎鍙満浣撶旱杞达紙<i>x</i>杞达級锛屾寚鍚戞満澶存柟鍚戜负姝o紙鍥�2-37锛夛紱杩囬噸蹇冦�佸湪椋炴満瀵圭О闈㈠唴銆佷笌绾佃酱鍨傜洿鐨勮酱绾垮彨鏈轰綋绔嬭酱锛�<i>y</i>杞达級锛屾寚鍚戞満韬笂鏂逛负姝o紱杩囬噸蹇冦�佸瀭鐩翠簬椋炴満瀵圭О闈㈢殑杞寸嚎鍙満浣撴í杞达紙<i>z</i>杞达級锛屾寚鍚戝彸缈兼柟鍚戜负姝c�� + </p> + <p class="p-even"> + 椋炶涓紝鏃犺椋炴満鐨勮繍鍔ㄧ姸鎬佸涔堝鏉傦紝閮藉彲浠ュ皢鍏跺垎瑙e埌缁曚笁鏉¤酱鐨勮浆鍔ㄥ拰鍦ㄤ笁鏉¤酱鏂瑰悜涓婄殑杩愬姩銆備负浜嗕究浜庢弿杩板拰鐞嗚В锛屽皢缁曟満浣撳悇杞寸殑杞姩鍒嗗埆鐢ㄤ笉鍚岀殑鍚嶇О鏉ヨ〃杈撅紙鍥�2-37锛夈�傜粫鏈轰綋绾佃酱鐨勮浆鍔ㄥ彨浣滃乏鍙虫粴杞紝缁曟満浣撶珛杞寸殑杞姩鍙綔宸﹀彸鍋忚浆锛岀粫鏈轰綋妯酱鐨勮浆鍔ㄥ彨浣滀刊浠拌浆鍔ㄣ�� + </p> + </span> + <p class="p-even"> + 椋炶鍛橀�氳繃椹鹃┒鏉嗗拰鑴氳宫鎿嶇旱涓嶅悓鐨勮埖闈娇椋炴満缁曞悇鏉¤酱杞姩锛岄鏈� + </p> + </div> + </div> + </div> + <!-- 59椤� --> + <div class="page-box" page="67"> + <div v-if="showPageList.indexOf(67) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">059</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鐨勪富鎿嶇旱鑸甸潰鏈夊崌闄嶈埖銆佸壇缈煎拰鏂瑰悜鑸碉紝缂濈考銆佽缈煎拰鎵版祦鏉挎槸杈呭姪鎿嶇旱闈紙鍥�2-38锛夈�備竴鑸湪璧烽鍜岀潃闄嗘椂浼氫娇鐢ㄥ埌銆� + </p> + <p class="p-odd"> + 閫氳繃椹鹃┒鏉嗙殑鍓嶆帹鍜屽悗鎷夛紝椋炶鍛樻帶鍒跺钩灏惧悗鏂圭殑鍗囬檷鑸靛亸杞�傛媺鏉嗘椂锛屽崌闄嶈埖涓婂亸锛岄鏈虹殑骞冲熬涓婃柟姘旀祦鍙楅樆锛岄�熷害鍑忓皬锛屽帇鍔涘澶э紝鍦ㄥ钩灏句笂浜х敓鍚戜笅鐨勭┖姘斿姩鍔涳紝鐢变簬骞冲熬鍦ㄩ噸蹇冧箣鍚庡苟涓旂閲嶅績杈冭繙锛岃繖涓┖姘斿姩鍔涘皢瀵归鏈洪噸蹇冩瀯鎴愪笂浠板姏鐭╋紝浣挎満澶翠笂浠帮紝椋炴満杩庤澧炲ぇ锛堝浘2-39锛夈�傚悓鐞嗭紝濡傛灉椋炶鍛樻帹鏉嗭紝鍗囬檷鑸典笅鍋忥紝骞冲熬浜х敓鍚戜笂鐨勭┖姘斿姩鍔涳紝瀵归噸蹇冩瀯鎴愪笅淇姏鐭╋紝鏈哄ご涓嬩刊锛岄鏈鸿繋瑙掑噺灏忋�傚湪姝e父鐨勮繋瑙掕寖鍥村唴銆侀琛岄�熷害涓嶅彉鐨勬儏鍐典笅锛屾媺鏉嗕娇杩庤澧炲ぇ锛屽崌鍔涘澶э紝椋炴満灏嗕笂鍗囬珮搴︼紝鎺ㄦ潌浣胯繋瑙掑噺灏忥紝鍗囧姏鍑忓皬锛岄鏈哄皢涓嬮檷楂樺害銆傚鏋滆鎿嶇旱椋炴満涓婂崌锛岄櫎浜嗘媺鏉嗕互閫傚綋澧炲ぇ杩庤銆佸崌鍔涗箣澶栵紝杩橀渶鐩稿簲鍔犲ぇ娌归棬锛屼繚鎸佽冻澶熺殑椋炶閫熷害锛涙搷绾甸鏈轰笅婊戯紝鍒欐敹灏忔补闂紝闅忕潃閫熷害鍑忓皬锛岄鏈哄崌鍔涘噺灏忥紝椋炴満鑷劧杞叆涓嬫粦銆備负闃叉涓嬫粦瑙掑お澶э紝椋炶鍛樿繕闇�鐩稿簲鎷夌偣鏉嗭紝閫傚綋澧炲姞杩庤锛屾墠鑳戒繚鎸侀瀹氱殑涓嬫粦瑙掋�� + </p> + <p class="center openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0071-2.jpg" /> + </p> + <p class="img">鍥�2-39 淇话鎿嶇旱</p> + <p><br /></p> + <div class="img-rights w395"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block">涓烘彁楂橀鏈虹殑鎿嶇旱鎬э紝闇�澧炲ぇ鍗囬檷鑸甸潰绉�傜幇</p> + <div class="img-rights w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0071-3.jpg" /> + <p class="img">鍥�2-40 鎴樻枟鏈虹殑鍏ㄥ姩骞冲熬</p> + </div> + <span> + <p class="block td-0"> + 浠f垬鏂楁満灏嗗钩灏捐璁℃垚涓�涓暣浣擄紝鍏ㄩ儴璧峰崌闄嶈埖鐨勪綔鐢紝绉颁负鈥滃叏鍔ㄥ钩灏锯�濓紙鍥�2-40锛夛紝鎿嶇旱鎬ц兘杈冨父瑙勭殑鍗囬檷鑸垫湁澶у箙鎻愬崌銆� + </p> + </span> + </div> + </div> + <span> + <p> + 椹鹃┒鏉嗗乏鍙崇Щ鍔ㄤ範鎯笂绉颁綔鈥滃帇鏉嗏�濄�傞琛屽憳鍚戝乏鍘嬫潌锛屽乏渚х考灏栧悗缂樼殑鍓考涓婂亸锛屽彸渚х殑鍓考涓嬪亸銆傚乏鍓考涓婂亸锛屽湪宸︿晶缈煎皷閮ㄥ垎鏈虹考涓婁骇鐢熷悜涓嬬殑绌烘皵鍔ㄥ姏锛涘彸鍓考涓嬪亸锛屽湪鍙充晶缈煎皷閮ㄥ垎鏈虹考浜х敓鍚戜笂鐨勭┖姘斿姩鍔涖�傝繖涓�瀵规柟鍚戠浉鍙嶇殑绌烘皵鍔ㄥ姏瀵归鏈洪噸蹇冨舰鎴愭粴杞姏鐭╋紝浣块鏈哄悜宸︽粴 + </p> + </span> + </div> + </div> + </div> + <!-- 60椤� --> + <div class="page-box" page="68"> + <div v-if="showPageList.indexOf(68) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">060</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 杞紝閫愭笎褰㈡垚宸﹀潯搴︼紙鍥�2-41锛夈�傚悓鐞嗭紝濡傛灉椋炶鍛樺悜鍙冲帇鏉嗭紝鍙冲壇缈间笂鍋忋�佸乏鍓考涓嬪亸锛岄鏈哄悜鍙虫粴杞紝閫愭笎褰㈡垚鍙冲潯搴︺�� + </p> + <p class="center openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0072-1.jpg" /> + </p> + <p class="img">鍥�2-41 妯晶鎿嶇旱</p> + <p class="p-even"> + 椋炶鍛樺乏鑴氬悜鍓嶈宫鑴氳宫锛屼範鎯笂鍙綔鈥滆宫宸﹁埖鈥濓紝鍨傚熬鍚庨儴鐨勬柟鍚戣埖鍚戝乏鍋忚浆锛屽瀭灏句骇鐢熷悜鍙崇殑绌烘皵鍔ㄥ姏銆傝绌烘皵鍔ㄥ姏瀵归噸蹇冨舰鎴愪娇椋炴満鍚戝乏鍋忚浆鐨勫姏鐭╋紝浣挎満澶村悜宸﹀亸杞紙鍥�2-42锛夈�傚悓鐞嗭紝韫彸鑸碉紝鏂瑰悜鑸靛彸鍋忥紝鍨傚熬涓婁骇鐢熷悜宸︾殑绌烘皵鍔ㄥ姏锛屽椋炴満閲嶅績褰㈡垚鍙冲亸鍔涚煩锛屼娇鏈哄ご鍚戝彸鍋忚浆銆� + </p> + <div class="img-rights w220 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0072-2.jpg" /> + <p class="img">鍥�2-42 鏂瑰悜鎿嶇旱</p> + </div> + <span> + <p class="p-even"> + 鍧″害锛�<i>纬</i>锛夋槸椋炴満瀵圭О闈笌鏈轰綋绾佃酱鎵�鍦ㄧ殑閾呭瀭闈箣闂寸殑澶硅锛堝浘2-43锛夈�傚潯搴︽湁宸﹀彸涔嬪垎锛屽乏渚ф満缈煎悜涓嬩负宸﹀潯搴︼紝鍙充晶鏈虹考鍚戜笅涓哄彸鍧″害銆傛搷绾甸鏈鸿浆寮椂锛岄琛屽憳瑕佸悜棰勫畾杞集鏂瑰悜鍘嬫潌锛屽舰鎴愰瀹氱殑鍧″害鍚庡啀灏嗛┚椹舵潌鍥炴鐢氳嚦鍥炶繃涓珛浣嶇疆锛岄槻姝㈠潯搴︾户缁澶э紝鐩殑鏄繚鎸佸ソ棰勫畾鍧″害銆傜敱浜庨鏈哄甫浜嗗潯搴︼紝椋炴満鍗囧姏鍙戠敓浜嗗�炬枩锛屽皢鍒嗚В涓轰袱涓垎鍔涳紙鍥�2-43锛夛紝鍗囧姏涓�鍒嗗姏锛堝瀭鐩村垎鍔涳級璧峰钩琛¢噸鍔涚殑浣滅敤锛屽崌鍔涗簩鍒嗗姏 + </p> + </span> + <div class="img-float w220 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0072-3.jpg" /> + <p class="img">鍥�2-43 鍧″害</p> + </div> + <span> + <p class="p-even td-0"> + 锛堟按骞冲垎鍔涳級鍋氬悜蹇冨姏浣块鏈鸿浆寮�傚潯搴﹀舰鎴愭椂锛屽崌鍔涗竴鍒嗗姏涓嶈冻浠ュ钩琛¢噸鍔涳紝椋炴満灏嗚浆鍏ヤ笅婊戯紝涓轰簡淇濇寔椋炶楂樺害锛岄琛屽憳杩橀渶閫傚綋鎷夋潌澧炲ぇ杩庤锛屽澶у崌鍔涳紝鍧″害杈冨ぇ鏃惰繕闇�瑕佸姞澶ф补闂ㄦ墠鑳戒繚鎸侀�熷害鍜岃冻澶熺殑鍗囧姏銆傚潯搴﹀舰鎴愭椂锛屽崌鍔涗簩鍒嗗姏鍋氬悜蹇冨姏浣块鏈鸿浆寮紝椋炶鍛樿繕闇�鍚戣浆寮柟鍚戦�傚綋韫埖锛屼骇鐢熷亸杞姏鐭╀娇鏈哄ご鍋忚浆锛屾墠鑳戒娇椋炴満鍗忚皟銆佺ǔ瀹氬湴杩涘叆杞集鐘舵�併�� + </p> + </span> + </div> + </div> + </div> + <!-- 61椤� --> + <div class="page-box" page="69"> + <div v-if="showPageList.indexOf(69) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">061</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <div class="img-rights w200 openImgBox"> + <img class="img" alt="" src="../../assets/images/0073-1.jpg" /> + <p class="img">鍥�2-44 渚ф粦涓庝晶婊戣</p> + </div> + <span> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 渚ф粦鏄鏈哄绉伴潰涓庨琛岄�熷害锛堢浉瀵规皵娴侊級鏂瑰悜涓嶄竴鑷寸殑椋炶锛岀浉瀵规皵娴佹柟鍚戜笌椋炴満瀵圭О闈㈢殑澶硅鍙綔渚ф粦瑙掞紙尾锛夛紝鐩稿姘旀祦浠庨鏈哄绉伴潰宸﹀墠鏂瑰惞鏉ワ紝鍙綔宸︿晶婊戯紝鍙嶄箣鍙彸渚ф粦锛堝浘2-44锛夈�傛甯搁琛屾椂椋炴満涓嶅甫渚ф粦锛屽甫渚ф粦鏃朵細浜х敓渚у姏锛屽悓鏃堕樆鍔涘澶э紝褰卞搷椋炴満鐨勯琛屾�ц兘鍜屾梾瀹㈢殑鑸掗�傚害锛屾梾瀹細鎰熻韬綋琚線涓�杈圭敥銆傛搷绾甸鏈鸿浆寮椂濡傛灉鍙帇鏉嗕笉韫埖锛屽崌鍔涗簩鍒嗗姏涔熶細浣块鏈鸿浆寮紝浣嗘満澶磋窡涓嶄笂杞集瑙掗�熷害锛屼細钀藉悗浜庨琛岃建杩硅浆杩囩殑瑙掑害锛屽舰鎴愪晶婊戙�傚鏋滃彧闈犺宫鑸典娇鏈哄ご鍋忚浆鑰屼笉鍘嬫潌褰㈡垚鍧″害锛屾病鏈夊崌鍔涗簩鍒嗗姏浣滀负鍚戝績鍔涳紝鏈哄ご杞繃涓�涓搴﹀悗锛岄鏈轰骇鐢熶晶婊戯紝鍦ㄤ晶婊戠殑浣滅敤涓嬮鏈轰篃浼氳浆寮紝浣嗘満澶磋浆杩囩殑瑙掑害瓒呭墠浜庨鏈鸿建杩硅浆杩囩殑瑙掑害銆傚洜姝わ紝鎿嶇旱椋炴満杞集鏃朵竴瀹氳鎵嬭剼涓�鑷达紝鏉嗚埖閰嶅悎鍗忚皟锛屾墠鑳戒繚璇侀鏈轰笉甯︿晶婊戝湴杞集銆� + </p> + </span> + </span> + </div> + </div> + </div> + </div> + <!-- 62椤� --> + <div class="page-box" page="70"> + <div v-if="showPageList.indexOf(70) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">062</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even unit2-c">瀛︿範浠诲姟涓�<br />璁よ瘑椋炴満鏈轰綋</h3> + <div class="task-u2-c ma-l"></div> + <p class="p-even"> + 椋炴満鐨勫褰㈠樊寮傚緢澶э紝浣嗘棤璁轰粈涔堝褰€�佷粈涔堢敤閫旂殑椋炴満锛屽氨鍏剁粍鎴愭潵璇达紝閮藉彲浠ュ垎鎴愭満缈笺�佹満韬�佸熬缈笺�佽捣钀芥灦銆佸姩鍔涜缃拰浠〃璁惧鍏ぇ閮ㄥ垎銆傚叾涓満缈笺�佹満韬�佸熬缈煎拰璧疯惤鏋跺悎绉伴鏈烘満浣撱�傛湰浠诲姟鎴戜滑鍙粙缁嶆満浣擄紝鍔ㄥ姏瑁呯疆鍜屼华琛ㄨ缃皢鍦ㄦ湰椤圭洰浠诲姟鍥涘拰浠诲姟浜斾腑浠嬬粛銆� + </p> + <h4 id="d023" class="p-even unit2-c">涓�銆佹満缈�</h4> + <p class="p-even"> + 椋炴満瑕佷骇鐢熻冻澶熺殑鍗囧姏鍏嬫湇閲嶅姏鎵嶈兘瀹炵幇椋炶锛屾満缈兼槸浜х敓鍗囧姏鐨勪富瑕侀儴浠躲�傛満缈间箣鎵�浠ヨ兘浜х敓鍗囧姏锛屾槸鍥犱负瀹冪嫭鐗圭殑褰㈢姸锛涢鏈哄湪椋炶涓鎯虫敼鍙樺崌鍔涚殑澶у皬鍜屾柟鍚戯紝闇�瑕侀�氳繃鎿嶇旱鏈虹考涓婄殑闄勫睘璁炬柦鏉ュ疄鐜般�� + </p> + <h5 id="e014" class="p-even unit2-c">锛堜竴锛夋満缈肩殑澶栧舰</h5> + <p class="p-even"> + 鏈虹考鐨勫褰㈠垎涓烘満缈肩殑骞抽潰褰㈢姸鍜屽墫闈㈠舰鐘讹紙缈煎瀷锛夛紝缈煎瀷鍦ㄥ墠闈㈠凡缁忓仛浜嗕粙缁嶏紝杩欓噷鍙粙缁嶆満缈肩殑骞抽潰褰㈢姸锛堝浘2-45锛夈�� + </p> + <p class="center openImgBox p-even"> + <img class="img-a" alt="" src="../../assets/images/0074-1.jpg" /> + </p> + <p class="img p-even">鍥�2-45 鏈虹考鐨勫钩闈㈠舰鐘�</p> + <p class="p-even"> + 鍥�2-45涓墍绀虹殑鐭╁舰缈笺�佹き鍦嗙考銆佹褰㈢考锛屽畠浠殑鏈虹考杞寸嚎涓庢満韬í杞村钩琛岋紝缁熺О涓哄钩鐩寸考銆傚钩鐩寸考椋炴満浣庨�熸�ц兘杈冨ソ锛屼负澶у鏁颁綆閫熼鏈洪噰鐢ㄣ�� + </p> + </div> + </div> + </div> + <!-- 63椤� --> + <div class="page-box" page="71"> + <div v-if="showPageList.indexOf(71) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">063</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 鍚庢帬缈奸鏈哄湪楂橀�熼琛屾椂鏈夊緢濂界殑鎬ц兘锛屾晠楂橀�熼鏈哄ぇ澶氶噰鐢ㄥ悗鎺犵考銆傛皯鑸娇鐢ㄧ殑鑸嚎椋炴満鍑犱箮閮芥槸鍚庢帬缈笺�� + </p> + <div class="img-rights w200 openImgBox"> + <img class="img" alt="" src="../../assets/images/0075-1.jpg" /> + <p class="img">鍥�2-46 鈥滈噾闆曗�濇垬鏂楁満</p> + <p style="line-height: 20px"><br /></p> + <img class="img" alt="" src="../../assets/images/0075-2.jpg" /> + <p class="img">鍥�2-47 缈煎睍</p> + </div> + <span> + <p class="p-odd"> + 涓夎缈笺�佸弻涓夎缈间互鍙婁笌杈规潯缈奸厤鍚堢殑鍚庢帬缈肩瓑鍦ㄩ珮閫熷拰澶ц繋瑙掍笅鏈夎緝濂界殑姘斿姩鎬ц兘锛屽緢澶氭垬鏂楁満閽熺埍杩欐牱鐨勬満缈笺�傚墠鎺犵考鍦ㄩ珮閫熼琛屾椂鏈夊悗鎺犵考鐨勬墍鏈変紭鐐癸紝杩樿兘浠庢牴鏈笂瑙e喅鍚庢帬缈煎瓨鍦ㄧ殑缂洪櫡锛屾槸绌烘皵鍔ㄥ姏瀛︾悊璁鸿涓烘渶浣崇殑鏈虹考甯冨眬銆備絾鐢变簬宸ヨ壓鍜屾潗鏂欑瓑闂锛岃繕涓嶈兘鍙栧緱骞挎硾搴旂敤銆傜幇鍦ㄤ笘鐣屼笂璁捐鍒堕�犳垚鍔熺殑鍓嶆帬缈奸鏈哄彧鏈変縿缃楁柉鑻忛湇浼婅璁″眬璁捐鍒堕�犵殑鑻�-47鈥滈噾闆曗�濇垬鏂楁満锛堝浘2-46锛夛紝浣嗙敱浜庡叾浠栧師鍥狅紝杩樻湭鑳介噺浜с�� + </p> + <p class="p-odd"> + 鏈虹考鏈�澶栦晶鍙綔缈煎皷锛屼笌鏈鸿韩鐨勬帴鍚堥儴鍙綔缈兼牴锛屾満缈间袱缈煎皷涔嬮棿鐨勭洿绾胯窛绂诲彨椋炴満鐨勭考灞曪紙鍥�2-47锛夈�傛満缈间骇鐢熺殑宸ㄥぇ鍗囧姏闇�瑕侀�氳繃缈兼牴浼犻�掔粰鏈鸿韩锛屽洜姝ょ考鏍瑰鏄鏈哄彈鍔涙渶澶х殑閮ㄤ綅銆� + </p> + </span> + <h5 id="e015" class="p-odd unit2-c">锛堜簩锛夋満缈肩殑瀹夎</h5> + <p class="p-odd"> + 鏃╂湡鐨勯鏈虹敱浜庨�熷害鎱紝瑕佽幏寰楄冻澶熺殑鍗囧姏锛屽湪璁捐鍒堕�犳椂鍙兘鍔犲ぇ鏈虹考闈㈢Н銆傚湪褰撴椂鐨勫伐鑹烘潯浠朵笅锛屾病鏈夎兘鍔涘埗閫犲ぇ闈㈢Н鏈虹考锛屽彧鑳界粰椋炴満璁捐涓ゅ壇涔冭嚦涓夊壇鏈虹考锛堝浘2-48锛夈�傜幇浠i鏈洪�熷害蹇紝涓嶉渶瑕佸緢澶х殑鏈虹考闈㈢Н灏辫兘鑾峰彇瓒冲鐨勫崌鍔涳紝鍒堕�犳妧鏈殑杩涙鍙堜娇璁捐鍒堕�犲ぇ鏈虹考鍙樻垚浜嗙幇瀹烇紝鍥犳鐜颁唬椋炴満宸茬粡瀹屽叏鎽掑純浜嗗弻缈肩粨鏋勶紝閮藉彧瀹夎涓�鍓満缈硷紝绉颁负鍗曠考鏈恒�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0071-01.jpg" /> + <p class="img">鍥�2-48-1 涓夌考鏈�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0071-02.jpg" /> + <p class="img">鍥�2-48-2 鍙岀考鏈�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="p-odd"> + 鏍规嵁鏈虹考瀹夎鍦ㄦ満韬笂鐨勪綅缃笉鍚岋紝鍗曠考鏈哄彲鍒嗕负涓婂崟缈笺�佷腑鍗曠考鍜屼笅鍗曠考锛堝浘2-49锛夈�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0071-03.jpg" /> + <p class="img">鍥�2-49-1 涓婂崟缈�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0071-04.jpg" /> + <p class="img">鍥�2-49-2 涓崟缈�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0071-05.jpg" /> + <p class="img">鍥�2-49-3 涓嬪崟缈�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + </div> + </div> + </div> + <!-- 64椤� --> + <div class="page-box" page="72"> + <div v-if="showPageList.indexOf(72) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">064</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 鍦ㄩ琛屼腑锛屼腑鍗曠考椋炴満鍦ㄦ満缈煎拰鏈鸿韩鐨勬帴鍚堝浜х敓鐨勫共鎵伴樆鍔涙渶灏忥紝鏈夎緝濂界殑椋炶鎬ц兘銆備絾涓崟缈奸鏈虹殑缈兼瑕佷粠鏈鸿韩涓儴绌胯繃锛屼笉渚夸簬甯冪疆瀹㈣埍鍜岃揣鑸憋紝鏁呮墍鏈夎繍杈撴満閮戒笉閲囩敤涓崟缈硷紝杩欑鏈虹考瀹夎鏂瑰紡鍙负鎴樻枟鏈洪噰鐢ㄣ�� + </p> + <p class="p-even"> + 涓婂崟缈兼垨涓嬪崟缈奸鏈哄敖绠″共鎵伴樆鍔涜緝澶э紝浣嗘満缈肩殑缈兼浠庢満韬笂閮ㄦ垨涓嬫柟缁忚繃锛屼笉褰卞搷鏈鸿埍鍐呴儴甯冨眬锛屽父琚繍杈撴満閲囩敤銆傚崟浠庡共鎵伴樆鍔涙潵鐪嬶紝涓婂崟缈肩殑骞叉壈闃诲姏瑕佸皬浜庝笅鍗曠考銆� + </p> + <div class="img-float w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0076-1.jpg" /> + <p class="img">鍥�2-50 涓婂崟缈奸鏈�</p> + </div> + <span> + <p class="p-even"> + 涓婂崟缈奸鏈烘満缈肩鍦拌緝杩滐紝濡傛灉鍙戝姩鏈哄悐瑁呭湪鏈虹考涓婏紝绂诲湴闈㈣緝杩滐紝涓嶆槗鍚稿叆鍦伴潰涓婄殑灏忕煶瀛愪箣绫荤殑鏉傜墿锛屼絾缁欐満鍔$淮鎶ゅ甫鏉ヤ笉渚匡紝涔熺粰璧疯惤鏋剁殑瀹夎閫犳垚涓�瀹氬奖鍝嶃�傚鏋滆捣钀芥灦瀹夎鍦ㄦ満缈间笂锛屽叾闀垮害鍔垮繀杩囬暱锛屽皢浼氬甫鏉ュ己搴︿笅闄嶅拰鏀舵斁鍥伴毦绛夐夯鐑︼紱濡傛灉璧疯惤鏋跺畨瑁呭湪鏈鸿韩涓婏紝涓昏捣钀芥灦涔嬮棿鐨勮窛绂诲氨浼氬お杩戯紝椋炴満婊戣窇鐨勭ǔ瀹氭�т笅闄嶃�備絾涓婂崟缈奸鏈猴紙鍥�2-50锛夌殑鏈鸿韩绂诲湴寰堣繎锛屾満鑸变綅缃綆锛屽ぇ鍨嬭揣鐗╄鍗告柟渚匡紝鍥犳涓婂崟缈肩殑缁撴瀯琚啗鐢ㄨ繍杈撴満骞挎硾閲囩敤銆� + </p> + </span> + <p class="p-even"> + 涓嬪崟缈奸鏈烘満缈间綅缃緝浣庯紝鍚婅鍦ㄦ満缈间笂鐨勫彂鍔ㄦ満浣嶇疆涔熶綆锛屼究浜庢満鍔$淮鎶わ紝浣嗗悓鏃朵篃鏄撳惛杩涙潅鐗╋紝瀵瑰彂鍔ㄦ満鐨勪娇鐢ㄥ畨鍏ㄩ�犳垚涓�瀹氬奖鍝嶃�備笅鍗曠考椋炴満鐨勮捣钀芥灦鍙互瀹夎鍦ㄦ満缈间笂锛岄暱搴﹀緢鐭紝渚夸簬鏀舵斁锛屽己搴︿篃杈冨ぇ锛屼富璧疯惤鏋朵箣闂寸殑璺濈杈冨ぇ锛屾粦璺戠ǔ瀹氭�ц緝楂橈紝杩芥眰涔樺潗鑸掗�傛�х殑姘戠敤鑸嚎椋炴満澶у閲囩敤涓嬪崟缈笺�傚彟澶栵紝涓嬪崟缈肩粨鏋勯�犳垚椋炴満鏈鸿韩绂诲湴杈冭繙锛屾満鑸变綅缃緝楂橈紝瑁呭嵏涓嶄究銆傚鏋滀綔涓哄鏈轰娇鐢紝鏃呭鍙互閫氳繃杈冮珮鐨勭櫥鏈哄粖妗ユ垨绉诲姩鐧绘満姊潵鍏嬫湇杩欎竴缂洪櫡銆� + </p> + <div class="img-float w200 openImgBox p-even"> + <img class="img-0" alt="" src="../../assets/images/0076-2.jpg" /> + <p class="img">鍥�2-51 鏈虹考瀹夎瑙�</p> + </div> + <span> + <p class="p-even"> + 椋炴満鐨勬満缈煎線寰�涓嶆槸鍜屾満韬钩琛屽畨瑁呭湪鏈鸿韩涓婄殑锛屾満缈肩考寮︿笌鏈鸿韩杞寸嚎浼氭湁涓�瀹氱殑澶硅锛岃繖涓搴﹀彨浣滄満缈煎畨瑁呰锛堝浘2-51锛夈�傞鏈哄湪宸¤埅椋炶涓紝鏈虹考鏈変竴瀹氱殑杩庤锛屽洜姝わ紝鏈虹考鏈変竴瀹氬畨瑁呰鐨勭洰鐨勬槸浣挎満缈间繚鎸佹甯歌繋瑙掗琛屾椂鏈鸿韩杞寸嚎涓庣浉瀵规皵娴佹柟鍚戝熀鏈钩琛岋紝浜х敓鐨勯樆鍔涜緝灏忋�傜幇浠h埅绾块鏈虹殑鏈虹考瀹夎瑙掔害涓�4掳銆� + </p> + </span> + <p class="p-even"> + 鏈虹考鍩哄噯绾夸笌椋炴満瀵圭О闈㈡硶绾夸箣闂寸殑澶硅鍙笂锛堜笅锛夊弽瑙掋�傜考姊㈠悜涓婄繕鏃朵负涓婂弽瑙掞紝缈兼ⅱ鍚戜笅鎶樿浆鏃朵负涓嬪弽瑙掞紙鍥�2-52锛夈�傜幇浠i噰鐢ㄤ笅鍗曠考缁� + </p> + </div> + </div> + </div> + <!-- 65椤� --> + <div class="page-box" page="73"> + <div v-if="showPageList.indexOf(73) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">065</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鏋勭殑姘戠敤椋炴満锛屾櫘閬嶆湁涓�瀹氱殑涓婂弽瑙掞紝澶у鏁伴噰鐢ㄥ悗鎺犵考銆佷笂鍗曠考缁撴瀯鐨勫啗鐢ㄩ鏈烘湁涓�瀹氱殑涓嬪弽瑙掋�� + </p> + <p class="center openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0077-1.jpg" /> + </p> + <p class="img">鍥�2-52 涓婂弽瑙掍笌涓嬪弽瑙�</p> + <h5 id="e016" class="p-odd unit2-c">锛堜笁锛夋満缈间笂鐨勬帶鍒惰澶�</h5> + <p class="p-odd"> + 涓轰簡鏈夋晥鎿嶆帶椋炴満锛屽厖鍒嗗彂鎸ラ鏈虹殑鎬ц兘锛屽湪鏈虹考鐨勫墠缂樺拰鍚庣紭瀹夎浜嗗緢澶氭敼鍠勬垨鎺у埗椋炴満鐨勮缃紝鍖呮嫭鍓考銆佽缈笺�佺紳缈煎拰鎵版祦鏉跨瓑锛堝浘2-38锛夈�� + </p> + <p class="p-odd"> + 鍓考瀹夎鍦ㄦ満缈煎渚у悗缂橈紝閮ㄥ垎楂橀�熻繍杈撴満鍦ㄦ満缈间腑閮ㄥ悗缂樿繕瀹夎鏈夊唴渚у壇缈硷紝浣庨�熼琛屾椂浣跨敤澶栦晶鍓考锛岄珮閫熼琛屾椂浣跨敤鍐呬晶鍓考銆傚壇缈肩敱椋炶鍛橀�氳繃椹鹃┒鏉嗗疄鏂芥搷绾碉紝鍙笂涓嬪亸杞�� + </p> + <p class="p-odd"> + 鐜颁唬姘戠敤鑸嚎椋炴満鍦ㄦ満缈煎悗缂橀櫎鍓考澶栵紝鍏朵綑绌洪棿鍏ㄨ璁′负瑗熺考锛岀敤浜庢敼鍠勯鏈鸿捣椋炪�佺潃闄嗘�ц兘銆傝缈煎彧鑳藉悜涓嬪亸杞紝灏嗗叾鏀句笅鍚庯紝鏀瑰彉浜嗘満缈肩殑寮害锛屽湪杈冧綆鐨勯琛岄�熷害涓嬭兘鏈夋晥鎻愰珮椋炴満鍗囧姏锛屼絾闃诲姏涔熶細鐩稿簲澧炲姞锛屽鍔犵殑姣斾緥澶т簬鍗囧姏澧炲姞鐨勬瘮渚嬨�傚湪璧烽杩囩▼涓负闃叉鍥犻樆鍔涘鍔犺繃澶氳�屽墛寮辫捣椋炴�ц兘锛岄�氬父鍙斁灏忚搴﹁缈硷紝椋炴満杈惧埌涓�瀹氶珮搴﹀拰閫熷害鍚庡啀灏嗚缈兼敹璧锋潵锛岃繘琛屾甯搁琛屻�傚湪鐫�闄嗘椂閫氬父灏嗚缈煎叏閮ㄦ斁涓嬶紝浣块鏈哄湪杈冧綆閫熷害涓嬭幏寰楄緝澶х殑鍗囧姏锛屾湁鏁堝湴闄嶄綆鐫�闄嗘帴鍦伴�熷害锛屽鍔犵殑闃诲姏姝eソ鐢ㄤ簬鐫�闄嗗噺閫燂紙鍥�2-53锛夛紝瀵规敼鍠勯鏈虹殑鐫�闄嗘�ц兘鏋佷负鏈夊埄銆� + </p> + <p class="p-odd"> + 闄ゅ悗缂樿缈煎锛屾満缈煎墠缂橀儴鍒嗕篃瀹夎浜嗚缈煎拰缂濈考锛屽畠浠笌鍚庣紭瑗熺考 + </p> + <div class="img-rights w220 openImgBox"> + <img class="img" alt="" src="../../assets/images/0077-2.jpg" /> + <p class="img">鍥�2-53 鐫�闄嗘椂鏀捐缈煎拰寮犲紑鎵版祦鐗�</p> + </div> + <span> + <p class="p-odd td-0">涓�璧锋敼鍠勯鏈轰綆閫熸�ц兘銆�</p> + <p class="p-odd"> + 鐜板湪姘戠敤鑸嚎椋炴満鍦ㄥ悗缂樿缈煎墠鏂癸紝杩樿鏈夋壈娴佺墖锛屾壈娴佺墖鍙兘鍚戜笂寮犲紑锛屼富瑕佺敤浜庨鏈虹潃闄嗘椂澧炲姞闃诲姏鍜屾彁楂樺埞杞︽晥鐜囥�傚湪鐫�闄嗘椂鎵版祦鐗囧紶寮�鍚庯紝鏈虹考涓婃柟姘旀祦鍙楅樆锛岄樆鍔涙�ュ墽澧炲ぇ锛屽崌鍔涙�ュ墽鍑忓皬锛屽澶т簡椋炴満瀵瑰湴闈㈢殑鍘嬪姏锛屽埞杞︽晥鐜囨樉钁楁彁楂橈紙鍥�2-53锛夈�� + </p> + <h5 id="e017" class="p-odd unit2-c">锛堝洓锛夋満缈肩殑缁撴瀯</h5> + </span> + <p class="p-odd"> + 鏈虹考鐢辩考姊併�佺考鑲嬨�佹鏉″拰钂欑毊缁勬垚锛堝浘2-54锛夈�傜考姊併�佺考鑲嬪拰妗佹潯 + </p> + </div> + </div> + </div> + <!-- 66椤� --> + <div class="page-box" page="74"> + <div v-if="showPageList.indexOf(74) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">066</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鏋勬垚鏈虹考鐨勯鏋讹紝钂欑毊闄勭潃鍦ㄩ鏋朵笂灏辨槸瀹屾暣鐨勬満缈笺�傜考鑲嬩綔涓烘満缈肩殑妯悜楠ㄦ灦锛屼繚鎸佺潃鏈虹考鐨勭考鍨嬶紝鐩存帴鏀寔钂欑毊鎵垮彈绌烘皵鍔ㄥ姏锛涚考姊佷綔涓烘満缈肩殑绾靛悜楠ㄦ灦锛屾壙鍙楁暣涓満缈间笂浜х敓鐨勭┖姘斿姩鍔涳紝骞堕�氳繃鎺ュご灏嗗姏浼犵粰鏈鸿韩锛涙鏉″钩琛屼簬缈兼宓屽湪缈艰倠涓婏紝浠ユ敮鎸佽挋鐨�� + </p> + <p class="center p-even openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0078-1.jpg" /> + </p> + <p class="img p-even">鍥�2-54 鏈虹考鐨勫唴閮ㄧ粨鏋�</p> + <p class="p-even"> + 鏈虹考鍐呴儴鏈夎緝澶х殑绌洪棿锛屾皯鐢ㄩ鏈洪�氬父灏嗗叾瀵嗗皝鍚庝綔涓哄瓨鍌ㄧ噧娌圭殑娌圭锛屽ぇ鍨嬪柗姘斿紡瀹㈡満鐨勬満缈兼补绠卞偍瀛樹簡鍏ㄦ満鍥涘垎涔嬩竴宸﹀彸鐨勭噧娌广�傚ぇ澶氳埅绾块鏈轰富璧疯惤鏋跺畨瑁呭湪鏈虹考涓婏紝鏈虹考鐨勫唴閮ㄧ┖闂磋繕鏈変竴閮ㄥ垎鐢ㄦ潵璁剧疆璧疯惤鏋惰埍銆� + </p> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 涓�鑸鏈哄湪鏈虹考涓庢満韬殑浜ゆ帴澶勶紝鏈鸿韩鐨勪晶闈笌鏈虹考琛ㄩ潰鏋勬垚鐩磋锛堟垨鎺ヨ繎浜庣洿瑙掞級锛岃繖鏍风殑缁勫悎锛岀敱浜庢蹈娑﹂潰绉ぇ锛岄樆鍔涗篃杈冨ぇ銆備负鎻愬崌椋炴満鐨勬�ц兘锛岃璁″笀灏嗘満缈间笌鏈鸿韩鍚堟垚涓�浣撴潵璁捐鍜屽埗閫狅紝浜岃�呬箣闂存病鏈夋槑鏄剧殑鍒嗙晫闈紝绉颁负缈艰韩铻嶅悎浣擄紙鍥�2-55锛夈�傚鏁扮涓変唬瓒呭0閫熸垬鏂� + </p> + </span> + <div class="img-rights w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0078-2.jpg" /> + <p class="img">鍥�2-55 缈艰韩铻嶅悎浣�</p> + </div> + <span> + <p class="block td-0"> + 鏈洪噰鐢ㄤ簡缈艰韩铻嶅悎浣撹璁★紝浠庡骇鑸变箣鍚庯紝鏈鸿韩寮�濮嬬敱鍦嗗彉鎵侊紝鐩存帴鍚戞満缈艰繃娓★紝灏嗘満缈煎拰鏈鸿韩铻嶄负涓�浣撱�傜考韬瀺鍚堜綋鐨勪紭鐐规槸缁撴瀯璐ㄩ噺杞汇�佸唴閮ㄥ绉ぇ銆佹皵鍔ㄩ樆鍔涘皬锛屾満韬殑绾靛墫闈㈤兘鏄崌鍔涜緝澶х殑缈煎瀷闈紝鍙娇椋炴満鐨勯琛屾�ц兘鏈夎緝澶ф敼鍠勩�傚悗鏉ヨ繕鍙戠幇锛岀敱浜庢秷闄や簡鏈虹考涓庢満韬帴鍚堝鐨勬帴杩戠洿瑙掔殑鎺ヨЕ闈紝缈艰韩铻嶅悎浣撴湁鍔╀簬鍑忓皬椋炴満鐨勯浄杈惧弽灏勬埅闈㈢Н锛屽彲浠ユ敼鍠勯殣韬�ц兘銆� + </p> + </span> + </div> + </div> + </div> + </div> + <!-- 67椤� --> + <div class="page-box" page="75"> + <div v-if="showPageList.indexOf(75) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">067</li> + </ul> + <div class="bodystyle"> + <h4 id="d024" class="p-odd unit2-c">浜屻�佹満韬�</h4> + <p class="p-odd"> + 鏈鸿韩鏄鏈虹殑閲嶈缁勬垚閮ㄥ垎锛屽畠鐨勪富瑕佸姛鐢ㄦ槸锛氬浐瀹氭満缈笺�佸熬缈笺�佽捣钀芥灦绛夐儴浠讹紝浣夸箣杩炴垚涓�涓暣浣擄紱鍚屾椂锛屽畠杩樿鐢ㄦ潵瑁呰浇浜哄憳銆佽揣鐗┿�佺噧娌瑰強鍚勭璁惧銆� + </p> + <p class="p-odd"> + 椋炶涓紝鏈鸿韩鐨勯樆鍔涘湪鏁翠釜椋炴満闃诲姏涓崰鎹簡杈冨ぇ閮ㄥ垎锛屽洜姝わ紝鏈鸿韩瑕佸叿鏈夎壇濂界殑娴佺嚎鍨嬨�佸厜婊戠殑琛ㄩ潰銆佸悎鐞嗙殑鎴潰褰㈢姸浠ュ強灏藉彲鑳藉皬鐨勬í鎴潰绉�傝鍑忓皬妯埅闈㈢Н锛屾満韬渶濂介噰鐢ㄥ渾褰紝涓轰簡瀹㈣揣鑸卞竷缃柟渚匡紝姘戠敤鑸嚎椋炴満鐨勬満韬埅闈㈠ぇ澶氶噰鐢ㄦき鍦嗗舰銆備负渚夸簬鏍规嵁鑸┖鍏徃闇�瑕佸鍑忔満韬暱搴﹁繘琛岀郴鍒楀寲鏀瑰瀷锛岃埅绾块鏈虹殑鏈鸿韩寰�寰�璁捐鎴愬墠鍚庝竴鏍风矖鐨勬き鍦嗗舰銆� + </p> + <p class="p-odd"> + 鏈鸿韩鍦ㄦ満澶撮儴浣嶅悜涓嬫敹缂╋紝瀹夌疆椹鹃┒鑸卞拰闆疯揪銆佷华琛ㄧ瓑璁惧锛屽悜涓嬪�炬枩鐨勬満澶翠繚璇佷簡椋炶鍛樻湁寮�闃旂殑瑙嗛噹銆傛満韬熬閮ㄥ悜涓婃敹缂╁彉缁嗭紝鍙互鍑忓皯椋炴満鐨勫簳閮ㄩ樆鍔涳紝鍚屾椂鍦ㄨ捣椋炪�佺潃闄嗘椂鏈変竴瀹氱殑闃叉摝灏句綔鐢ㄣ�� + </p> + <p class="p-odd"> + 鐜颁唬鑸嚎椋炴満鏈鸿韩鏋勯�犲ぇ澶氱敱绾靛悜鐨勯噾灞炴姊併�佹鏉″拰妯悜鐨勯殧妗嗙粍鎴愰鏋讹紝澶栭潰瑕嗙洊閲戝睘钂欑毊骞跺拰楠ㄦ灦閾嗘帴鎴愪竴涓暣浣撱�傚鏈哄唴閮ㄧ敱鍦版澘灏嗘満韬垎涓轰笂銆佷笅涓ら儴鍒嗭紝鍙屽眰瀹㈡満鍒欏垎鎴愪笂銆佷腑銆佷笅涓夐儴鍒嗭紝涓婏紙涓級閮ㄥ畨瑁呭骇妞咃紝甯冪疆涓哄鑸憋紝涓嬮儴涓鸿揣鑸便�佽澶囪埍鍜屾満韬补绠辩瓑锛堝浘2-56锛夈�傝揣鏈哄竷缃緝涓虹畝鍗曪紝鏃犻』灏嗘満鑸卞垎鎴愪笂銆佷笅涓ら儴鍒嗭紝涓昏鑰冭檻瑁呭嵏璐х墿鐨勬柟渚匡紝澶ч儴鍒嗗湴鏉夸笂璁炬湁婊戣建銆佺粸鐩樻垨璧烽噸瑁呯疆銆� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0075-01.jpg" /> + <p class="img">鍥�2-56 瀹㈡満鏈鸿韩鍐呴儴鍒嗗眰</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0075-02.jpg" /> + <p class="img">鍥�2-56 瀹㈡満鏈鸿韩鍐呴儴鍒嗗眰</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <h4 id="d025" class="p-odd unit2-c">涓夈�佸熬缈�</h4> + <p class="p-odd"> + 灏剧考瀹夎鍦ㄩ鏈哄熬閮ㄣ�傚熬缈间富瑕佸垎涓烘按骞冲熬缈煎拰鍨傜洿灏剧考涓ょ锛屼篃鏈夊皯鏁伴鏈洪噰鐢╒褰㈠熬缈笺�傚熬缈肩殑浣滅敤鏄负椋炴満鎻愪緵淇话鍜屾柟鍚戠殑绋冲畾鎬т笌鎿嶇旱鎬с�� + </p> + </div> + </div> + </div> + <!-- 68椤� --> + <div class="page-box" page="76"> + <div v-if="showPageList.indexOf(76) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">068</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 灏剧考缁撴瀯涓庢満缈肩被浼硷紝澶氭暟灏剧考涓哄绉扮考鍨嬶紝鍗冲熬缈间笂涓嬭〃闈㈠集鏇茬▼搴︾浉鍚屻�傚熬缈艰窛閲嶅績杈冭繙锛岀粨鏋勪笂瑕佹眰瓒婅交瓒婂ソ锛屾晠澶ч噺閲囩敤澶嶅悎鏉愭枡銆� + </p> + <p class="p-even"> + 姘村钩灏剧考鐢辨按骞冲畨瀹氶潰鍜屽悗鏂圭殑鍗囬檷鑸电粍鎴愩�傚崌闄嶈埖鐢遍琛屽憳閫氳繃鍓嶆帹鍜屽悗鎷夐┚椹舵潌鎿嶇旱锛屽彲涓娿�佷笅鍋忚浆銆傞琛屽憳鎺ㄦ潌鏃跺崌闄嶈埖涓嬪亸锛岄琛屼腑椋炴満浼氫綆澶达紱鎷夋潌鏃跺崌闄嶈埖涓婂亸锛岄鏈轰細鎶ご銆傝澶氶珮閫熷啗鐢ㄩ鏈轰负浜嗗寮洪鏈虹殑鎿嶇旱鎬э紝灏嗘按骞冲畨瀹氶潰涓庡崌闄嶈埖杩炰负涓�浣擄紝涓�鍚屽亸杞仛鍗囬檷鑸电敤锛岀О涓哄叏鍔ㄥ钩灏撅紙鍥�2-40锛夈�傚钩灏剧殑浣滅敤涓昏鏄粰椋炴満鎻愪緵淇话绋冲畾鎬т笌鎿嶇旱鎬э紝杩樻媴璐熺潃淇濇寔椋炴満淇话鍔涚煩骞宠 鐨勪娇鍛姐�� + </p> + <p class="p-even"> + 鍨傜洿灏剧考鐨勭粨鏋勫拰姘村钩灏剧考鐩镐技锛屽寘鎷浐瀹氫笉鍔ㄧ殑鍨傜洿瀹夊畾闈㈠拰鍙乏鍙冲亸杞殑鏂瑰悜鑸点�傚瀭鐩村畨瀹氶潰涓昏涓洪鏈烘彁渚涙柟鍚戠ǔ瀹氭�э紝鏂瑰悜鑸电敱椋炶鍛橀�氳繃鑴氳宫鏉ユ搷绾点�� + </p> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 鏈夌殑椋炴満鍙栨秷浜嗘按骞冲熬缈硷紝鍦ㄦ満缈煎墠鏂瑰姞瑁呬簡绫讳技浜庡钩灏剧殑灏忕考闈紝绉颁负楦考鎴栧墠缈硷紝杩欐牱鐨勫竷灞�鍙腑寮忓竷灞�銆� + </p> + <p class="block"> + 涓庡父瑙勫竷灞�鐩告瘮锛岄腑寮忓竷灞�鐨勯鏈哄彲寰楀埌姝g殑閰嶅钩鍗囧姏锛堝浘2-57锛夈�傚浘2-58鎵�绀轰负楦紡甯冨眬鎴樻枟鏈恒�� + </p> + </span> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0080-1.jpg" /> + </p> + <p class="img"> + 鍥�2-57 甯歌甯冨眬锛堝乏锛変笌楦紡甯冨眬锛堝彸锛夌殑閰嶅钩鍗囧姏 + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0080-2.jpg" /> + </p> + <p class="img">鍥�2-58 楦紡甯冨眬鎴樻枟鏈�</p> + </span> + </div> + </div> + <h4 id="d026" class="p-even unit2-c">鍥涖�佽捣钀芥灦</h4> + <p class="p-even"> + 椋炴満鐨勮捣钀芥灦鐢ㄤ簬鍦ㄥ湴闈笂鏀拺椋炴満銆佸湪鍦伴潰涓婄Щ鍔ㄩ鏈猴紙婊戣锛夈�佷繚璇侀鏈鸿捣椋炲拰鐫�闄嗘粦璺戠殑杩愬姩鍔熻兘銆傝捣钀芥灦闄や簡鏀灦鍜屾満杞锛岃繕鍖呮嫭鏀舵斁绯荤粺銆佺紦鍐茶缃拰鍒跺姩瑁呯疆鍑犻儴鍒嗐�� + </p> + <p class="p-even"> + 鐢变簬杩欎簺鍔熻兘閮芥槸鍦ㄥ湴闈娇鐢紝鍦ㄧ┖涓琛屾椂璧疯惤鏋朵笉浠呮病鏈変綔鐢紝杩樿浜х敓棰濆鐨勯樆鍔涳紝鍥犳璁稿鑸嚎椋炴満銆侀珮閫熼鏈哄皢璧疯惤鏋惰璁℃垚鍙敹 + </p> + </div> + </div> + </div> + <!-- 69椤� --> + <div class="page-box" page="77"> + <div v-if="showPageList.indexOf(77) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">069</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鏀惧舰寮忋�傞鏈鸿捣椋炲悗灏嗗叾鏀惰捣锛屽噺灏忛樆鍔涳紝鐫�闄嗗墠鍐嶉噸鏂版斁涓嬫潵銆備竴浜涗綆閫熷皬鍨嬮鏈猴紝鑰冭檻鍒伴琛岄�熷害涓嶉珮銆佽捣钀芥灦浜х敓鐨勯樆鍔涜緝灏忥紝璁捐鎴愬浐瀹氬紡璧疯惤鏋讹紝杩樿兘鍑忚交缁撴瀯璐ㄩ噺銆佸鍔犺捣钀芥灦寮哄害銆� + </p> + <p class="p-odd"> + 璧疯惤鏋舵敹鏀剧郴缁熷寘鎷捣钀芥灦鑸卞拰鏀舵斁瑁呯疆銆傝捣钀芥灦鑸辩敤浜庡瓨鏀炬敹璧风殑璧疯惤鏋讹紝瑕佹湁鑸遍棬銆傝埍闂ㄩ櫎浜嗗湪鏀舵斁杩囩▼涓墦寮�锛屽钩鏃堕兘淇濇寔鍏抽棴鐘舵�侊紝鏈夊姪浜庝繚鎸侀鏈哄琛ㄥ厜婊戠殑娴佺嚎鍨嬨�傚浜庨潪鍥哄畾寮忚捣钀芥灦锛屼负淇濊瘉鏀舵垨鏀剧姸鎬佹椂璧疯惤鏋惰兘澶熺‘瀹炲浐瀹氬湪棰勫畾浣嶇疆锛屽湪璧疯惤鏋朵笂璁剧疆浜嗘敹涓婇攣鍜屾斁涓嬮攣銆� + </p> + <p class="p-odd"> + 鏀惰捣钀芥灦鏃讹紝椋炶鍛樺皢璧疯惤鏋舵敹鏀炬墜鏌勭敱鈥滄斁涓嬧�濅綅缃壋鍒扳�滄敹涓娾�濅綅缃紝鏀舵斁绯荤粺鍏堝紑鍚捣钀芥灦鑸遍棬锛岀劧鍚庡皢鏀句笅閿佽В閿侊紝鎺ョ潃鏀舵斁浣滃姩绛掑紑濮嬪伐浣滐紝灏嗚捣钀芥灦鏀惰捣锛屽苟閿佸畾鏀朵笂閿侊紝鏈�鍚庡叧闂捣钀芥灦鑸遍棬銆傛斁璧疯惤鏋跺垯鐩稿弽锛岄琛屽憳灏嗚捣钀芥灦鏀舵斁鎵嬫焺鐢扁�滄敹涓娾�濇壋鍒扳�滄斁涓嬧�濅綅缃紝鏀舵斁绯荤粺鍏堝紑鍚捣钀芥灦鑸遍棬锛岀劧鍚庡皢鏀朵笂閿佽В閿侊紝鏀舵斁浣滃姩绛掑皢璧疯惤鏋舵斁涓嬪苟閿佸畾鏀句笅閿侊紝鏈�鍚庡叧闂捣钀芥灦鑸遍棬銆備负闃叉鐫�闄嗘椂椋炶鍛樺繕鏀捐捣钀芥灦锛岃澶氶鏈哄皢璧疯惤鏋舵敹鏀剧郴缁熶笌瑗熺考鍜屾补闂ㄨ仈鍔紝鍦ㄨ捣钀芥灦鏈斁涓嬫椂锛岃缈间笉鑳芥斁涓嬪埌鐫�闄嗕綅缃�佹补闂ㄤ篃涓嶈兘鏀跺埌鎱㈣溅鐘舵�併�� + </p> + <p class="p-odd"> + 澶у鏁伴鏈洪厤缃湁涓変釜璧疯惤鏋讹紝绉颁负涓夌偣寮忚捣钀芥灦銆傚叾涓椋炴満閲嶅績杈冭繎锛屽苟鍒楃殑銆佽緝绮楀ぇ鐨勪袱涓捣钀芥灦鎵垮彈浜嗛鏈虹殑澶ч儴鍒嗛噸閲忥紝鍙富璧疯惤鏋躲�傞鏈洪噸蹇冧綅浜庝富璧疯惤鏋朵箣鍚庯紝椤诲湪椋炴満灏鹃儴閰嶇疆鍚庤捣钀芥灦鎵嶈兘鏀拺椋炴満锛岀О涓哄悗涓夌偣寮忚捣钀芥灦[鍥�2-59锛坅锛塢锛涢鏈洪噸蹇冧綅浜庝富璧疯惤鏋朵箣鍓嶏紝椤诲湪鏈哄ご浣嶇疆閰嶇疆鍓嶈捣钀芥灦鎵嶈兘鏀拺椋炴満锛岃繖绉嶆柟寮忕О涓哄墠涓夌偣寮忚捣钀芥灦[鍥�2-59锛坆锛塢銆傛棭鏈熼鏈鸿捣钀芥灦閰嶇疆褰㈠紡浠ュ悗涓夌偣寮忎负涓伙紝鐜颁唬椋炴満澶у閲囩敤鍓嶄笁鐐瑰紡锛屽彧鏈変釜鍒交鍨嬮鏈洪噰鐢ㄥ悗涓夌偣寮忋�� + </p> + <p class="p-odd"> + 閮ㄥ垎澶у瀷椋炴満鐢变簬璐ㄩ噺杩囧ぇ锛屼负鍙潬鍦版敮鎾戦鏈猴紝鍑忓皬椋炴満瀵瑰湴鍘嬪己锛屾満韬笅杩樺彟澶栬缃簡鏈鸿韩璧疯惤鏋讹紙鍥�2-60锛夈�備釜鍒鏈鸿繕閲囩敤鑷杞﹀紡璧疯惤鏋禰鍥�2-59锛坈锛塢锛屼竴鍓嶄竴鍚庝袱涓捣钀芥灦鎵垮彈椋炴満閲嶉噺銆備负闃叉椋炴満鍊惧�掞紝鍦ㄦ満缈间笅杩樺竷缃湁杈呭姪灏忚疆锛岃繖绉嶅竷灞�涓�鑸敤浜庢湁鐗规畩甯冨眬瑕佹眰銆佷笉渚夸簬鎸変紶缁熸柟寮忚璁¤捣钀芥灦鐨勯鏈猴紝濡傝嫳鍥藉瀭鐩磋捣闄嶇殑鈥滈篂鈥濆紡鎴樻枟鏈猴紙鍥�2-61锛夈�� + </p> + </div> + </div> + </div> + <!-- 70椤� --> + <div class="page-box" page="78"> + <div v-if="showPageList.indexOf(78) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">070</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0078-01.jpg" /> + <p class="img">鍥�2-59 璧疯惤鏋剁殑閰嶇疆褰㈠紡</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0078-02.jpg" /> + <p class="img">鍥�2-59 璧疯惤鏋剁殑閰嶇疆褰㈠紡</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0078-03.jpg" /> + <p class="img">鍥�2-59 璧疯惤鏋剁殑閰嶇疆褰㈠紡</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <div class="fl al-fe p-even"> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0082-2.jpg" /> + </p> + <p class="img">鍥�2-60 绌哄A380鐨勬満韬捣钀芥灦</p> + </span> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0082-3.jpg" /> + </p> + <p class="img">鍥�2-61 鈥滈篂鈥濆紡鎴樻枟鏈�</p> + </span> + </div> + <p class="p-even"> + 澶т腑鍨嬭埅绾块鏈虹敱浜庤川閲忓ぇ锛屾櫘閬嶉噰鐢ㄦ敮鏌卞紡澶氳疆璧疯惤鏋讹紝鑰屼竴浜涘皬鍨嬮珮閫熼鏈哄垯閲囩敤鎽囪噦寮忚捣钀芥灦锛堝浘2-62锛夈�� + </p> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0082-4.jpg" /> + </p> + <p class="img">鍥�2-62 鏀煴寮忎笌鎽囪噦寮忚捣钀芥灦</p> + </div> + </div> + </div> + <!-- 71椤� --> + <div class="page-box" page="79"> + <div v-if="showPageList.indexOf(79) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">071</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 鏀煴寮忓杞捣钀芥灦涓�鑸敱澶氫釜鏈鸿疆缁勬垚涓�涓疆寮忓皬杞︼紝杞︽灦鍜岀紦鍐叉敮鏌辫繛鍦ㄤ竴璧凤紝鏀煴鏃佹湁鏂滄敮鏌卞拰鎵姏鎾戞潌锛屾枩鏀煴鎵垮彈姘村钩鏂瑰悜鐨勫姏锛屾壄鍔涙拺鏉嗘姷鎶楄疆寮忓皬杞︿骇鐢熺殑鎵煩锛岀紦鍐叉敮鏌辨壙鍙楀瀭鐩存柟鍚戜笂鐨勫姏銆傜紦鍐叉敮鏌变笂鏂圭殑鏀舵斁浣滃姩绛掓壙鎷呯潃灏嗚捣钀芥灦鏀朵笂鎴栨斁涓嬬殑浠诲姟銆傛敮鏌变笌杞灦閾版帴锛屼繚璇佹墍鏈夋満杞彲浠ヤ笂涓嬪乏鍙崇浉瀵硅繍鍔紝鍚庨儴杞灦涔熷彲缁曟敮鏌辫浆鍔紝浣胯疆寮忓皬杞︿笌鍦伴潰鏈夋渶澶х殑鎺ヨЕ闈㈢Н鍜岃緝灏忕殑杞集鍗婂緞銆傝疆瀛愮殑鏁伴噺鍙栧喅浜庨鏈鸿川閲忓拰璁捐瀵硅窇閬撶殑鍘嬪己瑕佹眰锛屼竴鑸潵璇磋川閲忚秺澶х殑椋炴満杞瓙瓒婂锛屽A380椋炴満涓昏捣钀芥灦鍜屾満韬捣钀芥灦涓�鍏辨湁20涓満杞�� + </p> + <p class="p-odd"> + 鎽囪噦寮忚捣钀芥灦鏈鸿疆涓嶇洿鎺ュ拰鏀煴鐩歌繛锛岃�屾槸閫氳繃涓�涓憞鑷備笌涓绘敮鏌辩浉杩炪�傝繖绉嶆瀯閫犳柟寮忓噺灏戜簡缂撳啿鏀煴鎵�鍙楃殑寮煩锛屼娇缂撳啿鏀煴鏄撲繚鎸佸瘑灏侊紝缂撳啿鏁堟灉濂斤紝浣嗗畠鏋勯�犺緝涓哄鏉傦紝鎽囪噦鍙楀姏澶э紝涓嶈兘鐢ㄤ簬璐ㄩ噺澶ぇ鐨勯鏈猴紝鍙兘鐢ㄤ簬楂橀�熷皬鍨嬮鏈猴紝澶氫负鎴樻枟鏈洪噰鐢ㄣ�� + </p> + <p class="p-odd"> + 璧疯惤鏋剁殑缂撳啿鍔熻兘鐢辫疆鑳庡拰缂撳啿鏀煴瀹炵幇銆傝疆鑳庢寜鎵�鍏呮皵鍘嬩笉鍚岋紝鍒嗕负浣庡帇杞儙銆佷腑鍘嬭疆鑳庡拰楂樺帇杞儙銆備綆鍘嬭疆鑳庣紦鍐叉晥鏋滄渶濂斤紝瀵硅窇閬撹姹備篃浣庯紝浣嗕綋绉ぇ锛屼竴鑸彧閫傜敤浜庢敮绾块鏈哄拰鍦ㄤ綆鏍囧噯鏈哄満椋炶鐨勯鏈恒�傜幇浠eぇ鍨嬭埅绾块鏈烘櫘閬嶄娇鐢ㄩ珮鍘嬭疆鑳庛�� + </p> + <p class="p-odd"> + 灏忓瀷椋炴満鍙娇鐢ㄥ脊绨х紦鍐叉敮鏌辨垨寮圭哀鐗囩紦鍐诧紝澶у瀷椋炴満涓�鑸敤娌规皵缂撳啿鏀煴锛堝浘2-63锛夈�傛补姘旂紦鍐叉敮鏌辩敱澶栫瓛銆佸甫灏忓瓟鐨勯殧鏉裤�佹椿濉炪�佸瘑灏佽缃拰娲诲鏉嗙粍鎴愩�傛椿濉炴潌杩炲湪鏈鸿疆鎴栬疆寮忓皬杞︿笂锛屽绛掕繛鍦ㄩ鏈鸿捣钀芥灦鍥� + </p> + <div class="img-rights w200 openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0083-1.jpg" /> + <p class="img" style="text-align: left">鍥�2-63 娌规皵缂撳啿鏀煴</p> + </div> + <span> + <p class="td-0"> + 瀹氶鏋朵笂锛屽绛掑唴鑵斾笅閮ㄨ娑插帇娌广�佷笂閮ㄥ厖鍘嬬缉鐨勫共鐕ユ爱姘斻�傜潃闄嗘椂锛屾満杞帴鍦板悗閫氳繃娲诲鏉嗘帹鍔ㄦ椿濉炲悜涓婅繍鍔紝浣挎恫鍘嬫补楂橀�熸祦杩囬殧鏉夸笂鐨勫皬瀛斿悜涓婂帇缂╀笂鏂圭殑姘斾綋锛岀紦鍐叉敮鏌辫鍘嬬缉銆傚綋姘斾綋鍘嬪姏澧炲姞鍒拌冻澶熷ぇ鏃讹紝姘斾綋浼氳啫鑳�鎺ㄥ姩娑插帇娌归珮閫熺┛杩囬殧鏉夸笂鐨勫皬瀛斿悜涓嬫祦鍔紝鎺ㄥ姩娲诲鏉嗗悜涓嬭繍鍔紝缂撳啿鏀煴浼搁暱銆傛皵浣撳弽澶嶆敹缂╄啫鑳�銆佹恫鍘嬫补寰�澶嶉珮閫熺┛杩囧皬瀛旓紝鍜屽皬瀛斿彂鐢熷墽鐑堟懇鎿︼紝浜х敓澶ч噺鐨勭儹閲忥紝璧疯惤鏋朵笌鍦伴潰鐨勫啿鍑昏兘閲忓氨杞彉鎴愮儹鑳芥暎鍙戞帀浜嗭紝杈惧埌浜嗙紦鍐叉晥鏋溿�� + </p> + </span> + <p class="p-odd"> + 杞紡璧疯惤鏋堕兘瑁呮湁鍒硅溅浣滀负椋炴満鍦伴潰鍒跺姩鐨勮缃�傚ぇ澶氭暟姘戠敤椋炴満鍒硅溅鐢遍琛屽憳閫氳繃鑴氳宫鎺у埗锛屽乏鍙宠剼鍗曠嫭韫剼韫椂锛屾搷绾垫柟鍚戣埖鍋忚浆锛屼袱鑴氬悓鏃惰宫涓嬭剼韫紝鍒欐槸杩涜鍒硅溅銆傞儴鍒嗗ぇ鍨嬮鏈虹殑鍒硅溅韪忔澘鍦ㄨ剼韫笂鏂癸紝闅� + </p> + </div> + </div> + </div> + <!-- 72椤� --> + <div class="page-box" page="80"> + <div v-if="showPageList.indexOf(80) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">072</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鑴氳宫涓�璧疯繍鍔紝椋炶鍛樿宫鑴氳宫鏃舵帶鍒舵柟鍚戣埖锛屽闇�鍒硅溅锛屽垯鐢ㄥ墠鑴氭帉鍘嬩笅涓婃柟鐨勫埞杞﹁笍鏉匡紝鍘嬩笅宸﹀埞杞﹁笍鏉挎椂鍒瑰乏杞紝鍘嬩笅鍙冲埞杞﹁笍鏉挎椂鍒瑰彸杞�� + </p> + <p class="p-even"> + 澶у姘戠敤椋炴満鐨勫墠璧疯惤鏋朵笉瑁呭埞杞︼紝浣嗚鏈夎浆鍚戠郴缁燂紝鐢辫剼韫垨鎵嬭疆锛堟墜鏌勶級鎿嶇旱鍓嶈疆杞悜锛屼娇椋炴満鍦ㄥ湴闈㈣浆寮�傝剼韫搷绾靛墠杞敤浜庤捣椋炴垨鐫�闄嗘椂楂橀�熸粦璺戠殑杩囩▼锛岃宫鑴氳宫鏃跺墠杞笌鏂瑰悜鑸靛悓鏃惰鎿嶇旱锛岃剼韫墍鑳芥帶鍒剁殑鍓嶈疆鍋忚浆瑙掑害杈冨皬锛岄鏈鸿浆寮崐寰勫ぇ銆傚墠杞浆鍚戞墜杞富瑕佺敤浜庨鏈轰綆閫熸粦琛屼笖杞集鍗婂緞杈冨皬鐨勬儏鍐碉紝濡傞鏈虹潃闄嗗悗鍦ㄨ窇閬撲笂鎺夊ご绛夈�� + </p> + <p class="p-even"> + 涓洪槻姝㈤鏈鸿捣椋炲悗鍓嶈疆涓嶅湪涓珛浣嶇疆缁欐敹璧疯惤鏋跺甫鏉ヤ笉渚匡紝涔熶负浜嗛伩鍏嶇潃闄嗘帴鍦扮灛闂村墠杞笉鍦ㄤ腑绔嬩綅缃鑷存粦璺戞柟鍚戝亸鏂滐紝鍓嶈捣钀芥灦閮借鏈夊畾涓満鏋勶紝淇濊瘉鍓嶈疆鍦ㄧ鍦扮姸鎬佷笅澶勪簬涓珛浣嶇疆銆備紶缁熺殑鍐呯疆寮忓墠杞畾涓満鏋勭敱涓�缁勫唴閮ㄧ殑瀹氫腑鍑歌疆缁勬垚锛堝浘2-64锛夛紝鍏朵腑涓�涓嚫杞畨瑁呭湪缂撳啿鏀煴澶栫瓛涓婏紝鍙︿竴涓畨瑁呭湪缂撳啿鏀煴娲诲鏉嗕笂銆傚墠杞鍦版椂锛屽湪閲嶅姏鍜屾敮鏌卞唴姘斿帇鐨勪綔鐢ㄤ笅锛岀紦鍐叉敮鏌辫嚜鐒朵几闀匡紝娲诲鏉嗕笂鐨勫畾涓嚫杞笌澶栫瓛涓婄殑瀹氫腑鍑歌疆鎺ヨЕ骞舵部鍏惰〃闈㈡粦鍔紝浣垮墠杞嚜鍔ㄥ畾浣嶅湪涓珛浣嶇疆銆傚墠杞帴鍦板悗锛岀紦鍐叉敮鏌辫鍘嬬缉锛屾椿濉炴潌涓婄殑瀹氫腑鍑歌疆涓庡绛掍笂鐨勫畾涓嚫杞劚绂伙紝娲诲鏉嗗拰澶栫瓛涔嬮棿鍙互鐩稿杞姩锛屽彲鎿嶇旱鍓嶈疆杩涜杞悜銆� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0080-01.jpg" /> + <p class="img">鍥�2-64 鍓嶈疆瀹氫腑鏈烘瀯</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0080-02.jpg" /> + <p class="img">鍥�2-64 鍓嶈疆瀹氫腑鏈烘瀯</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 澶у鏁伴鏈洪噰鐢ㄨ疆寮忚捣钀芥灦锛屼竴灏忛儴鍒嗛鏈洪噰鐢ㄥ叾浠栧舰寮忕殑璧疯惤鏋躲�� + </p> + <p class="block"> + 闆﹪寮忚捣钀芥灦锛堝浘2-65锛夊彲鍦ㄥ啺闆笂璧烽檷锛屼竴鑸敤浜庤交鍨嬬洿鍗囨満銆傝鏈夐洩姗囧紡璧疯惤鏋剁殑鐩村崌鏈哄嚑涔庡彲浠ュ湪浠讳綍闄嗗湴鍦烘墍璧烽檷銆� + </p> + <p class="block"> + 娴瓛寮忚捣钀芥灦锛堝浘2-66锛夌敤浜庢按涓婇鏈恒�傞鏈洪潬娴瓛鍜屽瘑闂満韬骇鐢熺殑娴姏娴簬姘撮潰涓婏紝璁稿姘翠笂椋炴満鍦ㄦ満韬垨娴瓛涓嬫柟璁捐鏈夋満杞紝涓昏鐢ㄤ簬浠庢按闈㈡粦涓婂湴闈㈡垨浠庡湴闈㈡粦涓嬫按闈€�� + </p> + </span> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0084-2.jpg" /> + </p> + <p class="img">鍥�2-65 闆﹪寮忚捣钀芥灦</p> + </span> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0084-3.jpg" /> + </p> + <p class="img">鍥�2-66 娴瓛寮忚捣钀芥灦</p> + </span> + </div> + </div> + </div> + </div> + </div> + <!-- 73椤� --> + <div class="page-box" page="81"> + <div v-if="showPageList.indexOf(81) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">073</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 椋炴満鍦ㄥ湴闈㈡椂璧疯惤鏋跺浜庢斁涓嬬姸鎬侊紝璧疯惤鏋惰埍绌虹疆锛屾椂甯告湁鏃犲叧浜哄憳鍑轰簬绉嶇鐩殑瓒佸湴闈㈢洃鎶や汉鍛樼枏蹇界埇杩涜捣钀芥灦鑸辩殑鎶ラ亾銆�2021骞�11鏈�27鏃ワ紝涓�鍚嶅伔娓$敺瀛愬湪鍦伴潰鐖繘缇庡浗鑸┖鍏徃涓�鏋朵粠鍗卞湴椹媺椋炲線缇庡浗杩堥樋瀵嗙殑鑸彮鐨勮捣钀芥灦鑸憋紝闅忔満涓�璺粠鍗卞湴椹媺鎶佃揪缇庡浗杩堥樋瀵嗐�傞鏈洪檷钀藉悗锛岀編鍥芥捣鍏冲拰杈瑰淇濇姢灞�宸ヤ綔浜哄憳鍦ㄨ捣钀芥灦鑸变腑鍙戠幇浜嗚鐢峰瓙銆備粬鍦�1涓囩背楂樼┖鐨勯潪澧炲帇鐜涓嬮琛屼簡2.5h绔熸鍙戞棤鎹熷湴闄嶈惤鍦ㄧ編鍥斤紝鍫О濂囪抗銆� + </p> + <p class="block"> + 韬插湪椋炴満璧疯惤鏋惰埍鈥滄惌鈥濋鏈烘槸涓�绉嶉潪甯稿嵄闄╃殑琛屼负锛岄殢鏃朵細涓у懡鎴栬嚧娈嬨�傞鍏堬紝椋炴満璧烽鍚庤鏀惰捣璧疯惤鏋讹紝姝ゆ椂钘忓湪璧疯惤鏋惰埍閲岀殑浜哄緢瀹规槗鎺変笅鍘伙紝鍗充娇鏈帀涓嬪幓涔熷彲鑳藉洜涓鸿嚜宸辨墍澶勭殑浣嶇疆涓嶄匠鑰岃鏀惰捣鏉ョ殑璧疯惤鏋跺帇鍒帮紝鍙兘浼氬洜姝ゅ彈浼ゆ垨涓у懡銆傚叾娆★紝鍦ㄧ┖涓琛屾椂锛岀敱浜庤捣钀芥灦鑸变笉鏄鍘嬭埍锛岄珮绌轰綆娓┿�佷綆鍘嬨�佺己姘х殑鐜涔熶細閫犳垚浜哄憳浼や骸銆傚啀娆★紝椋炴満鐫�闄嗗墠鏀捐捣钀芥灦锛屽緢鍙兘璁╄棌鍦ㄨ捣钀芥灦鑸遍噷鐨勪汉鎺墜涓嶅強锛屼粠绌轰腑鎺夎惤銆傛渶鍚庯紝鍦ㄩ鏈鸿繘琛岄檷钀芥椂锛岃捣钀芥灦鎺ヨЕ鍦伴潰鐨勭灛闂达紝椋炴満浼氫骇鐢熷己鐑堢殑闇囧姩锛岃繖绉嶉渿鍔ㄨ冻浠ュ皢钘忓湪閲岄潰鐨勪汉闇囧嚭鏉ユ帀钀藉湴闈€�備簨瀹炶瘉鏄庯紝鏃犺浠�涔堝師鍥狅紝钘忓湪椋炴満璧疯惤鏋惰埍閲屾棤寮備簬鑷姝昏矾銆� + </p> + </span> + </div> + <p class="p-odd"> + 杩欎簺鎶ラ亾鍚ず鎴戜滑锛屽湪鍋氫换浣曚簨鎯呯殑鏃跺�欙紝閮借淇濇寔绉瀬涓诲姩銆佽鐪熻礋璐g殑鎬佸害銆傝鏈夊己鐑堢殑宸ヤ綔璐d换鎰燂紝绔宸ヤ綔鎬佸害锛屾爲绔嬬埍宀楁暚涓氱簿绁烇紝鏍戠珛鑹ソ鐨勮亴涓氶亾寰凤紝鍩瑰吇鑹ソ鐨勮亴涓氱礌鍏伙紝瑕佽鐪熷寰呰嚜宸辩殑宸ヤ綔锛屽仛鍒板叏鍔涗互璧淬�� + </p> + </div> + </div> + </div> + <!-- 74椤� --> + <div class="page-box" page="82"> + <div v-if="showPageList.indexOf(82) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">074</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even unit2-c"> + 瀛︿範浠诲姟鍥�<br />璁よ瘑椋炴満鐨勫姩鍔涜缃� + </h3> + <div class="task-u2-c ma-l"></div> + <div class="img-float w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <span> + <p class="block"> + 涓栫晫涓昏姘戠敤鑸┖鍙戝姩鏈哄埗閫犲晢鏈夛細閫氱敤鐢垫皵鍏徃锛堢畝绉癎E鍏徃锛夈�佺綏灏旀柉路缃椾紛鏂叕鍙革紙缃楃綏鍏徃锛夈�佹櫘鎷夌壒路鎯犵壒灏煎叕鍙搞�丆FM鍥介檯鍏徃锛堝浗闄呭彂鍔ㄦ満鍏徃锛岄�氱敤鐢垫皵鍏徃鍜岃禌宄伴泦鍥㈠悎璧勭殑浼佷笟锛夈�佸浗闄呰埅绌哄彂鍔ㄦ満鍏徃銆佸彂鍔ㄦ満鑱旂洘鍏徃锛屾垜鍥紺919浣跨敤鐨勫彂鍔ㄦ満灏辨槸CFM鐢熶骇鐨凩EAP-X1C銆� + </p> + </span> + </div> + </div> + <span> + <p class="p-even"> + 椋炴満鐨勫姩鍔涜缃槸鎸囦负椋炴満鍓嶈繘鎻愪緵鍔ㄥ姏鐨勬暣涓郴缁熴�傚畠鍖呮嫭鍙戝姩鏈恒�佽灪鏃嬫〃銆佽緟鍔╁姩鍔涜缃強鍏朵粬闄勪欢銆傚叾涓渶涓昏鐨勯儴鍒嗘槸鑸┖鍙戝姩鏈猴紝浜轰滑寰�寰�鎶婇鏈虹殑鍙戝姩鏈烘瘮鍠讳负椋炴満鐨勨�滃績鑴忊�濄�備笌鑸┖鍣ㄧ殑鍙戝睍鍘嗙▼涓�鏍凤紝鑸┖鍙戝姩鏈轰篃缁忓巻浜嗙櫨浣欏勾鐨勫彂灞曞巻鍙层��1903骞达紝鑾辩壒鍏勫紵灏嗘椿濉炲紡鍙戝姩鏈哄拰铻烘棆妗ㄨ浜庝粬浠埗閫犵殑涓�鏋跺弻缈奸鏈轰笂锛屽畬鎴愪簡浜虹被鍘嗗彶涓婇娆′緷闈犺嚜韬姩鍔涜捣椋炵殑椋炶锛屽紑鍒涗簡椋炶鐨勬柊绾厓锛屼篃鎺�寮�浜嗚埅绌哄姩鍔涜缃彂灞曠殑绡囩珷銆� + </p> + <p class="p-even"> + 鑸┖鍙戝姩鏈烘槸涓�绉嶉珮搴﹀鏉傚拰绮惧瘑鐨勭儹鍔涙満姊帮紝浣滀负椋炴満鐨勫績鑴忥紝涓嶄粎鏄鏈洪琛岀殑鍔ㄥ姏锛屼篃鏄績杩涜埅绌轰簨涓氬彂灞曠殑閲嶈鎺ㄥ姩鍔涖�備汉绫昏埅绌哄彶涓婄殑姣忎竴娆¢噸瑕佸彉闈╅兘涓庤埅绌哄彂鍔ㄦ満鐨勬妧鏈繘姝ュ瘑涓嶅彲鍒嗐�� + </p> + <p class="p-even"> + 鑸┖鍙戝姩鏈哄彲鍒嗕负娲诲寮忓彂鍔ㄦ満鍜屽柗姘斿紡鍙戝姩鏈轰袱澶х被锛屽畠浠兘鏄妸鐕冩枡鐕冪儳鍚庢斁鍑虹殑鐑兘杞崲涓烘満姊拌兘鐨勭儹鍔涘彂鍔ㄦ満銆傚湪绗簩娆′笘鐣屽ぇ鎴樹互鍓嶏紝椋炴満鐨勫姩鍔涜缃敱鑸┖娲诲寮忓彂鍔ㄦ満鍜岃灪鏃嬫〃缁勬垚銆傞殢鐫�椋炴満鐨勯琛岄�熷害鍜岄珮搴︾殑澧炲姞锛屾椿濉炲紡鍙戝姩鏈虹殑鍔熺巼鍜岃灪鏃嬫〃鐨勬晥鐜囦細鎬ュ墽涓嬮檷锛屾椿濉炲紡鍙戝姩鏈哄凡涓嶈兘婊¤冻闇�瑕併��20涓栫邯30骞翠唬鏈爺鍒跺嚭浜嗘丁杞柗姘斿彂鍔ㄦ満锛岄鏈虹殑鍔ㄥ姏瑁呯疆鏈変簡绗簩绉嶅舰寮忋��20涓栫邯50骞翠唬锛屽湪娑¤疆鍠锋皵鍙戝姩鏈虹殑鍩虹涓婂彂灞曞嚭浜嗘丁杞鎵囧彂鍔ㄦ満銆佹丁杞酱鍙戝姩鏈哄拰娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満锛�70骞翠唬鐮斿埗鍑轰簡妗ㄦ墖鍙戝姩鏈恒�傜幇浠i珮閫熼鏈洪兘浣跨敤鍠锋皵寮忓彂鍔ㄦ満銆傚湪灏忓瀷銆佷綆閫熼鏈轰笂锛岀敱浜庣粡娴庢�уソ銆佹槗缁存姢锛岃繕鍦ㄨ緝涓哄箍娉涘湴浣跨敤娲诲寮忓彂鍔ㄦ満銆傝埅绌哄彂鍔ㄦ満鐨勫垎绫诲鍥�2-67鎵�绀恒�� + </p> + </span> + <p class="p-even"> + 鍏朵腑鍠锋皵寮忓彂鍔ㄦ満鏍规嵁鐕冩枡鐕冪儳鏃舵墍闇�瑕佺殑姘у寲鍓傜殑鏉ユ簮涓嶅悓锛屽彲鍒嗕负涓ゅぇ绫伙細涓�绫绘槸绌烘皵鍠锋皵寮忓彂鍔ㄦ満锛屽畠鑷韩鎼哄甫鐕冩枡锛岀噧鐑ф椂闇�瑕佸埄鐢� + </p> + </div> + </div> + </div> + <!-- 75椤� --> + <div class="page-box" page="83"> + <div v-if="showPageList.indexOf(83) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">075</li> + </ul> + <div class="bodystyle"> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0087-1.jpg" /> + <p class="img">鍥�2-67 鑸┖鍙戝姩鏈虹殑鍒嗙被</p> + </div> + <span> + <p class="p-odd td-0"> + 绌烘皵涓殑姘ф皵浣滀负姘у寲鍓傦紝鍥犳浣跨敤鏃朵笉鑳借劚绂诲ぇ姘斿眰銆傚彟涓�绫绘槸鐏鍙戝姩鏈猴紝瀹冭嚜甯︾噧鏂欏拰姘у寲鍓傦紝鍦ㄥぇ姘斿眰鍐呭拰澶┖涓兘鑳戒娇鐢紝瀹冩槸鑸ぉ鍣ㄥ敮涓�鐨勫姩鍔涜缃�傜幇鍦ㄦ皯鐢ㄩ鏈轰娇鐢ㄧ殑鍠锋皵寮忓彂鍔ㄦ満閮芥槸甯﹀帇姘旀満鐨勩�傛湰浠诲姟鍙粙缁嶆皯鑸鏈轰笂浣跨敤鐨勬椿濉炲紡鍙戝姩鏈哄拰甯﹀帇姘旀満鐨勭┖姘斿柗姘斿紡鍙戝姩鏈恒�� + </p> + </span> + <h4 id="d027" class="p-odd unit2-c">涓�銆佹椿濉炲紡鍙戝姩鏈�</h4> + <p class="p-odd"> + 娲诲寮忓彂鍔ㄦ満鏄竴绉嶅洓鍐茬▼姹芥补鍐呯噧鏈猴紝鍙戝姩鏈哄伐浣滄椂杈撳嚭鐨勬壄鐭╅�氳繃鍑忛�熷櫒闄嶄綆閫熷害鍚庡甫鍔ㄨ灪鏃嬫〃锛岃灪鏃嬫〃鏃嬭浆浜х敓鎷夊姏鎴栨帹鍔涗负椋炴満鎻愪緵鍓嶈繘鐨勫姩鍔涖�� + </p> + <h5 id="e018" class="p-odd unit2-c">锛堜竴锛夌粍鎴愬拰鍒嗙被</h5> + <div class="img-rights w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0087-2.jpg" /> + <p class="img">鍥�2-68 娲诲寮忓彂鍔ㄦ満缁撴瀯</p> + </div> + <span> + <p class="p-odd"> + 娲诲寮忓彂鍔ㄦ満鐨勪富瑕佺粍鎴愰儴鍒嗗寘鎷苯缂搞�佹椿濉炪�佽繛鏉嗐�佹洸杞淬�佹満鍖c�佽繘鎺掓皵闂ㄦ満鏋勫拰宸ヤ綔绯荤粺銆傚叾缁撴瀯濡傚浘2-68鎵�绀恒�� + </p> + <p class="p-odd"> + 娲诲寮忓彂鍔ㄦ満鎸夋椿濉炵殑杩愬姩鏂瑰紡鍒嗕负寰�澶嶅紡娲诲鍙戝姩鏈哄拰杞瓙娲诲鍙戝姩鏈猴紝鎸夊柗娌圭殑褰㈠紡鍒嗕负姹藉寲鍣ㄥ紡鍜岀洿鍠峰紡鍙戝姩鏈猴紝鎸夊喎鍗存柟寮忓垎涓烘恫鍐峰紡鍜屾皵鍐峰紡鍙戝姩鏈恒�� + </p> + </span> + <h5 id="e019" class="p-odd unit2-c">锛堜簩锛夊熀鏈伐浣滃師鐞�</h5> + <p class="p-odd"> + 娲诲寮忓彂鍔ㄦ満宸ヤ綔鏃讹紝姹芥补鍜岀┖姘旀贩鍚堝悗鍦ㄦ苯缂镐腑鐕冪儳锛屼骇鐢熼珮娓╅珮鍘嬬噧姘旓紝鐕冩皵鑶ㄨ儉鎺ㄥ姩娲诲杩愬姩锛屾椿濉炲甫鍔ㄨ繛鎺ュ湪娲诲涓婄殑杩炴潌锛屾帹鍔ㄦ洸 + </p> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0087-3.jpg" /> + <p class="img">鍥�2-69 娲诲寮忓彂鍔ㄦ満宸ヤ綔鍘熺悊</p> + </div> + <span> + <p class="p-odd td-0"> + 杞磋浆鍔紙鍥�2-69锛夈�傛椿濉炲湪姘旂几鍐呰繍鍔ㄥ埌鏈�涓婃柟鐨勪綅缃彨涓婃鐐癸紝鏈�涓嬫柟鐨勪綅缃彨涓嬫鐐广�傛椿濉炰粠涓婃鐐瑰線涓嬫鐐规垨浠庝笅姝荤偣寰�涓婃鐐硅繍鍔ㄤ竴娆″彨涓�涓啿绋嬨�傛椿濉炲紡鍙戝姩鏈虹殑宸ヤ綔杩囩▼鐢辫繘姘斻�佸帇缂┿�佸伐浣滃拰鎺掓皵鍥涗釜鍐茬▼缁勬垚銆� + </p> + </span> + </div> + </div> + </div> + <!-- 76椤� --> + <div class="page-box" page="84"> + <div v-if="showPageList.indexOf(84) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">076</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + <b>杩涙皵鍐茬▼锛�</b>娲诲浠庝笂姝荤偣寮�濮嬪悜涓嬫鐐硅繍鍔紝姹界几鍐呭绉彉澶э紝姝ゆ椂杩涙皵娲婚棬鎵撳紑鑰屾帓姘旀椿闂ㄥ叧闂紝绌烘皵鍜屾苯娌规贩鍚堢殑鏂伴矞姘斾綋杩涘叆姹界几鍐呫�傚綋娲诲杩愬姩鍒颁笅姝荤偣鏃讹紝杩涙皵娲婚棬鍏抽棴锛岃繘姘斿啿绋嬬粨鏉熴�傛鏃讹紝姹界几鍐呭厖婊′簡鏂伴矞鐨勬贩鍚堟皵銆� + </p> + <p class="p-even"> + <b>鍘嬬缉鍐茬▼锛�</b>杩涙皵鍐茬▼缁撴潫鍚庯紝娲诲鍦ㄦ洸杞村拰杩炴潌鐨勫甫鍔ㄤ笅鍚戜笂姝荤偣杩愬姩锛屾鏃惰繘姘旀椿闂ㄥ拰鎺掓皵娲婚棬閮藉鍦ㄥ叧闂綅缃紝姘旂几鍐呯殑绌洪棿鍙樺皬锛屽娣峰悎姘旇繘琛屽帇缂╋紝浠ヤ究鐕冪儳鍚庤啫鑳�鍋氬姛銆傚綋娲诲杩愬姩鍒颁笂姝荤偣鏃讹紝鍘嬬缉鍐茬▼缁撴潫锛屾贩鍚堟皵鐨勫帇鍔涘拰娓╁害閮藉崌楂橈紝涓虹噧鐑у仛濂戒簡鍑嗗銆傜幇浠h埅绌烘椿濉炲紡鍙戝姩鏈哄帇缂╁啿绋嬬粨鏉熷悗锛屾贩鍚堟皵鐨勫帇鍔涘皢杈惧埌鍗佷綑涓ぇ姘斿帇锛屾俯搴�400鈩冨乏鍙炽�� + </p> + <p class="p-even"> + <b>宸ヤ綔鍐茬▼锛�</b>鍘嬬缉鍐茬▼缁撴潫鐨勯偅涓�鐬棿锛屾皵缂稿唴鐨勭伀鑺卞閫氱數浜х敓鐢电伀鑺憋紝娣峰悎姘旇鐐圭噧骞剁噧鐑э紝浜х敓鐨勭噧姘旀俯搴﹀拰鍘嬪姏鎬ュ墽鍗囬珮锛堟俯搴﹀彲杈�2500鈩冿紝鍘嬪姏鍙揪50锝�75涓爣鍑嗗ぇ姘斿帇锛夈�傜噧鐑у悗鐨勯珮娓╅珮鍘嬬噧姘旇啫鑳�锛屾帹鍔ㄦ椿濉炲悜涓嬭繍鍔紝瀵规椿濉炲仛鍔熴�傛椿濉為�氳繃杩炴潌甯﹀姩鏇茶酱鏃嬭浆锛岃繖鏃舵苯娌圭噧鐑х殑鐑兘杞彉涓烘洸杞磋浆鍔ㄧ殑鏈烘鑳姐�傚綋娲诲杩愬姩鍒颁笅姝荤偣鏃讹紝宸ヤ綔鍐茬▼缁撴潫銆� + </p> + <p class="p-even"> + <b>鎺掓皵鍐茬▼锛�</b>宸ヤ綔鍐茬▼缁撴潫鍚庯紝鏇茶酱鍦ㄦ儻鎬т綔鐢ㄤ笅閫氳繃杩炴潌甯﹀姩娲诲浠庝笅姝荤偣寮�濮嬪悜涓婃鐐硅繍鍔紝姝ゆ椂鎺掓皵娲婚棬鎵撳紑鑰岃繘姘旀椿闂ㄥ叧闂紝闅忕潃娲诲鐨勫悜涓婅繍鍔紝鐕冪儳鍚庣殑搴熸皵涓嶆柇鍦颁粠鎺掓皵娲婚棬鎺掑嚭銆傚綋娲诲鍒拌揪涓婃鐐规椂锛屾帓姘旀椿闂ㄥ叧闂紝杩涙皵娲婚棬鎵撳紑锛岃繘鍏ヤ笅涓�涓伐浣滃惊鐜殑杩涙皵鍐茬▼銆� + </p> + <p class="p-even"> + 鍙锛屾椿濉炲紡鍙戝姩鏈哄湪涓�涓伐浣滃惊鐜唴锛屼氦鏇垮畬鎴愪簡杩涙皵銆佸帇缂┿�佸伐浣滃拰鎺掓皵鍥涗釜鍐茬▼銆備竴涓伐浣滃惊鐜紝娲诲寰�澶嶈繍鍔ㄤ袱娆★紝鏇茶酱杞姩涓ゅ湀銆傚叾涓彧鏈夊伐浣滃啿绋嬫槸鐕冩枡鐕冪儳鍋氬姛锛屽皢鐕冩枡鐨勫寲瀛﹁兘杞彉鎴愭洸杞磋浆鍔ㄧ殑鏈� + </p> + <div class="img-float w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0088-1.jpg" /> + <p class="img">鍥�2-70 鏄熷舰甯冨眬鍙戝姩鏈�</p> + </div> + <span> + <p class="p-even td-0"> + 姊拌兘锛屽叾浣欎笁涓啿绋嬮兘鏄潬鏇茶酱杞姩鐨勬儻鎬ч�氳繃杩炴潌甯﹀姩娲诲瀹屾垚鐨勩�備篃灏辨槸璇达紝鍦ㄦ椿濉炲紡鍙戝姩鏈虹殑宸ヤ綔涓紝鐕冩枡鐕冪儳銆佽兘閲忚浆鍖栧苟涓嶆槸杩炵画鐨勩�� + </p> + <p class="p-even"> + 涓轰簡浣垮彂鍔ㄦ満鑳藉杩炵画绋冲畾鍦板伐浣滐紝鑸┖鐢ㄦ椿濉炲紡鍙戝姩鏈洪噰鐢ㄥ姹界几锛�5锝�28缂革級缁撴瀯锛屽ぇ澶氶噰鐢ㄦ槦褰㈠竷灞�锛堝浘2-70锛夈�傚涓皵缂稿洿缁曟洸杞存帓鎴愪竴鍦堟垨涓ゅ湀锛屽悇姹界几浜ゆ浛宸ヤ綔锛屼繚璇佷换浣曟椂鍊欓兘鏈夋皵缂稿湪鍋氬姛锛屼娇鍙戝姩鏈鸿繛缁ǔ瀹氬湴宸ヤ綔銆� + </p> + </span> + </div> + </div> + </div> + <!-- 77椤� --> + <div class="page-box" page="85"> + <div v-if="showPageList.indexOf(85) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">077</li> + </ul> + <div class="bodystyle"> + <h5 id="e020" class="p-odd unit2-c">锛堜笁锛夋椿濉炲紡鍙戝姩鏈虹殑宸ヤ綔绯荤粺</h5> + <div class="img-rights w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <span> + <p class="block"> + 娣峰悎姣旈�傚綋锛屾槸鎸囨贩鍚堟皵涓殑姹芥补瀹屽叏鐕冪儳鏃讹紝鍚稿叆鐨勬哀姘斾篃娑堣�楀畬浜嗐�傚鏋滄苯娌瑰畬鍏ㄧ噧鐑ц�屾哀姘旀湭娑堣�楀畬锛屽彨浣滆传娌癸紝鍙戝姩鏈哄姛鐜囦細涓嬮檷锛涘鏋滄哀姘旀秷鑰楀畬鑰屾苯娌规湭瀹屽叏鐕冪儳锛岀О涓哄瘜娌癸紝鍙戝姩鏈哄姛鐜囦笅闄嶃�佸啋榛戠儫锛岀粡娴庢�ч檷浣庛�� + </p> + </span> + </div> + </div> + <span> + <p class="p-odd"> + 娲诲寮忓彂鍔ㄦ満鑳藉杩炵画涓嶆柇鍦板伐浣滐紝闄や簡蹇呰鐨勭粍鎴愰儴鍒嗕箣澶栵紝杩樺繀椤绘湁鍚勪釜宸ヤ綔绯荤粺閰嶅悎宸ヤ綔銆傛椿濉炲紡鍙戝姩鏈虹殑宸ヤ綔绯荤粺涓昏鏈夎繘姘旂郴缁熴�佺偣鐏郴缁熴�佹鼎婊戠郴缁熴�佸喎鍗寸郴缁熷拰鍚姩绯荤粺銆� + </p> + <p class="p-odd"> + 杩涙皵绯荤粺鐨勪綔鐢ㄦ槸灏嗕粠鐕冩补娉垫潵鐨勭噧娌规苯鍖栵紝浠ヤ究涓庣┖姘斿潎鍖�鍦版贩鍚堬紝缁勬垚娣峰悎姣旈�傚綋鐨勬贩鍚堟皵锛屾弧瓒冲彂鍔ㄦ満鍦ㄥ悇绉嶅伐浣滄儏鍐典笅鐨勯渶瑕併�傝埅绌烘椿濉炲紡鍙戝姩鏈轰笂閲囩敤鐨勮繘姘旂郴缁熸湁涓ょ锛氫竴绉嶆槸姹藉寲鍣ㄥ紡鐕冩枡绯荤粺銆傛绯荤粺鏄湪鍙戝姩鏈虹殑杩涙皵绠¤矾涓皢琚苯鍖栧櫒闆惧寲鐨勭噧娌瑰柗鍏ワ紝骞朵笌绌烘皵娣峰悎缁勬垚娣峰悎姘旂劧鍚庤繘鍏ユ苯缂稿唴銆傚彟涓�绉嶆槸鐩存帴鍠峰皠寮忕噧鏂欑郴缁熴�傛绯荤粺鏄湪杩涙皵鍐茬▼涓皢鐕冩枡鐩存帴鍠峰叆姹界几鍐呬笌绌烘皵娣峰悎缁勬垚娣峰悎姘斻�� + </p> + </span> + <p class="p-odd"> + 鐐圭伀绯荤粺鏄埄鐢ㄩ珮鍘嬬數浜х敓鐢电伀鑺辩殑鏂规硶鏉ョ偣鐕冩贩鍚堟皵锛屼富瑕佺敱浜х敓楂樺帇鐢电殑纾佺數鏈哄拰鐐圭伀鍒嗛厤鍣ㄥ強鐏姳濉炵粍鎴愩�� + </p> + <p class="p-odd"> + 鍙戝姩鏈哄伐浣滄椂纾佺數鏈轰骇鐢熼珮鍘嬬數锛屽苟閫氳繃鐐圭伀鍒嗛厤鍣ㄦ寜鍙戝姩鏈虹殑鐐圭伀椤哄簭灏嗛珮鍘嬬數杈撻�佽嚦鍚勬苯缂哥殑鐏姳濉烇紝鐏姳濉炰骇鐢熺數鐏姳鐐圭噧娣峰悎姘斻�� + </p> + <p class="p-odd"> + 娑︽粦绯荤粺鏄妸鏁伴噺瓒冲鍜岄粡搴﹂�傚綋鐨勬粦娌瑰惊鐜�佷笉闂存柇鍦拌緭閫佽嚦姹界几锛屼娇姹界几鍜屾椿濉炰箣闂村緱鍒拌壇濂界殑娑︽粦鍜屽喎鍗达紝杈惧埌鍑忓皯鎽╂摝銆侀檷浣庣(鎹熴�佹竻娲佸拰闃茶厫鐨勭洰鐨勩�傛鼎婊戠郴缁熺敱婊戞补绠便�佹粦娌规车銆佹粦娌规护銆佹粦娌规暎鐑缃拰绠¢亾缁勬垚銆� + </p> + <div class="img-rights w220 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0089-1.jpg" /> + <p class="img">鍥�2-71 鍙戝姩鏈烘暎鐑闂�</p> + </div> + <span> + <p class="p-odd"> + 鍐峰嵈绯荤粺鍙堢О鏁g儹绯荤粺锛屼娇鍐峰嵈浠嬭川娴佽繃姹界几澹侊紝甯﹁蛋姹界几澹佺殑涓�浜涚儹閲忥紝浣挎苯缂告俯搴︾ǔ瀹氬湪閫傚疁鐨勮寖鍥村唴锛屼繚鎸佸彂鍔ㄦ満鐨勬甯稿伐浣溿�傝埅绌烘椿濉炲紡鍙戝姩鏈哄閲囩敤姘斿喎寮忓喎鍗寸郴缁燂紝鍦ㄦ苯缂稿澹佷笂鏈夊緢澶氭暎鐑墖锛屽埄鐢ㄨ繋闈㈡皵娴佸惞杩囨暎鐑墖甯﹁蛋鐑噺銆備负闃叉姹界几娓╁害杩囦綆锛岃繕鍦ㄥ彂鍔ㄦ満鍓嶅姞瑁呬簡鐧惧彾绐楀紡鏁g儹椋庨棬锛堝浘2-71锛夛紝鍙牴鎹苯缂告俯搴︽潵璋冭妭鐧惧彾绐楃殑寮�搴︼紝鎺у埗娴佽繃鍙戝姩鏈烘暎鐑墖鐨勭┖姘旀祦閲忋�� + </p> + </span> + <p class="p-odd"> + 鍚姩绯荤粺浣垮彂鍔ㄦ満浠庨潤姝㈢姸鎬佽繃娓″埌宸ヤ綔鐘舵�侊紝鍒嗕负姘斿惎鍔ㄥ拰鐢靛惎鍔ㄤ袱绉嶃�傛皵鍚姩浣跨敤鍘嬬缉绌烘皵杩涘叆姹界几鎺ㄥ姩娲诲杩愬姩锛屼娇鍙戝姩鏈哄紑濮嬭浆鍔紝 + </p> + </div> + </div> + </div> + <!-- 78椤� --> + <div class="page-box" page="86"> + <div v-if="showPageList.indexOf(86) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">078</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 骞跺湪鍚勭郴缁熺殑閰嶅悎涓嬭繃娓″埌宸ヤ綔鐘舵�併�傜數鍚姩浣跨敤鐢靛姩鏈哄甫鍔ㄥ彂鍔ㄦ満鐨勬洸杞存棆杞紝骞跺湪鍚勭郴缁熺殑閰嶅悎涓嬭繃娓″埌宸ヤ綔鐘舵�併�� + </p> + <h5 id="e021" class="p-even unit2-c">锛堝洓锛夎灪鏃嬫〃</h5> + <p class="p-even"> + 鑸┖娲诲寮忓彂鍔ㄦ満鏄竴绉嶅皢鐑兘杞崲涓烘満姊拌兘鐨勫唴鐕冩満锛屽畠骞朵笉鑳藉崟鐙负椋炴満鎻愪緵鍓嶈繘鐨勫姩鍔涳紝蹇呴』閫氳繃铻烘棆妗ㄦ墠鑳芥帹鍔ㄩ鏈哄墠杩涖�� + </p> + <p class="p-even"> + 铻烘棆妗ㄦ槸鍦ㄦ祦浣撲腑浜х敓椹卞姩鍔涚殑瑁呯疆锛岄�傜敤浜庢恫浣撲篃閫傜敤浜庢皵浣擄紝椋炴満涓婄殑铻烘棆妗ㄤ负绌烘皵铻烘棆妗ㄣ�傝灪鏃嬫〃鍦ㄧ┖姘斾腑鏃嬭浆灏嗗彂鍔ㄦ満鏇茶酱鐨勮浆鍔ㄥ姛鐜囪浆鍖栦负鎺ㄨ繘鍔涳紝浣块鏈哄悜鍓嶈繍鍔ㄣ�傚洜姝わ紝娲诲寮忓彂鍔ㄦ満鍜岃灪鏃嬫〃涓�璧锋瀯鎴愰鏈虹殑鍔ㄥ姏瑁呯疆銆� + </p> + <div class="img-float w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0090-1.jpg" /> + <p class="img">鍥�2-72 铻烘棆妗ㄥ墫闈�</p> + </div> + <span> + <p class="p-even"> + 鐜颁唬铻烘棆妗ㄤ富瑕佺敱妗ㄥ彾銆佹〃姣傚強妗ㄥ彾鍙樿窛鏈烘瀯绛夌粍鎴愶紝鍏跺墫闈㈠鍥�2-72鎵�绀恒�傛〃鍙剁殑鍓栭潰褰㈢姸鍜岀考鍨嬬浉浼硷紝妗ㄥ彾鐨勫墠銆佸悗琛ㄩ潰鍒嗗埆鐩稿綋浜庢満缈肩殑涓娿�佷笅琛ㄩ潰銆傝灪鏃嬫〃鏃嬭浆鏃讹紝妗ㄥ彾涓庣┖姘旀湁鐩稿杩愬姩锛屽湪妗ㄥ彾鐨勫墠琛ㄩ潰锛堝墫闈㈣緝鍑革級绌烘皵娴佸姩蹇紝鍘嬪姏灏忥紝妗ㄥ彾鍚庤〃闈㈢┖姘旀祦閫熸參锛屽帇鍔涘ぇ銆傛〃鍙跺墠銆佸悗琛ㄩ潰鏈夊帇鍔涘樊锛岃繖涓帇鍔涘樊褰㈡垚浜嗚灪鏃嬫〃鐨勬帹鍔ㄥ姏銆傛〃鍙跺彉璺濇満鏋勭敤鏉ユ敼鍙樿灪鏃嬫〃鐨勬〃鍙惰浠庤�屾敼鍙樿灪鏃嬫〃鎺ㄥ姩鍔涚殑澶у皬銆傚埗浣滆灪鏃嬫〃鐨勬潗鏂欐湁鏈ㄦ枡銆侀挗鏉愩�侀摑鏉愭垨澶嶅悎鏉愭枡锛岀幇浠eぇ澶氭暟铻烘棆妗ㄤ娇鐢ㄧ殑鏄摑鍚堥噾鎴栧鍚堟潗鏂欙紝瀹冨彲浠ュ仛鎴愯交钖勩�佹湁鏁堢殑鍙跺瀷锛屽噺灏忎簡缁撴瀯鐨勮川閲忚�屼笉闄嶄綆缁撴瀯鐨勫己搴︺�� + </p> + </span> + <h4 id="d028" class="p-even unit2-c">浜屻�佺┖姘斿柗姘斿紡鍙戝姩鏈�</h4> + <p class="p-even"> + 绌烘皵鍠锋皵寮忓彂鍔ㄦ満鏄竴绉嶆妸鐕冩枡鐨勭儹鑳借浆鎹负姘斾綋鐨勫姩鑳斤紝鍒╃敤鐕冩皵浠庡熬閮ㄩ珮閫熷柗鍑烘椂鎵�浜х敓鐨勫弽鍐蹭綔鐢ㄥ姏鎺ㄥ姩椋炴満鍓嶈繘鐨勫彂鍔ㄦ満銆傝繖绉嶅彂鍔ㄦ満鑳藉鐩存帴浜х敓鎺ㄥ姏锛屽畠鏈韩鏃㈡槸鐑姏鏈猴紝鍙堟槸鎺ㄨ繘鍣ㄣ�備篃灏辨槸璇达紝瀹冩槸鐑姏鏈哄拰鎺ㄨ繘鍣ㄥ悎涓轰竴浣撶殑鑸┖鍔ㄥ姏瑁呯疆銆傝鏈夌┖姘斿柗姘斿紡鍙戝姩鏈虹殑椋炴満鑳藉婊¤冻楂橀�熼琛屽鍔ㄥ姏鐨勮姹傦紝椋炶閫熷害鍙互杈惧埌鎴栬秴杩囧0閫熴�� + </p> + <p class="p-even"> + 绌烘皵鍠锋皵寮忓彂鍔ㄦ満鎺ㄥ姏浜х敓鐨勬牴鏈師鍥狅紝鍦ㄤ簬姘斾綋娴佽繃鍙戝姩鏈哄唴閮ㄦ椂锛屾皵浣撳拰鍙戝姩鏈轰箣闂翠骇鐢熺殑浣滅敤涓庡弽浣滅敤銆傚柗姘斿紡鍙戝姩鏈哄伐浣滄椂锛屾皵浣撴祦杩囧彂鍔ㄦ満锛屽湪鍙戝姩鏈哄唴姘斾綋琚繘琛屽帇缂┿�佺噧鐑э紝浣挎皵浣撶殑鍘嬪姏鍜屾俯搴﹂兘 + </p> + </div> + </div> + </div> + <!-- 79椤� --> + <div class="page-box" page="87"> + <div v-if="showPageList.indexOf(87) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">079</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 澶уぇ鎻愰珮锛屾皵浣撳湪鍙戝姩鏈哄唴閮ㄥ繀鐒跺姏鍥惧悜鍥涢潰鍏柟鑷敱鑶ㄨ儉銆傚彂鍔ㄦ満鍐呭鍒欒闄愬埗姘斾綋鑷敱鑶ㄨ儉锛屽彧鍑嗗畠鍚戝柗鍙d竴涓柟鍚戣啫鑳�鍔犻�燂紝姘斾綋灏变互寰堥珮鐨勯�熷害浠庡柗鍙e柗鍑恒�傞珮閫熷柗鍑虹殑鐕冩皵灏嗗鍙戝姩鏈轰骇鐢熷緢澶х殑鍙嶄綔鐢ㄥ姏锛岃繖涓弽浣滅敤鍔涘氨鏄彂鍔ㄦ満鐨勬帹鍔ㄥ姏銆� + </p> + <p class="p-odd"> + 姘戠敤鑸┖鍣ㄤ娇鐢ㄧ殑绌烘皵鍠锋皵寮忓彂鍔ㄦ満锛屾牴鎹瀯閫犱笉鍚屼富瑕佸垎涓烘丁杞柗姘斿彂鍔ㄦ満銆佹丁杞灪鏃嬫〃鍙戝姩鏈恒�佹丁杞鎵囧彂鍔ㄦ満鍜屾丁杞酱鍙戝姩鏈哄洓绉嶃�� + </p> + <h5 id="e022" class="p-odd unit2-c">锛堜竴锛夋丁杞柗姘斿彂鍔ㄦ満</h5> + <p class="p-odd"> + 娑¤疆鍠锋皵鍙戝姩鏈烘槸鏈�鏃╄鐮斿埗鍑烘潵鐨勫柗姘斿紡鍙戝姩鏈猴紝瀹冧富瑕佺敱杩涙皵閬撱�佸帇姘旀満銆佺噧鐑у銆佹丁杞拰鍠风缁勬垚锛堝浘2-73锛夈�� + </p> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0091-1.jpg" /> + <p class="img">鍥�2-73 娑¤疆鍠锋皵鍙戝姩鏈虹粨鏋�</p> + </div> + <span> + <h6 id="f008">1.杩涙皵閬�</h6> + <p class="p-odd"> + 杩涙皵閬撶殑浣滅敤鏄湪鍚勭椋炶鐘舵�佷笅锛屾暣鐞嗚繘鍏ュ彂鍔ㄦ満鐨勬皵娴侊紝灏嗚冻澶熼噺鐨勭┖姘斾互鏈�灏忕殑娴佸姩鎹熷け椤哄埄鍦板紩鍏ュ帇姘旀満銆傜幇浠f皯鐢ㄨ埅绾块鏈虹敱浜庨琛屼腑鏈揪鍒板0閫燂紝浣跨敤鐨勫彂鍔ㄦ満閲囩敤鐨勬槸浜氬0閫熻繘姘旈亾銆� + </p> + </span> + <h6 id="f009">2.鍘嬫皵鏈�</h6> + <p class="p-odd"> + 鍘嬫皵鏈虹殑涓昏浣滅敤鏄�氳繃楂橀�熸棆杞殑鍙剁墖瀵圭┖姘斿仛鍔燂紝灏嗕粠杩涙皵閬撴祦杩囨潵鐨勭┖姘旇繘琛屽帇缂╋紝浣跨┖姘旂殑鍘嬪姏銆佸瘑搴﹀拰娓╁害鎻愰珮锛屼负鐕冩枡鐕冪儳銆佺噧姘旇啫鑳�鍋氬姛鍒涢�犳潯浠躲�備粠鍘嬫皵鏈哄紩鍑虹殑绌烘皵杩樺彲浠ヨ繘琛屽彂鍔ㄦ満鍐峰嵈銆佹満浣撻槻鍐般�佹満鑸辩┖姘斿鍘嬪拰璋冩俯绛夈�傛牴鎹帇姘旀満鐨勭粨鏋勫舰寮忓拰姘旀祦鍦ㄥ帇姘旀満鍐呯殑娴佸姩鏂瑰悜锛屽彲灏嗗帇姘旀満鍒嗕负杞存祦寮忓帇姘旀満锛堝浘2-74锛夊拰绂诲績寮忓帇姘旀満锛堝浘2-75锛夈�� + </p> + <p class="center p-odd openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0091-2.jpg" /> + </p> + <p class="img">鍥�2-74 杞存祦寮忓帇姘旀満</p> + </div> + </div> + </div> + <!-- 80椤� --> + <div class="page-box" page="88"> + <div v-if="showPageList.indexOf(88) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">080</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="center p-even openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0092-1.jpg" /> + </p> + <p class="img">鍥�2-75 绂诲績寮忓帇姘旀満</p> + <p class="p-even"> + 杞存祦寮忓帇姘旀満鐢辫澶氱骇鍙剁墖缁勬垚锛屾瘡涓�绾х殑宸ヤ綔鍘熺悊鍑犱箮涓�鏍枫�傝酱娴佸紡鍘嬫皵鏈虹敱涓嶆棆杞殑瀹氬瓙鍜岄珮閫熸棆杞殑杞瓙缁勬垚銆傚畾瀛愮敱涓�鎺掓帓鏁存祦鍙剁墖缁勬垚鏁存祦鐜紝鍚勪釜鏁存祦鐜笌鏈哄專鍥哄畾鍦ㄤ竴璧枫�傝浆瀛愪篃鐢变竴鎺掓帓宸ヤ綔鍙剁墖缁勬垚鍙惰疆锛屽彾杞笌娑¤疆鐩歌繛锛岃娑¤疆甯﹀姩楂橀�熸棆杞�傚彂鍔ㄦ満宸ヤ綔鏃讹紝杞瓙鐨勫伐浣滃彾鐗囦互寰堥珮鐨勯�熷害鏃嬭浆锛屽绌烘皵鍋氬姛锛屼娇绌烘皵鍙楀埌鍘嬬缉锛屽帇鍔涘拰娓╁害鎻愰珮锛屽悓鏃惰繕灏嗙┖姘旂殑閫熷害鎻愰珮骞朵互杈冨揩鐨勯�熷害鍚戝悗鎺掑嚭銆備粠宸ヤ綔鍙剁墖娴佸嚭鐨勭┖姘旇繘鍏ユ暣娴佸彾鐗囦腑锛岀敱浜庢暣娴佸彾鐗囩殑閫氶亾鏄墿鏁e舰鐨勶紝绌烘皵鍦ㄩ�氳繃鏁存祦鍙剁墖鎵╂暎褰㈤�氶亾鏃堕�熷害闄嶄綆鍘嬪姏澧炲ぇ銆傚鍘嬪悗鐨勭┖姘斿張娴佸叆涓嬩竴绾х殑宸ヤ綔鍙剁墖鍜屾暣娴佸彾鐗囷紝杩欐牱绌烘皵灏辫涓嶆柇鍦板帇缂╋紝绌烘皵鐨勫帇鍔涜秺鏉ヨ秺澶с�佹俯搴﹀拰瀵嗗害瓒婃潵瓒婇珮銆傝酱娴佸紡鍘嬫皵鏈哄绌烘皵杩涜閫愮骇澧炲帇锛屾晥鐜囬珮锛岃繋椋庨潰绉皬锛岀幇浠e柗姘斿紡鍙戝姩鏈哄箍娉涢噰鐢ㄨ酱娴佸紡鍘嬫皵鏈恒�� + </p> + <p class="p-even"> + 绂诲績寮忓帇姘旀満涓昏鐢卞姘旂銆佸彾杞�佸娴佸櫒鍜屾墿鏁e櫒缁勬垚銆傚彾杞殑杞翠笌娑¤疆杞磋繛鎺ュ湪涓�璧凤紝琚丁杞甫鍔ㄦ棆杞�傚彂鍔ㄦ満宸ヤ綔鏃剁┖姘旇鍚稿叆鍙惰疆涓績銆傜┖姘旇繘鍏ュ彾杞悗琚彾鐗囨帹鍔ㄩ殢鍙惰疆楂橀�熸棆杞紝绌烘皵鍙楀埌鎯�х蹇冨姏鐨勪綔鐢ㄥ悜澶栫敥锛屼娇绌烘皵鍔犻�熷悜澶栵紝灞傚眰绌烘皵鍙楀埌鎸ゅ帇锛屼娇绌烘皵鐨勫帇鍔涘澶ф俯搴﹀崌楂樸�傜┖姘旂寮�鍙惰疆鍚庤繘鍏ユ墿鏁e櫒锛岄�熷害闄嶄綆锛屽帇鍔涚户缁澶с�傜蹇冨紡鍘嬫皵鏈虹殑鐗圭偣鏄鍘嬫瘮楂橈紝璐ㄩ噺杞伙紝浣嗘祦鍔ㄦ崯澶卞ぇ锛屾晥鐜囦綆锛岃繋椋庨潰绉ぇ锛屽涓烘棭鏈熺殑鍠锋皵寮忓彂鍔ㄦ満閲囩敤銆� + </p> + <h6 id="f010" class="p-even">3.鐕冪儳瀹�</h6> + <p class="p-even"> + 鐕冪儳瀹ゆ槸鐕冩补涓庡帇姘旀満娴佸嚭鐨勯珮鍘嬬┖姘旇繘琛屾贩鍚堝苟杩涜鐕冪儳鐨勮缃紙鍥�2-76锛夈�傚湪鐕冪儳瀹ゅ唴鐕冩补涓庣┖姘旀贩鍚堢噧鐑у悗锛岀噧娌圭殑鍖栧鑳借浆鎹负姘斾綋鐨勭儹鑳斤紝姘斾綋鐨勬俯搴︽彁楂樺帇鍔涘澶э紝褰㈡垚楂樻俯楂樺帇鐨勭噧姘斿悜鍚庢帓鍑恒�� + </p> + </div> + </div> + </div> + <!-- 81椤� --> + <div class="page-box" page="89"> + <div v-if="showPageList.indexOf(89) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">081</li> + </ul> + <div class="bodystyle"> + <p class="center p-odd openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0093-1.jpg" /> + </p> + <p class="img">鍥�2-76 鐕冪儳瀹�</p> + <p class="p-odd"> + 鐕冪儳瀹や富瑕佺敱鐏劙绛掋�佹丁娴佸櫒锛堟棆娴佸櫒锛夈�佺噧娌瑰柗鍢村拰鐕冪儳瀹ゅ濂楃瓑缁勬垚銆傜伀鐒扮瓛鏄┖姘斾笌鐕冩补娣峰悎鐕冪儳鐨勫湴鏂癸紝鐏劙绛掑ご閮ㄦ湁娑℃祦鍣ㄥ拰鐕冩补鍠峰槾銆備粠鍘嬫皵鏈哄嚭鏉ョ殑楂樺帇绌烘皵鍦ㄧ伀鐒扮瓛澶撮儴鍒嗕负涓よ偂锛氱涓�鑲★紙绾﹀崰绌烘皵鎬婚噺鐨�25%锛夌粡鐏劙绛掑ご閮ㄨ繘鍏ョ伀鐒扮瓛锛屼笌鐕冩补娣峰悎杩涜鐕冪儳锛涚浜岃偂缁忕伀鐒扮瓛澶栭儴涓庣噧鐑у澶栧涔嬮棿鐨勯�氶亾鍚戝悗娴佸姩锛屽鐏劙绛掕繘琛屽喎鍗达紝骞剁敱鐏劙绛掑悗閮ㄧ殑灏忓瓟杩涘叆鐏劙绛掞紝涓庣涓�鑲$噧鐑у悗鐨勯珮娓╃噧姘旀贩鍚堬紝浣跨噧鐑у鐨勫嚭鍙g噧姘旀俯搴﹂檷浣庡埌娑¤疆鑳芥壙鍙楃殑娓╁害锛岀劧鍚庢祦鍚戞丁杞�� + </p> + <h6 id="f011" class="p-odd">4.娑¤疆</h6> + <div class="img-rights w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0093-2.jpg" /> + <p class="img">鍥�2-77 瀵煎悜鍣ㄥ拰宸ヤ綔鍙惰疆</p> + </div> + <span> + <p class="p-odd"> + 浠庣噧鐑у鍠峰嚭鐨勭噧姘斿拰绌烘皵鍚瑰悜娑¤疆锛屽湪姘旀祦鐨勪綔鐢ㄤ笅浣挎丁杞珮閫熸棆杞仛鍔燂紝娑¤疆鏃嬭浆甯﹀姩鍘嬫皵鏈鸿浆鍔ㄣ�傛丁杞殑鍩烘湰缁勬垚鏈夊鍚戝櫒鍜屽伐浣滃彾杞紙鍥�2-77锛夈�傚鍚戝櫒瀹夎鍦ㄥ伐浣滃彾杞殑鍓嶉潰锛屽浐瀹氫笉鍔紱宸ヤ綔鍙惰疆閫氳繃杞翠笌鍘嬫皵鏈鸿浆瀛愯酱杩炴帴銆備笌鍘嬫皵鏈虹浉浼硷紝娑¤疆鐨勫鍚戝櫒涓畨瑁呮湁瀵煎悜鍣ㄥ彾鐗囷紝宸ヤ綔鍙惰疆鍛ㄥ洿瀹夎鏈夋丁杞彾鐗囥�備粠鐕冪儳瀹ゆ祦鍑虹殑姘旀祦锛屽厛娴佽繃瀵煎悜鍣ㄥ彾鐗囷紝閫熷害鎻愰珮锛屾俯搴﹀拰鍘嬪姏闄嶄綆锛屾祦鍑哄鍚戝櫒鐨勯珮閫熸皵娴佸氨浠ラ�傚綋鐨勮搴﹀啿鍑绘丁杞彾鐗囷紝浣挎丁杞珮閫熸棆杞�傚浜庝笉鍚屽瀷鍙风殑娑¤疆鍠锋皵鍙戝姩鏈猴紝娑¤疆鍙互浠庝竴绾у埌寰堝绾э紝鑰屽湪鍓嶉潰绾х殑娑¤疆鍙剁墖鎵垮彈鐨勬俯搴﹂珮銆佽浆閫熷揩锛屽悗闈㈢骇鎵垮彈鐨勬俯搴﹁緝浣庛�佽浆閫熶篃杈冩參銆傜敱浜庢丁杞湪楂橀�熸棆杞紝娑¤疆鐨勬潗鏂欒鎵垮彈鏋佸ぇ鐨勬儻鎬х蹇冨姏鐨勪綔鐢ㄣ�傜噧姘旀丁杞彂鍔ㄦ満宸ヤ綔鏃讹紝娑¤疆鍓嶇殑鐕冩皵娓╁害瓒婇珮鍒欏彂鍔ㄦ満瀵圭儹鐨勫埄鐢ㄧ巼瓒婂ソ锛岀粡娴庢�ц秺濂斤紝浣嗚繖涓俯搴﹀彈鍒版丁杞潗鏂欑殑寮哄害鍜岃�愮儹鎬� + </p> + </span> + </div> + </div> + </div> + <!-- 82椤� --> + <div class="page-box" page="90"> + <div v-if="showPageList.indexOf(90) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">082</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鑳界殑闄愬埗銆傜噧姘旀帹鍔ㄦ丁杞仛鍔燂紝娑堣�椾簡鐕冩皵鐨勯儴鍒嗚兘閲忥紝浣嗕粎鍗犵噧姘旀�昏兘閲忔瀬灏忕殑閮ㄥ垎锛岀粷澶ч儴鍒嗚兘閲忚浆鍖栦负鎺ㄥ姩椋炴満鍓嶈繘鐨勬帹鍔涖�� + </p> + <h6 id="f012" class="p-even">5.鍠风</h6> + <div class="img-float w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0094-1.jpg" /> + <p class="img">鍥�2-78 鏁存祦閿�</p> + </div> + <span> + <p class="p-even"> + 鍠风瀹夎鍦ㄦ丁杞悗闈紝鍏朵富瑕佷綔鐢ㄦ槸浣夸粠娑¤疆娴佸嚭鐨勭噧姘旇啫鑳�銆佸姞閫燂紝澧炲ぇ鐕冩皵鐨勫姩鑳斤紝鎻愰珮鐕冩皵鐨勯�熷害锛屼娇鐕冩皵浠ュ緢蹇殑閫熷害鎸夎璁$殑鏂瑰悜鎺掑叆澶ф皵锛屼粠鑰屼骇鐢熸帹鍔涖�傚柗绠′腑瑁呮湁鏁存祦閿ワ紙鍥�2-78锛夛紝浣夸粠娑¤疆鍑烘潵鐨勭幆鐘舵皵娴佺粡杩囨暣娴侀敟鍚庡彉涓烘煴褰㈠悜鍚庢祦鍔ㄧ殑姘旀祦銆傚湪澶у瀷椋炴満鐨勫柗绠′腑甯歌鏈夊弽鎺ㄨ缃紝椋炴満鐫�闄嗚繃绋嬩腑鎺ュ湴鍚庢墦寮�鍙嶆帹瑁呯疆锛屾敼鍙樻帓姘旀柟鍚戜骇鐢熶笌椋炴満閫熷害鐩稿弽鐨勬帹鍔涳紝浣块鏈哄緢蹇噺閫燂紝浠庤�岀缉鐭潃闄嗘椂鐨勬粦璺戣窛绂汇�傛湁浜涘柗绠¤繕瑁呮湁娑堝0瑁呯疆锛屼互鍑忓皬鍙戝姩鏈虹殑鎺掓皵鍣0銆傚浘2-79鎵�绀轰负鍑犵鎺ㄥ姏鍙嶅悜鏂规硶銆� + </p> + </span> + <p class="center p-even openImgBox"> + <img class="w80" alt="" src="../../assets/images/0094-2.jpg" /> + </p> + <p class="img">鍥�2-79 鍑犵鎺ㄥ姏鍙嶅悜鏂规硶</p> + <p class="p-even"> + 娑¤疆鍠锋皵鍙戝姩鏈烘槸鏈�鍏堣璁捐鍜屽埗閫犲嚭鐨勭噧姘旀丁杞彂鍔ㄦ満銆傛丁杞柗姘斿彂鍔ㄦ満鐨勫帇姘旀満銆佺噧鐑у鍜屾丁杞悎绉版牳蹇冩満鎴栫噧姘斿彂鐢熷櫒銆傛丁杞柗姘斿彂鍔ㄦ満鐨勭粨鏋勭畝鍗曘�佽川閲忓皬銆佹帹鍔涘ぇ锛岄�傜敤浜庨珮閫熼琛岋紝浣嗗畠鐨勬补鑰楀ぇ銆佺粡娴庢�у樊銆傚悗鏉ワ紝浜轰滑鍦ㄦ鍩虹涓婃牴鎹笉鍚岀殑闇�瑕侊紝鐮旂┒鍜屽埗閫犲嚭浜嗘丁杞灪鏃嬫〃鍙戝姩鏈恒�佹丁杞鎵囧彂鍔ㄦ満銆佹丁杞酱鍙戝姩鏈哄拰妗ㄦ墖鍙戝姩鏈恒�� + </p> + </div> + </div> + </div> + <!-- 83椤� --> + <div class="page-box" page="91"> + <div v-if="showPageList.indexOf(91) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">083</li> + </ul> + <div class="bodystyle"> + <h5 id="e023" class="p-odd unit2-c">锛堜簩锛夋丁杞灪鏃嬫〃鍙戝姩鏈�</h5> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0095-1.jpg" /> + <p class="img">鍥�2-80 娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満</p> + </div> + <span> + <p class="p-odd"> + 娑¤疆鍠锋皵鍙戝姩鏈洪�傜敤浜庤秴澹伴�熼琛岋紝浣嗗湪浣庨�熴�佷綆浜氬0閫熼琛屾椂锛屾帹杩涙晥鐜囦綆銆佺粡娴庢�у樊銆傝灪鏃嬫〃鍦ㄨ繖涓�熷害鑼冨洿鍐呮帹杩涙晥鐜囬珮锛屼絾浼犵粺鐨勫甫鍔ㄨ灪鏃嬫〃宸ヤ綔鐨勬椿濉炲紡鍙戝姩鏈虹粨鏋勫鏉傘�佽川閲忓ぇ銆傚湪娑¤疆鍠锋皵鍙戝姩鏈哄嚭鐜颁箣鍚庯紝浜轰滑灏卞皢鍠锋皵寮忓彂鍔ㄦ満鍜岃灪鏃嬫〃缁撳悎锛屽彂鏄庝簡娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満锛堝浘2-80锛夈�傛丁杞灪鏃嬫〃鍙戝姩鏈虹畝绉版丁妗ㄥ彂鍔ㄦ満锛屽叾鏍稿績鏄竴鍙版丁杞柗姘斿彂鍔ㄦ満锛屽埄鐢ㄦ丁杞皢楂樻俯楂樺帇鐕冩皵鐨勫姛鐜囧敖鍙兘鎻愬彇鍑烘潵锛岃浆鍖栦负杞村姛鐜囨潵甯﹀姩铻烘棆妗ㄦ棆杞骇鐢熸帹鍔ㄥ姏锛岄┍鍔ㄩ鏈哄墠杩涖�備粠浜嬭埅绌鸿繍杈撶殑铻烘棆妗ㄩ鏈哄嚑涔庨兘閲囩敤娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満銆� + </p> + </span> + <p class="p-odd"> + 娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満鐨勫熀鏈瀯閫犲拰娑¤疆鍠锋皵鍙戝姩鏈虹殑绫讳技锛屽畠鍚屾牱鍖呮嫭杩涙皵閬撱�佸帇姘旀満銆佺噧鐑у銆佹丁杞拰鍠风銆傛墍涓嶅悓鐨勬槸瀹冩瘮娑¤疆鍠锋皵鍙戝姩鏈哄浜嗚灪鏃嬫〃鍜屽噺閫熷櫒銆傛丁杞灪鏃嬫〃鍙戝姩鏈虹殑鍘嬫皵鏈烘湁绂诲績寮忋�佽酱娴佸紡鍜岀粍鍚堝紡銆傝灪鏃嬫〃鍜屽帇姘旀満鍏辩敤涓�鏍硅酱涓庢丁杞繛鎺ョ殑锛屽彨鍗曡酱寮忔丁杞灪鏃嬫〃鍙戝姩鏈恒�傝灪鏃嬫〃鍜屽帇姘旀満鍚勭敤涓�鏍硅酱鍒嗗埆涓庢丁杞繛鎺ョ殑锛屽彨鍙岃酱寮忔丁杞灪鏃嬫〃鍙戝姩鏈恒�傝繖绉嶅弻杞村紡鐨勬丁杞灪鏃嬫〃鍙戝姩鏈洪噰鐢ㄤ袱濂楁丁杞細涓�濂楀伐浣滄丁杞拰鍘嬫皵鏈虹浉杩烇紝浠ラ珮杞�熷伐浣滐紝绉颁负楂橀�熸丁杞紱鍙︿竴濂楃嫭绔嬫丁杞畨瑁呭湪甯﹀姩鍘嬫皵鏈虹殑宸ヤ綔娑¤疆涔嬪悗锛岃浆閫熻緝浣庯紝骞堕�氳繃鍑忛�熷櫒甯﹀姩铻烘棆妗ㄦ棆杞紝绉颁负浣庨�熸丁杞�傛丁杞灪鏃嬫〃鍙戝姩鏈轰骇鐢熺殑鍔ㄥ姏浠ヨ灪鏃嬫〃鐨勬帹鍔ㄥ姏涓轰富锛岀害鍗犲叏閮ㄦ帹杩涘姩鍔涚殑90%锛屽柗绠″柗鍑虹殑鐕冩皵鎵�浜х敓鐨勬帹鍔涘彧鍗�10%銆傜敱浜庤灪鏃嬫〃鎺ㄨ繘鏁堢巼闅忛�熷害鐨勬彁楂樿�岄檷浣庯紝鍥犳閫傜敤浜庨琛岄�熷害鍦�600km/h浠ヤ笅鐨勯鏈恒�傞�氬父鍦ㄤ腑閫熼鏈哄拰鏀嚎椋炴満浠ュ強灏忓瀷椋炴満涓婇噰鐢ㄦ丁杞灪鏃嬫〃鍙戝姩鏈轰綔涓哄姩鍔涜缃�� + </p> + <h5 id="e024" class="p-odd unit2-c">锛堜笁锛夋丁杞鎵囧彂鍔ㄦ満</h5> + <p class="p-odd"> + 鐢变簬楂橀�熸椂铻烘棆妗ㄧ殑鏁堢巼杩呴�熶笅闄嶏紝缁忔祹鎬у彉宸紝娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満涓嶉�傚疁鍦ㄩ珮閫熸潯浠朵笅浣跨敤銆備负浜嗛�傚簲瓒呰繃娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満鎬ц兘闄愬埗锛岃�屽張鏈揪鍒版丁杞柗姘斿彂鍔ㄦ満鏈�浣虫�ц兘鐨勯琛岄�熷害锛屼汉浠張鐮斿埗鍑轰簡涓�绉嶇洿寰勮緝灏忕殑澧炲帇椋庢墖浠f浛娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満鐨勮灪鏃嬫〃锛屽苟鍦ㄩ鎵囧闈㈢僵浠ュ澹炽�傜敱浜庨鎵囩殑鍙剁墖闀垮害澶уぇ缂╃煭锛屽苟琚斁鍏ヤ竴涓湁闄愮洿寰勭殑娑甸亾鍐咃紝浠� + </p> + </div> + </div> + </div> + <!-- 84椤� --> + <div class="page-box" page="92"> + <div v-if="showPageList.indexOf(92) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">084</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0096-1.jpg" /> + <p class="img">鍥�2-81 娑¤疆椋庢墖鍙戝姩鏈猴紙娣峰悎鎺掓皵锛�</p> + </div> + <span> + <p class="p-even td-0"> + 鑰岄伩鍏嶄簡铻烘棆妗ㄩ珮閫熻浆鍔ㄦ椂妗ㄥ皷浜х敓婵�娉㈢殑鎯呭喌锛屼娇椋炶閫熷害寰椾互鎻愰珮銆傝繖绉嶅彂鍔ㄦ満绉颁负娑¤疆椋庢墖鍙戝姩鏈猴紙鍥�2-81锛夛紝绠�绉版丁鎵囧彂鍔ㄦ満锛屽畠鏄箍娉涗娇鐢ㄧ殑鑸┖鐕冩皵娑¤疆鍙戝姩鏈轰箣涓�銆� + </p> + <p class="p-even"> + 娑¤疆椋庢墖鍙戝姩鏈虹敱娑¤疆鍠锋皵鍙戝姩鏈哄姞涓�涓澹冲拰椋庢墖缁勬垚銆傝繖绉嶅彂鍔ㄦ満鍏锋湁鍐呫�佸涓や釜姘旀祦閫氶亾锛屽垎鍒О涓哄唴娑甸亾鍜屽娑甸亾銆傚洜姝わ紝娑¤疆椋庢墖鍙戝姩鏈哄張绉颁负鍐呭娑靛彂鍔ㄦ満銆傚唴娑甸亾绫讳技浜庢丁杞柗姘斿彂鍔ㄦ満锛屽娑甸亾鍒欎负椋庢墖鐜舰姘旀祦閫氶亾銆傛丁杞鎵囧彂鍔ㄦ満宸ヤ綔鏃讹紝绌烘皵缁忚繘姘旈亾娴佽繃椋庢墖銆傛祦杩囬鎵囩殑绌烘皵鍒嗘垚涓よ偂锛氫竴鑲$┖姘旇繘鍏ュ唴娑甸亾锛岀粡杩囧帇姘旀満琚帇缂╁悗涓庣噧鐑у鐨勭噧娌规贩鍚堢噧鐑э紝褰㈡垚楂樻俯楂樺帇鐕冩皵鎺ㄥ姩娑¤疆鏃嬭浆锛屾丁杞甫鍔ㄥ帇姘旀満鍜岄鎵囷紝鏈�鍚庣噧姘旈�氳繃鍠峰彛鍠峰嚭锛屼骇鐢熸帹鍔涳紱鍙︿竴鑲$┖姘旂粡杩囬珮閫熸棆杞殑椋庢墖鍚庨�熷害鎻愰珮浠庡娑甸亾鎺掑叆澶ф皵锛屼骇鐢熸帹鍔涖�� + </p> + </span> + <p class="p-even"> + 娑¤疆椋庢墖鍙戝姩鏈虹殑鎬绘帹鍔涚敱鍐呮兜閬撲骇鐢熺殑鎺ㄥ姏鍜屽娑甸亾浜х敓鐨勬帹鍔涗袱閮ㄥ垎缁勬垚銆傚唴娑甸亾鎺ㄥ姏鐨勪骇鐢熶笌娑¤疆鍠锋皵鍙戝姩鏈虹浉鍚岋紝澶栨兜閬撴帹鍔涚殑浜х敓鍜岃灪鏃嬫〃鐩镐技銆傛丁杞鎵囧彂鍔ㄦ満澶栨兜閬撶┖姘旇川閲忔祦閲忎笌鍐呮兜閬撶┖姘旇川閲忔祦閲忎箣姣旂О鍙戝姩鏈烘兜閬撴瘮銆傛丁杞鎵囧彂鍔ㄦ満鐨勫唴澶栨兜閬撶殑姘旀祦鎺掓皵鏂瑰紡鏈夋贩鍚堝紡鍜岄潪娣峰悎寮忎袱绉嶏細娣峰悎寮忔寚澶栨兜閬撴皵浣撶粡椋庢墖鍚庢祦鍒版贩鍚堝櫒鍐呬笌鍐呮兜閬撴皵浣撴贩鍚堝悗浠庡悓涓�涓柗鍙f帓鍑猴紝闈炴贩鍚堝紡鏄寚澶栨兜閬撴皵浣撲笌鍐呮兜閬撴皵浣撳垎鍒粠鍚勮嚜鐨勫柗绠℃帓鍑恒�傞�氬父楂樻兜閬撴瘮鐨勬丁杞鎵囧彂鍔ㄦ満閲囩敤闈炴贩鍚堝紡鎺掓皵锛屼綆娑甸亾姣旓紙甯﹀姞鍔涳級鐨勬丁杞鎵囧彂鍔ㄦ満閲囩敤娣峰悎寮忔帓姘旓紙鍥�2-82鍜屽浘2-83锛夈�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0092-01.jpg" /> + <p class="img">鍥�2-82 娑¤疆椋庢墖鍙戝姩鏈烘帓姘旀柟寮�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0092-02.jpg" /> + <p class="img">鍥�2-82 娑¤疆椋庢墖鍙戝姩鏈烘帓姘旀柟寮�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0092-03.jpg" /> + <p class="img">鍥�2-82 娑¤疆椋庢墖鍙戝姩鏈烘帓姘旀柟寮�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p><br></p> + <p class="center p-even openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0096-3.jpg" /> + </p> + <p class="img p-even">鍥�2-83 鍒嗗紑鎺掓皵鐨勬丁杞鎵囧彂鍔ㄦ満</p> + + </div> + </div> + </div> + <!-- 85椤� --> + <div class="page-box" page="93"> + <div v-if="showPageList.indexOf(93) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">085</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 娑甸亾姣旇秺楂橈紝璇存槑娑¤疆椋庢墖鍙戝姩鏈轰腑椋庢墖閮ㄥ垎绌烘皵娴侀噺瓒婂ぇ锛岄鎵囦骇鐢熺殑鎺ㄥ姏鎵�鍗犳瘮渚嬩篃瓒婂ぇ锛屾洿閫備簬閫熷害绋嶄綆鐨勯琛岋紱娑甸亾姣旇秺浣庯紝璇存槑鍙戝姩鏈哄唴鏍搁儴鍒嗙┖姘旀祦閲忚秺澶э紝鍐呮牳浜х敓鐨勬帹鍔涗篃瓒婂ぇ锛屾洿閫傚悎楂橀�熼琛屻�傝埅绾垮鏈烘櫘閬嶉噰鐢ㄨ緝楂樻兜閬撴瘮鐨勬丁杞鎵囧彂鍔ㄦ満锛岄�熷害鏇村揩鐨勬垬鏂楁満鍒欐櫘閬嶉噰鐢ㄦ兜閬撴瘮杈冧綆鐨勬丁杞鎵囧彂鍔ㄦ満銆� + </p> + <h5 id="e025" class="p-odd unit2-c">锛堝洓锛夋丁杞酱鍙戝姩鏈�</h5> + <p class="p-odd"> + 鍦ㄧ洿鍗囨満鍜屼竴浜涘叾浠栧簲鐢ㄤ腑鍙渶瑕佽緭鍑轰竴涓酱鍔熺巼鑰屼笉闇�瑕佷骇鐢熸帹鍔涚殑搴旂敤棰嗗煙鍐咃紝涔熻兘浣跨敤鐕冩皵娑¤疆鍙戝姩鏈恒�傛丁杞酱鍙戝姩鏈哄氨鏄竴绉嶈緭鍑鸿酱鍔熺巼鐨勭噧姘旀丁杞彂鍔ㄦ満锛屽叾缁撴瀯濡傚浘2-84鎵�绀恒�傚湪宸ヤ綔鍜屾瀯閫犱笂锛屾丁杞酱鍙戝姩鏈哄悓娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満寰堢浉杩戙�傚湪甯︽湁鍘嬫皵鏈虹殑鐕冩皵娑¤疆鍙戝姩鏈轰腑锛屾丁杞酱鍙戝姩鏈哄嚭鐜板緱杈冩櫄锛屼絾宸插湪鐩村崌鏈哄拰鍨傜洿/鐭窛璧疯惤椋炴満涓婂緱鍒颁簡骞挎硾鐨勫簲鐢ㄣ�傛丁杞酱鍙戝姩鏈轰篃鏈夎繘姘旈亾銆佸帇姘旀満銆佺噧鐑у銆佹丁杞拰鍠风绛夊柗姘斿紡鍙戝姩鏈虹殑鍩烘湰鏋勯�狅紝浣嗗畠涓�鑸鏈夋櫘閫氭丁杞拰鑷敱娑¤疆涓ょ涓嶅悓宸ヤ綔鐘舵�佺殑娑¤疆銆傝鍦ㄥ墠闈㈢殑鏄櫘閫氭丁杞紝瀹冨甫鍔ㄥ帇姘旀満锛岀淮鎸佸彂鍔ㄦ満宸ヤ綔锛涜鍦ㄥ悗闈㈢殑鏄嚜鐢辨丁杞紝鐕冩皵鎺ㄥ姩瀹冨仛鍔燂紝閫氳繃浼犲姩杞翠笓闂ㄧ敤鏉ヨ緭鍑鸿酱鍔熺巼銆傛丁杞酱鍙戝姩鏈哄ぇ閮ㄥ垎鐢ㄤ簬鐩村崌鏈猴紝瀹冧笌鏃嬬考閰嶅悎锛屾瀯鎴愪簡鐩村崌鏈虹殑鍔ㄥ姏瑁呯疆銆備负浜嗗悎鐞嗗湴瀹夋帓鐩村崌鏈虹殑缁撴瀯锛屾丁杞酱鍙戝姩鏈虹殑鍠峰彛鍙互鍚戜笂銆佸悜涓嬫垨鍚戜袱渚э紙鍥�2-85锛夛紝涓嶅儚娑¤疆鍠锋皵鍙戝姩鏈洪偅鏍烽潪鍚戝悗涓嶅彲銆傝繖鏈夊埄浜庣洿鍗囨満璁捐鏃剁殑鎬讳綋瀹夋帓銆� + </p> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0097-1.jpg" /> + </p> + <p class="img">鍥�2-84 娑¤疆杞村彂鍔ㄦ満缁撴瀯</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0097-2.jpg" /> + </p> + <p class="img">鍥�2-85 鐩村崌鏈哄柗鍙e悜澶栦晶</p> + </span> + </div> + <p class="p-odd"> + 鍚屾椿濉炲紡鍙戝姩鏈虹浉姣旓紝娑¤疆杞村彂鍔ㄦ満杈撳嚭鐨勫姛鐜囪澶у緱澶氥�傚湪缁忔祹鎬т笂锛屾丁杞酱鍙戝姩鏈虹殑鑰楁补鐜囩暐楂樹簬鏈�濂界殑娲诲寮忓彂鍔ㄦ満锛屼絾瀹冩墍鐢ㄧ殑鑸┖鐓ゆ补瑕佹瘮鍚庤�呮墍鐢ㄧ殑鑸┖姹芥补渚垮疁锛岃繖鍦ㄤ竴瀹氱▼搴︿笂寰楀埌浜嗗讥琛ャ�傚綋鐒讹紝娑¤疆杞村彂鍔ㄦ満涔熸湁鍏朵笉瓒充箣澶勶紝瀹冨埗閫犳瘮杈冨洶闅撅紝鍒堕�犳垚鏈篃杈冮珮銆傜壒鍒槸鐢变簬鏃嬬考鐨勮浆閫熸洿浣庯紝瀹冮渶瑕佹瘮娑¤疆铻烘棆妗ㄥ彂鍔ㄦ満鏇撮噸鏇村ぇ鐨勫噺閫熼娇杞� + </p> + </div> + </div> + </div> + <!-- 86椤� --> + <div class="page-box" page="94"> + <div v-if="showPageList.indexOf(94) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">086</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 绯荤粺锛屾湁鏃跺畠鐨勮川閲忕珶鍗犲彂鍔ㄦ満鎬昏川閲忕殑涓�鍗婁互涓娿�� + </p> + <h5 id="e026" class="p-even unit2-c">锛堜簲锛夎緟鍔╁姩鍔涜缃�</h5> + <p class="p-even"> + 鍦ㄥぇ銆佷腑鍨嬮鏈轰笂鍜屽ぇ鍨嬬洿鍗囨満涓婇櫎浜嗕富寮曟搸澶栵紝杩樿鏈夋満杞借緟鍔╁姩鍔涜缃紙APU锛夈�傚畨瑁呰緟鍔╁姩鍔涜缃殑鐩殑鏄湪涓诲紩鎿庡皻鏈惎鍔ㄦ椂涓洪鏈烘彁渚涚數鍔涘拰澧炲帇绌烘皵銆傚ぇ澶氭暟椋炴満涓婄殑杈呭姪鍔ㄥ姏瑁呯疆涓嶄负椋炴満鎻愪緵鍓嶈繘鐨勫姩鍔涳紝浣嗕篃鏈夊皯閲忕殑杈呭姪鍔ㄥ姏瑁呯疆鍙互鍦ㄨ捣椋炴椂涓洪鏈烘彁渚涢檮鍔犳帹鍔涖�� + </p> + <p class="p-even"> + 椋炴満鍦ㄥ湴闈㈠拰璧烽鏃惰緟鍔╁姩鍔涜缃彁渚涚殑鐢靛姏鍜屽帇缂╃┖姘旓紝鐢ㄤ簬鍚姩鍙戝姩鏈恒�佷繚璇佸彂鍔ㄦ満鍚姩鍓嶅拰璧烽杩囩▼涓鑸卞拰椹鹃┒鑸卞唴鐨勭収鏄庡拰绌鸿皟闇�瑕侊紝浣垮彂鍔ㄦ満鐨勫姛鐜囧叏閮ㄧ敤浜庡湴闈㈠姞閫熷拰鐖崌锛屾敼鍠勪簡璧烽鎬ц兘銆傞檷钀藉悗锛岄鏈轰粛鐢辫緟鍔╁姩鍔涜缃彁渚涚數鍔涘拰绌鸿皟锛屼娇涓诲彂鍔ㄦ満鍙互鎻愭棭鍏抽棴锛屼粠鑰岃妭鐪佺噧娌癸紝闄嶄綆鏈哄満鍣0銆傞�氬父鍦ㄩ鏈虹埇鍗囧埌涓�瀹氶珮搴﹀悗灏嗚緟鍔╁姩鍔涜缃叧闂紝浣嗗湪椋炶涓綋涓诲彂鍔ㄦ満绌轰腑鍋滆溅鏃讹紝杈呭姪鍔ㄥ姏瑁呯疆鍙湪涓�瀹氱殑楂樺害锛堜竴鑸负10000m锛変互涓嬬殑楂樼┖涓強鏃跺惎鍔紝涓轰富鍙戝姩鏈洪噸鏂板惎鍔ㄦ彁渚涘姩鍔涖�� + </p> + <div class="img-float w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0098-1.jpg" /> + <p class="img">鍥�2-86 杈呭姪鍔ㄥ姏瑁呯疆鍠风</p> + </div> + <span> + <p class="p-even"> + 椋炴満鐨勮緟鍔╁姩鍔涜缃�氬父鏄竴鍙板皬鍨嬬殑鐕冩皵娑¤疆鍙戝姩鏈猴紝涓�鑸畨瑁呭湪鏈鸿韩鏈�鍚庢鐨勫熬妞庡唴锛屽湪杈呭姪鍔ㄥ姏瑁呯疆澶栫殑鏈鸿韩涓婂紑鏈夎繘姘斿彛锛屾皵浣撶洿鎺ョ敱灏炬鍚庣鐨勬帓姘斿彛鎺掑嚭銆傚儚鍏朵粬鐨勭噧姘旀丁杞彂鍔ㄦ満涓�鏍凤紝杈呭姪鍔ㄥ姏瑁呯疆鐨勪富瑕佺粨鏋勪篃鐢卞帇姘旀満銆佺噧鐑у銆佹丁杞拰鍠风锛堝浘2-86锛夋瀯鎴愩�傚鏁拌緟鍔╁姩鍔涜缃殑鍓嶇闄ゆ甯稿帇姘旀満澶栬繕瑁呮湁涓�涓悜椋炴満渚涙皵鐢ㄧ殑寮曟皵鍘嬫皵鏈猴紝瀹冨悜椋炴満鐨勫骇鑸辩幆澧冩帶鍒剁郴缁熻緭閫佸帇缂╃┖姘旓紝浠ヤ繚璇佹満鑸辩殑绌鸿皟绯荤粺宸ヤ綔鐢ㄦ皵銆傚悓鏃跺畠杩樺甫鍔ㄤ竴涓彂鐢垫満锛屽彲浠ュ悜椋炴満鐨勭數缃戣緭閫�115V鐨勪笁鐩哥數娴併�傞鏈鸿緟鍔╁姩鍔涜缃拰涓诲彂鍔ㄦ満涓�鏍凤紝涔熷繀椤绘湁涓�浜涘伐浣滅郴缁燂紝濡傜噧娌广�佹粦娌广�佸惎鍔ㄣ�佺┖姘斻�佹寚绀哄拰鎺у埗绯荤粺浠ュ強闃茬伀瑁呯疆绛夈�傝緟鍔╁姩鍔涜缃湁鑷繁鐨勫惎鍔ㄧ數鍔ㄦ満锛岀敱鍗曠嫭鐨勭數姹犱緵鐢碉紝瀹冪殑鐕冩补鏉ヨ嚜椋炴満鐨勬�荤殑鐕冩补绯荤粺銆傞鏈虹殑杈呭姪鍔ㄥ姏瑁呯疆鏄竴涓畬鏁寸殑鐙珛绯荤粺锛屽畠鐨勬帶鍒舵澘瑁呭湪椹鹃┒鍛樹笂鏂圭殑浠〃鏉夸笂銆傚畠鐨勫惎鍔ㄧ▼搴忋�佹搷绾点�佺洃鎺у強姘斾綋鐨勮緭鍑洪兘鐢辩數瀛愭帶鍒剁粍浠跺崗璋冿紝骞跺湪椹鹃┒鑸辩殑鐩稿簲浣嶇疆杩涜鏄剧ず銆� + </p> + </span> + <p class="p-even"> + 鐜颁唬鐨勫ぇ銆佷腑鍨嬪鏈轰笂锛岃緟鍔╁姩鍔涜缃槸淇濊瘉椋炴満鍦ㄥ湴闈㈠仠鏀炬椂瀹㈣埍鑸掗�傜殑蹇呰鏉′欢锛屼篃鏄负鍙戝姩鏈烘甯稿惎鍔ㄦ彁渚涘帇缂╃┖姘斻�佷繚璇佸彂鍔ㄦ満绌轰腑 + </p> + </div> + </div> + </div> + <!-- 87椤� --> + <div class="page-box" page="95"> + <div v-if="showPageList.indexOf(95) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">087</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鍋滆溅鍚庡啀娆″惎鍔ㄧ殑涓昏瑁呯疆銆傚洜姝わ紝杈呭姪鍔ㄥ姏瑁呯疆宸叉垚涓哄ぇ銆佷腑鍨嬪鏈轰笂涓�涓噸瑕佺殑銆佷笉鍙垨缂虹殑瑁呯疆銆� + </p> + <h5 id="e027" class="p-odd unit2-c"> + 锛堝叚锛夌噧姘旀丁杞彂鍔ㄦ満鐨勫悇涓郴缁� + </h5> + <p class="p-odd"> + 鐕冩皵娑¤疆鍙戝姩鏈虹殑鍚勪富瑕佹満浠舵槸浜х敓鍔ㄥ姏鐨勬牳蹇冿紝瑕佷娇鍙戝姩鏈鸿兘杩炵画鍦版甯稿伐浣滐紝骞惰兘婊¤冻鍚勭鐘舵�佷笅鐨勫伐浣滈渶瑕侊紝杩樺繀椤绘湁閰嶅鐨勫悇宸ヤ綔绯荤粺浜堜互淇濋殰銆傜噧姘旀丁杞彂鍔ㄦ満鐨勫伐浣滅郴缁熷寘鎷噧娌圭郴缁熴�佹粦娌圭郴缁熴�佺┖姘旂郴缁熴�佹帓姘旂郴缁熴�佹寚绀虹郴缁熴�佸惎鍔ㄥ拰鐐圭伀绯荤粺绛夈�� + </p> + <p class="p-odd"> + <b>鐕冩补绯荤粺锛�</b>椋炴満鍦ㄤ笉鍚岄琛岄樁娈碉紙婊戣銆佽捣椋炪�佺埇鍗囥�佸贰鑸�佷笅闄嶃�佺潃闄嗙瓑锛夐渶瑕佷笉鍚岀殑鎺ㄥ姏锛堟垨鍔熺巼锛夛紝瀵瑰簲鐫�鍙戝姩鏈轰笉鍚岀殑宸ヤ綔鐘舵�侊紝涔熷氨鏄闇�瑕佷緵缁欏彂鍔ㄦ満涓嶅悓娴侀噺鐨勭噧娌广�傚彂鍔ㄦ満鐕冩补绯荤粺鐨勫姛鐢ㄥ氨鏄繚璇佸湪鍚勭宸ヤ綔鐘舵�佷笅灏嗘竻娲佺殑銆佹棤钂告苯鐨勩�佺粡杩囧鍘嬬殑銆佽閲忓ソ鐨勭噧娌硅繛缁湴渚涚粰鍙戝姩鏈恒�傚彂鍔ㄦ満鐕冩补绯荤粺浠庨鏈虹噧娌圭郴缁熷皢鐕冩补渚涘埌鍙戝姩鏈虹殑鐕冩补娉靛紑濮嬶紝鍒扮噧娌逛粠鐕冪儳瀹ゅ柗鍢村柗鍑虹粨鏉熴�傚彂鍔ㄦ満鐕冩补绯荤粺鍒嗕负浣庡帇閮ㄥ垎鍜岄珮鍘嬮儴鍒嗐�傚湪浣庡帇閮ㄥ垎锛屼粠椋炴満鐕冩补绯荤粺鏉ョ殑鐕冩补閫氳繃娌规护鐢变綆鍘嬬噧娌规车閫佽嚦楂樺帇閮ㄥ垎鐨勭噧娌规车銆傞珮鍘嬮儴鍒嗙殑鐕冩补娉垫妸鐕冩补鍔犲帇鍚庨�佸埌鐕冩补鎺у埗瑁呯疆锛屾帶鍒惰缃劅鍙楅琛岄珮搴﹀拰椋炶閫熷害鐨勫彉鍖栵紝鏉ユ帶鍒舵祦鍚戝柗娌瑰槾鐨勭噧娌规祦閲忓拰鍘嬪姏锛屾弧瓒冲彂鍔ㄦ満涓嶅悓宸ヤ綔鐘舵�佹椂鐨勭噧娌规祦閲忛渶姹傘�� + </p> + <p class="p-odd"> + <b>婊戞补绯荤粺锛�</b>鐕冩皵娑¤疆鍙戝姩鏈哄唴鐨勯娇杞拰杞存壙閮ㄥ垎閮介渶瑕佹鼎婊戯紝婊戞补绯荤粺涓昏鐢ㄦ潵鍑忓皯鎽╂摝銆侀檷浣庣(鎹熴�佸喎鍗淬�佹竻娲併�侀槻鑵愮瓑銆傚洜涓烘粦娌瑰彲灏嗙浉瀵硅繍鍔ㄧ殑闆朵欢閲戝睘琛ㄩ潰闅斿紑锛岀敤娴佷綋鍐呴儴鎽╂摝浠f浛閲戝睘鎽╂摝銆傚惊鐜殑婊戞补鐩存帴鍚岃繍鍔ㄩ儴浠舵帴瑙︼紝鍙惛鏀跺苟甯﹁蛋閮ㄥ垎鐑噺锛屼娇鍙戝姩鏈烘満浠跺緱鍒板喎鍗淬�傜儹婊戞补鍦ㄦ粦娌规暎鐑櫒灏嗙儹閲忎紶缁欑噧娌规垨绌烘皵銆傛粦娌规补鑶滆鐩栭噾灞炶〃闈㈠彲鏈夋晥闃绘姘ф帴瑙﹂噾灞烇紝璧峰埌闃茶厫鐨勪綔鐢ㄣ�傛粦娌瑰湪鍙戝姩鏈哄唴寰幆娴佸姩鐨勮繃绋嬩腑锛屽皢纾ㄦ崯鐨勯噾灞炲睉銆佺伆灏樸�佺⒊绮掑瓙銆佹按鍒嗙瓑鏉傝川涓�璧峰甫璧帮紝骞跺湪婊戞补婊ゅ琚樆鎸′綇锛屼粠鑰岃捣鍒版竻娲佸彂鍔ㄦ満鐨勪綔鐢ㄣ�傛粦娌硅繕鍦ㄩ噾灞為浂浠朵箣闂村舰鎴愮紦鍐插眰锛岃捣闅旈渿銆佸瘑灏佷綔鐢ㄣ�傛粦娌圭郴缁熶富瑕佺敱婊戞补绠便�佹粦娌规车锛堣繘娌规车鍜屽洖娌规车锛夈�佹粦娌规护銆佹粦娌规暎鐑櫒銆佹粦娌瑰柗鍢寸瓑缁勬垚銆傛粦娌圭郴缁熶腑鐨勬粦娌规护闇�瑕佸畾鏈熸竻娲楁垨鏇存崲锛屽綋婊戞补婊よ姱琚牭濉炴椂锛屾补婊よ繘鍑哄彛鍘嬪樊澧炲ぇ锛屾粦娌规梺閫氭椿闂ㄥ皢鎵撳紑锛屾粦娌瑰氨鍙互涓嶇粡娌规护鐩存帴娴佽繃銆傛粦娌圭郴缁熺畝鍥惧鍥�2-87鎵�绀恒�� + </p> + </div> + </div> + </div> + <!-- 88椤� --> + <div class="page-box" page="96"> + <div v-if="showPageList.indexOf(96) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">088</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0100-1.jpg" /> + </p> + <p class="img">鍥�2-87 婊戞补绯荤粺绠�鍥�</p> + <p class="p-even"> + <b>绌烘皵绯荤粺锛�</b>鍙戝姩鏈虹殑绌烘皵绯荤粺鏄偅浜涘鍙戝姩鏈烘帹鍔涚殑浜х敓鏃犵洿鎺ュ奖鍝嶇殑绌烘皵娴併�傚彂鍔ㄦ満宸ヤ綔鏃朵骇鐢熷ぇ閲忕殑鐑噺锛屽鏋滀笉杩涜鍐峰嵈灏嗕細鐑у潖鍙戝姩鏈恒�傜┖姘旂郴缁熷叿鏈夊嚑椤瑰緢閲嶈鐨勫姛鑳斤紝杩欎簺鍔熻兘鍖呮嫭锛氬彂鍔ㄦ満鍐呴儴閮ㄤ欢鍜岄檮浠惰缃殑鍐峰嵈锛屽娑¤疆鐩樸�佹丁杞鍚戝彾鐗囩瓑锛岀噧鐑у涔熸槸闈犲澹佹祦杩囩殑鍐峰嵈绌烘皵娴佽繘琛屽喎鍗寸殑銆傚悓鏃讹紝绌烘皵娴佸皢杞存壙鑵斿皝涓ワ紝闃叉鍘嬫皵鏈哄枠鎸紝涓洪鏈哄悇涓埍锛堝瀹㈣埍銆侀┚椹惰埍銆佽揣鑸辩瓑锛夋彁渚涚┖璋冦�佸鍘嬪紩姘旓紝涓洪鏈虹殑鏈虹考闃插啺鎻愪緵寮曟皵銆傜┖姘旀祦浠庨鎵囥�佸帇姘旀満鐨勪腑闂寸骇鍜岄珮鍘嬬骇寮曞嚭锛屼互涓嶅悓鐨勬俯搴﹀拰鍘嬪姏婊¤冻鐗瑰畾鐨勫姛鑳借姹傘�� + </p> + <p class="p-even"> + <b>鎺掓皵绯荤粺锛�</b>鎺掓皵绯荤粺鏄皢娴佽繃鍙戝姩鏈虹殑姘斾綋浠ヤ竴瀹氱殑閫熷害鍜岄瀹氱殑鏂瑰悜鎺掑叆澶ф皵锛屾彁渚涢鏈烘墍闇�瑕佺殑鎺ㄥ姏銆傛帓姘旂郴缁熶富瑕佸寘鎷丁杞帓姘旇缃�佸弽鎺ㄨ缃拰娑堝0瑁呯疆銆傛丁杞帓姘旇缃殑涓昏閮ㄤ欢鏄帓姘斿柗绠″拰鎺掓皵閿ヤ綋锛屼负娴佽繃鍙戝姩鏈虹殑姘斾綋鎻愪緵涓�涓嚭鍙c�傝繖涓嚭鍙f彁楂樻帓姘旂殑閫熷害锛屼粠鑰屽澶у彂鍔ㄦ満鐨勬帹鍔涖�傚弽鎺ㄨ缃富瑕佺敤浜庨鏈虹潃闄嗗悗锛岄檷浣庨鏈洪�熷害锛岀缉鐭粦璺戣窛绂汇�傛墦寮�鍙嶆帹瑁呯疆鍙娇鎺掑嚭鐨勬皵娴佸亸杞�45锝�60掳锛屼娇鍙戝姩鏈轰骇鐢熶竴瀹氱殑鍙嶅悜鎺ㄥ姏銆傚湪楂樻兜閬撴瘮娑¤疆椋庢墖鍙戝姩鏈轰笂锛屽弽鎺ㄥ姏鏄皢娴佽繃椋庢墖鐨勬皵娴佸弽鍚戣�屽疄鐜扮殑锛岃繖鏄洜涓哄彂鍔ㄦ満澶ч儴鍒嗘帹鍔涙槸鐢遍鎵囦骇鐢熺殑锛屾墍浠ユ病蹇呰灏嗘祦杩囩噧鐑у鐨勭噧姘旀祦杩涜鍙嶅悜銆傜函娑¤疆鍠锋皵鍙戝姩鏈哄拰浣庢兜閬撴瘮鍙戝姩鏈轰腑锛屽櫔澹扮殑涓昏鏉ユ簮鏄熬鍠锋皵娴侊紝鍦ㄥ柗绠′笂閲囩敤鏈夋尝绾瑰舰鎴栫摚褰㈠拰澶氱褰㈢殑娑堝0鍣紝鍙湁鏁堝湴闄嶄綆鍣0銆傞珮娑甸亾姣斿彂鍔ㄦ満涓紝涓昏鍣0婧愭槸椋庢墖鍜屾丁杞紝鍚稿0鏄竴绉嶉潪甯告湁鏁堢殑鎶戝埗鍣0鐨勬妧鏈�� + </p> + <p class="p-even"> + <b>鎸囩ず绯荤粺锛�</b>鍙戝姩鏈烘寚绀虹郴缁熺殑浣滅敤鏄娇椋炶鍛樿兘鐩戞帶鍙戝姩鏈虹殑鍚勭宸� + </p> + </div> + </div> + </div> + <!-- 89椤� --> + <div class="page-box" page="97"> + <div v-if="showPageList.indexOf(97) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">089</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 浣滅姸鎬侊紝鏈夋晠闅滄椂鍙噰鍙栭�傚綋鐨勬帾鏂姐�傚叾鎵�鎸囩ず鐨勫彂鍔ㄦ満涓昏鍙傛暟鏈夊彂鍔ㄦ満澧炲帇姣斻�佹帓姘旀俯搴﹀拰楂橀�熸丁杞浆閫燂紝娆¤鍙傛暟鏈夋帹鍔涖�佹壄鐭┿�佺噧娌规俯搴﹀拰鍘嬪姏銆佹粦娌规俯搴﹀拰鍘嬪姏銆佺噧娌规祦閲忋�佹尟鍔ㄧ瓑銆傛瘡涓�椤归兘鐢变紶鎰熷櫒鎶婃祴閲忎俊鍙峰彉鎴愮數淇″彿浼犲埌椋炶鍛樹华琛ㄦ澘鐢辩浉搴旂殑浠〃鏄剧ず銆�20涓栫邯60骞翠唬浠ユ潵锛岀敱浜庣數瀛愭妧鏈殑杩涙锛岀幇浠i鏈烘妸杩欎簺鏁版嵁閮介�氳繃涓�涓數瀛愭寚绀虹郴缁熺患鍚堟樉绀哄埌涓�涓垨鍑犱釜鏄剧ず灞忎笂銆傛寚绀虹郴缁熺殑鎶ヨ閮ㄥ垎鐢ㄦ潵鎻愪緵鍙戝姩鏈哄嚭鐜版晠闅滄垨瀛樺湪鍗遍櫓鎯呭喌鏃剁殑鎸囩ず鍜屾姤璀︼紝濡傛灉鏌愪竴椤规暟鎹秴闄愶紝灏辩敤澹伴煶锛堣閾冩垨鍠囧彮锛夈�佺伅鍏夊悜椋炶鍛樻姤璀︺�傚浜庨┚椹惰埍鍐呰鏈夊彂鍔ㄦ満鎸囩ず鍜屾満缁勫憡璀︾郴缁燂紙EICAS锛夛紝浠ュ強椋炴満鐢靛瓙涓ぎ鐩戞帶绯荤粺锛圗CAM锛夌殑椋炴満锛岃繕鑳戒互鏂囧瓧鐨勬柟寮忚繘琛屽憡璀﹀強鏄剧ず鐩稿叧鐨勪俊鎭�� + </p> + <p class="p-odd"> + <b>鍚姩鍜岀偣鐏郴缁燂細</b>鍙戝姩鏈轰粠闈欐鐘舵�佽繃娓″埌宸ヤ綔鐘舵�佺殑杩囩▼绉颁负鍚姩锛屾搷绾靛彂鍔ㄦ満鍚姩绉颁负寮�杞︺�傚惎鍔ㄧ郴缁熺殑鍔熻兘鏄娇鐢ㄥ鐣屽姩鍔涘甫鍔ㄥ彂鍔ㄦ満浠ヤ竴瀹氶�熷害杞姩锛屼娇鍙戝姩鏈哄姞閫熷埌绋冲畾宸ヤ綔杞�熴�傚彂鍔ㄦ満甯哥敤鐨勫惎鍔ㄦ柟寮忔湁鐢靛姩鍚姩鍜岀┖姘斿惎鍔ㄣ�傜數鍔ㄥ惎鍔ㄦ槸浣跨敤鐩存祦鐢靛姩鏈哄仛鍔ㄥ姏锛屽埄鐢ㄨ搫鐢垫睜鎴栧湴闈㈢數婧愭彁渚涚數鑳藉疄鏂藉惎鍔紝澶氱敤浜庡皬鍨嬪彂鍔ㄦ満鍜岃緟鍔╁姩鍔涜缃殑鍚姩銆傜┖姘斿惎鍔ㄦ槸鍒╃敤鍘嬬缉绌烘皵鍚瑰姩鍚姩鏈烘丁杞珮閫熸棆杞紝甯﹀姩鍙戝姩鏈鸿浆瀛愭棆杞繘琛屽惎鍔ㄣ�傜┖姘斿惎鍔ㄧ殑姘旀簮鏉ヨ嚜鍦伴潰姘旀簮銆佽緟鍔╁姩鍔涜缃垨宸茬粡鍚姩鐨勫叾浠栧彂鍔ㄦ満銆傚洜涓虹┖姘旀丁杞惎鍔ㄦ満鍏锋湁鍚姩鍔熺巼澶с�佽川閲忓皬銆佺粨鏋勭畝鍗曘�佷娇鐢ㄦ柟渚跨殑浼樼偣锛屾墍浠ユ皯鐢ㄨ埅绌哄彂鍔ㄦ満澶у閲囩敤鐨勬槸绌烘皵鍚姩銆傜偣鐏儴鍒嗙敱鐢垫簮銆佺偣鐏縺鍔卞櫒銆佺偣鐏绾垮拰鐏姳濉炵粍鎴愩�傚彂鍔ㄦ満鍚姩鏃讹紝搴斿厛灏嗗帇姘旀満鍜屾丁杞甫鍔ㄦ棆杞埌涓�瀹氱殑杞�燂紝杩欐椂閫傞噺鐨勭┖姘旇繘鍏ョ噧鐑у鍚屽柗鍢村柗鍑虹殑鐕冩补鐩告贩鍚堬紝鐒跺悗鐢辫鍦ㄧ噧鐑у鐨勭伀鑺卞灏嗙噧鐑у涓殑鐕冩补鐐圭噧銆傚彂鍔ㄦ満鍚姩鏈熼棿锛岃繖浜涚郴缁熷繀椤绘寜鐓т竴瀹氱殑绋嬪簭鍚屾椂杩涜宸ヤ綔銆� + </p> + <h4 id="d029" class="p-odd unit2-c">涓夈�佸彂鍔ㄦ満鐨勬�ц兘</h4> + <p class="p-odd"> + 鍙戝姩鏈虹殑鎬ц兘涓昏鍖呮嫭鍙戝姩鏈虹殑鍔ㄥ姏鎬с�佺粡娴庢�с�佽交閲忓寲鍜岀幆澧冩寚鏍囩瓑鏂归潰鐨勫唴瀹广�� + </p> + <p class="p-odd"> + 鍔ㄥ姏鎬ф槸鍙戝姩鏈哄澶栧仛鍔熻兘鍔涚殑鎸囨爣銆傚彂鍔ㄦ満鏈�涓昏鐨勪綔鐢ㄦ槸涓洪鏈烘彁渚涘姩鍔涳紝瀹冩彁渚涚殑鍔ㄥ姏鏈変袱绉嶅舰寮忥紝濡傛椿濉炲紡鍙戝姩鏈恒�佹丁杞灪鏃嬫〃鍙戝姩鏈恒�佹丁杞酱鍙戝姩鏈猴紝瀹冧滑閫氳繃杞寸殑鏃嬭浆杈撳嚭杞村姛鐜囦綔涓哄姩鍔涙�ф寚鏍囷紝姝ゆ椂 + </p> + </div> + </div> + </div> + <!-- 90椤� --> + <div class="page-box" page="98"> + <div v-if="showPageList.indexOf(98) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">090</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鍔熺巼鐨勫崟浣嶇敤鍗冪摝鎴栭┈鍔涖�傚彟澶栵紝瀵逛簬娑¤疆鍠锋皵鍙戝姩鏈哄拰娑¤疆椋庢墖鍙戝姩鏈猴紝瀹冧滑鏃㈡槸鐑満鍙堟槸鎺ㄨ繘鍣紝浠ユ帹鍔涚殑澶у皬鏉ヨ〃绀哄姩鍔涙�э紝鎺ㄥ姏鐨勫崟浣嶇敤鍗冪墰鎴栫锛堝姏锛夛紝涔熸椂甯哥敤鍒板崈鍏嬪姏杩欐牱鐨勫崟浣嶃�� + </p> + <p class="p-even"> + 鍙戝姩鏈虹殑缁忔祹鎬ф寚鏍囩敤鐕冩补娑堣�楃巼鏉ヨ〃绀猴紝浜х敓鍗曚綅鎺ㄥ姏锛堟垨鍔熺巼锛夋瘡灏忔椂鎵�娑堣�楃殑鐕冩补璐ㄩ噺涓哄彂鍔ㄦ満鐨勭噧娌规秷鑰楃巼銆傝繖涓寚鏍囪秺浣庯紝璇存槑椋炴満浜х敓鍚屾牱鐨勬帹鍔涙垨鍔熺巼娑堣�楃殑娌归噺瓒婂皯锛屼篃灏辨槸璇寸敤鍚屾牱鐨勭噧鏂欏彲浠ヤ娇鍙戝姩鏈哄伐浣滄洿闀跨殑鏃堕棿銆侀鏈洪琛屾洿杩滅殑璺濈銆傜噧鏂欐秷鑰楃巼鏄鏈虹粡娴庢�х殑涓昏鎸囨爣锛屽湪娉ㄩ噸缁忔祹鎬х殑姘戣埅棰嗗煙鍐咃紝瀹冩槸椋炴満鍒堕�犲晢銆佽埅绌哄叕鍙搁�夋嫨鍙戝姩鏈恒�侀�夋嫨椋炴満鐨勪竴椤归噸瑕佺殑鎬ц兘鎸囨爣銆� + </p> + <p class="p-even"> + 鍙戝姩鏈虹殑杞婚噺鍖栨槸瑕佹眰鍙戝姩鏈虹殑璐ㄩ噺瑕佸皬锛岃川閲忓皬鐨勫彂鍔ㄦ満鍙互鎶婄渷涓嬫潵鐨勮川閲忕敤鏉ヨ璐熻浇鎴栫噧娌癸紝浠庤�屽姞澶ч鏈虹殑杩愯浇鑳藉姏鎴栧欢闀胯埅绋嬨�傚湪閫夋嫨鍙戝姩鏈烘椂锛屼竴鑸姹傚彂鍔ㄦ満鍦ㄤ繚璇佽冻澶熷ぇ鐨勫姛鐜囨椂鑷噸灏藉彲鑳藉湴杞汇�傝 閲忓彂鍔ㄦ満鍔熺巼鍜岃川閲忕殑鏍囧噯鏄�滃姛鐜囪川閲忔瘮鈥濇垨鈥滄帹璐ㄦ瘮鈥濓紝鍗冲彂鍔ㄦ満鎵�鑳芥彁渚涚殑鍔熺巼鎴栨帹鍔涗笌鍙戝姩鏈鸿嚜韬川閲忎箣姣斿�笺�傚姛鐜囪川閲忔瘮鎴栨帹璐ㄦ瘮瓒婂ぇ锛岃〃绀哄湪鎻愪緵鐩稿悓鍔熺巼鎴栨帹鍔涚殑鎯呭喌涓嬶紝鍙戝姩鏈鸿川閲忚秺灏忋�傞珮鎬ц兘鐨勫姞鍔涙丁杞鎵囧彂鍔ㄦ満鐨勬帹璐ㄦ瘮杈惧埌15銆� + </p> + <p class="p-even"> + 鐜鎸囨爣涓昏鎸囧彂鍔ㄦ満鎺掓皵鍝佽川鍜屽櫔澹版按骞炽�傜敱浜庡畠鍏崇郴鍒颁汉绫荤殑鍋ュ悍鍙婁汉绫昏禆浠ョ敓瀛樼殑鐜锛屽洜姝ゅ悇鍥芥斂搴滈兘鍒跺畾鍑轰弗鏍肩殑鎺у埗娉曡锛屼互鏈熷噺灏戝彂鍔ㄦ満鎺掓皵鍜屽櫔澹板鐜鐨勬薄鏌撱�傛帓鏀炬寚鏍囧拰鍣0姘村钩宸叉垚涓哄彂鍔ㄦ満鐨勯噸瑕佹�ц兘鎸囨爣銆傛帓鏀炬寚鏍囦富瑕佹槸鎸囦粠鍙戝姩鏈烘补绠便�佹洸杞寸鎺掑嚭鐨勬皵浣撳拰浠庢苯缂搞�佸柗绠℃帓鍑虹殑搴熸皵涓墍鍚殑鏈夊鎺掓斁鐗╃殑閲忋�� + </p> + <h4 id="d030" class="p-even unit2-c">鍥涖�佸彂鍔ㄦ満鍦ㄩ鏈轰笂鐨勫畨瑁�</h4> + <p class="p-even"> + 涓嶅悓绫诲瀷椋炴満锛屽叾鍙戝姩鏈哄畨瑁呬綅缃篃涓嶅悓锛屾湁鐨勫湪鏈鸿韩涓や晶锛屾湁鐨勫湪鏈虹考鍐咃紝鏈夌殑鍦ㄦ満缈间笅鏂广�傚彂鍔ㄦ満鐨勪綅缃笌椋炴満鐨勭绫汇�佺敤閫斻�佹皵鍔ㄥ竷灞�銆佺粨鏋勩�佽川閲忋�侀噸蹇冨钩琛$瓑澶氱鍥犵礌鏈夊叧锛岃�屼笖杩樿鑰冭檻鍒板畨鍏ㄦ�у拰鏄撶淮鎶ゆ�с�� + </p> + <p class="p-even"> + 瀵逛簬鐢辫灪鏃嬫〃鎺ㄨ繘鐨勯鏈哄彂鍔ㄦ満锛岀粷澶у鏁拌鍦ㄦ満韬殑鍓嶆鍜屾満缈间笂銆傚彧鏈変竴鍙版椿濉炲紡鍙戝姩鏈虹殑椋炴満锛屽彂鍔ㄦ満澶у瑁呭湪鏈哄ご閮ㄤ綅銆傚鍙板彂鍔ㄦ満鐨勮灪鏃嬫〃椋炴満鐨勫彂鍔ㄦ満閮藉绉板湴瀹夎鍦ㄤ袱渚х殑鏈虹考涓婏紙鍥�2-88锛夈�� + </p> + <p class="p-even"> + 浠ュ柗姘旀帹杩涚殑姘戣埅椋炴満鐨勫彂鍔ㄦ満瀹夎甯冨眬浠庨鏈哄褰笂渚垮彲涓�鐩簡 + </p> + </div> + </div> + </div> + <!-- 91椤� --> + <div class="page-box" page="99"> + <div v-if="showPageList.indexOf(99) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">091</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鐒讹紝涓昏鏈夌考鏍瑰彂鍔ㄦ満甯冨眬銆佺考鍚婂彂鍔ㄦ満甯冨眬銆佸熬鍚婂彂鍔ㄦ満甯冨眬銆佺考鍚婂熬鍚婄患鍚堝竷灞�瀹夎褰㈠紡銆備笉鍚岀殑瀹夎浣嶇疆鍚勬湁鍒╁紛銆� + </p> + <p class="p-odd"> + 缈兼牴鍙戝姩鏈哄竷灞�鏄皢鍙戝姩鏈哄畨瑁呭湪鏈虹考鏍归儴鐨勭煭鑸卞唴锛堝浘2-89锛夈�傝繖绉嶅畨瑁呭舰寮忕殑浼樼偣鏄細鍙戝姩鏈鸿瀺鍚堝湪鏈虹考缁撴瀯涓紝杩庨闈㈢Н鏈�灏忥紝绂绘満韬酱绾挎渶杩戯紝涓�鏃﹀湪绌轰腑椋炶鏃朵竴鍙板彂鍔ㄦ満鍋滆溅锛屾帹鍔涗笉瀵圭О閫犳垚鐨勫亸杞姏鐭╁皬锛屼究浜庨琛屽憳鎿嶇旱銆傚湪鍠锋皵寮忓彂鍔ㄦ満鎺ㄥ姏鍜屽彲闈犳�ч兘涓嶈冻鐨勬棭鏈燂紝杩欑甯冨眬鏄悎鐞嗙殑銆傚畠鐨勭己鐐规槸鏈鸿韩鍜屾満缈肩粨鏋勭殑瀹屾暣鎬ц鐮村潖锛屼互鍙婂鑸辩鍙戝姩鏈哄お杩戣�屽鑷村櫔澹板拰鎸姩澶ぇ銆傜幇浠e鏈轰笂宸茬粡涓嶇敤杩欑鍙戝姩鏈哄竷灞�浜嗐�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0099-01.jpg" /> + <p class="img">鍥�2-88 铻烘棆妗ㄩ鏈虹殑鍙戝姩鏈哄畨瑁�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0099-02.jpg" /> + <p class="img">鍥�2-88 铻烘棆妗ㄩ鏈虹殑鍙戝姩鏈哄畨瑁�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="center openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0103-2.jpg" /> + </p> + <p class="img">鍥�2-89 缈兼牴鍙戝姩鏈哄竷灞�</p> + <p class="p-odd"> + 缈煎悐鍙戝姩鏈哄竷灞�鏄皢鍙戝姩鏈哄畨瑁呭湪鏈虹考涓嬬殑鍙戝姩鏈哄悐鑸变腑锛堝浘2-90锛夛紝缈间笅鍚婃寕鍙戝姩鏈哄凡鎴愪负澶у瀷鍠锋皵寮忓鏈虹殑涓昏瀹夎褰㈠紡銆� + </p> + <p class="p-odd">缈煎悐鍙戝姩鏈哄竷灞�鐨勪紭鐐逛富瑕佹湁鍏釜銆�</p> + <p class="p-odd"> + 绗竴锛岀敱浜庡彂鍔ㄦ満鐨勯噸鍔涘悜涓嬶紝鍙互涓庢満缈煎悜涓婄殑閮ㄥ垎鍗囧姏鎶垫秷锛屼娇鏈虹考浠ュ強鏈虹考涓庢満韬繛鎺ュ鍙楀姏鍑忓皬锛岀粨鏋勯噸閲忓噺杞伙紝杩欏氨鏄墍璋撶考涓嬪彂鍔ㄦ満鐨勨�滃嵏杞解�濅綔鐢ㄣ�� + </p> + <p class="p-odd"> + 绗簩锛岀敱浜庡彂鍔ㄦ満鍚婅埍鐨勫墠缂橀鍏堜簬鏈虹考鍓嶇紭锛屽彲浠ヤ繚璇佸彂鍔ㄦ満杩涙皵閬撳鍦ㄦ湭鍙楁満缈煎奖鍝嶇殑姘旀祦鍦轰腑锛屽洜姝ゅ彂鍔ㄦ満鐨勮繘姘斾笉鍙楀共鎵般�� + </p> + <p class="p-odd">绗笁锛屽贰鑸琛屾椂闃诲姏寰堝皬銆�</p> + <p class="p-odd"> + 绗洓锛屽洜涓哄彂鍔ㄦ満杩滅鏈鸿韩锛屽張鏈夋満缈奸伄鎸★紝鍣0褰卞搷灏忋�� + </p> + <p class="p-odd"> + 绗簲锛岀考涓嬪悐鎸傚彂鍔ㄦ満鐨勭鍦伴珮搴﹁緝灏忥紝缁翠慨姣旇緝瀹规槗銆� + </p> + <p class="p-odd"> + 绗叚锛屽湪绌洪棿瀹硅鐨勬儏鍐典笅锛岀考涓嬪彂鍔ㄦ満鑸卞彲浠ユ瘮杈冨鏄撳湴鍦ㄤ笉鍚屽瀷鍙峰彂鍔ㄦ満涔嬮棿鏇存崲锛屼负椋炴満涓嶆柇鍒╃敤鏈�鏂扮鎶�鎴愭灉鍒涢�犱簡鏉′欢銆傝繖瀵瑰ぇ鍨嬮鏈哄挨鍏堕噸瑕侊紝瀹硅鑸┖鍏徃鍦ㄤ笉鍚岀殑鍙戝姩鏈哄叕鍙镐箣闂磋繘琛岄�夋嫨銆� + </p> + <p class="p-odd">缈煎悐鍙戝姩鏈哄竷灞�鐨勭己鐐逛富瑕佹湁涓や釜銆�</p> + </div> + </div> + </div> + <!-- 92椤� --> + <div class="page-box" page="100"> + <div v-if="showPageList.indexOf(100) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">092</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 绗竴锛岀敱浜庡彂鍔ㄦ満杩滅鏈鸿韩杞寸嚎锛岄琛屼腑濡傛灉鏈変竴鍙板彂鍔ㄦ満鍋滆溅锛屽椋炴満褰㈡垚鐨勫亸杞姏鐭╁ぇ锛岄鏈虹殑鏂瑰悜鎺у埗姣旇緝鍥伴毦銆� + </p> + <p class="p-even"> + 绗簩锛屽彂鍔ㄦ満绂诲湴闈㈣繎锛屽鏄撳惛鍏ュ湴闈㈡潅鐗╋紝鎹熷潖鍙戝姩鏈猴紝閫犳垚鍗遍櫓銆� + </p> + <p class="p-even"> + 灏惧悐鍙戝姩鏈哄竷灞�鏄皢鍙戝姩鏈哄畨瑁呭湪鏈鸿韩灏鹃儴澶栦晶鐨勬寕鑸卞唴锛堝浘2-91锛夈�傝繖鏍峰彂鍔ㄦ満鏃㈣繙绂绘梾瀹㈠張绱ч潬鏈鸿韩锛屽熬鍚婂彂鍔ㄦ満甯冨眬琚害閬撻鏈哄拰涓�浜涙敮绾垮鏈哄箍娉涢噰鐢ㄣ�傚畠鐨勪紭鐐规槸锛氬鑸卞唴鐨勫櫔澹板皬锛屽崟鍙戝仠杞︽椂鍋忚浆鍔涚煩灏忥紝鏈虹考璁捐绠�鍗曘�佸鏄擄紝鍙互瀹夎濂囨暟涓彂鍔ㄦ満銆傚熬鍚婂彂鍔ㄦ満甯冨眬鐨勭己鐐规槸锛氬拰缈煎悐鍙戝姩鏈哄竷灞�姣旂粨鏋勯噸閲忚緝澶э紱鐢变簬鏈鸿韩鐨勪竴閮ㄥ垎琚崰鐢紝鍥犺�屾満韬暱搴﹂暱锛涙満灏惧彂鍔ㄦ満鍗犲幓浜嗗钩灏剧殑鍦版柟锛屽苟涓斿彂鍔ㄦ満鍠锋皵娴佸鏄撳奖鍝嶅埌骞冲熬锛屼竴鑸姹傞噰鐢ㄩ珮骞冲熬锛岃繖鏍峰瀭灏剧殑缁撴瀯灏遍渶瑕佸姞寮猴紝骞冲熬鐨勬帶鍒舵満鏋勯渶瑕侀�氳繃鍨傚熬鍐呴儴锛屽叾澶嶆潅鎬у拰璐ㄩ噺閮芥湁鎵�澧炲姞锛涢鏈虹殑閲嶅績闈犲悗锛屽洜鑰屽鑷存満缈煎悗绉汇�� + </p> + <p class="p-even"> + 缈煎悐灏惧悐缁煎悎甯冨眬锛堟贩鍚堝竷灞�锛夛細缈煎悐鍜屽熬鍚婂彂鍔ㄦ満甯冨眬鍙互娣峰悎锛岀考涓嬪悐鎸備袱鍙板彂鍔ㄦ満锛屽瀭灏剧考鏍规垨鏈哄熬鏈鸿韩鍐呭啀瀹夋帓绗笁鍙板彂鍔ㄦ満锛堝浘2-92锛夈�傜考鍚婂熬鍚婄患鍚堝竷灞�鐨勭壒鐐逛粙浜庣考鍚婂拰灏惧悐鍙戝姩鏈哄竷灞�涔嬮棿銆侱C-10鍙婂叾鍚庣户鑰匨D-11灏辨槸缈间笅鍔犳満灏炬贩鍚堜笁鍙戯紝鍏锋湁缈煎悐鍙戝姩鏈哄竷灞�瀹规槗缁翠慨鍜屽噺杞绘満缈煎彈鍔涚殑浼樼偣锛岃繕鍏锋湁灏惧悐鍙戝姩鏈哄竷灞�甯冪疆鍦ㄥ瀭灏剧考鏍广�佹皵鍔ㄦ崯澶卞皬鐨勪紭鐐癸紝涔熷叿鏈夊熬鍚婂彂鍔ㄦ満涓嶆槗鏇存崲銆佸熬缈肩粨鏋勯噸閲忓拰澶嶆潅鎬у鍔犵殑缂虹偣銆侱C-10鍜孧D-11杩欎袱绉嶅瀷鍙烽鏈哄熬閮ㄥ彂鍔ㄦ満杩樼暐寰悜涓嬪�炬枩锛屽彲浠ユ彁渚涗竴鐐圭洿鎺ュ崌鍔涳紝闄嶄綆瀵规満缈肩殑鍗囧姏瑕佹眰銆� + </p> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0104-1.jpg" /> + </p> + <p class="img">鍥�2-90 缈煎悐鍙戝姩鏈哄竷灞�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0104-2.jpg" /> + </p> + <p class="img">鍥�2-91 灏惧悐鍙戝姩鏈哄竷灞�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0104-2.jpg" /> + </p> + <p class="img">鍥�2-92 缈煎悐灏惧悐缁煎悎甯冨眬</p> + </span> + </div> + </div> + </div> + </div> + <!-- 93椤� --> + <div class="page-box" page="101"> + <div v-if="showPageList.indexOf(101) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">093</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-odd unit2-c"> + 瀛︿範浠诲姟浜�<br />璁よ瘑椋炴満鐨勪华琛ㄨ澶� + </h3> + <div class="task-u2-c"></div> + <p class="p-odd"> + 浼楁墍鍛ㄧ煡锛岄鏈烘槸鐩墠鏈�蹇嵎鐨勪氦閫氳繍杈撳伐鍏凤紝浣嗗緢澶氭梾瀹笂浜嗛鏈猴紝鍦ㄩ琛屼腑鏍规湰鎰熻涓嶅埌椋炴満鐨勯�熷害锛屾湜鍚戠獥澶栵紝椋炴満濂戒技涓�鍔ㄤ笉鍔ㄥ湴鎮湪绌轰腑銆傚線涓嬬湅锛屽彧瑙夊緱椋炴満鏈変竴瀹氶珮搴︼紝鍏蜂綋鏈夊楂樺嵈鐪嬩笉鍑烘潵锛屽湪楂樺害杈冧綆鏃讹紝鍜屽懆鍥寸殑闅滅鐗╂瘮杈冿紝鏃呭杩樺線寰�浜х敓瑙嗚鍋忓樊锛岄敊璇湴鍒ゆ柇楂樺害銆傚鏋滃湪澶滈棿鎴栧湪浜戜腑椋炶锛岄鏈虹殑濮挎�佷篃涓嶅ソ鍒ゆ柇鈥︹�﹁�岄鏈虹殑椋炶閫熷害銆侀珮搴︺�佸Э鎬併�佽埅鍚戠瓑涓庨琛屽畨鍏ㄥ拰浠诲姟鐨勫畬鎴愬瘑鍒囩浉鍏筹紝椋炶鍛樺繀椤诲�熷姪涓�浜涜澶囨潵鍒ゆ柇椋炴満鐨勫悇绉嶈繍鍔ㄥ弬鏁帮紝杩欎簺璁惧鎴戜滑绉颁负鑸┖浠〃銆� + </p> + <p class="p-odd"> + 鑸┖浠〃鐨勪綔鐢ㄦ槸鎰熺煡澶栭儴鎯呭喌锛屾彁渚涢琛屽弬鏁板拰椋炴満涓婂悇绯荤粺宸ヤ綔鎯呭喌淇℃伅锛屼负椋炶鍛樻搷绾甸鏈烘彁渚涗緷鎹�傚悓鏃讹紝鑸┖浠〃鍙嶆槧椋炴満瀵归琛屽憳鎿嶇旱鍋氬嚭鍙嶅簲鐨勭粨鏋滐紝甯姪椋炶鍛樺疄鏂界簿纭搷绾碉紝鍫О椋炴満鐨勨�滅缁忕郴缁熲�濄�� + </p> + <p class="p-odd"> + 鑸┖浠〃闅忕潃椋炴満鐨勫彂灞曡�屽彂灞曘�傛棭鏈熼鏈轰笂鐨勪华琛ㄩ潪甯哥畝鍗曪紝鑾辩壒鍏勫紵鐨勨�滈琛岃�呬竴鍙封�濅笂闈㈠彧鏈変竴鍧楃琛ㄣ�佷竴涓閫熻〃鍜屽彂鍔ㄦ満杞�熻〃銆備箣鍚庝竴娈垫椂闂撮噷锛岄鏈轰娇鐢ㄧ殑浠〃涔熼潪甯哥畝闄嬶紝骞朵笖杩欎簺浠〃鏄湴闈㈡満姊拌澶囦笂鐨勪华琛紝娌℃湁鑸┖涓撶敤浠〃銆傚洜姝わ紝鏃╂湡鐨勯鏈哄彧鑳戒緷闈犺倝鐪艰瀵燂紝鍦ㄦ皵璞℃潯浠惰鍙殑鎯呭喌涓嬭繘琛岀洰瑙嗛琛屻�� + </p> + <p class="p-odd"> + 绗竴娆′笘鐣屽ぇ鎴樹績杩涗簡椋炴満鐨勫彂灞曪紝涔熶績杩涗簡鑸┖浠〃鐨勫彂灞曘�傛垬浜夋湡闂村嚭鐜颁簡鑸┖涓撶敤浠〃锛�1916骞达紝鑻卞浗鐨囧绌哄啗鐨凷.E.5鍨嬮鏈哄畨瑁呮湁4绉嶅彂鍔ㄦ満浠〃鍜�3绉嶉琛屼华琛ㄣ��1927骞达紝缇庡浗浜烘灄鐧介┚鏈烘垚鍔熼瓒婂ぇ瑗挎磱锛屾垚灏变簡浜虹被绗竴娆¤法娲嬮琛屻�備粬鐨勯鏈轰笂瑁呭浜嗙綏鐩樸�佸�炬枩鍜屼刊浠拌鎸囩ず鍣ㄣ�佽浆寮华绛変华琛ㄣ��1929骞�9鏈堬紝缇庡浗浜烘潨绔嬬壒鍑�熻埅绌轰华琛ㄥ拰鏃犵嚎鐢靛鑸澶囧畬鎴愪簡浜虹被鐨勯娆′华琛ㄩ琛岋紝寮�鍒涗簡鑸┖浠〃鍙戝睍鐨勬柊闃舵銆� + </p> + <p class="p-odd"> + 浠�20涓栫邯30骞翠唬寮�濮嬶紝璁稿椋炴満瀹夎浜嗚緝瀹屽鐨勮埅绌轰华琛ㄣ�傞琛屽憳瀹屽叏鍙互鍑�熶华琛ㄨ繘琛屽闂村拰浜戜腑椋炶锛屼娇椋炶瀵瑰ぉ姘旂殑渚濊禆绋嬪害澶уぇ闄嶄綆銆傜浜屾涓栫晫澶ф垬鏈熼棿锛屽嚭鐜颁簡缁煎悎浠〃锛屽皢浠ュ墠鍑犱釜浠〃鎸囩ず鐨勬暟鎹� + </p> + </div> + </div> + </div> + <!-- 94椤� --> + <div class="page-box" page="102"> + <div v-if="showPageList.indexOf(102) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">094</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0106-1.jpg" /> + <p class="img">鍥�2-93 C919椹鹃┒鑸�</p> + </div> + <span> + <p class="p-even td-0"> + 鐢ㄤ竴涓华琛ㄦ樉绀哄嚭鏉ワ紝浣块鏈轰华琛ㄦ澘甯冪疆鏇村姞绠�娲侊紝椋炶鍛樻敞鎰忓姏鍒嗛厤鏇存柟渚裤��20涓栫邯鍏竷鍗佸勾浠o紝闅忕潃鐢靛瓙鎶�鏈�佸井鐢靛瓙鎶�鏈殑鍙戝睍锛屾満杞借绠楁満寰楀埌浜嗗箍娉涘簲鐢紝鑸┖浠〃涔熸湞鏁板瓧鍖栥�佸皬鍨嬪寲銆佺患鍚堝寲鏂瑰悜鍙戝睍锛岃鑸┖浠〃杩涘叆浜嗕竴涓柊鐨勫彂灞曢樁娈点�傜幇浠f皯鐢ㄩ鏈烘櫘閬嶄娇鐢ㄧ數瀛愮患鍚堟樉绀轰华锛屽皢甯哥敤鐨勯琛屼俊鎭敤涓�鍧楀钩瑙嗘樉绀哄櫒鏄剧ず鍑烘潵锛屼娇椋炴満椹鹃┒鑸变华琛ㄦ澘鏇村姞绠�娲併�傚浘2-93鎵�绀轰负C919椹鹃┒鑸便�� + </p> + </span> + <p class="p-even"> + 鑸┖浠〃鎸変綔鐢ㄥ彲鍒嗕负椋炶浠〃銆佸鑸华琛ㄣ�佸彂鍔ㄦ満浠〃鍜岀郴缁熺姸鎬佷华琛ㄥ洓澶х被锛屾湰浠诲姟涓昏浠嬬粛鎸囩ず椋炴満杩愬姩鍙傛暟鐨勯琛屼华琛ㄥ拰鐢ㄤ簬瀵艰埅鐨勫鑸华琛ㄣ�傞琛屼华琛ㄥ拰瀵艰埅浠〃閮界粡鍘嗕簡鏈烘寮忎华琛ㄥ埌鐢靛瓙缁煎悎浠〃鐨勫彂灞曡繃绋嬶紝瀵艰埅浠〃杩樹娇鐢ㄤ簡寰堝鏃犵嚎鐢垫妧鏈�備絾鏃犺鐜板湪鐨勭數瀛愮患鍚堜华琛ㄥ涔堢洿瑙傛柟渚匡紝鍏舵寚绀轰俊鎭殑鏉ユ簮鍜岄噰闆嗘柟寮忛兘鍜屾満姊板紡浠〃鐩稿悓銆備负渚夸簬鐞嗚В浠〃鎸囩ず鍘熺悊锛屾湰浠诲姟涓昏浠嬬粛鏈烘寮忎华琛ㄣ�� + </p> + <p class="p-even"> + 鏈烘寮忎华琛ㄥ彲鍒嗘垚鏍规嵁姘斿帇鎸囩ず鐨勬皵鍘嬪紡浠〃銆佷緷闈犻檧铻烘寚绀虹殑闄�铻轰华琛ㄥ拰渚濋潬纾佸満鎸囩ず鐨勮埅鍚戜华琛ㄤ笁澶х被銆� + </p> + <div class="pdf-text"> + <div class="pdf-con"> + <div class="pdf-view"> + <span> + <svg t="1717640665152" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="11009" width="25.098" height="24.098"> + <path + d="M896.152 336.108l0 576.229c0 26.511-21.508 48.019-48.018 48.019L175.866 960.356c-26.511 0-48.019-21.508-48.019-48.019L127.847 112.019c0-26.511 21.508-48.019 48.019-48.019l448.179 0c26.512 0 63.527 15.508 82.031 34.013l156.064 156.064C880.645 272.582 896.152 309.597 896.152 336.108zM832.127 384.127 624.045 384.127c-26.512 0-48.02-21.508-48.02-48.019L576.025 128.025 191.873 128.025l0 768.306 640.254 0L832.127 384.127zM335.93 448.153l352.14 0c9.004 0 16.006 7.003 16.006 16.006l0 32.013c0 9.003-7.002 16.007-16.006 16.007L335.93 512.179c-9.003 0-16.006-7.003-16.006-16.007l0-32.013C319.924 455.156 326.927 448.153 335.93 448.153zM704.076 592.21l0 32.013c0 9.004-7.002 16.007-16.006 16.007L335.93 640.23c-9.003 0-16.006-7.003-16.006-16.007L319.924 592.21c0-9.003 7.003-16.006 16.006-16.006l352.14 0C697.074 576.204 704.076 583.207 704.076 592.21zM704.076 720.262l0 32.013c0 9.003-7.002 16.006-16.006 16.006L335.93 768.281c-9.003 0-16.006-7.003-16.006-16.006l0-32.013c0-9.004 7.003-16.007 16.006-16.007l352.14 0C697.074 704.255 704.076 711.258 704.076 720.262zM640.051 320.102l188.076 0c-3.002-8.505-7.502-17.009-11.002-20.511L660.563 143.029c-3.502-3.501-12.006-8-20.512-11.003L640.051 320.102z" + p-id="11010"></path> + </svg> + </span> + <span @click="toUrl(2)">{{ chapter002.pdfMd5[2].name }}.pdf</span> + </div> + </div> + </div> + <h4 id="d031" class="p-even unit2-c">鈥斻�佹皵鍘嬪紡浠〃</h4> + <p class="p-even"> + 姘斿帇寮忎华琛ㄥ埄鐢ㄩ鏈哄湪椋炶涓祴寰楃殑姘斿帇鏁版嵁鏉ユ寚绀洪琛屽弬鏁帮紝瀹冪殑鏍稿績閮ㄥ垎鏄竴涓噾灞炶啘鐩掋�傛牴鎹皵鍘嬬殑鍙樺寲锛岃繖涓噾灞炶啘鐩掍細鑶ㄨ儉鎴栨敹缂╋紝甯﹀姩鎸囬拡鍦ㄤ华琛ㄤ笂鎸囩ず鍑虹浉搴旂殑鏁版嵁銆傚父鐢ㄧ殑姘斿帇寮忎华琛ㄦ湁楂樺害琛ㄣ�佺┖閫熻〃鍜屽崌闄嶉�熷害琛ㄣ�� + </p> + <h5 id="e028" class="p-even unit2-c">锛堜竴锛夐珮搴﹁〃</h5> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0106-3.jpg" /> + <p class="img">鍥�2-94 姘斿帇寮忛珮搴﹁〃鍘熺悊</p> + </div> + <span> + <p class="p-even"> + 椋炴満涓婄殑楂樺害琛ㄤ富瑕佹湁姘斿帇寮忛珮搴﹁〃鍜屾棤绾跨數楂樺害琛ㄤ袱绉嶃�傞�氬父鎵�璇寸殑楂樺害琛ㄦ槸鎸囨皵鍘嬪紡楂樺害琛紝鍏跺師鐞嗗鍥�2-94鎵�绀猴紝鏃犵嚎鐢甸珮搴﹁〃灏嗗湪鍚庨潰浠嬬粛銆� + </p> + <p class="p-even"> + 楂樺害琛ㄦ槸鏍规嵁澶ф皵鍘嬮殢楂樺害涓婂崌鍛堢嚎鎬т笅闄嶇殑鍘熺悊鏉ユ寚绀洪珮搴︾殑銆傚彧瑕佹祴鍑烘煇涓�楂樺害鐨勬皵鍘嬪�硷紝灏卞彲浠ユ崲绠楀嚭楂樺害鍊笺�傞珮搴﹁〃鍐呮湁涓�涓瘑闂殑閲戝睘鑶滅洅 , + </p> + </span> + </div> + </div> + </div> + <!-- 95椤� --> + <div class="page-box" page="103"> + <div v-if="showPageList.indexOf(103) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">095</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鑶滅洅澶栭�氬ぇ姘斿帇锛堥潤鍘嬶級銆傚綋椋炴満楂樺害鍗囬珮鏃讹紝澶栫晫姘斿帇闄嶄綆锛岄噾灞炶啘鐩掕啫鑳�锛屾帹鍔ㄦ寚閽堟棆杞紝鍒诲害鐩樹笂鎸変竴瀹氱殑姣斾緥鍒讳笂鏁板�硷紝鎸囩ず鍑烘潵鐨勮鏁板氨鏄鏈虹殑楂樺害銆傞鏈洪檷浣庨珮搴︽椂锛屼笌澶栫晫杩為�氱殑閲戝睘鑶滅洅澶栫殑姘斿帇鍗囬珮锛岄噾灞炶啘鐩掑皢琚帇缂╋紝甯﹀姩鎸囬拡寰�涓嬫寚锛屾寚绀哄嚭鐨勮鏁伴檷浣庛�傞珮搴﹂�氬父浠ョ背鎴栬嫳灏轰负鍗曚綅銆� + </p> + <div class="img-rights w395 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0107-1.jpg" /> + <p class="img">鍥�2-95 楂樺害琛�</p> + </div> + <span> + <p class="p-odd"> + 甯哥敤鐨勯珮搴﹁〃锛堝浘2-95锛変竴鑸湁鍐呭涓ゅ湀鍒诲害锛岀被浼间簬鏃堕挓鐨勪袱鏍规寚閽堚�斺�旀椂閽堜笌鍒嗛拡銆傜煭閽堟寚绀哄唴鍦堝埢搴︼紝姣忎竴鏍艰〃绀�1000m锛堟垨ft锛夛紱闀块拡鎸囩ず澶栧湀鍒诲害锛屾瘡涓暟瀛楄〃绀�100m锛堟垨ft锛夈�傝〃鐩樹笅鏂规湁涓�涓皟鑺傛棆閽紝鍙互璋冭妭鎸囬拡鏃嬭浆锛岀敤浜庡湪璧烽鍓嶅皢楂樺害琛ㄢ�滆皟闆垛�濄�佸湪椋炶涓皟鏁村埌涓嶅悓鐨勫熀鍑嗛潰绛夈�� + </p> + </span> + <p class="p-odd"> + 骞虫椂鎵�璇寸殑楂樺害锛屾槸鎸囬鏈烘墍鍦ㄧ殑姘村钩闈笌棰勫厛閫夊畾鐨勫熀鍑嗛潰锛堝弬鐓х墿锛変箣闂寸殑楂樺害宸�傚鏋滈�夋嫨鐨勫熀鍑嗛潰涓嶅悓锛岄鏈哄湪鍚屼竴涓按骞抽潰涓婃墍寰楀埌鐨勯珮搴﹀�间篃涓嶇浉鍚屻�傞琛屼腑甯哥敤鐨勯珮搴︽湁锛氱浉瀵归珮搴︺�佺粷瀵归珮搴︺�佺湡瀹為珮搴︺�佹爣鍑嗘皵鍘嬮珮搴︺�傚畠浠箣闂寸殑鍏崇郴濡傚浘2-96鎵�绀恒�� + </p> + <p class="center p-odd openImgBox"> + <img class="w80" alt="" src="../../assets/images/0107-2.jpg" /> + </p> + <p class="img p-odd">鍥�2-96 椋炶楂樺害</p> + <p class="p-odd"> + 鐩稿楂樺害閫氬父鎸囬鏈虹浉瀵逛簬鏈哄満锛堣捣椋炴満鍦恒�佺潃闄嗘満鍦猴級鍦伴潰涔嬮棿鐨勯珮搴︼紝椋炴満璧烽銆佺潃闄嗘椂椋炶鍛樺氨鏄牴鎹浉瀵归珮搴︽搷绾甸鏈虹殑銆傚湪璧烽鍓嶏紝椋炶鍛橀�氳繃璋冭妭鏃嬮挳灏嗛珮搴﹁〃鎸囬拡璋冨埌鈥滈浂鈥濓紝璧烽鍚庢寚绀虹殑灏辨槸鐩� + </p> + </div> + </div> + </div> + <!-- 96椤� --> + <div class="page-box" page="104"> + <div v-if="showPageList.indexOf(104) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">096</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 瀵归珮搴︺�傞珮搴﹁〃涓婅繕鏈変釜姘斿帇绐楀彛锛屼笂闈㈡墍鏄剧ず鐨勬皵鍘嬪�硷紙mmHg鎴杋nHg锛夊氨鏄熀鍑嗛潰姘斿帇鍊硷紝鎸囬拡鎸囩ず鐨勫氨鏄鏈虹浉瀵逛簬杩欎釜鍩哄噯闈㈢殑楂樺害锛岃皟鑺傛棆閽浆鍔ㄦ椂锛岄珮搴﹁〃鎸囬拡鍜屾皵鍘嬪�奸兘浼氱浉搴斿湴鍙樺寲銆傞鏈虹潃闄嗗墠锛岄琛屽憳鏍规嵁鐫�闄嗘満鍦洪�氭姤鐨勫満鍘嬶紙鏈哄満琛ㄩ潰姘斿帇锛夊�硷紝璋冩暣璋冭妭鏃嬮挳锛屽皢姘斿帇绐楀彛绀烘暟璋冧负璇ュ満鍘嬪�硷紝鎸囬拡鎸囩ず鐨勮鏁板氨鏄鏈鸿窛鐫�闄嗘満鍦鸿〃闈㈢殑楂樺害銆� + </p> + <p class="p-even"> + 缁濆楂樺害鏄寚椋炴満鐩稿浜庢捣骞抽潰鐨勯珮搴︺�傜粷瀵归珮搴﹀湪鐞嗚涓婃渶涓哄疄鐢紝鍙傜収缁濆楂樺害椋炶锛屽彧瑕侀鏈洪珮搴﹁秴杩囨渶楂橀殰纰嶇墿鏍囬珮锛屽氨涓嶄細鍜岄殰纰嶇墿鍙戠敓纰版挒銆備絾瀹為檯搴旂敤涓敱浜庢捣骞抽潰姘斿帇骞朵笉鏄竴鎴愪笉鍙樼殑锛岄珮搴﹁〃涔熸湁涓�瀹氱殑璇樊锛岀粷瀵归珮搴︾敤璧锋潵骞朵笉鏄緢鏂逛究銆� + </p> + <p class="p-even"> + 鐪熷疄楂樺害鏄寚椋炴満鍜屼笅鏂瑰湴闈箣闂寸殑鍨傜洿璺濈銆傞琛屼腑锛屽湪浠讳綍鎯呭喌涓嬮兘蹇呴』淇濊瘉鏈変竴瀹氱殑鐪熷疄楂樺害锛岄琛屽畨鍏ㄦ墠鏈変繚璇併�� + </p> + <p class="p-even"> + 鏍囧噯姘斿帇楂樺害鏄寚椋炴満鐩稿浜庢爣鍑嗘皵鍘嬮潰鐨勯珮搴︺�備粠鍓嶉潰鐨勫唴瀹逛腑鎴戜滑宸茬粡鐭ラ亾鏍囧噯澶ф皵鍘嬫槸浜轰负瑙勫畾銆佷竴鎴愪笉鍙樼殑锛屽嵆杩欎釜鍙傜収闈㈡槸鍥哄畾鐨勩�傚湪鑸涓紝涓虹‘淇濋鏈轰笉涓庡叾浠栭鏈哄彂鐢熸帴杩戝拰鐩告挒鍗遍櫓锛岀浉鍚戦琛岀殑椋炴満閮芥寜鐓ц埅琛岃鍒欑殑瑕佹眰閫夋嫨楂樺害灞傦紝淇濇寔涓�瀹氱殑楂樺害宸�傚鏋滅浉鍚戦琛岀殑椋炴満娌℃湁閫夋嫨鐩稿悓鐨勫弬鐓ч潰锛岃繖涓珮搴﹀樊灏卞緱涓嶅埌淇濊瘉銆傚鏋滈噰鐢ㄧ粷瀵归珮搴︼紝缁熶竴浠ユ捣骞抽潰涓哄弬鐓ч潰锛岃繖涓珮搴﹀樊灏辫兘寰楀埌淇濊瘉锛屼絾娴峰钩闈㈡皵鍘嬪苟闈炰竴鎴愪笉鍙樼殑锛岃�岄珮搴﹁〃鍙堟槸鎸夋皵鍘嬫寚绀虹殑锛屽洜姝わ紝缁濆楂樺害骞朵笉閫傜敤銆傚彧鏈夋爣鍑嗘皵鍘嬮珮鐨勫弬鐓ч潰鏄笉鍙樼殑锛岃繖涓珮搴︽墠閫傜敤浜庝繚鎸佽埅琛岄珮搴︺�傚洜姝わ紝椋炶鍛樺湪鎵ц椋炶浠诲姟鏃讹細璧烽鍓嶅皢楂樺害琛ㄢ�滆皟闆垛�濓紝浣跨敤璧烽鏈哄満鐨勭浉瀵归珮搴︼紱涓婂崌鍒颁竴瀹氶珮搴﹀姞鍏ヨ埅绾挎椂锛岃皟鏁撮珮搴﹁〃姘斿帇鍊煎埌鏍囧噯澶ф皵鍘嬶紙760mmHg鎴�29.92inHg锛夛紝浣跨敤鏍囧噯姘斿帇楂橈紱鐫�闄嗗墠鍐嶆牴鎹満鍦洪�氭姤鐨勫満鍘嬶紝璋冩暣楂樺害琛紝浣跨敤鐩稿浜庣潃闄嗘満鍦虹殑鐩稿楂樺害銆� + </p> + <h5 id="e029" class="p-even unit2-c">锛堜簩锛夌┖閫熻〃</h5> + <p class="p-even"> + 椋炶閫熷害瀵归鏈虹殑鍗囧姏銆侀樆鍔涚壒鎬ф湁寰堝ぇ褰卞搷锛岄琛屼腑鍒ゆ柇搴旈鏃堕棿涔熷繀椤诲弬鑰冮琛岄�熷害锛屽洜姝ゅ湪椋炶涓琛屽憳蹇呴』鍑嗙‘鎺屾彙椋炴満閫熷害銆傞�氬父璇寸殑椋炶閫熷害鏄寚椋炴満鐩稿浜庣┖姘旂殑閫熷害锛屽張绉颁负绌洪�燂紝绌洪�熻〃灏辨槸鐢ㄦ潵鎸囩ず椋炴満绌洪�熺殑浠〃銆傞鏈哄湪绌轰腑椋炶锛屼笉鑳藉儚鍦伴潰杞﹁締閭f牱閫氳繃杞﹁疆鐨勮浆閫熸潵鏄剧ず閫熷害锛屽彧鑳介�氳繃鍒殑鏂规硶鏉ラ噰闆嗕笌閫熷害鏈夊叧鐨勪俊鎭�� + </p> + </div> + </div> + </div> + <!-- 97椤� --> + <div class="page-box" page="105"> + <div v-if="showPageList.indexOf(105) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">097</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 浠庡墠闈㈢殑瀛︿範鍙煡锛屾皵娴佺殑閫熷害鍙戠敓鏀瑰彉锛屽帇鍔涗篃浼氱浉搴旀敼鍙橈紝鍏朵腑鍔ㄥ帇鐨勫喅瀹氬洜绱犲氨鏄�熷害锛屽彧瑕佹祴鍑哄姩鍘嬪�硷紝灏辩煡閬撲簡椋炴満鐨勯�熷害銆傚浣曡幏寰楀姩鍘嬪�煎憿锛熶粠浼姫鍒╂柟绋�<img class="inline2" + alt="" + src="../../assets/images/0109-1.jpg" />鍙煡锛屽姩鍘嬪�兼槸鍏ㄥ帇鍊间笌闈欏帇鍊间箣宸紝鍙娴嬪嚭浜嗗叏鍘嬪�煎拰闈欏帇鍊硷紝灏卞彲寰楀埌鍔ㄥ帇鍊笺�傞鏈轰笂閲囩敤绌洪�熺鏉ユ祴鍏ㄥ帇鍊间笌闈欏帇鍊硷紝澶ч儴鍒嗛鏈虹殑绌洪�熺瀹夎鍦ㄩ鏈烘満澶存渶鍓嶇鎴栨満 + </p> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0109-2.jpg" /> + <p class="img">鍥�2-97 绌洪�熺</p> + </div> + <span> + <p class="p-odd td-0"> + 缈肩考灏栧墠鏂癸紙鍥�2-97锛夈�傜┖閫熺鍓嶇寮�鏈変竴涓瓟锛岀О涓哄叏鍘嬪瓟锛涚┖閫熺鍛ㄥ洿寮�鏈変竴鍦堝皬瀛旓紝绉颁负闈欏帇瀛旓紙鍥�2-98锛夈�傞琛屼腑锛屽拰椋炴満閫熷害澶у皬鐩哥瓑銆佹柟鍚戠浉鍙嶇殑鐩稿姘旀祦缁忓叏鍘嬪瓟娴佸叆绌洪�熺锛屽湪绌洪�熺鍓嶇鐨勫叏鍘嬪鍙楅樆閫熷害涓洪浂锛屽帇鍔涘崌楂樺埌鍏ㄥ帇鍊笺�傜敱浜庣┖閫熺涓庣浉瀵规皵娴佸熀鏈钩琛岋紝娴佽繃绌洪�熺鍛ㄥ洿鐨勬皵娴侀�熷害涓嶅彂鐢熷彉鍖栵紝鍥犳闈欏帇瀛旀劅鍙楀埌鐨勬槸涓庢祦閫熸棤鍏崇殑闈欏帇銆傚叏鍘嬪拰闈欏帇閫氳繃鐩稿簲鐨勬帴澶村紩鍑猴紝楂樺害琛ㄩ噾灞炶啘鐩掑杩炴帴鐨勫ぇ姘斿帇锛屽氨鏄粠绌洪�熺闈欏帇鎺ュご澶勬帴鍏ョ殑銆備负浜嗛槻姝㈡皵娓╀綆鏃剁┖姘斾腑鐨勬按钂告皵缁撳啺鍫典綇鍏ㄥ帇瀛斻�侀潤鍘嬪瓟锛岀┖閫熺鍐呰繕璁炬湁鐢ㄤ簬鍔犳俯闄ゅ啺鐨勫姞娓╃數闃诲拰鎺掓按瀛斻�� + </p> + </span> + <p class="center openImgBox p-odd"> + <img class="img-d" alt="" src="../../assets/images/0109-3.jpg" /> + </p> + <p class="img p-odd">鍥�2-98 绌洪�熺缁撴瀯</p> + <p class="p-odd"> + 绌洪�熻〃缁撴瀯涓庨珮搴﹁〃鐣ユ湁涓嶅悓锛屽彧鏄湪楂樺害琛ㄤ腑闂悎鐨勯噾灞炶啘鐩掑唴杩炴帴浜嗕粠绌洪�熺閲囬泦鏉ョ殑鍏ㄥ帇锛岄噾灞炶啘鐩掑浠嶈繛鎺ラ潤鍘嬶紝鑶滅洅鍐呭鐨勫帇鍔涘樊灏辨槸鍔ㄥ帇鍊笺�傞琛岄�熷害鎻愰珮锛屽姩鍘嬪澶э紝鑶滅洅灏变細鑶ㄨ儉锛屾帹鍔ㄦ寚閽堟寚绀哄�煎澶э紱椋炶閫熷害闄嶄綆锛屽姩鍘嬪噺灏忥紝鑶滅洅鏀剁缉锛屽甫鍔ㄦ寚閽堟寚绀哄�煎噺灏忥紙鍥�2-99锛夈�傛寜涓�瀹氭瘮渚嬪埢濂藉埢搴︾洏锛屽氨鍋氭垚浜嗙┖閫熻〃锛屽叾鎸囬拡灏卞彲浠ユ寚绀洪琛岄�熷害浜嗭紙鍥�2-100锛夈�� + </p> + </div> + </div> + </div> + <!-- 98椤� --> + <div class="page-box" page="106"> + <div v-if="showPageList.indexOf(106) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">098</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="fl al-fe p-even"> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0110-1.jpg" /> + </p> + <p class="img">鍥�2-99 绌洪�熻〃鍘熺悊</p> + </span> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0110-2.jpg" /> + </p> + <p class="img">鍥�2-100 绌洪�熻〃缁撴瀯</p> + </span> + </div> + <p class="p-even"> + 浣嗘槸绌洪�熻〃琛ㄧ洏鐨勬瘮渚嬩笉濂芥帉鎻★紝鍥犱负鑶滅洅娴嬪緱鐨勬槸鍔ㄥ帇鍊硷紝鍔ㄥ帇涓嶄粎涓庨�熷害鏈夊叧锛岃繕涓庣┖姘斿瘑搴︽湁鍏筹紝绌烘皵瀵嗗害闅忛珮搴︾殑鍙樺寲涔熻鍙戠敓鍙樺寲锛屽嵆浣块珮搴︿笉鍙橈紝绌烘皵瀵嗗害涔熷苟闈炰竴鎴愪笉鍙樼殑銆傚湪鍒荤┖閫熻〃琛ㄧ洏鏃讹紝閫夋嫨鐨勬槸鍥哄畾鐨勭┖姘斿瘑搴︼紝鍗虫捣骞抽潰鏍囧噯澶ф皵鐨勫瘑搴︼紝鍥犳绌洪�熻〃鎸囩ず鍑烘潵鐨勯�熷害鍊煎苟涓嶄竴瀹氬拰瀹為檯椋炶閫熷害涓�鑷淬�傞鏈虹浉瀵逛簬绌烘皵鐨勮繍鍔ㄩ�熷害鍙湡绌洪�燂紝涔熷彨鐪熼�熴�佺┖閫熴�侀�熷害锛涚┖閫熻〃鎸囩ず鐨勯�熷害鍊煎彨鎸囩ず绌洪�燂紝涔熷彨琛ㄩ�熴�傝〃閫熷拰鐪熼�熺殑宸紓鏄┖姘斿瘑搴︿笉鍚岄�犳垚鐨勩�傚彲浠ユ牴鎹┖姘斿瘑搴﹂殢楂樺害鍙樺寲鐨勮寰嬶紝灏嗕笉鍚岄珮搴︾殑琛ㄩ�熸崲绠楁垚鐪熼�熴�� + </p> + <p class="p-even"> + 椋炴満鍦ㄧ┖涓櫎浜嗙浉瀵逛簬绌烘皵杩愬姩锛岃繕浼氶殢绌烘皵涓�璧疯繍鍔ㄣ�傚湪鏈夐鐨勬儏鍐典笅锛岄鏈虹浉瀵逛簬绌烘皵鐨勯�熷害涓庣浉瀵逛簬鍦伴潰鐨勯�熷害涓嶅悓銆傞鏈虹浉瀵逛簬鍦伴潰鐨勮繍鍔ㄩ�熷害鍙湴閫熴�傝埅绾块鏈轰粠浜嬭埅绌鸿繍杈擄紝鐩殑鏄皢浜烘垨璐х墿浠庡湴闈㈡煇澶勮繍寰�鍦伴潰鍙︿竴澶勶紝鍥犳鍦ㄩ琛屼腑杩橀』鎺屾彙椋炴満鐨勫湴閫熴�傚湪鎿嶇旱椋炴満鏃跺皢琛ㄩ�熸崲绠楁垚鐪熼�熷悗锛岃繕闇�鏍规嵁椋庡姏鍜岄鍚戞崲绠楁垚鍦伴�燂紝鍏蜂綋鏂规硶灏嗗湪瀵艰埅鏂规硶涓粙缁嶃�� + </p> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 绌烘皵娴佽繃椋炴満琛ㄩ潰鏃堕�熷害澶у皬鍜屾柟鍚戦兘灏嗗彂鐢熷彉鍖栵紝瀵艰嚧鍘嬪姏鍙戠敓鍙樺寲銆備负浜嗕娇姘斿帇寮忎华琛ㄧ殑鎸囩ず鏁板�艰兘澶熷弽鏄犻琛岀殑鐪熷疄鎯呭喌锛岀┖閫熺蹇呴』閲囬泦鏈彈鍒版満浣撳共鎵扮殑姘旀祦鍘嬪姏銆傚洜姝わ紝绌洪�熺鏅亶瀹夎鍦ㄦ満澶存渶鍓嶇鎴栬�呯考灏栧墠鏂癸紝浣挎皵娴佽繕鏈彈鍒伴鏈轰綋骞叉壈鏃跺氨娴佽繘绌洪�熺鐨勫叏銆侀潤鍘嬪瓟銆� + </p> + <p class="block"> + 鏈轰綋瀵规皵娴侀�熷害鍜屽帇鍔涚殑褰卞搷闅忛琛岄�熷害鍔犲揩鑰岃秺鏉ヨ秺鏄庢樉锛岄�熷害瓒婂揩鐨勯鏈猴紝绌洪�熺灏卞繀椤昏秺闀裤�佺鍙g鏈轰綋瓒婅繙锛屼互鍏嶅彈鍒板共鎵般�備竴浜涘皬鍨嬮鏈虹敱浜庨�熷害杈冩參锛屾皵娴佸彈鏈轰綋鐨勫奖鍝嶅皬锛屼负浜嗕娇绌洪�熺缁撴瀯绠�鍗曪紝鍙湪鏈虹考涓嬫柟瀹夎涓�鍙緝鐭殑鍏ㄥ帇绠★紝闈欏帇鍒欐槸鍦ㄦ満韬晶闈㈠紑瀛旈噰闆嗭紙鍥�2-101锛夛紝鏇寸畝鍗曠殑鐢氳嚦灏卞湪鏈哄ご鍓嶇寮�涓�涓皬瀛斾綔涓哄叏鍘嬪瓟锛岄潤鍘嬮儴鍒嗗垯鐩存帴鍜屽骇鑸卞唴閮ㄧ浉閫氥�� + </p> + </span> + </div> + </div> + </div> + </div> + <!-- 99椤� --> + <div class="page-box" page="107"> + <div v-if="showPageList.indexOf(107) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">099</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <p class="center openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0111-1.jpg" /> + </p> + <p class="img">鍥�2-101 灏忓瀷椋炴満鍏ㄣ�侀潤鍘嬪瓟</p> + </div> + <h5 id="e030" class="p-odd unit2-c">锛堜笁锛夊崌闄嶉�熷害琛�</h5> + <div class="img-rights w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0111-2.jpg" /> + <p class="img">鍥�2-102 鍗囬檷閫熷害琛�</p> + <p><br /></p> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <span> + <p class="block"> + 鏈哄姩鎬у己鐨勬垬鏂楁満鍦ㄨ穬鍗囨椂锛屼笂鍗囩巼杩囧ぇ浼氫娇鎸囬拡杞埌鈥滀笅闄嶁�濋儴鍒嗭紝淇啿鏃朵篃鍙兘杞埌鈥滀笂鍗団�濋儴鍒嗐�� + </p> + </span> + </div> + </div> + <span> + <p class="p-odd"> + 鍗囬檷閫熷害琛紙鍥�2-102锛夋寚绀虹殑鏄鏈哄崟浣嶆椂闂村唴涓婂崌鎴栦笅闄嶇殑楂樺害锛屽張鍙笂鍗囩巼鎴栦笅闄嶇巼銆傛寚閽堝線涓婃寚琛ㄧず椋炴満涓婂崌锛屾暟鍊煎氨鏄笂鍗囩巼锛坢/s鎴杅t/min锛夛紱鎸囬拡寰�涓嬫寚琛ㄧず椋炴満涓嬮檷锛屾暟鍊煎氨鏄笅闄嶇巼銆� + </p> + <p class="p-odd"> + 鍗囬檷閫熷害琛ㄧ粨鏋勭被浼间簬绌洪�熻〃锛屼笉鍚岀殑鏄噾灞炶啘鐩掑唴澶栭兘閫氶潤鍘嬶紝鍙槸鑶滅洅鍐呴儴鐩存帴涓庨潤鍘嬬浉閫氾紝鑶滅洅澶栭儴閫氳繃姣涚粏绠′笌闈欏帇鐩歌繛銆傚綋椋炴満涓婂崌鏃讹紝闈欏帇闄嶄綆锛岃啘鐩掑唴鐨勬皵鍘嬩笌绌洪�熺閲囬泦鐨勯潤鍘嬪悓姝ラ檷浣庯紝鑶滅洅澶栭儴鍥犳瘺缁嗙鐨勯樆纰嶏紝姘斿帇闄嶄綆浼氭粸鍚庯紝鑶滅洅鍐呭灏辨湁浜嗗帇鍔涘樊锛屼娇鑶滅洅鏀剁缉锛屽甫鍔ㄦ寚閽堟寚绀轰笂鍗囩巼锛涘弽涔嬶紝椋炴満涓嬮檷楂樺害锛岃啘鐩掑唴姘斿帇鍙婃椂鍗囬珮锛岃啘鐩掑姘斿帇鍗囬珮婊炲悗锛屼骇鐢熷帇鍔涘樊浣胯啘鐩掕啫鑳�锛屽甫鍔ㄦ寚閽堟寚绀轰笅闄嶇巼銆傞鏈洪珮搴︿笉鍐嶅彉鍖栧悗锛岃啘鐩掑唴澶栫殑姘斿帇閫愭笎骞宠 锛屾寚閽堟仮澶嶆寚鈥滈浂鈥濓紙鍥�2-103锛夈�� + </p> + </span> + <p class="center openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0111-3.jpg" /> + </p> + <p class="img">鍥�2-103 鍗囬檷閫熷害琛ㄥ師鐞�</p> + </div> + </div> + </div> + <!-- 100椤� --> + <div class="page-box" page="108"> + <div v-if="showPageList.indexOf(108) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">038</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h4 id="d032" class="p-even unit2-c">浜屻�侀檧铻轰华琛�</h4> + <h5 id="e031" class="p-even unit2-c">锛堜竴锛夊湴骞充华锛堝Э鎬佹寚绀轰华锛�</h5> + <p class="p-even"> + 椋炴満鐨勫Э鎬佹槸鎸囬鏈烘満浣撲笁鏉¤酱鎴栭鏈哄绉伴潰涓庢按骞抽潰鐨勮搴﹀叧绯伙紝鍖呮嫭淇话銆佸�炬枩绛夛紝椋炶鍛樺繀椤绘帉鎻¢鏈虹殑濮挎�佹墠鑳芥纭湴瀹炴柦鎿嶇旱銆傝兘瑙佸害濂芥椂锛岄琛屽憳鍙�氳繃椋炴満涓庡ぉ鍦扮嚎锛堝湴骞崇嚎锛変箣闂寸殑鍏崇郴銆佷綅缃潵鍒ゆ柇椋炴満濮挎�併�傚鏋滈鏈哄湪浜戜腑銆佸闂存垨鏄兘瑙佸害杈冨樊鐨勬潯浠朵笅椋炶锛岄琛屽憳涓嶈兘閫氳繃鐩鍒ゆ柇椋炴満濮挎�侊紝灏遍渶瑕佸弬鑰冧华琛ㄦ潵鍒ゆ柇銆� + </p> + <p class="p-even"> + 鎸囩ず椋炴満濮挎�佺殑浠〃鍙湴骞充华锛屾槸鎵�鏈夎埅绌轰华琛ㄤ腑鏈�閲嶈鐨勪华琛ㄣ�備负浜嗘纭弽鏄犻鏈哄Э鎬侊紝鍦板钩浠繀椤绘ā鎷熷嚭涓�鏉″ぉ鍦扮嚎鈥斺�斾汉宸ュ湴骞崇嚎锛屽皢椋炴満鐨勫悇杞存垨瀵圭О闈笌杩欐潯浜哄伐鍦板钩绾挎瘮杈冿紝鏄剧ず鍑洪鏈虹殑濮挎�併�傜湡瀹炵殑澶╁湴绾挎槸涓嶄細鍙戠敓鍊炬枩鐨勶紝鑰屽湴骞充华瀹夎鍦ㄩ鏈轰笂锛屽皢浼氶殢椋炴満涓�璧疯繍鍔紝鍦板钩浠噷鐨勪汉宸ュ湴骞崇嚎涔熼殢椋炴満涓�璧疯繍鍔ㄣ�傝鍦板钩浠寚绀哄噯纭殑鍏抽敭锛屽氨鏄璁╀汉宸ュ湴骞崇嚎鍦ㄤ换浣曟儏鍐典笅閮戒笉鍙戠敓鍊炬枩銆備负杈惧埌杩欎竴鐩殑锛屽湴骞充华閲岄噰鐢ㄤ簡闄�铻恒�� + </p> + <p class="p-even"> + 缁曟敮鐐规垨杞酱楂橀�熸棆杞殑鐗╀綋绉颁负闄�铻猴紝闄�铻哄叿鏈夎繘鍔ㄦ�у拰瀹氳酱鎬х殑鐗规�э紝鍦ㄥ湴骞充华涓富瑕佸埄鐢ㄩ檧铻虹殑瀹氳酱鎬с�傞檧铻虹帺鍏锋槸澶у閮芥瘮杈冪啛鎮� + </p> + <div class="img-float w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0112-1.jpg" /> + <p class="img">鍥�2-104 闄�铻虹殑瀹氳酱鎬�</p> + </div> + <span> + <p class="p-even td-0"> + 鐨勶紝闄�铻虹帺鍏峰湪鏂滃潯涓婄殑鎯呭舰灏辨樉绀哄嚭浜嗛檧铻虹殑瀹氳酱鎬э紙鍥�2-104锛夈�傚湪鏂滃潯涓婄殑闄�铻鸿浆杞存柟鍚戜笌鍦ㄥ钩闈笂涓�鑷达紝鍗虫棤璁哄潯閬撳浣曞�炬枩锛岃浆杞寸殑鏂瑰悜閮芥槸鍥哄畾涓嶅彉鐨勩�� + </p> + <p class="p-even"> + 鍦板钩浠埄鐢ㄩ檧铻虹殑瀹氳酱鎬э紝灏嗕汉宸ュ湴骞崇嚎鍥哄畾鍦ㄩ檧铻轰笂锛岃繖鏉$嚎灏变笉闅忛鏈虹殑濮挎�佹敼鍙樿�屾敼鍙樻柟鍚戜簡锛屽拰椋炴満鐨勪笁鏉¤酱銆佸绉伴潰瀵规瘮锛屽氨鑳芥寚绀哄嚭椋炴満鐨勫悇绉嶅Э鎬併�傚湴骞充华鍘熺悊绠�鍗曪紝缁撴瀯澶嶆潅銆� + </p> + </span> + <p class="p-even"> + 鍦板钩浠寚绀哄師鐞嗙畝鍗曪紝鍙�氳繃鍥�2-105鏉ヤ簡瑙c�傚湴骞充华鐨勬牳蹇冩槸鍦ㄩ檧铻哄濂椾竴鍙幆褰㈠埢搴︾洏锛屽埢搴︾洏鐨勪笂鍗婂湀娑傛垚妫曡壊琛ㄧず澶у湴锛屼笅鍗婂湀娑傛垚钃濊壊琛ㄧず澶╃┖锛屽ぉ鍦颁氦鎺ュ灏辨槸浜哄伐鍦板钩绾匡紝鍨傜洿浜庝汉宸ュ湴骞崇嚎鍒讳笂涓�鏉′汉宸ュ瓙鍗堢嚎銆備互浜哄伐鍦板钩绾夸负鍩哄噯锛屾部鐫�浜哄伐瀛愬崍绾垮皢鐜舰鍒诲害鐩樺垎鎴�360掳锛屾瀵瑰湴骞充华琛ㄩ潰鐨勫墠鍗婂渾涓婁笅鍚�90掳锛岃儗闈篃涓�鏍蜂笂涓嬪悇90掳锛屽苟鍒讳笂鐩稿簲鐨勬暟鍊笺�傚湴骞充华鐨勫澹充笂鐢绘湁涓�鏋跺彲涓婁笅璋冭妭鐨勫皬椋炴満锛屽皬椋炴満 + </p> + </div> + </div> + </div> + <!-- 101椤� --> + <div class="page-box" page="109"> + <div v-if="showPageList.indexOf(109) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">101</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 涓嬫柟鐨勮〃鐩樹笂宸﹀彸涓や晶鍒嗗埆鍒讳笂鎸囩ず鍧″害鐨勮搴︽暟鍊笺�傚綋椋炴満骞抽鏃讹紝鍦板钩浠笂鐨勫皬椋炴満鍦ㄤ汉宸ュ湴骞崇嚎涓婏紝浜哄伐瀛愬崍绾挎瀵逛笅鏂圭殑涓夎鎸囨爣锛堝浘2-106锛夈�傞琛屼腑锛屾棤璁洪鏈哄Э鎬佸浣曞彉鍖栵紝鍦板钩浠唴鐨勭幆褰㈠埢搴︾洏閮藉湪闄�铻虹殑鍥哄畾涓嬶紝浜哄伐鍦板钩绾垮缁堜笌澶╁湴绾垮钩琛岋紝浜哄伐瀛愬崍绾垮缁堜笌澶╁湴绾垮瀭鐩淬�備緥濡傦紝椋炴満鍚戝乏鍊炬枩锛屽湴骞充华澶栧3闅忛鏈轰竴璧峰�炬枩锛屼粠椋炶鍛樼殑瑙掑害鐪嬶紝鐜舰鍒诲害鐩樺湪鍚戝彸杞紝浜哄伐瀛愬崍绾夸笅绔悜宸﹁浆锛屾寚绀虹殑鐩稿簲鐨勬暟鍊煎氨鏄鏈哄潯搴︺�傚啀濡傦紝鏈哄ご涓婁话锛屽湴骞充华澶栧3闅忛鏈轰笂浠帮紝浠庨琛屽憳浣嶇疆涓婄湅锛岀幆褰㈠埢搴︾洏鍚戜笂杞紝灏忛鏈烘寚绀鸿摑鑹查儴鍒嗭紝琛ㄧず鏈哄ご瀵圭潃澶╃┖锛屽皬椋炴満瀵瑰簲鐨勮搴﹀氨鏄鏈虹殑浠拌銆傛棤璁洪鏈哄仛澶氫箞鍓х儓鐨勮繍鍔紝濮挎�侀兘鑳介�氳繃鍦板钩浠噯纭湴鍙嶆槧鍑烘潵銆� + </p> + <div class="fl al-fe p-odd"> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0113-1.jpg" /> + </p> + <p class="img">鍥�2-105 鍦板钩浠師鐞�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0113-2.jpg" /> + </p> + <p class="img">鍥�2-106 鍦板钩浠紙涓�锛�</p> + </span> + </div> + <p class="p-odd"> + 璇村湴骞充华缁撴瀯澶嶆潅锛岄偅鏄洜涓哄畠瑕侀殢椋炴満涓�璧疯繍鍔ㄣ�傞鏈哄Э鎬佹敼鍙樺氨浼氶�犳垚闄�铻虹浉瀵逛簬鍦板钩浠澹充骇鐢熻浆鍔紝蹇呴』瀹屽叏淇濊瘉杩欑鐩稿杞姩涓嶅彈鍒颁换浣曢樆婊炴墠鑳藉噯纭湴鎸囩ず椋炴満鐘舵�併�備篃灏辨槸璇达紝鍦板钩浠殑澶嶆潅涔嬪鏄細鍦ㄤ换浣曠姸鎬佷笅锛岄兘瑕佷繚璇侀檧铻哄畬鍏ㄨ兘澶熻嚜鐢辫浆鍔ㄣ�� + </p> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0113-3.jpg" /> + <p class="img">鍥�2-107 鍦板钩浠紙浜岋級</p> + </div> + <span> + <p class="p-odd"> + 杩欐牱鐨勫湴骞充华鎸囩ず鍘熺悊绠�鍗曟槗鎳傦紝浠讳綍澶嶆潅鐨勫Э鎬侀兘鑳芥寚绀猴紝浣嗗湴骞充华涓婃柟鏄鑹茬殑澶у湴锛屼笅鏂规槸钃濊壊鐨勫ぉ绌猴紝涓嶅鐩磋锛屽洜姝や富瑕佺敤浜庢垬鏂楁満銆傛皯鐢ㄩ鏈哄拰鍐涚敤鐨勮繍杈撴満銆佽桨鐐告満绛変笉鍋氬墽鐑堢殑鐗规妧鍔ㄤ綔锛岀┖涓Э鎬佸彉鍖栧皬锛屼负浜嗙洿瑙傛樉绀猴紝閫氬父鐢ㄤ笂钃濅笅妫曠殑鍦板钩浠紝涓婁话鍜屼笅淇�氳繃鍦板钩浠唴閮ㄧ殑浜哄伐鍦板钩绾垮湪琛ㄧ洏涓婄Щ鍔ㄦ潵鏄剧ず锛屽乏鍙冲�炬枩闈犺〃鐩樹笂鐨勫皬椋炴満鍊炬枩鎸囩ず鍑烘潵銆傝繖鏍风殑鍦板钩浠寚绀哄師鐞嗗拰鍓嶉潰鎵�璁茬殑涓�鏍凤紝浣嗙粨鏋勬洿涓哄鏉傦紝涓嶈繃鎸囩ず鏇村姞鐩磋锛堝浘2-107锛夈�� + </p> + </span> + </div> + </div> + </div> + <!-- 102椤� --> + <div class="page-box" page="110"> + <div v-if="showPageList.indexOf(110) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">102</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e032" class="p-even unit2-c"> + 锛堜簩锛夊崗璋冭浆寮华锛堣浆寮晶婊戜华锛� + </h5> + <p class="p-even"> + 鍗忚皟杞集浠敱鎸囩ず杞集鐨勬寚閽堟垨灏忛鏈猴紙杞集浠級鍜屾寚绀轰晶婊戠殑灏忕悆锛堜晶婊戜华锛変袱閮ㄥ垎缁勬垚锛岄琛屽憳甯稿舰璞″湴绉颁箣涓衡�滈拡鐞冧华鈥濓紙鍥�2-108锛夈�傚崗璋冭浆寮槸鎸囬鏈轰笉甯︿晶婊戠殑杞集锛岃姹傞琛屽憳鍦ㄦ搷绾甸鏈鸿浆寮椂鎵嬭剼瑕佸崗璋冧竴鑷淬�� + </p> + <p class="p-even"> + 杞集浠唴鏈変竴涓檧铻猴紝涓昏鏄埄鐢ㄩ檧铻虹殑杩涘姩鎬х壒鐐规潵宸ヤ綔銆傝〃闈㈠鏋滄槸鎸囬拡锛岄檧铻鸿浆杞村氨涓庢寚閽堝瀭鐩达紱琛ㄩ潰濡傛灉鏄皬椋炴満锛岄檧铻鸿浆杞村氨涓庡叾鏈虹考鏂瑰悜骞宠锛堝浘2-109锛夈�傞檧铻哄唴妗嗗拰鎸囬拡锛堟垨灏忛鏈猴級杩炲湪涓�璧凤紝澶栨杩炴帴浠〃澹筹紝鍐呮杞翠笌灏忛鏈烘満浣撶旱杞存湁涓�瀹氬す瑙掞紙涓�鑸槸30掳锛夈�傚綋椋炴満鍊炬枩鎴栧仛鍋忚浆杩愬姩鏃讹紝闄�铻鸿浆杞村氨浼氬彈鍒拌浆寮甫鏉ョ殑澶栨潵鍔涚煩锛岃繖涓姏鐭╃殑鍙嶄綔鐢ㄥ姏鐭╀綔鐢ㄥ湪鍐呮涓婏紝浣垮唴妗嗗甫鍔ㄦ寚閽堬紙鎴栧皬椋炴満锛夎浆鍔紝鎸囩ず鍑鸿浆寮閫熷害銆� + </p> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0114-1.jpg" /> + </p> + <p class="img">鍥�2-108 鍗忚皟杞集浠�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0114-2.jpg" /> + </p> + <p class="img">鍥�2-109 鍗忚皟杞集浠師鐞�</p> + </span> + </div> + <p class="p-even"> + 鍦ㄨ埅绾块琛屼腑锛岀┖涓氦閫氱鐞嗚姹傝浆寮娇鐢ㄨ瀹氱殑杞集瑙掗�熷害銆傝繖涓閫熷害涓烘瘡绉�3掳锛堢洏鏃嬩竴鍦堜负2min锛夛紝杞集浠笂鐨勫埢搴︽爣蹇楀氨鏄繖涓閫熷害銆傚湪杞集鏃讹紝鍙鎸囬拡鍚戣浆寮柟鍚戝亸鏂滃埌鍒诲害涓婃垨鏄皬椋炴満鍊炬枩鏈虹考鎸囧埌鍒诲害锛岄鏈哄氨鏄互鏍囧噯杞集瑙掗�熷害鍦ㄨ浆寮紙鍥�2-108宸︼級銆� + </p> + <p class="p-even"> + 渚ф粦浠槸涓�涓瘑灏佺殑寮锛岀鍐呭厖婊$敤浜庢鼎婊戠殑娑蹭綋鍜屼竴涓皬鐞冦�傚綋椋炴満骞抽鏃讹紝鐢变簬閲嶅姏鐨勪綔鐢紝灏忕悆澶勫湪寮涓渶涓嬫柟鐨勪綅缃紝涔熷氨鏄腑澶綅缃�傞鏈鸿浆寮椂锛屽鏋滀笉甯︿晶婊戯紙鍗忚皟杞集锛夛紝椋炴満鍊炬枩浣垮集绠″�炬枩锛屽皬鐞冮噸鍔涚殑鍒嗗姏鍜岀蹇冨姏澶у皬鐩哥瓑锛屽皬鐞冧粛澶勫湪涓ぎ浣嶇疆銆傚鏋滄搷绾典笉鍗忚皟锛岄鏈哄甫渚ф粦杞集锛屽皬鐞冮噸鍔涚殑鍒嗗姏鍜岀蹇冨姏澶у皬涓嶇瓑锛屽皬鐞冨氨浼氬亸鍚戜晶婊戠殑鏂瑰悜锛岄琛屽憳鍙牴鎹皬鐞冪殑鎸囩ず鎿嶇旱椋炴満鍗忚皟杞集銆傚ぇ澶氭暟鍦板钩浠笅鏂规湁涓�涓晶婊戜华銆� + </p> + <h4 id="d033" class="p-even unit2-c">涓夈�佽埅鍚戜华琛�</h4> + <p class="p-even"> + 鑸悜浠〃鐢ㄤ簬椋炴満鍦ㄩ琛屼腑鎸囩ず鑸悜锛岄琛屽憳鍙牴鎹华琛ㄧ殑鎸囩ず鍒ゆ柇 + </p> + </div> + </div> + </div> + <!-- 103椤� --> + <div class="page-box" page="111"> + <div v-if="showPageList.indexOf(111) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">103</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">椋炴満鑸悜锛屼互渚挎搷绾甸鏈烘寜棰勫畾鑸嚎椋炲線鐩殑鍦般��</p> + <h5 id="e033" class="p-odd unit2-c">锛堜竴锛夌缃楃洏</h5> + <p class="p-odd"> + 纾佺綏鐩樻簮鑷垜鍥藉彜浜虹殑鍥涘ぇ鍙戞槑涔嬩竴鈥斺�旀寚鍗楅拡銆傜閽堜袱绔兘澶熸寚鍚戝湴纾佸崡鍖椾袱鏋侊紝纾佺綏鐩樺氨鏄皢涓�鏍圭閽堝浐瀹氬湪鍦嗗舰鍒诲害鐜笂锛屽啀灏嗘甯︽湁纾侀拡鐨勫埢搴︾幆鏀惧叆缃楃洏琛ㄧ洅鍐呫�備负浜嗚鍒诲害鐜兘鑷敱杞姩锛岃〃鐩掑唴鍔犳湁娑蹭綋浣垮埢搴︾幆婕傛诞璧锋潵銆傚埢搴︿互姝e寳涓鸿捣鐐癸紝椤烘椂閽堟柟鍚戝皢鍒诲害鐜垎涓�360绛変唤銆傛鍖椾负0掳锛屼互N琛ㄧず锛涙涓滀负90掳锛屼互E琛ㄧず锛涙鍗椾负180掳锛屼互S琛ㄧず锛涙瑗夸负270掳锛屼互W琛ㄧず銆傜敱浜庡埢搴︾幆灏哄鏈夐檺锛岀綏鐩樹竴鑸瘡闅�30掳鏍囦竴涓暟瀛楋紝姝ゆ暟瀛椾负鑸悜鐨�1/10锛堝洜涓虹┖闂存湁闄愶紝灏戝埢涓�涓綅鏁帮級銆傜缃楃洏琛ㄧ洏闈笂鍒绘湁涓�鏉″熀鍑嗙嚎锛岄琛屼腑姝ょ嚎姝e鐨勬暟瀛楀氨鏄鏈鸿埅鍚戯紙鍥�2-110锛夈�� + </p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0111-01.jpg" /> + <p class="img">鍥�2-110 纾佺綏鐩�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0111-02.jpg" /> + <p class="img">鍥�2-110 纾佺綏鐩�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="p-odd"> + 椋炴満杞集鏃讹紝缃楃洏闅忛鏈轰竴璧疯浆寮紝鐢变簬纾侀拡鍥哄畾鎸囧悜鍦扮鍗楀寳鏋侊紝灏嗗甫鍔ㄥ埢搴︾幆杞姩锛岄琛屽憳灏变細鐪嬪埌缃楃洏閲岀殑鍒诲害鐜湪杞姩锛岃繕鑳界湅鍒拌窡鐫�娴佸姩鐨勬恫浣撱�傞琛屽憳褰㈣薄鍦板皢纾佺綏鐩樼О涓衡�滄按缃楃洏鈥濄�� + </p> + <h5 id="e034" class="p-odd unit2-c">锛堜簩锛夐檧铻虹缃楃洏</h5> + <p class="p-odd"> + 椋炶涓渶闇�瑕佸弬鑰冪綏鐩樻潵鎿嶇旱椋炴満鏄湪杞集鐨勬椂鍊欙紝浠ヤ究鍑嗙‘鍒ゆ柇鏀瑰嚭杞集鐨勬椂鏈恒�傞鏈鸿浆寮椂甯︽湁鍧″害锛岀綏鐩樹腑鐨勭閽堜細鍙戠敓鍊炬枩锛屼笉鑳藉噯 + </p> + <div class="img-rights w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 鍦扮鏋佷笌鍦扮悊鏋佷笉瀹屽叏閲嶅悎锛岄�犳垚缃楃洏鎸囩ず鐨勬柟鍚戞湁涓�瀹氱殑鍋忓樊锛岃繖涓亸宸彨纾佸樊銆� + </p> + </div> + </div> + <span> + <p class="p-odd td-0"> + 纭湴鎸囩ず鏂瑰悜锛岄鏈鸿浆寮殑鍔犻�熷害涔熶細瀵艰嚧缃楃洏鎸囩ず涓嶅噯銆備负浜嗚В鍐宠繖涓�闂锛屼汉浠張鎯冲埌浜嗛檧铻虹殑瀹氳酱鎬э紝瀹冧笉鍙楅鏈鸿浆寮椂鍔犻�熷害鐨勫奖鍝嶏紝鍙互杩呴�熷噯纭湴鎸囩ず椋炴満杞集鐨勮搴︼紝渚夸簬鎺屾彙鏀瑰嚭杞集鐨勬椂鏈恒�備絾闄�铻轰华涓嶈兘涓诲姩鎸囩ず鏂瑰悜锛屾妸缃楃洏鍜岄檧铻虹粨鍚堣捣鏉ワ紝鍒舵垚闄�铻虹缃楃洏锛屽氨鑳藉緢濂藉湴瑙e喅杩欎竴闂銆� + </p> + </span> + </div> + </div> + </div> + <!-- 104椤� --> + <div class="page-box" page="112"> + <div v-if="showPageList.indexOf(112) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">104</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0116-1.jpg" /> + <p class="img">鍥�2-111 闄�铻虹缃楃洏</p> + </div> + <span> + <p class="p-even"> + 闄�铻虹缃楃洏琛ㄩ潰鐢卞埢搴︾洏鍜屽皬椋炴満缁勬垚锛屽皬椋炴満鏈哄ご鎸囩ず鐨勬柟鍚戝氨鏄鏈虹殑鑸悜銆傜綏鐩樹笅鏂规湁涓�涓埅鍚戣皟鏁撮挳锛屽彲灏嗕换鎰忓埢搴﹁皟鍒拌〃鐩樹笂鏂圭殑鍒诲害绾夸笂锛屽浘2-111涓渶涓婃柟灏变笉鏄�0掳锛圢锛夈�傞琛屼腑灏嗚杈冮暱鏃堕棿淇濇寔鐨勮埅鍚戣皟鍒版渶涓婃柟锛屽皬椋炴満鎸囧悜鏈�涓婃柟鐨勫埢搴︾嚎锛屽氨琛ㄧず鑸悜淇濇寔鍑嗙‘锛涘皬椋炴満鎸囧悜鍒诲害绾垮乏渚э紝灏辫〃绀洪鏈虹殑鑸悜姣旈瀹氱殑鑸悜灏忥紝鍋忓悜棰勫畾鑸嚎鐨勫乏渚э紝闇�瑕佸悜鍙宠浆寮慨姝o紱鍚岀悊锛屽皬椋炴満鎸囧悜鍒诲害绾垮彸渚э紝琛ㄧず椋炴満鑸悜鍋忓悜棰勫畾鑸嚎鍙充晶锛岄渶瑕佸悜宸﹁浆寮慨姝c�傝繖鏍峰氨浣块檧铻虹缃楃洏浣跨敤璧锋潵闈炲父鐩磋銆佹柟渚裤�� + </p> + </span> + <p class="p-even"> + 鍦ㄥ钩椋炴椂锛岄檧铻虹缃楃洏鏍规嵁纾侀拡鐨勬寚绀烘潵鏄剧ず鏁版嵁锛岃浆寮椂鐢变簬纾侀拡鎸囩ず涓嶅噯纭紝灏辩敱闄�铻哄甫鍔ㄧ綏鐩樻寚绀猴紙鍥�2-112锛夈�傞檧铻哄彈杞存壙鎽╂摝鐨勫奖鍝嶄細鍙戠敓鑸悜椋樼Щ锛屾椂闂撮暱銆侀绉婚噺澶т細閫犳垚璇绘暟涓嶅噯銆備负閬垮厤鎸囩ず閿欒锛岀綏鐩樹腑鏈変慨姝h缃紝鏍规嵁纾侀拡鐨勬寚绀烘潵淇缃楃洏锛屼慨姝i�熷害涓�鑸槸姣忓垎閽�4掳锛屽ぇ浜庨檧铻虹殑椋樼Щ閫熷害锛屾甯搁琛岃繃绋嬩腑鑳戒繚璇佺綏鐩樻寚绀哄噯纭�傞鏈鸿浆寮�佸仛鏈哄姩椋炶鏃讹紝纾侀拡鎸囩ず涓嶅噯纭紝灏界淇瑁呯疆涔熷湪鎸変笉鍑嗙‘鐨勭閽堟柟鍚戞潵淇锛屼絾淇閫熷害鎱紝褰卞搷鍙互蹇界暐涓嶈銆傝緝闀挎椂闂村墽鐑堢殑鏈哄姩椋炶鍚庯紝闄�铻虹殑璇樊鍙兘浼氱Н绱埌杈冨ぇ鏁板�硷紝闈犵綏鐩樿嚜韬慨姝i渶寰堥暱鏃堕棿锛岀綏鐩樹笂璁剧疆鏈夊揩閫熷崗璋冩寜閽紝椋炶鍛樺湪椋炴満骞抽涓�娈垫椂闂淬�佺閽堟寚绀哄噯纭悗锛屾寜涓嬫鎸夐挳锛岀綏鐩樹互姣忕20掳鐨勯�熷害鍗忚皟鍒板拰纾侀拡鏂瑰悜涓�鑷淬�� + </p> + <p class="center openImgBox p-even"> + <img class="w80" alt="" src="../../assets/images/0116-2.jpg" /> + </p> + <p class="img p-even">鍥�2-112 闄�铻虹缃楃洏鍘熺悊</p> + </div> + </div> + </div> + <!-- 105椤� --> + <div class="page-box" page="113"> + <div v-if="showPageList.indexOf(113) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">105</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 鐢变簬闄�铻虹缃楃洏涓殑闄�铻洪渶瑕侀�氱數杩愯浆锛岄琛屽憳褰㈣薄鍦版妸闄�铻虹缃楃洏绉颁负鈥滅數缃楃洏鈥濄�� + </p> + <h5 id="e035" class="p-odd unit2-c">锛堜笁锛夐鏈轰华琛ㄦ澘鐨勫熀鍑員</h5> + <p class="p-odd"> + 椋炶涓湴骞充华鏄剧ず鍑洪鏈虹殑濮挎�侊紝绌洪�熻〃銆侀珮搴﹁〃鍒嗗埆鎸囩ず椋炶閫熷害鍜岄琛岄珮搴︼紝纾佺綏鐩樻寚绀哄嚭椋炶鏂瑰悜锛岃繖浜涘熀鏈俊鎭槸椋炶涓渶閲嶈鐨勫弬鏁般�傚湪椋炶涓紝椋炶鍛樿杩呴�熷緱鍒板苟澶勭悊璁稿淇℃伅锛屼华琛ㄦ澘涓婄殑甯冨眬鑳借 + </p> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0117-1.jpg" /> + <p class="img">鍥�2-113 鍩哄噯T</p> + </div> + <span> + <p class="p-odd td-0"> + 椋炶鍛樺緢鏂逛究鍦拌幏鍙栨渶閲嶈鐨勪俊鎭紝缂╃煭椋炶鍛樿幏鍙栦俊鎭殑鏃堕棿锛屽椋炶瀹夊叏灏や负閲嶈銆傚洜姝わ紝鍦ㄤ华琛ㄦ澘甯冨眬涓紝灏嗘渶閲嶈鐨勪华琛ㄦ寜涓�瀹氳寰嬪竷缃紝閫愭笎褰㈡垚浜嗘爣鍑嗗竷灞�鏂瑰紡鈥斺�斿熀鍑員锛坆asic + T锛夛細灏嗗叿鏈夆�滈琛屼华琛ㄤ箣鐜嬧�濅箣绉扮殑鍦板钩浠竷缃湪浠〃鏉跨涓�鎺掍腑澶紝鍏跺乏鍙冲垎鍒竷缃┖閫熻〃銆侀珮搴﹁〃锛屼笅鏂瑰竷缃綏鐩橈紙閫氬父鏄檧铻虹缃楃洏锛夛紝4涓渶閲嶈鐨勪华琛ㄦ瀯鎴愪竴涓�淭鈥濆瓧褰紙鍥�2-113锛夈�� + </p> + </span> + <p class="p-odd"> + 閲囩敤鏈烘寮忎华琛ㄧ殑椋炴満锛屽鏋滀华琛ㄦ瘮杈冨畬鍠勶紝閮界粺涓�閲囩敤鍩哄噯T甯冨眬锛屽叾浠栦华琛ㄧ殑瀹夋斁浣嶇疆娌℃湁缁熶竴瑙勫畾銆備竴浜涜秴杞诲瀷椋炴満锛屼华琛ㄥ緢灏戙�佸緢绠�鍗曪紝鐢氳嚦杩炲湴骞充华閮芥病鏈夛紝鏇磋皥涓嶄笂鍩哄噯T浜嗐�� + </p> + <h4 id="d034" class="p-odd unit2-c">鍥涖�佹棤绾跨數瑁呯疆鍙婁华琛�</h4> + <h5 id="e036" class="p-odd unit2-c">锛堜竴锛夐鏈轰笂鐨勬棤绾跨數瑁呯疆</h5> + <p class="p-odd"> + 浠�20涓栫邯20骞翠唬寮�濮嬶紝鏃犵嚎鐢靛湪椋炴満涓婂緱鍒板簲鐢紝鏈�鍒濅富瑕佺敤浜庡拰鍦伴潰鎸囨尌鍛樻垨涓庣┖涓殑鍏朵粬椋炴満杩涜閫氳瘽鑱旂郴锛屽悗鏉ュ張鐢ㄤ簬瀵艰埅銆�20涓栫邯40骞翠唬锛岄浄杈捐瀹夎鍦ㄩ鏈轰笂锛岀敤浜庢帰娴嬪墠鏂归殰纰嶇墿鍜屽嵄闄╁ぉ姘旂瓑銆傛棤绾跨數璁惧鐨勫簲鐢紝浣块鏈烘帰鐭ュ鐣屾儏鍐电殑鑳藉姏澶уぇ鍔犲己锛岄鏈轰笉鍐嶆槸涓庡鐣屾棤鑱旂郴鐨勨�滅瀻瀛愨�濆拰鈥滆亱瀛愨�濅簡銆傞鏈鸿兘閫傚簲澶嶆潅鐨勯琛屾潯浠讹紝闄嶄綆浜嗗澶╂皵鐨勪緷璧栵紝鎻愰珮浜嗗嚭鍕ょ巼锛屾敼鍠勪簡椋炶瀹夊叏鐘跺喌銆� + </p> + <p class="p-odd"> + 鐜板湪椋炴満鐨勬棤绾跨數璁惧鎸夊姛鑳藉彲鍒嗕负閫氫俊绯荤粺銆佸鑸郴缁熷拰闆疯揪绯荤粺涓夊ぇ閮ㄥ垎銆� + </p> + <p class="p-odd"> + 閫氫俊绯荤粺涓昏鐢ㄤ簬椋炶涓笌鍦伴潰鎸囨尌鍛樻垨绌轰腑鍏朵粬椋炴満杩涜鍙屽悜璇煶 + </p> + </div> + </div> + </div> + <!-- 106椤� --> + <div class="page-box" page="114"> + <div v-if="showPageList.indexOf(114) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">106</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 瀵硅瘽鍜屼俊鍙疯仈绯伙紝杩樻彁渚涙満缁勬垚鍛樹箣闂寸殑璇煶鑱旂郴銆佹満缁勫瀹㈣埍鐨勮仈绯荤瓑鍔熻兘銆傞�氫俊绯荤粺鍦ㄧ粨鏋勪笂鍖呮嫭鐢氶珮棰戦�氫俊绯荤粺銆侀珮棰戦�氫俊绯荤粺銆侀�夋嫨鍛煎彨绯荤粺鍜岄煶棰戠患鍚堢郴缁熴�� + </p> + <p class="p-even"> + 瀵艰埅鏄寚寮曞椋炴満鎸夐瀹氱殑鑸嚎銆佸湪瑙勫畾鐨勬椂闂村噯纭埌杈鹃瀹氫綅缃殑鏂规硶銆傛棭鏈熺殑瀵艰埅涓昏鍒╃敤鑸┖鍦板浘渚濋潬鐩鍜屾満姊板紡浠〃杩涜锛屽彈澶╂皵鍜屼汉涓哄洜绱犲奖鍝嶅緢澶э紝瀹夊叏鎬т笉楂橈紝姘旇薄鏉′欢涓嶅ソ灏辨棤娉曡繘琛屻�傛棤绾跨數璁炬柦杩涘叆瀵艰埅棰嗗煙鍚庯紝瀵艰埅鐨勭簿搴﹀拰瀹夊叏鎬уぇ涓烘敼杩涳紝璁稿澶嶆潅姘旇薄鏉′欢涔熶笉鍐嶅奖鍝嶉琛屼簡銆傜幇鍦ㄩ鏈哄湪涓�浜涜鏂藉厛杩涚殑鏈哄満锛屽凡缁忓彲浠ュ湪鑳借搴�50m鐨勬潯浠朵笅瀹屾垚璧烽檷銆傛棤绾跨數瀵艰埅宸茬粡鏄皯鑸殑涓昏瀵艰埅鏂瑰紡涔嬩竴锛屾皯鐢ㄨ埅绾块鏈轰笂鐨勬棤绾跨數瀵艰埅璁惧涓昏鏈夋棤绾跨數缃楃洏绯荤粺銆佺敋楂橀鍏ㄥ悜淇℃爣绯荤粺锛圴OR锛夈�佷华琛ㄧ潃闄嗙郴缁燂紙鐩查檷绯荤粺锛孖LS锛夈�佹棤绾跨數楂樺害琛ㄣ�佹祴璺濇満绛夈�� + </p> + <p class="p-even"> + 姘戠敤椋炴満鐨勯浄杈剧郴缁熶富瑕佸寘鎷皵璞¢浄杈俱�佸簲绛旀満鍜岀┖涓鍛婂強閬挎挒绯荤粺銆� + </p> + <h5 id="e037" class="p-even unit2-c">锛堜簩锛夋棤绾跨數缃楃洏</h5> + <div class="img-float w220 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0118-1.jpg" /> + <p class="img">鍥�2-114 鏃犵嚎鐢电綏鐩�</p> + </div> + <span> + <p class="p-even"> + 鏃犵嚎鐢电綏鐩橈紙鍥�2-114锛夊張鍙棤绾跨數鍏ㄧ綏鐩橈紝绠�绉板叏缃楃洏銆備粠鈥滅綏鐩樷�濊繖涓悕绉颁笂鐪嬶紝瀹冧技涔庢槸鎸囩ず鑸悜鐨勪华琛紝浣嗗畠鍙堜笉鑳芥寚绀洪鏈虹旱杞寸浉瀵逛簬鍦扮鍖楁瀬鐨勬柟鍚戯紝涓庝紶缁熺殑缃楃洏鏈夊尯鍒�傜敱浜庢寚绀虹殑涓嶆槸鍦扮悊鎴栧湴纾佹柟鍚戯紝琛ㄧ洏涓婄殑0掳銆�90掳銆�180掳鍜�270掳涔熷氨涓嶇敤鍖椼�佷笢銆佸崡銆佽タ锛圢銆丒銆丼銆乄锛夎〃绀猴紝鑰屾槸鐩存帴鍒讳笂鐩稿簲鐨勬暟瀛椼�� + </p> + </span> + <p class="p-even"> + 鏃犵嚎鐢电綏鐩樻寚绀虹殑鏄湴闈㈠鑸彴鐩稿浜庨鏈虹殑鏂逛綅瑙掞紝闇�瑕佸湴闈㈡棤绾跨數瀵艰埅鍙帮紙NDB锛夌殑閰嶅悎鎵嶈兘宸ヤ綔銆傚湴闈㈠鑸彴閫氬父璁惧湪鏈哄満璺戦亾寤堕暱绾夸笂锛屽彂灏勫嚭鏃犳柟鍚戠數纾佹尝浣滀负瀵艰埅淇″彿銆傛棤绾跨數缃楃洏鐨勬帴鏀惰缃�氳繃璋冭皭鎺ユ敹鍒板鑸俊鍙凤紝娴嬪嚭椋炴満绾佃酱涓庣數娉㈡潵鍚戦棿鐨勫す瑙掞紙鐩稿鏂逛綅瑙掞級锛屽啀鐢ㄧ數姘斿悓姝ュ櫒灏嗚繖涓搴︿俊鍙蜂紶閫佸埌鎸囩ず鍣紝鎸囩ず鍑哄湴闈㈠鑸彴鐩稿浜庨鏈虹殑鏂逛綅瑙掋�� + </p> + <p class="p-even"> + 鏃犵嚎鐢电綏鐩樻寚閽堟寚0掳琛ㄧず鍦伴潰瀵艰埅鍙板湪椋炴満姝e墠鏂癸紝鎸�90掳琛ㄧず鍦伴潰瀵艰埅鍙板湪椋炴満姝e彸鏂癸紝鎸�180掳琛ㄧず鍦伴潰瀵艰埅鍙板湪椋炴満姝e悗鏂癸紝鎸�270掳琛ㄧず鍦伴潰瀵艰埅鍙板湪椋炴満姝e乏鏂广�傞�氳繃鏃犵嚎鐢电綏鐩橈紝椋炶鍛樺彲浠ュ緢杞绘澗鍦版壘鍒扮洰鏍囨満鍦恒�� + </p> + </div> + </div> + </div> + <!-- 107椤� --> + <div class="page-box" page="115"> + <div v-if="showPageList.indexOf(115) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">107</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 涓嶅悓鏈哄満鐨勫湴闈㈠鑸彴鍙戝皠鐨勭數纾佹尝棰戠巼涓嶅悓锛屽湪璺濈洰鏍囨満鍦轰竴瀹氳窛绂绘椂锛岄琛屽憳瑕侀�氳繃鏃犵嚎鐢电綏鐩樼殑璋冭皭瑁呯疆杩涜璋冭皭锛屾帴鏀跺埌璇ユ満鍦虹殑瀵艰埅鐢电娉紝缃楃洏鎵嶈兘姝g‘鎸囩ず銆傚鑸數纾佹尝鐨勯鐜囪鐩栦簡AM鏃犵嚎鐢靛箍鎾鐜囷紝鍥犳鍦ㄨ窛鐩爣鏈哄満澶繙銆佹棤娉曟敹鍒板鑸俊鍙锋椂锛屾湁鐨勯琛屽憳鍒╃敤AM骞挎挱鏉ュ鑸紝涔熷彲椋炲埌璇ュ煄甯備笂绌猴紙AM鐢靛彴涓婄┖锛夈�� + </p> + <h5 id="e038" class="p-odd unit2-c">锛堜笁锛夋棤绾跨數楂樺害琛�</h5> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0119-1.jpg" /> + <p class="img">鍥�2-115 鏃犵嚎鐢甸珮搴﹁〃</p> + </div> + <span> + <p class="p-odd"> + 鏃犵嚎鐢甸珮搴﹁〃锛堝浘2-115锛夋槸娴嬮噺椋炴満鍒板湴闈㈠瀭鐩磋窛绂荤殑鏃犵嚎鐢佃缃紝鐢卞彂灏勩�佹帴鏀惰缃拰鏄剧ず鍣ㄧ粍鎴愩�傚伐浣滃師鐞嗘槸鐢卞彂灏勮缃悜鍦伴潰鍙戝皠鐢电娉紝纰板埌鍦伴潰鍚庣數纾佹尝琚弽灏勫洖鏉ワ紝鎺ユ敹瑁呯疆鎺ユ敹鍒板弽灏勪俊鍙峰悗锛屾牴鎹彂灏勫嚭鍘诲拰鎺ユ敹鍒板洖娉㈡墍鐢ㄧ殑鏃堕棿宸紝璁$畻鍑洪鏈哄埌鍦伴潰鐨勯珮搴︼紙鍥�2-116锛夈�� + </p> + </span> + <p class="center p-odd openImgBox"> + <img class="img-b" alt="" src="../../assets/images/0119-2.jpg" /> + </p> + <p class="img p-odd">鍥�2-116 鏃犵嚎鐢甸珮搴﹁〃鍘熺悊</p> + <p class="p-odd"> + 鏃犵嚎鐢甸珮搴﹁〃鑳借緝绮剧‘鍦版寚绀哄嚭鐪熷疄楂樺害锛屽湪璧烽鍜岃繘杩戠潃闄嗘椂鐢ㄥ緱杈冨銆備絾椋炴満甯﹀�炬枩鏃朵細鍑虹幇鎸囩ず涓嶅噯鐨勬儏鍐碉紝浣庣┖椋炶鏃跺彈鍦伴潰寤虹瓚绛夌殑褰卞搷涔熻緝澶с�� + </p> + <p class="p-odd"> + 姘戣埅椋炴満浣跨敤鐨勬棤绾跨數楂樺害琛ㄦ槸娴嬮噺鑼冨洿鍦�0锝�2500鎴�0锝�5000ft锛�1m=3.2808ft锛夌殑浣庨珮搴︾敤琛紝楂樼┖浣跨敤鐨勬槸姘斿帇寮忛珮搴﹁〃銆� + </p> + <h4 id="d035" class="p-odd unit2-c">浜斻�佺數瀛愮患鍚堜华琛�</h4> + <p class="p-odd"> + 鍦�20涓栫邯60骞翠唬鍚庢湡锛岀數瀛愭樉绀烘妧鏈彇寰椾簡寰堝ぇ鍙戝睍锛岀數瀛愯绠楁満涔熷簲鐢ㄥ埌鑸┖浠〃棰嗗煙锛屽偓鐢熶簡鐢靛瓙缁煎悎浠〃锛屼娇寰楄埅绌轰华琛ㄥ彂鐢熶簡闈╁懡鎬� + </p> + </div> + </div> + </div> + <!-- 108椤� --> + <div class="page-box" page="116"> + <div v-if="showPageList.indexOf(116) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">108</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鐨勫彉鍖栥�傞珮搴﹀彂灞曠殑鏁板瓧鍖栥�佷俊鎭寲銆佺綉缁滃寲鎶�鏈紝淇冧娇鐜颁唬椋炴満閮介噰鐢ㄨ緝澶у睆骞曟樉绀虹殑缁煎悎椋炶鐢靛瓙浠〃绯荤粺銆� + </p> + <p class="p-even"> + 涓栫晫涓婁富瑕佺殑椋炴満鐢靛瓙缁煎悎浠〃鍘傚晢鏈変笁瀹讹細闇嶅凹闊﹀皵鍏徃锛圚oneywell锛夈�佺綏鍏嬮煢灏�-鏌灄鏂浗闄呭叕鍙革紙Rockwell + Collins锛夊拰缇庡浗楂樻槑鍏徃锛圙armin锛夈�傚叾涓ぇ涓瀷椋炴満澶氶噰鐢ㄩ湇灏奸煢灏斿叕鍙哥殑浜у搧锛屽皬鍨嬮鏈哄閫夌敤缃楀厠闊﹀皵-鏌灄鏂浗闄呭叕鍙哥殑浜у搧锛岃交鍨嬮鏈哄箍娉涢噰鐢ㄩ珮鏄庡叕鍙哥殑浜у搧銆傛棤璁轰粈涔堥鏈猴紝椋炶鍛橀渶瑕佷簡瑙g殑鍩烘湰淇℃伅閮芥槸涓�鏍风殑锛屽洜姝ゆ棤璁哄摢瀹跺叕鍙哥殑浜у搧锛屽叾涓昏鎬ц兘鍩烘湰鐩稿悓銆� + </p> + <p class="p-even"> + 鍜屽父瑙勪华琛ㄧ浉姣旓紝鐢靛瓙缁煎悎浠〃鎶婂悇绉嶇浉鍏虫暟鎹患鍚堝鐞嗗悗锛屽湪涓�涓樉绀哄睆骞曚笂鏄剧ず鍑烘潵锛屼娇椋炴満浠〃鏁伴噺澶уぇ鍑忓皯锛岃椋炶鍛樿兘杩呴�熻幏鍙栨墍闇�瑕佺殑淇℃伅銆傜數瀛愮患鍚堜华琛ㄦ樉绀哄睆涓讳綋鏄笂钃濅笅妫曠殑鍦板钩浠紝宸︿晶鏄剧ず绌洪�熴�佸彸渚ф樉绀洪珮搴︼紝涓嬫柟鏄剧ず鑸悜锛屽拰鍩哄噯T绫讳技锛堝浘2-117锛夈�� + </p> + <p class="center p-even openImgBox"> + <img class="img-c" alt="" src="../../assets/images/0120-1.jpg" /> + </p> + <p class="img p-even">鍥�2-117 Garmin2000鐢靛瓙缁煎悎浠〃</p> + <p class="p-even"> + 鐢靛瓙缁煎悎浠〃涓嶄粎鏄剧ず缁煎悎鏁版嵁锛岃繕鑳介�氳繃鍒嗘瀽缁欏嚭鎸囧紩淇″彿鍜屽缓璁紝璁╅琛屽憳鑳芥寜鏈�浣虫柟寮忔搷绾甸鏈恒�備笌椋炶绠$悊绯荤粺浜よ仈锛岃繕鍙互灏嗗ぇ閮ㄥ垎宸ヤ綔浜ょ敱椋炶绠$悊璁$畻鏈烘潵瀹屾垚锛岄琛屽憳闄よ捣椋炪�佺潃闄嗗锛屽ぇ閮ㄥ垎鏃堕棿鍙渶杩涜鐩戞帶鍜岀鐞嗭紝澶уぇ鍑忓皯浜嗕汉涓哄樊閿欙紝鎻愰珮浜嗛琛屽畨鍏ㄧ郴鏁般�� + </p> + </div> + </div> + </div> + <!-- 109椤� --> + <div class="page-box" page="117"> + <div v-if="showPageList.indexOf(117) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">109</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-odd unit2-c"> + 瀛︿範浠诲姟鍏�<br />璁よ瘑椋炴満鐨勪富瑕佺郴缁� + </h3> + <div class="task-u2-c"></div> + <p class="p-odd"> + 椋炴満涓婁负钀ラ�犲畨鍏ㄨ垝閫傜殑涔樻満鐜銆佷负鐢ㄤ簬鎿嶇旱鎺у埗椋炴満绛夐渶瑕侊紝璁剧疆浜嗚澶氱郴缁燂紝濡傛搷绾电郴缁熴�佺噧娌圭郴缁熴�侀槻鍐伴槻闆ㄧ郴缁熴�侀槻鐏郴缁熺瓑銆傛湰浠诲姟涓昏浠嬬粛娑插帇涓庢皵鍘嬬郴缁熴�佺數姘旂郴缁熴�佺幆鎺х郴缁熴�佸鑸辫澶囧強鏁戠敓璁炬柦銆� + </p> + <h4 id="d036" class="p-odd unit2-c">涓�銆佹恫鍘嬩笌姘斿帇绯荤粺</h4> + <p class="p-odd"> + 鐜颁唬椋炴満閫熷害蹇�佷綋绉ぇ锛屽鑷存搷绾靛悇涓搷绾甸潰銆佹満涓婅鏂芥椂鎵�闇�鐨勬搷绾靛姏鐭╀笌鎿嶇旱鍔涢兘寰堝ぇ锛屼粎鍑琛屽憳浜哄姏鏄棤娉曞疄鏂芥搷绾电殑锛屾搷绾垫帶鍒堕鏈哄氨闇�瑕佸叾浠栧舰寮忕殑杈呭姪璁炬柦鏉ヤ紶鍔ㄣ�傜幇浠i鏈虹殑浼犲姩涓昏鏈夌數鍔涗紶鍔ㄣ�佹恫鍘嬩紶鍔ㄤ笌姘斿帇浼犲姩銆傚嚑涔庢墍鏈夎埅绾块鏈哄湪鎿嶇旱鎺у埗椋炴満鏂归潰閮戒娇鐢ㄤ簡娑插帇绯荤粺锛屼竴浜涘皬鍨嬮鏈哄垯浣跨敤鏇翠负绠�鍗曘�佽交渚跨殑姘斿帇绯荤粺銆傛恫鍘嬪拰姘斿帇绯荤粺閮藉叿鏈変綋绉皬銆佽川閲忓皬銆佽緭鍑虹殑鍔涘拰鍔涚煩澶с�佹搷绾垫晥鐜囧嚑涔庡彲杈�100%銆佺ǔ瀹氭�уソ銆佸畨瑁呯淮鎶ゆ柟渚跨瓑浼樼偣锛屾恫鍘嬬郴缁熻骞挎硾搴旂敤浜庡ぇ鍨嬮鏈哄悇鎿嶇旱闈紶鍔ㄣ�佽捣钀芥灦鏀舵斁銆侀鏈哄埞杞︺�佸墠杞浆寮瓑锛屾皵鍘嬬郴缁熶富瑕佺敤浜庡皬鍨嬮鏈哄拰鍦ㄥぇ鍨嬮鏈轰笂鍏呭綋娑插帇绯荤粺鐨勫浠姐�� + </p> + <p class="p-odd"> + 娑插帇绯荤粺鐢辨恫鍘嬫补绠便�佹恫鍘嬫车銆佽搫鍘嬪櫒銆佹补婊ゃ�侀榾闂ㄣ�佸紑鍏冲拰浣滃姩鍣� + </p> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0121-1.jpg" /> + <p class="img">鍥�2-118 鍩烘湰娑插帇绯荤粺</p> + </div> + <span> + <p class="p-odd td-0"> + 绛夌粍鎴愶紝鏄川閲忚緝灏忕殑鑳介噺浼犻�掔郴缁熶箣涓�銆傛恫鍘嬬郴缁熺殑宸ヤ綔鍘熺悊鏄笗鏂崱鍘熺悊锛氬姞鍦ㄥ瘑闂恫浣撲笂鐨勫帇寮猴紝鑳藉澶у皬涓嶅彉鍦板悜鍚勪釜鏂瑰悜浼犻�掋�傛恫鍘嬬郴缁熷氨鏄埄鐢ㄦ恫鍘嬫车瀵规恫鍘嬫补鍔犲帇锛岄�氳繃绠¢亾浼犻�掑埌浣滃姩鍣紝椹卞姩浣滃姩鍣ㄦ墽琛屽姩浣溿�傚熀鏈恫鍘嬬郴缁熷鍥�2-118鎵�绀恒�� + </p> + </span> + </div> + </div> + </div> + <!-- 110椤� --> + <div class="page-box" page="118"> + <div v-if="showPageList.indexOf(118) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">110</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 娑插帇娌圭鐢ㄤ簬鍌ㄥ瓨涓�瀹氱殑娑插帇娌瑰拰鍥炴敹绠¢亾鍐呮祦鍏ョ殑浣庡帇娑插帇娌广�傛恫鍘嬫补瑕佹眰鏈変竴瀹氶粡鎬с�佸寲瀛︽�ц川绋冲畾銆佸浜轰綋鏃犲锛屽父灏嗘煋鎴愭贰绱壊鐨勭7閰搁叝鍩哄悎鎴愭恫浣滀负娑插帇娌癸紝甯哥О涓衡�滅传娌光�濄�� + </p> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0122-1.jpg" /> + <p class="img">鍥�2-119 鏌卞寮忔恫鍘嬫车绀烘剰鍥�</p> + </div> + <span> + <p class="p-even"> + 澶у瀷椋炴満涓婂閲囩敤鏌卞寮忔恫鍘嬫车锛堝浘2-119锛夈�傛恫鍘嬫车閫氬父鐢卞彂鍔ㄦ満甯﹀姩锛屽湪鏂滅洏鐨勪綔鐢ㄤ笅锛屾煴濉炶浆鍒颁笂鏂规椂灏嗘补娑蹭粠娌圭鍐呮娊鍑猴紝杞埌涓嬫柟鏃跺皢鏌卞鍐呯殑娌规恫鍔犲帇鎸ゅ叆绠¢亾锛岀瓑寰呴┍鍔ㄤ綔鍔ㄥ櫒宸ヤ綔銆傚ぇ鍨嬭埅绾块鏈虹殑娑插帇绯荤粺鍘嬪姏鍙揪20.7MPa锛堢害205涓爣鍑嗗ぇ姘斿帇锛夈�備负闃叉娑插帇娉垫晠闅滄椂娑插帇绯荤粺涓嶅伐浣滐紝璁稿椋炴満闄ゆ恫鍘嬫车澶栵紝杩樿鏈夋墜鎽囨车鍜屽啿鍘嬬┖姘旀丁杞�傚啿鍘嬬┖姘旀丁杞瘑灏佷簬鏈虹考鎴栨満韬唴锛屽綋鍙戝姩鏈哄拰杈呭姪鍔ㄥ姏瑁呯疆閮藉彂鐢熸晠闅滄椂浠庢満缈兼垨鏈鸿韩鍐呬几鍑猴紝鍦ㄧ浉瀵规皵娴佺殑浣滅敤涓嬭浆鍔紝甯﹀姩娑插帇娉靛伐浣溿�� + </p> + </span> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0118-01.jpg" /> + <p class="img">鍥�2-120 钃勫帇鍣�</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0118-02.jpg" /> + <p class="img">鍥�2-120 钃勫帇鍣�</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <p class="p-even"> + 钃勫帇鍣ㄧ殑浣滅敤鏈変袱涓細瀛樺偍鍘嬪姏銆佺ǔ瀹氬帇鍔涖�傚父鐢ㄧ殑钃勫帇鍣ㄦ湁绛掑紡鍜岀悆寮忎袱绉嶏紙鍥�2-120锛夈�傜敱浜庢恫浣撲笉鍙帇缂╋紝涔熷氨涓嶈兘瀛樺偍鍘嬪姏锛屼竴鏃︽恫鍘嬫车涓嶅伐浣滐紝绠¢亾鍐呯殑楂樺帇娌规恫绔嬪嵆澶卞幓鍘嬪姏锛屾恫鍘嬬郴缁熶篃灏变笉鑳藉伐浣滀簡銆傝搫鍘嬪櫒鍒╃敤姘斾綋鐨勫彲鍘嬬缉鎬ф潵瀛樺偍鍘嬪姏锛岃搫鍘嬪櫒鍐呴儴绌洪棿鐢辨椿濉炴垨闅旇啘鍒嗛殧鎴愪袱閮ㄥ垎锛屼竴閮ㄥ垎杩炴帴娑插帇绠¢亾锛屽彟涓�閮ㄥ垎濉厖楂樺帇姘斾綋锛堥�氬父涓烘爱姘旓級銆傚湪绠¢亾鍐呮湁楂樺帇鏃讹紝娌规恫鍘嬬缉姘斾綋锛屼娇姘斾綋鐨勫帇鍔涜揪鍒扮閬撳唴鐨勫帇鍔涖�備竴鏃︽恫鍘嬫车涓嶅伐浣滐紝楂樺帇姘斾綋灏卞绠¢亾鍐呯殑娌规恫鏂藉帇锛屼娇涔嬪叿鏈夐珮鍘嬶紝淇濊瘉娑插帇绯荤粺浠嶆湁涓�瀹氱殑宸ヤ綔鑳藉姏銆傝搫鍘嬪櫒杩樺叿鏈夌ǔ瀹氬帇鍔涚殑浣滅敤锛岀敱浜庢煴濉炲紡娑插帇娉电粰绠¢亾鎻愬崌鍘嬪姏鏄剦鍔ㄧ殑銆佷笉杩炵画鐨勶紝鍦ㄦ煴濉炲悜绠¢亾鎸ゅ叆娌规恫鏃跺帇鍔涘緢楂橈紝涓�鏃﹁浆绂荤閬擄紝灏变笉鏂藉帇浜嗭紝钃勫帇鍣ㄥ彲浠ヨ捣鍒扮紦鍐蹭綔鐢紝浣跨閬撳唴娌规恫鐨勫帇鍔涚ǔ瀹氾紝淇濊瘉娑插帇绯荤粺鍙潬宸ヤ綔銆� + </p> + <p class="p-even"> + 娑插帇绯荤粺绠¢亾鍐呰繕瀹夎鏈夋恫鍘嬫补婊わ紙鍥�2-121锛夛紝灏嗘补娑蹭腑鐨勬潅璐ㄦ护 + </p> + </div> + </div> + </div> + <!-- 111椤� --> + <div class="page-box" page="119"> + <div v-if="showPageList.indexOf(119) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">111</li> + </ul> + <div class="bodystyle"> + <div class="img-rights w220 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0123-1.jpg" /> + <p class="img">鍥�2-121 娑插帇娌规护</p> + </div> + <span> + <p class="p-odd td-0"> + 闄わ紝纭繚杈撳叆浣滃姩鍣ㄧ殑娌规恫娲佸噣锛屼笉浼氬牭濉炪�佹崯鍧忎綔鍔ㄥ櫒銆傜幇浠i鏈烘恫鍘嬬郴缁熺殑娌规护鑳藉婊ら櫎鍑犲井绫充互涓婄殑寰矑銆� + </p> + <p class="p-odd"> + 娑插帇绯荤粺涓殑闃�闂ㄧ敤浜庡帇鍔涙帶鍒跺拰娴侀噺鎺у埗锛岀敤浜庡帇鍔涙帶鍒剁殑涓昏鏄畨鍏ㄩ榾锛岀敤浜庢祦閲忔帶鍒剁殑涓昏鏄崟鍚戦榾銆傚畨鍏ㄩ榾鐨勫姛鐢ㄦ槸閲婂帇锛屼娇绠¢亾鍐呯殑鍘嬪姏淇濇寔鍦ㄤ竴瀹氳寖鍥村唴锛屼笉鑷充簬鍘嬪姏杩囧ぇ锛屾崯鍧忕郴缁熴�傚湪鏈娇鐢ㄦ恫鍘嬫椂锛屾恫鍘嬫车涔熷湪宸ヤ綔锛屼笉鍋滃湴鍔犲帇浼氬鑷寸閬撳唴鍘嬪姏杩囬珮鑰屾崯鍧忕郴缁燂紝褰撳帇鍔涜揪鍒颁竴瀹氬�兼椂锛屽彲浠ラ《寮�瀹夊叏闃�锛屼娇閮ㄥ垎娌规恫娴佸洖娌圭锛岃揪鍒伴噴鍘嬬殑鐩殑锛屼繚璇佺郴缁熷帇鍔涚ǔ瀹氥�傚崟鍚戦榾锛堝浘2-122锛夌殑浣滅敤鏄帶鍒舵补娑插彧鑳藉悜涓�涓柟鍚戞祦鍔紝涓嶈兘鍥炴祦銆� + </p> + </span> + <p class="p-odd"> + 寮�鍏充富瑕佺敤浜庢帶鍒舵恫鍘嬬郴缁熷伐浣滐紝鏈�甯歌鐨勬槸鐢ㄤ簬璧疯惤鏋跺拰瑗熺考鏀舵斁鐨勫弻鍚戞帶鍒舵椿闂ㄣ�傞珮鍘嬫补娑茶繛鎺ュ浘2-123涓甫绠ご鐨勭閬擄紝鎺у埗娲诲鍦ㄥ浘涓綅缃椂锛屾补娑蹭笉鑳芥祦鍔紝澶勪簬涓珛浣嶇疆锛涘悜宸︽帹鍔ㄦ帶鍒舵椿濉烇紝娌规恫灏嗛�氳繃鍙充晶涓婁笅涓よ矾绠¢亾娴佸姩锛屽甫鍔ㄧ浉搴旂殑浣滃姩鍣ㄥ伐浣滐紙鏈夌殑娲婚棬鍙湁涓�璺緭鍑猴級锛涘悜鍙虫媺鍔ㄦ帶鍒舵椿濉烇紝娌规恫灏嗕粠宸﹁竟绠¢亾娴佸嚭锛屽甫鍔ㄤ綔鍔ㄥ櫒宸ヤ綔銆� + </p> + <div class="fl al-fe p-odd"> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0123-2.jpg" /> + </p> + <p class="img">鍥�2-122 鍗曞悜闃�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0123-3.jpg" /> + </p> + <p class="img">鍥�2-123 鏂瑰悜鎺у埗娲婚棬</p> + </span> + </div> + <p class="p-odd"> + 浣滃姩鍣ㄦ槸娑插帇绯荤粺涓墽琛屽姩浣滅殑閮ㄤ欢锛屽寘鎷墽琛岀洿绾垮姩浣滅殑浣滃姩绛掑拰杈撳嚭杞姩鐨勬恫鍘嬮┈杈俱�備綔鍔ㄧ瓛涔熷彨鍔ㄤ綔绛掞紝鏈夊崟浣滅敤鍜屽弻浣滅敤涓ょ锛堝浘2-124锛夈�傞珮鍘嬫补娑蹭粠閫氭补鍙f祦鍏ュ悗锛屼細鎺ㄥ姩娲诲杩愬姩锛屾椿濉炰笂鐨勮繛鏉嗗氨浼氬甫鍔ㄧ浉搴旂殑閮ㄤ欢宸ヤ綔銆傛恫鍘嬮┈杈惧唴閮ㄦ湁鍙惰疆锛岄珮鍘嬫补娑叉祦杩囨椂浼氬甫鍔ㄥ彾杞浆鍔紝鍙�氳繃鍙惰疆甯﹀姩榻胯疆绛夐儴浠舵墽琛岀浉搴旂殑鍔ㄤ綔銆� + </p> + </div> + </div> + </div> + <!-- 112椤� --> + <div class="page-box" page="120"> + <div v-if="showPageList.indexOf(120) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">112</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0120-01.jpg" /> + <p class="img">鍥�2-124 涓ょ褰㈠紡鐨勪綔鍔ㄧ瓛</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img class="" src="../../assets/images/0120-02.jpg" /> + <p class="img">鍥�2-124 涓ょ褰㈠紡鐨勪綔鍔ㄧ瓛</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <div class="img-float w395 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0124-2.jpg" /> + <p class="img">鍥�2-125 璧疯惤鏋朵笌瑗熺考鏀舵斁绯荤粺</p> + </div> + <span> + <p class="p-even"> + 浠庢煇澶у瀷椋炴満鐨勮捣钀芥灦鍜岃缈兼敹鏀剧郴缁燂紙鍥�2-125锛夊彲杈冨叏闈㈠湴浜嗚В娑插帇绯荤粺鐨勫伐浣滆繃绋嬨�� + </p> + <p class="p-even"> + 姘斿帇绯荤粺鍙堝彨鍐锋皵绯荤粺锛屼笌娑插帇绯荤粺鐩镐技锛屽彧鏄敤瀛樺偍楂樺帇姘斾綋鐨勫喎姘旂摱浠f浛浜嗘恫鍘嬫补绠憋紝鍙戝姩鏈哄甫鍔ㄥ喎姘旀车涓嶆柇鍦颁粠澶ф皵涓惛鍏ョ┖姘旓紝鍔犲帇鍚庨�佸叆鍐锋皵鐡跺偍瀛橈紝楂樺帇姘斾綋鎵ц浜嗗姩浣滀箣鍚庡氨鎺掓斁鍒板ぇ姘斾腑涓嶅啀鍥炴敹銆傚彈姘斾綋鐨勫彲鍘嬬缉鎬у奖鍝嶏紝鍜屾恫鍘嬬郴缁熺浉姣旓紝姘斿帇绯荤粺鏈変互涓嬬壒鐐癸細娌℃湁鑷攣鍔熻兘锛屾墽琛屽姩浣滅殑鍑嗙‘鎬х◢宸紱姘斾綋瀵嗗害灏忋�佹祦鍔ㄩ樆鍔涘皬锛屼紶鍔ㄥ姩浣滄洿鏁忔嵎锛屼絾瀵规墽琛屾満鏋勭殑鎾炲嚮澶э紱涓嶉渶瑕佸洖鏀舵皵浣擄紝绯荤粺缁撴瀯绠�鍗曘�佽川閲忓皬銆傛皵鍘嬬郴缁熺ず鎰忓浘濡傚浘2-126鎵�绀恒�� + </p> + <p class="p-even"> + 鍐锋皵绯荤粺涓�鑸彧鐢ㄤ簬灏忓瀷椋炴満鎴栦綔涓烘恫鍘嬬郴缁熺殑澶囦唤銆� + </p> + </span> + </div> + </div> + </div> + <!-- 113椤� --> + <div class="page-box" page="121"> + <div v-if="showPageList.indexOf(121) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">113</li> + </ul> + <div class="bodystyle"> + <p class="center p-odd openImgBox"> + <img class="w80" alt="" src="../../assets/images/0125-1.jpg" /> + </p> + <p class="img p-odd">鍥�2-126 姘斿帇绯荤粺绀烘剰鍥�</p> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 涓轰繚璇佹恫鍘嬬郴缁熷伐浣滃彲闈狅紝鐗瑰埆鏄寮洪琛屾搷绾电郴缁熺殑娑插帇鍔ㄥ姏婧愮殑鍙潬鎬э紝鐜颁唬椋炴満涓婂ぇ澶氳鏈変袱濂楋紙鎴栧濂楋級鐩镐簰鐙珛鐨勬恫鍘嬬郴缁熴�傚畠浠垎鍒О涓哄叕鐢ㄦ恫鍘嬬郴缁熷拰鍔╁姏锛堟搷绾碉級娑插帇绯荤粺銆傚叕鐢ㄦ恫鍘嬬郴缁熺敤浜庤捣钀芥灦銆佽缈煎拰鍑忛�熸澘鐨勬敹鏀撅紝鍓嶈疆杞集鎿嶇旱锛岄┍鍔ㄩ鎸¢洦鍒峰拰鐕冩补娉电殑娑插帇椹揪绛夛紝鍚屾椂杩樼敤浜庨┍鍔ㄩ儴鍒嗗壇缈笺�佸崌闄嶈埖锛堟垨鍏ㄥ姩骞冲熬锛夊拰鏂瑰悜鑸电殑鍔╁姏鍣ㄣ�傚姪鍔涙恫鍘嬬郴缁熶粎鐢ㄤ簬椹卞姩涓婅堪椋炶鎿嶇旱绯荤粺鐨勫姪鍔涘櫒鍜岄樆灏艰埖鏈虹瓑锛屽姪鍔涙恫鍘嬬郴缁熸湰韬篃鍙寘鍚袱濂楃嫭绔嬬殑娑插帇绯荤粺銆備负杩涗竴姝ュ寮烘恫鍘嬬郴缁熺殑鍙潬鎬э紝绯荤粺涓繕骞惰仈鏈夊簲鎬ョ數鍔ㄦ补娉靛拰搴旀�ュ啿鍘嬬┖姘旀丁杞�傞鏈哄彂鍔ㄦ満鍙戠敓鏁呴殰浣挎恫鍘嬬郴缁熷け鍘昏兘婧愭椂锛屽彲鐢卞簲鎬ョ數鍔ㄦ补娉垫垨浼稿嚭搴旀�ュ啿鍘嬬┖姘旀丁杞娇娑插帇绯荤粺缁х画宸ヤ綔銆� + </p> + </span> + </div> + <h4 id="d037" class="p-odd unit2-c">浜屻�佺數姘旂郴缁�</h4> + <p class="p-odd"> + 椋炴満鐨勭數姘旂郴缁熸槸鎸囬鏈轰笂鐨勪緵鐢靛拰鐢ㄧ數璁惧绯荤粺銆傛棭鏈熼鏈虹敤鐢靛緢 + </p> + </div> + </div> + </div> + <!-- 114椤� --> + <div class="page-box" page="122"> + <div v-if="showPageList.indexOf(122) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">114</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 灏戯紝浠呯敤浜庢棤绾跨數銆佺収鏄庡拰鍙戝姩鏈哄惎鍔ㄧ瓑鏂归潰銆傜敱浜庣數鑳芥槗浜庝紶杈撱�佹帶鍒讹紝鐜板湪缁濆ぇ閮ㄥ垎鏈鸿浇璁惧浠ョ數涓鸿兘婧愩�傚湪椋炴満鎺у埗鏂归潰锛岀數浼犳搷绾电郴缁熻骞挎硾閲囩敤銆傞殢鐫�鐢垫皵鎶�鏈殑鍙戝睍锛屾湭鏉ヨ繕鍙兘鍑虹幇娑插帇浼犲姩绛夐兘琚數鑳藉彇浠g殑鈥滃叏鐢甸鏈衡�濓紝鎵�鏈夌殑鎿嶇旱鍜岃浆鎹㈤兘鐢辩數浼犻�併�備粠姘戠敤椋炴満鎻愰珮鏈嶅姟璐ㄩ噺鐨勭洰鐨勫嚭鍙戯紝椋炴満涓婂鍔犱簡瓒婃潵瓒婂鐨勭敤鐢佃澶囷紝濡傚ぇ鑼冨洿鐨勭収鏄庛�佸鑸卞ū涔愩�佸帹鎴胯鏂界瓑銆傚ぇ鍨嬮鏈虹敤鐢甸噺楂樿揪鍑犵櫨鍗冪摝锛屼粎閰嶇數绾胯矾鐨勮川閲忓氨杈惧嚑鐧惧崈鍏嬶紝鐢垫皵绯荤粺宸叉垚涓洪鏈虹殑涓�涓富瑕佸伐浣滅郴缁熴�� + </p> + <p class="p-even"> + 鐢垫皵绯荤粺鍖呮嫭鐢垫簮绯荤粺銆侀厤鐢电郴缁熷拰鐢ㄧ數璁惧锛屾湁鐨勫湴鏂规妸鐢垫簮绯荤粺鍜岄厤鐢电郴缁熷悎绉扳�滀緵鐢电郴缁熲�濄�� + </p> + <h5 id="e039" class="p-even unit2-c">锛堜竴锛夌數婧愮郴缁�</h5> + <p class="p-even"> + 椋炴満涓婄敤鏉ヤ骇鐢熺數鑳界殑绯荤粺鍙鏈虹殑鐢垫簮绯荤粺銆傜數婧愮郴缁熺敱涓荤數婧愩�佽緟鍔╃數婧愩�佸簲鎬ョ數婧愬拰浜屾鐢垫簮缁勬垚銆備富鐢垫簮鏄寚鐢遍鏈哄彂鍔ㄦ満甯﹀姩鐨勫彂鐢垫満锛岃緟鍔╃數婧愭槸鎸囪緟鍔╁姩鍔涜缃甫鍔ㄧ殑杈呭姪鍙戠數鏈哄拰鏈鸿浇钃勭數姹狅紝搴旀�ョ數婧愪竴鑸敱椋炴満涓婄殑搴旀�ュ啿鍘嬬┖姘旀丁杞甫鍔紝浜屾鐢垫簮鎸囧皢鍏朵粬鐢垫簮鎻愪緵鐨勭數鑳界粡澶勭悊鍙樻崲鎴愬彟澶栬鏍硷紙鐢靛帇銆侀鐜囥�佷氦鐩存祦鍙樻崲绛夛級浠ヤ緵涓嶅悓鐢ㄧ數璁惧浣跨敤鐨勭數婧愩�� + </p> + <p class="p-even"> + 涓�浜涘皬鍨嬮鏈哄父鐢ㄤ綆鍘嬬洿娴佺數婧愶紝鐢靛帇涓�28V銆傜洿娴佺數鐨勪紭鐐规槸缁撴瀯绠�鍗曪紝閰嶇數绯荤粺绠�鍗曘�佽川閲忓皬锛岀洿娴佺數鍔ㄦ満杞�熷揩銆佹壄鐭╁ぇ銆傜洿娴佸彂鐢垫満鍜岀洿娴佺數鍔ㄦ満鐨勭粨鏋勫畬鍏ㄧ浉鍚岋紝閲囩敤鐩存祦绯荤粺鐨勯鏈洪�氬父灏嗗彂鐢垫満鍚屾椂鐢ㄤ綔鍚姩鐢垫満锛屽彂鍔ㄦ満寮�杞︽椂鐢卞畠甯﹀姩鍙戝姩鏈烘棆杞紝鍙戝姩鏈烘甯稿伐浣滃悗鍙堢敱鍙戝姩鏈哄甫鍔ㄥ彂鐢垫満鍙戠數锛屽彲浠ョ渷鍘讳竴鍙板惎鍔ㄧ數鏈恒�備絾鐩存祦鍙戠數鏈哄瓨鍦ㄦ崲鍚戝櫒鏄撲骇鐢熺數鐏姳銆佸奖鍝嶇數瀛愪华琛ㄥ伐浣滐紝鍙樺帇涓嶆柟渚匡紝浣庡帇浼犻�侀渶瑕佽緝绮楃殑閰嶇數绾胯矾銆佸鍔犻厤鐢电郴缁熻川閲忕瓑缂洪櫡銆傚湪灏忓瀷椋炴満涓婅繖浜涚己闄峰奖鍝嶄笉澶с�傚ぇ鍨嬮鏈虹敤鐢甸噺澶э紝杩欎簺缂洪櫡灏卞挨涓虹獊鍑猴紝鍥犳锛屽ぇ鍨嬮鏈轰竴鑸笉閲囩敤鐩存祦鐢垫簮绯荤粺銆� + </p> + <p class="p-even"> + 澶у瀷椋炴満閫氬父閲囩敤浜ゆ祦鐢垫簮绯荤粺銆傛棭鏈熺殑浜ゆ祦鍙戠數鏈烘槸鍙橀鍙戠數鏈猴紝闅忕潃椋炶涓彂鍔ㄦ満杞�熸敼鍙橈紝鍙戠數鏈鸿浆閫熶篃鐩稿簲鍙樺寲锛岄�犳垚浜ゆ祦鐢甸鐜囧彂鐢熷彉鍖栥�傞鐜囧彉鍖栧悗瀵圭數闃诲瀷鐢ㄧ數璁惧娌′粈涔堝奖鍝嶏紝瀵圭數瀛愪华琛ㄣ�佹棤绾跨數绛夊棰戠巼瑕佹眰楂樼殑鐢ㄧ數璁惧褰卞搷寰堝ぇ锛岃�屽湪鐢ㄧ數閲忚緝澶ф椂鐢靛瓙绋抽寰堝洶闅撅紝鍥犳鍙橀鍙戠數鏈哄緢蹇氨琚亽棰戝彂鐢垫満鍙栦唬浜嗐�傜幇鍦ㄥぇ鍨嬮鏈轰笂浣跨敤鐨勯兘鏄甫鎭掗�熶紶鍔ㄨ缃殑涓夌浉浜ゆ祦鍙戠數鏈猴紝鍚戠郴缁熸彁渚�115V/200V銆�400Hz鐨� + </p> + </div> + </div> + </div> + <!-- 115椤� --> + <div class="page-box" page="123"> + <div v-if="showPageList.indexOf(123) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">115</li> + </ul> + <div class="bodystyle"> + <div class="img-rights w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 涓�浜涘皬鍨嬮鏈烘棤搴旀�ュ彂鐢垫満锛屽彧鑳戒娇鐢ㄨ搫鐢垫睜浣滀负搴旀�ョ數婧愩�傚彂鐢垫満鏂數鐨勬儏鍐典笅锛岃搫鐢垫睜鑳戒緵鐢�20min宸﹀彸銆� + </p> + </div> + </div> + <span> + <p class="p-odd td-0"> + 浜ゆ祦鐢点�傛棤璁哄彂鍔ㄦ満杞�熷浣曟敼鍙橈紝鎭掗�熶紶鍔ㄨ缃兘甯﹀姩鍙戠數鏈轰互鎭掑畾鐨勯�熷害杞姩锛屼娇鍙戠數鏈烘彁渚涚殑浜ゆ祦鐢甸鐜囨亽瀹氾紝婊¤冻鐢ㄧ數璁惧鐨勮姹傘�備笌鐩存祦绯荤粺鐩告瘮锛屼氦娴佺郴缁熸湁浠ヤ笅浼樼偣锛氫氦娴佸彂鐢垫満娌℃湁鎹㈠悜鍣紝鍐嶅ぇ鐨勭數娴佷篃涓嶄骇鐢熺數鐏姳锛屼笉浼氬鐢靛瓙浠〃銆佹棤绾跨數绛変骇鐢熷共鎵帮紱杈撻�佺數鍘嬮珮锛屾墍闇�閰嶇數绾胯矾鏃犻』澶矖锛屽噺灏戜簡閰嶇數绯荤粺鐨勮川閲忥紱鍙樼洿娴併�佸彉鍘嬮潪甯稿鏄撱�備氦娴佺郴缁熶篃鏈変竴浜涚己鐐癸細棣栧厛鏄彂鐢垫満涓嶈兘浣滀负鍚姩鐢垫満浣跨敤锛岄鏈哄繀椤诲崟鐙厤缃惎鍔ㄨ澶囷紝澧炲姞浜嗙粨鏋勮川閲忥紱鍏舵鏄氦娴佸彂鐢垫満鐨勫惎鍔ㄥ姏鐭╁拰璋冮�熸�ц繙涓嶅鐩存祦鍙戠數鏈猴紱鏈�鍚庢槸鎭掗�熶紶鍔ㄨ缃粨鏋勫鏉傘�佷环鏍兼槀璐碉紝鍦ㄤ娇鐢ㄤ腑鏁呴殰澶氥�佷慨澶嶅洶闅俱�傜洰鍓嶄娇鐢ㄧ殑鎭掗�熶紶鍔ㄨ缃涓烘恫鍘嬮┈杈鹃┍鍔ㄣ�� + </p> + </span> + <div class="img-rights openImgBox w200"> + <img class="img-0" alt="" src="../../assets/images/0127-1.jpg" /> + <p class="img">鍥�2-127 鑸┖钃勭數姹�</p> + </div> + <span> + <p> + 杈呭姪鍔ㄥ姏瑁呯疆甯﹀姩鐨勮緟鍔╁彂鐢垫満锛屽湪鍙戝姩鏈哄紑杞﹀墠鍜屽叧杞﹀悗鍚戦鏈烘彁渚涚數鑳斤紝婊¤冻搴ц埍鐓ф槑銆佺數瀛愯澶囩瓑鐨勭敤鐢甸渶姹傘�傚繀瑕佹椂锛岃搫鐢垫睜锛堝浘2-127锛変篃浣滀负杈呭姪鐢垫簮鍚戦鏈烘彁渚涚數鑳姐�傞鏈轰笂浣跨敤鐨勮搫鐢垫睜鏈変笁绉嶏細閰告�ч搮钃勭數姹犮�佺⒈鎬ч攲閾惰搫鐢垫睜鍜岀⒈鎬ч晬闀夎搫鐢垫睜銆傜幇浠i鏈轰笂浣跨敤杈冨鐨勬槸纰辨�ч攲閾惰搫鐢垫睜鍜岀⒈鎬ч晬闀夎搫鐢垫睜銆� + </p> + </span> + <p class="p-odd"> + 鐞嗚涓婏紝浠讳綍璁惧閮戒笉鑳戒繚璇佺粷瀵瑰彲闈狅紝涓轰簡闃叉椋炶杩囩▼涓富鐢垫簮鏁呴殰浣夸竴浜涚敤鐢佃澶囦笉鑳藉伐浣滆�屽嵄鍙婇琛屽畨鍏紝椋炴満涓婇兘閰嶅浜嗗簲鎬ュ啿鍘嬬┖姘旀丁杞┍鍔ㄧ殑搴旀�ュ彂鐢垫満锛屽悓鏃惰搫鐢垫睜鍙綔涓哄簲鎬ョ數婧愶紝鍦ㄧ揣鎬ユ儏鍐典笅涓洪鏈烘彁渚涚數鑳姐�� + </p> + <h5 id="e040" class="p-odd unit2-c">锛堜簩锛夐厤鐢电郴缁�</h5> + <p class="p-odd"> + 閰嶇數绯荤粺鍖呮嫭渚涚數绾胯矾缁勬垚鐨勭數缃戙�佸悇绉嶉厤鐢佃澶囧拰妫�鏌ヨ澶囩瓑銆� + </p> + <p class="p-odd"> + 鐜颁唬椋炴満鐨勪緵鐢垫柟寮忓ぇ澶氶噰鐢ㄥ崟绾垮埗渚涚數锛屽嵆鈥滀竴绾夸竴鍦扳�濓細涓�鏍光�滅伀绾库�濅负鐢ㄧ數鍣ㄤ緵鐢碉紝鍙栨秷鍥炶矾鈥滈浂绾库�濓紝鍥炶矾鐩存帴鎺ュ埌閲戝睘鏈轰綋涓娿�傝繖鏍风殑渚涚數鏂瑰紡锛岃妭鐪佷簡澶ч噺瀵肩嚎锛屽噺灏戜簡椋炴満缁撴瀯璐ㄩ噺銆傞鏈轰笂鐢ㄧ數璁惧澶氾紝渚涚數绾胯矾寰堝鏉傦紝閫氬父鐢ㄤ笉鍚岄鑹茬殑瀵肩嚎灏嗕笉鍚岀敤鐢佃澶囧垎寮�锛屼究浜庢鏌ュ拰缁存姢銆� + </p> + <p class="p-odd"> + 閰嶇數绯荤粺闄や簡瀵肩嚎锛岃繕鏈夊悇绉嶆帴澶淬�佸紑鍏炽�佺户鐢靛櫒鍜屼繚闄╄缃瓑銆備负淇濊瘉鍚勭鎺ュご鎺ヨЕ鍙潬锛岄�氬父閲囩敤鏈烘鍘嬪悎銆佺剨鎺ュ拰涓撶敤鐨勬帴澶寸瓑鏂瑰紡杩炴帴銆備繚闄╄缃�氬父鐢ㄨ烦寮�寮�鍏冲拰淇濋櫓绠°�� + </p> + </div> + </div> + </div> + <!-- 116椤� --> + <div class="page-box" page="124"> + <div v-if="showPageList.indexOf(124) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">116</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e041" class="p-even unit2-c">锛堜笁锛夌敤鐢佃澶�</h5> + <p class="p-even"> + 鏍规嵁鐢ㄧ數鏂瑰紡涓嶅悓锛岄鏈轰笂鐨勭敤鐢佃澶囦富瑕佹湁鐢靛瓙浠〃銆佺収鏄庛�佸姞鐑�佺數鍔ㄦ満鍑犲ぇ绫汇�� + </p> + <div class="img-float w220"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 鍐涚敤浣滄垬椋炴満搴ц埍閫氬父鐢ㄧ传澶栫伅涓轰华琛ㄦ澘鐓ф槑锛屽湪鎵ц浠诲姟鏃朵笉鏄撴毚闇茬洰鏍囥�� + </p> + </div> + </div> + <span> + <p class="p-even"> + 鐜颁唬椋炴満鐢靛瓙浠〃瀵圭數鍘嬪拰棰戠巼瑕佹眰鍗佸垎涓ユ牸锛屽鐢靛帇銆侀鐜囩殑娉㈠姩闈炲父鏁忔劅銆傜數鍘嬨�侀鐜囨尝鍔ㄨ交鍒欎娇浠〃涓嶈兘姝e父宸ヤ綔锛岄噸鍒欐崯鍧忚繖浜涚敤鐢佃澶囥�� + </p> + <p class="p-even"> + 椋炴満涓婄殑鐓ф槑璁惧鍙垎涓轰繚闅滈琛屽畨鍏ㄧ敤鐨勫閮ㄧ収鏄庝互鍙婁繚璇佹満缁勫拰鏃呭闇�瑕佺殑鍐呴儴鐓ф槑銆傚閮ㄧ収鏄庝富瑕佹湁鑸鐏�佺潃闄嗙伅銆佹粦琛岀伅銆侀槻鎾炵伅鍜屾満缈兼鏌ョ伅绛夛紝鍐呴儴鐓ф槑涓昏鏄鑸辩収鏄庯紝鏃╂湡鐨勫鑸辩収鏄庢湁鐧界偨鐏拰鑽у厜鐏紝鐜板湪澶у鏁板鏈虹殑鍐呴儴鐓ф槑閲囩敤鑽у厜鐏�� + </p> + </span> + <p class="p-even"> + 鑸鐏垎鍒畨瑁呭湪椋炴満宸︺�佸彸缈煎皷鍜屽瀭鐩村熬缈奸《閮紝棰滆壊缁熶竴涓哄乏绾€�佸彸缁裤�佸熬鐧斤紝鍦ㄥ闂翠究浜庡叾浠栭鏈哄拰鍦伴潰杞﹁締鍒ゆ柇椋炴満鐨勭浉瀵逛綅缃拰杩愯鏂瑰悜銆傞琛屼腑鏃犺鐧藉ぉ杩樻槸澶滄櫄锛岄鏈哄繀椤绘墦寮�鑸鐏�� + </p> + <p class="p-even"> + 鐫�闄嗙伅鍜屾粦琛岀伅瀹夎鍦ㄧ考鏍瑰拰鍓嶈捣钀芥灦涓婏紝鍔熺巼澶с�佺収灏勮窛绂昏繙锛岀敤浜庣潃闄嗗拰婊戣杩囩▼涓殑鐓ф槑銆備负闃叉鏈哄満鐏厜绯荤粺绐佺劧鍙戠敓鏁呴殰鍗卞強椋炶瀹夊叏锛岃姹傞鏈哄闂撮琛屽繀椤绘墦寮�鐫�闄嗙伅鍜屾粦琛岀伅銆傚ぇ澶氭暟椋炴満鐫�闄嗙伅鍜屾粦琛岀伅涓嶄絾鍙楅┚椹惰埍鍐呯殑寮�鍏虫帶鍒讹紝杩樺拰璧疯惤鏋惰仈鍔ㄣ�傛墦寮�寮�鍏冲悗锛岃捣钀芥灦澶勪簬鏀句笅浣嶇疆鏃剁伅浜紝鏀朵笂璧疯惤鏋跺悗鐏伃銆� + </p> + <p class="p-even"> + 澶у瀷鑸嚎椋炴満鑷冲皯瑁呮湁涓夌洀闃叉挒鐏紝涓ょ洀鐧借壊鐨勫垎鍒綅浜庡乏銆佸彸缈煎皷锛屼竴鐩忕孩鑹茬殑浣嶄簬鏈鸿韩涓婃柟鎴栧瀭灏鹃《閮紝鏈夌殑鍦ㄦ満韬笅鏂逛篃瀹夎鏈夌孩鑹查槻鎾炵伅銆傞槻鎾炵伅浠ユ瘡鍒嗛挓90娆$殑棰戠巼闂儊锛屾槗浜庤鲸鍒紝鍑嗗椋炶鎴栧凡缁忓紑濮嬮琛岀殑椋炴満蹇呴』鎵撳紑闃叉挒鐏�� + </p> + <p class="p-even"> + 鏈虹考妫�鏌ョ伅瀹夎鍦ㄦ満韬垨鍙戝姩鏈哄悐鑸变笂锛岀敤浜庣収浜満缈煎墠缂橈紝渚夸簬椋炶鍛樻鏌ユ満缈兼槸鍚︾粨鍐帮紝浠ヤ究閲囧彇闃插啺銆侀櫎鍐版帾鏂姐�� + </p> + <p class="p-even"> + 鐢靛姞鐑富瑕佺敤浜庨槻鍐般�侀櫎鍐般�侀鐗╁鐞嗘柟闈€�傞┚椹惰埍椋庢尅鐜荤拑鍜岀┖閫熺鐨勫姞娓╁繀椤荤敤鐢碉紝鍘ㄦ埧鐨勯鐗╁姞鐑�佺洢娲楀鐨勯槻鍐讳篃閮界敤鐢点�傜數鍔犵儹璁惧鏄鏈轰笂鐨勭敤鐢靛ぇ鎴凤紝鍗犳暣涓鏈虹敤鐢甸噺鐨�50%浠ヤ笂銆� + </p> + <p class="p-even"> + 椋炴満涓婅繕澶ч噺浣跨敤鍚勭鐢靛姩鏈猴紝濡傚彂鍔ㄦ満鍚姩鐢垫満銆佸悇绉嶈埖闈㈢殑鎿嶇旱銆佽捣钀芥灦鍜岃缈肩殑鎺у埗銆佸骇鑸遍�氶銆侀檧铻轰华琛ㄧ瓑銆� + </p> + </div> + </div> + </div> + <!-- 117椤� --> + <div class="page-box" page="125"> + <div v-if="showPageList.indexOf(125) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">117</li> + </ul> + <div class="bodystyle"> + <h4 id="d038" class="p-odd unit2-c">涓夈�佺幆鎺х郴缁�</h4> + <p class="p-odd"> + 鐜颁唬鑸嚎椋炴満鐨勫贰鑸珮搴﹀ぇ澶氬湪10000m宸﹀彸锛岃楂樺害鐨勫ぇ姘旀潯浠舵槸浣庢俯銆佷綆鍘嬨�佺己姘э紝浜烘棤娉曞湪杩欐牱鐨勫ぇ姘旀潯浠朵笅鐢熷瓨銆備负浜嗗垱閫犻�傚疁浜虹敓瀛樺拰鑸掗�傜殑鏉′欢锛屽繀椤绘湁涓�濂楃郴缁熷椋炴満涓婄殑鐢熷懡娲诲姩鍖哄煙锛堥┚椹惰埍銆佸鑸卞拰閮ㄥ垎璐ц埍锛夐噰鍙栫幆澧冩帶鍒舵帾鏂斤紝杩欏绯荤粺绉颁负鐜鎺у埗绯荤粺锛岀畝绉扮幆鎺х郴缁熴�傜幆鎺х郴缁熷寘鎷袱澶ч儴鍒嗭細搴ц埍绌烘皵璋冭妭绯荤粺鍜屾哀姘旂郴缁熴�� + </p> + <h5 id="e042" class="p-odd unit2-c">锛堜竴锛夊骇鑸辩┖姘旇皟鑺傜郴缁�</h5> + <p class="p-odd"> + 搴ц埍绌烘皵璋冭妭绯荤粺锛岀畝绉扮┖璋冪郴缁燂紝鐢ㄤ簬鍦ㄩ琛屼腑鏍规嵁闇�瑕佸悜搴ц埍鎻愪緵涓�瀹氭俯搴﹀拰鍘嬪姏鐨勭┖姘旓紝淇濊瘉涔樺憳鐨勭敓鐞嗛渶姹傘�佸畨鍏ㄥ拰鑸掗�傘�傜┖璋冪郴缁熷寘鎷骇鑸辨俯搴﹁皟鑺傚拰搴ц埍鍘嬪姏璋冭妭涓ら儴鍒嗐�備负淇濊瘉涔樺憳鐨勮垝閫傦紝澶忓娓╁害搴旀帶鍒跺湪19锝�24鈩冿紝鍐鎺у埗鍦�17锝�22鈩冿紝搴ц埍楂樺害锛堝骇鑸卞唴绌烘皵鍘嬪姏瀵瑰簲鐨勬捣鎷旈珮搴︼級搴旀帶鍒跺湪2400m浠ヤ笅銆� + </p> + <p class="p-odd"> + 鐜颁唬瀹㈡満澶у閲囩敤鍗婂瘑灏佸紡搴ц埍锛屼篃鍙�氶寮忔皵瀵嗗骇鑸便�傜┖璋冪郴缁熺殑宸ヤ綔鍘熺悊鏄簮婧愪笉鏂湴浠庡骇鑸遍《閮ㄨ緭鍏ユ湁涓�瀹氬帇鍔涘拰娓╁害鐨勬柊椴滅┖姘旓紝鐢ㄤ簬璋冭妭搴ц埍娓╁害鍜屽鍘嬶紝搴ц埍搴曢儴鐨勬帓姘旀椿闂ㄦ寜涓�瀹氶�熷害鍚戝閮ㄦ帓姘旓紝鍦� + </p> + <div class="img-rights w430 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0129-1.jpg" /> + <p class="img">鍥�2-128 閫氶寮忔皵瀵嗗骇鑸辩┖璋冨師鐞�</p> + </div> + <span> + <p class="p-odd td-0"> + 淇濊瘉搴ц埍鍘嬪姏鍜屾俯搴︾殑鎯呭喌涓嬶紝杩樺惛鍏ユ柊椴滅┖姘斻�佹帓鍑洪儴鍒嗗皝闂湪搴ц埍閲岀殑娣锋祳绌烘皵銆傞�佸叆搴ц埍鐨勬皵婧愬湪椋炶涓槸浠庡彂鍔ㄦ満鍘嬫皵鏈哄紩姘旓紝鍦ㄥ湴闈㈠垯浠庤緟鍔╁姩鍔涜缃帇姘旀満寮曟皵鎴栫敱鍦伴潰姘旀簮杞︿緵姘斻�傚紩鍏ョ殑绌烘皵琚皟鑺傚埌閫傚疁鐨勬俯搴﹂�佸叆搴ц埍锛屽骇鑸卞鍘嬨�侀�氶銆佹俯搴﹁皟鑺傚悓鏃跺疄鐜帮紝淇濊瘉浜嗗骇鑸辨湁閫傚疁鐨勬俯搴︺�佹箍搴︿笌浜屾哀鍖栫⒊娴撳害銆傞�氶寮忔皵瀵嗗骇鑸辩┖璋冨師鐞嗗鍥�2-128鎵�绀恒�� + </p> + </span> + </div> + </div> + </div> + <!-- 118椤� --> + <div class="page-box" page="126"> + <div v-if="showPageList.indexOf(126) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">118</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 绌鸿皟绯荤粺娓╁害鎺у埗閮ㄥ垎鐨勬牳蹇冩槸绌烘皵寰幆鍒跺喎绯荤粺銆備粠鍙戝姩鏈哄帇姘旀満寮曞嚭鐨勭┖姘旂殑鍘嬪姏銆佹俯搴﹂兘寰堥珮锛屽厛閫氳繃棰勫喎鍣紝鍒╃敤浠庡彂鍔ㄦ満澶栨兜閬擄紙椋庢墖閫氶亾锛夊紩鍏ョ殑鍐风┖姘旇繘琛屽喎鍗达紝娓╁害闄嶈嚦190鈩冨乏鍙筹紝鍐嶅垎鎴愬喎鐑袱璺�傚喎璺湪绌鸿皟鍒跺喎缁勪欢鍐呴�氳繃涓ゆ鐑氦鎹紝鍐峰嵈鍒�0鈩冨乏鍙筹紝鐒跺悗鍦ㄦ贩鍚堝涓庣儹璺┖姘旀寜涓�瀹氭瘮渚嬫贩鍚堬紝璋冭妭鍒伴�傚疁鐨勬俯搴﹀悗閫佸叆搴ц埍銆傚鏋滃骇鑸辨俯搴﹀亸浣庯紝绯荤粺灏嗚皟鑺傛贩鍚堟椿闂紝璁╄繘鍏ユ贩鍚堝鐨勭儹璺┖姘旀祦閲忓澶с�佸喎璺┖姘旀祦閲忓噺灏忥紝閫佸叆搴ц埍鐨勭┖姘旀俯搴﹀氨浼氬崌楂橈紱鍙嶄箣锛屽垯璁╃儹璺┖姘旀祦閲忓噺灏忋�佸喎璺┖姘旀祦閲忓澶э紝閫佸叆搴ц埍鐨勭┖姘旀俯搴﹂檷浣庛�傜┖姘斿惊鐜埗鍐风郴缁熸祦绋嬪鍥�2-129鎵�绀恒�� + </p> + <p class="center openImgBox p-even"> + <img class="w80" alt="" src="../../assets/images/0130-1.jpg" /> + </p> + <p class="img p-even">鍥�2-129 绌烘皵寰幆鍒跺喎绯荤粺娴佺▼</p> + <div class="img-float w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <span> + <p class="block">鐑矾绌烘皵杩樼敤浜庢皵鐑櫎鍐扮瓑闇�瑕佸姞鐑殑鍦版柟銆�</p> + </span> + </div> + </div> + <span> + <p class="p-even"> + 闅忛琛岄珮搴﹀崌楂橈紝澶ф皵鍘嬮檷浣庯紝浼氬紩璧疯吂鑳�銆佽吂鐥涚瓑鍑忓帇鐥呫�傞�氳繃绌鸿皟绯荤粺涓哄骇鑸卞鍘嬶紝灏嗗骇鑸卞帇鍔涘鑷冲湴闈㈡皵鍘嬶紝涔樺憳灏变笉浼氫骇鐢熶綆姘斿帇甯︽潵鐨勪笉閫傘�備絾鑸卞唴鍘嬪姏涓庤埍澶栧帇鍔涚殑鍘嬪姏宸繃澶э紝椋炴満鏈轰綋灏嗘壙鍙楀法澶х殑搴斿姏锛屼弗閲嶆椂鍙兘浼氭崯鍧忛鏈恒�備緥濡傦紝椋炴満鍦�12000m楂樺害涓婇琛岋紝澶栭儴姘斿帇涓�0.19涓爣鍑嗗ぇ姘斿帇锛岃嫢搴ц埍楂樺害鎺у埗鍦�2400m锛岃埍鍐呮皵鍘嬩负0.76涓爣鍑嗗ぇ姘斿帇锛屽唴澶栧帇鍔涘樊杈惧埌0.57涓爣鍑嗗ぇ姘斿帇锛屼竴鏋朵腑鍨嬪鏈烘満浣撳皢鎵垮彈37t鐨勫簲鍔涖�傚洜姝わ紝椋炴満搴ц埍鍘嬪姏涓嶅疁鍗囧緱杩囬珮锛屼竴鑸帶鍒跺湪1800锝�2400m鐨勫骇鑸遍珮搴﹀嵆鍙�� + </p> + </span> + <p class="p-even"> + 璁稿椋炴満骞朵笉鏄笂鍗囧埌涓�瀹氶珮搴﹀悗鎵嶈繘琛屽骇鑸卞帇鍔涜皟鑺傦紝鑰屾槸浠庡湪鍦伴潰涓婂叧涓婅埍闂ㄥ皝闂骇鑸卞紑濮嬶紝灏辫繘琛屽帇鍔涜皟鑺備簡銆傚皝闂骇鑸卞悗锛屽嵆浣块鏈鸿繕鍦ㄥ湴闈笂锛岀┖璋冪郴缁熷氨寮�濮嬪悜搴ц埍閫佸叆娓╁害閫傚疁鐨勭┖姘斻�傞�佸叆绌烘皵閲忓ぇ + </p> + </div> + </div> + </div> + <!-- 119椤� --> + <div class="page-box" page="127"> + <div v-if="showPageList.indexOf(127) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">119</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 浜庡骇鑸辨帓鍑虹┖姘旈噺锛屽骇鑸卞帇鍔涘皢鍗囬珮锛屽骇鑸遍珮搴︿綆浜庡湴闈㈤珮搴︺�傞殢椋炴満涓婂崌锛屽鐣屾皵鍘嬮檷浣庯紝搴ц埍鍐呮皵鍘嬩篃閫愭笎闄嶄綆锛屽骇鑸遍珮搴﹂殢椋炶楂樺害鍗囬珮鑰屽崌楂樸�傚湪椋炴満杩涘叆宸¤埅楂樺害鏃讹紝搴ц埍鍐呮皵鍘嬬ǔ瀹氬湪涓�瀹氬�硷紝搴ц埍楂樺害锛�1800锝�2400m锛変笉鍐嶅彉鍖栥�傞鏈轰笅闄嶆椂锛屽鐣屾皵鍘嬪崌楂橈紝搴ц埍姘斿帇涔熺浉搴斿崌楂橈紝搴ц埍楂樺害闅忛琛岄珮搴︿笅闄嶈�屼笅闄嶃�傞鏈虹潃闄嗗悗锛屽骇鑸卞唴姘斿帇楂樹簬鍦伴潰姘斿帇锛屽骇鑸遍珮搴︿綆浜庡湴闈㈤珮搴︼紝鐩村埌椋炴満寮�鑸遍棬瑙i櫎瀵嗗皝锛屽骇鑸卞唴澶栧帇鍔涘钩琛°�傚浘2-130鎵�绀轰负B737椋炴満搴ц埍鑷姩澧炲帇鏂瑰紡銆� + </p> + <p class="center openImgBox p-odd"> + <img class="img-a" alt="" src="../../assets/images/0131-1.jpg" /> + </p> + <p class="img p-odd">鍥�2-130 B737椋炴満搴ц埍鑷姩澧炲帇鏂瑰紡</p> + <h5 id="e043" class="p-odd unit2-c">锛堜簩锛夋哀姘旂郴缁�</h5> + <p class="p-odd"> + 宸¤埅楂樺害鍦�10000m宸﹀彸鐨勯鏈猴紝搴ц埍绌烘皵璋冭妭绯荤粺涓轰繚璇佸骇鑸辩殑鑸掗�傛�э紝灏嗗骇鑸辨皵鍘嬮珮搴︽帶鍒跺湪2400m浠ヤ笅锛屼緵姘斾腑鏈夎冻澶熺殑姘ф皵锛屾棤椤诲崟鐙緵姘с�備絾鍦ㄥ骇鑸卞け鍘嬬瓑鎰忓鎯呭喌鍙戠敓鏃讹紝涓轰繚璇佹梾瀹㈠拰鏈虹粍浜哄憳鐨勭敓鍛藉畨鍏紝灏遍渶瑕佽繘琛屼緵姘с�傝埅绌烘潯渚嬭瀹氾紝宸¤埅楂樺害瓒呰繃涓�瀹氬�肩殑椋炴満锛屽繀椤诲鏈夋哀姘斻�� + </p> + <p class="p-odd"> + 姘戠敤椋炴満姘ф簮涓昏鏈変袱绉嶏紝涓�绉嶆槸楂樺帇姘ф皵鐡讹紙鍥�2-131锛夛紝鍙︿竴绉嶆槸鍖栧姘ф皵鍙戠敓鍣紙鍥�2-132锛夈�傞珮鍘嬫哀姘旂摱閫氬父閲囩敤涓嶉攬閽㈡垨鍚堥噾鐡惰韩锛屽啀鐢ㄩ噾灞炰笣鍖呯紶闃叉鐮存崯锛岃〃闈㈡秱鎴愮豢鑹诧紝濉厖姘ф皵鏈�楂樺彲杈惧埌13.8MPa锛堢害136涓爣鍑嗗ぇ姘斿帇锛夛紝瀹為檯濉厖鏃跺彧鍏呭埌120涓爣鍑嗗ぇ姘斿帇銆傛哀姘旂摱鏈夎繃鐑� + </p> + </div> + </div> + </div> + <!-- 120椤� --> + <div class="page-box" page="128"> + <div v-if="showPageList.indexOf(128) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">120</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 閲婃斁鍙o紝鐢ㄤ簬褰撶幆澧冩俯搴﹀崌楂樺鑷寸摱鍐呮皵鍘嬭繃澶ф椂锛岄噴鏀炬帀閮ㄥ垎姘ф皵浠ヤ繚璇佺摱浣撳畨鍏ㄣ�傚寲瀛︽哀姘斿彂鐢熷櫒鍐呰鍥轰綋姘吀鐩愬拰閾佺矇鐨勬贩鍚堢墿锛屽姞鐑椂浼氬彂鐢熷寲瀛﹀弽搴旈噴鏀炬哀姘斻�傞渶瑕佷緵姘ф椂鎷夊姩鍚姩閿�锛岀偣鐏攢浼氶�氳繃鍙戠伀甯界偣鐏姘吀鐩愬姞鐑紝浣垮寲瀛︽哀姘斿彂鐢熷櫒寮�濮嬪伐浣溿�傚ぇ閮ㄥ垎鑸嚎椋炴満鍦ㄥ簲鎬ヤ緵姘ф椂锛屾満缁勪汉鍛樹娇鐢ㄦ哀姘旂摱涓殑姘ф皵锛屾梾瀹娇鐢ㄥ寲瀛︽哀姘斿彂鐢熷櫒浜х敓鐨勬哀姘斻�傚浘2-133鎵�绀轰负B737姘ф皵绯荤粺銆� + </p> + <div class="fl al-fe p-even"> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0132-1.jpg" /> + </p> + <p class="img">鍥�2-131 楂樺帇姘ф皵鐡�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="w80" alt="" src="../../assets/images/0132-2.jpg" /> + </p> + <p class="img">鍥�2-132 鍖栧姘ф皵鍙戠敓鍣�</p> + </span> + </div> + <div style="position: relative"> + <p class="center openImgBox p-even"> + <img class="img-b" alt="" src="../../assets/images/0132-3.jpg" /> + </p> + <p class="img p-even">鍥�2-133 B737姘ф皵绯荤粺</p> + <div class="bj3" style="position: absolute; bottom: 10px; width: 120px"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <span> + <p class="block">鍐涚敤浣滄垬椋炴満甯哥敤娑叉哀浣滀负姘ф皵婧愩��</p> + </span> + </div> + </div> + </div> + </div> + </div> + <!-- 121椤� --> + <div class="page-box" page="129"> + <div v-if="showPageList.indexOf(129) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">121</li> + </ul> + <div class="bodystyle"> + <div class="img-rights w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 甯﹀皬瀛╃殑鏃呭锛岄亣鍒板鑸け鍘嬶紝姘ф皵闈㈢僵钀戒笅鏃讹紝搴斿厛鑷繁鎴翠笂姘ф皵闈㈢僵锛屽啀涓哄皬瀛╂埓涓娿�� + </p> + </div> + </div> + <span> + <p class="p-odd"> + 瀹㈡満搴旀�ヤ緵姘ф椂涓烘梾瀹㈠噯澶囨湁姘ф皵闈㈢僵锛屾哀姘旈潰缃╅�氬父鏀剧疆鍦ㄥぉ鑺辨澘鍐呫�傚綋搴ц埍鍘嬪姏闄嶄綆鍒�4500m楂樺害鏃讹紝姘ф皵闈㈢僵浼氳嚜鍔ㄨ惤涓嬶紙鍥�2-134锛夛紝鏃呭鍙敤姘ф皵闈㈢僵鎵d綇鍙i蓟锛屽苟灏嗗浐瀹氶潰缃╃殑甯﹀脊鍔涚殑甯﹀瓙鎸備簬鑴戝悗锛屾甯稿懠鍚稿嵆鍙紙鍥�2-135锛夈�� + </p> + <p><br /></p> + </span> + <div class="fl al-fe p-odd"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0133-1.jpg" /> + </p> + <p class="img">鍥�2-134 姘ф皵闈㈢僵鑷姩钀戒笅</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0133-2.jpg" /> + </p> + <p class="img">鍥�2-135 姘ф皵闈㈢僵鐨勪娇鐢�</p> + </span> + </div> + <h4 id="d039" class="p-odd unit2-c">鍥涖�佸鑸辫澶囧強鏁戠敓璁炬柦</h4> + <h5 id="e044" class="p-odd unit2-c">锛堜竴锛夊鑸辫澶�</h5> + <p class="p-odd"> + 瀹㈣埍鏄梾瀹㈠湪鏃呰涓椿鍔ㄧ殑绌洪棿銆傚鑸辩殑鑸掗�傚拰瀹夊叏绋嬪害瀵规梾瀹㈤�夋嫨鎵胯繍浜烘湁鏋佸ぇ褰卞搷锛屽洜姝よ埅绌哄叕鍙稿瀹㈣埍璁惧鐨勯�夋嫨鍜屽鑸卞竷缃杩涜鍛ㄥ瘑鐨勫畨鎺掞紝椋炴満鍒堕�犲晢浼氭寜鑸┖鍏徃鐨勮姹傚畨鎺掑鑸卞竷灞�銆� + </p> + <p class="p-odd"> + 瀹㈣埍甯冨眬閫氬父鎸囧鑸卞唴搴ф鐨勫畨鎺掞紝鏈夋椂杩樺寘鎷帹鎴裤�佸帟鎵�銆佽埍闂ㄧ瓑鐨勫畨鎺掋�傛牴鎹骇妞呬笉鍚岋紝鍙皢瀹㈣埍鍒嗕负澶寸瓑鑸便�佸叕鍔¤埍锛堝晢鍔¤埍锛夈�佺粡娴庤埍锛堟櫘閫氳埍锛変笁涓瓑绾с�傚彧鏈変竴绉嶈埍浣嶇瓑绾х殑鍙綔涓�绾у鑸卞竷灞�锛岄�氬父涓哄叏缁忔祹鑸憋紱鏈変袱绉嶈埍浣嶇瓑绾х殑鍙綔浜岀骇瀹㈣埍甯冨眬锛岄�氬父涓哄ご绛夎埍鍜岀粡娴庤埍锛涗笁绾у鑸卞竷灞�鍖呮嫭澶寸瓑鑸便�佸叕鍔¤埍鍜岀粡娴庤埍涓夌瀹屾暣鐨勮埍浣嶇瓑绾с�備笉鍚岀殑鑸变綅绛夌骇锛屽骇妞呯殑瀹藉害鍜岄棿璺濅笉鍚屻�傚B767瀹㈡満鐨勬爣鍑嗗竷灞�涓細澶寸瓑鑸辨瘡鎺掑彧鏈�4涓骇浣嶏紝鎺掗棿璺濅负38in锛�1cm=0.3937in锛夛紱鍏姟鑸辨瘡鎺�6涓骇浣嶏紝鎺掗棿璺濅负34in锛涚粡娴庤埍姣忔帓7涓骇浣嶏紝鎺掗棿璺濅负32in銆備笉鍚岃埅绌哄叕鍙稿湪甯冨眬涓婃湁鎵�涓嶅悓銆傛湁鐨勮埅绌哄叕鍙镐负浜嗗杞藉锛屽笇鏈涙妸鎺掗棿璺濆敖閲忕缉灏忥紱鏈夌殑鑸┖鍏徃涓轰簡鍚稿紩鏃呭銆佹彁楂樺叕鍙稿奖鍝嶅姏锛屾妸瀹㈣埍鍋氬緱灏介噺璞崕锛屽鏂� + </p> + </div> + </div> + </div> + <!-- 122椤� --> + <div class="page-box" page="130"> + <div v-if="showPageList.indexOf(130) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">122</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0134-1.jpg" /> + <p class="img">鍥�2-136 鏂板姞鍧¤埅绌哄叕鍙窤380澶寸瓑鑸�</p> + <img class="img-0" alt="" src="../../assets/images/0134-2.jpg" /> + <p class="img">鍥�2-137 鍗楁柟鑸┖A330澶寸瓑鑸�</p> + <img class="img-0" alt="" src="../../assets/images/0134-3.jpg" /> + <p class="img">鍥�2-138 棣栨灦C919瀹㈡満缁忔祹鑸�</p> + <img class="img-0" alt="" src="../../assets/images/0134-4.jpg" /> + <p class="img">鍥�2-139 椋炴満鍘ㄦ埧</p> + </div> + <span> + <p class="p-even td-0"> + 鍔犲潯鑸┖鍏徃鎶夾380澶寸瓑鑸卞竷缃垚浜嗚豹鍗庡寘鍘紝搴ф鏀惧钩鍚庡氨鏄竴寮犺垝閫傜殑搴婏紙鍥�2-136锛夈�備负淇濊瘉鏃呭鍦ㄧ揣鎬ユ儏鍐典笅鑳借繀閫熸挙绂婚鏈猴紝鍥介檯姘戣埅缁勭粐瑙勫畾搴т綅鎺掗棿璺濅笉寰椾綆浜�29in銆傚悓涓�鏋堕鏈猴紝濡傛灉澶寸瓑鑸便�佸叕鍔¤埍搴т綅甯冪疆寰楀锛岃浇瀹㈤噺灏卞皢鍑忓皯锛屽竷缃垚鍏ㄧ粡娴庤埍锛岃浇瀹㈤噺灏变細澧炲姞銆傚A380瀹㈡満锛屾爣鍑嗙殑涓夌骇瀹㈣埍甯冨眬鍙浇瀹�555浜猴紝濡傛灉閲囩敤鍏ㄧ粡娴庤埍鐨勪竴绾у鑸卞竷灞�锛岃浇瀹㈤噺鍙揪861浜恒�傚ぇ鍨嬮鏈哄彲閲囩敤涓夌骇瀹㈣埍甯冨眬锛屼腑鍨嬮鏈轰竴鑸噰鐢ㄥご绛夎埍銆佺粡娴庤埍涓ょ骇瀹㈣埍甯冨眬锛屽皬鍨嬮鏈哄父閲囩敤涓�绾у鑸卞竷灞�銆傚浘2-137鍜屽浘2-138鍒嗗埆涓哄崡鏂硅埅绌篈330澶寸瓑鑸卞拰棣栨灦C919瀹㈡満缁忔祹鑸便�� + </p> + <p class="p-even"> + 瀹㈣埍鍐呯殑鍘ㄦ埧鍜屽帟鎵�閫氬父鏄寜搴т綅鏁伴厤缃殑锛屼竴鑸�60锝�70涓骇浣嶉厤缃竴涓帹鎴匡紝40锝�50涓骇浣嶉厤缃竴涓帟鎵�銆傚帹鎴匡紙鍥�2-139锛夐厤鏈夌數鍔犵儹璁惧锛堥�氬父鏄儰绠便�佸井娉㈢倝绛夛級鍜岄鐗╁偍瀛樿缃紝杩樺叿澶囬ギ鐢ㄦ按鐨勪緵姘村拰鎺掓按閫氶亾銆傞鏈轰笂鐨勫帹鎴胯鏂戒笉鍙兘闈炲父瀹屽锛屽彧鑳藉鍦伴潰鍑嗗濂界殑椁愰锛堝浘2-140锛夎繘琛岀畝鍗曠儹澶勭悊銆傚鑸变腑鐨勫帟鎵�涓�鑸厤鏈夋娊姘撮┈妗躲�侀潰鐩嗗拰閫氶璁炬柦锛堝浘2-141锛夈�傛満韬悗閮ㄥ鏈夋按绠憋紝鎻愪緵楗敤姘村拰寰幆浣跨敤姘达紝缁忓姞鍘嬪悗渚涘帹鎴垮拰鍘曟墍浣跨敤銆傛棭鏈熸湁鐨勯鏈哄皢浣跨敤杩囩殑搴熸按缁忔帓姘寸閬撶洿鎺ユ帓鍑烘満澶栵紝涓洪槻姝㈠湪楂樼┖浣庢俯鐜閲屾帓姘寸缁撳啺閫犳垚鍫靛锛屾帓姘寸鍙h鏈夊姞鐑缃�傜幇浠eぇ閮ㄥ垎瀹㈡満澶囨湁姹℃按绠憋紝搴熸按鍥炴敹鍒版薄姘寸鑰屼笉鏄洿鎺ユ帓鍑烘満澶栥�傚簾姘寸粡鍖栧澶勭悊鍚庡彲寰幆浣跨敤锛屽娲楁墜鐢ㄨ繃鐨勬按鍙互鐢ㄤ簬鍐查┈妗剁瓑銆� + </p> + </span> + </div> + </div> + </div> + <!-- 123椤� --> + <div class="page-box" page="131"> + <div v-if="showPageList.indexOf(131) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">123</li> + </ul> + <div class="bodystyle"> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0123-01.jpg" /> + <p class="img">鍥�2-140 椋炶涓殑椁愰</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0123-02.jpg" /> + <p class="img">鍥�2-140 椋炶涓殑椁愰</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + <h5 id="e045" class="p-odd unit2-c">锛堜簩锛夋晳鐢熻鏂�</h5> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0135-2.jpg" /> + <p class="img">鍥�2-141 瀹㈣埍涓殑鍘曟墍</p> + </div> + <span> + <p class="p-odd"> + 灏界鑸┖杩愯緭鏄洰鍓嶆渶瀹夊叏鐨勪氦閫氳繍杈撴柟寮忥紝浣嗗鏈轰笂浠嶇劧瑕侀厤澶囦竴浜涙晳鐢熻鏂斤紝浠ヤ究鍦ㄥ嚭鐜扮揣鎬ユ儏鍐垫椂锛屼箻鍛樿兘瀹夊叏銆佽繀閫熷湴鎾ょ椋炴満銆� + </p> + <p class="p-odd"> + 鎻愯捣椋炴満涓婄殑鏁戠敓璁炬柦锛屼汉浠殑绗竴鍙嶅簲灏辨槸闄嶈惤浼炪�傞檷钀戒紴浠呬粎鍦ㄨ埅绌鸿繍杈撳垵鏈熺殑姘戠敤椋炴満涓婅澶囪繃锛屽湪浣跨敤涓彂鐜板嚑涔庢病鏈夋晥鏋溿�傚師鍥犳槸闄嶈惤浼炲繀椤诲湪涓�瀹氱殑楂樺害鍜岄�熷害涔嬩笅寮犲紑鎵嶈兘淇濊瘉瀹夊叏锛屽璺充紴浜哄憳鐨勮姹傚緢楂橈紝鏈粡涓撲笟璁粌鐨勪汉鍛樺緢闅炬垚鍔熷湴灏嗛檷钀戒紴鎵撳紑銆傚嵆浣跨粡杩囦笓涓氳缁冪殑浜哄憳锛屽湪娌℃湁鍦伴潰淇濋殰銆佷笉鐭ラ亾鍦伴潰鎯呭喌鐨勫墠鎻愪笅璺充紴锛屼篃寰堥毦淇濊瘉瀹夊叏钀藉湴銆傚洜姝わ紝绗簩娆′笘鐣屽ぇ鎴樺悗姘戠敤瀹㈡満閮戒笉鍐嶉厤澶囬檷钀戒紴浜嗐�� + </p> + </span> + <div class="bj4"> + <div class="img-rights w200 openImgBox"> + <img class="img" alt="" src="../../assets/images/0135-3.jpg" /> + <p class="img">鍥�2-142 姹跺窛浼為檷</p> + </div> + <span> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 鍦�2008骞存倍宸濆ぇ鍦伴渿鐨勬晳鎻存椿鍔ㄤ腑锛�5鏈�14鏃�11鏃�47鍒嗭紝15鍚嶇┖闄嶅叺浠庡湴闇囩伨鍖轰笂绌�4999m鐨勯珮绌哄涓嶉【韬湴璺充笅锛屼负鏁戞彺閮ㄩ槦浼犲洖浜嗙伨鍖虹殑绗竴鎵嬭祫鏂欙紝涓烘寚鎸ユ晳鎻存彁渚涗簡鍑嗙‘鐨勫喅绛栦緷鎹�傛垬澹滑骞虫椂璁粌鐨勮烦浼為珮搴︽槸800锝�1000m锛岃�岃繖娆℃槸灏嗚繎5000m鐨勯珮搴︺�傚湪鏃犳皵璞¤祫鏂欍�佹棤鍦伴潰鏍囧織銆佹棤鎸囨尌寮曞鐨勨�滀笁鏃犫�濇潯浠朵笅浠庤繎5000m鐨勯珮搴﹀疄鏂戒紴闄嶏紙鍥�2-142锛夛紝鍦ㄤ笘鐣屽啗浜嬭埅绌哄彶涓婂墠鎵�鏈湁銆� + </p> + <p class="block"> + 璁╂垜浠浣忚繖浜涜嫳闆勭殑鍚嶅瓧锛氭潕鎸尝銆佺帇鍚涗紵銆佷簬浜氬銆佸垬蹇楀疂銆佹杩溿�侀儹榫欏竻銆佹潕浜氬啗銆佽档娴蜂笢銆佽档鍥涙柟銆侀浄蹇楄儨銆佸垬鏂囪緣銆佺帇纾娿�佷换娑涖�佹潕鐜夊北銆佸悜娴锋尝銆� + </p> + </span> + </span> + </div> + </div> + </div> + </div> + <!-- 124椤� --> + <div class="page-box" page="132"> + <div v-if="showPageList.indexOf(132) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">124</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 姘戠敤瀹㈡満涓婄殑鏁戠敓璁炬柦锛屼富瑕佺敤浜庨鏈洪潪姝e父闄嶈惤鎴愬姛鍚庯紝璁╀箻鍛樺畨鍏ㄣ�佽繀閫熷湴鎾ょ椋炴満銆備富瑕佸寘鎷簲鎬ユ挙绂婚�氶亾銆佺揣鎬ュ嚭鍙c�佺揣鎬ユ挙绂昏鏂界瓑銆� + </p> + <p class="p-even"> + 鎸夌収鍥介檯姘戣埅缁勭粐鍒跺畾鐨勬爣鍑嗭紝瀹㈡満蹇呴』淇濊瘉鍦ㄧ揣鎬ユ儏鍐典笅鎵�鏈夋梾瀹㈠湪90s鍐呭叏閮ㄦ挙绂汇�備负杈惧埌杩欎竴鏍囧噯锛屽湪璁捐鏃朵负瀹㈣埍鐣欐湁涓�瀹氬搴︾殑閫氶亾锛岀閫氶亾鏈�杩滅殑搴т綅鍜岄�氶亾鏈�澶氬彧鑳界浉闅斾袱涓骇浣嶏紝鍥犳瀹㈣埍鍐呬袱渚ч潬绐楃殑搴т綅鏈�澶氬彧鍏佽璁捐3鍒楋紝瀹戒綋瀹㈡満涓棿閮ㄥ垎搴т綅鏈�澶氬彧鑳借璁�5鍒椼�備负纭繚鐣呴�氾紝瀹夊叏閫氶亾鍐呬笉寰楀爢鏀句换浣曠墿鍝併�傚鑸卞唴棰勫厛鍒掑垎浜嗘挙绂诲垎鍖猴紝涓烘瘡涓垎鍖哄埌绱ф�ュ嚭鍙e垝鍒嗕簡涓撶敤鐨勬挙绂昏矾绾匡紝骞跺湪鈥滀箻瀹㈤』鐭モ�濅腑娉ㄦ槑銆傞櫎浜嗘甯哥殑鐧绘満闂ㄥ拰鍘ㄦ埧鏈嶅姟闂ㄤ箣澶栵紝瀹㈣埍鍐呰繕鏍规嵁搴т綅鏁伴噺璁剧疆浜嗚嫢骞茬揣鎬ュ嚭鍙c�傛瘡涓挙绂诲垎鍖洪兘瀵瑰簲鐩稿簲鐨勭揣鎬ュ嚭鍙o紝鍦ㄧ揣鎬ユ儏鍐典笅涔樺姟鍛樻垨鍧愬湪鍑哄彛鏃佺殑鏃呭鍙墦寮�鍑哄彛锛屾墍鏈変箻鍛樺彲浠庡搴旂殑鍑哄彛杩呴�熸挙绂婚鏈恒�� + </p> + <div class="img-float w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 涓洪伩鍏嶉瀷涓婄殑灏栭攼閮ㄥ垎鍒掔牬婊戞锛屼粠鍏呮皵婊戞鎾ょ鏃堕』鑴遍瀷銆� + </p> + </div> + </div> + <span> + <p> + 璁稿瀹㈡満鍑哄彛绂诲湴楂樺害鍦�2m浠ヤ笂锛屽繀椤绘湁鐩稿簲鐨勬挙绂昏鏂芥墠鑳戒繚璇佷汉鍛樺畨鍏ㄦ挙绂汇�傜櫥鏈洪棬銆佺揣鎬ュ嚭鍙e閮借鏈夊厖姘旀粦姊紝鍦ㄧ揣鎬ユ儏鍐典笅鎵撳紑鍚庝細鑷姩鍏呮皵锛屼箻鍛樺彲閫氳繃鍏呮皵婊戞瀹夊叏鍦版粦鍒板湴闈€�傚浘2-143鎵�绀轰负绱ф�ュ嚭鍙e拰鍏呮皵婊戞銆� + </p> + </span> + <p class="center openImgBox p-even"> + <img class="img-c" alt="" src="../../assets/images/0136-1.jpg" /> + </p> + <p class="img p-even">鍥�2-143 绱ф�ュ嚭鍙e拰鍏呮皵婊戞</p> + <p class="p-even"> + 涓轰簡淇濊瘉杩檷鍒版按涓婃椂涔樺憳鐨勫畨鍏紝瀹㈣埍鍐呰繕閰嶅浜嗘晳鐢熻。鍜屾晳鐢熺瓘锛堝浘2-144鍜屽浘2-145锛夈�傛晳鐢熻。鏄厖姘旀紓娴澶囷紝涓烘绾㈣壊鎴栭粍鑹诧紝渚夸簬鎼滄晳浜哄憳鍙戠幇锛屼竴鑸綅浜庡骇妞呬笅鏂广�傜揣鎬ユ儏鍐垫椂锛屼箻鍛樻嬁鍑虹┛涓婏紝绂诲紑椋炴満鍚庢媺鍔ㄤ笅闈㈢殑鍏呮皵鎷夋墜鏁戠敓琛d細鑷姩鍏呮皵銆傛晳鐢熺瓘涔熸槸姗樼孩鑹诧紝閰嶆湁 + </p> + </div> + </div> + </div> + <!-- 125椤� --> + <div class="page-box" page="133"> + <div v-if="showPageList.indexOf(133) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">125</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">妗ㄣ�侀敋绛夎鏂姐�傛晳鐢熺瓘鏈変笉鍚岀殑瑙勬牸锛屾渶澶х殑鍙浇48浜猴紝鏈�灏忕殑鍙兘杞�10浜哄乏鍙炽��</p> + <div class="fl al-fe p-odd"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0137-1.jpg" /> + </p> + <p class="img"> + 鍥�2-144 鏁戠敓琛� + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0137-2.jpg" /> + </p> + <p class="img">鍥�2-145 鏁戠敓绛�</p> + </span> + </div> + <p class="p-odd"> + 涓轰娇浜哄憳椤哄埄鎾ょ椋炴満锛岄鏈轰笂杩橀厤鏈夋晳鐢熸枾銆佹晳鐢熺储銆侀槻鎶ゅご鐩斻�佹姢鐩暅銆佺収鏄庣伅銆佹墿澹板櫒绛夋晳鐢熻鏂姐�傛挙绂婚鏈哄悗锛屼负鏂逛究鎼滄晳浜哄憳鎼滄晳锛岄鏈洪厤鏈夊簲鎬ュ畾浣嶅彂灏勬満銆佷究鎼哄紡瀹氫綅鍙戝皠鏈恒�佹捣姘存煋鑹插墏绛夋晳鐢熺敤鍝併�傚彟澶栵紝椋炴満涓婅繕涓轰箻鍛橀厤澶囦簡涓�瀹氭暟閲忕殑鍘嬬缉椋熷搧銆佹捣姘存贰鍖栧墏銆佹�ユ晳鑽绛夛紝浠ュ鎾ょ椋炴満鍚庣殑涓嶆椂涔嬮渶銆� + </p> + </div> + </div> + </div> + <!-- 126椤� --> + <div class="page-box" page="134"> + <div v-if="showPageList.indexOf(134) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">126</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even unit2-c"> + 瀛︿範浠诲姟涓�<br />璁よ瘑姘戠敤椋炴満鐨勬�ц兘 + </h3> + <div class="task-u2-c ma-l"></div> + <p class="p-even"> + 姘戣埅瀵归鏈烘�ц兘鐨勮姹傚寘鎷緢澶氭柟闈紝浠庨琛屾�ц兘鍒扮粡娴庢�с�佽垝閫傛�с�佸彲闈犳�х瓑锛岄兘鎻愬嚭浜嗗緢楂樼殑瑕佹眰銆傚叾涓渶閲嶈鐨勬槸蹇呴』鑳芥弧瓒冲畬鎴愯瀹氫换鍔$殑椋炶鎬ц兘锛屽湪姝ゅ熀纭�涓婃墠璋堢粡娴庢�с�佽垝閫傛�х瓑銆傛湰浠诲姟涓昏浠嬬粛椋炴満鐨勮浇閲嶆�ц兘鍜岄琛屾�ц兘銆� + </p> + <h4 id="d040" class="p-even unit2-c">涓�銆侀鏈虹殑杞介噸鎬ц兘</h4> + <p class="p-even"> + 椋炴満鐨勮浇閲嶈兘鍔涳紝鏄埅绌鸿繍杈撶粡钀ヨ�呮渶鍏冲績鐨勬�ц兘銆傝浇閲嶈兘鍔涜秺寮虹殑椋炴満锛屽線寰�鍏惰嚜韬川閲忎篃瓒婂ぇ銆傛垜浠渶瑕佷簡瑙i鏈哄悇绉嶈川閲忕殑鍏崇郴锛屽湪浣跨敤涓彲浠ョ伒娲昏繍鐢紝鍑忓皯涓嶅繀瑕佺殑璐ㄩ噺锛屽澶т笟鍔¤浇閲嶉噺銆�</p> + <h5 id="e046" class="p-even unit2-c">锛堜竴锛夐鏈虹殑鍑犵璐ㄩ噺</h5> + <h6 id="f013" class="p-even">1.鏈�澶ц捣椋炶川閲�</h6> + <p class="p-even"> + 鏈�澶ц捣椋炶川閲忥紙MTOW锛夋寚椋炴満璧烽鏃剁粨鏋勫厑璁哥殑鏈�澶ц川閲忋�備笟鍔¤浇閲嶈兘鍔涜秺寮虹殑椋炴満锛屾渶澶ц捣椋炶川閲忎竴鑸篃瓒婂ぇ锛屽鏈�澶х殑瀹㈡満A380鏈�澶ц捣椋炶川閲忎负560t銆備笘鐣屼笂鍒堕�犵殑鏈�澶х殑椋炴満鏄嫃鑱斿畨涓滆澶璁″眬锛堣嫃鑱旇В浣撳悗涓轰箤鍏嬪叞瀹変笢璇哄か鑸┖绉戠爺鎶�鏈仈鍚堜綋锛夌爺鍒剁殑瀹�-225鈥滄ⅵ骞烩�濊繍杈撴満锛堝浘2-146锛夛紝鏈�澶ц捣椋炶川閲忎负640t锛堜竴璇�700t锛夈�傝鏈轰粎鐢熶骇涓�鏋讹紝鏈�鍒濇槸涓鸿繍杞解�滄毚椋庨洩鈥濆彿鑸ぉ椋炴満鑰岃璁$殑鍐涚敤杩愯緭鏈恒�傝嫃鑱旇В浣撳悗锛屼簬2001骞存垚鍔熻浆涓烘皯鐢ㄥ瀷銆�2022骞�2鏈堬紝鍦ㄥ熀杈呴檮杩戠殑鎴堟柉鎵樻鍒╂満鍦鸿鎴樼伀 + </p> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0138-1.jpg" /> + <p class="img">鍥�2-146 瀹�-225鈥滄ⅵ骞烩�濊繍杈撴満</p> + </div> + <span> + <p class="p-even td-0">鎹熸瘉銆�</p> + <h6 id="f014" class="p-even">2.鏈�澶х潃闄嗚川閲�</h6> + <p class="p-even">鏈�澶х潃闄嗚川閲忥紙MLW锛夋寚椋炴満鍦ㄧ潃闄嗘椂鍏佽鐨勬渶澶ц川閲忋�傛渶澶х潃闄嗚川閲忎富瑕佹槸鑰冭檻鍒扮潃闄嗘椂璧疯惤鏋跺拰鍦伴潰闂寸鎾炵殑鍐插嚮鍔涘椋炴満缁撴瀯鐨勫奖鍝嶃�傛渶澶х潃闄嗚川 + </p> + </span> + </div> + </div> + </div> + <!-- 127椤� --> + <div class="page-box" page="135"> + <div v-if="showPageList.indexOf(135) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">127</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 閲忓皬浜庢渶澶ц捣椋炶川閲忥紝澶у瀷椋炴満浜岃�呬箣闂寸殑宸埆杈冨ぇ锛屼腑灏忓瀷椋炴満宸埆杈冨皬锛岀敋鑷虫病鏈夊樊鍒�傚B747-400ER鐨勬渶澶ц捣椋炶川閲忚揪418.65t锛屾渶澶х潃闄嗚川閲忓彧鏈�289.85t锛屼簩鑰呯浉宸�128.8t銆傞鏈鸿川閲忓繀椤诲皬浜庢渶澶х潃闄嗚川閲忔墠鑳戒繚璇佺潃闄嗗畨鍏紝鏈夋椂鍦ㄨ捣椋炲悗椋炴満鍑虹幇鏁呴殰锛岃川閲忓張姣旇緝澶ф椂锛屼负浜嗕繚璇佸畨鍏ㄤ笉寰椾笉杩涜绌轰腑鏀炬补锛屽噺灏忚川閲忓悗绱ф�ョ潃闄嗐�� + </p> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 2019骞�7鏈�16鏃ワ紝MU587鑸彮鍦ㄩ琛岄�斾腑锛屼竴浣嶆梾瀹㈢獊鎰熶笉閫傦紝骞朵即鏈夊挸琛�銆佸績璺冲姞蹇瓑鐥囩姸锛屼笢鑸満缁勯�氳繃鏈轰笂骞挎挱鎵惧埌涓夊悕涓鍖荤敓鍏卞悓鍙備笌鏁戞不銆傛牴鎹梾瀹㈢梾鎯咃紝鏈洪暱鍐冲畾绌轰腑鏀炬补45t锛屽氨杩戝闄嶄笢浜垚鐢版満鍦哄皢鏃呭杞線褰撳湴鍖婚櫌鏁戞不銆傚寳浜椂闂�18鏃�19鍒嗚埅鐝畨鍏ㄥ闄嶏紝鏃呭閫佸尰鍚庤浆鍗变负瀹夈�� + </p> + </span> + </div> + <h6 id="f015" class="p-odd">3.鏈�澶ф棤鐕冩补璐ㄩ噺</h6> + <p class="p-odd"> + 鏈�澶ф棤鐕冩补璐ㄩ噺锛圡ZFW锛夋寚椋炴満娌℃湁鐕冩补鏃剁殑鏈�澶ц川閲忋�傜敱浜庢皯鐢ㄩ鏈哄湪鏈虹考鍐呭偍瀛樹簡澶ч噺鐕冩补锛岄琛屼腑椋炴満灏嗕骇鐢熻冻澶熺殑鍗囧姏鏉ュ钩琛¢噸鍔涳紝涔熷寘鎷钩琛℃満缈煎唴閭i儴鍒嗙噧娌圭殑閲嶅姏銆傚崌鍔涗富瑕佺敱鏈虹考浜х敓锛屽苟閫氳繃缈兼牴浼犻�掑埌鏈鸿韩锛岀考鏍瑰氨浼氬彈鍒板緢澶х殑搴斿姏锛屽洜姝ゅ繀椤绘湁瓒冲鐨勭粨鏋勫己搴︺�傚钩琛″湪鏈虹考鍐呯殑鐕冩补鐨勯噸鍔涙槸涓嶉渶瑕佷紶缁欐満韬殑锛屾渶澶ф棤鐕冩补璐ㄩ噺浜х敓鐨勯噸鍔涘叾瀹炰篃灏辨槸缈兼牴缁撴瀯寮哄害鍏佽鐨勬壙鍔涢檺搴︼紝鏄満缈间紶閫掑崌鍔涘埌鏈鸿韩鐨勬渶澶ч檺搴︺�傚鏋滈鏈鸿川閲忚秴杩囪繖涓�硷紝瓒呰繃鐨勫彧鑳芥槸鐕冩补璐ㄩ噺锛屽敖绠¢琛屼腑瑕佷骇鐢熷厠鏈嶅畠鐨勫崌鍔涳紝浣嗚繖閮ㄥ垎鍗囧姏涓嶄細浼犻�掔粰鏈鸿韩锛屼笉褰卞搷缈兼牴鍙楀姏銆傝繖鍜屽墠闈㈣皥鍒扮殑鏈虹考涓嬪悐瑁呭彂鍔ㄦ満鏈夊噺杞荤考鏍瑰彈鍔涚殑鍔熻兘鏄竴涓亾鐞嗐�� + </p> + <p class="p-odd"><b>浣跨敤绌烘満璐ㄩ噺锛圤EW锛夛細</b>鎸囬鏈轰笂闄ょ噧娌瑰拰涓氳浇涔嬪鐨勫叏閮ㄨ川閲忥紝鍖呮嫭鏈虹粍浜哄憳銆佹満涓婅鏂戒互鍙婂叏閮ㄦ湇鍔℃墍闇�鐢ㄥ搧鐨勮川閲忋��</p> + <p class="p-odd"> + <b>涓氳浇锛圥L锛夛細</b>鎸囬鏈哄彲浠ョ敤鏉ヨ禋鍙栧埄娑︾殑鍟嗕笟杞借嵎銆傝埅绌鸿繍杈撲腑鍙湁杩欎竴閮ㄥ垎璐ㄩ噺浼氱粰鑸┖鍏徃甯︽潵杩愯垂锛屽畠鍖呮嫭鏃呭銆佽鏉庡拰璐х墿涓夐儴鍒嗐�傛皯鑸湪璁$畻椋炴満杞借嵎鏃讹紝鏃呭璐ㄩ噺寰�寰�鏄竴涓及绠楀�硷紝鎴戝浗姘戣埅灏嗘瘡鍚嶆梾瀹及绠椾负75kg銆傝鏉庡拰璐х墿娣疯鍦ㄩ鏈鸿揣鑸变腑锛屼负鍏呭垎鍒╃敤鏈夐檺鐨勮揣鑸卞绉紝涓�鑸埄鐢ㄩ泦瑁呰澶囨潵瑁呰繍銆� + </p> + <p class="p-odd">椋炴満鏈�澶х噧娌归噺鏄敱娌圭瀹圭Н纭畾鐨勶紝涓烘补绠卞绉笌鐕冩补瀵嗗害鐨勪箻绉��</p> + <h5 id="e047" class="p-odd unit2-c">锛堜簩锛夐鏈哄嚑绉嶈川閲忛棿鐨勫叧绯�</h5> + <p class="p-odd">椋炴満鐨勫悇绉嶈川閲忛噷锛屾渶澶ц捣椋炶川閲忓拰鏈�澶ф棤鐕冩补璐ㄩ噺鏄彈鍒伴鏈虹粨鏋�</p> + </div> + </div> + </div> + <!-- 128椤� --> + <div class="page-box" page="136"> + <div v-if="showPageList.indexOf(136) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">128</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">寮哄害闄愬埗鐨勶紝鏃犺浠�涔堟儏鍐典笅閮戒笉鍏佽瓒呰繃銆�</p> + <p class="p-even"> + 鑸┖鍏徃甯屾湜鍦ㄤ笉瓒呰繃椋炴満璐ㄩ噺闄愬埗銆佷笉褰卞搷椋炴満缁埅鑳藉姏鐨勬儏鍐典笅锛屽敖鍙兘澶氬湴瑁呰浇鍟嗕笟杞借嵎锛岃繖鏍峰彲浠ラ檷浣庤繍钀ユ垚鏈紝鎻愰珮缁忔祹鏁堢泭銆傛垜浠煡閬擄紝鍦ㄤ娇鐢ㄧ┖鏈鸿川閲忛噷宸茬粡鍖呭惈浜嗘満涓婃湇鍔¤鏂藉拰鏈虹粍浜哄憳锛屽彧闇�瑕佽涓婁笉瓒呰繃璐ㄩ噺闄愬埗鐨勪笟杞藉拰鐕冩补锛屽氨鍙互杩涜鍟嗕笟椋炶浜嗐�傜敱姝ゅ彲瑙侊紝鍦ㄤ笉瓒呰繃闄愬埗鐨勬儏鍐典笅锛岄�傚綋鍑忓皯鐕冩补瑁呰浇閲忥紝鍙瑁呬笟杞姐�� + </p> + <p class="p-even"> + 鏈�澶т笟杞借鍙楀埌鏈�澶ф棤鐕冩补璐ㄩ噺闄愬埗锛岃繕瑕佸彈鍒板銆佽揣鑸卞閲忛檺鍒躲�傚彈鏈�澶ф棤鐕冩补璐ㄩ噺闄愬埗鏃讹紝鏈�澶т笟杞戒负鏈�澶ф棤鐕冩补璐ㄩ噺涓庝娇鐢ㄧ┖鏈鸿川閲忎箣宸紝鍗矼ZFW-OEW锛岃杞借揪鍒拌繖涓�兼椂锛岀考鏍瑰鍙楀姏灏嗚揪鍒板畨鍏ㄩ檺鍒剁殑鏋侀檺銆傚彈瀹€�佽揣鑸卞绉檺鍒舵椂锛屽瀹㈡満鏉ヨ锛屾渶澶т笟杞戒负鍏ㄩ儴鏃呭鐨勮川閲忓姞涓婅婊¤揣鑸辫揣鐗╃殑璐ㄩ噺锛屽璐ф満鏉ヨ灏辨槸璐ц埍瀹圭Н涓庤揣鐗╁瘑搴︾殑涔樼Н銆備笘鐣屾渶澶х殑瀹㈡満A380鐨勬渶澶т笟杞戒负90.8t锛屽凡琚崯姣佺殑涓栫晫鏈�澶х殑椋炴満瀹�-225鈥滄ⅵ骞烩�濊繍杈撴満鏈�澶т笟杞戒负250t銆傚鏋滈亣鍒版壙杞藉瘑搴﹀緢灏忕殑璐х墿锛屽嵆浣胯婊′簡璐ц埍锛岃揣鐗╄川閲忎篃寰堝皬锛屼細鍦ㄤ竴瀹氱▼搴︿笂褰卞搷鑸┖杩愯緭鐨勭粡娴庢�э紝褰卞搷鑸┖鍏徃鐨勬敹鍏ャ�備负鍑忓皬绫讳技鎯呭喌瀵硅埅绌鸿繍杈撶殑褰卞搷锛屾皯鑸嚭鍙颁簡鈥滆交娉¤揣鐗┾�濈殑瑙勫畾锛屽鏋滄瘡6000cm<sup>3</sup>璐х墿璐ㄩ噺涓嶅埌1kg锛屾寜1kg璁℃敹杩愯垂銆� + </p> + <p class="p-even"> + 涓轰繚璇侀鏈虹殑鑸▼锛岄鏈哄繀椤诲姞瓒冲閲忕殑鐕冩补锛屼负鑾峰緱鏈�澶ц埅绋嬶紝杩橀渶鎸夋渶澶х噧娌归噺鏉ュ姞娌广�傚A380鍙楁补绠卞绉檺鍒讹紝鏈�澶х噧娌归噺绾︿负245t锛�310m<sup>3</sup>锛夈��</p> + <p class="p-even"> + 鏈�澶х噧娌归噺鍜屾渶澶т笟杞藉線寰�杩樹細浜掔浉鐗靛埗锛岃繖涔熷氨鍐冲畾浜嗛鏈虹殑浣跨敤鑰呮兂澶氳繍杞戒笟杞藉氨蹇呴』灏戣鐕冩补锛屾兂澶氳鐕冩补澧炲姞鑸▼灏卞繀椤诲皯鎷変笟杞姐�備互B747-200椋炴満涓轰緥锛屽畠鐨勬渶澶ц捣椋炶川閲忎负378t锛屾渶澶ф棤鐕冩补璐ㄩ噺涓�238t锛屼娇鐢ㄧ┖鏈鸿川閲忎负170t锛屽彈娌圭瀹圭Н闄愬埗鏈�澶х噧娌归噺涓�168t銆傞鏈虹殑鏈�澶т笟杞戒负68t锛屽鏋滆涓婅繖浜涗笟杞斤紝鏈�澶ф棤鐕冩补璐ㄩ噺灏变负238t锛屾鏃舵渶澶х噧娌归噺鍙楁渶澶ц捣椋炶川閲忛檺鍒朵负140t銆傚鏋滃皢椋炴満鍔犳弧鐕冩补锛屽垯鏈�澶т笟杞戒负40t銆� + </p> + <p class="p-even"> + 鍦ㄥ疄闄呰繍钀ヤ腑锛岄鏈哄緢灏戝皢鐕冩补鍔犳弧锛屽嵆浣垮湪涓嶅奖鍝嶄笟杞界殑鎯呭喌涓嬶紝涔熷緢灏戝叏娌癸紙濡備笂闈緥瀛愪腑鍔�140t鐕冩补鐨勬儏鍐碉級璧烽銆傞�氬父鍔犳补閲忎负鎵ц浠诲姟鐨勮埅绋嬪姞澶囦唤鑸▼鐨勯渶瑕佸啀鍔犱笂涓�瀹氬浠芥补閲忓嵆鍙紝涓嬩竴娈佃埅绋嬮渶瑕佺殑鐕冩补鍙湪涓嬩竴涓捣椋炴満鍦哄姞娉ㄣ�� + </p> + <h4 id="d041" class="p-even unit2-c">浜屻�侀鏈虹殑椋炶鎬ц兘</h4> + <p class="p-even">姘戠敤椋炴満鍦ㄦ墽琛岃埅绌鸿繍杈撻琛屼换鍔℃椂锛屽畬鏁寸殑椋炶杩囩▼鍖呮嫭璧烽銆佷笂</p> + </div> + </div> + </div> + <!-- 129椤� --> + <div class="page-box" page="137"> + <div v-if="showPageList.indexOf(137) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">129</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">鍗囥�佸贰鑸�佷笅婊戯紙涓嬮檷锛夈�佽繘杩戝拰鐫�闄嗗叚涓繃绋嬨�傝 閲忛鏈虹殑椋炶鎬ц兘锛屽線寰�涔熷氨鏄湅瀹冨湪杩欏嚑涓繃绋嬮噷鐨勮〃鐜般��</p> + <h5 id="e048" class="p-odd unit2-c">锛堜竴锛夎捣椋炴�ц兘</h5> + <p class="p-odd">璧烽鏄寚椋炴満浠庡姞閫熸粦璺戝埌鎶墠杞鍦帮紝骞朵笂鍗囧埌涓�瀹氶珮搴︾殑杩愬姩杩囩▼銆傝捣椋炴�ц兘涓昏鍖呮嫭璧烽绂诲湴閫熷害銆佽捣椋炴粦璺戣窛绂诲拰璧烽璺濈銆�</p> + <p class="p-odd"> + 椋炴満璧烽杩囩▼涓鍦扮灛闂寸殑閫熷害鍙捣椋炵鍦伴�熷害銆傞鏈鸿浠庡湴闈㈠崌鑷崇┖涓紝蹇呴』浜х敓瓒冲鐨勫崌鍔涙墠鑳藉疄鐜拌繖涓繃绋嬨�備粠鍗囧姏鍏紡鍙煡锛岃浜х敓瓒冲鐨勫崌鍔涘繀椤绘湁涓�瀹氱殑閫熷害鍜岄�傚綋鐨勮繋瑙掞紝璧烽绂诲湴閫熷害灏辨槸涓轰骇鐢熷崌鍔涜�岄渶瑕佺殑閫熷害銆傝繖涓�熷害瓒婂ぇ锛岃鏄庨鏈鸿捣椋炶繃绋嬩腑闇�瑕佸姞閫熺殑鏃堕棿瓒婇暱锛屾墍闇�璺戦亾灏辫秺闀匡紝瀵规満鍦烘潯浠剁殑渚濊禆绋嬪害灏辫秺澶э紝璧烽鎬ц兘灏辫秺宸�備竴鑸潵璇达紝椋炴満璧烽璐ㄩ噺瓒婂ぇ锛岃捣椋炴墍闇�鍗囧姏涔熻秺澶э紝璧烽绂诲湴閫熷害灏辫秺澶с�傞殢鐫�椋炴満鍔ㄥ姏瑁呯疆鎬ц兘瓒婃潵瓒婂ソ锛岄鏈虹殑鍔犻�熸�ц秺鏉ヨ秺濂斤紝鏈夋椂灏界绂诲湴閫熷害澶э紝浣嗗姞閫熸椂闂寸煭锛屾墍闇�璺戦亾涔熶笉闀匡紝璧烽绂诲湴閫熷害宸蹭笉鍐嶆槸琛¢噺椋炴満璧烽鎬ц兘鐨勪富瑕佸洜绱犮�� + </p> + <p class="p-odd"> + 璧烽璺濈鎸囬鏈轰粠璺戦亾涓婂紑濮嬫粦璺戝埌绂诲湴骞朵笂鍗囧埌涓�瀹氶珮搴︼紙10.7m锛�35ft锛夋墍缁忚繃鐨勬按骞宠窛绂伙紝鍖呮嫭鍦伴潰鐨勮捣椋炴粦璺戣窛绂诲拰绌轰腑娈佃窛绂汇�傝捣椋炴粦璺戣窛绂荤殑闀跨煭鍐冲畾浜嗛鏈哄鏈哄満璺戦亾鐨勪緷璧栫▼搴︺�傝繖涓窛绂昏秺鐭紝璇存槑椋炴満瀵规満鍦烘潯浠朵緷璧栬秺灏忥紝璧烽鎬ц兘瓒婂ソ銆傝捣椋炵┖涓璺濈琛ㄦ槑椋炴満瀵规満鍦哄噣绌烘潯浠剁殑渚濊禆绋嬪害銆傝繖娈佃窛绂昏秺鐭紝椋炴満瀵规満鍦哄噣绌烘潯浠朵緷璧栬秺灏忋�備竴鑸潵璇达紝璧烽婊戣窇璺濈鐭紝绌轰腑娈佃窛绂讳篃涓嶄細澶暱銆傜幇鍦ㄨ埅绌哄埗閫犳妧鏈殑鍙戝睍锛岃姹傞鏈烘湞澶у瀷鍖栥�侀珮閫熷寲绛夋柟鍚戝彂灞曪紝涓嶅緱浠ュ鍔犺捣椋炴粦璺戣窛绂诲拰璧烽璺濈涓轰唬浠枫�� + </p> + <div class="bj4"> + <div class="img-rights w200 openImgBox"> + <img class="img" alt="" src="../../assets/images/0141-1.jpg" /> + <p class="img">鍥�2-147 鈥滈篂鈥濆紡鎴樻枟鏈�</p> + </div> + <span> + <div class="link-float fl al-c"> + <div class="fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 涓洪檷浣庡鏈哄満鐨勪緷璧栵紝鑻卞浗鏇剧爺鍒跺嚭鍙瀭鐩磋捣闄嶇殑鈥滈篂鈥濆紡鎴樻枟鏈猴紙鍥�2-147锛夛紝璧烽銆佺潃闄嗗彲浠ヤ笉闇�瑕佽窇閬撱�備娇鐢ㄤ腑鍙戠幇杩芥眰鈥滈浂璺濈鈥濊捣闄嶆墍浠樺嚭鐨勪唬浠峰お澶э紝瀹炴垬鎰忎箟涓嶅ぇ锛屾晠璇ユ満鍨嬫病鏈夊緱鍒板緢濂界殑鍙戝睍锛岀幇宸插叏閮ㄩ��褰广�傚悗鏉ョ編鍥戒负婊¤冻娴峰啗闇�瑕侊紝鍦‵-35鍩虹涓婅鐢熷嚭F-35B鍨嬪瀭鐩�/鐭窛璧疯惤鎴樻枟鏈恒�� + </p> + + </span> + </span> + </div> + <h5 id="e049" class="p-odd unit2-c">锛堜簩锛変笂鍗囨�ц兘</h5> + <p class="p-odd">閫氬父璇寸殑涓婂崌鏄寚椋炴満娌垮�炬枩鍚戜笂鐨勮建杩规墍鍋氱殑绛夐�熺洿绾块琛岋紝椋炴満鐨勪笂鍗囨�ц兘鍖呮嫭涓婂崌瑙掋�佷笂鍗囩巼鍜屽崌闄愩��</p> + </div> + </div> + </div> + <!-- 130椤� --> + <div class="page-box" page="138"> + <div v-if="showPageList.indexOf(138) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">130</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 涓婂崌瑙掓槸鎸囬鏈轰笂鍗囪建杩癸紙椋炶閫熷害锛変笌姘村钩闈㈢殑澶硅锛堝浘2-148锛夈�備笂鍗囪瓒婂ぇ锛岄鏈轰笂鍗囪繃绋嬩腑鐨勮秺闅滆兘鍔涜秺寮猴紝椋炴満涓婂崌鎬ц兘瓒婂ソ銆傜幇浠i鏈哄熀鏈笉鍐嶈拷姹傚ぇ涓婂崌瑙掞紝璁稿鎴樻枟鏈虹殑鏈�澶т笂鍗囪宸茬粡杈惧埌90掳锛屽嵆鍨傜洿涓婂崌銆� + </p> + <p class="p-even"> + 涓婂崌鐜囨槸鍗曚綅鏃堕棿鍐呴鏈轰笂鍗囩殑楂樺害锛岄�氬父浠モ�渕/s鈥濇垨鈥渇t/min鈥濅负鍗曚綅銆傛渶澶т笂鍗囩巼瓒婂ぇ锛岄鏈鸿幏寰楅珮搴﹁秺蹇紝涓婂崌鍒板悓鏍风殑楂樺害闇�瑕佺殑鏃堕棿瓒婄煭锛岄鏈虹殑涓婂崌鎬ц兘瓒婂ソ銆傛皯鐢ㄨ繍杈撴満瀵逛笂鍗囩巼鐨勮姹備笉楂樸�備笂鍗囩巼鏈�澶х殑椋炴満鏄縿缃楁柉鐨勮嫃-27鎴樻枟鏈猴紙鍥�2-149锛夛紝娴峰钩闈㈡渶澶т笂鍗囩巼涓�330m/s銆� + </p> + <div class="fl al-fe p-even"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0142-1.jpg" /> + </p> + <p class="img"> + 鍥�2-148 涓婂崌瑙� + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0142-2.jpg" /> + </p> + <p class="img">鍥�2-149 鑻�-27鎴樻枟鏈�</p> + </span> + </div> + <p class="p-even"> + 鍗囬檺鏄鏈轰笂鍗囦腑鎵�鑳借揪鍒扮殑鏈�澶ч珮搴︺�傞殢鐫�椋炶楂樺害鐨勫崌楂橈紝椋炴満鐨勬渶澶т笂鍗囩巼灏嗛�愭笎闄嶄綆锛屽綋鏈�澶т笂鍗囩巼闄嶅埌0鏃讹紝椋炴満鍐嶄篃涓嶈兘涓婂崌浜嗭紝姝ゆ椂鐨勯珮搴﹀氨鏄鏈虹殑鐞嗚鍗囬檺銆傞鏈轰笂鍗囧埌鐞嗚鍗囬檺娌℃湁瀹為檯鎰忎箟锛屼篃鍑犱箮杈句笉鍒拌繖涓�楂樺害锛屽疄闄呬笂鍗囦腑鎵�璇寸殑鍗囬檺鎸囧疄鐢ㄥ崌闄愩�傚浜庡柗姘斿紡椋炴満锛屽綋鏈�澶т笂鍗囩巼闄嶅埌2.5m/s鏃讹紝鎵�杈惧埌鐨勯珮搴﹀彨瀹炵敤鍗囬檺銆傜幇浠f皯鐢ㄨ繍杈撴満鐢变簬鎵�閫夊彇鐨勯琛岄珮搴﹀湪10000m宸﹀彸锛屽鍗囬檺瑕佹眰涓嶉珮锛屽彧瑕佽兘杈惧埌鐩稿簲鐨勯珮搴﹀嵆鍙紝濡侫380鐨勫疄鐢ㄥ崌闄愪负13100m銆傚啗鐢ㄩ鏈虹敱浜庢墽琛屼换鍔¢渶瑕侊紝寰�寰�瀵瑰崌闄愭湁杈冮珮鐨勮姹傦紝鏈夌殑鍐涚敤椋炴満瀹炵敤鍗囬檺鍦�30000m浠ヤ笂銆� + </p> + <h5 id="e050" class="p-even unit2-c">锛堜笁锛夊贰鑸�ц兘锛堝钩椋炴�ц兘锛�</h5> + <p class="p-even">姘戠敤杩愯緭鏈哄贰鑸琛屽崰鎹簡缁濆ぇ閮ㄥ垎椋炶鏃堕棿锛屽洜姝ゅ贰鑸�ц兘灏嗙洿鎺ュ奖鍝嶅埌姘戠敤椋炴満鍦ㄤ娇鐢ㄤ腑鐨勮〃鐜般�傚贰鑸�ц兘鍖呮嫭鏈�灏忓钩椋為�熷害銆佹渶澶у钩椋為�熷害銆佸钩椋為�熷害鑼冨洿銆佽繙鑸�熷害绛夈��</p> + <p class="p-even"> + 鑳界淮鎸侀鏈哄钩椋炵殑鏈�灏忛�熷害鍙渶灏忓钩椋為�熷害銆傞鏈哄湪椋炶涓渶瑕佷骇鐢熻冻浠ュ钩琛¢噸鍔涚殑鍗囧姏锛屽洜鑰岄渶瑕佷竴瀹氱殑閫熷害銆備綆閫熷害椋炶鏃堕渶瑕佽緝澶у崌鍔涚郴鏁帮紝鑰屽崌鍔涚郴鏁伴殢杩庤绛夊洜绱犲湪涓�瀹氳寖鍥村唴鍙樺寲锛岄鏈哄湪涓寸晫杩庤鏃讹紝鍗囧姏绯绘暟鏈�澶э紝姝ゆ椂瀵瑰簲鐨勯琛岄�熷害灏辨渶灏忥紝閫熷害鍐嶅皬灏变笉鍙兘缁存寔骞抽 + </p> + </div> + </div> + </div> + <!-- 131椤� --> + <div class="page-box" page="139"> + <div v-if="showPageList.indexOf(139) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">璁よ瘑姘戠敤鑸┖鍣�</li> + <li class="headerNumber">039</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">浜嗐�傛渶灏忓钩椋為�熷害瓒婂皬锛岃鏄庨鏈虹殑浣庨�熸�ц兘銆佸け閫熸�ц兘瓒婂ソ銆�</p> + <p class="p-odd"> + 鏈�澶у钩椋為�熷害鏄鏈哄湪骞抽鏃舵墍鑳借揪鍒扮殑鏈�澶ч�熷害銆傞�氬父鎯呭喌涓嬶紝鏈�澶у钩椋為�熷害鍙楀彂鍔ㄦ満鎬ц兘闄愬埗銆傞�熷害澧炲ぇ骞抽闃诲姏澧炲ぇ锛岄樆鍔涘ぇ鍒颁笌鍙戝姩鏈鸿兘鎻愪緵鐨勬渶澶ф帹鍔涘钩琛℃椂锛岄鏈哄氨杈惧埌鏈�澶у钩椋為�熷害浜嗐�傛渶澶у钩椋為�熷害瓒婂ぇ锛岃鏄庨鏈虹殑楂橀�熸�ц兘瓒婂ソ銆備负淇濊瘉椋炶瀹夊叏鍜岄鏈虹殑缁忔祹鎬э紝姘戠敤杩愯緭鏈虹殑鏈�澶у钩椋為�熷害涓�鑸笉瓒呰繃鏃堕��1000km锛屼笉瓒呰繃涓寸晫<i>M</i>鏁帮紝浠ュ厤鍑虹幇婵�娉㈤樆鍔涘拰鎿嶇旱涓婄殑鏄捐憲鍙樺寲銆備竴浜涘啗鐢ㄩ鏈虹殑鏈�澶у钩椋為�熷害涓�<i>M</i>鏁�3.0浠ヤ笂銆� + </p> + <p class="p-odd">骞抽閫熷害鑼冨洿鏄渶灏忓钩椋為�熷害鍜屾渶澶у钩椋為�熷害涔嬮棿鐨勮寖鍥达紝鑼冨洿瓒婂ぇ锛岃鏄庨鏈哄彲缁存寔绋冲畾椋炶鐨勯�熷害閫夋嫨闈㈣秺澶э紝骞抽鎬ц兘瓒婂ソ銆�</p> + <p class="p-odd"> + 杩滆埅閫熷害鏄寚椋炴満浣跨敤涓�瀹氶噺鐨勭噧娌瑰彲浠ヨ揪鍒版渶杩滆埅绋嬬殑椋炶閫熷害锛屾皯鑸腑閫氬父绉颁负宸¤埅閫熷害锛岃閫熷害瀵瑰簲鐨勫崈绫宠�楁补閲忔渶灏戙�傛皯鐢ㄨ繍杈撴満鐨勮繙鑸�熷害鎺ヨ繎鏈�澶у钩椋為�熷害锛岃澶氬啗鐢ㄩ鏈虹殑杩滆埅閫熷害涓庢渶澶у钩椋為�熷害鐨勫樊鍒緝澶с�� + </p> + <h5 id="e051" class="p-odd unit2-c">锛堝洓锛変笅婊戞�ц兘</h5> + <p class="p-odd">椋炴満娌垮悜涓嬪�炬枩鐨勮建杩规墍鍋氱殑涓嶆柇闄嶄綆楂樺害鐨勯琛屽彨涓嬫粦锛堜笅闄嶏級锛屼笅婊戞�ц兘鍖呮嫭涓嬫粦瑙掋�佷笅闄嶇巼鍜屼笅婊戣窛绂汇��</p> + <p class="p-odd">涓嬫粦杞ㄨ抗锛堟垨涓嬫粦閫熷害锛変笌姘村钩闈㈢殑澶硅鍙笅婊戣锛涢鏈哄崟浣嶆椂闂村唴涓嬮檷鐨勯珮搴﹀彨涓嬮檷鐜囷紝鍗曚綅涓簃/s鎴杅t/min锛涢鏈轰笅婊戣繃绋嬩腑閫氳繃鐨勬按骞宠窛绂诲彨涓嬫粦璺濈銆�</p> + <p class="p-odd"> + 浠庨琛屾�ц兘鐨勮搴︼紝杩芥眰鐨勬槸鍦ㄥ彂鍔ㄦ満涓уけ鍔ㄥ姏鐨勬儏鍐典笅锛屼繚鎸佷笅婊戣兘鍙栧緱鐨勬渶灏忎笅婊戣銆佹渶灏忎笅闄嶇巼鍜屾渶杩滀笅婊戣窛绂汇�備笅婊戣窛绂讳笌椋炴満涓嬮檷楂樺害涔嬫瘮鍙粦缈旀瘮锛屾渶灏忎笅婊戣瓒婂皬锛屼篃灏辨剰鍛崇潃婊戠繑姣旇秺澶э紝椋炴満鎹熷け鍚屾牱鐨勯珮搴﹀彲浠ヤ笅婊戞洿杩滅殑璺濈锛屽鍋滆溅鍚庨�夋嫨杩檷鍦哄湴鏇存湁鍒┿�備笅婊戞�ц兘濂界殑椋炴満锛屽彂鍔ㄦ満鍋滆溅鍚庢粦缈旀瘮鍦�10浠ヤ笂銆� + </p> + <h5 id="e052" class="p-odd unit2-c">锛堜簲锛夎繘杩戝拰鐫�闄嗘�ц兘</h5> + <p class="p-odd"> + 杩涜繎鏄寚椋炴満鐫�闄嗗墠涓嬮檷楂樺害瀵瑰噯璺戦亾椋炶鐨勮繃绋嬨�傚湪杩涜繎闃舵锛岃浣块鏈鸿皟鏁村ソ楂樺害鍜岄�熷害锛屽鍑嗚窇閬撱�侀伩寮�鍦伴潰闅滅鐗╋紝涓虹潃闄嗗仛鍑嗗銆傜潃闄嗘槸鎸囬鏈轰粠瀹夊叏楂樺害锛�25m锛夊紑濮嬩笅婊戙�佹媺骞崇洿鍒版帴鍦板苟鍋滄杩愬姩鐨勮繃绋嬨�傜潃闄嗘�ц兘鍖呮嫭鎺ュ湴閫熷害銆佺潃闄嗚窛绂讳笌鐫�闄嗘粦璺戣窛绂汇�� + </p> + <p class="p-odd">椋炴満鐫�闄嗘椂鎺ュ湴鐬棿鐨勯�熷害鍙帴鍦伴�熷害銆傜潃闄嗚姹傞鏈虹紦鎱㈤檷浣庨珮搴︺�佽交杞绘帴鍦帮紝鍥犳椋炴満鎺ュ湴鐬棿涔熻淇濇寔鍜岄噸鍔涘熀鏈浉绛夌殑鍗囧姏锛岃浜� + </p> + </div> + </div> + </div> + <!-- 132椤� --> + <div class="page-box" page="140"> + <div v-if="showPageList.indexOf(140) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">132</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鐢熻冻澶熺殑鍗囧姏灏遍渶瑕佷竴瀹氱殑鎺ュ湴閫熷害銆傛帴鍦伴�熷害瓒婂ぇ锛岄�氬父婊戣窇璺濈灏辫秺闀匡紝浣嗘粦璺戣窛绂讳篃鍜岄鏈哄噺閫熸�ц兘鏈夊叧锛屽噺閫熸�ц兘濂界殑椋炴満锛屽嵆浣垮湪杈冨ぇ鐨勬帴鍦伴�熷害涓嬫粦璺戣窛绂讳篃涓嶉暱銆�</p> + <p class="p-even"> + 椋炴満浠庡畨鍏ㄩ珮搴︿笅婊戠洿鑷抽檷钀藉湪鍦伴潰骞跺仠姝㈣繍鍔ㄦ墍缁忚繃鐨勬按骞宠窛绂诲彨鐫�闄嗚窛绂汇�傞鏈轰粠鎺ュ湴鐩磋嚦鍋滄杩愬姩鎵�缁忚繃鐨勬按骞宠窛绂诲彨鐫�闄嗘粦璺戣窛绂伙紝鐫�闄嗚窛绂诲寘鎷潃闄嗘粦璺戣窛绂诲拰绌轰腑娈佃窛绂汇�傜潃闄嗘粦璺戣窛绂昏秺鐭紝璇存槑椋炴満瀵规満鍦鸿窇閬撶殑渚濊禆鎬ц秺灏忥紝鐫�闄嗘�ц兘瓒婂ソ锛涚潃闄嗙┖涓璺濈瓒婄煭锛岃鏄庨鏈哄鏈哄満鍑�绌烘潯浠朵緷璧栨�ц秺灏忥紝鐫�闄嗘�ц兘瓒婂ソ銆傜敱浜庨噰鍙栦簡鍒囧疄鏈夋晥鐨勫噺閫熸帾鏂斤紝澶у瀷姘戠敤椋炴満鐫�闄嗘粦璺戣窛绂讳竴鑸湪2000m浠ュ唴銆� + </p> + <h2 id="b008" class="p-even"><img class="inline1" alt="" src="../../assets/images/tzyy.jpg" /></h2> + <p class="block p-even td-0">1.姘戠敤鑸┖鍣ㄧ殑浣跨敤鐜扮姸濡備綍锛�</p> + <textarea v-model="expandQuestion.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'one' }" @focus="handleFocus('one')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">2.姘戣埅瀵硅埅绌哄櫒鐨勪娇鐢ㄨ姹傛湁鍝簺锛�</p> + <textarea v-model="expandQuestion.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'two' }" @focus="handleFocus('two')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">3.浠�涔堟槸杩庤锛�</p> + <textarea v-model="expandQuestion.reading.three" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'three' }" @focus="handleFocus('three')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">4.鍗囧姏鏄�庢牱浜х敓鐨勶紵褰卞搷椋炴満鍗囧姏鐨勫洜绱犳湁鍝簺锛�</p> + <textarea v-model="expandQuestion.reading.four" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'four' }" @focus="handleFocus('four')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">5.椋炴満鍙互鍒嗕负鍝嚑澶ч儴鍒嗭紵鍏朵腑鏋勬垚鏈轰綋鐨勬槸鍝簺閮ㄥ垎锛�</p> + <textarea v-model="expandQuestion.reading.five" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'five' }" @focus="handleFocus('five')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">6.鏈虹考鐨勪綔鐢ㄦ槸浠�涔堬紵</p> + <textarea v-model="expandQuestion.reading.six" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'six' }" @focus="handleFocus('six')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">7.璧疯惤鏋舵湁浠�涔堜綔鐢紵鐜颁唬椋炴満甯歌鐨勮捣钀芥灦閲囩敤鍝閰嶇疆褰㈠紡锛�</p> + <textarea v-model="expandQuestion.reading.seven" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'seven' }" @focus="handleFocus('seven')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">8.鑸┖鍠锋皵寮忓彂鍔ㄦ満鐨勭绫绘湁鍝簺锛熷垎鍒敤浜庝粈涔堣埅绌哄櫒锛�</p> + <textarea v-model="expandQuestion.reading.eight" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'eight' }" @focus="handleFocus('eight')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">9.杈呭姪鍔ㄥ姏瑁呯疆鐨勪綔鐢ㄦ槸浠�涔堬紵杈呭姪鍔ㄥ姏瑁呯疆閫氬父瀹夎鍦ㄩ鏈轰粈涔堥儴浣嶏紵</p> + <textarea v-model="expandQuestion.reading.nine" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'nine' }" @focus="handleFocus('nine')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">10.濡傛灉绌洪�熺缁撳啺锛屽牭濉炰簡鍏ㄥ帇瀛旓紝灏嗗鑷村摢浜涗华琛ㄧ殑鎸囩ず涓嶅噯锛熷鏋滃牭濉炰簡闈欏帇瀛旓紝灏嗗鑷村摢浜涗华琛ㄧ殑鎸囩ず涓嶅噯锛�</p> + <textarea v-model="expandQuestion.reading.ten" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'ten' }" @focus="handleFocus('ten')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">11.椋炴満璧烽銆佺潃闄嗗拰鑸嚎椋炶锛屽垎鍒娇鐢ㄤ粈涔堥珮搴︼紵</p> + <textarea v-model="expandQuestion.reading.eleven" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'eleven' }" @focus="handleFocus('eleven')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">12.涓轰粈涔堢湡閫熴�佽〃閫熷拰鍦伴�熶細涓嶅悓锛�</p> + <textarea v-model="expandQuestion.reading.twelve" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'twelve' }" @focus="handleFocus('twelve')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">13.澶寸瓑鑸便�佸叕鍔¤埍銆佺粡娴庤埍鐨勫尯鍒槸浠�涔堬紵涓�绾у鑸卞竷灞�銆佷簩绾у鑸卞竷灞�銆佷笁绾у鑸卞竷灞�鐨勫惈涔夋槸浠�涔堬紵</p> + <textarea v-model="expandQuestion.reading.thirteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'thirteen' }" @focus="handleFocus('thirteen')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">14.瀹㈣埍鍐呯殑鏁戠敓璁炬柦鏈夊摢浜涳紵</p> + <textarea v-model="expandQuestion.reading.fourteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'fourteen' }" @focus="handleFocus('fourteen')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">15.浠�涔堟槸涓氳浇锛熸渶澶т笟杞藉拰鏈�澶ц捣椋炶川閲忋�佹渶澶ф棤鐕冩补璐ㄩ噺鏈変綍鍏崇郴锛�</p> + <textarea v-model="expandQuestion.reading.fifteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'fifteen' }" @focus="handleFocus('fifteen')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">16.姘戠敤椋炴満鐨勯琛岃繃绋嬬敱鍝簺閮ㄥ垎鏋勬垚锛�</p> + <textarea v-model="expandQuestion.reading.sixteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'sixteen' }" @focus="handleFocus('sixteen')" + @blur="handleBlur()"></textarea> + </div> + </div> + </div> + <preView :isClear="dialogVisible" :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> + </div> +</template> + +<script> +import preView from '@/components/pdfview/index.vue' +export default { + name: "chaptertwo", + props: { + showPageList: { + type: Array, + }, + }, + components: { + preView, + }, + data() { + return { + dialogVisible: false, + p_md5: '', + somePdfTitleValue: '', + isFocused: null, + showSingleChoice: false, + showChoiceAnswer: false, + singleChoice: [ + { + txt: "涓▼椋炴満鐨勮埅绋嬩负锛氾紙銆�銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: "", + answer: "B", + option: [ + { + zm: "A", + txt: "A.涓�鑸皬浜�1000km" + }, + { + zm: "B", + txt: "B.3000km宸﹀彸" + }, + { + zm: "C", + txt: "C.11000km宸﹀彸" + }, + { + zm: "D", + txt: "D.鍙互瀹屾垚涓�斾笉鐫�闄嗙殑娲查檯璺ㄨ秺椋炶" + }, + ] + }, + { + txt: "鎸夊浗闄呬笂閫氬父鐨勬爣鍑嗭紝鑸▼鍦�3000km浠ヤ笅鑰呬负锛堛��銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: "", + answer: "A", + option: [ + { + zm: "A", + txt: "A.鐭▼瀹㈡満" + }, + { + zm: "B", + txt: "B.涓煭绋嬪鏈�" + }, + { + zm: "C", + txt: "C.涓▼瀹㈡満" + }, + { + zm: "D", + txt: "D.涓繙绋嬪鏈�" + }, + ] + }, + ], + singleChoiceOne: [ + { + txt: "鏈�鏃╁嚭鐜扮殑閲嶄簬绌烘皵鐨勯琛屽櫒鏄紙銆�銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: "", + answer: "D", + option: [ + { + zm: "A", + txt: "A.椋炶墖" + }, + { + zm: "B", + txt: "B.椋炴満" + }, + { + zm: "C", + txt: "C.婊戠繑鏈�" + }, + { + zm: "D", + txt: "D.椋庣瓭" + }, + ] + }, + ], + expandQuestion: { + reading: { + one: "", + two: "", + three: "", + four: "", + five: "", + six: "", + seven: "", + eight: "", + nine: "", + ten: "", + eleven: "", + twelve: "", + thirteen: "", + fourteen: "", + fifteen: "", + sixteen: "", + }, + }, + chapter002: { + pdfMd5: { + 1: { + md5: '08ca9a3d75b2a0aa939c1206d2c82738', + name: '鎺㈢鍥戒骇澶у瀷姘撮檰涓ゆ爾椋炴満', + }, + 2: { + md5: '51bfa4bb4bfa61a48f4b4276e3deb21a', + name: '鑸┖浠〃锛氬骇鑸遍噷鐨勨�滃叏鎭獥鍙b��', + }, + }, + }, + } + }, + mounted() { + + const bookQuestion = localStorage.getItem("civilAviatyon-book-chapter02-expandQuestion"); + if (bookQuestion) { + this.expandQuestion = JSON.parse(bookQuestion); + } + + const singleChoice = localStorage.getItem("civilAviatyon-book-chapter02-singleChoice"); + if (singleChoice) { + this.singleChoice = JSON.parse(singleChoice); + } + + const singleChoiceOne = localStorage.getItem("civilAviatyon-book-chapter02-singleChoiceOne"); + if (singleChoiceOne) { + this.singleChoiceOne = JSON.parse(singleChoiceOne); + } + }, + methods: { + toUrl(val) { + if (val) { + this.p_md5 = this.chapter002.pdfMd5[val].md5 + this.somePdfTitleValue = this.chapter002.pdfMd5[val].name + this.$refs.pdfDialogRef.openDialog() + } + }, + handleFocus(id) { + this.isFocused = id; // 褰搕extarea鑱氱劍鏃讹紝璁剧疆涓簍rue + }, + handleBlur() { + this.isFocused = null; // 褰搕extarea澶卞幓鐒︾偣鏃讹紝璁剧疆涓篺alse + }, + setBookQuestion() { + localStorage.setItem( + "civilAviatyon-book-chapter02-expandQuestion", + JSON.stringify(this.expandQuestion) + ); + }, + goChoiceJudge(){ + this.singleChoice.forEach(item => { + item.isComplete = true; + if (item.userAnswer == item.answer) { + item.isRight = true; + } else { + item.isRight = false; + } + }); + this.showChoiceAnswer = true + }, + changeChoiceData(){ + localStorage.removeItem("civilAviatyon-book-chapter02-singleChoice") + this.singleChoice.forEach(item => { + item.isComplete = false; + item.isRight = null; + item.userAnswer = ""; + }); + this.showChoiceAnswer = false + }, + saveInputChoice(){ + localStorage.setItem( + "civilAviatyon-book-chapter02-singleChoice", + JSON.stringify(this.singleChoice) + ); + }, + goSingleChoice(){ + this.singleChoiceOne.forEach(item => { + item.isComplete = true; + if (item.userAnswer == item.answer) { + item.isRight = true; + } else { + item.isRight = false; + } + }); + this.showSingleChoice = true + }, + changeSingleChoice(){ + localStorage.removeItem("civilAviatyon-book-chapter02-singleChoiceOne") + this.singleChoiceOne.forEach(item => { + item.isComplete = false; + item.isRight = null; + item.userAnswer = ""; + }); + this.showSingleChoice = false + }, + saveChoiceOne(){ + localStorage.setItem( + "civilAviatyon-book-chapter02-singleChoiceOne", + JSON.stringify(this.singleChoiceOne) + ); + } + } +}; +</script> + +<style lang="less" scoped> +.body { + display: flex; +} + +.imgBox { + display: flex !important; + flex-direction: column-reverse !important; + position: relative !important; + + .img { + margin: 0 !important; + font-size: 16px !important; + position: absolute !important; + left: 40% !important; + bottom: -2% !important; + } + + img { + height: 80%; + } +} +</style> diff --git a/src/books/civilAviation/view/components/chapter003.vue b/src/books/civilAviation/view/components/chapter003.vue new file mode 100644 index 0000000..761971e --- /dev/null +++ b/src/books/civilAviation/view/components/chapter003.vue @@ -0,0 +1,1143 @@ +<template> + <div class="chapter" num="4"> + <!-- 绗笁鍗曞厓灏侀潰 --> + <div class="page-box" style="min-height: 1108px !important" page="141"> + <div v-if="showPageList.indexOf(141) > -1" class="fl"> + <img class="img-0" alt="" src="../../assets/images/0145.jpg" /> + </div> + </div> + <!-- 134椤� --> + <div class="page-box" page="142"> + <div v-if="showPageList.indexOf(142) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">134</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h2 id="b003" class="p-even"> + <img class="inline1" alt="" src="../../assets/images/zszb.jpg" /> + </h2> + <h3 id="c001" class="p-even unit3-c"> + 瀛︿範浠诲姟涓�<br />澶ф皵灞� + </h3> + <div class="task-u3-c ma-l"></div> + <p class="p-even"> + 鎴戜滑鐢熸椿鐨勫湴鐞冨懆鍥磋鐩栫潃涓�灞傚帤鍘氱殑姘旀�佺墿璐紝濂藉儚缁欏湴鐞冪┛涓婁簡涓�浠堕噺韬畾鍋氱殑澶栬。銆傝繖浠跺琛e氨鏄ぇ姘斿眰锛屾槸椋炶鍣ㄦ椿鍔ㄧ殑鍦版柟锛屾垜浠垯鐢熸椿鍦ㄥぇ姘斿眰鐨勬渶娣卞銆傝埅绌哄櫒鍦ㄥぇ姘斿眰涓琛岋紝涓庡ぇ姘旀湁鐩稿杩愬姩锛屽氨浼氫骇鐢熺┖姘斿姩鍔涖�傜┖姘斿姩鍔涚洿鎺ュ奖鍝嶈埅绌哄櫒鐨勯琛岀姸鎬佸拰椋炶鎬ц兘锛屽畠涓庡ぇ姘旂殑鐗╃悊鎬ц川鏈夌洿鎺ュ叧绯伙紱褰卞搷椋炶娲诲姩鐨勫ぉ姘旂幇璞′篃鍙戠敓鍦ㄥぇ姘斿眰涓�傚洜姝わ紝鎴戜滑蹇呴』浜嗚В涓�涓嬪ぇ姘斿眰銆� + </p> + <p class="p-even"> + 澶ф皵灞傜殑涓昏鎴愬垎鏈夋爱姘旓紙绾﹀崰78.1%锛夈�佹哀姘旓紙绾﹀崰20.9%锛夛紝鍏朵粬姘斾綋濡備簩姘у寲纰炽�佹按钂告皵绛夛紝鍐嶅姞涓婁竴浜涘浐鎬佸皹鍩冿紝鍏卞崰绾�1%銆傞琛屼腑椋炴満鐨勭┖姘斿姩鍔涗笌澶ф皵鐨勫寲瀛︽�ц川鏃犵洿鎺ュ叧绯伙紝鍥犳鎴戜滑鍙�冭檻澶ф皵鐨勭墿鐞嗘�ц川锛屽彧鏈夋皵璞¢儴鍒嗗拰澶ф皵涓按钂告皵銆佸浐鎬佸皹鍩冨叧绯昏緝涓哄瘑鍒囥�� + </p> + <h4 id="d042" class="p-even unit3-c">涓�銆佸ぇ姘斿眰鐨勭粨鏋�</h4> + <p class="p-even"> + 澶ф皵灞傚叡鍒嗕簲灞傦紝浠庡湴闈㈠線涓婂垎鍒槸瀵规祦灞傘�佸钩娴佸眰锛堝悓娓╁眰锛夈�佷腑闂村眰銆佺數绂诲眰锛堢儹灞�/鏆栧眰锛夊拰鏁i�稿眰锛堝浘3-1锛夈�傛垜浠父璇寸殑鑷哀灞傚叾瀹炲苟涓嶆槸鍗曠嫭鐨勪竴灞傚ぇ姘旓紝鑰屾槸骞虫祦灞備腑鑷哀鍚噺鐩稿杈冮珮鐨勯儴鍒嗭紝灞炰簬骞虫祦灞傘�傛皯鐢ㄩ鏈虹殑椋炶鑼冨洿浠呴檺浜庡娴佸眰鍜屽钩娴佸眰搴曢儴锛屽啗鐢ㄩ鏈鸿兘杈惧埌骞虫祦灞備腑閮ㄣ�傚洜姝わ紝鎴戜滑鍦ㄦ湰閮ㄥ垎瀛︿範涓紝鍙粙缁嶅娴佸眰鍜屽钩娴佸眰銆� + </p> + <p class="p-even"> + 瀵规祦灞傛槸澶ф皵涓渶浣庣殑涓�灞傦紝鎴栬�呰鏄ぇ姘斿眰鐨勫簳閮ㄣ�傚湪璧ら亾鍦板尯锛屽娴佸眰鐨勫帤搴﹀彲杈�18km锛屼袱鏋佸湴鍖轰粎鏈�8km锛屽湪涓含搴﹀湴鍖猴紝瀹冪殑椤跺眰璺濆湴闈㈢害涓�11km銆傜敱浜庡湴鐞冨紩鍔涚殑浣滅敤锛屽ぇ姘斿叏閮ㄨ川閲忕殑3/4鍜屽嚑涔庡叏閮ㄦ按钂告皵闆嗕腑鍦ㄨ繖涓�灞傦紝鍥犳瀵规祦灞傛槸澶╂皵鍙樺寲鏈�澶嶆潅鐨勪竴灞傦紝鏈夐銆佷簯銆侀洦銆侀洩銆侀浌绛夊ぉ姘旂幇璞°�傚湪瀵规祦灞備腑锛岀┖姘旀湁姘村钩娴佸姩涔熸湁鍨傜洿娴佸姩锛屽舰鎴愭按 + </p> + </div> + </div> + </div> + <!-- 135椤� --> + <div class="page-box" page="143"> + <div v-if="showPageList.indexOf(143) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">135</li> + </ul> + <div class="bodystyle"> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0147-1.jpg" /> + <p class="img">鍥�3-1 澶ф皵灞�</p> + </div> + <span> + <p class="p-odd td-0"> + 骞冲拰鍨傜洿鏂瑰悜鐨勯樀椋庛�� + </p> + <p class="p-odd"> + 瀵规祦灞傚舰鎴愮殑鍘熷洜鏄湴闈㈠惛鏀朵簡澶槼杈愬皠鐨勭儹閲忥紝娓╁害鍗囬珮鍚庡绌烘皵鍔犵儹銆傝鍔犵儹鐨勭┖姘斿瘑搴﹀噺灏忚�屽悜涓婃祦鍔紝楂樺鐨勫喎绌烘皵鍚戜笅娴佸姩锛岃繖鏍峰氨褰㈡垚浜嗗娴併�傚湴鐞冭丹閬撻檮杩戜负鐑甫鍦板尯锛屾俯搴﹁緝楂橈紝绌烘皵琚姞鐑俯搴﹀崌楂樸�佸瘑搴﹂檷浣庤緝澶氾紝灏卞彲涓婂崌鍒拌緝楂樼殑楂樺害锛屾墍浠ュ娴佸眰杈冨帤锛涗袱鏋佹俯搴﹀緢浣庯紝绌烘皵琚姞鐑俯搴﹀崌楂樺箙搴﹀皬锛屼笂鍗囩殑楂樺害鏈夐檺锛屾晠瀵规祦灞傝緝钖勩�傚嵆浣垮悓涓�涓湴鍖猴紝鍦ㄤ笉鍚岀殑瀛h妭娓╁害涔熶笉鍚岋紝瀵规祦灞傜殑鍘氬害涔熶細鍥犲鑺傛敼鍙樿�屽彉鍖栥�� + </p> + <p class="p-odd"> + 骞虫祦灞備綅浜庡娴佸眰涔嬩笂锛岄《閮ㄨ窛鍦伴潰绾�50km銆傚湪骞虫祦灞傜殑涓嬪崐閮紙绾�20km浠ヤ笅锛夛紝娓╁害涓嶉殢楂樺害鍙樺寲锛屾亽瀹氬湪闆朵笅浜斿崄澶氭憚姘忓害锛岀劧鍚庨殢楂樺害鐨勫鍔犲張鏈夋墍涓婂崌锛屽湪骞虫祦灞傞《閮ㄥぇ绾︿笂鍗囧埌0鈩冦�傚钩娴佸眰绌烘皵绋�钖勶紝姘磋捀姘旀瀬灏戯紝閫氬父娌℃湁浜戙�侀洦銆侀洩銆侀浌绛夊ぉ姘旂幇璞★紝绌烘皵涔熸病鏈変笂涓嬪娴佸紩璧风殑鍨傜洿椋庯紝鍙湁姘村钩鏂瑰悜鐨勯锛屽苟涓旈鍚戠ǔ瀹氾紝骞虫祦灞傞噷甯稿勾鏄亸瑗块銆傝繖涓�灞傚ぇ姘旇兘瑙佸害濂姐�佹皵娴佸钩绋炽�佺┖姘旈樆鍔涘皬锛屽椋炶寰堟湁鍒╋紝鍥犳鐜颁唬鍠锋皵寮忓鏈哄ぇ澶氬湪11锝�12km鎺ヨ繎骞虫祦灞傜殑楂樺害椋炶銆� + </p> + </span> + <h4 id="d043" class="p-odd unit3-c">浜屻�佸ぇ姘旂殑鐗╃悊鎬ц川</h4> + <p class="p-odd">澶ф皵鐨勭墿鐞嗘�ц川鍖呮嫭澶ф皵娓╁害銆佸ぇ姘斿瘑搴︺�佸ぇ姘斿帇鍔涘拰澹伴�熴��</p> + <p class="p-odd"> + 澶ф皵娓╁害鏄寚澶ф皵灞傚唴绌烘皵鐨勬俯搴︺�傚畠琛ㄧず绌烘皵鍒嗗瓙鍋氱儹杩愬姩鐨勫墽鐑堢▼搴︼細娓╁害瓒婇珮锛岀┖姘斿垎瀛愬仛鏃犺鍒欑儹杩愬姩閫熷害瓒婂ぇ锛涙俯搴﹁秺浣庯紝绌烘皵鍒嗗瓙鍋氭棤瑙勫垯鐑繍鍔ㄧ殑閫熷害灏辫秺灏忋�傚湪瀵规祦灞傚唴锛岄殢楂樺害鐨勪笂鍗囷紝澶ф皵娓╁害鍛堢嚎鎬т笅闄嶏紝姣忓崌楂�1000m锛屾俯搴︾害涓嬮檷6.5鈩冿紝鍒板悓娓╁眰搴曢儴锛屽ぇ姘旀俯搴︾淮鎸佸湪闆朵笅浜斿崄澶氭憚姘忓害锛屼笉闅忛珮搴﹀彉鍖栥�傜寮�鍦伴潰20km鍚庯紝澶ф皵娓╁害闅� + </p> + </div> + </div> + </div> + <!-- 136椤� --> + <div class="page-box" page="144"> + <div v-if="showPageList.indexOf(144) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">136</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">楂樺害鐨勫鍔犵紦鎱笂鍗囥��</p> + <p class="p-even"> + 澶ф皵瀵嗗害鏄寚鍗曚綅浣撶Н澶ф皵鐨勮川閲忋�傞殢楂樺害鍗囬珮锛屽ぇ姘斿瘑搴﹀噺灏忋�傜敱浜庡ぇ姘斿瘑搴︾洿鎺ュ奖鍝嶅埌椋炴満鐨勫崌鍔涖�侀樆鍔涳紝鍥犳鍦ㄨ璁°�佸埗閫犲拰浣跨敤鑸┖鍣ㄧ殑杩囩▼涓紝蹇呴』鑰冭檻鍒板ぇ姘斿瘑搴﹂殢楂樺害鍙樺寲鑰屾敼鍙樼殑鐗规�с��</p> + <p class="p-even"> + 澶ф皵鍘嬪姏绠�绉板ぇ姘斿帇锛屾槸鎸囩┖姘斿湪鍗曚綅闈㈢Н涓婁骇鐢熺殑鍘嬪姏銆傚ぇ姘斿帇鐨勬潵婧愬寘鎷袱涓柟闈細涓�鏂归潰鏄崟浣嶉潰绉笂鏂圭洿鍒板ぇ姘斿眰椤堕儴鐨勭┖姘旀煴鐨勯噸閲忥紝鍙︿竴鏂归潰鏄┖姘斿垎瀛愬湪鍋氭棤瑙勫垯鐑繍鍔ㄦ椂浜х敓鐨勬挒鍑诲姏閲忋�傛樉鐒讹紝闅忛珮搴︾殑涓婂崌锛屽崟浣嶉潰绉笂鏂圭殑绌烘皵鏌辫秺鐭�佽川閲忚秺灏忥紝鍚屾椂娓╁害涔熷湪闄嶄綆锛岀┖姘斿垎瀛愬仛鐑繍鍔ㄧ殑鍔ㄨ兘鍑忓皬锛屽ぇ姘斿帇涔熷氨瓒婂皬锛屼笖姝ゅぇ姘斿瘑搴﹀噺灏忚蹇緱澶氥�� + </p> + <div class="img-float-formula w270"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <span> + <p class="block">澹伴�熶笌澶ф皵娓╁害鐨勫叧绯诲彲鐢ㄤ竴涓畝鍗曠殑鍏紡璁$畻锛�<img class="inline" alt="" + src="../../assets/images/0148-1.png" />銆�</p> + <p class="block">鍏朵腑鈥�<i>T</i>鈥濇槸缁濆娓╁害锛屽鏋滄崲鎴愭憚姘忓害锛屽垯<i>T</i>=273+<i>t</i>銆�</p> + + </span> + </div> + </div> + <span> + <p class="p-even"> + 澹伴�熸槸鎸囧0闊冲湪绌烘皵涓殑浼犳挱閫熷害銆傚0娉㈡槸鍏稿瀷鐨勫急鎵板姩娉紝澹伴�熶篃娉涙寚鎵�鏈夊急鎵板姩娉㈠湪绌烘皵涓殑浼犳挱閫熷害銆傞鏈哄湪楂橀�熼琛屾椂锛屽崌鍔涖�侀樆鍔涚瓑闅忓0閫熺殑鍙樺寲鏈夎緝澶у箙搴︾殑鍙樺寲銆傚0閫熼殢姘旀俯闄嶄綆鑰岄檷浣庯紝鍥犳闅忛珮搴﹀崌楂橈紝澶ф皵娓╁害闄嶄綆锛屽0閫熶篃灏遍檷浣庛�� + </p> + </span> + <h4 id="d044" class="p-even unit3-c">涓夈�佹爣鍑嗗ぇ姘�</h4> + <p class="p-even"> + 鎴戜滑宸茬粡鐭ラ亾锛岄殢鐫�楂樺害鐨勫彉鍖栵紝澶ф皵鐨勭墿鐞嗗弬鏁颁細鍙戠敓鍙樺寲銆傝繖浜涚墿鐞嗗弬鏁扮殑鍙樺寲锛屽張浼氬紩璧烽琛屽湪澶ф皵灞備腑鐨勮埅绌哄櫒鎵�鍙楃殑绌烘皵鍔ㄥ姏鍙樺寲锛屽紩璧烽琛屾�ц兘鏀瑰彉銆傚浗闄呮皯鑸粍缁囦负浜嗕究浜庡湪椋炶鍣ㄨ璁″拰鍒堕�犮�佹�ц兘姣旇緝鏃舵湁缁熶竴鐨勬爣鍑嗭紝閲囩敤浜嗗浗闄呮爣鍑嗗ぇ姘斻�� + </p> + <p class="p-even"> + 鍥介檯鏍囧噯澶ф皵鏄湪楂樺害30km浠ヤ笅锛屼互鍖楀崐鐞冧腑绾害鍦板尯鐨勫ぇ姘斿弬鏁板钩鍧囧�间负鍩虹鍔犱互淇锛屼綔涓哄ぇ姘旂殑鏍囧噯鐘舵�佸弬鏁帮紝骞惰瀹氾細澶ф皵琚湅浣滄磥鍑�鐨勫共绌烘皵锛屾槸鐞嗘兂姘斾綋锛堝嵆娌℃湁榛忔�э紝瀹屽叏绗﹀悎姘斾綋鐘舵�佹柟绋嬶級锛涗互娴峰钩闈㈢殑楂樺害涓洪浂锛涘湪娴峰钩闈笂锛屽ぇ姘旂殑娓╁害涓�15鈩冿紝澶ф皵鍘嬩负1013.252hPa锛�760mmHg锛�29.92inHg锛夛紝瀵嗗害涓�1.225kg/m<sup>3</sup>锛屽0閫熶负340.29m/s銆傚湪11km浠ヤ笅锛岄珮搴︽瘡鍗囬珮100m锛屾俯搴﹂檷浣�0.65鈩冿紱11锝�20km锛屾俯搴︿繚鎸佸湪-56.5鈩冦�備笉鍚岄珮搴︾殑澶ф皵瀵嗗害銆佸帇鍔涚瓑鐗╃悊鍙傛暟锛岄�氳繃姘旀�佹柟绋嬭绠楄�屽緱锛堣〃3-1锛夈�� + </p> + </div> + </div> + </div> + <!-- 137椤� --> + <div class="page-box" page="145"> + <div v-if="showPageList.indexOf(145) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">137</li> + </ul> + <div class="bodystyle"> + <p class="img">琛�3-1 鍥介檯鏍囧噯澶ф皵</p> + <p class="center openImgBox"><img class="img-a" alt="" src="../../assets/images/0149-1.jpg" /></p> + + </div> + </div> + </div> + <!-- 138椤� --> + <div class="page-box" page="146"> + <div v-if="showPageList.indexOf(146) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">138</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even unit3-c"> + 瀛︿範浠诲姟浜�<br />姘旇薄瀵归琛岀殑褰卞搷 + </h3> + <div class="task-u3-c ma-l"></div> + <div class="img-float w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0150-1.jpg" /> + <p class="img">鍥�3-2 鏈哄満澶ч浘</p> + </div> + <span> + <p class="p-even"> + 椋炴満鍦ㄥぇ姘斾腑椋炶锛屾皵璞℃潯浠跺彉鍖栧皢瀵艰嚧澶ф皵鏉′欢鍙戠敓鏄捐憲鍙樺寲锛岀洿鎺ュ奖鍝嶉鏈烘�ц兘锛岀敋鑷冲奖鍝嶉琛屽畨鍏ㄣ�傚ぇ澶氭暟鎯呭喌涓嬶紝姘旇薄鏉′欢骞舵湭閫犳垚涓ラ噸椋炶浜嬫晠锛屼絾缁忓父浼氶�犳垚鑸彮椋炶涓嶆甯革紙鑸彮寤惰銆佽埅鐝彇娑堢瓑锛夛紝濡傛満鍦哄ぇ闆撅紙鍥�3-2锛夈�� + </p> + </span> + <div class="bj4"> + <div class="fl al-c mb-10"> + <div class="bj4-xyx-pd"> + 璇讳竴璇� + </div> + <div class="bj4-xyx-icon"> + 鈻� 鈻� + </div> + <p><b style="color: #5192C6">娴撻浘瀵归琛岀殑褰卞搷</b></p> + </div> + <p class="block"> + 2011骞�11鏈�16鏃ワ紝澶ч浘绗肩僵澶╂触锛岃嚧浣垮ぉ娲ユ花娴峰浗闄呮満鍦哄涓埅鐝彈鍒板奖鍝嶃�傚姝わ紝澶╂触婊ㄦ捣鍥介檯鏈哄満杩呴�熷惎鍔ㄤ簡鑸彮澶ч潰绉欢璇妗堬紝鏈嶅姟鏃呭銆傚ぇ闆惧ぉ姘斿鑷村ぉ娲ユ花娴峰浗闄呮満鍦�40澶氫釜鍑烘腐鑸彮寤惰銆�45涓繘娓埅鐝彈鍒板奖鍝嶃�佸皯鏁拌埅鐝彇娑堬紝3000浣欏悕鍑烘腐鏃呭婊炵暀銆傜敱浜庢帾鏂藉緱鍔涳紝澶╂触婊ㄦ捣鍥介檯鏈哄満婊炵暀鏃呭绉╁簭鑹ソ銆傛伓鍔eぉ姘斾娇澶╂触婊ㄦ捣鍥介檯鏈哄満椋炲線闈掑矝銆佸崡浜�佸悎鑲ャ�佽タ瀹夈�佹垚閮姐�佸ぇ杩炪�佷笂娴风瓑鍦扮殑鑸彮婊炵暀锛屽彟鏈夊涓埅鐝闄嶈嚦澶師銆佺煶瀹跺簞绛夊湴銆� + </p> + </div> + <p class="p-even">鐩存帴褰卞搷椋炴満鎿嶇旱鍜岄琛屽畨鍏ㄧ殑鑸┖姘旇薄鍥犵礌锛屽ぇ鑷村彲褰掔撼涓洪銆佷簯銆佽兘瑙佸害銆侀檷姘淬�佹皵娓╀互鍙婂叾浠栨樉钁楀嵄闄╁ぉ姘旓紝濡備綆娓┿�佹箥娴併�佹祿闆剧瓑銆�</p> + <h4 id="d045" class="p-even unit3-c">涓�銆侀</h4> + <p class="p-even"> + 椋庢槸鍦扮悆杩愬姩銆佸ぇ姘斿眰涓俯搴︿笉鍚屽拰澶ф皵鍘嬪姏涓嶅悓绛夊師鍥犱娇绌烘皵鍦ㄤ笉鍚屾柟鍚戞祦鍔ㄥ舰鎴愮殑銆傜┖涓琛岃繃绋嬩腑锛岄瀵艰嚧椋炴満绌洪�熶笌鍦伴�熺殑澶у皬鍜屾柟鍚戜骇鐢熷樊寮傦紝濡傛灉娌¤兘鍙婃椂銆佸噯纭慨姝e皢瀵艰嚧椋炴満鍋忚埅銆傝捣钀借繃绋嬩腑鍦伴潰闃舵鐨勯灏嗗奖鍝嶅埌椋炴満鐨勭┖閫燂紝浠庤�屽奖鍝嶅埌椋炴満鐨勫崌鍔涘拰鎿嶇旱锛屼弗閲嶆椂杩� + </p> + </div> + </div> + </div> + <!-- 139椤� --> + <div class="page-box" page="147"> + <div v-if="showPageList.indexOf(147) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">139</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">灏嗛�犳垚浜嬫晠銆傚洜姝わ紝鎿嶇旱椋炴満鏃讹紝椋炶鍛橀殢鏃堕兘瑕佽�冭檻椋庣殑褰卞搷銆�</p> + <p class="p-odd"> + 椋炴満璧烽檷鏃舵墍鑳芥壙鍙楃殑鏈�澶ч閫燂紝鍙栧喅浜庢満鍨嬩互鍙婇涓庤窇閬撶殑澶硅銆傞�嗛璧烽檷鏃舵墍鑳芥壙鍙楃殑椋庨�熸渶澶э紝姝d晶椋庤捣闄嶆椂鎵�鑳芥壙鍙楃殑椋庨�熸渶灏忋�傝繖鏄洜涓鸿繎鍦伴潰椋庣敱浜庡彈鍦拌〃鐨勫奖鍝嶅彉鍖栧鏉傦紝鍏锋湁鏄庢樉鐨勯樀鎬э紝椋庨�熻秺澶э紝闃垫�ц秺寮猴紝浣块鏈哄彈鍒版棤瑙勫緥鐨勫奖鍝嶈秺澶э紝瓒婇毦浠ユ搷绾点�傜壒鍒槸鍦ㄤ晶椋庢潯浠朵笅璧烽檷鐨勯鏈猴紝瑕佷繚鎸佹甯哥殑婊戣窇闈炲父鍥伴毦锛屼负鍏嬫湇渚ч鐨勫奖鍝嶈�岄噰鍙栧ぇ鍧″害鎺ュ湴鍙兘浣块鏈烘墦鍦拌浆鎴栧彂鐢熸粴杞紝鍔犱笂闃甸鐨勫奖鍝嶏紝灏变細浣块鏈烘洿鍔犻毦浠ユ搷绾点�� + </p> + <p class="p-odd"> + 椋炴満鍦ㄨ埅绾夸笂椋炶鏃讹紝涔熶笉鍙伩鍏嶅湴瑕佸彈鍒伴鐨勫奖鍝嶃�備緥濡傦細椤洪椋炶浼氬澶у湴閫熴�佺缉鐭琛屾椂闂淬�佸噺灏戠噧娌规秷鑰楋紱閫嗛椋炶浼氶檷浣庡湴閫熴�佸鍔犻琛屾椂闂淬�佸鍔犵噧娌规秷鑰楋紱渚ч浼氫娇椋炴満浜х敓鍋忔祦锛岄渶杩涜閫傚綋淇浠ヤ繚鎸佹纭埅鍚戙�� + </p> + <div class="img-rights w250 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0151-1.jpg" /> + <p class="img">鍥�3-3 姘旇薄鍥句笂鐨勭瓑鍘嬬嚎</p> + </div> + <span> + <p class="p-odd"> + 鍏ㄧ悆澶ф皵鐨勮繍鍔ㄥ喅瀹氫簡鍦扮悆涓婁富瑕佺殑椋庯紝鍦扮悆澶ф皵灞傜殑鎬讳綋杩愬姩鏈変笁涓柟闈細绗竴鏄お闃崇殑杈愬皠閫犳垚璧ら亾鍜屼袱鏋佺殑娓╁樊锛屼綆绌哄喎绌烘皵鐢变袱鏋佹祦鍚戣丹閬擄紝鑰屽湪楂樼┖绌烘皵鐢辫丹閬撴祦鍚戜袱鏋併�傜浜屾槸鍦扮悆鐨勮嚜杞骇鐢熶簡瀵硅繍鍔ㄧ┖姘旂殑闄勫姞鍔涳紝杩欑鍔涗篃绉扮姘忓姏锛屼娇绌烘皵杩愬姩鐨勬柟鍚戞敼鍙樸�傜涓夋槸鍦伴潰鍚勪綅缃殑绌烘皵鍘嬪姏涓嶅悓閫犳垚鐨勫帇鍔涙搴︺�傛垜浠湪澶╂皵鍥句笂鐢ㄧ瓑鍘嬬嚎锛堝浘3-3锛夎〃绀猴紝绌烘皵鎬绘槸浠庨珮鍘嬪尯娴佸悜浣庡帇鍖猴紝鍦ㄦ祦鍔ㄤ腑鏈変竴浜涚┖姘斿洿缁曠潃楂樺帇鍖烘垨浣庡帇鍖鸿浆鍔ㄥ氨褰㈡垚浜嗘皵鏃嬨�傝繖涓夌鍔涢噺褰㈡垚浜嗗湴鐞冧笂闈㈢殑涓夌寰幆鍖恒�� + </p> + </span> + <p class="p-odd"> + 绗竴涓尯鍩熸槸浠庤丹閬撳埌鍗椼�佸寳绾�30掳锛屽湪0掳鑷冲寳绾�30掳鐩涜涓滃寳淇¢锛�0掳鑷冲崡绾�30掳鐩涜涓滃崡淇¢銆傜浜屼釜鍖哄煙鏄崡鍖楃含鐨�30锝�60掳锛岃繖涓や釜鍖哄煙閮藉舰鎴愪簡涓�涓タ椋庝富椋庡甫锛屽苟缁忓父鎸夊鑺傚嚭鐜板彴椋庛�佹毚椋庨洦绛夈�傜涓変釜鍖哄煙鏄含搴�60掳浠ヤ笂鍦板尯锛岀敱浜庢瀬鍦板瘨鍐凤紝绌烘皵姘斿洟涓嬮檷锛岃繖閲屽舰鎴愰珮鍘嬪尯锛岄鍚戞槸浠庢瀬鐐瑰線澶栧惞鍘汇�傝繖绉嶅父骞寸殑椋庡悜锛屽喅瀹氫簡涓栫晫鍚勫湴鐨勪富椋庡悜銆備富椋庡悜鏄慨寤烘満鍦烘椂閫夋嫨璺戦亾鏂瑰悜鐨勪富瑕佸洜绱犱箣涓�銆� + </p> + </div> + </div> + </div> + <!-- 140椤� --> + <div class="page-box" page="148"> + <div v-if="showPageList.indexOf(148) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">140</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 鍦ㄤ腑绛夌含搴﹁寖鍥村唴锛屾垜浠亣鍒扮殑绌烘皵杩愬姩鏄敱鐩稿悓娓╁害鍜屾箍搴︾殑绌烘皵缁勬垚涓�涓暣浣撴皵鍥㈢殑杩愬姩銆傛瀬鍦版捣娲嬩笂鐨勬皵鍥㈡槸鍐疯�屾疆婀跨殑锛屾瀬鍦板ぇ闄嗕笂鐨勬皵鍥㈡槸鍐疯�屽共鐕ョ殑銆傜儹甯︽捣娲嬩笂鐨勬皵鍥㈡槸鐑�屾疆婀跨殑锛岀儹甯﹀ぇ闄嗕笂鐨勬皵鍥㈡槸鐑�屽共鐕ョ殑銆傚喎姘斿洟鍜岀儹姘斿洟鐩镐氦褰㈡垚閿嬮潰锛屽鏋滄槸鐑皵鍥㈣繘鍏ュ喎姘斿洟鍒欑О涓烘殩閿嬶紝鍙嶄箣鍒欑О涓哄喎閿嬶紝閿嬮潰杩愬姩灏嗗甫鏉ュぇ椋庡拰姘旀俯鐨勫彉鍖栥�傝繖鏄竴绉嶅鑸┖寰堥噸瑕佺殑姘旇薄鎯呭喌锛屾殩閿嬮潰鐢变簬鐑┖姘斿湪琛岃繘涓拰鍐风┖姘旂浉閬囪�屽悜涓婄Щ鍔紝浠庤�屽舰鎴愪竴涓�炬枩鍚戜笂鐨勭晫闈紝杩欎釜鐣岄潰鍙互寤朵几涓婄櫨鍗冪背銆傚洜涓虹儹绌烘皵涓殑姘村垎閬囧喎鍑濈粨锛岃繖涓�甯﹀氨褰㈡垚寰堝ぇ鐨勯浘鍖哄拰闆ㄥ尯銆備竴鑸洰瑙嗛琛岀殑椋炴満瑕侀伩寮�鏆栭攱锛屼緷闈犱华琛ㄩ琛岀殑椋炴満涔熻缁曞紑鏆栭攱褰㈡垚鐨勫己闄嶉洦鍖恒�傚喎閿嬫槸鐢变簬鍐风┖姘旂Щ鍔ㄥ舰鎴愮殑锛屽畠绉诲姩寰楁瘮鐑┖姘斿揩锛屽洜鑰屽甫鏉ュぇ椋庛�傚悓鏃讹紝鐑┖姘斾笂鍗囦細甯︽潵闆烽洦澶╂皵鍜屾皵娴佺殑棰犵案锛屽喎閿嬩竴鑸椂闂磋緝鐭�� + </p> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 1993骞�11鏈�4鏃ワ紝棣欐腐鍚痉鍥介檯鏈哄満鍥犲彈鍒拌交搴﹀彴椋庤壘鎷夛紙Ira锛夊悜瑗垮寳鏂瑰悜绉诲姩鎺ヨ繎棣欐腐涓旈娓綅浜庡彴椋庡彸鍓嶉儴鐨勫奖鍝嶏紝鏈哄満璺戦亾闆ㄥ娍鍙婁晶椋庢瀬涓哄己鍔层�備笂鍗�11锛�00椋庡悜涓�70掳锛岄閫熶负21 + </p> + </span> + <div class="img-rights w250 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0152-1.jpg" /> + <p class="img">鍥�3-4 棣欐腐鍚痉鍥介檯鏈哄満椋炴満鍧犳捣</p> + </div> + <span> + <p class="td-0 block"> + 鑺傦紝闃甸34鑺傦紱涓崍12锛�00椋庡悜70掳銆侀閫熶负21鑺傦紝闃甸40鑺傘�傚ぉ姘旂姸鍐甸潪甯镐笉濂斤紝璺戦亾绉按銆傗�滀腑鍗庤埅绌鸿偂浠芥湁闄愬叕鍙糕�滳I-605鐝満B747-400鍨嬮鏈轰簬褰撳ぉ涓婂崍11锛�30宸﹀彸鍚戝崄涓夊彿璺戦亾闄嶈惤鏃讹紝渚ч鍔犱笂婀胯窇閬撶瓑缂樻晠锛岄�犳垚椋炴満鍐插嚭璺戦亾鑰屽潬鍏ユ捣涓紙鍥�3-4锛夈�傛墍骞告満涓婃梾瀹㈠拰鏈虹粍浜哄憳鍏ㄩ儴鑾锋晳锛屽叾涓簩鍗佸鍚嶆梾瀹㈠彈浼わ紝椋炴満鎶ュ簾銆� + </p> + </span> + </div> + <h4 id="d046" class="p-even td-0">浜屻�佷簯</h4> + <p class="p-even">浜戞槸姘存苯鍑濈粨鐗╁湪绌轰腑鑱氶泦鑰屾垚鐨勭幇璞°�備簯鏈夊悇绉嶅悇鏍风殑澶栬矊锛屽畠浠崈濮跨櫨鎬併�佸彉骞绘棤绌凤紝鍚勮嚜鏃㈡湁涓嶅悓鐨勬垚鍥狅紝鍙堟湁涓嶅悓鐨勭壒寰侊紝瀵归琛岀殑褰卞搷涔熶笉灏界浉鍚屻��</p> + <p class="p-even">瑕佷簡瑙d簯鐨勬紨鍙樿寰嬶紝闇�瑕佸鍏惰繘琛屽垎绫汇��</p> + </div> + </div> + </div> + <!-- 141椤� --> + <div class="page-box" page="149"> + <div v-if="showPageList.indexOf(149) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">141</li> + </ul> + <div class="bodystyle"> + <h5 id="e053" class="p-odd unit3-c">锛堜竴锛夋牴鎹簯搴曢珮搴﹀垎绫�</h5> + <p class="p-odd">浜戠殑鍒嗙被鏂规硶鏈夊ソ鍑犵锛屼絾涓�鑸槸灏嗕簯鎸変簯搴曢珮搴﹀垎涓轰笁鏃忋��</p> + <p class="p-odd">鈶犱綆浜戞棌銆備簯搴曢珮搴﹀湪2000m浠ヤ笅銆�</p> + <p class="p-odd">鈶′腑浜戞棌銆備簯搴曢珮搴﹀湪2000锝�6000m銆�</p> + <p class="p-odd">鈶㈤珮浜戞棌銆備簯搴曢珮搴﹀湪6000m浠ヤ笂銆�</p> + <h5 id="e054" class="p-odd unit3-c">锛堜簩锛夋牴鎹簯鐨勫璨岀壒寰佸垎绫�</h5> + <p class="p-odd"> + 鏍规嵁浜戠殑澶栬矊鐗瑰緛锛屾瘡涓�鏃忎簯閮藉彲鍒嗕负濂藉嚑绉嶃�傛寜鐓т腑鍥芥皵璞″眬鍏充簬浜戠殑鍒嗙被鏍囧噯锛岀粨鍚堣埅绌轰笂姘旇薄淇濋殰鐨勯渶瑕侊紝鍙皢浜戝垎涓�14绉嶃�傚叾涓珮浜戞棌3绉嶏紝鍒嗗埆涓哄嵎浜戙�佸嵎灞備簯銆佸嵎绉簯锛涗腑浜戞棌2绉嶏紝鍒嗗埆涓洪珮绉簯鍜岄珮灞備簯锛涗綆浜戞棌9绉嶏紝鍒嗗埆涓烘贰绉簯銆佹祿绉簯銆佺Н闆ㄤ簯锛堝浘3-5锛夈�佸眰绉簯銆佸眰浜戯紙鍥�3-6锛夈�侀洦灞備簯銆佺灞備簯銆佺绉簯鍜岀闆ㄤ簯銆� + </p> + <div class="fl al-fe p-odd"> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0153-1.jpg" /> + </p> + <p class="img">鍥�3-5 绉洦浜戝簳</p> + </span> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0153-2.jpg" /> + </p> + <p class="img">鍥�3-6 灞備簯</p> + </span> + </div> + <p class="p-odd"> + 浜戝椋炶鐨勫奖鍝嶄富瑕佹湁锛氫簯搴曢珮搴﹀緢浣庣殑浜戝奖鍝嶉鏈虹殑璧烽檷锛涗簯涓兘瑙佸害寰堜綆锛屽奖鍝嶇洰瑙嗛琛岋紱浜戜腑鐨勮繃鍐峰嵈姘存淮瀹规槗浣块鏈虹Н鍐帮紱浜戜腑鐨勬箥娴侀�犳垚椋炴満棰犵案锛涗簯涓槑鏆椾笉鍧囧鏄撲娇椋炶鍛樹骇鐢熼敊瑙夛紱浜戜腑鐨勯浄鐢垫崯鍧忛鏈虹瓑銆� + </p> + <h4 id="d047" class="p-odd unit3-c">涓夈�佽兘瑙佸害</h4> + <p class="p-odd">鑳借搴︽槸鎸囪瀵熻�呭湪鐧藉ぉ杈ㄨ鐗╀綋銆佸湪澶滈棿杈ㄨ鐏厜鐨勮窛绂伙紝鐢ㄥ崈绫虫垨绫虫潵琛ㄧず銆傚湪绌轰腑锛岃兘瑙佸害鍒嗕负姘村钩鑳借搴︺�佸瀭鐩磋兘瑙佸害鍜屾枩瑙嗚兘瑙佸害銆�</p> + <p class="p-odd"> + 鑳借搴︿篃琛ㄧず鍦ㄥぉ绌洪琛岀殑椋炴満涔嬮棿鐨勮兘瑙佽窛绂汇�傚洜姝わ紝瀵圭洰瑙嗛琛屾潵璇达紝鑳借搴︽槸鍏佽椋炶鐨勯噸瑕佷緷鎹箣涓�銆傚渚濋潬浠〃椋炶鐨勯鏈烘潵璇达紝灏界鍦ㄧ┖涓彲浠ョ敤浠〃鍜岄浄杈句繚鎸侀琛岋紝瀹冧粛鐒跺彈鑳借搴︾殑闄愬埗锛屽彧鏄檺鍒剁浉瀵硅緝灏忋�傚湪鍦伴潰涓婏紝鑳借搴﹀彲浠ョ敤鍦伴潰鏍囧噯浣滀负鍙傜収鐗╁垽鏂窛绂伙紱鍦� + </p> + </div> + </div> + </div> + <!-- 142椤� --> + <div class="page-box" page="150"> + <div v-if="showPageList.indexOf(150) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">142</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">绌轰腑锛岀敱浜庢病鏈夊弬鐓у潗鏍囷紝鍥犺�岃兘瑙佸害鍦ㄥ緢澶х▼搴︿笂闈犻琛屽憳涓昏鍒ゆ柇銆備竴鑸鐨勮兘瑙佸害鏄寚鍦伴潰鑳借搴︼紝涓昏鏄璺戦亾鐨勮鲸鍒窛绂汇��</p> + <p class="p-even">瀵硅兘瑙佸害褰卞搷鏈�澶х殑鏄┖涓殑闆惧拰鐑燂紝鍏朵粬濡傞娌欍�侀洦闆鑳借搴﹂兘鏈夊奖鍝嶃��</p> + <h4 id="d048" class="p-even unit3-c">鍥涖�侀檷姘�</h4> + <p class="p-even">澶╃┖涓殑闄嶆按鍖呮嫭闆ㄣ�侀洩銆佸啺闆圭瓑褰㈠紡銆傞檷姘村舰鎴愮殑闆ㄣ�侀洩銆佸啺闆瑰彇鍐充簬涓婄┖浜戝眰鐨勫瀭鐩存俯搴﹀拰鍦伴潰娓╁害鍒嗗竷鎯呭喌銆�</p> + <p class="p-even"> + 闄嶆按瀵归琛岀殑褰卞搷鏈夛細闄嶆按浣胯兘瑙佸害闄嶄綆锛岃繃鍐峰嵈闆ㄦ淮浼氶�犳垚椋炴満绉啺锛岄檷姘翠骇鐢熺殑纰庨洦浜戝奖鍝嶉鏈鸿捣椋炲拰鐫�闄嗭紝澶ч洦涓嬫柟瀹规槗鍑虹幇杈冨己鐨勪笅闄嶆皵娴侊紝澶ч洦鍜屾毚闆ㄨ兘閫犳垚鍙戝姩鏈哄仠杞︼紝澶ч洦鎭跺寲椋炴満鐨勭┖姘斿姩鍔涙�ц兘锛岄檷姘村奖鍝嶈窇閬撶殑浣跨敤绛夈�� + </p> + <div class="bk"> + <p><b>鑰冭瘉鎸囧崡锛氱┖娓湇鍔$鐞嗗笀鑰冮</b></p> + <div v-for="(item,index) in singleChoice" :key="index"> + <p class="block">{{index+1}}.{{ item.txt }}</p> + <p class="block" v-for="(citem,cindex) in item.option" :key="cindex"> + <input type="radio" :value="citem.zm" name="toobusy" + :disabled="item.isComplete" + v-model="item.userAnswer" @change="saveInputChoice" /> + {{ citem.txt }} + </p> + <p class="event-header-text-bc pd-5 fl jc-sa" style="margin-left: 8px; width: 93%" + v-if="showChoiceAnswer"> + <span class="c-g"> 绛旀锛歿{ item.answer }} </span> + <span + :class="{ 'c-g': item.isRight, 'c-r': item.isRight == false }">鎮ㄧ殑绛旀锛歿{ + item.userAnswer + }}</span> + <span class="icon-box-big fl al-c"> + <svg v-if="item.isRight" t="1716986419862" class="icon" + viewBox="0 0 1820 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" + p-id="18767" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if="item.isRight == false" t="1716987085767" + class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + </div> + + <!-- 鎻愪氦鎸夐挳 --> + <div class="w100 fl ju-cn"> + <ul class="fl ju-ev w80 choice"> + <li> + <button class="btn-border btn-w" @click="goChoiceJudge"> + 鎻愪氦 + </button> + </li> + <li> + <button @click="changeChoiceData" class="btn-border btn-w"> + 閲嶅仛 + </button> + </li> + <li> + <button @click="showChoiceAnswer = !showChoiceAnswer" class="parimary-btn"> + 鏌ョ湅绛旀 + </button> + </li> + </ul> + </div> + </div> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 2007骞�8鏈�8鏃ヨ嚦12鏃ワ紝灞变笢鐑熷彴鏅檷澶у埌鏆撮洦銆�12鏃ュ噷鏅�6鏃讹紝灞�閮ㄥ湴鍖虹獊鐒跺嚭鐜版寔缁己闄嶉洦锛岀儫鍙拌幈灞卞浗闄呮満鍦哄仠鏈哄潽姘存繁杈�50cm锛屽浗闄呭�欐満妤艰繘姘存繁搴﹁揪15cm锛屾満鍦哄叏绾垮叧闂紝45涓埅鐝鍙� + </p> + </span> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0154-1.jpg" /> + <p class="img">鍥�3-7 鐑熷彴鑾卞北鏈哄満绉按锛屽伐浣滀汉鍛樻帹椋炴満</p> + <p class="left"><br></p> + <img class="img-0" alt="" src="../../assets/images/0154-2.jpg" /> + <p class="img">鍥�3-8 瀛熷姞鎷夊浗閿″皵璧壒鏈哄満涓�鏋堕鏈哄啿鍑鸿窇閬�</p> + </div> + <span> + <p class="td-0 block"> + 娑堬紝鏃呭鍏ㄩ儴鍙婃椂鐤忔暎銆� + </p> + <p class="block"> + 8鏈�12鏃ヨ嚦13鏃ュ噷鏅紝鐑熷彴鑾卞北鍥介檯鏈哄満鍔ㄧ敤浜�11鍙版按娉佃繛澶滄帓姘达紝濂嬫垬鍒板噷鏅�4鏃�30鍒嗭紝鐩村埌绉按娑堥��銆傜粡妫�鏌ワ紝鏈哄満杈惧埌杩愯鏍囧噯锛屼簬8鏈�13鏃�5鏃�30鍒嗗紑鏀俱�傚浘3-7鎵�绀轰负2007骞�8鏈�12鏃ヤ笂鍗堬紝鍦ㄧ儫鍙拌幈灞卞浗闄呮満鍦猴紝灞变笢鑸┖鍏徃鐑熷彴鍒嗗叕鍙哥殑宸ヤ綔浜哄憳姝f帹鐫�涓�鏋跺皬鍨嬮鏈鸿蛋鍑烘繁姘淬�� + </p> + <p class="block">椋炴満鍦ㄧН姘寸殑璺戦亾涓婃粦琛屾椂锛屽彲鑳戒骇鐢熸粦姘寸幇璞★紝浣块鏈烘柟鍚戞搷绾靛拰鍒硅溅浣滅敤鍑忓急锛屽鏄撳啿鍑烘垨鍋忕璺戦亾銆傚悇绫婚鏈洪兘鍙骇鐢熸粦姘寸幇璞°��</p> + <p class="block">2004骞�10鏈�8鏃ワ紝鍦ㄥ瓱鍔犳媺鍥介敗灏旇但鐗规満鍦猴紝涓�鏋堕鏈哄湪琚洦姘存蹈婀跨殑璺戦亾涓婃粦璺戝悗涓嶄箙鍥犱负绱ф�ュ埞杞︿娇鏈鸿韩鍙戠敓鍊炬枩锛屽啿鍑鸿窇閬擄紙鍥�3-8锛夛紝瀵艰嚧澶氫汉鍙椾激銆� + </p> + </span> + </div> + </div> + </div> + </div> + <!-- 143椤� --> + <div class="page-box" page="151"> + <div v-if="showPageList.indexOf(151) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">143</li> + </ul> + <div class="bodystyle"> + <h4 id="d049" class="p-odd unit-c">浜斻�佹皵娓�</h4> + <p class="p-odd"> + 姘旀俯浼氬奖鍝嶅ぇ姘斿瘑搴︼紝浠庤�屽奖鍝嶉鏈鸿捣椋炪�佺潃闄嗘�ц兘銆傛皵娓╅珮鏃剁┖姘斿瘑搴﹀皬锛岄鏈哄湪鍚岀瓑閫熷害涓嬩骇鐢熺殑鍗囧姏杈冨皬锛岃捣椋炴粦璺戣窛绂汇�佺潃闄嗘粦璺戣窛绂婚兘浼氬鍔犮�傚悓鏃讹紝绌烘皵瀵嗗害灏忎篃灏嗗鑷村彂鍔ㄦ満鏁堢巼闄嶄綆锛屼骇鐢熸帹鍔涘皬锛岄�犳垚璧烽婊戣窇璺濈澧炲姞銆傚洜姝わ紝澶忓ぉ椋炶鏃堕琛屽憳搴旀敞鎰忓埌姘旀俯鐨勫奖鍝嶏紝鍦ㄨ窇閬撻暱搴︿笉鑳芥弧瓒抽鏈烘甯哥殑杞介噸閲忔墍闇�鏃讹紝搴斿噺灏戦鏈虹殑杞介噸鏉ョ‘淇濋琛屽畨鍏ㄣ�� + </p> + <h4 id="d050" class="p-odd unit-c">鍏�佸叾浠栨樉钁楀嵄闄╁ぉ姘�</h4> + <h5 id="e055" class="p-odd unit-c">锛堜竴锛変綆娓�</h5> + <p class="p-odd">椋炴満椋炶缁忚繃浣庢俯鐨勪簯灞傛垨浜戦洦鍖哄煙鏃讹紝鏈虹考銆佸熬缈笺�佽灪鏃嬫〃銆佽繘姘旈亾銆侀鎸$幓鐠冨拰绌洪�熺绛夐儴浣嶅父浼氳仛闆嗗啺鏅讹紝鍙兘鍘氳嚦鏁板帢绫炽��</p> + <p class="p-odd">椋炴満鍦ㄦ皵娓�-20锝�0鈩冪殑楂樺害涓婇琛岋紝鏈轰綋涓婃渶瀹规槗绉啺銆備簯涓渶鏄撴湁娑叉�佹按婊达紝灏ゅ叾鏄Н浜戜腑锛屽娴撶Н浜戙�佺Н闆ㄤ簯鍜屽眰绉簯绛夛紝姝ゆ椂绌轰腑姘存淮 + </p> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0155-1.jpg" /> + <p class="img">鍥�3-9 椋炴満绉啺</p> + </div> + <span> + <p class="p-odd td-0"> + 甯稿湪鍑濆浐鐐逛互涓嬭�屼笉缁撳啺锛屼粛淇濇寔娑叉�侊紝灏辨槸鎵�璋撹繃鍐峰嵈姘存淮銆傞鏈洪杩囷紝绌烘皵鍙楁壈鍔紝杩囧喎鍗存按婊寸珛鍒荤粨鍐伴檮鐫�浜庢満浣撲笂锛屾暟绉掗挓鍐呮満浣撲笂灏变細鏈変弗閲嶇殑绉啺銆傜┖姘斾腑鑻ユ箍搴﹀ぇ锛屽惈鏈夎繃鍐峰嵈姘达紝瀹规槗鍙戠敓鍗囧崕銆傞鏈虹┛瓒婂叾闂达紝绌烘皵鐣ュ彈鎵板姩锛岃繀閫熷嚌鑱氱Н鍐般�傝櫧鐒舵櫞绌烘棤浜戯紝浣嗘槸鍦ㄧ粨鍐伴珮搴﹀眰涓婃柟锛屾皵娓╀笌闇茬偣娓╁害鍗佸垎鎺ヨ繎鏃讹紝椋炴満绉啺鐨勫彲鑳芥�т粛鐒跺瓨鍦ㄣ�傛澶栵紝椋炴満鍦ㄤ綆娓╁尯鍩熷瓨鏀句篃鏈夌Н鍐帮紙鍥�3-9锛夌殑鍙兘銆� + </p> + </span> + <p class="p-odd"> + 椋炴満绉啺鍚庡彲閫犳垚浠ヤ笅鍗遍櫓锛氭満缈煎拰灏剧考绉啺锛屽皢鐮村潖椋炴満姘斿姩澶栧舰锛岃嚧浣块鏈烘渶澶у崌鍔涚郴鏁颁笅闄嶃�侀樆鍔涘澶э紝澶遍�熻繋瑙掓槑鏄惧噺灏忥紝鏄撻�犳垚椋炴満澶遍�燂紱铻烘棆妗ㄧН鍐拌嚧浣垮叾澶栧舰鏀瑰彉锛屽皢瀵艰嚧鎷夊姏涓嬮檷锛屽彂鍔ㄦ満鎸姩锛涘柗姘斿紡鍙戝姩鏈鸿繘姘旈亾绉啺锛屽彲鑳藉鑷磋繘姘斾笉鐣咃紝寮曡捣鍙戝姩鏈哄枠鎸紝鍐板潡鑴辫惤鍚庤繘鍏ュ彂鍔ㄦ満锛岃繕鍙兘鎹熷潖鍘嬫皵鏈哄拰娑¤疆鍙剁墖锛涢鏈虹┖閫熺绉啺锛屼細瀵艰嚧鍏ㄩ潤鍘嬬郴缁燂紙楂樺害琛ㄣ�佺┖閫熻〃绛夛級鎸囩ず寮傚父锛岀敋鑷冲畬鍏ㄤ笉鑳芥寚绀猴紱椋炴満澶╃嚎绉啺锛屼細瀵艰嚧鏃犵嚎鐢靛強闆疯揪绯荤粺澶辩伒銆� + </p> + <p class="p-odd">铏界劧鐜颁唬椋炴満鍦ㄦ槗绉啺閮ㄤ綅宸叉湁闃插啺銆侀櫎鍐拌缃紝鍙互鍏嬫湇涓婅堪椋炴満</p> + </div> + </div> + </div> + <!-- 144椤� --> + <div class="page-box" page="152"> + <div v-if="showPageList.indexOf(152) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">144</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">绉啺鐨勯棶棰橈紝浣嗘槸椋炴満浠嶇劧闇�瑕侀伩寮�鏄撶Н鍐板尯鍩熶互闃叉鍔犳俯涓嶅強鏃惰�岀灛闂寸Н鍐帮紝閫犳垚鍗遍櫓銆�</p> + <h5 id="e056" class="p-even unit3-c">锛堜簩锛夋箥娴�</h5> + <p class="p-even"> + 褰㈡垚棰犵案鐨勫師鍥犱富瑕佹槸澶ф皵灞備腑鏈変笉绋冲畾姘旀祦涓婁笅杩愬姩锛岃繖绉嶆皵娴佺О涓衡�滄箥娴佲�濄�傞鏈哄湪婀嶆祦涓浼氬彂鐢熸槑鏄炬姈鍔ㄣ�傞绨告槸鎸囬鏈哄湪鎵板姩姘旀祦涓琛屾椂浜х敓鐨勯渿棰ゃ�佷笂涓嬫姏鎺枫�佹憞鏅冦�佹憜澶寸瓑鐜拌薄銆傞绨稿己鐑堟椂锛岄琛屽憳闅句互鍑嗙‘鎿嶇旱椋炴満锛屾垨鑰呬娇椋炴満缁撴瀯閬埌鐮村潖锛岄�犳垚鏈烘瘉浜轰骸鐨勪簨鏁呫�傞绨镐娇鏈鸿韩闇囬ⅳ锛岃繘鍏ュ彂鍔ㄦ満姘旈亾鐨勭┖姘旈噺鏄捐憲鍑忓皯锛屼弗閲嶆椂浼氶�犳垚绌轰腑鍋滆溅銆� + </p> + <p class="p-even"> + 椋炴満棰犵案鎯呭喌鏈夊緢澶氾紝涓�鑸湪浜戜腑椋炶鏃舵垨绌胯秺閿嬮潰鏃讹紝閮戒細閬囧埌棰犵案銆傚挨鍏惰繘鍏ョН闆ㄤ簯鎴栨祿绉簯涓紝鐢变簬浜戜腑鏈夊己鐑堢殑瀵规祦锛岄绨稿線寰�浼氬緢涓ラ噸锛堝浘3-10锛夈�傝繕鏈変竴浜涙椂鍊欙紝鍦ㄦ櫞绌轰竾閲岀殑鎯呭喌涓嬶紝涔熶細浜х敓鈥滄櫞绌洪绨糕�濄�� + </p> + <p class="center openImgBox p-even"><img class="img-c" alt="" + src="../../assets/images/0156-1.jpg" /></p> + <p class="img p-even">鍥�3-10 浜戜腑椋炶閬囧埌棰犵案</p> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block">1992骞�5鏈�22鏃ワ紝涓�鏋禕767椋炴満浠庝笂娴烽寰�鍖椾含锛屽湪娴庡崡浠ュ崡90km銆�9000m楂樼┖锛岄亣鍒板己鎬ユ祦鍜屾櫞绌洪绨革紝閫犳垚4鍚嶄箻鍔″憳鍜屽鍚嶆梾瀹㈠彈浼ゃ��</p> + <p class="block"> + 2002骞�1鏈�25鏃ワ紝鍗楁柟鑸┖涓�鏋禕757椋炴満鎵ц娣卞湷鈥旀姹夎埅鐝换鍔°�傞鏈轰笅闄嶈嚦7800m鏃讹紝绐佺劧閬囧埌涓ラ噸棰犵案锛屽鑷�1鍚嶄箻鍔″憳鍙椾激锛�5鍚嶆梾瀹㈠洜鎯婂悡鍦ㄩ鏈虹潃闄嗗悗鍒板尰闄㈡鏌ャ�� + </p> + <p class="block"> + 2009骞�5鏈�16鏃ワ紝鍥借埅瑗垮崡鍒嗗叕鍙哥殑A319瀹㈡満鍦�9200m楂樺害宸¤埅鏃剁獊鐒堕伃閬囧己鐑堟皵娴併�傞鏈鸿浆鍏ヤ笂鍗囷紝涓庣浉瀵归琛岄珮搴�9500m鐨勪竴鏋跺浗鑸鏈哄彂鐢熷啿绐侊紝瑙﹀彂绌轰腑浜ら�氭彁閱掍笌闃叉挒绯荤粺锛圱CAS锛夌殑鍐虫柇鍜ㄨ锛圧A锛夎鍛婏紝鏈虹粍鎸塕A鎸囦护涓嬮檷閬胯锛屽叾闂翠即鏈�3娆¢噸搴﹂绨稿叡鎸佺画澶х害20s锛岄鏈烘浘鍑虹幇鏈�澶у瀭鐩村拰渚у悜杞借嵎2.62G鍜�0.42G銆傞绨搁�犳垚13鍚嶆梾瀹㈠拰3鍚嶄箻鍔″憳韬綋涓嶉�傛垨鍙椾激銆� + </p> + </span> + </div> + </div> + </div> + </div> + <!-- 145椤� --> + <div class="page-box" page="153"> + <div v-if="showPageList.indexOf(153) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">145</li> + </ul> + <div class="bodystyle"> + <h5 id="e057" class="p-odd unit3-c">锛堜笁锛夋祿闆�</h5> + <p class="p-odd"> + 鎮诞浜庤繎鍦伴潰澶ф皵灞備腑鐨勬按婊存垨鍐版櫠锛屼娇鍦伴潰鑳借搴﹀皬浜�1km鐨勭幇璞″彨闆俱�傞浘鏄湴涓婄殑浜戯紝浜戞槸澶╀笂鐨勯浘锛岄浘琚姮鍗囧悗灏卞舰鎴愪簡浜戙�傚舰鎴愰浘鐨勬満鍒舵槸杩戝湴闈㈢┖姘旂敱浜庨檷娓╂垨姘存苯鍚噺澧炲姞鑰岃揪鍒伴ケ鍜岋紝姘存苯鍑濈粨鎴栧嚌鍗庤�屽舰鎴愰浘銆傞浘鐨勫帤搴﹀彉鍖栬寖鍥磋緝澶э紝涓�鑸负鍑犲崄绫冲埌鍑犵櫨绫筹紝鍘氱殑鍦�1km浠ヤ笂銆傛牴鎹浘鐨勫叿浣撳舰鎴愭柟寮忥紝鍙皢鍏跺垎鎴愯緪灏勯浘銆佸钩娴侀浘銆佷笂鍧¢浘銆佽捀鍙戦浘绛夊嚑绉嶇被鍨嬨�� + </p> + <p class="p-odd"> + 娴撻浘鍑忓皬浜嗕汉绫荤溂鐫涙墍鑳界湅鍒扮殑璺濈锛岄琛屽憳鍦ㄤ綆鑳借搴︽儏鍐典笅锛岃捣闄嶆椂甯哥湅涓嶆竻璺戦亾銆備负浜嗛伩鍏嶆祿闆惧奖鍝嶉琛屽畨鍏紝鏈哄満鍜岄鏈轰笂閮借鏈夊畬鍠勭殑鐫�闄嗙郴缁燂紝鐢变华鍣ㄦ潵杈呭姪椋炴満璧烽檷锛屽悓鏃剁敱鑸┖姘旇薄鍗曚綅鎻愪緵娴撻浘鎵�寮曡捣鐨勪綆鑳借搴︽暟鎹�傝嫢鑳借搴︿綆浜庤捣闄嶅ぉ姘旀爣鍑嗭紝鏈哄満灏嗛�傛椂鍏抽棴锛岀瓑寰呮祿闆炬秷鏁o紝鑳借搴﹁浆濂斤紝鏈哄満鍐嶅紑鏀俱�� + </p> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 2020骞�1鏈�26鏃ワ紝浣愬反鎵�氳繃鏃犵嚎鐢靛憡璇夎埅绌轰氦閫氱鍒跺憳锛屼粬姝h瘯鐫�椹鹃┒鐩村崌鏈烘攢鍗囧埌4000ft锛堢害鍚�1.2km锛夈�備絾瀹為檯涓婏紝椋炴満姝ゆ椂姝e湪涓嬮檷銆備箣鍚庯紝鐩村崌鏈哄氨鍧犳瘉鍦ㄧ編鍥藉姞宸炵殑鍗℃媺宸磋惃鏂�備綈宸存壃銆佺姣斿拰浠�13宀佺殑濂冲効鍚夊畨濞滀互鍙婃満涓婂叾浠�6浜猴紝閮藉湪杩欒捣鎰忓浜嬫晠涓抚鐢熴�� + </p> + <p class="block">绉戞瘮鎰忓绂讳笘鍚庯紝缇庡浗瀵硅繖璧蜂簨鏁呯殑鍘熷洜灞曞紑浜嗚皟鏌ャ��2020骞�2鏈堬紝绉戞瘮閬楀瓈鐡﹀Ξ鑾庢寮忓悜鐩村崌鏈哄叕鍙稿拰浣愬反鎵強鐩稿叧璐d换浜烘彁鍑鸿瘔璁笺��</p> + <p class="block"> + 璇夌姸鍐呭鎸囧嚭锛屸�滅洿鍗囨満鍏徃绾靛椹鹃┒鍛樺湪澶ч浘銆佷綆浜戠殑鎭跺姡澶╂皵鏉′欢涓嬭捣椋炩�濄�傚悓鏃舵彁鍒帮紝鈥滈鏈洪┚椹跺憳鏇惧湪2015骞达紝灏卞洜杩濆弽瀹夊叏椋炶鏉′緥閬埌FAA锛堢編鍥借仈閭﹁埅绌虹鐞嗗眬锛夊缃氣�濄�傞櫎姝や箣澶栵紝鐡﹀Ξ鑾庡悜鐩村崌鏈哄叕鍙稿姹傜粡娴庢崯澶便�侀潪缁忔祹鎹熷け銆佽繜寤跺埄鎭�佹儵缃氭�ц禂鍋夸互鍙婂叾浠栬禂鍋裤��<sup>鈶�</sup> + </p> + </span> + </div> + <p><br></p> + <p><br></p> + <p><br></p> + <p><br></p> + <hr class=""> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 銆婄姣斿潬鏈轰簨浠跺鏈洖椤惧巻鏃朵竴骞磋繕鍘熸偛鍓х湡鐩搞�嬶紝<a + href="https://www.chinanews.com.cn/ty/2021/02-10/9409380.shtml" + target="_blank">https://www.chinanews.com.cn/ty/2021/02-10/9409380.shtml</a>锛�2022-04-12銆�</p> + </div> + </div> + </div> + <!-- 146椤� --> + <div class="page-box" page="154"> + <div v-if="showPageList.indexOf(154) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">146</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even unit3-c"> + 瀛︿範浠诲姟涓�<br />绌轰腑棰嗚埅 + </h3> + <div class="task-u3-c ma-l"></div> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 2019骞达紝鑻卞浗鑸┖鍏徃闂瑰嚭椋炴満椋為敊鍥藉鐨勪箤榫欙紝涓�鏋跺師瀹氶寰�寰峰浗鏉滃灏斿澶殑鐝満锛屽嵈閿欒鍦伴鍒颁簡鐖变竵鍫°�傚綋椋炴満钀藉湴椋炶鍛樺甯冩姷杈剧埍涓佸牎鏃讹紝鏃呭杩樹互涓烘満闀垮湪寮�鐜╃瑧銆備箣鍚庯紝褰撻琛屽憳鍙戠幇鍏ㄦ満鐨勬梾瀹㈤兘鏄墠寰�鏉滃灏斿澶椂锛屼粬涔熸槸涓�澶撮浘姘淬�傚鏈哄湪鐖变竵鍫℃満鍦哄仠浜嗕袱涓灏忔椂涔嬪悗锛屾墠鍐嶅害璧烽锛屽墠寰�姝g‘鐨勭洰鐨勫湴銆� + </p> + </span> + </div> + <p class="p-even"> + 鍦ㄥ湴闈笂锛屽鏋滆鍘讳竴涓檶鐢熺殑鍦版柟锛屽嚟鍊熶竴寮犲湴鍥惧拰璺墝鐨勬寚绀哄氨鍙互鍒拌揪鐩殑鍦般�傚湪骞胯ⅳ鐨勭┖涓紝椋炴満鏄浣曠‘瀹氫綅缃�侀琛屾柟鍚戝拰椋炶璺濈鐨勫憿锛熻繖涓�鍒囧氨闇�瑕佸�熷姪绌轰腑棰嗚埅鐨勬湁鍏崇煡璇嗘潵瀹屾垚銆傚箍涔夌殑棰嗚埅鍖呮嫭涓ゆ柟闈㈢殑鍚箟锛氫竴鏄┖涓鑸紝浜屾槸鍦伴潰寮曞銆� + </p> + <h4 id="d051" class="p-even unit3-c">涓�銆佺┖涓鑸杩�</h4> + <h5 id="e058" class="p-even unit3-c">锛堜竴锛夌┖涓鑸殑鍩烘湰姒傚康</h5> + <p class="p-even">绌轰腑棰嗚埅鏄湪涓嶅悓鐨勮埅琛屾潯浠朵笅浣跨敤涓嶅悓鐨勯鑸澶囧拰鏂规硶寮曞椋炴満瀹夊叏銆佸噯鏃躲�佸噯纭湴椋炲埌鐩殑鍦般��</p> + <p class="p-even"> + 鍦伴潰寮曞鏄寚鍦伴潰浜哄憳浣跨敤寮曞璁惧锛岃绠楀嚭寮曞鏁版嵁锛屽皢椋炴満寮曢鍒伴瀹氱洰鏍囩殑涓�绯诲垪娲诲姩銆傛寜鐓у紩瀵艰澶囩殑涓嶅悓锛屽彲鍒嗕负鑷姩鍖栧紩瀵煎拰浜哄伐寮曞銆傝嚜鍔ㄥ寲寮曞锛屾槸鍦ㄦ祴寰楃┖涓洰鏍囦俊鎭悗锛岃嚜鍔ㄨ幏鍙栨暟鎹苟浼犺緭缁欒绠楁満锛岃绠楁満鏍规嵁寮曞浜哄憳纭畾鐨勭洰鏍囧拰椋炴満椋炲悜鐩爣鐨勬柟娉曪紝鑷姩璁$畻鍑哄紩瀵兼暟鎹紝寮曞浜哄憳鎹瀵圭┖涓鏈烘墍瀹炴柦鐨勫紩瀵笺�備汉宸ュ紩瀵硷紝鏄埄鐢ㄥ湴鍥句笂鏍囧嚭鐨勬垨闆疯揪鏄剧ず鐨勯鏈鸿埅杩癸紝瀵归鏈烘墍杩涜鐨勬寚鎸ュ拰寮曞銆� + </p> + <h5 id="e059" class="p-even unit3-c">锛堜簩锛夌┖涓鑸彂灞曠畝鍙�</h5> + <p class="p-even">椋炶鍣ㄥ嚭鐜颁互鍚庯紝绌轰腑棰嗚埅涔熼殢涔嬩骇鐢熶簡銆�1804骞达紝淇勫浗绉戝闄㈤櫌澹� + </p> + </div> + </div> + </div> + <!-- 147椤� --> + <div class="page-box" page="155"> + <div v-if="showPageList.indexOf(155) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">147</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鏌ュ搱娲涘か鍒╃敤鎸囧崡閽堝垽瀹氶琛屾柟鍚戯紝浠ュ洖澹版祴閲忛珮搴︼紝骞朵笖鍦ㄥ湴鍥句笂鐢诲嚭鑸抗銆�1882骞达紝鍦ㄤ縿鍥藉湥褰煎緱鍫★紝淇勫浗娴峰啗鍐涘畼鑾儹渚濇柉鍩烘彁鍑轰簡鍒╃敤缃楃洏棰嗚埅鐨勬蹇点�傚湪杩欎竴鏃舵湡锛岄琛屽櫒杩樺彧鑳藉湪绠�鍗曠殑鏉′欢涓嬮琛屼簬鍩哄湴闄勮繎锛岄琛屽憳鍙兘鍦ㄥぉ姘旇壇濂芥椂渚濋潬瑙傚療鍦伴潰锛屽埄鐢ㄦ渤娴併�侀搧璺瓑鏄捐憲鍦版爣鏉ュ疄鏂介鑸�� + </p> + <p class="p-odd">鍦ㄧ涓�娆′笘鐣屽ぇ鎴樻湡闂达紝椋炶鍛樺埄鐢ㄩ鏈轰笂鐨勭缃楃洏銆佺┖閫熻〃銆侀珮搴﹁〃鍜屽湴鍥撅紝瀹炴柦绌轰腑棰嗚埅锛屽苟寮�濮嬪湪绌哄嫟缁勫唴涓撹涓�鍚嶇┖涓鑸憳銆�</p> + <p class="p-odd"> + 鍦ㄧ浜屾涓栫晫澶ф垬鏈熼棿鍜屾垬浜夌粨鏉熷悗锛屾棤绾跨數棰嗚埅鐨勫彂灞曞崄鍒嗚繀閫燂紝鍚勭鏃犵嚎鐢靛鑸澶囦笉鏂爺鍒舵垚鍔熷苟鐢ㄤ簬鑸┖杩愯緭銆傛棤绾跨數棰嗚埅鐨勫嚭鐜帮紝鏄┖涓鑸柟娉曠殑涓�娆¢璺冿紝鏄竴涓噷绋嬬銆傚畠浣块鏈鸿兘澶熷湪澶嶆潅鐨勬皵璞℃潯浠朵笅瀹夊叏鍦拌捣椋炲拰鐫�闄嗭紝鑳藉鍑嗙‘鍦版部鑸嚎椋炲埌鐩殑鍦帮紝澧炲己浜嗛鏈虹殑鏈哄姩椋炶鑳藉姏锛屽彇寰椾簡鏋佸ぇ鐨勭粡娴庢晥鐩婏紝鏄富瑕佺殑棰嗚埅鏂规硶銆� + </p> + <p class="p-odd"> + 闅忕潃鐢靛瓙璁$畻鏈恒�侀浄杈俱�佹縺鍏夈�佺孩澶栥�佸井娉€�佽嚜鍔ㄦ帶鍒跺拰鍏朵粬淇℃伅绯荤粺绛夌瀛︽妧鏈殑杩呴�熷彂灞曪紝绌轰腑棰嗚埅鍜屽湴闈㈠紩瀵肩殑鑷姩鍖栫▼搴﹁秺鏉ヨ秺楂樸�傞鏈轰粠璧烽鍒扮潃闄嗛樁娈电殑棰嗚埅闂锛岄�愭鐢辩數瀛愯绠楁満鎺у埗鍜屽鐞嗭紝杈冧箣浜哄伐鎺у埗锛屽彲浠ユ洿鍑嗙‘銆佽繀閫熷湴瀹炴柦绌轰腑棰嗚埅鍜屽湴闈㈠紩瀵笺�� + </p> + <p class="p-odd"> + 20涓栫邯70骞翠唬锛岀編鍥藉紑濮嬬爺鍒剁敤浜庡鑸殑鍏ㄧ悆瀹氫綅绯荤粺銆傚崼鏄熷鑸墍鍏锋湁鐨勪紭鐐癸紝鍙楀埌浜嗕笘鐣屽悇鍥界殑骞挎硾閲嶈銆傚崼鏄熷鑸妧鏈瀵艰埅銆侀�氫俊鍙婄┖涓氦閫氱鐞嗕骇鐢熶簡娣辫繙鐨勫奖鍝嶃�傝繖涓�鎶�鏈殑鎴愬姛搴旂敤灏嗗鑸妧鏈帹鍏ヤ簡鍗槦瀵艰埅鏃朵唬锛屽叿鏈夊垝鏃朵唬鐨勬剰涔夈�� + </p> + <p class="p-odd">鍚勭被楂樼簿搴﹀鑸澶囧凡鍦ㄦ皯鑸鍩熷箍娉涘簲鐢紝绌轰腑棰嗚埅姝e悜鐫�瀹夊叏銆佺簿鍑嗐�佺ǔ瀹氱殑鐩爣鍙戝睍銆�</p> + <h4 id="d052" class="p-odd unit3-c">浜屻�侀鑸熀鏈柟娉�</h4> + <p class="p-odd"> + 鏍规嵁浣跨敤璁惧鐨勪笉鍚岋紝甯哥敤鐨勯鑸柟娉曟湁锛氬湴鏍囩綏鐩橀鑸�佹棤绾跨數棰嗚埅銆佸ぉ鏂囬鑸�侀浄杈鹃鑸�佹儻鎬ч鑸�佸崼鏄熼鑸瓑銆傜幇浠f湁浜涢鏈鸿鏈夌敱鍑犵涓嶅悓鐨勯鑸澶囩粍鎴愮殑銆佺敱鐢靛瓙璁$畻鏈烘帶鍒剁殑缁煎悎棰嗚埅绯荤粺瀹炴柦绌轰腑棰嗚埅锛屼互澧炲己寮曢椋炴満鐨勫噯纭�у苟鎻愰珮鑷姩鍖栫▼搴︺�傝櫧鐒堕鑸柟娉曞绉嶅鏍凤紝鍚勬湁鍗冪锛屼絾鍏跺熀鏈柟娉曢兘鏄竴鏍风殑锛氱‘瀹氶鏈哄綋鍓嶄綅缃�佽绠楀嚭鍒伴瀹氬湴鐐圭殑椋炶鏂瑰悜鍜岄琛屾椂闂达紝寮曞椋炴満鍑嗙‘鍦伴鍒伴瀹氬湴鐐广�備笉鍚岀殑棰嗚埅鏂规硶锛屽尯鍒湪浜庤幏寰楄繖浜涗俊鎭殑閫斿緞涓庤绠楁柟娉曠殑涓嶅悓銆� + </p> + </div> + </div> + </div> + <!-- 148椤� --> + <div class="page-box" page="156"> + <div v-if="showPageList.indexOf(156) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">148</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e060" class="p-even unit3-c">锛堜竴锛夊湴鐞嗗潗鏍囦笌鑸┖鍦板浘</h5> + <p class="p-even">鍦扮悊鍧愭爣鏄敤鏉ョ‘瀹氬湴闈㈠拰绌轰腑杩愬姩鐗╀綋浣嶇疆鐨勪竴绉嶆渶鍩烘湰鐨勫潗鏍囷紝棰嗚埅涓�氬父鐢ㄧ粡搴﹀拰绾害琛ㄧず銆�</p> + <p class="p-even">鍦扮悆涓婁换鎰忓湴鐐归兘鏈変竴鏉$粡绾块�氳繃锛屾煇鏉$粡绾跨殑缁忓害锛屽氨鏄鏉$粡绾挎墍鍦ㄥ钩闈笌璧峰缁忕嚎骞抽潰鐨勫す瑙掋��</p> + <p class="p-even">鍦扮悆涓婁换鎰忓湴鐐归兘鏈変竴鏉$含绾块�氳繃锛屾煇鏉$含绾跨殑绾害锛屽氨鏄绾嚎涓婁换鎰忎竴鐐逛笌鍦板績鐨勮繛绾垮悓璧ら亾骞抽潰鐨勫す瑙掋��</p> + <p class="p-even"> + 灏嗗湴鐞冭〃闈㈢殑鍏ㄩ儴鎴栬�呬竴閮ㄥ垎鍦板舰銆佸湴鐗╂寜鐓т竴瀹氱殑姣斾緥缂╁皬锛岀敤涓�瀹氱殑鏂规硶鍜岀鍙锋弿缁樺湪骞抽潰涓婄殑鍥惧舰锛屽氨鍙湴鍥撅紝瀹冩槸鍦伴潰涓婂悇绉嶆櫙鐗╃殑绠�鐣ヨ褰曘�傚湴鍥剧殑绉嶇被寰堝锛屼笉鍚岀殑鍦板浘鏈変笉鍚岀殑鐢ㄩ�斻�傚叾涓笓渚涜埅绌轰娇鐢ㄧ殑鍦板浘鍙埅绌哄湴鍥俱�� + </p> + <p class="p-even">鑸┖鍦板浘鏄瘡娆¢琛岃繘琛岄鑸噯澶囧拰绌轰腑瀹炴柦棰嗚埅蹇呬笉鍙皯鐨勯噸瑕佽祫鏂欍�傚湪椋炶涓厖鍒嗐�佹纭�佺啛缁冨湴浣跨敤鑸┖鍦板浘鎵�鎻愪緵鐨勮祫鏂欙紝瀵逛簬淇濊瘉椋炶瀹夊叏鍏锋湁閲嶈鐨勬剰涔夈��</p> + <h5 id="e061" class="p-even unit3-c">锛堜簩锛夐鑸殑鍩烘湰鍙傛暟</h5> + <p class="p-even"> + 鍚勫湴鐨勫湴鐞嗗潗鏍囧拰娴锋嫈楂樺害閫氳繃澶氬勾鐨勬祴閲忓凡缁忚褰曞湪鑸┖鍦板浘涓婁簡锛屽洜鑰岄�氳繃鍦伴潰鏍囧織瀵圭収鑸┖鍦板浘灏卞彲浠ョ‘瀹氭煇涓�鐐圭殑鍦扮悊鍧愭爣銆備篃鍙互鍦ㄧ煡閬撹捣椋炴満鍦虹殑鍦扮悊鍧愭爣鍚庯紝鏍规嵁鍦伴�熷拰鑸悜鎶婇琛屼腑鐨勮埅杩逛互鍙婂埌杈剧殑鏃堕棿璁$畻鍑烘潵銆傚湪鍏峰鑸┖鍦板浘鐨勬儏鍐典笅锛岄鑸渶涓昏鐨勫弬鏁板氨鏄埅鍚戙�佺┖閫熷強鍦伴�熴�佹椂闂村拰椋炶楂樺害锛堝浘3-11锛夈�� + </p> + <p class="center openImgBox p-even "><img class="img-b" alt="" + src="../../assets/images/0160-1.jpg" /></p> + <p class="img">鍥�3-11 棰嗚埅鐨勫熀鏈弬鏁�</p> + <h6 id="f016" class="p-even">1.鑸嚎</h6> + <p class="p-even">椋炴満浠庡湴鐞冭〃闈竴鐐瑰埌鍙︿竴鐐圭殑棰勫畾鑸璺嚎鍙埅绾裤�傝埅绾跨殑鏂瑰悜鐢ㄨ埅绾胯琛ㄧず锛屼粠鑸嚎璧风偣鐨勭粡绾垮寳绔『鏃堕拡閲忓埌鑸嚎鍘诲悜鐨勮搴﹀氨鏄埅绾� + </p> + </div> + </div> + </div> + <!-- 149椤� --> + <div class="page-box" page="157"> + <div v-if="showPageList.indexOf(157) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">149</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">瑙掞紝鑸嚎瑙掔殑鑼冨洿鏄�0锝�360掳锛涜埅绾胯窛绂绘槸鑸嚎璧风偣鍒扮粓鐐圭殑鍦伴潰闀垮害锛屽畠绛変簬鍚勬鑸嚎璺濈涔嬪拰锛岃埅绾胯窛绂荤殑鍗曚綅甯哥敤鐨勬湁鍗冪背鍜屾捣閲屻��</p> + <h6 id="f017" class="p-odd">2.鑸悜</h6> + <div class="img-rights w230 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0161-1.jpg" /> + <p class="img">鍥�3-12 鑸悜绾�</p> + </div> + <span> + <p class="p-odd"> + 椋炴満绾佃酱鍓嶆柟鐨勫欢闀跨嚎鍙埅鍚戠嚎锛堝浘3-12锛夈�傝埅鍚戠嚎鐨勬柟鍚戯紝鍗抽鏈虹旱杞村墠鏂圭殑鎸囧悜锛屽彨鑸悜銆傝埅鍚戝氨鏄鏈哄湪绌轰腑鐨勯琛屾柟鍚戯紝瀹冩槸鐢ㄨ埅鍚戣鏉ヨ〃绀虹殑銆備粠缁忕嚎鍖楃椤烘椂閽堥噺鍒拌埅鍚戠嚎鐨勮搴﹀彨鑸悜瑙掞紙鍥�3-13锛夛紝鍏惰寖鍥翠负0锝�360掳锛屽叾涓�0掳涓烘鍖楁柟鍚戯紝90掳涓烘涓滄柟鍚戯紝180掳涓烘鍗楁柟鍚戯紝 + </p> + </span> + <div class="img-rights w115 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0161-2.jpg" /> + <p class="img">鍥�3-13 鑸悜瑙�</p> + </div> + <span> + <p class="p-odd td-0">270掳涓烘瑗挎柟鍚戙��</p> + <p class="p-odd"> + 椋炴満鐨勮埅鍚戞槸閫氳繃缃楃洏鏉ユ祴閲忕殑锛屾皯鑸鏈轰笂閲囩敤鐨勭綏鐩樹富瑕佹湁锛氱洿璇荤缃楃洏銆侀檧铻哄崐缃楃洏鍜岄檧铻虹缃楃洏绛夈�傚湪鐜颁唬鍖栫殑椋炴満涓婇噰鐢ㄨ埅鍚戠郴缁燂紝鍏剁洰鐨勬槸瀹炵幇鏈鸿浇璁惧鐨勭患鍚堝寲鍙婂疄鏂借嚜鍔ㄩ琛岀鐞嗙瓑銆�</p> + <h6 id="f018" class="p-odd">3.绌洪�熷強鍦伴��</h6> + <p class="p-odd">绌洪�熸槸鍙嶆槧椋炴満椋炶鎬ц兘鐨勪竴涓噸瑕佸弬鏁帮紝鏄琛屽憳姝g‘鎿嶇旱椋炴満鐨勪富瑕佷緷鎹�傞琛屼腑椋炴満鎵�鍙楃殑鍚勭绌烘皵鍔ㄥ姏涓庣┖閫熺洿鎺ョ浉鍏筹紝鍚屾椂绌洪�熸槸棰嗚埅璁$畻涓嶅彲缂哄皯鐨勫厓绱犮��</p> + </span> + <p class="p-odd">绌洪�熸槸鐢ㄧ┖閫熻〃娴嬮噺鍑烘潵鐨勶紝鐢变簬绌洪�熻〃瀛樺湪鐫�鏈烘璇樊銆佺┖姘斿姩鍔涜宸�佺┖姘斿瘑搴﹁宸瓑锛屼娇鐢ㄦ椂闇�瑕佽繘琛屼慨姝e拰璁$畻銆�</p> + <p class="p-odd"> + 椋炶涓笉浠呰鐭ラ亾绌洪�燂紝鍦ㄩ鑸绠椾腑杩橀渶瑕佺煡閬撴部鑸嚎椋炶鐨勯鏈虹浉瀵瑰湴闈㈢殑閫熷害锛屼粠鑰岀‘瀹氶鏈烘墍鍦ㄧ殑浣嶇疆鍜岄鏈哄埌杈鹃瀹氫綅缃殑鏃跺埢銆傞鏈哄湪鍦伴潰涓婃姇褰辩偣鐨勭Щ鍔ㄩ�熷害绉颁负鍦伴�燂紝鍦伴潰鎶曞奖鐐圭Щ鍔ㄧ殑杞ㄨ抗绉颁负鑸抗銆傝埅杩圭殑鏂瑰悜鐢ㄨ埅杩硅琛ㄧず锛屼粠缁忕嚎鍖楃椤烘椂閽堥噺鍒拌埅杩瑰幓鍚戠殑瑙掑害鍙埅杩硅锛岃寖鍥翠负0锝�360掳銆傚鏋滆埅杩逛笌鑸嚎閲嶅悎鎴栦竴鑷达紝鑸抗瑙掑氨绛変簬鑸嚎瑙掋�� + </p> + <p class="p-odd"> + 椋炴満鍦ㄩ琛屼腑锛屼笉浣嗙浉瀵圭┖姘旇繍鍔紝杩樹細闅忛寰�涓嬮鏂瑰悜椋樼Щ銆傚湪鏃犻鐨勬儏鍐典笅锛屾満澶村鍚戝摢閲岋紝椋炴満灏遍鍚戝摢閲岋紝杩欐椂椋炴満鐨勮埅杩瑰畬鍏ㄥ悓鑸悜绾夸竴鑷达紝椋炴満鐨勮埅杩硅绛変簬鑸悜瑙掞紝鍦伴�熺瓑浜庣┖閫熴�傞『椋庤埅琛岋紝椋炴満鐨勭┖閫熷拰椋庨�熷湪涓�鏉$洿绾夸笂锛屽湴閫熺瓑浜庣┖閫熷姞椋庨�燂紱鍚岀悊锛岄鏈洪�嗛鑸锛� + </p> + </div> + </div> + </div> + <!-- 150椤� --> + <div class="page-box" page="158"> + <div v-if="showPageList.indexOf(158) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">150</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">鍦伴�熺瓑浜庣┖閫熷噺鍘婚閫熴��</p> + <div class="img-float w250 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0162-1.jpg" /> + <p class="img">鍥�3-14 鑸硅繃娌�</p> + </div> + <span> + <p class="p-even"> + 閫氬父鎯呭喌涓嬶紝绌轰腑寰堝皯閬囧埌鏃犻銆佸崟绾殑椤洪鎴栭�嗛锛屽疄闄呮儏鍐垫槸缁忓父鏈変晶椋庛�備晶椋庝腑椋炴満闅忛椋樼Щ涓嶄粎褰卞搷鍦伴�熷ぇ灏忥紝杩樺奖鍝嶅湴閫熸柟鍚戯紝浣胯埅杩圭嚎鍋忕鑸悜绾匡紝閫犳垚鑸抗瑙掍笉绛変簬鑸悜瑙掞紝鍦伴�熶篃涓嶇瓑浜庣┖閫熴�傛鍍忚埞杩囨渤锛堝浘3-14锛夋椂锛岃埞鍙楁按娴佺殑褰卞搷锛岃埞鐨勮杩涙柟鍚戝苟涓嶆槸鑸瑰ご鎵�鎸囩ず鐨勬柟鍚戯紝鑰屾槸鍋忓悜涓嬫父鏂瑰悜銆傞鏈哄湪渚ч涓琛岋紝鑸抗绾跨浉瀵逛簬鑸悜绾夸篃浼氭湞涓嬮鏂瑰悜鍋忋�� + </p> + <p class="p-even">鐭ラ亾浜嗛琛岀殑鑸抗瑙掑拰鍦伴�燂紝灏卞緢瀹规槗鍦拌绠楀嚭椋炴満涓嬫柟鍦伴潰鐨勪綅缃拰鍒拌揪棰勫畾浣嶇疆鐨勬椂鍒汇��</p> + </span> + <h6 id="f019" class="p-even">4.鏃堕棿</h6> + <p class="p-even"> + 鏃堕棿鏈変袱绉嶄笉鍚岀殑鍚箟锛氫竴鏄〃绀烘煇涓�鐬棿鐨勬棭鏅氾紝鍙椂鍒伙紝濡傞鏈轰粠鍖椾含璧烽鏃跺埢鏄�12鏃�40鍒嗭紝鍒拌揪骞垮窞鐨勬椂鍒绘槸15鏃�55鍒嗭紱浜屾槸琛ㄧず涓ゆ椂鍒婚棿鎵�闂撮殧鐨勯暱鐭紝鍙椂娈碉紝濡傞鏈轰粠鍖椾含鍒板箍宸炵殑椋炶鏃舵鏄�3灏忔椂15鍒嗐�� + </p> + <p class="p-even">瑕佽〃绀烘椂鍒荤殑鏃╂櫄鍜屾椂闂寸殑闀跨煭锛屽氨闇�瑕佹湁鏃堕棿鍗曚綅锛屾椂闂寸殑鍩烘湰鍗曚綅鏄棩锛屽勾鍜屾湀鏄棩鐨勫�嶆暟锛屾椂銆佸垎銆佺鏄棩鐨勭瓑鍒嗐��</p> + <h6 id="f020" class="p-even">5.椋炶楂樺害</h6> + <p class="p-even">椋炴満鍒版煇涓�鍩哄噯闈㈢殑鍨傜洿璺濈鍙琛岄珮搴︼紝甯镐互绫虫垨鑻卞昂涓哄崟浣嶃��</p> + <p class="p-even">鏍规嵁涓嶅悓鐨勯琛岄渶瑕侊紝甯稿父閫夋嫨涓嶅悓鐨勫熀鍑嗛潰浣滀负娴嬮噺楂樺害鐨勫熀鍑嗐�傛牴鎹笉鍚屽熀鍑嗛潰锛岄琛岄珮搴﹀父鍒嗕负涓ょ被锛氬嚑浣曢珮搴﹀拰姘斿帇楂樺害銆�</p> + <p class="p-even"> + 鍑犱綍楂樺害鏄皢鍦扮悆琛ㄩ潰鏌愪竴姘村钩闈綔涓哄熀鍑嗛潰鐨勯珮搴︼紝瀹冨疄闄呬笂灏辨槸椋炴満鐩稿浜庡湴鐞冭〃闈㈡煇澶勭殑鐪熷疄楂樺害锛屽畠鍙笌椋炴満鍜屽湴鐞冭〃闈㈡墍澶勭殑楂樹綆鏈夊叧锛屽叿鏈夌ǔ瀹氱殑鍑犱綍褰㈡�併�傛牴鎹墍閫夊熀鍑嗛潰涓嶅悓锛屽嚑浣曢珮搴︽湁鐪熷疄楂樺害銆佺浉瀵归珮搴﹀拰缁濆楂樺害涔嬪垎銆傝繖閮ㄥ垎鍐呭鍦ㄩ」鐩簩宸蹭粙缁嶈繃锛屾澶勪笉璧樿堪銆� + </p> + <p class="p-even"> + 姘斿帇楂樺害鏄牴鎹珮搴︿笂鍗囥�佸ぇ姘斿帇鍔涢�愭笎鍑忓皬鐨勫師鐞嗭紝娴嬪緱鏌愬姘斿帇鍊硷紝鏍规嵁杩欎竴姘斿帇鍊艰绠楀嚭鏉ョ殑楂樺害銆傚父鐢ㄧ殑姘斿帇楂樺害鏈夊満鍘嬮珮搴︺�佷慨姝f捣骞抽潰姘斿帇楂樺害銆佹爣鍑嗘皵鍘嬮珮搴︾瓑銆傞琛屼腑甯哥敤鐨勯珮搴﹁〃鎸囩ず鐨勬暟鎹氨鏄牴鎹皵鍘嬫寚绀虹殑姘斿帇楂樺害銆傚満鍘嬮珮搴︽槸浠ヨ捣椋炴満鍦烘垨闄嶈惤鏈哄満鐨勫満鍘嬩负鍩� + </p> + </div> + </div> + </div> + <!-- 151椤� --> + <div class="page-box" page="159"> + <div v-if="showPageList.indexOf(159) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">151</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鍑嗛潰鐨勯珮搴︺�備慨姝f捣骞抽潰姘斿帇楂樺害鏄互淇娴峰钩闈㈡皵鍘嬩负鍩哄噯闈㈢殑楂樺害銆� + </p> + <h5 id="e062" class="p-odd unit3-c">锛堜笁锛夌┖涓鑸殑鍩烘湰鏂规硶</h5> + <p class="p-odd"> + 浠庢棭鏈熺殑鍦版爣缃楃洏棰嗚埅鍒扮幇鍦ㄦ櫘閬嶉噰鐢ㄧ殑鍗槦瀵艰埅绯荤粺锛岄鑸柟娉曠粡鍘嗕簡缈诲ぉ瑕嗗湴鐨勫彉鍖栵紝浣嗘棤璁洪噰鐢ㄤ粈涔堟柟娉曢鑸紝鍏跺熀鏈柟娉曢兘鏄熀浜庡湴鏍囩綏鐩橀鑸紝鍙槸鐜颁唬棰嗚埅鍙傛暟鐨勮幏寰椼�佸鐞嗘洿鍔犵洿瑙傘�佹洿鍔犳櫤鑳藉寲鑰屽凡銆� + </p> + <p class="p-odd"> + 鍦版爣缃楃洏棰嗚埅灏辨槸鍦版爣棰嗚埅鍜岀綏鐩橀鑸殑缁撳悎銆傚湴鏍囬鑸槸椋炶鍛樹簬椋炶鍓嶅湪鑸┖鍦板浘涓婄敾鍑烘墍瑕侀琛岀殑鑸嚎锛屽苟璁颁綇鑸嚎涓婃墍瑕佺粡杩囦富瑕佸湴鐐圭殑鍦伴潰鐗瑰緛锛涢琛屼腑锛岀敤鑸┖鍦板浘鍚屾墍瑙佸湴闈㈠鐓э紝鎸夎鲸璁ゅ嚭鏉ョ殑鍦版爣纭畾椋炴満浣嶇疆銆侀琛岃埅鍚戝拰椋炶鏃堕棿銆傜綏鐩橀鑸槸鏍规嵁椋炶涓墍娴嬪緱鐨勯鑸弬鏁板拰椋炴満鍦ㄩ涓埅琛岀殑鍩烘湰瑙勫緥锛岄�氳繃鎺ㄦ祴鍜岃绠楁潵纭畾椋炴満浣嶇疆銆侀琛岃埅鍚戝拰椋炶鏃堕棿锛屼互寮曞椋炴満鑸鐨勬柟娉曪紝缃楃洏棰嗚埅涔熺О涓烘帹娴嬮鑸�� + </p> + <p class="p-odd"> + 鍦版爣棰嗚埅鏄渶鏃┿�佹渶鍘熷鐨勯鑸柟娉曪紝鍏朵紭鐐规槸鏂规硶绠�鍗曞彲闈狅紝缂虹偣鏄彈椋炶鍦板尯鐨勫湴褰€�佸鑺傘�佹樇澶溿�佹皵璞℃潯浠讹紝浠ュ強椋炶楂樺害銆侀�熷害鍜屽骇鑸辩幆澧冪殑褰卞搷锛屽湪瀹為檯搴旂敤涓湁鍏跺眬闄愭�с�傜綏鐩橀鑸槸姣忔鑸涓繀涓嶅彲灏戠殑鏈�鍩烘湰銆佹渶閲嶈鐨勯鑸柟娉曘�傚叾浼樼偣鏄笉鍙楀ぉ姘斻�佹樇澶滃拰鍦板尯绛夊鍦ㄦ潯浠剁殑闄愬埗锛屽彲浠ュ湪涓嶅悓鐨勬潯浠朵笅浣跨敤锛岀己鐐规槸鍙楄澶囪宸�佷綔涓氬噯纭�х殑褰卞搷浠ュ強鎺ㄧ畻鐨勭Н绱宸奖鍝嶃�傛墍浠ュ湪瀹為檯搴旂敤涓紝甯稿父鎶婂湴鏍囬鑸笌缃楃洏棰嗚埅鐩哥粨鍚堬紝閲囩敤浠ュ湴鏍囧畾浣嶄负鍩虹銆佹帹娴嬭绠椾负涓昏鎵嬫鐨勯鑸柟娉曘�傝繖鏍风殑棰嗚埅鏂规硶灏卞彨鍦版爣缃楃洏棰嗚埅銆� + </p> + <p class="p-odd"> + 姘戣埅椋炴満鐨勬瘡娆¤埅琛岋紝鍑犱箮閮芥槸娌块瀹氳埅绾块琛岀殑锛屽鍖椾含鍒板箍宸炵殑鑸嚎銆傝埅绾跨‘瀹氬悗锛岄渶瑕佽В鍐崇殑闂鏄紝椋炴満搴旇淇濇寔澶氬皯搴︾殑鑸悜椋炶锛屾墠鑳戒娇椋炴満娌垮寳浜埌骞垮窞鐨勯瀹氳埅绾块琛岋紝椋炶澶氶暱鏃堕棿鎵嶈兘鍒拌揪鐩殑鍦板箍宸炪�傚嵆鎺ㄧ畻椋炴満娌胯埅绾块琛岀殑搴旈鑸悜鍜屽簲椋炴椂闂淬�� + </p> + <p class="p-odd"> + 椋炶鍓嶏紝闇�瑕佸湪鑸┖鍦板浘涓婅繘琛屽湴鍥句綔涓氾紝鐢诲嚭灏嗚椋炶鐨勮埅绾匡紝閲忓嚭鑸嚎瑙掞紝鏍规嵁姘旇薄閮ㄩ棬棰勬姤鐨勯鍔涖�侀鍚戞帹绠楀嚭椋炴満娌块瀹氳埅绾块琛屾墍搴斾繚鎸佺殑鑸悜鈥斺�斿簲椋炶埅鍚戙�傛帹绠楀簲椋炶埅鍚戠殑鐩殑灏辨槸浣块鏈虹殑鑸抗绾夸笌棰勫畾鑸嚎閲嶅悎锛屼娇椋炴満娌胯埅绾垮噯纭埌杈鹃瀹氬湴鐐广�� + </p> + <p class="p-odd"> + 鍦ㄦ棤椋庢垨椤恒�侀�嗛鐨勬儏鍐典笅锛岄鏈虹殑鑸抗涓庤埅鍚戜竴鑷达紝鏈哄ご瀵瑰悜鍝噷锛岄鏈哄氨鑳介鍒板摢閲屻�傚洜姝わ紝褰撻鏈哄噯纭�氳繃璧风偣鏃讹紝灏卞簲灏嗚埅鍚戝鍑嗙洰鐨勫湴锛屽嵆淇濇寔搴旈鑸悜绛変簬鑸嚎瑙掗琛岋紝椋炴満灏辫兘娌胯埅绾块鍒伴瀹氬湴鐐广�� + </p> + </div> + </div> + </div> + <!-- 152椤� --> + <div class="page-box" page="160"> + <div v-if="showPageList.indexOf(160) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">152</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even">鍦ㄦ湁渚ч鐨勬儏鍐典笅锛屽鏋滈鏈洪�氳繃璧风偣鏃朵粛鐒堕噰鍙栬埅鍚戠瓑浜庤埅绾胯鐨勯琛屾柟寮忥紝鍙椾晶椋庣殑褰卞搷锛岄鏈哄皢浜х敓鍋忔祦瑙掞紝鑸抗绾垮皢鍋忓埌鑸嚎鐨勪笅椋庢柟鍚戯紝鏈�缁堥鏈哄皢涓嶈兘椋炲埌棰勫畾鍦扮偣涓婄┖銆� + </p> + <div class="img-float w230 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0164-1.jpg" /> + <p class="img">鍥�3-15 搴旈鑸悜</p> + </div> + <span> + <p class="p-even">椋炴満鍦ㄦ湁渚ч鐨勬儏鍐典笅锛屼负浜嗕娇鑸抗绾夸笌鑸嚎閲嶅悎锛屽繀椤讳娇椋炴満鐨勮埅鍚戠嚎鍚戣繋椋庢柟鍚戜慨姝d竴涓亸娴佽锛屽嵆鍦ㄨ埅绾胯鍩虹涓婅繋椋庝慨姝d竴涓亸娴佽锛屽緱鍒板簲椋炶埅鍚戯紙鍥�3-15锛夈�� + </p> + <p class="p-even"> + 鐢变簬淇浜嗗亸娴侊紝铏界劧鑸悜绾挎病鏈夊鍚戦瀹氬湴鐐癸紝浣嗗湪渚ч鐨勫奖鍝嶄笅锛岃埅杩圭嚎姝eソ涓庤埅绾块噸鍚堬紝椋炴満灏嗘部鐫�鑸嚎椋炲埌棰勫畾鍦扮偣涓婄┖銆傛浮娌崇殑鑸硅鎯冲埌杈惧宀革紝蹇呴』灏嗚埞澶村鍚戦瀹氶潬宀稿湴鐐圭殑涓婃父锛屼篃鏄繖涓亾鐞嗐�� + </p> + </span> + <p class="p-even">鍦板浘浣滀笟涓繕搴旀帹绠楀ソ搴旈鏃堕棿锛屽簲椋炴椂闂寸殑鎺ㄧ畻鏄牴鎹埅绾胯窛绂诲拰椋炴満鍦伴�熻繘琛岀殑锛屽嵆</p> + <p class="center p-even">搴旈鏃堕棿=鑸嚎璺濈梅椋炴満鍦伴�熴��</p> + <p class="p-even"> + 瀹為檯椋炶涓細鍑虹幇寰堝鍋忓樊锛屽鑸鍙傛暟淇濇寔涓嶅ソ銆侀鍔涘拰椋庡悜鍙樺寲绛夐兘浼氶�犳垚瀹為檯椋炶涓庡湴鍥句綔涓氱殑宸窛銆備负浜嗚兘鍙婃椂鍙戠幇鍜屼慨姝e亸宸紝鍦板浘浣滀笟鏃惰繕瑕佸湪鑸嚎涓�旈�夋嫨鍑犱釜杈冩槑鏄剧殑鍦版爣浣滀负妫�鏌ョ偣锛岃绠楀嚭椋炴満浠庤捣鐐癸紙鎴栬埅绾夸笂鐨勫叾浠栫偣锛夊埌妫�鏌ョ偣鐨勫簲椋炴椂闂村苟閲忓嚭妫�鏌ョ偣鍋忕鑸嚎鐨勮窛绂荤瓑銆傞琛屼腑锛屾牴鎹埌妫�鏌ョ偣鐨勫疄闄呮椂闂翠笌搴旈鏃堕棿鐨勬瘮杈冦�侀鏈哄亸绂绘鏌ョ偣鐨勪綅缃瓑鍒ゆ柇鍑洪鏈哄亸鑸儏鍐碉紝鍦ㄥ悗缁埅娈靛強鏃朵慨姝c�傛鏌ョ偣鐨勪綔鐢ㄦ槸浣块琛屽憳鍦ㄩ琛屼腑鍋忓樊杈冨皬鏃讹紝鍙婃椂鍙戠幇骞朵慨姝e亸宸紝閬垮厤鍋忓樊寰椾笉鍒板強鏃朵慨姝h�岄�犳垚澶у亸宸紝鐢氳嚦杩疯埅銆� + </p> + <h4 id="d053" class="p-even unit3-c">涓夈�佺幇浠i鏈虹殑瀵艰埅璁惧绯荤粺</h4> + <p class="p-even"> + 鐜颁唬椋炴満鐢ㄥ厛杩涚殑瀵艰埅璁惧绯荤粺鍙栦唬浜嗕紶缁熺殑棰嗚埅鏂瑰紡锛屽鑸澶囩郴缁熸槸鐢卞湴闈㈠鑸鏂藉拰鏈鸿浇瀵艰埅璁惧鍏卞悓缁勬垚鐨勩�傚湪姘戣埅椋炴満涓婂箍涔夌殑鏈鸿浇瀵艰埅璁惧鍖呮嫭锛氱綏鐩樼郴缁熴�佺敋楂橀鍏ㄥ悜淇℃爣绯荤粺銆佷华琛ㄧ潃闄嗙郴缁熴�佹棤绾跨數楂樺害琛ㄣ�佹祴璺濇満浠ュ強姘旇薄闆疯揪绛夈�� + </p> + </div> + </div> + </div> + <!-- 153椤� --> + <div class="page-box" page="161"> + <div v-if="showPageList.indexOf(161) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">153</li> + </ul> + <div class="bodystyle"> + <h5 id="e063" class="p-odd unit3-c">锛堜竴锛変紶缁熺殑瀵艰埅璁惧绯荤粺</h5> + <p class="p-odd"> + 浼犵粺鐨勫湴闈㈠鑸鏂藉鐩椋炶鏉ヨ锛屼富瑕佹槸鎸囨満鍦轰笂鐨勫悇绉嶆爣蹇楀拰鎸囨尌鏃楀笢銆備负浜嗕繚闅滈鏈虹殑澶滈棿椋炶锛屼竴鑸湪鏈哄満鍜屾満鍦洪檮杩戠殑鑸矾涓婂缓鏈夌伅鍏夋爣蹇楋紝浣块鏈哄湪澶滈棿鎸夌収涓�瀹氱殑鐏厜鎸囩ず鐫�闄嗘垨璧烽銆�</p> + <p class="p-odd"> + 20涓栫邯30骞翠唬锛屾棤绾跨數鐢ㄥ湪瀵艰埅棰嗗煙锛屽紑濮嬩簡浠〃椋炶鏃朵唬銆傞琛屽憳鐢ㄦ棤绾跨數浠〃鏉ュ噯纭湴纭畾椋炴満涓庡湴闈㈡棤绾跨數鍙戝皠鍙扮殑鏂逛綅鍜岃窛绂伙紝浠庤�屽疄鐜版部鐫�鑸矾鐐圭殑淇℃爣瀹屾垚椋炶銆傚湪鐢ㄧ殑鍦伴潰瀵艰埅璁炬柦涓昏鏈変互涓嬪嚑涓�� + </p> + <h6 id="f021" class="p-odd">1.鎸囩偣淇℃爣</h6> + <p class="p-odd"> + 鎸囩偣淇℃爣鍙帮紙MB锛夋槸浣庡姛鐜囩殑鏃犵嚎鐢靛彂灏勫彴锛屽畠瀹夌疆鍦ㄨ埅璺殑鍥哄畾鐐逛笂锛屽瀭鐩村悜涓婂彂鍑虹壒瀹氱殑缂栫爜淇℃伅銆傞鏈哄彧鏈夌粡杩囧畠涓婄┖鏃讹紝鎵嶈兘鏀跺埌瀹冪殑淇″彿锛岄琛屽憳浠ユ鏉ョ‘瀹氶鏈哄湪鑸矾涓婄殑鍑嗙‘浣嶇疆銆�</p> + <h6 id="f022" class="p-odd">2.鏃犳柟鍚戞�т俊鏍囧彴</h6> + <p class="p-odd"> + 鏃犳柟鍚戞�т俊鏍囧彴涔熺О涓轰腑娉㈠鑸彴锛圢DB锛夈�傛棤鏂瑰悜鎬т俊鏍囧彴鍙戝皠鍗曚竴鐨勪腑闀挎尝锛岄鏈轰笂鐨勮嚜鍔ㄥ畾鍚戜华锛圓DF锛夋帴鏀惰繖涓俊鍙枫�傝嚜鍔ㄥ畾鍚戜华鐨勬棆杞幆褰㈠ぉ绾垮湪姝e鏃犵嚎鐢靛彴鏃朵俊鍙锋渶寮憋紝杩欐椂閫氳繃鐢靛瓙绾胯矾浣垮ぉ绾胯嚜鍔ㄩ攣瀹氬湪杩欎釜鏂瑰悜涓婏紝灏卞彲浠ユ祴鍑洪鏈哄浜庤繖涓俊鏍囩殑鏂逛綅锛屽埄鐢ㄦ棤绾跨數鍏ㄧ綏鐩樻寚绀哄嚭鏉ャ�傚埄鐢ㄤ竴涓棤鏂瑰悜鎬т俊鏍囧彴锛岄琛屽憳鍙兘纭畾椋炴満鐨勬柟浣嶏紝濡傛灉娴嬪畾鍑虹浉瀵逛簬涓や釜鏃犳柟鍚戞�т俊鏍囧彴鐨勬柟浣嶏紝杩欎袱鏉℃柟浣嶇嚎鐨勪氦鐐瑰氨鏄鏈虹殑浣嶇疆銆傝繖鏍峰氨鍙互鐢ㄦ棤鏂瑰悜鎬т俊鏍囧彴纭畾椋炴満鐨勪綅缃�� + </p> + <h6 id="f023" class="p-odd">3.鐢氶珮棰戝叏鍚戜俊鏍囩郴缁�</h6> + <p class="p-odd"> + 鐢氶珮棰戝叏鍚戜俊鏍囩郴缁燂紙VOR锛夋槸涓�绉嶆棤绾跨數娴嬪悜绯荤粺銆傚畠鐢辨満杞界殑鍏ㄥ悜淇℃爣鎺ユ敹鏈哄拰鍦伴潰鐨勫叏鍚戜俊鏍囧彴缁勬垚銆傚叏鍚戜俊鏍囧彴娌胯埅璺竷缃紝椋炴満涓婄殑鎺ユ敹鏈烘敹鍒颁俊鍙峰氨鍙互寰楀嚭鐩稿鍙戝皠鍙扮殑鏂逛綅瑙掞紝娴嬪嚭鐨勬柟浣嶈鍦ㄦ棤绾跨數鎸囩ず鍣ㄤ笂鏄剧ず鍑烘潵銆傚叾宸ヤ綔棰戞涓�108.10M锝�117.90MHz鐨勭敋楂橀娈碉紝鏁呮寰楀悕銆傜敋楂橀鍏ㄥ悜淇℃爣鍙戝皠鏈哄彂閫佺殑淇″彿鏈変袱涓細涓�涓槸鐩镐綅鍥哄畾鐨勫熀鍑嗕俊鍙凤紱鍙︿竴涓俊鍙风殑鐩镐綅闅忕潃鍥寸粫淇℃爣鍙扮殑鍦嗗懆瑙掑害鏄繛缁彉鍖栫殑锛屼篃灏辨槸璇村悇涓搴﹀彂灏勭殑淇″彿鐨勭浉浣嶉兘鏄笉鍚岀殑銆傚悜0掳锛堟寚鍚戠鍖楁瀬锛夊彂灏勭殑涓庡熀鍑嗕俊鍙锋槸鍚岀浉鐨勶紙鐩镐綅宸负0掳锛夛紝鑰屽悜180掳锛堟寚鍚戠鍗楁瀬锛夊彂灏勭殑淇″彿涓庡熀鍑嗕俊鍙风浉浣嶅樊180掳銆� + </p> + </div> + </div> + </div> + <!-- 154椤� --> + <div class="page-box" page="162"> + <div v-if="showPageList.indexOf(162) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">154</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 鍦ㄩ鏈虹殑鎺ユ敹鏈轰笂锛屼粠鎺ユ敹鍒颁俊鍙风殑灏勯棰戠巼鍙互纭畾瀹冩槸鏉ヨ嚜鍝竴涓敋楂橀鍏ㄥ悜淇℃爣鍙般�傞鏈轰笂鐨勭敋楂橀鍏ㄥ悜淇℃爣鎺ユ敹鏈烘牴鎹墍鏀跺埌鐨勪袱涓俊鍙风殑鐩镐綅宸氨鍙互璁$畻鍑洪鏈虹浉瀵逛簬鐢氶珮棰戝叏鍚戜俊鏍囧彴鐨勬柟浣嶃��</p> + <p class="p-even"> + 鐢氶珮棰戝叏鍚戜俊鏍囧彧鑳藉悜椋炴満鎻愪緵鏂瑰悜淇℃伅锛屼笉鑳界粰鍑洪鏈轰笌瀵艰埅鍙颁箣闂寸殑璺濈銆傚洜姝わ紝鐢氶珮棰戝叏鍚戜俊鏍囬�氬父涓庢祴璺濅华锛圖ME锛夊悓鍧�瀹夎锛屽湪鎻愪緵缁欓鏈烘柟鍚戜俊鎭殑鍚屾椂锛岃繕鑳芥彁渚涢鏈哄埌瀵艰埅鍙扮殑璺濈淇℃伅锛岃繖鏍烽鏈虹殑浣嶇疆灏卞彲浠ヨ纭畾涓嬫潵浜嗐�傜敋楂橀鍏ㄥ悜淇℃爣鍑虹幇浜庣浜屾涓栫晫澶ф垬涔嬪悗锛�1949骞磋鍥介檯姘戣埅缁勭粐閫変负鍥介檯瀵艰埅鏍囧噯璁惧锛屽畠鏄笘鐣屼笂澶ч儴鍒嗗湴鍖虹殑涓昏鑸嚎瀵艰埅璁惧銆� + </p> + <h6 id="f024" class="p-even">4.娴嬭窛浠郴缁�</h6> + <p class="p-even"> + 娴嬭窛浠郴缁熺殑鐩殑鏄娇椋炴満閫氳繃娴嬮噺瀹冨拰娴嬭窛鍙颁箣闂磋剦鍐茬數娉㈠線杩旂殑鏃堕棿鏉ユ祴鍑洪鏈哄埌娴嬭窛鍙扮殑璺濈銆傛祴璺濅华绯荤粺鐢遍鏈轰笂瀹夎鐨勮闂満鍜屽湴闈㈢珯鍙颁笂鐨勫簲绛旀満缁勬垚銆傛満涓婄殑璇㈤棶鏈哄悜鍦伴潰鍙戝嚭涓や釜涓�缁勭殑鑴夊啿瀵癸紝鑴夊啿瀵瑰埌杈惧湴闈㈢珯鍙帮紝鍦伴潰绔欏彴涓婄殑搴旂瓟鏈鸿瑙﹀彂锛屽簲绛旀満闅忓嵆鍥為�佷竴涓紪鐮佺殑鑴夊啿淇″彿锛屾満涓婄殑鎺ユ敹鏈烘敹鍒颁俊鍙峰悗娴嬮噺鍑哄彂灏勫強鏀跺埌鑴夊啿瀵圭殑鏃堕棿闂撮殧锛岀敱姝ゆ祴鍑洪鏈哄埌鍦伴潰绔欏彴鐨勭洿绾胯窛绂汇�� + </p> + <h5 id="e064" class="p-even">锛堜簩锛夌幇浠e鑸郴缁�</h5> + <p class="p-even"> + 鐜颁唬瀵艰埅绯荤粺涓昏鏈夋儻鎬у鑸郴缁熷拰鍗槦瀵艰埅绯荤粺銆傛皯鑸鏈虹敤寰楄緝澶氱殑鏄崼鏄熷鑸郴缁燂紝鍗槦瀵艰埅鏄�20涓栫邯80骞翠唬鍚庢湡杩呴�熸帹骞跨殑瀵艰埅鏂规硶锛屽畠鐨勫嚭鐜颁娇鏁翠釜瀵艰埅绯荤粺鍙戠敓浜嗛潻鍛芥�х殑鍙樺寲銆傚湪鐢ㄧ殑涓昏鏈夌編鍥界殑鍏ㄧ悆瀹氫綅绯荤粺銆佷縿缃楁柉鐨勬牸娲涚撼鏂叏鐞冨崼鏄熷鑸郴缁熷拰鎴戝浗鐨勫寳鏂楀崼鏄熷鑸郴缁熴�� + </p> + <h6 id="f025" class="p-even">1.鎯�у鑸郴缁�</h6> + <p class="p-even"> + 鎯�у鑸郴缁燂紙绠�绉版儻瀵硷紝INS锛夋槸涓�绉嶄笉闇�瑕佸閮ㄤ俊鎭敮鎸併�佷笉鍚戝閮ㄥ彂灏勪俊鍙风殑鑷富寮忓鑸郴缁熴�傛儻鎬у鑸郴缁熷伐浣滆捣鏉ユ湁寰堝ソ鐨勭嫭绔嬫�у拰闅愯斀鎬э紝琚啗鐢ㄩ鏈恒�佸啗鐢ㄨ埌鑸圭瓑骞挎硾閲囩敤銆傛儻鎬у鑸郴缁熶笉浠呰兘鍦ㄥ寘鎷┖涓�佸湴闈㈢殑鐜閲岀嫭绔嬭嚜涓诲湴宸ヤ綔锛岃繕鍙互鍦ㄦ按涓嬪彲闈犲湴宸ヤ綔銆� + </p> + <p class="p-even">鎯�у鑸郴缁熺殑宸ヤ綔鍘熺悊浠ョ墰椤垮姏瀛﹀畾寰嬩负鍩虹锛岄�氳繃娴嬮噺鐗╀綋鍦ㄦ儻鎬у弬鑰冪郴涓殑鍔犻�熷害锛屽皢瀹冨鏃堕棿杩涜绉垎锛屼笖鎶婂畠鍙樻崲鍒板鑸潗鏍囩郴 + </p> + </div> + </div> + </div> + <!-- 155椤� --> + <div class="page-box" page="163"> + <div v-if="showPageList.indexOf(163) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">155</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 涓紝灏辫兘澶熷緱鍒板湪瀵艰埅鍧愭爣绯讳腑鐨勯�熷害銆佸亸鑸鍜屼綅缃瓑淇℃伅锛屽湪棰勫厛鍌ㄥ瓨鐨勫湴鍥句笂杩涜鎺ㄧ畻锛屽氨鍙緱鍑虹墿浣撶殑浣嶇疆淇℃伅锛屽洜姝ゅ睘浜庢帹绠楀鑸柟寮忋�傚伐浣滄椂锛屼粠涓�涓凡鐭ョ偣鐨勪綅缃牴鎹繛缁祴寰楃殑鐗╀綋鑸悜瑙掑拰閫熷害鎺ㄧ畻鍑轰笅涓�鐐圭殑浣嶇疆锛屽洜鑰屽彲杩炵画娴嬪嚭鐗╀綋鐨勫綋鍓嶄綅缃�傛儻鎬у鑸郴缁熶腑鐨勯檧铻轰华鐢ㄦ潵褰㈡垚涓�涓鑸潗鏍囩郴锛屼娇鍔犻�熷害璁$殑娴嬮噺杞寸ǔ瀹氬湪璇ュ潗鏍囩郴涓紝骞剁粰鍑鸿埅鍚戝拰濮挎�佽锛涘姞閫熷害璁$敤鏉ユ祴閲忚繍鍔ㄤ綋鐨勫姞閫熷害锛岀粡杩囧鏃堕棿鐨勪竴娆$Н鍒嗗緱鍒伴�熷害锛岄�熷害鍐嶇粡杩囧鏃堕棿鐨勪竴娆$Н鍒嗗嵆鍙緱鍒拌窛绂汇�� + </p> + <p class="p-odd">鎯�у鑸郴缁熸湁濡備笅涓昏浼樼偣銆�</p> + <p class="p-odd">绗竴锛岀敱浜庢儻鎬у鑸郴缁熸槸涓嶉渶瑕佷换浣曞閮ㄤ俊鎭殑鏀寔锛屼篃涓嶅悜澶栭儴鍙戝皠鐢电娉㈢殑鑷富寮忕郴缁燂紝鏁呴殣钄芥�уソ銆佷笉鏄撳彈澶栫晫鐢电骞叉壈銆�</p> + <p class="p-odd">绗簩锛屾儻鎬у鑸郴缁熷彲鍏ㄥぉ鍊欍�佸叏鐞冦�佸叏鏃堕棿鍦板伐浣滀簬绌轰腑銆佸湴闈㈢敋鑷虫按涓嬶紝閫氱敤鎬уソ銆�</p> + <p class="p-odd">绗笁锛屾儻鎬у鑸郴缁熻兘鎻愪緵浣嶇疆銆侀�熷害銆佽埅鍚戝拰濮挎�佽鏁版嵁锛屾墍浜х敓鐨勫鑸俊鎭繛缁�уソ鑰屼笖鍣0浣庛��</p> + <p class="p-odd">绗洓锛屾儻鎬у鑸郴缁熸暟鎹洿鏂扮巼楂樸�佺煭鏈熺簿搴﹀拰绋冲畾鎬уソ銆�</p> + <p class="p-odd">鎯�у鑸郴缁熸湁濡備笅涓昏缂虹偣銆�</p> + <p class="p-odd">绗竴锛岀敱浜庡鑸俊鎭槸缁忚繃绉垎璁$畻寰楀嚭鐨勶紝瀹氫綅璇樊闅忔椂闂磋�屽澶э紝闀挎湡绮惧害浣庛��</p> + <p class="p-odd">绗簩锛屾瘡娆′娇鐢ㄤ箣鍓嶉渶瑕佽姳璐硅緝闀跨殑鏃堕棿杩涜鍒濆瀵瑰噯銆�</p> + <p class="p-odd">绗笁锛岃澶囩殑浠锋牸杈冩槀璐点��</p> + <p class="p-odd">绗洓锛屼笉鑳界粰鍑烘椂闂翠俊鎭��</p> + <h6 id="f026" class="p-odd">2.鍏ㄧ悆瀹氫綅绯荤粺</h6> + <div class="img-rights w200 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0167-1.jpg" /> + <p class="img">鍥�3-16 GPS瀵艰埅鍗槦</p> + </div> + <span> + <p class="p-odd">GPS鏄叏鐞冨畾浣嶇郴缁燂紙global positioning + system锛夌殑绠�绉帮紝涓枃绠�绉颁负鈥滅悆浣嶇郴鈥濄�侴PS鏄�20涓栫邯70骞翠唬缇庡浗闄嗐�佹捣銆佺┖涓夊啗鑱斿悎鐮斿埗鐨勫崼鏄熷鑸畾浣嶇郴缁熴�傚叾涓昏鏄负闄嗐�佹捣銆佺┖涓夊ぇ鍐涗簨棰嗗煙鎻愪緵瀹炴椂銆佸叏澶╁�欏拰鍏ㄧ悆鎬х殑瀵艰埅鏈嶅姟锛屽苟鐢ㄤ簬鎯呮姤鏀堕泦銆佹牳鐖嗙洃娴嬪拰搴旀�ラ�氫俊绛夊啗浜嬬洰鐨勩�傜粡杩�20浣欏勾鐨勭爺绌跺疄楠岋紝鑰楄祫300浜跨編鍏冿紝鍒�1994骞�3鏈堬紝鍏ㄧ悆瑕嗙洊鐜囬珮杈�98%鐨�24棰桮PS鍗槦宸插竷璁惧畬鎴愶紙鍥�3-16锛夈�� + </p> + </span> + </div> + </div> + </div> + <!-- 156椤� --> + <div class="page-box" page="164"> + <div v-if="showPageList.indexOf(164) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">156</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even">GPS鐢辩┖闂撮儴鍒嗐�佸湴闈㈤儴鍒嗗拰鐢ㄦ埛璁惧閮ㄥ垎鏋勬垚銆�</p> + <p class="p-even"> + GPS鐨勭┖闂撮儴鍒嗙敱24棰楀伐浣滃崼鏄熺粍鎴愶紝瀹冧滑浣嶄簬璺濆湴鐞冭〃闈�20200km鐨勫悓姝ヨ建閬撲笂锛屽潎鍖�鍦板垎甯冨湪6涓建閬撻潰涓婏紙姣忎釜杞ㄩ亾闈�4棰楋級锛岃建閬撳�捐涓�55掳銆傛澶栵紝杩樻湁3棰楁湁婧愬浠藉崼鏄熷湪杞ㄨ繍琛屻�傚崼鏄熺殑鍒嗗竷浣垮緱鍦ㄥ叏鐞冧换浣曞湴鏂广�佷换浣曟椂闂撮兘鍙娴嬪埌4棰椾互涓婄殑鍗槦锛屽苟鑳藉湪鍗槦涓瀛樺鑸俊鎭�� + </p> + <p class="p-even">GPS鐨勫湴闈㈤儴鍒嗘槸鎸囧湴闈㈡帶鍒剁郴缁燂紝鐢辩洃娴嬬珯锛坢onitor station锛夈�佷富鎺у埗绔欙紙master monitor station锛夈�佸湴闈㈠ぉ绾匡紙ground + antenna锛夌粍鎴愩�備富鎺у埗绔欎綅浜庣編鍥界缃楁媺澶氬窞鏄ョ敯甯傦紝鍦伴潰鎺у埗绔欒礋璐f敹闆嗙敱鍗槦浼犲洖鐨勪俊鎭紝骞惰绠楀崼鏄熸槦鍘嗐�佺浉瀵硅窛绂汇�佸ぇ姘旀牎姝g瓑鏁版嵁銆�</p> + <div class="img-float w180 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0168-1.jpg" /> + <p class="img">鍥�3-17 GPS浣嶇疆鏄剧ず</p> + </div> + <span> + <p class="p-even"> + GPS鐨勭敤鎴疯澶囬儴鍒嗗嵆GPS淇″彿鎺ユ敹鏈猴紝鍏朵富瑕佸姛鑳芥槸鎹曡幏鎸変竴瀹氬崼鏄熸埅姝㈣鎵�閫夋嫨鐨勫緟娴嬪崼鏄燂紝骞惰窡韪繖浜涘崼鏄熺殑杩愯銆傛帴鏀舵満鎹曡幏鍒拌窡韪殑鍗槦淇″彿鍚庯紝灏卞彲娴嬮噺鍑烘帴鏀跺ぉ绾胯嚦鍗槦鐨勮窛绂诲拰璺濈鐨勫彉鍖栫巼锛岃В璋冨嚭鍗槦杞ㄩ亾鍙傛暟绛夋暟鎹�傛牴鎹繖浜涙暟鎹紝鎺ユ敹鏈轰腑鐨勫井澶勭悊璁$畻鏈哄氨鍙寜瀹氫綅瑙g畻鏂规硶杩涜瀹氫綅璁$畻锛岃绠楀嚭鐢ㄦ埛鎵�鍦ㄥ湴鐞嗕綅缃殑缁忕含搴︺�侀珮搴︺�侀�熷害銆佹椂闂寸瓑淇℃伅銆侴PS浣嶇疆鏄剧ず濡傚浘3-17鎵�绀恒�� + </p> + <p class="p-even">GPS鐨勫熀鏈師鐞嗘槸娴嬮噺鍑哄凡鐭ヤ綅缃殑鍗槦鍒扮敤鎴锋帴鏀舵満涔嬮棿鐨勮窛绂伙紝鐒跺悗缁煎悎澶氶鍗槦鐨勬暟鎹氨鍙煡閬撴帴鏀舵満鐨勫叿浣撲綅缃簡銆�</p> + </span> + <p class="p-even"> + GPS鏈夐珮绮惧害銆佸叏澶╁�欍�侀珮鏁堢巼銆佸鍔熻兘銆佹搷浣滅畝渚裤�佸簲鐢ㄥ箍娉涚瓑涓昏鐗圭偣锛屼娇涔嬪湪闄嗗湴銆佹捣娲嬪拰鑸┖鑸ぉ棰嗗煙閮芥湁骞挎硾搴旂敤銆傞檰鍦板簲鐢ㄦ柟闈富瑕佸寘鎷溅杈嗗鑸�佸簲鎬ュ弽搴斻�佸ぇ姘旂墿鐞嗚娴嬨�佸湴鐞冪墿鐞嗚祫婧愬嫎鎺€�佸伐绋嬫祴閲忋�佸彉褰㈢洃娴嬨�佸湴澹宠繍鍔ㄧ洃娴嬨�佸競鏀胯鍒掓帶鍒剁瓑銆傛捣娲嬪簲鐢ㄤ富瑕佸寘鎷繙娲嬭埞鏈�浣宠埅绋嬭埅绾挎祴瀹氥�佽埌鑸瑰疄鏃惰皟搴︿笌瀵艰埅銆佹捣娲嬫晳鎻淬�佹捣娲嬫帰瀹濄�佹按鏂囧湴璐ㄦ祴閲忎互鍙婃捣娲嬪钩鍙板畾浣嶃�佹捣骞抽潰鍗囬檷鐩戞祴绛夈�傝埅绌鸿埅澶╁簲鐢ㄤ富瑕佸寘鎷鏈哄鑸�佽埅绌洪仴鎰熷Э鎬佹帶鍒躲�佷綆杞ㄥ崼鏄熷畾杞ㄣ�佸寮瑰埗瀵笺�佽埅绌烘晳鎻村拰杞戒汉鑸ぉ鍣ㄩ槻鎶ゆ帰娴嬬瓑銆� + </p> + <h6 id="f027" class="p-even">3.鏍兼礇绾虫柉鍏ㄧ悆鍗槦瀵艰埅绯荤粺</h6> + <p class="p-even">鏍兼礇绾虫柉鍏ㄧ悆鍗槦瀵艰埅绯荤粺锛圙LONASS锛夋槸鑻忚仈鍥介槻閮ㄧ嫭绔嬬爺鍒跺拰鎺у埗鐨勭浜屼唬鍐涚敤鍗槦瀵艰埅绯荤粺銆備笌缇庡浗鐨凣PS鐩镐技锛岃绯荤粺涔熷紑璁炬皯鐢ㄧ獥鍙c�� + </p> + </div> + </div> + </div> + <!-- 157椤� --> + <div class="page-box" page="165"> + <div v-if="showPageList.indexOf(165) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰涓�</li> + <li class="headerText">棰嗚埅涓庢皵璞�</li> + <li class="headerNumber">157</li> + </ul> + <div class="bodystyle"> + <div class="img-rights w280 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0169-1.jpg" /> + <p class="img">鍥�3-18 鏍兼礇绾虫柉鍏ㄧ悆鍗槦瀵艰埅绯荤粺瀵艰埅鍗槦</p> + </div> + <span> + <p><br></p> + <p class="p-odd td-0">鏍兼礇绾虫柉鍏ㄧ悆鍗槦瀵艰埅绯荤粺鎶�鏈彲涓哄叏鐞冩捣銆侀檰銆佺┖浠ュ強杩戝湴绌洪棿鐨勫悇绉嶅啗銆佹皯鐢ㄦ埛鍏ㄥぉ鍊欍�佽繛缁湴鎻愪緵楂樼簿搴︾殑涓夌淮浣嶇疆銆佷笁缁撮�熷害鍜屾椂闂翠俊鎭��</p> + <p class="p-odd">鏍兼礇绾虫柉鍏ㄧ悆鍗槦瀵艰埅绯荤粺鏍囧噯閰嶇疆涓�24棰楀崼鏄燂紙鍥�3-18锛夛紝鍖呮嫭21棰楀伐浣滄槦鍜�3棰楀浠芥槦锛屽垎甯冧簬3涓渾褰㈣建閬撻潰涓婏紝杞ㄩ亾楂樺害19100km锛屽�捐64.8掳銆� + </p> + </span> + <h6 id="f028" class="p-odd">4.鍖楁枟鍗槦瀵艰埅绯荤粺</h6> + <p class="p-odd">鍖楁枟鍗槦瀵艰埅绯荤粺锛圔eiDou navigation satellite + system锛孊DS锛夋槸鎴戝浗鑷鐮斿埗鐨勫叏鐞冨崼鏄熷鑸郴缁燂紝鏄户缇庡浗鍏ㄧ悆瀹氫綅绯荤粺銆佷縿缃楁柉鏍兼礇绾虫柉鍗槦瀵艰埅绯荤粺涔嬪悗鐨勭涓変釜鎴愮啛鐨勫崼鏄熷鑸郴缁熴�傚寳鏂楀崼鏄熷鑸郴缁熷拰缇庡浗鍏ㄧ悆瀹氫綅绯荤粺銆佷縿缃楁柉鏍兼礇绾虫柉鍗槦瀵艰埅绯荤粺銆佹鐩熶冀鍒╃暐鍗槦瀵艰埅绯荤粺锛屾槸鑱斿悎鍥藉崼鏄熷鑸鍛樹細璁ゅ畾鐨勪緵搴斿晢銆� + </p> + <p class="p-odd"> + 鍖楁枟鍗槦瀵艰埅绯荤粺鐢辩┖闂存銆佸湴闈㈡鍜岀敤鎴锋涓夐儴鍒嗙粍鎴愶紝鍙湪鍏ㄧ悆鑼冨洿鍐呭叏澶╁�欍�佸叏澶╂椂涓哄悇绫荤敤鎴锋彁渚涢珮绮惧害銆侀珮鍙潬鐨勫畾浣嶃�佸鑸�佹巿鏃舵湇鍔★紝骞朵笖鍏峰鐭姤鏂囬�氫俊鑳藉姏锛屽凡缁忓垵姝ュ叿澶囧尯鍩熷鑸�佸畾浣嶅拰鎺堟椂鑳藉姏锛屽畾浣嶇簿搴︿负鍒嗙背銆佸帢绫崇骇鍒紝娴嬮�熺簿搴�0.2m/s锛屾巿鏃剁簿搴�10ns銆� + </p> + <p class="p-odd"> + 2020骞�7鏈�31鏃ヤ笂鍗堬紝鍖楁枟涓夊彿鍏ㄧ悆鍗槦瀵艰埅绯荤粺姝e紡寮�閫氥�傚寳鏂楃郴缁熸彁渚涙湇鍔′互鏉ワ紝宸插湪浜ら�氳繍杈撱�佸啘鏋楁笖涓氥�佹按鏂囩洃娴嬨�佹皵璞℃祴鎶ャ�侀�氫俊鎺堟椂銆佺數鍔涜皟搴︺�佹晳鐏惧噺鐏俱�佸叕鍏卞畨鍏ㄧ瓑棰嗗煙寰楀埌骞挎硾搴旂敤锛屾湇鍔″浗瀹堕噸瑕佸熀纭�璁炬柦锛屼骇鐢熶簡鏄捐憲鐨勭粡娴庢晥鐩婂拰绀句細鏁堢泭銆� + </p> + <p class="p-odd"> + 鍖楁枟鍗槦瀵艰埅绯荤粺绉夋壙鈥滀腑鍥界殑鍖楁枟銆佷笘鐣岀殑鍖楁枟銆佷竴娴佺殑鍖楁枟鈥濆彂灞曠悊蹇碉紝涓庝笘鐣屽悇鍥藉叡浜寳鏂楀崼鏄熷鑸郴缁熷缓璁惧彂灞曟垚鏋滐紝淇冭繘鍏ㄧ悆鍗槦瀵艰埅浜嬩笟钃媰鍙戝睍锛屼负鏈嶅姟鍏ㄧ悆銆侀�犵浜虹被璐$尞涓浗鏅烘収鍜屽姏閲忋�傚寳鏂楀崼鏄熷鑸郴缁熶负缁忔祹绀句細鍙戝睍鎻愪緵閲嶈鏃剁┖淇℃伅淇濋殰锛屾槸鎴戝浗瀹炴柦鏀归潻寮�鏀�40浣欏勾鏉ュ彇寰楃殑閲嶈鎴愬氨涔嬩竴锛屾槸鏂颁腑鍥芥垚绔�70澶氬勾鏉ラ噸澶х鎶�鎴愬氨涔嬩竴锛屾槸涓浗璐$尞缁欎笘鐣岀殑鍏ㄧ悆鍏叡鏈嶅姟浜у搧銆傛垜鍥藉皢涓�濡傛棦寰�鍦扮Н鏋佹帹鍔ㄥ浗闄呬氦娴佷笌鍚堜綔锛屽疄鐜颁笌涓栫晫鍏朵粬鍗槦瀵艰埅绯荤粺鐨勫吋瀹逛笌浜掓搷浣滐紝涓哄叏鐞冪敤鎴锋彁渚涙洿楂樻�ц兘銆佹洿鍔犲彲闈犲拰鏇村姞涓板瘜鐨勬湇鍔°�傚寳鏂楀崼鏄熷鑸郴缁熷湪鑸� + </p> + + </div> + </div> + </div> + <!-- 158椤� --> + <div class="page-box" page="166"> + <div v-if="showPageList.indexOf(166) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">158</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">绌洪鍩熷緱鍒颁簡骞挎硾搴旂敤锛屽鑸矾瀵艰埅銆佹満鍦哄満闈㈢洃鎺с�佺簿瀵嗚繘杩戠瓑銆�</p> + <p class="p-even">閫氳繃鏈」鐩殑瀛︿範锛屾垜浠厖鍒嗘剰璇嗗埌浜嗛鑸椋炴満椋炶鐨勯噸瑕佹�с�備綔涓烘湭鏉ョ殑姘戣埅鑱屽満浜猴紝鎴戜滑瑕佹爲绔嬫纭殑浜虹敓鐩爣锛屽苟涓轰箣鍔姏濂嬫枟锛屾渶缁堝疄鐜拌嚜宸辩殑浜虹敓浠峰�笺��</p> + <h2 id="b004" class="p-even"><img class="inline1" alt="" src="../../assets/images/tzyy.jpg" /></h2> + <p class="block p-even td-0">1.澶ф皵灞傜殑鏋勬垚鏈夊摢浜涳紵</p> + <textarea v-model="expandQuestion.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'one' }" @focus="handleFocus('one')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">2.褰卞搷椋炴満椋炶鐨勪富瑕佹皵璞″洜绱犳湁鍝簺锛�</p> + <textarea v-model="expandQuestion.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'two' }" @focus="handleFocus('two')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">3.浜戝椋炶鐨勫奖鍝嶄富瑕佹湁鍝簺锛�</p> + <textarea v-model="expandQuestion.reading.three" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'three' }" @focus="handleFocus('three')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">4.闄嶆按瀵归琛岀殑褰卞搷涓昏鏈夊摢浜涳紵</p> + <textarea v-model="expandQuestion.reading.four" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'four' }" @focus="handleFocus('four')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">5.椋炴満绉啺鍙兘閫犳垚浠�涔堟牱鐨勫嵄瀹筹紵</p> + <textarea v-model="expandQuestion.reading.five" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'five' }" @focus="handleFocus('five')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">6.浠�涔堟槸棰嗚埅锛熼鑸湪椋炶涓墍璧风殑浣滅敤鏄粈涔堬紵</p> + <textarea v-model="expandQuestion.reading.six" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'six' }" @focus="handleFocus('six')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">7.浠�涔堟槸鑸悜绾匡紵浠�涔堟槸鑸悜锛�</p> + <textarea v-model="expandQuestion.reading.seven" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'seven' }" @focus="handleFocus('seven')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">8.鍒椾妇浣犳墍鐭ラ亾鐨勯琛岄珮搴︾绫汇��</p> + <textarea v-model="expandQuestion.reading.eight" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'eight' }" @focus="handleFocus('eight')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">9.绌洪�熷拰鍦伴�熸湁浣曞尯鍒紵</p> + <textarea v-model="expandQuestion.reading.nine" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'nine' }" @focus="handleFocus('nine')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">10.鍦ㄦ湁渚ч鐨勬儏鍐典笅锛岄鏈烘満澶存瀵归瀹氬湴鐐归琛岋紝鑳藉惁椋炲埌棰勫畾鍦扮偣涓婄┖锛熷鏈夊亸鑸紝椋炴満灏嗗亸鍚戝摢涓柟鍚戯紵</p> + <textarea v-model="expandQuestion.reading.ten" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'ten' }" @focus="handleFocus('ten')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">11.鐜颁唬涓昏瀵艰埅绯荤粺鏈夊摢浜涳紵</p> + <textarea v-model="expandQuestion.reading.eleven" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'eleven' }" @focus="handleFocus('eleven')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">12.GPS瀵艰埅绯荤粺鐨勫熀鏈師鐞嗘槸浠�涔堬紵</p> + <textarea v-model="expandQuestion.reading.twelve" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'twelve' }" @focus="handleFocus('twelve')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">13.鍖楁枟鍗槦瀵艰埅绯荤粺鐢卞摢鍑犻儴鍒嗘瀯鎴愶紵</p> + <textarea v-model="expandQuestion.reading.thirteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'thirteen' }" @focus="handleFocus('thirteen')" + @blur="handleBlur()"></textarea> + </div> + </div> + </div> + </div> +</template> + +<script> +export default { + name: "chapterthree", + props: { + showPageList: { + type: Array, + }, + }, + data() { + return { + isFocused: null, + showChoiceAnswer: false, + singleChoice: [ + { + txt: "褰卞搷椋炴満璧烽檷鐨勭壒娈婂ぉ姘旀湁锛堛��銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: "", + answer: "D", + option: [ + { + zm: "A", + txt: "A.鎭跺姡鐨勮兘瑙佸害" + }, + { + zm: "B", + txt: "B.绉姸浜�" + }, + { + zm: "C", + txt: "C.闄嶆按" + }, + { + zm: "D", + txt: "D.浠ヤ笂鍧囨纭�" + }, + ] + }, + ], + expandQuestion: { + reading: { + one: "", + two: "", + three: "", + four: "", + five: "", + six: "", + seven: "", + eight: "", + nine: "", + ten: "", + eleven: "", + twelve: "", + thirteen: "", + }, + } + } + }, + mounted() { + const bookQuestion = localStorage.getItem("civilAviatyon-book-chapter03-expandQuestion"); + if (bookQuestion) { + this.expandQuestion = JSON.parse(bookQuestion); + } + + const singleChoice = localStorage.getItem("civilAviatyon-book-chapter03-singleChoice"); + if (singleChoice) { + this.singleChoice = JSON.parse(singleChoice); + } + }, + methods: { + handleFocus(id) { + this.isFocused = id; // 褰搕extarea鑱氱劍鏃讹紝璁剧疆涓簍rue + }, + handleBlur() { + this.isFocused = null; // 褰搕extarea澶卞幓鐒︾偣鏃讹紝璁剧疆涓篺alse + }, + setBookQuestion() { + localStorage.setItem( + "civilAviatyon-book-chapter03-expandQuestion", + JSON.stringify(this.expandQuestion) + ); + }, + goChoiceJudge(){ + this.singleChoice.forEach(item => { + item.isComplete = true; + if (item.userAnswer == item.answer) { + item.isRight = true; + } else { + item.isRight = false; + } + }); + this.showChoiceAnswer = true + }, + changeChoiceData(){ + localStorage.removeItem("civilAviatyon-book-chapter03-singleChoice") + this.singleChoice.forEach(item => { + item.isComplete = false; + item.isRight = null; + item.userAnswer = ""; + }); + this.showChoiceAnswer = false + }, + saveInputChoice(){ + localStorage.setItem( + "civilAviatyon-book-chapter03-singleChoice", + JSON.stringify(this.singleChoice) + ); + } + } +}; +</script> + +<style lang="less" scoped> +.body { + display: flex; +} + +.imgBox { + display: flex !important; + flex-direction: column-reverse !important; + position: relative !important; + + .img { + margin: 0 !important; + font-size: 16px !important; + position: absolute !important; + left: 40% !important; + bottom: -2% !important; + } + + img { + height: 80%; + } +} +</style> \ No newline at end of file diff --git a/src/books/civilAviation/view/components/chapter004.vue b/src/books/civilAviation/view/components/chapter004.vue new file mode 100644 index 0000000..b657bd5 --- /dev/null +++ b/src/books/civilAviation/view/components/chapter004.vue @@ -0,0 +1,463 @@ +<template> + <div class="chapter" num="5"> + <!-- 绗洓鍗曞厓灏侀潰 --> + <div class="page-box" style="min-height: 1108px !important" page="167"> + <div v-if="showPageList.indexOf(167) > -1" class="fl"> + <img class="img-0" alt="" src="../../assets/images/0171.jpg" /> + </div> + </div> + <!-- 160椤� --> + <div class="page-box" page="168"> + <div v-if="showPageList.indexOf(168) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">160</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h2 id="b003" class="p-even"> + <img class="inline1" alt="" src="../../assets/images/zszb.jpg" /> + </h2> + <h3 id="c001" class="p-even unit4-c"> + 瀛︿範浠诲姟涓�<br />姘戠敤鑸┖鍣ㄧ殑鍒嗙被鍜屽簲鐢� + </h3> + <div class="task-u4-c ma-l"></div> + <p class="p-even"> + 鍦ㄨ埅绌烘椿鍔ㄥ紑灞曞垵鏈燂紝椋炴満鏁伴噺鍜岄琛屾鏁伴兘寰堝皯锛屼汉浠皻鏈缓绔嬬┖涓氦閫氱鐞嗙殑姒傚康銆傞殢鐫�鑸┖鍟嗕笟椋炶鐨勫紑灞曪紝绌轰腑椋炶鐨勯鏈烘暟閲忚秺鏉ヨ秺澶氥�侀�熷害瓒婃潵瓒婂揩锛屼负浜嗕繚璇侀琛屽畨鍏ㄣ�佹湇鍔¤川閲忎笌椋炶姝e父鐜囷紝瑕佹眰椋炶娲诲姩鑳芥寜鐓т竴瀹氱殑瑙勫垯鏉ヨ繘琛岋紝鏈�鍒濇椤瑰伐浣滅О涓衡�滅┖涓氦閫氱鍒垛�濓紝鍚庢潵绉颁负鈥滅┖涓氦閫氱鐞嗏�濄�� + </p> + <h4 id="d054" class="p-even unit4-c">涓�銆佺┖涓氦閫氱鐞嗙殑鍙戝睍闃舵</h4> + <p class="p-even">绌轰腑浜ら�氱鐞嗗ぇ鑷寸粡鍘嗕簡鍥涗釜鍙戝睍闃舵銆�</p> + <p class="p-even"> + 绗竴闃舵锛�1934骞翠互鍓嶏級銆傝埅绌烘椿鍔ㄥ垵鏈燂紝鐢变簬椋炴満鏁伴噺寰堝皯锛屾病鏈夌┖涓氦閫氱鐞嗙殑姒傚康銆傞殢鐫�鍟嗕笟椋炶鐨勫紑濮嬶紝鑸┖杩愯緭娑夊強鐨勮寖鍥村拰浜哄憳瓒婃潵瓒婂锛屽洜鑰岃姹傞琛屾椿鍔ㄦ寜鐓т竴瀹氱殑瑙勫垯鏉ヨ繘琛屻��</p> + <p class="p-even">20涓栫邯30骞翠唬浠ュ墠锛岄鏈虹殑椋炶璺濈鍙湁鍑犵櫨鍗冪背锛岃�屼笖鍙兘鍦ㄦ樇闂村苟涓斿ぉ姘旀潯浠跺厑璁哥殑鎯呭喌涓嬮琛岋紝鍥犺�屾寜鐓х湅瑙佸拰鍙互鐪嬭鐨勫師鍒欏埗瀹氫簡鐩椋炶瑙勫垯銆�</p> + <p class="p-even"> + 20涓栫邯30骞翠唬鍚庢湡锛岄殢鐫�椋炴満椋炶鎬ц兘鐨勬彁楂樸�佹棤绾块�氫俊璁惧鍦ㄩ鏈轰笂鐨勪娇鐢ㄤ互鍙婂湴闈㈠鑸澶囩殑瀹夎锛岄琛屽憳鍙互鍦ㄧ湅涓嶅埌鍦版爣鍜屽叾浠栭鏈虹殑鎯呭喌涓嬭繘琛岄琛屻�傚湪绻佸繖鐨勬満鍦猴紝椋炴満娲诲姩閲忓緢澶э紝杩欏氨闇�瑕佹湁涓�涓鐞嗕汉鍛橈紙鍚庣О涓虹┖涓氦閫氱鍒跺憳锛岀畝绉扮鍒跺憳锛夛紝纭繚绌轰腑浜ら�氱殑瀹夊叏銆佹湁搴忚繍琛屻�傚綋鏃剁殑绠″埗鍛樺彧鏄敤绾㈡棗鍜岀豢鏃楁潵鎺у埗椋炴満鐨勮捣椋炲拰鐫�闄嗭紝浣嗗彈澶╂皵鍜屽闂寸殑褰卞搷锛屽緢蹇敱淇″彿鐏彇浠d簡淇″彿鏃楋紝鏈哄満鐨勬渶楂樺缓绛戠墿濉斿彴涔熺浉缁у缓绔嬨�傚湪1934骞村墠鍚庯紝鏈哄満瑁呭浜嗘棤绾跨數鏀跺彂鏈猴紝涓�浜涘ぇ鍨嬮鏈轰篃瑁呭浜嗛�氫俊璁惧锛岀鍒跺憳閫氳繃鏃犵嚎鐢靛拰椋炶鍛樿繘琛岄�氳瘽锛岀‘淇濆畨鍏ㄩ琛屻�� + </p> + </div> + </div> + </div> + <!-- 161椤� --> + <div class="page-box" page="169"> + <div v-if="showPageList.indexOf(169) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰鍥�</li> + <li class="headerText">绌轰腑浜ら�氱鐞�</li> + <li class="headerNumber">161</li> + </ul> + <div class="bodystyle"> + <p class="p-odd"> + 绗簩闃舵锛�1934鈥�1945骞达級銆傚湪1934骞村墠鍚庯紝鍑虹幇浜嗚浇瀹㈤噺鍦�20浜轰互涓娿�侀琛岄�熷害杈惧埌300km/h鐨勯鏈猴紝鏈轰笂瑁呭浜嗘棤绾跨數閫氫俊鍜屽鑸澶囷紝鍙娇椋炶鍛樺湪涓嶇敤鐪嬪埌鍦伴潰鐨勬儏鍐典笅鑳界‘瀹氶琛岀殑濮挎�併�傜洰瑙嗛琛岃鍒欏凡缁忓緢闅炬弧瓒抽渶瑕佷簡锛屽洜鑰屽悇鑸┖鍙戣揪鍥藉绾风悍鎴愮珛浜嗙┖涓氦閫氫富绠℃満鏋勶紝寤虹珛浜嗕娇鐢ㄤ华琛ㄨ繘琛屽畨鍏ㄩ琛岀殑瑙勫垯锛屽苟娌胯埅璺缓绔嬩簡鑸矾浜ら�氱鍒朵腑蹇冦�傝繖浜涚鍒跺崟浣嶇殑浠诲姟灏辨槸鎺ユ敹鍚勮埅绔欏彂鏉ョ殑椋炶璁″垝锛堝惈鍚庢潵鏇存柊鐨勫唴瀹癸級锛屽啀鏍规嵁椋炶鍛樼殑浣嶇疆鎶ュ憡灏嗗叾濉啓鍦ㄩ琛岃繘绋嬪崟涓婏紝鐒跺悗纭畾椋炴満闂寸殑鐩镐簰浣嶇疆鍏崇郴锛屽彂甯冩寚浠ゃ�佸疄鏂界鐞嗭紝杩欑绠″埗鏂规硶閫氬父绉颁负绋嬪簭绠″埗銆備笌姝ゅ悓鏃讹紝鍚勫浗鐨勮埅绌虹鐞嗗綋灞�閮藉缓绔嬩簡鐩稿簲鐨勮瀹氾紝骞跺缓绔嬭捣鍏ㄥ浗瑙勬ā鐨勮埅璺綉鍜岀浉瀵瑰簲鐨勬満鍦哄鍙般�佽繘杩戠鍒朵腑蹇冩垨鍖哄煙鑸矾绠″埗涓績銆備互绋嬪簭绠″埗涓烘牳蹇冪殑绌轰腑浜ら�氱鍒跺湪杩欎竴鏃舵湡褰㈡垚銆� + </p> + <p class="p-odd"> + 绗笁闃舵锛�1946骞磋嚦20涓栫邯80骞翠唬锛夈�傜浜屾涓栫晫澶ф垬甯︽潵浜嗚埅绌烘妧鏈殑椋炶穬锛岄鏈虹殑鑸▼鍔犻暱锛岃浇閲嶅拰閫熷害閮藉ぇ骞呭闀匡紝杩垏闇�瑕佷竴涓粍缁囪兘鎶婂叏涓栫晫鐨勮埅绌烘硶瑙勫ぇ浣撶粺涓�鍦ㄤ竴涓叡鍚岀殑鏍囧噯涔嬩笅銆傚湪姝よ儗鏅笅锛岄殢鐫�銆婅姖鍔犲摜鍏害銆嬫寮忕敓鏁堬紝1947骞存垚绔嬩簡鍥介檯姘戣埅缁勭粐銆傝繖涓椂鏈熺┖涓氦閫氱鍒舵湁涓や釜閲嶈鐨勮繘灞曘�� + </p> + <p class="p-odd"> + 涓�涓槸鍦�20涓栫邯50骞翠唬涓湡寮�濮嬫妸绗簩娆′笘鐣屽ぇ鎴樻湡闂村彂灞曡捣鏉ョ殑闆疯揪鎶�鏈簲鐢ㄤ簬绌轰腑浜ら�氱鍒堕鍩熴�傞殢鍚庡嚭鐜颁簡浜屾闆疯揪绯荤粺锛屽彲浠ュ湪绠″埗鍛樺睆骞曚笂鏄剧ず鍑洪鏈虹殑缂栧彿銆侀珮搴︺�侀�熷害绛夊弬鏁帮紝鍐嶅姞涓婇檰绌洪�氳瘽绯荤粺鐨勫彂灞曪紝淇冧娇閲嶈鐨勫湴鍖虹敤闆疯揪绠″埗鍙栦唬浜嗙郴缁熺殑绋嬪簭绠″埗銆傜浉姣斾簬绋嬪簭绠″埗锛岄浄杈剧鍒惰兘璁╃鍒跺憳闅忔椂鈥滅湅寰楀埌鈥濋鏈猴紝鍙婃椂鎺屾彙椋炶鍔ㄦ�併�傜鍒跺憳鍦ㄦ寚鎸ユ椂涓诲姩鎬ф洿寮恒�傚悓鏃讹紝闆疯揪绠″埗閫氳繃缂╁皬鍖哄煙绠″埗椋炶闂撮殧锛岃繘涓�姝ュ鍔犱簡绌哄煙瀹归噺锛屾彁楂樹簡绌虹淇濋殰鑳藉姏銆備竴鑸湪鍖哄煙绠″埗鑼冨洿鍐咃紝绋嬪簭绠″埗瑕佹眰鍚岃埅绾裤�佸悓楂樺害鑸┖鍣ㄤ箣闂存渶灏忔按骞抽棿闅�10min锛堝浜庡ぇ涓瀷椋炴満鏉ヨ锛岀浉褰撲簬150km宸﹀彸锛夛紝鑰岄浄杈剧鍒剁殑鏈�灏忛棿闅旀槸10km銆傝繖鎰忓懗鐫�瀹炴柦闆疯揪绠″埗绌哄煙鐨勪繚闅滆兘鍔涘拰杩愯鏁堢巼鑳芥彁鍗囨暟鍊嶃�傞殢鐫�闆疯揪瑕嗙洊闈㈢殑涓嶆柇鎵╁ぇ锛岄浄杈剧鍒跺凡缁忔垚涓虹┖涓氦閫氱鍒剁殑閲嶈鎵嬫銆�2018骞达紝鎴戝浗鍛间鸡璐濆皵绌虹绔欏湪鍏舵墍杈栫殑娴锋媺灏旈珮绌哄拰涓綆绌虹鍒跺尯姝e紡瀹炴柦闆疯揪绠″埗锛岃嚦姝わ紝鎴戝浗鍗庡寳绌哄煙鍏ㄩ儴瀹炵幇浜嗛浄杈剧鍒舵寚鎸ワ紝杩涗竴姝ユ彁楂樹簡鏃哄淇濋殰鑳藉姏鍜岃埅鐝繍琛屾晥鐜囥�備絾闆疯揪璐圭敤杈冮珮锛屽洜姝ゅ湪涓�浜涘亸杩滃湴鍖哄拰涓嶅彂杈惧浗瀹讹紝 + </p> + </div> + </div> + </div> + <!-- 162椤� --> + <div class="page-box" page="170"> + <div v-if="showPageList.indexOf(170) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">162</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 绋嬪簭绠″埗浠嶆槸绌轰腑浜ら�氱鍒剁殑涓昏鎵嬫銆� + </p> + <p class="p-even">鍙︿竴涓ぇ鐨勮繘灞曟槸浠〃鐫�闄嗙郴缁熺殑鍑虹幇銆傝绯荤粺浣跨敤鏃犵嚎鐢典俊鍙峰紩瀵奸鏈猴紝璁╅鏈哄嵆浣垮湪鑳借搴﹀緢浣庡拰浜戝簳楂樺害寰堜綆鐨勬儏鍐典笅涔熻兘瀹夊叏鐫�闄嗭紝鏋佸ぇ鍦版彁楂樹簡鑸彮姝e父鐜囧拰椋炴満瀹夊叏鎬с�� + </p> + <p class="p-even"> + 绗洓闃舵锛�20涓栫邯80骞翠唬浠ュ悗锛夈�傚湪杩欎竴鏃舵湡锛岃埅璺笂椋炴満娴侀噺瓒婃潵瓒婂ぇ锛岄�犳垚鏈哄満鍜岃埅璺殑鎷ユ尋锛岃鍏呭垎鍒╃敤鑸矾锛屽氨瑕佹眰瀹炴椂鍦板鏁翠釜鑸矾缃戝拰鑸绯荤粺杩涜绠$悊銆傚悓鏍峰湪杩欎竴鏃舵湡锛岄殢鐫�鐢靛瓙鎶�鏈殑椋為�熷彂灞曞拰璁$畻鏈哄湪鏈鸿浇璁惧鍜岀┖绠″湴闈㈣鏂戒笂鐨勫箍娉涘簲鐢ㄣ�佸崼鏄熼�氫俊鍜屽畾浣嶆妧鏈殑鎴愮啛锛岄琛屽憳銆佺鍒跺憳鍜屽悇绉嶆敮鎻村崟浣嶃�佸喅绛栨満鏋勫彲浠ュ疄鏃跺湴浜嗚В椋炴満鐨勫噯纭綅缃苟杩涜閫氫俊銆�20涓栫邯80骞翠唬锛屾彁鍑轰簡绌轰腑浜ら�氱鐞嗙殑缁煎悎姒傚康锛屼互鍙栦唬绌轰腑浜ら�氱鍒讹紝杩欎竴瀛椾箣宸綋鐜颁簡绌轰腑浜ら�氱鐞嗚寖鍥村拰娣卞害鐨勪笉鍚屻�傜┖涓氦閫氱鍒剁殑鐩殑鍙槸淇濊瘉涓�娆¤埅鐝粠璧烽鏈哄満缁忚埅璺埌杈剧洰鐨勫湴鏈哄満鐨勯棿闅斿拰瀹夊叏锛岃�岀┖涓氦閫氱鐞嗘槸鐫�鐪间簬鏁翠釜鑸缃戜笂绌轰腑浜ら�氱殑閫氱晠銆佸畨鍏ㄥ拰鏈夋晥杩愯銆傝繖鏍风┖涓氦閫氱鍒跺氨鎴愪负绌轰腑浜ら�氱鐞嗙殑涓�涓噸瑕佺粍鎴愰儴鍒嗐�傚崼鏄熷拰璁$畻鏈虹綉缁滄妧鏈湪绌虹绯荤粺鐨勫簲鐢紝浣挎暣涓┖绠$郴缁熷拰姝e湪椋炶鐨勯鏈虹粍鎴愪竴涓彲浠ュ疄鏃跺鐞嗙殑鑷姩淇℃伅浜ゆ崲绯荤粺锛屽洜鑰屽彲浠ュ湪澶ц寖鍥村唴浣跨┖涓氦閫氭寜鐓ф�讳綋鐨勮皟搴﹀拰瀹夋帓椤哄埄杩涜銆備緥濡傦紝缁撳悎浜嗗崼鏄熷鑸�侀�氫俊鎶�鏈�佹満杞借澶囦互鍙婂湴闈㈣澶囩瓑澶氱鍏堣繘鎶�鏈殑骞挎挱寮忚嚜鍔ㄧ浉鍏崇洃瑙嗙郴缁燂紙ADS-B锛夛紝鑳藉鎻愪緵鏇村姞瀹夊叏銆侀珮鏁堢殑绌轰腑浜ら�氱洃瑙嗘墜娈碉紝鏄浗闄呮皯鑸粍缁囩‘瀹氱殑鏈潵涓昏鐩戣鎶�鏈箣涓�锛屼篃鏄繎骞存潵鍏ㄧ悆姘戣埅棰嗗煙鐑棬鐨勬柊鎶�鏈箣涓�銆傚湪鎴戝浗鏂扮枂鍜岃タ鍗楃瓑鍦板尯锛屼负浜嗘彁楂樹繚闅滆兘鍔涳紝閲囩敤骞挎挱寮忚嚜鍔ㄧ浉鍏崇洃瑙嗘妧鏈浛浠i浄杈剧鍒躲�備笌闆疯揪绠″埗鐩告瘮锛屼娇鐢ㄥ箍鎾紡鑷姩鐩稿叧鐩戣鎶�鏈寚鎸ユ椂鐨勯鏈洪棿闅斿熀鏈浉鍚屻�傝繖瀵逛笉閫傚悎寤鸿闆疯揪绔欑殑鑸矾锛屽娴蜂笂鑸矾锛岄潪甯搁�傜敤銆傛垜鍥界┖鍩熺洃瑙嗙綉缁滃緱鍒颁簡鍏ㄩ潰琛ュ厖鍜屽畬鍠勶紝鏈夋晥鎻愰珮浜嗘皯鑸┖鍩熻祫婧愪娇鐢ㄦ晥鐜囷紝鎻愬崌浜嗚埅鐝甯哥巼锛屾帹鍔ㄤ簡琛屼笟鍙戝睍銆� + </p> + <h4 id="d055" class="p-even unit4-c">浜屻�佺┖涓氦閫氱鐞嗙殑浠诲姟鍜岀粍鎴�</h4> + <p class="p-even"> + 绌轰腑浜ら�氱鐞嗙殑鍩烘湰浠诲姟鏄娇鑸┖鍏徃鎴栫粡钀ヤ汉鑳藉鎸夌収鍘熸潵棰勫畾鐨勬椂闂达紝鍚屾椂锛屽湪瀹炴柦杩囩▼涓紝浠ユ渶灏戦檺鍒朵繚璇佽埅绾跨綉缁滃畨鍏ㄣ�佹湁搴忓湴杩愯銆備緥濡傦紝鍦ㄨ�冭檻鍒版暣涓埅绾跨綉缁滅殑椋炶閲忓悗锛岀┖涓氦閫氱鐞嗗彲浠ヤ娇椋炴満 + </p> + </div> + </div> + </div> + <!-- 163椤� --> + <div class="page-box" page="171"> + <div v-if="showPageList.indexOf(171) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰鍥�</li> + <li class="headerText">绌轰腑浜ら�氱鐞�</li> + <li class="headerNumber">163</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">鍦ㄨ捣椋炴満鍦哄氨寰楀埌鎺у埗锛屼互閬垮厤椋炴満璧烽鍚庡湪绌轰腑鍑虹幇鏃犺皳鐨勭瓑寰呫�佺洏鏃嬶紝鎴栦娇鐢ㄤ笉缁忔祹鐨勯琛岄珮搴﹀眰鑰岄�犳垚鐕冩补鎹熻�椼��</p> + <p class="p-odd">绌轰腑浜ら�氱鐞嗙粍鎴愰儴鍒嗘湁绌轰腑浜ら�氭湇鍔★紙air traffic service锛孉TS锛夈�佺┖鍩熺鐞嗭紙airspace + management锛孉SM锛夈�佺┖涓氦閫氭祦閲忕鐞嗭紙air traffic + flow management锛孉TFM锛夈�傚叾涓紝绌轰腑浜ら�氭湇鍔℃槸鏈�涓昏鐨勪竴閮ㄥ垎銆�</p> + <p class="p-odd">绌轰腑浜ら�氭湇鍔℃槸鎸囧鑸┖鍣ㄧ殑绌轰腑椋炶娲诲姩杩涜绠$悊鍜屾帶鍒剁殑涓氬姟锛屾槸绌轰腑浜ら�氱鍒舵湇鍔★紙air traffic control + service锛孉TC锛夈�侀琛屾儏鎶ユ湇鍔★紙flight + information service锛孎IS锛夊拰鍛婅鏈嶅姟锛坅lerting service锛孉S锛夌殑鎬荤О锛岀敱绌轰腑浜ら�氱鍒跺憳鍚戣埅绌哄櫒鎻愪緵绌轰腑浜ら�氭湇鍔°��</p> + <p class="p-odd"> + 绌哄煙绠$悊鏄寚涓轰簡缁存姢鍥藉瀹夊叏銆佸吋椤炬皯鐢ㄥ拰鍐涚敤鑸┖鍣ㄧ殑闇�姹備互鍙婂叕浼楀埄鐩婏紝缁熶竴瑙勫垝锛屽悎鐞嗐�佸厖鍒嗐�佹湁鏁堝湴鍒╃敤绌哄煙璧勬簮鐨勭鐞嗗伐浣溿�傚叾浠诲姟鏄緷鎹浗瀹舵湁鍏虫斂绛栵紝閫愭鏀瑰杽绌哄煙鐜锛屼紭鍖栫┖鍩熺粨鏋勶紝灏藉彲鑳芥弧瓒崇┖鍩熺敤鎴蜂娇鐢ㄧ┖鍩熺殑闇�姹傘�� + </p> + <p class="p-odd"> + 绌轰腑浜ら�氭祦閲忕鐞嗘槸涓轰簡闃叉鍜岀籂姝e湪鑸矾銆佹満鍦哄尯鍩熷唴鑸┖鍣ㄨ繃搴﹂泦涓�佽秴杩囪瀹氬閲忛檺棰濊�岄噰鍙栫殑鎺у埗鎺柦銆傜┖涓氦閫氭祦閲忕鐞嗙殑浠诲姟鏄湪绌轰腑浜ら�氭祦閲忔帴杩戞垨杈惧埌绌轰腑浜ら�氱鍒跺彲鐢ㄧ殑鑳藉姏鏃讹紝閫傛椂鍦拌繘琛岃皟鏁达紝淇濊瘉绌轰腑浜ら�氶噺鏈�浣冲湴娴佸叆鎴栭�氳繃鐩稿簲鍖哄煙锛屽敖鍙兘鎻愰珮鏈哄満銆佺┖鍩熷彲鐢ㄥ閲忕殑鍒╃敤鐜囥�� + </p> + + </div> + </div> + </div> + <!-- 164椤� --> + <div class="page-box" page="172"> + <div v-if="showPageList.indexOf(172) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">164</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even unit4-c"> + 瀛︿範浠诲姟浜�<br />绌轰腑浜ら�氭湇鍔� + </h3> + <div class="task-u4-c ma-l"></div> + <p class="p-even"> + 涓庡叾浠栫殑浜ら�氳繍杈撴柟寮忎竴鏍凤紝绌轰腑浜ら�氫篃闇�瑕佺鐞嗗拰鏈嶅姟浠ヤ繚璇佸畨鍏ㄣ�佹湁搴忓湴杩愯銆傜┖涓氦閫氱敱浜庢湰韬墍鍥烘湁鐨勪竴浜涚壒鐐癸紝鍦ㄥ悜鑸┖鍣ㄦ彁渚涙湇鍔℃椂锛屾湁涓や釜鐗规畩瑕佹眰锛氫竴鏄竴鏃︾┖涓氦閫氬紑濮嬪疄鏂芥垨杩愯锛屽畠灏变笉鍙兘鏃犻檺鏈熷湴鍦ㄨ埅璺笂娑堢(鎴栧欢璇紝涓鐨勬柟寮忓氨鏄娇鑸┖鍣ㄩ檷钀斤紝鍚﹀垯灏嗛潰涓存棤娌规垨缂烘补锛屽鑷存晥鐩婃�ュ墽涓嬮檷銆佹垚鏈鍔犵敋鑷冲彂鐢熶簨鏁咃紱浜屾槸绌轰腑浜ら�氫笌鍏朵粬浜ら�氭柟寮忕浉姣旇秺鏉ヨ秺琚祴浜堝浗闄呮�х殑鐗圭偣锛屽畠涓嶄粎鏍囧織鐫�涓�涓湴鏂圭殑绀句細缁忔祹鍙戝睍姘村钩鍜屾枃鏄庣▼搴︼紝鑰屼笖浼氬鍛ㄨ竟骞块様閭诲煙浜х敓宸ㄥぇ鐨勫奖鍝嶏紝鍥犺�岃姹傜┖涓氦閫氭湇鍔¢渶瑕佷竴涓浗瀹惰寖鍥寸殑鏈烘瀯澶т綋鎸夊浗闄呭叡鐢ㄧ殑鍑嗗垯鎻愪緵鏈嶅姟銆傝繖涓や釜鐗圭偣涔嬮棿鍏锋湁寮虹儓鐨勫叧鑱旀�с�傚熀浜庣┖涓氦閫氭墍鍛堢幇鐨勮繖涓や釜鐗圭偣锛屽瑙備笂闇�瑕佹彁渚涢珮璐ㄩ噺鐨勬湇鍔★紝涓虹┖涓氦閫氬畨鍏ㄣ�佹湁搴忓湴杩愯鍒涢�犺壇濂界殑鐜銆� + </p> + <h4 id="d056" class="p-even unit4-c">涓�銆佺┖涓氦閫氭湇鍔$殑鐩爣</h4> + <p class="p-even">绗竴锛岃�冭檻鍒扮┖鍩熶娇鐢ㄧ幇鐘讹紝閲囩敤涓�鍒囧彲鐢ㄧ殑闂撮殧锛屽彂甯冩寚浠わ紝闃叉绌轰腑鐨勮埅绌哄櫒鐩告挒锛岄槻姝㈠嚭鐜板悇绉嶄簨浠讹紙宸敊銆佷弗閲嶅樊閿欍�佸嵄闄╂帴杩戠瓑锛夈��</p> + <p class="p-even">绗簩锛屽埄鐢ㄤ竴鍒囨墜娈碉紝鍖呮嫭浣跨敤鍦伴潰娲诲姩闆疯揪绛夛紝鍒囧疄閲囧彇鎺柦锛岄槻姝㈤鏈哄拰闅滅鐗╋紙鍙互鏄湴闈㈠仠鏀剧殑椋炴満绛夛級鍦ㄨ捣椋炪�佺潃闄嗗強鍏剁浉鍏冲尯鍩熷嚭鐜扮浉鎾炵瓑浜嬫晠鎴栦簨浠躲��</p> + <p class="p-even"> + 绗笁锛屽绌哄煙鍐呴琛岀殑鑸┖鍣ㄨ繘琛屽垏瀹炴湁鏁堢殑绠$悊锛屽噯纭湴鎺屾彙椋炶鍔ㄦ�侊紝纭畾鑸┖鍣ㄤ箣闂寸殑鐩镐簰鍏崇郴锛屾壘鍑轰簨鍏抽琛屽啿绐佽皟閰嶇殑涓昏鑸┖鍣紝鍒╃敤鍚堢悊鐨勯棿闅旀爣鍑嗭紝鍙婃椂鍙戝竷鎸囦护锛屽疄鐜板姞澶х┖涓氦閫氭祦閲忋�佺淮鎸佽壇濂借繍琛岀З搴忕殑鐩殑銆� + </p> + <p class="p-even">绗洓锛屼负浣胯埅绌哄櫒瀹夊叏銆佹湁搴忓湴杩愯锛屽悜鍏舵彁渚涘悇绉嶅缓璁�佹儏鎶ャ�佷俊鎭潵閬垮紑鍗遍櫓澶╂皵鍙婂悇绉嶉檺鍒舵�х┖鍩熴��</p> + <p class="p-even">绗簲锛屽湪鑸┖鍣ㄩ亣闄╂垨闇�瑕佹彁渚涙悳瀵汇�佹晳鎻存湇鍔℃椂锛岄�氱煡鍚勪繚闅滃崟浣嶅強鏃跺紑灞曞伐浣溿��</p> + </div> + </div> + </div> + <!-- 165椤� --> + <div class="page-box" page="173"> + <div v-if="showPageList.indexOf(173) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰鍥�</li> + <li class="headerText">绌轰腑浜ら�氱鐞�</li> + <li class="headerNumber">165</li> + </ul> + <div class="bodystyle"> + <h4 id="d057" class="p-odd unit4-c">浜屻�佺┖涓氦閫氭湇鍔$殑缁勬垚</h4> + <p class="p-odd">绌轰腑浜ら�氭湇鍔$敱涓夐儴鍒嗙粍鎴愶紝濡備笅鎵�杩般��</p> + <h5 id="e065" class="p-odd unit4-c">锛堜竴锛夌┖涓氦閫氱鍒舵湇鍔�</h5> + <p class="p-odd"> + 绌轰腑浜ら�氱鍒舵湇鍔℃槸绌轰腑浜ら�氭湇鍔$殑涓昏鏂归潰锛屽畠鐨勪富瑕佷换鍔℃槸锛氣憼闃叉鑸┖鍣ㄤ笌鑸┖鍣ㄧ浉鎾烇紱鈶¢槻姝㈣埅绌哄櫒涓庨殰纰嶇墿鐩告挒锛涒憿缁存姢鍜屽姞閫熺┖涓氦閫氭湁绉╁簭鍦版祦鍔ㄣ�傚畠鍙堝寘鎷笁閮ㄥ垎锛氬尯鍩熺鍒舵湇鍔°�佽繘杩戠鍒舵湇鍔″拰鏈哄満绠″埗鏈嶅姟銆� + </p> + <h5 id="e066" class="p-odd unit4-c">锛堜簩锛夐琛屾儏鎶ユ湇鍔�</h5> + <p class="p-odd"> + 椋炶鎯呮姤鏈嶅姟鐨勪换鍔℃槸锛氬悜椋炶涓殑鑸┖鍣ㄦ彁渚涙湁鐩婁簬瀹夊叏銆佽兘鏈夋晥鍦板疄鏂介琛岀殑寤鸿鍜屾儏鎶ョ殑鏈嶅姟銆傚叾鑼冨洿鏄細閲嶈姘旇薄鎯呮姤锛屼娇鐢ㄧ殑瀵艰埅璁惧鐨勫彉鍖栨儏鍐碉紝鏈哄満鍜屾湁鍏宠澶囩殑鍙樺姩鎯呭喌锛堝寘鎷満鍦烘椿鍔ㄥ尯鍐呯殑闆�佸啺鎴栬�呮湁鐩稿綋娣卞害绉按鐨勬儏鍐碉級锛屽彲鑳藉奖鍝嶉琛屽畨鍏ㄧ殑鍏朵粬鎯呮姤銆傞�氬父鐢辩鍒跺憳鍦ㄧ鍒剁┖鍩熷唴瀵硅埅绌哄櫒鎻愪緵绌轰腑浜ら�氱鍒舵湇鍔$殑鍚屾椂绌挎彃鎻愪緵椋炶鎯呮姤鏈嶅姟锛屼絾鍦ㄦ湁浜涘湴鍖猴紝鑰冭檻鍒伴琛岄噺澶с�侀琛岀粍鎴愬鏉傜瓑鐜板疄鎯呭喌锛屽彲鎴愮珛涓撻棬鐨勬満鏋勭敱涓撻棬鐨勪汉鍛樹粠浜嬭椤瑰伐浣溿�傛渶甯歌鐨勬儏鎶ユ彁渚涙柟寮忔槸鑸珯缁堢鑷姩鎯呮姤閫氭挱銆� + </p> + <p class="p-odd"> + 椋炶鎯呮姤鏈嶅姟杩樺寘鎷┖涓氦閫氬挩璇㈡湇鍔★紝瀹冩槸鍦ㄧ┖涓氦閫氬挩璇㈢┖鍩熷唴锛屼负鎸夌収浠〃椋炶瑙勫垯椋炶鐨勮埅绌哄櫒灏藉彲鑳芥彁渚涚殑涓�绉嶉棿闅旀湇鍔★紝瀹冭瑙嗕负浠庨琛屾儏鎶ュ埌绌轰腑浜ら�氱鍒舵湇鍔$殑涓�绉嶄复鏃剁殑杩囨浮鎬ф湇鍔°�傚湪杩欐湡闂达紝鏈夊叧鍗曚綅涓轰簡鏈潵鐨勮繃娓★紝闇�瑕佸仛濂戒汉鍛樸�佽澶囩瓑鏂归潰鐨勫ぇ閲忓噯澶囥�� + </p> + <h5 id="e067" class="p-odd unit4-c">锛堜笁锛夊憡璀︽湇鍔�</h5> + <p class="p-odd"> + 鑸┖鍣ㄥ浜庢悳瀵诲拰鏁戞彺鐘舵�佹椂锛屾秹鍙婂悜鏈夊叧鍗曚綅鍙戝嚭閫氱煡骞剁粰浜堝崗鍔╃殑鏈嶅姟銆傚畠鏃笉鏄竴椤瑰绔嬬殑绌轰腑浜ら�氭湇鍔★紝涔熶笉鏄煇涓�涓撻棬鏈烘瀯鐨勪笟鍔★紝鑰屾槸褰撶揣鎬ョ姸鍐碉紝濡傚彂鍔ㄦ満鏁呴殰銆佹棤绾跨數閫氫俊绯荤粺澶辨晥銆佸骇鑸卞け鍘嬬瓑鍑虹幇鎴栭伃閬囩┖涓潪娉曞姭鎸佹椂锛岀敱褰撲簨鐨勭鍒跺崟浣嶇洿鎺ユ彁渚涚殑涓�椤规湇鍔°�� + </p> + <h4 id="d058" class="p-odd unit4-c">涓夈�侀棿闅旀爣鍑�</h4> + <p class="p-odd"> + 绌轰腑浜ら�氭湇鍔$殑涓昏鐩殑涔嬩竴鏄繚璇佷换浣曚袱涓埅绌哄櫒涔嬮棿鏈夎冻澶熺殑璺濈锛岄槻姝㈣埅绌哄櫒鍗遍櫓鎺ヨ繎鍜岀浉鎾炪�傝繖鏃㈡槸绌轰腑浜ら�氱鍒剁殑鍩虹锛屼篃鏄┖涓氦閫氱鍒朵汉鍛樼殑鍩烘湰浠诲姟銆傜敱浜庤埅绌哄櫒鐨勮埅鍚戙�侀�熷害銆侀珮搴︿笉鍚岋紝鍥犳蹇� + </p> + + </div> + </div> + </div> + <!-- 166椤� --> + <div class="page-box" page="174"> + <div v-if="showPageList.indexOf(174) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">166</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 椤诲埗瀹氫竴濂楀浗闄呴�氱敤鐨勫叧浜庤埅绌哄櫒鍦ㄧ┖涓浉浜掕窛绂荤殑瑙勫畾锛岃繖浜涜瀹氱殑璺濈锛堟椂闂达級绉颁负闂撮殧鏍囧噯锛屾槸鍦ㄧ┖涓氦閫氱鍒惰繃绋嬩腑灏嗚埅绌哄櫒鍦ㄧ旱鍚戙�佷晶鍚戝拰鍨傜洿鏂瑰悜闅斿紑鐨勬渶灏忚窛绂汇�傝繖浜涙爣鍑嗘槸鏈�浣庨檺搴︾殑瑕佹眰锛屽洜姝よ绉颁负鏈�浣庨棿闅旀爣鍑嗐�� + </p> + <p class="p-even">鍦ㄧ箒蹇欑殑绌烘腐涓婄┖鍜岃埅璺笂锛岃埅绌哄櫒鐨勫瘑搴﹀緢楂橈紝鍚堢悊鍦板埗瀹氬拰杩愮敤闂撮殧鏍囧噯锛岄櫎浜嗚淇濊瘉瀹夊叏鍜屾湁搴忓湴椋炶澶栵紝涔熻鑰冭檻鑳戒娇绌轰腑浜ら�氳繀閫熷拰渚垮埄锛屼粠鑰屼繚闅滅┖鍩熶娇鐢ㄨ�呯殑缁忔祹鏁堢泭銆� + </p> + <p class="p-even">鏍规嵁绌轰腑浜ら�氱鍒舵墜娈典笉鍚岋紝鍙妸绠″埗鏂瑰紡鍒嗕负绋嬪簭绠″埗鍜岄浄杈剧鍒讹紝杩欎袱绉嶇鍒舵柟寮忎娇鐢ㄧ殑闂撮殧鏍囧噯涔熸槸涓嶅悓鐨勩��</p> + <p class="p-even">闂撮殧鏍囧噯鍒嗕负涓ょ被锛氬瀭鐩撮棿闅斿拰姘村钩闂撮殧銆�</p> + <h5 id="e068" class="p-even unit4-c">锛堜竴锛夊瀭鐩撮棿闅�</h5> + <p class="p-even">楂樺害灞傦紙flight level锛孎L锛夛細浠ュ浗闄呮爣鍑嗗ぇ姘�760mmHg锛�101325 + Pa锛変负鍩哄噯锛屽皢姣�100ft浣滀负涓�涓珮搴﹀眰锛岀О涓洪琛岄珮搴﹀眰锛屼互姝ゆ潵琛ㄧず鍦ㄥ瀭鐩撮棿闅斾笂鐨勯琛岄珮搴︺�備緥濡傦紝灏�18000锝�18100ft鐨勯珮搴︾О涓�180楂樺害灞傦紝鍐欎綔FL180銆傝繖鏍疯〃绀虹殑濂藉鏄伩鍏嶄簡鐢变簬姘斿帇璁惧畾涓嶅悓鑰屽甫鏉ョ殑楂樺害琛ㄩ殢鐫�姘斿帇鐨勫彉鍖栧鑷寸殑娉㈠姩鍜屾贩娣嗐�傜敤涓�灞傞珮搴︽潵琛ㄧず椋炶楂樺害锛屼繚璇佷簡椋炶涓殑楂樺害涓婃湁涓�瀹氱殑璇樊鑼冨洿銆� + </p> + <p class="p-even">鍨傜洿闂撮殧鐢ㄩ珮搴﹀眰鍖哄垎锛岀О涓洪珮搴﹀眰闂撮殧銆�</p> + <p class="p-even">涓嶅悓鐨勯琛岄樁娈靛楂樺害灞傞厤澶囩殑瑕佹眰涔熶笉鍚屻�傚浘4-1鎵�绀轰负椋炶楂樺害灞傞厤澶囩ず鎰忓浘銆�</p> + <h6 id="f029" class="p-even">1.宸¤埅楂樺害灞傞厤澶�</h6> + <p class="p-even">鑸┖鍣ㄨ繘琛岃埅璺拰鑸嚎椋炶鏃讹紝搴斿綋鎸夌収鎵�閰嶅鐨勫贰鑸琛岄珮搴﹀眰椋炶锛屾垜鍥界幇琛岀殑宸¤埅楂樺害灞傞厤澶囨寜鐓т互涓嬫柟娉曞垝鍒嗐��</p> + <p class="p-even"> + 鈶犵湡鑸嚎瑙掑湪0掳鑷�179掳鑼冨洿鍐咃細楂樺害鍦�900m鑷�8100m锛屾瘡闅�600m涓轰竴涓珮搴﹀眰锛涢珮搴﹀湪8900m鑷�12500m锛屾瘡闅�600m涓轰竴涓珮搴﹀眰锛涢珮搴﹀湪12500m浠ヤ笂锛屾瘡闅�1200m涓轰竴涓珮搴﹀眰銆�12500m锛堝惈锛変互涓嬫弧瓒斥�滀笢鍗曗�濈殑鍘熷垯銆� + </p> + <p class="p-even"> + 鈶$湡鑸嚎瑙掑湪180掳鑷�359掳鑼冨洿鍐咃細楂樺害鍦�600m鑷�8400m锛屾瘡闅�600m涓轰竴涓珮搴﹀眰锛涢珮搴﹀湪9200m鑷�12200m锛屾瘡闅�600m涓轰竴涓珮搴﹀眰锛涢珮搴﹀湪13100m浠ヤ笂锛屾瘡闅�1200m涓轰竴涓珮搴﹀眰銆�12200m锛堝惈锛変互涓嬫弧瓒斥�滆タ鍙屸�濈殑鍘熷垯銆� + </p> + <p class="p-even">鈶㈤琛岄珮搴﹀眰搴斿綋鏍规嵁鏍囧噯澶ф皵鍘嬫潯浠朵笅鍋囧畾娴峰钩闈㈣绠椼�傜湡鑸嚎瑙�</p> + + </div> + </div> + </div> + <!-- 167椤� --> + <div class="page-box" page="175"> + <div v-if="showPageList.indexOf(175) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰鍥�</li> + <li class="headerText">绌轰腑浜ら�氱鐞�</li> + <li class="headerNumber">167</li> + </ul> + <div class="bodystyle"> + <p class="center openImgBox p-odd"><img class="img-b" alt="" src="../../assets/images/0179-1.jpg" /> + </p> + <p class="img p-odd">鍥�4-1 椋炶楂樺害灞傞厤澶囩ず鎰忓浘</p> + <p class="p-odd td-0">搴斿綋浠庤埅绾胯捣鐐瑰拰杞集鐐归噺鍙栥�傚鏋滆埅绾跨殑涓埆鑸鏇叉姌锛屽簲褰撴寜鐓ц鑸嚎鎬荤殑鏂瑰悜纭畾銆�</p> + <h6 id="f030" class="p-odd">2.闈炲贰鑸珮搴﹀眰閰嶅</h6> + <p class="p-odd"> + 鍦ㄨ埅璺瓑寰呯┖鍩熴�佹満鍦虹瓑寰呯┖鍩熴�佽捣钀借埅绾夸互鍙婃満鍦哄鍙版垨杩涜繎绠″埗瀹ょ鍒跺尯鍩熷唴鐨勯琛岄珮搴﹀眰閰嶅锛屽熀鏈笂鍦ㄩ珮搴�12500m浠ヤ笅鐨勫瀭鐩撮棿闅斾篃鏄笉寰楀皬浜�300m锛屼絾涓�鑸笉寰椾綆浜庤鍖哄煙鏈�浣庡畨鍏ㄩ珮搴︺��</p> + <h6 id="f031" class="p-odd">3.缂╁皬鍨傜洿闂撮殧</h6> + <p class="p-odd"> + 闅忛琛岄珮搴﹀鍔狅紝澶ф皵鍘嬪姏闄嶄綆锛岄珮搴﹁〃鐏垫晱鎬у彉宸�佽宸彉澶э紝鍥犳闇�瑕侀珮搴﹀眰闂撮殧鍙樺ぇ銆傞殢鐫�鍒堕�犲伐鑹烘彁楂橈紝楂樺害琛ㄦ祴閲忕簿搴︽彁楂橈紝涓哄厖鍒嗘湁鏁堝湴鍒╃敤鏈夐檺鐨勮埅绾匡紝鍨傜洿闂撮殧鍙互闅忎箣缂╁皬銆�</p> + <p class="p-odd"> + 鍥介檯姘戣埅缁勭粐寤鸿鐨勭缉灏忓瀭鐩撮棿闅旀槸鐩稿浜庡父瑙勫瀭鐩撮棿闅旇�岃█鐨勩�傚畠鎸囩殑鏄皢鐜颁唬鍠锋皵寮忔皯鑸鏈哄贰鑸樁娈垫墍鍦ㄧ敤鐨勯琛岄珮搴﹀眰FL290鑷矲L410锛堝惈锛変箣闂寸殑鍨傜洿闂撮殧鏍囧噯鐢�2000ft缂╁皬鍒�1000ft锛屼粠鑰屽鍔犵┖鍩熷閲忥紝鎻愰珮鑸┖鍏徃鐨勮繍琛屾晥鐩婏紝鍑忓皯绌轰腑浜ら�氱鍒舵寚鎸ョ殑宸ヤ綔璐熻嵎銆傛垜鍥芥牴鎹� + </p> + </div> + </div> + </div> + <!-- 168椤� --> + <div class="page-box" page="176"> + <div v-if="showPageList.indexOf(176) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">168</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鍥芥儏锛屽湪缂╁皬鍨傜洿闂撮殧涓噰鐢ㄧ殑鏄叕鍒跺崟浣嶏紝鎸囧湪椋炶楂樺害灞�8900m锛堝惈锛夛綖12500m锛堝惈锛夛紝鑸┖鍣ㄦ渶灏忓瀭鐩撮棿闅旂敱鍘熸潵鐨�600m缂╁噺鍒�300m銆傚叏鐞冮櫎灏戞暟鍥藉灏氭湭瀹炴柦缂╁皬鍨傜洿闂撮殧涔嬪锛岀粷澶у鏁板浗瀹跺拰鍦板尯宸茬浉缁у疄鏂姐�� + </p> + <h5 id="e069" class="p-even unit4-c">锛堜簩锛夋按骞抽棿闅�</h5> + <p class="p-even"> + 姘村钩闂撮殧鍖呮嫭妯悜闂撮殧鍜岀旱鍚戦棿闅斻�傛í鍚戦棿闅旀寚鐨勬槸鑸┖鍣ㄤ晶鏂圭殑鏈�灏忛棿闅旇窛绂汇�傜旱鍚戦棿闅旀槸鎸囦娇鐢ㄥ悓涓�鑸亾鍜屽湪鏈哄満璧烽涓庤繘杩戞椂鐨勯棿闅旇瀹氾紝鐢变簬鑸┖鍣ㄧ殑椋炶閫熷害涓嶅悓锛屽洜鑰岀旱鍚戦棿闅旇鍜岄琛岄�熷害銆佽埅绌哄櫒閫氳繃鏌愪竴鍦扮偣鐨勫厛鍚庤仈绯昏捣鏉ャ�傜旱鍚戦棿闅斿彲浠ョ敤鏃堕棿鏉ラ棿闅旓紝涔熷彲浠ョ敤璺濈鏉ラ棿闅斻�� + </p> + <p class="p-even">鐢ㄦ椂闂存潵闂撮殧瑕佹秹鍙婅埅绌哄櫒瓒婅繃鎶ュ憡鐐圭殑浣嶇疆鐨勫噯纭�с�佹姤鍛婁綅缃殑娆℃暟鍜岄棿闅斻�佹椂閽熺殑鍑嗙‘鎬х瓑銆傚鏋滈鏈轰娇鐢ㄦ祴璺濅华瀹氫綅锛屽氨鍙互浣跨敤璺濈闂撮殧锛屽悓涓�鑸抗涓婇鏈洪棿闅斾负20n + mile<sup>鈶�</sup>銆傚鏋滃墠闈㈤鏈虹殑閫熷害姣斿悗闈㈤鏈虹殑閫熷害蹇�40km/h浠ヤ笂锛岄棿闅斿彲涓嬮檷涓�10n mile銆� + </p> + <p class="p-even">浠ヤ笂鎴戜滑浠呬粎鍒楀嚭浜嗗浗闄呮皯鑸粍缁囧闂撮殧鏍囧噯鐨勯儴鍒嗘帹鑽愯瀹氥�傚湪鎴戝浗锛屾牴鎹┖鍩熺殑涓嶅悓锛屾満鍦鸿澶囨潯浠躲�佽埅璺儏鍐电殑涓嶅悓锛屽涓嶅悓鎯呭喌鐨勯棿闅旀爣鍑嗘湁鐫�璇﹀敖鑰屼弗鏍肩殑瑙勫畾銆�</p> + <h4 id="d059" class="p-even unit4-c">鍥涖�侀琛岃鍒�</h4> + <p class="p-even">姝e鍦伴潰浜ら�氭湁浜ら�氳鍒欎竴鏍凤紝绌轰腑浜ら�氫篃鏈夐琛岃鍒欙紝鍙湁绌轰腑浜ら�氱殑浣跨敤鑰呭拰绠$悊鑰呭叡鍚岄伒瀹堝拰渚濇嵁杩欎簺瑙勫垯鎿嶄綔锛屾墠鏈夊彲鑳戒繚璇佺┖涓氦閫氬畨鍏ㄣ�佹湁搴忓湴杩涜銆�</p> + <p class="p-even">椋炶瑙勫垯鍒嗕负涓変釜閮ㄥ垎锛氶�氱敤椋炶瑙勫垯锛坓eneral flight rules锛孏FR锛夈�佺洰瑙嗛琛岃鍒欙紙visual flight + rules锛孷FR锛夊拰浠〃椋炶瑙勫垯锛坕nstrument + flight + rules锛孖FR锛夈�傞�氱敤椋炶瑙勫垯鏄湪浠讳綍鎯呭喌涓嬮琛岄兘蹇呴』閬靛畧鐨勫叡鍚岄琛岃鍒欙紝鏄琛岀殑鍩虹锛屾湁鐨勫凡缁忔垚涓洪琛屽父璇嗭紝浣嗘槸鍦ㄥ疄璺典腑浠嶇劧鏈夊緢澶氭椂鍊欎細鍥犱负蹇界暐杩欎簺瑙勫垯鑰岄�犳垚浜嬫晠鍜屾崯澶便�傞琛屼腑锛岄櫎瀹屽叏閬靛畧閫氱敤椋炶瑙勫垯澶栵紝濡傛灉鏄洰瑙嗛琛岃繕搴旈伒瀹堢洰瑙嗛琛岃鍒欙紝浠〃椋炶杩樺簲閬靛畧浠〃椋炶瑙勫垯銆� + </p> + <h5 id="e070" class="p-even unit4-c">锛堜竴锛夐�氱敤椋炶瑙勫垯</h5> + <p class="p-even">閫氱敤椋炶瑙勫垯涓昏鍖呮嫭浠ヤ笅浜斾釜鏂归潰銆�</p> + <p class="p-even">绗竴锛屼繚鎶や汉韬拰璐㈢墿鐨勫畨鍏ㄣ�傞鏈洪櫎鐗规畩鍏佽鎴栫揣鎬ユ儏鍐典笅锛屼笉寰�</p> + <hr class="ma-l"> + <p class="p-even note td-0"><a id="m1">鈶�</a> 1n mile=1852m銆�</p> + + </div> + </div> + </div> + <!-- 169椤� --> + <div class="page-box" page="177"> + <div v-if="showPageList.indexOf(177) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰鍥�</li> + <li class="headerText">绌轰腑浜ら�氱鐞�</li> + <li class="headerNumber">169</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">鍦ㄧ瀵嗗眳姘戝尯涓婄┖椋炶锛屾満涓婁笉寰椾笅鎶涗换浣曠墿浣擄紝涓嶅緱鎷栨洺鍏朵粬鐗╀綋鎴栬繘琛岀壒鎶�椋炶銆�</p> + <p class="p-odd"> + 绗簩锛岄伩鍏嶇鎾炪�傝埅绌哄櫒涓嶅緱椋炲埌涓庡彟涓�涓埅绌哄櫒鏈夊彲鑳界浉鎾炵殑鍖哄煙锛岄櫎鐗规畩鍏佽锛屼笉寰楀埌绂佸尯椋炶锛涜埅绌哄櫒鍦ㄤ繚璇佸畨鍏ㄧ殑鎯呭喌涓嬪疄琛屽彸渚ч�氳鏉冿紝鍦ㄨ秴瓒婃椂瑕佹寜瑙勫畾杩涜锛涢鏈哄繀椤绘寜瑙勫畾瑁呮湁闃叉挒鐏拰鑸鐏紱鍦ㄦ満鍦洪檮杩戣鎸夋満鍦轰笂绌鸿鍒欓琛屻�� + </p> + <p class="p-odd">绗笁锛岄琛岃鍒掋�傛瘡娆¢琛岄兘瑕佸悜绌虹閮ㄩ棬閫掍氦椋炶璁″垝銆�</p> + <p class="p-odd">绗洓锛屾椂闂翠娇鐢ㄣ�傛皯鐢ㄨ埅绌虹粺涓�浣跨敤涓栫晫鍗忚皟鏃讹紝浣跨敤24灏忔椂鍒惰鏃躲��</p> + <p class="p-odd"> + 绗簲锛岀┖涓氦閫氱鍒剁殑瑕佹眰銆傞鏈虹殑浠讳綍椋炶閮藉繀椤昏幏寰楃┖绠¤鍙�傚鏋滈琛屼汉鍛樺洜鏌愪簺鎯呭喌涓嶈兘鍒╃敤杩欎釜璁稿彲锛屽彲浠ュ拰绌轰腑浜ら�氱鍒朵汉鍛樿姹傚啀璁稿彲锛涘湪绌轰腑浜ら�氱鍒堕琛屼腑瑙勫畾鐨勬姤鍛婄偣锛岃埅绌哄櫒蹇呴』灏藉揩鎶ュ憡椋炶秺鐨勬椂闂淬�侀珮搴︼紝鍦ㄦ病鏈夎瀹氭姤鍛婄偣鐨勫尯鍩燂紝椋炶浜哄憳瑕佸畾鏃跺悜绌虹鍗曚綅鎶ュ憡浣嶇疆銆� + </p> + <h5 id="e071" class="p-odd unit4-c">锛堜簩锛夌洰瑙嗛琛岃鍒�</h5> + <p class="p-odd"> + 鎵ц鐩椋炶瑙勫垯鐨勫熀纭�鏄鏈轰笌鍏朵粬椋炴満鍜屽湴闈㈢浉浜掕兘鐪嬭锛屽洜姝ょ洰瑙嗛琛岃鍒欏拰澶╂皵鎯呭喌鐗瑰埆鏄兘瑙佸害绱у瘑鐩歌繛銆傚鏈�浣庣殑鑳借繘琛岀洰瑙嗛琛岀殑澶╂皵鍒跺畾浜嗙洰瑙嗛琛屾皵璞℃潯浠讹紙visual + meteorological + conditions锛孷MC锛夛紝鍦ㄨ繖鏍风殑姘旇薄鏉′欢涓嬭兘淇濊瘉鐩椋炶瑙勫垯鎵�瑕佹眰鐨勯琛岃兘瑙佸害涓烘渶浣庝簯灞傚1500m锛屼互淇濊瘉椋炶鍛樻湁閫傚綋鐨勬潯浠剁湅鍒板叾浠栭鏈烘垨闅滅鐗╋紝閬垮厤鐩告挒銆傚鏋滄皵璞℃潯浠朵綆浜庣洰瑙嗛琛屾皵璞℃潯浠剁殑瑕佹眰锛屽氨绂佹浣跨敤鐩椋炶瑙勫垯椋炶銆� + </p> + <p class="p-odd"> + 鐩椋炶瑙勫垯瀵归琛屽憳鐨勯檺鍒惰緝灏戯紝鍙姹傛湁鍩烘湰鐨勯琛屽拰閫氫俊鎶�鑳斤紝瀵归鏈虹殑浠〃瑕佹眰涔熶粎闄愪簬淇濊瘉瀹夊叏椋炶鐨勫熀鏈华琛ㄣ�傜敱浜庨琛屽湪鍙鐨勬潯浠朵笅锛岀洰瑙嗛琛岃鍒欑殑闃叉挒鍜岄棿闅旇窛绂讳篃杈冨皬锛屾湁鏃剁敋鑷崇粰椋炶鍛樹竴瀹氱殑鐏垫椿鎬с�傚浣庨�熴�佷綆绌洪琛岀殑椋炴満鍜屽湪椋炶涓嶇瀵嗗湴鍖洪琛岀殑椋炴満鐨勯檺鍒朵篃鐩稿簲鏀惧銆傛病鏈夎澶囪冻澶熶华琛ㄧ殑浣庨珮搴﹂琛岀殑灏忓瀷椋炴満锛屽彧鑳藉湪姘旇薄鏉′欢鍏佽鐨勫墠鎻愪笅閲囩敤鐩椋炶瑙勫垯椋炶銆傛澶栵紝鍦ㄦ満鍦轰笂绌猴紝鍦ㄦ皵璞℃潯浠惰鍙椂锛屼竴浜涘ぇ鍨嬮鏈轰篃浼氶噰鐢ㄧ洰瑙嗛琛岃鍒欙紝鐩椋炶鍦ㄧ┖涓氦閫氱鍒朵腑鍙崰宸ヤ綔閲忕殑涓�灏忛儴鍒嗐�� + </p> + <h5 id="e072" class="p-odd unit4-c">锛堜笁锛変华琛ㄩ琛岃鍒�</h5> + <p class="p-odd"> + 鍦ㄦ皵璞℃潯浠朵綆浜庣洰瑙嗛琛屾皵璞℃潯浠舵椂锛岃鏈夋棤绾跨數閫氫俊鍜屽畾浣嶄华琛ㄧ殑椋炴満鍙互渚濋潬浠〃鑰屼笉渚濋潬椋炶鍛樼殑瑙嗚鏉ラ琛岋紝杩欑椋炶绉颁负浠〃椋炶銆傞�備簬浠〃椋炶鐨勬皵璞℃潯浠舵瘮鐩椋炶鏉′欢瑕佷綆銆�</p> + <p class="p-odd">鍥介檯姘戣埅缁勭粐鍒跺畾浜嗙浉搴旂殑浠〃椋炶姘旇薄鏉′欢锛坕nstrument + </p> + </div> + </div> + </div> + <!-- 170椤� --> + <div class="page-box" page="178"> + <div v-if="showPageList.indexOf(178) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">170</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">meteorol-ogical + condition锛孖MC锛夈�傚湪杩欑鏉′欢涓嬶紝閫氬父椋炶鍛樼湅涓嶅埌鍏朵粬鐨勯鏈猴紝绠″埗鍛樿礋璐f妸杩欐灦椋炴満涓庡叾浠栭鏈烘垨闅滅鐗╅棿闅斿紑鏉ャ�備负姝わ紝瑙勫垯瑕佹眰杩涜浠〃椋炶鐨勯鏈哄繀椤昏澶囪瀹氱殑椋炶浠〃鍜屾棤绾跨數璁惧锛堣捣鐮佽鏈夊湴骞充华銆侀珮搴﹁〃銆佷綅缃寚绀轰华琛ㄥ拰楂橀銆佺敋楂橀閫氫俊璁惧锛夈�傞琛屽憳蹇呴』鍦ㄨ繖绫婚鏈轰笂鍩硅鍙栧緱浠〃椋炶鐨勯┚椹舵墽鐓у悗鎵嶈兘杩涜浠〃椋炶銆� + </p> + <p class="p-even"> + 浠〃椋炶鐨勬暣涓繃绋嬪浜庣鍒跺憳鐨勬帶鍒朵箣涓嬶紝姣忔椋炶閮借鍚戠┖涓氦閫氱鍒舵満鏋勬彁浜や竴涓寘鎷埅璺�侀�熷害銆侀珮搴︺�侀璁¢琛屾椂闂寸殑椋炶璁″垝锛岀鍒跺憳鏍规嵁杩欎釜璁″垝鏉ュ垎閰嶈埅璺�侀珮搴︼紝骞剁洃鎺у拰寮曞椋炴満鍦ㄧ┖涓琛屻�� + </p> + <p class="p-even">鍦ㄩ琛屼腑锛屼华琛ㄩ琛屽拰鐩椋炶鍙互鐩镐簰鍙樻崲锛屼絾鏄兘瑕佸厛鍚戠鍒跺憳鎻愬嚭瑕佹眰锛屽湪寰楀埌鍑嗚鍚庡啀鍙樻崲銆�</p> + <h4 id="d060" class="p-even unit4-c">浜斻�侀�氫俊鏍囧噯</h4> + <p class="p-even"> + 绌轰腑浜ら�氭湇鍔′富瑕佹槸閫氳繃鍦伴潰鐨勭鍒跺憳鍜岀┖涓琛屽憳涔嬮棿鐨勬棤绾跨數閫氳瘽鏉ュ畬鎴愮殑锛屽鏋滃湪浣跨敤鐨勯鐜囦笂鍜岄�氳瘽鐨勮瑷�涓婃病鏈夌粺涓�瑙勫畾锛屾垨鑰呭彂鐢熸贩娣嗭紝鍒欎細浣挎暣涓鍒惰繃绋嬪嚭鐜版贩涔憋紝閫犳垚涓嶅彲寮ヨˉ鐨勬崯澶便�傚洜姝わ紝瑕佸浣滀负鍩虹鐨勯�氫俊鍋氬嚭涓ユ牸鐨勮瀹氥�� + </p> + <h5 id="e073" class="p-even unit4-c">锛堜竴锛夐鐜囧垎閰�</h5> + <p class="p-even"> + 绌轰腑浜ら�氱鍒剁殑鏃犵嚎鐢甸鐜囧垎閰嶅湪鍏ㄤ笘鐣屾槸缁熶竴鐨勶紝闄嗙┖閫氫俊涓昏浣跨敤楂橀鍜岀敋楂橀銆傞珮棰戦�氬父浣滀负杩滆窛绂婚�氫俊鐨勪紶杈撴墜娈碉紝鐢氶珮棰戞槸绌轰腑浜ら�氱鍒惰繘琛岄檰绌洪�氳瘽鐨勪富瑕佹墜娈点�傚浗闄呮皯鑸粍缁囧鐢氶珮棰戠殑棰戦亾鍋氫簡璇︾粏鐨勫垎閰嶃�傚121.5MHz灏辨槸涓撻棬鐢ㄤ簬閬囬櫓椋炴満閫氫俊鐨勭敋楂橀棰戠巼锛岀敤浜庨鏈鸿揩闄嶆垨閬囬櫓鍚庤繘琛屾眰鏁戝拰搴旀�ョず浣嶃�� + </p> + <h5 id="e074" class="p-even unit4-c">锛堜簩锛夎瑷�鐨勮鑼�</h5> + <p class="p-even"> + 鍥介檯姘戣埅缁勭粐瑙勫畾绌轰腑浜ら�氱鍒堕�氳瘽缁熶竴浣跨敤鑻辫锛屽湪閫氳瘽涓换浣曚竴涓暟瀛楀拰瀛楁瘝浠ュ強璇嶄箟鐨勬贩娣嗛兘鍙兘閫犳垚涓嶅牚璁炬兂鐨勫悗鏋溿�備负姝わ紝鍥介檯姘戣埅缁勭粐瀵归�氳瘽鐢ㄧ殑鏁板瓧銆佸瓧姣嶄互鍙婄┖绠$敤鐨勪笓闂ㄨ瘝璇殑鍙戦煶鍜岃В閲婇兘鍋氫簡瑙勫畾銆傝〃4-1鍜�4-2鏄暟瀛楃殑鏍囧噯璇绘硶鍜屾爣鍑嗗瓧姣嶇殑鍙戦煶銆� + </p> + </div> + </div> + </div> + <!-- 171椤� --> + <div class="page-box" page="179"> + <div v-if="showPageList.indexOf(179) > -1"> + <ul class="fl al-c jc-fe mr-70 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰鍥�</li> + <li class="headerText">绌轰腑浜ら�氱鐞�</li> + <li class="headerNumber">171</li> + </ul> + <div class="bodystyle"> + <p class="img">琛�4-1 鏁板瓧鐨勬爣鍑嗚娉�<sup>鈶�</sup></p> + <p class="center "><img class="img-0" alt="" src="../../assets/images/0183-1.jpg" /></p> + <p class="img">琛�4-2 鏍囧噯瀛楁瘝鐨勫彂闊�<sup>鈶�</sup></p> + <p class="center"><img class="img-0" alt="" src="../../assets/images/0183-2.jpg" /></p> + <hr class=""> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 涓浗姘戠敤鑸┖鎬诲眬锛氥�婄┖涓氦閫氭棤绾跨數閫氳瘽鐢ㄨ銆嬶紝<a + href="http://www.caac.gov.cn/XXGK/XXGK/BZGF/HYBZ/201511/P020170804579259214829.pdf" + target="_blank">http://www.caac.gov.cn/XXGK/XXGK/BZGF/HYBZ/201511/P020170804579259214829.pdf</a>锛�2023-05-30銆� + </p> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 涓浗姘戠敤鑸┖鎬诲眬锛氥�婄┖涓氦閫氭棤绾跨數閫氳瘽鐢ㄨ銆嬶紝<a + href="http://www.caac.gov.cn/XXGK/XXGK/BZGF/HYBZ/201511/P020170804579259214829.pdf" + target="_blank">http://www.caac.gov.cn/XXGK/XXGK/BZGF/HYBZ/201511/P020170804579259214829.pdf</a>锛�2023-05-30銆� + </p> + </div> + </div> + </div> + <!-- 172椤� --> + <div class="page-box" page="180"> + <div v-if="showPageList.indexOf(180) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">172</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even">鍏朵粬璇稿楂樺害銆侀�熷害銆佹椂闂淬�侀鍚戙�侀閫熴�佽埅鍚戙�佽窇閬撳悕绉颁互鍙婁竴浜涢噸瑕佺殑璇嶅彞鐢ㄨ锛岄兘鏈夋槑纭殑瑙勫畾銆�</p> + <p class="p-even"> + 鑸┖杩愯鎺у埗鐨勫叏杩囩▼閮芥槸涓ヨ皑缁嗚嚧鐨勶紝杩欎竴鐐逛粠绌轰腑浜ら�氱鐞嗙殑鐩稿叧瑙勫畾涓彲瑙佷竴鏂戙�備綔涓轰竴鍚嶅噯姘戣埅浜猴紝鎴戜滑涓嶄粎瑕佺啛缁冩帉鎻′笓涓氱殑鐭ヨ瘑鍜屾妧鑳斤紝鑰屼笖瑕佸湪鏃ュ父鐨勫涔犲拰鐢熸椿涓吇鎴愪护琛岀姝㈢殑濂戒範鎯紝涓烘棩鍚庣殑宸ヤ綔鎵撲笅鑹ソ鐨勫熀纭�锛屼簤鍙栨棭鏃ユ垚涓轰竴鍚嶅悎鏍肩殑姘戣埅宸ヤ綔鑰呫�� + </p> + <h2 id="b004" class="p-even"><img class="inline1" alt="" src="../../assets/images/tzyy.jpg" /></h2> + <p class="block p-even td-0">1.浠�涔堟槸绌轰腑浜ら�氱鐞嗭紵绌轰腑浜ら�氭湇鍔$殑鐩殑鍜屽唴瀹规槸浠�涔堬紵</p> + <textarea v-model="expandQuestion.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'one' }" @focus="handleFocus('one')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">2.绌轰腑浜ら�氱鍒舵湇鍔$殑鐩殑涓庡唴瀹规湁鍝簺锛�</p> + <textarea v-model="expandQuestion.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'two' }" @focus="handleFocus('two')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">3.椋炶鎯呮姤鏈嶅姟鐨勭洰鐨勪笌鍐呭鏈夊摢浜涳紵</p> + <textarea v-model="expandQuestion.reading.three" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'three' }" @focus="handleFocus('three')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">4.绌哄煙绠$悊涓庣┖涓氦閫氭祦閲忕鐞嗘湁浣曠洰鐨勶紵瀹冧滑鍖呮嫭鍝簺鍏蜂綋鍐呭锛�</p> + <textarea v-model="expandQuestion.reading.four" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'four' }" @focus="handleFocus('four')" + @blur="handleBlur()"></textarea> + </div> + </div> + </div> + </div> +</template> + +<script> +export default { + name: "chapterfour", + props: { + showPageList: { + type: Array, + }, + }, + data(){ + return{ + isFocused: null, + expandQuestion: { + reading: { + one: "", + two: "", + three: "", + four: "", + }, + } + } + }, + mounted() { + const bookQuestion = localStorage.getItem("civilAviatyon-book-chapter04-expandQuestion"); + if (bookQuestion) { + this.expandQuestion = JSON.parse(bookQuestion); + } + }, + methods: { + handleFocus(id) { + this.isFocused = id; // 褰搕extarea鑱氱劍鏃讹紝璁剧疆涓簍rue + }, + handleBlur() { + this.isFocused = null; // 褰搕extarea澶卞幓鐒︾偣鏃讹紝璁剧疆涓篺alse + }, + setBookQuestion() { + localStorage.setItem( + "civilAviatyon-book-chapter04-expandQuestion", + JSON.stringify(this.expandQuestion) + ); + }, + } +}; +</script> + +<style lang="less" scoped> +.body { + display: flex; +} + +.imgBox { + display: flex !important; + flex-direction: column-reverse !important; + position: relative !important; + + .img { + margin: 0 !important; + font-size: 16px !important; + position: absolute !important; + left: 40% !important; + bottom: -2% !important; + } + + img { + height: 80%; + } +} +</style> \ No newline at end of file diff --git a/src/books/civilAviation/view/components/chapter005.vue b/src/books/civilAviation/view/components/chapter005.vue new file mode 100644 index 0000000..809474c --- /dev/null +++ b/src/books/civilAviation/view/components/chapter005.vue @@ -0,0 +1,2070 @@ +<template> + <div class="chapter" num="6"> + <!-- 绗簲鍗曞厓灏侀潰 --> + <div class="page-box" style="min-height: 1108px !important" page="181"> + <div v-if="showPageList.indexOf(181) > -1" class="fl"> + <img class="img-0" alt="" src="../../assets/images/0185.jpg" /> + </div> + </div> + <!-- 174椤� --> + <div class="page-box" page="182"> + <div v-if="showPageList.indexOf(182) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">174</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h2 id="b003" class="p-even "> + <img class="inline1" alt="" src="../../assets/images/zszb.jpg" /> + </h2> + <h3 id="c001" class="p-even unit5-c"> + 瀛︿範浠诲姟涓�<br />璁よ瘑绌烘腐 + </h3> + <div class="task-u5-c ma-l"></div> + <p class="p-even">鍙緵椋炴満鍋滄斁銆佽捣闄嶃�佺淮鎶ゅ拰缁勭粐椋炶淇濋殰娲诲姩鐨勫満鎵�绉颁负鏈哄満锛岀敤浜庤埅绌鸿繍杈撶殑鏈哄満閫氬父鍙堢О涓鸿埅绌烘腐锛岀畝绉扮┖娓��</p> + <p class="p-even"> + 1903骞磋幈鐗瑰厔寮熷彂鏄庨鏈猴紝褰撴椂骞舵病鏈夋満鍦猴紝闅忓悗鐨勫嚑骞撮噷鐩哥户鏈夎埅绌虹埍濂借�呭埗閫犻鏈烘垚鍔燂紝浣嗕篃娌℃湁涓撻棬鐨勬満鍦猴紝浜轰滑鍙渶瑕佹壘涓�鐗囧钩鍦板氨鍙互璧烽檷椋炴満銆傞殢鐫�椋炴満鏁伴噺銆佹�ц兘鍜岀敤閫旂殑鍙戝睍锛屾満鍦轰篃搴旇繍鑰岀敓銆� + </p> + <h4 id="d061" class="p-even unit5-c">涓�銆佺┖娓彂灞曠殑鍘嗗彶姒傚喌</h4> + <p class="p-even">鏈哄満缁忓巻浜嗕粠鏃犲埌鏈夈�佷粠灏忓埌澶с�佷粠鍔熻兘鍗曚竴鍒板姛鑳藉鏍风殑鍙戝睍鍘嗙▼銆�</p> + <p class="p-even"> + 绗竴闃舵锛�1910鈥�1920骞达級锛氭渶鏃╃殑椋炴満璧烽檷鍦扮偣涓�鑸槸鍦ㄥ渾褰㈣崏鍧笂锛岄鏈哄彲浠ュ湪浠讳綍瑙掑害锛岄『鐫�鏈夊埄鐨勯鍚戣繘琛岃捣闄嶏紝鍛ㄥ洿浼氭湁涓�涓鍚戜华銆傚綋鏃剁殑椋炴満澶氱敱鏈ㄥご鍙婂竼甯冨埗浣滆�屾垚锛屼笉鑳芥壙鍙楁棩鏅掗洦娣嬶紝鎵�浠ユ惌寤轰簡绠�鏄撶殑甯愮鏈哄簱鏉ュ瓨鏀鹃鏈猴紝骞舵湁宸ヤ綔浜哄憳鍙備笌绠$悊銆傚叾闂撮櫎鍐涗簨椋炶澶栵紝鏈哄満鍙负鑸┖鐖卞ソ鑰呯殑椋炶璇曢獙鎻愪緵鏈嶅姟锛屼笉瀵圭ぞ浼氭湇鍔★紝鎵�浠ヨ繖鏈熼棿鐨勬満鍦哄彧鏄�滈琛屽憳鐨勬満鍦衡�濄�� + </p> + <p class="p-even"> + 绗簩闃舵锛�1921鈥�1960骞达級锛氶殢鐫�绗竴娆′笘鐣屽ぇ鎴樼殑缁撴潫锛屾皯鑸繍杈撲笟閫愭笎鍏磋捣鍜屽彂灞曪紝鏈哄満涔熷氨澶ч噺鍏村缓璧锋潵銆傝繖涓椂鏈燂紝鑸┖鎶�鏈殑杩� + </p> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0186-1.jpg" /> + <p class="img">鍥�5-1 鏃╂湡鏈哄満</p> + </div> + <span> + <p class="p-even td-0"> + 姝ワ紝椋炴満瀵规満鍦虹殑瑕佹眰涓嶆柇鎻愰珮锛屾満鍦轰腑鍑虹幇浜嗗悇绉嶆柊鍏寸殑寤鸿闇�姹傘�備负婊¤冻閫氫俊銆佽埅绠°�佽窇閬撴�ц兘鐨勮姹備互鍙婃梾瀹㈣繘鍑烘満鍦虹殑闇�瑕侊紝鏈哄満淇缓浜嗗鍙般�佹贩鍑濆湡璺戦亾鍜屽�欐満妤硷紝宸插熀鏈嚭鐜扮幇浠f満鍦虹殑闆忓舰锛屼絾绀句細鏈嶅姟鍔熻兘鏈夐檺锛屼富瑕佷负椋炴満鍜屾梾瀹㈡湇鍔★紝鍙兘绉颁负鈥滈鏈虹殑鏈哄満鈥濄�傛棭鏈熸満鍦哄鍥�5-1鎵�绀恒�� + </p> + </span> + </div> + </div> + </div> + <!-- 175椤� --> + <div class="page-box" page="183"> + <div v-if="showPageList.indexOf(183) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">175</li> + </ul> + <div class="bodystyle"> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0187-1.jpg" /> + <p class="img">鍥�5-2 鐜颁唬鏈哄満</p> + </div> + <span> + <p class="p-odd"> + 绗笁闃舵锛�1961骞磋嚦浠婏級锛岄殢鐫�姘戣埅杩涘叆鍥介檯鍖栥�佸ぇ浼楀寲鐨勫彂灞曢樁娈碉紝鑸┖杩愯緭鎴愪负杩愯緭涓氱殑閲嶈缁勬垚閮ㄥ垎銆傚ぇ鍨嬪柗姘斿紡瀹㈡満琚箍娉涢噰鐢紝瀵规満鍦洪琛屽尯鐨勮姹備篃閫愭鎻愰珮锛涘璐ф祦閲忓鍔狅紝瀵规満鍦哄湴闈㈣繍杈撳尯涔熸彁鍑轰簡鏂扮殑瑕佹眰锛涜埅鐝暟閲忋�佸璐ф祦閲忓鍔犱娇鏈哄満鐨勫湡鍦颁娇鐢ㄣ�佸櫔澹扮瓑闂鏃ユ笎绐佸嚭銆傝繖涓�鏃舵湡鏈哄満鎴愪簡鏁翠釜绀句細鐨勪竴閮ㄥ垎锛屼汉浠敓娲绘按骞崇殑鎻愰珮锛屽鏈嶅姟鍝佽川鐨勮拷姹傦紝浣垮叾绀句細鏈嶅姟鍔熻兘鏃ユ笎瀹屽杽銆傝繖涓�鏃舵湡鐨勬満鍦虹О涓衡�滅ぞ浼氱殑鏈哄満鈥濄�傜幇浠f満鍦哄鍥�5-2鎵�绀恒�� + </p> + </span> + <p class="p-odd"> + 鎴戝浗鑷�1920骞村紑閫氫含娲ヨ埅绾垮悗锛屽氨鍦ㄥぉ娲ュ拰鍖椾含鍑虹幇浜嗘皯鐢ㄨ埅绌烘腐锛岄殢鍚庡湪鍏ㄥ浗鍚勫ぇ鍩庡競寤虹珛浜嗘皯鐢ㄨ埅绌烘腐锛屽紑杈熶簡鑸嚎銆傚湪鏂颁腑鍥芥垚绔嬪墠锛岀敱浜庣粡鍘嗕簡杈冮暱鏃堕棿鐨勬垬涔憋紝姘戠敤鑸┖娓殑寤鸿鐩稿綋钀藉悗銆傛柊涓浗鎴愮珛涔嬪悗锛屽啗濮旀皯鑸眬绔嬪嵆鐫�鎵嬭繘琛屼簡姘戠敤鑸┖娓缓璁惧伐浣滐紝鍏堟槸鎵╁缓澶╂触寮犺吹搴勮埅绌烘腐銆佸お鍘熼綈璐よ埅绌烘腐鍜屾姹夊崡婀栬埅绌烘腐锛屼箣鍚庢柊寤轰簡鍖椾含棣栭兘鑸┖娓�佹垚閮藉弻娴佽埅绌烘腐绛夈�� + </p> + <p class="p-odd"> + 1978骞达紝瀹炴柦鏀归潻寮�鏀炬斂绛栦箣鍚庯紝姘戠敤鑸┖娓缓璁捐繘鍏ヤ簡椋為�熷彂灞曢樁娈碉紝鎴戝浗鐨勭粡娴庣壒鍖哄拰娌挎捣寮�鏀惧煄甯傜瓑鎶婃皯鐢ㄨ埅绌烘腐寤鸿浣滀负寮�鍙戠壒鍖哄拰鍙戝睍鏈湴缁忔祹鐨勯噸瑕佹姄鎵嬶紝鐩哥户鏂板缓銆佹墿寤轰簡涓�鎵瑰ぇ鍨嬫皯鐢ㄨ埅绌烘腐銆�1984 + </p> + <div class="img-rights w200"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 鏈夌殑鍩庡競瀹㈣揣娴侀噺涓嶅ぇ锛屽崟鐙慨寤烘満鍦烘剰涔変笉澶э紝濡傛灉闄勮繎鏈夊啗鐢ㄦ満鍦猴紝姘戣埅寰�寰�涓庨儴闃熷悎浣滃叡鍚屼娇鐢ㄤ竴涓満鍦猴紝绉颁负鍐涙皯鍚堢敤鏈哄満銆傛垜鍥介儴鍒嗘皯鑸繍杈撴満鍦哄疄璐ㄤ笂浠嶆槸鍐涙皯鍚堢敤鏈哄満锛屽鑻忓崡纭曟斁鍥介檯鏈哄満銆佹硥宸炴檵姹熷浗闄呮満鍦恒�� + </p> + </div> + </div> + <span> + <p class="p-odd td-0"> + 骞村悗锛岀渷浼氬煄甯備互鍙婁竴浜涘ぇ涓煄甯備篃鐩哥户鏂板缓銆佹墿寤轰簡涓�鎵逛腑灏忓瀷鑸┖娓�傚埌2001骞达紝鎴戝浗鍦ㄦ墍鏈夌殑鐪佷細鍩庡競銆佺洿杈栧競銆佽嚜娌诲尯棣栧簻銆佹部娴峰紑鏀惧煄甯傚拰涓昏鏃呮父鍩庡競閮藉缓绔嬩簡璁炬柦榻愬叏鐨勬皯鐢ㄨ埅绌烘腐锛屽湪鍏朵粬鍦板尯涔熷缓绔嬩簡瑙勬ā杈冨皬鐨勬皯鐢ㄨ埅绌烘腐锛屽熀鏈笂婊¤冻浜嗘垜鍥界粡娴庣ぞ浼氬揩閫熷彂灞曞姘戣埅杩愯緭涓氱殑瑕佹眰銆� + </p> + <h4 id="d062" class="p-odd unit5-c">浜屻�佹満鍦虹殑鍒嗙被</h4> + <p class="p-odd">鏍规嵁鐢ㄩ�斾笉鍚岋紝鏈哄満鍙垎涓哄啗鐢ㄦ満鍦哄拰姘戠敤鏈哄満涓ゅぇ绫汇��</p> + <p class="p-odd">姘戠敤鏈哄満鎸夋湇鍔℃�ц川鍙垎涓虹敤浜庢皯鑸繍杈撶殑杩愯緭鏈�</p> + + </span> + </div> + </div> + </div> + <!-- 176椤� --> + <div class="page-box" page="184"> + <div v-if="showPageList.indexOf(184) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">176</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">鍦猴紙绌烘腐锛夈�侀�氱敤鏈哄満鍜屽崟浣嶆垨绉佷汉鏈哄満銆傜┖娓寜鍚炲悙閲忓拰瑙勬ā鍙堝彲鍒嗕负鏋㈢航绌烘腐銆侀噸瑕佺┖娓�佷竴鑸┖娓瓑锛堝浘5-3锛夈��</p> + <p class="center openImgBox p-even"><img class="img-d" alt="" + src="../../assets/images/0188-1.jpg" /></p> + <p class="img">鍥�5-3 鏈哄満鐨勫垎绫�</p> + <h5 id="e075" class="p-even unit5-c">锛堜竴锛夋灑绾界┖娓�</h5> + <p class="p-even"> + 鏋㈢航绌烘腐鎵�渚濇墭鐨勫煄甯傚叿鏈夊彂灞曡埅绌鸿繍杈撶殑浼樿秺鑷劧鏉′欢锛屼竴鑸槸鍥藉鐨勬斂娌汇�佺粡娴庡拰鏂囧寲涓績锛屽澶勫湪閲嶈鐨勫浗闄呰埅绾夸笂锛屾槸鍥介檯銆佸浗鍐呰埅绾块潪甯稿瘑闆嗙殑鍦板尯锛屾梾瀹㈠湪姝ゅ彲浠ュ緢鏂逛究鍦颁腑杞埌鍏朵粬绌烘腐銆傝繖绫诲煄甯傚彲鑳芥嫢鏈夊涓満鍦猴紝杩欎簺鏈哄満浜掔浉鍒嗗伐鍚堜綔锛屽叡鍚屾瀯鎴愯鍩庡競鐨勭┖娓�傛垜鍥藉凡褰㈡垚鍖椾含銆佷笂娴枫�佸箍宸炰笁澶ф灑绾界┖娓紝鍏朵腑涓婃捣绌烘腐鍖呮嫭铏规ˉ鍜屾郸涓滀袱涓満鍦猴紝涓夊ぇ鏋㈢航绌烘腐鐨勬�诲悶鍚愰噺鍗犲叏鍥界殑40%浠ヤ笂銆傛垚閮界┖娓敱浜庡湪鎴戝浗鑸矾缃戜腑鏈夊緱澶╃嫭鍘氱殑鍦扮悊浣嶇疆鍜屾満鍦鸿妯★紝鍗冲皢鎴愪负鎴戝浗鐨勭鍥涘ぇ鏋㈢航绌烘腐銆� + </p> + <h5 id="e076" class="p-even unit5-c">锛堜簩锛夐噸瑕佺┖娓�</h5> + <p class="p-even"> + 閲嶈绌烘腐鏄湪涓�涓浗瀹跺崰鎹潃閲嶈鍦颁綅鐨勭┖娓紝鍦ㄦ暣涓浗瀹剁殑鑸┖杩愯緭缃戜腑璧风潃鏍稿績浣滅敤銆傚畠鎵�渚濇墭鐨勫煄甯備竴鑸槸涓�涓湴鍖虹殑鏀挎不銆佺粡娴庡拰鏂囧寲涓績锛屽湪鍏ㄥ浗涔熸湁涓�瀹氱殑褰卞搷鍔涖�備笘鐣屼笂寰堝鍥藉渚濇嵁瀹㈣揣鍚炲悙閲忥紝灏嗗勾瀹㈣揣鍚炲悙閲忓崰鍏ㄥ浗1%浠ヤ笂鐨勭┖娓垝涓洪噸瑕佺┖娓紝鎴戝浗涓�鑸妸瀵瑰寮�鏀剧殑鍥介檯绌烘腐浣滀负閲嶈绌烘腐鐨勬爣鍑嗐�� + </p> + <h5 id="e077" class="p-even unit5-c">锛堜笁锛変竴鑸┖娓�</h5> + <p class="p-even"> + 闄ゆ灑绾界┖娓�侀噸瑕佺┖娓箣澶栫殑灏忓瀷绌烘腐绉颁负涓�鑸┖娓紝杩欑被绌烘腐鐨勫璐у悶鍚愰噺涓嶅ぇ锛屼絾鍦ㄥ叏鍥界殑鑸矾缃戜笂璧风潃涓嶅彲鎴栫己鐨勪綔鐢ㄣ�傚紑閫氭敮绾胯埅绾匡紝鎶婂婧愰泦涓湪骞茬嚎涓婏紝鎻愰珮椋炴満鐨勫搴х巼銆佽浇杩愮巼锛屾彁楂樿埅绌哄叕鍙哥殑缁忔祹鏁堢泭锛屽悓鏃讹紝涔熻В鍐充簡閮ㄥ垎鍦板尯浜ら�氬舰寮忓崟涓�銆佷氦閫氫笉渚跨瓑闅鹃锛屽鍦板尯鐨勭粡娴庡彂灞曡捣鐫�閲嶈浣滅敤锛屾槸姘戣埅杩愯緭缃戠殑閲嶈缁勬垚閮ㄥ垎銆� + </p> + </div> + </div> + </div> + <!-- 177椤� --> + <div class="page-box" page="185"> + <div v-if="showPageList.indexOf(185) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">177</li> + </ul> + <div class="bodystyle"> + <p class="p-odd">鏈夌殑绌烘腐鏇剧粡浠庝簨鑸┖杩愯緭锛屽悗鏉ョ敱浜庡悇绉嶅師鍥犺浆涓哄啗鐢ㄦ満鍦猴紝鎴栦笉鍐嶄娇鐢紝澶勪簬鍋滅敤鎴栦繚绠$姸鎬侊紝濡傛湁闇�瑕佸彲鍐嶆鍚敤锛岃繖绫荤┖娓彨澶囩敤绌烘腐銆�</p> + <h4 id="d063" class="p-odd unit5-c">涓夈�佺┖娓湪缁忔祹鍙戝睍涓殑浣滅敤</h4> + <h5 id="e078" class="p-odd unit5-c">锛堜竴锛夌┖娓槸浜ら�氳仈绯荤殑鏋㈢航</h5> + <p class="p-odd"> + 鑸┖杩愯緭鍏锋湁蹇�熸�у拰鏈哄姩鎬х殑鐗圭偣锛屼娇绌烘腐鎴愪负涓�涓浗瀹朵氦閫氳繍杈撲腑鏈�閲嶈鐨勭粨鍚堢偣銆傜┖娓�氳繃鎵�渚濇墭鐨勪腑蹇冨煄甯傝兘鎻愪緵鐨勬墍鏈変氦閫氭柟寮忎究鎹峰湴涓庡叾浠栧煄甯傜浉杩烇紝杩涜�岃緪灏勫埌鍛ㄨ竟鍦板尯锛岃鑸┖杩愯緭铻嶅叆褰撳湴鐨勪氦閫氳繍杈撶綉缁滐紝鏄繖浜涘湴鍖洪�氬悜鏈浗鏀挎不銆佺粡娴庛�佹枃鍖栦腑蹇冨拰閫氬悜鍥介檯鐨勯棬鎴枫�� + </p> + <h5 id="e079" class="p-odd unit5-c">锛堜簩锛夊鎶曡祫鏈夊緢寮虹殑鍚稿紩鍔�</h5> + <p class="p-odd"> + 闅忕潃缁忔祹鍏ㄧ悆鍖栵紝璁稿澶у瀷璺ㄥ浗缁忔祹瀹炰綋鐪嬩腑缁忔祹鐩稿钀藉悗鐨勫浗瀹跺拰鍦板尯鐨勪綆寤夊湴浠枫�佷汉鍔涜祫婧愶紝涓轰簡闄嶄綆鎴愭湰銆佹彁楂樼珵浜夊姏锛屽ぇ閲忕殑璧勬湰寮�濮嬪悜杩欎簺鍦板尯杞Щ锛屾姇璧勫缓鍘傘�傛姇璧勭粰杩欎簺閫愭寮�鏀句腑鐨勫湴鍖哄甫鏉ヤ簡鐢熸満鍜屾椿鍔涳紝浣嗘姇璧勭殑鍏堝喅鏉′欢鏄В鍐充汉鍛樺拰鐗╄祫杩涘嚭鐨勯�氶亾锛屼互渚夸汉鍛樿兘渚垮埄鍦板線鏉ャ�佷骇鍝佽兘椤虹晠鍦拌繍杈擄紝閫氳繃绌烘腐寤虹珛鐨勭┖涓�氶亾灏辨槸鏈�鏈夊惛寮曞姏鐨勮繍杈撻�斿緞銆� + </p> + <h5 id="e080" class="p-odd unit5-c">锛堜笁锛夌┖娓粡娴庡姞閫熷綋鍦扮粡娴庡彂灞�</h5> + <p class="p-odd"> + 渚濇墭绌烘腐銆佸�熷姪绌烘腐鐨勬帹鍔ㄥ姏鑰屽甫鍔ㄦ垨褰㈡垚鐨勪骇涓氱粡娴庝綋绯诲彨绌烘腐缁忔祹銆傞殢鐫�鍏ㄧ悆缁忔祹涓�浣撳寲鐨勬浼愬姞蹇紝绌烘腐缁忔祹鐨勪綔鐢ㄤ篃瓒婃潵瓒婃槑鏄撅紝浼撮殢绌烘腐鑰岃鐢熷嚭鏉ョ殑浜т笟娲诲姩涔熷揩閫熷彂灞曘�傜┖娓槸鍏ㄧ悆浜т笟瑕佺礌鐨勭粨鍚堢偣锛屽畠闆嗗璐ц繍杈撴湇鍔°�佽埅绌洪厤椁愩�佽埅娌硅埅鏉愪緵搴斾互鍙婂洿缁曞璐ц繍杈撴湇鍔℃墍闇�鐨勯厤濂楁湇鍔′簬涓�浣擄紝褰㈡垚浜嗕竴涓皬绀句細銆傞殢鐫�鍥介檯鐗╂祦鍚炲悙閲忕殑澧炲ぇ锛岀┖娓嚜韬殑绀句細灞炴�ц秺鏉ヨ秺鏄庢樉銆傚埄鐢ㄥ叾鍟嗗搧銆佷俊鎭�佷汉鎵嶉泦鏁e湴鐨勪紭鍔匡紝鍙彁渚涙壒鍙戙�侀厤閫併�佷粨鍌ㄤ笟銆佸嚭鍙e姞宸ュ強鑷敱璐告槗绛夊叏鏂逛綅澧炲�兼湇鍔★紝绌烘腐鍏锋湁浜嗗煄甯傛墍鏈夌殑鍔熻兘锛屼娇绌烘腐鍜屽懆杈瑰湴鍖洪鍏堢箒鑽h捣鏉ワ紝闅忎箣灏嗕細甯︽潵鍦颁环涓婃定銆佹埧鍦颁骇澧炲�肩瓑鏁堝簲锛屾彁鍗囧煄甯傜殑鍦颁綅锛屼娇鏁翠釜鍦板尯鐨勮储瀵屽鍔犮�� + </p> + <h5 id="e081" class="p-odd unit5-c">锛堝洓锛変负绀句細鎻愪緵灏变笟宀椾綅</h5> + <p class="p-odd">闅忕潃鏈哄満鏃呭閲忕殑閫愬勾澧炲姞锛岀┖娓妯¢�愭笎鎵╁ぇ锛屽綋鍦版斂搴滃彲鎶撲綇绌烘腐鍙戝睍瀵瑰煄甯傜粡娴庡彂灞曠殑鏈洪亣锛屼緷鎵樼┖娓�佸埄鐢ㄧ┖娓�佹湇鍔$┖娓�傜┖娓殑 + </p> + </div> + </div> + </div> + <!-- 178椤� --> + <div class="page-box" page="186"> + <div v-if="showPageList.indexOf(186) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">178</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鍙戝睍涓嶄粎鎻愪緵浜嗗�兼満銆佸畨妫�銆佹満鍔$瓑鍦伴潰鍕ゅ姟宀椾綅锛屽叾瑙勬ā鐨勬墿澶т篃甯﹀姩绌烘腐鍟嗕笟鏈嶅姟鍖虹殑鎵╁ぇ锛屼负褰撳湴鍔冲姩浜虹兢鎻愪緵鏇村灏变笟鏈轰細銆傚悓鏃讹紝绌烘腐鐨勫彂灞曚篃浼氬甫鍔ㄥ懆杈圭殑鍟嗕笟銆佸埗閫犱笟绛夊彂灞曪紝閫傚綋缂撹В灏变笟鍘嬪姏锛屽疄鐜扮粡娴庡畯瑙傚彂灞曘�� + </p> + <p class="p-even">鍚屾椂锛岀┖娓槸杩炴帴褰撳湴涓庡鐣岀殑楂橀�熼�氶亾锛岀缉鐭簡涓庝笘鐣岀殑璺濈锛屼娇鍦版柟缁忔祹铻嶅叆涓栫晫缁忔祹鍙戝睍鐨勬疆娴侊紝涓庝笘鐣屽悓姝ラ珮閫熷彂灞曘��</p> + </div> + </div> + </div> + <!-- 179椤� --> + <div class="page-box" page="187"> + <div v-if="showPageList.indexOf(187) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">179</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-odd unit5-c"> + 瀛︿範浠诲姟浜�<br />绌烘腐鐨勬瀯鎴� + </h3> + <div class="task-u5-c "></div> + <p class="p-odd"> + 绌烘腐锛堝浘5-4锛夋棤璁鸿妯″ぇ灏忥紝閮藉彲鍒嗕负椋炶鍖恒�佸�欐満妤煎尯鍜屽湴闈㈣繍杈撳尯涓夊ぇ閮ㄥ垎銆傚叾涓琛屽尯鏄鏈烘椿鍔ㄧ殑鍖哄煙锛屽湴闈㈣繍杈撳尯鏄溅杈嗗拰浜哄憳娲诲姩鐨勫尯鍩燂紝鍊欐満妤煎尯杩炴帴椋炶鍖轰笌鍦伴潰杩愯緭鍖猴紝涓虹娓梾瀹㈡彁渚涚櫥鏈烘湇鍔″拰涓哄埌娓梾瀹㈡彁渚涘埌杈炬湇鍔°�� + </p> + <p class="center p-odd openImgBox"><img class="img-b" alt="" src="../../assets/images/0191-1.jpg" /> + </p> + <p class="img p-odd">鍥�5-4 绌烘腐</p> + <h4 id="d064" class="p-odd unit5-c">涓�銆侀琛屽尯</h4> + <p class="p-odd"> + 椋炶鍖烘槸绌烘腐涓鏈烘椿鍔ㄧ殑鍖哄煙锛屽寘鎷┖涓儴鍒嗗拰鍦伴潰閮ㄥ垎銆傜┖涓儴鍒嗕富瑕佹槸鎸囬鏈鸿繘鍦哄拰绂诲満鐨勮埅璺紝鍦伴潰閮ㄥ垎鍖呮嫭璺戦亾銆佹粦琛岄亾銆佸仠鏈哄潽鍜屾満鍦鸿緟鍔╃潃闄嗚鏂界瓑銆傝繖閲屼富瑕佷粙缁嶅湴闈㈤儴鍒嗐��</p> + + <div class="pdf-text"> + <div class="pdf-con"> + <div class="pdf-view"> + <span> + <svg t="1717640665152" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="11009" width="25.098" height="24.098"> + <path + d="M896.152 336.108l0 576.229c0 26.511-21.508 48.019-48.018 48.019L175.866 960.356c-26.511 0-48.019-21.508-48.019-48.019L127.847 112.019c0-26.511 21.508-48.019 48.019-48.019l448.179 0c26.512 0 63.527 15.508 82.031 34.013l156.064 156.064C880.645 272.582 896.152 309.597 896.152 336.108zM832.127 384.127 624.045 384.127c-26.512 0-48.02-21.508-48.02-48.019L576.025 128.025 191.873 128.025l0 768.306 640.254 0L832.127 384.127zM335.93 448.153l352.14 0c9.004 0 16.006 7.003 16.006 16.006l0 32.013c0 9.003-7.002 16.007-16.006 16.007L335.93 512.179c-9.003 0-16.006-7.003-16.006-16.007l0-32.013C319.924 455.156 326.927 448.153 335.93 448.153zM704.076 592.21l0 32.013c0 9.004-7.002 16.007-16.006 16.007L335.93 640.23c-9.003 0-16.006-7.003-16.006-16.007L319.924 592.21c0-9.003 7.003-16.006 16.006-16.006l352.14 0C697.074 576.204 704.076 583.207 704.076 592.21zM704.076 720.262l0 32.013c0 9.003-7.002 16.006-16.006 16.006L335.93 768.281c-9.003 0-16.006-7.003-16.006-16.006l0-32.013c0-9.004 7.003-16.007 16.006-16.007l352.14 0C697.074 704.255 704.076 711.258 704.076 720.262zM640.051 320.102l188.076 0c-3.002-8.505-7.502-17.009-11.002-20.511L660.563 143.029c-3.502-3.501-12.006-8-20.512-11.003L640.051 320.102z" + p-id="11010"></path> + </svg> + </span> + <span @click="toUrl(1)">{{ chapter005.pdfMd5[1].name }}.pdf</span> + </div> + </div> + </div> + </div> + </div> + </div> + <!-- 180椤� --> + <div class="page-box" page="188"> + <div v-if="showPageList.indexOf(188) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">180</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e082" class="p-even unit5-c">锛堜竴锛夎窇閬�</h5> + <h6 id="f032" class="p-even">1.椋炶鍖虹瓑绾�</h6> + <p class="p-even"> + 璺戦亾鏄寚椋炴満鍦哄唴渚涜埅绌洪琛屽櫒璧烽鎴栭檷钀界殑瓒呴暱鏉″舰鍖哄煙锛屽叾鏉愯川鍙互鏄播闈掓垨娣峰嚌鍦燂紝鎴栬�呮槸寮勫钩鐨勮崏銆佸湡鎴栫鐭冲湴闈紝涔熷彲浠ユ槸姘撮潰锛岀敋鑷冲彲浠ユ槸鏈ㄦ澘銆侀〉宀┿�佺強鐟氳櫕銆侀粡鍦熺瓑閾鸿鐨勩�傜幇鍦ㄥ叏鐞冭寖鍥村唴璺戦亾鏅亶浠ラ檰鍦颁负鍩虹銆� + </p> + <p class="p-even"> + 璺戦亾鏄┖娓殑閲嶈缁勬垚閮ㄥ垎锛屾槸绌烘腐鍖哄埆浜庤溅绔欍�佺爜澶寸瓑瀹㈣揣闆嗘暎鍦扮殑鏄庢樉鏍囧織銆傝窇閬撶殑闀垮害銆佸搴︺�佸己搴︿互鍙婂噣绌烘潯浠跺喅瀹氫簡鍙互璧烽檷鐨勯鏈虹被鍨嬶紝绌烘腐椋炶鍖虹瓑绾ф槸鏍规嵁璺戦亾鎬ц兘鏉ュ垝鍒嗙殑銆�</p> + <p class="p-even"> + 椋炶鍖虹瓑绾х敱涓や釜瀛楃鏋勬垚锛氱涓�涓瓧绗︽槸鏁板瓧锛岃〃绀哄彲渚涢鏈鸿捣闄嶇殑鍦哄湴闀垮害锛涚浜屼釜瀛楃涓哄瓧姣嶏紝琛ㄧず鍙緵璧烽檷椋炴満鐨勬渶澶х考灞曞拰鏈�澶ц疆璺濓紙涓や釜涓昏捣钀芥灦鏈鸿疆澶栦晶鐨勯棿璺濓級銆傛暟瀛楀叡鏈�1銆�2銆�3銆�4鍥涗釜绛夌骇锛屾暟瀛楄秺澶э紝琛ㄦ槑鍦哄湴闀垮害瓒婇暱锛涘瓧姣嶆湁A銆丅銆丆銆丏銆丒銆丗鍏釜绛夌骇锛屽瓧姣嶈秺寰�鍚庯紝琛ㄦ槑鑳借捣闄嶇殑椋炴満鏈�澶х考灞曞拰鏈�澶ц疆璺濊秺澶с�傚彲绠�鍗曞湴鐞嗚В涓猴細鏁板瓧鍙嶆槧浜嗚窇閬撻暱搴︼紝瀛楁瘝琛ㄧず璺戦亾鐨勫搴︺�傛牴鎹浗闄呮皯鑸粍缁囩殑瑙勫畾锛岄琛屽尯绛夌骇渚濇嵁鎸囨爣鈪犲拰鎸囨爣鈪℃潵鍒掑垎锛岃琛�5-1銆� + </p> + <p class="img">琛�5-1 椋炶鍖虹瓑绾ф寚鏍�<sup>鈶�</sup></p> + <p class="center p-even"><img class="img-0" alt="" src="../../assets/images/0192-1.jpg" /></p> + <p class="p-even"> + 涓栫晫涓婄敓浜х殑鑸┖鍣ㄥぇ澶氭湁鍏跺搴旂殑椋炶鍖烘寚鏍囷紝鍙湁宸茬粡鎹熸瘉鐨勫畨-225鍨嬭繍杈撴満瓒呭嚭浜�4F绾э紝鍏剁考灞曡揪88.4m锛岃秴鍑轰簡F绫荤考灞曪紙65锝�80m锛夈�侳绫讳富娴佹皯鑸満鍨嬪寘鎷笁绉嶏紝鍗矨380銆丅747-8銆丅777-9锛圔777X锛夈�� + </p> + <hr class="ma-l"> + <p class="p-even note td-0"><a id="m1">鈶�</a> 鎽樿嚜銆婃皯鐢ㄦ満鍦洪琛屽尯鎶�鏈爣鍑嗐�嬶紙MH5001鈥�2021锛夈��</p> + </div> + </div> + </div> + <!-- 181椤� --> + <div class="page-box" page="189"> + <div v-if="showPageList.indexOf(189) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">181</li> + </ul> + <div class="bodystyle"> + <p class="p-odd">鏍规嵁涓浗姘戠敤鑸┖灞�鐨勬暟鎹紝鎴嚦2022骞�12鏈堬紝鎴戝浗鍏辨湁254涓皯鑸満鍦猴紝鍏朵腑15涓�4F绾с��39涓�4E绾с��37涓�4D绾с��158涓�4C绾с��4涓�3C绾с��1涓�1B绾с�� + </p> + <div class="bj4"> + <div class="fl al-c mb-10"> + <div class="bj4-xyx"> + 鐩稿叧<br>閾炬帴 + </div> + <div class="bj4-xyx-icon"> + 鈻� 鈻� + </div> + <p><b style="color: #5192C6">鏈哄瀷涓庨琛屽尯鎸囨爣鍏崇郴 </b><sup style="color: #5192C6">鈶�</sup></p> + </div> + <p class="center openImgBox"><img class="img-0" alt="" src="../../assets/images/0193-1.jpg" /> + </p> + </div> + <hr class=""> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 鎽樿嚜銆婃皯鐢ㄦ満鍦洪琛屽尯鎶�鏈爣鍑嗐�嬶紙MH5001鈥�2021锛夈��</p> + </div> + </div> + </div> + <!-- 182椤� --> + <div class="page-box" page="190"> + <div v-if="showPageList.indexOf(190) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">182</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <div class="fl al-c mb-10"> + <p class="td-0"><b style="color: #5192C6">涓浗澧冨唴4F绾ф皯鑸満鍦猴紙涓嶅惈娓境鍙板湴鍖猴級鎯呭喌</b></p> + </div> + <p class="center openImgBox"><img class="img-0" alt="" src="../../assets/images/0194-1.jpg" /> + </p> + </div> + <h6 id="f033" class="p-even">2.璺戦亾鏂瑰悜鍜岃窇閬撳彿</h6> + <div class="pdf-text p-even"> + <div class="pdf-con"> + <div class="pdf-view"> + <span> + <svg t="1717640665152" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="11009" width="25.098" height="24.098"> + <path + d="M896.152 336.108l0 576.229c0 26.511-21.508 48.019-48.018 48.019L175.866 960.356c-26.511 0-48.019-21.508-48.019-48.019L127.847 112.019c0-26.511 21.508-48.019 48.019-48.019l448.179 0c26.512 0 63.527 15.508 82.031 34.013l156.064 156.064C880.645 272.582 896.152 309.597 896.152 336.108zM832.127 384.127 624.045 384.127c-26.512 0-48.02-21.508-48.02-48.019L576.025 128.025 191.873 128.025l0 768.306 640.254 0L832.127 384.127zM335.93 448.153l352.14 0c9.004 0 16.006 7.003 16.006 16.006l0 32.013c0 9.003-7.002 16.007-16.006 16.007L335.93 512.179c-9.003 0-16.006-7.003-16.006-16.007l0-32.013C319.924 455.156 326.927 448.153 335.93 448.153zM704.076 592.21l0 32.013c0 9.004-7.002 16.007-16.006 16.007L335.93 640.23c-9.003 0-16.006-7.003-16.006-16.007L319.924 592.21c0-9.003 7.003-16.006 16.006-16.006l352.14 0C697.074 576.204 704.076 583.207 704.076 592.21zM704.076 720.262l0 32.013c0 9.003-7.002 16.006-16.006 16.006L335.93 768.281c-9.003 0-16.006-7.003-16.006-16.006l0-32.013c0-9.004 7.003-16.007 16.006-16.007l352.14 0C697.074 704.255 704.076 711.258 704.076 720.262zM640.051 320.102l188.076 0c-3.002-8.505-7.502-17.009-11.002-20.511L660.563 143.029c-3.502-3.501-12.006-8-20.512-11.003L640.051 320.102z" + p-id="11010"></path> + </svg> + </span> + <span @click="toUrl(2)">{{ chapter005.pdfMd5[2].name }}.pdf</span> + </div> + </div> + </div> + <p class="p-even"> + 鍦ㄦ湁椋庢潯浠朵笅锛岄鏈虹殑璧烽銆佺潃闄嗚鍦ㄩ�嗛涓墠鑳芥湁杈冨ソ鐨勬�ц兘琛ㄧ幇锛屽洜姝ゆ満鍦虹殑璺戦亾鏂瑰悜搴斾笌褰撳湴涓婚鍚戜竴鑷淬�傞鍚戝彉鍖栬緝澶х殑鍦板尯锛屾満 + </p> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0194-2.jpg" /> + <p class="img">鍥�5-5 鑺濆姞鍝ュゥ榛戝皵鏈哄満</p> + </div> + <span> + <p class="p-even td-0"> + 鍦哄線寰�淇缓澶氭潯璺戦亾锛屾瘡鏉¤窇閬撶殑鏂瑰悜涓嶄竴鑷达紝浠ヤ究鍦ㄩ鍚戞湁杈冨ぇ鍙樺寲鏃堕�夋嫨閫傚悎椋炴満璧烽檷鐨勮窇閬撱�備緥濡傦紝缇庡浗鑺濆姞鍝ュゥ榛戝皵鏈哄満锛堝浘5-5锛夊氨鏈�6鏉′氦鍙夎窇閬撱�� + </p> + <p class="p-even"> + 璺戦亾鍙蜂负璺戦亾涓績绾跨鏂瑰悜闄や互10锛屽洓鑸嶄簲鍏ュ彇鏁存暟锛岀敤涓や綅鏁拌〃绀恒�傜敱浜庤窇閬撴湁涓や釜浣跨敤鏂瑰悜锛屾墍浠ヤ竴鏉¤窇閬撴湁涓や釜璺戦亾鍙枫�傝窇閬撳彿鏄寜璺戦亾鐨勫ぇ鑷存柟鍚戠紪鐨勩�傛墍璋撴柟鍚戞槸鎸囪窇閬撲腑蹇冪鏂瑰悜锛屾槸椋炶鍛樼湅杩囧幓鐨勬柟鍚戯紝涔熷氨鏄粬椹炬満璧烽鎴栭檷钀芥椂鍓嶈繘鐨勬柟鍚戙�備负绮剧‘璧疯锛岄噰鐢�360掳鐨勬柟浣嶄簣浠ヨ〃绀恒�備互姝e寳涓�0掳锛岄『鏃堕拡鏃嬭浆鍒版涓滀负90掳銆佹鍗椾负180掳銆佹瑗夸负270掳锛屽啀鍥炲埌姝e寳涓�360掳鎴�0掳銆備緥濡傦紝鏌愯窇閬撶鏂瑰悜涓�163掳/343掳锛屽叾璺戦亾鍙峰氨涓�16/34銆傝窇閬撳彿鐢ㄥぇ瀛椾綋鏍囧湪璺戦亾澶达紝濡傛灉涓�涓満鍦烘湁涓ゆ潯骞宠璺戦亾锛屽叾璺戦亾鍙蜂竴鏍凤紝灏辩敤宸︺�� + </p> + </span> + </div> + </div> + </div> + <!-- 183椤� --> + <div class="page-box" page="191"> + <div v-if="showPageList.indexOf(191) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">183</li> + </ul> + <div class="bodystyle"> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0195-1.jpg" /> + <p class="img">鍥�5-6 璺戦亾鍙�</p> + </div> + <span> + <p class="p-odd td-0"> + 鍙冲姞浠ュ尯鍒嗐�傚浘5-6涓殑18R灏辫〃鏄庢槸18鍙峰彸璺戦亾锛屽畠鐨勫彟涓�绔窇閬撳彿涓�36L銆傚鏋滄湁涓夋潯璺戦亾锛屼腑闂磋窇閬撶敤C琛ㄧず銆� + </p> + <h6 id="f034" class="p-odd">3.璺戦亾鐨勯檮灞炲尯鍩�</h6> + <p class="p-odd">璺戦亾鐨勯檮灞炲尯鍩熶富瑕佹寚璺戦亾閬撹偐銆佽窇閬撳畨鍏ㄥ甫鍜屽噣绌洪亾銆�</p> + <p class="p-odd">璺戦亾閬撹偐鏄窇閬撲袱渚т笌鑽夊湴鐨勯殧绂诲湴娈碉紙鍥�5-6涓殑鐧界嚎澶栦晶閮ㄥ垎锛夛紝鐢ㄤ簬鍦ㄩ鏈哄亸绂昏窇閬撴椂锛屽璺戦亾杈规部璧蜂繚鎶や綔鐢紝涓嶈嚧鎹熷潖璺戦亾锛岃繕鑳介槻姝㈠彂鍔ㄦ満鍠锋皵鐏间激璺戦亾銆�</p> + </span> + <p class="p-odd"> + 璺戦亾瀹夊叏甯︽槸鎸囪窇閬撳洓鍛ㄥ垝鍑烘潵鐨勪竴瀹氬尯鍩燂紝鐢ㄤ簬淇濋殰椋炴満鎰忓鍐插嚭璺戦亾鏃剁殑瀹夊叏銆傚畨鍏ㄥ甫鍒嗛亾绔畨鍏ㄥ甫鍜屼晶瀹夊叏甯︺�傞亾绔畨鍏ㄥ甫鍦ㄨ窇閬撲袱绔紝瀹藉害銆佸己搴﹂兘鍜岃窇閬撶浉鍚岋紝渚у畨鍏ㄥ甫涓嶉渶淇缓鎴愭按娉ラ亾闈紝鍙渶淇濊瘉鍦伴潰鍧氬疄銆佸钩鍧﹀嵆鍙�� + </p> + <p class="p-odd">鍑�绌洪亾鏄亾绔箣澶栫殑鍦伴潰鍜屽悜涓婂欢浼哥殑绌哄煙锛岃姹傛病鏈夐殰纰嶅嵆鍙紝涓昏淇濊瘉椋炴満璧烽绂诲湴鍚庡垵濮嬩笂鍗囥�佺潃闄嗕笅婊戝拰鎷夊钩闃舵楂樺害杈冧綆鏃剁殑瀹夊叏銆�</p> + <h5 id="e083" class="p-odd unit5-c">锛堜簩锛夋粦琛岄亾</h5> + <p class="p-odd">婊戣閬撴槸杩炴帴椋炶鍖哄悇涓儴鍒嗙殑椋炴満杩愯閫氳矾锛屽畠浠庢満鍧紑濮嬭繛鎺ヨ窇閬撲袱绔�傚湪浜ら�氱箒蹇欑殑璺戦亾涓璁炬湁涓�涓垨鍑犱釜璺戦亾鍑哄彛鍜屾粦琛岄亾鐩歌繛锛屼互渚块檷钀界殑椋炴満杩呴�熺寮�璺戦亾锛屽彨鑱旂粶閬撱�� + </p> + <p class="p-odd"> + 婊戣閬撶殑瀹藉害鐢变娇鐢ㄦ満鍦虹殑椋炴満鐨勬渶澶ц疆璺濆喅瀹氾紝瑕佷繚璇侀鏈哄湪婊戣閬撲腑蹇冪嚎涓婃粦琛屾椂锛屽畠鐨勪富璧疯惤杞殑澶栦晶璺濇粦琛岄亾杈圭嚎涓嶅皯浜�1.5m銆傚湪婊戣閬撹浆寮锛屽畠鐨勫搴﹁鏍规嵁椋炴満鐨勬�ц兘閫傚綋澧炲姞銆�</p> + <p class="p-odd">婊戣閬撶殑寮哄害瑕佸拰閰嶅浣跨敤鐨勮窇閬撳己搴︾浉绛夋垨鏇撮珮锛屽洜涓哄湪婊戣閬撲笂椋炴満杩愯瀵嗗害閫氬父瑕侀珮浜庤窇閬擄紝椋炴満鐨勬�昏川閲忓拰浣庨�熻繍鍔ㄦ椂鐨勫帇寮轰篃浼氭瘮璺戦亾鎵�鎵垮彈鐨勭暐楂樸��</p> + <p class="p-odd"> + 婊戣閬撳拰璺戦亾绔殑鎺ュ彛闄勮繎鏈夌瓑寰呭尯锛屽湴闈笂鏈夋爣蹇楃嚎鏍囧嚭銆傝繖涓尯鍩熺敤浜庨鏈鸿繘鍏ヨ窇閬撳墠绛夊緟璁稿彲鎸囦护銆傜瓑寰呭尯涓庤窇閬撶绾夸繚鎸佷竴瀹氱殑璺濈锛屼互闃叉绛夊緟椋炴満杩涘叆璺戦亾锛屾垚涓鸿繍琛岀殑闅滅鐗╂垨浜х敓鏃犵嚎鐢靛共鎵般��</p> + + </div> + </div> + </div> + <!-- 184椤� --> + <div class="page-box" page="192"> + <div v-if="showPageList.indexOf(192) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">184</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e084" class="p-even unit5-c">锛堜笁锛夊仠鏈哄潽</h5> + <p class="p-even"> + 鍋滄満鍧畝绉版満鍧紝鍙垎涓哄仠鏀炬満鍧拰鐧绘満鍧�傚仠鏀炬満鍧敤浜庨鏈哄湪鏈哄満闀挎椂闂村仠鏀撅紝濡傝繃澶溿�佺淮淇瓑锛涚櫥鏈哄潽鐢ㄤ簬鏃呭涓婁笅椋炴満銆佽鍗歌揣鐗╋紝涓�鑸湪鍊欐満妤煎渚у拰璐у満澶勩�傛牴鎹満鍦鸿妯★紝瑕佷慨寤鸿冻澶熼潰绉殑鏈哄潽锛屼互淇濊瘉椋炴満銆佽溅杈嗐�佷汉鍛樼殑娲诲姩闇�瑕併�� + </p> + <h5 id="e085" class="p-even unit5-c">锛堝洓锛夋満鍦鸿緟鍔╃潃闄嗚鏂�</h5> + <p class="p-even"> + 涓轰繚闅滈琛屽畨鍏紝鍑嗙‘寮曞椋炴満鍒拌揪鏈哄満锛屾満鍦鸿缃簡鐩稿簲鐨勮緟鍔╃潃闄嗚鏂斤紝姘戣埅鏈哄満鏅亶閲囩敤鐨勬槸浠〃鐫�闄嗙郴缁燂紝鍏跺師鐞嗗鍥�5-7鎵�绀恒�備华琛ㄧ潃闄嗙郴缁熺敱鑸悜鍙般�佷笅婊戝彴鍜岃嫢骞蹭釜鎸囩偣淇℃爣缁勬垚銆�</p> + <p class="center p-even openImgBox"><img class="img-b" alt="" + src="../../assets/images/0196-1.jpg" /></p> + <p class="img p-even">鍥�5-7 浠〃鐫�闄嗙郴缁熷師鐞�</p> + <p class="p-even"> + 鑸悜鍙颁綅浜庤窇閬撲腑蹇冪嚎涓婏紝娌胯窇閬撲袱渚у彂灏勪袱鏉熺瓑寮哄害鐨勮埅鍚戦亾淇℃爣鏃犵嚎鐢垫尝锛岄鏈轰笂瑁呮湁鐩稿簲鐨勬帴鏀惰缃�傚鏋滈鏈哄鍦ㄨ窇閬撲腑绾夸笂锛屾帴鏀跺埌杩欎袱鏉熸棤绾跨數娉㈠己搴︾浉鍚岋紝浠〃鎸囬拡鎸囧湪姝d腑锛涘鏋滈鏈哄亸鍦ㄨ窇閬撲腑绾垮乏渚э紝椋炴満鎺ユ敹鍒板乏渚х殑鏃犵嚎鐢垫尝寮哄害鏇村己锛屼华琛ㄦ寚閽堟寚鍚戝彸渚э紝鎻愰啋椋炶鍛橀鏈洪渶瑕佸悜鍙宠皟鏁达紱椋炴満濡傛灉鍋忓湪璺戦亾涓嚎鍙充晶锛岄鏈烘帴鏀跺埌鍙充晶鐨勬棤绾跨數娉㈠己搴︽洿寮猴紝浠〃鎸囬拡鎸囧悜宸︿晶锛屾彁閱掗琛屽憳椋炴満闇�瑕佸悜宸﹁皟鏁淬�� + </p> + <p class="p-even"> + 涓嬫粦鍙颁綅浜庤窇閬撲竴绔紝鍚戞部涓庡湴闈㈡垚3掳鐨勪笅婊戦亾涓婁笅鍚勫彂灏勪竴鏉熺瓑寮哄害鐨勪笅婊戦亾淇℃爣鏃犵嚎鐢垫尝銆傚鏋滈鏈烘澶勫湪3掳涓嬫粦閬撲笂锛屾帴鏀跺埌涓婁笅鐨勬棤绾跨數娉㈠己搴︾浉鍚岋紝浠〃鎸囬拡鎸囧湪姝d腑锛涘鏋滈鏈轰綅缃亸楂橈紝鍦�3掳涓嬫粦閬撲笂鏂癸紝椋炴満鎺ユ敹鍒颁笂鏂规棤绾跨數娉㈠己搴︽洿寮猴紝鎸囬拡鍚戜笅鎸囷紝鎻愰啋椋炶鍛橀鏈洪渶瑕佸悜涓嬩慨姝o紱濡傛灉椋炴満浣嶇疆鍋忎綆锛屽湪3掳涓嬫粦閬撲笅鏂癸紝椋炴満鎺ユ敹鍒颁笅鏂规棤绾跨數娉㈠己搴︽洿寮猴紝鎸囬拡鍚戜笂鎸囷紝鎻愰啋椋炶鍛橀鏈洪渶瑕佸悜涓婁慨姝c�� + </p> + <p class="p-even">鎸囩偣淇℃爣璁剧疆鍦ㄨ窇閬撳欢闀跨嚎涓婏紝涓�鑸缃�3涓紝鎸夎瀹氳鍦ㄨ窛璺戦亾涓�瀹�</p> + </div> + </div> + </div> + <!-- 185椤� --> + <div class="page-box" page="193"> + <div v-if="showPageList.indexOf(193) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">185</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鐨勮窛绂讳笂銆傞鏈哄湪淇℃爣鏈轰笂绌烘椂鎺ユ敹鍒颁俊鏍囦俊鍙凤紝鐩稿簲鐨勭惀鐝�鑹蹭俊鍙风伅闂寒锛屾彁绀洪琛屽憳椋炴満鐨勪綅缃�� + </p> + <p class="p-odd"> + 閫氫織鏉ヨ锛屼华琛ㄧ潃闄嗙郴缁熷嚑鏉熸棤绾跨數淇″彿鍥存垚浜嗕竴涓數纾佹尝鈥滈毀閬撯�濓紝椋炴満浠ラ瀹氱殑閫熷害娌跨潃鈥滈毀閬撯�濋捇鍑烘潵灏辨槸璺戦亾锛屽氨鍙互绋崇ǔ鍦拌惤鍦ㄨ窇閬撲笂銆備华琛ㄧ潃闄嗙郴缁熸湁涓変釜绫诲埆锛屸厾绫荤簿搴﹁緝浣庯紝鈪$被绮惧害杈冮珮锛屸參绫诲張鍒哸銆乥銆乧涓変釜绛夌骇銆傚嵆浣垮湪鐪嬩笉瑙佽窇閬撶殑姘旇薄鏉′欢涓嬶紝鈪涔熷彲浠ユ寚寮曢鏈虹潃闄嗐�� + </p> + <h4 id="d065" class="p-odd unit5-c">浜屻�佸�欐満妤煎尯</h4> + <p class="p-odd">鍊欐満妤煎尯鏄┖娓琛屽尯鍜屽湴闈㈣繍杈撳尯鐨勬帴鍚堥儴锛屾槸鏃呭鍦ㄦ満鍦烘椿鍔ㄧ殑鍖哄煙锛屽寘鎷�欐満妤煎缓绛戠墿鏈韩鍜屾梾瀹㈠嚭鍏ラ�氶亾銆佺櫥鏈哄潽绛夈��</p> + <h5 id="e086" class="p-odd unit5-c">锛堜竴锛夊�欐満妤煎唴鐨勬湇鍔″尯鍩�</h5> + <p class="p-odd">鍊欐満妤煎唴鏍规嵁鏈嶅姟鍔熻兘涓嶅悓锛屽彲鍒嗕负鏀垮簻鍔炲叕鍖哄煙銆佺┖娓鐞嗗尯鍩熴�佽埅绌哄叕鍙歌繍钀ュ尯鍩熷拰鏃呭鏈嶅姟鍖哄煙銆�</p> + <p class="p-odd">鏀垮簻鍔炲叕鍖哄煙鍐呬竴鑸湁姘戣埅涓荤閮ㄩ棬銆佸崼鐢熼儴闂ㄣ�佺幆淇濋儴闂ㄧ瓑鐨勫姙鍏尯銆傞�氳埅鍥介檯鑸嚎鐨勭┖娓紝杩樿鏈夋捣鍏炽�佽竟闃叉鏌ラ儴闂ㄧ瓑鐨勫姙鍏尯銆�</p> + <p class="p-odd">绌烘腐绠$悊鍖哄煙鍐呰鏈夌┖娓鏀块儴闂ㄣ�佸悗鍕ら儴闂ㄣ�佹秷闃叉晳鎻撮儴闂ㄧ瓑鐨勫姙鍏尯鍜屽伐浣滃満鎵�銆�</p> + <p class="p-odd">鑸┖鍏徃杩愯惀鍖哄煙鏄悇鑸┖鍏徃绉熺敤鐨勫姙鍏尯鍜屾湇鍔″尯锛屽寘鍚繍钀ュ姙鍏銆佺娲惧拰璐靛鎺ュ緟绛夊尯鍩熴��</p> + <p class="p-odd"> + 鍊欐満妤煎唴璁炬湁鍊欐満澶у巺銆佸姙鐞嗘梾瀹㈠強琛屾潕杩涘嚭鎵嬬画鐨勮鏂姐�佹梾瀹㈢敓娲绘湇鍔¤鏂藉強鍏叡鏈嶅姟璁炬柦銆傚姙鐞嗘梾瀹㈠強琛屾潕杩涘嚭鎵嬬画鐨勮鏂芥湁鍊兼満鏌滃彴銆侀棶璁銆佸敭绁ㄧ獥鍙c�佷氦杩愯鏉庢煖鍙板強琛屾潕澶勭悊绯荤粺銆佸畨鍏ㄦ鏌ヨ鏂戒互鍙婃捣鍏炽�佽竟闃叉鏌ャ�佸姩妞嶇墿鍗敓妫�鐤瓑鏌滃彴銆傛梾瀹㈢敓娲绘湇鍔¤鏂芥湁浼戞伅鍘呫�侀楗巺銆佸ū涔愬銆佸晢搴楀強娈嬬柧浜鸿溅杈嗙瓑銆傚叕鍏辨湇鍔¤鏂芥湁閾惰銆侀偖灞�銆佷功搴椼�佸嚭绉熸苯杞︽湇鍔℃煖鍙板強鏃呴棰勮鏌滃彴绛夈�備负浜嗘梾瀹㈣鍔ㄦ柟渚匡紝鍊欐満妤艰繕璁炬湁鑷姩姝ラ亾銆佽嚜鍔ㄦ壎姊�佽繘鍑鸿埅鐝樉绀虹郴缁熴�佹墜鎺ㄨ鏉庤溅銆佸粖妗ョ瓑璁炬柦銆傛澶栵紝鏈哄満涓庢湁鍏宠埅绌哄叕鍙哥殑绠$悊銆佽鏀垮強涓氬姟閮ㄩ棬鍜屽簲鎬ユ寚鎸ユ満鏋勪篃鍙鍦ㄥ�欐満妤煎唴銆傛湁鐨勫�欐満妤艰繕璁炬湁鐬湜骞冲彴鍜屼负杩庨�佷汉鍛樻彁渚涚殑杩庨�佸巺銆� + </p> + </div> + </div> + </div> + <!-- 186椤� --> + <div class="page-box" page="194"> + <div v-if="showPageList.indexOf(194) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">186</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e087" class="p-even unit5-c">锛堜簩锛夋梾瀹㈠湪鍊欐満妤煎唴鐨勬祦绋�</h5> + <p class="p-even">鏍囧噯鐨勫�欐満妤煎唴锛屾梾瀹㈢殑娲诲姩鍖哄煙涓昏鍒嗕负涓ゅ眰锛屼笂灞備负鍑烘腐鏃呭娲诲姩鍖哄煙锛屼笅灞備负鍒版腐鏃呭娲诲姩鍖哄煙銆�</p> + <p class="p-even"> + 鏃呭涔樻満鏃呰椤诲埌鍊欐満妤间簩妤肩殑鍑烘腐澶у巺锛屽湪鐩稿簲鐨勫�兼満鏌滃彴锛堝浘5-8锛夊嚟璐エ浣跨敤鐨勮韩浠借瘉鏄庡姙鐞嗗�兼満鎵嬬画锛堟洿鎹㈢櫥鏈虹墝銆佷氦杩愭墭杩愯鏉庯級锛岀劧鍚庡嚟韬唤璇佹槑鍜岀櫥鏈虹墝閫氳繃瀹夋閫氶亾锛堝浘5-9锛夎繘鍏ラ殧绂诲尯锛屽埌鐩稿簲鐨勫�欐満鍘呭�欐満銆傞�氬父锛屾梾瀹㈠嚟鐧绘満鐗屼簬璧烽鍓嶅崐灏忔椂寮�濮嬬櫥鏈恒�� + </p> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0198-1.jpg" /> + </p> + <p class="img"> + >鍥�5-8 鍊兼満鏌滃彴 + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0198-2.jpg" /> + </p> + <p class="img">鍥�5-9 瀹夋閫氶亾</p> + </span> + </div> + <p class="p-even">鏃呭鍒拌揪鐩殑鍦板悗锛岄�氳繃涓撶敤閫氶亾杩涘叆鍊欐満妤间竴妤肩殑鍒拌揪鍘咃紝鍦ㄥ埌杈惧巺涓殑琛屾潕浜や粯澶勯鍙栬嚜宸辩殑鎵樿繍琛屾潕鍚庯紝绂诲紑闅旂鍖猴紝鑸┖鏃呰缁撴潫銆�</p> + <h5 id="e088" class="p-even">锛堜笁锛夌櫥鏈哄潽</h5> + <p class="p-even">鏃呭閫氳繃鐧绘満闂ㄥ悗锛屽埌杈剧櫥鏈哄潽鐧绘満銆傜櫥鏈哄潽涓�鑸竷缃湪鍊欐満妤煎锛屽敖閲忕缉鐭梾瀹㈢殑姝ヨ璺濈銆傜┖娓牴鎹鐞嗙殑瀹㈡祦閲忎笉鍚岋紝璁炬湁澶氱褰㈠紡鐨勭櫥鏈哄潽锛堝浘5-10锛夈��</p> + <!-- 杞挱鍥� --> + <div class="imgBox-003 openImgBox"> + <div class="swiper-container swiper-img"> + <div class="swiper-wrapper"> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img style="width: 80%; height: auto" src="../../assets/images/0194-01.jpg" /> + <p class="img">鍥�5-10 鐧绘満鍧殑褰㈠紡</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0194-02.jpg" /> + <p class="img">鍥�5-10 鐧绘満鍧殑褰㈠紡</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0194-03.jpg" /> + <p class="img">鍥�5-10 鐧绘満鍧殑褰㈠紡</p> + </div> + </div> + <div class="swiper-slide"> + <div class="imgBox" style="width: 100%; height: 100%"> + <img src="../../assets/images/0194-04.jpg" /> + <p class="img">鍥�5-10 鐧绘満鍧殑褰㈠紡</p> + </div> + </div> + </div> + <div class="swiper-button-next"></div> + <div class="swiper-button-prev"></div> + </div> + </div> + </div> + </div> + </div> + <!-- 187椤� --> + <div class="page-box" page="195"> + <div v-if="showPageList.indexOf(195) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">187</li> + </ul> + <div class="bodystyle"> + <p class="p-odd">鍗曠嚎寮忕櫥鏈哄潽缁撴瀯绠�鍗曪紝椋炴満鐩存帴鍋滄斁鍦ㄥ�欐満妤煎绛夊緟鏃呭鐧绘満銆傝繖绉嶅舰寮忕殑鏈哄潽绠�鍗曟柟渚匡紝浣嗗彧鑳藉鐞嗗皯閲忛鏈猴紝涓�鑸敤浜庤埅鐝噺涓嶅ぇ鐨勬敮绾挎満鍦恒��</p> + <p class="p-odd"> + 鎸囧粖鏄敱鍊欐満妤间几鍑哄幓鐨勬墜鎸囩姸鐨勯暱寤婏紝椋炴満鍋滈潬鍦ㄦ寚寤婁袱渚х殑鍋滄満浣嶄笂銆傚拰鍗曠嚎寮忕櫥鏈哄潽鐩告瘮锛屾寚寤婂紡鐧绘満鍧彲浠ュ绾虫洿澶氱殑椋炴満銆備负鍑忓皯鏃呭鍦ㄦ寚寤婂唴鐨勬琛岃窛绂伙紝杈冮暱鐨勬寚寤婂唴閫氬父閾鸿娲诲姩浜鸿閬撱�傛寚寤婂紡鐧绘満鍧澶у鏁版満鍦哄箍娉涢噰鐢紝闅忕潃鏈哄満鍚炲悙閲忕殑澧炲姞锛屾寚寤婅繕鑳藉緢鏂逛究鍦版墿灞曪紙鍥�5-11锛夈�� + </p> + <p class="center p-odd"><img class="w80" alt="" src="../../assets/images/0199-1.jpg" /></p> + <p class="img p-odd">鍥�5-11 闈掑矝鑳朵笢鍥介檯鏈哄満鎸囧粖寮忕櫥鏈哄潽锛堜竴鏈熲�滄捣鏄熺姸鈥濓級</p> + <p class="p-odd"> + 鍗槦鍘呮槸璁剧疆鍦ㄥ�欐満妤煎鐨勫�欐満鍘咃紝涓�鑸�氳繃鎸囧粖涓庡�欐満妤肩浉杩炪�傞鏈哄彲浠ユ部鍗槦鍘呭渚у仠鏀撅紝杩炴帴鍗槦鍘呯殑鎸囧粖涓や晶涔熻兘鍋滄斁涓�瀹氭暟閲忕殑椋炴満锛堝浘5-12锛夈�傚崼鏄熷巺寮忕櫥鏈哄潽鏈夋寚寤婂紡瀹圭撼椋炴満鏁伴噺澶氱殑浼樼偣锛屽悓鏃舵梾瀹㈠湪鍗槦鍘呭唴鍙互鑾峰彇鏇村鐨勮埅鐝俊鎭紝浣嗘墿灞曟�ц兘涓嶅鎸囧粖寮忋�傜幇鍦ㄥ緢澶氬ぇ鍨嬫満鍦轰娇鐢ㄤ簡杩欑褰㈠紡鐨勭櫥鏈哄潽銆� + </p> + <p class="p-odd"> + 杞﹁締杩愰�佸紡鐧绘満鍧張鍙繙璺濈鐧绘満鍧紝椋炴満鍋滄斁浣嶇疆鍙缃湪绂诲�欐満妤艰緝杩滅殑鍋滄斁鏈哄潽銆傝溅杈嗚繍閫佸紡鐧绘満鍧彲鍋滄斁鏁伴噺杈冨鐨勯鏈猴紝鏃呭閫氳繃鐧绘満闂ㄥ悗锛岀敱鎽嗘浮杞︼紙鍥�5-13锛夎繍閫佸埌椋炴満鏃併�傝繖鏍风殑鐧绘満鍧棤椤荤浉搴旂殑寤虹瓚锛岀伒娲绘柟渚匡紝浣嗗杞﹁締鐨勯渶姹傞噺杈冨ぇ锛岃繕瀹规槗鍙楀埌澶╂皵鐨勫奖鍝嶃�傝澶氭満鍦哄湪鑸彮绻佸繖鏃朵娇鐢ㄨ溅杈嗚繍閫佸紡浣滀负鎸囧粖寮忋�佸崼鏄熷巺寮忕櫥鏈哄潽鐨勮ˉ鍏呫�傝嫢閬囧埌瓒呰繃鍋滄満浣嶅昂瀵哥殑澶у瀷椋炴満锛屼篃鍙噰鐢ㄨ溅杈嗚繍閫佹梾瀹㈢櫥鏈恒�� + </p> + </div> + </div> + </div> + <!-- 188椤� --> + <div class="page-box" page="196"> + <div v-if="showPageList.indexOf(196) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">188</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0200-1.jpg" /> + </p> + <p class="img">鍥�5-12 鍖椾含棣栭兘鍥介檯鏈哄満鍗槦鍘�</p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0200-2.jpg" /> + </p> + <p class="img">鍥�5-13 鎽嗘浮杞�</p> + </span> + </div> + <h4 id="d066" class="p-even unit5-c">涓夈�佸湴闈㈣繍杈撳尯</h4> + <p class="p-even">绌烘腐鐨勫湴闈㈣繍杈撳尯鏄┖娓拰鎵�渚濇墭鍩庡競鍙婂懆杈瑰煄甯傝繛鎺ョ殑閫氶亾銆佺┖娓仠杞﹀満鍜屽唴閮ㄩ�氶亾鐨勬�诲悎銆�</p> + <p class="p-even"> + 绌烘腐鍜屾墍渚濇墭鐨勫煄甯傚線寰�鏈変笓鐢ㄧ殑閫氶亾鐩歌繛锛屼繚璇佹梾瀹€�佽揣鐗╄兘椤虹晠銆佸揩鎹峰湴杩涘嚭绌烘腐銆傚浗鍐呭ぇ閮ㄥ垎绌烘腐涓庢墍渚濇墭鐨勫煄甯傜敤涓撶敤鐨勬満鍦洪珮閫熷叕璺繛鎺ワ紝鏈夌殑鍩庡競杩樺紑閫氫簡鍦伴搧銆佽交杞ㄧ瓑涓庢満鍦虹浉杩炪�傜┖娓�氳繃鎵�渚濇墭鐨勫煄甯傦紝璁╄埅绌鸿繍杈撹繘鍏ュ煄甯傜殑浜ら�氳繍杈撶綉缁滐紝渚挎嵎鍦颁笌杞︾珯銆佺爜澶翠互鍙婂懆杈瑰叾浠栧煄甯傝瀺涓轰竴浣擄紝缁勬垚绔嬩綋浜ら�氳繍杈撶綉銆� + </p> + <p class="p-even"> + 绌烘腐寤烘湁杈冨ぇ闈㈢Н鐨勫仠杞﹀満锛屼緵澶ч噺鐨勫嚭绉熻溅銆佹帴閫佹梾瀹㈣溅杈嗕互鍙婁紬澶氬伐浣滀汉鍛樼殑杞﹁締鍋滄斁銆傜敱浜庨潰绉ぇ锛屼负浜嗗噺灏戞梾瀹㈠湪绌烘腐鍋滆溅鍖哄煙鍐呯殑涓嶄究锛屽線寰�鎶婂嚭绉熻溅銆佹帴閫佹梾瀹㈣溅杈嗙殑鍋滄斁鍖哄煙瀹夋帓鍦ㄥ�欐満妤奸檮杩戯紝閬垮厤鏃呭鎼哄甫琛屾潕姝ヨ澶暱鐨勮窛绂伙紝鑰屾満鍦恒�佽埅绌哄叕鍙稿強鍏惰亴宸ヤ娇鐢ㄧ殑杞﹁締锛屽仠鏀惧湪绂诲�欐満妤艰緝杩滅殑浣嶇疆銆� + </p> + <p class="p-even">鍊欐満妤奸檮杩戞湁璁稿椋炴満銆佽溅杈嗕笌琛屼汉娲诲姩锛屽唴閮ㄩ�氶亾蹇呴』鍚堢悊瀹夋帓鍜岀鐞嗭紝鎵嶈兘淇濊瘉浜ら�氭湁鏉′笉绱婂湴杩涜锛屼笉鑷充簬鍑虹幇娣蜂贡鍜屼簨鏁呫��</p> + <p class="p-even"> + 闅忕潃绀句細鍙戝睍锛屾満鍦虹殑鏈嶅姟璁炬柦姘村钩涔熷湪涓嶆柇鎻愰珮锛屽叏鍥藉悇鍦扮殑鏈哄満绾风悍杩涜鎵╁缓銆佹敼寤猴紝浠ヤ究缁欎汉浠洿濂界殑鏈嶅姟銆備綔涓烘湭鏉ユ皯鑸殑涓诲姏鍐涳紝鎴戜滑搴旇涓嶆柇鎻愰珮鑷韩绱犺川銆佹嫇灞曠煡璇嗛潰銆佸寮轰笓涓氭妧鑳斤紝涓烘皯鑸簨涓氳础鐚竴浠藉姏閲忋�� + </p> + </div> + </div> + </div> + <!-- 189椤� --> + <div class="page-box" page="197"> + <div v-if="showPageList.indexOf(197) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">189</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-odd unit5-c"> + 瀛︿範浠诲姟涓�<br />绌烘腐鐨勭鐞嗗拰杩愯惀 + </h3> + <div class="task-u5-c "></div> + <h4 id="d067" class="p-odd unit5-c">涓�銆佺┖娓殑绠$悊浣撳埗</h4> + <p class="p-odd">鍏ㄧ悆鐨勭┖娓鐞嗕綋鍒舵湁鍥藉绠$悊銆佸湴鏂规斂搴滅鐞嗗拰绉佷汉浼佷笟绠$悊涓夌妯″紡銆�</p> + <h5 id="e089" class="p-odd unit5-c">锛堜竴锛夊浗瀹剁鐞�</h5> + <p class="p-odd">鍥藉绠$悊鏄寚鍥藉姘戣埅涓荤閮ㄩ棬鐩存帴绠$悊绌烘腐锛屽ぇ閮ㄥ垎鍥藉鐨勯閮界┖娓噰鐢ㄨ繖绉嶇鐞嗘柟寮忋�傚湪涓�浜涜鍒掔粡娴庡浗瀹讹紝绌烘腐鐨勭鐞嗘櫘閬嶉噰鐢ㄨ繖绉嶆柟寮忋��</p> + <p class="p-odd"> + 鍥藉绠$悊鐨勪紭鐐规槸鍙互杩呴�熼�傚簲鍥藉鏀挎不浠诲姟鐨勯渶瑕侊紝瀹规槗鍜岀┖涓氦閫氱鍒剁郴缁熼厤鍚堛�侀泦涓姏閲忕粺涓�璋冨害銆傜己鐐规槸涓庡綋鍦版斂搴溿�佺粡娴庣ぞ鍥㈣仈绯讳笉瀵嗗垏锛屼笉鑳戒粠鍦版柟缁忔祹鍜岀ぞ浼氬彂灞曞嚭鍙戣�冭檻闂锛屽鏄撲骇鐢熺煕鐩俱��</p> + <h5 id="e090" class="p-odd unit5-c">锛堜簩锛夊湴鏂规斂搴滅鐞�</h5> + <p class="p-odd"> + 鍦版柟鏀垮簻绠$悊鏄皢绌烘腐浜ょ敱鎵�渚濇墭鍩庡競鏀垮簻鐩稿叧閮ㄩ棬杩涜绠$悊銆傚畠鐨勪紭鐐规槸鑳芥妸鍦版柟绀句細缁忔祹鍙戝睍鐨勮姹傚拰鏈哄満鐨勭粡钀ョ粺涓�鍗忚皟璧锋潵锛岃兘鏈夋晥璋冨姩鍦版柟鎶曡祫鐨勭Н鏋佹�с�傜己鐐规槸鏈夋椂浼氬拰绌虹閮ㄩ棬浠ュ強闈炴湰鍦拌埅绌哄叕鍙镐骇鐢熷埄鐩婁笂鐨勭煕鐩俱�傝繖绉嶇鐞嗘ā寮忚涓栫晫涓婂ぇ閮ㄥ垎绌烘腐閲囩敤銆� + </p> + <h5 id="e091" class="p-odd unit5-c">锛堜笁锛夌浜轰紒涓氱鐞�</h5> + <p class="p-odd"> + 灏嗘満鍦虹鐞嗗畬鍏ㄦ寜鐓т紒涓氬寲妯″紡杩愪綔锛岃兘鏈夋晥鍏嬫湇绌烘腐绠$悊鍜岃繍钀ヤ腑宸ヤ綔灞傛銆佸伐浣滀汉鍛樺亸澶氾紝涓嶈兘鍚堢悊閰嶇疆璧勬簮鐨勭己鐐癸紝鍏剁粡钀ユ晥鐜囧緢楂樸�備絾杩欑妯″紡涓嶈兘閬垮厤缁忚惀鐨勬尝鍔ㄦ�э紝瀹规槗蹇借鏈哄満鐨勭ぞ浼氭晥鐩婏紝闇�瑕佹斂搴滄潵鎺у埗鍜屽崗璋冦�傜浜轰紒涓氱鐞嗘ā寮忓彧鍦ㄨ嫳缇庣殑涓�浜涘皬鍨嬬┖娓娇鐢ㄣ�� + </p> + </div> + </div> + </div> + <!-- 190椤� --> + <div class="page-box" page="198"> + <div v-if="showPageList.indexOf(198) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">190</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 鎴戝浗鍦ㄦ敼闈╁紑鏀句互鍓嶏紝姘戠敤鏈哄満鐨勭鐞嗘ā寮忓崄鍒嗗崟涓�锛屽畬鍏ㄧ敱涓ぎ鏀垮簻闆嗕腑绠$悊銆傛敼闈╁紑鏀句互鏉ワ紝鍦版柟鏀垮簻绉瀬鍙備笌鏈哄満寤鸿锛屽崟涓�鐨勭鐞嗘ā寮忚鎵撶牬銆傛垜鍥芥満鍦虹鐞嗘ā寮忓寘鎷互涓嬪嚑绫汇��</p> + <p class="block">涓浗姘戠敤鑸┖灞�鍜屽湴鍖虹鐞嗗眬鐩存帴绠$悊銆傚叾涓寘鎷儴鍒嗙敱涓ぎ鍜屽湴鏂硅仈鍚堟姇璧勫缓璁俱�佺敱姘戣埅閮ㄩ棬绠$悊鐨勬満鍦恒��</p> + <p class="block"> + 鍦版柟鏀垮簻绠$悊銆傝繖閮ㄥ垎鏈哄満寤鸿鏃跺叏閮ㄧ敱鍦版柟鏀垮簻鎶曡祫锛堟湁鐨勬満鍦轰腑澶粰浜堝皯閲忚ˉ鍔╋級锛屾満鍦哄缓鎴愬悗褰掑湴鏂规斂搴滅鐞嗐�備富瑕佹湁鍘﹂棬銆佺彔娴枫�佹繁鍦炽�佷笁浜氱殑鏂板缓鏈哄満浠ュ強涓�浜涘皬鍨嬫満鍦恒�備笂娴疯櫣妗ュ浗闄呮満鍦轰篃鏄垝褰掍笂娴峰競鏀垮簻绠$悊鐨勬満鍦恒�� + </p> + <p class="block"> + 涓ぎ鍜屽湴鏂瑰疄琛岃偂浠藉埗绠$悊銆傜敱涓ぎ鍜屽湴鏂规斂搴滆仈鍚堟姇璧勫缓璁撅紝鏍规嵁銆婁腑鍗庝汉姘戝叡鍜屽浗鍏徃娉曘�嬶紝鎸夋姇璧勬瘮渚嬪疄鏂借偂浠藉埗绠$悊锛屾湁鐨勭敱鍦版柟鏀垮簻鐩存帴鎺ц偂銆備緥濡傦紝鍗椾含銆佺宸炵殑鏈哄満涓哄湴鏂规斂搴滄帶鑲°�� + </p> + </span> + </div> + <h4 id="d068" class="p-even unit5-c">浜屻�佺┖娓鐞嗙殑缁勭粐鍜屽唴瀹�</h4> + <p class="p-even"> + 绌烘腐绠$悊缁勭粐澶ц嚧鍙垎涓哄洓涓儴闂細琛屾斂鍜岃储鍔¢儴闂ㄣ�佽鍒掑拰宸ョ▼閮ㄩ棬銆佽繍钀ラ儴闂ㄣ�佸悗鍕ゅ拰缁翠慨閮ㄩ棬銆傜┖娓竴鑸缃竴鍚嶇粡鐞嗭紙鎴栧彨绌烘腐绠″浼氫富浠伙級锛屼笅璁惧洓鍚嶅壇缁忕悊锛堝壇涓讳换锛夊悇鍒嗙涓�涓儴闂紝鍚勯儴闂ㄧ鐞嗙殑鍐呭濡傚浘5-14鎵�绀恒�� + </p> + <p class="center p-even openImgBox"><img class="w80" alt="" src="../../assets/images/0202-1.jpg" /> + </p> + <p class="img p-even">鍥�5-14 绌烘腐鍚勯儴闂ㄧ鐞嗙殑鍐呭</p> + </div> + </div> + </div> + <!-- 191椤� --> + <div class="page-box" page="199"> + <div v-if="showPageList.indexOf(199) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">191</li> + </ul> + <div class="bodystyle"> + <h4 id="d069" class="p-odd unit5-c">涓夈�佺┖娓殑杩愯惀</h4> + <p class="p-odd">涓轰簡淇濋殰绌烘腐鑳藉畨鍏ㄦ湁搴忓湴杩愯锛岄渶瑕佸仛澶ч噺鐨勫叿浣撳伐浣溿�傛湰閮ㄥ垎浠呰璁虹淮鎶ら琛屽尯姝e父杩愯闇�瑕佸仛鐨勪竴浜涘伐浣滐紝涓昏鍖呮嫭閬撻潰缁存姢銆侀槻姝㈤笩鍑汇�佺揣鎬ユ晳鎻淬�佸畨鍏ㄤ繚鍗�佸湴闈㈠嫟鍔$瓑銆� + </p> + <h5 id="e092" class="p-odd unit5-c">锛堜竴锛夐亾闈㈢淮鎶�</h5> + <p class="p-odd"> + 閬撻潰鏄寚鏈哄満鐨勮窇閬撱�佹粦琛岄亾銆佸仠鏈哄潽绛夌殑閬撻潰锛屽叾涓渶閲嶈鐨勬槸璺戦亾閬撻潰銆傛棤璁烘槸璧烽杩樻槸鐫�闄嗭紝椋炴満閮藉湪璺戦亾涓婇珮閫熸粦璺戯紝璺戦亾鐨勭粏灏忕憰鐤甸兘灏嗗嵄鍙婇琛屽畨鍏ㄣ�傜淮鎶ら亾闈紝鏄淇濊瘉閬撻潰鏈夎冻澶熺殑寮哄害銆佸钩鏁村害锛岃繕瑕佹湁閫傚綋鐨勬懇鎿﹀姏銆� + </p> + <p class="p-odd"> + 璺戦亾瓒冲鐨勫己搴﹀湪淇缓鏃跺氨宸茬粡鑰冭檻鍒颁簡銆傜幇浠h埅绾块鏈鸿川閲忓ぇ锛岃捣椋炪�佺潃闄嗛�熷害蹇紝瀵硅窇閬撶殑鍘嬪姏銆佹挒鍑诲姏閲忓ぇ锛岄渶瑕佽窇閬撳己搴﹂珮銆傚洜姝わ紝涓栫晫涓婂嚑涔庢墍鏈夊ぇ鍨嬬┖娓兘閲囩敤寮哄害澶с�佹壙杞借兘鍔涘己鐨勬贩鍑濆湡璺戦亾銆傛贩鍑濆湡璺戦亾鏄垰鎬х殑锛屽湪娓╁害鍙樺寲鏃讹紝鑶ㄨ儉涓庢敹缂╀細浣块亾闈㈡壙鍙楀緢澶х殑鍐呭簲鍔涳紝閬撻潰涓婃瘡闅斾竴瀹氳窛绂婚渶鐣欐湁浼哥缉缂濓紝浠ラ槻鑶ㄨ儉鏃堕亾闈㈡嫳璧峰彉褰€�傜敱浜庝几缂╃紳鐨勫瓨鍦紝鍐ぉ姘旀俯浣庢椂閬撻潰鏀剁缉鑷翠娇缂濋殭鍙樺ぇ锛屾矙鐭炽�佹按绛夋潅鐗╁皢娓楀叆浼哥缉缂濄�傚啲澶╂按鍑濈粨鎴愬啺銆佸澶╅亾闈㈣啫鑳�鎸ゅ帇缂濋殭涓殑娌欑煶绛夐兘灏嗕娇閬撻潰鍙楀埌寰堝ぇ鐨勫簲鍔涳紝鑷翠娇閬撻潰寮�瑁傘�傚洜姝わ紝閬撻潰缁存姢浜哄憳闇�瑕佸畾鏈熸鏌ヨ窇閬擄紝鍙戠幇瑁傜紳绛夊強鏃朵慨琛ャ�傛鏌ユ柟娉曢�氬父鏄洰瑙嗗拰瓒呭0娉㈡鏌ワ紝鐩鐢ㄤ簬妫�鏌ヨ窇閬撹〃闈紝瓒呭0娉㈢敤浜庢鏌ヨ窇閬撳唴閮ㄣ�� + </p> + <p class="p-odd"> + 涓轰繚璇侀亾闈㈡湁閫傚疁鐨勬懇鎿﹀姏锛屼娇椋炴満鍦ㄨ窇閬撲笂鑳芥湁鏁堝埗鍔紝鍙堜笉鑷村奖鍝嶉鏈烘粦璺戜腑鍔犻�燂紝閬撻潰涓婂紑鏈夊畨鍏ㄦЫ锛屽彲浠ヨ捣鍒版帓姘村拰澧炲ぇ鎽╂摝鐨勫弻閲嶄綔鐢紝鍥犱负璺戦亾绉按鍚庨鏈洪珮閫熸粦琛屼細杩涘叆鈥滃姩鎬佹粦姘粹�濈姸鎬侊紝浣块鏈鸿疆鑳庣寮�閬撻潰銆佸埞杞﹀け鏁堬紝椋炴満鐫�闄嗘椂浼氬彂鐢熷啿鍑鸿窇閬撱�佸嵄鍙婂畨鍏ㄧ殑鍗遍櫓銆傞殢鐫�璺戦亾浣跨敤鏃堕棿澧為暱锛岄亾闈㈢(鎹熷姞鍓э紝灏嗕細瀵艰嚧璺戦亾鎽╂摝鍔涗笅闄嶏紝闇�瑕� + </p> + <div class="img-rights w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0203-1.jpg" /> + <p class="img">鍥�5-15 璺戦亾涓婄殑鍒硅溅鐥�</p> + </div> + <span> + <p class="p-odd td-0"> + 閫氳繃缁存姢淇濊瘉瀹夊叏妲界殑娣卞害涓庡瘑搴︺�� + </p> + <p class="p-odd">姣旇緝绻佸繖鐨勬満鍦猴紝澶ч噺椋炴満璧烽檷锛岀壒鍒槸鐫�闄嗗悗鍒跺姩灏嗗鑷磋疆鑳庢俯搴﹀崌楂橈紝杞儙涓婄殑姗¤兌鐔斿寲闄勭潃鍦ㄩ亾闈笂锛屾椂闂撮暱浜嗗皢鍦ㄨ窇閬撲笂鐣欎笅璁稿鍒硅溅鐥曪紙鍥�5-15锛夛紝闄嶄綆閬撻潰鎽╂摝绯� + </p> + </span> + </div> + </div> + </div> + <!-- 192椤� --> + <div class="page-box" page="200"> + <div v-if="showPageList.indexOf(200) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">192</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 鏁般�傚洜姝わ紝搴斿湪閬撻潰姗¤兌绉疮鍒颁竴瀹氱▼搴︽椂灏嗗叾娓呴櫎銆傜幇鍦ㄥ父鐢ㄧ殑鏂规硶鏄埄鐢ㄨ秴澹版尝璁╂鑳跺垎瀛愬叡鎸紝浣垮叾鑴辩閬撻潰锛岀劧鍚庢壂闄ゃ�� + </p> + <p class="p-even"> + 鍐ぉ璺戦亾涓婄Н鏈夊啺闆紝涔熷皢鍜岀Н姘翠竴鏍蜂弗閲嶅湴褰卞搷閬撻潰鐨勬懇鎿︾郴鏁般�傝窇閬撳鏋滅Н姘达紝鍙互閫氳繃璺戦亾鎺掓按璁炬柦寰堝揩鎺掗櫎鎺夛紝浣嗙Н闆笉浼氳嚜宸辨祦璧帮紝绉洩铻嶅寲鍚庤嫢鏈兘鍙婃椂娓呴櫎杩樹細缁撳啺锛屾皵娓╄緝浣庢椂閬撻潰灏戣绉按涔熶細閫犳垚缁撳啺銆傚寳鏂规満鍦轰负浜嗘竻闄ら亾闈㈢Н闆拰绉啺锛岄厤澶囨湁閾查洩鏈猴紙鍥�5-16锛夈�佸惞闆満銆佹壂闆溅锛堝浘5-17锛夌瓑銆傚湪绉洩杈冨帤鏃跺厛鐢ㄩ摬闆満閾查櫎澶ч儴鍒嗙Н闆紝閬撻潰涓婃畫鐣欑殑灏戦噺闆墖鍙互鐢ㄥ惞闆満鍜屾壂闆溅娓呴櫎銆傝澶氭満鍦鸿繕閰嶅浜嗛泦閾层�佸惞銆佹壂浜庝竴浣撶殑閾查洩杞﹁締銆傝繖浜涜溅杈嗙殑缁存姢璐圭敤鍦ㄦ満鍦虹粡钀ラ噷闈㈡槸涓�绗斾笉灏忕殑鏀嚭锛屼綆绾害鍦板尯鏈哄満鏃犻』閰嶅闄ら洩璁炬柦锛屽氨鍙渷鍘昏繖涓�绗旇垂鐢ㄣ�� + </p> + <div class="fl al-fe"> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0204-1.jpg" /> + </p> + <p class="img"> + 鍥�5-16 閾查洩鏈� + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0204-2.jpg" /> + </p> + <p class="img">鍥�5-17 鎵洩杞�</p> + </span> + </div> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 2007骞�3鏈�4鏃ワ紝鎴戝浗鍖楁柟閬亣浜嗘毚闆紝娌堥槼妗冧粰鍥介檯鏈哄満琚ぇ闆鐩栵紝鏈�娣卞鍘氳揪1.5m锛屾満鍦鸿杩叧闂�備笅闆椂姘旀俯楠ょ劧闄嶄綆锛岃嚧浣胯窇閬撱�佹粦琛岄亾鍜屽仠鏈哄潽缁撳啺闈炲父涓ラ噸锛屽惞闆満閮芥棤娉曚娇鐢紝鍙兘闈犱汉宸ラ櫎闆�傜粡杩囨樇澶滃鎴橈紝浜�3鏈�6鏃ヤ笂鍗�8锛�58锛屽叧闂簡杩�49灏忔椂鐨勬満鍦洪噸鏂板紑鏀撅紝绗竴鏋惰捣椋炵殑鏄腑鍥藉崡鏂硅埅绌虹敱娌堥槼椋炲線鏃ユ湰澶ч槳鐨勮埅鐝�� + </p> + </span> + </div> + <p class="p-even"> + 璺戦亾缁撳啺姣旂Н闆洿闅鹃摬闄わ紝鍦ㄧ含搴︿笉澶珮鐨勫湴鍖哄啲澶╁嚭鐜拌窇閬撶粨鍐帮紝澶氶噰鐢ㄦ壂闆溅鎵櫎锛屼篃鍙噰鐢ㄥ柗娲掗厭绮炬垨涔欎簩閱囩殑鏂规硶锛屼娇鍐拌瀺鍖栧悗鍘婚櫎銆傞珮绾害鍦板尯璺戦亾缁撳啺鍚庯紝鐢变簬姘旀俯澶綆锛屾壂闆溅涓嶈兘鎵櫎锛岄厭绮惧拰涔欎簩閱囪捣涓嶅埌寰堝ソ鐨勪綔鐢紝涓�鑸噰鐢ㄦ拻鐑矙瀛愮殑鍔炴硶銆傜儹娌欎細浣挎帴瑙﹀埌鐨勫啺铻嶅寲锛岃瀺鍖栨垚鐨勬按寰堝揩鍙堝啀搴︾粨鍐帮紝灏嗘矙瀛愬祵鍏ュ啺灞傦紝澧炲姞浜嗚窇閬撶殑绮楃硻绋嬪害锛岃揪鍒板鍔犳懇鎿﹀姏鐨勮姹傘�� + </p> + </div> + </div> + </div> + <!-- 193椤� --> + <div class="page-box" page="201"> + <div v-if="showPageList.indexOf(201) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">193</li> + </ul> + <div class="bodystyle"> + <h5 id="e093" class="p-odd unit5-c">锛堜簩锛夐槻姝㈤笩鍑�</h5> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 2009骞村叏缇庤埅绌哄叕鍙镐竴鏋剁敱鏈洪暱鍒囨柉鍒┞疯惃鍒┞疯惃浼︿集鏍兼墽椋炵殑A320椋炴満锛堝叏缇庤埅绌�1549鍙疯埅鐝級浠庣航绾︽媺鐡滆开浜氭満鍦洪寰�鍖楀崱缃楁潵绾冲窞鐨勫娲涚壒銆傚湪璧烽鏀�鍗囪繃绋嬩腑锛孉320鍥犻笩鍑昏�岃涓や釜寮曟搸閮藉け鍘诲姩鍔涳紝琚揩闄嶈惤鍦ㄧ航绾﹀搱寰烽�婃渤闈笂锛屾墍骞搁鏈烘垚鍔熺潃闄嗭紝鏈轰笂浜哄憳鍏ㄦ暟鐢熻繕銆傛満闀垮垏鏂埄路钀ㄥ埄路钀ㄤ鸡浼牸涔熷垱閫犱簡澶у瀷瀹㈡満姘撮潰杩檷鐨勫杩广�� + </p> + <p class="block"> + 鍖椾含鏃堕棿2013骞�6鏈�4鏃ヤ笂鍗堬紝涓浗鍥介檯鑸┖鑲′唤鏈夐檺鍏徃鐢辨垚閮介寰�骞垮窞鐨凜A4307鑸彮璧烽绾�20min锛岄鏈洪浄杈剧僵閬亣椋為笩鎾炲嚮锛屾満缁勬矇鐫�搴斿锛屾寜绋嬪簭鎿嶄綔锛屼负纭繚瀹夊叏锛岃繀閫熻繑鑸紝鏈轰笂鏃呭瀹夌劧鏃犳仚銆傛浜嬩欢涔熶护浼楀缃戝弸瀵规槸浠�涔堜笢瑗挎挒鍑荤殑鎰熷埌寰堝ソ濂囷紝鐢氳嚦鏈変笉灏戠綉鍙嬭皟渚冿細濡傛楂樼┖锛岄毦閬撴槸澶栨槦浜哄共鐨勶紵涓浗鍥介檯鑸┖鑲′唤鏈夐檺鍏徃璇佸疄锛岄鏈烘槸琚笩鎾炲嚮鐨勩�傞殢鍚庤缃戝弸璋冧緝涓衡�滄劋鎬掔殑灏忛笩鈥濄�� + </p> + </span> + </div> + <p class="p-odd"> + 楦熷嚮鍙堢О楦熸挒锛屾槸鎸囬鏈哄湪璧烽銆侀琛屽拰鐫�闄嗙殑杩囩▼涓笌绌轰腑鐨勯楦� + </p> + <div class="img-rights w200 openImgBox"> + <img class="img-0" style="margin-top: 20px;" alt="" src="../../assets/images/0205-1.jpg" /> + <p class="img">鍥�5-18 楦熷嚮鐨勭牬鍧�</p> + <div class="bj3" style="margin: 30px 0 0 30px"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 2003骞存湁涓�涓叕鐩婂箍鍛婏細100骞村墠浜轰滑鏍规嵁楦熺殑椋炶鍙戞槑浜嗛鏈猴紝涓嶈绛夊埌100骞村悗澶╀笂鑳介鐨勫彧鏈夐鏈轰簡锛屾垜浠殑灏忓灏变細闂細鈥滃濡堬紝椋炴満鏄牴鎹粈涔堝彂鏄庣殑鍛紵鈥�</p> + </div> + </div> + <span> + <p class="p-odd td-0"> + 鐩告挒鎵�浜х敓鐨勯琛屽畨鍏ㄤ簨鏁呮垨浜嬫晠寰佸�欍�傞殢鐫�姘戠敤鍜屽啗鐢ㄨ埅绌轰簨涓氳繀閫熷彂灞曪紝鑸彮娆℃暟涓嶆柇澧炲姞锛岄笩绫讳笌椋炴満鐩告挒浜嬫晠涓嶆柇鍙戠敓锛屽凡鍏鏄笘鐣岃寖鍥寸殑鏂伴棶棰樸�� </p> + <p class="p-odd"> + 濡傛灉椋炴満鍦ㄩ琛屼腑涓庨笩鐩告挒锛岀敱浜庣浉瀵归�熷害澶э紝鎾炲嚮鐨勫姏閲忎細闈炲父澶э紝杞诲垯璁╅鏈哄彈鎹燂紙鍥�5-18锛夛紝涓ラ噸鏃朵細閫犳垚鏈烘瘉浜轰骸鐨勬儴鍓с�傜敱浜庣敓鎬佺幆澧冨ソ杞紝鏈哄満闄勮繎楦熺被娲诲姩澧炲锛屽姞涓婅埅绌鸿繍杈撳彂灞曡緝蹇紝椋炶娲诲姩閲忎篃鍦ㄥぇ骞呭鍔狅紝鍔犲ぇ浜嗗彂鐢熼笩鍑荤殑姒傜巼锛屽浗闄呮皯鑸粍缁囨瘡骞撮兘鑳芥敹鍒板嚑鍗冧緥楦熷嚮鎶ュ憡銆� + </p> + <p class="p-odd"> + 楦熺被椋炶鎵�鑳借揪鍒扮殑楂樺害涓嶆槸寰堥珮锛岄珮绌轰腑鍙戠敓楦熷嚮浜嬩欢鐨勬姤鍛婅緝灏戙�傞笩鍑诲鍙戠敓鍦ㄦ満鍦洪檮杩戯紝椋炴満璧烽銆佺潃闄嗛樁娈点�傝繖鏃跺�欓鏈洪珮搴﹁緝浣庯紝瀹规槗涓庨笩鐩告挒銆傝澶氭満鍦烘垚绔嬩簡椹遍笩闃燂紝鎷呰礋鐫�椹辫刀鏈哄満闄勮繎楦熺被銆侀伩鍏嶉笩鍑讳簨浠跺彂鐢熺殑浠诲姟銆傞┍楦熸病鏈夌粷瀵规湁鏁堢殑鏂规硶锛屾墍鏈夌殑椹遍笩浜哄憳閮藉湪杈瑰伐浣滆竟鎺㈢储鏂版柟娉曘�傛棭鏈熼┍楦熷ぇ澶氶噰鐢ㄧ寧鏉�鐨勬柟寮忥紝杩欑鏂瑰紡杩濊儗浜嗙敓鎬併�佺幆淇濈瓑瑕佹眰锛岀幇鍦ㄥ父鐢ㄧ殑鏂规硶鏄湪鏈哄満闄勮繎瀹夎绋昏崏浜猴紙鍥�5-19锛夈�� + </p> + </span> + </div> + </div> + </div> + <!-- 194椤� --> + <div class="page-box" page="202"> + <div v-if="showPageList.indexOf(202) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">194</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <div class="img-float openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0206-1.jpg" /> + <p class="img">鍥�5-19 绋昏崏浜�</p> + </div> + <span> + <p class="p-even td-0"> + 鐚涚妯″瀷绛夛紝涔熷父鐢ㄦ挱鏀剧寷绂藉彨澹般�佽秴澹版尝銆佺叅姘旂偖銆佸僵鑹查杞瓑鏂瑰紡椹遍笩锛岃繕鍙竻鐞嗙┖娓檮杩戠幆澧冿紝濡傛竻闄ゅ瀮鍦俱�佹潅鑽夈�佹按濉樼瓑楦熺被椋熺墿婧愩�傚湪杩欎簺鏂规硶涓嶈兘濂忔晥鐨勬儏鍐典笅锛屼笉寰椾笉浣跨敤鎹曢笩缃戙�佺寧鏉�绛夋柟寮忋�� + </p> + <p class="p-even"> + 鏈哄満楦熷嚮闃茶寖鏄竴椤瑰鏉傜殑绯荤粺宸ョ▼锛岄渶瑕佷粠鍦伴潰鍙婄┖涓鏂归潰杩涜缁煎悎娌荤悊锛岄槻鑼冮笩鍑荤殑鐞嗗康鍙婃柟寮忛渶鍙婃椂鏇存柊锛屽悓鏃跺簲璇ュ仛濂界敓鎬佺幆澧冮槻鑼冦�傞笩鍑婚槻鑼冨伐浣滈渶鏍规嵁涓嶅悓鏈哄満鎵�澶勭殑鐜鍥犲湴鍒跺疁鍦板睍寮�銆� + </p> + </span> + <h5 id="e094" class="p-even td-0">锛堜笁锛夌揣鎬ユ晳鎻�</h5> + <p class="p-even"> + 鏈哄満绱ф�ユ晳鎻撮槦鍙堢О涓烘秷闃查槦锛屼粬浠殑鑱岃矗鍖呮嫭鐏伨闃叉帶銆佺伃鐏晳鎻淬�佸簲鎬ユ晳鎻淬�佷汉鍛樺畨鍏ㄧ鐞嗕互鍙婂簲鎬ユ晳鎻寸幇鍦烘寚鎸ョ瓑銆傚綋椋炴満澶变簨鏃讹紝浠栦滑闇�瑕佸湪绗竴鏃堕棿璧跺埌鐜板満锛屽疄鏂界伃鐏拰骞稿瓨鑰呮晳鎻淬��</p> + <p class="p-even"> + 70%浠ヤ笂鐨勯琛屼簨鏁呭彂鐢熷湪璧烽銆佺潃闄嗛樁娈碉紝鍏朵腑鐫�闄嗛樁娈电殑姣斾緥鏈�澶с�傚洜姝わ紝鍦ㄦ満鍦虹殑绱ф�ユ晳鎻翠换鍔″挨涓洪噸瑕侊紝鏁戞彺鍝嶅簲鏃堕棿瀵规晳鎻存晥鏋滄湁鍐冲畾鎬х殑褰卞搷銆傚浗闄呮皯鑸粍缁囦负娑堥槻闃熷埗瀹氫簡鐩稿簲鐨勬爣鍑嗭紝瑕佹眰鎺ュ埌鎶ヨ鍚庢晳鎻翠汉鍛樿兘鍦�3min鍐呭埌杈炬満鍦烘渶杩滅锛岃揪涓嶅埌鏍囧噯鐨勬満鍦烘棤娉曞彇寰楃粡钀ヨ鍙�� + </p> + <div class="bj4"> + <div class="link-float fl al-c"> + <div class="bj4-xyx">鐩稿叧<br />閾炬帴</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + <span> + <p class="block"> + 2018骞�5鏈�14鏃ワ紝鍥涘窛鑸┖鍏徃3U8633鑸彮锛堟墽椋炶鑸彮鐨勯鏈烘敞鍐屽彿涓築-6419锛夊湪鎴愰兘鍖哄煙宸¤埅闃舵锛岄┚椹惰埍鍙冲骇鍓嶉鎸$幓鐠冪牬瑁傝劚钀斤紝鏈虹粍瀹炴柦绱ф�ヤ笅闄嶃�傞鏈轰簬2018骞�5鏈�14鏃�7鈭�46瀹夊叏澶囬檷鎴愰兘鍙屾祦鍥介檯鏈哄満锛屾墍鏈夋梾瀹㈠钩瀹夎惤鍦帮紝鏈夊簭涓嬫満骞跺緱鍒板Ε鍠勫畨鎺掋�傚闄嶆湡闂村彸搴у壇椹鹃┒闈㈤儴鍒掍激銆佽叞閮ㄦ壄浼わ紝涓�鍚嶄箻鍔″憳鍦ㄤ笅闄嶈繃绋嬩腑鍙楄交浼ゃ�� + </p> + <p class="block"> + 2018骞�6鏈�8鏃ヤ笅鍗�3鐐癸紝鈥滃洓宸濈渷銆佷腑鍥芥皯鐢ㄨ埅绌哄眬鎴愬姛澶勭疆宸濊埅3U8633鑸彮闄╂儏琛ㄥ桨澶т細鈥濆湪鎴愰兘鍙紑銆備负琛ㄥ桨鍏堣繘銆佸紭鎵姘旓紝涓浗姘戠敤鑸┖灞�銆佸洓宸濈渷浜烘皯鏀垮簻鍐冲畾鎺堜簣宸濊埅3U8633鑸彮鏈虹粍鈥滀腑鍥芥皯鑸嫳闆勬満缁勨�濈О鍙枫��2020骞�6鏈�2鏃ワ紝宸濊埅椹鹃┒鑸遍鎸$垎瑁傝皟鏌ユ姤鍛婂嚭鐐夈�傝皟鏌ユ姤鍛婃樉绀猴紝鏈浜嬩欢鐨勬渶澶у彲鑳藉師鍥犳槸锛欱-6419鍙锋満鍙抽鎸″皝涓ワ紙姘旇薄灏佷弗鎴栧皝涓ョ鑳讹級鍙兘鐮存崯锛岄鎸″唴閮ㄥ瓨鍦ㄧ┖鑵旓紝澶栭儴姘存苯娓楀叆骞跺瓨鐣欎簬椋庢尅搴曢儴杈圭紭銆� + </p> + </span> + </div> + </div> + </div> + </div> + <!-- 195椤� --> + <div class="page-box" page="203"> + <div v-if="showPageList.indexOf(203) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">195</li> + </ul> + <div class="bodystyle"> + <p class="p-odd">鏈哄満娑堥槻闃熺殑瑁呭瑕佹瘮涓�鑸腑灏忓煄甯傛秷闃查槦鍏堣繘锛屽ぇ鍨嬬┖娓秷闃查槦瑁呭鐨勬秷闃茶溅杈嗘湁蹇�熸晳鎻存秷闃茶溅銆佽交鍨嬫秷闃茶溅鍜岄噸鍨嬫秷闃茶溅绛夈��</p> + <p class="p-odd"> + 蹇�熸晳鎻存秷闃茶溅锛堝浘5-20锛夎鏈�1000L娴撶缉娉℃搏鐏伀鍓傚拰鎬ユ晳鑽墿绛夋�ユ晳璁惧锛岄�熷害寰堝揩锛屽湪鍑虹幇闄╂儏鍚庤兘甯︾潃鎸囨尌鍛樺拰棣栨壒鎬ユ晳浜哄憳绗竴鏃堕棿璧跺埌鐜板満锛屾帶鍒剁伀鍔垮拰绱ф�ュ鐞嗐�佽浆绉讳激鍛橈紝娓呯悊鎾ょ閫氶亾锛屼负鍚庣画娑堥槻涓诲姏鍒拌揪鍋氬ソ鍑嗗銆� + </p> + <p class="center openImgBox p-odd"><img class="img-c" alt="" src="../../assets/images/0207-1.jpg" /> + </p> + <p class="img">鍥�5-20 蹇�熸晳鎻存秷闃茶溅</p> + <p class="p-odd">杞诲瀷娑堥槻杞︼紙鍥�5-21锛夎兘鍦ㄥ揩閫熸晳鎻存秷闃茶溅涔嬪悗璧跺埌鐜板満銆傚畠瑁呮湁鏁扮櫨鍗冨厠鐏伀骞茬矇鍜屼簩姘у寲纰筹紝瀵规补璺�佺數璺潃鐏湁寰堝己鐨勭伃鐏兘鍔涖��</p> + <p class="p-odd">閲嶅瀷娑堥槻杞︼紙鍥�5-22锛夎鏈夋垚鍚ㄧ殑娉℃搏鐏伀鍓傚拰姘达紝绱ч殢鍓嶄袱绉嶆秷闃茶溅涔嬪悗璧跺埌鐜板満锛岃兘瀵瑰ぇ闈㈢Н鐏娍瀹炴柦鏈夋晥鎵戠伃銆�</p> + <div class="fl al-fe "> + <span> + <p class="center openImgBox "> + <img class="w90" alt="" src="../../assets/images/0207-2.jpg" /> + </p> + <p class="img"> + 鍥�5-21 杞诲瀷娑堥槻杞� + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0207-3.jpg" /> + </p> + <p class="img">鍥�5-22 閲嶅瀷娑堥槻杞�</p> + </span> + </div> + <h5 id="e095" class="p-odd unit5-c">锛堝洓锛夊畨鍏ㄤ繚鍗�</h5> + <p class="p-odd">闅忕潃鑸┖杩愯緭鐨勬櫘鍙婏紝鐘姜鍒嗗瓙閫愭笎灏嗙洰鍏夌瀯鍚戜簡姘戣埅椋炴満銆�20涓栫邯 + </p> + </div> + </div> + </div> + <!-- 196椤� --> + <div class="page-box" page="204"> + <div v-if="showPageList.indexOf(204) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">196</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 60骞翠唬浠ユ潵锛屽彂鐢熻繃澶氳捣鍔満鍜岀偢鏈轰簨浠讹紝閫犳垚浜嗕笉灏忕殑鐢熷懡鍜岃储浜ф崯澶便�傜┖娓畨鍏ㄤ繚鍗殑閽堝鐩爣灏辨槸绌轰腑鍜屽湴闈㈢姱缃涓恒�傜┖涓姱缃槸鎸囩姱缃垎瀛愮殑鍔満銆佺偢鏈虹姱缃涓哄拰璧扮绛夛紝鍦伴潰鐘姜涓昏鏄洍绐冨拰鎶㈠姭锛屼篃鍖呮嫭瀵圭┖娓鏂界殑鐮村潖琛屼负銆傜┖娓畨鍏ㄤ繚鍗富瑕佸寘鎷畨妫�鍏ュ彛銆佸鍥翠繚鍗強璐у満淇濆崼銆� + </p> + <div class="img-float w270 openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0208-1.jpg" /> + <p class="img">鍥�5-23 瀹夋璁炬柦</p> + </div> + <span> + <p class="p-even"> + 涓烘湁鏁堥槻鑼冪┖涓姱缃紝鍚勫浗閮介噰鐢ㄤ簡涓�绯诲垪琛屼箣鏈夋晥鐨勫畨鍏ㄦ帾鏂斤紝鏃呭鍜岃鏉庨』閫氳繃涓撶敤瀹夋閫氶亾鎵嶈兘杩涘叆闅旂鍖轰箻鏈恒�傛梾瀹竴鑸噰鐢ㄩ�氳繃寮忓畨鍏ㄩ棬杩涜浜鸿韩瀹夊叏妫�鏌ワ紝瀹夊叏闂ㄥ唴鏈夌數纾佸満銆傚鏋滄梾瀹㈣韩涓婃湁閲戝睘鍒跺搧锛岀數纾佸満灏嗗湪閲戝睘鍒跺搧鍐呬骇鐢熸丁鐢垫祦锛屾丁鐢垫祦杈惧埌涓�瀹氬己搴﹀氨浼氳Е鍙戝畨鍏ㄩ棬鐨勮鎶ヨ缃姤璀︺�傝鏉庝竴鑸噰鐢╔灏勭嚎妫�鏌ワ紝鐢ㄤ紶閫佸甫閫氳繃X灏勭嚎鏈鸿繘琛岄�忚妫�鏌ワ紝瀹夋浜哄憳鑳界湅鍒拌鏉庡唴閮ㄥ悇涓粏鑺傘�傚湪瀹夊叏闂ㄦ垨X灏勭嚎妫�鏌ヤ笉鑳界‘瀹氭椂锛屾梾瀹㈠皢鎺ュ彈浜鸿韩妫�鏌ワ紝琛屾潕瑕佽繘琛屽紑绠憋紙鍖咃級妫�鏌ャ�傚畨妫�璁炬柦濡傚浘5-23鎵�绀恒�� + </p> + </span> + <p class="p-even"> + 绌烘腐鐨勫鍥翠繚鍗富瑕佹槸闃叉闂叉潅浜哄憳杩涘叆椋炶鍖猴紝鍗卞強椋炶瀹夊叏銆傚ぇ澶氭暟绌烘腐鍦ㄩ琛屽尯澶栧洿璁剧疆鎶ゆ爮锛屾姢鏍忎袱鏃�3m浠ヤ笂鍖哄煙浣滀负闅旂甯︼紝涓嶅緱鏈変换浣曞缓绛戝拰闅滅鐗┿�傞噸瑕佸湴娈佃繕淇瓚鍥村杩涜闅旂锛屼汉杩圭綍鑷崇殑鍍婚潤澶勪竴鑸敤鐢电綉鍜屽井娉㈤槻鎶わ紝骞惰鏈夋槑鏄剧殑璀﹀憡鏍囧織銆� + </p> + <p class="p-even"> + 鍒╃敤鑸┖杩愯緭鐨勮揣鐗╀竴鑸叿鏈夎緝楂樼殑浠峰�硷紝璐у満涔熸垚浜嗙洍璐煎叧娉ㄧ殑鐩爣锛岃揣鍦轰繚鍗富瑕佹槸闃茬洍銆傝揣鍦烘湁鑹ソ鐨勭収鏄庯紝瀛樻斁璐甸噸鐗╁搧鐨勫満鎵�椤昏缃棰戠洃鎺э紝鐗瑰埆閲嶈鐨勫湴鏂硅繕椤昏鏈夋瑁呰鍗��</p> + <h5 id="e096" class="p-even unit5-c">锛堜簲锛夊湴闈㈠嫟鍔�</h5> + <p class="p-even"> + 椋炴満缁忓仠銆佽捣椋炲墠鍑嗗銆佺潃闄嗗悗鍠勫悗宸ヤ綔绛夛紝閮芥湁杈冨鐨勫嫟鍔″伐浣滆瀹屾垚锛屼竴浜涘伐浣滆繕鏈夊緢寮虹殑鏃舵晥鎬э紝濡傚ぇ澶氭暟缁忓仠鐨勯鏈哄湪鐫�闄嗗悗40min宸﹀彸灏辫鍐嶅害璧烽銆傝繖鏈熼棿鏈夎澶氬湴闈㈠嫟鍔″伐浣滐紝濡備笂涓嬫梾瀹€�佽鍗歌揣鐗┿�佹按鍜岄鐗╃殑琛ョ粰銆佸姞娌广�佸崼鐢熸墦鎵瓑閮藉繀椤诲畬鎴愩�備负浜嗙‘淇濆湴闈㈠嫟鍔℃寜鏃躲�侀珮璐ㄩ噺鍦板畬鎴愶紝鐗瑰埆鏄湪椋炴満缁忓仠鏃讹紝鏈夊杈嗘湇鍔¤溅鍚屾椂涓洪鏈烘彁渚� + </p> + </div> + </div> + </div> + <!-- 197椤� --> + <div class="page-box" page="205"> + <div v-if="showPageList.indexOf(205) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">197</li> + </ul> + <div class="bodystyle"> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0209-1.jpg" /> + <p class="img">鍥�5-24 椋炴満缁忓仠鏃跺湴闈㈠嫟鍔$姸鍐�</p> + </div> + <span> + <p class="p-odd td-0">鏈嶅姟锛堝浘5-24锛夈��</p> + <p class="p-odd">楗按渚涘簲杞﹀彲鎼哄甫鏁板惃楗敤姘达紝涓洪鏈烘彁渚涘姞娉ㄩギ鐢ㄦ按鐨勬湇鍔°��</p> + <p class="p-odd"> + 绌烘腐鐢ㄧ殑鍔犳补杞︽湁涓ょ锛氫竴绉嶆槸娌圭綈杞︼紝鍙互瑁�10t浠ヤ笂鐨勬补鏂欙紝閫氳繃鍔犳补鑷傝繘琛屽帇鍔涗緵娌癸紝涓�鑸敤浜庝负椋炴満鍔犳敞娑插帇娌广�佹粦娌圭瓑锛涘彟涓�绉嶆槸娌规爴杞︼紝鐢ㄤ簬鍦ㄥ姞娌圭嚎灏嗕緵娌规爴鎷夊埌椋炴満鍓嶅拰椋炴満鍔犳补瀛旂浉杩烇紝涓洪鏈哄姞娉ㄧ噧娌广�傞�氳繃鍘嬪姏鍔犳补锛屽嵆浣挎槸B747鍜孉380杩欐牱鐨勯鏈轰篃鑳藉湪鍗佸鍒嗛挓鍐呭姞婊$噧娌广�� + </p> + </span> + <p class="p-odd"> + 鍦伴潰鐢垫簮杞︼紙鍥�5-25锛変富瑕佺敤浜庨鏈哄湪鍦伴潰鍙戝姩鏈哄紑杞﹀墠涓洪鏈轰緵鐢碉紝纭繚椋炴満鐓ф槑銆佺┖璋冪瓑璁炬柦姝e父浣跨敤锛屼篃涓哄彂鍔ㄦ満寮�杞︽彁渚涚數婧愭敮鎸併�傜幇浠eぇ鍨嬮鏈烘櫘閬嶅畨瑁呬簡杈呭姪鍔ㄥ姏瑁呯疆锛岃兘鍗曠嫭涓洪鏈烘彁渚涚數鍔涘拰鍘嬬缉绌烘皵銆傚湴闈㈢數婧愯溅鐨勪娇鐢ㄩ噺姝e湪閫愭笎鍑忓皯锛屽彧鏈夌揣鎬ユ儏鍐垫垨閮ㄥ垎鏀嚎瀹㈡満杩橀渶鍦伴潰鐢垫簮杞︾殑鏀寔銆� + </p> + <p class="p-odd">鑷鐧绘満鎵舵锛堝浘5-26锛夌敤鍦ㄨ溅杈嗚繍閫佸紡鐧绘満鍧緵鏃呭涓婁笅椋炴満銆傞儴鍒嗗皬鍨嬫満鍦烘病鏈夋椿鍔ㄧ櫥鏈哄粖妗ワ紝涔熷箍娉涢噰鐢ㄨ嚜琛岀櫥鏈烘壎姊��</p> + <div class="fl al-fe p-odd"> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0209-2.jpg" /> + </p> + <p class="img"> + 鍥�5-25 鍦伴潰鐢垫簮杞� + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="w90" alt="" src="../../assets/images/0209-3.jpg" /> + </p> + <p class="img">鍥�5-26 鑷鐧绘満鎵舵</p> + </span> + </div> + <p class="p-odd">鍙寕澶氳妭杞﹀帰鐨勮揣杩愭嫋杞︼紙鍥�5-27锛夎礋璐h繍閫佸皬浠惰揣鐗╄鍗搁鏈猴紝澶т欢璐х墿鍒欑敱璐ц繍骞宠溅杩愰�併�傝揣杩愬钩杞﹁溅浣撹緝浣庯紝鑳藉緢鏂逛究鍦伴厤鍚堜紶閫佸甫鑱斿悎浣滀笟銆�</p> + <p class="p-odd">椋炴満鍋滃湪鎸囧粖鎴栧崼鏄熷巺鐨勭櫥鏈哄粖妗ユ梺锛岄渶瑕佺敤鐗靛紩杞︼紙鍥�5-28锛夊皢椋炴満鎷栧嚭鍋滄満浣嶆墠鑳芥粦涓婅窇閬撹捣椋炪�傛帹鍑烘嫋杞︾殑楂樺害鍙互璋冭妭锛屼互閫傚簲涓嶅悓</p> + </div> + </div> + </div> + <!-- 198椤� --> + <div class="page-box" page="206"> + <div v-if="showPageList.indexOf(206) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">198</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">椋炴満鏈轰綋鐨勯珮搴︺��</p> + <div class="fl al-fe p-even"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0210-1.jpg" /> + </p> + <p class="img"> + 鍥�5-27 璐ц繍鎷栬溅 + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0210-2.jpg" /> + </p> + <p class="img">鍥�5-28 鐗靛紩杞�</p> + </span> + </div> + <p class="p-even">鍦ㄨ揣鐗╁拰琛屾潕瑁呭嵏杩囩▼涓娇鐢ㄥ彲绉诲姩寮忎紶閫佸甫锛堝浘5-29锛夛紝鍙交鏉惧湴灏嗚揣鐗┿�佽鏉庣敱璐ц繍骞宠溅銆佽揣杩愭嫋杞︿紶閫佸埌椋炴満璐ц埍銆�</p> + <p class="p-even">椋熷搧渚涘簲杞︼紙鍥�5-30锛夌殑杞﹀帰鏄竴涓彲鍗囬檷鐨勫钩鍙帮紝鍙笂鍗囪嚦涓庨鏈鸿埍闂ㄥ悓楂樼殑浣嶇疆锛屽彲浠ュ緢鏂逛究鍦板皢椋熷搧渚涘簲浜哄憳鍙婂悇绉嶈ˉ缁欓�佷笂椋炴満銆�</p> + <div class="fl al-fe p-even"> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0210-3.jpg" /> + </p> + <p class="img"> + 鍥�5-29 鍙Щ鍔ㄥ紡浼犻�佸甫 + </p> + </span> + <span> + <p class="center openImgBox"> + <img class="img-a" alt="" src="../../assets/images/0210-4.jpg" /> + </p> + <p class="img">鍥�5-30 椋熷搧渚涘簲杞�</p> + </span> + </div> + <p class="p-even">椋炴満浣跨敤鍚庡皢浜х敓涓�浜涘瀮鍦俱�佹薄姘村拰搴熷純鐗╋紝鏈哄満浣跨敤娓呮磥杞︽敹闆嗚繖浜涘簾寮冪墿鍚庨泦涓鐞嗐��</p> + <h4 id="d070" class="p-even unit5-c">鍥涖�佺┖娓殑璐㈠姟鍜岀鐞�</h4> + <h5 id="e097" class="p-even unit5-c">锛堜竴锛夌┖娓殑鏀跺叆</h5> + <p class="p-even">绌烘腐鐨勪富瑕佹敹鍏ュ寘鎷琛屽満鍦版敹鍏ャ�佸�欐満妤煎嚭绉熸敹鍏ャ�佽埅绌哄叕鍙哥鐢ㄨ鏂芥敹鍏ャ�佸叾浠栧嚭绉熸敹鍏ャ�佸叾浠栫粡钀ユ湇鍔℃敹鍏ュ拰闈炵粡钀ユ�ф敹鍏ャ��</p> + <p class="p-even">椋炶鍦哄湴鏀跺叆涓昏鏄悜鑸┖鍏徃鏀跺彇鐨勮捣闄嶈垂銆佸仠鏈鸿垂鍜屽姞娌规湇鍔¤垂绛夈�傚ぇ鍨嬬┖娓繖閮ㄥ垎鏀跺叆绾﹀崰鎬绘敹鍏ョ殑30%锛屽皬鍨嬬┖娓墍鍗犵殑姣斾緥鏇村ぇ锛屾槸</p> + </div> + </div> + </div> + <!-- 199椤� --> + <div class="page-box" page="207"> + <div v-if="showPageList.indexOf(207) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">199</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">鍏舵敹鍏ョ殑涓昏鏉ユ簮涔嬩竴銆�</p> + <p class="p-odd"> + 绌烘腐鏈夊ぇ閲忕殑娴佸姩浜哄憳锛岃暣鍚潃璇变汉鐨勫晢鏈恒�備竴浜涘晢搴椼�侀楗笟銆佸ū涔愪笟銆佹梾娓镐笟銆佹湇鍔′笟绛夐兘鐪嬪ソ绌烘腐锛岄�氳繃绉熺敤鍊欐満妤煎唴鐨勫晢涓氬尯銆佸姙鍏尯浠ュ強鍊欐満妤煎懆杈硅鏂藉叆椹荤┖娓�傚仠杞﹀満銆佸箍鍛婄瓑涔熻兘缁欑┖娓甫鏉ヤ笉灏戞敹鍏ャ�傚浜庡ぇ鍨嬬┖娓紝杩欓儴鍒嗗嚭绉熸敹鍏ヨ兘鍗犲埌鎬绘敹鍏ョ殑40%宸﹀彸锛屾槸绌烘腐鏀跺叆鐨勬渶澶ч儴鍒嗐�傚皬鍨嬬┖娓墍鍗犵殑姣斾緥灏忎竴浜涳紝鑳借揪鍒�25%銆� + </p> + <p class="p-odd"> + 闄ゅ晢涓氱綉鐐圭鐢ㄧ┖娓鏂斤紝鑸┖鍏徃鍥犵粡钀ラ渶瑕侊紝涔熶細鍦ㄧ┖娓鐢ㄦ煖鍙般�佸姙鍏鏂姐�佸湴闈㈣鏂姐�佹満搴撶瓑锛屼篃鑳界粰绌烘腐甯︽潵涓嶈彶鐨勬敹鍏ャ�備竴浜涗紒浜嬩笟鍗曚綅绉熺敤绌烘腐鎴垮眿銆佺┖娓伐涓氬洯鍖虹殑璁炬柦鍜屾埧灞嬬瓑缁欑┖娓甫鏉ョ殑鏀跺叆绉颁负鍏朵粬鍑虹鏀跺叆銆傜┖娓悜绉熺敤鑰呬緵姘淬�佷緵鐢靛拰渚涚儹绛夋湇鍔′篃鑳藉甫鏉ヤ竴閮ㄥ垎鏀跺叆銆備互涓婃敹鍏ュ悎绉颁负缁忚惀鏈嶅姟鏀跺叆銆� + </p> + <p class="p-odd">闈炵粡钀ユ�ф敹鍏ュ拰涓婅堪鏀跺叆鐩告瘮锛屽拰绌烘腐杩愯惀鐨勮仈绯讳笉鏄緢绱у瘑锛屼絾浠庢湰璐ㄤ笂鐪嬩篃鏄粡钀ョ┖娓墠鑳藉甫鏉ョ殑鏀跺叆锛屼富瑕佸寘鎷斂搴滆ˉ璐淬�佹満鍦鸿垂浠ュ強涓庣┖娓繍钀ユ棤鍏崇殑鍑虹鎴栧嚭鍗栫┖娓储浜х瓑鏀跺叆銆� + </p> + <h5 id="e098" class="p-odd unit5-c">锛堜簩锛夌┖娓殑鏀嚭</h5> + <p class="p-odd">绌烘腐鐨勬敮鍑轰富瑕佸寘鎷琛屽満鍦版敮鍑恒�佸�欐満妤肩殑鏀嚭銆佹満搴撳拰璐ц繍璁炬柦绛夊缓绛戝強绌烘腐鐨勫湴闈㈣鏂界殑鏀嚭銆佺粡钀ユ�х鐞嗘敮鍑哄拰闈炵粡钀ユ�ф敮鍑恒��</p> + <p class="p-odd"> + 椋炶鍦哄湴鏀嚭鍖呮嫭璺戦亾銆佹粦琛岄亾鍜屾満鍧殑缁存姢璐圭敤锛岃繕鍖呮嫭鏈哄満浣跨敤鐨勫悇绉嶆湇鍔¤溅杈嗐�佹秷闃茶鏂姐�佹満鍦虹収鏄庣瓑鐨勪娇鐢ㄥ拰缁存姢璐圭敤銆傚叾涓亾闈㈢淮鎶よ垂鐢ㄥ楂樼含搴﹀湴鍖烘満鍦鸿�岃█锛岄櫎闆拰闄ゅ啺鐨勮姳璐规槸涓�绗斾笉灏忕殑鏀嚭銆� + </p> + <p class="p-odd">鍊欐満妤肩殑鏀嚭鍖呮嫭鍊欐満妤煎唴鐨勪緵姘淬�佷緵鐢点�佷緵鐑�佸簾寮冪墿澶勭悊鐨勬敮鍑猴紝杩樺寘鎷ゼ鍐呭悇绉嶅缓绛戣鏂界殑缁存姢浠ュ強妤煎鐨勫仠杞﹀満缁存姢銆佺幆澧冪編鍖栧拰缁垮寲绛夋敮鍑恒��</p> + <p class="p-odd">鏈哄簱鍜岃揣杩愯鏂界瓑寤虹瓚鍙婄┖娓殑鍦伴潰璁炬柦鐨勬敮鍑哄寘鎷満搴撶殑缁存姢銆佽揣杩愯鏂界淮鎶ゃ�佺┖娓繘鍑洪亾璺淮鎶や互鍙婄┖娓懆鍥寸幆澧冪編鍖栦笌缁垮寲銆佺┖娓熀纭�璁炬柦鐨勭淮鎶ょ瓑锛屼篃鏄┖娓棩甯告敮鍑虹殑涓�閮ㄥ垎銆� + </p> + <p class="p-odd">缁忚惀鎬х鐞嗘敮鍑轰富瑕佹寚鍛樺伐宸ヨ祫鍜屾棩甯哥鐞嗚垂鐢ㄣ��</p> + <p class="p-odd">闈炵粡钀ユ�ф敮鍑鸿〃闈笂鍜岀粡钀ュ叧绯讳笉鏄緢鐩存帴锛屼絾瀹冪殑鏈川涔熸槸缁忚惀绌烘腐甯︽潵鐨勬敮鍑猴紝涓昏鍖呮嫭璐熷�虹殑鍒╂伅銆佽鏂界殑鎶樻棫浠ュ強鍏朵粬涓�浜涙潅椤硅垂鐢ㄣ��</p> + </div> + </div> + </div> + <!-- 200椤� --> + <div class="page-box" page="208"> + <div v-if="showPageList.indexOf(208) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">200</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e099" class="p-even unit5-c">锛堜笁锛夌┖娓殑璐㈠姟绠$悊杩愯鏂瑰紡</h5> + <p class="p-even"> + 绌烘腐鍏锋湁鍏紬鏈嶅姟鎬ц川锛屽湪璐㈠姟杩愯涓婂ぇ澶氶渶瑕佹斂搴滅殑鍙備笌鍜岃ˉ璐淬�傛牴鎹ˉ璐寸殑鏉ユ簮涓嶅悓锛岀┖娓殑璐㈠姟绠$悊杩愯鏂瑰紡涓昏鍒嗕负鏀垮簻琛ヨ创銆佽埅绌哄叕鍙歌ˉ璐淬�佺嫭绔嬫牳绠楄ˉ璐村拰绾紒涓氳繍琛屽洓绉嶆柟寮忋��</p> + <p class="p-even"> + 鏀垮簻琛ヨ创鏂瑰紡琚竴浜涘彂灞曚腑鍥藉鍜岃鍒掔粡娴庝綋鍒跺浗瀹堕噰鐢紝绌烘腐鐨勫缓璁惧拰杩愯閮界敱鏀垮簻璐熻矗锛岀泩鍒╀笂缂村浗瀹惰储鏀匡紝浜忔崯鍒欑敱璐㈡斂杩涜琛ヨ创锛岀┖娓笉鐢ㄦ壙鎷呬换浣曠粡钀ヤ笂鐨勯闄┿�傚湪涓�涓湴鏂硅埅绌鸿繍杈撳彂灞曠殑鍒濇湡銆佽繍閲忎笉瓒崇殑鎯呭喌涓嬶紝杩欑鏂瑰紡鑳芥壎鎸佽埅绌鸿繍杈撳彂灞曘�備絾杩欑鏂瑰紡涓嶈兘蹇�熼�傚簲甯傚満銆佽祫婧愰厤缃笉鍚堢悊锛屼互鑷寸粡钀ユ晥鐩婅緝浣庛�� + </p> + <p class="p-even"> + 閫氳繃鑸┖鍏徃琛ヨ创鏂瑰紡锛岀┖娓彲浠ュ皢璐㈠姟椋庨櫓涓庤埅绌哄叕鍙稿叡鍚屾壙鎷咃紝杩欑鏂瑰紡鍦ㄥ浗澶栦竴浜涘ぇ鍨嬬┖娓骞挎硾閲囩敤銆傜┖娓笌浣跨敤绌烘腐鐨勪富瑕佽埅绌哄叕鍙哥害瀹氾紝鍦ㄧ粡钀ュ嚭鐜颁簭绌烘椂鐢辫埅绌哄叕鍙稿嚭璧勪簣浠ュ~骞炽�傝埅绌哄叕鍙稿彲瀹℃牳绌烘腐鐨勮储鍔¤鍒掞紝鍙栧緱涓�瀹氱殑绌烘腐鍐崇瓥鎺у埗鏉冿紝鍦ㄧ┖娓嚭鐜扮泩鍒╂椂鍙粠涓嬩竴骞村害浜や粯绌烘腐鐨勮垂鐢ㄤ腑鑾峰緱鍥炴姤銆� + </p> + <p class="p-even"> + 閲囩敤鐙珛鏍哥畻琛ヨ创鐨勭┖娓嚜璐熺泩浜忥紝鐙珛鎵挎媴璐㈠姟椋庨櫓銆傜┖娓悜鑸┖鍏徃鏀跺彇鐨勫悇绉嶈垂鐢ㄥ彲鍦ㄦ斂搴滄寚瀹氱殑鑼冨洿鍐呮诞鍔紝濡傛湁鐩堜綑灏卞彲鐢ㄤ簬鎵╁ぇ绌烘腐瑙勬ā锛岃嚜涓绘�уソ锛屼絾缁忚惀椋庨櫓杈冨ぇ锛屼竴鏃︾牬浜э紝灏卞皢琚斂搴滄帴绠°�� + </p> + <p class="p-even"> + 绾紒涓氳繍琛屾柟寮忓彧鍦ㄨ嫳缇庣殑涓�浜涚鏈夊寲绌烘腐瀹炶銆傜┖娓殑杩愪綔瀹屽叏鎸変紒涓氭ā寮忥紝閬电収甯傚満瑙勫垯杩愯锛岀粡钀ヨ�呰嚜鐢卞害寰堥珮锛屽湪缁忚惀涓線寰�浼氬拷瑙嗗叕浼楁湇鍔★紝涓嶉�傚疁鍦ㄥ璐ф祦閲忚緝澶с�佸鍏紬鎵挎媴杈冨涔夊姟鐨勭┖娓帹琛屻�� + </p> + <h5 id="e100" class="p-even unit5-c">锛堝洓锛夌┖娓缓璁捐祫閲戠殑绛归泦</h5> + <p class="p-even">寤鸿绌烘腐闇�瑕佸ぇ閲忚祫閲戯紝绌烘腐寤鸿鐨勮祫閲戞潵婧愪富瑕佹湁涓夌鏂瑰紡锛氭斂搴滄姇璧勩�佺┖娓彂琛屽�哄埜鎴栬偂绁ㄣ�佺涓夋柟鎶曡祫銆�</p> + <p class="p-even"> + 涓栫晫涓婃墍鏈夊ぇ鍨嬬┖娓殑寤鸿璧勯噾閮芥湁涓�閮ㄥ垎鏉ヨ嚜鏀垮簻鎶曡祫锛屽彧鏄笉鍚岀殑鍥藉鍜岀ぞ浼氬埗搴︼紝鏀垮簻鎶曡祫鐨勬瘮渚嬫湁鎵�涓嶅悓銆傛垜鍥藉叴寤哄ぇ鍨嬬┖娓紝涓ぎ鏀垮簻鎶曡祫姣斾緥楂樿揪50%锛岀編鍥藉叴寤哄ぇ鍨嬬┖娓紝鑱旈偊鏀垮簻鎶曡祫涓�鑸湪20%宸﹀彸銆� + </p> + <p class="p-even">澶у瀷绌烘腐寤鸿鐨勫叾浣欒祫閲戙�佸浗澶栦竴浜涘皬鍨嬬┖娓缓璁炬墍闇�鐨勫叏閮ㄨ祫閲戜富瑕侀�氳繃鍦版柟鏀垮簻鎶曡祫銆佸彂琛屽�哄埜鎴栬偂绁ㄧ瓑閫斿緞鑾峰緱銆�</p> + <p class="p-even">绗笁鏂规姇璧勬槸閫氳繃鍚稿紩鍥綋鍙婁釜浜恒�佸浗澶栬祫鏈瓑鎶曡祫绌烘腐寤鸿銆傝繖閮ㄥ垎璧勯噾杩囧锛屽皢浼氬姞閲嶇┖娓粡钀ョ殑璐熷�鸿礋鎷呫�傛垜鍥界殑鍘﹂棬绌烘腐灏辨槸鍚告敹閮�</p> + </div> + </div> + </div> + <!-- 201椤� --> + <div class="page-box" page="209"> + <div v-if="showPageList.indexOf(209) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">201</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">鍒嗗璧勫弬涓庡缓璁剧殑銆�</p> + <h4 id="d071" class="p-odd unit5-c">浜斻�佺┖娓殑鍏叡鍏崇郴</h4> + <p class="p-odd"> + 绌烘腐鏄竴涓紒涓氾紝鏈夊晢涓氱粡钀ョ殑鐗硅壊锛屽悓鏃剁┖娓張鏄竴涓煄甯傘�佷竴涓湴鍖虹殑闂ㄦ埛锛屼綔涓虹獥鍙e舰璞★紝鎵挎媴瀵瑰叕浼楁湇鍔$殑涔夊姟銆傜幇浠g殑绌烘腐锛屾嫢鏈夎嚜宸辩殑鍦熷湴锛屽湪绌烘腐鍖哄煙鍐呭嚑涔庢湁鍩庡競閲屾湁鐨勬墍鏈夋湇鍔¤鏂姐�傜┖娓凡缁忔槸涓�搴у皬鍨嬪煄甯傦紝蹇呴渶涓庡悇绉嶅悇鏍风殑绀惧洟缁勭粐澶勭悊濂芥潈鍒┿�佷箟鍔$瓑鐨勭浉浜掑叧绯汇�� + </p> + <h5 id="e101" class="p-odd unit5-c">锛堜竴锛夌┖娓拰鑸┖鍏徃鐨勫叧绯�</h5> + <p class="p-odd"> + 绌烘腐鍜岃埅绌哄叕鍙告槸鍚堜綔浼欎即锛屽畠浠箣闂寸殑鍏崇郴绫讳技浜庨暱閫旇溅绔欎笌杩愯緭鍏徃涔嬮棿鐨勫叧绯汇�傝埅绌哄叕鍙稿埄鐢ㄧ┖娓粍缁囧璐ц繍杈擄紝鑸┖鍏徃鍙戝睍銆侀鏈烘暟閲忓鍔犲拰鏈哄瀷鏀瑰彉锛屽绌烘腐璧烽檷鏉′欢瑕佹眰鏈変簡鍙樺寲锛岀┖娓渶瑕佹彁渚涢�傚簲杩欎簺瑕佹眰鐨勮鏂藉拰鏈嶅姟銆傜┖娓椂鍒讳笉鑳藉繕璁拌埅绌哄叕鍙告槸鑷繁鐨勪富瑕佺敤鎴凤紝瀹冧滑甯︽潵鐨勬敹鍏ユ槸绌烘腐鏀跺叆鐨勪富瑕佹潵婧愶紝绌烘腐蹇呴』閲嶈鑸┖鍏徃鐨勯渶瑕侊紝鎻愪緵鐩稿簲鐨勬湇鍔¤鏂芥弧瓒宠埅绌哄叕鍙歌繍钀ョ殑瑕佹眰銆� + </p> + <p class="p-odd"> + 濡傛灉浣跨敤绌烘腐鐨勮埅绌哄叕鍙歌緝灏戯紝鑸嚎鍙樺寲涓嶅ぇ锛岃埅绌哄叕鍙镐笌绌烘腐浼氬缓绔嬮暱鏈熺殑绋冲畾鍏崇郴锛岀┖娓殑鍦颁綅鍙栧喅浜庢墍渚濇墭鐨勫煄甯傛垨鍦板尯鐨勭粡娴庡彂灞曞疄鍔涖�傚綋鍦板尯缁忔祹鍙戝睍鍒颁竴瀹氭按骞筹紝鑸┖杩愯緭閲忓澶э紝杩涘叆璇ョ┖娓殑鑸┖鍏徃澧炲锛岃繍杈撳競鍦哄紑濮嬬珵浜夌殑鏃跺�欙紝绌烘腐鍦ㄥ拰鑸┖鍏徃鐨勫叧绯讳腑灏变細澶勪簬鏈夊埄鐨勪竴鏂广�傚湪涓�涓煄甯傚強鍏跺懆杈瑰湴鍖烘湁澶氫釜绌烘腐鐨勬椂鍊欙紝绌烘腐涔嬮棿鏈変簡绔炰簤锛屽湪涓庤埅绌哄叕鍙哥殑鍏崇郴涓湴浣嶅氨浼氭湁鎵�涓嬮檷銆傛棤璁哄浣曪紝绌烘腐閮戒笉鑳藉繕璁拌埅绌哄叕鍙告槸鑷繁鏈�閲嶈鐨勫鎴凤紝鏄嚜宸辩粡钀ユ敹鍏ョ殑涓昏鏉ユ簮锛屽湪缁忚惀涓娉ㄦ剰鎻愰珮鑷繁鐨勬湇鍔¤川閲忋�� + </p> + <div class="bj4"> + <div class="img-float w115"> + <div class="fl al-c"> + <div class="bj4-xyx-pd">璇讳竴璇�</div> + <div class="bj4-xyx-icon">鈻� 鈻�</div> + </div> + </div> + <span> + <p class="block"> + 涓婃捣鏈夎櫣妗ュ拰娴︿笢涓や釜鏈哄満锛屼笂娴峰懆杈规澀宸炪�佸畞娉€�佸崡浜瓑鍦颁篃鏈夋満鍦猴紝鍦ㄥ湴闈氦閫氱綉瓒婃潵瓒婂彂杈剧殑浠婂ぉ锛岃澶氳埅绌哄叕鍙稿皢涓婃捣鐨勮繍杈撻噺杞Щ鍒颁簡鍛ㄨ竟鏈哄満锛屽啀鍒╃敤渚挎嵎鐨勫湴闈㈤珮閫熷叕璺�侀搧璺綉杩愬線涓婃捣銆傝繖鏍蜂竴鏉ワ紝涓婃捣绌烘腐灏遍潰涓村拰鍛ㄨ竟绌烘腐鐨勭珵浜夛紝鑻ヤ笉娉ㄦ剰鎻愰珮鑷繁鐨勬湇鍔¤川閲忥紝灏变細鏈夎秺鏉ヨ秺澶氱殑鑸┖鍏徃杞悜鍛ㄨ竟绌烘腐銆� + </p> + </span> + </div> + <h5 id="e102" class="p-odd unit5-c">锛堜簩锛夌┖娓拰绉熺敤绌烘腐鍦熷湴鏈嶅姟琛屼笟鐨勫叧绯�</h5> + <p class="p-odd"> + 澶ч噺鐨勯楗�佸ū涔愩�佹梾娓哥瓑浠庝簨鍟嗕笟鏈嶅姟鐨勪紒涓氫細绉熺敤绌烘腐鐨勫湡鍦版垨 + </p> + </div> + </div> + </div> + <!-- 202椤� --> + <div class="page-box" page="210"> + <div v-if="showPageList.indexOf(210) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">202</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 缁忚惀鍦烘墍杩涜缁忚惀銆傝繖浜涗紒涓氬湪缁忚惀杩囩▼涓鏄撳彧椤剧粡娴庡埄鐩婅�屽拷瑙嗙ぞ浼氬奖鍝嶏紝涓ラ噸鏃朵細瀵圭┖娓0瑾夐�犳垚杈冨ぇ褰卞搷锛岀┖娓鍔犲己瀵硅繖浜涗紒涓氱殑绠$悊锛屼絾鍚屾椂涔熷繀椤诲鐞嗗ソ涓庤繖閮ㄥ垎浼佷笟鐨勫叧绯汇�傝繖浜涗紒涓氫粯缁欑┖娓殑绉熼噾涔熸槸涓嶅皬鐨勬暟鐩紝鍦ㄨ澶氫腑灏忓瀷绌烘腐锛岀粡钀ユ�т紒涓氭墍浠樼殑绉熼噾浠呮浜庤埅绌哄叕鍙稿甫鏉ョ殑鏀跺叆銆傚ぇ鍨嬬┖娓殑缁忚惀鎬х閲戞敹鍏ュ線寰�浼氳秴杩囪埅绌哄叕鍙稿甫鏉ョ殑鏀跺叆锛屾垚涓虹┖娓殑鏈�澶ф敹鍏ユ潵婧愩�� + </p> + <h5 id="e103" class="p-even unit5-c">锛堜笁锛夌┖娓拰浣跨敤鍏紬鐨勫叧绯�</h5> + <p class="p-even">绌烘腐鐨勪娇鐢ㄥ叕浼楀寘鎷笌鑸┖杩愯緭鏈夊叧鐨勬梾瀹€�佽埅绌哄叕鍙镐汉鍛橈紝浠ュ強绌烘腐闄勮繎灞呮皯鍜屾潵寰�鍏紬锛岀┖娓渶瑕佸仛鐨勫氨鏄淮鎸佸ソ绉╁簭锛屼繚鎸佺幆澧冪殑鏁存磥銆�</p> + <h5 id="e104" class="p-even unit5-c">锛堝洓锛夌┖娓拰閭昏繎鍦板尯鐨勫叧绯�</h5> + <p class="p-even">绌烘腐鍜岄偦杩戝湴鍖虹殑鍏崇郴涓昏浣撶幇鍦ㄥ櫔澹伴棶棰樺拰鍦熷湴浣跨敤闂涓ゆ柟闈€��</p> + <p class="p-even"> + 椋炴満璧烽檷閮戒細浜х敓杈冨ぇ鐨勫櫔澹帮紝姣旇緝绻佸繖鐨勭┖娓檮杩戝櫔澹版薄鏌撳挨涓烘槑鏄撅紝缁欓檮杩戝崟浣嶅拰灞呮皯甯︽潵寰堝ぇ褰卞搷銆傝浠庢牴鏈笂瑙e喅鍣0姹℃煋锛屽彧鑳戒緷闈犺埅绌哄埗閫犱笟鐨勮繘姝ワ紝杩欐槸涓�涓暱鏈熺殑杩囩▼銆傚氨鐩墠鑰岃█锛岀┖娓彧鑳介噰鍙栦竴浜涜鍔ㄦ帾鏂芥潵鍑忓皯鍣0鐨勫奖鍝嶏紝鑳介噰鍙栫殑鎺柦涓昏鏈夛細寤鸿鍣0闃叉姢鏋楋紝淇缓闅旈煶鏁堟灉濂姐�佸櫔澹版晱鎰熷害浣庣殑寤虹瓚鐗╋紱瀵归鏈虹殑璧烽銆佽繘杩戙�佺潃闄嗙▼搴忓姞浠ラ檺鍒讹紝浣块鏈鸿繀閫熺寮�鍣0鏁忔劅鍖猴紝鍑忓皯鍣0瀵瑰湴闈㈢殑褰卞搷锛涘鍣0澶х殑椋炴満鎻愰珮璧烽檷璐瑰緛鏀舵爣鍑嗭紱鍦ㄤ笉绻佸繖鐨勭┖娓紝灏介噺閬垮厤澶滈棿璧烽檷锛岄槻姝㈠櫔澹版壈姘戯紱寰佺敤鍣0鏁忔劅鍖虹殑鍦熷湴锛岀敱绌烘腐缁熶竴瀹夋帓浣跨敤銆� + </p> + <p class="p-even"> + 绌烘腐鍏村缓鏃朵竴鑸�夋嫨杩滅鍩庡競銆佷汉鐑熺█灏戠殑鍦版柟锛屼絾绌烘腐鎶曞叆浣跨敤鍚庯紝浼氬甫鍔ㄥ綋鍦扮粡娴庡彂灞曪紝鍘熸湰鍋忓兓鐨勭┖娓湴鍖哄皢閫愭笎绻佽崳璧锋潵銆傜┖娓懆杈瑰湡鍦颁篃浼氬ぇ骞呭鍊硷紝鍚稿紩璁稿浼佷簨涓氬崟浣嶈繘椹荤┖娓湴鍖恒�傞殢涔嬭�屾潵灏辨槸楂樺ぇ寤虹瓚杩涘叆绌烘腐鍖哄煙锛屽奖鍝嶇┖娓殑鍑�绌烘潯浠讹紝灞呮皯鐨勫澶氬鍣0涔熸湁瓒婃潵瓒婇珮鐨勮姹傘�� + </p> + <p class="p-even">褰撳墠姘戣埅涓氬湪蹇�熷彂灞曪紝浣滀负姘戣埅涓氱粍鎴愰儴鍒嗙殑鏈哄満涔熷湪杩呴�熷彂灞曪紝鏈潵鐨勬皯鑸笟杩樿缁х画鍙戝睍锛屼綔涓哄噯姘戣埅浜哄憳锛岃鎶婅嚜韬垚鎵嶄笌姘戣埅鏈潵绱у瘑杩炴帴锛屽寮鸿嚜淇″績锛屼负绁栧浗鐨勬湭鏉ュ鏂椼�� + </p> + </div> + </div> + </div> + <!-- 203椤� --> + <div class="page-box" page="211"> + <div v-if="showPageList.indexOf(211) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">203</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="p-even unit5-c"> + 瀛︿範浠诲姟鍥�<br />绌烘腐鐨勫彂灞曚笌瑙勫垝 + </h3> + <div class="task-u5-c ma-l"></div> + <h4 id="d072" class="p-odd unit5-c">涓�銆佺┖娓殑瀹归噺</h4> + <p class="p-odd">绌烘腐鐨勫閲忔槸鎸囩┖娓湪缁欏畾鐨勬椂闂翠腑鑳藉鐞嗙殑浜ら�氶噺锛屽彲鐢ㄩ鏈虹殑璧烽檷鏋舵鎴栨梾瀹㈢殑娴侀噺鏉ヨ 閲忋�傚閲忔湁鍚嶄箟瀹归噺鍜屽疄闄呭閲忎箣鍒嗭紝鍚嶄箟瀹归噺 + </p> + <div class="img-rights w270"> + <div class="bj3"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <p class="block"> + 2008骞�5鏈�12鏃ワ紝鍥涘窛姹跺窛鍙戠敓8.0绾х壒澶у湴闇囷紝姘戣埅銆佺┖鍐涖�侀檰鍐涜埅绌哄叺鍑哄姩浜嗗ぇ閲忛鏈哄弬鍔犳晳鎻磋鍔ㄣ�傚叾涓儴闃熷嚭鍔ㄩ鏈�4560鏋舵锛屾皯鑸笟璋冮泦浜�30鏋剁洿鍗囨満鍜屽ぇ閲忕殑杩愯緭鏈哄弬鍔犱簡鏁戞彺銆傛晳鐏炬湡闂达紝鎴愰兘鍙屾祦鍥介檯鏈哄満姣忓ぉ淇濋殰鍜屾姉闇囨晳鐏剧浉鍏崇殑鎬ユ晳椋炶鑸彮鍦�100鏋舵浠ヤ笂锛屼娇寰楄埅鐝線鏉ヤ粠鍘熸潵鐨勬瘡澶�500鏋舵锛岃揪鍒版瘡澶�600鏋舵鐨勫巻鍙叉渶楂樼邯褰曘�� + </p> + </div> + </div> + <span> + <p class="p-odd td-0"> + 鏄寚涓嶈�冭檻椋炴満鐨勫欢璇紝鍗抽鏈轰竴鏋舵帴涓�鏋跺湴璧烽鎴栭檷钀斤紝鍗曚綅鏃堕棿鎵�鑳藉厑璁哥殑璧烽檷娆℃暟銆傚疄闄呭閲忔寚鐨勬槸鍦ㄨ瀹氬嚭椋炴満鐢变簬绌烘腐鏉′欢鑰屽欢璇殑鏃堕棿闄愬埗鍚庯紝绌烘腐鎵�鑳藉厑璁哥殑杩愯鏋舵銆�</p> + <p class="p-odd"> + 鍏佽鑸彮寤惰鐨勬椂闂磋秺闀匡紝绌烘腐鑳藉鐞嗙殑瀹為檯瀹归噺灏辫秺澶э紝濡傛灉鍏佽寤惰鏃堕棿鏃犻檺闀匡紝瀹為檯瀹归噺灏变細鎺ヨ繎鍚嶄箟瀹归噺銆備絾瀹為檯宸ヤ綔涓墍鍏佽鐨勫欢璇椂闂存湁涓�瀹氶檺鍒讹紝瀹為檯瀹归噺鍜屽悕涔夊閲忕殑宸窛灏辫緝澶с�傚悕涔夊閲忔槸灏辩┖娓�ц兘鑰岃█鎵�鑳借揪鍒扮殑鏈�澶у閲忥紝瀹為檯涓婇櫎浜嗘姠闄╂晳鐏炬垨鍐涗簨琛屽姩锛屾満鍦轰笉浼氬鐞嗚繖涔堝ぇ瀵嗗害鐨勮埅鐝噺銆� + </p> + </span> + <h4 id="d073" class="p-odd unit5-c">浜屻�佸奖鍝嶅閲忓拰寤惰鐨勫洜绱�</h4> + <p class="p-odd">褰卞搷瀹归噺鍜屽欢璇殑鍥犵礌鍦ㄤ笉鍚屾椂鏈熴�佷笉鍚屾椂闂存槸鍦ㄥ彉鍖栫殑锛屼富瑕佺殑褰卞搷鍥犵礌鏈変簲绫汇��</p> + <h5 id="e105" class="p-odd unit5-c">锛堜竴锛夐琛屽満鍦扮殑鎬ц兘</h5> + <p class="p-odd">椋炶鍦哄湴鐨勫竷灞�銆佽窇閬撱�佹粦琛岄亾銆佹満鍧仠鏀惧拰閫氳繃椋炴満鐨勮兘鍔涳紝闄ゅ嚭鐜版崯鍧忓拰缁翠慨鏃跺锛屽瀹归噺鐨勫奖鍝嶆槸鍥哄畾鐨勩��</p> + </div> + </div> + </div> + <!-- 204椤� --> + <div class="page-box" page="212"> + <div v-if="showPageList.indexOf(212) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">204</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e106" class="p-even unit5-c">锛堜簩锛夌┖娓┖鍩熺殑鎯呭喌</h5> + <p class="p-even"> + 绌烘腐绌哄煙鎯呭喌鏈変袱鏂归潰鍚箟锛屼竴鏂归潰鏄┖娓┖鍩熺殑澶у皬銆佸舰鐘剁瓑鍩烘湰鎯呭喌锛屽彟涓�鏂归潰鏄┖娓拰閭昏繎鏈哄満鏈夋棤鐩镐簰骞叉壈銆備緥濡傦紝鍦ㄦ倍宸濆湴闇囩殑鏁戞彺宸ヤ綔涓紝鎴愰兘鍛ㄨ竟鍐涚敤銆佹皯鐢ㄦ満鍦哄悓鏃跺弬涓庝簡鏁戠伨娲诲姩锛岀┖涓氦閫氶潪甯稿瘑闆嗭紝姣忎釜鏈哄満璧烽檷鐨勯鏈烘椿鍔ㄦ儏鍐甸兘鍙楀埌鍏朵粬鏈哄満鐨勫奖鍝嶃�� + </p> + <h5 id="e107" class="p-even unit5-c">锛堜笁锛夌┖绠$殑鍥犵礌</h5> + <p class="p-even"> + 涓虹‘淇濋琛屽畨鍏紝绌轰腑浜ら�氱鐞嗗椋炴満鐨勯棿闅旀湁涓ユ牸鐨勮瀹氥�備负浜嗙‘淇濆悎鐞嗙殑闂撮殧锛屽悎鐞嗗湴鍒╃敤鏈夐檺鐨勮埅绾胯祫婧愶紝蹇呴』瀵归鏈虹殑璧烽檷鏃堕棿銆佽繘绂诲満閫氶亾鍔犱互闄愬埗锛屼负閬垮紑鍣0鏁忔劅鍖烘垨鎸夌┖涓蛋寤婇�氳涔熶細閫犳垚杩涚鍦烘椂闂寸殑澧炲姞锛屼粠鑰屽噺灏戠┖娓殑瀹归噺銆� + </p> + <h5 id="e108" class="p-even unit5-c">锛堝洓锛夋皵璞″洜绱�</h5> + <p class="p-even"> + 姘旇薄鏉′欢鐨勫彉鍖栦細杩娇绌烘腐鏀瑰彉杩涚鍦虹▼搴忥紝涓ラ噸鏃剁敋鑷冲叧闂┖娓�傞珮绾害鍦板尯鐨勭┖娓紝鍐鍙楀啺闆奖鍝嶈緝澶э紝鍐澶氶浘鍦板尯鐨勭┖娓彈澶ч浘鐨勫奖鍝嶄篃缁忓父閫犳垚鑸彮寤惰锛屽瀛g殑寮哄娴佸ぉ姘斾細閫犳垚璁稿绌烘腐鏆傛椂鍏抽棴銆� + </p> + <h5 id="e109" class="p-even unit5-c">锛堜簲锛変娇鐢ㄩ噺鐨勫奖鍝�</h5> + <p class="p-even">浣跨敤閲忚秺澶х殑绌烘腐锛岀◢鏈変笉姝e父灏变細閫犳垚寰堝ぇ闈㈢Н鐨勫欢璇紝瀵圭┖娓殑瀹归噺浜х敓涓ラ噸褰卞搷銆傜浉鍙嶏紝浣跨敤閲忓皬鐨勭┖娓紝鑸彮涓嶆甯告椂鑳借緝鏂逛究鍦板鐞嗭紝甯︽潵鐨勫欢璇奖鍝嶅苟涓嶅ぇ銆�</p> + <h4 id="d074" class="p-even unit5-c">涓夈�佸噺灏戝欢璇拰澧炲姞绌烘腐瀹归噺鐨勬柟娉�</h4> + <p class="p-even"> + 鍑忓皯寤惰鍜屽鍔犵┖娓閲忔槸瀵嗕笉鍙垎鐨勶紝鍔炴硶鍙垎涓哄鍔犵‖浠跺拰鏀瑰杽绠$悊涓ゅぇ鏂归潰銆傚鍔犺窇閬撱�佸�欐満妤肩瓑璁炬柦锛岀敋鑷虫槸鍏村缓鏂扮殑绌烘腐绛夌‖浠讹紝浼氳绌烘腐鐨勫閲忓ぇ澶у鍔犮�傛敼鍠勭鐞嗘彁楂樼┖娓殑鍒╃敤鐜囷紝涔熻兘鍦ㄤ竴瀹氱▼搴︿笂澧炲姞绌烘腐鐨勫閲忥紝鍏蜂綋鐨勬柟娉曟湁濡備笅鍑犵銆� + </p> + <h5 id="e110" class="p-even unit5-c">锛堜竴锛夌┖娓垎娴�</h5> + <p class="p-even">鍦ㄨ澶氫腑蹇冨煄甯傚懆鍥达紝闄や簡渚濇墭璇ュ煄甯傜殑澶у瀷绌烘腐锛岃繕鍒嗗竷鐫�涓�浜涢偦杩戝煄甯傜殑绌烘腐銆傝繖浜涚┖娓涓績鍩庡競涔熷緢杩戯紝浣嗙敱浜庡湴鐞嗕綅缃拰浣跨敤宸� + </p> + </div> + </div> + </div> + <!-- 205椤� --> + <div class="page-box" page="213"> + <div v-if="showPageList.indexOf(213) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">205</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 鍒紝鍒╃敤鐜囧苟涓嶉珮銆傚湪浣跨敤涓紝鍙互鎶婅繖浜涚┖娓埄鐢ㄨ捣鏉ャ�傚綋涓績鍩庡競绌烘腐绻佸繖鏃讹紝璁╀竴閮ㄥ垎鑸彮鍦ㄨ繖浜涚┖娓捣闄嶏紝鍐嶉�氳繃渚挎嵎鐨勫湴闈氦閫氬線鏉ヤ腑蹇冨煄甯傦紝鍙ぇ骞呭害鍦板鍔犵┖娓殑瀹归噺銆�</p> + <h5 id="e111" class="p-odd unit5-c">锛堜簩锛夐檺杩涙腐椋炴満绫诲瀷</h5> + <p class="p-odd"> + 绫讳技浜庣┖娓垎娴侊紝澶у瀷绌烘腐鍙厑璁搁珮閫熴�佸ぇ鍨嬮鏈鸿繘娓�傚皢璧烽檷鍜岀寮�涓庤繘鍏ョ┖娓崰鐢ㄦ椂闂村悓鏍峰銆佽繍閲忕浉瀵硅緝灏忕殑涓皬鍨嬮鏈猴紝杩樻湁涓�浜涘崰鐢ㄦ椂闂存洿澶氱殑浣庨�熼�氱敤鑸┖椋炴満瀹夋帓鍒颁笉澶箒蹇欑殑灏忓瀷绌烘腐锛岃澶у瀷绌烘腐鍙繚闅滆繍閲忓ぇ鐨勫ぇ涓瀷椋炴満锛屽皢浼氫娇绌烘腐鐨勫閲忔湁鎵�澧炲姞銆� + </p> + <h5 id="e112" class="p-odd unit5-c">锛堜笁锛夊垎閰嶉檺棰�</h5> + <p class="p-odd">鎶婄┖娓緝绻佸繖鐨勬椂闂存杩涜闄愰鍒嗛厤锛屾寜涓�瀹氳鍒欏垎閰嶇粰浣跨敤璇ョ┖娓殑鑸┖鍏徃銆傝埅绌哄叕鍙镐负浜嗚嚜韬埄鐩婏紝鑷劧浼氳繘琛屾満鍨嬨�佽埅绾跨殑璋冩暣锛屾湁鍒╀簬绌烘腐鍦ㄧ箒蹇欐椂娈靛敖鍙兘鍦板鍔犲閲忋�� + </p> + <h5 id="e113" class="p-odd unit5-c">锛堝洓锛夊埄鐢ㄧ粡娴庢潬鏉嗘帶鍒堕渶姹�</h5> + <p class="p-odd"> + 绌烘腐鍙皢鏀跺彇鑸┖鍏徃鐨勮捣闄嶈垂涓庢椂闂存鑱旂郴璧锋潵锛屽疄琛岀┖娓箒蹇欐椂闂存璧烽檷璐逛笂娴�侀棽鏆囨椂闂存璧烽檷璐逛笅璋冪殑鎺柦锛屾垨鑰呯洿鎺ュ皢鍚勪釜鏃堕棿娈甸噰鍙栨媿鍗栫殑鏂瑰紡灏嗕娇鐢ㄦ潈鍗栫粰鑸┖鍏徃銆備娇鐢ㄧ粡娴庢墜娈垫帶鍒讹紝鍙互鏈夋晥鍦板噺杞婚珮宄版椂娈电殑鎷ユ尋锛屼娇绌烘腐璧勬簮鍒╃敤鏇村姞鍚堢悊锛屽悓鏃惰繕鑳界粰绌烘腐澧炲姞鏀跺叆銆� + </p> + <h4 id="d075" class="p-odd unit5-c">鍥涖�佺┖娓彂灞曢潰涓寸殑闂</h4> + <h5 id="e114" class="p-odd unit5-c">锛堜竴锛夌粡钀ラ棶棰�</h5> + <p class="p-odd"> + 鍏村缓绌烘腐闇�瑕佸ぇ閲忕殑璧勯噾锛屽浗瀹惰储鏀胯缁欎簣鏀寔锛屽湴鏂硅储鏀夸篃瑕佺闆嗗ぇ閲忕殑璧勯噾锛屽悓鏃堕�氳繃鍊哄埜銆佽偂绁ㄧ瓑褰㈠紡铻嶈祫锛屼娇绀句細涓婄殑娴佸姩璧勯噾鍙備笌鍒扮┖娓缓璁句腑鏉ャ�傜┖娓繍钀ュ悗闇�瑕侀泧鐢ㄤ紬澶氱殑宸ヤ綔浜哄憳锛岃繕瑕佹壙鎷呴儴鍒嗗叕浼楁湇鍔℃�ц川鐨勬敮鍑猴紝浣跨┖娓粡钀ヨ幏鍒╃┖闂翠笉澶с�� + </p> + <h5 id="e115" class="p-odd unit5-c">锛堜簩锛夊湡鍦颁娇鐢ㄩ棶棰�</h5> + <p class="p-odd"> + 绌烘腐浠庡叴寤哄紑濮嬶紝灏遍潰涓村湡鍦颁娇鐢ㄩ棶棰樸�傜┖娓殑閫夊潃蹇呴』鑰冭檻绗﹀悎绌烘腐杩愯惀鐨勯渶瑕併�佺ぞ浼氭晥鐩婂拰鎶曡祫鏂归潰鐨勮姹傜瓑锛屼富瑕佸寘鎷笌閭昏繎鏈哄満绌哄煙鍜岃埅璺殑鍗忚皟锛屽懆杈归殰纰嶇墿鎯呭喌锛屽綋鍦颁富椋庡悜銆佹皵娓┿�侀浘鎯呯瓑锛岀┖娓殑杩� + </p> + </div> + </div> + </div> + <!-- 206椤� --> + <div class="page-box" page="214"> + <div v-if="showPageList.indexOf(214) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">206</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">鍑洪�氶亾璁捐銆佸湴浠枫�佸櫔澹板鍛ㄨ竟鍦板尯鐨勫奖鍝嶇瓑涔熶笉寰椾笉鑰冭檻銆�</p> + <div class="bj3 mt-30 mb-30"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0218-1.jpg" /> + <p class="img">鍥�5-31 浜氱壒鍏板ぇ鏈哄満</p> + </div> + <span> + <p class="block"> + 鍦ㄤ富椋庡悜鍙樺寲杈冨ぇ鐨勫湴鍖猴紝绌烘腐鍙慨寤哄鏉′氦鍙夎窇閬擄紝椋庡悜鍙樺寲鏃堕�夋嫨涓庨鍚戠浉宸笉澶х殑璺戦亾浣跨敤銆傚父骞撮鍚戝彉鍖栦笉澶х殑鍦板尯锛岀┖娓彲淇缓鍑犳潯骞宠璺戦亾锛屽浜氱壒鍏板ぇ鏈哄満锛堝浘5-31锛夈��</p> + </span> + <div class="clear"></div> + </div> + <div class="bj3 mt-30 mb-30"> + <div class="bj3-xyx"> + <p><span class="bj3-xyx">灏忚创澹柤</span></p> + </div> + <div class="img-rights openImgBox"> + <img class="img-0" alt="" src="../../assets/images/0218-2.jpg" /> + <p class="img">鍥�5-32 棣欐腐鍥介檯鏈哄満</p> + </div> + <span> + <p class="block"> + 绌烘腐鍦ㄥ湡鍦颁娇鐢ㄧ煕鐩鹃毦浠ヨ皟鍜岀殑鎯呭喌涓嬶紝鍙�夋嫨濉捣銆佺偢骞冲北鍦扮瓑鏂瑰紡淇缓鏈哄満锛屽敖绠″鍔犱簡鎴愭湰锛屼絾鑳芥湁鏁堥伩鍏嶇粡钀ヤ腑鍙戠敓鐨勫湡鍦颁娇鐢ㄥ啿绐侀棶棰橈紝濡傞娓浗闄呮満鍦猴紙鍥�5-32锛夊氨鏄~娴蜂慨寤虹殑銆� + </p> + </span> + <div class="clear"></div> + </div> + <h5 id="e116" class="p-even unit5-c">锛堜笁锛夌┖娓嫢鎸ら棶棰�</h5> + <p class="p-even"> + 闅忕潃鑸┖杩愯緭涓氱殑楂橀�熷彂灞曪紝璁稿鍩庡競鐨勭┖娓閲忓浜庨ケ鍜岀姸鎬侊紝瑙e喅鐨勫姙娉曞氨鏄叴寤虹浜屽骇鏈哄満锛屽鍖椾含銆佷笂娴枫�佹垚閮界殑绗簩搴у浗闄呮満鍦哄凡鎶曞叆杩愯惀銆傝繕鏈夎澶氬煄甯傚湪鍏村缓鏈哄満锛岃繖灏嗛�犳垚绌烘腐绌轰腑閫氶亾鍜岀┖鍩熺殑鎷ユ尋锛屽悓鏃跺叴寤哄お澶氱殑鏈哄満涔熷洜鍦熷湴浣跨敤绛夐棶棰橀�犳垚鎴愭湰瓒婃潵瓒婇珮锛屼笉鍒╀簬缁忚惀銆傜患鍚堝悇鏂归潰鍥犵礌锛屽鐜版湁绌烘腐鎵╁鍜屽悎鐞嗗垎閰嶏紝鍏呭垎鍒╃敤杈冮棽缃殑鏈哄満锛屽埄鐢ㄨ緝鍙戣揪鐨勫湴闈氦閫氬拰鍛ㄨ竟鍩庡競鐩歌繛锛屾槸杈冧负閫傚綋鐨勫姙娉曘�� + </p> + <h5 id="e117" class="p-even unit5-c">锛堝洓锛夌幆澧冨拰鍣0姹℃煋闂</h5> + <p class="p-even">灏界鑸┖鍒堕�犱笟鐨勮繘姝ヤ娇椋炴満鍣0鍛堜笅闄嶈秼鍔匡紝浣嗛殢鐫�鑸┖杩愯緭閲忕殑</p> + </div> + </div> + </div> + <!-- 207椤� --> + <div class="page-box" page="215"> + <div v-if="showPageList.indexOf(215) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">207</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">澧炲姞锛岃埅鐝暟閲忚秺鏉ヨ秺澶氾紝鍣0鐨勫奖鍝嶄篃瓒婃潵瓒婃槑鏄俱�傜壒鍒槸澶у瀷绌烘腐鍛ㄥ洿锛屽櫔澹版薄鏌撳挨涓轰弗閲嶃��</p> + <h4 id="d076" class="p-odd unit5-c">浜斻�佺┖娓殑瑙勫垝</h4> + <p class="p-odd">鍦ㄥ叴寤虹┖娓椂锛屽彧鏈夊仛濂藉畬鍠勭殑瑙勫垝锛屾墠鑳界‘淇濈┖娓『鍒╁缓閫犲拰寤烘垚鍚庢甯歌繍钀ャ��</p> + <h5 id="e118" class="p-odd unit5-c">锛堜竴锛夎鍒掍緷鎹�</h5> + <p class="p-odd">瑙勫垝渚濇嵁涓昏鍖呮嫭濡備笅鍑犱釜鏂归潰銆�</p> + <p class="p-odd">鈶犲満鍦扮殑宸ョ▼鍦拌川銆佹按鏂囧湴璐紝姘旇薄锛堝寘鎷銆佹皵娓┿�佹箍搴︺�侀浘銆侀檷闆ㄩ噺銆侀浄鏆淬�佸啺闆广�侀洩銆侀娌欍�佹皵鍘嬨�佽兘瑙佸害鍜屽ぉ姘斿彉鍖栫粺璁★級锛屽湴鐞嗗湴褰㈢瓑鑷劧鏉′欢锛�</p> + <p class="p-odd">鈶¤埅绌轰笟鍔¢噺棰勬祴銆佸皢瑕佷繚闅滅殑鏈哄瀷銆佺壒寰佸拰鍙戝睍瓒嬪娍锛�</p> + <p class="p-odd">鈶㈢┖娓拰鍩庡競鐨勮窛绂汇�佺浉瀵逛綅缃�佷氦閫氭潯浠躲�佸煄甯傚彂灞曡鍒掋�佸湡鍦板拰闄勮繎灞呮皯鐐圭殑鍒嗗竷锛�</p> + <p class="p-odd">鈶e拰閭昏繎绌烘腐銆佺┖鍩熷強绂侀鍖虹殑鍏崇郴銆佸懆鍥村湴鍖虹殑闅滅鐗╂儏鍐碉紱</p> + <p class="p-odd">鈶ゆ棤绾跨數鏀跺彂棰戠巼鐨勫垝鍒嗕互鍙婂叕鐢ㄨ鏂斤紙濡備緵姘淬�佷緵鐢点�佺叅姘斿拰鐕冩补锛夌殑鑾峰緱锛�</p> + <p class="p-odd">鈶ユ琚拰楦熺被鏍栬韩鍦扮瓑鐢熸�佺幆澧冦��</p> + <h5 id="e119" class="p-odd unit5-c">锛堜簩锛夎鍒掗伒寰殑鍘熷垯</h5> + <p class="p-odd">瑙勫垝瑕侀伒寰互涓嬪師鍒欍��</p> + <p class="p-odd">鈶犵粺涓�瑙勫垝銆佸垎鏈熷缓璁撅紝鍦ㄦ弧瓒虫渶缁堝彂灞曡鎯崇殑鍓嶆彁涓嬶紝鍚堢悊甯冪疆杩戞湡寤鸿椤圭洰锛�</p> + <p class="p-odd">鈶′富瑕佽鏂界殑鍒嗗尯鏃㈣婊¤冻鍚勮嚜鐨勫姛鑳借姹傦紝鍙堣鍗忚皟瀹冧滑涔嬮棿鐨勭浉浜掕仈绯伙紝鍚勮鏂界殑瀹归噺浜掔浉骞宠 锛屼繚璇侀鏈哄畨鍏ㄨ繍琛岋紱</p> + <p class="p-odd">鈶㈡�讳綋甯冨眬绱у噾锛屼娇鐢ㄧ伒娲伙紝鏈夊彂灞曚綑鍦帮紱</p> + <p class="p-odd">鈶g敤鍦扮粡娴庡悎鐞嗭紝灏戝崰鎴栦笉鍗犺壇鐢板拰灞呮皯鐐癸紱</p> + <p class="p-odd">鈶ら伩鍏嶇幆澧冩薄鏌擄紝缁存寔鐢熸�佸钩琛★紝浣跨┖娓拰瀹冩墍渚濇墭鐨勫煄甯傚強鍛ㄥ洿鍦板尯鍗忚皟鍙戝睍銆�</p> + <p class="p-odd">闅忕潃姘戣埅杩愯緭鐨勫彂灞曘�侀鏈烘満鍨嬬殑鏇存柊銆佸鑸鏂界殑鏀硅繘锛屼互鍙婃棩鐩婃彁楂樼殑鐜鏍囧噯绛夛紝绌烘腐鎬讳綋瑙勫垝蹇呴』鏄患鍚堝垎鏋愭妧鏈�佺粡娴庛�佹斂娌汇�佺ぞ</p> + + </div> + </div> + </div> + <!-- 208椤� --> + <div class="page-box" page="216"> + <div v-if="showPageList.indexOf(216) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">208</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0"> + 浼氥�佽储鏀裤�佺幆澧冪瓑璇稿洜绱犲悗寰楀嚭鐨勬妧鏈彲琛屻�佺粡娴庡悎鐞嗙殑鏈�浣虫柟妗堛�� + </p> + <h5 id="e120" class="p-even unit5-c">锛堜笁锛夎鍒掑唴瀹�</h5> + <p class="p-even">瑙勫垝鍐呭鍥犵┖娓�ц川銆佽妯″拰鍦扮悊浣嶇疆绛夌殑涓嶅悓鑰屽紓锛屼富瑕佸寘鎷互涓嬪唴瀹广��</p> + <h6 id="f035" class="p-even">1.杩涜鑸┖涓氬姟閲忕殑棰勬祴</h6> + <p class="p-even"> + 鍚勭涓氬姟閲忕殑棰勬祴鏄埗瀹氳鍒掔殑鍩虹銆傞娴嬫湡闄愬垎鐭�佷腑銆侀暱鏈燂紝鐭湡棰勬祴骞撮檺浣庝簬5骞达紝涓湡5锝�10骞达紝闀挎湡涓�10骞翠互涓娿�傛湁鏃朵篃瀵圭┖娓渶缁堝閲忓仛鍑洪娴嬶紝棰勬祴鍐呭鍖呮嫭椋炴満杩愯鏋舵銆佹満鍨嬬粍鍚堛�佹梾瀹汉鏁般�佽揣鐗╅偖浠惰繍閲忓拰鍦伴潰杞﹁締浜ら�氶噺銆傞娴嬫柟娉曟湁瓒嬪娍澶栨帹娉曘�佺粡娴庢ā寮忋�佸競鍦鸿皟鏌ユ硶鍜屼笓瀹惰瘎浼版硶銆傝秼鍔垮鎺ㄦ硶鏄牴鎹巻骞翠笟鍔¢噺鐨勭粺璁℃暟鎹紝鎺ㄧ畻鍑哄勾澧為暱鐜囦互鍙婇娴嬫湭鏉ヤ氦閫氶噺锛岄�傜敤浜庣煭鏈熼娴嬨�傜粡娴庢ā寮忔槸閫氳繃鍒嗘瀽鍩庡競鎴栧湴鍖洪棿鐨勪汉鍙c�佸浗姘戠敓浜ф�诲�笺�佸伐涓氬彂灞曟按骞炽�佸浗姘戞敹鍏ュ拰鑸┖杩愯緭璐圭敤绛夌ぞ浼氥�佺粡娴庡洜绱狅紝缁忚繃缁熻鍒嗘瀽寤虹珛浠ヨ嫢骞茬粡娴庢寚鏍囦负鑷彉閲忕殑鏁板妯″瀷棰勬祴涓氬姟閲忥紝閫傜敤浜庝腑闀挎湡棰勬祴銆傚競鍦鸿皟鏌ユ硶鍜屼笓瀹惰瘎浼版硶鍒嗗埆閲囩敤璋冩煡涓嶅悓閮ㄩ棬鑸┖杩愯緭涓氬姟娼滃姏鍜岄個璇疯埅绌哄叕鍙搞�佹皯鑸儴闂ㄥ強缁忔祹鏂归潰鐨勪笓瀹跺鏌愮壒瀹氱┖娓殑涓氬姟閲忓仛鍑鸿瘎浼板拰棰勬祴銆� + </p> + <h6 id="f036" class="p-even">2.鍙戝睍瑙勬ā鍜屾爣鍑嗙殑纭畾</h6> + <p class="p-even"> + 鏍规嵁棰勬祴涓氬姟閲忓喅瀹氱┖娓鏂界殑杩戞湡銆佽繙鏈熷強鏈�缁堢殑鍙戝睍瑙勬ā锛涢鏈烘満鍨嬪拰鑸嚎鑸▼鍐冲畾椋炶鍖虹殑鍚勯」璁炬柦鐨勫嚑浣曞昂瀵稿拰鏁伴噺锛堝嵆璺戦亾銆佹粦琛岄亾鐨勯暱銆佸銆佸帤鍙婇棿璺濄�佹暟閲忥級锛涢珮宄版瘡灏忔椂椋炴満鏋舵鍜屾梾瀹汉鏁板喅瀹氬�欐満妤煎尯瑙勬ā锛涜揣鐗╁勾杩愰噺鍐冲畾璐х墿鑸珯瑙勬ā锛屽苟鐩稿簲鍐冲畾淇濊瘉椋炴満瀹夊叏椋炶鐨勯�氫俊瀵艰埅銆佺┖涓氦閫氱鍒躲�佹皵璞¤鏂斤紱淇濊瘉绌烘腐姝e父杩愯鐨勪緵鐢点�佷緵姘淬�佷緵娌圭瓑鍏敤璁炬柦锛屼互鍙婅繘鍑虹┖娓殑閬撹矾鍜岀┖娓唴閬撹矾銆佸仠杞﹀満鐨勮妯$瓑銆� + </p> + <h6 id="f037" class="p-even">3.绌烘腐涓昏璁炬柦鐨勫钩闈㈠竷灞�</h6> + <p class="p-even">绌烘腐涓昏璁炬柦鐨勫钩闈㈠竷灞�鍖呮嫭椋炶鍖恒�佸�欐満妤煎尯銆佸悇绉嶅伐浣滃尯銆佸鍙板拰鏃犵嚎鐢甸�氫俊瀵艰埅璁炬柦銆佹皵璞¤鏂姐�佷緵娌硅鏂姐�佹満鍔$淮淇尯銆佹�ユ晳涓績鍜岄亾璺瓑鐨勫竷缃��</p> + <p class="p-even">椋炶鍖虹殑甯冪疆涓昏鎸囪窇閬撱�佹粦琛岄亾銆佸揩閫熷嚭鍙f粦琛岄亾銆佽仈缁滄粦琛岄亾銆佺┖涓繘鍑洪�氶亾銆佸仠鏈哄潽鍙婇琛屽尯鎺掓按绯荤粺鐨勫竷缃�傚叾涓窇閬撴槸鏈�涓昏鐨勯儴 + </p> + </div> + </div> + </div> + <!-- 209椤� --> + <div class="page-box" page="217"> + <div v-if="showPageList.indexOf(217) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">209</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">鍒嗭紝瀹冪殑甯冪疆鍐冲畾浜庤窇閬撶殑鏁伴噺鍜屾柟浣嶃�傛粦琛岄亾鐨勪綅缃強灏哄鍙栧喅浜庤窇閬撶殑绫诲埆鍙婁娇鐢ㄧ殑鏈哄瀷銆傚仠鏈哄潽鏍规嵁鍋滄斁椋炴満鐨勬満鍨嬪拰鏁伴噺銆佸満鍦版潯浠舵潵甯冪疆銆�</p> + <p class="p-odd"> + 鍊欐満妤煎尯鏄┖娓鍒掑竷灞�鐨勯噸鐐癸紝瑙勬ā杈冨ぇ鐨勭┖娓湪甯冨眬鏃惰繕搴旇�冭檻璐у満銆傚伐浣滃尯鏄寚鍖呮嫭鑸┖鍏徃銆佺┖娓鐞嗛儴闂ㄥ拰姝﹁璀﹀療銆佹捣鍏炽�佹鐤瓑閮ㄩ棬鍦ㄧ┖娓伐浣滅殑浜哄憳鍔炲叕鍜岀敓娲荤殑鍖哄煙锛屽簲鐩稿闆嗕腑鍦板竷缃湪涓庡�欐満妤煎尯鐩搁殧涓�瀹氳窛绂荤殑鍦版柟锛屼互涓嶅奖鍝嶅拰骞叉壈鏃呭鍙婂悇绉嶈溅杈嗙殑閫氳涓哄師鍒欍�傞櫎蹇呬笉鍙皯鐨勭敓娲荤敤鎴垮锛屽叾浠栧潎搴斿湪绌烘腐澶栧缓閫犮�� + </p> + <p class="p-odd"> + 濉斿彴搴斿竷缃湪鏁翠釜绌烘腐鐨勯�備腑浣嶇疆锛屼笉濡ㄧ鑸珯妤肩殑鎵╁缓銆傛棤绾跨數閫氫俊瀵艰埅璁炬柦椤荤粨鍚堢┖娓妯°�佸湴褰€�佸満鍦版潯浠跺拰璁惧鎶�鏈姹傞�夊潃锛屽繀椤绘槗浜庢按銆佺數绛夊叕鐢ㄨ鏂藉缓璁惧苟涓庡鐣岀殑閬撹矾鎺ラ�氥�傛皵璞¤鏂藉寘鎷皵璞¤娴嬬珯鍜屾皵璞¢浄杈剧珯銆傝娴嬬珯搴斿敖鍙兘闈犺繎椋炶鍖猴紝鑳借娴嬭窇閬撲袱绔鏈鸿繘杩戝尯鐨勫ぉ姘斿彉鍖栵紝瀹冪殑浠〃搴旈伩鍏嶅彈鍒版潵鑷鏈哄柗姘旀祦鐨勫惞琚�傛皵璞¢浄杈剧珯鐨勪綅缃繕搴旈伩鍏嶅懆鍥撮珮鑰稿缓绛戠墿瀵归浄杈炬尝鐨勯伄鎸°�� + </p> + <p class="p-odd"> + 渚涙补璁炬柦锛屽鍗告补绔欙紝鍏朵綅缃竴鑸�夊湪鑳芥帴閫氶搧璺垨闈犺繎鍗告补鐮佸ご鐨勫湴鏂广�傛牴鎹琛岄噺鍐冲畾鍌ㄦ补搴撶殑瑙勬ā锛屽簱鍧�搴旇繙绂荤珯鍧垨绌烘腐銆傚満鍐呬娇鐢ㄦ补搴撳垯蹇呴』涓庡叾浠栧姛鑳藉尯娈靛垎闅斿紑鏉ワ紝骞朵繚鎸佽冻澶熺殑瀹夊叏璺濈銆�</p> + <p class="p-odd"> + 鏈哄姟缁翠慨鍖虹殑瑙勬ā鍜屾瀯鎴愬彇鍐充簬绌烘腐鏈哄姟缁翠慨瑙勬ā鍙婁换鍔°�傛満搴撳強缁翠慨鏈哄潽鐨勫竷缃簲涓庡�欐満妤笺�佽揣绔欑浉闅斾竴瀹氱殑璺濈銆傛壙鎷呰埅绾挎淇殑绌烘腐鍙鏈哄姟澶栧満宸ヤ綔闂村強灏戦噺缁翠慨杞﹂棿锛屽畠浠殑浣嶇疆瀹滈潬杩戝仠鏈哄潽銆�</p> + <p class="p-odd"> + 娑堥槻銆佹�ユ晳绔欑殑浣嶇疆搴斿敖鍙兘闈犺繎椋炶鍖猴紝骞朵笌椋炶鍖烘湁鐩存帴銆佹柟渚跨殑閬撹矾鐩歌繛锛屼笖浠庢秷闃茬珯鐨勮瀵熸帶鍒跺鑳界灜鏈涘埌绌烘腐椋炶鍖洪噷椋炴満鐨勬椿鍔ㄦ儏鍐点�傛晳鎻翠腑蹇冮�氬父鍜岀┖娓秷闃茬珯甯冪疆鍦ㄤ竴璧枫�傝繘鍑哄�欐満妤肩殑閬撹矾搴旂粨鍚堝煄甯傝鍒掔殑閬撹矾缃戝竷缃紝灏介噺鎶婇�氬線鍊欐満妤肩殑杞﹁締鍜屽叾浠栨湇鍔¤溅杈嗗垎寮�銆傞�氬線鍚勫姛鑳藉尯鐨勯亾璺拰鍚勫尯娈甸棿鐨勮繛鎺ラ亾璺簲缁煎悎甯冪疆锛岀粨鍚堢┖娓洿鐣屽竷缃贰閫婚亾璺�� + </p> + <p class="p-odd"> + 姝ゅ锛岀┖娓�讳綋瑙勫垝杩樺繀椤诲埗瀹氱┖娓殑鐜璁捐鍙婄豢鍖栧竷缃紝椋炴満鍣0鐨勯殧绂伙紝姘淬�佺┖姘旀薄鏌撶殑鎺у埗銆侀笩鍑荤殑闃叉不绛夋帾鏂斤紝绌烘腐鍐呯殑鍦熷湴浣跨敤瑙勫垝銆傛牴鎹鏈鸿繍琛屼骇鐢熺殑鍣0褰卞搷鎯呭喌锛屽悜褰撳湴鍩庡競瑙勫垝閮ㄩ棬鎻愪緵绌烘腐闄勮繎鍦熷湴浣跨敤瑙勫垝鐨勫缓璁�� + </p> + <h6 id="f038" class="p-odd">4.鍦熷湴浣跨敤瑙勫垝</h6> + <p class="p-odd">绌烘腐闄勮繎鐨勫湡鍦板疁鍒嗗尯鎺у埗浣跨敤锛屽敖閲忎娇鍣0姹℃煋鐨勫奖鍝嶉檺鍒跺湪瀹硅</p> + </div> + </div> + </div> + <!-- 210椤� --> + <div class="page-box" page="218"> + <div v-if="showPageList.indexOf(218) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">210</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">鑼冨洿涔嬪唴锛屽舰鎴愪竴涓悎鐞嗗埄鐢ㄧ殑鐜銆�</p> + <p class="p-even"> + 鏍规嵁瀵硅绌烘腐杩愯鐨勯鏈烘満鍨嬨�佽埅绾裤�佽繍琛屾鏁板強鏃堕棿鐨勯娴嬫垨瀹炴祴璧勬枡锛岄�氳繃璁$畻鎴栧疄娴嬶紝姹傚嚭椋炴満杩愯涓悇涓嶅悓璺濈鐨勬劅瑙夊櫔澹扮骇锛屽苟璁$畻鍑烘湁鏁堟劅瑙夊櫔澹扮骇锛屽仛鍑虹┖娓櫔澹版毚闇查娴嬨�傚埄鐢ㄨ绠楁垚鏋滐紝缁樺嚭绌烘腐鍣0鏆撮湶绛夊己绾垮浘銆傚皢绛夊己绾垮浘瑕嗙洊鍦ㄥ湡鍦板埄鐢ㄥ湴鍥句笂锛屾牴鎹浗瀹跺叧浜庣┖娓檮杩戝櫔澹扮幆澧冩爣鍑嗭紝瀵圭収绛夊己绾垮浘鍗冲彲瀵圭幇鍦ㄧ殑鍦熷湴浣跨敤鎯呭喌鍋氬嚭璇勪环銆傚鏋滅┖娓鐨勫湡鍦板皻寰呭紑鍙戯紝绛夊己绾垮浘灏辨槸寤虹珛缁煎悎鐨勫湡鍦颁娇鐢ㄥ垎鍖鸿姹傜殑鍩虹锛屽浜庤秴鍑虹幆澧冨櫔澹版爣鍑嗙殑寤虹瓚鍖猴紝搴旀彁鍑洪噰鍙栧Ε鍠勬帾鏂界殑寤鸿銆� + </p> + <h6 id="f039" class="p-even">5.璇勪环绌烘腐杩愯鐨勭ぞ浼氱粡娴庢晥鐩�</h6> + <p class="p-even"> + 璇勪环绌烘腐杩愯鐨勭ぞ浼氱粡娴庢晥鐩婂寘鎷洿鎺ョ粡娴庢晥鐩婂拰闂存帴缁忔祹鏁堢泭銆傜洿鎺ョ粡娴庢晥鐩婇�氳繃鍒嗘瀽绌烘腐鎶曡祫鍜岀粡钀ュ埄娑︿箣闂寸殑鍏崇郴锛岃�冭檻鏃堕棿鍥犵礌锛屽绌烘腐宸ョ▼杩涜鎬昏瘎浠枫�傝瘎浠锋柟娉曟湁绠�鍗曟姇璧勬敹鐩婄巼銆佽繑鏈湡銆佺泩浜忓垎鏋愮瓑銆傞棿鎺ョ粡娴庢晥鐩婇�氳繃鍒嗘瀽绌烘腐杩愯瀵瑰煄甯傚拰鍛ㄥ洿鍦板尯鐨勫伐鍐滀笟鐢熶骇銆佹梾娓搞�佸璐搞�佽祫婧愬紑鍙戙�佺鎶�銆佹枃鏁欑瓑浜х敓鐨勭粡娴庢晥鐩婏紝瀵圭┖娓伐绋嬭繘琛屾�讳綋璇勪环銆傜洿鎺ョ粡娴庢晥鐩婇�氬父閲囩敤瀹氶噺鍒嗘瀽锛岄棿鎺ョ粡娴庢晥鐩婂垯浠ュ畾鎬у垎鏋愪负涓汇�佸畾閲忓垎鏋愪负杈呫�� + </p> + <p class="p-even"> + 鍦ㄤ笂杩板伐浣滅殑鍩虹涓婏紝瀹屾垚绌烘腐鎬讳綋甯冪疆鍥俱�佺┖娓拰鍩庡競鍙婇偦杩戠┖娓叧绯诲浘銆佸噣绌鸿姹傞檺鍒跺浘銆侀鏈虹娓�佽繘杩戝拰澶嶉鑸嚎鍥俱�佺┖娓┖鍩熷浘銆侀鏈鸿繍琛屽櫔澹板奖鍝嶅強闄勮繎鍦熷湴浣跨敤瑙勫垝鍥俱�侀鐨勫垎鏋愪互鍙婅鍒掓�昏鏄庣瓑銆� + </p> + <p class="p-even"> + 鍥犳锛屽湪绌烘腐鐨勮鍒掑拰璁捐宸ヤ綔涓紝瑕佸崄鍒嗛噸瑙嗗鐞嗗ソ绌烘腐涓庡煄甯備箣闂寸殑鍏崇郴銆傜┖娓笌鍩庡競鐨勮窛绂讳笉瀹滆繃杩戜篃涓嶅疁澶繙锛岃繃杩戝垯鐩镐簰骞叉壈銆佺浉浜掑奖鍝嶏紝濡傞鏈哄櫔澹板鍩庡競灞呮皯鍙婄幆澧冪殑褰卞搷锛屽煄甯傚缓绛戠墿鍜岀儫灏樺鏈哄満鍑�绌哄拰鑳借搴︾殑褰卞搷锛岃�屼笖褰卞搷鍒板悇鑷殑鍙戝睍銆傝繃杩滃垯浣跨敤涓嶄究锛岃�屼笖澧炲姞缁忓父鎬х殑鍦伴潰浜ら�氳垂鐢ㄥ拰鍦伴潰琛岃溅鏃堕棿銆備竴鑸涓猴紝绌烘腐涓庡叾鎵�渚濇墭鐨勫煄甯備箣闂村繀椤绘湁蹇�熶究鎹风殑鍦伴潰浜ら�氾紝琛岃溅鏃堕棿浠ヤ笉瓒呰繃40min涓哄疁銆傜┖娓墍澶勭殑浣嶇疆鍜岃窇閬撶殑鏂瑰悜锛岃浣块鏈鸿捣椋炲拰闄嶈惤鏃堕伩鍏嶇粡杩囧煄甯傜殑涓婄┖銆傜敱浜庡奖鍝嶇┖娓満鍦扮殑鍥犵礌鏄鏂归潰鐨勶紝蹇呴』鏍规嵁鍏蜂綋鎯呭喌杩涜缁煎悎鐮旂┒鍚庣‘瀹氥�� + </p> + + </div> + </div> + </div> + <!-- 211椤� --> + <div class="page-box" page="219"> + <div v-if="showPageList.indexOf(219) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">211</li> + </ul> + <div class="bodystyle"> + <h3 id="c001" class="unit5-c"> + 瀛︿範浠诲姟浜�<br />鍥藉唴涓昏绌烘腐 + </h3> + <div class="task-u5-c "></div> + <h4 id="d077" class="p-odd unit5-c">涓�銆佹満鍦烘鍐�</h4> + <p class="p-odd"> + 鏂颁腑鍥芥垚绔嬩互鏉ワ紝鐩哥户鍦ㄤ竴浜涘ぇ鍩庡競淇缓浜嗘満鍦恒�傚湪鍒濇湡锛屽ぇ澶氭暟鏈哄満鐨勮妯¤緝灏忋�佽澶囪緝宸�佸悶鍚愰噺鏈夐檺銆備腑鍥芥皯鐢ㄨ埅绌哄眬璧勬枡鏄剧ず锛�1978骞达紝鎴戝浗浠呮湁78涓皯鐢ㄨ繍杈撴満鍦猴紙涓嶅惈娓境鍙板湴鍖猴級锛屽叾涓啗姘戝悎鐢ㄦ満鍦�36涓�<sup>鈶�</sup>锛�2006骞达紝鎴戝浗澧冨唴姘戠敤鑸┖瀹氭湡鑸彮閫氳埅鏈哄満锛堜笉鍚腐婢冲彴鍦板尯锛�142涓紝瀹氭湡鑸彮閫氳埅鍩庡競140涓�<sup>鈶�</sup>锛涙埅鑷�2022骞达紝鎴戝浗澧冨唴杩愯緭鏈哄満锛堜笉鍚腐婢冲彴鍦板尯锛夊叡鏈�254涓紝鍏朵腑瀹氭湡鑸彮閫氳埅杩愯緭鏈哄満253涓紝瀹氭湡鑸彮閫氳埅鍩庡競锛堟垨鍦板尯锛�249涓�<sup>鈶�</sup> + </p> + <p class="p-odd"> + 鎴戝浗缁濆ぇ閮ㄥ垎鑸┖杩愯緭閲忛泦涓湪灏戞暟鏋㈢航鍜岄噸瑕佹満鍦猴紝鑰屽鏁版満鍦虹殑鑸┖杩愯緭閲忓緢灏忋�備粠鍏ㄥ浗鐨勬満鍦哄瘑搴﹀垎甯冩潵鐪嬶紝澶ч儴鍒嗘満鍦哄垎甯冨湪鍝堝皵婊ㄢ�斿寳浜�旇タ瀹夆�旀垚閮解�旀槅鏄庝竴绾夸互涓滃湴鍖猴紝鏈変粠涓滃悜瑗块�掑噺鐨勮秼鍔匡紝鑸┖杩愯緭閲忎篃鏈夌浉鍚岀殑鍒嗗竷鐗圭偣銆� + </p> + <p class="p-odd"> + 鎴戝浗姘戣埅杩愯緭鏈哄満鐨勫竷灞�涓庤埅绌鸿繍杈撳競鍦哄竷灞�鏄熀鏈惢鍚堢殑锛屼笌鍏ㄥ浗浜ら�氳繍杈撶殑甯冨眬銆佸叏鍥界粡娴庡彂灞曠殑鍦板尯宸紓涔熸槸鍚诲悎鐨勶紝杩欒鏄庢垜鍥芥満鍦虹殑鍒嗗竷鍩烘湰涓婃槸鍚堢悊鐨勩�傛満鍦哄垎甯冧笉骞宠 鏄澶氬浗瀹惰埅绌鸿繍杈撴墍鍏锋湁鐨勫叡鎬с�傚鏁板彂杈惧浗瀹剁殑鏈哄満涔熼泦涓垎甯冨湪娌挎捣鐨勭粡娴庨噸蹇冨尯锛岃�屼笖鑸┖杩愯緭閲忎篃闆嗕腑浜庡皯鏁板ぇ鍨嬭埅绌烘灑绾斤紝澶у鏁版満鍦虹殑鑸┖杩愯緭閲忕浉瀵硅緝灏忋�傚洜姝わ紝鏈哄満甯冨眬涓庣粡娴庡彂灞曠殑鍦板尯宸紓鐩稿惢鍚堬紝鏄埅绌鸿繍杈撳彂灞曠殑瑙勫緥涔嬩竴銆� + </p> + <hr class=""> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 涓浗姘戠敤鑸┖灞�锛氥�婃皯鑸眬涓捐10鏈堜緥琛屾柊闂诲彂甯冧細銆嬶紝<a + href="http://www.caac.gov.cn/XWZX/MHYW/201810/t20181012_192141.html" + target="_blank">http://www.caac.gov.cn/XWZX/MHYW/201810/t20181012_192141.html</a>锛�2023-05-15銆� + </p> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 涓浗姘戠敤鑸┖灞�锛氥��2006骞存皯鑸満鍦虹敓浜х粺璁″叕鎶ャ�嬶紝<a + href="http://www.caac.gov.cn/XXGK/XXGK/TJSJ/201511/t20151102_8715.html" + target="_blank">http://www.caac.gov.cn/XXGK/XXGK/TJSJ/201511/t20151102_8715.html</a>锛�2023-05-15銆� + </p> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 涓浗姘戠敤鑸┖灞�锛氥��2022骞村叏鍥芥皯鐢ㄨ繍杈撴満鍦虹敓浜х粺璁″叕鎶ャ�嬶紝<a + href="http://www.caac.gov.cn/XXGK/XXGK/TJSJ/202303/t20230317_217609.html" + target="_blank">http://www.caac.gov.cn/XXGK/XXGK/TJSJ/202303/t20230317_217609.html</a>锛�2023-05-15銆� + </p> + </div> + </div> + </div> + <!-- 212椤� --> + <div class="page-box" page="220"> + <div v-if="showPageList.indexOf(220) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">212</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even"> + 鍏ㄥ浗姘戠敤鏈哄満鐨勫竷灞�鍜屽缓璁捐鍒掔敱鍥藉姟闄㈡皯鐢ㄨ埅绌轰富绠¢儴闂ㄥ悓鍥藉姟闄㈠叾浠栨湁鍏抽儴闂ㄥ埗瀹氾紝骞舵寜鐓у浗瀹惰瀹氱殑绋嬪簭缁忔壒鍑嗗悗缁勭粐瀹炴柦銆傜渷銆佽嚜娌诲尯銆佺洿杈栧競浜烘皯鏀垮簻搴斿綋鏍规嵁鍏ㄥ浗姘戠敤鏈哄満鐨勫竷灞�鍜屽缓璁捐鍒掞紝鍒跺畾鏈鏀垮尯鍩熷唴鐨勬皯鐢ㄦ満鍦哄缓璁捐鍒掞紝骞舵寜鐓у浗瀹惰瀹氱殑绋嬪簭鎶ョ粡鎵瑰噯鍚庯紝灏嗗叾绾冲叆鏈尯鍩熷浗姘戠粡娴庡拰绀句細鍙戝睍瑙勫垝銆傛皯鐢ㄦ満鍦哄缓璁捐鍒掑簲褰撲笌鍩庡競寤鸿瑙勫垝鐩稿崗璋冿紝鏂板缓銆佹敼寤哄拰鎵╁缓姘戠敤鏈哄満锛屽簲褰撶鍚堜緷娉曞埗瀹氱殑姘戠敤鏈哄満甯冨眬鍜屽缓璁捐鍒掞紝绗﹀悎姘戠敤鏈哄満鏍囧噯锛屽苟鎸夌収鍥藉瑙勫畾鎶ョ粡鏈夊叧涓荤鏈哄叧鎵瑰噯骞跺疄鏂姐�備笉绗﹀悎渚濇硶鍒跺畾鐨勬皯鐢ㄦ満鍦哄竷灞�鍜屽缓璁捐鍒掔殑姘戠敤鏈哄満寤鸿椤圭洰锛屼笉寰楁壒鍑嗐�傛柊寤恒�佹墿寤烘皯鐢ㄦ満鍦猴紝搴斿綋鐢辨皯鐢ㄦ満鍦烘墍鍦ㄥ湴鍘跨骇浠ヤ笂鍦版柟浜烘皯鏀垮簻鍙戝竷鍏憡銆� + </p> + <p class="p-even"> + 涓庝笘鐣屼笂璁稿澶у瀷鏈哄満鐩告瘮锛屾垜鍥界殑鏈哄満瑙勬ā杈冨皬锛屽閲忔湁闄愩��2021骞�12鏈�14鏃ワ紝涓浗姘戠敤鑸┖灞�銆佸浗瀹跺彂灞曞拰鏀归潻濮斿憳浼氥�佷氦閫氳繍杈撻儴鑱斿悎鍗板彂銆娾�滃崄鍥涗簲鈥濇皯鐢ㄨ埅绌哄彂灞曡鍒掋�嬶紝鎻愬嚭浠ョ獊鐮磋祫婧愬閲忕摱棰堜负閲嶇偣锛屽姞蹇瀯寤虹幇浠e寲鐨勫浗瀹剁患鍚堟満鍦轰綋绯诲拰绌轰腑浜ら�氱鐞嗕綋绯汇�傚埌鈥滃崄鍥涗簲鈥濇湯锛屽缓鎴愭皯鐢ㄨ繍杈撴満鍦�270涓紝甯傚湴绾ц鏀夸腑蹇�60min鍒拌繍杈撴満鍦鸿鐩栫巼瓒呰繃80%锛屽崈涓囩骇浠ヤ笂鏈哄満杩戞満浣嶉潬妗ョ巼杈惧埌80%锛屾灑绾芥満鍦鸿建閬撲氦閫氭帴鍏ョ巼杈惧埌80%锛岀┖绠″勾淇濋殰鑸彮璧烽檷1700涓囨灦娆°�� + </p> + <p class="p-even"> + 鎴戝浗灏嗚繘涓�姝ュ姞閫熸瀯寤哄拰瀹屽杽鐜颁唬鍖栧浗瀹舵満鍦轰綋绯伙紝杩涗竴姝ュ彂鎸ユ皯鑸湪浜ら�氳繍杈撻鍩熺殑浼樺娍锛屽姞蹇缓鎴愪互涓栫晫绾ф満鍦虹兢銆佸浗闄呰埅锛堣揣杩愶級绌烘灑绾戒负鏍稿績锛屽尯鍩熸灑绾戒负楠ㄥ共锛岄潪鏋㈢航鏈哄満鍜岄�氱敤鏈哄満涓洪噸瑕佽ˉ鍏呯殑鍥藉缁煎悎鏈哄満浣撶郴锛岄噸鐐瑰缓璁句含娲ュ唨銆侀暱涓夎銆佺菠娓境澶ф咕鍖恒�佹垚娓濊繖鍥涘ぇ涓栫晫绾ф満鍦虹兢锛屽珐鍥哄崄澶у浗闄呰埅绌烘灑绾藉湴浣嶏紝鎺ㄨ繘閮戝窞銆佸ぉ娲ャ�佸悎鑲ャ�侀剛宸炲洓涓浗闄呰埅绌鸿揣杩愭灑绾藉缓璁撅紝灏嗗竷灞�40涓乏鍙崇殑鍖哄煙鑸┖鏋㈢航锛屾瀯寤鸿捣鍥涢�氬叓杈俱�佽仈閫氬叏鐞冪殑绌轰腑杩愯緭缃戠粶銆� + </p> + <h4 id="d078" class="p-even unit5-c">浜屻�佷含娲ュ唨鏈哄満缇�</h4> + <p class="p-even">浜触鍐�鏈哄満缇ょ殑涓昏鏈哄満鍖呮嫭鍖椾含棣栭兘鍥介檯鏈哄満銆佸寳浜ぇ鍏村浗闄呮満鍦恒�佸ぉ娲ユ花娴峰浗闄呮満鍦恒�佺煶瀹跺簞姝e畾鍥介檯鏈哄満鍜屽お鍘熸瀹垮浗闄呮満鍦恒��</p> + <h5 id="e121" class="p-even unit5-c">锛堜竴锛夊寳浜閮藉浗闄呮満鍦�</h5> + <p class="p-even">鍖椾含棣栭兘鍥介檯鏈哄満涓烘柊涓浗鎴愮珛浠ユ潵鎴戝浗鍏村缓鐨勭涓�搴уぇ鍨嬫皯鐢ㄨ繍杈撴満鍦猴紝鏈哄満涓夊瓧浠g爜涓篜EK銆傚寳浜閮藉浗闄呮満鍦轰笉浣嗘槸鎴戝浗棣栭兘鍖椾含鐨勭┖涓�</p> + + </div> + </div> + </div> + <!-- 213椤� --> + <div class="page-box" page="221"> + <div v-if="showPageList.indexOf(221) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">213</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">闂ㄦ埛鍜屽澶栦氦寰�鐨勭獥鍙o紝鑰屼笖鏄垜鍥芥皯鐢ㄨ埅绌虹綉缁滅殑杈愬皠涓績銆�</p> + <p class="p-odd"> + 鎴嚦2019骞村勾搴曪紝鍦ㄥ寳浜閮藉浗闄呮満鍦鸿繍钀ュ晢涓氳埅鐝殑鑸┖鍏徃鏈�93瀹讹紝鍏朵腑鍥藉唴锛堝惈娓境鍙板湴鍖猴級鑸┖鍏徃31瀹讹紝鍥藉鑸┖鍏徃62瀹讹紱閫氳埅65涓浗瀹跺強鍦板尯鐨�294涓埅鐐癸紝鍥介檯鑸偣133涓�傚悓鏃讹紝浣滀负鎴戝浗閲嶈鐨勭┖涓棬鎴峰拰瀵瑰浜ゆ祦绐楀彛锛屽寳浜閮藉浗闄呮満鍦哄鍖哄煙缁忔祹鐨勫奖鍝嶅姏涓庢棩淇卞銆傛牴鎹尯鍩熺粡娴庣爺绌舵姤鍛婏紝棣栭兘鍥介檯鏈哄満瀵瑰寳浜競鐨勬�讳綋缁忔祹璐$尞杈惧埌1828.35浜垮厓锛屽崰鍖椾含甯侴DP鎬婚鐨�6.53%锛涗负鍖椾含甯傛�诲叡甯︽潵73.15涓囦釜灏变笟宀椾綅锛屽崰鍖椾含甯傛�讳綋灏变笟浜烘暟鐨�5.86%銆�2018骞淬��2019骞达紝鍖椾含棣栭兘鍥介檯鏈哄満骞存梾瀹㈠悶鍚愰噺杩炵画2骞寸獊鐮�1浜夸汉娆★紝杩炵画10骞翠綅鍒楀叏鐞冪2鍚嶏紝鍥介檯鏈哄満鍗忎細鏃呭鎬绘弧鎰忓害杈惧埌4.99銆�<sup>鈶�</sup> + </p> + <h5 id="e122" class="p-odd unit5-c">锛堜簩锛夊寳浜ぇ鍏村浗闄呮満鍦�</h5> + <p class="p-odd"> + 鍖椾含澶у叴鍥介檯鏈哄満浣嶄簬鍖椾含甯傚ぇ鍏村尯姒嗗灐闀囥�佺ぜ璐ら晣鍜屾渤鍖楃渷寤婂潑甯傚箍闃冲尯涔嬮棿锛屾満鍦轰笁瀛椾唬鐮佷负PKX銆傚畠涓�4F绾у浗闄呮満鍦恒�佷笘鐣岀骇鑸┖鏋㈢航銆佸浗瀹跺彂灞曟柊鍔ㄥ姏婧愩��2014骞�12鏈�26鏃ワ紝鍖椾含鏂版満鍦洪」鐩紑宸ュ缓璁撅紱2018骞�9鏈�14鏃ワ紝鍖椾含鏂版満鍦洪」鐩畾鍚嶁�滃寳浜ぇ鍏村浗闄呮満鍦衡�濓紱2019骞�9鏈�25鏃ワ紝鍖椾含澶у叴鍥介檯鏈哄満姝e紡閫氳埅锛屽寳浜崡鑻戞満鍦烘寮忓叧闂紱2019骞�10鏈�27鏃ワ紝鍖椾含澶у叴鍥介檯鏈哄満鑸┖鍙e哺姝e紡瀵瑰寮�鏀撅紝瀹炶澶栧浗浜�144灏忔椂杩囧鍏嶇銆�24灏忔椂杩囧鍏嶅姙杈规鎵嬬画鏀跨瓥銆� + </p> + <p class="p-odd"> + 2020骞达紝鍖椾含澶у叴鍥介檯鏈哄満鍏卞畬鎴愭梾瀹㈠悶鍚愰噺1609.1449涓囦汉娆★紝鍚屾瘮澧為暱413.3%锛屽叏鍥芥帓鍚嶇17浣嶏紱璐ч偖鍚炲悙閲�77252.9t锛屽悓姣斿闀�949.3%锛屽叏鍥芥帓鍚嶇35浣嶏紱椋炴満璧烽檷133114鏋舵锛屽悓姣斿闀�532.4%锛屽叏鍥芥帓鍚嶇18浣嶃�傛埅鑷�2021骞�2鏈堬紝鍖椾含澶у叴鍥介檯鏈哄満鑸珯妤奸潰绉负78涓囧钩鏂圭背锛涙皯鑸珯鍧223涓満浣嶏紝鍏朵腑76涓繎鏈轰綅銆�147涓繙鏈轰綅锛涙湁4鏉¤繍琛岃窇閬擄紝涓滀竴銆佸寳涓�鍜岃タ涓�璺戦亾瀹�60m锛屽垎鍒暱3400m銆�3800m鍜�3800m锛岃タ浜岃窇閬撻暱3800m锛屽45m锛屽彟鏈�3800m闀跨殑绗簲璺戦亾涓哄啗鐢ㄨ窇閬擄紱鍙弧瓒�2025骞存梾瀹㈠悶鍚愰噺7200涓囦汉娆°�佽揣閭悶鍚愰噺200涓囧惃銆侀鏈鸿捣闄嶉噺62涓囨灦娆$殑浣跨敤闇�姹傘�� + </p> + <div class="bk"> + <p><b>鑰冭瘉鎸囧崡锛氱┖娓湇鍔$鐞嗗笀鑰冮</b></p> + <div v-for="(item, index) in multipleChoice" :key=index> + <p class="block">{{ index + 1 }}.{{ item.txt }}锛堝閫夐锛� + </p> + <p class="block" v-for="(citem, cindex) in item.option" :key=cindex> + <input type="checkbox" :value="citem.zm" name="ball1" :disabled="item.isComplete" + v-model="item.userAnswer" @change="saveCheckChoice" /> + {{ citem.txt }} + <span> + <svg v-if="item.isComplete && + isShowRight( + item.answer, + item.userAnswer, + citem.zm + ) + " t="1716986419862" class="icon" viewBox="0 0 1820 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="18767" + xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="20"> + <path + d="M1439.374222 216.007111s-169.472 56.490667-367.179852 282.443852C888.604444 703.222519 846.241185 787.949037 775.632593 900.93037 768.568889 893.866667 662.651259 689.095111 380.207407 540.814222l148.290371-141.226666s134.162963 91.790222 225.953185 261.262222c0 0 233.016889-360.116148 684.923259-536.642371v91.799704z m0 0" + fill="#1AFA29" p-id="18768"></path> + </svg> + <svg v-if=" + item.isComplete && + isShowRight( + item.answer, + item.userAnswer, + citem.zm + ) == false + " t="1716987085767" class="icon" viewBox="0 0 1024 1024" version="1.1" + xmlns="http://www.w3.org/2000/svg" p-id="25745" + xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> + <path + d="M116.579135 38.64349531L38.703935 103.74399781c138.82075969 102.96027281 268.24660875 221.31426938 381.68489719 339.96758156C246.29374906 618.40145938 109.95003031 790.19602344 38.10817906 859.25288281l148.35573469 123.62658094c52.61360812-108.17625656 167.23381594-272.86683656 320.56281844-445.01635875 153.50744156 173.21056312 268.36844625 338.43166313 321.38977781 447.49243969 0 0 144.5682225-152.96636906 157.47435281-129.29729625-55.80632344-62.49011156-191.37776625-244.16501625-374.17990593-430.27403438 104.68422375-107.1132975 222.15274031-213.10127719 347.60304468-306.24740437L925.17746562 56.03842156C782.85412063 126.51895625 647.69328031 231.09093594 526.07845437 342.39755 403.34886594 226.82662719 264.46095125 116.16373719 116.579135 38.64349531L116.579135 38.64349531zM116.579135 38.64349531" + fill="#d81e06" p-id="25746"></path> + </svg> + </span> + </p> + <p class="event-header-text-bc pd-5 fl jc-sa" style="margin-left: 8px; width: 93%" + v-if="showCheckAnswer"> + <span class="c-g"> 绛旀锛歿{ item.answer.join(',') }} </span> + <span :class="{ 'c-g': item.isRight, 'c-r': item.isRight == false }">鎮ㄧ殑绛旀锛歿{ + item.userAnswer.join(',') }} + </span> + </p> + </div> + <!-- 鎻愪氦鎸夐挳 --> + <div class="w100 fl ju-cn"> + <ul class="fl ju-ev w80 choice"> + <li> + <button class="btn-border btn-w" @click="goCheckJudge"> + 鎻愪氦 + </button> + </li> + <li> + <button @click="changeCheckData" class="btn-border btn-w"> + 閲嶅仛 + </button> + </li> + <li> + <button @click="showCheckAnswer = !showCheckAnswer" class="parimary-btn"> + 鏌ョ湅绛旀 + </button> + </li> + </ul> + </div> + </div> + <hr class=""> + <p class="p-odd note td-0"><a id="m1">鈶�</a> 鎽樿嚜鍖椾含棣栭兘鍥介檯鏈哄満缃戠珯锛�<a + href="https://www.bcia.com.cn/gsjj.html" + target="_blank">https://www.bcia.com.cn/gsjj.html</a>锛�2023-05-30銆� + </p> + </div> + </div> + </div> + <!-- 214椤� --> + <div class="page-box" page="222"> + <div v-if="showPageList.indexOf(222) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">214</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <h5 id="e123" class="p-even unit5-c">锛堜笁锛夊ぉ娲ユ花娴峰浗闄呮満鍦�</h5> + <p class="p-even"> + 澶╂触婊ㄦ捣鍥介檯鏈哄満浣嶄簬澶╂触甯備笢涓藉尯锛屾満鍦轰笁瀛椾唬鐮佷负TSN锛屾湇鍔′簬鍖椾含銆佸ぉ娲ャ�佸攼灞卞拰绉︾殗宀涚瓑鍩庡競锛屾槸涓浗涓昏鐨勮埅绌鸿揣杩愪腑蹇冧箣涓�銆傝嚦2022骞村勾搴曪紝澶╂触婊ㄦ捣鍥介檯鏈哄満鏈夎窇閬�2鏉★紝绗竴璺戦亾3600m锛岀浜岃窇閬�3200m锛岄琛屽尯绛夌骇4E绾э紝鍙弧瓒冲悇绫诲ぇ鍨嬮鏈哄叏杞借捣闄嶃�傚ぉ娲ユ花娴峰浗闄呮満鍦哄叿鏈夎緝寮虹殑閾佽矾銆侀珮閫熷叕璺�佽建閬撶瓑缁煎悎浜ら�氫紭鍔匡紝鍩虹璁炬柦瀹屽杽锛屽競鏀胯兘婧愰厤濂楅綈鍏紱浠g悊鍥藉唴澶栧璐ц繍鍖呮満涓氬姟锛屽苟鎻愪緵涓�鏉¢緳鏈嶅姟锛涘悓鏃朵负鍚勮埅绌哄叕鍙告彁渚涘湴闈唬鐞嗕笟鍔°�傛満鍦哄熀鍦拌埅绌哄叕鍙告湁涓浗鍥介檯鑸┖鍏徃澶╂触鍒嗗叕鍙搞�佸ぉ娲ヨ埅绌烘湁闄愯矗浠诲叕鍙搞�佸ゥ鍑埅绌哄叕鍙搞�佸帵闂ㄨ埅绌哄叕鍙搞�侀摱娌宠揣杩愭湁闄愬叕鍙搞�� + </p> + <h5 id="e124" class="p-even unit5-c">锛堝洓锛夌煶瀹跺簞姝e畾鍥介檯鏈哄満</h5> + <p class="p-even"> + 鐭冲搴勬瀹氬浗闄呮満鍦哄墠韬槸鐭冲搴勬瀹氭満鍦猴紝2008骞�7鏈�2鏃ワ紝鏇村悕涓衡�滅煶瀹跺簞姝e畾鍥介檯鏈哄満鈥濓紝鏈哄満涓夊瓧浠g爜涓篠JW銆傛満鍦轰綅浜庣煶瀹跺簞甯備笢鍖楋紝鏄粡鍥藉鎵瑰噯鐨勫浗闄呭彛宀告満鍦猴紝闅跺睘浜庢渤鍖楁満鍦虹鐞嗛泦鍥㈡湁闄愬叕鍙革紝鏄渤鍖楃渷閲嶈鐨勭┖涓氦閫氶棬鎴峰拰瀵瑰寮�鏀剧獥鍙o紝鐜板凡鍙戝睍鎴愭垜鍥藉寳鏂归噸瑕佺殑鍥介檯鑸┖璐ц繍涓浆鍩哄湴銆� + </p> + <p class="p-even"> + 鐭冲搴勬瀹氬浗闄呮満鍦洪琛屽尯绛夌骇4E绾э紝璺戦亾鍏ㄩ暱3400m锛屽彲淇濋殰涓栫晫涓婂悇绫诲ぇ鍨嬮鏈鸿捣闄嶃��2006骞�9鏈�30鏃ワ紝鐭冲搴勬瀹氭満鍦轰繚闅滀簡褰撴椂涓栫晫鏈�澶х殑椋炴満瀹�-225杩愯緭鏈鸿捣闄嶃��2011骞�3鏈�24鏃ワ紝瀹�-225杩愯緭鏈烘惡甯�139t杩愬線鏃ユ湰鐨勬晳鐏剧墿璧勶紝绗簲娆¢檷钀藉湪鐭冲搴勬瀹氬浗闄呮満鍦恒�� + </p> + <h5 id="e125" class="p-even unit5-c">锛堜簲锛夊お鍘熸瀹垮浗闄呮満鍦�</h5> + <p class="p-even"> + 澶師姝﹀鍥介檯鏈哄満浣嶄簬澶師甯備笢鍗楁柟鍚戯紝涓夊瓧浠g爜涓篢YN锛屼负4E绾ф皯鐢ㄦ満鍦猴紝鏄尯鍩熸灑绾芥満鍦恒�傛埅鑷�2023骞�5鏈堬紝鏈夎埅绔欐ゼ2搴э紝璺戦亾1鏉★紝鏈轰綅60涓�傛埅鑷�2020骞村勾搴曪紝寮�閫氬杩愯埅绾�168鏉★紝閫氳埅鍩庡競87涓紝鍏朵腑鍥藉唴鑸嚎156鏉★紝鍥藉唴鍩庡競75涓紝鍦板尯鑸嚎3鏉★紝鍦板尯鍩庡競3涓紝鍥介檯鑸嚎9鏉★紝鍥介檯鍩庡競9涓�傝繍钀ヨ揣杩愯埅绾�2鏉°�� + </p> + <h4 id="d079" class="p-even unit5-c">涓夈�侀暱涓夎鏈哄満缇�</h4> + <p class="p-even">闀夸笁瑙掑湴鍖洪櫎浜嗕笂娴疯櫣妗ュ拰娴︿笢涓ゅ骇鍥介檯鏈哄満澶栵紝鍦�300km鑼冨洿鍐咃紝杩樻湁鏉窞钀у北鍥介檯鏈哄満銆佸崡浜鍙e浗闄呮満鍦哄拰瀹佹尝鏍庣ぞ鍥介檯鏈哄満绛変富瑕佹満</p> + + </div> + </div> + </div> + <!-- 215椤� --> + <div class="page-box" page="223"> + <div v-if="showPageList.indexOf(223) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">215</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0">鍦恒�傚彟澶栵紝闄勮繎鐨勬俯宸炪�佹棤閿$瓑涔熸湁甯傚満闇�姹傛椇鐩涚殑鏈哄満銆�</p> + <h5 id="e126" class="p-odd unit5-c">锛堜竴锛変笂娴疯櫣妗ュ浗闄呮満鍦�</h5> + <p class="p-odd"> + 浣滀负涓婃捣绗竴涓皯鐢ㄦ満鍦虹殑涓婃捣铏规ˉ鍥介檯鏈哄満鍘嗗彶鎮犱箙锛屽墠韬槸寤轰簬1921骞�3鏈堢殑铏规ˉ鏈哄満锛屾姉鏃ユ垬浜夋椂鏈熻鏃ュ啗鍗犻銆傛柊涓浗鎴愮珛鍚庯紝閲嶅缓铏规ˉ鏈哄満锛屾鍚庝竴鐩翠綔涓哄啗鐢ㄦ満鍦恒��1963骞达紝鍥藉姟闄㈡壒鍑嗘垚涓烘皯鐢ㄦ満鍦恒�� + </p> + <p class="p-odd"> + 涓婃捣铏规ˉ鍥介檯鏈哄満浣嶄簬涓婃捣甯傝タ閮婏紝涓夊瓧浠g爜涓篠HA锛屾湁2鏉¤窇閬擄紝椋炶鍖虹瓑绾�4E绾э紝婊¤冻骞存梾瀹㈠悶鍚愰噺4000涓囦汉娆°�佽揣閭悶鍚愰噺100涓囧惃鍜岄鏈鸿捣闄嶉噺30涓囨灦娆$殑浜ら�氶噺闇�姹傘��</p> + <h5 id="e127" class="p-odd unit5-c">锛堜簩锛変笂娴锋郸涓滃浗闄呮満鍦�</h5> + <p class="p-odd">涓婃捣娴︿笢鍥介檯鏈哄満鍦板涓婃捣娴︿笢鏂板尯鏈哄満闀囥�佹柦婀鹃晣銆佺妗ラ晣銆佷笢娴烽晣鐨勬繏娴峰湴甯︼紝璺濅笂娴疯櫣妗ュ浗闄呮満鍦虹害40km锛屾満鍦轰笁瀛椾唬鐮佷负PVG銆�</p> + <p class="p-odd"> + 涓婃捣娴︿笢鍥介檯鏈哄満1997骞�10鏈堝姩宸ュ缓璁撅紝1999骞�9鏈堝缓鎴愰�氳埅锛�2005骞�3鏈堝惎鐢ㄧ浜岃窇閬擄紝2008骞�3鏈堝惎鐢ㄧ涓夎窇閬撳拰绗簩鑸珯妤笺�傛埅鑷�2019骞�9鏈堬紝涓婃捣娴︿笢鍥介檯鏈哄満鏈変袱搴ц埅绔欐ゼ鍙婁竴搴у崼鏄熷巺锛屾湁340涓仠鏈轰綅锛屽叡鏈�4鏉¤窇閬擄紝鍒嗗埆涓�2鏉�3800m銆�1鏉�3400m銆�1鏉�4000m銆� + </p> + <h5 id="e128" class="p-odd unit5-c">锛堜笁锛夋澀宸炶惂灞卞浗闄呮満鍦�</h5> + <p class="p-odd">鏉窞钀у北鍥介檯鏈哄満浣嶄簬娴欐睙鐪佹澀宸炲競涓滈儴锛屾満鍦轰笁瀛椾唬鐮佷负HGH锛屾槸鎴戝浗閲嶈鐨勫共绾挎満鍦恒�佸浗闄呭畾鏈熻埅鐝満鍦恒�佸澶栧紑鏀剧殑涓�绫昏埅绌哄彛宀稿拰鍥介檯鑸彮澶囬檷鏈哄満锛屾槸娴欐睙鐪佺涓�绌轰腑闂ㄦ埛銆� + </p> + <p class="p-odd"> + 鏈哄満鎸夌収鈥滀竴娆¤鍒掋�佸垎鏈熷缓璁锯�濈殑鍘熷垯锛屽垎杩戙�佷腑銆佽繙涓夋湡瀹炴柦寤鸿銆備竴鏈熷伐绋嬩簬1997骞�7鏈堟寮忓姩宸ワ紝2000骞�12鏈�28鏃ュ缓鎴愰�氳埅銆備簩鏈熷伐绋嬩簬2007骞�11鏈堝紑宸ワ紝鏂板缓鍥介檯鑸珯妤笺�佺浜屽浗鍐呰埅绔欐ゼ鍜岀浜岃窇閬擄紝2012骞�12鏈�30鏃ュ叏閮ㄥ缓鎴愭姇杩愩�備笁鏈熷伐绋嬩簬2018骞村惎鍔紝鍖呮嫭鏂板缓鑸珯妤笺�侀檰渚т氦閫氫腑蹇冦�佹梾瀹㈣繃澶滅敤鎴垮伐绋嬨�佽兘婧愪腑蹇冨伐绋嬬瓑銆�2022骞�9鏈�22鏃ワ紝涓夋湡椤圭洰涓�闃舵姝e紡鎶曡繍銆� + </p> + <p class="p-odd"> + 渚濇墭娴欐睙鐪佸強鍛ㄨ竟鍦板尯鍏呰冻鐨勫璐ц祫婧愬拰鏃虹洓鐨勮埅绌哄競鍦洪渶姹傦紝鏉窞钀у北鍥介檯鏈哄満寤烘垚閫氳埅浠ユ潵锛岃繍杈撶敓浜ц繀鐚涘闀裤��2007骞存満鍦烘梾瀹㈠悶鍚愰噺棣栨绐佺牬鍗冧竾浜烘澶у叧锛�2013骞达紝鏈哄満骞存梾瀹㈠悶鍚愰噺绐佺牬2000涓囦汉娆★紝 + </p> + </div> + </div> + </div> + <!-- 216椤� --> + <div class="page-box" page="224"> + <div v-if="showPageList.indexOf(224) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">216</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">2016骞寸獊鐮�3000涓囦汉娆★紝2019骞寸獊鐮�4000涓囦汉娆°��</p> + <h5 id="e129" class="p-even unit5-c">锛堝洓锛夊崡浜鍙e浗闄呮満鍦�</h5> + <p class="p-even"> + 鍗椾含绂勫彛鍥介檯鏈哄満浣嶄簬姹熻嫃鐪佸崡浜競涓滃崡閮ㄣ�傚崡浜鍙e浗闄呮満鍦烘槸鎴戝浗閲嶈鐨勫共绾挎満鍦猴紝鏄崕涓滃湴鍖虹殑涓昏璐ц繍鏈哄満锛屼笌涓婃捣铏规ˉ鍥介檯鏈哄満銆佹郸涓滃浗闄呮満鍦轰簰涓哄闄嶆満鍦恒�傛満鍦哄缓鏈�2鏉�3600m鐨勮窇閬擄紝椋炶鍖虹瓑绾т负4F绾э紝涓夊瓧浠g爜涓篘KG銆� + </p> + <h5 id="e130" class="p-even unit5-c">锛堜簲锛夊畞娉㈡爭绀惧浗闄呮満鍦�</h5> + <p class="p-even">瀹佹尝鏍庣ぞ鍥介檯鏈哄満浣嶄簬瀹佹尝甯傝タ鍗楃殑娴锋洐鍖猴紝鏄禉姹熺渷绗竴搴ф皯鐢ㄦ満鍦猴紝涓夊瓧浠g爜涓篘GB銆傛満鍦烘湁涓�鏉¢暱3200m鐨勮窇閬擄紝椋炶鍖虹瓑绾т负4E绾э紝鍙弧瓒矪747绛夊ぇ鍨嬮鏈鸿捣闄嶃�� + </p> + <p class="p-even"> + 渚濇墭闀夸笁瑙掑崡缈煎厖瓒崇殑瀹㈣揣婧愬拰鎸佺画鍚戝ソ鐨勮埅绌哄競鍦洪渶姹傦紝瀹佹尝鏍庣ぞ鍥介檯鏈哄満杩愯緭鐢熶骇淇濇寔蹇�熷闀匡紝鑸嚎缃戠粶鏃ヨ秼瀹屽杽銆�2016骞达紝瀹佹尝鏍庣ぞ鍥介檯鏈哄満璐ч偖鍚炲悙閲忕獊鐮村崄涓囧惃澶у叧锛�2018骞达紝骞存梾瀹㈠悶鍚愰噺绐佺牬鍗冧竾浜烘澶у叧锛岃繄鍏ュ叏鍥藉ぇ鍨嬬箒蹇欐満鍦鸿鍒椼�� + </p> + <h4 id="d080" class="p-even unit5-c">鍥涖�佺菠娓境澶ф咕鍖烘満鍦虹兢</h4> + <p class="p-even"> + 绮ゆ腐婢冲ぇ婀惧尯鏈哄満缇や负鎴戝浗鍥涘ぇ鏈哄満缇や箣涓�锛屼綅浜庡崡閮ㄦ部娴峰湴鍖猴紝鐢卞箍宸炵櫧浜戝浗闄呮満鍦恒�佹繁鍦冲疂瀹夊浗闄呮満鍦恒�侀娓浗闄呮満鍦恒�佹境闂ㄥ浗闄呮満鍦恒�佺彔娴烽噾婀炬満鍦恒�佹儬宸炲钩娼満鍦恒�佷經灞辨矙鍫ゆ満鍦虹粍鎴愩��</p> + <h5 id="e131" class="p-even unit5-c">锛堜竴锛夊箍宸炵櫧浜戝浗闄呮満鍦�</h5> + <p class="p-even"> + 骞垮窞鐧戒簯鍥介檯鏈哄満濮嬪缓浜�20涓栫邯30骞翠唬锛屾槸鍥藉鈥滀竴甯︿竴璺�濆�¤鍜屸�滅┖涓笣缁镐箣璺�濈殑閲嶈鍥介檯鑸┖鏋㈢航涔嬩竴锛岀菠娓境澶ф咕鍖烘牳蹇冩灑绾芥満鍦猴紝鏈哄満涓夊瓧浠g爜涓篊AN銆傝嚜2004骞磋浆鑷崇幇鍧�杩愯浠ユ潵锛屾満鍦哄悇椤逛笟鍔¤繀鐚涘彂灞曪紝纭欢璁炬柦涓嶆柇瀹屽杽锛屽浗闄呰埅绌烘灑绾藉缓璁炬寔缁帹杩涖��2017骞达紝鏃呭鍚炲悙閲忕獊鐮�6500涓囦汉娆★紝2019骞达紝鏃呭鍚炲悙閲忚秴7300涓囦汉娆°�� + </p> + <p class="p-even"> + 鑷�2023骞达紝骞垮窞鐧戒簯鍥介檯鏈哄満鏈�2搴ц埅绔欐ゼ銆�3鏉¤窇閬擄紝椋炶鍖虹瓑绾т负4F绾э紝鍙弧瓒矨380绛夊ぇ鍨嬪浣撳鏈鸿捣闄嶅強鍋滄斁闇�瑕侊紝鏍囧噯鏈轰綅271涓紙鍚晢鍔¤埅绌烘湇鍔″熀鍦颁笓鐢ㄥ仠鏈哄潽锛夈�俆1鑸珯妤煎缓绛戦潰绉�50浣欎竾骞虫柟绫筹紝T2鑸珯 + </p> + + </div> + </div> + </div> + <!-- 217椤� --> + <div class="page-box" page="225"> + <div v-if="showPageList.indexOf(225) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">217</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 妤煎強缁煎悎浜ら�氫腑蹇冨缓绛戦潰绉�80浣欎竾骞虫柟绫筹紝涓ゅ骇鑸珯妤艰璁″閲忓彲婊¤冻骞存梾瀹㈠悶鍚愰噺8000涓囦汉娆$殑闇�姹傘��2020骞�9鏈堬紝骞垮窞鐧戒簯鍥介檯鏈哄満涓夋湡鎵╁缓宸ョ▼姝e紡寮�宸ワ紝寤烘垚鍚庯紝灏嗗疄鐜�3搴ц埅绔欐ゼ銆�5鏉¤窇閬撹繍琛屻�� + </p> + <h5 id="e132" class="p-odd unit5-c">锛堜簩锛夋繁鍦冲疂瀹夊浗闄呮満鍦�</h5> + <p class="p-odd"> + 娣卞湷瀹濆畨鍥介檯鏈哄満浣嶄簬鐝犳睙鍙d笢宀革紝鏄泦娴枫�侀檰銆佺┖銆侀搧鑱旇繍涓轰竴浣撶殑鐜颁唬鍖栧ぇ鍨嬪浗闄呯┖娓紝鏈哄満涓夊瓧浠g爜涓篠ZX銆傛繁鍦冲疂瀹夊浗闄呮満鍦轰簬1991骞�10鏈堟寮忛�氳埅锛�1993骞�5鏈堟垚涓哄浗闄呮満鍦猴紝鏄浗鍐呴鎵圭敱鍦版柟鏀垮簻绛瑰缓銆佸疄琛屽睘鍦板寲杩愯惀鐨勬満鍦猴紝涔熸槸鍏ㄥ浗姘戣埅杈冩棭瀹炵幇甯傚満鍖栥�佷紒涓氬寲杩愯惀绠$悊鐨勬満鍦恒�� + </p> + <p class="p-odd">2015骞达紝娣卞湷瀹濆畨鍥介檯鏈哄満璐ч偖鍚炲悙閲忛娆$獊鐮�100涓囧惃銆�2020骞达紝璐ч偖鍚炲悙閲�139.9涓囧惃锛屽悓姣斿闀�9%銆�</p> + <p class="p-odd"> + 娣卞湷瀹濆畨鍥介檯鏈哄満鎶㈡姄绮ゆ腐婢冲ぇ婀惧尯鍜屽厛琛岀ず鑼冨尯鈥滃弻鍖洪┍鍔ㄢ�濋噸澶у巻鍙叉満閬囷紝涓撴敞鈥滃銆佽揣銆佸煄銆佷汉銆佹櫤鈥濅簲澶ф垬鐣ワ紝鑱氱劍鍥涘瀷鏈哄満寤鸿锛岀珛瓒冲厛琛岀ず鑼冿紝鍏ㄩ潰鎻愬崌澶у瀷鏈哄満娌荤悊鑳藉姏鐜颁唬鍖栨按骞筹紝鎺ㄥ姩楂樿川閲忓彂灞曪紝濂嬪姏鎵撻�犻珮鍝佽川鍒涙柊鍨嬪浗闄呰埅绌烘灑绾藉拰楂樻按骞崇┖娓瀷鍥藉鐗╂祦鏋㈢航锛岀菠娓境澶ф咕鍖轰笘鐣岀骇鏈哄満缇ょ殑鏍稿績鏋㈢航鍜岀菠娓境澶ф咕鍖衡�滄捣銆侀檰銆佺┖銆侀珮閾併�佸煄闄呫�佸湴閾佲�濆叚浣嶄竴浣撶殑鍥介檯鎬х患鍚堜氦閫氭灑绾姐�� + </p> + <h5 id="e133" class="p-odd unit5-c">锛堜笁锛夐娓浗闄呮満鍦�</h5> + <p class="p-odd">棣欐腐鍥介檯鏈哄満浜�1992骞存寮忓姩宸ュ~娴蜂慨寤猴紝1998骞村惎鐢ㄣ�傜敱浜庢満鍦轰綅浜庢柊鐣岀殑澶у笨灞变互鍖楄丹楸茶浜哄伐宀涗笂锛屽洜姝や篃绉颁负璧ら辈瑙掑浗闄呮満鍦恒��</p> + <p class="p-odd"> + 棣欐腐鍥介檯鏈哄満鎷ユ湁2鏉�3800m璺戦亾锛岄琛屽尯绛夌骇涓�4F绾э紝涓夊瓧浠g爜涓篐KG銆傞娓浗闄呮満鍦烘湁2搴у杩愬ぇ妤硷紝涓�鍙峰杩愬ぇ妤间簬1998骞�7鏈堟姇鍏ヤ娇鐢紝浜屽彿瀹㈣繍澶фゼ浜�2019骞村勾搴曞紑濮嬭繘琛屾墿寤哄伐绋嬨�傜害120瀹惰埅绌哄叕鍙稿湪棣欐腐钀ヨ繍鑸嚎锛屽線鏉ュ叏鐞冪害220涓煄甯傘�� + </p> + <h5 id="e134" class="p-odd unit5-c">锛堝洓锛夋境闂ㄥ浗闄呮満鍦�</h5> + <p class="p-odd">婢抽棬鍥介檯鏈哄満鏄境闂ㄧ壒鍒鏀垮尯鍐呭敮涓�鐨勬満鍦猴紝1995骞�11鏈堟寮忔姇鍏ヤ娇鐢紝鏈哄満涓夊瓧浠g爜涓篗FM銆傚畠鏄彔姹熶笁瑙掓床涓庝笘鐣屽悇鍦颁箣闂寸殑閲嶈妗ユ锛屽叏鏃�24灏忔椂杩愪綔銆�</p> + <p class="p-odd">婢抽棬鍥介檯鏈哄満鍏辨湁2鏉¤窇閬擄紝闀垮害鍒嗗埆涓�3360m銆�3285m锛屽仠鏈轰綅40涓�</p> + + </div> + </div> + </div> + <!-- 218椤� --> + <div class="page-box" page="226"> + <div v-if="showPageList.indexOf(226) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">218</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="p-even td-0">锛堝惈鍏姟鏈轰綅锛夛紝鍙繚闅滃勾鏃呭鍚炲悙閲�1000涓囦汉娆★紝鍏卞紑閫氬浗鍐呭閫氳埅鍩庡競42涓��</p> + <h5 id="e135" class="p-even unit5-c">锛堜簲锛夌彔娴烽噾婀炬満鍦�</h5> + <p class="p-even">鐝犳捣閲戞咕鏈哄満浣嶄簬鐝犳睙鍙hタ宀哥殑鐝犳捣甯傞噾婀惧尯閲戞捣涓矾锛屼笢閭婚娓�佹境闂紝鍖楁帴涓北锛岃タ杩炴睙闂ㄣ�侀槼姹熴�佽寕鍚嶅拰婀涙睙銆�</p> + <p class="p-even"> + 鐝犳捣閲戞咕鏈哄満鎸夌収鍥介檯姘戠敤鑸┖缁勭粐4E绾ф爣鍑嗚鍒掕璁″拰寤鸿锛�1995骞�6鏈堝缓鎴愰�氳埅锛屽懡鍚嶄负鈥滅彔娴蜂笁鐏舵満鍦衡�濓紝2013骞�1鏈�10鏃ユ寮忔洿鍚嶄负鈥滅彔娴烽噾婀炬満鍦衡�濓紝涓夊瓧浠g爜涓篫UH銆�2023骞�2鏈堢彔娴烽噾婀炬満鍦虹綉绔欐樉绀猴紝鏈哄満鍋滄満鍧潰绉�27.7涓囧钩鏂圭背锛岃繎鏈轰綅锛堝粖妗ヤ綅锛�17涓紝杩滄満浣�6涓�傚�欐満妤奸潰绉�9.16涓囧钩鏂圭背锛屽勾淇濋殰鑳藉姏涓猴細椋炴満璧烽檷10涓囨灦娆★紝鏃呭鍚炲悙閲�1100涓囦汉娆★紝璐ч偖鍚炲悙閲�60涓囧惃锛岄珮宄板皬鏃惰捣闄�23鏋舵銆佹梾瀹㈠悶鍚愰噺6000浜烘銆� + </p> + <h4 id="d081" class="p-even unit5-c">浜斻�佹垚娓濇満鍦虹兢</h4> + <p class="p-even"> + 鎴愭笣鏈哄満缇や互鎴愰兘銆侀噸搴嗗浗闄呰埅绌烘灑绾藉姛鑳藉缓璁句负鐗靛紩銆�2022骞�3鏈�15鏃ワ紝涓浗姘戠敤鑸┖灞�涓捐鏂伴椈鍙戝竷浼氾紝浠嬬粛鎴愭笣涓栫晫绾ф満鍦虹兢棰勮2035骞村叏闈㈠缓鎴愶紝灏嗘垚涓烘皯鑸己鍥藉缓璁惧厛琛岀ず鑼冨尯銆�</p> + <h5 id="e136" class="p-even unit5-c">锛堜竴锛夋垚閮藉弻娴佸浗闄呮満鍦�</h5> + <p class="p-even"> + 鎴愰兘鍙屾祦鍥介檯鏈哄満浣嶄簬鍥涘窛鐪佹垚閮藉競瑗垮崡锛屽墠韬负濮嬪缓浜�1938骞寸殑鎴愰兘鍙屾瀵烘満鍦猴紝1956骞村垝褰掓皯鑸娇鐢ㄥ苟鏇村悕涓衡�滄垚閮藉弻娴佹満鍦衡�濓紝1993骞磋鍥藉鎵瑰噯涓哄浗闄呭彛宀告満鍦猴紝浜�1995骞�11鏈�30鏃ユ洿鍚嶁�滄垚閮藉弻娴佸浗闄呮満鍦衡�濓紝鏈哄満涓夊瓧浠g爜涓篊TU銆� + </p> + <p class="p-even"> + 鎴愰兘鍙屾祦鍥介檯鏈哄満鎷ユ湁2搴ц埅绔欐ゼ锛屾�婚潰绉�50涓囧钩鏂圭背锛涘缓鏈�2鏉″钩琛岃窇閬擄紝鍙緵A380椋炴満璧烽檷锛�3搴ц埅绌鸿揣杩愮珯锛�7涓鏈哄仠鏀惧尯锛屽叡璁剧疆鍋滄満浣�228涓紝寤婃ˉ85鏉★紱涓�4F绾у浗闄呰埅绌烘灑绾斤紝鏄腑鍥藉叓澶у尯鍩熸�ф灑绾芥満鍦轰箣涓�銆�2019骞达紝鏃呭骞村悶鍚愰噺杈惧埌5585.9涓囦汉娆°�� + </p> + <h5 id="e137" class="p-even unit5-c">锛堜簩锛夋垚閮藉ぉ搴滃浗闄呮満鍦�</h5> + <p class="p-even">鎴愰兘澶╁簻鍥介檯鏈哄満鏄�滃崄鍥涗簲鈥濆紑灞�涔嬪勾鎶曞叆浣跨敤鐨勫ぇ鍨嬫皯鐢ㄦ満鍦猴紝 + </p> + + </div> + </div> + </div> + <!-- 219椤� --> + <div class="page-box" page="227"> + <div v-if="showPageList.indexOf(227) > -1"> + <ul class="fl al-c jc-fe mr-45 pad-t-55 mb-45"> + <img class="headerImg mr-10" src="../../assets/images/headerlogo.png" alt="" /> + <li class="headerText">椤圭洰浜�</li> + <li class="headerText">绌烘腐绠$悊</li> + <li class="headerNumber">219</li> + </ul> + <div class="bodystyle"> + <p class="p-odd td-0"> + 瀹氫綅涓烘垚閮藉浗闄呰埅绌烘灑绾戒富鏋㈢航鏈哄満锛屼綅浜庢垚閮戒笢閮ㄦ柊鍖猴紝鏈哄満涓夊瓧浠g爜涓篢FU銆備竴鏈熷伐绋嬫绠楁�绘姇璧勮秴杩�750浜垮厓锛岄琛屽尯绛夌骇涓�4F绾э紝宸插缓鎴愨�滀袱绾典竴妯��3鏉¤窇閬撳拰71涓囧钩鏂圭背鐨�2搴ц埅绔欐ゼ锛�241涓仠鏈轰綅鍙婄浉搴旇鏂斤紝婊¤冻骞存梾瀹㈠悶鍚愰噺6000涓囦汉娆°�佽揣閭悶鍚愰噺130涓囧惃鐨勯渶姹傘�傝繙鏈熻鍒掑皢寤烘垚鈥滃洓绾典袱妯��6鏉¤窇閬擄紝140涓囧钩鏂圭背鑸珯妤硷紝婊¤冻骞存梾瀹㈠悶鍚愰噺1.2浜夸汉娆°�佽揣閭悶鍚愰噺280涓囧惃鐨勯渶姹傘�� + </p> + <p class="p-odd"> + 鎴愰兘澶╁簻鍥介檯鏈哄満灏嗕笌鎴愰兘鍙屾祦鍥介檯鏈哄満瀹炵幇鈥滀袱鍦轰竴浣撯�濊繍钀ワ紝鍓嶈�呴噸鐐规墦閫犲浗闄呭璐ц繍鑸┖鏋㈢航锛屽悗鑰呬富瑕佽繍钀ュ浗鍐呭晢鍔°�佸湴鍖鸿埅绾匡紝2涓満鍦哄彲浜掍负澶囬檷鏈哄満銆傛垚閮藉ぉ搴滃浗闄呮満鍦烘灑绾藉瀭鐩存帴鍏ラ珮閾侊紝瀹炵幇鑸┖銆佸叕璺�侀珮閾併�佸煄杞ㄤ负涓�浣撶殑澶氬紡鑱旇繍浜ら�氱患鍚堜綋銆� + </p> + <h5 id="e138" class="p-odd unit5-c">锛堜笁锛夐噸搴嗘睙鍖楀浗闄呮満鍦�</h5> + <p class="p-odd"> + 閲嶅簡姹熷寳鍥介檯鏈哄満浣嶄簬閲嶅簡甯傞儕涓滃寳鏂瑰悜鐨勬笣鍖楀尯锛屼簬1990骞�1鏈�22鏃ュ缓鎴愭姇鍏ヤ娇鐢紝鏈哄満涓夊瓧浠g爜涓篊KG銆�2017骞�8鏈�29鏃ワ紝闅忕潃涓滆埅绔欏尯鍙婄涓夎窇閬撻」鐩缓鎴愭姇鍏ヤ娇鐢紝椋炶鍖虹瓑绾ф彁鍗囦负4F绾с�傞噸搴嗘睙鍖楀浗闄呮満鍦烘湁3搴ц埅绔欐ゼ锛屽叡73.7涓囧钩鏂圭背锛涘仠鏈哄潽166涓囧钩鏂圭背锛屽仠鏈轰綅180涓紝璐у簱25涓囧钩鏂圭背銆傚彲璧烽檷A380绛夊ぇ鍨嬪鏈猴紝鑳芥弧瓒冲勾鏃呭鍚炲悙閲�4500涓囦汉娆°�佽揣閭悶鍚愰噺110涓囧惃銆侀鏈鸿捣闄�37.3涓囨灦娆$殑杩愯闇�瑕併�� + </p> + + <p class="p-odd"> + 闅忕潃缁忔祹鍙戝睍锛岄噸搴嗘睙鍖楀浗闄呮満鍦鸿繍杈撶敓浜у揩閫熷闀匡紝鑸嚎缃戠粶鏃ヨ秼瀹屽杽锛屾満鍦洪�氳揪鎬уぇ骞呮彁鍗囥��2019骞达紝绱寮�閫氬浗鍐呭鑸嚎338鏉★紝鍏朵腑鍥介檯锛堝湴鍖猴級95鏉★紝涓庝笘鐣屼簰鑱斾簰閫氱殑绌轰腑妗ユ瓒婂彂瀹藉箍銆�2019骞达紝瀹屾垚鏃呭鍚炲悙閲�4479涓囦汉娆°��2022骞达紝瀹屾垚鏃呭鍚炲悙閲�2167涓囦汉娆°�� + </p> + <h2 id="b004 "><img class="inline1" alt="" src="../../assets/images/tzyy.jpg" /></h2> + <p class="block">1.绌烘腐鐨勫彂灞曠粡鍘嗕簡鍝嚑涓樁娈碉紵</p> + <textarea v-model="expandQuestion.reading.one" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-right" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'one' }" @focus="handleFocus('one')" + @blur="handleBlur()"></textarea> + <p class="block">2.鏍规嵁鐢ㄩ�斾笉鍚岋紝绌烘腐鍙垎涓哄摢鍑犵被锛�</p> + <textarea v-model="expandQuestion.reading.two" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-right" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'two' }" @focus="handleFocus('two')" + @blur="handleBlur()"></textarea> + <p class="block">3.绌烘腐鍦ㄧ粡娴庡彂灞曚腑鏈変綍浣滅敤锛�</p> + <textarea v-model="expandQuestion.reading.three" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-right" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'three' }" @focus="handleFocus('three')" + @blur="handleBlur()"></textarea> + <p class="block">4.绌烘腐鐢卞摢鍑犻儴鍒嗙粍鎴愶紵</p> + <textarea v-model="expandQuestion.reading.four" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-right" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'four' }" @focus="handleFocus('four')" + @blur="handleBlur()"></textarea> + <p class="block">5.椋炶鍖烘妧鏈瓑绾х殑鏁板瓧鍜屽瓧姣嶅垎鍒湁浠�涔堝惈涔夛紵</p> + <textarea v-model="expandQuestion.reading.five" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-right" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'five' }" @focus="handleFocus('five')" + @blur="handleBlur()"></textarea> + <p class="block">6.鎴戝浗绗竴搴�4F绾ф満鍦烘槸鍝釜鏈哄満锛熸垜鍥芥湁鍝簺4F绾ф満鍦猴紵</p> + <textarea v-model="expandQuestion.reading.six" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-right" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'six' }" @focus="handleFocus('six')" + @blur="handleBlur()"></textarea> + </div> + </div> + </div> + <!-- 220椤� --> + <div class="page-box" page="228"> + <div v-if="showPageList.indexOf(228) > -1"> + <ul class="fl al-c pad-t-55 pad-l-60 mb-45"> + <li class="header-left-Number">220</li> + <li class="header-left-text">姘戣埅姒傝锛堢 2 鐗堬級</li> + </ul> + <div class="bodystyle"> + <p class="block p-even td-0">7.绠�杩版梾瀹箻鏈虹殑娴佺▼銆�</p> + <textarea v-model="expandQuestion.reading.seven" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'seven' }" @focus="handleFocus('seven')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">8.涓栫晫涓婄┖娓殑绠$悊浣撳埗鏈夊摢浜涳紵涓嶅悓鐨勭鐞嗕綋鍒朵娇鐢ㄦ儏鍐靛浣曪紵</p> + <textarea v-model="expandQuestion.reading.eight" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'eight' }" @focus="handleFocus('eight')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">9.涓轰粈涔堥鏈鸿闃叉楦熷嚮锛�</p> + <textarea v-model="expandQuestion.reading.nine" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'nine' }" @focus="handleFocus('nine')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">10.鏈哄満璺戦亾绉按銆佺粨鍐般�佺Н闆椋炴満鎬ц兘鏈変綍褰卞搷锛�</p> + <textarea v-model="expandQuestion.reading.ten" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'ten' }" @focus="handleFocus('ten')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">11.鍦伴潰鍕ゅ姟闇�瑕佺殑杞﹁締鏈夊摢浜涳紵鍚勭杞﹁締鐨勪綔鐢ㄦ槸浠�涔堬紵</p> + <textarea v-model="expandQuestion.reading.eleven" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'eleven' }" @focus="handleFocus('eleven')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">12.绌烘腐涓庤埅绌哄叕鍙哥殑鍏崇郴鏈変綍鐗圭偣锛�</p> + <textarea v-model="expandQuestion.reading.twelve" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'twelve' }" @focus="handleFocus('twelve')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">13.浠�涔堟槸绌烘腐鐨勫閲忥紵鍚嶄箟瀹归噺涓庡疄闄呭閲忔湁浣曞尯鍒紵</p> + <textarea v-model="expandQuestion.reading.thirteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'thirteen' }" @focus="handleFocus('thirteen')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">14.鍙噰鍙栧摢浜涙湁鏁堟柟娉曞噺灏戠┖娓欢璇拰澧炲姞瀹归噺锛�</p> + <textarea v-model="expandQuestion.reading.fourteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'fourteen' }" @focus="handleFocus('fourteen')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">15.绌烘腐鍙戝睍闈复鐨勪富瑕侀棶棰樻湁鍝簺锛�</p> + <textarea v-model="expandQuestion.reading.fifteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'fifteen' }" @focus="handleFocus('fifteen')" + @blur="handleBlur()"></textarea> + <p class="block p-even td-0">16.绌烘腐瑙勫垝鐨勪緷鎹拰鍘熷垯鏄粈涔堬紵</p> + <textarea v-model="expandQuestion.reading.sixteen" placeholder="璇疯緭鍏ュ唴瀹�" rows="6" + class="textarea-box-left" @change="setBookQuestion" + :class="{ 'textarea-focused': isFocused == 'sixteen' }" @focus="handleFocus('sixteen')" + @blur="handleBlur()"></textarea> + </div> + </div> + </div> + <!-- 灏佸簳 --> + <div class="page-box" page="229" style="min-height: auto"> + <div v-if="showPageList.indexOf(229) > -1"> + <img class="img-0" alt="" src="../../assets/images/fengdi.png" /> + </div> + </div> + <preView :isClear="dialogVisible" :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> + + </div> +</template> + +<script> +import preView from '@/components/pdfview/index.vue' +export default { + name: "chapterfive", + props: { + showPageList: { + type: Array, + }, + }, + components: { + preView, + }, + data() { + return { + dialogVisible: false, + p_md5: '', + somePdfTitleValue: '', + showCheckAnswer: false, + isFocused: null, + multipleChoice: [ + { + txt: "浠ヤ笅灞炰簬鍥介檯鑸嚎鐨勬湁锛堛��銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: [], + answer: ["C", "D"], + option: [ + { + zm: "A", + txt: "A.XIY鈥擧KG" + }, + { + zm: "B", + txt: "B.PEK鈥擸NT" + }, + { + zm: "C", + txt: "C.SHA鈥擲IN" + }, + { + zm: "D", + txt: "D.DLC鈥擲EL" + }, + ] + }, + { + txt: "浠ヤ笅灞炰簬鍦板尯鑸嚎鐨勬湁锛堛��銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: [], + answer: ["B", "C"], + option: [ + { + zm: "A", + txt: "A.PEK鈥擝UD" + }, + { + zm: "B", + txt: "B.XIY鈥擧KG" + }, + { + zm: "C", + txt: "C.CAN鈥擬FM" + }, + { + zm: "D", + txt: "D.TAO鈥擳YO" + }, + ] + }, + { + txt: "浠ヤ笅鏋勬垚鍥介檯鑸嚎鐨勬湁锛堛��銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: [], + answer: ["A", "B", "D"], + option: [ + { + zm: "A", + txt: "A.SZX鈥擧KG鈥擫ON" + }, + { + zm: "B", + txt: "B.PEK鈥擯VG鈥擝UD" + }, + { + zm: "C", + txt: "C.DLC鈥擨NC" + }, + { + zm: "D", + txt: "D.CAN鈥擲YA" + }, + ] + }, + { + txt: "浠ヤ笅灞炰簬鍦板尯鑸嚎鐨勬湁锛堛��銆�锛夈��", + isComplete: false, + isRight: null, + userAnswer: [], + answer: ["A", "C"], + option: [ + { + zm: "A", + txt: "A.HAK鈥擬FM" + }, + { + zm: "B", + txt: "B.CAN鈥擲UD" + }, + { + zm: "C", + txt: "C.SZX鈥擧KG" + }, + { + zm: "D", + txt: "D.PEK鈥擳YO" + }, + ] + }, + ], + expandQuestion: { + reading: { + one: "", + two: "", + three: "", + four: "", + five: "", + six: "", + seven: "", + eight: "", + nine: "", + ten: "", + eleven: "", + twelve: "", + thirteen: "", + fourteen: "", + fifteen: "", + sixteen: "", + }, + }, + chapter005: { + pdfMd5: { + 1: { + md5: '899fa5b57bb032e4834d35f4d74cdffe', + name: '姘戠敤鏈哄満椋炶鍖烘妧鏈爣鍑�', + }, + 2: { + md5: '4b2a0b51d8be4b183472c2518f4021f3', + name: '姘戣埅鐭ヨ瘑锛氭寚寮曢鏈虹殑绁炵鈥滄潯褰㈢爜鈥�', + }, + }, + }, + } + }, + mounted() { + const bookQuestion = localStorage.getItem("civilAviatyon-book-chapter05-expandQuestion"); + if (bookQuestion) { + this.expandQuestion = JSON.parse(bookQuestion); + } + + const multipleChoice = localStorage.getItem("civilAviatyon-book-chapter05-multipleChoice"); + if (multipleChoice) { + this.multipleChoice = JSON.parse(multipleChoice); + } + }, + methods: { + toUrl(val) { + if (val) { + this.p_md5 = this.chapter005.pdfMd5[val].md5 + this.somePdfTitleValue = this.chapter005.pdfMd5[val].name + this.$refs.pdfDialogRef.openDialog() + } + }, + handleFocus(id) { + this.isFocused = id; // 褰搕extarea鑱氱劍鏃讹紝璁剧疆涓簍rue + }, + handleBlur() { + this.isFocused = null; // 褰搕extarea澶卞幓鐒︾偣鏃讹紝璁剧疆涓篺alse + }, + setBookQuestion() { + localStorage.setItem( + "civilAviatyon-book-chapter05-expandQuestion", + JSON.stringify(this.expandQuestion) + ); + }, + saveCheckChoice() { + localStorage.setItem('civilAviatyon-book-chapter05-multipleChoice', JSON.stringify(this.multipleChoice)) + }, + // 澶氶�夐 + goCheckJudge() { + this.multipleChoice.forEach(item => { + item.isComplete = true; + const sortedAnswer = [...item.answer].sort(); + const sortedUserAnswer = [...item.userAnswer].sort(); + + // 鐒跺悗姣旇緝鎺掑簭鍚庣殑鏁扮粍鏄惁鐩哥瓑 + if (JSON.stringify(sortedAnswer) === JSON.stringify(sortedUserAnswer)) { + item.isRight = true; + } else { + item.isRight = false; + } + }); + this.showCheckAnswer = true + }, + changeCheckData() { + localStorage.removeItem("civilAviatyon-book-chapter05-multipleChoice") + this.multipleChoice.forEach(item => { + item.isComplete = false; + item.isRight = null; + item.userAnswer = []; + }); + this.showCheckAnswer = false + }, + isShowRight(answer, userAnswer, data) { + let flag = null; + if (userAnswer.indexOf(data) > -1) { + flag = answer.indexOf(data) > -1 ? true : false; + } + return flag; + }, + } +}; +</script> + +<style lang="less" scoped> +.body { + display: flex; +} + +.imgBox { + display: flex !important; + flex-direction: column-reverse !important; + position: relative !important; + + .img { + margin: 0 !important; + font-size: 16px !important; + position: absolute !important; + left: 40% !important; + bottom: -2% !important; + } + + img { + height: 80%; + } +} + +.clear { + clear: both; +} +</style> \ No newline at end of file diff --git a/src/books/civilAviation/view/components/index.vue b/src/books/civilAviation/view/components/index.vue index 2cee5ad..727a816 100644 --- a/src/books/civilAviation/view/components/index.vue +++ b/src/books/civilAviation/view/components/index.vue @@ -10,6 +10,10 @@ }"> <pageHeader v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList"></pageHeader> <chapterOne v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList"></chapterOne> + <chapterTwo v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList"></chapterTwo> + <chapterThree v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList"></chapterThree> + <chapterfour v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList"></chapterfour> + <chapterfive v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList"></chapterfive> </div> </div> </template> @@ -17,6 +21,10 @@ <script> import pageHeader from "./header.vue"; import chapterOne from "./chapter001.vue"; +import chapterTwo from "./chapter002.vue"; +import chapterThree from "./chapter003.vue"; +import chapterfour from "./chapter004.vue"; +import chapterfive from "./chapter005.vue" import NoteIcon from "@/assets/images/biji.png"; import _ from "lodash"; import Swiper from "swiper/bundle"; @@ -27,7 +35,7 @@ name: "pageContent", data() { return { - catalogLength: 2, // 鎬荤珷鑺傛暟 + catalogLength: 6, // 鎬荤珷鑺傛暟 showCatalogList: [], // 鏄剧ず鐨勭珷鑺� loadThreshold: 300, // 瑙﹀彂鍔犺浇闃堝�� throttleThreshold: 100, // 鑺傛祦闃堝�� @@ -151,8 +159,8 @@ }, 500); // 娴嬭瘯椤甸潰璺宠浆 - // setTimeout(() => { - // this.gotoPage(6, 30); + setTimeout(() => { + this.gotoPage(6,190); // setTimeout(() => { // this.renderSign("Highlight", { // id: "2ACA9359", @@ -166,7 +174,7 @@ // ids: ["2ACA9359"] // }); // }, 2000); - // }, 500); + }, 500); // const pageDom = (this.container ? this.container : document) // .querySelector("#app") @@ -706,6 +714,10 @@ const pageData = { pageHeader, chapterOne, + chapterTwo, + chapterThree, + chapterfour, + chapterfive, }; // 閬嶅巻鎵�鏈夌珷鑺傛枃浠� for (const key in pageData) { @@ -928,6 +940,10 @@ components: { pageHeader, chapterOne, + chapterTwo, + chapterThree, + chapterfour, + chapterfive, }, }; </script> diff --git a/src/components/choice/choice.vue b/src/components/choice/choice.vue index 711d7aa..63e5726 100644 --- a/src/components/choice/choice.vue +++ b/src/components/choice/choice.vue @@ -3,8 +3,8 @@ <!-- 棰樼洰鍐呭鍙婇�夐」閮ㄥ垎 --> <div style="display: flex; flex-direction: column;"> <div class="question-t"> - <span style="display: flex; "><span class="hs1">鈼�</span>璇烽�夊嚭浣犺涓烘纭殑绛旀銆�</span> - <span>绗瑊{ currentQuestion.id }}棰� (鍏眥{ questions.length}}棰�)</span> + <p style="display: flex;"><span class="hs1">鈼�</span>璇烽�夊嚭浣犺涓烘纭殑绛旀銆�</p> + <p>绗瑊{ currentQuestion.id }}棰� (鍏眥{ questions.length}}棰�)</p> </div> <div class="question-content"> <p>{{ currentQuestion.stem.stemTxt }}</p> @@ -429,6 +429,10 @@ justify-content: space-between; width: 100%; margin-top: 10px; + + p{ + text-indent: 0em + } } .all-options { @@ -455,6 +459,12 @@ flex-wrap: wrap; height: min-content; } + + .question-t { + display: block; + width: 100%; + margin-top: 10px; +} } .option { diff --git a/src/components/pdfview/index.vue b/src/components/pdfview/index.vue index 138cb9c..163122c 100644 --- a/src/components/pdfview/index.vue +++ b/src/components/pdfview/index.vue @@ -1,34 +1,27 @@ <!-- @format --> - <template> - <div class="pdfBox-component"> - <div class="preview" v-if="this.preViewMd5"> - <div id="imageParent" class="imageBox"></div> - <div class="bottom_tool"> - <!-- <svg - t="1718330411310" - @click="downloadPdf" - class="icon" - viewBox="0 0 1024 1024" - version="1.1" - xmlns="http://www.w3.org/2000/svg" - p-id="7121" - width="20" - height="20" - > - <path - d="M1022.955204 522.570753c0 100.19191-81.516572 181.698249-181.718715 181.698249l-185.637977 0c-11.2973 0-20.466124-9.168824-20.466124-20.466124 0-11.307533 9.168824-20.466124 20.466124-20.466124l185.637977 0c77.628008 0 140.786467-63.148226 140.786467-140.766001 0-77.423347-62.841234-140.448776-140.203182-140.766001-0.419556 0.030699-0.818645 0.051165-1.217734 0.061398-5.945409 0.143263-11.686157-2.292206-15.687284-6.702656-4.001127-4.400217-5.894244-10.335393-5.167696-16.250102 1.330298-10.806113 1.944282-19.760043 1.944282-28.192086 0-60.763922-23.658839-117.884874-66.617234-160.833035-42.968627-42.968627-100.089579-66.617234-160.843268-66.617234-47.368844 0-92.742241 14.449084-131.208321 41.781592-37.616736 26.738991-65.952084 63.700811-81.925894 106.884332-2.425236 6.538927-8.012488 11.399631-14.827707 12.893658-6.815219 1.483794-13.927197-0.603751-18.859533-5.54632-19.289322-19.330254-44.943608-29.972639-72.245418-29.972639-56.322773 0-102.146425 45.813419-102.146425 102.125959 0 0.317225 0.040932 0.982374 0.092098 1.627057 0.061398 0.920976 0.122797 1.831718 0.153496 2.762927 0.337691 9.465582-5.863545 17.928325-15.001669 20.455891-32.356942 8.933463-61.541635 28.550243-82.181721 55.217602-21.305235 27.516704-32.571836 60.508096-32.571836 95.41307 0 86.244246 70.188572 156.422585 156.443052 156.422585l169.981393 0c11.2973 0 20.466124 9.15859 20.466124 20.466124 0 11.2973-9.168824 20.466124-20.466124 20.466124l-169.981393 0c-108.828614 0-197.3753-88.536452-197.3753-197.354833 0-44.053332 14.223956-85.712127 41.126676-120.473839 22.809495-29.460985 53.897537-52.086285 88.710414-64.816215 5.065366-74.322729 67.149353-133.2447 142.751215-133.2447 28.386514 0 55.504128 8.217149 78.651314 23.52581 19.657712-39.868009 48.842405-74.169233 85.497233-100.212376 45.434795-32.295544 99.004875-49.354058 154.918325-49.354058 71.692832 0 139.087778 27.915793 189.782368 78.600149 50.694589 50.694589 78.610382 118.089535 78.610382 189.782368 0 3.704368-0.102331 7.470135-0.296759 11.368932C952.633602 352.568894 1022.955204 429.511287 1022.955204 522.570753zM629.258611 820.711014l-102.023628 102.013395c-3.990894 4.001127-9.230222 5.996574-14.46955 5.996574s-10.478655-1.995447-14.46955-5.996574l-102.023628-102.013395c-7.992021-7.992021-7.992021-20.947078 0-28.939099s20.947078-8.002254 28.939099 0l67.087954 67.077721 0-358.699522c0-11.2973 9.15859-20.466124 20.466124-20.466124 11.307533 0 20.466124 9.168824 20.466124 20.466124l0 358.699522 67.087954-67.077721c7.992021-8.002254 20.947078-7.992021 28.939099 0S637.250632 812.718993 629.258611 820.711014z" - p-id="7122" - ></path> - </svg> --> + <el-dialog :visible.sync="localDialogVisible" @open="hadleOpenDialog" width="60vw" top="2vh" append-to-body + lock-scroll :show-close="false" class="custom-dialog"> + <div slot="title" class="header_title"> + <span>{{ pdfTitle }}</span> + <span @click="closeDialog"> x </span> + </div> + <div class="pdfModal" v-if="localDialogVisible"> + <!-- 鍘熸湁鐨勫唴瀹� --> + <div class="pdfBox-component"> + <div class="preview" v-if="this.preViewMd5"> + <div id="imageParent" class="imageBox"></div> + <div class="bottom_tool"> + </div> + </div> + <div class="notBox" v-if="totalPage == 0 && !loading"> + <el-empty description="鏆傛棤鏁版嵁"></el-empty> + </div> + <div class="notBox" v-if="loading" v-loading="loading"></div> </div> </div> + </el-dialog> - <div class="notBox" v-if="totalPage == 0 && !loading"> - <el-empty description="鏆傛棤鏁版嵁"></el-empty> - </div> - <div class="notBox" v-if="loading" v-loading="loading"></div> - </div> </template> <script> import Viewer from 'viewerjs' @@ -47,9 +40,13 @@ type: Boolean, default: false, }, + pdfTitle: { + type: String, + } }, data() { return { + localDialogVisible: false, currentPageSrc: '', currentPage: 1, totalPage: 1, @@ -59,31 +56,55 @@ } }, watch: { - isClear: { - immediate: true, - handler(val) { - if (val == true) this.preViewMd5 = '' - }, - }, - md5: { - immediate: true, - handler(val) { - if (val) { - this.preViewMd5 = val - this.currentPage = 1 - this.currentPageSrc = '' - this.totalPage = 1 - this.viewerCon?.destroy() - } - }, - }, - }, - mounted() { - this.scrollBottom() - this.clearDom() - this.getFileInfo() + + // md5: { + // immediate: true, + // handler(val) { + // if (val) { + // // this.preViewMd5 = val + // this.currentPage = 1 + // this.currentPageSrc = '' + // this.totalPage = 1 + // this.viewerCon?.destroy() + // } + // }, + // }, + // dialogVisibleProp(newVal) { + // this.localDialogVisible = newVal; + // if (newVal) { + // this.currentPage = 1; + // this.loading = true; + // this.clearDom(); + // this.getFileInfo(); + // this.$nextTick(() => { + // this.scrollBottom() + // }); + // } else { + // this.viewerCon?.destroy(); + // } + // }, + }, methods: { + hadleOpenDialog() { + this.preViewMd5 = this.md5 + this.currentPage = 1 + this.currentPageSrc = '' + this.totalPage = 1 + this.viewerCon?.destroy() + this.loading = true; + this.clearDom(); + this.getFileInfo(); + this.$nextTick(() => { + this.scrollBottom() + }); + }, + closeDialog() { + this.localDialogVisible = false + }, + openDialog() { + this.localDialogVisible = true + }, async downloadPdf() { window.open(await getResourcePath(this.preViewMd5)) }, @@ -92,19 +113,23 @@ // 'imageParent' // ) let ele = document.getElementById('imageParent') - this.viewerCon = new Viewer(ele, { - inline: false, - container: this.container - ? this.container.querySelector('#app') - : 'body', - navbar: true, // 鏄剧ず瀵艰埅鏍� - toolbar: true, // 鏄剧ず宸ュ叿鏍� - title: true, // 鏄剧ず鏍囬 - }) + if (ele) { + this.viewerCon = new Viewer(ele, { + inline: false, + container: this.container + ? this.container.querySelector('#app') + : 'body', + navbar: true, // 鏄剧ず瀵艰埅鏍� + toolbar: true, // 鏄剧ず宸ュ叿鏍� + title: true, // 鏄剧ず鏍囬 + }) + } }, clearDom() { let ele = document.getElementById('imageParent') - ele.innerHtml = '' + if (ele) { + ele.innerHTML = '' + } }, createDom(page) { var that = this @@ -119,21 +144,25 @@ that.viewerCon?.destroy() that.domViewer() } - ele.appendChild(img) + if (ele) { + ele.appendChild(img) + } }, scrollBottom() { var that = this var ele = document.getElementById('imageParent') - ele.addEventListener('scroll', function () { - // 璁$畻婊氬姩鏉¤窛绂诲簳閮ㄧ殑浣嶇疆 - const scrollBottom = ele.scrollHeight - ele.scrollTop - ele.clientHeight - if (scrollBottom <= 10) { - that.currentPage++ - if (that.currentPage <= that.totalPage) { - that.createDom(that.currentPage, ele) + if (ele) { + ele.addEventListener('scroll', function () { + // 璁$畻婊氬姩鏉¤窛绂诲簳閮ㄧ殑浣嶇疆 + const scrollBottom = ele.scrollHeight - ele.scrollTop - ele.clientHeight + if (scrollBottom <= 10) { + that.currentPage++ + if (that.currentPage <= that.totalPage) { + that.createDom(that.currentPage, ele) + } } - } - }) + }); + } }, getFileInfo() { // 鑾峰彇鐩綍 @@ -142,14 +171,14 @@ .getPdfInfo({ md5: this.preViewMd5 }) .then((res) => { try { - if(typeof res === 'string' && res !== null ){ + if (typeof res === 'string' && res !== null) { this.totalPage = JSON.parse(res).totalPages - }else if(typeof res === 'object' && res !== null) { + } else if (typeof res === 'object' && res !== null) { this.totalPage = res.totalPages } } catch (error) { - console.log(error,'pdf杩斿洖鍊肩被鍨嬮敊璇�'); - } + console.log(error, 'pdf杩斿洖鍊肩被鍨嬮敊璇�'); + } this.createDom(this.currentPage) this.loading = false }) -- Gitblit v1.9.1