├── vue-print-nb
├── src
│ ├── index.js
│ ├── main.js
│ ├── packages
│ │ ├── print.js
│ │ └── printarea.js
│ └── App.vue
├── README.md
├── .Archive
│ └── README.md
│ │ └── 2019-06-06 22-53-18.md
├── package.json
├── components
│ └── HelloWorld.vue
└── lib
│ ├── tag-textarea.umd.min.js
│ ├── tag-textarea.common.js
│ └── tag-textarea.umd.js
├── .gitignore
└── README.md
/vue-print-nb/src/index.js:
--------------------------------------------------------------------------------
1 | import Print from './packages/print.js';
2 | Print.install = function(Vue) {
3 | Vue.directive('print', Print);
4 | };
5 |
6 | export default Print;
--------------------------------------------------------------------------------
/vue-print-nb/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 | import Print from './index.js'
4 | Vue.config.productionTip = false
5 |
6 | Vue.use(Print);
7 | new Vue({
8 | render: h => h(App),
9 | }).$mount('#app')
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | **/*.log
8 |
9 | tests/**/coverage/
10 | tests/e2e/reports
11 | selenium-debug.log
12 |
13 | # Editor directories and files
14 | .idea
15 | .vscode
16 | *.suo
17 | *.ntvs*
18 | *.njsproj
19 | *.sln
20 | *.local
21 | *.iml
22 |
23 | package-lock.json
24 | yarn.lock
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue-print
2 |
3 | 基于vue-print-nb打印组件的拓展功能,下载后放在项目中引用
4 | 详情请看博客介绍
5 | https://www.cnblogs.com/steamed-twisted-roll/p/10683680.html
6 |
7 | ## Install
8 |
9 | #### main.js文件引用
10 |
11 | ```javascript
12 | import Print from './xxxx/vue-print-nb/src'
13 |
14 | Vue.use(Print);
15 | ```
16 |
--------------------------------------------------------------------------------
/vue-print-nb/README.md:
--------------------------------------------------------------------------------
1 | # vue-print-nb
2 |
3 | 基于vue-print-nb打印组件的拓展功能,下载后放在项目中引用
4 | 详情请看博客介绍
5 | https://www.cnblogs.com/steamed-twisted-roll/p/10683680.html
6 |
7 | ## Install
8 |
9 | #### NPM
10 |
11 | ```javascript
12 | import Print from './xxxx/vue-print-nb/src'
13 |
14 | Vue.use(Print);
15 | ```
16 |
--------------------------------------------------------------------------------
/vue-print-nb/.Archive/README.md/2019-06-06 22-53-18.md:
--------------------------------------------------------------------------------
1 | # vue-print-nb
2 |
3 | This is a directive wrapper for printed, Simple, fast, convenient, light.
4 |
5 | ## Install
6 |
7 | #### NPM
8 | ```bash
9 | npm install vue-print-nb --save
10 | ```
11 |
12 | ```javascript
13 | import Print from 'vue-print-nb'
14 |
15 | Vue.use(Print);
16 | ```
17 |
18 |
19 | ## Description
20 |
21 | #### Print the entire page:
22 |
23 | ```
24 |
25 | ```
26 |
27 |
28 | #### Print local range:
29 |
30 | HTML:
31 | ```
32 |
33 |
葫芦娃,葫芦娃
34 |
一根藤上七朵花
35 |
小小树藤是我家 啦啦啦啦
36 |
叮当当咚咚当当 浇不大
37 |
叮当当咚咚当当 是我家
38 |
啦啦啦啦
39 |
...
40 |
41 |
42 |
43 | ```
44 |
45 |
46 | ## License
47 |
48 | [MIT](http://opensource.org/licenses/MIT)
--------------------------------------------------------------------------------
/vue-print-nb/src/packages/print.js:
--------------------------------------------------------------------------------
1 | import Print from './printarea.js';
2 | /**
3 | * @file 打印
4 | * 指令`v-print`,默认打印整个窗口
5 | * 传入参数`v-print="'#id'"` , 参数为需要打印局部的盒子标识.
6 | */
7 | export default {
8 | directiveName: 'print',
9 | bind(el, binding, vnode) {
10 | let vue = vnode.context;
11 | let closeBtn = true;
12 | let id = '';
13 | el.addEventListener('click', () => {
14 | vue.$nextTick(() => {
15 | if (typeof binding.value === 'string') {
16 | id = binding.value;
17 | } else if (typeof binding.value === 'object' && !!binding.value.id) {
18 | id = binding.value.id;
19 | let ids = id.replace(new RegExp("#", "g"), '');
20 | let elsdom = document.getElementById(ids);
21 | if (!elsdom) console.log("id in Error"), id = '';
22 | }
23 | // 局部打印
24 | if (id) {
25 | localPrint();
26 | } else {
27 | // 直接全局打印
28 | window.print();
29 | }
30 | });
31 |
32 | });
33 | const localPrint = () => {
34 | if (closeBtn) {
35 | closeBtn = false;
36 | new Print({
37 | ids: id, // * 局部打印必传入id
38 | ignoreClass: binding.value.ignoreClass, // 不需要打印内容的class
39 | standard: '', // 文档类型,默认是html5,可选 html5,loose,strict
40 | extraHead: binding.value.extraHead, // 附加在head标签上的额外标签,使用逗号分隔
41 | extraCss: binding.value.extraCss, // 额外的css连接,多个逗号分开
42 | popTitle: binding.value.popTitle, // title的标题
43 | endCallback() { // 调用打印之后的回调事件
44 | closeBtn = true;
45 | binding.value && binding.value.endCallback(binding.value)
46 | }
47 | });
48 | }
49 | };
50 | }
51 | };
--------------------------------------------------------------------------------
/vue-print-nb/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-print-nb",
3 | "version": "1.5.0",
4 | "description": "Vue plug-in, print! Good!",
5 | "main": "lib/tag-textarea.umd.min.js",
6 | "author": "Power-kxLee",
7 | "private": false,
8 | "license": "MIT",
9 | "scripts": {
10 | "serve": "vue-cli-service serve",
11 | "build": "vue-cli-service build",
12 | "lint": "vue-cli-service lint",
13 | "lib": "vue-cli-service build --target lib --name tag-textarea --dest lib src/index.js"
14 | },
15 | "dependencies": {
16 | "core-js": "^2.6.5",
17 | "echarts": "^4.6.0",
18 | "qrcodejs2": "0.0.2",
19 | "vue": "^2.6.10"
20 | },
21 | "devDependencies": {
22 | "@vue/cli-plugin-babel": "^3.8.0",
23 | "@vue/cli-plugin-eslint": "^3.8.0",
24 | "@vue/cli-service": "^3.8.0",
25 | "babel-eslint": "^10.0.1",
26 | "eslint": "^5.16.0",
27 | "eslint-plugin-vue": "^5.0.0",
28 | "vue-template-compiler": "^2.6.10"
29 | },
30 | "eslintConfig": {
31 | "root": true,
32 | "env": {
33 | "node": true
34 | },
35 | "extends": [
36 | "plugin:vue/essential",
37 | "eslint:recommended"
38 | ],
39 | "rules": {},
40 | "parserOptions": {
41 | "parser": "babel-eslint"
42 | }
43 | },
44 | "postcss": {
45 | "plugins": {
46 | "autoprefixer": {}
47 | }
48 | },
49 | "browserslist": [
50 | "> 1%",
51 | "last 2 versions"
52 | ],
53 | "__npminstall_done": "Wed May 06 2020 10:28:06 GMT+0800 (GMT+08:00)",
54 | "_from": "vue-print-nb@1.5.0",
55 | "_resolved": "https://registry.npm.taobao.org/vue-print-nb/download/vue-print-nb-1.5.0.tgz"
56 | }
--------------------------------------------------------------------------------
/vue-print-nb/components/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ msg }}
4 |
5 | For a guide and recipes on how to configure / customize this project,
6 | check out the
7 | vue-cli documentation.
8 |
9 |
Installed CLI Plugins
10 |
14 |
Essential Links
15 |
22 |
Ecosystem
23 |
30 |
31 |
32 |
37 |
45 |
46 |
47 |
63 |
--------------------------------------------------------------------------------
/vue-print-nb/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
17 |
18 |
24 |
25 |
26 |
葫芦娃,葫芦娃
27 |
一根藤上七朵花
28 |
小小树藤是我家 啦啦啦啦
29 |
叮当当咚咚当当 浇不大
30 |
叮当当咚咚当当 是我家
31 |
啦啦啦啦
32 |
...
33 |
34 |
35 |
36 |
41 |
89 |
90 |
100 |
--------------------------------------------------------------------------------
/vue-print-nb/src/packages/printarea.js:
--------------------------------------------------------------------------------
1 | export default class {
2 | constructor(option) {
3 |
4 | this.standards = {
5 | strict: 'strict',
6 | loose: 'loose',
7 | html5: 'html5'
8 | };
9 | this.selectArray = []; // 存储select的
10 | this.counter = 0;
11 | this.settings = {
12 | standard: this.standards.html5,
13 | extraHead: '', // 附加在head标签上的额外元素,使用逗号分隔
14 | extraCss: '', // 额外的css逗号分隔
15 | popTitle: '', // 标题
16 | endCallback: null, // 成功打开后的回调函数
17 | ids: '', // 局部打印的id
18 | ignoreClass: '' // 不需要打印内容的class
19 | };
20 | Object.assign(this.settings, option);
21 |
22 | this.init();
23 | }
24 | init() {
25 | this.counter++;
26 | this.settings.id = `printArea_${this.counter}`;
27 | let PrintAreaWindow = this.getPrintWindow(); // 创建iframe
28 | this.write(PrintAreaWindow.doc); // 写入内容
29 | this.print(PrintAreaWindow);
30 | this.settings.endCallback();
31 |
32 | }
33 | print(PAWindow) {
34 | let paWindow = PAWindow.win;
35 | const _loaded = () => {
36 | paWindow.focus();
37 | paWindow.print();
38 | try {
39 | let box = document.getElementById(this.settings.id);
40 | let canvasList = this.elsdom.querySelectorAll('.canvasImg')
41 | // console.log(this.elsdom)
42 | for (let i = 0; i < canvasList.length; i++) {
43 | let _parent = canvasList[i].parentNode
44 | _parent.removeChild(canvasList[i])
45 | }
46 | box.parentNode.removeChild(box);
47 | } catch (e) {
48 | console.log(e);
49 | }
50 | };
51 | if (window.ActiveXObject) {
52 | paWindow.onload = _loaded();
53 | return false;
54 | }
55 | paWindow.onload = () => {
56 | _loaded();
57 | };
58 | }
59 | write(PADocument, $ele) {
60 | PADocument.open();
61 | PADocument.write(`${this.docType()}${this.getHead()}${this.getBody()}`);
62 | PADocument.close();
63 |
64 | }
65 | docType() {
66 | if (this.settings.standard === this.standards.html5) {
67 | return '';
68 | }
69 | var transitional = this.settings.standard === this.standards.loose ? ' Transitional' : '';
70 | var dtd = this.settings.standard === this.standards.loose ? 'loose' : 'strict';
71 |
72 | return ``;
73 | }
74 | getHead() {
75 | let extraHead = '';
76 | let links = '';
77 | let style = '';
78 | if (this.settings.extraHead) {
79 | this.settings.extraHead.replace(/([^,]+)/g, (m) => {
80 | extraHead += m;
81 | });
82 | }
83 | // 复制所有link标签
84 | [].forEach.call(document.querySelectorAll('link'), function (item, i) {
85 | if (item.href.indexOf('.css') >= 0) {
86 | links += ``;
87 | }
88 | });
89 | // const _links = document.querySelectorAll('link');
90 | // if (typeof _links === 'object' || _links.length > 0) {
91 | // // 复制所有link标签
92 | // for (let i = 0; i < _links.length; i++) {
93 | // let item = _links[i];
94 | // if (item.href.indexOf('.css') >= 0) {
95 | // links += ``;
96 | // }
97 | // }
98 | // }
99 | // 循环获取style标签的样式
100 | let domStyle = document.styleSheets;
101 | if (domStyle && domStyle.length > 0) {
102 | for (let i = 0; i < domStyle.length; i++) {
103 | try {
104 | if (domStyle[i].cssRules || domStyle[i].rules) {
105 | let rules = domStyle[i].cssRules || domStyle[i].rules;
106 | for (let b = 0; b < rules.length; b++) {
107 | style += rules[b].cssText;
108 | }
109 | }
110 | } catch (e) {
111 | console.log(domStyle[i].href + e);
112 | }
113 | }
114 | }
115 |
116 | if (this.settings.extraCss) {
117 | this.settings.extraCss.replace(/([^,\s]+)/g, (m) => {
118 | links += ``;
119 | });
120 |
121 | }
122 |
123 | return `${this.settings.popTitle}${extraHead}${links}`;
124 | }
125 | getBody() {
126 | let ids = this.settings.ids;
127 | ids = ids.replace(new RegExp("#", "g"), '');
128 | this.elsdom = this.beforeHanler(document.getElementById(ids));
129 | let ele = this.getFormData(this.elsdom);
130 | ele = this.ignoreText(ele)
131 | ele = this.handleTableStyle(ele)
132 | let htm = ele.outerHTML;
133 | // console.log(ele)
134 | return '' + htm + '';
135 | }
136 | // 去除不需要打印的内容
137 | ignoreText(ele) {
138 | const copy = ele.cloneNode(true)
139 | const ignoreNodes = copy.querySelectorAll('.' + this.settings.ignoreClass);
140 | const nodes = copy.childNodes
141 | // console.log(copy, nodes)
142 | const reducer = (el, data, ignoreNode) => {
143 | for (let i = 0; i < data.length; i++) {
144 | const item = data[i];
145 | if (item == ignoreNode) {
146 | el.removeChild(ignoreNode)
147 | break
148 | } else if (item.childNodes && item.childNodes.length) {
149 | reducer(item, item.childNodes, ignoreNode)
150 | }
151 | }
152 | }
153 | if (ignoreNodes && ignoreNodes.length) {
154 | for (let i = 0; i < ignoreNodes.length; i++) {
155 | const ignoreNode = ignoreNodes[i];
156 | reducer(copy, nodes, ignoreNode)
157 | }
158 | }
159 | return copy
160 | }
161 | // 设置el-table样式
162 | handleTableStyle(ele) {
163 | const copy = ele.cloneNode(true)
164 | const tableNodes = copy.querySelectorAll('.el-table__header,.el-table__body');
165 | /*** 这里先注释,有需要的可以按照这个例子自己自定义 */
166 | // const tableBorderNodes = copy.querySelectorAll('.el-table--border');
167 | // const thBorderNodes = copy.querySelectorAll('.el-table--border th');
168 | // // 给表格添加下边框和右边框(根据自己的打印预览样式修改,不同电脑显示的效果不一样)
169 | // for (let i = 0; i < tableBorderNodes.length; i++) {
170 | // const element = tableBorderNodes[i];
171 | // element.style.border = '1px solid #EBEEF5'
172 | // }
173 | // // 给表格th添加边框
174 | // for (let i = 0; i < thBorderNodes.length; i++) {
175 | // const element = thBorderNodes[i];
176 | // element.style.border = '1px solid #EBEEF5'
177 | // }
178 | /**------------------------------- */
179 | // 处理宽度
180 | for (let i = 0; i < tableNodes.length; i++) {
181 | const tableItem = tableNodes[i];
182 | tableItem.style.width = '100%' // 将宽度设置为百分比
183 | const child = tableItem.childNodes
184 | for (let j = 0; j < child.length; j++) {
185 | const element = child[j];
186 | if (element.localName === 'colgroup') { // 去除默认的表格宽度设置
187 | element.innerHTML = ''
188 | }
189 | }
190 | }
191 | return copy
192 | }
193 | // 克隆节点之前做的操作
194 | beforeHanler(elsdom) {
195 | let canvasList = elsdom.querySelectorAll('canvas');
196 | // canvas转换png图片
197 | for (let i = 0; i < canvasList.length; i++) {
198 | if (!canvasList[i].style.display) {
199 | let _parent = canvasList[i].parentNode
200 | let _canvasUrl = canvasList[i].toDataURL('image/png')
201 | let _img = new Image()
202 | _img.className = 'canvasImg'
203 | _img.style.display = 'none'
204 | _img.src = _canvasUrl
205 | // _parent.replaceChild(_img, canvasList[i])
206 | _parent.appendChild(_img)
207 | }
208 | }
209 | return elsdom
210 | }
211 | // 根据type去处理form表单
212 | getFormData(ele) {
213 | let copy = ele.cloneNode(true);
214 | let copiedInputs = copy.querySelectorAll('input,select,textarea');
215 | let canvasImgList = copy.querySelectorAll('.canvasImg,canvas');
216 | let selectCount = -1;
217 | // 处理所有canvas
218 | for (let i = 0; i < canvasImgList.length; i++) {
219 | let _parent = canvasImgList[i].parentNode
220 | let item = canvasImgList[i]
221 | // 删除克隆后的canvas节点
222 | if (item.tagName.toLowerCase() === 'canvas') {
223 | _parent.removeChild(item)
224 | } else {
225 | item.style.display = 'block'
226 | }
227 | }
228 | // 处理所有输入框
229 | for (let i = 0; i < copiedInputs.length; i++) {
230 | let item = copiedInputs[i];
231 | let typeInput = item.getAttribute('type');
232 |
233 | let copiedInput = copiedInputs[i];
234 | // 获取select标签
235 | if (!typeInput) {
236 | typeInput = item.tagName === 'SELECT' ? 'select' : item.tagName === 'TEXTAREA' ? 'textarea' : '';
237 | }
238 | // 处理input框
239 | if (item.tagName === 'INPUT') {
240 | // 除了单选框 多选框比较特别
241 | if (typeInput === 'radio' || typeInput === 'checkbox') {
242 | copiedInput.setAttribute('checked', item.checked);
243 | //
244 | } else {
245 | copiedInput.value = item.value;
246 | copiedInput.setAttribute('value', item.value);
247 | }
248 | // 处理select
249 | } else if (typeInput === 'select') {
250 |
251 | selectCount++;
252 | for (let b = 0; b < ele.querySelectorAll('select').length; b++) {
253 | let select = ele.querySelectorAll('select')[b]; // 获取原始层每一个select
254 | !select.getAttribute('newbs') && select.setAttribute('newbs', b) // 添加标识
255 | if (select.getAttribute('newbs') == selectCount) {
256 | let opSelectedIndex = ele.querySelectorAll('select')[selectCount].selectedIndex;
257 | item.options[opSelectedIndex].setAttribute('selected', true);
258 |
259 | }
260 | }
261 | // 处理textarea
262 | } else {
263 | copiedInput.innerHTML = item.value;
264 | copiedInput.setAttribute('html', item.value);
265 | }
266 | }
267 | return copy;
268 | }
269 | getPrintWindow() {
270 | var f = this.Iframe();
271 | return {
272 | f: f,
273 | win: f.contentWindow || f,
274 | doc: f.doc
275 | };
276 | }
277 | Iframe() {
278 | let frameId = this.settings.id;
279 | let iframe;
280 | let that = this
281 | try {
282 | iframe = document.createElement('iframe');
283 | document.body.appendChild(iframe);
284 | iframe.style.border = '0px';
285 | iframe.style.position = 'absolute';
286 | iframe.style.width = '0px';
287 | iframe.style.height = '0px';
288 | iframe.style.right = '0px';
289 | iframe.style.top = '0px';
290 | iframe.setAttribute('id', frameId);
291 | iframe.setAttribute('src', new Date().getTime());
292 | iframe.doc = null;
293 | iframe.doc = iframe.contentDocument ? iframe.contentDocument : (iframe.contentWindow ? iframe.contentWindow.document : iframe.document);
294 | iframe.onload = function () {
295 | var win = iframe.contentWindow || iframe;
296 | that.print(win);
297 | }
298 | } catch (e) {
299 | throw new Error(e + '. iframes may not be supported in this browser.');
300 | }
301 |
302 | if (iframe.doc == null) {
303 | throw new Error('Cannot find document.');
304 | }
305 |
306 | return iframe;
307 | }
308 | }
309 |
--------------------------------------------------------------------------------
/vue-print-nb/lib/tag-textarea.umd.min.js:
--------------------------------------------------------------------------------
1 | (function(t,e){"object"===typeof exports&&"object"===typeof module?module.exports=e():"function"===typeof define&&define.amd?define([],e):"object"===typeof exports?exports["tag-textarea"]=e():t["tag-textarea"]=e()})("undefined"!==typeof self?self:this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s="112a")}({"008a":function(t,e,n){var r=n("f6b4");t.exports=function(t){return Object(r(t))}},"064e":function(t,e,n){var r=n("69b3"),o=n("db6b"),i=n("94b3"),c=Object.defineProperty;e.f=n("149f")?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return c(t,e,n)}catch(a){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},"09b9":function(t,e,n){var r=n("224c"),o=n("f6b4");t.exports=function(t){return r(o(t))}},"0aed":function(t,e,n){"use strict";n("aaba");var r=n("bf16"),o=n("86d4"),i=n("238a"),c=n("f6b4"),a=n("cb3d"),u=n("8714"),s=a("species"),f=!i((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),l=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var d=a(t),p=!i((function(){var e={};return e[d]=function(){return 7},7!=""[t](e)})),v=p?!i((function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[s]=function(){return n}),n[d](""),!e})):void 0;if(!p||!v||"replace"===t&&!f||"split"===t&&!l){var h=/./[d],y=n(c,d,""[t],(function(t,e,n,r,o){return e.exec===u?p&&!o?{done:!0,value:h.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}})),b=y[0],g=y[1];r(String.prototype,t,b),o(RegExp.prototype,d,2==e?function(t,e){return g.call(t,this,e)}:function(t){return g.call(t,this)})}}},"0dc8":function(t,e,n){var r=n("064e"),o=n("69b3"),i=n("80a9");t.exports=n("149f")?Object.defineProperties:function(t,e){o(t);var n,c=i(e),a=c.length,u=0;while(a>u)r.f(t,n=c[u++],e[n]);return t}},"0e8b":function(t,e,n){var r=n("cb3d")("unscopables"),o=Array.prototype;void 0==o[r]&&n("86d4")(o,r,{}),t.exports=function(t){o[r][t]=!0}},"112a":function(t,e,n){"use strict";var r;(n.r(e),"undefined"!==typeof window)&&(n("e67d"),(r=window.document.currentScript)&&(r=r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/))&&(n.p=r[1]));n("9dd9"),n("f548");function o(t){return o="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o(t)}n("6d57"),n("5f54");function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n").concat(this.getHead()).concat(this.getBody(),"