askbot-dragon 1.5.49 → 1.5.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +27 -27
  2. package/babel.config.js +6 -6
  3. package/dragon.iml +7 -7
  4. package/package.json +56 -55
  5. package/public/index.html +73 -72
  6. package/src/App.vue +31 -31
  7. package/src/api/index.js +1 -1
  8. package/src/api/mock.http +2 -2
  9. package/src/api/requestUrl.js +185 -185
  10. package/src/assets/js/AliyunlssUtil.js +92 -92
  11. package/src/assets/js/Base64Util.js +22 -22
  12. package/src/assets/js/common.js +75 -75
  13. package/src/assets/js/hammer.js +89 -89
  14. package/src/assets/js/obsBrowser.js +63 -0
  15. package/src/assets/js/script.js +36 -36
  16. package/src/assets/less/common.css +6773 -6773
  17. package/src/assets/less/converSationContainer/common.less +192 -192
  18. package/src/assets/less/converSationContainer/converSatonContainer.less +493 -493
  19. package/src/assets/less/iconfont.css +37 -37
  20. package/src/assets/less/ticketMessage.less +294 -294
  21. package/src/components/ActionAlertIframe.vue +154 -154
  22. package/src/components/AiGuide.vue +468 -468
  23. package/src/components/AnswerDocknowledge.vue +581 -556
  24. package/src/components/AnswerVoice.vue +285 -285
  25. package/src/components/AskIFrame.vue +15 -15
  26. package/src/components/ConversationContainer.vue +4969 -5038
  27. package/src/components/FileType.vue +86 -86
  28. package/src/components/Message.vue +27 -27
  29. package/src/components/MyEditor.vue +348 -346
  30. package/src/components/actionSatisfaction.vue +107 -107
  31. package/src/components/actionSendToBot.vue +62 -62
  32. package/src/components/answerDissatisfaction.vue +62 -62
  33. package/src/components/answerRadio.vue +132 -186
  34. package/src/components/ask-components/DissatisfactionOptions.vue +57 -57
  35. package/src/components/ask-components/Msgloading.vue +37 -37
  36. package/src/components/ask-components/SatisfactionV2.vue +15 -15
  37. package/src/components/askVideo.vue +142 -139
  38. package/src/components/assetDetails.vue +370 -370
  39. package/src/components/assetMessage.vue +228 -228
  40. package/src/components/associationIntention.vue +349 -349
  41. package/src/components/attachmentPreview.vue +90 -90
  42. package/src/components/botActionSatisfactor.vue +68 -68
  43. package/src/components/chatContent.vue +513 -513
  44. package/src/components/feedBack.vue +136 -136
  45. package/src/components/fielListView.vue +351 -351
  46. package/src/components/file/AliyunOssComponents.vue +108 -108
  47. package/src/components/formTemplate.vue +3577 -3572
  48. package/src/components/kkview.vue +1138 -1138
  49. package/src/components/loadingProcess.vue +164 -164
  50. package/src/components/message/ActionAlertIframe.vue +112 -112
  51. package/src/components/message/ShopMessage.vue +164 -164
  52. package/src/components/message/TextMessage.vue +924 -924
  53. package/src/components/message/TicketMessage.vue +201 -201
  54. package/src/components/message/swiper/index.js +4 -4
  55. package/src/components/message/swiper/ticketSwiper.vue +503 -503
  56. package/src/components/message/swiper/ticketSwiperItem.vue +61 -61
  57. package/src/components/msgLoading.vue +231 -231
  58. package/src/components/myPopup.vue +70 -70
  59. package/src/components/pdfPosition.vue +1328 -1322
  60. package/src/components/popup.vue +227 -227
  61. package/src/components/previewDoc.vue +242 -242
  62. package/src/components/previewPdf.vue +353 -306
  63. package/src/components/receiverMessagePlatform.vue +65 -65
  64. package/src/components/recommend.vue +80 -80
  65. package/src/components/selector/hOption.vue +20 -20
  66. package/src/components/selector/hSelector.vue +199 -199
  67. package/src/components/selector/hWrapper.vue +216 -216
  68. package/src/components/senderMessagePlatform.vue +50 -50
  69. package/src/components/source/BotMessage.vue +24 -24
  70. package/src/components/source/CustomMessage.vue +24 -24
  71. package/src/components/test.vue +260 -260
  72. package/src/components/tree.vue +294 -294
  73. package/src/components/utils/AliyunIssUtil.js +81 -81
  74. package/src/components/utils/ckeditor.js +177 -174
  75. package/src/components/utils/format_date.js +25 -25
  76. package/src/components/utils/index.js +6 -6
  77. package/src/components/utils/math_utils.js +29 -29
  78. package/src/components/voiceComponent.vue +119 -119
  79. package/src/components/welcomeKnowledgeFile.vue +307 -270
  80. package/src/components/welcomeLlmCard.vue +134 -134
  81. package/src/main.js +57 -57
  82. package/vue.config.js +54 -54
