on xenial help sign in
Updated the visuals of the SwipeToAct-widget for incoming-call snap-decision notifications according to new design-spec.
f74aa05Mirco Müller
qml/Notifications/SwipeToAct.qml+178−247
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 20014-2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -16,12 +16,10 @@
16
16
17import QtQuick 2.3
17import QtQuick 2.3
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19−import QtGraphicalEffects 1.0
20
19
21Item {
20Item {
22 id: swipeToAct
21 id: swipeToAct
23
22
24− width: parent.width
25 height: childrenRect.height
23 height: childrenRect.height
26
24
27 signal leftTriggered()
25 signal leftTriggered()
@@ -29,280 +27,213 @@ Item {
29
27
30 property string leftIconName
28 property string leftIconName
31 property string rightIconName
29 property string rightIconName
32− readonly property double sliderHeight: units.gu(6)
33− readonly property double gap: units.gu(1)
34− readonly property double halfWay: mouseArea.drag.maximumX / 2
35
30
36− Rectangle {
31+ QtObject {
37− id: gradient
32+ id: priv
38− width: parent.width * 5
33+
34+ property double opacityDelta
39− height: sliderHeight
35+ readonly property double sliderHeight: units.gu(8)
40− visible: false
36+ readonly property double gap: units.gu(1)
41− LinearGradient {
37+ readonly property color sliderMainColor: "#b2b2b2"
42− anchors.fill: parent
38+ readonly property color sliderBGColor: "#f4f4f4"
43− start: Qt.point(parent.x, parent.y)
39+ readonly property double halfWay: mouseArea.drag.maximumX / 2
44− end: Qt.point(parent.width, parent.y)
40+
45− gradient: Gradient {
41+ UbuntuNumberAnimation on opacityDelta {
46− GradientStop { position: 0.0; color: UbuntuColors.red }
42+ from: 0
47− GradientStop { position: 0.2; color: UbuntuColors.red }
43+ to: .5
48− GradientStop { position: 0.4; color: "#dddddd" }
44+ loops: Animation.Infinite
49− GradientStop { position: 0.6; color: "#dddddd" }
45+ duration: UbuntuAnimation.SleepyDuration
50− GradientStop { position: 0.8; color: UbuntuColors.green }
46+ easing.type: Easing.Linear
51− GradientStop { position: 1.0; color: UbuntuColors.green }
52− }
53 }
47 }
54− }
55
48
56− ShaderEffectSource {
49+ // linearly interpolate between start- and end-color
57− id: effectSourceGradient
50+ // with a normalized weight-factor
58− sourceItem: gradient
51+ // 0.0 meaning just the start-color being taken into
59− width: gradient.width
52+ // account and 1.0 only taking the end-color into
60− height: gradient.height
53+ // account
61− sourceRect: Qt.rect(0.4 * gradient.width * (slider.x / halfWay), 0, mask.width, mask.height)
54+ function interpolate(start, end, factor) {
62− visible: false
55+ var rdiff = start.r > end.r ? end.r - start.r : end.r - start.r
63− hideSource: true
56+ var gdiff = start.g > end.g ? end.g - start.g : end.g - start.g
57+ var bdiff = start.b > end.b ? end.b - start.b : end.b - start.b
58+ var adiff = start.a > end.a ? end.a - start.a : end.a - start.a
59+ var r = start.r + factor * rdiff
60+ var g = start.g + factor * gdiff
61+ var b = start.b + factor * bdiff
62+ var a = start.a + factor * adiff
63+ return Qt.rgba(r,g,b,a)
64+ }
64 }
65 }
65
66
66 UbuntuShape {
67 UbuntuShape {
67− id: mask
68+ id: row
68− color: "black"
69 width: parent.width
69 width: parent.width
70− height: sliderHeight
70+ height: priv.sliderHeight
71+ color: priv.sliderBGColor
71 borderSource: "none"
72 borderSource: "none"
72− visible: false
73− }
74
73
75− ShaderEffectSource {
74+ UbuntuShape {
76− id: effectSourceMask
75+ id: leftShape
77− sourceItem: mask
76+ anchors.top: parent.top
78− width: mask.width
77+ anchors.left: parent.left
79− height: mask.height
78+ anchors.margins: priv.gap
80− visible: false
79+ color: UbuntuColors.red
81− hideSource: true
80+ borderSource: "none"
82− }
81+
83−
82+ state: "normal"
84− ShaderEffect {
83+ height: units.gu(6)
85− width: parent.width
84+ width: units.gu(6)
86− height: sliderHeight
85+ radius: "medium"
87− property variant mask: effectSourceMask
86+ opacity: slider.x <= priv.halfWay ? 1.0 : 1.0 - ((slider.x - priv.halfWay) / priv.halfWay)
88− property variant gradient: effectSourceGradient
87+
89− vertexShader: "
88+ Icon {
90− uniform highp mat4 qt_Matrix;
89+ anchors.centerIn: parent
91− attribute highp vec4 qt_Vertex;
90+ width: units.gu(3.5)
92− attribute highp vec2 qt_MultiTexCoord0;
91+ height: units.gu(3.5)
93− varying highp vec2 coord;
92+ name: leftIconName
94− void main() {
93+ color: "white"
95− coord = qt_MultiTexCoord0;
96− gl_Position = qt_Matrix * qt_Vertex;
97− }"
98− fragmentShader: "
99− varying highp vec2 coord;
100− uniform sampler2D mask;
101− uniform sampler2D gradient;
102− void main() {
103− lowp vec4 texMask = texture2D(mask, coord);
104− lowp vec4 texGradient = texture2D(gradient, coord);
105− gl_FragColor = texGradient.rgba * texMask.a ;
106− }"
94+ }
95+ }
107
96
108 Row {
97 Row {
109− id: row
98+ anchors.verticalCenter: parent.verticalCenter
110− anchors.fill: parent
99+ anchors.right: slider.left
100+ anchors.rightMargin: units.gu(1.5)
111− spacing: gap
101+ spacing: -units.gu(1)
112− anchors.margins: gap
102+ visible: slider.x === priv.halfWay
113−
114− UbuntuShape {
115− id: leftShape
116− states: [
117− State {
118− name: "normal"
119− PropertyChanges {
120− target: leftShape
121− color: UbuntuColors.red
122− }
123− PropertyChanges {
124− target: innerLeftShape
125− color: UbuntuColors.red
126− visible: false
127− }
128− },
129− State {
130− name: "selected"
131− PropertyChanges {
132− target: leftShape
133− color: "white"
134− }
135− PropertyChanges {
136− target: innerLeftShape
137− color: UbuntuColors.red
138− visible: true
139− }
140− }
141− ]
142− state: "normal"
143− height: units.gu(4)
144− width: units.gu(7)
145− borderSource: "none"
146− opacity: slider.x <= halfWay ? 1.0 : 1.0 - ((slider.x - halfWay) / halfWay)
147− UbuntuShape {
148− id: innerLeftShape
149− anchors.centerIn: parent
150− borderSource: "none"
151− width: parent.width - units.gu(.5)
152− height: parent.height - units.gu(.5)
153− }
154− Icon {
103+ Icon {
155− anchors.centerIn: parent
104+ name: "back"
156− width: units.gu(2)
105+ height: units.gu(2.5)
157− height: units.gu(2)
106+ color: priv.sliderMainColor
158− name: leftIconName
107+ opacity: .5 + priv.opacityDelta
159− color: "white"
160− }
161 }
108 }
162−
109+ Icon {
163− Rectangle {
110+ name: "back"
164− id: leftSpacer
165− width: (row.width - (leftShape.width + slider.width + rightShape.width + 4 * row.spacing)) / 2
166− height: units.gu(4)
111+ height: units.gu(2.5)
112+ color: priv.sliderMainColor
167− opacity: 0
113+ opacity: 1 - priv.opacityDelta
168 }
114 }
115+ }
169
116
170− UbuntuShape {
117+ UbuntuShape {
171− id: slider
118+ id: slider
172− objectName: "slider"
119+ objectName: "slider"
120+ anchors.top: parent.top
121+ anchors.margins: priv.gap
122+ x: priv.halfWay
173
123
174− Behavior on x {
124+ Component.onCompleted: {
175− UbuntuNumberAnimation {
125+ xBehavior.enabled = true
176− duration: UbuntuAnimation.FastDuration
177− easing.type: Easing.OutBounce
178− }
179− }
126+ }
180
127
181− Behavior on opacity {
128+ Behavior on x {
129+ id: xBehavior
130+ enabled: false
182− UbuntuNumberAnimation {
131+ UbuntuNumberAnimation {
183− duration: UbuntuAnimation.FastDuration
132+ duration: UbuntuAnimation.FastDuration
184− }
133+ easing.type: Easing.OutBounce
185 }
134 }
135+ }
186
136
187− onOpacityChanged: {
137+ Behavior on opacity {
188− if (opacity === 0) {
138+ UbuntuNumberAnimation {
189− if (rightShape.state === "selected") {
139+ duration: UbuntuAnimation.FastDuration
190− rightTriggered()
191− }
192− if (leftShape.state === "selected") {
193− leftTriggered()
194− }
195− }
196 }
140 }
141+ }
197
142
198− z: 1
143+ onXChanged: {
199− color: "white"
144+ var factor
200− height: units.gu(4)
145+ if (slider.x <= priv.gap + leftShape.width)
201− width: units.gu(7)
202− borderSource: "none"
203− Row {
146+ {
204− anchors.fill: parent
147+ factor = (slider.x - priv.gap) / leftShape.width
205− spacing: 2 * gap
148+ slider.color = priv.interpolate(leftShape.color, priv.sliderMainColor, factor)
206− anchors.leftMargin: units.gu(.5)
149+ } else if (slider.x >= rightShape.x - slider.width) {
207− anchors.rightMargin: units.gu(.5)
150+ factor = (slider.x - rightShape.x + rightShape.width) / rightShape.width
208− Icon {
151+ slider.color = priv.interpolate(priv.sliderMainColor, rightShape.color, factor)
209− anchors.verticalCenter: parent.verticalCenter
152+ } else {
210− name: "back"
153+ slider.color = priv.sliderMainColor
211− width: units.gu(2)
212− height: units.gu(2)
213− }
214− Icon {
215− anchors.verticalCenter: parent.verticalCenter
216− name: "next"
217− width: units.gu(2)
218− height: units.gu(2)
219− }
220 }
154 }
221 }
155 }
222
156
223− Rectangle {
157+ z: 1
224− id: rightSpacer
158+ color: priv.sliderMainColor
225− width: leftSpacer.width
226− height: units.gu(4)
159+ height: units.gu(6)
227− opacity: 0
160+ width: units.gu(6)
161+ borderSource: "none"
162+ radius: "medium"
163+ Icon {
164+ anchors.fill: parent
165+ anchors.margins: units.gu(1.5)
166+ source: "grip-large.svg"
167+ color: "white"
228 }
168 }
169+ }
170+ Row {
171+ anchors.verticalCenter: parent.verticalCenter
172+ anchors.left: slider.right
173+ anchors.leftMargin: units.gu(1.5)
174+ spacing: -units.gu(1)
175+ visible: slider.x === priv.halfWay
176+ Icon {
177+ name: "next"
178+ height: units.gu(2.5)
179+ color: priv.sliderMainColor
180+ opacity: 1 - priv.opacityDelta
181+ }
182+ Icon {
183+ name: "next"
184+ height: units.gu(2.5)
185+ color: priv.sliderMainColor
186+ opacity: 0.5 + priv.opacityDelta
187+ }
188+ }
229
189
230− UbuntuShape {
190+ UbuntuShape {
231− id: rightShape
191+ id: rightShape
232− states: [
192+ anchors.top: parent.top
233− State {
193+ anchors.right: parent.right
234− name: "normal"
194+ anchors.margins: priv.gap
235− PropertyChanges {
236− target: rightShape
237− color: UbuntuColors.green
238− }
239− PropertyChanges {
240− target: innerRightShape
241− color: UbuntuColors.green
195+ color: UbuntuColors.green
242− visible: false
196+ borderSource: "none"
243− }
197+
244− },
245− State {
246− name: "selected"
247− PropertyChanges {
248− target: rightShape
249− color: "white"
250− }
251− PropertyChanges {
252− target: innerRightShape
253− color: UbuntuColors.green
254− visible: true
255− }
256− }
257− ]
258− state: "normal"
198+ state: "normal"
259− height: units.gu(4)
199+ height: units.gu(6)
260− width: units.gu(7)
200+ width: units.gu(6)
261− borderSource: "none"
201+ radius: "medium"
262− opacity: slider.x >= halfWay ? 1.0 : slider.x / halfWay
202+ opacity: slider.x >= priv.halfWay ? 1.0 : slider.x / priv.halfWay
263− UbuntuShape {
203+
264− id: innerRightShape
265− anchors.centerIn: parent
266− borderSource: "none"
267− width: parent.width - units.gu(.5)
268− height: parent.height - units.gu(.5)
269− }
270− Icon {
204+ Icon {
271− anchors.centerIn: parent
205+ anchors.centerIn: parent
272− width: units.gu(2)
206+ width: units.gu(3.5)
273− height: units.gu(2)
207+ height: units.gu(3.5)
274− name: rightIconName
208+ name: rightIconName
275− color: "white"
209+ color: "white"
276− }
277 }
210 }
278 }
211 }
212+ }
279
213
280− MouseArea {
214+ MouseArea {
281− id: mouseArea
215+ id: mouseArea
282− objectName: "swipeMouseArea"
216+ objectName: "swipeMouseArea"
283
217
284− anchors.fill: row
218+ anchors.fill: row
285− drag.target: slider
219+ drag.target: slider
286− drag.axis: Drag.XAxis
220+ drag.axis: Drag.XAxis
287− drag.minimumX: 0
221+ drag.minimumX: priv.gap
288− drag.maximumX: row.width - slider.width
222+ drag.maximumX: row.width - slider.width - priv.gap
289
223
290− onReleased: {
224+ onReleased: {
291− if (slider.x !== drag.minimumX || slider.x !== drag.maximumX) {
225+ if (slider.x !== drag.minimumX || slider.x !== drag.maximumX) {
292− slider.x = halfWay
226+ slider.x = priv.halfWay
293− }
227+ }
294− if (slider.x === drag.minimumX) {
228+ if (slider.x === drag.minimumX) {
295− slider.x = drag.minimumX
229+ slider.x = drag.minimumX
296− slider.opacity = 0
297− enabled = false
230+ enabled = false
298− leftShape.state = "selected"
231+ leftTriggered()
299− }
232+ }
300− if (slider.x === drag.maximumX) {
233+ if (slider.x === drag.maximumX) {
301− slider.x = drag.maximumX
234+ slider.x = drag.maximumX
302− slider.opacity = 0
303− enabled = false
235+ enabled = false
304− rightShape.state = "selected"
236+ rightTriggered()
305− }
306 }
237 }
307 }
238 }
308 }
239 }
qml/Notifications/grip-large.svgnew file+150
@@ -0,0 +1,150 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="90"
13+ height="90"
14+ id="svg4874"
15+ version="1.1"
16+ inkscape:version="0.91+devel r"
17+ viewBox="0 0 90 90.000001"
18+ sodipodi:docname="grip-large01.svg">
19+ <defs
20+ id="defs4876" />
21+ <sodipodi:namedview
22+ id="base"
23+ pagecolor="#ffffff"
24+ bordercolor="#666666"
25+ borderopacity="1.0"
26+ inkscape:pageopacity="0.0"
27+ inkscape:pageshadow="2"
28+ inkscape:zoom="7.9580786"
29+ inkscape:cx="13.632541"
30+ inkscape:cy="49.591116"
31+ inkscape:document-units="px"
32+ inkscape:current-layer="g1708"
33+ showgrid="true"
34+ showborder="true"
35+ fit-margin-top="0"
36+ fit-margin-left="0"
37+ fit-margin-right="0"
38+ fit-margin-bottom="0"
39+ inkscape:snap-bbox="true"
40+ inkscape:bbox-paths="true"
41+ inkscape:bbox-nodes="true"
42+ inkscape:snap-bbox-edge-midpoints="true"
43+ inkscape:snap-bbox-midpoints="true"
44+ inkscape:object-paths="true"
45+ inkscape:snap-intersection-paths="true"
46+ inkscape:object-nodes="true"
47+ inkscape:snap-smooth-nodes="true"
48+ inkscape:snap-midpoints="true"
49+ inkscape:snap-object-midpoints="true"
50+ inkscape:snap-center="true"
51+ showguides="true"
52+ inkscape:guide-bbox="true">
53+ <inkscape:grid
54+ type="xygrid"
55+ id="grid5451"
56+ empspacing="6" />
57+ <sodipodi:guide
58+ orientation="1,0"
59+ position="6,77"
60+ id="guide4063" />
61+ <sodipodi:guide
62+ orientation="1,0"
63+ position="3,78"
64+ id="guide4065" />
65+ <sodipodi:guide
66+ orientation="0,1"
67+ position="55,84"
68+ id="guide4067" />
69+ <sodipodi:guide
70+ orientation="0,1"
71+ position="53,87"
72+ id="guide4069" />
73+ <sodipodi:guide
74+ orientation="0,1"
75+ position="20,3"
76+ id="guide4071" />
77+ <sodipodi:guide
78+ orientation="0,1"
79+ position="20,6"
80+ id="guide4073" />
81+ <sodipodi:guide
82+ orientation="1,0"
83+ position="87,7"
84+ id="guide4075" />
85+ <sodipodi:guide
86+ orientation="1,0"
87+ position="84,7"
88+ id="guide4077" />
89+ <sodipodi:guide
90+ orientation="0,1"
91+ position="58,81"
92+ id="guide4074" />
93+ <sodipodi:guide
94+ orientation="1,0"
95+ position="9,74"
96+ id="guide4076" />
97+ <sodipodi:guide
98+ orientation="0,1"
99+ position="21,9"
100+ id="guide4078" />
101+ <sodipodi:guide
102+ orientation="1,0"
103+ position="81,4"
104+ id="guide4080" />
105+ </sodipodi:namedview>
106+ <metadata
107+ id="metadata4879">
108+ <rdf:RDF>
109+ <cc:Work
110+ rdf:about="">
111+ <dc:format>image/svg+xml</dc:format>
112+ <dc:type
113+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
114+ <dc:title></dc:title>
115+ </cc:Work>
116+ </rdf:RDF>
117+ </metadata>
118+ <g
119+ inkscape:label="Layer 1"
120+ inkscape:groupmode="layer"
121+ id="layer1"
122+ transform="translate(67.857146,-84.50504)">
123+ <g
124+ transform="matrix(0,-1,-1,0,373.50506,516.50504)"
125+ id="g4845"
126+ style="display:inline">
127+ <g
128+ inkscape:label="Layer 1"
129+ id="g1708"
130+ transform="matrix(0,-1,-1,0,1394.3622,441.36221)"
131+ inkscape:export-filename="add01.png"
132+ inkscape:export-xdpi="90"
133+ inkscape:export-ydpi="90">
134+ <rect
135+ style="color:#000000;fill:none;stroke:none;stroke-width:7.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
136+ id="rect1710"
137+ width="90"
138+ height="90"
139+ x="0"
140+ y="962.36218" />
141+ <path
142+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
143+ d="m 9.000004,971.3622 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.79086 -4,4 0,2.20914 1.790861,4 4,4 2.209139,0 4,-1.79086 4,-4 0,-2.20914 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m -72,16 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 18.199219,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z m 17.800781,0 c -2.209139,0 -4,1.7909 -4,4 0,2.2091 1.790861,4 4,4 2.209139,0 4,-1.7909 4,-4 0,-2.2091 -1.790861,-4 -4,-4 z"
144+ id="path4169"
145+ inkscape:connector-curvature="0"
146+ sodipodi:nodetypes="sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" />
147+ </g>
148+ </g>
149+ </g>
150+</svg>