UNPKG

90.7 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3 typeof define === 'function' && define.amd ? define(factory) :
4 (global = global || self, global.rich = factory());
5}(this, function () { 'use strict';
6
7 function _inheritsLoose(subClass, superClass) {
8 subClass.prototype = Object.create(superClass.prototype);
9 subClass.prototype.constructor = subClass;
10 subClass.__proto__ = superClass;
11 }
12
13 var fails = function (exec) {
14 try {
15 return !!exec();
16 } catch (error) {
17 return true;
18 }
19 };
20
21 var toString = {}.toString;
22
23 var classofRaw = function (it) {
24 return toString.call(it).slice(8, -1);
25 };
26
27 // fallback for non-array-like ES3 and non-enumerable old V8 strings
28
29
30 var split = ''.split;
31
32 var indexedObject = fails(function () {
33 // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
34 // eslint-disable-next-line no-prototype-builtins
35 return !Object('z').propertyIsEnumerable(0);
36 }) ? function (it) {
37 return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);
38 } : Object;
39
40 // `RequireObjectCoercible` abstract operation
41 // https://tc39.github.io/ecma262/#sec-requireobjectcoercible
42 var requireObjectCoercible = function (it) {
43 if (it == undefined) throw TypeError("Can't call method on " + it);
44 return it;
45 };
46
47 // toObject with fallback for non-array-like ES3 strings
48
49
50
51 var toIndexedObject = function (it) {
52 return indexedObject(requireObjectCoercible(it));
53 };
54
55 var sloppyArrayMethod = function (METHOD_NAME, argument) {
56 var method = [][METHOD_NAME];
57 return !method || !fails(function () {
58 // eslint-disable-next-line no-useless-call,no-throw-literal
59 method.call(null, argument || function () { throw 1; }, 1);
60 });
61 };
62
63 // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
64 var global = typeof window == 'object' && window && window.Math == Math ? window
65 : typeof self == 'object' && self && self.Math == Math ? self
66 // eslint-disable-next-line no-new-func
67 : Function('return this')();
68
69 // Thank's IE8 for his funny defineProperty
70 var descriptors = !fails(function () {
71 return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
72 });
73
74 var nativePropertyIsEnumerable = {}.propertyIsEnumerable;
75 var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
76
77 // Nashorn ~ JDK8 bug
78 var NASHORN_BUG = nativeGetOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);
79
80 var f = NASHORN_BUG ? function propertyIsEnumerable(V) {
81 var descriptor = nativeGetOwnPropertyDescriptor(this, V);
82 return !!descriptor && descriptor.enumerable;
83 } : nativePropertyIsEnumerable;
84
85 var objectPropertyIsEnumerable = {
86 f: f
87 };
88
89 var createPropertyDescriptor = function (bitmap, value) {
90 return {
91 enumerable: !(bitmap & 1),
92 configurable: !(bitmap & 2),
93 writable: !(bitmap & 4),
94 value: value
95 };
96 };
97
98 var isObject = function (it) {
99 return typeof it === 'object' ? it !== null : typeof it === 'function';
100 };
101
102 // 7.1.1 ToPrimitive(input [, PreferredType])
103
104 // instead of the ES6 spec version, we didn't implement @@toPrimitive case
105 // and the second argument - flag - preferred type is a string
106 var toPrimitive = function (it, S) {
107 if (!isObject(it)) return it;
108 var fn, val;
109 if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
110 if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
111 if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
112 throw TypeError("Can't convert object to primitive value");
113 };
114
115 var hasOwnProperty = {}.hasOwnProperty;
116
117 var has = function (it, key) {
118 return hasOwnProperty.call(it, key);
119 };
120
121 var document$1 = global.document;
122 // typeof document.createElement is 'object' in old IE
123 var exist = isObject(document$1) && isObject(document$1.createElement);
124
125 var documentCreateElement = function (it) {
126 return exist ? document$1.createElement(it) : {};
127 };
128
129 // Thank's IE8 for his funny defineProperty
130 var ie8DomDefine = !descriptors && !fails(function () {
131 return Object.defineProperty(documentCreateElement('div'), 'a', {
132 get: function () { return 7; }
133 }).a != 7;
134 });
135
136 var nativeGetOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;
137
138 var f$1 = descriptors ? nativeGetOwnPropertyDescriptor$1 : function getOwnPropertyDescriptor(O, P) {
139 O = toIndexedObject(O);
140 P = toPrimitive(P, true);
141 if (ie8DomDefine) try {
142 return nativeGetOwnPropertyDescriptor$1(O, P);
143 } catch (error) { /* empty */ }
144 if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);
145 };
146
147 var objectGetOwnPropertyDescriptor = {
148 f: f$1
149 };
150
151 var anObject = function (it) {
152 if (!isObject(it)) {
153 throw TypeError(String(it) + ' is not an object');
154 } return it;
155 };
156
157 var nativeDefineProperty = Object.defineProperty;
158
159 var f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {
160 anObject(O);
161 P = toPrimitive(P, true);
162 anObject(Attributes);
163 if (ie8DomDefine) try {
164 return nativeDefineProperty(O, P, Attributes);
165 } catch (error) { /* empty */ }
166 if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
167 if ('value' in Attributes) O[P] = Attributes.value;
168 return O;
169 };
170
171 var objectDefineProperty = {
172 f: f$2
173 };
174
175 var hide = descriptors ? function (object, key, value) {
176 return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));
177 } : function (object, key, value) {
178 object[key] = value;
179 return object;
180 };
181
182 function createCommonjsModule(fn, module) {
183 return module = { exports: {} }, fn(module, module.exports), module.exports;
184 }
185
186 var setGlobal = function (key, value) {
187 try {
188 hide(global, key, value);
189 } catch (error) {
190 global[key] = value;
191 } return value;
192 };
193
194 var shared = createCommonjsModule(function (module) {
195 var SHARED = '__core-js_shared__';
196 var store = global[SHARED] || setGlobal(SHARED, {});
197
198 (module.exports = function (key, value) {
199 return store[key] || (store[key] = value !== undefined ? value : {});
200 })('versions', []).push({
201 version: '3.0.1',
202 mode: 'global',
203 copyright: '© 2019 Denis Pushkarev (zloirock.ru)'
204 });
205 });
206
207 var functionToString = shared('native-function-to-string', Function.toString);
208
209 var WeakMap = global.WeakMap;
210
211 var nativeWeakMap = typeof WeakMap === 'function' && /native code/.test(functionToString.call(WeakMap));
212
213 var id = 0;
214 var postfix = Math.random();
215
216 var uid = function (key) {
217 return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36));
218 };
219
220 var shared$1 = shared('keys');
221
222
223 var sharedKey = function (key) {
224 return shared$1[key] || (shared$1[key] = uid(key));
225 };
226
227 var hiddenKeys = {};
228
229 var WeakMap$1 = global.WeakMap;
230 var set, get, has$1;
231
232 var enforce = function (it) {
233 return has$1(it) ? get(it) : set(it, {});
234 };
235
236 var getterFor = function (TYPE) {
237 return function (it) {
238 var state;
239 if (!isObject(it) || (state = get(it)).type !== TYPE) {
240 throw TypeError('Incompatible receiver, ' + TYPE + ' required');
241 } return state;
242 };
243 };
244
245 if (nativeWeakMap) {
246 var store = new WeakMap$1();
247 var wmget = store.get;
248 var wmhas = store.has;
249 var wmset = store.set;
250 set = function (it, metadata) {
251 wmset.call(store, it, metadata);
252 return metadata;
253 };
254 get = function (it) {
255 return wmget.call(store, it) || {};
256 };
257 has$1 = function (it) {
258 return wmhas.call(store, it);
259 };
260 } else {
261 var STATE = sharedKey('state');
262 hiddenKeys[STATE] = true;
263 set = function (it, metadata) {
264 hide(it, STATE, metadata);
265 return metadata;
266 };
267 get = function (it) {
268 return has(it, STATE) ? it[STATE] : {};
269 };
270 has$1 = function (it) {
271 return has(it, STATE);
272 };
273 }
274
275 var internalState = {
276 set: set,
277 get: get,
278 has: has$1,
279 enforce: enforce,
280 getterFor: getterFor
281 };
282
283 var redefine = createCommonjsModule(function (module) {
284 var getInternalState = internalState.get;
285 var enforceInternalState = internalState.enforce;
286 var TEMPLATE = String(functionToString).split('toString');
287
288 shared('inspectSource', function (it) {
289 return functionToString.call(it);
290 });
291
292 (module.exports = function (O, key, value, options) {
293 var unsafe = options ? !!options.unsafe : false;
294 var simple = options ? !!options.enumerable : false;
295 var noTargetGet = options ? !!options.noTargetGet : false;
296 if (typeof value == 'function') {
297 if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);
298 enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');
299 }
300 if (O === global) {
301 if (simple) O[key] = value;
302 else setGlobal(key, value);
303 return;
304 } else if (!unsafe) {
305 delete O[key];
306 } else if (!noTargetGet && O[key]) {
307 simple = true;
308 }
309 if (simple) O[key] = value;
310 else hide(O, key, value);
311 // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
312 })(Function.prototype, 'toString', function toString() {
313 return typeof this == 'function' && getInternalState(this).source || functionToString.call(this);
314 });
315 });
316
317 var ceil = Math.ceil;
318 var floor = Math.floor;
319
320 // `ToInteger` abstract operation
321 // https://tc39.github.io/ecma262/#sec-tointeger
322 var toInteger = function (argument) {
323 return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);
324 };
325
326 var min = Math.min;
327
328 // `ToLength` abstract operation
329 // https://tc39.github.io/ecma262/#sec-tolength
330 var toLength = function (argument) {
331 return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
332 };
333
334 var max = Math.max;
335 var min$1 = Math.min;
336
337 // Helper for a popular repeating case of the spec:
338 // Let integer be ? ToInteger(index).
339 // If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).
340 var toAbsoluteIndex = function (index, length) {
341 var integer = toInteger(index);
342 return integer < 0 ? max(integer + length, 0) : min$1(integer, length);
343 };
344
345 // `Array.prototype.{ indexOf, includes }` methods implementation
346 // false -> Array#indexOf
347 // https://tc39.github.io/ecma262/#sec-array.prototype.indexof
348 // true -> Array#includes
349 // https://tc39.github.io/ecma262/#sec-array.prototype.includes
350 var arrayIncludes = function (IS_INCLUDES) {
351 return function ($this, el, fromIndex) {
352 var O = toIndexedObject($this);
353 var length = toLength(O.length);
354 var index = toAbsoluteIndex(fromIndex, length);
355 var value;
356 // Array#includes uses SameValueZero equality algorithm
357 // eslint-disable-next-line no-self-compare
358 if (IS_INCLUDES && el != el) while (length > index) {
359 value = O[index++];
360 // eslint-disable-next-line no-self-compare
361 if (value != value) return true;
362 // Array#indexOf ignores holes, Array#includes - not
363 } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
364 if (O[index] === el) return IS_INCLUDES || index || 0;
365 } return !IS_INCLUDES && -1;
366 };
367 };
368
369 var arrayIndexOf = arrayIncludes(false);
370
371
372 var objectKeysInternal = function (object, names) {
373 var O = toIndexedObject(object);
374 var i = 0;
375 var result = [];
376 var key;
377 for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);
378 // Don't enum bug & hidden keys
379 while (names.length > i) if (has(O, key = names[i++])) {
380 ~arrayIndexOf(result, key) || result.push(key);
381 }
382 return result;
383 };
384
385 // IE8- don't enum bug keys
386 var enumBugKeys = [
387 'constructor',
388 'hasOwnProperty',
389 'isPrototypeOf',
390 'propertyIsEnumerable',
391 'toLocaleString',
392 'toString',
393 'valueOf'
394 ];
395
396 // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
397
398 var hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');
399
400 var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
401 return objectKeysInternal(O, hiddenKeys$1);
402 };
403
404 var objectGetOwnPropertyNames = {
405 f: f$3
406 };
407
408 var f$4 = Object.getOwnPropertySymbols;
409
410 var objectGetOwnPropertySymbols = {
411 f: f$4
412 };
413
414 var Reflect = global.Reflect;
415
416 // all object keys, includes non-enumerable and symbols
417 var ownKeys = Reflect && Reflect.ownKeys || function ownKeys(it) {
418 var keys = objectGetOwnPropertyNames.f(anObject(it));
419 var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
420 return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;
421 };
422
423 var copyConstructorProperties = function (target, source) {
424 var keys = ownKeys(source);
425 var defineProperty = objectDefineProperty.f;
426 var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
427 for (var i = 0; i < keys.length; i++) {
428 var key = keys[i];
429 if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));
430 }
431 };
432
433 var replacement = /#|\.prototype\./;
434
435 var isForced = function (feature, detection) {
436 var value = data[normalize(feature)];
437 return value == POLYFILL ? true
438 : value == NATIVE ? false
439 : typeof detection == 'function' ? fails(detection)
440 : !!detection;
441 };
442
443 var normalize = isForced.normalize = function (string) {
444 return String(string).replace(replacement, '.').toLowerCase();
445 };
446
447 var data = isForced.data = {};
448 var NATIVE = isForced.NATIVE = 'N';
449 var POLYFILL = isForced.POLYFILL = 'P';
450
451 var isForced_1 = isForced;
452
453 var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
454
455
456
457
458
459
460 /*
461 options.target - name of the target object
462 options.global - target is the global object
463 options.stat - export as static methods of target
464 options.proto - export as prototype methods of target
465 options.real - real prototype method for the `pure` version
466 options.forced - export even if the native feature is available
467 options.bind - bind methods to the target, required for the `pure` version
468 options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
469 options.unsafe - use the simple assignment of property instead of delete + defineProperty
470 options.sham - add a flag to not completely full polyfills
471 options.enumerable - export as enumerable property
472 options.noTargetGet - prevent calling a getter on target
473 */
474 var _export = function (options, source) {
475 var TARGET = options.target;
476 var GLOBAL = options.global;
477 var STATIC = options.stat;
478 var FORCED, target, key, targetProperty, sourceProperty, descriptor;
479 if (GLOBAL) {
480 target = global;
481 } else if (STATIC) {
482 target = global[TARGET] || setGlobal(TARGET, {});
483 } else {
484 target = (global[TARGET] || {}).prototype;
485 }
486 if (target) for (key in source) {
487 sourceProperty = source[key];
488 if (options.noTargetGet) {
489 descriptor = getOwnPropertyDescriptor(target, key);
490 targetProperty = descriptor && descriptor.value;
491 } else targetProperty = target[key];
492 FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
493 // contained in target
494 if (!FORCED && targetProperty !== undefined) {
495 if (typeof sourceProperty === typeof targetProperty) continue;
496 copyConstructorProperties(sourceProperty, targetProperty);
497 }
498 // add a flag to not completely full polyfills
499 if (options.sham || (targetProperty && targetProperty.sham)) {
500 hide(sourceProperty, 'sham', true);
501 }
502 // extend global
503 redefine(target, key, sourceProperty, options);
504 }
505 };
506
507 var nativeJoin = [].join;
508
509 var ES3_STRINGS = indexedObject != Object;
510 var SLOPPY_METHOD = sloppyArrayMethod('join', ',');
511
512 // `Array.prototype.join` method
513 // https://tc39.github.io/ecma262/#sec-array.prototype.join
514 _export({ target: 'Array', proto: true, forced: ES3_STRINGS || SLOPPY_METHOD }, {
515 join: function join(separator) {
516 return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);
517 }
518 });
519
520 var aFunction = function (it) {
521 if (typeof it != 'function') {
522 throw TypeError(String(it) + ' is not a function');
523 } return it;
524 };
525
526 // optional / simple context binding
527 var bindContext = function (fn, that, length) {
528 aFunction(fn);
529 if (that === undefined) return fn;
530 switch (length) {
531 case 0: return function () {
532 return fn.call(that);
533 };
534 case 1: return function (a) {
535 return fn.call(that, a);
536 };
537 case 2: return function (a, b) {
538 return fn.call(that, a, b);
539 };
540 case 3: return function (a, b, c) {
541 return fn.call(that, a, b, c);
542 };
543 }
544 return function (/* ...args */) {
545 return fn.apply(that, arguments);
546 };
547 };
548
549 // `ToObject` abstract operation
550 // https://tc39.github.io/ecma262/#sec-toobject
551 var toObject = function (argument) {
552 return Object(requireObjectCoercible(argument));
553 };
554
555 // `IsArray` abstract operation
556 // https://tc39.github.io/ecma262/#sec-isarray
557 var isArray$1 = Array.isArray || function isArray(arg) {
558 return classofRaw(arg) == 'Array';
559 };
560
561 // Chrome 38 Symbol has incorrect toString conversion
562 var nativeSymbol = !fails(function () {
563 // eslint-disable-next-line no-undef
564 return !String(Symbol());
565 });
566
567 var store$1 = shared('wks');
568
569 var Symbol$1 = global.Symbol;
570
571
572 var wellKnownSymbol = function (name) {
573 return store$1[name] || (store$1[name] = nativeSymbol && Symbol$1[name]
574 || (nativeSymbol ? Symbol$1 : uid)('Symbol.' + name));
575 };
576
577 var SPECIES = wellKnownSymbol('species');
578
579 // `ArraySpeciesCreate` abstract operation
580 // https://tc39.github.io/ecma262/#sec-arrayspeciescreate
581 var arraySpeciesCreate = function (originalArray, length) {
582 var C;
583 if (isArray$1(originalArray)) {
584 C = originalArray.constructor;
585 // cross-realm fallback
586 if (typeof C == 'function' && (C === Array || isArray$1(C.prototype))) C = undefined;
587 else if (isObject(C)) {
588 C = C[SPECIES];
589 if (C === null) C = undefined;
590 }
591 } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);
592 };
593
594 // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation
595 // 0 -> Array#forEach
596 // https://tc39.github.io/ecma262/#sec-array.prototype.foreach
597 // 1 -> Array#map
598 // https://tc39.github.io/ecma262/#sec-array.prototype.map
599 // 2 -> Array#filter
600 // https://tc39.github.io/ecma262/#sec-array.prototype.filter
601 // 3 -> Array#some
602 // https://tc39.github.io/ecma262/#sec-array.prototype.some
603 // 4 -> Array#every
604 // https://tc39.github.io/ecma262/#sec-array.prototype.every
605 // 5 -> Array#find
606 // https://tc39.github.io/ecma262/#sec-array.prototype.find
607 // 6 -> Array#findIndex
608 // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
609 var arrayMethods = function (TYPE, specificCreate) {
610 var IS_MAP = TYPE == 1;
611 var IS_FILTER = TYPE == 2;
612 var IS_SOME = TYPE == 3;
613 var IS_EVERY = TYPE == 4;
614 var IS_FIND_INDEX = TYPE == 6;
615 var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
616 var create = specificCreate || arraySpeciesCreate;
617 return function ($this, callbackfn, that) {
618 var O = toObject($this);
619 var self = indexedObject(O);
620 var boundFunction = bindContext(callbackfn, that, 3);
621 var length = toLength(self.length);
622 var index = 0;
623 var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
624 var value, result;
625 for (;length > index; index++) if (NO_HOLES || index in self) {
626 value = self[index];
627 result = boundFunction(value, index, O);
628 if (TYPE) {
629 if (IS_MAP) target[index] = result; // map
630 else if (result) switch (TYPE) {
631 case 3: return true; // some
632 case 5: return value; // find
633 case 6: return index; // findIndex
634 case 2: target.push(value); // filter
635 } else if (IS_EVERY) return false; // every
636 }
637 }
638 return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
639 };
640 };
641
642 var SPECIES$1 = wellKnownSymbol('species');
643
644 var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {
645 return !fails(function () {
646 var array = [];
647 var constructor = array.constructor = {};
648 constructor[SPECIES$1] = function () {
649 return { foo: 1 };
650 };
651 return array[METHOD_NAME](Boolean).foo !== 1;
652 });
653 };
654
655 var internalMap = arrayMethods(1);
656
657 var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
658
659 // `Array.prototype.map` method
660 // https://tc39.github.io/ecma262/#sec-array.prototype.map
661 // with adding support of @@species
662 _export({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, {
663 map: function map(callbackfn /* , thisArg */) {
664 return internalMap(this, callbackfn, arguments[1]);
665 }
666 });
667
668 var createProperty = function (object, key, value) {
669 var propertyKey = toPrimitive(key);
670 if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));
671 else object[propertyKey] = value;
672 };
673
674 var SPECIES$2 = wellKnownSymbol('species');
675 var nativeSlice = [].slice;
676 var max$1 = Math.max;
677
678 var SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('slice');
679
680 // `Array.prototype.slice` method
681 // https://tc39.github.io/ecma262/#sec-array.prototype.slice
682 // fallback for not array-like ES3 strings and DOM objects
683 _export({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT$1 }, {
684 slice: function slice(start, end) {
685 var O = toIndexedObject(this);
686 var length = toLength(O.length);
687 var k = toAbsoluteIndex(start, length);
688 var fin = toAbsoluteIndex(end === undefined ? length : end, length);
689 // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
690 var Constructor, result, n;
691 if (isArray$1(O)) {
692 Constructor = O.constructor;
693 // cross-realm fallback
694 if (typeof Constructor == 'function' && (Constructor === Array || isArray$1(Constructor.prototype))) {
695 Constructor = undefined;
696 } else if (isObject(Constructor)) {
697 Constructor = Constructor[SPECIES$2];
698 if (Constructor === null) Constructor = undefined;
699 }
700 if (Constructor === Array || Constructor === undefined) {
701 return nativeSlice.call(O, k, fin);
702 }
703 }
704 result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));
705 for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
706 result.length = n;
707 return result;
708 }
709 });
710
711 // 19.1.2.14 / 15.2.3.14 Object.keys(O)
712
713
714
715 var objectKeys = Object.keys || function keys(O) {
716 return objectKeysInternal(O, enumBugKeys);
717 };
718
719 // 19.1.2.1 Object.assign(target, source, ...)
720
721
722
723
724
725 var nativeAssign = Object.assign;
726
727 // should work with symbols and should have deterministic property order (V8 bug)
728 var objectAssign = !nativeAssign || fails(function () {
729 var A = {};
730 var B = {};
731 // eslint-disable-next-line no-undef
732 var symbol = Symbol();
733 var alphabet = 'abcdefghijklmnopqrst';
734 A[symbol] = 7;
735 alphabet.split('').forEach(function (chr) { B[chr] = chr; });
736 return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;
737 }) ? function assign(target, source) { // eslint-disable-line no-unused-vars
738 var T = toObject(target);
739 var argumentsLength = arguments.length;
740 var index = 1;
741 var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
742 var propertyIsEnumerable = objectPropertyIsEnumerable.f;
743 while (argumentsLength > index) {
744 var S = indexedObject(arguments[index++]);
745 var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);
746 var length = keys.length;
747 var j = 0;
748 var key;
749 while (length > j) if (propertyIsEnumerable.call(S, key = keys[j++])) T[key] = S[key];
750 } return T;
751 } : nativeAssign;
752
753 // `Object.assign` method
754 // https://tc39.github.io/ecma262/#sec-object.assign
755 _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, { assign: objectAssign });
756
757 var FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });
758
759 // `Object.keys` method
760 // https://tc39.github.io/ecma262/#sec-object.keys
761 _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
762 keys: function keys(it) {
763 return objectKeys(toObject(it));
764 }
765 });
766
767 var MATCH = wellKnownSymbol('match');
768
769 // `IsRegExp` abstract operation
770 // https://tc39.github.io/ecma262/#sec-isregexp
771 var isRegexp = function (it) {
772 var isRegExp;
773 return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');
774 };
775
776 // helper for String#{startsWith, endsWith, includes}
777
778
779
780 var validateStringMethodArguments = function (that, searchString, NAME) {
781 if (isRegexp(searchString)) {
782 throw TypeError('String.prototype.' + NAME + " doesn't accept regex");
783 } return String(requireObjectCoercible(that));
784 };
785
786 var MATCH$1 = wellKnownSymbol('match');
787
788 var correctIsRegexpLogic = function (METHOD_NAME) {
789 var regexp = /./;
790 try {
791 '/./'[METHOD_NAME](regexp);
792 } catch (e) {
793 try {
794 regexp[MATCH$1] = false;
795 return '/./'[METHOD_NAME](regexp);
796 } catch (f) { /* empty */ }
797 } return false;
798 };
799
800 var ENDS_WITH = 'endsWith';
801 var nativeEndsWith = ''[ENDS_WITH];
802 var min$2 = Math.min;
803
804 var CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic(ENDS_WITH);
805
806 // `String.prototype.endsWith` method
807 // https://tc39.github.io/ecma262/#sec-string.prototype.endswith
808 _export({ target: 'String', proto: true, forced: !CORRECT_IS_REGEXP_LOGIC }, {
809 endsWith: function endsWith(searchString /* , endPosition = @length */) {
810 var that = validateStringMethodArguments(this, searchString, ENDS_WITH);
811 var endPosition = arguments.length > 1 ? arguments[1] : undefined;
812 var len = toLength(that.length);
813 var end = endPosition === undefined ? len : min$2(toLength(endPosition), len);
814 var search = String(searchString);
815 return nativeEndsWith
816 ? nativeEndsWith.call(that, search, end)
817 : that.slice(end - search.length, end) === search;
818 }
819 });
820
821 var quot = /"/g;
822
823 // B.2.3.2.1 CreateHTML(string, tag, attribute, value)
824 // https://tc39.github.io/ecma262/#sec-createhtml
825 var createHtml = function (string, tag, attribute, value) {
826 var S = String(requireObjectCoercible(string));
827 var p1 = '<' + tag;
828 if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
829 return p1 + '>' + S + '</' + tag + '>';
830 };
831
832 // check the existence of a method, lowercase
833 // of a tag and escaping quotes in arguments
834 var forcedStringHtmlMethod = function (METHOD_NAME) {
835 return fails(function () {
836 var test = ''[METHOD_NAME]('"');
837 return test !== test.toLowerCase() || test.split('"').length > 3;
838 });
839 };
840
841 var FORCED = forcedStringHtmlMethod('bold');
842
843 // `String.prototype.bold` method
844 // https://tc39.github.io/ecma262/#sec-string.prototype.bold
845 _export({ target: 'String', proto: true, forced: FORCED }, {
846 bold: function bold() {
847 return createHtml(this, 'b', '', '');
848 }
849 });
850
851 // iterable DOM collections
852 // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
853 var domIterables = {
854 CSSRuleList: 0,
855 CSSStyleDeclaration: 0,
856 CSSValueList: 0,
857 ClientRectList: 0,
858 DOMRectList: 0,
859 DOMStringList: 0,
860 DOMTokenList: 1,
861 DataTransferItemList: 0,
862 FileList: 0,
863 HTMLAllCollection: 0,
864 HTMLCollection: 0,
865 HTMLFormElement: 0,
866 HTMLSelectElement: 0,
867 MediaList: 0,
868 MimeTypeArray: 0,
869 NamedNodeMap: 0,
870 NodeList: 1,
871 PaintRequestList: 0,
872 Plugin: 0,
873 PluginArray: 0,
874 SVGLengthList: 0,
875 SVGNumberList: 0,
876 SVGPathSegList: 0,
877 SVGPointList: 0,
878 SVGStringList: 0,
879 SVGTransformList: 0,
880 SourceBufferList: 0,
881 StyleSheetList: 0,
882 TextTrackCueList: 0,
883 TextTrackList: 0,
884 TouchList: 0
885 };
886
887 var nativeForEach = [].forEach;
888 var internalForEach = arrayMethods(0);
889
890 var SLOPPY_METHOD$1 = sloppyArrayMethod('forEach');
891
892 // `Array.prototype.forEach` method implementation
893 // https://tc39.github.io/ecma262/#sec-array.prototype.foreach
894 var arrayForEach = SLOPPY_METHOD$1 ? function forEach(callbackfn /* , thisArg */) {
895 return internalForEach(this, callbackfn, arguments[1]);
896 } : nativeForEach;
897
898 for (var COLLECTION_NAME in domIterables) {
899 var Collection = global[COLLECTION_NAME];
900 var CollectionPrototype = Collection && Collection.prototype;
901 // some Chrome versions have non-configurable methods on DOMTokenList
902 if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {
903 hide(CollectionPrototype, 'forEach', arrayForEach);
904 } catch (error) {
905 CollectionPrototype.forEach = arrayForEach;
906 }
907 }
908
909 var TO_STRING_TAG = wellKnownSymbol('toStringTag');
910 // ES3 wrong here
911 var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
912
913 // fallback for IE11 Script Access Denied error
914 var tryGet = function (it, key) {
915 try {
916 return it[key];
917 } catch (error) { /* empty */ }
918 };
919
920 // getting tag from ES6+ `Object.prototype.toString`
921 var classof = function (it) {
922 var O, tag, result;
923 return it === undefined ? 'Undefined' : it === null ? 'Null'
924 // @@toStringTag case
925 : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag
926 // builtinTag case
927 : CORRECT_ARGUMENTS ? classofRaw(O)
928 // ES3 arguments fallback
929 : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;
930 };
931
932 var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');
933 var test = {};
934
935 test[TO_STRING_TAG$1] = 'z';
936
937 // `Object.prototype.toString` method implementation
938 // https://tc39.github.io/ecma262/#sec-object.prototype.tostring
939 var objectToString = String(test) !== '[object z]' ? function toString() {
940 return '[object ' + classof(this) + ']';
941 } : test.toString;
942
943 var ObjectPrototype = Object.prototype;
944
945 // `Object.prototype.toString` method
946 // https://tc39.github.io/ecma262/#sec-object.prototype.tostring
947 if (objectToString !== ObjectPrototype.toString) {
948 redefine(ObjectPrototype, 'toString', objectToString, { unsafe: true });
949 }
950
951 // `RegExp.prototype.flags` getter implementation
952 // https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags
953 var regexpFlags = function () {
954 var that = anObject(this);
955 var result = '';
956 if (that.global) result += 'g';
957 if (that.ignoreCase) result += 'i';
958 if (that.multiline) result += 'm';
959 if (that.unicode) result += 'u';
960 if (that.sticky) result += 'y';
961 return result;
962 };
963
964 var TO_STRING = 'toString';
965 var nativeToString = /./[TO_STRING];
966
967 var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
968 // FF44- RegExp#toString has a wrong name
969 var INCORRECT_NAME = nativeToString.name != TO_STRING;
970
971 // `RegExp.prototype.toString` method
972 // https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring
973 if (NOT_GENERIC || INCORRECT_NAME) {
974 redefine(RegExp.prototype, TO_STRING, function toString() {
975 var R = anObject(this);
976 return '/'.concat(R.source, '/',
977 'flags' in R ? R.flags : !descriptors && R instanceof RegExp ? regexpFlags.call(R) : undefined);
978 }, { unsafe: true });
979 }
980
981 var oP = Object.prototype;
982 /**
983 * 是否对象
984 * @param {any} o 判断变量
985 * @return {boolean} 结构
986 */
987
988 function isObject$1(o) {
989 return oP.toString.call(o) === '[object Object]';
990 }
991 /**
992 * 是否string
993 * @param {*} o
994 */
995
996 function isString(o) {
997 return typeof o === 'string';
998 }
999
1000 // CONVERT_TO_STRING: true -> String#at
1001 // CONVERT_TO_STRING: false -> String#codePointAt
1002 var stringAt = function (that, pos, CONVERT_TO_STRING) {
1003 var S = String(requireObjectCoercible(that));
1004 var position = toInteger(pos);
1005 var size = S.length;
1006 var first, second;
1007 if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
1008 first = S.charCodeAt(position);
1009 return first < 0xD800 || first > 0xDBFF || position + 1 === size
1010 || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
1011 ? CONVERT_TO_STRING ? S.charAt(position) : first
1012 : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
1013 };
1014
1015 // `AdvanceStringIndex` abstract operation
1016 // https://tc39.github.io/ecma262/#sec-advancestringindex
1017 var advanceStringIndex = function (S, index, unicode) {
1018 return index + (unicode ? stringAt(S, index, true).length : 1);
1019 };
1020
1021 var nativeExec = RegExp.prototype.exec;
1022 // This always refers to the native implementation, because the
1023 // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,
1024 // which loads this file before patching the method.
1025 var nativeReplace = String.prototype.replace;
1026
1027 var patchedExec = nativeExec;
1028
1029 var UPDATES_LAST_INDEX_WRONG = (function () {
1030 var re1 = /a/;
1031 var re2 = /b*/g;
1032 nativeExec.call(re1, 'a');
1033 nativeExec.call(re2, 'a');
1034 return re1.lastIndex !== 0 || re2.lastIndex !== 0;
1035 })();
1036
1037 // nonparticipating capturing group, copied from es5-shim's String#split patch.
1038 var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
1039
1040 var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;
1041
1042 if (PATCH) {
1043 patchedExec = function exec(str) {
1044 var re = this;
1045 var lastIndex, reCopy, match, i;
1046
1047 if (NPCG_INCLUDED) {
1048 reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re));
1049 }
1050 if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
1051
1052 match = nativeExec.call(re, str);
1053
1054 if (UPDATES_LAST_INDEX_WRONG && match) {
1055 re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
1056 }
1057 if (NPCG_INCLUDED && match && match.length > 1) {
1058 // Fix browsers whose `exec` methods don't consistently return `undefined`
1059 // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
1060 nativeReplace.call(match[0], reCopy, function () {
1061 for (i = 1; i < arguments.length - 2; i++) {
1062 if (arguments[i] === undefined) match[i] = undefined;
1063 }
1064 });
1065 }
1066
1067 return match;
1068 };
1069 }
1070
1071 var regexpExec = patchedExec;
1072
1073 // `RegExpExec` abstract operation
1074 // https://tc39.github.io/ecma262/#sec-regexpexec
1075 var regexpExecAbstract = function (R, S) {
1076 var exec = R.exec;
1077 if (typeof exec === 'function') {
1078 var result = exec.call(R, S);
1079 if (typeof result !== 'object') {
1080 throw TypeError('RegExp exec method returned something other than an Object or null');
1081 }
1082 return result;
1083 }
1084
1085 if (classofRaw(R) !== 'RegExp') {
1086 throw TypeError('RegExp#exec called on incompatible receiver');
1087 }
1088
1089 return regexpExec.call(R, S);
1090 };
1091
1092 var SPECIES$3 = wellKnownSymbol('species');
1093
1094 var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {
1095 // #replace needs built-in support for named groups.
1096 // #match works fine because it just return the exec results, even if it has
1097 // a "grops" property.
1098 var re = /./;
1099 re.exec = function () {
1100 var result = [];
1101 result.groups = { a: '7' };
1102 return result;
1103 };
1104 return ''.replace(re, '$<a>') !== '7';
1105 });
1106
1107 // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
1108 // Weex JS has frozen built-in prototypes, so use try / catch wrapper
1109 var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {
1110 var re = /(?:)/;
1111 var originalExec = re.exec;
1112 re.exec = function () { return originalExec.apply(this, arguments); };
1113 var result = 'ab'.split(re);
1114 return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
1115 });
1116
1117 var fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {
1118 var SYMBOL = wellKnownSymbol(KEY);
1119
1120 var DELEGATES_TO_SYMBOL = !fails(function () {
1121 // String methods call symbol-named RegEp methods
1122 var O = {};
1123 O[SYMBOL] = function () { return 7; };
1124 return ''[KEY](O) != 7;
1125 });
1126
1127 var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {
1128 // Symbol-named RegExp methods call .exec
1129 var execCalled = false;
1130 var re = /a/;
1131 re.exec = function () { execCalled = true; return null; };
1132
1133 if (KEY === 'split') {
1134 // RegExp[@@split] doesn't call the regex's exec method, but first creates
1135 // a new one. We need to return the patched regex when creating the new one.
1136 re.constructor = {};
1137 re.constructor[SPECIES$3] = function () { return re; };
1138 }
1139
1140 re[SYMBOL]('');
1141 return !execCalled;
1142 });
1143
1144 if (
1145 !DELEGATES_TO_SYMBOL ||
1146 !DELEGATES_TO_EXEC ||
1147 (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||
1148 (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)
1149 ) {
1150 var nativeRegExpMethod = /./[SYMBOL];
1151 var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
1152 if (regexp.exec === regexpExec) {
1153 if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
1154 // The native String method already delegates to @@method (this
1155 // polyfilled function), leasing to infinite recursion.
1156 // We avoid it by directly calling the native @@method method.
1157 return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };
1158 }
1159 return { done: true, value: nativeMethod.call(str, regexp, arg2) };
1160 }
1161 return { done: false };
1162 });
1163 var stringMethod = methods[0];
1164 var regexMethod = methods[1];
1165
1166 redefine(String.prototype, KEY, stringMethod);
1167 redefine(RegExp.prototype, SYMBOL, length == 2
1168 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
1169 // 21.2.5.11 RegExp.prototype[@@split](string, limit)
1170 ? function (string, arg) { return regexMethod.call(string, this, arg); }
1171 // 21.2.5.6 RegExp.prototype[@@match](string)
1172 // 21.2.5.9 RegExp.prototype[@@search](string)
1173 : function (string) { return regexMethod.call(string, this); }
1174 );
1175 if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true);
1176 }
1177 };
1178
1179 // @@match logic
1180 fixRegexpWellKnownSymbolLogic(
1181 'match',
1182 1,
1183 function (MATCH, nativeMatch, maybeCallNative) {
1184 return [
1185 // `String.prototype.match` method
1186 // https://tc39.github.io/ecma262/#sec-string.prototype.match
1187 function match(regexp) {
1188 var O = requireObjectCoercible(this);
1189 var matcher = regexp == undefined ? undefined : regexp[MATCH];
1190 return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
1191 },
1192 // `RegExp.prototype[@@match]` method
1193 // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match
1194 function (regexp) {
1195 var res = maybeCallNative(nativeMatch, regexp, this);
1196 if (res.done) return res.value;
1197
1198 var rx = anObject(regexp);
1199 var S = String(this);
1200
1201 if (!rx.global) return regexpExecAbstract(rx, S);
1202
1203 var fullUnicode = rx.unicode;
1204 rx.lastIndex = 0;
1205 var A = [];
1206 var n = 0;
1207 var result;
1208 while ((result = regexpExecAbstract(rx, S)) !== null) {
1209 var matchStr = String(result[0]);
1210 A[n] = matchStr;
1211 if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
1212 n++;
1213 }
1214 return n === 0 ? null : A;
1215 }
1216 ];
1217 }
1218 );
1219
1220 // import { isObject } from './utils';
1221
1222 /**
1223 * 计算图片宽高
1224 * @param {number} width
1225 * @param {number} height
1226 * @param {number} containerWidth
1227 * @return {object<widht: number, height: number>}
1228 */
1229 function computedImageSize(width, height, containerWidth) {
1230 if (width <= containerWidth) {
1231 return {
1232 width: width,
1233 height: height
1234 };
1235 } else {
1236 return {
1237 width: containerWidth,
1238 height: parseInt(height / width * containerWidth, 10)
1239 };
1240 }
1241 }
1242 /**
1243 * 事件绑定
1244 * @param {HTMLElement} el 绑定dom
1245 * @param {string} event 事件名
1246 * @param {function} func 回调函数
1247 * @return {function} 解绑函数
1248 */
1249
1250 function addEvent(el, event, func) {
1251 var callback = function callback(e) {
1252 return func(e);
1253 };
1254
1255 el.addEventListener(event, callback);
1256 return function () {
1257 return el.removeEventListener(event, callback);
1258 };
1259 }
1260
1261 var EMOJIMAP = {
1262 "[仰慕]": {
1263 path: "baozi/emjoy-仰慕.png",
1264 url: "https://img.guihuazhi.com/image/hz/be/b8/beb847c8e54dbec49b9b5338d7c1d734v64x64.png",
1265 size: 5630,
1266 extra: {
1267 format: "png",
1268 width: 64,
1269 height: 64
1270 }
1271 },
1272 "[无辜]": {
1273 path: "baozi/emjoy-无辜.png",
1274 url: "https://img.guihuazhi.com/image/hz/70/39/7039531f0bffbf4b1d3d624c66582384v64x64.png",
1275 size: 5060,
1276 extra: {
1277 format: "png",
1278 width: 64,
1279 height: 64
1280 }
1281 },
1282 "[很尴尬]": {
1283 path: "baozi/emjoy-尴尬.png",
1284 url: "https://img.guihuazhi.com/image/hz/10/72/1072373c470e4595dc731d0d4e5c6b0dv64x64.png",
1285 size: 4366,
1286 extra: {
1287 format: "png",
1288 width: 64,
1289 height: 64
1290 }
1291 },
1292 "[拍桌子]": {
1293 path: "baozi/emjoy-拍桌子.png",
1294 url: "https://img.guihuazhi.com/image/hz/7e/97/7e97bf7d6c338a7f873e7102cc328d22v64x64.png",
1295 size: 4414,
1296 extra: {
1297 format: "png",
1298 width: 64,
1299 height: 64
1300 }
1301 },
1302 "[砸]": {
1303 path: "baozi/emjoy-砸.png",
1304 url: "https://img.guihuazhi.com/image/hz/64/15/64152abbd09f2b2de9e260711d2e22bdv64x64.png",
1305 size: 4341,
1306 extra: {
1307 format: "png",
1308 width: 64,
1309 height: 64
1310 }
1311 },
1312 "[伸舌头]": {
1313 path: "baozi/emjoy-伸舌头.png",
1314 url: "https://img.guihuazhi.com/image/hz/ca/ac/caacc0be3e3b9289df95302b71d2dbd6v64x64.png",
1315 size: 4417,
1316 extra: {
1317 format: "png",
1318 width: 64,
1319 height: 64
1320 }
1321 },
1322 "[老大]": {
1323 path: "baozi/emjoy-老大.png",
1324 url: "https://img.guihuazhi.com/image/hz/6f/6f/6f6f4ce92111f4e70567aac629baf259v64x64.png",
1325 size: 4580,
1326 extra: {
1327 format: "png",
1328 width: 64,
1329 height: 64
1330 }
1331 },
1332 "[寒]": {
1333 path: "baozi/emjoy-寒.png",
1334 url: "https://img.guihuazhi.com/image/hz/e4/85/e4852abf339c746cda85f2472d61a64dv64x64.png",
1335 size: 5235,
1336 extra: {
1337 format: "png",
1338 width: 64,
1339 height: 64
1340 }
1341 },
1342 "[哭]": {
1343 path: "baozi/emjoy-哭.png",
1344 url: "https://img.guihuazhi.com/image/hz/12/0a/120a0b976fadb97d38e8f5563e5a9774v64x64.png",
1345 size: 4666,
1346 extra: {
1347 format: "png",
1348 width: 64,
1349 height: 64
1350 }
1351 },
1352 "[伤心]": {
1353 path: "baozi/emjoy-伤心.png",
1354 url: "https://img.guihuazhi.com/image/hz/57/a9/57a93a97b24d63216a077094936b4a91v64x64.png",
1355 size: 4873,
1356 extra: {
1357 format: "png",
1358 width: 64,
1359 height: 64
1360 }
1361 },
1362 "[很得意]": {
1363 path: "baozi/emjoy-得意.png",
1364 url: "https://img.guihuazhi.com/image/hz/a0/71/a07163f8f7a7209cf63a6977ae6f4391v64x64.png",
1365 size: 4284,
1366 extra: {
1367 format: "png",
1368 width: 64,
1369 height: 64
1370 }
1371 },
1372 "[恐怖]": {
1373 path: "baozi/emjoy-恐怖.png",
1374 url: "https://img.guihuazhi.com/image/hz/9a/f2/9af270856b4eb517baf5a0e46cc42c4bv64x64.png",
1375 size: 5315,
1376 extra: {
1377 format: "png",
1378 width: 64,
1379 height: 64
1380 }
1381 },
1382 "[哭泣]": {
1383 path: "baozi/emjoy-大哭.png",
1384 url: "https://img.guihuazhi.com/image/hz/44/a3/44a341f00d3fd5d186b3b39e57a76c75v64x64.png",
1385 size: 5291,
1386 extra: {
1387 format: "png",
1388 width: 64,
1389 height: 64
1390 }
1391 },
1392 "[激动]": {
1393 path: "baozi/emjoy-激动.png",
1394 url: "https://img.guihuazhi.com/image/hz/8a/fe/8afe8eedb5121214fffb4d0f7176dbadv64x64.png",
1395 size: 4847,
1396 extra: {
1397 format: "png",
1398 width: 64,
1399 height: 64
1400 }
1401 },
1402 "[赞]": {
1403 path: "baozi/emjoy-赞.png",
1404 url: "https://img.guihuazhi.com/image/hz/c9/29/c92900946a1294a5bbef065477ccb4a5v64x64.png",
1405 size: 5606,
1406 extra: {
1407 format: "png",
1408 width: 64,
1409 height: 64
1410 }
1411 },
1412 "[唱歌]": {
1413 path: "baozi/emjoy-唱歌.png",
1414 url: "https://img.guihuazhi.com/image/hz/89/f3/89f3573aa24b4986b30ac7da47578cf1v64x64.png",
1415 size: 4326,
1416 extra: {
1417 format: "png",
1418 width: 64,
1419 height: 64
1420 }
1421 },
1422 "[害羞]": {
1423 path: "baozi/emjoy-害羞.png",
1424 url: "https://img.guihuazhi.com/image/hz/7b/a4/7ba46a63994991bb4bc0ad52e7bd72edv64x64.png",
1425 size: 5374,
1426 extra: {
1427 format: "png",
1428 width: 64,
1429 height: 64
1430 }
1431 },
1432 "[脸红]": {
1433 path: "baozi/emjoy-脸红.png",
1434 url: "https://img.guihuazhi.com/image/hz/75/26/7526ae1a305c1b07703f495eca264d6dv64x64.png",
1435 size: 4326,
1436 extra: {
1437 format: "png",
1438 width: 64,
1439 height: 64
1440 }
1441 },
1442 "[微笑]": {
1443 path: "baozi/emjoy-微笑.png",
1444 url: "https://img.guihuazhi.com/image/hz/ff/51/ff51e1843d77e9c49b2cc2b5c6ab9921v64x64.png",
1445 size: 4043,
1446 extra: {
1447 format: "png",
1448 width: 64,
1449 height: 64
1450 }
1451 },
1452 "[好可怜]": {
1453 path: "baozi/emjoy-可怜.png",
1454 url: "https://img.guihuazhi.com/image/hz/7a/dd/7add2c28e54047e8120c50ba20b44090v64x64.png",
1455 size: 5777,
1456 extra: {
1457 format: "png",
1458 width: 64,
1459 height: 64
1460 }
1461 },
1462 "[酷酷的]": {
1463 path: "baozi/emjoy-酷.png",
1464 url: "https://img.guihuazhi.com/image/hz/be/56/be56121eecc3fa3ff3306125b643c308v64x64.png",
1465 size: 4436,
1466 extra: {
1467 format: "png",
1468 width: 64,
1469 height: 64
1470 }
1471 },
1472 "[心碎]": {
1473 path: "baozi/emjoy-心碎.png",
1474 url: "https://img.guihuazhi.com/image/hz/ae/a3/aea3ca62cb19b02ba228de04b06c0d69v64x64.png",
1475 size: 3600,
1476 extra: {
1477 format: "png",
1478 width: 64,
1479 height: 64
1480 }
1481 },
1482 "[很惊讶]": {
1483 path: "baozi/emjoy-惊讶.png",
1484 url: "https://img.guihuazhi.com/image/hz/86/58/86581676dfd2a7196d6bbfade1f1e5d4v64x64.png",
1485 size: 5028,
1486 extra: {
1487 format: "png",
1488 width: 64,
1489 height: 64
1490 }
1491 },
1492 "[气愤]": {
1493 path: "baozi/emjoy-气愤.png",
1494 url: "https://img.guihuazhi.com/image/hz/aa/7d/aa7dd0514f09d51667219087fc0f5992v64x64.png",
1495 size: 5199,
1496 extra: {
1497 format: "png",
1498 width: 64,
1499 height: 64
1500 }
1501 },
1502 "[喊话]": {
1503 path: "baozi/emjoy-喊话.png",
1504 url: "https://img.guihuazhi.com/image/hz/83/a2/83a208392933b0db34981b0f9dc16575v64x64.png",
1505 size: 4506,
1506 extra: {
1507 format: "png",
1508 width: 64,
1509 height: 64
1510 }
1511 },
1512 "[握手]": {
1513 path: "baozi/emjoy-握手.png",
1514 url: "https://img.guihuazhi.com/image/hz/7e/4e/7e4ecba2ea1822df06e37c2e852412cfv64x64.png",
1515 size: 3580,
1516 extra: {
1517 format: "png",
1518 width: 64,
1519 height: 64
1520 }
1521 },
1522 "[撒娇]": {
1523 path: "baozi/emjoy-撒娇.png",
1524 url: "https://img.guihuazhi.com/image/hz/f1/67/f1676a269584a45342fca2a9b099e8f6v64x64.png",
1525 size: 4830,
1526 extra: {
1527 format: "png",
1528 width: 64,
1529 height: 64
1530 }
1531 },
1532 "[晕了]": {
1533 path: "baozi/emjoy-晕了.png",
1534 url: "https://img.guihuazhi.com/image/hz/e7/ae/e7ae71b1bfb43ab3a23409e2cf7904bev64x64.png",
1535 size: 5286,
1536 extra: {
1537 format: "png",
1538 width: 64,
1539 height: 64
1540 }
1541 },
1542 "[惊吓]": {
1543 path: "baozi/emjoy-惊吓.png",
1544 url: "https://img.guihuazhi.com/image/hz/f3/75/f3759ebf2c0057f729e35a0a6461fb78v64x64.png",
1545 size: 4756,
1546 extra: {
1547 format: "png",
1548 width: 64,
1549 height: 64
1550 }
1551 },
1552 "[汗]": {
1553 path: "baozi/emjoy-汗.png",
1554 url: "https://img.guihuazhi.com/image/hz/82/4b/824b80638f072cd16c769f82543df32av64x64.png",
1555 size: 4739,
1556 extra: {
1557 format: "png",
1558 width: 64,
1559 height: 64
1560 }
1561 },
1562 "[流口水]": {
1563 path: "baozi/emjoy-流口水.png",
1564 url: "https://img.guihuazhi.com/image/hz/ed/89/ed89ac58ffc8a161d489aba283d2d528v64x64.png",
1565 size: 5049,
1566 extra: {
1567 format: "png",
1568 width: 64,
1569 height: 64
1570 }
1571 },
1572 "[鼻血]": {
1573 path: "baozi/emjoy-鼻血.png",
1574 url: "https://img.guihuazhi.com/image/hz/60/7f/607fe2826d650cd489b7a50c966d8742v64x64.png",
1575 size: 4970,
1576 extra: {
1577 format: "png",
1578 width: 64,
1579 height: 64
1580 }
1581 },
1582 "[喜欢]": {
1583 path: "baozi/emjoy-喜欢.png",
1584 url: "https://img.guihuazhi.com/image/hz/bb/6b/bb6b1b7996d28d4da396b1c16ae8301bv64x64.png",
1585 size: 4806,
1586 extra: {
1587 format: "png",
1588 width: 64,
1589 height: 64
1590 }
1591 },
1592 "[邪恶]": {
1593 path: "baozi/emjoy-邪恶.png",
1594 url: "https://img.guihuazhi.com/image/hz/35/ba/35ba542143382619426a8f8ddb171066v64x64.png",
1595 size: 3832,
1596 extra: {
1597 format: "png",
1598 width: 64,
1599 height: 64
1600 }
1601 },
1602 "[啵]": {
1603 path: "baozi/emjoy-啵.png",
1604 url: "https://img.guihuazhi.com/image/hz/78/3c/783cb7bfa01e307d7b15dbbc90935810v64x64.png",
1605 size: 4795,
1606 extra: {
1607 format: "png",
1608 width: 64,
1609 height: 64
1610 }
1611 },
1612 "[望]": {
1613 path: "baozi/emjoy-望.png",
1614 url: "https://img.guihuazhi.com/image/hz/73/24/7324a37bc01af2c6dd10fbb0d1c71f8bv64x64.png",
1615 size: 4336,
1616 extra: {
1617 format: "png",
1618 width: 64,
1619 height: 64
1620 }
1621 },
1622 "[鲜花]": {
1623 path: "baozi/emjoy-鲜花.png",
1624 url: "https://img.guihuazhi.com/image/hz/b6/15/b61511a3a54294493221244af6aee259v64x64.png",
1625 size: 3851,
1626 extra: {
1627 format: "png",
1628 width: 64,
1629 height: 64
1630 }
1631 },
1632 "[招呼]": {
1633 path: "baozi/emjoy-招呼.png",
1634 url: "https://img.guihuazhi.com/image/hz/65/e3/65e36b358ab7da9dae5d33830be5f8c0v64x64.png",
1635 size: 4926,
1636 extra: {
1637 format: "png",
1638 width: 64,
1639 height: 64
1640 }
1641 },
1642 "[心跳]": {
1643 path: "baozi/emjoy-心跳.png",
1644 url: "https://img.guihuazhi.com/image/hz/dd/9a/dd9a2aed589dcf23150e91fd3aef0266v64x64.png",
1645 size: 2621,
1646 extra: {
1647 format: "png",
1648 width: 64,
1649 height: 64
1650 }
1651 },
1652 "[YEAH]": {
1653 path: "baozi/emjoy-YEAH.png",
1654 url: "https://img.guihuazhi.com/image/hz/62/89/62895cb504e98777570512624f0af4a1v64x64.png",
1655 size: 4643,
1656 extra: {
1657 format: "png",
1658 width: 64,
1659 height: 64
1660 }
1661 },
1662 "[色眯眯]": {
1663 path: "baozi/emjoy-色眯眯.png",
1664 url: "https://img.guihuazhi.com/image/hz/48/45/4845befe545d23876f63e58337c8d247v64x64.png",
1665 size: 5094,
1666 extra: {
1667 format: "png",
1668 width: 64,
1669 height: 64
1670 }
1671 },
1672 "[委屈]": {
1673 path: "baozi/emjoy-委屈.png",
1674 url: "https://img.guihuazhi.com/image/hz/54/dd/54ddeafc73887aae0e57b5632a7c657ev64x64.png",
1675 size: 5216,
1676 extra: {
1677 format: "png",
1678 width: 64,
1679 height: 64
1680 }
1681 },
1682 "[眨眼]": {
1683 path: "baozi/emjoy-眨眼.png",
1684 url: "https://img.guihuazhi.com/image/hz/c7/3d/c73d26c5288c9e8892b5b99f9c569d6ev64x64.png",
1685 size: 4870,
1686 extra: {
1687 format: "png",
1688 width: 64,
1689 height: 64
1690 }
1691 },
1692 "[超人]": {
1693 path: "baozi/emjoy-超人.png",
1694 url: "https://img.guihuazhi.com/image/hz/d6/30/d630613c6d04cc96fe69deb1cfdc9dfbv64x64.png",
1695 size: 6140,
1696 extra: {
1697 format: "png",
1698 width: 64,
1699 height: 64
1700 }
1701 },
1702 "[无语]": {
1703 path: "baozi/emjoy-无语.png",
1704 url: "https://img.guihuazhi.com/image/hz/1c/e8/1ce8040edaa53cf62125992dfb4f809av64x64.png",
1705 size: 4595,
1706 extra: {
1707 format: "png",
1708 width: 64,
1709 height: 64
1710 }
1711 },
1712 "[亲]": {
1713 path: "baozi/emjoy-亲.png",
1714 url: "https://img.guihuazhi.com/image/hz/8c/d2/8cd2afab975c05d3f3032edebd51bbecv64x64.png",
1715 size: 4212,
1716 extra: {
1717 format: "png",
1718 width: 64,
1719 height: 64
1720 }
1721 },
1722 "[送花]": {
1723 path: "baozi/emjoy-送花.png",
1724 url: "https://img.guihuazhi.com/image/hz/26/a7/26a72e449320a256da34208fcc22b8c9v64x64.png",
1725 size: 4979,
1726 extra: {
1727 format: "png",
1728 width: 64,
1729 height: 64
1730 }
1731 },
1732 "[鄙视你]": {
1733 path: "baozi/emjoy-鄙视.png",
1734 url: "https://img.guihuazhi.com/image/hz/5b/39/5b398b001f3a04f08c981b85c8f0656cv64x64.png",
1735 size: 4681,
1736 extra: {
1737 format: "png",
1738 width: 64,
1739 height: 64
1740 }
1741 },
1742 "[敲死你]": {
1743 path: "baozi/emjoy-敲死你.png",
1744 url: "https://img.guihuazhi.com/image/hz/e5/cc/e5cc14f7a9f4541bde668bb464504004v64x64.png",
1745 size: 5008,
1746 extra: {
1747 format: "png",
1748 width: 64,
1749 height: 64
1750 }
1751 },
1752 "[飞吻]": {
1753 path: "baozi/emjoy-飞吻.png",
1754 url: "https://img.guihuazhi.com/image/hz/27/11/27118e2567041c571d2cd1e172973cc7v64x64.png",
1755 size: 5297,
1756 extra: {
1757 format: "png",
1758 width: 64,
1759 height: 64
1760 }
1761 },
1762 "[好棒]": {
1763 path: "baozi/emjoy-好棒.png",
1764 url: "https://img.guihuazhi.com/image/hz/40/70/4070f5751ad5b0f08ffe6486ba417032v64x64.png",
1765 size: 4715,
1766 extra: {
1767 format: "png",
1768 width: 64,
1769 height: 64
1770 }
1771 },
1772 "[擦汗]": {
1773 path: "baozi/emjoy-擦汗.png",
1774 url: "https://img.guihuazhi.com/image/hz/3b/e8/3be8fcc14aa0233d43d9783ab961ee61v64x64.png",
1775 size: 4743,
1776 extra: {
1777 format: "png",
1778 width: 64,
1779 height: 64
1780 }
1781 },
1782 "[笑]": {
1783 path: "baozi/emjoy-笑.png",
1784 url: "https://img.guihuazhi.com/image/hz/c6/20/c620f03514d2c8c05e20417e0e9087abv64x64.png",
1785 size: 4827,
1786 extra: {
1787 format: "png",
1788 width: 64,
1789 height: 64
1790 }
1791 },
1792 "[白眼你]": {
1793 path: "baozi/emjoy-白眼.png",
1794 url: "https://img.guihuazhi.com/image/hz/06/2a/062a5f697e6beca419411f5f09d89758v64x64.png",
1795 size: 4302,
1796 extra: {
1797 format: "png",
1798 width: 64,
1799 height: 64
1800 }
1801 },
1802 "[睡着]": {
1803 path: "baozi/emjoy-睡着.png",
1804 url: "https://img.guihuazhi.com/image/hz/7f/be/7fbe368bc47e21776a2d6df8e4068098v64x64.png",
1805 size: 4960,
1806 extra: {
1807 format: "png",
1808 width: 64,
1809 height: 64
1810 }
1811 },
1812 "[不要]": {
1813 path: "baozi/emjoy-不要.png",
1814 url: "https://img.guihuazhi.com/image/hz/80/1c/801c3e81183c35bfc422e81840ac1ecav64x64.png",
1815 size: 4895,
1816 extra: {
1817 format: "png",
1818 width: 64,
1819 height: 64
1820 }
1821 },
1822 "[震惊]": {
1823 path: "baozi/emjoy-震惊.png",
1824 url: "https://img.guihuazhi.com/image/hz/e6/83/e6831e8d17570632b0ac8378b5eec126v64x64.png",
1825 size: 4719,
1826 extra: {
1827 format: "png",
1828 width: 64,
1829 height: 64
1830 }
1831 },
1832 "[你闭嘴]": {
1833 path: "baozi/emjoy-闭嘴.png",
1834 url: "https://img.guihuazhi.com/image/hz/6a/bc/6abcf5968d2071449c6badc10e985c97v64x64.png",
1835 size: 5114,
1836 extra: {
1837 format: "png",
1838 width: 64,
1839 height: 64
1840 }
1841 },
1842 "[很开心]": {
1843 path: "baozi/emjoy-开心.png",
1844 url: "https://img.guihuazhi.com/image/hz/49/78/49789caaab6d77bbfade89c36bdf035dv64x64.png",
1845 size: 4645,
1846 extra: {
1847 format: "png",
1848 width: 64,
1849 height: 64
1850 }
1851 },
1852 "[找死]": {
1853 path: "baozi/emjoy-找死.png",
1854 url: "https://img.guihuazhi.com/image/hz/32/93/3293d2021375bce4c8e5396b4389e18ev64x64.png",
1855 size: 5042,
1856 extra: {
1857 format: "png",
1858 width: 64,
1859 height: 64
1860 }
1861 },
1862 "[吆喝]": {
1863 path: "baozi/emjoy-吆喝.png",
1864 url: "https://img.guihuazhi.com/image/hz/ef/70/ef704a7456b786926c0e05363bf55f3dv64x64.png",
1865 size: 4920,
1866 extra: {
1867 format: "png",
1868 width: 64,
1869 height: 64
1870 }
1871 },
1872 "[恩恩]": {
1873 path: "baozi/emjoy-恩恩.png",
1874 url: "https://img.guihuazhi.com/image/hz/1b/89/1b89ea4f8b80b5e833dc3d10248d64fbv64x64.png",
1875 size: 4441,
1876 extra: {
1877 format: "png",
1878 width: 64,
1879 height: 64
1880 }
1881 },
1882 "[偷笑]": {
1883 path: "baozi/emjoy-偷笑.png",
1884 url: "https://img.guihuazhi.com/image/hz/71/6c/716c8524441c7f86d47f2dda9cbb9326v64x64.png",
1885 size: 4664,
1886 extra: {
1887 format: "png",
1888 width: 64,
1889 height: 64
1890 }
1891 },
1892 "[嘿嘿]": {
1893 path: "baozi/emjoy-嘿嘿.png",
1894 url: "https://img.guihuazhi.com/image/hz/93/91/9391104836222ea5cbdb1fa1788da78fv64x64.png",
1895 size: 5491,
1896 extra: {
1897 format: "png",
1898 width: 64,
1899 height: 64
1900 }
1901 },
1902 "[凶]": {
1903 path: "baozi/emjoy-凶.png",
1904 url: "https://img.guihuazhi.com/image/hz/77/61/7761acca1c11288106b39c747f4d2b96v64x64.png",
1905 size: 4791,
1906 extra: {
1907 format: "png",
1908 width: 64,
1909 height: 64
1910 }
1911 },
1912 "[色色地]": {
1913 path: "baozi/emjoy-色色地.png",
1914 url: "https://img.guihuazhi.com/image/hz/4a/22/4a22c81918e7c6ff94d7025f20f074e8v64x64.png",
1915 size: 5505,
1916 extra: {
1917 format: "png",
1918 width: 64,
1919 height: 64
1920 }
1921 },
1922 "[呼噜]": {
1923 path: "baozi/emjoy-呼噜.png",
1924 url: "https://img.guihuazhi.com/image/hz/93/a7/93a7e0afa57e46b72332b5d1dd4dc672v64x64.png",
1925 size: 4393,
1926 extra: {
1927 format: "png",
1928 width: 64,
1929 height: 64
1930 }
1931 },
1932 "[挑衅]": {
1933 path: "baozi/emjoy-挑衅.png",
1934 url: "https://img.guihuazhi.com/image/hz/5e/ca/5eca8ce7a7a7d8803ce37ab27c72e8c7v64x64.png",
1935 size: 4844,
1936 extra: {
1937 format: "png",
1938 width: 64,
1939 height: 64
1940 }
1941 },
1942 "[自转]": {
1943 path: "baozi/emjoy-自转.png",
1944 url: "https://img.guihuazhi.com/image/hz/3e/dd/3edd58fe54f1b1be9d74504818e74be8v64x64.png",
1945 size: 4255,
1946 extra: {
1947 format: "png",
1948 width: 64,
1949 height: 64
1950 }
1951 },
1952 "[猪]": {
1953 path: "baozi/emjoy-猪.png",
1954 url: "https://img.guihuazhi.com/image/hz/b0/46/b046909cdd98f2e5fe018dff5a88b555v64x64.png",
1955 size: 5309,
1956 extra: {
1957 format: "png",
1958 width: 64,
1959 height: 64
1960 }
1961 },
1962 "[困了]": {
1963 path: "baozi/emjoy-困.png",
1964 url: "https://img.guihuazhi.com/image/hz/f2/d2/f2d287b2c60984486429b716c5ebf1c8v64x64.png",
1965 size: 5342,
1966 extra: {
1967 format: "png",
1968 width: 64,
1969 height: 64
1970 }
1971 },
1972 "[骂]": {
1973 path: "baozi/emjoy-骂.png",
1974 url: "https://img.guihuazhi.com/image/hz/07/10/07108da97afa2270cba0d7601c378c90v64x64.png",
1975 size: 5196,
1976 extra: {
1977 format: "png",
1978 width: 64,
1979 height: 64
1980 }
1981 },
1982 "[不行]": {
1983 path: "baozi/emjoy-不行.png",
1984 url: "https://img.guihuazhi.com/image/hz/4a/d3/4ad3961fb0f3fd5717c8c134c1872336v64x64.png",
1985 size: 4388,
1986 extra: {
1987 format: "png",
1988 width: 64,
1989 height: 64
1990 }
1991 },
1992 "[鼓掌]": {
1993 path: "baozi/emjoy-鼓掌.png",
1994 url: "https://img.guihuazhi.com/image/hz/5c/7c/5c7cc145f650389fe87f44db2df68aeev64x64.png",
1995 size: 4776,
1996 extra: {
1997 format: "png",
1998 width: 64,
1999 height: 64
2000 }
2001 },
2002 "[挖鼻孔]": {
2003 path: "baozi/emjoy-挖鼻孔.png",
2004 url: "https://img.guihuazhi.com/image/hz/59/a0/59a08ddfea1f8d9a50bdbd0892256abev64x64.png",
2005 size: 4532,
2006 extra: {
2007 format: "png",
2008 width: 64,
2009 height: 64
2010 }
2011 },
2012 "[问号]": {
2013 path: "baozi/emjoy-问号.png",
2014 url: "https://img.guihuazhi.com/image/hz/93/0c/930c4ffd65c70ccd1170d54168b3c345v64x64.png",
2015 size: 5442,
2016 extra: {
2017 format: "png",
2018 width: 64,
2019 height: 64
2020 }
2021 },
2022 "[翻滚]": {
2023 path: "baozi/emjoy-翻滚.png",
2024 url: "https://img.guihuazhi.com/image/hz/99/55/99550b55b88603da86b91bd92afdef6bv64x64.png",
2025 size: 4404,
2026 extra: {
2027 format: "png",
2028 width: 64,
2029 height: 64
2030 }
2031 },
2032 "[红牌]": {
2033 path: "baozi/emjoy-红牌.png",
2034 url: "https://img.guihuazhi.com/image/hz/8d/9c/8d9cad073bf6e0fbed169099a1c28566v64x64.png",
2035 size: 4390,
2036 extra: {
2037 format: "png",
2038 width: 64,
2039 height: 64
2040 }
2041 },
2042 "[哭闹]": {
2043 path: "baozi/emjoy-哭闹.png",
2044 url: "https://img.guihuazhi.com/image/hz/47/6b/476b73654b30b2a8cb9ea796287deb0av64x64.png",
2045 size: 5479,
2046 extra: {
2047 format: "png",
2048 width: 64,
2049 height: 64
2050 }
2051 },
2052 "[路过]": {
2053 path: "baozi/emjoy-路过.png",
2054 url: "https://img.guihuazhi.com/image/hz/0e/b3/0eb350c7b1bddc516fc3e3b750047bc0v64x64.png",
2055 size: 5660,
2056 extra: {
2057 format: "png",
2058 width: 64,
2059 height: 64
2060 }
2061 },
2062 "[怒吼]": {
2063 path: "baozi/emjoy-怒吼.png",
2064 url: "https://img.guihuazhi.com/image/hz/1f/53/1f53c920f7e8e6129aa9432aa5f926e3v64x64.png",
2065 size: 5396,
2066 extra: {
2067 format: "png",
2068 width: 64,
2069 height: 64
2070 }
2071 },
2072 "[嘲笑]": {
2073 path: "baozi/emjoy-嘲笑.png",
2074 url: "https://img.guihuazhi.com/image/hz/9a/7b/9a7b09f98ef03b62bca4d416c9d3ddfev64x64.png",
2075 size: 5429,
2076 extra: {
2077 format: "png",
2078 width: 64,
2079 height: 64
2080 }
2081 },
2082 "[飘过]": {
2083 path: "baozi/emjoy-飘过.png",
2084 url: "https://img.guihuazhi.com/image/hz/d0/63/d0631ab1b36b4f182d06093f9dfb582bv64x64.png",
2085 size: 4668,
2086 extra: {
2087 format: "png",
2088 width: 64,
2089 height: 64
2090 }
2091 },
2092 "[扇扇子]": {
2093 path: "baozi/emjoy-扇扇子.png",
2094 url: "https://img.guihuazhi.com/image/hz/5f/29/5f299c9d356e090898ce08116c7a4544v64x64.png",
2095 size: 5340,
2096 extra: {
2097 format: "png",
2098 width: 64,
2099 height: 64
2100 }
2101 },
2102 "[狂暴]": {
2103 path: "baozi/emjoy-狂暴.png",
2104 url: "https://img.guihuazhi.com/image/hz/19/b1/19b19674d569dbe681a3975245b3047fv64x64.png",
2105 size: 5834,
2106 extra: {
2107 format: "png",
2108 width: 64,
2109 height: 64
2110 }
2111 },
2112 "[拽]": {
2113 path: "baozi/emjoy-拽.png",
2114 url: "https://img.guihuazhi.com/image/hz/af/e6/afe6b79595f1a44fcb6a8f36809d0f45v64x64.png",
2115 size: 4842,
2116 extra: {
2117 format: "png",
2118 width: 64,
2119 height: 64
2120 }
2121 },
2122 "[真爱]": {
2123 path: "baozi/emjoy-真爱.png",
2124 url: "https://img.guihuazhi.com/image/hz/9f/75/9f757c37b05ac6999a397c36f2ffe446v64x64.png",
2125 size: 4942,
2126 extra: {
2127 format: "png",
2128 width: 64,
2129 height: 64
2130 }
2131 },
2132 "[亮瞎]": {
2133 path: "baozi/emjoy-亮瞎.png",
2134 url: "https://img.guihuazhi.com/image/hz/91/79/917982eaab84c5681196b97a1a14ff78v64x64.png",
2135 size: 4312,
2136 extra: {
2137 format: "png",
2138 width: 64,
2139 height: 64
2140 }
2141 },
2142 "[吐]": {
2143 path: "baozi/emjoy-吐.png",
2144 url: "https://img.guihuazhi.com/image/hz/4c/12/4c12f13b64ce04c0d2501b119c2b5076v64x64.png",
2145 size: 4634,
2146 extra: {
2147 format: "png",
2148 width: 64,
2149 height: 64
2150 }
2151 },
2152 "[拍拍头]": {
2153 path: "baozi/emjoy-拍拍头.png",
2154 url: "https://img.guihuazhi.com/image/hz/d3/f7/d3f711bff015f336f2fe731c8ff4a3d7v64x64.png",
2155 size: 5684,
2156 extra: {
2157 format: "png",
2158 width: 64,
2159 height: 64
2160 }
2161 },
2162 "[很愤怒]": {
2163 path: "baozi/emjoy-愤怒.png",
2164 url: "https://img.guihuazhi.com/image/hz/f5/bd/f5bd9bf217272c8cdc63a9d8b7b92168v64x64.png",
2165 size: 4724,
2166 extra: {
2167 format: "png",
2168 width: 64,
2169 height: 64
2170 }
2171 },
2172 "[不屑]": {
2173 path: "baozi/emjoy-不屑.png",
2174 url: "https://img.guihuazhi.com/image/hz/21/b6/21b616be233ead2c7fa4630bc6d59534v64x64.png",
2175 size: 4489,
2176 extra: {
2177 format: "png",
2178 width: 64,
2179 height: 64
2180 }
2181 },
2182 "[思考]": {
2183 path: "baozi/emjoy-思考.png",
2184 url: "https://img.guihuazhi.com/image/hz/da/f0/daf01c4ffc8c097c351d9257992a065fv64x64.png",
2185 size: 5280,
2186 extra: {
2187 format: "png",
2188 width: 64,
2189 height: 64
2190 }
2191 },
2192 "[吃萝卜]": {
2193 path: "baozi/emjoy-吃萝卜.png",
2194 url: "https://img.guihuazhi.com/image/hz/88/b8/88b805601afc3b6cf848c9a3f2ed6ac2v64x64.png",
2195 size: 5483,
2196 extra: {
2197 format: "png",
2198 width: 64,
2199 height: 64
2200 }
2201 },
2202 "[领悟]": {
2203 path: "baozi/emjoy-领悟.png",
2204 url: "https://img.guihuazhi.com/image/hz/db/9c/db9c0fb724a51b45ca50a30e0a5aceb2v64x64.png",
2205 size: 5163,
2206 extra: {
2207 format: "png",
2208 width: 64,
2209 height: 64
2210 }
2211 },
2212 "[不好意思]": {
2213 path: "baozi/emjoy-不好意思.png",
2214 url: "https://img.guihuazhi.com/image/hz/0d/80/0d809d00308faf23430dfbde83b150cev64x64.png",
2215 size: 4845,
2216 extra: {
2217 format: "png",
2218 width: 64,
2219 height: 64
2220 }
2221 },
2222 "[平常心]": {
2223 path: "face/emjoy-平常心.png",
2224 url: "https://img.guihuazhi.com/image/hz/8c/a5/8ca59a7a58427bc539fc80b12b258c97v64x64.png",
2225 size: 5169,
2226 extra: {
2227 format: "png",
2228 width: 64,
2229 height: 64
2230 }
2231 },
2232 "[无趣]": {
2233 path: "face/emjoy-无趣.png",
2234 url: "https://img.guihuazhi.com/image/hz/e0/d9/e0d9296d0b98e3609612fde62992dc88v64x64.png",
2235 size: 5265,
2236 extra: {
2237 format: "png",
2238 width: 64,
2239 height: 64
2240 }
2241 },
2242 "[色]": {
2243 path: "face/emjoy-色.png",
2244 url: "https://img.guihuazhi.com/image/hz/7a/8c/7a8c7d606cc04871b3902aac704b4e53v64x64.png",
2245 size: 6612,
2246 extra: {
2247 format: "png",
2248 width: 64,
2249 height: 64
2250 }
2251 },
2252 "[酷]": {
2253 path: "face/emjoy-酷.png",
2254 url: "https://img.guihuazhi.com/image/hz/a3/1b/a31bf3fb6a18467844a749f2191eb347v64x64.png",
2255 size: 5259,
2256 extra: {
2257 format: "png",
2258 width: 64,
2259 height: 64
2260 }
2261 },
2262 "[发呆]": {
2263 path: "face/emjoy-发呆.png",
2264 url: "https://img.guihuazhi.com/image/hz/df/ef/dfef50f2db2df97a9d4fcfd5e182cd25v64x64.png",
2265 size: 5559,
2266 extra: {
2267 format: "png",
2268 width: 64,
2269 height: 64
2270 }
2271 },
2272 "[流泪]": {
2273 path: "face/emjoy-流泪.png",
2274 url: "https://img.guihuazhi.com/image/hz/eb/34/eb349d6d71ec644f38e99715f2bdf1f8v64x64.png",
2275 size: 5594,
2276 extra: {
2277 format: "png",
2278 width: 64,
2279 height: 64
2280 }
2281 },
2282 "[坏笑]": {
2283 path: "face/emjoy-坏笑.png",
2284 url: "https://img.guihuazhi.com/image/hz/2a/0a/2a0a0eb3827fa5366b7989d11e768c1cv64x64.png",
2285 size: 5267,
2286 extra: {
2287 format: "png",
2288 width: 64,
2289 height: 64
2290 }
2291 },
2292 "[别理我]": {
2293 path: "face/emjoy-别理我.png",
2294 url: "https://img.guihuazhi.com/image/hz/e7/7a/e77ade1ed275f5d1d225def2f52c7ea5v64x64.png",
2295 size: 5359,
2296 extra: {
2297 format: "png",
2298 width: 64,
2299 height: 64
2300 }
2301 },
2302 "[鄙视]": {
2303 path: "face/emjoy-鄙视.png",
2304 url: "https://img.guihuazhi.com/image/hz/fb/c0/fbc08fb69773ad29bc7c11bc86cb16f6v64x64.png",
2305 size: 5499,
2306 extra: {
2307 format: "png",
2308 width: 64,
2309 height: 64
2310 }
2311 },
2312 "[白眼]": {
2313 path: "face/emjoy-白眼.png",
2314 url: "https://img.guihuazhi.com/image/hz/3a/7d/3a7dbb8d7e84ef0e95c81ce75edfd728v64x64.png",
2315 size: 5352,
2316 extra: {
2317 format: "png",
2318 width: 64,
2319 height: 64
2320 }
2321 },
2322 "[糗大了]": {
2323 path: "face/emjoy-糗大了.png",
2324 url: "https://img.guihuazhi.com/image/hz/8c/e7/8ce7dc9570d687f6fc5c94e249057e02v64x64.png",
2325 size: 5893,
2326 extra: {
2327 format: "png",
2328 width: 64,
2329 height: 64
2330 }
2331 },
2332 "[愤怒]": {
2333 path: "face/emjoy-愤怒.png",
2334 url: "https://img.guihuazhi.com/image/hz/88/c5/88c52cadd197b0d3c4d78575b66aecacv64x64.png",
2335 size: 5892,
2336 extra: {
2337 format: "png",
2338 width: 64,
2339 height: 64
2340 }
2341 },
2342 "[开心]": {
2343 path: "face/emjoy-开心.png",
2344 url: "https://img.guihuazhi.com/image/hz/16/78/1678448ce7c7a888cccdc174b2af1904v64x64.png",
2345 size: 5223,
2346 extra: {
2347 format: "png",
2348 width: 64,
2349 height: 64
2350 }
2351 },
2352 "[抠鼻]": {
2353 path: "face/emjoy-抠鼻.png",
2354 url: "https://img.guihuazhi.com/image/hz/d9/4b/d94b15fcd0b656d8215e7838456e2dc5v64x64.png",
2355 size: 5974,
2356 extra: {
2357 format: "png",
2358 width: 64,
2359 height: 64
2360 }
2361 },
2362 "[惊恐]": {
2363 path: "face/emjoy-惊恐.png",
2364 url: "https://img.guihuazhi.com/image/hz/f6/02/f6020c7607143e0926b12d9cd5b37c10v64x64.png",
2365 size: 5820,
2366 extra: {
2367 format: "png",
2368 width: 64,
2369 height: 64
2370 }
2371 },
2372 "[石化]": {
2373 path: "face/emjoy-石化.png",
2374 url: "https://img.guihuazhi.com/image/hz/60/aa/60aa69303a9f074fb057c456447a8fa3v64x64.png",
2375 size: 4659,
2376 extra: {
2377 format: "png",
2378 width: 64,
2379 height: 64
2380 }
2381 },
2382 "[叹气]": {
2383 path: "face/emjoy-叹气.png",
2384 url: "https://img.guihuazhi.com/image/hz/82/cb/82cbc293f830d5aaa72796c468a3679av64x64.png",
2385 size: 5876,
2386 extra: {
2387 format: "png",
2388 width: 64,
2389 height: 64
2390 }
2391 },
2392 "[衰]": {
2393 path: "face/emjoy-衰.png",
2394 url: "https://img.guihuazhi.com/image/hz/dc/96/dc965db3071274c0c1d567a322676deav64x64.png",
2395 size: 5551,
2396 extra: {
2397 format: "png",
2398 width: 64,
2399 height: 64
2400 }
2401 },
2402 "[疑问]": {
2403 path: "face/emjoy-疑问.png",
2404 url: "https://img.guihuazhi.com/image/hz/f5/a6/f5a6b9b3b5102104562c9887e2d28374v64x64.png",
2405 size: 5778,
2406 extra: {
2407 format: "png",
2408 width: 64,
2409 height: 64
2410 }
2411 },
2412 "[兴奋]": {
2413 path: "face/emjoy-兴奋.png",
2414 url: "https://img.guihuazhi.com/image/hz/7b/e3/7be3cf9927f962ee9f596d00d48ddee2v64x64.png",
2415 size: 6223,
2416 extra: {
2417 format: "png",
2418 width: 64,
2419 height: 64
2420 }
2421 },
2422 "[傲慢]": {
2423 path: "face/emjoy-傲慢.png",
2424 url: "https://img.guihuazhi.com/image/hz/d5/22/d5223164691db6d3e7dc03007e84f282v64x64.png",
2425 size: 5653,
2426 extra: {
2427 format: "png",
2428 width: 64,
2429 height: 64
2430 }
2431 },
2432 "[得意]": {
2433 path: "face/emjoy-得意.png",
2434 url: "https://img.guihuazhi.com/image/hz/55/f1/55f145cf742908ccb670b7aeae8c7cfdv64x64.png",
2435 size: 6549,
2436 extra: {
2437 format: "png",
2438 width: 64,
2439 height: 64
2440 }
2441 },
2442 "[冷汗]": {
2443 path: "face/emjoy-冷汗.png",
2444 url: "https://img.guihuazhi.com/image/hz/5f/1a/5f1aa8089421458c0873805dec747255v64x64.png",
2445 size: 5767,
2446 extra: {
2447 format: "png",
2448 width: 64,
2449 height: 64
2450 }
2451 },
2452 "[天使]": {
2453 path: "face/emjoy-天使.png",
2454 url: "https://img.guihuazhi.com/image/hz/92/cc/92cc1af0df03eb287f891f207c4b1396v64x64.png",
2455 size: 6304,
2456 extra: {
2457 format: "png",
2458 width: 64,
2459 height: 64
2460 }
2461 },
2462 "[大哭]": {
2463 path: "face/emjoy-大哭.png",
2464 url: "https://img.guihuazhi.com/image/hz/7e/72/7e72b376fdc5ac4fcee2af225c1a0b9fv64x64.png",
2465 size: 6575,
2466 extra: {
2467 format: "png",
2468 width: 64,
2469 height: 64
2470 }
2471 },
2472 "[打脸]": {
2473 path: "face/emjoy-打脸.png",
2474 url: "https://img.guihuazhi.com/image/hz/ae/ab/aeab96044342108d821e98aadb2956ebv64x64.png",
2475 size: 6279,
2476 extra: {
2477 format: "png",
2478 width: 64,
2479 height: 64
2480 }
2481 },
2482 "[敬佩]": {
2483 path: "face/emjoy-敬佩.png",
2484 url: "https://img.guihuazhi.com/image/hz/58/a2/58a24c0fe38ae7143bb04e10c9929793v64x64.png",
2485 size: 6444,
2486 extra: {
2487 format: "png",
2488 width: 64,
2489 height: 64
2490 }
2491 },
2492 "[咒骂]": {
2493 path: "face/emjoy-咒骂.png",
2494 url: "https://img.guihuazhi.com/image/hz/7f/87/7f87183a0e4a9af49f5cbd3cbe87e8eev64x64.png",
2495 size: 6546,
2496 extra: {
2497 format: "png",
2498 width: 64,
2499 height: 64
2500 }
2501 },
2502 "[嘘]": {
2503 path: "face/emjoy-嘘.png",
2504 url: "https://img.guihuazhi.com/image/hz/d9/ff/d9ff83b65797aa08d0d51f4bee985e25v64x64.png",
2505 size: 6100,
2506 extra: {
2507 format: "png",
2508 width: 64,
2509 height: 64
2510 }
2511 },
2512 "[冲]": {
2513 path: "face/emjoy-冲.png",
2514 url: "https://img.guihuazhi.com/image/hz/9b/1d/9b1d95f25c257af5f0e0f6ee5c8dd8fbv64x64.png",
2515 size: 6444,
2516 extra: {
2517 format: "png",
2518 width: 64,
2519 height: 64
2520 }
2521 },
2522 "[尴尬]": {
2523 path: "face/emjoy-尴尬.png",
2524 url: "https://img.guihuazhi.com/image/hz/61/d3/61d3da3918898932dcc435c9b1d3083av64x64.png",
2525 size: 5847,
2526 extra: {
2527 format: "png",
2528 width: 64,
2529 height: 64
2530 }
2531 },
2532 "[伤不起]": {
2533 path: "face/emjoy-伤不起.png",
2534 url: "https://img.guihuazhi.com/image/hz/29/89/2989e7e4d558cd763c85d995aa8c0bd7v64x64.png",
2535 size: 6350,
2536 extra: {
2537 format: "png",
2538 width: 64,
2539 height: 64
2540 }
2541 },
2542 "[撇嘴]": {
2543 path: "face/emjoy-撇嘴.png",
2544 url: "https://img.guihuazhi.com/image/hz/62/db/62db4738d5a54028a382f44e8a132b00v64x64.png",
2545 size: 5911,
2546 extra: {
2547 format: "png",
2548 width: 64,
2549 height: 64
2550 }
2551 },
2552 "[憨笑]": {
2553 path: "face/emjoy-憨笑.png",
2554 url: "https://img.guihuazhi.com/image/hz/23/cb/23cb04762579f9913f0183be5b5cc5d7v64x64.png",
2555 size: 5467,
2556 extra: {
2557 format: "png",
2558 width: 64,
2559 height: 64
2560 }
2561 },
2562 "[难过]": {
2563 path: "face/emjoy-难过.png",
2564 url: "https://img.guihuazhi.com/image/hz/6b/d6/6bd6673be270329d309b31b5e39b2c35v64x64.png",
2565 size: 5764,
2566 extra: {
2567 format: "png",
2568 width: 64,
2569 height: 64
2570 }
2571 },
2572 "[困]": {
2573 path: "face/emjoy-困.png",
2574 url: "https://img.guihuazhi.com/image/hz/c4/67/c467ca3d60a10d55b13026c49ba86d7bv64x64.png",
2575 size: 5387,
2576 extra: {
2577 format: "png",
2578 width: 64,
2579 height: 64
2580 }
2581 },
2582 "[调皮]": {
2583 path: "face/emjoy-调皮.png",
2584 url: "https://img.guihuazhi.com/image/hz/19/a8/19a80696bf7c68a9c95aa3990c0177f6v64x64.png",
2585 size: 6517,
2586 extra: {
2587 format: "png",
2588 width: 64,
2589 height: 64
2590 }
2591 },
2592 "[奋斗]": {
2593 path: "face/emjoy-奋斗.png",
2594 url: "https://img.guihuazhi.com/image/hz/bb/d2/bbd21c056a793a1d9365d0192d26be36v64x64.png",
2595 size: 6832,
2596 extra: {
2597 format: "png",
2598 width: 64,
2599 height: 64
2600 }
2601 },
2602 "[再见]": {
2603 path: "face/emjoy-再见.png",
2604 url: "https://img.guihuazhi.com/image/hz/34/54/3454379bb9658cf9b319d567e133bbaev64x64.png",
2605 size: 5702,
2606 extra: {
2607 format: "png",
2608 width: 64,
2609 height: 64
2610 }
2611 },
2612 "[可怜]": {
2613 path: "face/emjoy-可怜.png",
2614 url: "https://img.guihuazhi.com/image/hz/e6/7c/e67c01fe0363c81e00b24d13efb88337v64x64.png",
2615 size: 6174,
2616 extra: {
2617 format: "png",
2618 width: 64,
2619 height: 64
2620 }
2621 },
2622 "[折磨]": {
2623 path: "face/emjoy-折磨.png",
2624 url: "https://img.guihuazhi.com/image/hz/56/92/5692711958868348b47138dfd1b0883ev64x64.png",
2625 size: 6439,
2626 extra: {
2627 format: "png",
2628 width: 64,
2629 height: 64
2630 }
2631 },
2632 "[闭嘴]": {
2633 path: "face/emjoy-闭嘴.png",
2634 url: "https://img.guihuazhi.com/image/hz/e4/7f/e47fb51a6158cf9cb69c4cabbda39ecfv64x64.png",
2635 size: 5845,
2636 extra: {
2637 format: "png",
2638 width: 64,
2639 height: 64
2640 }
2641 },
2642 "[恶心]": {
2643 path: "face/emjoy-恶心.png",
2644 url: "https://img.guihuazhi.com/image/hz/e0/d2/e0d23ce71c4de57f8d05e2f0bf42a632v64x64.png",
2645 size: 5220,
2646 extra: {
2647 format: "png",
2648 width: 64,
2649 height: 64
2650 }
2651 },
2652 "[快哭了]": {
2653 path: "face/emjoy-快哭了.png",
2654 url: "https://img.guihuazhi.com/image/hz/d4/7c/d47ce311e43b3783c4760d889e57f8dfv64x64.png",
2655 size: 5812,
2656 extra: {
2657 format: "png",
2658 width: 64,
2659 height: 64
2660 }
2661 },
2662 "[晕]": {
2663 path: "face/emjoy-晕.png",
2664 url: "https://img.guihuazhi.com/image/hz/f4/4d/f44d222f7efa39156bd4b1393e0a6244v64x64.png",
2665 size: 6848,
2666 extra: {
2667 format: "png",
2668 width: 64,
2669 height: 64
2670 }
2671 },
2672 "[砸头]": {
2673 path: "face/emjoy-砸头.png",
2674 url: "https://img.guihuazhi.com/image/hz/ea/16/ea16caf9f766961ace3480eb1a919d66v64x64.png",
2675 size: 6106,
2676 extra: {
2677 format: "png",
2678 width: 64,
2679 height: 64
2680 }
2681 },
2682 "[求带]": {
2683 path: "face/emjoy-求带.png",
2684 url: "https://img.guihuazhi.com/image/hz/44/b8/44b8c0218b74f1097b807dc8675d4e1bv64x64.png",
2685 size: 6194,
2686 extra: {
2687 format: "png",
2688 width: 64,
2689 height: 64
2690 }
2691 },
2692 "[惊讶]": {
2693 path: "face/emjoy-惊讶.png",
2694 url: "https://img.guihuazhi.com/image/hz/e0/08/e008246dedfe9cab397930193fb14dc4v64x64.png",
2695 size: 5624,
2696 extra: {
2697 format: "png",
2698 width: 64,
2699 height: 64
2700 }
2701 },
2702 "[睡觉]": {
2703 path: "face/emjoy-睡觉.png",
2704 url: "https://img.guihuazhi.com/image/hz/72/50/7250644d613fdf7a2eaecc72f4014527v64x64.png",
2705 size: 5526,
2706 extra: {
2707 format: "png",
2708 width: 64,
2709 height: 64
2710 }
2711 }
2712 };
2713
2714 /**
2715 * @type {boolean} 是否开发环境
2716 */
2717
2718 var isDev = false;
2719 /**
2720 * @type {boolean} 是是否服务端渲染
2721 */
2722
2723 var isSSR = false;
2724
2725 try {
2726 isDev = process.env && process.env.NODE_ENV === 'development';
2727 isSSR = process.env && process.env.VUE_ENV === 'server';
2728 } catch (e) {} //
2729
2730 /**
2731 * @type {Regexp} 判断是否合法图片
2732 */
2733
2734
2735 var validImageRegexp = /^(http|https):\/\/(imgtest|img)\.guihuazhi\.com\/[A-z0-9/.]*?$/;
2736 /**
2737 * @type {Regexp} 表情校验
2738 */
2739
2740 var validEmoji = /(\[[\u4e00-\u9fa5]{1,4}\])/g;
2741
2742 var Parse =
2743 /*#__PURE__*/
2744 function () {
2745 function Parse(option) {
2746 this.platform = option.platform;
2747 }
2748
2749 var _proto = Parse.prototype;
2750
2751 _proto.createElement = function createElement(d) {
2752 var _this = this;
2753
2754 if (isObject$1(d)) {
2755 var tag = d.tag,
2756 _d$attrs = d.attrs,
2757 attrs = _d$attrs === void 0 ? {} : _d$attrs,
2758 _d$child = d.child,
2759 child = _d$child === void 0 ? [] : _d$child,
2760 props = d.props,
2761 content = d.content;
2762 var node = document.createElement(tag);
2763 Object.keys(attrs).forEach(function (key) {
2764 node.setAttribute(key, attrs[key]);
2765 });
2766
2767 if (tag === 'img') {
2768 node = this.renderImageDom(props, attrs);
2769 }
2770
2771 if (tag === 'a') {
2772 node = this.renderLinkDom(props);
2773 }
2774
2775 if (content) {
2776 node.innerHTML = content;
2777 } else {
2778 child.forEach(function (c) {
2779 node.appendChild(_this.createElement(c));
2780 });
2781 }
2782
2783 return node;
2784 } else if (typeof d === 'string') {
2785 return document.createTextNode(d);
2786 }
2787 };
2788
2789 _proto.reset = function reset() {
2790 this.unbindImageEvents && this.unbindImageEvents();
2791 } // 懒加载图片
2792 ;
2793
2794 _proto.bindImageLazyLoad = function bindImageLazyLoad() {
2795 var _this2 = this;
2796
2797 this.clientHeight = window.screen.height;
2798 this.unbindImageEvents = addEvent(window, 'scroll', this.loadImageFunc.bind(this));
2799 setTimeout(function () {
2800 // 初始化时加载一次图片
2801 _this2.loadImageFunc();
2802 }, 0);
2803 } // 取消懒加载图片
2804 ;
2805
2806 _proto.unbindImageLazyLoad = function unbindImageLazyLoad() {
2807 this.unbindImageEvents();
2808 };
2809
2810 _proto.loadImageFunc = function loadImageFunc() {
2811 var _this3 = this;
2812
2813 (this.imageDoc = this.imageDoc || document.querySelectorAll(".huazhi.huazhi-" + this.platform + " img")).forEach(function (el) {
2814 if (el.getAttribute('src')) return;
2815 var src = el.dataset.src;
2816 var o = el.getBoundingClientRect();
2817
2818 if (o.top < _this3.clientHeight) {
2819 el.setAttribute('src', src);
2820 el.previousSibling.style.opacity = 0;
2821 }
2822 });
2823 }
2824 /**
2825 * dom-tree => html
2826 * @param {array<object>} tree
2827 */
2828 ;
2829
2830 _proto.renderDomTreeHTML = function renderDomTreeHTML(tree, platform) {
2831 var _this4 = this;
2832
2833 return tree.map(function (block) {
2834 switch (block.tag) {
2835 case 'h2':
2836 return "<h2>" + _this4.renderDomTreeHTML(block.child) + "</h2>";
2837
2838 case 'blockquote':
2839 return "<blockquote>" + _this4.renderDomTreeHTML(block.child) + "</blockquote>";
2840
2841 case 'p':
2842 return "<p>" + _this4.renderDomTreeHTML(block.child) + "</p>";
2843
2844 case 'b':
2845 return "<b>" + block.content + "</b>";
2846
2847 case 'i':
2848 return "<i style=\"background-image: url(" + block.props.url + ")\" emoji=\"" + block.props.emoji + "\"></i>";
2849
2850 case 'img':
2851 return _this4.renderImage(block.props, block.attrs);
2852
2853 case 'video':
2854 return _this4.renderVideo(block.props);
2855
2856 case 'hr':
2857 return '<hr />';
2858
2859 case 'a':
2860 return _this4.renderLink(block.props);
2861 // webview内禁止直接跳转
2862
2863 default:
2864 // 非兼容格式不做显示
2865 return isString(block) ? block : '';
2866 }
2867 }).join('');
2868 } // replaceBlock(block) {
2869 // return block.replace
2870 // }
2871
2872 /**
2873 * 针对web的文本解析处理
2874 * @param {array<object>} json
2875 * @return
2876 */
2877 ;
2878
2879 _proto.jsonToDomTree = function jsonToDomTree(json) {
2880 var results = [];
2881 var imageIndex = 0;
2882
2883 if (typeof json === 'string') {
2884 try {
2885 json = JSON.parse(json);
2886 } catch (e) {
2887 //
2888 return results;
2889 }
2890 }
2891
2892 for (var i = 0, l = json.length; i < l; i++) {
2893 var block = json[i];
2894
2895 if (block.type === 'text') {
2896 var tag = void 0;
2897
2898 if (block.head === 1) {
2899 tag = 'h2';
2900 } else if (block.block === 1) {
2901 tag = 'blockquote';
2902 } else {
2903 tag = 'p';
2904 }
2905
2906 var child = this.parseInline(block.value);
2907 results.push({
2908 tag: tag,
2909 child: child
2910 });
2911 } else if (block.type === 'image' && this.isImage(block)) {
2912 results.push({
2913 tag: 'img',
2914 attrs: {
2915 src: block.url,
2916 index: imageIndex++
2917 },
2918 props: block
2919 });
2920 } else if (block.type === 'line') {
2921 results.push({
2922 tag: 'hr'
2923 });
2924 } else if (block.type === 'video') {
2925 results.push({
2926 tag: 'video',
2927 props: block
2928 });
2929 }
2930 }
2931
2932 return results;
2933 }
2934 /**
2935 * 评论中的文本解析
2936 * @param {string} str 评论文本
2937 * @return {string} html文本
2938 */
2939 ;
2940
2941 _proto.parseComment = function parseComment(str) {
2942 var result = this.parseEmoji(str);
2943 var html = this.renderDomTreeHTML(result, this.platform);
2944 return html;
2945 }
2946 /**
2947 * json => html
2948 * @param {string|array<object>} json 原始json数据 | 数组结构
2949 * @param {string} platform 平台 web | mobile | webview | editor
2950 * @param {HTMLElement} wrapperDom 是否返回document对象
2951 * @param {number} containerWidth 容器宽度
2952 * @return {string|HTMLElement} html字符串/document对象
2953 */
2954 ;
2955
2956 _proto.jsonToHTML = function jsonToHTML(json, wrapperDom, containerWidth) {
2957 if (containerWidth === void 0) {
2958 containerWidth = 0;
2959 }
2960
2961 // json解析
2962 if (typeof json === 'string') {
2963 try {
2964 json = JSON.parse(json);
2965 } catch (e) {
2966 if (isDev) throw new Error('json type error');
2967 return '';
2968 }
2969 }
2970
2971 var tree = this.jsonToDomTree(json); // console.log('tree', JSON.parse(JSON.stringify(tree)))
2972
2973 var html = this.renderDomTreeHTML(tree, this.platform, containerWidth); // ssr环境或者editor直接返回html
2974
2975 if (isSSR || this.platform === 'editor') {
2976 return html;
2977 }
2978
2979 if (wrapperDom) {
2980 wrapperDom.classList.add('huazhi', "huazhi-" + this.platform);
2981 wrapperDom.innerHTML = html;
2982 } // 移动端初始化
2983
2984
2985 if (this.lazyLoad) {
2986 this.bindImageLazyLoad();
2987 }
2988
2989 if (this.initEvents && typeof this.initEvents === 'function') {
2990 this.initEvents();
2991 }
2992
2993 return wrapperDom ? wrapperDom : html;
2994 };
2995
2996 _proto.renderText = function renderText(value) {
2997 var html = '';
2998 var length = value.length;
2999
3000 for (var i = 0; i < length; i++) {
3001 var v = value[i];
3002
3003 if (v.bold) {
3004 html += "<strong>" + v.content + "</strong>";
3005 } else if (v.type === 'link') {
3006 html += "" + this.renderLink(v);
3007 } else {
3008 html += "" + v.content;
3009 }
3010 }
3011
3012 if (length === 0) {
3013 html = '<br>';
3014 }
3015
3016 return html;
3017 };
3018
3019 _proto.renderBlock = function renderBlock(o) {
3020 var classStr = o.center ? "class='ql-align-center'" : '';
3021
3022 if (o.head) {
3023 return "<h2 " + classStr + ">" + this.renderText(o.value) + "</h2>";
3024 } else if (o.block) {
3025 return "<blockquote " + classStr + ">" + this.renderText(o.value) + "</blockquote>";
3026 } else {
3027 return "<p " + classStr + ">" + this.renderText(o.value) + "</p>";
3028 }
3029 };
3030
3031 _proto.renderLine = function renderLine() {
3032 return "<hr />";
3033 };
3034
3035 _proto.renderList = function renderList(o) {
3036 var html = '';
3037 var liList = '';
3038 var length = o.value.length;
3039
3040 for (var i = 0; i < length; i++) {
3041 var v = o.value[i];
3042 liList += "<li>" + this.renderText(v) + "</li>";
3043 }
3044
3045 if (o.type === 'ol') {
3046 html = "<ol>" + liList + "</ol>";
3047 } else if (o.type === 'ul') {
3048 html = "<ul>" + liList + "</ul>";
3049 }
3050
3051 return html;
3052 }
3053 /**
3054 * json => html
3055 * @param {string|array<object>} json 原始json数据 | 数组结构
3056 * @param {string} platform 平台 web | mobile | webview | editor
3057 * @param {HTMLElement} wrapperDom 是否返回document对象
3058 * @param {number} containerWidth 容器宽度
3059 * @return {string|HTMLElement} html字符串/document对象
3060 */
3061 ;
3062
3063 _proto.jsonToHTML2 = function jsonToHTML2(json, wrapperDom, containerWidth) {
3064 if (containerWidth === void 0) {
3065 containerWidth = 0;
3066 }
3067
3068 // json解析
3069 if (typeof json === 'string') {
3070 try {
3071 json = JSON.parse(json);
3072 } catch (e) {
3073 if (isDev) throw new Error('json type error');
3074 return '';
3075 }
3076 } // const renderMap = {
3077 // 'text': this.renderBlock,
3078 // 'line': this.renderLine,
3079 // 'image': this.renderImage,
3080 // 'video': this.renderVideo,
3081 // 'ul': this.renderList,
3082 // 'ol': this.renderList,
3083 // };
3084
3085
3086 var html = '';
3087 var length = json.length;
3088
3089 for (var i = 0; i < length; i++) {
3090 var j = json[i];
3091 var type = j.type;
3092
3093 if (type === 'text') {
3094 html += this.renderBlock(j);
3095 } else if (type === 'line') {
3096 html += this.renderLine(j);
3097 } else if (type === 'image') {
3098 html += this.renderImage(j);
3099 } else if (type === 'video') {
3100 html += this.renderVideo(j);
3101 } else if (type === 'ul' || type === 'ol') {
3102 html += this.renderList(j);
3103 } else {
3104 if (j.content) {
3105 html += "<p>" + json[i].content + "</p>";
3106 }
3107
3108 html += this.renderLine(j);
3109 }
3110 }
3111
3112 if (this.initEvents && typeof this.initEvents === 'function') {
3113 // webview绑定事件
3114 this.initEvents();
3115 }
3116
3117 return html;
3118 }
3119 /**
3120 * 解析表情
3121 * @param {string} 原始文本
3122 * @return {array<object|string>} 表情字符串数组
3123 */
3124 ;
3125
3126 _proto.parseEmoji = function parseEmoji(text) {
3127 if (typeof text !== 'string') return '';
3128 var results = [];
3129 var splitIndex = 0;
3130 var tmp;
3131
3132 while (tmp = validEmoji.exec(text)) {
3133 var _tmp = tmp,
3134 emojiName = _tmp[0],
3135 startIndex = _tmp.index;
3136 var lastIndex = validEmoji.lastIndex; // 若表情存在
3137
3138 if (EMOJIMAP[emojiName]) {
3139 results.push(text.substring(splitIndex, startIndex));
3140 results.push({
3141 tag: 'i',
3142 props: {
3143 emoji: emojiName,
3144 url: EMOJIMAP[emojiName].url
3145 },
3146 attr: {}
3147 }); // 修改下次截取位置
3148
3149 splitIndex = lastIndex;
3150 }
3151 } // 末尾处理
3152
3153
3154 if (splitIndex < text.length) {
3155 results.push(text.substring(splitIndex));
3156 }
3157
3158 return results;
3159 }
3160 /**
3161 * 解析行内文本
3162 * @param {array<object>} 行内文本数组
3163 * @param {string} platform
3164 */
3165 ;
3166
3167 _proto.parseInline = function parseInline(inlineList) {
3168 var results = [];
3169
3170 for (var j = 0, l = inlineList.length; j < l; j++) {
3171 var inline = inlineList[j];
3172
3173 if (inline.type === 'string') {
3174 if (this.platform === 'editor') {
3175 // 编辑器连续换行bug
3176 if (j === inlineList.length - 1) {
3177 if (inline.content.endsWith('\n') || inline.content.endsWith('\r\n')) {
3178 inline.content = inline.content.slice(0, -1);
3179 }
3180 }
3181 }
3182
3183 if (inline.bold === 1) {
3184 // 加粗文本
3185 results.push({
3186 tag: 'b',
3187 attr: {},
3188 content: inline.content
3189 });
3190 } else {
3191 // 纯文本
3192 results.push.apply(results, this.parseEmoji(inline.content));
3193 }
3194 } else if (inline.type === 'link') {
3195 results.push({
3196 tag: 'a',
3197 props: Object.assign({}, inline)
3198 });
3199 }
3200 }
3201
3202 return results;
3203 }
3204 /**
3205 * 校验是否合法图片
3206 * @param {object} image 上传获得image对象
3207 * @return {boolean} 检测结果
3208 */
3209 ;
3210
3211 _proto.isImage = function isImage(image) {
3212 return isObject$1(image) && typeof image.url === 'string' && validImageRegexp.test(image.url);
3213 }
3214 /**
3215 * html => json
3216 * 富文本编辑内容格式化
3217 * @param {string|object} source html字符串/detail结构
3218 * @param {boolean} isOps 是否quill的detail结构
3219 * @param {boolean} isJSonString 是否转为json-string
3220 * @return {array<object>} j
3221 */
3222 ;
3223
3224 _proto.htmlToJSON = function htmlToJSON(source, isOps, isJSonString) {
3225 if (isJSonString === void 0) {
3226 isJSonString = true;
3227 }
3228
3229 if (isUndefined(source) || !isString(source) && !isArray(source)) {
3230 if (isDev) throw new Error('source must be a string type or quill detail');
3231 return isJSonString ? '[]' : [];
3232 }
3233
3234 var results = [];
3235 return results;
3236 };
3237
3238 return Parse;
3239 }();
3240
3241 var WebRich =
3242 /*#__PURE__*/
3243 function (_Parse) {
3244 _inheritsLoose(WebRich, _Parse);
3245
3246 function WebRich(option) {
3247 var _this;
3248
3249 _this = _Parse.call(this, option) || this;
3250 _this.platform = option.platform;
3251 _this.containerWidth = option.width;
3252 return _this;
3253 }
3254
3255 var _proto = WebRich.prototype;
3256
3257 _proto.renderImage = function renderImage(props) {
3258 var _computedImageSize = computedImageSize(+props.width, +props.height, this.containerWidth),
3259 width = _computedImageSize.width,
3260 height = _computedImageSize.height;
3261
3262 return "<p><img style=\"width:" + width + "px;\" src=\"" + props.url + "\">" + (props.desc && props.desc !== '' ? "<span>" + props.desc + "</span>" : '') + "</p>";
3263 };
3264
3265 _proto.renderLink = function renderLink(props) {
3266 return "<a href=\"" + (props.route.webUrl || props.route.webURL) + "\" target=\"_blank\">" + props.content + "</a>";
3267 };
3268
3269 _proto.renderVideo = function renderVideo(props) {
3270 return "<video width=\"600\" height=\"400\" controls=\"controls\">\n <source src=\"" + props.url + "\">\n </video>"; // return `<video url="${props.url}" controls="${props.controls}" width="600" height="400" webkit-playsinline="true" playsinline="true" x5-playsinline="true"></video>`;
3271 };
3272
3273 return WebRich;
3274 }(Parse);
3275
3276 return WebRich;
3277
3278}));