Merge pull request #8181 from highfidelity/RC-15

Beta Release 15 - Includes up to Developer Release 5103
This commit is contained in:
Chris Collins 2016-07-06 13:34:46 -07:00 committed by GitHub
commit faaee4f36a
103 changed files with 3109 additions and 1565 deletions

73
.eslintrc.js Normal file
View file

@ -0,0 +1,73 @@
module.exports = {
"root": true,
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 5
},
"globals": {
"Account": false,
"AnimationCache": false,
"Assets": false,
"Audio": false,
"AudioDevice": false,
"AudioEffectOptions": false,
"AvatarList": false,
"AvatarManager": false,
"Camera": false,
"Clipboard": false,
"Controller": false,
"DialogsManager": false,
"Entities": false,
"FaceTracker": false,
"GlobalServices": false,
"HMD": false,
"LODManager": false,
"Mat4": false,
"Menu": false,
"Messages": false,
"ModelCache": false,
"MyAvatar": false,
"Overlays": false,
"Paths": false,
"Quat": false,
"Rates": false,
"Recording": false,
"Reticle": false,
"Scene": false,
"Script": false,
"ScriptDiscoveryService": false,
"Settings": false,
"SoundCache": false,
"Stats": false,
"TextureCache": false,
"Uuid": false,
"UndoStack": false,
"Vec3": false,
"WebSocket": false,
"WebWindow": false,
"Window": false,
"XMLHttpRequest": false,
"location": false,
"print": false
},
"rules": {
"brace-style": ["error", "1tbs", { "allowSingleLine": false }],
"comma-dangle": ["error", "never"],
"camelcase": ["error"],
"curly": ["error", "all"],
"indent": ["error", 4, { "SwitchCase": 1 }],
"keyword-spacing": ["error", { "before": true, "after": true }],
"max-len": ["error", 128, 4],
"new-cap": ["error"],
"no-floating-decimal": ["error"],
//"no-magic-numbers": ["error", { "ignore": [0, 1], "ignoreArrayIndexes": true }],
"no-multiple-empty-lines": ["error"],
"no-multi-spaces": ["error"],
"no-unused-vars": ["error", { "args": "none", "vars": "local" }],
"semi": ["error", "always"],
"spaced-comment": ["error", "always", {
"line": { "markers": ["/"] }
}],
"space-before-function-paren": ["error", {"anonymous": "always", "named": "never"}]
}
};

View file

@ -22,7 +22,7 @@ macro(optional_win_executable_signing)
# setup a post build command to sign the executable
add_custom_command(
TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${SIGNTOOL_EXECUTABLE} sign /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://tsa.starfieldtech.com /td SHA256 ${EXECUTABLE_PATH}
COMMAND ${SIGNTOOL_EXECUTABLE} sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://tsa.starfieldtech.com /td SHA256 ${EXECUTABLE_PATH}
)
else ()
message(FATAL_ERROR "HF_PFX_PASSPHRASE must be set for executables to be signed.")

View file

@ -64,7 +64,7 @@
; The Inner invocation has written an uninstaller binary for us.
; We need to sign it if it's a production or PR build.
!if @PRODUCTION_BUILD@ == 1
!system '"@SIGNTOOL_EXECUTABLE@" sign /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://tsa.starfieldtech.com /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0
!system '"@SIGNTOOL_EXECUTABLE@" sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://tsa.starfieldtech.com /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0
!endif
; Good. Now we can carry on writing the real installer.

View file

@ -1,105 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 150" style="enable-background:new 0 0 50 150;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.49;}
.st1{fill:#1E1E1E;}
.st2{opacity:0.5;}
.st3{fill:#EAEAEA;}
.st4{fill:#FFFFFF;}
</style>
<g class="st0">
<path class="st1" d="M50,146c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146z"/>
</g>
<g class="st2">
<g>
<path class="st3" d="M25.1,109.5c-4.2,0-8,1.8-10.8,4.8c0,0-0.5,0.7,0.2,1.2c0.7,0.6,1.4-0.1,1.4-0.1c2.4-2.4,5.7-3.9,9.2-3.9
c3.6,0,6.9,1.5,9.3,4.1c0,0,0.7,0.8,1.5,0.3c0.7-0.4,0.2-1.2,0.2-1.3C33.3,111.4,29.4,109.5,25.1,109.5z"/>
<path class="st3" d="M35.4,116.3c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.5-0.3-0.6-0.4l0,0c-2.5-2.6-5.7-4-9.2-4c-3.4,0-6.6,1.4-9.1,3.9
l0,0c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.2-0.9,0.2-1.3-0.2c-0.6-0.5-0.4-1.1-0.3-1.4c0-0.1,0.1-0.1,0.1-0.2l0,0
c2.9-3.1,6.8-4.9,10.9-4.9c4.2,0,8.2,1.8,11.2,5.1c0.1,0.1,0.3,0.5,0.2,0.9c0,0.3-0.2,0.6-0.5,0.8
C35.9,116.2,35.6,116.3,35.4,116.3z M34.7,115.4c0.1,0.1,0.6,0.6,1.1,0.2c0.1-0.1,0.2-0.2,0.2-0.3c0-0.3-0.1-0.5-0.1-0.6
c-2.9-3.2-6.7-5-10.8-5c-4,0-7.7,1.7-10.6,4.7c-0.1,0.1-0.3,0.5,0.1,0.9c0.5,0.4,1,0,1.1-0.1c2.6-2.6,5.9-4,9.4-4
C28.7,111.2,32.1,112.7,34.7,115.4L34.7,115.4z M36,114.7C36,114.7,36,114.7,36,114.7L36,114.7z M35.9,114.7
C35.9,114.7,35.9,114.7,35.9,114.7L35.9,114.7z"/>
</g>
<path class="st3" d="M27.3,116l-1.5-0.9c-0.3-0.2-0.7-0.2-1,0l-1.5,0.9c-0.3,0.2-0.5,0.5-0.5,0.9l0,1.8c0,0.4,0.2,0.7,0.5,0.9
l1.5,0.9c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.3-0.2,0.5-0.5,0.5-0.9l0-1.8C27.8,116.5,27.6,116.2,27.3,116z"/>
<path class="st3" d="M31.2,125l-1.2-1.5c-0.2-0.3-0.5-0.4-0.8-0.4l-7.9,0c0,0,0,0,0,0c-0.3,0-0.6,0.1-0.8,0.4l-1.2,1.5
c-0.3,0.4-0.3,0.9,0,1.3l1.2,1.5c0.2,0.3,0.5,0.4,0.8,0.4l7.9,0c0,0,0,0,0,0c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5
C31.5,126,31.5,125.4,31.2,125z"/>
</g>
<g class="st2">
<path class="st3" d="M19.2,135.5v6.4H18v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6H18v-2.6H19.2z"/>
<path class="st3" d="M25.4,141c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7c0.1-0.3,0.1-0.5,0.1-0.8
v-3.4h1.3v3.4c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3
c-0.5,0-1-0.1-1.4-0.3c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4
c0,0.3,0,0.5,0.1,0.8c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5S25.1,141,25.4,141z"/>
<path class="st3" d="M31.7,141.9v-6.4H34c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1
c0.1,0.4,0.2,0.8,0.2,1.2c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H31.7z
M35.9,138.7c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2H34
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C35.8,139.3,35.9,139,35.9,138.7z"/>
</g>
<g>
<path class="st1" d="M50,96c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V54c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96z"/>
</g>
<g>
<g>
<path class="st3" d="M25.1,59.5c-4.2,0-8,1.8-10.8,4.8c0,0-0.5,0.7,0.2,1.2c0.7,0.6,1.4-0.1,1.4-0.1c2.4-2.4,5.7-3.9,9.2-3.9
c3.6,0,6.9,1.5,9.3,4.1c0,0,0.7,0.8,1.5,0.3c0.7-0.4,0.2-1.2,0.2-1.3C33.3,61.5,29.4,59.5,25.1,59.5z"/>
<path class="st3" d="M35.4,66.3c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.5-0.3-0.6-0.4l0,0c-2.5-2.6-5.7-4-9.2-4c-3.4,0-6.6,1.4-9.1,3.9
l0,0c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.2-0.9,0.2-1.3-0.2c-0.6-0.5-0.4-1.1-0.3-1.4c0-0.1,0.1-0.1,0.1-0.2l0,0
c2.9-3.1,6.8-4.9,10.9-4.9c4.2,0,8.2,1.8,11.2,5.1c0.1,0.1,0.3,0.5,0.2,0.9c0,0.3-0.2,0.6-0.5,0.8C35.9,66.2,35.6,66.3,35.4,66.3z
M34.7,65.5c0.1,0.1,0.6,0.6,1.1,0.2c0.1-0.1,0.2-0.2,0.2-0.3c0-0.3-0.1-0.5-0.1-0.6c-2.9-3.2-6.7-5-10.8-5c-4,0-7.7,1.7-10.6,4.7
c-0.1,0.1-0.3,0.5,0.1,0.9c0.5,0.4,1,0,1.1-0.1c2.6-2.6,5.9-4,9.4-4C28.7,61.3,32.1,62.7,34.7,65.5L34.7,65.5z M36,64.7
C36,64.7,36,64.7,36,64.7L36,64.7z M35.9,64.7C35.9,64.7,35.9,64.7,35.9,64.7L35.9,64.7z"/>
</g>
<path class="st3" d="M27.3,66l-1.5-0.9c-0.3-0.2-0.7-0.2-1,0L23.2,66c-0.3,0.2-0.5,0.5-0.5,0.9l0,1.8c0,0.4,0.2,0.7,0.5,0.9
l1.5,0.9c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.3-0.2,0.5-0.5,0.5-0.9l0-1.8C27.8,66.5,27.6,66.2,27.3,66z"/>
<path class="st3" d="M31.2,75.1L30,73.5c-0.2-0.3-0.5-0.4-0.8-0.4l-7.9,0c0,0,0,0,0,0c-0.3,0-0.6,0.1-0.8,0.4l-1.2,1.5
c-0.3,0.4-0.3,0.9,0,1.3l1.2,1.5c0.2,0.3,0.5,0.4,0.8,0.4l7.9,0c0,0,0,0,0,0c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5
C31.5,76,31.5,75.5,31.2,75.1z"/>
</g>
<g>
<path class="st3" d="M19.2,85.5v6.4H18v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6H18v-2.6H19.2z"/>
<path class="st3" d="M25.4,91c0.3,0,0.6-0.1,0.8-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.4h1.3v3.4
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-1-0.1-1.4-0.3
c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4c0,0.3,0,0.5,0.1,0.8
c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5S25.1,91,25.4,91z"/>
<path class="st3" d="M31.7,91.9v-6.4H34c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H31.7z M35.9,88.7
c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2H34
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C35.8,89.3,35.9,89,35.9,88.7z"/>
</g>
<g>
<path class="st4" d="M50,46.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46.1z"/>
</g>
<g>
<g>
<path d="M25.1,9.6c-4.2,0-8,1.8-10.8,4.8c0,0-0.5,0.7,0.2,1.2c0.7,0.6,1.4-0.1,1.4-0.1c2.4-2.4,5.7-3.9,9.2-3.9
c3.6,0,6.9,1.5,9.3,4.1c0,0,0.7,0.8,1.5,0.3c0.7-0.4,0.2-1.2,0.2-1.3C33.3,11.5,29.4,9.6,25.1,9.6z"/>
<path d="M35.4,16.3c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.5-0.3-0.6-0.4l0,0c-2.5-2.6-5.7-4-9.2-4c-3.4,0-6.6,1.4-9.1,3.9l0,0
c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.2-0.9,0.2-1.3-0.2c-0.6-0.5-0.4-1.1-0.3-1.4c0-0.1,0.1-0.1,0.1-0.2l0,0
c2.9-3.1,6.8-4.9,10.9-4.9c4.2,0,8.2,1.8,11.2,5.1c0.1,0.1,0.3,0.5,0.2,0.9c0,0.3-0.2,0.6-0.5,0.8C35.9,16.3,35.6,16.3,35.4,16.3z
M34.7,15.5c0.1,0.1,0.6,0.6,1.1,0.2c0.1-0.1,0.2-0.2,0.2-0.3c0-0.3-0.1-0.5-0.1-0.6c-2.9-3.2-6.7-5-10.8-5c-4,0-7.7,1.7-10.6,4.7
c-0.1,0.1-0.3,0.5,0.1,0.9c0.5,0.4,1,0,1.1-0.1c2.6-2.6,5.9-4,9.4-4C28.7,11.3,32.1,12.8,34.7,15.5L34.7,15.5z M36,14.8
C36,14.8,36,14.8,36,14.8L36,14.8z M35.9,14.8C35.9,14.8,35.9,14.8,35.9,14.8L35.9,14.8z"/>
</g>
<path d="M27.3,16l-1.5-0.9c-0.3-0.2-0.7-0.2-1,0L23.2,16c-0.3,0.2-0.5,0.5-0.5,0.9l0,1.8c0,0.4,0.2,0.7,0.5,0.9l1.5,0.9
c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.3-0.2,0.5-0.5,0.5-0.9l0-1.8C27.8,16.6,27.6,16.2,27.3,16z"/>
<path d="M31.2,25.1L30,23.6c-0.2-0.3-0.5-0.4-0.8-0.4l-7.9,0c0,0,0,0,0,0c-0.3,0-0.6,0.1-0.8,0.4l-1.2,1.5c-0.3,0.4-0.3,0.9,0,1.3
l1.2,1.5c0.2,0.3,0.5,0.4,0.8,0.4l7.9,0c0,0,0,0,0,0c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5C31.5,26,31.5,25.5,31.2,25.1z"/>
</g>
<g>
<path d="M19.2,35.6V42H18v-2.7h-2.9V42h-1.2v-6.4h1.2v2.6H18v-2.6H19.2z"/>
<path d="M25.4,41c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7c0.1-0.3,0.1-0.5,0.1-0.8v-3.4h1.3v3.4
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-1-0.1-1.4-0.3
c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4c0,0.3,0,0.5,0.1,0.8
c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5C24.9,41,25.1,41,25.4,41z"/>
<path d="M31.7,42v-6.4H34c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6C34.9,41.9,34.5,42,34,42H31.7z M35.9,38.8
c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2H34
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C35.8,39.3,35.9,39.1,35.9,38.8z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8 KiB

View file

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 200.1" style="enable-background:new 0 0 50 200.1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#414042;}
.st1{fill:#FFFFFF;}
.st2{fill:#1E1E1E;}
.st3{fill:#333333;}
</style>
<g id="Layer_2">
<g>
<g>
<path class="st0" d="M50.1,146.1c0,2.2-1.8,4-4,4h-42c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.1z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M50,196.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V196.1z"/>
</g>
</g>
<g>
<g>
<path class="st1" d="M50,46c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46z"/>
</g>
</g>
<g>
<path class="st2" d="M50,96.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.1z"/>
</g>
</g>
<g id="Layer_3">
</g>
<g id="Layer_1">
<g>
<g>
<path class="st3" d="M25.4,10.2c-4.2,0-8,1.8-10.8,4.8c0,0-0.5,0.7,0.2,1.2c0.7,0.6,1.4-0.1,1.4-0.1c2.4-2.4,5.7-3.9,9.2-3.9
c3.6,0,6.9,1.5,9.3,4.1c0,0,0.7,0.8,1.5,0.3c0.7-0.4,0.2-1.2,0.2-1.3C33.6,12.1,29.7,10.2,25.4,10.2z"/>
<path class="st3" d="M35.7,17c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.5-0.3-0.6-0.4l0,0c-2.5-2.6-5.7-4-9.2-4c-3.4,0-6.6,1.4-9.1,3.9
l0,0c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.2-0.9,0.2-1.3-0.2c-0.6-0.5-0.4-1.1-0.3-1.4c0-0.1,0.1-0.1,0.1-0.2l0,0
c2.9-3.1,6.8-4.9,10.9-4.9c4.2,0,8.2,1.8,11.2,5.1c0.1,0.1,0.3,0.5,0.2,0.9c0,0.3-0.2,0.6-0.5,0.8C36.2,16.9,35.9,17,35.7,17z
M35,16.1c0.1,0.1,0.6,0.6,1.1,0.2c0.1-0.1,0.2-0.2,0.2-0.3c0-0.3-0.1-0.5-0.1-0.6c-2.9-3.2-6.7-5-10.8-5c-4,0-7.7,1.7-10.6,4.7
c-0.1,0.1-0.3,0.5,0.1,0.9c0.5,0.4,1,0,1.1-0.1c2.6-2.6,5.9-4,9.4-4C29,11.9,32.4,13.4,35,16.1L35,16.1z M36.3,15.4
C36.3,15.4,36.3,15.4,36.3,15.4L36.3,15.4z M36.3,15.4L36.3,15.4L36.3,15.4z"/>
</g>
<path class="st3" d="M27.6,16.7l-1.5-0.9c-0.3-0.2-0.7-0.2-1,0l-1.5,0.9c-0.3,0.2-0.5,0.5-0.5,0.9l0,1.8c0,0.4,0.2,0.7,0.5,0.9
l1.5,0.9c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.3-0.2,0.5-0.5,0.5-0.9l0-1.8C28.2,17.2,28,16.9,27.6,16.7z"/>
<path class="st3" d="M31.5,25.7l-1.2-1.5c-0.2-0.3-0.5-0.4-0.8-0.4l-7.9,0h0c-0.3,0-0.6,0.1-0.8,0.4l-1.2,1.5
c-0.3,0.4-0.3,0.9,0,1.3l1.2,1.5c0.2,0.3,0.5,0.4,0.8,0.4l7.9,0h0c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5C31.8,26.6,31.8,26.1,31.5,25.7z"
/>
</g>
<g>
<path class="st3" d="M19.5,36.2v6.4h-1.2v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6h2.9v-2.6H19.5z"/>
<path class="st3" d="M25.7,41.7c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.4h1.3
v3.4c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-1-0.1-1.4-0.3
c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4c0,0.3,0,0.5,0.1,0.8
c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5S25.4,41.7,25.7,41.7z"/>
<path class="st3" d="M32,42.6v-6.4h2.3c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H32z M36.2,39.4
c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2h1.1
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C36.1,40,36.2,39.7,36.2,39.4z"/>
</g>
<g>
<g>
<path class="st1" d="M25.4,60.2c-4.2,0-8,1.8-10.8,4.8c0,0-0.5,0.7,0.2,1.2c0.7,0.6,1.4-0.1,1.4-0.1c2.4-2.4,5.7-3.9,9.2-3.9
c3.6,0,6.9,1.5,9.3,4.1c0,0,0.7,0.8,1.5,0.3c0.7-0.4,0.2-1.2,0.2-1.3C33.6,62.1,29.7,60.2,25.4,60.2z"/>
<path class="st1" d="M35.7,67c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.5-0.3-0.6-0.4l0,0c-2.5-2.6-5.7-4-9.2-4c-3.4,0-6.6,1.4-9.1,3.9
l0,0c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.2-0.9,0.2-1.3-0.2c-0.6-0.5-0.4-1.1-0.3-1.4c0-0.1,0.1-0.1,0.1-0.2l0,0
c2.9-3.1,6.8-4.9,10.9-4.9c4.2,0,8.2,1.8,11.2,5.1c0.1,0.1,0.3,0.5,0.2,0.9c0,0.3-0.2,0.6-0.5,0.8C36.2,66.9,35.9,67,35.7,67z
M35,66.1c0.1,0.1,0.6,0.6,1.1,0.2c0.1-0.1,0.2-0.2,0.2-0.3c0-0.3-0.1-0.5-0.1-0.6c-2.9-3.2-6.7-5-10.8-5c-4,0-7.7,1.7-10.6,4.7
c-0.1,0.1-0.3,0.5,0.1,0.9c0.5,0.4,1,0,1.1-0.1c2.6-2.6,5.9-4,9.4-4C29,61.9,32.4,63.4,35,66.1L35,66.1z M36.3,65.4
C36.3,65.4,36.3,65.4,36.3,65.4L36.3,65.4z M36.3,65.4L36.3,65.4L36.3,65.4z"/>
</g>
<path class="st1" d="M27.6,66.7l-1.5-0.9c-0.3-0.2-0.7-0.2-1,0l-1.5,0.9c-0.3,0.2-0.5,0.5-0.5,0.9l0,1.8c0,0.4,0.2,0.7,0.5,0.9
l1.5,0.9c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.3-0.2,0.5-0.5,0.5-0.9l0-1.8C28.2,67.2,28,66.9,27.6,66.7z"/>
<path class="st1" d="M31.5,75.7l-1.2-1.5c-0.2-0.3-0.5-0.4-0.8-0.4l-7.9,0h0c-0.3,0-0.6,0.1-0.8,0.4l-1.2,1.5
c-0.3,0.4-0.3,0.9,0,1.3l1.2,1.5c0.2,0.3,0.5,0.4,0.8,0.4l7.9,0h0c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5C31.8,76.6,31.8,76.1,31.5,75.7z"
/>
</g>
<g>
<path class="st1" d="M19.5,86.2v6.4h-1.2v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6h2.9v-2.6H19.5z"/>
<path class="st1" d="M25.7,91.7c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.4h1.3
v3.4c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-1-0.1-1.4-0.3
c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4c0,0.3,0,0.5,0.1,0.8
c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5S25.4,91.7,25.7,91.7z"/>
<path class="st1" d="M32,92.6v-6.4h2.3c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H32z M36.2,89.4
c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2h1.1
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C36.1,90,36.2,89.7,36.2,89.4z"/>
</g>
<g>
<path class="st1" d="M25.3,108.3c-4.2,0-8,1.8-10.8,4.8c0,0-0.5,0.7,0.2,1.2c0.7,0.6,1.4-0.1,1.4-0.1c2.4-2.4,5.7-3.9,9.2-3.9
c3.6,0,6.9,1.5,9.3,4.1c0,0,0.7,0.8,1.5,0.3c0.7-0.4,0.2-1.2,0.2-1.3C33.5,110.2,29.6,108.3,25.3,108.3z"/>
<path class="st1" d="M35.6,115c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.5-0.3-0.6-0.4l0,0c-2.5-2.6-5.7-4-9.2-4c-3.4,0-6.6,1.4-9.1,3.9
l0,0c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.2-0.9,0.2-1.3-0.2c-0.6-0.5-0.4-1.1-0.3-1.4c0-0.1,0.1-0.1,0.1-0.2l0,0
c2.9-3.1,6.8-4.9,10.9-4.9c4.2,0,8.2,1.8,11.2,5.1c0.1,0.1,0.3,0.5,0.2,0.9c0,0.3-0.2,0.6-0.5,0.8C36,115,35.8,115,35.6,115z
M34.8,114.2c0.1,0.1,0.6,0.6,1.1,0.2c0.1-0.1,0.2-0.2,0.2-0.3c0-0.3-0.1-0.5-0.1-0.6c-2.9-3.2-6.7-5-10.8-5
c-4,0-7.7,1.7-10.6,4.7c-0.1,0.1-0.3,0.5,0.1,0.9c0.5,0.4,1,0,1.1-0.1c2.6-2.6,5.9-4,9.4-4C28.8,110,32.2,111.5,34.8,114.2
L34.8,114.2z M36.1,113.5C36.1,113.5,36.1,113.5,36.1,113.5L36.1,113.5z M36.1,113.5C36.1,113.5,36.1,113.5,36.1,113.5L36.1,113.5
z"/>
</g>
<path class="st1" d="M27.5,116.7l-1.5-0.9c-0.3-0.2-0.7-0.2-1,0l-1.5,0.9c-0.3,0.2-0.5,0.5-0.5,0.9l0,1.8c0,0.4,0.2,0.7,0.5,0.9
l1.5,0.9c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.3-0.2,0.5-0.5,0.5-0.9l0-1.8C28,117.3,27.8,116.9,27.5,116.7z"/>
<path class="st1" d="M31.4,125.8l-1.2-1.5c-0.2-0.3-0.5-0.4-0.8-0.4l-7.9,0h0c-0.3,0-0.6,0.1-0.8,0.4l-1.2,1.5
c-0.3,0.4-0.3,0.9,0,1.3l1.2,1.5c0.2,0.3,0.5,0.4,0.8,0.4l7.9,0h0c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5C31.7,126.7,31.7,126.2,31.4,125.8
z"/>
<g>
<path class="st1" d="M19.3,136.3v6.4h-1.2v-2.7h-2.9v2.7H14v-6.4h1.2v2.6h2.9v-2.6H19.3z"/>
<path class="st1" d="M25.6,141.7c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7c0.1-0.3,0.1-0.5,0.1-0.8
v-3.4h1.3v3.4c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3
c-0.5,0-1-0.1-1.4-0.3c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4
c0,0.3,0,0.5,0.1,0.8c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5C25,141.7,25.3,141.7,25.6,141.7z"/>
<path class="st1" d="M31.8,142.7v-6.4h2.3c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1
c0.1,0.4,0.2,0.8,0.2,1.2c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H31.8z
M36,139.5c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2H33v4.2h1.1
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C36,140,36,139.8,36,139.5z"/>
</g>
<g>
<path class="st1" d="M25.3,158.3c-4.2,0-8,1.8-10.8,4.8c0,0-0.5,0.7,0.2,1.2c0.7,0.6,1.4-0.1,1.4-0.1c2.4-2.4,5.7-3.9,9.2-3.9
c3.6,0,6.9,1.5,9.3,4.1c0,0,0.7,0.8,1.5,0.3c0.7-0.4,0.2-1.2,0.2-1.3C33.5,160.3,29.6,158.3,25.3,158.3z"/>
<path class="st1" d="M35.6,165.1c-0.2,0-0.4,0-0.5-0.1c-0.2-0.1-0.5-0.3-0.6-0.4l0,0c-2.5-2.6-5.7-4-9.2-4c-3.4,0-6.6,1.4-9.1,3.9
l0,0c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.2-0.9,0.2-1.3-0.2c-0.6-0.5-0.4-1.1-0.3-1.4c0-0.1,0.1-0.1,0.1-0.2l0,0
c2.9-3.1,6.8-4.9,10.9-4.9c4.2,0,8.2,1.8,11.2,5.1c0.1,0.1,0.3,0.5,0.2,0.9c0,0.3-0.2,0.6-0.5,0.8C36,165,35.8,165.1,35.6,165.1z
M34.8,164.2c0.1,0.1,0.6,0.6,1.1,0.2c0.1-0.1,0.2-0.2,0.2-0.3c0-0.3-0.1-0.5-0.1-0.6c-2.9-3.2-6.7-5-10.8-5
c-4,0-7.7,1.7-10.6,4.7c-0.1,0.1-0.3,0.5,0.1,0.9c0.5,0.4,1,0,1.1-0.1c2.6-2.6,5.9-4,9.4-4C28.8,160,32.2,161.5,34.8,164.2
L34.8,164.2z M36.1,163.5C36.1,163.5,36.1,163.5,36.1,163.5L36.1,163.5z M36.1,163.5C36.1,163.5,36.1,163.5,36.1,163.5L36.1,163.5
z"/>
</g>
<path class="st1" d="M27.5,166.8l-1.5-0.9c-0.3-0.2-0.7-0.2-1,0l-1.5,0.9c-0.3,0.2-0.5,0.5-0.5,0.9l0,1.8c0,0.4,0.2,0.7,0.5,0.9
l1.5,0.9c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.3-0.2,0.5-0.5,0.5-0.9l0-1.8C28,167.3,27.8,167,27.5,166.8z"/>
<path class="st1" d="M31.4,175.9l-1.2-1.5c-0.2-0.3-0.5-0.4-0.8-0.4l-7.9,0h0c-0.3,0-0.6,0.1-0.8,0.4l-1.2,1.5
c-0.3,0.4-0.3,0.9,0,1.3l1.2,1.5c0.2,0.3,0.5,0.4,0.8,0.4l7.9,0h0c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5C31.7,176.8,31.7,176.2,31.4,175.9
z"/>
<g>
<path class="st1" d="M19.3,186.3v6.4h-1.2V190h-2.9v2.7H14v-6.4h1.2v2.6h2.9v-2.6H19.3z"/>
<path class="st1" d="M25.6,191.8c0.3,0,0.6-0.1,0.8-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7c0.1-0.3,0.1-0.5,0.1-0.8v-3.4
h1.3v3.4c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-1-0.1-1.4-0.3
c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4c0,0.3,0,0.5,0.1,0.8
c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5C25,191.7,25.3,191.8,25.6,191.8z"/>
<path class="st1" d="M31.8,192.7v-6.4h2.3c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1
c0.1,0.4,0.2,0.8,0.2,1.2c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H31.8z
M36,189.5c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2H33v4.2h1.1
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C36,190.1,36,189.8,36,189.5z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -30,6 +30,7 @@ Window {
width: addressBarDialog.implicitWidth
height: addressBarDialog.implicitHeight
onShownChanged: addressBarDialog.observeShownChanged(shown);
Component.onCompleted: {
root.parentChanged.connect(center);
center();

View file

@ -137,12 +137,14 @@ ScrollingWindow {
}
function updateVisiblity() {
for (var i = 0; i < tabView.count; ++i) {
if (tabView.getTab(i).enabled) {
return;
if (visible) {
for (var i = 0; i < tabView.count; ++i) {
if (tabView.getTab(i).enabled) {
return;
}
}
shown = false;
}
shown = false;
}
function findIndexForUrl(source) {

View file

@ -36,15 +36,15 @@ SpinBox {
id: spinStyle
background: Rectangle {
color: isLightColorScheme
? (spinBox.focus ? hifi.colors.white : hifi.colors.lightGray)
: (spinBox.focus ? hifi.colors.black : hifi.colors.baseGrayShadow)
? (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGray)
: (spinBox.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow)
border.color: spinBoxLabelInside.visible ? spinBoxLabelInside.color : hifi.colors.primaryHighlight
border.width: spinBox.focus ? spinBoxLabelInside.visible ? 2 : 1 : 0
border.width: spinBox.activeFocus ? spinBoxLabelInside.visible ? 2 : 1 : 0
}
textColor: isLightColorScheme
? (spinBox.focus ? hifi.colors.black : hifi.colors.lightGray)
: (spinBox.focus ? hifi.colors.white : hifi.colors.lightGrayText)
? (spinBox.activeFocus ? hifi.colors.black : hifi.colors.lightGray)
: (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText)
selectedTextColor: hifi.colors.black
selectionColor: hifi.colors.primaryHighlight
@ -96,7 +96,7 @@ SpinBox {
anchors.fill: parent
propagateComposedEvents: true
onWheel: {
if(spinBox.focus)
if(spinBox.activeFocus)
wheel.accepted = false
else
wheel.accepted = true

View file

@ -36,14 +36,14 @@ TextField {
style: TextFieldStyle {
textColor: isLightColorScheme
? (textField.focus ? hifi.colors.black : hifi.colors.lightGray)
: (textField.focus ? hifi.colors.white : hifi.colors.lightGrayText)
? (textField.activeFocus ? hifi.colors.black : hifi.colors.lightGray)
: (textField.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText)
background: Rectangle {
color: isLightColorScheme
? (textField.focus ? hifi.colors.white : hifi.colors.textFieldLightBackground)
: (textField.focus ? hifi.colors.black : hifi.colors.baseGrayShadow)
? (textField.activeFocus ? hifi.colors.white : hifi.colors.textFieldLightBackground)
: (textField.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow)
border.color: hifi.colors.primaryHighlight
border.width: textField.focus ? 1 : 0
border.width: textField.activeFocus ? 1 : 0
radius: isSearchField ? textField.height / 2 : 0
HiFiGlyphs {

View file

@ -24,6 +24,14 @@ FocusScope {
readonly property int invalid_position: -9999;
property rect recommendedRect: Qt.rect(0,0,0,0);
property var expectedChildren;
property bool repositionLocked: true
onRepositionLockedChanged: {
if (!repositionLocked) {
d.handleSizeChanged();
}
}
onHeightChanged: d.handleSizeChanged();
@ -52,11 +60,13 @@ FocusScope {
readonly property real menu: 8000
}
QtObject {
id: d
function handleSizeChanged() {
if (desktop.repositionLocked) {
return;
}
var oldRecommendedRect = recommendedRect;
var newRecommendedRectJS = (typeof Controller === "undefined") ? Qt.rect(0,0,0,0) : Controller.getRecommendedOverlayRect();
var newRecommendedRect = Qt.rect(newRecommendedRectJS.x, newRecommendedRectJS.y,
@ -235,6 +245,10 @@ FocusScope {
}
function repositionAll() {
if (desktop.repositionLocked) {
return;
}
var oldRecommendedRect = recommendedRect;
var oldRecommendedDimmensions = { x: oldRecommendedRect.width, y: oldRecommendedRect.height };
var newRecommendedRect = Controller.getRecommendedOverlayRect();
@ -297,8 +311,8 @@ FocusScope {
onPinnedChanged: {
if (pinned) {
nullFocus.focus = true;
nullFocus.forceActiveFocus();
desktop.focus = true;
desktop.forceActiveFocus();
// recalculate our non-pinned children
hiddenChildren = d.findMatchingChildren(desktop, function(child){
@ -472,17 +486,31 @@ FocusScope {
}
function unfocusWindows() {
// First find the active focus item, and unfocus it, all the way
// up the parent chain to the window
var currentFocus = offscreenWindow.activeFocusItem;
var targetWindow = d.getDesktopWindow(currentFocus);
while (currentFocus) {
if (currentFocus === targetWindow) {
break;
}
currentFocus.focus = false;
currentFocus = currentFocus.parent;
}
// Unfocus all windows
var windows = d.getTopLevelWindows();
for (var i = 0; i < windows.length; ++i) {
windows[i].focus = false;
}
// For the desktop to have active focus
desktop.focus = true;
desktop.forceActiveFocus();
}
FocusHack { id: focusHack; }
FocusScope { id: nullFocus; }
Rectangle {
id: focusDebugger;
objectName: "focusDebugger"
@ -496,5 +524,5 @@ FocusScope {
enabled: DebugQML
onTriggered: focusDebugger.visible = !focusDebugger.visible
}
}

View file

@ -603,7 +603,7 @@ ModalWindow {
TextField {
id: currentSelection
label: "Path:"
label: selectDirectory ? "Directory:" : "File name:"
anchors {
left: parent.left
right: selectionType.visible ? selectionType.left: parent.right

View file

@ -56,13 +56,13 @@ OriginalDesktop.Desktop {
var sysToolbar = desktop.getToolbar("com.highfidelity.interface.toolbar.system");
var toggleHudButton = sysToolbar.addButton({
objectName: "hudToggle",
imageURL: "../../../icons/hud-01.svg",
imageURL: "../../../icons/hud.svg",
visible: true,
pinned: true,
});
toggleHudButton.yOffset = Qt.binding(function(){
return desktop.pinned ? 50 : 0
toggleHudButton.buttonState = Qt.binding(function(){
return desktop.pinned ? 1 : 0
});
toggleHudButton.clicked.connect(function(){
console.log("Clicked on hud button")

View file

@ -53,11 +53,6 @@ ScrollingWindow {
updateRunningScripts();
}
function setDefaultFocus() {
// Work around FocusScope of scrollable window.
filterEdit.forceActiveFocus();
}
function updateRunningScripts() {
var runningScripts = ScriptDiscoveryService.getRunning();
runningScriptsModel.clear()
@ -276,7 +271,6 @@ ScrollingWindow {
isSearchField: true
anchors.left: parent.left
anchors.right: parent.right
focus: true
colorScheme: hifi.colorSchemes.dark
placeholderText: "Filter"
onTextChanged: scriptsModel.filterRegExp = new RegExp("^.*" + text + ".*$", "i")

View file

@ -7,7 +7,7 @@ import "../../windows"
import "../../js/Utils.js" as Utils
import "../models"
ScrollingWindow {
Window {
id: root
resizable: true
width: 516

View file

@ -8,6 +8,7 @@ Item {
property var subImage;
property int yOffset: 0
property int buttonState: 0
property int hoverOffset: 0
property var toolbar;
property real size: 50 // toolbar ? toolbar.buttonSize : 50
width: size; height: size
@ -36,9 +37,15 @@ Item {
}
}
function updateOffset() {
yOffset = size * (buttonState + hoverOffset);
}
onButtonStateChanged: {
yOffset = size * buttonState
hoverOffset = 0; // subtle: show the new state without hover. don't wait for mouse to be moved away
// The above is per UX design, but ALSO avoid a subtle issue that would be a problem because
// the hand controllers don't move the mouse when not triggered, so releasing the trigger would
// never show unhovered.
updateOffset();
}
Component.onCompleted: {
@ -58,8 +65,18 @@ Item {
}
MouseArea {
id: mouseArea
hoverEnabled: true
anchors.fill: parent
onClicked: button.clicked();
onEntered: {
hoverOffset = 2;
updateOffset();
}
onExited: {
hoverOffset = 0;
updateOffset();
}
}
}

View file

@ -39,6 +39,19 @@ Item {
onSelected: d.handleSelection(subMenu, currentItem, item)
}
}
property var delay: Timer { // No setTimeout in QML.
property var menuItem: null;
interval: 0
repeat: false
running: false
function trigger(item) { // Capture item and schedule asynchronous Timer.
menuItem = item;
start();
}
onTriggered: {
menuItem.trigger(); // Now trigger the item.
}
}
function toModel(items) {
var result = modelMaker.createObject(desktop);
@ -128,7 +141,8 @@ Item {
case MenuItemType.Item:
console.log("Triggering " + item.text)
item.trigger();
// Don't block waiting for modal dialogs and such that the menu might open.
delay.trigger(item);
clearMenus();
break;
}

View file

@ -773,6 +773,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
auto gpuIdent = GPUIdent::getInstance();
auto glContextData = getGLContextData();
QJsonObject properties = {
{ "version", applicationVersion() },
{ "previousSessionCrashed", _previousSessionCrashed },
{ "previousSessionRuntime", sessionRunTime.get() },
{ "cpu_architecture", QSysInfo::currentCpuArchitecture() },
@ -963,6 +964,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
updateHeartbeat();
loadSettings();
// Now that we've loaded the menu and thus switched to the previous display plugin
// we can unlock the desktop repositioning code, since all the positions will be
// relative to the desktop size for this plugin
auto offscreenUi = DependencyManager::get<OffscreenUi>();
offscreenUi->getDesktop()->setProperty("repositionLocked", false);
// Make sure we don't time out during slow operations at startup
updateHeartbeat();
@ -1579,13 +1587,7 @@ void Application::initializeUi() {
});
offscreenUi->resume();
connect(_window, &MainWindow::windowGeometryChanged, [this](const QRect& r){
static qreal oldDevicePixelRatio = 0;
qreal devicePixelRatio = getActiveDisplayPlugin()->devicePixelRatio();
if (devicePixelRatio != oldDevicePixelRatio) {
oldDevicePixelRatio = devicePixelRatio;
qDebug() << "Device pixel ratio changed, triggering GL resize";
resizeGL();
}
resizeGL();
});
// This will set up the input plugins UI
@ -1717,22 +1719,22 @@ void Application::paintGL() {
if (isHMDMode()) {
mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
_myCamera.setPosition(extractTranslation(camMat));
_myCamera.setRotation(glm::quat_cast(camMat));
_myCamera.setOrientation(glm::quat_cast(camMat));
} else {
_myCamera.setPosition(myAvatar->getDefaultEyePosition());
_myCamera.setRotation(myAvatar->getHead()->getCameraOrientation());
_myCamera.setOrientation(myAvatar->getHead()->getCameraOrientation());
}
} else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
if (isHMDMode()) {
auto hmdWorldMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix();
_myCamera.setRotation(glm::normalize(glm::quat_cast(hmdWorldMat)));
_myCamera.setOrientation(glm::normalize(glm::quat_cast(hmdWorldMat)));
_myCamera.setPosition(extractTranslation(hmdWorldMat) +
myAvatar->getOrientation() * boomOffset);
} else {
_myCamera.setRotation(myAvatar->getHead()->getOrientation());
_myCamera.setOrientation(myAvatar->getHead()->getOrientation());
if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
_myCamera.setPosition(myAvatar->getDefaultEyePosition()
+ _myCamera.getRotation() * boomOffset);
+ _myCamera.getOrientation() * boomOffset);
} else {
_myCamera.setPosition(myAvatar->getDefaultEyePosition()
+ myAvatar->getOrientation() * boomOffset);
@ -1751,7 +1753,7 @@ void Application::paintGL() {
glm::quat worldMirrorRotation = mirrorBodyOrientation * mirrorHmdRotation;
_myCamera.setRotation(worldMirrorRotation);
_myCamera.setOrientation(worldMirrorRotation);
glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix());
// Mirror HMD lateral offsets
@ -1762,7 +1764,7 @@ void Application::paintGL() {
+ mirrorBodyOrientation * glm::vec3(0.0f, 0.0f, 1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror
+ mirrorBodyOrientation * hmdOffset);
} else {
_myCamera.setRotation(myAvatar->getWorldAlignedOrientation()
_myCamera.setOrientation(myAvatar->getWorldAlignedOrientation()
* glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)));
_myCamera.setPosition(myAvatar->getDefaultEyePosition()
+ glm::vec3(0, _raiseMirror * myAvatar->getUniformScale(), 0)
@ -1775,11 +1777,11 @@ void Application::paintGL() {
if (cameraEntity != nullptr) {
if (isHMDMode()) {
glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix());
_myCamera.setRotation(cameraEntity->getRotation() * hmdRotation);
_myCamera.setOrientation(cameraEntity->getRotation() * hmdRotation);
glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix());
_myCamera.setPosition(cameraEntity->getPosition() + (hmdRotation * hmdOffset));
} else {
_myCamera.setRotation(cameraEntity->getRotation());
_myCamera.setOrientation(cameraEntity->getRotation());
_myCamera.setPosition(cameraEntity->getPosition());
}
}
@ -1960,7 +1962,8 @@ void Application::resizeGL() {
static qreal lastDevicePixelRatio = 0;
qreal devicePixelRatio = _window->devicePixelRatio();
if (offscreenUi->size() != fromGlm(uiSize) || devicePixelRatio != lastDevicePixelRatio) {
offscreenUi->resize(fromGlm(uiSize));
qDebug() << "Device pixel ratio changed, triggering resize";
offscreenUi->resize(fromGlm(uiSize), true);
_offscreenContext->makeCurrent();
lastDevicePixelRatio = devicePixelRatio;
}
@ -3314,9 +3317,9 @@ void Application::updateMyAvatarLookAtPosition() {
if (isLookingAtSomeone) {
deflection *= GAZE_DEFLECTION_REDUCTION_DURING_EYE_CONTACT;
}
lookAtSpot = origin + _myCamera.getRotation() * glm::quat(glm::radians(glm::vec3(
lookAtSpot = origin + _myCamera.getOrientation() * glm::quat(glm::radians(glm::vec3(
eyePitch * deflection, eyeYaw * deflection, 0.0f))) *
glm::inverse(_myCamera.getRotation()) * (lookAtSpot - origin);
glm::inverse(_myCamera.getOrientation()) * (lookAtSpot - origin);
}
}
@ -4032,7 +4035,7 @@ void Application::loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum) {
// Set the viewFrustum up with the correct position and orientation of the camera
viewFrustum.setPosition(camera.getPosition());
viewFrustum.setOrientation(camera.getRotation());
viewFrustum.setOrientation(camera.getOrientation());
// Ask the ViewFrustum class to calculate our corners
viewFrustum.calculate();
@ -4305,7 +4308,7 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi
myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_REARVIEW_DISTANCE * myAvatar->getScale());
}
_mirrorCamera.setProjection(glm::perspective(glm::radians(fov), aspect, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP));
_mirrorCamera.setRotation(myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI, 0.0f)));
_mirrorCamera.setOrientation(myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI, 0.0f)));
// set the bounds of rear mirror view
@ -4995,7 +4998,6 @@ void Application::takeSnapshot() {
DependencyManager::get<OffscreenUi>()->load("hifi/dialogs/SnapshotShareDialog.qml", [=](QQmlContext*, QObject* dialog) {
dialog->setProperty("source", QUrl::fromLocalFile(fileName));
connect(dialog, SIGNAL(uploadSnapshot(const QString& snapshot)), this, SLOT(uploadSnapshot(const QString& snapshot)));
});
}
@ -5348,7 +5350,6 @@ void Application::updateDisplayMode() {
_displayPlugin = newDisplayPlugin;
}
emit activeDisplayPluginChanged();
// reset the avatar, to set head and hand palms back to a reasonable default pose.

View file

@ -62,14 +62,14 @@ void Camera::update(float deltaTime) {
}
void Camera::recompose() {
mat4 orientation = glm::mat4_cast(_rotation);
mat4 orientation = glm::mat4_cast(_orientation);
mat4 translation = glm::translate(mat4(), _position);
_transform = translation * orientation;
}
void Camera::decompose() {
_position = vec3(_transform[3]);
_rotation = glm::quat_cast(_transform);
_orientation = glm::quat_cast(_transform);
}
void Camera::setTransform(const glm::mat4& transform) {
@ -85,8 +85,8 @@ void Camera::setPosition(const glm::vec3& position) {
}
}
void Camera::setRotation(const glm::quat& rotation) {
_rotation = rotation;
void Camera::setOrientation(const glm::quat& orientation) {
_orientation = orientation;
recompose();
if (_isKeepLookingAt) {
lookAt(_lookingAt);
@ -154,9 +154,9 @@ QString Camera::getModeString() const {
void Camera::lookAt(const glm::vec3& lookAt) {
glm::vec3 up = IDENTITY_UP;
glm::mat4 lookAtMatrix = glm::lookAt(_position, lookAt, up);
glm::quat rotation = glm::quat_cast(lookAtMatrix);
rotation.w = -rotation.w; // Rosedale approved
_rotation = rotation;
glm::quat orientation = glm::quat_cast(lookAtMatrix);
orientation.w = -orientation.w; // Rosedale approved
_orientation = orientation;
}
void Camera::keepLookingAt(const glm::vec3& point) {
@ -171,7 +171,7 @@ void Camera::loadViewFrustum(ViewFrustum& frustum) const {
// Set the viewFrustum up with the correct position and orientation of the camera
frustum.setPosition(getPosition());
frustum.setOrientation(getRotation());
frustum.setOrientation(getOrientation());
// Ask the ViewFrustum class to calculate our corners
frustum.calculate();

View file

@ -45,7 +45,7 @@ class Camera : public QObject {
public:
Camera();
void initialize(); // instantly put the camera at the ideal position and rotation.
void initialize(); // instantly put the camera at the ideal position and orientation.
void update( float deltaTime );
@ -57,25 +57,22 @@ public:
EntityItemPointer getCameraEntityPointer() const { return _cameraEntity; }
public slots:
QString getModeString() const;
void setModeString(const QString& mode);
glm::quat getRotation() const { return _rotation; }
void setRotation(const glm::quat& rotation);
glm::vec3 getPosition() const { return _position; }
void setPosition(const glm::vec3& position);
glm::quat getOrientation() const { return getRotation(); }
void setOrientation(const glm::quat& orientation) { setRotation(orientation); }
const glm::mat4& getTransform() const { return _transform; }
void setTransform(const glm::mat4& transform);
const glm::mat4& getProjection() const { return _projection; }
void setProjection(const glm::mat4& projection);
public slots:
QString getModeString() const;
void setModeString(const QString& mode);
glm::vec3 getPosition() const { return _position; }
void setPosition(const glm::vec3& position);
glm::quat getOrientation() const { return _orientation; }
void setOrientation(const glm::quat& orientation);
QUuid getCameraEntity() const;
void setCameraEntity(QUuid entityID);
@ -105,7 +102,7 @@ private:
// derived
glm::vec3 _position;
glm::quat _rotation;
glm::quat _orientation;
bool _isKeepLookingAt{ false };
glm::vec3 _lookingAt;
EntityItemPointer _cameraEntity;

View file

@ -79,10 +79,6 @@ void DiscoverabilityManager::updateLocation() {
const QString FRIENDS_ONLY_KEY_IN_LOCATION = "friends_only";
locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends));
// if we have a session ID add it now, otherwise add a null value
auto sessionID = accountManager->getSessionID();
rootObject[SESSION_ID_KEY] = sessionID.isNull() ? QJsonValue() : sessionID.toString();
JSONCallbackParameters callbackParameters;
callbackParameters.jsonCallbackReceiver = this;
callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse";
@ -110,13 +106,8 @@ void DiscoverabilityManager::updateLocation() {
callbackParameters.jsonCallbackReceiver = this;
callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse";
QJsonObject heartbeatObject;
auto sessionID = accountManager->getSessionID();
heartbeatObject[SESSION_ID_KEY] = sessionID.isNull() ? QJsonValue() : sessionID.toString();
accountManager->sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Optional,
QNetworkAccessManager::PutOperation, callbackParameters,
QJsonDocument(heartbeatObject).toJson());
QNetworkAccessManager::PutOperation, callbackParameters);
}
}

View file

@ -18,6 +18,8 @@
DialogsManagerScriptingInterface::DialogsManagerScriptingInterface() {
connect(DependencyManager::get<DialogsManager>().data(), &DialogsManager::addressBarToggled,
this, &DialogsManagerScriptingInterface::addressBarToggled);
connect(DependencyManager::get<DialogsManager>().data(), &DialogsManager::addressBarShown,
this, &DialogsManagerScriptingInterface::addressBarShown);
}
void DialogsManagerScriptingInterface::toggleAddressBar() {

View file

@ -24,6 +24,7 @@ public slots:
signals:
void addressBarToggled();
void addressBarShown(bool visible);
};
#endif

View file

@ -16,6 +16,7 @@
#include "DependencyManager.h"
#include "AddressManager.h"
#include "DialogsManager.h"
HIFI_QML_DEF(AddressBarDialog)
@ -74,3 +75,6 @@ void AddressBarDialog::displayAddressNotFoundMessage() {
OffscreenUi::critical("", "There is no address information for that user or place");
}
void AddressBarDialog::observeShownChanged(bool visible) {
DependencyManager::get<DialogsManager>()->emitAddressBarShown(visible);
}

View file

@ -38,6 +38,7 @@ protected:
Q_INVOKABLE void loadHome();
Q_INVOKABLE void loadBack();
Q_INVOKABLE void loadForward();
Q_INVOKABLE void observeShownChanged(bool visible);
bool _backEnabled;
bool _forwardEnabled;

View file

@ -150,7 +150,8 @@ void ApplicationOverlay::renderRearViewToFbo(RenderArgs* renderArgs) {
}
void ApplicationOverlay::renderRearView(RenderArgs* renderArgs) {
if (!qApp->isHMDMode() && Menu::getInstance()->isOptionChecked(MenuOption::MiniMirror)) {
if (!qApp->isHMDMode() && Menu::getInstance()->isOptionChecked(MenuOption::MiniMirror) &&
!Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) {
gpu::Batch& batch = *renderArgs->_batch;
auto geometryCache = DependencyManager::get<GeometryCache>();
@ -166,7 +167,7 @@ void ApplicationOverlay::renderRearView(RenderArgs* renderArgs) {
batch.setViewTransform(Transform());
float screenRatio = ((float)qApp->getDevicePixelRatio());
float renderRatio = ((float)screenRatio * qApp->getRenderResolutionScale());
float renderRatio = ((float)qApp->getRenderResolutionScale());
auto viewport = qApp->getMirrorViewRect();
glm::vec2 bottomLeft(viewport.left(), viewport.top() + viewport.height());

View file

@ -40,6 +40,7 @@ public:
QPointer<HMDToolsDialog> getHMDToolsDialog() const { return _hmdToolsDialog; }
QPointer<LodToolsDialog> getLodToolsDialog() const { return _lodToolsDialog; }
QPointer<OctreeStatsDialog> getOctreeStatsDialog() const { return _octreeStatsDialog; }
void emitAddressBarShown(bool visible) { emit addressBarShown(visible); }
public slots:
void toggleAddressBar();
@ -60,6 +61,7 @@ public slots:
signals:
void addressBarToggled();
void addressBarShown(bool visible);
private slots:
void hmdToolsClosed();

View file

@ -97,7 +97,7 @@ void Circle3DOverlay::render(RenderArgs* args) {
_lastColor = colorX;
auto geometryCache = DependencyManager::get<GeometryCache>();
Q_ASSERT(args->_batch);
auto& batch = *args->_batch;
@ -283,6 +283,9 @@ const render::ShapeKey Circle3DOverlay::getShapeKey() {
if (getAlpha() != 1.0f) {
builder.withTranslucent();
}
if (!getIsSolid()) {
builder.withUnlit().withDepthBias();
}
return builder.build();
}

View file

@ -44,11 +44,10 @@ void Cube3DOverlay::render(RenderArgs* args) {
Transform transform;
transform.setTranslation(position);
transform.setRotation(rotation);
auto geometryCache = DependencyManager::get<GeometryCache>();
auto pipeline = args->_pipeline;
if (!pipeline) {
pipeline = geometryCache->getShapePipeline();
pipeline = _isSolid ? geometryCache->getShapePipeline() : geometryCache->getWireShapePipeline();
}
if (_isSolid) {
@ -56,7 +55,7 @@ void Cube3DOverlay::render(RenderArgs* args) {
batch->setModelTransform(transform);
geometryCache->renderSolidCubeInstance(*batch, cubeColor, pipeline);
} else {
geometryCache->bindSimpleProgram(*batch, false, false, true, true);
if (getIsDashedLine()) {
transform.setScale(1.0f);
batch->setModelTransform(transform);
@ -101,6 +100,9 @@ const render::ShapeKey Cube3DOverlay::getShapeKey() {
if (getAlpha() != 1.0f) {
builder.withTranslucent();
}
if (!getIsSolid()) {
builder.withUnlit().withDepthBias();
}
return builder.build();
}

View file

@ -75,7 +75,6 @@ void Grid3DOverlay::render(RenderArgs* args) {
transform.setScale(glm::vec3(getDimensions(), 1.0f));
transform.setTranslation(position);
batch->setModelTransform(transform);
const float MINOR_GRID_EDGE = 0.0025f;
const float MAJOR_GRID_EDGE = 0.005f;
DependencyManager::get<GeometryCache>()->renderGrid(*batch, minCorner, maxCorner,
@ -86,7 +85,7 @@ void Grid3DOverlay::render(RenderArgs* args) {
}
const render::ShapeKey Grid3DOverlay::getShapeKey() {
return render::ShapeKey::Builder().withOwnPipeline();
return render::ShapeKey::Builder().withOwnPipeline().withUnlit().withDepthBias();
}
void Grid3DOverlay::setProperties(const QVariantMap& properties) {

View file

@ -92,7 +92,7 @@ void Image3DOverlay::render(RenderArgs* args) {
batch->setModelTransform(transform);
batch->setResourceTexture(0, _texture->getGPUTexture());
DependencyManager::get<GeometryCache>()->renderQuad(
*batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight,
glm::vec4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha)

View file

@ -54,17 +54,20 @@ void Line3DOverlay::render(RenderArgs* args) {
if (batch) {
batch->setModelTransform(_transform);
auto geometryCache = DependencyManager::get<GeometryCache>();
geometryCache->bindSimpleProgram(*batch, false, false, true, true);
if (getIsDashedLine()) {
// TODO: add support for color to renderDashedLine()
DependencyManager::get<GeometryCache>()->renderDashedLine(*batch, _start, _end, colorv4, _geometryCacheID);
geometryCache->renderDashedLine(*batch, _start, _end, colorv4, _geometryCacheID);
} else {
DependencyManager::get<GeometryCache>()->renderLine(*batch, _start, _end, colorv4, _geometryCacheID);
geometryCache->renderLine(*batch, _start, _end, colorv4, _geometryCacheID);
}
}
}
const render::ShapeKey Line3DOverlay::getShapeKey() {
auto builder = render::ShapeKey::Builder().withoutCullFace();
auto builder = render::ShapeKey::Builder().withOwnPipeline();
if (getAlpha() != 1.0f) {
builder.withTranslucent();
}

View file

@ -53,13 +53,15 @@ void Rectangle3DOverlay::render(RenderArgs* args) {
transform.setRotation(rotation);
batch->setModelTransform(transform);
auto geometryCache = DependencyManager::get<GeometryCache>();
if (getIsSolid()) {
glm::vec3 topLeft(-halfDimensions.x, -halfDimensions.y, 0.0f);
glm::vec3 bottomRight(halfDimensions.x, halfDimensions.y, 0.0f);
DependencyManager::get<GeometryCache>()->renderQuad(*batch, topLeft, bottomRight, rectangleColor);
geometryCache->bindSimpleProgram(*batch);
geometryCache->renderQuad(*batch, topLeft, bottomRight, rectangleColor);
} else {
auto geometryCache = DependencyManager::get<GeometryCache>();
geometryCache->bindSimpleProgram(*batch, false, false, true, true);
if (getIsDashedLine()) {
glm::vec3 point1(-halfDimensions.x, -halfDimensions.y, 0.0f);
glm::vec3 point2(halfDimensions.x, -halfDimensions.y, 0.0f);
@ -89,7 +91,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) {
}
const render::ShapeKey Rectangle3DOverlay::getShapeKey() {
auto builder = render::ShapeKey::Builder();
auto builder = render::ShapeKey::Builder().withOwnPipeline();
if (getAlpha() != 1.0f) {
builder.withTranslucent();
}

View file

@ -46,7 +46,7 @@ void Sphere3DOverlay::render(RenderArgs* args) {
auto geometryCache = DependencyManager::get<GeometryCache>();
auto pipeline = args->_pipeline;
if (!pipeline) {
pipeline = geometryCache->getShapePipeline();
pipeline = _isSolid ? geometryCache->getShapePipeline() : geometryCache->getWireShapePipeline();
}
if (_isSolid) {
@ -58,10 +58,13 @@ void Sphere3DOverlay::render(RenderArgs* args) {
}
const render::ShapeKey Sphere3DOverlay::getShapeKey() {
auto builder = render::ShapeKey::Builder();
auto builder = render::ShapeKey::Builder().withOwnPipeline();
if (getAlpha() != 1.0f) {
builder.withTranslucent();
}
if (!getIsSolid()) {
builder.withUnlit().withDepthBias();
}
return builder.build();
}

View file

@ -100,7 +100,9 @@ void Web3DOverlay::render(RenderArgs* args) {
}
batch.setModelTransform(transform);
DependencyManager::get<GeometryCache>()->renderQuad(batch, halfSize * -1.0f, halfSize, vec2(0), vec2(1), color);
auto geometryCache = DependencyManager::get<GeometryCache>();
geometryCache->bindSimpleProgram(batch, true, false, true, false);
geometryCache->renderQuad(batch, halfSize * -1.0f, halfSize, vec2(0), vec2(1), color);
batch.setResourceTexture(0, args->_whiteTexture); // restore default white color after me
}

View file

@ -425,7 +425,7 @@ glm::mat4 CompositorHelper::getReticleTransform(const glm::mat4& eyePose, const
d = glm::normalize(overlaySurfacePoint);
}
reticlePosition = headPosition + (d * getReticleDepth());
quat reticleOrientation = glm::quat_cast(_currentDisplayPlugin->getHeadPose());
quat reticleOrientation = cancelOutRoll(glm::quat_cast(_currentDisplayPlugin->getHeadPose()));
vec3 reticleScale = vec3(Cursor::Manager::instance().getScale() * reticleSize * getReticleDepth());
return glm::inverse(eyePose) * createMatFromScaleQuatAndPos(reticleScale, reticleOrientation, reticlePosition);
} else {

View file

@ -696,6 +696,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) {
QVector<glm::mat4> localTransforms;
const FBXGeometry& geometry = _model->getFBXGeometry();
int numberOfMeshes = geometry.meshes.size();
int totalNumVertices = 0;
for (int i = 0; i < numberOfMeshes; i++) {
const FBXMesh& mesh = geometry.meshes.at(i);
if (mesh.clusters.size() > 0) {
@ -706,6 +707,13 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) {
glm::mat4 identity;
localTransforms.push_back(identity);
}
totalNumVertices += mesh.vertices.size();
}
const int MAX_VERTICES_PER_STATIC_MESH = 1e6;
if (totalNumVertices > MAX_VERTICES_PER_STATIC_MESH) {
qWarning() << "model" << getModelURL() << "has too many vertices" << totalNumVertices << "and will collide as a box.";
info.setParams(SHAPE_TYPE_BOX, 0.5f * dimensions);
return;
}
updateModelBounds();

View file

@ -191,9 +191,11 @@ QUuid EntityScriptingInterface::addEntity(const EntityItemProperties& properties
if (success) {
emit debitEnergySource(cost);
queueEntityMessage(PacketType::EntityAdd, id, propertiesWithSimID);
}
return id;
return id;
} else {
return QUuid();
}
}
QUuid EntityScriptingInterface::addModelEntity(const QString& name, const QString& modelUrl, const glm::vec3& position) {

View file

@ -320,6 +320,11 @@ EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const Enti
return nullptr;
}
if (!properties.getClientOnly() && getIsClient() &&
!nodeList->getThisNodeCanRez() && !nodeList->getThisNodeCanRezTmp()) {
return nullptr;
}
bool recordCreationTime = false;
if (props.getCreated() == UNKNOWN_CREATED_TIME) {
// the entity's creation time was not specified in properties, which means this is a NEW entity

View file

@ -6,6 +6,14 @@
#include <QtOpenGL/QGL>
#include <QOpenGLContext>
#include <QtCore/QRegularExpression>
#include <QtCore/QProcessEnvironment>
#ifdef DEBUG
static bool enableDebug = true;
#else
static const QString DEBUG_FLAG("HIFI_ENABLE_OPENGL_45");
static bool enableDebug = QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG);
#endif
const QSurfaceFormat& getDefaultOpenGLSurfaceFormat() {
static QSurfaceFormat format;
@ -15,9 +23,9 @@ const QSurfaceFormat& getDefaultOpenGLSurfaceFormat() {
format.setDepthBufferSize(DEFAULT_GL_DEPTH_BUFFER_BITS);
format.setStencilBufferSize(DEFAULT_GL_STENCIL_BUFFER_BITS);
setGLFormatVersion(format);
#ifdef DEBUG
format.setOption(QSurfaceFormat::DebugContext);
#endif
if (enableDebug) {
format.setOption(QSurfaceFormat::DebugContext);
}
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
});

View file

@ -12,23 +12,30 @@
#include "OffscreenGLCanvas.h"
#include <QtCore/QProcessEnvironment>
#include <QtGui/QOffscreenSurface>
#include <QtGui/QOpenGLDebugLogger>
#include <QtGui/QOpenGLContext>
#include "GLHelpers.h"
#ifdef DEBUG
static bool enableDebugLogger = true;
#else
static const QString DEBUG_FLAG("HIFI_ENABLE_OPENGL_45");
static bool enableDebugLogger = QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG);
#endif
OffscreenGLCanvas::OffscreenGLCanvas() : _context(new QOpenGLContext), _offscreenSurface(new QOffscreenSurface){
}
OffscreenGLCanvas::~OffscreenGLCanvas() {
#ifdef DEBUG
if (_logger) {
makeCurrent();
delete _logger;
_logger = nullptr;
}
#endif
_context->doneCurrent();
}
@ -60,7 +67,7 @@ bool OffscreenGLCanvas::makeCurrent() {
qDebug() << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
});
#ifdef DEBUG
if (result && !_logger) {
_logger = new QOpenGLDebugLogger(this);
if (_logger->initialize()) {
@ -71,7 +78,6 @@ bool OffscreenGLCanvas::makeCurrent() {
_logger->startLogging(QOpenGLDebugLogger::LoggingMode::SynchronousLogging);
}
}
#endif
return result;
}

View file

@ -36,10 +36,7 @@ protected:
std::once_flag _reportOnce;
QOpenGLContext* _context;
QOffscreenSurface* _offscreenSurface;
#ifdef DEBUG
QOpenGLDebugLogger* _logger{ nullptr };
#endif
};
#endif // hifi_OffscreenGLCanvas_h

View file

@ -416,7 +416,7 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) {
_updateTimer.start();
}
void OffscreenQmlSurface::resize(const QSize& newSize_) {
void OffscreenQmlSurface::resize(const QSize& newSize_, bool forceResize) {
if (!_renderer || !_renderer->_quickWindow) {
return;
@ -435,7 +435,7 @@ void OffscreenQmlSurface::resize(const QSize& newSize_) {
}
QSize currentSize = _renderer->_quickWindow->geometry().size();
if (newSize == currentSize) {
if (newSize == currentSize && !forceResize) {
return;
}

View file

@ -38,7 +38,7 @@ public:
using MouseTranslator = std::function<QPoint(const QPointF&)>;
virtual void create(QOpenGLContext* context);
void resize(const QSize& size);
void resize(const QSize& size, bool forceResize = false);
QSize size() const;
Q_INVOKABLE QObject* load(const QUrl& qmlSource, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
Q_INVOKABLE QObject* load(const QString& qmlSourceFile, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {}) {

View file

@ -17,6 +17,7 @@
#include <glm/gtc/type_ptr.hpp>
#include "../gl41/GL41Backend.h"
#include "../gl45/GL45Backend.h"
#if defined(NSIGHT_FOUND)
#include "nvToolsExt.h"
@ -31,25 +32,21 @@
using namespace gpu;
using namespace gpu::gl;
static const QString DEBUG_FLAG("HIFI_ENABLE_OPENGL_45");
bool enableOpenGL45 = QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG);
static bool enableOpenGL45 = QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG);
Backend* GLBackend::createBackend() {
#if 0
// FIXME provide a mechanism to override the backend for testing
// Where the gpuContext is initialized and where the TRUE Backend is created and assigned
auto version = QOpenGLContextWrapper::currentContextVersion();
GLBackend* result;
if (enableOpenGL45 && version >= 0x0405) {
result = new gpu::gl45::GLBackend;
qDebug() << "Using OpenGL 4.5 backend";
result = new gpu::gl45::GL45Backend();
} else {
result = new gpu::gl41::GLBackend;
qDebug() << "Using OpenGL 4.1 backend";
result = new gpu::gl41::GL41Backend();
}
#else
GLBackend* result = new gpu::gl41::GL41Backend;
#endif
result->initInput();
result->initTransform();
gl::GLTexture::initTextureTransferHelper();

View file

@ -186,7 +186,7 @@ protected:
virtual void killInput() final;
virtual void syncInputStateCache() final;
virtual void resetInputStage() final;
virtual void updateInput() = 0;
virtual void updateInput();
struct InputStageState {
bool _invalidFormat { true };

View file

@ -150,3 +150,176 @@ void GLBackend::do_setIndirectBuffer(Batch& batch, size_t paramOffset) {
(void)CHECK_GL_ERROR();
}
// Core 41 doesn't expose the features to really separate the vertex format from the vertex buffers binding
// Core 43 does :)
// FIXME crashing problem with glVertexBindingDivisor / glVertexAttribFormat
// Once resolved, break this up into the GL 4.1 and 4.5 backends
#if 1 || (GPU_INPUT_PROFILE == GPU_CORE_41)
#define NO_SUPPORT_VERTEX_ATTRIB_FORMAT
#else
#define SUPPORT_VERTEX_ATTRIB_FORMAT
#endif
void GLBackend::updateInput() {
#if defined(SUPPORT_VERTEX_ATTRIB_FORMAT)
if (_input._invalidFormat) {
InputStageState::ActivationCache newActivation;
// Assign the vertex format required
if (_input._format) {
for (auto& it : _input._format->getAttributes()) {
const Stream::Attribute& attrib = (it).second;
GLuint slot = attrib._slot;
GLuint count = attrib._element.getLocationScalarCount();
uint8_t locationCount = attrib._element.getLocationCount();
GLenum type = _elementTypeToGL41Type[attrib._element.getType()];
GLuint offset = attrib._offset;;
GLboolean isNormalized = attrib._element.isNormalized();
GLenum perLocationSize = attrib._element.getLocationSize();
for (size_t locNum = 0; locNum < locationCount; ++locNum) {
newActivation.set(slot + locNum);
glVertexAttribFormat(slot + locNum, count, type, isNormalized, offset + locNum * perLocationSize);
glVertexAttribBinding(slot + locNum, attrib._channel);
}
glVertexBindingDivisor(attrib._channel, attrib._frequency);
}
(void)CHECK_GL_ERROR();
}
// Manage Activation what was and what is expected now
for (size_t i = 0; i < newActivation.size(); i++) {
bool newState = newActivation[i];
if (newState != _input._attributeActivation[i]) {
if (newState) {
glEnableVertexAttribArray(i);
} else {
glDisableVertexAttribArray(i);
}
_input._attributeActivation.flip(i);
}
}
(void)CHECK_GL_ERROR();
_input._invalidFormat = false;
_stats._ISNumFormatChanges++;
}
if (_input._invalidBuffers.any()) {
int numBuffers = _input._buffers.size();
auto buffer = _input._buffers.data();
auto vbo = _input._bufferVBOs.data();
auto offset = _input._bufferOffsets.data();
auto stride = _input._bufferStrides.data();
for (int bufferNum = 0; bufferNum < numBuffers; bufferNum++) {
if (_input._invalidBuffers.test(bufferNum)) {
glBindVertexBuffer(bufferNum, (*vbo), (*offset), (*stride));
}
buffer++;
vbo++;
offset++;
stride++;
}
_input._invalidBuffers.reset();
(void)CHECK_GL_ERROR();
}
#else
if (_input._invalidFormat || _input._invalidBuffers.any()) {
if (_input._invalidFormat) {
InputStageState::ActivationCache newActivation;
_stats._ISNumFormatChanges++;
// Check expected activation
if (_input._format) {
for (auto& it : _input._format->getAttributes()) {
const Stream::Attribute& attrib = (it).second;
uint8_t locationCount = attrib._element.getLocationCount();
for (int i = 0; i < locationCount; ++i) {
newActivation.set(attrib._slot + i);
}
}
}
// Manage Activation what was and what is expected now
for (unsigned int i = 0; i < newActivation.size(); i++) {
bool newState = newActivation[i];
if (newState != _input._attributeActivation[i]) {
if (newState) {
glEnableVertexAttribArray(i);
} else {
glDisableVertexAttribArray(i);
}
(void)CHECK_GL_ERROR();
_input._attributeActivation.flip(i);
}
}
}
// now we need to bind the buffers and assign the attrib pointers
if (_input._format) {
const Buffers& buffers = _input._buffers;
const Offsets& offsets = _input._bufferOffsets;
const Offsets& strides = _input._bufferStrides;
const Stream::Format::AttributeMap& attributes = _input._format->getAttributes();
auto& inputChannels = _input._format->getChannels();
_stats._ISNumInputBufferChanges++;
GLuint boundVBO = 0;
for (auto& channelIt : inputChannels) {
const Stream::Format::ChannelMap::value_type::second_type& channel = (channelIt).second;
if ((channelIt).first < buffers.size()) {
int bufferNum = (channelIt).first;
if (_input._invalidBuffers.test(bufferNum) || _input._invalidFormat) {
// GLuint vbo = gpu::GL41Backend::getBufferID((*buffers[bufferNum]));
GLuint vbo = _input._bufferVBOs[bufferNum];
if (boundVBO != vbo) {
glBindBuffer(GL_ARRAY_BUFFER, vbo);
(void)CHECK_GL_ERROR();
boundVBO = vbo;
}
_input._invalidBuffers[bufferNum] = false;
for (unsigned int i = 0; i < channel._slots.size(); i++) {
const Stream::Attribute& attrib = attributes.at(channel._slots[i]);
GLuint slot = attrib._slot;
GLuint count = attrib._element.getLocationScalarCount();
uint8_t locationCount = attrib._element.getLocationCount();
GLenum type = gl::ELEMENT_TYPE_TO_GL[attrib._element.getType()];
// GLenum perLocationStride = strides[bufferNum];
GLenum perLocationStride = attrib._element.getLocationSize();
GLuint stride = (GLuint)strides[bufferNum];
GLuint pointer = (GLuint)(attrib._offset + offsets[bufferNum]);
GLboolean isNormalized = attrib._element.isNormalized();
for (size_t locNum = 0; locNum < locationCount; ++locNum) {
glVertexAttribPointer(slot + (GLuint)locNum, count, type, isNormalized, stride,
reinterpret_cast<GLvoid*>(pointer + perLocationStride * (GLuint)locNum));
glVertexAttribDivisor(slot + (GLuint)locNum, attrib._frequency);
}
// TODO: Support properly the IAttrib version
(void)CHECK_GL_ERROR();
}
}
}
}
}
// everything format related should be in sync now
_input._invalidFormat = false;
}
#endif
}

View file

@ -13,173 +13,7 @@
using namespace gpu;
using namespace gpu::gl41;
// Core 41 doesn't expose the features to really separate the vertex format from the vertex buffers binding
// Core 43 does :)
// FIXME crashing problem with glVertexBindingDivisor / glVertexAttribFormat
#if 1 || (GPU_INPUT_PROFILE == GPU_CORE_41)
#define NO_SUPPORT_VERTEX_ATTRIB_FORMAT
#else
#define SUPPORT_VERTEX_ATTRIB_FORMAT
#endif
void GL41Backend::updateInput() {
#if defined(SUPPORT_VERTEX_ATTRIB_FORMAT)
if (_input._invalidFormat) {
InputStageState::ActivationCache newActivation;
// Assign the vertex format required
if (_input._format) {
for (auto& it : _input._format->getAttributes()) {
const Stream::Attribute& attrib = (it).second;
GLuint slot = attrib._slot;
GLuint count = attrib._element.getLocationScalarCount();
uint8_t locationCount = attrib._element.getLocationCount();
GLenum type = _elementTypeToGL41Type[attrib._element.getType()];
GLuint offset = attrib._offset;;
GLboolean isNormalized = attrib._element.isNormalized();
GLenum perLocationSize = attrib._element.getLocationSize();
for (size_t locNum = 0; locNum < locationCount; ++locNum) {
newActivation.set(slot + locNum);
glVertexAttribFormat(slot + locNum, count, type, isNormalized, offset + locNum * perLocationSize);
glVertexAttribBinding(slot + locNum, attrib._channel);
}
glVertexBindingDivisor(attrib._channel, attrib._frequency);
}
(void) CHECK_GL_ERROR();
}
// Manage Activation what was and what is expected now
for (size_t i = 0; i < newActivation.size(); i++) {
bool newState = newActivation[i];
if (newState != _input._attributeActivation[i]) {
if (newState) {
glEnableVertexAttribArray(i);
} else {
glDisableVertexAttribArray(i);
}
_input._attributeActivation.flip(i);
}
}
(void) CHECK_GL_ERROR();
_input._invalidFormat = false;
_stats._ISNumFormatChanges++;
}
if (_input._invalidBuffers.any()) {
int numBuffers = _input._buffers.size();
auto buffer = _input._buffers.data();
auto vbo = _input._bufferVBOs.data();
auto offset = _input._bufferOffsets.data();
auto stride = _input._bufferStrides.data();
for (int bufferNum = 0; bufferNum < numBuffers; bufferNum++) {
if (_input._invalidBuffers.test(bufferNum)) {
glBindVertexBuffer(bufferNum, (*vbo), (*offset), (*stride));
}
buffer++;
vbo++;
offset++;
stride++;
}
_input._invalidBuffers.reset();
(void) CHECK_GL_ERROR();
}
#else
if (_input._invalidFormat || _input._invalidBuffers.any()) {
if (_input._invalidFormat) {
InputStageState::ActivationCache newActivation;
_stats._ISNumFormatChanges++;
// Check expected activation
if (_input._format) {
for (auto& it : _input._format->getAttributes()) {
const Stream::Attribute& attrib = (it).second;
uint8_t locationCount = attrib._element.getLocationCount();
for (int i = 0; i < locationCount; ++i) {
newActivation.set(attrib._slot + i);
}
}
}
// Manage Activation what was and what is expected now
for (unsigned int i = 0; i < newActivation.size(); i++) {
bool newState = newActivation[i];
if (newState != _input._attributeActivation[i]) {
if (newState) {
glEnableVertexAttribArray(i);
} else {
glDisableVertexAttribArray(i);
}
(void) CHECK_GL_ERROR();
_input._attributeActivation.flip(i);
}
}
}
// now we need to bind the buffers and assign the attrib pointers
if (_input._format) {
const Buffers& buffers = _input._buffers;
const Offsets& offsets = _input._bufferOffsets;
const Offsets& strides = _input._bufferStrides;
const Stream::Format::AttributeMap& attributes = _input._format->getAttributes();
auto& inputChannels = _input._format->getChannels();
_stats._ISNumInputBufferChanges++;
GLuint boundVBO = 0;
for (auto& channelIt : inputChannels) {
const Stream::Format::ChannelMap::value_type::second_type& channel = (channelIt).second;
if ((channelIt).first < buffers.size()) {
int bufferNum = (channelIt).first;
if (_input._invalidBuffers.test(bufferNum) || _input._invalidFormat) {
// GLuint vbo = gpu::GL41Backend::getBufferID((*buffers[bufferNum]));
GLuint vbo = _input._bufferVBOs[bufferNum];
if (boundVBO != vbo) {
glBindBuffer(GL_ARRAY_BUFFER, vbo);
(void) CHECK_GL_ERROR();
boundVBO = vbo;
}
_input._invalidBuffers[bufferNum] = false;
for (unsigned int i = 0; i < channel._slots.size(); i++) {
const Stream::Attribute& attrib = attributes.at(channel._slots[i]);
GLuint slot = attrib._slot;
GLuint count = attrib._element.getLocationScalarCount();
uint8_t locationCount = attrib._element.getLocationCount();
GLenum type = gl::ELEMENT_TYPE_TO_GL[attrib._element.getType()];
// GLenum perLocationStride = strides[bufferNum];
GLenum perLocationStride = attrib._element.getLocationSize();
GLuint stride = (GLuint)strides[bufferNum];
GLuint pointer = (GLuint)(attrib._offset + offsets[bufferNum]);
GLboolean isNormalized = attrib._element.isNormalized();
for (size_t locNum = 0; locNum < locationCount; ++locNum) {
glVertexAttribPointer(slot + (GLuint)locNum, count, type, isNormalized, stride,
reinterpret_cast<GLvoid*>(pointer + perLocationStride * (GLuint)locNum));
glVertexAttribDivisor(slot + (GLuint)locNum, attrib._frequency);
}
// TODO: Support properly the IAttrib version
(void) CHECK_GL_ERROR();
}
}
}
}
}
// everything format related should be in sync now
_input._invalidFormat = false;
}
#endif
Parent::updateInput();
}

View file

@ -16,7 +16,7 @@ using namespace gpu;
using namespace gpu::gl41;
class GL41Query : public gpu::gl::GLQuery {
using Parent = gpu::gl::GLBuffer;
using Parent = gpu::gl::GLQuery;
public:
static GLuint allocateQuery() {
GLuint result;
@ -25,7 +25,7 @@ public:
}
GL41Query(const Query& query)
: gl::GLQuery(query, allocateQuery()) { }
: Parent(query, allocateQuery()) { }
};
gl::GLQuery* GL41Backend::syncGPUObject(const Query& query) {

View file

@ -0,0 +1,149 @@
//
// Created by Sam Gateau on 10/27/2014.
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "GL45Backend.h"
#include <mutex>
#include <queue>
#include <list>
#include <functional>
#include <glm/gtc/type_ptr.hpp>
Q_LOGGING_CATEGORY(gpugl45logging, "hifi.gpu.gl45")
using namespace gpu;
using namespace gpu::gl45;
void GL45Backend::do_draw(Batch& batch, size_t paramOffset) {
Primitive primitiveType = (Primitive)batch._params[paramOffset + 2]._uint;
GLenum mode = gl::PRIMITIVE_TO_GL[primitiveType];
uint32 numVertices = batch._params[paramOffset + 1]._uint;
uint32 startVertex = batch._params[paramOffset + 0]._uint;
if (isStereo()) {
setupStereoSide(0);
glDrawArrays(mode, startVertex, numVertices);
setupStereoSide(1);
glDrawArrays(mode, startVertex, numVertices);
_stats._DSNumTriangles += 2 * numVertices / 3;
_stats._DSNumDrawcalls += 2;
} else {
glDrawArrays(mode, startVertex, numVertices);
_stats._DSNumTriangles += numVertices / 3;
_stats._DSNumDrawcalls++;
}
_stats._DSNumAPIDrawcalls++;
(void) CHECK_GL_ERROR();
}
void GL45Backend::do_drawIndexed(Batch& batch, size_t paramOffset) {
Primitive primitiveType = (Primitive)batch._params[paramOffset + 2]._uint;
GLenum mode = gl::PRIMITIVE_TO_GL[primitiveType];
uint32 numIndices = batch._params[paramOffset + 1]._uint;
uint32 startIndex = batch._params[paramOffset + 0]._uint;
GLenum glType = gl::ELEMENT_TYPE_TO_GL[_input._indexBufferType];
auto typeByteSize = TYPE_SIZE[_input._indexBufferType];
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset);
if (isStereo()) {
setupStereoSide(0);
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
setupStereoSide(1);
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
_stats._DSNumTriangles += 2 * numIndices / 3;
_stats._DSNumDrawcalls += 2;
} else {
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
_stats._DSNumTriangles += numIndices / 3;
_stats._DSNumDrawcalls++;
}
_stats._DSNumAPIDrawcalls++;
(void) CHECK_GL_ERROR();
}
void GL45Backend::do_drawInstanced(Batch& batch, size_t paramOffset) {
GLint numInstances = batch._params[paramOffset + 4]._uint;
Primitive primitiveType = (Primitive)batch._params[paramOffset + 3]._uint;
GLenum mode = gl::PRIMITIVE_TO_GL[primitiveType];
uint32 numVertices = batch._params[paramOffset + 2]._uint;
uint32 startVertex = batch._params[paramOffset + 1]._uint;
if (isStereo()) {
GLint trueNumInstances = 2 * numInstances;
setupStereoSide(0);
glDrawArraysInstanced(mode, startVertex, numVertices, numInstances);
setupStereoSide(1);
glDrawArraysInstanced(mode, startVertex, numVertices, numInstances);
_stats._DSNumTriangles += (trueNumInstances * numVertices) / 3;
_stats._DSNumDrawcalls += trueNumInstances;
} else {
glDrawArraysInstanced(mode, startVertex, numVertices, numInstances);
_stats._DSNumTriangles += (numInstances * numVertices) / 3;
_stats._DSNumDrawcalls += numInstances;
}
_stats._DSNumAPIDrawcalls++;
(void) CHECK_GL_ERROR();
}
void GL45Backend::do_drawIndexedInstanced(Batch& batch, size_t paramOffset) {
GLint numInstances = batch._params[paramOffset + 4]._uint;
GLenum mode = gl::PRIMITIVE_TO_GL[(Primitive)batch._params[paramOffset + 3]._uint];
uint32 numIndices = batch._params[paramOffset + 2]._uint;
uint32 startIndex = batch._params[paramOffset + 1]._uint;
uint32 startInstance = batch._params[paramOffset + 0]._uint;
GLenum glType = gl::ELEMENT_TYPE_TO_GL[_input._indexBufferType];
auto typeByteSize = TYPE_SIZE[_input._indexBufferType];
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset);
if (isStereo()) {
GLint trueNumInstances = 2 * numInstances;
setupStereoSide(0);
glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
setupStereoSide(1);
glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
_stats._DSNumTriangles += (trueNumInstances * numIndices) / 3;
_stats._DSNumDrawcalls += trueNumInstances;
} else {
glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
_stats._DSNumTriangles += (numInstances * numIndices) / 3;
_stats._DSNumDrawcalls += numInstances;
}
_stats._DSNumAPIDrawcalls++;
(void)CHECK_GL_ERROR();
}
void GL45Backend::do_multiDrawIndirect(Batch& batch, size_t paramOffset) {
uint commandCount = batch._params[paramOffset + 0]._uint;
GLenum mode = gl::PRIMITIVE_TO_GL[(Primitive)batch._params[paramOffset + 1]._uint];
glMultiDrawArraysIndirect(mode, reinterpret_cast<GLvoid*>(_input._indirectBufferOffset), commandCount, (GLsizei)_input._indirectBufferStride);
_stats._DSNumDrawcalls += commandCount;
_stats._DSNumAPIDrawcalls++;
(void)CHECK_GL_ERROR();
}
void GL45Backend::do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) {
uint commandCount = batch._params[paramOffset + 0]._uint;
GLenum mode = gl::PRIMITIVE_TO_GL[(Primitive)batch._params[paramOffset + 1]._uint];
GLenum indexType = gl::ELEMENT_TYPE_TO_GL[_input._indexBufferType];
glMultiDrawElementsIndirect(mode, indexType, reinterpret_cast<GLvoid*>(_input._indirectBufferOffset), commandCount, (GLsizei)_input._indirectBufferStride);
_stats._DSNumDrawcalls += commandCount;
_stats._DSNumAPIDrawcalls++;
(void)CHECK_GL_ERROR();
}

View file

@ -0,0 +1,85 @@
//
// GL45Backend.h
// libraries/gpu/src/gpu
//
// Created by Sam Gateau on 10/27/2014.
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#ifndef hifi_gpu_45_GL45Backend_h
#define hifi_gpu_45_GL45Backend_h
#include "../gl/GLBackend.h"
#include "../gl/GLTexture.h"
namespace gpu { namespace gl45 {
class GL45Backend : public gl::GLBackend {
using Parent = gl::GLBackend;
// Context Backend static interface required
friend class Context;
public:
explicit GL45Backend(bool syncCache) : Parent(syncCache) {}
GL45Backend() : Parent() {}
class GL45Texture : public gpu::gl::GLTexture {
using Parent = gpu::gl::GLTexture;
GLuint allocate(const Texture& texture);
public:
GL45Texture(const Texture& texture, bool transferrable);
GL45Texture(const Texture& texture, GLTexture* original);
protected:
void transferMip(uint16_t mipLevel, uint8_t face = 0) const;
void allocateStorage() const override;
void updateSize() const override;
void transfer() const override;
void syncSampler() const override;
void generateMips() const override;
void withPreservedTexture(std::function<void()> f) const override;
};
protected:
GLuint getFramebufferID(const FramebufferPointer& framebuffer) override;
gl::GLFramebuffer* syncGPUObject(const Framebuffer& framebuffer) override;
GLuint getBufferID(const Buffer& buffer) override;
gl::GLBuffer* syncGPUObject(const Buffer& buffer) override;
GLuint getTextureID(const TexturePointer& texture, bool needTransfer = true) override;
gl::GLTexture* syncGPUObject(const TexturePointer& texture, bool sync = true) override;
GLuint getQueryID(const QueryPointer& query) override;
gl::GLQuery* syncGPUObject(const Query& query) override;
// Draw Stage
void do_draw(Batch& batch, size_t paramOffset) override;
void do_drawIndexed(Batch& batch, size_t paramOffset) override;
void do_drawInstanced(Batch& batch, size_t paramOffset) override;
void do_drawIndexedInstanced(Batch& batch, size_t paramOffset) override;
void do_multiDrawIndirect(Batch& batch, size_t paramOffset) override;
void do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) override;
// Input Stage
void updateInput() override;
// Synchronize the state cache of this Backend with the actual real state of the GL Context
void transferTransformState(const Batch& batch) const override;
void initTransform() override;
void updateTransform(const Batch& batch);
void resetTransformStage();
// Output stage
void do_blit(Batch& batch, size_t paramOffset) override;
};
} }
Q_DECLARE_LOGGING_CATEGORY(gpugl45logging)
#endif

View file

@ -0,0 +1,50 @@
//
// Created by Bradley Austin Davis on 2016/05/15
// Copyright 2013-2016 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "GL45Backend.h"
#include "../gl/GLBuffer.h"
using namespace gpu;
using namespace gpu::gl45;
class GL45Buffer : public gl::GLBuffer {
using Parent = gpu::gl::GLBuffer;
static GLuint allocate() {
GLuint result;
glCreateBuffers(1, &result);
return result;
}
public:
GL45Buffer(const Buffer& buffer, GLBuffer* original) : Parent(buffer, allocate()) {
glNamedBufferStorage(_buffer, _size, nullptr, GL_DYNAMIC_STORAGE_BIT);
if (original && original->_size) {
glCopyNamedBufferSubData(original->_buffer, _buffer, 0, 0, std::min(original->_size, _size));
}
Backend::setGPUObject(buffer, this);
}
void transfer() override {
Size offset;
Size size;
Size currentPage { 0 };
auto data = _gpuObject.getSysmem().readData();
while (_gpuObject.getNextTransferBlock(offset, size, currentPage)) {
glNamedBufferSubData(_buffer, (GLintptr)offset, (GLsizeiptr)size, data + offset);
}
(void)CHECK_GL_ERROR();
_gpuObject._flags &= ~Buffer::DIRTY;
}
};
GLuint GL45Backend::getBufferID(const Buffer& buffer) {
return GL45Buffer::getId<GL45Buffer>(buffer);
}
gl::GLBuffer* GL45Backend::syncGPUObject(const Buffer& buffer) {
return GL45Buffer::sync<GL45Buffer>(buffer);
}

View file

@ -0,0 +1,18 @@
//
// GL45BackendInput.cpp
// libraries/gpu/src/gpu
//
// Created by Sam Gateau on 3/8/2015.
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "GL45Backend.h"
using namespace gpu;
using namespace gpu::gl45;
void GL45Backend::updateInput() {
Parent::updateInput();
}

View file

@ -0,0 +1,145 @@
//
// GL45BackendTexture.cpp
// libraries/gpu/src/gpu
//
// Created by Sam Gateau on 1/19/2015.
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "GL45Backend.h"
#include "../gl/GLFramebuffer.h"
#include "../gl/GLTexture.h"
#include <QtGui/QImage>
namespace gpu { namespace gl45 {
class GL45Framebuffer : public gl::GLFramebuffer {
using Parent = gl::GLFramebuffer;
static GLuint allocate() {
GLuint result;
glCreateFramebuffers(1, &result);
return result;
}
public:
void update() override {
gl::GLTexture* gltexture = nullptr;
TexturePointer surface;
if (_gpuObject.getColorStamps() != _colorStamps) {
if (_gpuObject.hasColor()) {
_colorBuffers.clear();
static const GLenum colorAttachments[] = {
GL_COLOR_ATTACHMENT0,
GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2,
GL_COLOR_ATTACHMENT3,
GL_COLOR_ATTACHMENT4,
GL_COLOR_ATTACHMENT5,
GL_COLOR_ATTACHMENT6,
GL_COLOR_ATTACHMENT7,
GL_COLOR_ATTACHMENT8,
GL_COLOR_ATTACHMENT9,
GL_COLOR_ATTACHMENT10,
GL_COLOR_ATTACHMENT11,
GL_COLOR_ATTACHMENT12,
GL_COLOR_ATTACHMENT13,
GL_COLOR_ATTACHMENT14,
GL_COLOR_ATTACHMENT15 };
int unit = 0;
for (auto& b : _gpuObject.getRenderBuffers()) {
surface = b._texture;
if (surface) {
gltexture = gl::GLTexture::sync<GL45Backend::GL45Texture>(surface, false); // Grab the gltexture and don't transfer
} else {
gltexture = nullptr;
}
if (gltexture) {
glNamedFramebufferTexture(_id, colorAttachments[unit], gltexture->_texture, 0);
_colorBuffers.push_back(colorAttachments[unit]);
} else {
glNamedFramebufferTexture(_id, colorAttachments[unit], 0, 0);
}
unit++;
}
}
_colorStamps = _gpuObject.getColorStamps();
}
GLenum attachement = GL_DEPTH_STENCIL_ATTACHMENT;
if (!_gpuObject.hasStencil()) {
attachement = GL_DEPTH_ATTACHMENT;
} else if (!_gpuObject.hasDepth()) {
attachement = GL_STENCIL_ATTACHMENT;
}
if (_gpuObject.getDepthStamp() != _depthStamp) {
auto surface = _gpuObject.getDepthStencilBuffer();
if (_gpuObject.hasDepthStencil() && surface) {
gltexture = gl::GLTexture::sync<GL45Backend::GL45Texture>(surface, false); // Grab the gltexture and don't transfer
}
if (gltexture) {
glNamedFramebufferTexture(_id, attachement, gltexture->_texture, 0);
} else {
glNamedFramebufferTexture(_id, attachement, 0, 0);
}
_depthStamp = _gpuObject.getDepthStamp();
}
// Last but not least, define where we draw
if (!_colorBuffers.empty()) {
glNamedFramebufferDrawBuffers(_id, (GLsizei)_colorBuffers.size(), _colorBuffers.data());
} else {
glNamedFramebufferDrawBuffer(_id, GL_NONE);
}
// Now check for completness
_status = glCheckNamedFramebufferStatus(_id, GL_DRAW_FRAMEBUFFER);
// restore the current framebuffer
checkStatus(GL_DRAW_FRAMEBUFFER);
}
public:
GL45Framebuffer(const gpu::Framebuffer& framebuffer)
: Parent(framebuffer, allocate()) { }
};
gl::GLFramebuffer* GL45Backend::syncGPUObject(const Framebuffer& framebuffer) {
return gl::GLFramebuffer::sync<GL45Framebuffer>(framebuffer);
}
GLuint GL45Backend::getFramebufferID(const FramebufferPointer& framebuffer) {
return framebuffer ? gl::GLFramebuffer::getId<GL45Framebuffer>(*framebuffer) : 0;
}
void GL45Backend::do_blit(Batch& batch, size_t paramOffset) {
auto srcframebuffer = batch._framebuffers.get(batch._params[paramOffset]._uint);
Vec4i srcvp;
for (auto i = 0; i < 4; ++i) {
srcvp[i] = batch._params[paramOffset + 1 + i]._int;
}
auto dstframebuffer = batch._framebuffers.get(batch._params[paramOffset + 5]._uint);
Vec4i dstvp;
for (auto i = 0; i < 4; ++i) {
dstvp[i] = batch._params[paramOffset + 6 + i]._int;
}
// Assign dest framebuffer if not bound already
auto destFbo = getFramebufferID(dstframebuffer);
auto srcFbo = getFramebufferID(srcframebuffer);
glBlitNamedFramebuffer(srcFbo, destFbo,
srcvp.x, srcvp.y, srcvp.z, srcvp.w,
dstvp.x, dstvp.y, dstvp.z, dstvp.w,
GL_COLOR_BUFFER_BIT, GL_LINEAR);
(void) CHECK_GL_ERROR();
}
} }

View file

@ -0,0 +1,38 @@
//
// GL45BackendQuery.cpp
// libraries/gpu/src/gpu
//
// Created by Sam Gateau on 7/7/2015.
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "GL45Backend.h"
#include "../gl/GLQuery.h"
namespace gpu { namespace gl45 {
class GL45Query : public gpu::gl::GLQuery {
using Parent = gpu::gl::GLQuery;
public:
static GLuint allocateQuery() {
GLuint result;
glCreateQueries(GL_TIME_ELAPSED, 1, &result);
return result;
}
GL45Query(const Query& query)
: Parent(query, allocateQuery()) { }
};
gl::GLQuery* GL45Backend::syncGPUObject(const Query& query) {
return GL45Query::sync<GL45Query>(query);
}
GLuint GL45Backend::getQueryID(const QueryPointer& query) {
return GL45Query::getId<GL45Query>(query);
}
} }

View file

@ -0,0 +1,181 @@
//
// GL45BackendTexture.cpp
// libraries/gpu/src/gpu
//
// Created by Sam Gateau on 1/19/2015.
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "GL45Backend.h"
#include <unordered_set>
#include <unordered_map>
#include <QtCore/QThread>
#include "../gl/GLTexelFormat.h"
using namespace gpu;
using namespace gpu::gl45;
using GLTexelFormat = gl::GLTexelFormat;
using GL45Texture = GL45Backend::GL45Texture;
GLuint GL45Texture::allocate(const Texture& texture) {
Backend::incrementTextureGPUCount();
GLuint result;
glCreateTextures(getGLTextureType(texture), 1, &result);
return result;
}
GLuint GL45Backend::getTextureID(const TexturePointer& texture, bool transfer) {
return GL45Texture::getId<GL45Texture>(texture, transfer);
}
gl::GLTexture* GL45Backend::syncGPUObject(const TexturePointer& texture, bool transfer) {
return GL45Texture::sync<GL45Texture>(texture, transfer);
}
GL45Backend::GL45Texture::GL45Texture(const Texture& texture, bool transferrable)
: gl::GLTexture(texture, allocate(texture), transferrable) {}
GL45Backend::GL45Texture::GL45Texture(const Texture& texture, GLTexture* original)
: gl::GLTexture(texture, allocate(texture), original) {}
void GL45Backend::GL45Texture::withPreservedTexture(std::function<void()> f) const {
f();
}
void GL45Backend::GL45Texture::generateMips() const {
glGenerateTextureMipmap(_id);
(void)CHECK_GL_ERROR();
}
void GL45Backend::GL45Texture::allocateStorage() const {
gl::GLTexelFormat texelFormat = gl::GLTexelFormat::evalGLTexelFormat(_gpuObject.getTexelFormat());
glTextureParameteri(_id, GL_TEXTURE_BASE_LEVEL, 0);
glTextureParameteri(_id, GL_TEXTURE_MAX_LEVEL, _maxMip - _minMip);
if (_gpuObject.getTexelFormat().isCompressed()) {
qFatal("Compressed textures not yet supported");
}
// Get the dimensions, accounting for the downgrade level
Vec3u dimensions = _gpuObject.evalMipDimensions(_minMip);
glTextureStorage2D(_id, usedMipLevels(), texelFormat.internalFormat, dimensions.x, dimensions.y);
(void)CHECK_GL_ERROR();
}
void GL45Backend::GL45Texture::updateSize() const {
setSize(_virtualSize);
if (!_id) {
return;
}
if (_gpuObject.getTexelFormat().isCompressed()) {
qFatal("Compressed textures not yet supported");
}
}
// Move content bits from the CPU to the GPU for a given mip / face
void GL45Backend::GL45Texture::transferMip(uint16_t mipLevel, uint8_t face) const {
auto mip = _gpuObject.accessStoredMipFace(mipLevel, face);
gl::GLTexelFormat texelFormat = gl::GLTexelFormat::evalGLTexelFormat(_gpuObject.getTexelFormat(), mip->getFormat());
auto size = _gpuObject.evalMipDimensions(mipLevel);
if (GL_TEXTURE_2D == _target) {
glTextureSubImage2D(_id, mipLevel, 0, 0, size.x, size.y, texelFormat.format, texelFormat.type, mip->readData());
} else if (GL_TEXTURE_CUBE_MAP == _target) {
glTextureSubImage3D(_id, mipLevel, 0, 0, face, size.x, size.y, 1, texelFormat.format, texelFormat.type, mip->readData());
} else {
Q_ASSERT(false);
}
(void)CHECK_GL_ERROR();
}
// This should never happen on the main thread
// Move content bits from the CPU to the GPU
void GL45Backend::GL45Texture::transfer() const {
PROFILE_RANGE(__FUNCTION__);
//qDebug() << "Transferring texture: " << _privateTexture;
// Need to update the content of the GPU object from the source sysmem of the texture
if (_contentStamp >= _gpuObject.getDataStamp()) {
return;
}
if (_downsampleSource._texture) {
GLuint fbo { 0 };
glCreateFramebuffers(1, &fbo);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
// Find the distance between the old min mip and the new one
uint16 mipOffset = _minMip - _downsampleSource._minMip;
for (uint16 i = _minMip; i <= _maxMip; ++i) {
uint16 targetMip = i - _minMip;
uint16 sourceMip = targetMip + mipOffset;
Vec3u dimensions = _gpuObject.evalMipDimensions(i);
for (GLenum target : getFaceTargets(_target)) {
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, _downsampleSource._texture, sourceMip);
(void)CHECK_GL_ERROR();
glCopyTextureSubImage2D(_id, targetMip, 0, 0, 0, 0, dimensions.x, dimensions.y);
(void)CHECK_GL_ERROR();
}
}
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &fbo);
} else {
// GO through the process of allocating the correct storage and/or update the content
switch (_gpuObject.getType()) {
case Texture::TEX_2D:
{
for (uint16_t i = _minMip; i <= _maxMip; ++i) {
if (_gpuObject.isStoredMipFaceAvailable(i)) {
transferMip(i);
}
}
}
break;
case Texture::TEX_CUBE:
// transfer pixels from each faces
for (uint8_t f = 0; f < CUBE_NUM_FACES; f++) {
for (uint16_t i = 0; i < Sampler::MAX_MIP_LEVEL; ++i) {
if (_gpuObject.isStoredMipFaceAvailable(i, f)) {
transferMip(i, f);
}
}
}
break;
default:
qCWarning(gpugl45logging) << __FUNCTION__ << " case for Texture Type " << _gpuObject.getType() << " not supported";
break;
}
}
if (_gpuObject.isAutogenerateMips()) {
glGenerateTextureMipmap(_id);
(void)CHECK_GL_ERROR();
}
}
void GL45Backend::GL45Texture::syncSampler() const {
const Sampler& sampler = _gpuObject.getSampler();
const auto& fm = FILTER_MODES[sampler.getFilter()];
glTextureParameteri(_id, GL_TEXTURE_MIN_FILTER, fm.minFilter);
glTextureParameteri(_id, GL_TEXTURE_MAG_FILTER, fm.magFilter);
if (sampler.doComparison()) {
glTextureParameteri(_id, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glTextureParameteri(_id, GL_TEXTURE_COMPARE_FUNC, gl::COMPARISON_TO_GL[sampler.getComparisonFunction()]);
} else {
glTextureParameteri(_id, GL_TEXTURE_COMPARE_MODE, GL_NONE);
}
glTextureParameteri(_id, GL_TEXTURE_WRAP_S, WRAP_MODES[sampler.getWrapModeU()]);
glTextureParameteri(_id, GL_TEXTURE_WRAP_T, WRAP_MODES[sampler.getWrapModeV()]);
glTextureParameteri(_id, GL_TEXTURE_WRAP_R, WRAP_MODES[sampler.getWrapModeW()]);
glTextureParameterfv(_id, GL_TEXTURE_BORDER_COLOR, (const float*)&sampler.getBorderColor());
glTextureParameteri(_id, GL_TEXTURE_BASE_LEVEL, (uint16)sampler.getMipOffset());
glTextureParameterf(_id, GL_TEXTURE_MIN_LOD, (float)sampler.getMinMip());
glTextureParameterf(_id, GL_TEXTURE_MAX_LOD, (sampler.getMaxMip() == Sampler::MAX_MIP_LEVEL ? 1000.f : sampler.getMaxMip()));
glTextureParameterf(_id, GL_TEXTURE_MAX_ANISOTROPY_EXT, sampler.getMaxAnisotropy());
}

View file

@ -0,0 +1,71 @@
//
// GL45BackendTransform.cpp
// libraries/gpu/src/gpu
//
// Created by Sam Gateau on 3/8/2015.
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "GL45Backend.h"
using namespace gpu;
using namespace gpu::gl45;
void GL45Backend::initTransform() {
GLuint transformBuffers[3];
glCreateBuffers(3, transformBuffers);
_transform._objectBuffer = transformBuffers[0];
_transform._cameraBuffer = transformBuffers[1];
_transform._drawCallInfoBuffer = transformBuffers[2];
glCreateTextures(GL_TEXTURE_BUFFER, 1, &_transform._objectBufferTexture);
size_t cameraSize = sizeof(TransformStageState::CameraBufferElement);
while (_transform._cameraUboSize < cameraSize) {
_transform._cameraUboSize += _uboAlignment;
}
}
void GL45Backend::transferTransformState(const Batch& batch) const {
// FIXME not thread safe
static std::vector<uint8_t> bufferData;
if (!_transform._cameras.empty()) {
bufferData.resize(_transform._cameraUboSize * _transform._cameras.size());
for (size_t i = 0; i < _transform._cameras.size(); ++i) {
memcpy(bufferData.data() + (_transform._cameraUboSize * i), &_transform._cameras[i], sizeof(TransformStageState::CameraBufferElement));
}
glNamedBufferData(_transform._cameraBuffer, bufferData.size(), bufferData.data(), GL_STREAM_DRAW);
}
if (!batch._objects.empty()) {
auto byteSize = batch._objects.size() * sizeof(Batch::TransformObject);
bufferData.resize(byteSize);
memcpy(bufferData.data(), batch._objects.data(), byteSize);
glNamedBufferData(_transform._objectBuffer, bufferData.size(), bufferData.data(), GL_STREAM_DRAW);
}
if (!batch._namedData.empty()) {
bufferData.clear();
for (auto& data : batch._namedData) {
auto currentSize = bufferData.size();
auto bytesToCopy = data.second.drawCallInfos.size() * sizeof(Batch::DrawCallInfo);
bufferData.resize(currentSize + bytesToCopy);
memcpy(bufferData.data() + currentSize, data.second.drawCallInfos.data(), bytesToCopy);
_transform._drawCallInfoOffsets[data.first] = (GLvoid*)currentSize;
}
glNamedBufferData(_transform._drawCallInfoBuffer, bufferData.size(), bufferData.data(), GL_STREAM_DRAW);
}
#ifdef GPU_SSBO_DRAW_CALL_INFO
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, TRANSFORM_OBJECT_SLOT, _transform._objectBuffer);
#else
glTextureBuffer(_transform._objectBufferTexture, GL_RGBA32F, _transform._objectBuffer);
glActiveTexture(GL_TEXTURE0 + TRANSFORM_OBJECT_SLOT);
glBindTexture(GL_TEXTURE_BUFFER, _transform._objectBufferTexture);
#endif
CHECK_GL_ERROR();
// Make sure the current Camera offset is unknown before render Draw
_transform._currentCameraOffset = INVALID_OFFSET;
}

View file

@ -0,0 +1,54 @@
//
// Created by Bradley Austin Davis on 2016/05/16
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#ifndef hifi_gpu_Null_Backend_h
#define hifi_gpu_Null_Backend_h
#include <assert.h>
#include <functional>
#include <bitset>
#include <queue>
#include <utility>
#include <list>
#include <array>
#include <QtCore/QLoggingCategory>
#include "../Context.h"
namespace gpu { namespace null {
class Backend : public gpu::Backend {
using Parent = gpu::Backend;
// Context Backend static interface required
friend class gpu::Context;
static void init() {}
static gpu::Backend* createBackend() { return new Backend(); }
static bool makeProgram(Shader& shader, const Shader::BindingSet& slotBindings) { return true; }
protected:
explicit Backend(bool syncCache) : Parent() { }
Backend() : Parent() { }
public:
~Backend() { }
void render(Batch& batch) final { }
// This call synchronize the Full Backend cache with the current GLState
// THis is only intended to be used when mixing raw gl calls with the gpu api usage in order to sync
// the gpu::Backend state with the true gl state which has probably been messed up by these ugly naked gl calls
// Let's try to avoid to do that as much as possible!
void syncCache() final { }
// This is the ugly "download the pixels to sysmem for taking a snapshot"
// Just avoid using it, it's ugly and will break performances
virtual void downloadFramebuffer(const FramebufferPointer& srcFramebuffer, const Vec4i& region, QImage& destImage) final { }
};
} }
#endif

View file

@ -220,12 +220,8 @@ void AccountManager::sendRequest(const QString& path,
networkRequest.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
// if we're allowed to send usage data, include whatever the current session ID is with this request
auto& activityLogger = UserActivityLogger::getInstance();
if (activityLogger.isEnabled()) {
networkRequest.setRawHeader(METAVERSE_SESSION_ID_HEADER,
uuidStringWithoutCurlyBraces(_sessionID).toLocal8Bit());
}
networkRequest.setRawHeader(METAVERSE_SESSION_ID_HEADER,
uuidStringWithoutCurlyBraces(_sessionID).toLocal8Bit());
QUrl requestURL = _authURL;

View file

@ -117,7 +117,6 @@ void DomainHandler::hardReset() {
_hostname = QString();
_sockAddr.clear();
_hasSignalledProtocolMismatch = false;
_domainConnectionRefusals.clear();
_hasCheckedForAccessToken = false;
@ -407,25 +406,9 @@ void DomainHandler::processDomainServerConnectionDeniedPacket(QSharedPointer<Rec
// and check and signal for an access token so that we can make sure they are logged in
qCWarning(networking) << "The domain-server denied a connection request: " << reasonMessage;
if (!_domainConnectionRefusals.contains(reasonCode)) {
_domainConnectionRefusals.append(reasonCode);
bool shouldSignal = true;
// only signal once for a protocol mismatch, even between soft resets that will reset the _domainConnectionRefusals
if (reasonCode == ConnectionRefusedReason::ProtocolMismatch) {
if (_hasSignalledProtocolMismatch) {
shouldSignal = false;
} else {
_hasSignalledProtocolMismatch = true;
}
}
if (shouldSignal) {
emit domainConnectionRefused(reasonMessage, (int)reasonCode);
}
if (!_domainConnectionRefusals.contains(reasonMessage)) {
_domainConnectionRefusals.insert(reasonMessage);
emit domainConnectionRefused(reasonMessage, (int)reasonCode);
}
auto accountManager = DependencyManager::get<AccountManager>();

View file

@ -144,8 +144,7 @@ private:
QString _pendingPath;
QTimer _settingsTimer;
QList<ConnectionRefusedReason> _domainConnectionRefusals;
bool _hasSignalledProtocolMismatch { false };
QSet<QString> _domainConnectionRefusals;
bool _hasCheckedForAccessToken { false };
int _connectionDenialsSinceKeypairRegen { 0 };

View file

@ -218,10 +218,12 @@ void PhysicalEntitySimulation::getObjectsToAddToPhysics(VectorOfMotionStates& re
ShapeInfo shapeInfo;
entity->computeShapeInfo(shapeInfo);
int numPoints = shapeInfo.getLargestSubshapePointCount();
if (numPoints > MAX_HULL_POINTS) {
qWarning() << "convex hull with" << numPoints
<< "points for entity" << entity->getName()
<< "at" << entity->getPosition() << " will be reduced";
if (shapeInfo.getType() == SHAPE_TYPE_COMPOUND) {
if (numPoints > MAX_HULL_POINTS) {
qWarning() << "convex hull with" << numPoints
<< "points for entity" << entity->getName()
<< "at" << entity->getPosition() << " will be reduced";
}
}
btCollisionShape* shape = ObjectMotionState::getShapeManager()->getShape(shapeInfo);
if (shape) {

View file

@ -309,6 +309,7 @@ gpu::Stream::FormatPointer& getInstancedSolidStreamFormat() {
}
render::ShapePipelinePointer GeometryCache::_simplePipeline;
render::ShapePipelinePointer GeometryCache::_simpleWirePipeline;
GeometryCache::GeometryCache() :
_nextID(0)
@ -324,6 +325,10 @@ GeometryCache::GeometryCache() :
DependencyManager::get<TextureCache>()->getNormalFittingTexture());
}
);
GeometryCache::_simpleWirePipeline =
std::make_shared<render::ShapePipeline>(getSimplePipeline(false, false, true, true), nullptr,
[](const render::ShapePipeline&, gpu::Batch& batch) { }
);
}
GeometryCache::~GeometryCache() {

View file

@ -157,7 +157,8 @@ public:
gpu::PipelinePointer getSimplePipeline(bool textured = false, bool culled = true,
bool unlit = false, bool depthBias = false);
render::ShapePipelinePointer getShapePipeline() { return GeometryCache::_simplePipeline; }
render::ShapePipelinePointer getWireShapePipeline() { return GeometryCache::_simpleWirePipeline; }
// Static (instanced) geometry
void renderShapeInstances(gpu::Batch& batch, Shape shape, size_t count, gpu::BufferPointer& colorBuffer);
void renderWireShapeInstances(gpu::Batch& batch, Shape shape, size_t count, gpu::BufferPointer& colorBuffer);
@ -179,7 +180,7 @@ public:
void renderWireSphereInstance(gpu::Batch& batch, const glm::vec4& color,
const render::ShapePipelinePointer& pipeline = _simplePipeline);
void renderWireSphereInstance(gpu::Batch& batch, const glm::vec3& color,
const render::ShapePipelinePointer& pipeline = _simplePipeline) {
const render::ShapePipelinePointer& pipeline = _simpleWirePipeline) {
renderWireSphereInstance(batch, glm::vec4(color, 1.0f), pipeline);
}
@ -193,7 +194,7 @@ public:
void renderWireCubeInstance(gpu::Batch& batch, const glm::vec4& color,
const render::ShapePipelinePointer& pipeline = _simplePipeline);
void renderWireCubeInstance(gpu::Batch& batch, const glm::vec3& color,
const render::ShapePipelinePointer& pipeline = _simplePipeline) {
const render::ShapePipelinePointer& pipeline = _simpleWirePipeline) {
renderWireCubeInstance(batch, glm::vec4(color, 1.0f), pipeline);
}
@ -401,6 +402,7 @@ private:
gpu::ShaderPointer _simpleShader;
gpu::ShaderPointer _unlitShader;
static render::ShapePipelinePointer _simplePipeline;
static render::ShapePipelinePointer _simpleWirePipeline;
QHash<SimpleProgramKey, gpu::PipelinePointer> _simplePrograms;
};

View file

@ -466,6 +466,12 @@ glm::mat4 createMatFromScaleQuatAndPos(const glm::vec3& scale, const glm::quat&
glm::vec4(zAxis, 0.0f), glm::vec4(trans, 1.0f));
}
// cancel out roll
glm::quat cancelOutRoll(const glm::quat& q) {
glm::vec3 forward = q * Vectors::FRONT;
return glm::quat_cast(glm::inverse(glm::lookAt(Vectors::ZERO, forward, Vectors::UP)));
}
// cancel out roll and pitch
glm::quat cancelOutRollAndPitch(const glm::quat& q) {
glm::vec3 zAxis = q * glm::vec3(0.0f, 0.0f, 1.0f);

View file

@ -221,6 +221,7 @@ glm::detail::tvec4<T, P> lerp(const glm::detail::tvec4<T, P>& x, const glm::deta
glm::mat4 createMatFromQuatAndPos(const glm::quat& q, const glm::vec3& p);
glm::mat4 createMatFromScaleQuatAndPos(const glm::vec3& scale, const glm::quat& rot, const glm::vec3& trans);
glm::quat cancelOutRoll(const glm::quat& q);
glm::quat cancelOutRollAndPitch(const glm::quat& q);
glm::mat4 cancelOutRollAndPitch(const glm::mat4& m);
glm::vec3 transformPoint(const glm::mat4& m, const glm::vec3& p);

View file

@ -123,6 +123,7 @@ void QmlWindowClass::initQml(QVariantMap properties) {
// Forward messages received from QML on to the script
connect(_qmlWindow, SIGNAL(sendToScript(QVariant)), this, SLOT(qmlToScript(const QVariant&)), Qt::QueuedConnection);
connect(_qmlWindow, SIGNAL(visibleChanged()), this, SIGNAL(visibleChanged()), Qt::QueuedConnection);
});
}
Q_ASSERT(_qmlWindow);

View file

@ -24,7 +24,7 @@ class QmlWindowClass : public QObject {
Q_OBJECT
Q_PROPERTY(glm::vec2 position READ getPosition WRITE setPosition NOTIFY positionChanged)
Q_PROPERTY(glm::vec2 size READ getSize WRITE setSize NOTIFY sizeChanged)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibilityChanged)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged)
public:
static QScriptValue constructor(QScriptContext* context, QScriptEngine* engine);
@ -52,7 +52,7 @@ public slots:
void sendToQml(const QVariant& message);
signals:
void visibilityChanged(bool visible); // Tool window
void visibleChanged();
void positionChanged();
void sizeChanged();
void moved(glm::vec2 position);

View file

@ -77,6 +77,7 @@ bool SixenseManager::activate() {
InputPlugin::activate();
#ifdef HAVE_SIXENSE
#if !defined(Q_OS_LINUX)
_container->addMenu(MENU_PATH);
_container->addMenuItem(PluginType::INPUT_PLUGIN, MENU_PATH, TOGGLE_SMOOTH,
[this] (bool clicked) { setSixenseFilter(clicked); },
@ -89,6 +90,7 @@ bool SixenseManager::activate() {
_container->addMenuItem(PluginType::INPUT_PLUGIN, MENU_PATH, SHOW_DEBUG_CALIBRATED,
[this] (bool clicked) { _inputDevice->setDebugDrawCalibrated(clicked); },
true, false);
#endif
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
userInputMapper->registerDevice(_inputDevice);
@ -106,8 +108,10 @@ void SixenseManager::deactivate() {
InputPlugin::deactivate();
#ifdef HAVE_SIXENSE
#if !defined(Q_OS_LINUX)
_container->removeMenuItem(MENU_NAME, TOGGLE_SMOOTH);
_container->removeMenu(MENU_PATH);
#endif
_inputDevice->_poseStateMap.clear();

View file

@ -268,6 +268,7 @@ void handleOpenVrEvents() {
case vr::VREvent_KeyboardClosed:
_keyboardFocusObject = nullptr;
_keyboardShown = false;
DependencyManager::get<OffscreenUi>()->unfocusWindows();
break;
default:

View file

@ -125,7 +125,6 @@ Rectangle {
TextField {
id: addressLine
focus: true
anchors {
left: parent.left; right: parent.right;
top: row.bottom; margins: 16;

View file

@ -1,194 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 150" style="enable-background:new 0 0 50 150;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.9;}
.st1{fill:#1E1E1E;}
.st2{fill:#FFFFFF;}
.st3{fill:#EAEAEA;}
.st4{opacity:0.47;}
.st5{opacity:0.47;enable-background:new ;}
</style>
<g class="st0">
<path class="st1" d="M50,96c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V54c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96z"/>
</g>
<g class="st0">
<path class="st2" d="M50,46c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46z"/>
</g>
<g>
<path d="M15.9,41.3c-0.5,0.5-1.1,0.8-1.7,0.8c-0.4,0-0.8-0.1-1.2-0.3s-0.7-0.4-0.9-0.7c-0.3-0.3-0.5-0.7-0.6-1s-0.2-0.8-0.2-1.2
s0.1-0.9,0.2-1.2c0.2-0.4,0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1
l-0.9,0.7c-0.2-0.3-0.4-0.6-0.6-0.7s-0.6-0.3-0.9-0.3c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.3-0.5,0.5c-0.2,0.2-0.3,0.4-0.4,0.7
c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7s0.4,0.3,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.6,0,1.1-0.3,1.6-0.9
v-0.5h-1.3v-0.9H17V42h-1v-0.7H15.9z"/>
<path d="M20.9,42.1c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7s-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2s0.1-0.8,0.2-1.2s0.4-0.7,0.6-1
c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S21.3,42.1,20.9,42.1z M19.1,38.9c0,0.3,0,0.5,0.1,0.8
s0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7
s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2
s-0.4,0.3-0.6,0.5s-0.3,0.4-0.3,0.7C19.1,38.3,19.1,38.6,19.1,38.9z"/>
<path d="M32,36.7h-2V42h-1.2v-5.3h-2v-1.1H32V36.7z"/>
<path d="M35.5,42.1c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7s-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2s0.1-0.8,0.2-1.2s0.4-0.7,0.6-1
c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S35.9,42.1,35.5,42.1z M33.7,38.9c0,0.3,0,0.5,0.1,0.8
s0.2,0.5,0.4,0.7s0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8
s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7s-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5
c-0.2,0.2-0.3,0.4-0.3,0.7C33.7,38.3,33.7,38.6,33.7,38.9z"/>
</g>
<g>
<path class="st3" d="M15.9,91.3c-0.5,0.5-1.1,0.8-1.7,0.8c-0.4,0-0.8-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-0.9-0.7c-0.3-0.3-0.5-0.7-0.6-1
s-0.2-0.8-0.2-1.2c0-0.4,0.1-0.9,0.2-1.2c0.2-0.4,0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.6,0,1.1,0.1,1.5,0.4
c0.4,0.3,0.7,0.6,0.9,1l-0.9,0.7c-0.2-0.3-0.4-0.6-0.6-0.7s-0.6-0.3-0.9-0.3c-0.3,0-0.5,0.1-0.7,0.2s-0.4,0.3-0.5,0.5
c-0.2,0.2-0.3,0.4-0.4,0.7c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7s0.4,0.3,0.6,0.5
c0.2,0.1,0.5,0.2,0.7,0.2c0.6,0,1.1-0.3,1.6-0.9v-0.5h-1.3v-0.9H17V92h-1v-0.7H15.9z"/>
<path class="st3" d="M20.9,92.1c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7
c0.3,0.3,0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2c0,0.4-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7
C21.7,92,21.3,92.1,20.9,92.1z M19.1,88.9c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2
s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7
c-0.2-0.2-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5s-0.3,0.4-0.3,0.7
C19.1,88.3,19.1,88.6,19.1,88.9z"/>
<path class="st3" d="M32,86.7h-2V92h-1.2v-5.3h-2v-1.1H32V86.7z"/>
<path class="st3" d="M35.5,92.1c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7
c0.3,0.3,0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2c0,0.4-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7
C36.3,92,35.9,92.1,35.5,92.1z M33.7,88.9c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7s0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2
s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7s-0.3-0.4-0.6-0.5
c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7C33.7,88.3,33.7,88.6,33.7,88.9z"/>
</g>
<g class="st4">
<path class="st1" d="M50,146c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146z"/>
</g>
<g class="st4">
<path class="st3" d="M15.9,141.3c-0.5,0.5-1.1,0.8-1.7,0.8c-0.4,0-0.8-0.1-1.2-0.3s-0.7-0.4-0.9-0.7c-0.3-0.3-0.5-0.7-0.6-1
s-0.2-0.8-0.2-1.2s0.1-0.9,0.2-1.2c0.2-0.4,0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.6,0,1.1,0.1,1.5,0.4
c0.4,0.3,0.7,0.6,0.9,1l-0.9,0.7c-0.2-0.3-0.4-0.6-0.6-0.7s-0.6-0.3-0.9-0.3c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.3-0.5,0.5
c-0.2,0.2-0.3,0.4-0.4,0.7c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7s0.4,0.3,0.6,0.5
c0.2,0.1,0.5,0.2,0.7,0.2c0.6,0,1.1-0.3,1.6-0.9v-0.5h-1.3v-0.9H17v3.3h-1v-0.9H15.9z"/>
<path class="st3" d="M20.9,142.1c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7s-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2s0.1-0.8,0.2-1.2
s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S21.3,142.1,20.9,142.1z M19.1,138.9c0,0.3,0,0.5,0.1,0.8
s0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7
s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2
s-0.4,0.3-0.6,0.5s-0.3,0.4-0.3,0.7C19.1,138.3,19.1,138.6,19.1,138.9z"/>
<path class="st3" d="M32,136.7h-2v5.3h-1.2v-5.3h-2v-1.1H32V136.7z"/>
<path class="st3" d="M35.5,142.1c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7s-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2s0.1-0.8,0.2-1.2
s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S35.9,142.1,35.5,142.1z M33.7,138.9c0,0.3,0,0.5,0.1,0.8
s0.2,0.5,0.4,0.7s0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8
s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7s-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5
c-0.2,0.2-0.3,0.4-0.3,0.7C33.7,138.3,33.7,138.6,33.7,138.9z"/>
</g>
<g>
<g>
<path d="M17.2,28.2c2,2.1,4.8,3.2,7.8,3.2h0.1c2.9,0,5.7-1.1,7.7-3.1c2-2,3.1-4.7,3.2-7.5c0-3-1-5.8-3.1-7.9
c-0.6-0.6-1.3-1.2-2-1.6c-0.2,0.5-0.4,1-0.7,1.5c0.3,0.2,0.7,0.5,1,0.8c1,1,1.9,2.1,2.2,3l0,0.1c0,0.1,0,0.2-0.1,0.2l0,0
c-0.8,0.4-1.6,0.6-2.5,0.8c-0.2,0-0.3,0.1-0.5,0.1l-0.1,0c0,0-0.1,0-0.1,0s-0.1-0.1-0.1-0.1l0-0.1c-0.2-1-0.4-2-0.8-3l-0.5,1
c0.2,0.7,0.4,1.4,0.5,2.1l0,0.1c0,0,0,0.1,0,0.1c0,0-0.1,0.1-0.1,0.1l-0.1,0l-3.6,0.2l-0.2,0c0,0-0.1,0-0.1,0c0,0,0-0.1,0-0.1
v-4.9c-0.3-0.6-0.5-1.1-0.7-1.7c0,0,0,0,0,0l0,0v6.4c0,0,0,0.1,0,0.1c0,0.1-0.1,0.2-0.2,0.2l0,0c0,0-0.1,0-0.1,0l-3.4-0.2
c-0.1,0-0.1,0-0.1-0.1s0-0.1,0-0.2l0-0.1c0.4-1.8,0.9-3.8,2.3-5.5c0.4-0.4,0.8-0.9,1.3-1c0,0,0.1,0,0.1,0c-0.2-0.5-0.4-1-0.6-1.5
c-2.5,0.3-4.7,1.3-6.5,3.1c-2,2-3.1,4.6-3.2,7.5C14,23.3,15.1,26.1,17.2,28.2z M30.2,23.4c0-0.2,0-0.4,0-0.6v0
c0-0.5,0.1-0.9,0.1-1.4c0-0.6,0-1.2,0-1.8c0-0.2,0-0.4,0-0.6v0c0-0.1,0-0.4,0.4-0.5c0.7-0.2,1.5-0.3,2.2-0.5l0.1,0
c0.3-0.1,0.5-0.1,0.8-0.2l0.1,0c0.1,0,0.2,0,0.2,0.1l0,0.1c0,0,0,0.1,0,0.1c0,0.2,0.1,0.3,0.1,0.5c0.2,0.9,0.3,1.8,0.2,2.7
c-0.1,0.8-0.5,1.4-1.1,1.6c-0.5,0.2-1.1,0.4-1.7,0.5c-0.2,0.1-0.4,0.1-0.7,0.2c-0.1,0-0.2,0-0.3,0.1c0,0-0.1,0-0.1,0l-0.1,0
c0,0,0,0,0,0c0,0-0.1,0-0.1,0C30.2,23.6,30.2,23.5,30.2,23.4L30.2,23.4z M30.3,24.5c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3
c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2l0,0.1c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1l-0.1,0c0,0,0,0-0.1,0
c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.1-0.2l0-0.1c0,0,0,0,0,0c0,0,0-0.1,0.1-0.2c0.4-0.6,1-1.6,1.5-3.7C29.9,24.8,30,24.6,30.3,24.5
z M25.2,19c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1c0,0,0,0,0.1,0l0,0c0,0,0.1,0,0.1,0l0.1,0c0.1,0,0.1,0.1,0.1,0.2
c0,0.1,0,0.2,0,0.4c0,0.1,0,0.3,0,0.4V20c0,0.5,0,1,0,1.4l0,0.2c0,0.4,0,0.8-0.1,1.1c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3
c0,0.1,0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2l-0.2,0c-0.2,0-0.5,0-0.8,0.1c-0.4,0-0.5,0.1-0.6,0.1c0,0-0.1,0-0.1,0l-0.2-0.1
c-0.1,0-0.1-0.1-0.1-0.2L25.2,19L25.2,19z M25.2,25.1c0-0.1,0.1-0.2,0.2-0.2l0.2,0l3.4-0.2c0,0,0.1,0,0.1,0.1c0,0,0.1,0.1,0,0.1
l0,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1l0,0.1c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.1,0.3-0.2,0.4l-0.1,0.2
c-0.2,0.6-0.5,1.2-0.7,1.8c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6l-0.2,0l0,0c0,0-0.1,0-0.1-0.1s0-0.1,0-0.1
L25.2,25.1L25.2,25.1z M21.7,29c0,0-0.1,0.1-0.1,0.1c0,0,0,0,0,0L21.4,29l0,0c-1.8-0.4-4.2-2.6-5.1-5.2l0-0.1c0-0.1,0-0.1,0-0.2
c0,0,0.1-0.1,0.2,0l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1
C21.8,28.9,21.8,29,21.7,29z M24.4,29.6c0,0.1-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8
c-1-1.3-1.5-2.7-1.9-4c0,0,0,0,0,0l0-0.1c0-0.1,0-0.1,0-0.1c0,0,0.1-0.1,0.1-0.1l0.1,0l1.9,0.1l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2
L24.4,29.6L24.4,29.6z M23,18.8l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0,0,0s-0.9-0.1-1.4-0.1
c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5s0-0.1,0.1-0.1s0.1-0.1,0.1,0L23,18.8
z M16.6,16.7L16.6,16.7c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1c0,0.1,0,0.1,0,0.2l-0.1,0.2c-1.2,1.6-1.7,3.5-2,5.3
l0,0.1c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0l-0.1,0c-0.4-0.1-0.7-0.2-1.1-0.3c-0.6-0.1-1.2-0.3-1.8-0.5l-0.1,0
C16.6,16.8,16.5,16.7,16.6,16.7z M16,17.9L16,17.9c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7
c0,0.1,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0,0,0l-0.1,0c0,0-0.1,0-0.1,0h0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1
c-0.4-0.3-0.6-0.6-0.6-1C15.6,20.1,15.7,18.9,16,17.9z"/>
</g>
<path d="M27.7,15.1c-0.5-1-0.9-2-1.4-3c-0.5-1.1-1.1-2.3-1.6-3.4c-0.9-2,0.2-4.3,2.4-4.7C29,3.6,30.8,5,31,6.8
c0.1,0.6,0,1.2-0.3,1.7c-1,2.1-2,4.3-2.9,6.4C27.8,15,27.8,15,27.7,15.1z M29.5,7.4c0-1-0.8-1.8-1.8-1.8c-1,0-1.8,0.8-1.8,1.8
c0,1,0.8,1.8,1.8,1.8C28.7,9.2,29.5,8.4,29.5,7.4z"/>
</g>
<g>
<g>
<path class="st3" d="M17.2,78.3c2,2.1,4.8,3.2,7.8,3.2h0.1c2.9,0,5.7-1.1,7.7-3.1c2-2,3.1-4.7,3.2-7.5c0-3-1-5.8-3.1-7.9
c-0.6-0.6-1.3-1.2-2-1.6c-0.2,0.5-0.4,1-0.7,1.5c0.3,0.2,0.7,0.5,1,0.8c1,1,1.9,2.1,2.2,3l0,0.1c0,0.1,0,0.2-0.1,0.2l0,0
c-0.8,0.4-1.6,0.6-2.5,0.8c-0.2,0-0.3,0.1-0.5,0.1l-0.1,0c0,0-0.1,0-0.1,0s-0.1-0.1-0.1-0.1l0-0.1c-0.2-1-0.4-2-0.8-3l-0.5,1
c0.2,0.7,0.4,1.4,0.5,2.1l0,0.1c0,0,0,0.1,0,0.1c0,0-0.1,0.1-0.1,0.1l-0.1,0l-3.6,0.2l-0.2,0c0,0-0.1,0-0.1,0c0,0,0-0.1,0-0.1
v-4.9c-0.3-0.6-0.5-1.1-0.7-1.7c0,0,0,0,0,0l0,0V68c0,0,0,0.1,0,0.1c0,0.1-0.1,0.2-0.2,0.2l0,0c0,0-0.1,0-0.1,0l-3.4-0.2
c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.2l0-0.1c0.4-1.8,0.9-3.8,2.3-5.5c0.4-0.4,0.8-0.9,1.3-1c0,0,0.1,0,0.1,0
c-0.2-0.5-0.4-1-0.6-1.5c-2.5,0.3-4.7,1.3-6.5,3.1c-2,2-3.1,4.6-3.2,7.5C14,73.4,15.1,76.2,17.2,78.3z M30.2,73.5
c0-0.2,0-0.4,0-0.6v0c0-0.5,0.1-0.9,0.1-1.4c0-0.6,0-1.2,0-1.8c0-0.2,0-0.4,0-0.6v0c0-0.1,0-0.4,0.4-0.5c0.7-0.2,1.5-0.3,2.2-0.5
l0.1,0c0.3-0.1,0.5-0.1,0.8-0.2l0.1,0c0.1,0,0.2,0,0.2,0.1l0,0.1c0,0,0,0.1,0,0.1c0,0.2,0.1,0.3,0.1,0.5c0.2,0.9,0.3,1.8,0.2,2.7
c-0.1,0.8-0.5,1.4-1.1,1.6c-0.5,0.2-1.1,0.4-1.7,0.5c-0.2,0.1-0.4,0.1-0.7,0.2c-0.1,0-0.2,0-0.3,0.1c0,0-0.1,0-0.1,0l-0.1,0
c0,0,0,0,0,0c0,0-0.1,0-0.1,0C30.2,73.7,30.2,73.7,30.2,73.5L30.2,73.5z M30.3,74.7c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3
c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2l0,0.1c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1l-0.1,0c0,0,0,0-0.1,0
c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.1-0.2l0-0.1c0,0,0,0,0,0c0,0,0-0.1,0.1-0.2c0.4-0.6,1-1.6,1.5-3.7C29.9,74.9,30,74.7,30.3,74.7
z M25.2,69.2c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1c0,0,0,0,0.1,0l0,0c0,0,0.1,0,0.1,0l0.1,0c0.1,0,0.1,0.1,0.1,0.2
c0,0.1,0,0.2,0,0.4c0,0.1,0,0.3,0,0.4v0.3c0,0.5,0,1,0,1.4l0,0.2c0,0.4,0,0.8-0.1,1.1c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3
c0,0.1,0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2l-0.2,0c-0.2,0-0.5,0-0.8,0.1c-0.4,0-0.5,0.1-0.6,0.1c0,0-0.1,0-0.1,0l-0.2-0.1
c-0.1,0-0.1-0.1-0.1-0.2L25.2,69.2L25.2,69.2z M25.2,75.3c0-0.1,0.1-0.2,0.2-0.2l0.2,0l3.4-0.2c0,0,0.1,0,0.1,0.1
c0,0,0.1,0.1,0,0.1l0,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1l0,0.1c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.1,0.3-0.2,0.4
l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6l-0.2,0l0,0c0,0-0.1,0-0.1-0.1
c0,0,0-0.1,0-0.1L25.2,75.3L25.2,75.3z M21.7,79.2c0,0-0.1,0.1-0.1,0.1c0,0,0,0,0,0l-0.2-0.1l0,0c-1.8-0.4-4.2-2.6-5.1-5.2l0-0.1
c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1
C21.8,79.1,21.8,79.1,21.7,79.2z M24.4,79.8c0,0.1-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8
c-1-1.3-1.5-2.7-1.9-4c0,0,0,0,0,0l0-0.1c0-0.1,0-0.1,0-0.1c0,0,0.1-0.1,0.1-0.1l0.1,0L23,75l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2
L24.4,79.8L24.4,79.8z M23,69l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0,0,0s-0.9-0.1-1.4-0.1
c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5s0-0.1,0.1-0.1c0,0,0.1-0.1,0.1,0
L23,69z M16.6,66.8L16.6,66.8c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1c0,0.1,0,0.1,0,0.2l-0.1,0.2
c-1.2,1.6-1.7,3.5-2,5.3l0,0.1c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0l-0.1,0c-0.4-0.1-0.7-0.2-1.1-0.3
c-0.6-0.1-1.2-0.3-1.8-0.5l-0.1,0C16.6,67,16.5,66.9,16.6,66.8z M16,68L16,68c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8
c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7c0,0.1,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0,0,0l-0.1,0c0,0-0.1,0-0.1,0h0
c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1C15.6,70.3,15.7,69.1,16,68z"/>
</g>
<path class="st3" d="M27.7,65.2c-0.5-1-0.9-2-1.4-3c-0.5-1.1-1.1-2.3-1.6-3.4c-0.9-2,0.2-4.3,2.4-4.7c1.8-0.3,3.7,1,3.8,2.9
c0.1,0.6,0,1.2-0.3,1.7c-1,2.1-2,4.3-2.9,6.4C27.8,65.1,27.8,65.2,27.7,65.2z M29.5,57.5c0-1-0.8-1.8-1.8-1.8c-1,0-1.8,0.8-1.8,1.8
c0,1,0.8,1.8,1.8,1.8C28.7,59.3,29.5,58.5,29.5,57.5z"/>
</g>
<g class="st5">
<g>
<path class="st3" d="M17.2,127.4c2,2.1,4.8,3.2,7.8,3.2h0.1c2.9,0,5.7-1.1,7.7-3.1c2-2,3.1-4.7,3.2-7.5c0-3-1-5.8-3.1-7.9
c-0.6-0.6-1.3-1.2-2-1.6c-0.2,0.5-0.4,1-0.7,1.5c0.3,0.2,0.7,0.5,1,0.8c1,1,1.9,2.1,2.2,3l0,0.1c0,0.1,0,0.2-0.1,0.2l0,0
c-0.8,0.4-1.6,0.6-2.5,0.8c-0.2,0-0.3,0.1-0.5,0.1l-0.1,0c0,0-0.1,0-0.1,0s-0.1-0.1-0.1-0.1l0-0.1c-0.2-1-0.4-2-0.8-3l-0.5,1
c0.2,0.7,0.4,1.4,0.5,2.1l0,0.1c0,0,0,0.1,0,0.1c0,0-0.1,0.1-0.1,0.1l-0.1,0l-3.6,0.2l-0.2,0c0,0-0.1,0-0.1,0c0,0,0-0.1,0-0.1
v-4.9c-0.3-0.6-0.5-1.1-0.7-1.7c0,0,0,0,0,0l0,0v6.4c0,0,0,0.1,0,0.1c0,0.1-0.1,0.2-0.2,0.2l0,0c0,0-0.1,0-0.1,0l-3.4-0.2
c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.2l0-0.1c0.4-1.8,0.9-3.8,2.3-5.5c0.4-0.4,0.8-0.9,1.3-1c0,0,0.1,0,0.1,0
c-0.2-0.5-0.4-1-0.6-1.5c-2.5,0.3-4.7,1.3-6.5,3.1c-2,2-3.1,4.6-3.2,7.5C14,122.5,15.1,125.3,17.2,127.4z M30.2,122.6
c0-0.2,0-0.4,0-0.6v0c0-0.5,0.1-0.9,0.1-1.4c0-0.6,0-1.2,0-1.8c0-0.2,0-0.4,0-0.6v0c0-0.1,0-0.4,0.4-0.5c0.7-0.2,1.5-0.3,2.2-0.5
l0.1,0c0.3-0.1,0.5-0.1,0.8-0.2l0.1,0c0.1,0,0.2,0,0.2,0.1l0,0.1c0,0,0,0.1,0,0.1c0,0.2,0.1,0.3,0.1,0.5c0.2,0.9,0.3,1.8,0.2,2.7
c-0.1,0.8-0.5,1.4-1.1,1.6c-0.5,0.2-1.1,0.4-1.7,0.5c-0.2,0.1-0.4,0.1-0.7,0.2c-0.1,0-0.2,0-0.3,0.1c0,0-0.1,0-0.1,0l-0.1,0
c0,0,0,0,0,0c0,0-0.1,0-0.1,0C30.2,122.8,30.2,122.8,30.2,122.6L30.2,122.6z M30.3,123.7c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3
c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2l0,0.1c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1l-0.1,0c0,0,0,0-0.1,0
c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.1-0.2l0-0.1c0,0,0,0,0,0c0,0,0-0.1,0.1-0.2c0.4-0.6,1-1.6,1.5-3.7
C29.9,124,30,123.8,30.3,123.7z M25.2,118.3c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1c0,0,0,0,0.1,0l0,0c0,0,0.1,0,0.1,0l0.1,0
c0.1,0,0.1,0.1,0.1,0.2c0,0.1,0,0.2,0,0.4c0,0.1,0,0.3,0,0.4v0.3c0,0.5,0,1,0,1.4l0,0.2c0,0.4,0,0.8-0.1,1.1c0,0.1,0,0.2,0,0.3
c0,0.1,0,0.2,0,0.3c0,0.1,0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2l-0.2,0c-0.2,0-0.5,0-0.8,0.1c-0.4,0-0.5,0.1-0.6,0.1
c0,0-0.1,0-0.1,0l-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.2L25.2,118.3L25.2,118.3z M25.2,124.4c0-0.1,0.1-0.2,0.2-0.2l0.2,0l3.4-0.2
c0,0,0.1,0,0.1,0.1c0,0,0.1,0.1,0,0.1l0,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1l0,0.1c0,0.1,0,0.2-0.1,0.3
c-0.1,0.1-0.1,0.3-0.2,0.4l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6l-0.2,0l0,0
c0,0-0.1,0-0.1-0.1s0-0.1,0-0.1L25.2,124.4L25.2,124.4z M21.7,128.3c0,0-0.1,0.1-0.1,0.1c0,0,0,0,0,0l-0.2-0.1l0,0
c-1.8-0.4-4.2-2.6-5.1-5.2l0-0.1c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7c0.2,0.1,0.4,0.1,0.4,0.4
c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1C21.8,128.2,21.8,128.2,21.7,128.3z M24.4,128.9c0,0.1-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0
c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8c-1-1.3-1.5-2.7-1.9-4c0,0,0,0,0,0l0-0.1c0-0.1,0-0.1,0-0.1c0,0,0.1-0.1,0.1-0.1l0.1,0l1.9,0.1
l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2L24.4,128.9L24.4,128.9z M23,118.1l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1
c0,0-0.1,0-0.1,0c0,0,0,0,0,0s-0.9-0.1-1.4-0.1c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1
c0-0.3,0-1.4,0-1.5s0-0.1,0.1-0.1c0,0,0.1-0.1,0.1,0L23,118.1z M16.6,115.9L16.6,115.9c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1
c0.1,0,0.2,0,0.2,0.1c0,0.1,0,0.1,0,0.2l-0.1,0.2c-1.2,1.6-1.7,3.5-2,5.3l0,0.1c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0
l-0.1,0c-0.4-0.1-0.7-0.2-1.1-0.3c-0.6-0.1-1.2-0.3-1.8-0.5l-0.1,0C16.6,116.1,16.5,116,16.6,115.9z M16,117.1L16,117.1
c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7c0,0.1,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0,0,0l-0.1,0
c0,0-0.1,0-0.1,0h0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1C15.6,119.4,15.7,118.2,16,117.1z"/>
</g>
<path class="st3" d="M27.7,114.3c-0.5-1-0.9-2-1.4-3c-0.5-1.1-1.1-2.3-1.6-3.4c-0.9-2,0.2-4.3,2.4-4.7c1.8-0.3,3.7,1,3.8,2.9
c0.1,0.6,0,1.2-0.3,1.7c-1,2.1-2,4.3-2.9,6.4C27.8,114.2,27.8,114.3,27.7,114.3z M29.5,106.6c0-1-0.8-1.8-1.8-1.8
c-1,0-1.8,0.8-1.8,1.8c0,1,0.8,1.8,1.8,1.8C28.7,108.4,29.5,107.6,29.5,106.6z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,255 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 200.1" style="enable-background:new 0 0 50 200.1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#414042;}
.st1{fill:#FFFFFF;}
.st2{fill:#1E1E1E;}
.st3{fill:#333333;}
</style>
<g id="Layer_2">
<g>
<g>
<path class="st0" d="M50.1,146.1c0,2.2-1.8,4-4,4h-42c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.1z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M50,196.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V196.1z"/>
</g>
</g>
<g>
<g>
<path class="st1" d="M50,46c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46z"/>
</g>
</g>
<g>
<path class="st2" d="M50,96.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.1z"/>
</g>
</g>
<g id="Layer_3">
</g>
<g id="Layer_1">
<g>
<path class="st3" d="M15.9,41.5c-0.5,0.5-1.1,0.8-1.7,0.8c-0.4,0-0.8-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-0.9-0.7
c-0.3-0.3-0.5-0.7-0.6-1s-0.2-0.8-0.2-1.2c0-0.4,0.1-0.9,0.2-1.2c0.2-0.4,0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1L15.8,38c-0.2-0.3-0.4-0.6-0.6-0.7S14.6,37,14.3,37c-0.3,0-0.5,0.1-0.7,0.2
s-0.4,0.3-0.5,0.5c-0.2,0.2-0.3,0.4-0.4,0.7c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7s0.4,0.3,0.6,0.5
c0.2,0.1,0.5,0.2,0.7,0.2c0.6,0,1.1-0.3,1.6-0.9V40h-1.3v-0.9H17v3.1h-1v-0.7H15.9z"/>
<path class="st3" d="M20.9,42.3c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7
c0.3,0.3,0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2c0,0.4-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7
C21.7,42.2,21.3,42.3,20.9,42.3z M19.1,39.1c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2
s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7
c-0.2-0.2-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5s-0.3,0.4-0.3,0.7
C19.1,38.5,19.1,38.8,19.1,39.1z"/>
<path class="st3" d="M32,36.9h-2v5.3h-1.2v-5.3h-2v-1.1H32V36.9z"/>
<path class="st3" d="M35.5,42.3c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7
c0.3,0.3,0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2c0,0.4-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7
C36.3,42.2,35.9,42.3,35.5,42.3z M33.7,39.1c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7s0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2
s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7s-0.3-0.4-0.6-0.5
c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7C33.7,38.5,33.7,38.8,33.7,39.1z"/>
</g>
<g>
<g>
<path class="st3" d="M17.2,28.5c2,2.1,4.8,3.2,7.8,3.2h0.1c2.9,0,5.7-1.1,7.7-3.1s3.1-4.7,3.2-7.5c0-3-1-5.8-3.1-7.9
c-0.6-0.6-1.3-1.2-2-1.6c-0.2,0.5-0.4,1-0.7,1.5c0.3,0.2,0.7,0.5,1,0.8c1,1,1.9,2.1,2.2,3V17c0,0.1,0,0.2-0.1,0.2l0,0
c-0.8,0.4-1.6,0.6-2.5,0.8c-0.2,0-0.3,0.1-0.5,0.1h-0.1h-0.1L30,18v-0.1c-0.2-1-0.4-2-0.8-3l-0.5,1c0.2,0.7,0.4,1.4,0.5,2.1v0.1
v0.1l-0.1,0.1H29l-3.6,0.2h-0.2h-0.1v-0.1v-4.9c-0.3-0.6-0.5-1.1-0.7-1.7l0,0l0,0v6.4v0.1c0,0.1-0.1,0.2-0.2,0.2l0,0h-0.1
l-3.4-0.2c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.2v-0.1c0.4-1.8,0.9-3.8,2.3-5.5c0.4-0.4,0.8-0.9,1.3-1h0.1c-0.2-0.5-0.4-1-0.6-1.5
c-2.5,0.3-4.7,1.3-6.5,3.1c-2,2-3.1,4.6-3.2,7.5C14,23.6,15.1,26.4,17.2,28.5z M30.2,23.7c0-0.2,0-0.4,0-0.6l0,0
c0-0.5,0.1-0.9,0.1-1.4c0-0.6,0-1.2,0-1.8c0-0.2,0-0.4,0-0.6l0,0c0-0.1,0-0.4,0.4-0.5c0.7-0.2,1.5-0.3,2.2-0.5H33
c0.3-0.1,0.5-0.1,0.8-0.2h0.1c0.1,0,0.2,0,0.2,0.1v0.1v0.1c0,0.2,0.1,0.3,0.1,0.5c0.2,0.9,0.3,1.8,0.2,2.7
c-0.1,0.8-0.5,1.4-1.1,1.6c-0.5,0.2-1.1,0.4-1.7,0.5c-0.2,0.1-0.4,0.1-0.7,0.2c-0.1,0-0.2,0-0.3,0.1h-0.1h-0.1l0,0h-0.1
C30.2,23.9,30.2,23.9,30.2,23.7L30.2,23.7z M30.3,24.9c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2
v0.1c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.1,0-0.1-0.1-0.1-0.2v-0.1l0,0
c0,0,0-0.1,0.1-0.2c0.4-0.6,1-1.6,1.5-3.7C29.9,25.1,30,24.9,30.3,24.9z M25.2,19.4c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1
c0,0,0,0,0.1,0l0,0h0.1h0.1c0.1,0,0.1,0.1,0.1,0.2s0,0.2,0,0.4c0,0.1,0,0.3,0,0.4v0.3c0,0.5,0,1,0,1.4v0.2c0,0.4,0,0.8-0.1,1.1
c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3c0,0.1,0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2h-0.2c-0.2,0-0.5,0-0.8,0.1
c-0.4,0-0.5,0.1-0.6,0.1h-0.1l-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.2L25.2,19.4L25.2,19.4z M25.2,25.5c0-0.1,0.1-0.2,0.2-0.2h0.2
l3.4-0.2c0,0,0.1,0,0.1,0.1c0,0,0.1,0.1,0,0.1v0.1l0,0c0,0,0,0,0,0.1v0.1v0.1c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.1,0.3-0.2,0.4
l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6h-0.2l0,0c0,0-0.1,0-0.1-0.1v-0.1
L25.2,25.5L25.2,25.5z M21.7,29.4l-0.1,0.1l0,0l-0.2-0.1l0,0c-1.8-0.4-4.2-2.6-5.1-5.2v-0.1c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0
l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1C21.8,29.3,21.8,29.3,21.7,29.4z
M24.4,30c0,0.1-0.1,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8c-1-1.3-1.5-2.7-1.9-4l0,0v-0.1c0-0.1,0-0.1,0-0.1L21,25
h0.1l1.9,0.2l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2L24.4,30L24.4,30z M23,19.2l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1h-0.1
l0,0c0,0-0.9-0.1-1.4-0.1c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5
s0-0.1,0.1-0.1c0,0,0.1-0.1,0.1,0H23z M16.6,17L16.6,17c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1s0,0.1,0,0.2l-0.1,0.2
c-1.2,1.6-1.7,3.5-2,5.3v0.1c0,0,0,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.4-0.1-0.7-0.2-1.1-0.3c-0.6-0.1-1.2-0.3-1.8-0.5h-0.1
C16.6,17.2,16.5,17.1,16.6,17z M16,18.2L16,18.2c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7
c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1
C15.6,20.5,15.7,19.3,16,18.2z"/>
</g>
<path class="st3" d="M27.7,15.4c-0.5-1-0.9-2-1.4-3c-0.5-1.1-1.1-2.3-1.6-3.4c-0.9-2,0.2-4.3,2.4-4.7c1.8-0.3,3.7,1,3.8,2.9
c0.1,0.6,0,1.2-0.3,1.7C29.6,11,28.6,13.2,27.7,15.4C27.8,15.3,27.8,15.4,27.7,15.4z M29.5,7.7c0-1-0.8-1.8-1.8-1.8
s-1.8,0.8-1.8,1.8s0.8,1.8,1.8,1.8S29.5,8.7,29.5,7.7z"/>
</g>
<g>
<path class="st1" d="M15.9,91.5c-0.5,0.5-1.1,0.8-1.7,0.8c-0.4,0-0.8-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-0.9-0.7
c-0.3-0.3-0.5-0.7-0.6-1s-0.2-0.8-0.2-1.2c0-0.4,0.1-0.9,0.2-1.2c0.2-0.4,0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1L15.8,88c-0.2-0.3-0.4-0.6-0.6-0.7S14.6,87,14.3,87c-0.3,0-0.5,0.1-0.7,0.2
s-0.4,0.3-0.5,0.5c-0.2,0.2-0.3,0.4-0.4,0.7c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7s0.4,0.3,0.6,0.5
c0.2,0.1,0.5,0.2,0.7,0.2c0.6,0,1.1-0.3,1.6-0.9V90h-1.3v-0.9H17v3.1h-1v-0.7H15.9z"/>
<path class="st1" d="M20.9,92.3c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7
c0.3,0.3,0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2c0,0.4-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7
C21.7,92.2,21.3,92.3,20.9,92.3z M19.1,89.1c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2
s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7
c-0.2-0.2-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5s-0.3,0.4-0.3,0.7
C19.1,88.5,19.1,88.8,19.1,89.1z"/>
<path class="st1" d="M32,86.9h-2v5.3h-1.2v-5.3h-2v-1.1H32V86.9z"/>
<path class="st1" d="M35.5,92.3c-0.5,0-0.9-0.1-1.2-0.3s-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1s-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3s0.7,0.4,1,0.7
c0.3,0.3,0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2c0,0.4-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7
C36.3,92.2,35.9,92.3,35.5,92.3z M33.7,89.1c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7s0.3,0.4,0.6,0.5s0.5,0.2,0.8,0.2
s0.5-0.1,0.8-0.2s0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7s0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7s-0.3-0.4-0.6-0.5
c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7C33.7,88.5,33.7,88.8,33.7,89.1z"/>
</g>
<g>
<g>
<path class="st1" d="M17.2,78.5c2,2.1,4.8,3.2,7.8,3.2h0.1c2.9,0,5.7-1.1,7.7-3.1s3.1-4.7,3.2-7.5c0-3-1-5.8-3.1-7.9
c-0.6-0.6-1.3-1.2-2-1.6c-0.2,0.5-0.4,1-0.7,1.5c0.3,0.2,0.7,0.5,1,0.8c1,1,1.9,2.1,2.2,3V67c0,0.1,0,0.2-0.1,0.2l0,0
c-0.8,0.4-1.6,0.6-2.5,0.8c-0.2,0-0.3,0.1-0.5,0.1h-0.1h-0.1L30,68v-0.1c-0.2-1-0.4-2-0.8-3l-0.5,1c0.2,0.7,0.4,1.4,0.5,2.1v0.1
v0.1l-0.1,0.1H29l-3.6,0.2h-0.2h-0.1v-0.1v-4.9c-0.3-0.6-0.5-1.1-0.7-1.7l0,0l0,0v6.4v0.1c0,0.1-0.1,0.2-0.2,0.2l0,0h-0.1
l-3.4-0.2c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.2v-0.1c0.4-1.8,0.9-3.8,2.3-5.5c0.4-0.4,0.8-0.9,1.3-1h0.1c-0.2-0.5-0.4-1-0.6-1.5
c-2.5,0.3-4.7,1.3-6.5,3.1c-2,2-3.1,4.6-3.2,7.5C14,73.6,15.1,76.4,17.2,78.5z M30.2,73.7c0-0.2,0-0.4,0-0.6l0,0
c0-0.5,0.1-0.9,0.1-1.4c0-0.6,0-1.2,0-1.8c0-0.2,0-0.4,0-0.6l0,0c0-0.1,0-0.4,0.4-0.5c0.7-0.2,1.5-0.3,2.2-0.5H33
c0.3-0.1,0.5-0.1,0.8-0.2h0.1c0.1,0,0.2,0,0.2,0.1v0.1v0.1c0,0.2,0.1,0.3,0.1,0.5c0.2,0.9,0.3,1.8,0.2,2.7
c-0.1,0.8-0.5,1.4-1.1,1.6c-0.5,0.2-1.1,0.4-1.7,0.5c-0.2,0.1-0.4,0.1-0.7,0.2c-0.1,0-0.2,0-0.3,0.1h-0.1h-0.1l0,0h-0.1
C30.2,73.9,30.2,73.9,30.2,73.7L30.2,73.7z M30.3,74.9c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2
v0.1c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.1,0-0.1-0.1-0.1-0.2v-0.1l0,0
c0,0,0-0.1,0.1-0.2c0.4-0.6,1-1.6,1.5-3.7C29.9,75.1,30,74.9,30.3,74.9z M25.2,69.4c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1
c0,0,0,0,0.1,0l0,0h0.1h0.1c0.1,0,0.1,0.1,0.1,0.2s0,0.2,0,0.4c0,0.1,0,0.3,0,0.4v0.3c0,0.5,0,1,0,1.4v0.2c0,0.4,0,0.8-0.1,1.1
c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3c0,0.1,0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2h-0.2c-0.2,0-0.5,0-0.8,0.1
c-0.4,0-0.5,0.1-0.6,0.1h-0.1l-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.2L25.2,69.4L25.2,69.4z M25.2,75.5c0-0.1,0.1-0.2,0.2-0.2h0.2
l3.4-0.2c0,0,0.1,0,0.1,0.1c0,0,0.1,0.1,0,0.1v0.1l0,0c0,0,0,0,0,0.1v0.1v0.1c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.1,0.3-0.2,0.4
l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6h-0.2l0,0c0,0-0.1,0-0.1-0.1v-0.1
L25.2,75.5L25.2,75.5z M21.7,79.4l-0.1,0.1l0,0l-0.2-0.1l0,0c-1.8-0.4-4.2-2.6-5.1-5.2v-0.1c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0
l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1C21.8,79.3,21.8,79.3,21.7,79.4z
M24.4,80c0,0.1-0.1,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8c-1-1.3-1.5-2.7-1.9-4l0,0v-0.1c0-0.1,0-0.1,0-0.1L21,75
h0.1l1.9,0.2l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2L24.4,80L24.4,80z M23,69.2l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1h-0.1
l0,0c0,0-0.9-0.1-1.4-0.1c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5
s0-0.1,0.1-0.1c0,0,0.1-0.1,0.1,0H23z M16.6,67L16.6,67c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1s0,0.1,0,0.2l-0.1,0.2
c-1.2,1.6-1.7,3.5-2,5.3v0.1c0,0,0,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.4-0.1-0.7-0.2-1.1-0.3c-0.6-0.1-1.2-0.3-1.8-0.5h-0.1
C16.6,67.2,16.5,67.1,16.6,67z M16,68.2L16,68.2c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7
c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1
C15.6,70.5,15.7,69.3,16,68.2z"/>
</g>
<path class="st1" d="M27.7,65.4c-0.5-1-0.9-2-1.4-3c-0.5-1.1-1.1-2.3-1.6-3.4c-0.9-2,0.2-4.3,2.4-4.7c1.8-0.3,3.7,1,3.8,2.9
c0.1,0.6,0,1.2-0.3,1.7C29.6,61,28.6,63.2,27.7,65.4C27.8,65.3,27.8,65.4,27.7,65.4z M29.5,57.7c0-1-0.8-1.8-1.8-1.8
s-1.8,0.8-1.8,1.8s0.8,1.8,1.8,1.8S29.5,58.7,29.5,57.7z"/>
</g>
<g>
<path class="st1" d="M15.7,141.6c-0.5,0.5-1.1,0.8-1.7,0.8c-0.4,0-0.8-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-0.9-0.7
c-0.3-0.3-0.5-0.7-0.6-1s-0.2-0.8-0.2-1.2s0.1-0.9,0.2-1.2c0.2-0.4,0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1l-0.9,0.7c-0.2-0.3-0.4-0.6-0.6-0.7c-0.2-0.1-0.6-0.3-0.9-0.3
c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.3-0.5,0.5c-0.2,0.2-0.3,0.4-0.4,0.7c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.6,0.1,0.8
c0.1,0.3,0.2,0.5,0.4,0.7s0.4,0.3,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.6,0,1.1-0.3,1.6-0.9v-0.5h-1.3v-0.9h2.3v3.1h-1v-0.7H15.7z"
/>
<path class="st1" d="M20.7,142.4c-0.5,0-0.9-0.1-1.2-0.3c-0.3-0.2-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1c-0.1-0.4-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3c0.3,0.2,0.7,0.4,1,0.7
s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S21.1,142.4,20.7,142.4z
M18.9,139.2c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5c0.3,0.1,0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2
c0.3-0.1,0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7c0-0.3,0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7
c-0.2-0.2-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2c-0.3,0.1-0.4,0.3-0.6,0.5s-0.3,0.4-0.3,0.7
C18.9,138.6,18.9,138.9,18.9,139.2z"/>
<path class="st1" d="M31.8,137h-2v5.3h-1.2V137h-2v-1.1h5.2V137z"/>
<path class="st1" d="M35.3,142.4c-0.5,0-0.9-0.1-1.2-0.3c-0.3-0.2-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1c-0.1-0.4-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3c0.3,0.2,0.7,0.4,1,0.7
s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S35.7,142.4,35.3,142.4z
M33.5,139.2c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7s0.3,0.4,0.6,0.5c0.3,0.1,0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2
c0.3-0.1,0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7c0-0.3,0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7s-0.3-0.4-0.6-0.5
c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2c-0.3,0.1-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7
C33.5,138.6,33.5,138.9,33.5,139.2z"/>
</g>
<g>
<path class="st1" d="M17,128.6c2,2.1,4.8,3.2,7.8,3.2h0.1c2.9,0,5.7-1.1,7.7-3.1c2-2,3.1-4.7,3.2-7.5c0-3-1-5.8-3.1-7.9
c-0.6-0.6-1.3-1.2-2-1.6c-0.2,0.5-0.4,1-0.7,1.5c0.3,0.2,0.7,0.5,1,0.8c1,1,1.9,2.1,2.2,3v0.1c0,0.1,0,0.2-0.1,0.2l0,0
c-0.8,0.4-1.6,0.6-2.5,0.8c-0.2,0-0.3,0.1-0.5,0.1H30h-0.1l-0.1-0.1V118c-0.2-1-0.4-2-0.8-3l-0.5,1c0.2,0.7,0.4,1.4,0.5,2.1v0.1
v0.1l-0.1,0.1h-0.1l-3.6,0.2H25h-0.1v-0.1v-4.9c-0.3-0.6-0.5-1.1-0.7-1.7l0,0l0,0v6.4v0.1c0,0.1-0.1,0.2-0.2,0.2l0,0h-0.1
l-3.4-0.2c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.2V118c0.4-1.8,0.9-3.8,2.3-5.5c0.4-0.4,0.8-0.9,1.3-1h0.1c-0.2-0.5-0.4-1-0.6-1.5
c-2.5,0.3-4.7,1.3-6.5,3.1c-2,2-3.1,4.6-3.2,7.5C13.8,123.7,14.9,126.5,17,128.6z M30,123.8c0-0.2,0-0.4,0-0.6l0,0
c0-0.5,0.1-0.9,0.1-1.4c0-0.6,0-1.2,0-1.8c0-0.2,0-0.4,0-0.6l0,0c0-0.1,0-0.4,0.4-0.5c0.7-0.2,1.5-0.3,2.2-0.5h0.1
c0.3-0.1,0.5-0.1,0.8-0.2h0.1c0.1,0,0.2,0,0.2,0.1v0.1v0.1c0,0.2,0.1,0.3,0.1,0.5c0.2,0.9,0.3,1.8,0.2,2.7
c-0.1,0.8-0.5,1.4-1.1,1.6c-0.5,0.2-1.1,0.4-1.7,0.5c-0.2,0.1-0.4,0.1-0.7,0.2c-0.1,0-0.2,0-0.3,0.1h-0.1h-0.1l0,0h-0.1
C30,124,30,124,30,123.8L30,123.8z M30.1,125c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2v0.1
c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.1,0-0.1-0.1-0.1-0.2v-0.1l0,0c0,0,0-0.1,0.1-0.2
c0.4-0.6,1-1.6,1.5-3.7C29.7,125.2,29.8,125,30.1,125z M25,119.5c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1c0,0,0,0,0.1,0l0,0
h0.1h0.1c0.1,0,0.1,0.1,0.1,0.2s0,0.2,0,0.4c0,0.1,0,0.3,0,0.4v0.3c0,0.5,0,1,0,1.4v0.2c0,0.4,0,0.8-0.1,1.1c0,0.1,0,0.2,0,0.3
c0,0.1,0,0.2,0,0.3c0,0.1,0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2h-0.2c-0.2,0-0.5,0-0.8,0.1c-0.4,0-0.5,0.1-0.6,0.1h-0.1l-0.2-0.1
c-0.1,0-0.1-0.1-0.1-0.2L25,119.5L25,119.5z M25,125.6c0-0.1,0.1-0.2,0.2-0.2h0.2l3.4-0.2c0,0,0.1,0,0.1,0.1c0,0,0.1,0.1,0,0.1
v0.1l0,0c0,0,0,0,0,0.1v0.1v0.1c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.1,0.3-0.2,0.4l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8
c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6h-0.2l0,0c0,0-0.1,0-0.1-0.1v-0.1L25,125.6L25,125.6z M21.5,129.5l-0.1,0.1
l0,0l-0.2-0.1l0,0c-1.8-0.4-4.2-2.6-5.1-5.2v-0.1c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7
c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1C21.6,129.4,21.6,129.4,21.5,129.5z M24.2,130.1c0,0.1-0.1,0.1-0.1,0.1
H24c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8c-1-1.3-1.5-2.7-1.9-4l0,0v-0.1c0-0.1,0-0.1,0-0.1l0.1-0.1h0.1l1.9,0.2l1.2,0.1
c0.1,0,0.2,0.1,0.2,0.2L24.2,130.1L24.2,130.1z M22.8,119.3l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1H24l0,0
c0,0-0.9-0.1-1.4-0.1c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5s0-0.1,0.1-0.1
c0,0,0.1-0.1,0.1,0H22.8z M16.4,117.1L16.4,117.1c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1s0,0.1,0,0.2l-0.1,0.2
c-1.2,1.6-1.7,3.5-2,5.3v0.1c0,0,0,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.4-0.1-0.7-0.2-1.1-0.3c-0.6-0.1-1.2-0.3-1.8-0.5h-0.1
C16.4,117.3,16.3,117.2,16.4,117.1z M15.8,118.3L15.8,118.3c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7
c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1
C15.4,120.6,15.5,119.4,15.8,118.3z"/>
</g>
<path class="st1" d="M27.5,114.5c-0.5-1-0.9-2-1.4-3c-0.5-1.1-1.1-2.3-1.6-3.4c-0.9-2,0.2-4.3,2.4-4.7c1.8-0.3,3.7,1,3.8,2.9
c0.1,0.6,0,1.2-0.3,1.7C29.4,110.1,28.4,112.3,27.5,114.5C27.6,114.4,27.6,114.5,27.5,114.5z M29.3,106.8c0-1-0.8-1.8-1.8-1.8
s-1.8,0.8-1.8,1.8s0.8,1.8,1.8,1.8S29.3,107.8,29.3,106.8z"/>
<g>
<path class="st1" d="M15.7,191.7c-0.5,0.5-1.1,0.8-1.7,0.8c-0.4,0-0.8-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-0.9-0.7
c-0.3-0.3-0.5-0.7-0.6-1s-0.2-0.8-0.2-1.2s0.1-0.9,0.2-1.2c0.2-0.4,0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1l-0.9,0.7c-0.2-0.3-0.4-0.6-0.6-0.7c-0.2-0.1-0.6-0.3-0.9-0.3
c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.3-0.5,0.5c-0.2,0.2-0.3,0.4-0.4,0.7c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.6,0.1,0.8
c0.1,0.3,0.2,0.5,0.4,0.7s0.4,0.3,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.6,0,1.1-0.3,1.6-0.9v-0.5h-1.3v-0.9h2.3v3.1h-1v-0.7H15.7z"
/>
<path class="st1" d="M20.7,192.5c-0.5,0-0.9-0.1-1.2-0.3c-0.3-0.2-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1c-0.1-0.4-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3c0.3,0.2,0.7,0.4,1,0.7
s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S21.1,192.5,20.7,192.5z
M18.9,189.3c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5c0.3,0.1,0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2
c0.3-0.1,0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7c0-0.3,0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7
c-0.2-0.2-0.3-0.4-0.6-0.5c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2c-0.3,0.1-0.4,0.3-0.6,0.5s-0.3,0.4-0.3,0.7
C18.9,188.7,18.9,189,18.9,189.3z"/>
<path class="st1" d="M31.8,187.1h-2v5.3h-1.2v-5.3h-2V186h5.2V187.1z"/>
<path class="st1" d="M35.3,192.5c-0.5,0-0.9-0.1-1.2-0.3c-0.3-0.2-0.7-0.4-1-0.7c-0.3-0.3-0.5-0.6-0.6-1c-0.1-0.4-0.2-0.8-0.2-1.2
c0-0.4,0.1-0.8,0.2-1.2s0.4-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.2-0.3c0.5,0,0.9,0.1,1.2,0.3c0.3,0.2,0.7,0.4,1,0.7
s0.5,0.7,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2s-0.1,0.8-0.2,1.2c-0.2,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.7S35.7,192.5,35.3,192.5z
M33.5,189.3c0,0.3,0,0.5,0.1,0.8s0.2,0.5,0.4,0.7s0.3,0.4,0.6,0.5c0.3,0.1,0.5,0.2,0.8,0.2s0.5-0.1,0.8-0.2
c0.3-0.1,0.4-0.3,0.6-0.5c0.1-0.2,0.3-0.4,0.3-0.7c0-0.3,0.1-0.5,0.1-0.8s0-0.5-0.1-0.8s-0.2-0.5-0.4-0.7s-0.3-0.4-0.6-0.5
c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2c-0.3,0.1-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7
C33.5,188.7,33.5,189,33.5,189.3z"/>
</g>
<g>
<path class="st1" d="M17,178.7c2,2.1,4.8,3.2,7.8,3.2h0.1c2.9,0,5.7-1.1,7.7-3.1s3.1-4.7,3.2-7.5c0-3-1-5.8-3.1-7.9
c-0.6-0.6-1.3-1.2-2-1.6c-0.2,0.5-0.4,1-0.7,1.5c0.3,0.2,0.7,0.5,1,0.8c1,1,1.9,2.1,2.2,3v0.1c0,0.1,0,0.2-0.1,0.2l0,0
c-0.8,0.4-1.6,0.6-2.5,0.8c-0.2,0-0.3,0.1-0.5,0.1H30h-0.1l-0.1-0.1v-0.1c-0.2-1-0.4-2-0.8-3l-0.5,1c0.2,0.7,0.4,1.4,0.5,2.1v0.1
v0.1l-0.1,0.1h-0.1l-3.6,0.2H25h-0.1v-0.1v-4.9c-0.3-0.6-0.5-1.1-0.7-1.7l0,0l0,0v6.4v0.1c0,0.1-0.1,0.2-0.2,0.2l0,0h-0.1
l-3.4-0.2c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.2v-0.1c0.4-1.8,0.9-3.8,2.3-5.5c0.4-0.4,0.8-0.9,1.3-1h0.1c-0.2-0.5-0.4-1-0.6-1.5
c-2.5,0.3-4.7,1.3-6.5,3.1c-2,2-3.1,4.6-3.2,7.5C13.8,173.8,14.9,176.6,17,178.7z M30,173.9c0-0.2,0-0.4,0-0.6l0,0
c0-0.5,0.1-0.9,0.1-1.4c0-0.6,0-1.2,0-1.8c0-0.2,0-0.4,0-0.6l0,0c0-0.1,0-0.4,0.4-0.5c0.7-0.2,1.5-0.3,2.2-0.5h0.1
c0.3-0.1,0.5-0.1,0.8-0.2h0.1c0.1,0,0.2,0,0.2,0.1v0.1v0.1c0,0.2,0.1,0.3,0.1,0.5c0.2,0.9,0.3,1.8,0.2,2.7
c-0.1,0.8-0.5,1.4-1.1,1.6c-0.5,0.2-1.1,0.4-1.7,0.5c-0.2,0.1-0.4,0.1-0.7,0.2c-0.1,0-0.2,0-0.3,0.1h-0.1h-0.1l0,0h-0.1
C30,174.1,30,174.1,30,173.9L30,173.9z M30.1,175.1c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2v0.1
c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.1,0-0.1-0.1-0.1-0.2v-0.1l0,0c0,0,0-0.1,0.1-0.2
c0.4-0.6,1-1.6,1.5-3.7C29.7,175.3,29.8,175.1,30.1,175.1z M25,169.6c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1c0,0,0,0,0.1,0
l0,0h0.1h0.1c0.1,0,0.1,0.1,0.1,0.2c0,0.1,0,0.2,0,0.4c0,0.1,0,0.3,0,0.4v0.3c0,0.5,0,1,0,1.4v0.2c0,0.4,0,0.8-0.1,1.1
c0,0.1,0,0.2,0,0.3s0,0.2,0,0.3s0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2h-0.2c-0.2,0-0.5,0-0.8,0.1c-0.4,0-0.5,0.1-0.6,0.1h-0.1
l-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.2L25,169.6L25,169.6z M25,175.7c0-0.1,0.1-0.2,0.2-0.2h0.2l3.4-0.2c0,0,0.1,0,0.1,0.1
c0,0,0.1,0.1,0,0.1v0.1l0,0c0,0,0,0,0,0.1v0.1v0.1c0,0.1,0,0.2-0.1,0.3s-0.1,0.3-0.2,0.4l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8
c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6h-0.2l0,0c0,0-0.1,0-0.1-0.1v-0.1L25,175.7L25,175.7z M21.5,179.6l-0.1,0.1
l0,0l-0.2-0.1l0,0c-1.8-0.4-4.2-2.6-5.1-5.2v-0.1c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7
c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1C21.6,179.5,21.6,179.5,21.5,179.6z M24.2,180.2c0,0.1-0.1,0.1-0.1,0.1
H24c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8c-1-1.3-1.5-2.7-1.9-4l0,0v-0.1c0-0.1,0-0.1,0-0.1l0.1-0.1h0.1l1.9,0.2l1.2,0.1
c0.1,0,0.2,0.1,0.2,0.2L24.2,180.2L24.2,180.2z M22.8,169.4l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1H24l0,0
c0,0-0.9-0.1-1.4-0.1c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5
c0-0.1,0-0.1,0.1-0.1c0,0,0.1-0.1,0.1,0H22.8z M16.4,167.2L16.4,167.2c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1
c0,0.1,0,0.1,0,0.2l-0.1,0.2c-1.2,1.6-1.7,3.5-2,5.3v0.1c0,0,0,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.4-0.1-0.7-0.2-1.1-0.3
c-0.6-0.1-1.2-0.3-1.8-0.5h-0.1C16.4,167.4,16.3,167.3,16.4,167.2z M15.8,168.4L15.8,168.4c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8
c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1
c-0.4-0.3-0.6-0.6-0.6-1C15.4,170.7,15.5,169.5,15.8,168.4z"/>
</g>
<path class="st1" d="M27.5,164.6c-0.5-1-0.9-2-1.4-3c-0.5-1.1-1.1-2.3-1.6-3.4c-0.9-2,0.2-4.3,2.4-4.7c1.8-0.3,3.7,1,3.8,2.9
c0.1,0.6,0,1.2-0.3,1.7C29.4,160.2,28.4,162.4,27.5,164.6C27.6,164.5,27.6,164.6,27.5,164.6z M29.3,156.9c0-1-0.8-1.8-1.8-1.8
s-1.8,0.8-1.8,1.8s0.8,1.8,1.8,1.8S29.3,157.9,29.3,156.9z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -1,94 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 150" style="enable-background:new 0 0 50 150;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.9;}
.st1{fill:#FFFFFF;}
.st2{fill:#1E1E1E;}
.st3{fill:#EAEAEA;}
.st4{opacity:0.47;}
.st5{opacity:0.47;fill:#EAEAEA;}
</style>
<g>
<g class="st0">
<path class="st1" d="M50,46.3c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46.3z"/>
</g>
</g>
<g>
<g class="st0">
<path class="st2" d="M50,96.3c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.3z"/>
</g>
</g>
<path d="M21.6,21.5c-1.4,1.4-2.8,2.8-4.2,4.2c-0.3-0.3-0.7-0.7-1-1c1.4-1.4,2.8-2.8,4.2-4.2l-1.1-1.1c-1.6,1.6-3.2,3.2-4.9,4.8
c-0.3,0.3-0.5,0.7-0.6,1.2c-0.2,1.3-0.4,2.6-0.6,4c0.1,0,0.2,0,0.3,0c1.3-0.3,2.5-0.5,3.8-0.8c0.2-0.1,0.5-0.2,0.7-0.4
c1.7-1.7,3.4-3.4,5.1-5.1L21.6,21.5z"/>
<path d="M28.2,10.6c0.5-0.5,1.1-1.1,1.7-1.7c0.2-0.2,0.5-0.2,0.7,0c1,1,2,2,3,3c0.2,0.2,0.2,0.5,0,0.8c-0.6,0.6-1.2,1.2-1.7,1.7
C30.7,13.2,29.4,11.9,28.2,10.6z"/>
<path d="M29.4,19.1c-0.3,0.1-0.4,0-0.6-0.2c-0.4-0.4-0.8-0.8-1.2-1.2c1-1,1.9-1.9,2.9-2.9c0.1-0.1,0.2-0.2,0.2-0.2
c-1.3-1.3-2.5-2.5-3.8-3.9c-0.1,0.1-0.1,0.2-0.2,0.3c-1,1-1.9,1.9-2.9,2.9c-1.8-1.8-3.5-3.5-5.3-5.3c-0.1-0.1-0.3-0.3-0.4-0.4
c-1-0.7-2.2-0.6-3,0.3c-0.8,0.9-0.7,2.2,0.1,3c2.6,2.6,5.3,5.3,7.9,7.9c0.9,0.9,1.7,1.7,2.6,2.6c0.1,0.1,0.2,0.2,0.1,0.4
c-0.1,0.4-0.2,0.8-0.2,1.2c-0.2,2.5,1.4,4.7,3.9,5.4c1,0.3,2,0.2,3.1-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c-0.7-0.7-1.5-1.5-2.2-2.2
c-0.5-0.5-0.6-1.4-0.1-1.9c0.4-0.4,0.8-0.8,1.2-1.2c0.6-0.5,1.3-0.5,1.8,0c0.1,0.1,0.2,0.2,0.3,0.3c0.7,0.7,1.5,1.5,2.2,2.2
c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C36.3,20.9,32.9,18.1,29.4,19.1z M16.7,10.6c-0.4,0-0.7-0.3-0.7-0.7c0-0.4,0.3-0.8,0.7-0.8
c0.4,0,0.8,0.4,0.8,0.7C17.4,10.3,17.1,10.6,16.7,10.6z M27.1,13c0.3,0.3,0.6,0.7,1,1c-0.7,0.7-1.4,1.4-2.1,2.1
c-0.3-0.3-0.7-0.7-1-1C25.7,14.4,26.4,13.7,27.1,13z"/>
<g>
<path d="M18.2,41.3v1.1h-4.4V36h4.4v1.1H15v1.5h2.7v1H15v1.7H18.2z"/>
<path d="M19.4,42.4V36h2.3c0.5,0,1,0.1,1.4,0.3c0.4,0.2,0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H19.4z M23.6,39.2
c0-0.3,0-0.6-0.1-0.8c-0.1-0.3-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2h1.1
c0.3,0,0.6-0.1,0.8-0.2c0.2-0.1,0.4-0.3,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.7C23.6,39.8,23.6,39.5,23.6,39.2z"/>
<path d="M26.1,42.4V36h1.2v6.4H26.1z"/>
<path d="M33.6,37.1h-2v5.3h-1.2v-5.3h-2V36h5.3V37.1z"/>
</g>
<path class="st3" d="M21.9,71.5c-1.4,1.4-2.8,2.8-4.2,4.2c-0.3-0.3-0.7-0.7-1-1c1.4-1.4,2.8-2.8,4.2-4.2l-1.1-1.1
c-1.6,1.6-3.2,3.2-4.9,4.8c-0.3,0.3-0.5,0.7-0.6,1.2c-0.2,1.3-0.4,2.6-0.6,4c0.1,0,0.2,0,0.3,0c1.3-0.3,2.5-0.5,3.8-0.8
c0.2-0.1,0.5-0.2,0.7-0.4c1.7-1.7,3.4-3.4,5.1-5.1L21.9,71.5z"/>
<path class="st3" d="M28.5,60.6c0.5-0.5,1.1-1.1,1.7-1.7c0.2-0.2,0.5-0.2,0.7,0c1,1,2,2,3,3c0.2,0.2,0.2,0.5,0,0.8
c-0.6,0.6-1.2,1.2-1.7,1.7C31,63.2,29.8,61.9,28.5,60.6z"/>
<path class="st3" d="M29.7,69.1c-0.3,0.1-0.4,0-0.6-0.2c-0.4-0.4-0.8-0.8-1.2-1.2c1-1,1.9-1.9,2.9-2.9c0.1-0.1,0.2-0.2,0.2-0.2
c-1.3-1.3-2.5-2.5-3.8-3.9c-0.1,0.1-0.1,0.2-0.2,0.3c-1,1-1.9,1.9-2.9,2.9c-1.8-1.8-3.5-3.5-5.3-5.3c-0.1-0.1-0.3-0.3-0.4-0.4
c-1-0.7-2.2-0.6-3,0.3c-0.8,0.9-0.7,2.2,0.1,3c2.6,2.6,5.3,5.3,7.9,7.9c0.9,0.9,1.7,1.7,2.6,2.6c0.1,0.1,0.2,0.2,0.1,0.4
c-0.1,0.4-0.2,0.8-0.2,1.2c-0.2,2.5,1.4,4.7,3.9,5.4c1,0.3,2,0.2,3.1-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c-0.7-0.7-1.5-1.5-2.2-2.2
c-0.5-0.5-0.6-1.4-0.1-1.9c0.4-0.4,0.8-0.8,1.2-1.2c0.6-0.5,1.3-0.5,1.8,0c0.1,0.1,0.2,0.2,0.3,0.3c0.7,0.7,1.5,1.5,2.2,2.2
c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C36.6,70.9,33.2,68.1,29.7,69.1z M17,60.6c-0.4,0-0.7-0.3-0.7-0.7c0-0.4,0.3-0.8,0.7-0.8
c0.4,0,0.8,0.4,0.8,0.7C17.7,60.3,17.4,60.6,17,60.6z M27.4,63c0.3,0.3,0.6,0.7,1,1c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1
C26,64.4,26.7,63.7,27.4,63z"/>
<g>
<path class="st3" d="M18.5,91.4v1.1H14v-6.4h4.4v1.1h-3.1v1.5H18v1h-2.7v1.7H18.5z"/>
<path class="st3" d="M19.7,92.4v-6.4H22c0.5,0,1,0.1,1.4,0.3s0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H19.7z M23.9,89.2
c0-0.3,0-0.6-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2H21v4.2H22c0.3,0,0.6-0.1,0.8-0.2
c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C23.9,89.8,23.9,89.5,23.9,89.2z"/>
<path class="st3" d="M26.4,92.4v-6.4h1.2v6.4H26.4z"/>
<path class="st3" d="M34,87.1h-2v5.3h-1.2v-5.3h-2v-1.1H34V87.1z"/>
</g>
<g class="st4">
<g class="st0">
<path class="st2" d="M50,146.3c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.3z"/>
</g>
</g>
<path class="st5" d="M21.9,121.5c-1.4,1.4-2.8,2.8-4.2,4.2c-0.3-0.3-0.7-0.7-1-1c1.4-1.4,2.8-2.8,4.2-4.2l-1.1-1.1
c-1.6,1.6-3.2,3.2-4.9,4.8c-0.3,0.3-0.5,0.7-0.6,1.2c-0.2,1.3-0.4,2.6-0.6,4c0.1,0,0.2,0,0.3,0c1.3-0.3,2.5-0.5,3.8-0.8
c0.2-0.1,0.5-0.2,0.7-0.4c1.7-1.7,3.4-3.4,5.1-5.1L21.9,121.5z"/>
<path class="st5" d="M28.5,110.6c0.5-0.5,1.1-1.1,1.7-1.7c0.2-0.2,0.5-0.2,0.7,0c1,1,2,2,3,3c0.2,0.2,0.2,0.5,0,0.8
c-0.6,0.6-1.2,1.2-1.7,1.7C31,113.2,29.8,111.9,28.5,110.6z"/>
<path class="st5" d="M29.7,119.1c-0.3,0.1-0.4,0-0.6-0.2c-0.4-0.4-0.8-0.8-1.2-1.2c1-1,1.9-1.9,2.9-2.9c0.1-0.1,0.2-0.2,0.2-0.2
c-1.3-1.3-2.5-2.5-3.8-3.9c-0.1,0.1-0.1,0.2-0.2,0.3c-1,1-1.9,1.9-2.9,2.9c-1.8-1.8-3.5-3.5-5.3-5.3c-0.1-0.1-0.3-0.3-0.4-0.4
c-1-0.7-2.2-0.6-3,0.3c-0.8,0.9-0.7,2.2,0.1,3c2.6,2.6,5.3,5.3,7.9,7.9c0.9,0.9,1.7,1.7,2.6,2.6c0.1,0.1,0.2,0.2,0.1,0.4
c-0.1,0.4-0.2,0.8-0.2,1.2c-0.2,2.5,1.4,4.7,3.9,5.4c1,0.3,2,0.2,3.1-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c-0.7-0.7-1.5-1.5-2.2-2.2
c-0.5-0.5-0.6-1.4-0.1-1.9c0.4-0.4,0.8-0.8,1.2-1.2c0.6-0.5,1.3-0.5,1.8,0c0.1,0.1,0.2,0.2,0.3,0.3c0.7,0.7,1.5,1.5,2.2,2.2
c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C36.6,120.9,33.2,118.1,29.7,119.1z M17,110.6c-0.4,0-0.7-0.3-0.7-0.7
c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C17.7,110.3,17.4,110.6,17,110.6z M27.4,113c0.3,0.3,0.6,0.7,1,1
c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26,114.4,26.7,113.7,27.4,113z"/>
<g class="st4">
<path class="st3" d="M18.5,141.4v1.1H14v-6.4h4.4v1.1h-3.1v1.5H18v1h-2.7v1.7H18.5z"/>
<path class="st3" d="M19.7,142.4v-6.4H22c0.5,0,1,0.1,1.4,0.3s0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H19.7z M23.9,139.2
c0-0.3,0-0.6-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2H21v4.2H22c0.3,0,0.6-0.1,0.8-0.2
c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C23.9,139.8,23.9,139.5,23.9,139.2z"/>
<path class="st3" d="M26.4,142.4v-6.4h1.2v6.4H26.4z"/>
<path class="st3" d="M34,137.1h-2v5.3h-1.2v-5.3h-2v-1.1H34V137.1z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 200.1" style="enable-background:new 0 0 50 200.1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#414042;}
.st1{fill:#FFFFFF;}
.st2{fill:#1E1E1E;}
.st3{fill:#333333;}
</style>
<g id="Layer_2">
<g>
<g>
<path class="st0" d="M50.1,146.1c0,2.2-1.8,4-4,4h-42c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.1z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M50,196.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V196.1z"/>
</g>
</g>
<g>
<g>
<path class="st1" d="M50,46c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46z"/>
</g>
</g>
<g>
<path class="st2" d="M50,96.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.1z"/>
</g>
</g>
<g id="Layer_3">
</g>
<g id="Layer_1">
<path class="st3" d="M22.2,21.5c-1.4,1.4-2.8,2.8-4.2,4.2c-0.3-0.3-0.7-0.7-1-1c1.4-1.4,2.8-2.8,4.2-4.2L20,19.4
c-1.6,1.6-3.2,3.2-4.9,4.8c-0.3,0.3-0.5,0.7-0.6,1.2c-0.2,1.3-0.4,2.6-0.6,4c0.1,0,0.2,0,0.3,0c1.3-0.3,2.5-0.5,3.8-0.8
c0.2-0.1,0.5-0.2,0.7-0.4c1.7-1.7,3.4-3.4,5.1-5.1L22.2,21.5z"/>
<path class="st3" d="M28.8,10.6c0.5-0.5,1.1-1.1,1.7-1.7c0.2-0.2,0.5-0.2,0.7,0c1,1,2,2,3,3c0.2,0.2,0.2,0.5,0,0.8
c-0.6,0.6-1.2,1.2-1.7,1.7C31.3,13.2,30.1,11.9,28.8,10.6z"/>
<path class="st3" d="M30.2,19.9c-0.3,0.1-0.4,0-0.6-0.2c-0.4-0.4-0.8-0.8-1.2-1.2c1-1,1.9-1.9,2.9-2.9c0.1-0.1,0.2-0.2,0.2-0.2
c-1.3-1.3-2.5-2.5-3.8-3.9c-0.1,0.1-0.1,0.2-0.2,0.3c-1,1-1.9,1.9-2.9,2.9c-1.8-1.8-3.5-3.5-5.3-5.3c-0.1-0.1-0.3-0.3-0.4-0.4
c-1-0.7-2.2-0.6-3,0.3c-0.8,0.9-0.7,2.2,0.1,3c2.6,2.6,5.3,5.3,7.9,7.9c0.9,0.9,1.7,1.7,2.6,2.6c0.1,0.1,0.2,0.2,0.1,0.4
c-0.1,0.4-0.2,0.8-0.2,1.2c-0.2,2.5,1.4,4.7,3.9,5.4c1,0.3,2,0.2,3.1-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c-0.7-0.7-1.5-1.5-2.2-2.2
c-0.5-0.5-0.6-1.4-0.1-1.9c0.4-0.4,0.8-0.8,1.2-1.2c0.6-0.5,1.3-0.5,1.8,0c0.1,0.1,0.2,0.2,0.3,0.3c0.7,0.7,1.5,1.5,2.2,2.2
c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.2,21.7,33.7,18.9,30.2,19.9z M17.5,11.5c-0.4,0-0.7-0.3-0.7-0.7
c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.3,11.1,17.9,11.5,17.5,11.5z M27.9,13.8c0.3,0.3,0.6,0.7,1,1
c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.5,15.2,27.2,14.5,27.9,13.8z"/>
<g>
<path class="st3" d="M18.8,41.3v1.1h-4.4V36h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H18.8z"/>
<path class="st3" d="M20,42.4V36h2.3c0.5,0,1,0.1,1.4,0.3s0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H20z M24.2,39.2
c0-0.3,0-0.6-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2h1.1c0.3,0,0.6-0.1,0.8-0.2
c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C24.2,39.8,24.2,39.5,24.2,39.2z"/>
<path class="st3" d="M26.7,42.4v-6.4h1.2v6.4H26.7z"/>
<path class="st3" d="M34.3,37.1h-2v5.3H31v-5.3h-2V36h5.3V37.1z"/>
</g>
<path class="st1" d="M22.2,71.5c-1.4,1.4-2.8,2.8-4.2,4.2c-0.3-0.3-0.7-0.7-1-1c1.4-1.4,2.8-2.8,4.2-4.2L20,69.4
c-1.6,1.6-3.2,3.2-4.9,4.8c-0.3,0.3-0.5,0.7-0.6,1.2c-0.2,1.3-0.4,2.6-0.6,4c0.1,0,0.2,0,0.3,0c1.3-0.3,2.5-0.5,3.8-0.8
c0.2-0.1,0.5-0.2,0.7-0.4c1.7-1.7,3.4-3.4,5.1-5.1L22.2,71.5z"/>
<path class="st1" d="M28.8,60.6c0.5-0.5,1.1-1.1,1.7-1.7c0.2-0.2,0.5-0.2,0.7,0c1,1,2,2,3,3c0.2,0.2,0.2,0.5,0,0.8
c-0.6,0.6-1.2,1.2-1.7,1.7C31.3,63.2,30.1,61.9,28.8,60.6z"/>
<path class="st1" d="M30.3,69.9c-0.3,0.1-0.4,0-0.6-0.2c-0.4-0.4-0.8-0.8-1.2-1.2c1-1,1.9-1.9,2.9-2.9c0.1-0.1,0.2-0.2,0.2-0.2
c-1.3-1.3-2.5-2.5-3.8-3.9c-0.1,0.1-0.1,0.2-0.2,0.3c-1,1-1.9,1.9-2.9,2.9c-1.8-1.8-3.5-3.5-5.3-5.3c-0.1-0.1-0.3-0.3-0.4-0.4
c-1-0.7-2.2-0.6-3,0.3c-0.8,0.9-0.7,2.2,0.1,3c2.6,2.6,5.3,5.3,7.9,7.9c0.9,0.9,1.7,1.7,2.6,2.6c0.1,0.1,0.2,0.2,0.1,0.4
c-0.1,0.4-0.2,0.8-0.2,1.2c-0.2,2.5,1.4,4.7,3.9,5.4c1,0.3,2,0.2,3.1-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c-0.7-0.7-1.5-1.5-2.2-2.2
c-0.5-0.5-0.6-1.4-0.1-1.9c0.4-0.4,0.8-0.8,1.2-1.2c0.6-0.5,1.3-0.5,1.8,0c0.1,0.1,0.2,0.2,0.3,0.3c0.7,0.7,1.5,1.5,2.2,2.2
c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.2,71.7,33.8,68.9,30.3,69.9z M17.6,61.5c-0.4,0-0.7-0.3-0.7-0.7
c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.3,61.1,18,61.5,17.6,61.5z M28,63.8c0.3,0.3,0.6,0.7,1,1
c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.6,65.2,27.3,64.5,28,63.8z"/>
<g>
<path class="st1" d="M18.8,91.3v1.1h-4.4V86h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H18.8z"/>
<path class="st1" d="M20,92.4V86h2.3c0.5,0,1,0.1,1.4,0.3s0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H20z M24.2,89.2
c0-0.3,0-0.6-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2h1.1c0.3,0,0.6-0.1,0.8-0.2
c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C24.2,89.8,24.2,89.5,24.2,89.2z"/>
<path class="st1" d="M26.7,92.4v-6.4h1.2v6.4H26.7z"/>
<path class="st1" d="M34.3,87.1h-2v5.3H31v-5.3h-2V86h5.3V87.1z"/>
</g>
<path class="st1" d="M22,121.6c-1.4,1.4-2.8,2.8-4.2,4.2c-0.3-0.3-0.7-0.7-1-1c1.4-1.4,2.8-2.8,4.2-4.2l-1.1-1.1
c-1.6,1.6-3.2,3.2-4.9,4.8c-0.3,0.3-0.5,0.7-0.6,1.2c-0.2,1.3-0.4,2.6-0.6,4c0.1,0,0.2,0,0.3,0c1.3-0.3,2.5-0.5,3.8-0.8
c0.2-0.1,0.5-0.2,0.7-0.4c1.7-1.7,3.4-3.4,5.1-5.1L22,121.6z"/>
<path class="st1" d="M28.6,110.7c0.5-0.5,1.1-1.1,1.7-1.7c0.2-0.2,0.5-0.2,0.7,0c1,1,2,2,3,3c0.2,0.2,0.2,0.5,0,0.8
c-0.6,0.6-1.2,1.2-1.7,1.7C31.1,113.2,29.9,112,28.6,110.7z"/>
<path class="st1" d="M30.2,120c-0.3,0.1-0.4,0-0.6-0.2c-0.4-0.4-0.8-0.8-1.2-1.2c1-1,1.9-1.9,2.9-2.9c0.1-0.1,0.2-0.2,0.2-0.2
c-1.3-1.3-2.5-2.5-3.8-3.9c-0.1,0.1-0.1,0.2-0.2,0.3c-1,1-1.9,1.9-2.9,2.9c-1.8-1.8-3.5-3.5-5.3-5.3c-0.1-0.1-0.3-0.3-0.4-0.4
c-1-0.7-2.2-0.6-3,0.3c-0.8,0.9-0.7,2.2,0.1,3c2.6,2.6,5.3,5.3,7.9,7.9c0.9,0.9,1.7,1.7,2.6,2.6c0.1,0.1,0.2,0.2,0.1,0.4
c-0.1,0.4-0.2,0.8-0.2,1.2c-0.2,2.5,1.4,4.7,3.9,5.4c1,0.3,2,0.2,3.1-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c-0.7-0.7-1.5-1.5-2.2-2.2
c-0.5-0.5-0.6-1.4-0.1-1.9c0.4-0.4,0.8-0.8,1.2-1.2c0.6-0.5,1.3-0.5,1.8,0c0.1,0.1,0.2,0.2,0.3,0.3c0.7,0.7,1.5,1.5,2.2,2.2
c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.1,121.8,33.7,119,30.2,120z M17.5,111.5c-0.4,0-0.7-0.3-0.7-0.7
c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.2,111.2,17.9,111.5,17.5,111.5z M27.9,113.9c0.3,0.3,0.6,0.7,1,1
c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.5,115.3,27.2,114.6,27.9,113.9z"/>
<g>
<path class="st1" d="M18.6,141.4v1.1h-4.4v-6.4h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H18.6z"/>
<path class="st1" d="M19.8,142.5v-6.4h2.3c0.5,0,1,0.1,1.4,0.3s0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H19.8z M24,139.3
c0-0.3,0-0.6-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2h1.1c0.3,0,0.6-0.1,0.8-0.2
c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C24,139.9,24,139.6,24,139.3z"/>
<path class="st1" d="M26.5,142.5v-6.4h1.2v6.4H26.5z"/>
<path class="st1" d="M34.1,137.2h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V137.2z"/>
</g>
<path class="st1" d="M22,171.6c-1.4,1.4-2.8,2.8-4.2,4.2c-0.3-0.3-0.7-0.7-1-1c1.4-1.4,2.8-2.8,4.2-4.2l-1.1-1.1
c-1.6,1.6-3.2,3.2-4.9,4.8c-0.3,0.3-0.5,0.7-0.6,1.2c-0.2,1.3-0.4,2.6-0.6,4c0.1,0,0.2,0,0.3,0c1.3-0.3,2.5-0.5,3.8-0.8
c0.2-0.1,0.5-0.2,0.7-0.4c1.7-1.7,3.4-3.4,5.1-5.1L22,171.6z"/>
<path class="st1" d="M28.6,160.8c0.5-0.5,1.1-1.1,1.7-1.7c0.2-0.2,0.5-0.2,0.7,0c1,1,2,2,3,3c0.2,0.2,0.2,0.5,0,0.8
c-0.6,0.6-1.2,1.2-1.7,1.7C31.1,163.3,29.9,162,28.6,160.8z"/>
<path class="st1" d="M30.2,170.1c-0.3,0.1-0.4,0-0.6-0.2c-0.4-0.4-0.8-0.8-1.2-1.2c1-1,1.9-1.9,2.9-2.9c0.1-0.1,0.2-0.2,0.2-0.2
c-1.3-1.3-2.5-2.5-3.8-3.9c-0.1,0.1-0.1,0.2-0.2,0.3c-1,1-1.9,1.9-2.9,2.9c-1.8-1.8-3.5-3.5-5.3-5.3c-0.1-0.1-0.3-0.3-0.4-0.4
c-1-0.7-2.2-0.6-3,0.3c-0.8,0.9-0.7,2.2,0.1,3c2.6,2.6,5.3,5.3,7.9,7.9c0.9,0.9,1.7,1.7,2.6,2.6c0.1,0.1,0.2,0.2,0.1,0.4
c-0.1,0.4-0.2,0.8-0.2,1.2c-0.2,2.5,1.4,4.7,3.9,5.4c1,0.3,2,0.2,3.1-0.2c-0.1-0.1-0.2-0.2-0.3-0.2c-0.7-0.7-1.5-1.5-2.2-2.2
c-0.5-0.5-0.6-1.4-0.1-1.9c0.4-0.4,0.8-0.8,1.2-1.2c0.6-0.5,1.3-0.5,1.8,0c0.1,0.1,0.2,0.2,0.3,0.3c0.7,0.7,1.5,1.5,2.2,2.2
c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.1,171.9,33.7,169,30.2,170.1z M17.4,161.6c-0.4,0-0.7-0.3-0.7-0.7
c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.2,161.2,17.8,161.6,17.4,161.6z M27.8,164c0.3,0.3,0.6,0.7,1,1
c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.4,165.4,27.1,164.7,27.8,164z"/>
<g>
<path class="st1" d="M18.6,191.5v1.1h-4.4v-6.4h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H18.6z"/>
<path class="st1" d="M19.8,192.6v-6.4h2.3c0.5,0,1,0.1,1.4,0.3s0.7,0.4,1,0.7c0.3,0.3,0.5,0.6,0.6,1c0.1,0.4,0.2,0.8,0.2,1.2
c0,0.5-0.1,0.9-0.2,1.3c-0.1,0.4-0.4,0.7-0.6,1c-0.3,0.3-0.6,0.5-1,0.6c-0.4,0.2-0.8,0.2-1.3,0.2H19.8z M24,189.4
c0-0.3,0-0.6-0.1-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.2-0.8-0.2h-1.1v4.2h1.1c0.3,0,0.6-0.1,0.8-0.2
c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C24,189.9,24,189.7,24,189.4z"/>
<path class="st1" d="M26.5,192.6v-6.4h1.2v6.4H26.5z"/>
<path class="st1" d="M34.1,187.3h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V187.3z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9 KiB

View file

@ -1,306 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 150" style="enable-background:new 0 0 50 150;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.9;}
.st1{fill:#FFFFFF;}
.st2{fill:#1E1E1E;}
.st3{fill:#EAEAEA;}
.st4{opacity:0.47;}
</style>
<g>
<g class="st0">
<path class="st1" d="M50,46.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46.1z"/>
</g>
</g>
<g>
<g class="st0">
<path class="st2" d="M50,96.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.1z"/>
</g>
</g>
<g>
<path d="M6.7,41.3v1.1H2.2V36h4.4v1.1H3.5v1.5h2.7v1H3.5v1.7H6.7z"/>
<path d="M8.3,36l1.6,2.4l1.6-2.4h1.3l-2.3,3.2l2.2,3.1h-1.3l-1.5-2.3l-1.5,2.3H7l2.2-3.1L7,36H8.3z"/>
<path d="M12.8,42.4l2.5-6.4h1l2.5,6.4h-1.3L17,40.8h-2.2l-0.6,1.6H12.8z M15.9,37.3l-0.9,2.6h1.8L15.9,37.3z"/>
<path d="M24.8,42.4v-4.2l-1.6,3.1h-0.7l-1.6-3.1v4.2h-1.2V36h1.3l1.9,3.6l1.9-3.6H26v6.4H24.8z"/>
<path d="M27.3,42.4V36H30c0.3,0,0.6,0.1,0.8,0.2s0.5,0.3,0.6,0.5c0.2,0.2,0.3,0.4,0.4,0.7c0.1,0.3,0.2,0.5,0.2,0.8
c0,0.3,0,0.5-0.1,0.8c-0.1,0.3-0.2,0.5-0.4,0.7c-0.2,0.2-0.4,0.4-0.6,0.5c-0.2,0.1-0.5,0.2-0.8,0.2h-1.5v2.1H27.3z M28.6,39.1H30
c0.2,0,0.4-0.1,0.6-0.3c0.2-0.2,0.2-0.4,0.2-0.8c0-0.2,0-0.3-0.1-0.4c0-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.3-0.2
c-0.1,0-0.2-0.1-0.3-0.1h-1.4V39.1z"/>
<path d="M32.9,42.4V36h1.2v5.3h3.3v1.1H32.9z"/>
<path d="M42.7,41.3v1.1h-4.4V36h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H42.7z"/>
<path d="M47.4,37.6c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.3,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.3,0.3-0.3,0.5c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2s0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.6,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.6,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.4,0.1,0.7
c0,0.3-0.1,0.6-0.2,0.9c-0.1,0.2-0.3,0.4-0.5,0.6s-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.4-0.2
s-0.9-0.3-1.3-0.6l0.5-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.6,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1-0.2,1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3S44,39.2,43.8,39c-0.2-0.1-0.3-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6s0.5-0.3,0.7-0.4c0.3-0.1,0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.2,0.2c0.4,0.1,0.7,0.3,1,0.5L47.4,37.6z"/>
</g>
<g>
<path class="st3" d="M6.7,91.3v1.1H2.2V86h4.4v1.1H3.5v1.5h2.7v1H3.5v1.7H6.7z"/>
<path class="st3" d="M8.3,86l1.6,2.4l1.6-2.4h1.3l-2.3,3.2l2.2,3.1h-1.3l-1.5-2.3l-1.5,2.3H7l2.2-3.1L7,86H8.3z"/>
<path class="st3" d="M12.8,92.4l2.5-6.4h1l2.5,6.4h-1.3L17,90.8h-2.2l-0.6,1.6H12.8z M15.9,87.3l-0.9,2.6h1.8L15.9,87.3z"/>
<path class="st3" d="M24.8,92.4v-4.2l-1.6,3.1h-0.7l-1.6-3.1v4.2h-1.2V86h1.3l1.9,3.6l1.9-3.6H26v6.4H24.8z"/>
<path class="st3" d="M27.3,92.4V86H30c0.3,0,0.6,0.1,0.8,0.2s0.5,0.3,0.6,0.5c0.2,0.2,0.3,0.4,0.4,0.7c0.1,0.3,0.2,0.5,0.2,0.8
c0,0.3,0,0.5-0.1,0.8c-0.1,0.3-0.2,0.5-0.4,0.7c-0.2,0.2-0.4,0.4-0.6,0.5c-0.2,0.1-0.5,0.2-0.8,0.2h-1.5v2.1H27.3z M28.6,89.1H30
c0.2,0,0.4-0.1,0.6-0.3c0.2-0.2,0.2-0.4,0.2-0.8c0-0.2,0-0.3-0.1-0.4s-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.3-0.2
c-0.1,0-0.2-0.1-0.3-0.1h-1.4V89.1z"/>
<path class="st3" d="M32.9,92.4V86h1.2v5.3h3.3v1.1H32.9z"/>
<path class="st3" d="M42.7,91.3v1.1h-4.4V86h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H42.7z"/>
<path class="st3" d="M47.4,87.6c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.3,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.3,0.3-0.3,0.5c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2c0.1,0.1,0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.6,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.6,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.4,0.1,0.7
c0,0.3-0.1,0.6-0.2,0.9s-0.3,0.4-0.5,0.6c-0.2,0.1-0.5,0.3-0.8,0.3s-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.4-0.2
c-0.5-0.1-0.9-0.3-1.3-0.6l0.5-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.6,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1-0.2,1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2s-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.3c-0.2-0.1-0.3-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6s0.5-0.3,0.7-0.4c0.3-0.1,0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.2,0.2c0.4,0.1,0.7,0.3,1,0.5L47.4,87.6z"/>
</g>
<g>
<path d="M33,8.1H15.9c-0.9,0-1.7,0.7-1.7,1.7v12.1c0,0.9,0.7,1.7,1.7,1.7h7.7v1.8l-5.3,3c-0.4,0.2-0.5,0.7-0.3,1.1
c0.2,0.4,0.7,0.5,1.1,0.3l4.5-2.5v2.6c0,0.4,0.3,0.8,0.8,0.8c0.4,0,0.8-0.3,0.8-0.8v-2.6l4.3,2.6c0.1,0.1,0.3,0.1,0.4,0.1
c0.3,0,0.5-0.1,0.7-0.4c0.2-0.4,0.1-0.8-0.3-1.1l-5.1-3.1v-1.8H33c0.9,0,1.7-0.7,1.7-1.7V9.8C34.7,8.8,33.9,8.1,33,8.1z M33,21.9
H15.9V9.8H33V21.9z"/>
<path d="M26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5
C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5
C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5
C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5
C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5C26.3,13.5,26.3,13.5,26.3,13.5
C26.3,13.5,26.3,13.5,26.3,13.5C26.4,13.5,26.4,13.6,26.3,13.5c0.1,0.1,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,0.2,0.1,0.2,0.2l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0.2,0.2,0.4,0.3,0.6,0.3c0.2,0,0.4-0.1,0.6-0.2c0.3-0.3,0.4-0.9,0-1.2c-0.2-0.2-0.4-0.4-0.7-0.6c-0.2-0.1-0.3-0.2-0.5-0.2
c-0.3,0-0.5,0.1-0.7,0.3C25.8,12.7,25.9,13.2,26.3,13.5z"/>
<path d="M23.8,13c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0l0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0,0.2,0,0.2,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9c-0.3,0-0.6,0-0.9,0.1c-0.5,0.1-0.8,0.5-0.7,1C23,12.7,23.4,13,23.8,13z"/>
<path d="M27.5,15.8C27.5,15.8,27.5,15.8,27.5,15.8C27.5,15.8,27.5,15.8,27.5,15.8C27.5,15.8,27.5,15.8,27.5,15.8
C27.5,15.8,27.5,15.9,27.5,15.8L27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8L27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8
C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8
C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8
C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8
C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8
C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8C27.5,15.9,27.5,15.9,27.5,15.8
c0,0.1,0,0.1,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0.1,0,0.2,0,0.2
c-0.1,0.5,0.2,0.9,0.7,1c0,0,0.1,0,0.1,0c0.4,0,0.8-0.3,0.8-0.7c0-0.2,0.1-0.5,0.1-0.8c0,0,0-0.1,0-0.1c0-0.5-0.4-0.8-0.9-0.8
c0,0,0,0,0,0C27.8,14.9,27.5,15.3,27.5,15.8z"/>
<path d="M26.3,20.1c0.1,0,0.3,0,0.4-0.1c0.3-0.1,0.5-0.3,0.7-0.5c0.4-0.3,0.4-0.8,0.1-1.2c-0.2-0.2-0.4-0.3-0.7-0.3
c-0.2,0-0.4,0.1-0.5,0.2c-0.1,0.1-0.3,0.2-0.5,0.3c-0.4,0.2-0.6,0.8-0.3,1.2C25.7,20,26,20.1,26.3,20.1z"/>
<path d="M20.2,17.9c0.1,0.3,0.5,0.5,0.8,0.5c0.1,0,0.2,0,0.4-0.1c0.4-0.2,0.6-0.7,0.4-1.1c0-0.1-0.1-0.1-0.1-0.2l0,0c0,0,0,0,0,0
l0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0-0.1-0.1-0.2-0.1-0.3
c-0.1-0.4-0.4-0.6-0.8-0.6c-0.1,0-0.1,0-0.2,0c-0.5,0.1-0.7,0.6-0.6,1C20,17.3,20.1,17.6,20.2,17.9z"/>
<path d="M20.7,14.9c0.1,0.1,0.3,0.1,0.4,0.1c0.3,0,0.6-0.2,0.8-0.5c0.1-0.1,0.1-0.2,0.2-0.3c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0.1-0.1,0.1-0.1c0.3-0.4,0.2-0.9-0.2-1.2c-0.2-0.1-0.3-0.2-0.5-0.2
c-0.3,0-0.5,0.1-0.7,0.3c-0.2,0.2-0.3,0.5-0.5,0.7C20.1,14.1,20.2,14.7,20.7,14.9z"/>
<path d="M22.6,20.2c0.3,0.1,0.5,0.2,0.8,0.3c0.1,0,0.1,0,0.2,0c0.4,0,0.7-0.3,0.8-0.7c0.1-0.5-0.2-0.9-0.6-1c0,0,0,0,0,0l0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c-0.2,0-0.3-0.1-0.5-0.2
c-0.1,0-0.2-0.1-0.3-0.1c-0.3,0-0.6,0.2-0.8,0.5C22,19.5,22.2,20,22.6,20.2z"/>
</g>
<g>
<path class="st3" d="M33,58.5H15.9c-0.9,0-1.7,0.7-1.7,1.7v12.1c0,0.9,0.7,1.7,1.7,1.7h7.7v1.8l-5.3,3c-0.4,0.2-0.5,0.7-0.3,1.1
c0.2,0.4,0.7,0.5,1.1,0.3l4.5-2.5v2.6c0,0.4,0.3,0.8,0.8,0.8c0.4,0,0.8-0.3,0.8-0.8v-2.6l4.3,2.6c0.1,0.1,0.3,0.1,0.4,0.1
c0.3,0,0.5-0.1,0.7-0.4c0.2-0.4,0.1-0.8-0.3-1.1l-5.1-3.1v-1.8H33c0.9,0,1.7-0.7,1.7-1.7V60.2C34.7,59.2,33.9,58.5,33,58.5z
M33,72.3H15.9V60.2H33V72.3z"/>
<path class="st3" d="M26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9
C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9
C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9
C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9
C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9C26.3,63.9,26.3,63.9,26.3,63.9
C26.3,63.9,26.3,63.9,26.3,63.9C26.4,63.9,26.4,63.9,26.3,63.9c0.1,0.1,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,0.2,0.1,0.2,0.2l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0.2,0.2,0.4,0.3,0.6,0.3c0.2,0,0.4-0.1,0.6-0.2c0.3-0.3,0.4-0.9,0-1.2c-0.2-0.2-0.4-0.4-0.7-0.6c-0.2-0.1-0.3-0.2-0.5-0.2
c-0.3,0-0.5,0.1-0.7,0.3C25.8,63,25.9,63.6,26.3,63.9z"/>
<path class="st3" d="M23.8,63.4c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0l0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0,0.2,0,0.2,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9c-0.3,0-0.6,0-0.9,0.1c-0.5,0.1-0.8,0.5-0.7,1
C23,63.1,23.4,63.4,23.8,63.4z"/>
<path class="st3" d="M27.5,66.2C27.5,66.2,27.5,66.2,27.5,66.2C27.5,66.2,27.5,66.2,27.5,66.2C27.5,66.2,27.5,66.2,27.5,66.2
C27.5,66.2,27.5,66.2,27.5,66.2L27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2L27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2
C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2
C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2
C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2
C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2
C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2C27.5,66.3,27.5,66.3,27.5,66.2
c0,0.1,0,0.1,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0.1,0,0.2,0,0.2
c-0.1,0.5,0.2,0.9,0.7,1c0,0,0.1,0,0.1,0c0.4,0,0.8-0.3,0.8-0.7c0-0.2,0.1-0.5,0.1-0.8c0,0,0-0.1,0-0.1c0-0.5-0.4-0.8-0.9-0.8
c0,0,0,0,0,0C27.8,65.3,27.5,65.7,27.5,66.2z"/>
<path class="st3" d="M26.3,70.5c0.1,0,0.3,0,0.4-0.1c0.3-0.1,0.5-0.3,0.7-0.5c0.4-0.3,0.4-0.8,0.1-1.2c-0.2-0.2-0.4-0.3-0.7-0.3
c-0.2,0-0.4,0.1-0.5,0.2c-0.1,0.1-0.3,0.2-0.5,0.3c-0.4,0.2-0.6,0.8-0.3,1.2C25.7,70.4,26,70.5,26.3,70.5z"/>
<path class="st3" d="M20.2,68.3c0.1,0.3,0.5,0.5,0.8,0.5c0.1,0,0.2,0,0.4-0.1c0.4-0.2,0.6-0.7,0.4-1.1c0-0.1-0.1-0.1-0.1-0.2l0,0
c0,0,0,0,0,0l0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0-0.1-0.1-0.2-0.1-0.3
c-0.1-0.4-0.4-0.6-0.8-0.6c-0.1,0-0.1,0-0.2,0c-0.5,0.1-0.7,0.6-0.6,1C20,67.7,20.1,68,20.2,68.3z"/>
<path class="st3" d="M20.7,65.3c0.1,0.1,0.3,0.1,0.4,0.1c0.3,0,0.6-0.2,0.8-0.5c0.1-0.1,0.1-0.2,0.2-0.3c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0.1-0.1,0.1-0.1c0.3-0.4,0.2-0.9-0.2-1.2c-0.2-0.1-0.3-0.2-0.5-0.2
c-0.3,0-0.5,0.1-0.7,0.3c-0.2,0.2-0.3,0.5-0.5,0.7C20.1,64.5,20.2,65.1,20.7,65.3z"/>
<path class="st3" d="M22.6,70.6c0.3,0.1,0.5,0.2,0.8,0.3c0.1,0,0.1,0,0.2,0c0.4,0,0.7-0.3,0.8-0.7c0.1-0.5-0.2-0.9-0.6-1
c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c-0.2,0-0.3-0.1-0.5-0.2
c-0.1,0-0.2-0.1-0.3-0.1c-0.3,0-0.6,0.2-0.8,0.5C22,69.9,22.2,70.4,22.6,70.6z"/>
</g>
<g class="st4">
<g class="st0">
<path class="st2" d="M50,146.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.1z"/>
</g>
</g>
<g class="st4">
<path class="st3" d="M6.7,141.3v1.1H2.2V136h4.4v1.1H3.5v1.5h2.7v1H3.5v1.7H6.7z"/>
<path class="st3" d="M8.3,136l1.6,2.4l1.6-2.4h1.3l-2.3,3.2l2.2,3.1h-1.3l-1.5-2.3l-1.5,2.3H7l2.2-3.1L7,136H8.3z"/>
<path class="st3" d="M12.8,142.4l2.5-6.4h1l2.5,6.4h-1.3l-0.6-1.6h-2.2l-0.6,1.6H12.8z M15.9,137.3l-0.9,2.6h1.8L15.9,137.3z"/>
<path class="st3" d="M24.8,142.4v-4.2l-1.6,3.1h-0.7l-1.6-3.1v4.2h-1.2V136h1.3l1.9,3.6l1.9-3.6H26v6.4H24.8z"/>
<path class="st3" d="M27.3,142.4V136H30c0.3,0,0.6,0.1,0.8,0.2s0.5,0.3,0.6,0.5c0.2,0.2,0.3,0.4,0.4,0.7c0.1,0.3,0.2,0.5,0.2,0.8
c0,0.3,0,0.5-0.1,0.8c-0.1,0.3-0.2,0.5-0.4,0.7c-0.2,0.2-0.4,0.4-0.6,0.5c-0.2,0.1-0.5,0.2-0.8,0.2h-1.5v2.1H27.3z M28.6,139.1H30
c0.2,0,0.4-0.1,0.6-0.3c0.2-0.2,0.2-0.4,0.2-0.8c0-0.2,0-0.3-0.1-0.4s-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.3-0.2
c-0.1,0-0.2-0.1-0.3-0.1h-1.4V139.1z"/>
<path class="st3" d="M32.9,142.4V136h1.2v5.3h3.3v1.1H32.9z"/>
<path class="st3" d="M42.7,141.3v1.1h-4.4V136h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H42.7z"/>
<path class="st3" d="M47.4,137.6c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.3,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.3,0.3-0.3,0.5c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2c0.1,0.1,0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.6,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.6,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.4,0.1,0.7
c0,0.3-0.1,0.6-0.2,0.9s-0.3,0.4-0.5,0.6c-0.2,0.1-0.5,0.3-0.8,0.3s-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.4-0.2
c-0.5-0.1-0.9-0.3-1.3-0.6l0.5-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.6,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1-0.2,1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2s-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.3c-0.2-0.1-0.3-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6s0.5-0.3,0.7-0.4c0.3-0.1,0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.2,0.2c0.4,0.1,0.7,0.3,1,0.5L47.4,137.6z"/>
</g>
<g class="st4">
<path class="st3" d="M33,108.5H15.9c-0.9,0-1.7,0.7-1.7,1.7v12.1c0,0.9,0.7,1.7,1.7,1.7h7.7v1.8l-5.3,3c-0.4,0.2-0.5,0.7-0.3,1.1
c0.2,0.4,0.7,0.5,1.1,0.3l4.5-2.5v2.6c0,0.4,0.3,0.8,0.8,0.8c0.4,0,0.8-0.3,0.8-0.8v-2.6l4.3,2.6c0.1,0.1,0.3,0.1,0.4,0.1
c0.3,0,0.5-0.1,0.7-0.4c0.2-0.4,0.1-0.8-0.3-1.1l-5.1-3.1v-1.8H33c0.9,0,1.7-0.7,1.7-1.7v-12.1C34.7,109.2,33.9,108.5,33,108.5z
M33,122.3H15.9v-12.1H33V122.3z"/>
<path class="st3" d="M26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9
C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9
C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9
C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9
C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9
C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9
C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9C26.3,113.9,26.3,113.9,26.3,113.9
C26.4,113.9,26.4,113.9,26.3,113.9c0.1,0.1,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0.1,0.1,0.2,0.1,0.2,0.2l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0.2,0.2,0.4,0.3,0.6,0.3
c0.2,0,0.4-0.1,0.6-0.2c0.3-0.3,0.4-0.9,0-1.2c-0.2-0.2-0.4-0.4-0.7-0.6c-0.2-0.1-0.3-0.2-0.5-0.2c-0.3,0-0.5,0.1-0.7,0.3
C25.8,113,25.9,113.6,26.3,113.9z"/>
<path class="st3" d="M23.8,113.4c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0h0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0,0.2,0,0.2,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0.5,0,0.9-0.4,0.9-0.9s-0.4-0.9-0.9-0.9c-0.3,0-0.6,0-0.9,0.1c-0.5,0.1-0.8,0.5-0.7,1C23,113.1,23.4,113.4,23.8,113.4
z"/>
<path class="st3" d="M27.5,116.2C27.5,116.2,27.5,116.2,27.5,116.2C27.5,116.2,27.5,116.2,27.5,116.2
C27.5,116.2,27.5,116.2,27.5,116.2C27.5,116.2,27.5,116.2,27.5,116.2L27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2L27.5,116.2
C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2
C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2
C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2
C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2
C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2
C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2
C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2C27.5,116.3,27.5,116.3,27.5,116.2c0,0.1,0,0.1,0,0.1
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0.1,0,0.2,0,0.2c-0.1,0.5,0.2,0.9,0.7,1
c0,0,0.1,0,0.1,0c0.4,0,0.8-0.3,0.8-0.7c0-0.2,0.1-0.5,0.1-0.8c0,0,0-0.1,0-0.1c0-0.5-0.4-0.8-0.9-0.8c0,0,0,0,0,0
C27.8,115.3,27.5,115.7,27.5,116.2z"/>
<path class="st3" d="M26.3,120.5c0.1,0,0.3,0,0.4-0.1c0.3-0.1,0.5-0.3,0.7-0.5c0.4-0.3,0.4-0.8,0.1-1.2c-0.2-0.2-0.4-0.3-0.7-0.3
c-0.2,0-0.4,0.1-0.5,0.2c-0.1,0.1-0.3,0.2-0.5,0.3c-0.4,0.2-0.6,0.8-0.3,1.2C25.7,120.4,26,120.5,26.3,120.5z"/>
<path class="st3" d="M20.2,118.3c0.1,0.3,0.5,0.5,0.8,0.5c0.1,0,0.2,0,0.4-0.1c0.4-0.2,0.6-0.7,0.4-1.1c0-0.1-0.1-0.1-0.1-0.2l0,0
c0,0,0,0,0,0l0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0-0.1-0.1-0.2-0.1-0.3
c-0.1-0.4-0.4-0.6-0.8-0.6c-0.1,0-0.1,0-0.2,0c-0.5,0.1-0.7,0.6-0.6,1C20,117.7,20.1,118,20.2,118.3z"/>
<path class="st3" d="M20.7,115.3c0.1,0.1,0.3,0.1,0.4,0.1c0.3,0,0.6-0.2,0.8-0.5c0.1-0.1,0.1-0.2,0.2-0.3c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0.1-0.1,0.1-0.1c0.3-0.4,0.2-0.9-0.2-1.2c-0.2-0.1-0.3-0.2-0.5-0.2
c-0.3,0-0.5,0.1-0.7,0.3c-0.2,0.2-0.3,0.5-0.5,0.7C20.1,114.5,20.2,115.1,20.7,115.3z"/>
<path class="st3" d="M22.6,120.6c0.3,0.1,0.5,0.2,0.8,0.3c0.1,0,0.1,0,0.2,0c0.4,0,0.7-0.3,0.8-0.7c0.1-0.5-0.2-0.9-0.6-1
c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c-0.2,0-0.3-0.1-0.5-0.2
c-0.1,0-0.2-0.1-0.3-0.1c-0.3,0-0.6,0.2-0.8,0.5C22,119.9,22.2,120.4,22.6,120.6z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 30 KiB

View file

@ -1,124 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 150" style="enable-background:new 0 0 50 150;" xml:space="preserve">
<style type="text/css">
.st0{opacity:0.49;}
.st1{opacity:0.9;}
.st2{fill:#1E1E1E;}
.st3{fill:#FFFFFF;}
.st4{fill:#EAEAEA;}
.st5{opacity:0.49;fill:#EAEAEA;}
</style>
<g class="st0">
<g class="st1">
<path class="st2" d="M50,146.4c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.4z"/>
</g>
</g>
<g class="st1">
<path class="st3" d="M50,46.6c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46.6z"/>
</g>
<path d="M27.3,21.1v3.5c0,0.6-0.5,1.1-1.1,1.1H13c-0.6,0-1.1-0.5-1.1-1.1v-6.5c0-0.6,0.5-1.1,1.1-1.1h3.8c-0.1-0.4-0.3-0.9-0.3-1.3
H13c-1.4,0-2.4,1.1-2.4,2.4v6.5c0,1.4,1.1,2.4,2.4,2.4h5.9v1.2h-3.4c-0.3,0-0.6,0.3-0.6,0.7c0,0.3,0.3,0.7,0.6,0.7h8.5
c0.3,0,0.6-0.3,0.6-0.7c0-0.3-0.3-0.7-0.6-0.7h-3.7V27c-0.1,0-0.2,0-0.4,0h6.3c1.4,0,2.4-1.1,2.4-2.4v-4.4
C28.2,20.5,27.8,20.8,27.3,21.1z"/>
<path d="M35.7,19.8h-3.7c-0.9,0-1.6-0.9-2.1-1.7c-0.2-0.3-0.6-0.8-0.8-1c-0.2,0.1-0.6,0.6-0.8,0.9c-0.6,0.8-1.2,1.8-2.2,1.8h-3.5
c-2.8,0-5-2.2-5-5v-2.3c0-2.8,2.3-5,5-5h13.1c2.8,0,5,2.2,5,5v2.3C40.8,17.6,38.5,19.8,35.7,19.8z M29.2,15.8c0.8,0,1.4,0.8,1.9,1.6
c0.2,0.4,0.8,1.1,1,1.1h3.7c2,0,3.7-1.6,3.7-3.7v-2.3c0-2-1.7-3.7-3.7-3.7H22.7c-2,0-3.7,1.6-3.7,3.7v2.3c0,2,1.7,3.7,3.7,3.7h3.5
c0.3,0,0.8-0.7,1.1-1.2C27.8,16.5,28.4,15.8,29.2,15.8C29.2,15.8,29.2,15.8,29.2,15.8z"/>
<path d="M36.9,21.6c-0.2-0.1-0.4,0-0.6,0.1l-1.8,1.8l0.7,0.7l0.9-0.9c0,0,0.3,1.3-0.7,2.4c-1,1-2.3,0.6-2.3,0.6l0.8-0.8l-0.8-0.8
l-1.7,1.7l0,0c0,0-0.1,0.1-0.1,0.2c-0.1,0.2,0,0.4,0.1,0.6l1.8,1.8l0.8-0.8l-0.9-0.9c0,0,1.7,0.3,3.1-1.1c1.3-1.3,1-3.1,1-3.1
l0.8,0.8l0.8-0.8l-1.6-1.6C37.2,21.8,37,21.7,36.9,21.6z"/>
<g>
<path d="M10.3,37.9c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.3,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.3,0.3-0.3,0.5c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2s0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.6,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.6,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.4,0.1,0.7
c0,0.3-0.1,0.6-0.2,0.9c-0.1,0.2-0.3,0.4-0.5,0.6s-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.4-0.2S6.4,42.2,6,41.9
l0.5-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.6,0.2c0.2,0.1,0.5,0.1,0.7,0.1c0.7,0,1-0.2,1-0.7
c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2c-0.3-0.1-0.6-0.2-0.8-0.3
s-0.4-0.2-0.6-0.3c-0.2-0.1-0.3-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.3,0.1-0.6,0.2-0.9c0.1-0.3,0.3-0.5,0.5-0.6
s0.5-0.3,0.7-0.4c0.3-0.1,0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.2,0.2c0.4,0.1,0.7,0.3,1,0.5L10.3,37.9z"/>
<path d="M14.3,36.3h1.1l0.7,2.1l0.7-2.1H18L17,39.2l0.8,2l1.8-5h1.4l-2.6,6.4h-1L16.2,40l-1.1,2.7h-1l-2.6-6.4h1.3l1.8,5l0.8-2
L14.3,36.3z"/>
<path d="M21.8,42.6v-6.4h1.2v6.4H21.8z"/>
<path d="M29.4,37.3h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V37.3z"/>
<path d="M30,39.4c0-0.4,0.1-0.8,0.2-1.2c0.1-0.4,0.3-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7s0.8-0.3,1.3-0.3c0.6,0,1.1,0.1,1.5,0.4
c0.4,0.3,0.7,0.6,0.9,1l-1,0.7c-0.1-0.2-0.2-0.3-0.3-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.3-0.1-0.4-0.2c-0.1,0-0.3,0-0.4,0
c-0.3,0-0.6,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.1,0.2-0.3,0.4-0.3,0.7s-0.1,0.5-0.1,0.8c0,0.3,0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7
c0.2,0.2,0.3,0.4,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.1,0,0.3,0,0.4-0.1c0.1,0,0.3-0.1,0.4-0.2c0.1-0.1,0.3-0.2,0.4-0.3
c0.1-0.1,0.2-0.3,0.3-0.4l1,0.6c-0.1,0.2-0.2,0.5-0.4,0.6c-0.2,0.2-0.4,0.3-0.6,0.5c-0.2,0.1-0.5,0.2-0.7,0.3
c-0.3,0.1-0.5,0.1-0.8,0.1c-0.4,0-0.9-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-1-0.8c-0.3-0.3-0.5-0.7-0.6-1.1C30.1,40.2,30,39.8,30,39.4z"/>
<path d="M42,36.3v6.4h-1.2v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6h2.9v-2.6H42z"/>
</g>
<g class="st1">
<path class="st2" d="M50,96.6c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.6z"/>
</g>
<path class="st4" d="M27.3,71.1v3.5c0,0.6-0.5,1.1-1.1,1.1H13c-0.6,0-1.1-0.5-1.1-1.1v-6.5c0-0.6,0.5-1.1,1.1-1.1h3.8
c-0.1-0.4-0.3-0.9-0.3-1.3H13c-1.4,0-2.4,1.1-2.4,2.4v6.5c0,1.4,1.1,2.4,2.4,2.4h5.9v1.2h-3.4c-0.3,0-0.6,0.3-0.6,0.7
c0,0.3,0.3,0.7,0.6,0.7h8.5c0.3,0,0.6-0.3,0.6-0.7c0-0.3-0.3-0.7-0.6-0.7h-3.7V77c-0.1,0-0.2,0-0.4,0h6.3c1.4,0,2.4-1.1,2.4-2.4
v-4.4C28.2,70.5,27.8,70.8,27.3,71.1z"/>
<path class="st4" d="M35.7,69.8h-3.7c-0.9,0-1.6-0.9-2.1-1.7c-0.2-0.3-0.6-0.8-0.8-1c-0.2,0.1-0.6,0.6-0.8,0.9
c-0.6,0.8-1.2,1.8-2.2,1.8h-3.5c-2.8,0-5-2.2-5-5v-2.3c0-2.8,2.3-5,5-5h13.1c2.8,0,5,2.2,5,5v2.3C40.8,67.6,38.5,69.8,35.7,69.8z
M29.2,65.8c0.8,0,1.4,0.8,1.9,1.6c0.2,0.4,0.8,1.1,1,1.1h3.7c2,0,3.7-1.6,3.7-3.7v-2.3c0-2-1.7-3.7-3.7-3.7H22.7
c-2,0-3.7,1.6-3.7,3.7v2.3c0,2,1.7,3.7,3.7,3.7h3.5c0.3,0,0.8-0.7,1.1-1.2C27.8,66.5,28.4,65.8,29.2,65.8
C29.2,65.8,29.2,65.8,29.2,65.8z"/>
<path class="st4" d="M36.9,71.6c-0.2-0.1-0.4,0-0.6,0.1l-1.8,1.8l0.7,0.7l0.9-0.9c0,0,0.3,1.3-0.7,2.4c-1,1-2.3,0.6-2.3,0.6l0.8-0.8
l-0.8-0.8l-1.7,1.7l0,0c0,0-0.1,0.1-0.1,0.2c-0.1,0.2,0,0.4,0.1,0.6l1.8,1.8l0.8-0.8l-0.9-0.9c0,0,1.7,0.3,3.1-1.1
c1.3-1.3,1-3.1,1-3.1l0.8,0.8l0.8-0.8l-1.6-1.6C37.2,71.8,37,71.7,36.9,71.6z"/>
<g>
<path class="st4" d="M10.3,87.9c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.1-0.4-0.2s-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.3,0-0.6,0.1-0.8,0.2S7.6,87.8,7.6,88c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2c0.1,0.1,0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.6,0.2c0.3,0.1,0.6,0.2,0.9,0.3s0.5,0.2,0.6,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.4,0.1,0.7
c0,0.3-0.1,0.6-0.2,0.9c-0.1,0.2-0.3,0.4-0.5,0.6c-0.2,0.2-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.4-0.2
c-0.5-0.1-0.9-0.3-1.3-0.6l0.5-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.6,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1-0.2,1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.3S6.5,89,6.4,88.8c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6s0.5-0.3,0.7-0.4s0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.2,0.2s0.7,0.3,1,0.5L10.3,87.9z"/>
<path class="st4" d="M14.3,86.3h1.1l0.7,2.1l0.7-2.1H18L17,89.2l0.8,2l1.8-5h1.4l-2.6,6.4h-1L16.2,90l-1.1,2.7h-1l-2.6-6.4h1.3
l1.8,5l0.8-2L14.3,86.3z"/>
<path class="st4" d="M21.8,92.6v-6.4h1.2v6.4H21.8z"/>
<path class="st4" d="M29.4,87.3h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V87.3z"/>
<path class="st4" d="M30,89.4c0-0.4,0.1-0.8,0.2-1.2c0.1-0.4,0.3-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7c0.4-0.2,0.8-0.3,1.3-0.3
c0.6,0,1.1,0.1,1.5,0.4s0.7,0.6,0.9,1l-1,0.7c-0.1-0.2-0.2-0.3-0.3-0.5c-0.1-0.1-0.2-0.2-0.4-0.3s-0.3-0.1-0.4-0.2
c-0.1,0-0.3,0-0.4,0c-0.3,0-0.6,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.1,0.2-0.3,0.4-0.3,0.7s-0.1,0.5-0.1,0.8c0,0.3,0,0.6,0.1,0.8
c0.1,0.3,0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.1,0,0.3,0,0.4-0.1c0.1,0,0.3-0.1,0.4-0.2
c0.1-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.4l1,0.6c-0.1,0.2-0.2,0.5-0.4,0.6c-0.2,0.2-0.4,0.3-0.6,0.5
c-0.2,0.1-0.5,0.2-0.7,0.3c-0.3,0.1-0.5,0.1-0.8,0.1c-0.4,0-0.9-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-1-0.8c-0.3-0.3-0.5-0.7-0.6-1.1
C30.1,90.2,30,89.8,30,89.4z"/>
<path class="st4" d="M42,86.2v6.4h-1.2v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6h2.9v-2.6H42z"/>
</g>
<path class="st5" d="M27.3,121.1v3.5c0,0.6-0.5,1.1-1.1,1.1H13c-0.6,0-1.1-0.5-1.1-1.1v-6.5c0-0.6,0.5-1.1,1.1-1.1h3.8
c-0.1-0.4-0.3-0.9-0.3-1.3H13c-1.4,0-2.4,1.1-2.4,2.4v6.5c0,1.4,1.1,2.4,2.4,2.4h5.9v1.2h-3.4c-0.3,0-0.6,0.3-0.6,0.7
c0,0.3,0.3,0.7,0.6,0.7h8.5c0.3,0,0.6-0.3,0.6-0.7c0-0.3-0.3-0.7-0.6-0.7h-3.7V127c-0.1,0-0.2,0-0.4,0h6.3c1.4,0,2.4-1.1,2.4-2.4
v-4.4C28.2,120.5,27.8,120.8,27.3,121.1z"/>
<path class="st5" d="M35.7,119.8h-3.7c-0.9,0-1.6-0.9-2.1-1.7c-0.2-0.3-0.6-0.8-0.8-1c-0.2,0.1-0.6,0.6-0.8,0.9
c-0.6,0.8-1.2,1.8-2.2,1.8h-3.5c-2.8,0-5-2.2-5-5v-2.3c0-2.8,2.3-5,5-5h13.1c2.8,0,5,2.2,5,5v2.3C40.8,117.6,38.5,119.8,35.7,119.8z
M29.2,115.8c0.8,0,1.4,0.8,1.9,1.6c0.2,0.4,0.8,1.1,1,1.1h3.7c2,0,3.7-1.6,3.7-3.7v-2.3c0-2-1.7-3.7-3.7-3.7H22.7
c-2,0-3.7,1.6-3.7,3.7v2.3c0,2,1.7,3.7,3.7,3.7h3.5c0.3,0,0.8-0.7,1.1-1.2C27.8,116.5,28.4,115.8,29.2,115.8
C29.2,115.8,29.2,115.8,29.2,115.8z"/>
<path class="st5" d="M36.9,121.6c-0.2-0.1-0.4,0-0.6,0.1l-1.8,1.8l0.7,0.7l0.9-0.9c0,0,0.3,1.3-0.7,2.4c-1,1-2.3,0.6-2.3,0.6
l0.8-0.8l-0.8-0.8l-1.7,1.7l0,0c0,0-0.1,0.1-0.1,0.2c-0.1,0.2,0,0.4,0.1,0.6l1.8,1.8l0.8-0.8l-0.9-0.9c0,0,1.7,0.3,3.1-1.1
c1.3-1.3,1-3.1,1-3.1l0.8,0.8l0.8-0.8l-1.6-1.6C37.2,121.8,37,121.7,36.9,121.6z"/>
<g class="st0">
<path class="st4" d="M10.3,137.9c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.2-0.1-0.4-0.2s-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.3,0-0.6,0.1-0.8,0.2s-0.3,0.3-0.3,0.5c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2c0.1,0.1,0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.6,0.2c0.3,0.1,0.6,0.2,0.9,0.3s0.5,0.2,0.6,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.4,0.1,0.7
c0,0.3-0.1,0.6-0.2,0.9c-0.1,0.2-0.3,0.4-0.5,0.6c-0.2,0.2-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.4-0.2
c-0.5-0.1-0.9-0.3-1.3-0.6l0.5-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.6,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1-0.2,1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.3s-0.3-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6s0.5-0.3,0.7-0.4s0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.2,0.2s0.7,0.3,1,0.5L10.3,137.9z"/>
<path class="st4" d="M14.3,136.3h1.1l0.7,2.1l0.7-2.1H18l-1.1,2.9l0.8,2l1.8-5h1.4l-2.6,6.4h-1l-1.1-2.7l-1.1,2.7h-1l-2.6-6.4h1.3
l1.8,5l0.8-2L14.3,136.3z"/>
<path class="st4" d="M21.8,142.6v-6.4h1.2v6.4H21.8z"/>
<path class="st4" d="M29.4,137.3h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V137.3z"/>
<path class="st4" d="M30,139.4c0-0.4,0.1-0.8,0.2-1.2c0.1-0.4,0.3-0.7,0.6-1c0.3-0.3,0.6-0.5,1-0.7c0.4-0.2,0.8-0.3,1.3-0.3
c0.6,0,1.1,0.1,1.5,0.4s0.7,0.6,0.9,1l-1,0.7c-0.1-0.2-0.2-0.3-0.3-0.5c-0.1-0.1-0.2-0.2-0.4-0.3s-0.3-0.1-0.4-0.2
c-0.1,0-0.3,0-0.4,0c-0.3,0-0.6,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.1,0.2-0.3,0.4-0.3,0.7s-0.1,0.5-0.1,0.8c0,0.3,0,0.6,0.1,0.8
c0.1,0.3,0.2,0.5,0.4,0.7c0.2,0.2,0.3,0.4,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.1,0,0.3,0,0.4-0.1c0.1,0,0.3-0.1,0.4-0.2
c0.1-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.4l1,0.6c-0.1,0.2-0.2,0.5-0.4,0.6c-0.2,0.2-0.4,0.3-0.6,0.5
c-0.2,0.1-0.5,0.2-0.7,0.3c-0.3,0.1-0.5,0.1-0.8,0.1c-0.4,0-0.9-0.1-1.2-0.3c-0.4-0.2-0.7-0.4-1-0.8c-0.3-0.3-0.5-0.7-0.6-1.1
C30.1,140.2,30,139.8,30,139.4z"/>
<path class="st4" d="M42,136.2v6.4h-1.2v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6h2.9v-2.6H42z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 200.1" style="enable-background:new 0 0 50 200.1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#414042;}
.st1{fill:#FFFFFF;}
.st2{fill:#1E1E1E;}
.st3{fill:#333333;}
</style>
<g id="Layer_2">
<g>
<g>
<path class="st0" d="M50.1,146.1c0,2.2-1.8,4-4,4h-42c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.1z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M50,196.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V196.1z"/>
</g>
</g>
<g>
<g>
<path class="st1" d="M50,46c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46z"/>
</g>
</g>
<g>
<path class="st2" d="M50,96.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.1z"/>
</g>
</g>
<g id="Layer_3">
</g>
<g id="Layer_1">
<g>
<path class="st3" d="M12,42.3v-4.2l-1.6,3.1H9.6L8,38.1v4.2H6.7v-6.4h1.3l1.9,3.6l1.9-3.6h1.3v6.4H12z"/>
<path class="st3" d="M14.1,42.3l2.5-6.4h1l2.5,6.4h-1.3l-0.6-1.6H16l-0.6,1.6H14.1z M17.1,37.3l-0.9,2.6H18L17.1,37.3z"/>
<path class="st3" d="M21.1,42.3v-6.4h2.8c0.3,0,0.6,0.1,0.8,0.2s0.5,0.3,0.6,0.5c0.2,0.2,0.3,0.4,0.4,0.7c0.1,0.3,0.2,0.5,0.2,0.8
c0,0.4-0.1,0.8-0.3,1.1c-0.2,0.3-0.5,0.6-0.8,0.7l1.5,2.4h-1.4l-1.3-2.1h-1.2v2.1H21.1z M22.3,39.1h1.6c0.1,0,0.2,0,0.3-0.1
c0.1-0.1,0.2-0.1,0.3-0.2c0.1-0.1,0.1-0.2,0.2-0.3c0-0.1,0.1-0.3,0.1-0.4c0-0.1,0-0.3-0.1-0.4s-0.1-0.2-0.2-0.3
c-0.1-0.1-0.2-0.2-0.3-0.2C24,37.1,23.9,37,23.8,37h-1.5V39.1z"/>
<path class="st3" d="M27.3,42.3v-6.4h1.2v3.1l2.8-3.1h1.3l-2.4,2.8l2.6,3.6h-1.3l-2-2.9l-0.9,0.9v1.9H27.3z"/>
<path class="st3" d="M38,41.2v1.1h-4.4v-6.4h4.4V37h-3.1v1.5h2.7v1h-2.7v1.7H38z"/>
<path class="st3" d="M44,37h-2v5.3h-1.2V37h-2v-1.1H44V37z"/>
</g>
<g>
<path class="st3" d="M14.1,11.7c0.2,0,0.3,0,0.5,0c0.3,0,0.5,0,0.8,0.1c0.4,0.1,0.8,0.4,1,0.8c0.1,0.2,0.2,0.5,0.3,0.8
c0.1,0.3,0.2,0.6,0.3,1c0.1,0.5,0.3,1,0.4,1.4c0.1,0.3,0.2,0.6,0.3,0.9c0.1,0.4,0.2,0.8,0.4,1.2c0.1,0.5,0.3,1,0.4,1.5
c0,0.1,0.1,0.2,0.1,0.3c0.1,0.5,0.2,0.9,0.4,1.3c0.2,0.3,0.4,0.6,0.7,0.8c0.3,0.2,0.7,0.3,1.1,0.3c0.1,0,0.2,0,0.4,0l1.1,0l2.9,0
c1.3,0,2.5,0,3.8,0c0.6,0,1.3,0,1.9,0c0,0,0.1,0,0.1,0c0.3,0,0.6,0,0.9-0.1c0.2-0.1,0.4-0.5,0.4-0.8l0,0l0.1-0.5c0,0,0,0,0,0
c0-0.1,0-0.1,0-0.1h0c0.3-1,0.6-2.1,0.9-3.1c0.1-0.2,0.1-0.4,0.2-0.6c0.1-0.4,0.2-0.8,0.4-1.2c0.1-0.4,0.2-0.8,0-1.1
c-0.1-0.2-0.4-0.2-0.7-0.2c-0.3,0-9.6,0.1-14.5,0.2l-0.2,0l-0.3-1.1c0-0.1-0.1-0.3-0.1-0.5c0-0.1-0.1-0.2-0.1-0.3
c0-0.1,0-0.1-0.1-0.2c0-0.2-0.1-0.4-0.1-0.5c-0.1-0.3-0.3-0.7-0.6-0.9c-0.2-0.2-0.5-0.4-0.9-0.5c-0.2,0-0.3,0-0.5-0.1
c-0.2,0-0.5,0-0.7,0c-1,0-2,0-3,0c-0.1,0-0.1,0-0.2,0c-0.2,0-0.4,0-0.5,0c-0.2,0-0.3,0.1-0.4,0.2c-0.2,0.2-0.2,0.6-0.1,0.9
c0.1,0.2,0.3,0.3,0.5,0.3c0.2,0,0.4,0,0.6,0c0.3,0,0.6,0,0.8,0l0.9,0C13.8,11.7,14,11.7,14.1,11.7z M32.1,15.7l-1.3,4.7l-0.3,0.2
l-0.1,0c-0.1,0-1.1,0-2.8,0c-2.5,0-6,0-6.4,0l0,0h0c-0.3,0-0.6-0.1-0.8-0.3c-0.2-0.2-0.3-0.5-0.4-0.8c-0.1-0.6-0.3-1.3-0.5-2
c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32.1z"/>
<path class="st3" d="M22.2,24.1L22.2,24.1c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.9,0,1.5-0.6,1.5-1.5c0-0.4-0.2-0.8-0.4-1C23,24.2,22.7,24.1,22.2,24.1z"/>
<path class="st3" d="M29.3,24.1L29.3,24.1c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1.1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.8,0,1.5-0.7,1.5-1.5c0-0.4-0.1-0.7-0.4-1C30.1,24.2,29.8,24.1,29.3,24.1z"/>
</g>
<g>
<path class="st1" d="M12,92.3v-4.2l-1.6,3.1H9.6L8,88.1v4.2H6.7v-6.4h1.3l1.9,3.6l1.9-3.6h1.3v6.4H12z"/>
<path class="st1" d="M14.1,92.3l2.5-6.4h1l2.5,6.4h-1.3l-0.6-1.6H16l-0.6,1.6H14.1z M17.1,87.3l-0.9,2.6H18L17.1,87.3z"/>
<path class="st1" d="M21.1,92.3v-6.4h2.8c0.3,0,0.6,0.1,0.8,0.2s0.5,0.3,0.6,0.5c0.2,0.2,0.3,0.4,0.4,0.7c0.1,0.3,0.2,0.5,0.2,0.8
c0,0.4-0.1,0.8-0.3,1.1c-0.2,0.3-0.5,0.6-0.8,0.7l1.5,2.4h-1.4l-1.3-2.1h-1.2v2.1H21.1z M22.3,89.1h1.6c0.1,0,0.2,0,0.3-0.1
c0.1-0.1,0.2-0.1,0.3-0.2c0.1-0.1,0.1-0.2,0.2-0.3c0-0.1,0.1-0.3,0.1-0.4c0-0.1,0-0.3-0.1-0.4s-0.1-0.2-0.2-0.3
c-0.1-0.1-0.2-0.2-0.3-0.2C24,87.1,23.9,87,23.8,87h-1.5V89.1z"/>
<path class="st1" d="M27.3,92.3v-6.4h1.2v3.1l2.8-3.1h1.3l-2.4,2.8l2.6,3.6h-1.3l-2-2.9l-0.9,0.9v1.9H27.3z"/>
<path class="st1" d="M38,91.2v1.1h-4.4v-6.4h4.4V87h-3.1v1.5h2.7v1h-2.7v1.7H38z"/>
<path class="st1" d="M44,87h-2v5.3h-1.2V87h-2v-1.1H44V87z"/>
</g>
<g>
<path class="st1" d="M14.1,61.7c0.2,0,0.3,0,0.5,0c0.3,0,0.5,0,0.8,0.1c0.4,0.1,0.8,0.4,1,0.8c0.1,0.2,0.2,0.5,0.3,0.8
c0.1,0.3,0.2,0.6,0.3,1c0.1,0.5,0.3,1,0.4,1.4c0.1,0.3,0.2,0.6,0.3,0.9c0.1,0.4,0.2,0.8,0.4,1.2c0.1,0.5,0.3,1,0.4,1.5
c0,0.1,0.1,0.2,0.1,0.3c0.1,0.5,0.2,0.9,0.4,1.3c0.2,0.3,0.4,0.6,0.7,0.8c0.3,0.2,0.7,0.3,1.1,0.3c0.1,0,0.2,0,0.4,0l1.1,0l2.9,0
c1.3,0,2.5,0,3.8,0c0.6,0,1.3,0,1.9,0c0,0,0.1,0,0.1,0c0.3,0,0.6,0,0.9-0.1c0.2-0.1,0.4-0.5,0.4-0.8l0,0l0.1-0.5c0,0,0,0,0,0
c0-0.1,0-0.1,0-0.1h0c0.3-1,0.6-2.1,0.9-3.1c0.1-0.2,0.1-0.4,0.2-0.6c0.1-0.4,0.2-0.8,0.4-1.2c0.1-0.4,0.2-0.8,0-1.1
c-0.1-0.2-0.4-0.2-0.7-0.2c-0.3,0-9.6,0.1-14.5,0.2l-0.2,0l-0.3-1.1c0-0.1-0.1-0.3-0.1-0.5c0-0.1-0.1-0.2-0.1-0.3
c0-0.1,0-0.1-0.1-0.2c0-0.2-0.1-0.4-0.1-0.5c-0.1-0.3-0.3-0.7-0.6-0.9c-0.2-0.2-0.5-0.4-0.9-0.5c-0.2,0-0.3,0-0.5-0.1
c-0.2,0-0.5,0-0.7,0c-1,0-2,0-3,0c-0.1,0-0.1,0-0.2,0c-0.2,0-0.4,0-0.5,0c-0.2,0-0.3,0.1-0.4,0.2c-0.2,0.2-0.2,0.6-0.1,0.9
c0.1,0.2,0.3,0.3,0.5,0.3c0.2,0,0.4,0,0.6,0c0.3,0,0.6,0,0.8,0l0.9,0C13.8,61.7,14,61.7,14.1,61.7z M32.1,65.7l-1.3,4.7l-0.3,0.2
l-0.1,0c-0.1,0-1.1,0-2.8,0c-2.5,0-6,0-6.4,0l0,0h0c-0.3,0-0.6-0.1-0.8-0.3c-0.2-0.2-0.3-0.5-0.4-0.8c-0.1-0.6-0.3-1.3-0.5-2
c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32.1z"/>
<path class="st1" d="M22.2,74.1L22.2,74.1c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.9,0,1.5-0.6,1.5-1.5c0-0.4-0.2-0.8-0.4-1C23,74.2,22.7,74.1,22.2,74.1z"/>
<path class="st1" d="M29.3,74.1L29.3,74.1c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1.1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.8,0,1.5-0.7,1.5-1.5c0-0.4-0.1-0.7-0.4-1C30.1,74.2,29.8,74.1,29.3,74.1z"/>
</g>
<g>
<path class="st1" d="M11.8,142.4v-4.2l-1.6,3.1H9.5l-1.6-3.1v4.2H6.6V136h1.3l1.9,3.6l1.9-3.6H13v6.4H11.8z"/>
<path class="st1" d="M13.9,142.4l2.5-6.4h1l2.5,6.4h-1.3l-0.6-1.6h-2.2l-0.6,1.6H13.9z M17,137.4l-0.9,2.6h1.8L17,137.4z"/>
<path class="st1" d="M20.9,142.4V136h2.8c0.3,0,0.6,0.1,0.8,0.2s0.5,0.3,0.6,0.5c0.2,0.2,0.3,0.4,0.4,0.7c0.1,0.3,0.2,0.5,0.2,0.8
c0,0.4-0.1,0.8-0.3,1.1c-0.2,0.3-0.5,0.6-0.8,0.7l1.5,2.4h-1.4l-1.3-2.1h-1.2v2.1H20.9z M22.1,139.2h1.6c0.1,0,0.2,0,0.3-0.1
c0.1-0.1,0.2-0.1,0.3-0.2c0.1-0.1,0.1-0.2,0.2-0.3c0-0.1,0.1-0.3,0.1-0.4c0-0.1,0-0.3-0.1-0.4s-0.1-0.2-0.2-0.3
c-0.1-0.1-0.2-0.2-0.3-0.2c-0.1-0.1-0.2-0.1-0.3-0.1h-1.5V139.2z"/>
<path class="st1" d="M27.2,142.4V136h1.2v3.1l2.8-3.1h1.3l-2.4,2.8l2.6,3.6h-1.3l-2-2.9l-0.9,0.9v1.9H27.2z"/>
<path class="st1" d="M37.8,141.3v1.1h-4.4V136h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H37.8z"/>
<path class="st1" d="M43.8,137.1h-2v5.3h-1.2v-5.3h-2V136h5.3V137.1z"/>
</g>
<g>
<path class="st1" d="M13.9,111.8c0.2,0,0.3,0,0.5,0c0.3,0,0.5,0,0.8,0.1c0.4,0.1,0.8,0.4,1,0.8c0.1,0.2,0.2,0.5,0.3,0.8
c0.1,0.3,0.2,0.6,0.3,1c0.1,0.5,0.3,1,0.4,1.4c0.1,0.3,0.2,0.6,0.3,0.9c0.1,0.4,0.2,0.8,0.4,1.2c0.1,0.5,0.3,1,0.4,1.5
c0,0.1,0.1,0.2,0.1,0.3c0.1,0.5,0.2,0.9,0.4,1.3c0.2,0.3,0.4,0.6,0.7,0.8c0.3,0.2,0.7,0.3,1.1,0.3c0.1,0,0.2,0,0.4,0l1.1,0l2.9,0
c1.3,0,2.5,0,3.8,0c0.6,0,1.3,0,1.9,0c0,0,0.1,0,0.1,0c0.3,0,0.6,0,0.9-0.1c0.2-0.1,0.4-0.5,0.4-0.8l0,0l0.1-0.5c0,0,0,0,0,0
c0-0.1,0-0.1,0-0.1h0c0.3-1,0.6-2.1,0.9-3.1c0.1-0.2,0.1-0.4,0.2-0.6c0.1-0.4,0.2-0.8,0.4-1.2c0.1-0.4,0.2-0.8,0-1.1
c-0.1-0.2-0.4-0.2-0.7-0.2c-0.3,0-9.6,0.1-14.5,0.2l-0.2,0l-0.3-1.1c0-0.1-0.1-0.3-0.1-0.5c0-0.1-0.1-0.2-0.1-0.3
c0-0.1,0-0.1-0.1-0.2c0-0.2-0.1-0.4-0.1-0.5c-0.1-0.3-0.3-0.7-0.6-0.9c-0.2-0.2-0.5-0.4-0.9-0.5c-0.2,0-0.3,0-0.5-0.1
c-0.2,0-0.5,0-0.7,0c-1,0-2,0-3,0c-0.1,0-0.1,0-0.2,0c-0.2,0-0.4,0-0.5,0c-0.2,0-0.3,0.1-0.4,0.2c-0.2,0.2-0.2,0.6-0.1,0.9
c0.1,0.2,0.3,0.3,0.5,0.3c0.2,0,0.4,0,0.6,0c0.3,0,0.6,0,0.8,0l0.9,0C13.7,111.8,13.8,111.8,13.9,111.8z M32,115.8l-1.3,4.7
l-0.3,0.2l-0.1,0c-0.1,0-1.1,0-2.8,0c-2.5,0-6,0-6.4,0l0,0h0c-0.3,0-0.6-0.1-0.8-0.3c-0.2-0.2-0.3-0.5-0.4-0.8
c-0.1-0.6-0.3-1.3-0.5-2c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32z"/>
<path class="st1" d="M22.1,124.2L22.1,124.2c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.9,0,1.5-0.6,1.5-1.5c0-0.4-0.2-0.8-0.4-1C22.9,124.3,22.5,124.2,22.1,124.2z"/>
<path class="st1" d="M29.2,124.2L29.2,124.2c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1.1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.8,0,1.5-0.7,1.5-1.5c0-0.4-0.1-0.7-0.4-1C30,124.3,29.6,124.2,29.2,124.2z"/>
</g>
<g>
<path class="st1" d="M11.8,192.5v-4.2l-1.6,3.1H9.5l-1.6-3.1v4.2H6.6v-6.4h1.3l1.9,3.6l1.9-3.6H13v6.4H11.8z"/>
<path class="st1" d="M13.9,192.5l2.5-6.4h1l2.5,6.4h-1.3l-0.6-1.6h-2.2l-0.6,1.6H13.9z M17,187.4L16,190h1.8L17,187.4z"/>
<path class="st1" d="M20.9,192.5v-6.4h2.8c0.3,0,0.6,0.1,0.8,0.2s0.5,0.3,0.6,0.5c0.2,0.2,0.3,0.4,0.4,0.7
c0.1,0.3,0.2,0.5,0.2,0.8c0,0.4-0.1,0.8-0.3,1.1c-0.2,0.3-0.5,0.6-0.8,0.7l1.5,2.4h-1.4l-1.3-2.1h-1.2v2.1H20.9z M22.1,189.2h1.6
c0.1,0,0.2,0,0.3-0.1c0.1-0.1,0.2-0.1,0.3-0.2c0.1-0.1,0.1-0.2,0.2-0.3c0-0.1,0.1-0.3,0.1-0.4c0-0.1,0-0.3-0.1-0.4
s-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.3-0.2c-0.1-0.1-0.2-0.1-0.3-0.1h-1.5V189.2z"/>
<path class="st1" d="M27.2,192.5v-6.4h1.2v3.1l2.8-3.1h1.3l-2.4,2.8l2.6,3.6h-1.3l-2-2.9l-0.9,0.9v1.9H27.2z"/>
<path class="st1" d="M37.8,191.4v1.1h-4.4v-6.4h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H37.8z"/>
<path class="st1" d="M43.8,187.2h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V187.2z"/>
</g>
<g>
<path class="st1" d="M13.9,161.8c0.2,0,0.3,0,0.5,0c0.3,0,0.5,0,0.8,0.1c0.4,0.1,0.8,0.4,1,0.8c0.1,0.2,0.2,0.5,0.3,0.8
c0.1,0.3,0.2,0.6,0.3,1c0.1,0.5,0.3,1,0.4,1.4c0.1,0.3,0.2,0.6,0.3,0.9c0.1,0.4,0.2,0.8,0.4,1.2c0.1,0.5,0.3,1,0.4,1.5
c0,0.1,0.1,0.2,0.1,0.3c0.1,0.5,0.2,0.9,0.4,1.3c0.2,0.3,0.4,0.6,0.7,0.8c0.3,0.2,0.7,0.3,1.1,0.3c0.1,0,0.2,0,0.4,0l1.1,0l2.9,0
c1.3,0,2.5,0,3.8,0c0.6,0,1.3,0,1.9,0c0,0,0.1,0,0.1,0c0.3,0,0.6,0,0.9-0.1c0.2-0.1,0.4-0.5,0.4-0.8l0,0l0.1-0.5c0,0,0,0,0,0
c0-0.1,0-0.1,0-0.1h0c0.3-1,0.6-2.1,0.9-3.1c0.1-0.2,0.1-0.4,0.2-0.6c0.1-0.4,0.2-0.8,0.4-1.2c0.1-0.4,0.2-0.8,0-1.1
c-0.1-0.2-0.4-0.2-0.7-0.2c-0.3,0-9.6,0.1-14.5,0.2l-0.2,0l-0.3-1.1c0-0.1-0.1-0.3-0.1-0.5c0-0.1-0.1-0.2-0.1-0.3
c0-0.1,0-0.1-0.1-0.2c0-0.2-0.1-0.4-0.1-0.5c-0.1-0.3-0.3-0.7-0.6-0.9c-0.2-0.2-0.5-0.4-0.9-0.5c-0.2,0-0.3,0-0.5-0.1
c-0.2,0-0.5,0-0.7,0c-1,0-2,0-3,0c-0.1,0-0.1,0-0.2,0c-0.2,0-0.4,0-0.5,0c-0.2,0-0.3,0.1-0.4,0.2c-0.2,0.2-0.2,0.6-0.1,0.9
c0.1,0.2,0.3,0.3,0.5,0.3c0.2,0,0.4,0,0.6,0c0.3,0,0.6,0,0.8,0l0.9,0C13.7,161.8,13.8,161.8,13.9,161.8z M32,165.8l-1.3,4.7
l-0.3,0.2l-0.1,0c-0.1,0-1.1,0-2.8,0c-2.5,0-6,0-6.4,0l0,0h0c-0.3,0-0.6-0.1-0.8-0.3c-0.2-0.2-0.3-0.5-0.4-0.8
c-0.1-0.6-0.3-1.3-0.5-2c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32z"/>
<path class="st1" d="M22.1,174.2L22.1,174.2c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.9,0,1.5-0.6,1.5-1.5c0-0.4-0.2-0.8-0.4-1C22.9,174.3,22.5,174.2,22.1,174.2z"/>
<path class="st1" d="M29.2,174.2L29.2,174.2c-0.5,0-0.8,0.1-1.1,0.3c-0.3,0.3-0.4,0.6-0.4,1.1c0,0.4,0.1,0.8,0.4,1.1
c0.3,0.3,0.6,0.4,1.1,0.4c0.8,0,1.5-0.7,1.5-1.5c0-0.4-0.1-0.7-0.4-1C30,174.3,29.6,174.2,29.2,174.2z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 200.1" style="enable-background:new 0 0 50 200.1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#414042;}
.st1{fill:#1E1E1E;}
.st2{fill:#FFFFFF;}
</style>
<g id="Layer_2">
<g>
<g>
<path class="st0" d="M50.1,146.1c0,2.2-1.8,4-4,4h-42c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.1z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M50,196.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V196.1z"/>
</g>
</g>
<g>
<g>
<path class="st1" d="M50,46c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46z"/>
</g>
</g>
<g>
<path class="st1" d="M50,96.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.1z"/>
</g>
</g>
<g id="Layer_3">
</g>
<g id="Layer_1">
<g>
<path class="st2" d="M18,192.8v-4.2l-1.6,3.1h-0.7l-1.6-3.1v4.2h-1.2v-6.4h1.3l1.9,3.6l1.9-3.6h1.3v6.4H18z"/>
<path class="st2" d="M23.5,191.8c0.3,0,0.5-0.1,0.7-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.3h1.2v3.3
c0,0.4-0.1,0.8-0.2,1.2c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-0.9-0.1-1.3-0.3
c-0.4-0.2-0.6-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3H22v3.3c0,0.3,0,0.5,0.1,0.8
c0.1,0.2,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.3,0.5,0.5S23.2,191.8,23.5,191.8z"/>
<path class="st2" d="M32.6,187.5h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V187.5z"/>
<path class="st2" d="M38,191.8v1.1h-4.4v-6.4H38v1.1h-3.1v1.5h2.7v1h-2.7v1.7H38z"/>
</g>
<path class="st2" d="M28.2,115.4l1.1-1.1c-1.1-1.3-2.7-2.1-4.6-2.1c-1.7,0-3.3,0.8-4.4,2c0.4,0.4,0.8,0.8,1.1,1.1
c0.8-0.9,2-1.5,3.3-1.5C26.2,113.7,27.4,114.4,28.2,115.4z"/>
<path class="st2" d="M30.8,112.8l1.1-1.1c-1.8-2-4.4-3.2-7.2-3.2c-2.8,0-5.3,1.2-7,3c0.4,0.4,0.8,0.8,1.1,1.1
c1.5-1.6,3.6-2.6,5.9-2.6C27.2,110,29.4,111.1,30.8,112.8z"/>
<path class="st2" d="M26.7,119.9v-2.4c0-1.1-0.9-1.9-1.9-1.9h0c-1.1,0-1.9,0.9-1.9,1.9v2.4H26.7z"/>
<path class="st2" d="M22.9,121.5v2.4c0,1.1,0.9,1.9,1.9,1.9h0c1.1,0,1.9-0.9,1.9-1.9v-2.4H22.9z"/>
<path class="st2" d="M30.6,124.3c0,0,0-2.6,0-2.7c0-0.5-0.4-0.9-1-0.9c-0.5,0-0.9,0.4-0.9,0.9c0,0.2,0,2.5,0,2.7
c0,1.9-1.7,3.5-3.9,3.5c-2.1,0-3.9-1.6-3.9-3.5c0-0.2,0-2.6,0-2.8c0-0.5-0.4-0.9-0.9-1c-0.5,0-0.9,0.3-1,0.9c0,0.1,0,2.8,0,2.9
c0,2.6,2.1,4.8,4.8,5.2l0,1.8h-2.2c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9H28c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9
h-2.3l0-1.8C28.5,129.1,30.6,126.9,30.6,124.3z"/>
<path class="st2" d="M28.3,65.3l1.1-1.1c-1.1-1.3-2.7-2.1-4.6-2.1c-1.7,0-3.3,0.8-4.4,2c0.4,0.4,0.8,0.8,1.1,1.1
c0.8-0.9,2-1.5,3.3-1.5C26.3,63.6,27.5,64.3,28.3,65.3z"/>
<path class="st2" d="M31,62.7l1.1-1.1c-1.8-2-4.4-3.2-7.2-3.2c-2.8,0-5.3,1.2-7,3c0.4,0.4,0.8,0.8,1.1,1.1c1.5-1.6,3.6-2.6,5.9-2.6
C27.3,59.9,29.5,61,31,62.7z"/>
<path class="st2" d="M26.9,69.8v-2.4c0-1.1-0.9-1.9-1.9-1.9h0c-1.1,0-1.9,0.9-1.9,1.9v2.4H26.9z"/>
<path class="st2" d="M23,71.4v2.4c0,1.1,0.9,1.9,1.9,1.9h0c1.1,0,1.9-0.9,1.9-1.9v-2.4H23z"/>
<path class="st2" d="M30.7,74.2c0,0,0-2.6,0-2.7c0-0.5-0.4-0.9-1-0.9c-0.5,0-0.9,0.4-0.9,0.9c0,0.2,0,2.5,0,2.7
c0,1.9-1.7,3.5-3.9,3.5c-2.1,0-3.9-1.6-3.9-3.5c0-0.2,0-2.6,0-2.8c0-0.5-0.4-0.9-0.9-1c-0.5,0-0.9,0.3-1,0.9c0,0.1,0,2.8,0,2.9
c0,2.6,2.1,4.8,4.8,5.2l0,1.8h-2.2c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9h6.4c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9
h-2.3l0-1.8C28.6,79,30.7,76.9,30.7,74.2z"/>
<g>
<path class="st2" d="M18,92.8v-4.2l-1.6,3.1h-0.7l-1.6-3.1v4.2h-1.2v-6.4h1.3l1.9,3.6l1.9-3.6h1.3v6.4H18z"/>
<path class="st2" d="M23.5,91.8c0.3,0,0.5-0.1,0.7-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.3h1.2v3.3
c0,0.4-0.1,0.8-0.2,1.2c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-0.9-0.1-1.3-0.3
c-0.4-0.2-0.6-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3H22v3.3c0,0.3,0,0.5,0.1,0.8
c0.1,0.2,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.3,0.5,0.5S23.2,91.8,23.5,91.8z"/>
<path class="st2" d="M32.6,87.5h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V87.5z"/>
<path class="st2" d="M38,91.8v1.1h-4.4v-6.4H38v1.1h-3.1v1.5h2.7v1h-2.7v1.7H38z"/>
</g>
<g>
<path class="st2" d="M8.3,41.9c0.3,0,0.5-0.1,0.7-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.3h1.2v3.3
c0,0.4-0.1,0.8-0.2,1.2c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7C9.3,42.9,8.8,43,8.3,43c-0.5,0-0.9-0.1-1.3-0.3
c-0.4-0.2-0.6-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3h1.2v3.3c0,0.3,0,0.5,0.1,0.8
c0.1,0.2,0.1,0.5,0.3,0.7s0.3,0.3,0.5,0.5S8,41.9,8.3,41.9z"/>
<path class="st2" d="M13.8,38.8v4.1h-1.2v-6.4h1l3.3,4.2v-4.2h1.2v6.4h-1L13.8,38.8z"/>
<path class="st2" d="M24.9,42.9v-4.2l-1.6,3.1h-0.7l-1.6-3.1v4.2h-1.2v-6.4H21l1.9,3.6l1.9-3.6h1.3v6.4H24.9z"/>
<path class="st2" d="M30.4,41.9c0.3,0,0.5-0.1,0.7-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.3h1.2v3.3
c0,0.4-0.1,0.8-0.2,1.2c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-0.9-0.1-1.3-0.3
c-0.4-0.2-0.6-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3h1.2v3.3c0,0.3,0,0.5,0.1,0.8
c0.1,0.2,0.1,0.5,0.3,0.7s0.3,0.3,0.5,0.5S30.1,41.9,30.4,41.9z"/>
<path class="st2" d="M39.4,37.6h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V37.6z"/>
<path class="st2" d="M44.9,41.8v1.1h-4.4v-6.4h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H44.9z"/>
</g>
<g>
<g>
<polygon class="st2" points="27.3,18.7 27.3,18.7 27.3,18.7 "/>
<path class="st2" d="M26.1,14.4l2.7-2.7c0.4-0.4,0.4-1.1,0-1.5c-0.4-0.4-1.1-0.4-1.5,0l-2.7,2.7l-2.7-2.7c-0.4-0.4-1.1-0.4-1.5,0
s-0.4,1.1,0,1.5l2.7,2.7l-2.7,2.7c-0.4,0.4-0.4,1.1,0,1.5c0.4,0.4,1.1,0.4,1.5,0l2.7-2.7l2.7,2.7c0.4,0.4,1.1,0.4,1.5,0
c0.4-0.4,0.4-1.1,0-1.5L26.1,14.4z"/>
</g>
<path class="st2" d="M22.9,21.6V24c0,1.1,0.9,1.9,1.9,1.9h0c1.1,0,1.9-0.9,1.9-1.9v-2.4H22.9z"/>
<path class="st2" d="M30.6,24.4c0,0,0-2.6,0-2.7c0-0.5-0.4-0.9-1-0.9c-0.5,0-0.9,0.4-0.9,0.9c0,0.2,0,2.5,0,2.7
c0,1.9-1.7,3.5-3.9,3.5c-2.1,0-3.9-1.6-3.9-3.5c0-0.2,0-2.6,0-2.8c0-0.5-0.4-0.9-0.9-1c-0.5,0-0.9,0.3-1,0.9c0,0.1,0,2.8,0,2.9
c0,2.6,2.1,4.8,4.8,5.2l0,1.8h-2.2c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9H28c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9
h-2.3l0-1.8C28.5,29.2,30.6,27,30.6,24.4z"/>
</g>
<g>
<g>
<polygon class="st2" points="27.3,168.6 27.3,168.6 27.3,168.6 "/>
<path class="st2" d="M26.1,164.3l2.7-2.7c0.4-0.4,0.4-1.1,0-1.5c-0.4-0.4-1.1-0.4-1.5,0l-2.7,2.7l-2.7-2.7
c-0.4-0.4-1.1-0.4-1.5,0c-0.4,0.4-0.4,1.1,0,1.5l2.7,2.7l-2.7,2.7c-0.4,0.4-0.4,1.1,0,1.5c0.4,0.4,1.1,0.4,1.5,0l2.7-2.7l2.7,2.7
c0.4,0.4,1.1,0.4,1.5,0c0.4-0.4,0.4-1.1,0-1.5L26.1,164.3z"/>
</g>
<path class="st2" d="M22.9,171.5v2.4c0,1.1,0.9,1.9,1.9,1.9h0c1.1,0,1.9-0.9,1.9-1.9v-2.4H22.9z"/>
<path class="st2" d="M30.6,174.3c0,0,0-2.6,0-2.7c0-0.5-0.4-0.9-1-0.9c-0.5,0-0.9,0.4-0.9,0.9c0,0.2,0,2.5,0,2.7
c0,1.9-1.7,3.5-3.9,3.5c-2.1,0-3.9-1.6-3.9-3.5c0-0.2,0-2.6,0-2.8c0-0.5-0.4-0.9-0.9-1c-0.5,0-0.9,0.3-1,0.9c0,0.1,0,2.8,0,2.9
c0,2.6,2.1,4.8,4.8,5.2l0,1.8h-2.2c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9H28c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9
h-2.3l0-1.8C28.5,179.1,30.6,176.9,30.6,174.3z"/>
</g>
<g>
<path class="st2" d="M8.2,141.9c0.3,0,0.5-0.1,0.7-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.3H11v3.3
c0,0.4-0.1,0.8-0.2,1.2c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-0.9-0.1-1.3-0.3
S6.3,142.3,6,142c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3h1.2v3.3c0,0.3,0,0.5,0.1,0.8c0.1,0.2,0.1,0.5,0.3,0.7
c0.1,0.2,0.3,0.3,0.5,0.5S7.9,141.9,8.2,141.9z"/>
<path class="st2" d="M13.7,138.8v4.1h-1.2v-6.4h1l3.3,4.2v-4.2H18v6.4h-1L13.7,138.8z"/>
<path class="st2" d="M24.8,142.9v-4.2l-1.6,3.2h-0.7l-1.6-3.2v4.2h-1.2v-6.4h1.3l1.9,3.6l1.9-3.6H26v6.4H24.8z"/>
<path class="st2" d="M30.3,141.9c0.3,0,0.5-0.1,0.7-0.2s0.4-0.3,0.5-0.5c0.1-0.2,0.2-0.4,0.3-0.7s0.1-0.5,0.1-0.8v-3.3h1.2v3.3
c0,0.4-0.1,0.8-0.2,1.2c-0.1,0.4-0.3,0.7-0.5,1c-0.2,0.3-0.5,0.5-0.9,0.7c-0.4,0.2-0.8,0.3-1.3,0.3c-0.5,0-0.9-0.1-1.3-0.3
s-0.6-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3h1.2v3.3c0,0.3,0,0.5,0.1,0.8c0.1,0.2,0.1,0.5,0.3,0.7
c0.1,0.2,0.3,0.3,0.5,0.5S30,141.9,30.3,141.9z"/>
<path class="st2" d="M39.3,137.6h-2v5.3H36v-5.3h-2v-1.1h5.3V137.6z"/>
<path class="st2" d="M44.8,141.8v1.1h-4.4v-6.4h4.4v1.1h-3.1v1.5h2.7v1h-2.7v1.7H44.8z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View file

@ -1,13 +0,0 @@
<?xml version="1.0"?>
<svg width="50" height="50.1" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<metadata id="metadata27">image/svg+xml</metadata>
<g>
<title>Layer 1</title>
<g id="g3" opacity="0.9">
<path id="path5" d="m50,46c0,2.2 -1.8,4 -4,4l-42,0c-2.2,0 -4,-1.8 -4,-4l0,-42c0,-2.2 1.8,-4 4,-4l42,0c2.2,0 4,1.8 4,4l0,42z" fill="#1E1E1E"/>
</g>
<text xml:space="preserve" text-anchor="middle" font-family="Sans" font-size="11px" id="svg_5" y="42.610549" x="25.949214" stroke="#cbcbcb" fill="#cbcbcb">Mute</text>
<ellipse ry="6.644531" rx="0.632813" id="svg_6" cy="15.716017" cx="25.316401" stroke-width="5" stroke="#cbcbcb" fill="#1E1E1E"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 702 B

View file

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 200.1" style="enable-background:new 0 0 50 200.1;" xml:space="preserve">
<style type="text/css">
.st0{fill:#414042;}
.st1{fill:#1E1E1E;}
.st2{fill:none;stroke:#75FF48;stroke-width:0.25;stroke-miterlimit:10;}
.st3{fill:#FFFFFF;}
</style>
<g id="Layer_2">
<g>
<g>
<path class="st0" d="M50.1,146.1c0,2.2-1.8,4-4,4h-42c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V146.1z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M50,196.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V196.1z"/>
</g>
</g>
<g>
<g>
<path class="st1" d="M50,46c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V46z"/>
</g>
</g>
<g>
<path class="st1" d="M50,96.1c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4v-42c0-2.2,1.8-4,4-4h42c2.2,0,4,1.8,4,4V96.1z"/>
</g>
</g>
<g id="Layer_3">
</g>
<g id="Layer_1">
<path class="st3" d="M27.7,20.9v3.5c0,0.6-0.5,1.1-1.1,1.1H13.4c-0.6,0-1.1-0.5-1.1-1.1v-6.5c0-0.6,0.5-1.1,1.1-1.1l3.9,0
c-0.1-0.5-0.2-1-0.2-1.3l-3.8,0c-1.4,0-2.4,1.1-2.4,2.4v6.5c0,1.4,1.1,2.4,2.4,2.4h5.9v1.2h-3.4c-0.3,0-0.6,0.3-0.6,0.7
s0.3,0.7,0.6,0.7h8.5c0.3,0,0.6-0.3,0.6-0.7s-0.3-0.7-0.6-0.7h-3.7v-1.2c-0.1,0-0.2,0-0.4,0h6.3c1.4,0,2.4-1.1,2.4-2.4V20
C28.7,20.4,28.2,20.7,27.7,20.9z"/>
<path class="st3" d="M36.2,19.9h-3.7c-0.5,0-0.9-0.4-1.5-1.4c-0.4-0.6-0.9-1.3-1.4-1.3l0-0.6l0,0.6c-0.5,0-0.9,0.6-1.4,1.2
c-0.6,0.9-1.1,1.5-1.7,1.5h-3.5c-2.4,0-4.3-1.9-4.3-4.3v-2.3c0-2.4,1.9-4.3,4.3-4.3h13.1c2.4,0,4.3,1.9,4.3,4.3v2.3
C40.5,18,38.6,19.9,36.2,19.9z M32.7,18.7h3.5c1.7,0,3.1-1.4,3.1-3v-2.3c0-1.7-1.4-3-3.1-3H23.1c-1.7,0-3.1,1.4-3.1,3v2.3
c0,1.7,1.4,3,3.1,3h3.4c0.2-0.2,0.6-0.7,0.7-0.9c0.6-0.8,1.2-1.7,2.3-1.8l0.1,0c1.2,0,1.8,1,2.4,1.8C32.4,18.3,32.6,18.5,32.7,18.7
z"/>
<path class="st3" d="M37.4,21.5c-0.2-0.1-0.4,0-0.6,0.1L35,23.4l0.7,0.7l0.9-0.9c0,0,0.3,1.3-0.7,2.4c-1,1-2.3,0.6-2.3,0.6l0.8-0.8
l-0.8-0.8l-1.7,1.7l0,0c0,0-0.1,0.1-0.1,0.2c-0.1,0.2,0,0.4,0.1,0.6l1.8,1.8l0.8-0.8l-0.9-0.9c0,0,1.7,0.3,3.1-1.1
c1.3-1.3,1-3.1,1-3.1l0.8,0.8l0.8-0.8l-1.6-1.6C37.6,21.6,37.5,21.5,37.4,21.5z"/>
<path class="st3" d="M11.8,37.7c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.3-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.4,0-0.6,0.1-0.8,0.2C9.1,37.4,9,37.6,9,37.8c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2s0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.7,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.7,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.5,0.1,0.8
c0,0.4-0.1,0.7-0.2,0.9c-0.1,0.2-0.3,0.5-0.5,0.6c-0.2,0.2-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.5-0.2
S7.8,42,7.4,41.8L8,40.7c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3c0.2,0.1,0.4,0.2,0.7,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1.1-0.2,1.1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.4C8,39,7.9,38.9,7.8,38.7c-0.1-0.2-0.1-0.4-0.1-0.7c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6c0.2-0.2,0.5-0.3,0.8-0.4C9.4,36,9.7,36,10.1,36c0.5,0,0.9,0.1,1.3,0.2c0.4,0.1,0.7,0.3,1,0.5L11.8,37.7z"
/>
<path class="st3" d="M15.8,36.1h1.1l0.7,2.1l0.7-2.1h1.2L18.4,39l0.8,2l1.8-5h1.4l-2.6,6.4h-1l-1.1-2.7l-1.1,2.7h-1l-2.6-6.4h1.3
l1.8,5l0.8-2L15.8,36.1z"/>
<path class="st3" d="M23.3,42.5v-6.4h1.2v6.4H23.3z"/>
<path class="st3" d="M30.8,37.2h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V37.2z"/>
<path class="st3" d="M31.4,39.2c0-0.4,0.1-0.8,0.2-1.2c0.1-0.4,0.3-0.7,0.6-1.1c0.3-0.3,0.6-0.6,1-0.7c0.4-0.2,0.8-0.3,1.3-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1l-1,0.7c-0.1-0.2-0.2-0.3-0.3-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.3-0.1-0.4-0.2
c-0.1,0-0.3-0.1-0.4-0.1c-0.3,0-0.6,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7c-0.1,0.3-0.1,0.5-0.1,0.8
c0,0.3,0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7c0.2,0.2,0.4,0.4,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.1,0,0.3,0,0.4-0.1
c0.1,0,0.3-0.1,0.4-0.2c0.1-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.5l1,0.6c-0.1,0.2-0.2,0.5-0.4,0.7c-0.2,0.2-0.4,0.3-0.6,0.5
c-0.2,0.1-0.5,0.2-0.8,0.3c-0.3,0.1-0.5,0.1-0.8,0.1c-0.5,0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.5-1-0.8c-0.3-0.3-0.5-0.7-0.6-1.1
C31.5,40.1,31.4,39.7,31.4,39.2z"/>
<path class="st3" d="M43.5,36.1v6.4h-1.2v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6h2.9v-2.6H43.5z"/>
<g>
<path class="st3" d="M27.7,70.9v3.5c0,0.6-0.5,1.1-1.1,1.1H13.4c-0.6,0-1.1-0.5-1.1-1.1v-6.5c0-0.6,0.5-1.1,1.1-1.1h3.8
c-0.1-0.4-0.3-0.9-0.3-1.3h-3.5c-1.4,0-2.4,1.1-2.4,2.4v6.5c0,1.4,1.1,2.4,2.4,2.4h5.9v1.2h-3.4c-0.3,0-0.6,0.3-0.6,0.7
c0,0.3,0.3,0.7,0.6,0.7h8.5c0.3,0,0.6-0.3,0.6-0.7c0-0.3-0.3-0.7-0.6-0.7h-3.7v-1.2c-0.1,0-0.2,0-0.4,0h6.3c1.4,0,2.4-1.1,2.4-2.4
V70C28.7,70.4,28.2,70.7,27.7,70.9z"/>
<path class="st3" d="M29.7,66.6c0.8,0,1.4,0.8,1.9,1.6c0.2,0.4,0.8,1.1,1,1.1h3.7c2,0,3.7-1.6,3.7-3.7v-2.3c0-2-1.7-3.7-3.7-3.7
H23.1c-2,0-3.7,1.6-3.7,3.7v2.3c0,2,1.7,3.7,3.7,3.7h3.5c0.3,0,0.8-0.7,1.1-1.2C28.3,67.4,28.8,66.6,29.7,66.6
C29.6,66.6,29.7,66.6,29.7,66.6z"/>
<path class="st3" d="M37.4,71.5c-0.2-0.1-0.4,0-0.6,0.1L35,73.4l0.7,0.7l0.9-0.9c0,0,0.3,1.3-0.7,2.4c-1,1-2.3,0.6-2.3,0.6
l0.8-0.8l-0.8-0.8l-1.7,1.7l0,0c0,0-0.1,0.1-0.1,0.2c-0.1,0.2,0,0.4,0.1,0.6l1.8,1.8l0.8-0.8l-0.9-0.9c0,0,1.7,0.3,3.1-1.1
c1.3-1.3,1-3.1,1-3.1l0.8,0.8l0.8-0.8l-1.6-1.6C37.6,71.6,37.5,71.5,37.4,71.5z"/>
</g>
<path class="st3" d="M11.8,87.7c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.3-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.4,0-0.6,0.1-0.8,0.2C9.1,87.4,9,87.6,9,87.8c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2c0.1,0.1,0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.7,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.7,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.5,0.1,0.8
c0,0.4-0.1,0.7-0.2,0.9c-0.1,0.2-0.3,0.5-0.5,0.6c-0.2,0.2-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.5-0.2
S7.8,92,7.4,91.8L8,90.7c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3c0.2,0.1,0.4,0.2,0.7,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1.1-0.2,1.1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.4C8,89,7.9,88.9,7.8,88.7c-0.1-0.2-0.1-0.4-0.1-0.7c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6c0.2-0.2,0.5-0.3,0.8-0.4C9.4,86,9.7,86,10.1,86c0.5,0,0.9,0.1,1.3,0.2c0.4,0.1,0.7,0.3,1,0.5L11.8,87.7z"
/>
<path class="st3" d="M15.8,86.1h1.1l0.7,2.1l0.7-2.1h1.2L18.4,89l0.8,2l1.8-5h1.4l-2.6,6.4h-1l-1.1-2.7l-1.1,2.7h-1l-2.6-6.4h1.3
l1.8,5l0.8-2L15.8,86.1z"/>
<path class="st3" d="M23.3,92.5v-6.4h1.2v6.4H23.3z"/>
<path class="st3" d="M30.8,87.2h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V87.2z"/>
<path class="st3" d="M31.4,89.2c0-0.4,0.1-0.8,0.2-1.2c0.1-0.4,0.3-0.7,0.6-1.1c0.3-0.3,0.6-0.6,1-0.7c0.4-0.2,0.8-0.3,1.3-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1l-1,0.7c-0.1-0.2-0.2-0.3-0.3-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.3-0.1-0.4-0.2
c-0.1,0-0.3-0.1-0.4-0.1c-0.3,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7c-0.1,0.3-0.1,0.5-0.1,0.8
c0,0.3,0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7c0.2,0.2,0.4,0.4,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.1,0,0.3,0,0.4-0.1
c0.1,0,0.3-0.1,0.4-0.2c0.1-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.5l1,0.6c-0.1,0.2-0.2,0.5-0.4,0.7c-0.2,0.2-0.4,0.3-0.6,0.5
c-0.2,0.1-0.5,0.2-0.8,0.3c-0.3,0.1-0.5,0.1-0.8,0.1c-0.5,0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.5-1-0.8c-0.3-0.3-0.5-0.7-0.6-1.1
C31.5,90.1,31.4,89.7,31.4,89.2z"/>
<path class="st3" d="M43.5,86.1v6.4h-1.2v-2.7h-2.9v2.7h-1.2v-6.4h1.2v2.6h2.9v-2.6H43.5z"/>
<path class="st3" d="M26.6,120.8l0,4.7c0,0.6-0.5,1.1-1.1,1.1H12.3c-0.6,0-1.1-0.5-1.1-1.1V119c0-0.6,0.5-1.1,1.1-1.1h7.2
c-0.1-0.4-0.3-0.9-0.3-1.3h-6.9c-1.4,0-2.4,1.1-2.4,2.4v6.5c0,1.4,1.1,2.4,2.4,2.4h5.9v1.2h-3.4c-0.3,0-0.6,0.3-0.6,0.7
c0,0.3,0.3,0.7,0.6,0.7h8.5c0.3,0,0.6-0.3,0.6-0.7c0-0.3-0.3-0.7-0.6-0.7h-3.7v-1.2c-0.1,0-0.2,0-0.4,0h6.3c1.4,0,2.4-1.1,2.4-2.4
v-4.7C27.5,120.8,27,120.7,26.6,120.8z"/>
<path class="st3" d="M38,119h-3.7c-0.5,0-0.9-0.4-1.5-1.4c-0.4-0.6-0.9-1.3-1.3-1.3c-0.5,0-0.9,0.6-1.4,1.2
c-0.6,0.9-1.1,1.5-1.7,1.5h-3.5c-2.4,0-4.3-1.9-4.3-4.3v-2.3c0-2.4,1.9-4.3,4.3-4.3H38c2.4,0,4.3,1.9,4.3,4.3v2.3
C42.3,117.1,40.4,119,38,119z M34.5,117.7H38c1.7,0,3.1-1.4,3.1-3v-2.3c0-1.7-1.4-3-3.1-3H24.9c-1.7,0-3.1,1.4-3.1,3v2.3
c0,1.7,1.4,3,3.1,3h3.4c0.2-0.2,0.6-0.7,0.7-0.9c0.6-0.8,1.2-1.7,2.3-1.8l0.1,0c1.2,0,1.8,1,2.4,1.8
C34.2,117.4,34.4,117.6,34.5,117.7z"/>
<path class="st3" d="M37.2,120.5c-0.2-0.1-0.4,0-0.6,0.1l-1.8,1.8l0.7,0.7l0.9-0.9c0,0,0.3,2.3-0.7,3.4c-1,1-3.3,0.6-3.3,0.6
l0.8-0.8l-0.8-0.8l-1.7,1.7l0,0c0,0-0.1,0.1-0.1,0.2c-0.1,0.2,0,0.4,0.1,0.6l1.8,1.8l0.8-0.8l-0.9-0.9c0,0,2.7,0.3,4.1-1.1
c1.3-1.3,1-4.1,1-4.1l0.8,0.8l0.8-0.8l-1.6-1.6C37.4,120.7,37.3,120.6,37.2,120.5z"/>
<path class="st3" d="M11.6,137.8c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.3-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.4,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.3,0.3-0.3,0.5c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2c0.1,0.1,0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.7,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.7,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.5,0.1,0.8
c0,0.4-0.1,0.7-0.2,0.9c-0.1,0.2-0.3,0.5-0.5,0.6s-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.5-0.2
s-0.9-0.4-1.3-0.6l0.6-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.7,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1.1-0.2,1.1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.4c-0.2-0.1-0.3-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.7c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6c0.2-0.2,0.5-0.3,0.8-0.4c0.3-0.1,0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.3,0.2c0.4,0.1,0.7,0.3,1,0.5
L11.6,137.8z"/>
<path class="st3" d="M15.6,136.2h1.1l0.7,2.1l0.7-2.1h1.2l-1.1,2.9l0.8,2l1.8-5h1.4l-2.6,6.4h-1l-1.1-2.7l-1.1,2.7h-1l-2.6-6.4h1.3
l1.8,5l0.8-2L15.6,136.2z"/>
<path class="st3" d="M23.1,142.6v-6.4h1.2v6.4H23.1z"/>
<path class="st3" d="M30.7,137.3h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V137.3z"/>
<path class="st3" d="M31.3,139.3c0-0.4,0.1-0.8,0.2-1.2c0.1-0.4,0.3-0.7,0.6-1.1c0.3-0.3,0.6-0.6,1-0.7s0.8-0.3,1.3-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1l-1,0.7c-0.1-0.2-0.2-0.3-0.3-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.3-0.1-0.4-0.2
c-0.1,0-0.3-0.1-0.4-0.1c-0.3,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7c-0.1,0.3-0.1,0.5-0.1,0.8
c0,0.3,0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7c0.2,0.2,0.4,0.4,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.1,0,0.3,0,0.4-0.1
c0.1,0,0.3-0.1,0.4-0.2c0.1-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.5l1,0.6c-0.1,0.2-0.2,0.5-0.4,0.7c-0.2,0.2-0.4,0.3-0.6,0.5
c-0.2,0.1-0.5,0.2-0.8,0.3c-0.3,0.1-0.5,0.1-0.8,0.1c-0.5,0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.5-1-0.8c-0.3-0.3-0.5-0.7-0.6-1.1
C31.3,140.1,31.3,139.7,31.3,139.3z"/>
<path class="st3" d="M43.3,136.2v6.4h-1.2v-2.7h-2.9v2.7H38v-6.4h1.2v2.6h2.9v-2.6H43.3z"/>
<path class="st3" d="M26.6,171v4.5c0,0.6-0.5,1.1-1.1,1.1H12.3c-0.6,0-1.1-0.5-1.1-1.1v-6.5c0-0.6,0.5-1.1,1.1-1.1h6.8
c-0.1-0.4-0.3-0.9-0.3-1.3h-6.5c-1.4,0-2.4,1.1-2.4,2.4v6.5c0,1.4,1.1,2.4,2.4,2.4h5.9v1.2h-3.4c-0.3,0-0.6,0.3-0.6,0.7
c0,0.3,0.3,0.7,0.6,0.7h8.5c0.3,0,0.6-0.3,0.6-0.7c0-0.3-0.3-0.7-0.6-0.7h-3.7V178c-0.1,0-0.2,0-0.4,0h6.3c1.4,0,2.4-1.1,2.4-2.4
v-5.4C27.5,170.5,27.1,170.8,26.6,171z"/>
<path class="st3" d="M31.5,165.7c0.8,0,1.4,0.8,1.9,1.6c0.2,0.4,0.8,1.1,1,1.1H38c2,0,3.7-1.6,3.7-3.7v-2.3c0-2-1.7-3.7-3.7-3.7
H24.9c-2,0-3.7,1.6-3.7,3.7v2.3c0,2,1.7,3.7,3.7,3.7h3.5c0.3,0,0.8-0.7,1.1-1.2C30.1,166.5,30.7,165.7,31.5,165.7
C31.5,165.7,31.5,165.7,31.5,165.7z"/>
<path class="st3" d="M37.2,170.6c-0.2-0.1-0.4,0-0.6,0.1l-1.8,1.8l0.7,0.7l0.9-0.9c0,0,0.3,2.3-0.7,3.4c-1,1-3.3,0.6-3.3,0.6
l0.8-0.8l-0.8-0.8l-1.7,1.7l0,0c0,0-0.1,0.1-0.1,0.2c-0.1,0.2,0,0.4,0.1,0.6l1.8,1.8l0.8-0.8l-0.9-0.9c0,0,2.7,0.3,4.1-1.1
c1.3-1.3,1-4.1,1-4.1l0.8,0.8l0.8-0.8l-1.6-1.6C37.4,170.7,37.3,170.7,37.2,170.6z"/>
<path class="st3" d="M11.6,187.9c0,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.3-0.1-0.4-0.2c-0.2-0.1-0.3-0.1-0.5-0.2c-0.2,0-0.4-0.1-0.6-0.1
c-0.4,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.3,0.3-0.3,0.5c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.2s0.3,0.1,0.5,0.2
c0.2,0.1,0.4,0.1,0.7,0.2c0.3,0.1,0.6,0.2,0.9,0.3c0.3,0.1,0.5,0.2,0.7,0.4c0.2,0.1,0.3,0.3,0.4,0.5c0.1,0.2,0.1,0.5,0.1,0.8
c0,0.4-0.1,0.7-0.2,0.9c-0.1,0.2-0.3,0.5-0.5,0.6s-0.5,0.3-0.8,0.3c-0.3,0.1-0.6,0.1-0.9,0.1c-0.5,0-1-0.1-1.5-0.2
s-0.9-0.4-1.3-0.6l0.6-1.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.3,0.2,0.5,0.3s0.4,0.2,0.7,0.2c0.2,0.1,0.5,0.1,0.7,0.1
c0.7,0,1.1-0.2,1.1-0.7c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.3-0.1-0.5-0.2c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.2-0.6-0.4c-0.2-0.1-0.3-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.7c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.3,0.3-0.5,0.5-0.6c0.2-0.2,0.5-0.3,0.8-0.4c0.3-0.1,0.6-0.1,0.9-0.1c0.5,0,0.9,0.1,1.3,0.2c0.4,0.1,0.7,0.3,1,0.5
L11.6,187.9z"/>
<path class="st3" d="M15.6,186.2h1.1l0.7,2.1l0.7-2.1h1.2l-1.1,2.9l0.8,2l1.8-5h1.4l-2.6,6.4h-1l-1.1-2.7l-1.1,2.7h-1l-2.6-6.4h1.3
l1.8,5l0.8-2L15.6,186.2z"/>
<path class="st3" d="M23.1,192.6v-6.4h1.2v6.4H23.1z"/>
<path class="st3" d="M30.7,187.3h-2v5.3h-1.2v-5.3h-2v-1.1h5.3V187.3z"/>
<path class="st3" d="M31.3,189.4c0-0.4,0.1-0.8,0.2-1.2c0.1-0.4,0.3-0.7,0.6-1.1c0.3-0.3,0.6-0.6,1-0.7s0.8-0.3,1.3-0.3
c0.6,0,1.1,0.1,1.5,0.4c0.4,0.3,0.7,0.6,0.9,1l-1,0.7c-0.1-0.2-0.2-0.3-0.3-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.1-0.3-0.1-0.4-0.2
c-0.1,0-0.3-0.1-0.4-0.1c-0.3,0-0.6,0.1-0.8,0.2c-0.2,0.1-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7c-0.1,0.3-0.1,0.5-0.1,0.8
c0,0.3,0,0.6,0.1,0.8c0.1,0.3,0.2,0.5,0.4,0.7c0.2,0.2,0.4,0.4,0.6,0.5c0.2,0.1,0.5,0.2,0.7,0.2c0.1,0,0.3,0,0.4-0.1
c0.1,0,0.3-0.1,0.4-0.2c0.1-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.5l1,0.6c-0.1,0.2-0.2,0.5-0.4,0.7c-0.2,0.2-0.4,0.3-0.6,0.5
c-0.2,0.1-0.5,0.2-0.8,0.3c-0.3,0.1-0.5,0.1-0.8,0.1c-0.5,0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.5-1-0.8c-0.3-0.3-0.5-0.7-0.6-1.1
C31.3,190.2,31.3,189.8,31.3,189.4z"/>
<path class="st3" d="M43.3,186.2v6.4h-1.2v-2.7h-2.9v2.7H38v-6.4h1.2v2.6h2.9v-2.6H43.3z"/>
<path class="st3" d="M21.3,21.1c-1.2-0.1-3-1.4-3.6-3.1h-4.1v6.2h12.6v-3.1H21.3z"/>
<path class="st3" d="M22.8,120.7c-1.3,0-2.2-0.4-3-1.7h-7.2v6.2h12.6v-4.5H22.8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -10,9 +10,10 @@
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
/*global print, MyAvatar, Entities, AnimationCache, SoundCache, Scene, Camera, Overlays, Audio, HMD, AvatarList, AvatarManager, Controller, UndoStack, Window, Account, GlobalServices, Script, ScriptDiscoveryService, LODManager, Menu, Vec3, Quat, AudioDevice, Paths, Clipboard, Settings, XMLHttpRequest, Reticle, Messages, setEntityCustomData, getEntityCustomData, vec3toStr */
/* global setEntityCustomData, getEntityCustomData, vec3toStr, flatten, Xform */
Script.include("/~/system/libraries/utils.js");
Script.include("../libraries/Xform.js");
//
// add lines where the hand ray picking is happening
@ -138,7 +139,7 @@ var DEFAULT_GRABBABLE_DATA = {
var USE_BLACKLIST = true;
var blacklist = [];
//we've created various ways of visualizing looking for and moving distant objects
// we've created various ways of visualizing looking for and moving distant objects
var USE_ENTITY_LINES_FOR_SEARCHING = false;
var USE_OVERLAY_LINES_FOR_SEARCHING = true;
@ -254,7 +255,8 @@ function isIn2DMode() {
// In this version, we make our own determination of whether we're aimed a HUD element,
// because other scripts (such as handControllerPointer) might be using some other visualization
// instead of setting Reticle.visible.
return EXTERNALLY_MANAGED_2D_MINOR_MODE && (Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(Reticle.position));
return (EXTERNALLY_MANAGED_2D_MINOR_MODE &&
(Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(Reticle.position)));
}
function restore2DMode() {
if (!EXTERNALLY_MANAGED_2D_MINOR_MODE) {
@ -273,7 +275,7 @@ EntityPropertiesCache.prototype.clear = function() {
EntityPropertiesCache.prototype.findEntities = function(position, radius) {
var entities = Entities.findEntities(position, radius);
var _this = this;
entities.forEach(function (x) {
entities.forEach(function(x) {
_this.updateEntity(x);
});
};
@ -285,7 +287,7 @@ EntityPropertiesCache.prototype.updateEntity = function(entityID) {
if (props.userData) {
try {
userData = JSON.parse(props.userData);
} catch(err) {
} catch (err) {
print("WARNING: malformed userData on " + entityID + ", name = " + props.name + ", error = " + err);
}
}
@ -295,9 +297,9 @@ EntityPropertiesCache.prototype.updateEntity = function(entityID) {
};
EntityPropertiesCache.prototype.getEntities = function() {
return Object.keys(this.cache);
}
};
EntityPropertiesCache.prototype.getProps = function(entityID) {
var obj = this.cache[entityID]
var obj = this.cache[entityID];
return obj ? obj : undefined;
};
EntityPropertiesCache.prototype.getGrabbableProps = function(entityID) {
@ -324,6 +326,14 @@ EntityPropertiesCache.prototype.getWearableProps = function(entityID) {
return undefined;
}
};
EntityPropertiesCache.prototype.getEquipHotspotsProps = function(entityID) {
var props = this.cache[entityID];
if (props) {
return props.userData.equipHotspots ? props.userData.equipHotspots : {};
} else {
return undefined;
}
};
function MyController(hand) {
this.hand = hand;
@ -337,7 +347,7 @@ function MyController(hand) {
this.getHandRotation = function() {
var controllerHandInput = (this.hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand;
return Quat.multiply(MyAvatar.orientation, Controller.getPoseValue(controllerHandInput).rotation);
}
};
this.actionID = null; // action this script created...
this.grabbedEntity = null; // on this entity.
@ -350,11 +360,11 @@ function MyController(hand) {
this.rawSecondaryValue = 0;
this.rawThumbValue = 0;
//for visualizations
// for visualizations
this.overlayLine = null;
this.particleBeamObject = null;
//for lights
// for lights
this.spotlight = null;
this.pointlight = null;
this.overlayLine = null;
@ -379,7 +389,7 @@ function MyController(hand) {
var _this = this;
var suppressedIn2D = [STATE_OFF, STATE_SEARCHING];
this.ignoreInput = function () {
this.ignoreInput = function() {
// We've made the decision to use 'this' for new code, even though it is fragile,
// in order to keep/ the code uniform without making any no-op line changes.
return (-1 !== suppressedIn2D.indexOf(this.state)) && isIn2DMode();
@ -410,7 +420,7 @@ function MyController(hand) {
this.callEntityMethodOnGrabbed = function(entityMethodName) {
var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID];
Entities.callEntityMethod(this.grabbedEntity, entityMethodName, args);
}
};
this.setState = function(newState, reason) {
@ -508,7 +518,7 @@ function MyController(hand) {
ignoreRayIntersection: true,
drawInFront: true, // Even when burried inside of something, show it.
visible: true
}
};
this.searchSphere = Overlays.addOverlay("sphere", sphereProperties);
} else {
Overlays.editOverlay(this.searchSphere, {
@ -518,7 +528,7 @@ function MyController(hand) {
visible: true
});
}
}
};
this.overlayLineOn = function(closePoint, farPoint, color) {
if (this.overlayLine === null) {
@ -567,7 +577,7 @@ function MyController(hand) {
this.overlayLineOn(handPosition, searchSphereLocation,
(this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
}
}
};
this.handleDistantParticleBeam = function(handPosition, objectPosition, color) {
@ -634,7 +644,7 @@ function MyController(hand) {
"alphaFinish": 1,
"additiveBlending": 0,
"textures": "https://hifi-content.s3.amazonaws.com/alan/dev/textures/grabsprite-3.png"
}
};
this.particleBeamObject = Entities.addEntity(particleBeamPropertiesObject);
};
@ -648,7 +658,7 @@ function MyController(hand) {
emitSpeed: speed,
speedSpread: spread,
lifespan: lifespan
})
});
};
this.evalLightWorldTransform = function(modelPos, modelRot) {
@ -702,9 +712,9 @@ function MyController(hand) {
this.spotlight = Entities.addEntity(lightProperties);
} else {
Entities.editEntity(this.spotlight, {
//without this, this light would maintain rotation with its parent
// without this, this light would maintain rotation with its parent
rotation: Quat.fromPitchYawRollDegrees(-90, 0, 0)
})
});
}
};
@ -768,7 +778,7 @@ function MyController(hand) {
Entities.deleteEntity(this.particleBeamObject);
this.particleBeamObject = null;
}
}
};
this.turnLightsOff = function() {
if (this.spotlight !== null) {
@ -844,7 +854,7 @@ function MyController(hand) {
this.thumbPress = function(value) {
_this.rawThumbValue = value;
}
};
this.thumbPressed = function() {
return _this.rawThumbValue > THUMB_ON_VALUE;
@ -869,8 +879,8 @@ function MyController(hand) {
}
};
this.createHotspots = function () {
var props, overlay;
this.createHotspots = function() {
var _this = this;
var HAND_EQUIP_SPHERE_COLOR = { red: 90, green: 255, blue: 90 };
var HAND_EQUIP_SPHERE_ALPHA = 0.7;
@ -888,6 +898,7 @@ function MyController(hand) {
this.hotspotOverlays = [];
var overlay;
if (DRAW_HAND_SPHERES) {
// add tiny green sphere around the palm.
var handPosition = this.getHandPosition();
@ -901,7 +912,6 @@ function MyController(hand) {
ignoreRayIntersection: true,
drawInFront: false
});
this.hotspotOverlays.push({
entityID: undefined,
overlay: overlay,
@ -919,11 +929,11 @@ function MyController(hand) {
ignoreRayIntersection: true,
drawInFront: false
});
this.hotspotOverlays.push({
entityID: undefined,
overlay: overlay,
type: "hand"
type: "hand",
localPosition: {x: 0, y: 0, z: 0}
});
}
@ -931,64 +941,71 @@ function MyController(hand) {
this.entityPropertyCache.clear();
this.entityPropertyCache.findEntities(MyAvatar.position, HOTSPOT_DRAW_DISTANCE);
var _this = this;
this.entityPropertyCache.getEntities().forEach(function (entityID) {
if (_this.entityIsEquippableWithoutDistanceCheck(entityID)) {
props = _this.entityPropertyCache.getProps(entityID);
if (DRAW_GRAB_BOXES) {
// add blue box overlays for grabbable entities.
this.entityPropertyCache.getEntities().forEach(function(entityID) {
var props = _this.entityPropertyCache.getProps(entityID);
if (_this.entityIsGrabbable(entityID)) {
var overlay = Overlays.addOverlay("cube", {
rotation: props.rotation,
position: props.position,
size: props.dimensions,
color: GRAB_BOX_COLOR,
alpha: GRAB_BOX_ALPHA,
solid: true,
visible: true,
ignoreRayIntersection: true,
drawInFront: false
});
_this.hotspotOverlays.push({
entityID: entityID,
overlay: overlay,
type: "near",
localPosition: {x: 0, y: 0, z: 0}
});
}
});
}
overlay = Overlays.addOverlay("sphere", {
rotation: props.rotation,
position: props.position,
size: EQUIP_RADIUS * 2,
color: EQUIP_SPHERE_COLOR,
alpha: EQUIP_SPHERE_ALPHA,
solid: true,
visible: true,
ignoreRayIntersection: true,
drawInFront: false
});
_this.hotspotOverlays.push({
entityID: entityID,
overlay: overlay,
type: "equip"
});
}
if (DRAW_GRAB_BOXES && _this.entityIsGrabbable(entityID)) {
props = _this.entityPropertyCache.getProps(entityID);
overlay = Overlays.addOverlay("cube", {
rotation: props.rotation,
position: props.position,
size: props.dimensions, //{x: props.dimensions.x, y: props.dimensions.y, z: props.dimensions.z},
color: GRAB_BOX_COLOR,
alpha: GRAB_BOX_ALPHA,
solid: true,
visible: true,
ignoreRayIntersection: true,
drawInFront: false
});
_this.hotspotOverlays.push({
entityID: entityID,
overlay: overlay,
type: "near"
});
}
// add green spheres for each equippable hotspot.
flatten(this.entityPropertyCache.getEntities().map(function(entityID) {
return _this.collectEquipHotspots(entityID);
})).filter(function(hotspot) {
return _this.hotspotIsEquippable(hotspot);
}).forEach(function(hotspot) {
var overlay = Overlays.addOverlay("sphere", {
position: hotspot.worldPosition,
size: hotspot.radius * 2,
color: EQUIP_SPHERE_COLOR,
alpha: EQUIP_SPHERE_ALPHA,
solid: true,
visible: true,
ignoreRayIntersection: true,
drawInFront: false
});
_this.hotspotOverlays.push({
entityID: hotspot.entityID,
overlay: overlay,
type: "equip",
localPosition: hotspot.localPosition
});
});
};
this.updateHotspots = function() {
var _this = this;
var props;
this.hotspotOverlays.forEach(function (overlayInfo) {
this.hotspotOverlays.forEach(function(overlayInfo) {
if (overlayInfo.type === "hand") {
Overlays.editOverlay(overlayInfo.overlay, { position: _this.getHandPosition() });
} else if (overlayInfo.type === "equip") {
_this.entityPropertyCache.updateEntity(overlayInfo.entityID);
props = _this.entityPropertyCache.getProps(overlayInfo.entityID);
Overlays.editOverlay(overlayInfo.overlay, { position: props.position, rotation: props.rotation });
var entityXform = new Xform(props.rotation, props.position);
Overlays.editOverlay(overlayInfo.overlay, {
position: entityXform.xformPoint(overlayInfo.localPosition),
rotation: props.rotation
});
} else if (overlayInfo.type === "near") {
_this.entityPropertyCache.updateEntity(overlayInfo.entityID);
props = _this.entityPropertyCache.getProps(overlayInfo.entityID);
@ -998,7 +1015,7 @@ function MyController(hand) {
};
this.destroyHotspots = function() {
this.hotspotOverlays.forEach(function (overlayInfo) {
this.hotspotOverlays.forEach(function(overlayInfo) {
Overlays.deleteOverlay(overlayInfo.overlay);
});
this.hotspotOverlays = [];
@ -1012,14 +1029,14 @@ function MyController(hand) {
this.destroyHotspots();
};
///
// Performs ray pick test from the hand controller into the world
// @param {number} which hand to use, RIGHT_HAND or LEFT_HAND
// @returns {object} returns object with two keys entityID and distance
//
this.calcRayPickInfo = function(hand) {
var pose = Controller.getPoseValue((hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand);
var standardControllerValue = (hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand;
var pose = Controller.getPoseValue(standardControllerValue);
var worldHandPosition = Vec3.sum(Vec3.multiplyQbyV(MyAvatar.orientation, pose.translation), MyAvatar.position);
var worldHandRotation = Quat.multiply(MyAvatar.orientation, pose.rotation);
@ -1058,63 +1075,82 @@ function MyController(hand) {
}
var overlayIntersection = Overlays.findRayIntersection(pickRayBacked);
if (!intersection.intersects || (overlayIntersection.intersects && (intersection.distance > overlayIntersection.distance))) {
if (!intersection.intersects ||
(overlayIntersection.intersects && (intersection.distance > overlayIntersection.distance))) {
intersection = overlayIntersection;
}
if (intersection.intersects) {
return { entityID: intersection.entityID,
searchRay: pickRay,
distance: Vec3.distance(pickRay.origin, intersection.intersection) }
return {
entityID: intersection.entityID,
searchRay: pickRay,
distance: Vec3.distance(pickRay.origin, intersection.intersection)
};
} else {
return result;
}
};
this.entityWantsTrigger = function (entityID) {
this.entityWantsTrigger = function(entityID) {
var grabbableProps = this.entityPropertyCache.getGrabbableProps(entityID);
return grabbableProps && grabbableProps.wantsTrigger;
};
this.entityIsEquippableWithoutDistanceCheck = function (entityID) {
// returns a list of all equip-hotspots assosiated with this entity.
// @param {UUID} entityID
// @returns {Object[]} array of objects with the following fields.
// * entityID {UUID}
// * localPosition {Vec3} position of the hotspot in object space.
// * worldPosition {vec3} position of the hotspot in world space.
// * radius {number} radius of equip hotspot
// * joints {Object} keys are joint names values are arrays of two elements:
// offset position {Vec3} and offset rotation {Quat}, both are in the coordinate system of the joint.
this.collectEquipHotspots = function(entityID) {
var result = [];
var props = this.entityPropertyCache.getProps(entityID);
var handPosition = props.position;
return this.entityIsEquippableWithDistanceCheck(entityID, handPosition);
var entityXform = new Xform(props.rotation, props.position);
var equipHotspotsProps = this.entityPropertyCache.getEquipHotspotsProps(entityID);
if (equipHotspotsProps && equipHotspotsProps.length > 0) {
var i, length = equipHotspotsProps.length;
for (i = 0; i < length; i++) {
var hotspot = equipHotspotsProps[i];
if (hotspot.position && hotspot.radius && hotspot.joints) {
result.push({
entityID: entityID,
localPosition: hotspot.position,
worldPosition: entityXform.xformPoint(hotspot.position),
radius: hotspot.radius,
joints: hotspot.joints
});
}
}
} else {
var wearableProps = this.entityPropertyCache.getWearableProps(entityID);
if (wearableProps && wearableProps.joints) {
result.push({
entityID: entityID,
localPosition: {x: 0, y: 0, z: 0},
worldPosition: entityXform.pos,
radius: EQUIP_RADIUS,
joints: wearableProps.joints
});
}
}
return result;
};
this.entityIsEquippableWithDistanceCheck = function (entityID, handPosition) {
var props = this.entityPropertyCache.getProps(entityID);
var distance = Vec3.distance(props.position, handPosition);
var grabProps = this.entityPropertyCache.getGrabProps(entityID);
this.hotspotIsEquippable = function(hotspot) {
var props = this.entityPropertyCache.getProps(hotspot.entityID);
var grabProps = this.entityPropertyCache.getGrabProps(hotspot.entityID);
var debug = (WANT_DEBUG_SEARCH_NAME && props.name === WANT_DEBUG_SEARCH_NAME);
var refCount = ("refCount" in grabProps) ? grabProps.refCount : 0;
if (refCount > 0) {
var okToEquipFromOtherHand = ((this.getOtherHandController().state == STATE_NEAR_GRABBING ||
this.getOtherHandController().state == STATE_DISTANCE_HOLDING) &&
this.getOtherHandController().grabbedEntity == hotspot.entityID);
if (refCount > 0 && !okToEquipFromOtherHand) {
if (debug) {
print("equip is skipping '" + props.name + "': it is already grabbed");
}
return false;
}
if (distance > EQUIP_RADIUS) {
if (debug) {
print("equip is skipping '" + props.name + "': too far away, " + distance + " meters");
}
return false;
}
var wearableProps = this.entityPropertyCache.getWearableProps(entityID);
if (!wearableProps || !wearableProps.joints) {
if (debug) {
print("equip is skipping '" + props.name + "': no wearable attach-point");
}
return false;
}
var handJointName = this.hand === RIGHT_HAND ? "RightHand" : "LeftHand";
if (!wearableProps.joints[handJointName]) {
if (debug) {
print("equip is skipping '" + props.name + "': no wearable joint for " + handJointName);
print("equip is skipping '" + props.name + "': grabbed by someone else");
}
return false;
}
@ -1122,7 +1158,7 @@ function MyController(hand) {
return true;
};
this.entityIsGrabbable = function (entityID) {
this.entityIsGrabbable = function(entityID) {
var grabbableProps = this.entityPropertyCache.getGrabbableProps(entityID);
var grabProps = this.entityPropertyCache.getGrabProps(entityID);
var props = this.entityPropertyCache.getProps(entityID);
@ -1255,29 +1291,31 @@ function MyController(hand) {
this.entityPropertyCache.findEntities(handPosition, NEAR_GRAB_RADIUS);
var candidateEntities = this.entityPropertyCache.getEntities();
var equippableEntities = candidateEntities.filter(function (entity) {
return _this.entityIsEquippableWithDistanceCheck(entity, handPosition);
var equippableHotspots = flatten(candidateEntities.map(function(entityID) {
return _this.collectEquipHotspots(entityID);
})).filter(function(hotspot) {
return _this.hotspotIsEquippable(hotspot) && Vec3.distance(hotspot.worldPosition, handPosition) < hotspot.radius;
});
var entity;
if (equippableEntities.length > 0) {
if (equippableHotspots.length > 0) {
// sort by distance
equippableEntities.sort(function (a, b) {
var aDistance = Vec3.distance(_this.entityPropertyCache.getProps(a).position, handPosition);
var bDistance = Vec3.distance(_this.entityPropertyCache.getProps(b).position, handPosition);
equippableHotspots.sort(function(a, b) {
var aDistance = Vec3.distance(a.worldPosition, handPosition);
var bDistance = Vec3.distance(b.worldPosition, handPosition);
return aDistance - bDistance;
});
entity = equippableEntities[0];
if (this.triggerSmoothedGrab()) {
this.grabbedEntity = entity;
this.setState(STATE_HOLD, "eqipping '" + this.entityPropertyCache.getProps(entity).name + "'");
this.grabbedHotspot = equippableHotspots[0];
this.grabbedEntity = equippableHotspots[0].entityID;
this.setState(STATE_HOLD, "eqipping '" + this.entityPropertyCache.getProps(this.grabbedEntity).name + "'");
return;
} else {
// TODO: highlight the equippable object?
}
}
var grabbableEntities = candidateEntities.filter(function (entity) {
var grabbableEntities = candidateEntities.filter(function(entity) {
return _this.entityIsNearGrabbable(entity, handPosition, NEAR_GRAB_MAX_DISTANCE);
});
@ -1294,7 +1332,7 @@ function MyController(hand) {
if (grabbableEntities.length > 0) {
// sort by distance
grabbableEntities.sort(function (a, b) {
grabbableEntities.sort(function(a, b) {
var aDistance = Vec3.distance(_this.entityPropertyCache.getProps(a).position, handPosition);
var bDistance = Vec3.distance(_this.entityPropertyCache.getProps(b).position, handPosition);
return aDistance - bDistance;
@ -1354,9 +1392,11 @@ function MyController(hand) {
}
}
//search line visualizations
// search line visualizations
if (USE_ENTITY_LINES_FOR_SEARCHING === true) {
this.lineOn(rayPickInfo.searchRay.origin, Vec3.multiply(rayPickInfo.searchRay.direction, LINE_LENGTH), NO_INTERSECT_COLOR);
this.lineOn(rayPickInfo.searchRay.origin,
Vec3.multiply(rayPickInfo.searchRay.direction, LINE_LENGTH),
NO_INTERSECT_COLOR);
}
this.searchIndicatorOn(rayPickInfo.searchRay);
@ -1371,11 +1411,11 @@ function MyController(hand) {
timeScale = DISTANCE_HOLDING_ACTION_TIMEFRAME;
}
return timeScale;
}
};
this.getMass = function(dimensions, density) {
return (dimensions.x * dimensions.y * dimensions.z) * density;
}
};
this.distanceHoldingEnter = function() {
@ -1502,7 +1542,8 @@ function MyController(hand) {
var RADIAL_GRAB_AMPLIFIER = 10.0;
if (Math.abs(this.grabRadialVelocity) > 0.0) {
this.grabRadius = this.grabRadius + (this.grabRadialVelocity * deltaObjectTime * this.grabRadius * RADIAL_GRAB_AMPLIFIER);
this.grabRadius = this.grabRadius + (this.grabRadialVelocity * deltaObjectTime *
this.grabRadius * RADIAL_GRAB_AMPLIFIER);
}
var newTargetPosition = Vec3.multiply(this.grabRadius, Quat.getUp(controllerRotation));
@ -1530,30 +1571,9 @@ function MyController(hand) {
}
}
// var defaultConstraintData = {
// axisStart: false,
// axisEnd: false
// }
//
// var constraintData = getEntityCustomData('lightModifierKey', this.grabbedEntity, defaultConstraintData);
// var clampedVector;
// var targetPosition;
// if (constraintData.axisStart !== false) {
// clampedVector = this.projectVectorAlongAxis(this.currentObjectPosition,
// constraintData.axisStart,
// constraintData.axisEnd);
// targetPosition = clampedVector;
// } else {
// targetPosition = {
// x: this.currentObjectPosition.x,
// y: this.currentObjectPosition.y,
// z: this.currentObjectPosition.z
// }
// }
var handPosition = this.getHandPosition();
//visualizations
// visualizations
if (USE_ENTITY_LINES_FOR_MOVING === true) {
this.lineOn(handPosition, Vec3.subtract(grabbedProperties.position, handPosition), INTERSECT_COLOR);
}
@ -1561,7 +1581,7 @@ function MyController(hand) {
this.overlayLineOn(handPosition, grabbedProperties.position, INTERSECT_COLOR);
}
if (USE_PARTICLE_BEAM_FOR_MOVING === true) {
this.handleDistantParticleBeam(handPosition, grabbedProperties.position, INTERSECT_COLOR)
this.handleDistantParticleBeam(handPosition, grabbedProperties.position, INTERSECT_COLOR);
}
if (USE_POINTLIGHT === true) {
this.handlePointLight(this.grabbedEntity);
@ -1621,46 +1641,17 @@ function MyController(hand) {
scalar = 1;
}
var projection = Vec3.sum(axisStart, Vec3.multiply(scalar, Vec3.normalize(bPrime)));
return projection
return projection;
};
this.hasPresetOffsets = function() {
var wearableData = getEntityCustomData('wearable', this.grabbedEntity, {joints: {}});
if ("joints" in wearableData) {
var allowedJoints = wearableData.joints;
var handJointName = this.hand === RIGHT_HAND ? "RightHand" : "LeftHand";
if (handJointName in allowedJoints) {
return true;
}
}
return false;
}
this.getPresetPosition = function() {
var wearableData = getEntityCustomData('wearable', this.grabbedEntity, {joints: {}});
var allowedJoints = wearableData.joints;
var handJointName = this.hand === RIGHT_HAND ? "RightHand" : "LeftHand";
if (handJointName in allowedJoints) {
return allowedJoints[handJointName][0];
}
}
this.getPresetRotation = function() {
var wearableData = getEntityCustomData('wearable', this.grabbedEntity, {joints: {}});
var allowedJoints = wearableData.joints;
var handJointName = this.hand === RIGHT_HAND ? "RightHand" : "LeftHand";
if (handJointName in allowedJoints) {
return allowedJoints[handJointName][1];
}
}
this.dropGestureReset = function() {
this.fastHandMoveDetected = false;
this.fastHandMoveTimer = 0;
};
this.dropGestureProcess = function(deltaTime) {
var pose = Controller.getPoseValue((this.hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand);
var standardControllerValue = (this.hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand;
var pose = Controller.getPoseValue(standardControllerValue);
var worldHandVelocity = Vec3.multiplyQbyV(MyAvatar.orientation, pose.velocity);
var worldHandRotation = Quat.multiply(MyAvatar.orientation, pose.rotation);
@ -1710,6 +1701,12 @@ function MyController(hand) {
this.grabbedEntity = saveGrabbedID;
}
var otherHandController = this.getOtherHandController();
if (otherHandController.grabbedEntity == this.grabbedEntity &&
(otherHandController.state == STATE_NEAR_GRABBING || otherHandController.state == STATE_DISTANCE_HOLDING)) {
otherHandController.setState(STATE_OFF, "other hand grabbed this entity");
}
var grabbedProperties = Entities.getEntityProperties(this.grabbedEntity, GRABBABLE_PROPERTIES);
this.activateEntity(this.grabbedEntity, grabbedProperties, false);
@ -1718,13 +1715,17 @@ function MyController(hand) {
var handPosition = this.getHandPosition();
var hasPresetPosition = false;
if (this.state == STATE_HOLD && this.hasPresetOffsets()) {
if (this.state == STATE_HOLD && this.grabbedHotspot) {
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, this.grabbedEntity, DEFAULT_GRABBABLE_DATA);
// if an object is "equipped" and has a predefined offset, use it.
this.ignoreIK = grabbableData.ignoreIK ? grabbableData.ignoreIK : false;
this.offsetPosition = this.getPresetPosition();
this.offsetRotation = this.getPresetRotation();
hasPresetPosition = true;
var handJointName = this.hand === RIGHT_HAND ? "RightHand" : "LeftHand";
if (this.grabbedHotspot.joints[handJointName]) {
this.offsetPosition = this.grabbedHotspot.joints[handJointName][0];
this.offsetRotation = this.grabbedHotspot.joints[handJointName][1];
hasPresetPosition = true;
}
} else {
this.ignoreIK = false;
@ -1757,7 +1758,7 @@ function MyController(hand) {
var reparentProps = {
parentID: MyAvatar.sessionUUID,
parentJointIndex: handJointIndex
}
};
if (hasPresetPosition) {
reparentProps["localPosition"] = this.offsetPosition;
reparentProps["localRotation"] = this.offsetRotation;
@ -1826,7 +1827,6 @@ function MyController(hand) {
return;
}
var now = Date.now();
if (now - this.lastUnequipCheckTime > MSECS_PER_SEC * CHECK_TOO_FAR_UNEQUIP_TIME) {
this.lastUnequipCheckTime = now;
@ -1995,6 +1995,7 @@ function MyController(hand) {
}));
this.grabbedEntity = null;
this.grabbedHotspot = null;
if (this.triggerSmoothedGrab()) {
this.waitForTriggerRelease = true;
@ -2097,7 +2098,7 @@ function MyController(hand) {
print("disconnecting stray child of hand: (" + _this.hand + ") " + childID);
Entities.editEntity(childID, {parentID: NULL_UUID});
});
}
};
this.deactivateEntity = function(entityID, noVelocity) {
var deactiveProps;
@ -2122,7 +2123,7 @@ function MyController(hand) {
// things that are held by parenting and dropped with no velocity will end up as "static" in bullet. If
// it looks like the dropped thing should fall, give it a little velocity.
var props = Entities.getEntityProperties(entityID, ["parentID", "velocity", "dynamic", "shapeType"])
var props = Entities.getEntityProperties(entityID, ["parentID", "velocity", "dynamic", "shapeType"]);
var parentID = props.parentID;
var doSetVelocity = false;
@ -2183,6 +2184,10 @@ function MyController(hand) {
}
setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data);
};
this.getOtherHandController = function() {
return (this.hand === RIGHT_HAND) ? leftController : rightController;
};
}
var rightController = new MyController(RIGHT_HAND);
@ -2204,7 +2209,8 @@ mapping.from([Controller.Standard.RightPrimaryThumb]).peek().to(rightController.
Controller.enableMapping(MAPPING_NAME);
//the section below allows the grab script to listen for messages that disable either one or both hands. useful for two handed items
// the section below allows the grab script to listen for messages
// that disable either one or both hands. useful for two handed items
var handToDisable = 'none';
function update(deltaTime) {
@ -2267,7 +2273,7 @@ var handleHandMessages = function(channel, message, sender) {
}
}
}
}
};
Messages.messageReceived.connect(handleHandMessages);

View file

@ -125,8 +125,17 @@ function ignoreMouseActivity() {
weMovedReticle = false;
return true;
}
var MARGIN = 25;
var reticleMinX = MARGIN, reticleMaxX, reticleMinY = MARGIN, reticleMaxY;
function updateRecommendedArea() {
var dims = Controller.getViewportDimensions();
reticleMaxX = dims.x - MARGIN;
reticleMaxY = dims.y - MARGIN;
}
var setReticlePosition = function (point2d) {
weMovedReticle = true;
point2d.x = Math.max(reticleMinX, Math.min(point2d.x, reticleMaxX));
point2d.y = Math.max(reticleMinY, Math.min(point2d.y, reticleMaxY));
Reticle.setPosition(point2d);
};
@ -187,6 +196,32 @@ function overlayFromWorldPoint(point) {
return { x: horizontalPixels, y: verticalPixels };
}
function activeHudPoint2d(activeHand) { // if controller is valid, update reticle position and answer 2d point. Otherwise falsey.
var controllerPose = Controller.getPoseValue(activeHand);
// Valid if any plugged-in hand controller is "on". (uncradled Hydra, green-lighted Vive...)
if (!controllerPose.valid) {
return; // Controller is cradled.
}
var controllerPosition = Vec3.sum(Vec3.multiplyQbyV(MyAvatar.orientation, controllerPose.translation),
MyAvatar.position);
// This gets point direction right, but if you want general quaternion it would be more complicated:
var controllerDirection = Quat.getUp(Quat.multiply(MyAvatar.orientation, controllerPose.rotation));
var hudPoint3d = calculateRayUICollisionPoint(controllerPosition, controllerDirection);
if (!hudPoint3d) {
if (Menu.isOptionChecked("Overlays")) { // With our hud resetting strategy, hudPoint3d should be valid here
print('Controller is parallel to HUD'); // so let us know that our assumptions are wrong.
}
return;
}
var hudPoint2d = overlayFromWorldPoint(hudPoint3d);
// We don't know yet if we'll want to make the cursor or laser visble, but we need to move it to see if
// it's pointing at a QML tool (aka system overlay).
setReticlePosition(hudPoint2d);
return hudPoint2d;
}
// MOUSE ACTIVITY --------
//
var isSeeking = false;
@ -351,8 +386,23 @@ function isPointingAtOverlayStartedNonFullTrigger(trigger) {
}
clickMapping.from(rightTrigger.full).when(isPointingAtOverlayStartedNonFullTrigger(rightTrigger)).to(Controller.Actions.ReticleClick);
clickMapping.from(leftTrigger.full).when(isPointingAtOverlayStartedNonFullTrigger(leftTrigger)).to(Controller.Actions.ReticleClick);
clickMapping.from(Controller.Standard.RightSecondaryThumb).peek().to(Controller.Actions.ContextMenu);
clickMapping.from(Controller.Standard.LeftSecondaryThumb).peek().to(Controller.Actions.ContextMenu);
// The following is essentially like Left and Right versions of
// clickMapping.from(Controller.Standard.RightSecondaryThumb).peek().to(Controller.Actions.ContextMenu);
// except that we first update the reticle position from the appropriate hand position, before invoking the ContextMenu.
var wantsMenu = 0;
clickMapping.from(function () { return wantsMenu; }).to(Controller.Actions.ContextMenu);
clickMapping.from(Controller.Standard.RightSecondaryThumb).peek().to(function (clicked) {
if (clicked) {
activeHudPoint2d(Controller.Standard.RightHand);
}
wantsMenu = clicked;
});
clickMapping.from(Controller.Standard.LeftSecondaryThumb).peek().to(function (clicked) {
if (clicked) {
activeHudPoint2d(Controller.Standard.LeftHand);
}
wantsMenu = clicked;
});
clickMapping.from(Controller.Hardware.Keyboard.RightMouseClicked).peek().to(function () {
// Allow the reticle depth to be set correctly:
// Wait a tick for the context menu to be displayed, and then simulate a (non-hand-controller) mouse move
@ -398,7 +448,7 @@ function update() {
}
updateSeeking(true);
if (!handControllerLockOut.expired(now)) {
return off(); // Let them use mouse it in peace.
return off(); // Let them use mouse in peace.
}
if (!Menu.isOptionChecked("First Person")) {
return off(); // What to do? menus can be behind hand!
@ -408,28 +458,13 @@ function update() {
}
leftTrigger.update();
rightTrigger.update();
var controllerPose = Controller.getPoseValue(activeHand);
// Valid if any plugged-in hand controller is "on". (uncradled Hydra, green-lighted Vive...)
if (!controllerPose.valid) {
return off(); // Controller is cradled.
if (!activeTrigger.state) {
return off(); // No trigger
}
var controllerPosition = Vec3.sum(Vec3.multiplyQbyV(MyAvatar.orientation, controllerPose.translation),
MyAvatar.position);
// This gets point direction right, but if you want general quaternion it would be more complicated:
var controllerDirection = Quat.getUp(Quat.multiply(MyAvatar.orientation, controllerPose.rotation));
var hudPoint3d = calculateRayUICollisionPoint(controllerPosition, controllerDirection);
if (!hudPoint3d) {
if (Menu.isOptionChecked("Overlays")) { // With our hud resetting strategy, hudPoint3d should be valid here
print('Controller is parallel to HUD'); // so let us know that our assumptions are wrong.
}
var hudPoint2d = activeHudPoint2d(activeHand);
if (!hudPoint2d) {
return off();
}
var hudPoint2d = overlayFromWorldPoint(hudPoint3d);
// We don't know yet if we'll want to make the cursor visble, but we need to move it to see if
// it's pointing at a QML tool (aka system overlay).
setReticlePosition(hudPoint2d);
// If there's a HUD element at the (newly moved) reticle, just make it visible and bail.
if (isPointingAtOverlay(hudPoint2d)) {
if (HMD.active) {
@ -446,23 +481,16 @@ function update() {
return;
}
// We are not pointing at a HUD element (but it could be a 3d overlay).
if (!activeTrigger.state) {
return off(); // No trigger
}
clearSystemLaser();
Reticle.visible = false;
}
var UPDATE_INTERVAL = 50; // milliseconds. Script.update is too frequent.
var updater = Script.setInterval(update, UPDATE_INTERVAL);
Script.scriptEnding.connect(function () {
Script.clearInterval(updater);
});
setupHandler(Script.update, update);
// Check periodically for changes to setup.
var SETTINGS_CHANGE_RECHECK_INTERVAL = 10 * 1000; // milliseconds
function checkSettings() {
updateFieldOfView();
updateRecommendedArea();
}
checkSettings();
var settingsChecker = Script.setInterval(checkSettings, SETTINGS_CHANGE_RECHECK_INTERVAL);

View file

@ -192,7 +192,7 @@ var toolBar = (function() {
});
activeButton = toolBar.addTool({
imageURL: toolIconUrl + "edit-01.svg",
imageURL: toolIconUrl + "edit.svg",
subImage: {
x: 0,
y: Tool.IMAGE_WIDTH,

View file

@ -53,18 +53,22 @@ function toggleExamples() {
var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system");
var browseExamplesButton = toolBar.addButton({
imageURL: toolIconUrl + "examples-01.svg",
imageURL: toolIconUrl + "market.svg",
objectName: "examples",
yOffset: 50,
alpha: 0.9,
buttonState: 1,
alpha: 0.9
});
var browseExamplesButtonDown = false;
browseExamplesButton.clicked.connect(function(){
function onExamplesWindowVisibilityChanged() {
browseExamplesButton.writeProperty('buttonState', examplesWindow.visible ? 0 : 1);
}
function onClick() {
toggleExamples();
});
}
browseExamplesButton.clicked.connect(onClick);
examplesWindow.visibleChanged.connect(onExamplesWindowVisibilityChanged);
Script.scriptEnding.connect(function () {
browseExamplesButton.clicked.disconnect();
browseExamplesButton.clicked.disconnect(onClick);
examplesWindow.visibleChanged.disconnect(onExamplesWindowVisibilityChanged);
});

View file

@ -14,16 +14,22 @@ var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system");
var button = toolBar.addButton({
objectName: "goto",
imageURL: Script.resolvePath("assets/images/tools/directory-01.svg"),
imageURL: Script.resolvePath("assets/images/tools/directory.svg"),
visible: true,
yOffset: 50,
buttonState: 1,
alpha: 0.9,
});
button.clicked.connect(function(){
function onAddressBarShown(visible) {
button.writeProperty('buttonState', visible ? 0 : 1);
}
function onClicked(){
DialogsManager.toggleAddressBar();
});
}
button.clicked.connect(onClicked);
DialogsManager.addressBarShown.connect(onAddressBarShown);
Script.scriptEnding.connect(function () {
button.clicked.disconnect();
button.clicked.disconnect(onClicked);
DialogsManager.addressBarShown.disconnect(onAddressBarShown);
});

View file

@ -20,23 +20,28 @@ var desktopMenuItemName = "Desktop";
var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system");
var button;
function onHmdChanged(isHmd) {
button.writeProperty('buttonState', isHmd ? 0 : 1);
}
function onClicked(){
var isDesktop = Menu.isOptionChecked(desktopMenuItemName);
Menu.setIsOptionChecked(isDesktop ? headset : desktopMenuItemName, true);
}
if (headset) {
button = toolBar.addButton({
objectName: "hmdToggle",
imageURL: Script.resolvePath("assets/images/tools/hmd-switch-01.svg"),
imageURL: Script.resolvePath("assets/images/tools/switch.svg"),
visible: true,
yOffset: 50,
alpha: 0.9,
});
onHmdChanged(HMD.active);
button.clicked.connect(function(){
var isDesktop = Menu.isOptionChecked(desktopMenuItemName);
Menu.setIsOptionChecked(isDesktop ? headset : desktopMenuItemName, true);
});
button.clicked.connect(onClicked);
HMD.displayModeChanged.connect(onHmdChanged);
Script.scriptEnding.connect(function () {
button.clicked.disconnect();
button.clicked.disconnect(onClicked);
HMD.displayModeChanged.disconnect(onHmdChanged);
});
}

View file

@ -33,6 +33,14 @@ Xform.prototype.mirrorX = function() {
{x: -this.pos.x, y: this.pos.y, z: this.pos.z});
};
Xform.prototype.xformVector = function (vector) {
return Vec3.multiplyQbyV(this.rot, vector);
}
Xform.prototype.xformPoint = function (point) {
return Vec3.sum(Vec3.multiplyQbyV(this.rot, point), this.pos);
}
Xform.prototype.toString = function() {
var rot = this.rot;
var pos = this.pos;

View file

@ -141,7 +141,9 @@ CameraManager = function() {
};
that.enable = function() {
if (Camera.mode == "independent" || that.enabled) return;
if (Camera.mode == "independent" || that.enabled || HMD.active) {
return;
}
for (var i = 0; i < CAPTURED_KEYS.length; i++) {
Controller.captureKeyEvents({
@ -179,7 +181,9 @@ CameraManager = function() {
}
that.disable = function(ignoreCamera) {
if (!that.enabled) return;
if (!that.enabled) {
return;
}
for (var i = 0; i < CAPTURED_KEYS.length; i++) {
Controller.releaseKeyEvents({
@ -352,27 +356,21 @@ CameraManager = function() {
that.mousePressEvent = function(event) {
if (cameraTool.mousePressEvent(event)) {
return true;
}
if (!that.enabled) return;
if (!that.enabled) {
return;
}
if (event.isRightButton || (event.isLeftButton && event.isControl && !event.isShifted)) {
that.mode = MODE_ORBIT;
} else if (event.isMiddleButton || (event.isLeftButton && event.isControl && event.isShifted)) {
that.mode = MODE_PAN;
}
if (that.mode !== MODE_INACTIVE) {
hasDragged = false;
return true;
}
@ -381,7 +379,9 @@ CameraManager = function() {
that.mouseReleaseEvent = function(event) {
if (!that.enabled) return;
if (!that.enabled) {
return;
}
that.mode = MODE_INACTIVE;
Reticle.setVisible(true);
@ -403,7 +403,9 @@ CameraManager = function() {
};
that.wheelEvent = function(event) {
if (!that.enabled) return;
if (!that.enabled) {
return;
}
var dZoom = -event.delta * SCROLL_SENSITIVITY;
@ -459,8 +461,12 @@ CameraManager = function() {
}
function normalizeDegrees(degrees) {
while (degrees > 180) degrees -= 360;
while (degrees < -180) degrees += 360;
while (degrees > 180) {
degrees -= 360;
}
while (degrees < -180) {
degrees += 360;
}
return degrees;
}
@ -483,7 +489,6 @@ CameraManager = function() {
that.targetZoomDistance = clamp(that.targetZoomDistance, MIN_ZOOM_DISTANCE, MAX_ZOOM_DISTANCE);
}
if (easing) {
easingTime = Math.min(EASE_TIME, easingTime + dt);
}

View file

@ -111,8 +111,8 @@ EntityListTool = function(opts) {
}
});
webView.visibilityChanged.connect(function (visible) {
if (visible) {
webView.visibleChanged.connect(function () {
if (webView.visible) {
that.sendUpdate();
}
});

View file

@ -309,5 +309,11 @@ calculateHandSizeRatio = function() {
clamp = function(val, min, max){
return Math.max(min, Math.min(max, val))
}
}
// flattens an array of arrays into a single array
// example: flatten([[1], [3, 4], []) => [1, 3, 4]
// NOTE: only does one level of flattening, it is not recursive.
flatten = function(array) {
return [].concat.apply([], array);
}

View file

@ -14,16 +14,26 @@ var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system");
var button = toolBar.addButton({
objectName: "mute",
imageURL: Script.resolvePath("assets/images/tools/microphone.svg"),
imageURL: Script.resolvePath("assets/images/tools/mic.svg"),
visible: true,
alpha: 0.9,
});
button.clicked.connect(function(){
var menuItem = "Mute Microphone";
Menu.setIsOptionChecked(menuItem, !Menu.isOptionChecked(menuItem));
buttonState: 1,
alpha: 0.9
});
function onMuteToggled() {
// We could just toggle state, but we're less likely to get out of wack if we read the AudioDevice.
// muted => button "on" state => 1. go figure.
button.writeProperty('buttonState', AudioDevice.getMuted() ? 0 : 1);
}
onMuteToggled();
function onClicked(){
var menuItem = "Mute Microphone";
Menu.setIsOptionChecked(menuItem, !Menu.isOptionChecked(menuItem));
}
button.clicked.connect(onClicked);
AudioDevice.muteToggled.connect(onMuteToggled);
Script.scriptEnding.connect(function () {
button.clicked.disconnect();
button.clicked.disconnect(onClicked);
AudioDevice.muteToggled.disconnect(onMuteToggled);
});

View file

@ -599,8 +599,6 @@ var usersWindow = (function () {
usersRequest.ontimeout = pollUsersTimedOut;
usersRequest.onreadystatechange = processUsers;
usersRequest.send();
checkLoggedIn();
}
processUsers = function () {
@ -646,6 +644,8 @@ var usersWindow = (function () {
updateUsersDisplay();
updateOverlayPositions();
checkLoggedIn();
} else {
print("Error: Request for users status returned " + usersRequest.status + " " + usersRequest.statusText);
usersTimer = Script.setTimeout(pollUsers, HTTP_GET_TIMEOUT); // Try again after a longer delay.

View file

@ -0,0 +1,187 @@
//
// Created by Bradley Austin Davis on 2016/05/16
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "TestFbx.h"
#include <glm/gtc/matrix_transform.hpp>
#include <QtCore/QFile>
#include <FBXReader.h>
struct MyVertex {
vec3 position;
vec2 texCoords;
vec3 normal;
uint32_t color;
static gpu::Stream::FormatPointer getVertexFormat() {
static const gpu::Element POSITION_ELEMENT { gpu::VEC3, gpu::FLOAT, gpu::XYZ };
static const gpu::Element TEXTURE_ELEMENT { gpu::VEC2, gpu::FLOAT, gpu::UV };
static const gpu::Element NORMAL_ELEMENT { gpu::VEC3, gpu::FLOAT, gpu::XYZ };
static const gpu::Element COLOR_ELEMENT { gpu::VEC4, gpu::NUINT8, gpu::RGBA };
gpu::Stream::FormatPointer vertexFormat { std::make_shared<gpu::Stream::Format>() };
vertexFormat->setAttribute(gpu::Stream::POSITION, 0, POSITION_ELEMENT, offsetof(MyVertex, position));
vertexFormat->setAttribute(gpu::Stream::TEXCOORD, 0, TEXTURE_ELEMENT, offsetof(MyVertex, texCoords));
vertexFormat->setAttribute(gpu::Stream::COLOR, 0, COLOR_ELEMENT, offsetof(MyVertex, color));
vertexFormat->setAttribute(gpu::Stream::NORMAL, 0, NORMAL_ELEMENT, offsetof(MyVertex, normal));
return vertexFormat;
}
};
struct Part {
size_t baseVertex;
size_t baseIndex;
size_t materialId;
};
struct DrawElementsIndirectCommand {
uint count { 0 };
uint instanceCount { 1 };
uint firstIndex { 0 };
uint baseVertex { 0 };
uint baseInstance { 0 };
};
class FileDownloader : public QObject {
Q_OBJECT
public:
explicit FileDownloader(QUrl imageUrl, QObject *parent = 0) : QObject(parent) {
connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileDownloaded(QNetworkReply*)));
QNetworkRequest request(imageUrl);
m_WebCtrl.get(request);
}
virtual ~FileDownloader() {}
const QByteArray& downloadedData() const {
return m_DownloadedData;
}
signals:
void downloaded();
private slots:
void fileDownloaded(QNetworkReply* pReply) {
m_DownloadedData = pReply->readAll();
pReply->deleteLater();
emit downloaded();
}
private:
QNetworkAccessManager m_WebCtrl;
QByteArray m_DownloadedData;
};
static const QUrl TEST_ASSET = QString("https://s3.amazonaws.com/DreamingContent/assets/models/tardis/console.fbx");
static const mat4 TEST_ASSET_TRANSFORM = glm::translate(mat4(), vec3(0, -1.5f, 0)) * glm::scale(mat4(), vec3(0.01f));
//static const QUrl TEST_ASSET = QString("https://s3.amazonaws.com/DreamingContent/assets/simple/SimpleMilitary/Models/Vehicles/tank_02_c.fbx");
//static const mat4 TEST_ASSET_TRANSFORM = glm::translate(mat4(), vec3(0, -0.5f, 0)) * glm::scale(mat4(), vec3(0.1f));
TestFbx::TestFbx(const render::ShapePlumberPointer& shapePlumber) : _shapePlumber(shapePlumber) {
FileDownloader* downloader = new FileDownloader(TEST_ASSET, qApp);
QObject::connect(downloader, &FileDownloader::downloaded, [this, downloader] {
parseFbx(downloader->downloadedData());
});
}
bool TestFbx::isReady() const {
return _partCount != 0;
}
void TestFbx::parseFbx(const QByteArray& fbxData) {
QVariantHash mapping;
FBXGeometry* fbx = readFBX(fbxData, mapping);
size_t totalVertexCount = 0;
size_t totalIndexCount = 0;
size_t totalPartCount = 0;
size_t highestIndex = 0;
for (const auto& mesh : fbx->meshes) {
size_t vertexCount = mesh.vertices.size();
totalVertexCount += mesh.vertices.size();
highestIndex = std::max(highestIndex, vertexCount);
totalPartCount += mesh.parts.size();
for (const auto& part : mesh.parts) {
totalIndexCount += part.quadTrianglesIndices.size();
totalIndexCount += part.triangleIndices.size();
}
}
size_t baseVertex = 0;
std::vector<MyVertex> vertices;
vertices.reserve(totalVertexCount);
std::vector<uint16_t> indices;
indices.reserve(totalIndexCount);
std::vector<DrawElementsIndirectCommand> parts;
parts.reserve(totalPartCount);
_partCount = totalPartCount;
for (const auto& mesh : fbx->meshes) {
baseVertex = vertices.size();
vec3 color;
for (const auto& part : mesh.parts) {
DrawElementsIndirectCommand partIndirect;
partIndirect.baseVertex = (uint)baseVertex;
partIndirect.firstIndex = (uint)indices.size();
partIndirect.baseInstance = (uint)parts.size();
_partTransforms.push_back(mesh.modelTransform);
auto material = fbx->materials[part.materialID];
color = material.diffuseColor;
for (auto index : part.quadTrianglesIndices) {
indices.push_back(index);
}
for (auto index : part.triangleIndices) {
indices.push_back(index);
}
size_t triangles = (indices.size() - partIndirect.firstIndex);
Q_ASSERT(0 == (triangles % 3));
//triangles /= 3;
partIndirect.count = (uint)triangles;
parts.push_back(partIndirect);
}
size_t vertexCount = mesh.vertices.size();
for (size_t i = 0; i < vertexCount; ++i) {
MyVertex vertex;
vertex.position = mesh.vertices[(int)i];
vec3 n = mesh.normals[(int)i];
vertex.normal = n;
vertex.texCoords = mesh.texCoords[(int)i];
vertex.color = toCompactColor(vec4(color, 1));
vertices.push_back(vertex);
}
}
_vertexBuffer->append(vertices);
_indexBuffer->append(indices);
_indirectBuffer->append(parts);
delete fbx;
}
void TestFbx::renderTest(size_t testId, RenderArgs* args) {
gpu::Batch& batch = *(args->_batch);
//pipeline->pipeline
if (_partCount) {
for (size_t i = 0; i < _partCount; ++i) {
batch.setModelTransform(TEST_ASSET_TRANSFORM * _partTransforms[i]);
batch.setupNamedCalls(__FUNCTION__, [this](gpu::Batch& batch, gpu::Batch::NamedBatchData&) {
RenderArgs args; args._batch = &batch;
_shapePlumber->pickPipeline(&args, render::ShapeKey());
batch.setInputBuffer(0, _vertexBuffer, 0, sizeof(MyVertex));
batch.setIndexBuffer(gpu::UINT16, _indexBuffer, 0);
batch.setInputFormat(MyVertex::getVertexFormat());
batch.setIndirectBuffer(_indirectBuffer, 0);
batch.multiDrawIndexedIndirect((uint)_partCount, gpu::TRIANGLES);
});
}
}
}
#include "TestFbx.moc"

View file

@ -0,0 +1,35 @@
//
// Created by Bradley Austin Davis on 2016/05/16
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#pragma once
#include "TestHelpers.h"
#include <render/ShapePipeline.h>
class FBXGeometry;
class TestFbx : public GpuTestBase {
size_t _partCount { 0 };
model::Material _material;
render::ShapeKey _shapeKey;
std::vector<mat4> _partTransforms;
render::ShapePlumberPointer _shapePlumber;
gpu::Stream::FormatPointer _vertexFormat { std::make_shared<gpu::Stream::Format>() };
gpu::BufferPointer _vertexBuffer { std::make_shared<gpu::Buffer>() };
gpu::BufferPointer _indexBuffer { std::make_shared<gpu::Buffer>() };
gpu::BufferPointer _indirectBuffer { std::make_shared<gpu::Buffer>() };
public:
TestFbx(const render::ShapePlumberPointer& shapePlumber);
bool isReady() const override;
void renderTest(size_t test, RenderArgs* args) override;
private:
void parseFbx(const QByteArray& fbxData);
};

View file

@ -0,0 +1,54 @@
//
// Created by Bradley Austin Davis on 2016/05/16
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "TestFloorGrid.h"
TestFloorGrid::TestFloorGrid() {
auto geometryCache = DependencyManager::get<GeometryCache>();
// Render grid on xz plane (not the optimal way to do things, but w/e)
// Note: GeometryCache::renderGrid will *not* work, as it is apparenly unaffected by batch rotations and renders xy only
static const std::string GRID_INSTANCE = "Grid";
static auto compactColor1 = toCompactColor(vec4 { 0.35f, 0.25f, 0.15f, 1.0f });
static auto compactColor2 = toCompactColor(vec4 { 0.15f, 0.25f, 0.35f, 1.0f });
static std::vector<glm::mat4> transforms;
static gpu::BufferPointer colorBuffer;
if (!transforms.empty()) {
transforms.reserve(200);
colorBuffer = std::make_shared<gpu::Buffer>();
for (int i = 0; i < 100; ++i) {
{
glm::mat4 transform = glm::translate(mat4(), vec3(0, -1, -50 + i));
transform = glm::scale(transform, vec3(100, 1, 1));
transforms.push_back(transform);
colorBuffer->append(compactColor1);
}
{
glm::mat4 transform = glm::mat4_cast(quat(vec3(0, PI / 2.0f, 0)));
transform = glm::translate(transform, vec3(0, -1, -50 + i));
transform = glm::scale(transform, vec3(100, 1, 1));
transforms.push_back(transform);
colorBuffer->append(compactColor2);
}
}
}
}
void TestFloorGrid::renderTest(size_t testId, RenderArgs* args) {
//gpu::Batch& batch = *(args->_batch);
//auto pipeline = geometryCache->getSimplePipeline();
//for (auto& transform : transforms) {
// batch.setModelTransform(transform);
// batch.setupNamedCalls(GRID_INSTANCE, [=](gpu::Batch& batch, gpu::Batch::NamedBatchData& data) {
// batch.setPipeline(_pipeline);
// geometryCache->renderWireShapeInstances(batch, GeometryCache::Line, data.count(), colorBuffer);
// });
//}
}

View file

@ -0,0 +1,26 @@
//
// Created by Bradley Austin Davis on 2016/05/16
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#pragma once
#include <vector>
#include <GLMHelpers.h>
#include <Transform.h>
#include <gpu/Resource.h>
#include <gpu/Stream.h>
#include "TestHelpers.h"
class TestFloorGrid : public GpuTestBase {
public:
TestFloorGrid();
void renderTest(size_t testId, RenderArgs* args) override;
};

View file

@ -0,0 +1,88 @@
//
// Created by Bradley Austin Davis on 2016/05/16
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "TestFloorTexture.h"
struct Vertex {
vec4 position;
vec4 texture;
vec4 normal;
vec4 color;
};
static const uint TEXTURE_OFFSET = offsetof(Vertex, texture);
static const uint NORMAL_OFFSET = offsetof(Vertex, normal);
static const uint POSITION_OFFSET = offsetof(Vertex, position);
static const uint COLOR_OFFSET = offsetof(Vertex, color);
static const gpu::Element POSITION_ELEMENT { gpu::VEC3, gpu::FLOAT, gpu::XYZ };
static const gpu::Element TEXTURE_ELEMENT { gpu::VEC2, gpu::FLOAT, gpu::UV };
static const gpu::Element NORMAL_ELEMENT { gpu::VEC3, gpu::FLOAT, gpu::XYZ };
static const gpu::Element COLOR_ELEMENT { gpu::VEC4, gpu::FLOAT, gpu::RGBA };
FloorTextureTest::FloorTextureTest() {
auto geometryCache = DependencyManager::get<GeometryCache>();
std::vector<Vertex> vertices;
const int MINX = -1000;
const int MAXX = 1000;
vertices.push_back({
vec4(MAXX, 0, MAXX, 1),
vec4(MAXX, MAXX, 0, 0),
vec4(0, 1, 0, 1),
vec4(1),
});
vertices.push_back({
vec4(MAXX, 0, MINX, 1),
vec4(MAXX, 0, 0, 0),
vec4(0, 1, 0, 1),
vec4(1),
});
vertices.push_back({
vec4(MINX, 0, MINX, 1),
vec4(0, 0, 0, 0),
vec4(0, 1, 0, 1),
vec4(1),
});
vertices.push_back({
vec4(MINX, 0, MAXX, 1),
vec4(0, MAXX, 0, 0),
vec4(0, 1, 0, 1),
vec4(1),
});
vertexBuffer->append(vertices);
indexBuffer->append(std::vector<uint16_t>({ 0, 1, 2, 2, 3, 0 }));
texture = DependencyManager::get<TextureCache>()->getImageTexture("C:/Users/bdavis/Git/openvr/samples/bin/cube_texture.png");
//texture = DependencyManager::get<TextureCache>()->getImageTexture("H:/test.png");
//texture = DependencyManager::get<TextureCache>()->getImageTexture("H:/crate_blue.fbm/lambert8SG_Normal_OpenGL.png");
vertexFormat->setAttribute(gpu::Stream::POSITION, 0, POSITION_ELEMENT, POSITION_OFFSET);
vertexFormat->setAttribute(gpu::Stream::TEXCOORD, 0, TEXTURE_ELEMENT, TEXTURE_OFFSET);
vertexFormat->setAttribute(gpu::Stream::COLOR, 0, COLOR_ELEMENT, COLOR_OFFSET);
vertexFormat->setAttribute(gpu::Stream::NORMAL, 0, NORMAL_ELEMENT, NORMAL_OFFSET);
}
void FloorTextureTest::renderTest(size_t testId, RenderArgs* args) {
gpu::Batch& batch = *(args->_batch);
auto geometryCache = DependencyManager::get<GeometryCache>();
static auto start = usecTimestampNow();
auto now = usecTimestampNow();
if ((now - start) > USECS_PER_SECOND * 1) {
start = now;
texture->incremementMinMip();
}
geometryCache->bindSimpleProgram(batch, true, true, true);
batch.setInputBuffer(0, vertexBuffer, 0, sizeof(Vertex));
batch.setInputFormat(vertexFormat);
batch.setIndexBuffer(gpu::UINT16, indexBuffer, 0);
batch.setResourceTexture(0, texture);
batch.setModelTransform(glm::translate(glm::mat4(), vec3(0, -0.1, 0)));
batch.drawIndexed(gpu::TRIANGLES, 6, 0);
}

View file

@ -0,0 +1,22 @@
//
// Created by Bradley Austin Davis on 2016/05/16
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#pragma once
#include "TestHelpers.h"
class FloorTextureTest : public GpuTestBase {
gpu::BufferPointer vertexBuffer { std::make_shared<gpu::Buffer>() };
gpu::BufferPointer indexBuffer { std::make_shared<gpu::Buffer>() };
gpu::Stream::FormatPointer vertexFormat { std::make_shared<gpu::Stream::Format>() };
gpu::TexturePointer texture;
public:
FloorTextureTest();
void renderTest(size_t testId, RenderArgs* args) override;
};

View file

@ -62,6 +62,9 @@
#include <render/CullTask.h>
#include "TestWindow.h"
#include "TestFbx.h"
#include "TestFloorGrid.h"
#include "TestFloorTexture.h"
#include "TestInstancedShapes.h"
#include "TestShapes.h"
@ -90,8 +93,8 @@ class MyTestWindow : public TestWindow {
#endif
updateCamera();
_testBuilders = TestBuilders({
//[this] { return new TestFbx(_shapePlumber); },
[] { return new TestShapes(); },
[this] { return new TestFbx(_shapePlumber); },
[] { return new TestInstancedShapes(); },
});
}

View file

@ -1,28 +0,0 @@
<@include gpu/Config.slh@>
<$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$>
//
// simple.frag
// fragment shader
//
// Created by Andrzej Kapolka on 9/15/14.
// Copyright 2014 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@include DeferredBufferWrite.slh@>
<@include model/Material.slh@>
// the interpolated normal
in vec3 _normal;
in vec3 _color;
void main(void) {
packDeferredFragment(
normalize(_normal.xyz),
1.0,
_color.rgb,
DEFAULT_ROUGHNESS, DEFAULT_METALLIC, DEFAULT_EMISSIVE, DEFAULT_OCCLUSION);
}

Some files were not shown because too many files have changed in this diff Show more