@@ -1,271 +1,308 @@
1
- <template>
2
- <div class="message_list_welcome_knowledge_file">
3
- <div class="mlwm-title" v-if="msgContent.enableTitle">{{ msgContent.title }}</div>
4
- <div class="mlwm-des" v-if="msgContent.enableDescription">
5
- <span class="mlwm-des-pre">{{ msgContent.description }}</span>
6
- </div>
7
- <div class="mlwm-msg-type">
8
- <div
9
- v-for="(item, itemIndex) in msgContent.knowledgeFileInfos"
10
- :key="item.id"
11
- :class="['mmt-cell', 'mmt-cell-' + itemIndex]"
12
- @click="clickFun(item)"
13
- >
14
- <div class="mmt-cell-img">
15
- <img :src="fileIcon(item.type)" alt srcset />
16
- </div>
17
- <div class="mmt-cell-des">
18
- <span class="mmt-cell-des-title">{{item.name}}</span>
19
- <span class="mmt-cell-des-detail">
20
- <div class="mmt-cell-avatar">
21
- <img :src="item.creatorAvatar" alt srcset />
22
- </div>
23
- <div class="mmt-creator-name">{{ item.creatorName }}</div>
24
- <div class="mmt-border"></div>
25
- <div class="mmt-update-time">{{ new Date(item.updateTime).Format('yyyy-MM-dd hh:mm') }}</div>
26
- </span>
27
- </div>
28
- </div>
29
- <!-- v-if="msgContent.totalCount > msgContent.knowledgeFileInfos.length" -->
30
-
31
- <div class="load_moreKnowledge" v-if="page < msgContent.totalPages" @click="loadMore">
32
- <span>查看更多</span>
33
- </div>
34
- </div>
35
- <previewPdf ref="previewPdf" :url="previewHref" :sourceFileType="sourceFileType" officePreviewType="pdf"></previewPdf>
36
- </div>
37
- </template>
38
-
39
- <script>
40
- import { imageTypeObj, isMobile } from "../assets/js/common";
41
- import previewPdf from "./previewPdf";
42
- export default {
43
- name: "welcomeKnowledgeFile",
44
- props: {
45
- msgContent: {
46
- type: Object,
47
- default () {
48
- return {}
49
- }
50
- },
51
- mainId: {
52
- type: String,
53
- default: ''
54
- },
55
- corpId: {
56
- type: String,
57
- default: ''
58
- },
59
- userId: {
60
- type: String,
61
- default: ''
62
- },
63
- externalPreview: {
64
- type: Boolean,
65
- default: false
66
- }
67
- },
68
- data () {
69
- return {
70
- previewHref: "",
71
- sourceFileType: '',
72
- page: 1
73
- }
74
- },
75
- components: {
76
- previewPdf
77
- },
78
- methods: {
79
- fileIcon (type) {
80
- return 'https://static.guoranbot.com/cdn-office-website/askbot_doc/' + imageTypeObj[type] + '.png'
81
- },
82
- clickFun (item) {
83
- if(this.externalPreview) {
84
- this.$emit('knowledgeClickFun', item);
85
- return
86
- }
87
- this.$refs.previewPdf.previewShowPopup = false;
88
- this.$refs.previewPdf.drawer = false;
89
- let index = item.url.lastIndexOf('?')
90
- let type = ''
91
- let httpUrl = '/knowledge-api/knowledge/getTemporaryCertificate'
92
- if (index !== -1) {
93
- item.url = item.url.substring(0, index)
94
- type = this.fileType(item.url)
95
- } else {
96
- type = this.fileType(item.url)
97
- }
98
- if (type === '' || type === 'OTHER') {
99
- httpUrl = httpUrl += '?needEncrypt=true'
100
- } else {
101
- httpUrl = httpUrl += '?needEncrypt=false'
102
- }
103
- this.$http.post(httpUrl, {
104
- "fileInOssPath": item.url
105
- }).then(res => {
106
- if (res.data.code == '0') {
107
- this.previewHref = res.data.data;
108
- this.sourceFileType = item.url.substring(item.url.lastIndexOf('.'))
109
- let isOhmPc = sessionStorage.getItem('isOhmPc')
110
- if (isMobile() || isOhmPc == 'true') {
111
- this.$refs.previewPdf.drawer = true;
112
- this.$refs.previewPdf.previewShowPopup = true;
113
- } else {
114
- this.$refs.previewPdf.previewShowPopup = false;
115
- this.$refs.previewPdf.drawer = true;
116
- }
117
- this.$refs.previewPdf.fileType = type
118
- this.$refs.previewPdf.tagIds = item.tagIds
119
- this.$refs.previewPdf.isMessageRecord = this.isMessageRecord ? true : false
120
- if (item.tagIds && item.tagIds.length != 0) {
121
- this.$refs.previewPdf.loading = false
122
- return
123
- }
124
- this.$nextTick(() => {
125
- if (item.source == 'CREATED_BY_ONESELF' || type === 'HTML') {
126
- this.$refs.previewPdf.getBolb(item)
127
- }
128
- this.$refs.previewPdf.loadIframe(item)
129
- })
130
- }
131
- })
132
- },
133
- fileType (url) {
134
- const fileType = url.substring(url.lastIndexOf('.'));
135
- if (fileType === '.mp4' || fileType === '.MP4' || fileType === '.MOV' || fileType === '.MOVC' || fileType === '.mov' || fileType === '.movc' || fileType === '.mav' || fileType === '.MAV' || fileType == '.mp3' || fileType == '.MP3' || fileType === '.wav') {
136
- return 'VIDEO'
137
- } else if (fileType === '.html') {
138
- return 'HTML'
139
- } else {
140
- return 'OTHER'
141
- }
142
- },
143
- loadMore () {
144
- this.page = this.page + 1
145
- let params = {
146
- mainId: this.mainId,
147
- corpId: this.corpId,
148
- userId: this.userId,
149
- page: this.page,
150
- lastDays: this.msgContent.lastDays,
151
- pageSize: this.msgContent.pageSize,
152
- limitCount: this.msgContent.limitCount
153
- }
154
- this.$http.post('/knowledge-api/knowledge/search/page', params).then(res => {
155
- if (res.data && res.data.list && res.data.list.length != 0) {
156
- this.msgContent.knowledgeFileInfos = this.msgContent.knowledgeFileInfos.concat(res.data.list)
157
- }
158
- })
159
- }
160
- }
161
- };
162
- </script>
163
-
164
- <style scoped lang="less">
165
- .message_list_welcome_knowledge_file {
166
- .mlwm-title {
167
- font-size: 18px;
168
- font-weight: 600;
169
- color: #333333;
170
- }
171
- .mlwm-des {
172
- color: #666666;
173
- margin-top: 9px;
174
- font-size: 14px;
175
- font-weight: 500;
176
- .mlwm-des-after {
177
- display: flex;
178
- align-items: center;
179
- height: 28px;
180
- line-height: 28px;
181
- .mlwm-des-after-cir {
182
- flex: none;
183
- width: 6px;
184
- height: 6px;
185
- background: #366aff;
186
- border-radius: 50%;
187
- margin-right: 6px;
188
- }
189
- }
190
- }
191
-
192
- .mlwm-msg-type {
193
- margin-top: 9px;
194
- .mmt-cell {
195
- flex: 1;
196
- padding: 10px;
197
- background: #f0f4ff;
198
- border-radius: 8px;
199
- margin: 8px 0;
200
- display: flex;
201
- justify-content: space-between;
202
- align-items: center;
203
- cursor: pointer;
204
- .mmt-cell-img {
205
- flex: none;
206
- width: 20px;
207
- margin-right: 8px;
208
- img {
209
- height: 20px;
210
- width: 20px;
211
- }
212
- }
213
- .mmt-cell-des {
214
- flex: auto;
215
- text-align: left;
216
- display: flex;
217
- flex-direction: column;
218
- padding-right: 12px;
219
- .mmt-cell-des-title {
220
- font-size: 14px;
221
- color: #333333;
222
- font-weight: 600;
223
- margin-bottom: 6px;
224
- }
225
- .mmt-cell-des-detail {
226
- font-size: 12px;
227
- display: flex;
228
- align-items: center;
229
- .mmt-cell-avatar {
230
- flex: none;
231
- width: 16px;
232
- margin-right: 8px;
233
- display: flex;
234
- align-items: center;
235
- img {
236
- height: 16px;
237
- width: 16px;
238
- border-radius: 50%;
239
- }
240
- }
241
- .mmt-creator-name {
242
- padding-right: 6px;
243
- color: #666666;
244
- }
245
- .mmt-update-time {
246
- color: #666666;
247
- padding-left: 6px;
248
- }
249
- .mmt-border {
250
- height: 12px;
251
- width: 1px;
252
- background-color: #666666;
253
- }
254
- }
255
- }
256
- }
257
- .load_moreKnowledge {
258
- width: 100%;
259
- height: 40px;
260
- display: flex;
261
- align-items: center;
262
- justify-content: center;
263
- // background: #FFFFFF;
264
- color: #366aff;
265
- font-size: 14px;
266
- margin-top: 8px;
267
- cursor: pointer;
268
- }
269
- }
270
- }
1
+ <template>
2
+ <div class="message_list_welcome_knowledge_file">
3
+ <div class="mlwm-title" v-if="msgContent.enableTitle">{{ msgContent.title }}</div>
4
+ <div class="mlwm-des" v-if="msgContent.enableDescription">
5
+ <span class="mlwm-des-pre">{{ msgContent.description }}</span>
6
+ </div>
7
+ <div class="mlwm-msg-type">
8
+ <div
9
+ v-for="(item, itemIndex) in msgContent.knowledgeFileInfos"
10
+ :key="item.id"
11
+ :class="['mmt-cell', 'mmt-cell-' + itemIndex]"
12
+ @click="clickFun(item)"
13
+ >
14
+ <div class="mmt-cell-img">
15
+ <img :src="fileIcon(item.type)" alt srcset />
16
+ </div>
17
+ <div class="mmt-cell-des">
18
+ <span class="mmt-cell-des-title">{{item.name}}</span>
19
+ <span class="mmt-cell-des-detail">
20
+ <div class="mmt-cell-avatar">
21
+ <img :src="item.creatorAvatar" alt srcset />
22
+ </div>
23
+ <div class="mmt-creator-name">{{ item.creatorName }}</div>
24
+ <div class="mmt-border"></div>
25
+ <div class="mmt-update-time">{{ new Date(item.updateTime).Format('yyyy-MM-dd hh:mm') }}</div>
26
+ </span>
27
+ </div>
28
+ </div>
29
+ <!-- v-if="msgContent.totalCount > msgContent.knowledgeFileInfos.length" -->
30
+
31
+ <div class="load_moreKnowledge" v-if="page < msgContent.totalPages" @click="loadMore">
32
+ <span>查看更多</span>
33
+ </div>
34
+ </div>
35
+ <previewPdf ref="previewPdf"
36
+ :url="previewHref"
37
+ :sourceFileType="sourceFileType"
38
+ officePreviewType="pdf"
39
+ @previewToDialog="previewToDialog"
40
+ :isHasChat="isHasChat"
41
+ ></previewPdf>
42
+ </div>
43
+ </template>
44
+
45
+ <script>
46
+ import { imageTypeObj, isMobile } from "../assets/js/common";
47
+ import previewPdf from "./previewPdf";
48
+ export default {
49
+ name: "welcomeKnowledgeFile",
50
+ props: {
51
+ msgContent: {
52
+ type: Object,
53
+ default () {
54
+ return {}
55
+ }
56
+ },
57
+ mainId: {
58
+ type: String,
59
+ default: ''
60
+ },
61
+ corpId: {
62
+ type: String,
63
+ default: ''
64
+ },
65
+ userId: {
66
+ type: String,
67
+ default: ''
68
+ },
69
+ externalPreview: {
70
+ type: Boolean,
71
+ default: false
72
+ },
73
+ isHasChat:{
74
+ type: Boolean,
75
+ default: false
76
+ },
77
+ askKnowledgeId:{
78
+ type: String,
79
+ default: ''
80
+ },
81
+ activeKnowledgeId:{
82
+ type: String,
83
+ default: ''
84
+ }
85
+ },
86
+ data () {
87
+ return {
88
+ previewHref: "",
89
+ sourceFileType: '',
90
+ page: 1,
91
+ previewKnowledgeId:"",
92
+ }
93
+ },
94
+ components: {
95
+ previewPdf
96
+ },
97
+ methods: {
98
+ fileIcon (type) {
99
+ return 'https://static.guoranbot.com/cdn-office-website/askbot_doc/' + imageTypeObj[type] + '.png'
100
+ },
101
+ clickFun (item) {
102
+ if(this.externalPreview) {
103
+ this.$emit('knowledgeClickFun', item);
104
+ return
105
+ }
106
+ this.previewKnowledgeId = item.knowledgeId
107
+ this.$refs.previewPdf.previewShowPopup = false;
108
+ this.$refs.previewPdf.drawer = false;
109
+ let index = item.url.lastIndexOf('?')
110
+ let type = ''
111
+ let httpUrl = '/knowledge-api/knowledge/getTemporaryCertificate'
112
+ if (index !== -1) {
113
+ item.url = item.url.substring(0, index)
114
+ type = this.fileType(item.url)
115
+ } else {
116
+ type = this.fileType(item.url)
117
+ }
118
+ if (type === '' || type === 'OTHER') {
119
+ httpUrl = httpUrl += '?needEncrypt=true'
120
+ } else {
121
+ httpUrl = httpUrl += '?needEncrypt=false'
122
+ }
123
+ this.$http.post(httpUrl, {
124
+ "fileInOssPath": item.url
125
+ }).then(res => {
126
+ if (res.data.code == '0') {
127
+ this.previewHref = res.data.data;
128
+ this.sourceFileType = item.url.substring(item.url.lastIndexOf('.'))
129
+ let isOhmPc = sessionStorage.getItem('isOhmPc')
130
+ if (isMobile() || isOhmPc == 'true') {
131
+ this.$refs.previewPdf.drawer = true;
132
+ this.$refs.previewPdf.previewShowPopup = true;
133
+ } else {
134
+ this.$refs.previewPdf.previewShowPopup = false;
135
+ this.$refs.previewPdf.drawer = true;
136
+ }
137
+ //聊一聊按钮的选中状态
138
+ if (this.activeKnowledgeId == item.knowledgeId){
139
+ this.$refs.previewPdf.previewKnowledgeId = this.activeKnowledgeId
140
+ } else {
141
+ this.$refs.previewPdf.previewKnowledgeId = ""
142
+ }
143
+ this.$refs.previewPdf.fileType = type
144
+ this.$refs.previewPdf.tagIds = item.tagIds
145
+ this.$refs.previewPdf.isMessageRecord = this.isMessageRecord ? true : false
146
+ if (item.tagIds && item.tagIds.length != 0) {
147
+ this.$refs.previewPdf.loading = false
148
+ return
149
+ }
150
+ this.$nextTick(() => {
151
+ if (item.source == 'CREATED_BY_ONESELF' || type === 'HTML') {
152
+ this.$refs.previewPdf.getBolb(item)
153
+ }
154
+ this.$refs.previewPdf.loadIframe(item)
155
+ })
156
+ }
157
+ })
158
+ },
159
+ fileType (url) {
160
+ const fileType = url.substring(url.lastIndexOf('.'));
161
+ if (fileType === '.mp4' || fileType === '.MP4' || fileType === '.MOV' || fileType === '.MOVC' || fileType === '.mov' || fileType === '.movc' || fileType === '.mav' || fileType === '.MAV' || fileType == '.mp3' || fileType == '.MP3' || fileType === '.wav') {
162
+ return 'VIDEO'
163
+ } else if (fileType === '.html') {
164
+ return 'HTML'
165
+ } else {
166
+ return 'OTHER'
167
+ }
168
+ },
169
+ loadMore () {
170
+ this.page = this.page + 1
171
+ let params = {
172
+ mainId: this.mainId,
173
+ corpId: this.corpId,
174
+ userId: this.userId,
175
+ page: this.page,
176
+ lastDays: this.msgContent.lastDays,
177
+ pageSize: this.msgContent.pageSize,
178
+ limitCount: this.msgContent.limitCount
179
+ }
180
+ this.$http.post('/knowledge-api/knowledge/search/page', params).then(res => {
181
+ if (res.data && res.data.list && res.data.list.length != 0) {
182
+ this.msgContent.knowledgeFileInfos = this.msgContent.knowledgeFileInfos.concat(res.data.list)
183
+ }
184
+ })
185
+ },
186
+ previewToDialog(flag){
187
+ if (!flag){
188
+ this.$refs.previewPdf.previewKnowledgeId = ""
189
+ } else {
190
+ this.$refs.previewPdf.previewKnowledgeId = this.previewKnowledgeId
191
+ }
192
+ this.$emit('previewToDialog',flag,this.previewKnowledgeId)
193
+ },
194
+ clearKnowledgeId(){
195
+ this.previewKnowledgeId = "";
196
+ }
197
+ }
198
+ };
199
+ </script>
200
+
201
+ <style scoped lang="less">
202
+ .message_list_welcome_knowledge_file {
203
+ .mlwm-title {
204
+ font-size: 18px;
205
+ font-weight: 600;
206
+ color: #333333;
207
+ }
208
+ .mlwm-des {
209
+ color: #666666;
210
+ margin-top: 9px;
211
+ font-size: 14px;
212
+ font-weight: 500;
213
+ .mlwm-des-after {
214
+ display: flex;
215
+ align-items: center;
216
+ height: 28px;
217
+ line-height: 28px;
218
+ .mlwm-des-after-cir {
219
+ flex: none;
220
+ width: 6px;
221
+ height: 6px;
222
+ background: #366aff;
223
+ border-radius: 50%;
224
+ margin-right: 6px;
225
+ }
226
+ }
227
+ }
228
+
229
+ .mlwm-msg-type {
230
+ margin-top: 9px;
231
+ .mmt-cell {
232
+ flex: 1;
233
+ padding: 10px;
234
+ background: #f0f4ff;
235
+ border-radius: 8px;
236
+ margin: 8px 0;
237
+ display: flex;
238
+ justify-content: space-between;
239
+ align-items: center;
240
+ cursor: pointer;
241
+ .mmt-cell-img {
242
+ flex: none;
243
+ width: 20px;
244
+ margin-right: 8px;
245
+ img {
246
+ height: 20px;
247
+ width: 20px;
248
+ }
249
+ }
250
+ .mmt-cell-des {
251
+ flex: auto;
252
+ text-align: left;
253
+ display: flex;
254
+ flex-direction: column;
255
+ padding-right: 12px;
256
+ .mmt-cell-des-title {
257
+ font-size: 14px;
258
+ color: #333333;
259
+ font-weight: 600;
260
+ margin-bottom: 6px;
261
+ }
262
+ .mmt-cell-des-detail {
263
+ font-size: 12px;
264
+ display: flex;
265
+ align-items: center;
266
+ .mmt-cell-avatar {
267
+ flex: none;
268
+ width: 16px;
269
+ margin-right: 8px;
270
+ display: flex;
271
+ align-items: center;
272
+ img {
273
+ height: 16px;
274
+ width: 16px;
275
+ border-radius: 50%;
276
+ }
277
+ }
278
+ .mmt-creator-name {
279
+ padding-right: 6px;
280
+ color: #666666;
281
+ }
282
+ .mmt-update-time {
283
+ color: #666666;
284
+ padding-left: 6px;
285
+ }
286
+ .mmt-border {
287
+ height: 12px;
288
+ width: 1px;
289
+ background-color: #666666;
290
+ }
291
+ }
292
+ }
293
+ }
294
+ .load_moreKnowledge {
295
+ width: 100%;
296
+ height: 40px;
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ // background: #FFFFFF;
301
+ color: #366aff;
302
+ font-size: 14px;
303
+ margin-top: 8px;
304
+ cursor: pointer;
305
+ }
306
+ }
307
+ }
271
308
  </style>