dash-button-web 0.0.21 → 0.0.23-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/app-globals-cd54EKuF.js +15 -0
- package/dist/cjs/dash-button.cjs.entry.js +2189 -2074
- package/dist/cjs/index-BfwSK14n.js +1507 -0
- package/dist/cjs/index.cjs.js +0 -2
- package/dist/cjs/loader.cjs.js +5 -7
- package/dist/cjs/web-compnont.cjs.js +15 -15
- package/dist/collection/collection-manifest.json +5 -3
- package/dist/collection/components/my-component/dash-button.js +134 -38
- package/dist/collection/global/app.js +7 -0
- package/dist/collection/index.js +0 -1
- package/dist/collection/services/config.js +2 -1
- package/dist/collection/services/menu.js +18 -5
- package/dist/components/dash-button.js +1 -4233
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +1 -3
- package/dist/esm/app-globals-B2hgy9FG.js +13 -0
- package/dist/esm/dash-button.entry.js +2189 -2072
- package/dist/esm/index-6_Ga3Eox.js +1499 -0
- package/dist/esm/index.js +0 -2
- package/dist/esm/loader.js +6 -6
- package/dist/esm/web-compnont.js +15 -14
- package/dist/types/components/my-component/dash-button.d.ts +3 -0
- package/dist/types/components.d.ts +75 -3
- package/dist/types/global/app.d.ts +2 -0
- package/dist/types/services/config.d.ts +2 -0
- package/dist/types/stencil-public-runtime.d.ts +268 -70
- package/dist/web-compnont/index.esm.js +0 -2
- package/dist/web-compnont/p-39949e8a.entry.js +1 -0
- package/dist/web-compnont/p-6_Ga3Eox.js +3 -0
- package/dist/web-compnont/p-DiU1T8CW.js +1 -0
- package/dist/web-compnont/web-compnont.esm.js +1 -2
- package/loader/cdn.js +1 -3
- package/loader/index.cjs.js +1 -3
- package/loader/index.d.ts +4 -1
- package/loader/index.es2017.js +1 -3
- package/loader/index.js +1 -3
- package/package.json +3 -2
- package/readme.md +43 -19
- package/dist/cjs/dash-button.cjs.entry.js.map +0 -1
- package/dist/cjs/index-87d4993d.js +0 -1793
- package/dist/cjs/index-87d4993d.js.map +0 -1
- package/dist/cjs/index.cjs.js.map +0 -1
- package/dist/cjs/loader.cjs.js.map +0 -1
- package/dist/cjs/web-compnont.cjs.js.map +0 -1
- package/dist/collection/components/my-component/dash-button.e2e.js +0 -26
- package/dist/collection/components/my-component/dash-button.e2e.js.map +0 -1
- package/dist/collection/components/my-component/dash-button.js.map +0 -1
- package/dist/collection/components/my-component/dash-button.spec.js +0 -35
- package/dist/collection/components/my-component/dash-button.spec.js.map +0 -1
- package/dist/collection/index.js.map +0 -1
- package/dist/collection/services/config.js.map +0 -1
- package/dist/collection/services/menu.js.map +0 -1
- package/dist/components/dash-button.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/esm/dash-button.entry.js.map +0 -1
- package/dist/esm/index-e3df5eaf.js +0 -1766
- package/dist/esm/index-e3df5eaf.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/loader.js.map +0 -1
- package/dist/esm/polyfills/core-js.js +0 -11
- package/dist/esm/polyfills/dom.js +0 -79
- package/dist/esm/polyfills/es5-html-element.js +0 -1
- package/dist/esm/polyfills/index.js +0 -34
- package/dist/esm/polyfills/system.js +0 -6
- package/dist/esm/web-compnont.js.map +0 -1
- package/dist/web-compnont/index.esm.js.map +0 -1
- package/dist/web-compnont/p-c1ec12fe.js +0 -3
- package/dist/web-compnont/p-c1ec12fe.js.map +0 -1
- package/dist/web-compnont/p-fc02a292.entry.js +0 -10
- package/dist/web-compnont/p-fc02a292.entry.js.map +0 -1
- package/dist/web-compnont/web-compnont.esm.js.map +0 -1
- package/loader/package.json +0 -11
|
@@ -1,10 +1,24 @@
|
|
|
1
|
-
import { r as registerInstance, h, g as getElement } from './index-
|
|
1
|
+
import { r as registerInstance, h, g as getElement } from './index-6_Ga3Eox.js';
|
|
2
2
|
|
|
3
3
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
4
4
|
|
|
5
|
+
function getDefaultExportFromCjs (x) {
|
|
6
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
7
|
+
}
|
|
8
|
+
|
|
5
9
|
function getAugmentedNamespace(n) {
|
|
6
|
-
|
|
7
|
-
|
|
10
|
+
if (n.__esModule) return n;
|
|
11
|
+
var f = n.default;
|
|
12
|
+
if (typeof f == "function") {
|
|
13
|
+
var a = function a () {
|
|
14
|
+
if (this instanceof a) {
|
|
15
|
+
return Reflect.construct(f, arguments, this.constructor);
|
|
16
|
+
}
|
|
17
|
+
return f.apply(this, arguments);
|
|
18
|
+
};
|
|
19
|
+
a.prototype = f.prototype;
|
|
20
|
+
} else a = {};
|
|
21
|
+
Object.defineProperty(a, '__esModule', {value: true});
|
|
8
22
|
Object.keys(n).forEach(function (k) {
|
|
9
23
|
var d = Object.getOwnPropertyDescriptor(n, k);
|
|
10
24
|
Object.defineProperty(a, k, d.get ? d : {
|
|
@@ -19,165 +33,176 @@ function getAugmentedNamespace(n) {
|
|
|
19
33
|
|
|
20
34
|
var base64Js = {};
|
|
21
35
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
revLookup[
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
36
|
+
var hasRequiredBase64Js;
|
|
37
|
+
|
|
38
|
+
function requireBase64Js () {
|
|
39
|
+
if (hasRequiredBase64Js) return base64Js;
|
|
40
|
+
hasRequiredBase64Js = 1;
|
|
41
|
+
|
|
42
|
+
base64Js.byteLength = byteLength;
|
|
43
|
+
base64Js.toByteArray = toByteArray;
|
|
44
|
+
base64Js.fromByteArray = fromByteArray;
|
|
45
|
+
|
|
46
|
+
var lookup = [];
|
|
47
|
+
var revLookup = [];
|
|
48
|
+
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
|
|
49
|
+
|
|
50
|
+
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
51
|
+
for (var i = 0, len = code.length; i < len; ++i) {
|
|
52
|
+
lookup[i] = code[i];
|
|
53
|
+
revLookup[code.charCodeAt(i)] = i;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Support decoding URL-safe base64 strings, as Node.js does.
|
|
57
|
+
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
|
58
|
+
revLookup['-'.charCodeAt(0)] = 62;
|
|
59
|
+
revLookup['_'.charCodeAt(0)] = 63;
|
|
60
|
+
|
|
61
|
+
function getLens (b64) {
|
|
62
|
+
var len = b64.length;
|
|
63
|
+
|
|
64
|
+
if (len % 4 > 0) {
|
|
65
|
+
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Trim off extra bytes after placeholder bytes are found
|
|
69
|
+
// See: https://github.com/beatgammit/base64-js/issues/42
|
|
70
|
+
var validLen = b64.indexOf('=');
|
|
71
|
+
if (validLen === -1) validLen = len;
|
|
72
|
+
|
|
73
|
+
var placeHoldersLen = validLen === len
|
|
74
|
+
? 0
|
|
75
|
+
: 4 - (validLen % 4);
|
|
76
|
+
|
|
77
|
+
return [validLen, placeHoldersLen]
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// base64 is 4/3 + up to two characters of the original data
|
|
81
|
+
function byteLength (b64) {
|
|
82
|
+
var lens = getLens(b64);
|
|
83
|
+
var validLen = lens[0];
|
|
84
|
+
var placeHoldersLen = lens[1];
|
|
85
|
+
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function _byteLength (b64, validLen, placeHoldersLen) {
|
|
89
|
+
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function toByteArray (b64) {
|
|
93
|
+
var tmp;
|
|
94
|
+
var lens = getLens(b64);
|
|
95
|
+
var validLen = lens[0];
|
|
96
|
+
var placeHoldersLen = lens[1];
|
|
97
|
+
|
|
98
|
+
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));
|
|
99
|
+
|
|
100
|
+
var curByte = 0;
|
|
101
|
+
|
|
102
|
+
// if there are placeholders, only get up to the last complete 4 chars
|
|
103
|
+
var len = placeHoldersLen > 0
|
|
104
|
+
? validLen - 4
|
|
105
|
+
: validLen;
|
|
106
|
+
|
|
107
|
+
var i;
|
|
108
|
+
for (i = 0; i < len; i += 4) {
|
|
109
|
+
tmp =
|
|
110
|
+
(revLookup[b64.charCodeAt(i)] << 18) |
|
|
111
|
+
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
|
112
|
+
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
|
113
|
+
revLookup[b64.charCodeAt(i + 3)];
|
|
114
|
+
arr[curByte++] = (tmp >> 16) & 0xFF;
|
|
115
|
+
arr[curByte++] = (tmp >> 8) & 0xFF;
|
|
116
|
+
arr[curByte++] = tmp & 0xFF;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (placeHoldersLen === 2) {
|
|
120
|
+
tmp =
|
|
121
|
+
(revLookup[b64.charCodeAt(i)] << 2) |
|
|
122
|
+
(revLookup[b64.charCodeAt(i + 1)] >> 4);
|
|
123
|
+
arr[curByte++] = tmp & 0xFF;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (placeHoldersLen === 1) {
|
|
127
|
+
tmp =
|
|
128
|
+
(revLookup[b64.charCodeAt(i)] << 10) |
|
|
129
|
+
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
|
130
|
+
(revLookup[b64.charCodeAt(i + 2)] >> 2);
|
|
131
|
+
arr[curByte++] = (tmp >> 8) & 0xFF;
|
|
132
|
+
arr[curByte++] = tmp & 0xFF;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return arr
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function tripletToBase64 (num) {
|
|
139
|
+
return lookup[num >> 18 & 0x3F] +
|
|
140
|
+
lookup[num >> 12 & 0x3F] +
|
|
141
|
+
lookup[num >> 6 & 0x3F] +
|
|
142
|
+
lookup[num & 0x3F]
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function encodeChunk (uint8, start, end) {
|
|
146
|
+
var tmp;
|
|
147
|
+
var output = [];
|
|
148
|
+
for (var i = start; i < end; i += 3) {
|
|
149
|
+
tmp =
|
|
150
|
+
((uint8[i] << 16) & 0xFF0000) +
|
|
151
|
+
((uint8[i + 1] << 8) & 0xFF00) +
|
|
152
|
+
(uint8[i + 2] & 0xFF);
|
|
153
|
+
output.push(tripletToBase64(tmp));
|
|
154
|
+
}
|
|
155
|
+
return output.join('')
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function fromByteArray (uint8) {
|
|
159
|
+
var tmp;
|
|
160
|
+
var len = uint8.length;
|
|
161
|
+
var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
|
|
162
|
+
var parts = [];
|
|
163
|
+
var maxChunkLength = 16383; // must be multiple of 3
|
|
164
|
+
|
|
165
|
+
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
166
|
+
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
|
167
|
+
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
171
|
+
if (extraBytes === 1) {
|
|
172
|
+
tmp = uint8[len - 1];
|
|
173
|
+
parts.push(
|
|
174
|
+
lookup[tmp >> 2] +
|
|
175
|
+
lookup[(tmp << 4) & 0x3F] +
|
|
176
|
+
'=='
|
|
177
|
+
);
|
|
178
|
+
} else if (extraBytes === 2) {
|
|
179
|
+
tmp = (uint8[len - 2] << 8) + uint8[len - 1];
|
|
180
|
+
parts.push(
|
|
181
|
+
lookup[tmp >> 10] +
|
|
182
|
+
lookup[(tmp >> 4) & 0x3F] +
|
|
183
|
+
lookup[(tmp << 2) & 0x3F] +
|
|
184
|
+
'='
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return parts.join('')
|
|
189
|
+
}
|
|
190
|
+
return base64Js;
|
|
70
191
|
}
|
|
71
192
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
var lens = getLens(b64);
|
|
75
|
-
var validLen = lens[0];
|
|
76
|
-
var placeHoldersLen = lens[1];
|
|
77
|
-
|
|
78
|
-
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));
|
|
79
|
-
|
|
80
|
-
var curByte = 0;
|
|
81
|
-
|
|
82
|
-
// if there are placeholders, only get up to the last complete 4 chars
|
|
83
|
-
var len = placeHoldersLen > 0
|
|
84
|
-
? validLen - 4
|
|
85
|
-
: validLen;
|
|
86
|
-
|
|
87
|
-
var i;
|
|
88
|
-
for (i = 0; i < len; i += 4) {
|
|
89
|
-
tmp =
|
|
90
|
-
(revLookup[b64.charCodeAt(i)] << 18) |
|
|
91
|
-
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
|
92
|
-
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
|
93
|
-
revLookup[b64.charCodeAt(i + 3)];
|
|
94
|
-
arr[curByte++] = (tmp >> 16) & 0xFF;
|
|
95
|
-
arr[curByte++] = (tmp >> 8) & 0xFF;
|
|
96
|
-
arr[curByte++] = tmp & 0xFF;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (placeHoldersLen === 2) {
|
|
100
|
-
tmp =
|
|
101
|
-
(revLookup[b64.charCodeAt(i)] << 2) |
|
|
102
|
-
(revLookup[b64.charCodeAt(i + 1)] >> 4);
|
|
103
|
-
arr[curByte++] = tmp & 0xFF;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (placeHoldersLen === 1) {
|
|
107
|
-
tmp =
|
|
108
|
-
(revLookup[b64.charCodeAt(i)] << 10) |
|
|
109
|
-
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
|
110
|
-
(revLookup[b64.charCodeAt(i + 2)] >> 2);
|
|
111
|
-
arr[curByte++] = (tmp >> 8) & 0xFF;
|
|
112
|
-
arr[curByte++] = tmp & 0xFF;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return arr
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function tripletToBase64 (num) {
|
|
119
|
-
return lookup[num >> 18 & 0x3F] +
|
|
120
|
-
lookup[num >> 12 & 0x3F] +
|
|
121
|
-
lookup[num >> 6 & 0x3F] +
|
|
122
|
-
lookup[num & 0x3F]
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function encodeChunk (uint8, start, end) {
|
|
126
|
-
var tmp;
|
|
127
|
-
var output = [];
|
|
128
|
-
for (var i = start; i < end; i += 3) {
|
|
129
|
-
tmp =
|
|
130
|
-
((uint8[i] << 16) & 0xFF0000) +
|
|
131
|
-
((uint8[i + 1] << 8) & 0xFF00) +
|
|
132
|
-
(uint8[i + 2] & 0xFF);
|
|
133
|
-
output.push(tripletToBase64(tmp));
|
|
134
|
-
}
|
|
135
|
-
return output.join('')
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function fromByteArray (uint8) {
|
|
139
|
-
var tmp;
|
|
140
|
-
var len = uint8.length;
|
|
141
|
-
var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
|
|
142
|
-
var parts = [];
|
|
143
|
-
var maxChunkLength = 16383; // must be multiple of 3
|
|
144
|
-
|
|
145
|
-
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
146
|
-
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
|
147
|
-
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
151
|
-
if (extraBytes === 1) {
|
|
152
|
-
tmp = uint8[len - 1];
|
|
153
|
-
parts.push(
|
|
154
|
-
lookup[tmp >> 2] +
|
|
155
|
-
lookup[(tmp << 4) & 0x3F] +
|
|
156
|
-
'=='
|
|
157
|
-
);
|
|
158
|
-
} else if (extraBytes === 2) {
|
|
159
|
-
tmp = (uint8[len - 2] << 8) + uint8[len - 1];
|
|
160
|
-
parts.push(
|
|
161
|
-
lookup[tmp >> 10] +
|
|
162
|
-
lookup[(tmp >> 4) & 0x3F] +
|
|
163
|
-
lookup[(tmp << 2) & 0x3F] +
|
|
164
|
-
'='
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return parts.join('')
|
|
169
|
-
}
|
|
193
|
+
var base64JsExports = requireBase64Js();
|
|
194
|
+
var base64 = /*@__PURE__*/getDefaultExportFromCjs(base64JsExports);
|
|
170
195
|
|
|
171
196
|
var sha256$1 = {exports: {}};
|
|
172
197
|
|
|
173
|
-
|
|
198
|
+
var _nodeResolve_empty = {};
|
|
174
199
|
|
|
175
|
-
|
|
200
|
+
var _nodeResolve_empty$1 = /*#__PURE__*/Object.freeze({
|
|
176
201
|
__proto__: null,
|
|
177
|
-
|
|
202
|
+
default: _nodeResolve_empty
|
|
178
203
|
});
|
|
179
204
|
|
|
180
|
-
|
|
205
|
+
var require$$1 = /*@__PURE__*/getAugmentedNamespace(_nodeResolve_empty$1);
|
|
181
206
|
|
|
182
207
|
/**
|
|
183
208
|
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
|
@@ -188,522 +213,530 @@ const require$$1 = /*@__PURE__*/getAugmentedNamespace(_nodeResolve_empty$1);
|
|
|
188
213
|
* @license MIT
|
|
189
214
|
*/
|
|
190
215
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
}
|
|
216
|
+
var hasRequiredSha256;
|
|
217
|
+
|
|
218
|
+
function requireSha256 () {
|
|
219
|
+
if (hasRequiredSha256) return sha256$1.exports;
|
|
220
|
+
hasRequiredSha256 = 1;
|
|
221
|
+
(function (module) {
|
|
222
|
+
/*jslint bitwise: true */
|
|
223
|
+
(function () {
|
|
224
|
+
|
|
225
|
+
var ERROR = 'input is invalid type';
|
|
226
|
+
var WINDOW = typeof window === 'object';
|
|
227
|
+
var root = WINDOW ? window : {};
|
|
228
|
+
if (root.JS_SHA256_NO_WINDOW) {
|
|
229
|
+
WINDOW = false;
|
|
230
|
+
}
|
|
231
|
+
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
|
232
|
+
var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
|
233
|
+
if (NODE_JS) {
|
|
234
|
+
root = commonjsGlobal;
|
|
235
|
+
} else if (WEB_WORKER) {
|
|
236
|
+
root = self;
|
|
237
|
+
}
|
|
238
|
+
var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
|
239
|
+
var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
|
240
|
+
var HEX_CHARS = '0123456789abcdef'.split('');
|
|
241
|
+
var EXTRA = [-2147483648, 8388608, 32768, 128];
|
|
242
|
+
var SHIFT = [24, 16, 8, 0];
|
|
243
|
+
var K = [
|
|
244
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
245
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
246
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
247
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
248
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
249
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
250
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
251
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
252
|
+
];
|
|
253
|
+
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
|
254
|
+
|
|
255
|
+
var blocks = [];
|
|
256
|
+
|
|
257
|
+
if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
|
|
258
|
+
Array.isArray = function (obj) {
|
|
259
|
+
return Object.prototype.toString.call(obj) === '[object Array]';
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
|
264
|
+
ArrayBuffer.isView = function (obj) {
|
|
265
|
+
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var createOutputMethod = function (outputType, is224) {
|
|
270
|
+
return function (message) {
|
|
271
|
+
return new Sha256(is224, true).update(message)[outputType]();
|
|
272
|
+
};
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
var createMethod = function (is224) {
|
|
276
|
+
var method = createOutputMethod('hex', is224);
|
|
277
|
+
if (NODE_JS) {
|
|
278
|
+
method = nodeWrap(method, is224);
|
|
279
|
+
}
|
|
280
|
+
method.create = function () {
|
|
281
|
+
return new Sha256(is224);
|
|
282
|
+
};
|
|
283
|
+
method.update = function (message) {
|
|
284
|
+
return method.create().update(message);
|
|
285
|
+
};
|
|
286
|
+
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
|
287
|
+
var type = OUTPUT_TYPES[i];
|
|
288
|
+
method[type] = createOutputMethod(type, is224);
|
|
289
|
+
}
|
|
290
|
+
return method;
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
var nodeWrap = function (method, is224) {
|
|
294
|
+
var crypto = require$$1;
|
|
295
|
+
var Buffer = require$$1.Buffer;
|
|
296
|
+
var algorithm = is224 ? 'sha224' : 'sha256';
|
|
297
|
+
var bufferFrom;
|
|
298
|
+
if (Buffer.from && !root.JS_SHA256_NO_BUFFER_FROM) {
|
|
299
|
+
bufferFrom = Buffer.from;
|
|
300
|
+
} else {
|
|
301
|
+
bufferFrom = function (message) {
|
|
302
|
+
return new Buffer(message);
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
var nodeMethod = function (message) {
|
|
306
|
+
if (typeof message === 'string') {
|
|
307
|
+
return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
|
|
308
|
+
} else {
|
|
309
|
+
if (message === null || message === undefined) {
|
|
310
|
+
throw new Error(ERROR);
|
|
311
|
+
} else if (message.constructor === ArrayBuffer) {
|
|
312
|
+
message = new Uint8Array(message);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
|
316
|
+
message.constructor === Buffer) {
|
|
317
|
+
return crypto.createHash(algorithm).update(bufferFrom(message)).digest('hex');
|
|
318
|
+
} else {
|
|
319
|
+
return method(message);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
return nodeMethod;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
var createHmacOutputMethod = function (outputType, is224) {
|
|
326
|
+
return function (key, message) {
|
|
327
|
+
return new HmacSha256(key, is224, true).update(message)[outputType]();
|
|
328
|
+
};
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
var createHmacMethod = function (is224) {
|
|
332
|
+
var method = createHmacOutputMethod('hex', is224);
|
|
333
|
+
method.create = function (key) {
|
|
334
|
+
return new HmacSha256(key, is224);
|
|
335
|
+
};
|
|
336
|
+
method.update = function (key, message) {
|
|
337
|
+
return method.create(key).update(message);
|
|
338
|
+
};
|
|
339
|
+
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
|
340
|
+
var type = OUTPUT_TYPES[i];
|
|
341
|
+
method[type] = createHmacOutputMethod(type, is224);
|
|
342
|
+
}
|
|
343
|
+
return method;
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
function Sha256(is224, sharedMemory) {
|
|
347
|
+
if (sharedMemory) {
|
|
348
|
+
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
349
|
+
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
350
|
+
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
351
|
+
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
352
|
+
this.blocks = blocks;
|
|
353
|
+
} else {
|
|
354
|
+
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (is224) {
|
|
358
|
+
this.h0 = 0xc1059ed8;
|
|
359
|
+
this.h1 = 0x367cd507;
|
|
360
|
+
this.h2 = 0x3070dd17;
|
|
361
|
+
this.h3 = 0xf70e5939;
|
|
362
|
+
this.h4 = 0xffc00b31;
|
|
363
|
+
this.h5 = 0x68581511;
|
|
364
|
+
this.h6 = 0x64f98fa7;
|
|
365
|
+
this.h7 = 0xbefa4fa4;
|
|
366
|
+
} else { // 256
|
|
367
|
+
this.h0 = 0x6a09e667;
|
|
368
|
+
this.h1 = 0xbb67ae85;
|
|
369
|
+
this.h2 = 0x3c6ef372;
|
|
370
|
+
this.h3 = 0xa54ff53a;
|
|
371
|
+
this.h4 = 0x510e527f;
|
|
372
|
+
this.h5 = 0x9b05688c;
|
|
373
|
+
this.h6 = 0x1f83d9ab;
|
|
374
|
+
this.h7 = 0x5be0cd19;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
this.block = this.start = this.bytes = this.hBytes = 0;
|
|
378
|
+
this.finalized = this.hashed = false;
|
|
379
|
+
this.first = true;
|
|
380
|
+
this.is224 = is224;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
Sha256.prototype.update = function (message) {
|
|
384
|
+
if (this.finalized) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
var notString, type = typeof message;
|
|
388
|
+
if (type !== 'string') {
|
|
389
|
+
if (type === 'object') {
|
|
390
|
+
if (message === null) {
|
|
391
|
+
throw new Error(ERROR);
|
|
392
|
+
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
|
393
|
+
message = new Uint8Array(message);
|
|
394
|
+
} else if (!Array.isArray(message)) {
|
|
395
|
+
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
|
396
|
+
throw new Error(ERROR);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
} else {
|
|
400
|
+
throw new Error(ERROR);
|
|
401
|
+
}
|
|
402
|
+
notString = true;
|
|
403
|
+
}
|
|
404
|
+
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
|
405
|
+
|
|
406
|
+
while (index < length) {
|
|
407
|
+
if (this.hashed) {
|
|
408
|
+
this.hashed = false;
|
|
409
|
+
blocks[0] = this.block;
|
|
410
|
+
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
411
|
+
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
412
|
+
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
413
|
+
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (notString) {
|
|
417
|
+
for (i = this.start; index < length && i < 64; ++index) {
|
|
418
|
+
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
|
419
|
+
}
|
|
420
|
+
} else {
|
|
421
|
+
for (i = this.start; index < length && i < 64; ++index) {
|
|
422
|
+
code = message.charCodeAt(index);
|
|
423
|
+
if (code < 0x80) {
|
|
424
|
+
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
|
425
|
+
} else if (code < 0x800) {
|
|
426
|
+
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
|
427
|
+
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
428
|
+
} else if (code < 0xd800 || code >= 0xe000) {
|
|
429
|
+
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
|
430
|
+
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
431
|
+
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
432
|
+
} else {
|
|
433
|
+
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
|
434
|
+
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
|
435
|
+
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
|
436
|
+
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
437
|
+
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
this.lastByteIndex = i;
|
|
443
|
+
this.bytes += i - this.start;
|
|
444
|
+
if (i >= 64) {
|
|
445
|
+
this.block = blocks[16];
|
|
446
|
+
this.start = i - 64;
|
|
447
|
+
this.hash();
|
|
448
|
+
this.hashed = true;
|
|
449
|
+
} else {
|
|
450
|
+
this.start = i;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (this.bytes > 4294967295) {
|
|
454
|
+
this.hBytes += this.bytes / 4294967296 << 0;
|
|
455
|
+
this.bytes = this.bytes % 4294967296;
|
|
456
|
+
}
|
|
457
|
+
return this;
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
Sha256.prototype.finalize = function () {
|
|
461
|
+
if (this.finalized) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
this.finalized = true;
|
|
465
|
+
var blocks = this.blocks, i = this.lastByteIndex;
|
|
466
|
+
blocks[16] = this.block;
|
|
467
|
+
blocks[i >> 2] |= EXTRA[i & 3];
|
|
468
|
+
this.block = blocks[16];
|
|
469
|
+
if (i >= 56) {
|
|
470
|
+
if (!this.hashed) {
|
|
471
|
+
this.hash();
|
|
472
|
+
}
|
|
473
|
+
blocks[0] = this.block;
|
|
474
|
+
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
475
|
+
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
476
|
+
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
477
|
+
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
478
|
+
}
|
|
479
|
+
blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
|
|
480
|
+
blocks[15] = this.bytes << 3;
|
|
481
|
+
this.hash();
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
Sha256.prototype.hash = function () {
|
|
485
|
+
var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,
|
|
486
|
+
h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
|
|
487
|
+
|
|
488
|
+
for (j = 16; j < 64; ++j) {
|
|
489
|
+
// rightrotate
|
|
490
|
+
t1 = blocks[j - 15];
|
|
491
|
+
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
|
492
|
+
t1 = blocks[j - 2];
|
|
493
|
+
s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
|
|
494
|
+
blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
bc = b & c;
|
|
498
|
+
for (j = 0; j < 64; j += 4) {
|
|
499
|
+
if (this.first) {
|
|
500
|
+
if (this.is224) {
|
|
501
|
+
ab = 300032;
|
|
502
|
+
t1 = blocks[0] - 1413257819;
|
|
503
|
+
h = t1 - 150054599 << 0;
|
|
504
|
+
d = t1 + 24177077 << 0;
|
|
505
|
+
} else {
|
|
506
|
+
ab = 704751109;
|
|
507
|
+
t1 = blocks[0] - 210244248;
|
|
508
|
+
h = t1 - 1521486534 << 0;
|
|
509
|
+
d = t1 + 143694565 << 0;
|
|
510
|
+
}
|
|
511
|
+
this.first = false;
|
|
512
|
+
} else {
|
|
513
|
+
s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
|
514
|
+
s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
|
515
|
+
ab = a & b;
|
|
516
|
+
maj = ab ^ (a & c) ^ bc;
|
|
517
|
+
ch = (e & f) ^ (~e & g);
|
|
518
|
+
t1 = h + s1 + ch + K[j] + blocks[j];
|
|
519
|
+
t2 = s0 + maj;
|
|
520
|
+
h = d + t1 << 0;
|
|
521
|
+
d = t1 + t2 << 0;
|
|
522
|
+
}
|
|
523
|
+
s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
|
|
524
|
+
s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
|
|
525
|
+
da = d & a;
|
|
526
|
+
maj = da ^ (d & b) ^ ab;
|
|
527
|
+
ch = (h & e) ^ (~h & f);
|
|
528
|
+
t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
|
|
529
|
+
t2 = s0 + maj;
|
|
530
|
+
g = c + t1 << 0;
|
|
531
|
+
c = t1 + t2 << 0;
|
|
532
|
+
s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
|
|
533
|
+
s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
|
|
534
|
+
cd = c & d;
|
|
535
|
+
maj = cd ^ (c & a) ^ da;
|
|
536
|
+
ch = (g & h) ^ (~g & e);
|
|
537
|
+
t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
|
|
538
|
+
t2 = s0 + maj;
|
|
539
|
+
f = b + t1 << 0;
|
|
540
|
+
b = t1 + t2 << 0;
|
|
541
|
+
s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
|
|
542
|
+
s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
|
|
543
|
+
bc = b & c;
|
|
544
|
+
maj = bc ^ (b & d) ^ cd;
|
|
545
|
+
ch = (f & g) ^ (~f & h);
|
|
546
|
+
t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
|
|
547
|
+
t2 = s0 + maj;
|
|
548
|
+
e = a + t1 << 0;
|
|
549
|
+
a = t1 + t2 << 0;
|
|
550
|
+
this.chromeBugWorkAround = true;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
this.h0 = this.h0 + a << 0;
|
|
554
|
+
this.h1 = this.h1 + b << 0;
|
|
555
|
+
this.h2 = this.h2 + c << 0;
|
|
556
|
+
this.h3 = this.h3 + d << 0;
|
|
557
|
+
this.h4 = this.h4 + e << 0;
|
|
558
|
+
this.h5 = this.h5 + f << 0;
|
|
559
|
+
this.h6 = this.h6 + g << 0;
|
|
560
|
+
this.h7 = this.h7 + h << 0;
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
Sha256.prototype.hex = function () {
|
|
564
|
+
this.finalize();
|
|
565
|
+
|
|
566
|
+
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
|
567
|
+
h6 = this.h6, h7 = this.h7;
|
|
568
|
+
|
|
569
|
+
var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
|
570
|
+
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
|
571
|
+
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
|
|
572
|
+
HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
|
573
|
+
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
|
|
574
|
+
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
|
|
575
|
+
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
|
|
576
|
+
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
|
577
|
+
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
|
|
578
|
+
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
|
|
579
|
+
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
|
|
580
|
+
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
|
581
|
+
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] +
|
|
582
|
+
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
|
|
583
|
+
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
|
|
584
|
+
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
|
585
|
+
HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] +
|
|
586
|
+
HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] +
|
|
587
|
+
HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] +
|
|
588
|
+
HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +
|
|
589
|
+
HEX_CHARS[(h5 >> 28) & 0x0F] + HEX_CHARS[(h5 >> 24) & 0x0F] +
|
|
590
|
+
HEX_CHARS[(h5 >> 20) & 0x0F] + HEX_CHARS[(h5 >> 16) & 0x0F] +
|
|
591
|
+
HEX_CHARS[(h5 >> 12) & 0x0F] + HEX_CHARS[(h5 >> 8) & 0x0F] +
|
|
592
|
+
HEX_CHARS[(h5 >> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +
|
|
593
|
+
HEX_CHARS[(h6 >> 28) & 0x0F] + HEX_CHARS[(h6 >> 24) & 0x0F] +
|
|
594
|
+
HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +
|
|
595
|
+
HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +
|
|
596
|
+
HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
|
|
597
|
+
if (!this.is224) {
|
|
598
|
+
hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +
|
|
599
|
+
HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +
|
|
600
|
+
HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +
|
|
601
|
+
HEX_CHARS[(h7 >> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];
|
|
602
|
+
}
|
|
603
|
+
return hex;
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
Sha256.prototype.toString = Sha256.prototype.hex;
|
|
607
|
+
|
|
608
|
+
Sha256.prototype.digest = function () {
|
|
609
|
+
this.finalize();
|
|
610
|
+
|
|
611
|
+
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
|
612
|
+
h6 = this.h6, h7 = this.h7;
|
|
613
|
+
|
|
614
|
+
var arr = [
|
|
615
|
+
(h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF,
|
|
616
|
+
(h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF,
|
|
617
|
+
(h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF,
|
|
618
|
+
(h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, h3 & 0xFF,
|
|
619
|
+
(h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, h4 & 0xFF,
|
|
620
|
+
(h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, h5 & 0xFF,
|
|
621
|
+
(h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, h6 & 0xFF
|
|
622
|
+
];
|
|
623
|
+
if (!this.is224) {
|
|
624
|
+
arr.push((h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, h7 & 0xFF);
|
|
625
|
+
}
|
|
626
|
+
return arr;
|
|
627
|
+
};
|
|
628
|
+
|
|
629
|
+
Sha256.prototype.array = Sha256.prototype.digest;
|
|
630
|
+
|
|
631
|
+
Sha256.prototype.arrayBuffer = function () {
|
|
632
|
+
this.finalize();
|
|
633
|
+
|
|
634
|
+
var buffer = new ArrayBuffer(this.is224 ? 28 : 32);
|
|
635
|
+
var dataView = new DataView(buffer);
|
|
636
|
+
dataView.setUint32(0, this.h0);
|
|
637
|
+
dataView.setUint32(4, this.h1);
|
|
638
|
+
dataView.setUint32(8, this.h2);
|
|
639
|
+
dataView.setUint32(12, this.h3);
|
|
640
|
+
dataView.setUint32(16, this.h4);
|
|
641
|
+
dataView.setUint32(20, this.h5);
|
|
642
|
+
dataView.setUint32(24, this.h6);
|
|
643
|
+
if (!this.is224) {
|
|
644
|
+
dataView.setUint32(28, this.h7);
|
|
645
|
+
}
|
|
646
|
+
return buffer;
|
|
647
|
+
};
|
|
648
|
+
|
|
649
|
+
function HmacSha256(key, is224, sharedMemory) {
|
|
650
|
+
var i, type = typeof key;
|
|
651
|
+
if (type === 'string') {
|
|
652
|
+
var bytes = [], length = key.length, index = 0, code;
|
|
653
|
+
for (i = 0; i < length; ++i) {
|
|
654
|
+
code = key.charCodeAt(i);
|
|
655
|
+
if (code < 0x80) {
|
|
656
|
+
bytes[index++] = code;
|
|
657
|
+
} else if (code < 0x800) {
|
|
658
|
+
bytes[index++] = (0xc0 | (code >> 6));
|
|
659
|
+
bytes[index++] = (0x80 | (code & 0x3f));
|
|
660
|
+
} else if (code < 0xd800 || code >= 0xe000) {
|
|
661
|
+
bytes[index++] = (0xe0 | (code >> 12));
|
|
662
|
+
bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
|
|
663
|
+
bytes[index++] = (0x80 | (code & 0x3f));
|
|
664
|
+
} else {
|
|
665
|
+
code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
|
|
666
|
+
bytes[index++] = (0xf0 | (code >> 18));
|
|
667
|
+
bytes[index++] = (0x80 | ((code >> 12) & 0x3f));
|
|
668
|
+
bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
|
|
669
|
+
bytes[index++] = (0x80 | (code & 0x3f));
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
key = bytes;
|
|
673
|
+
} else {
|
|
674
|
+
if (type === 'object') {
|
|
675
|
+
if (key === null) {
|
|
676
|
+
throw new Error(ERROR);
|
|
677
|
+
} else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {
|
|
678
|
+
key = new Uint8Array(key);
|
|
679
|
+
} else if (!Array.isArray(key)) {
|
|
680
|
+
if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {
|
|
681
|
+
throw new Error(ERROR);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
} else {
|
|
685
|
+
throw new Error(ERROR);
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
if (key.length > 64) {
|
|
690
|
+
key = (new Sha256(is224, true)).update(key).array();
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
var oKeyPad = [], iKeyPad = [];
|
|
694
|
+
for (i = 0; i < 64; ++i) {
|
|
695
|
+
var b = key[i] || 0;
|
|
696
|
+
oKeyPad[i] = 0x5c ^ b;
|
|
697
|
+
iKeyPad[i] = 0x36 ^ b;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
Sha256.call(this, is224, sharedMemory);
|
|
701
|
+
|
|
702
|
+
this.update(iKeyPad);
|
|
703
|
+
this.oKeyPad = oKeyPad;
|
|
704
|
+
this.inner = true;
|
|
705
|
+
this.sharedMemory = sharedMemory;
|
|
706
|
+
}
|
|
707
|
+
HmacSha256.prototype = new Sha256();
|
|
708
|
+
|
|
709
|
+
HmacSha256.prototype.finalize = function () {
|
|
710
|
+
Sha256.prototype.finalize.call(this);
|
|
711
|
+
if (this.inner) {
|
|
712
|
+
this.inner = false;
|
|
713
|
+
var innerHash = this.array();
|
|
714
|
+
Sha256.call(this, this.is224, this.sharedMemory);
|
|
715
|
+
this.update(this.oKeyPad);
|
|
716
|
+
this.update(innerHash);
|
|
717
|
+
Sha256.prototype.finalize.call(this);
|
|
718
|
+
}
|
|
719
|
+
};
|
|
720
|
+
|
|
721
|
+
var exports = createMethod();
|
|
722
|
+
exports.sha256 = exports;
|
|
723
|
+
exports.sha224 = createMethod(true);
|
|
724
|
+
exports.sha256.hmac = createHmacMethod();
|
|
725
|
+
exports.sha224.hmac = createHmacMethod(true);
|
|
726
|
+
|
|
727
|
+
if (COMMON_JS) {
|
|
728
|
+
module.exports = exports;
|
|
729
|
+
} else {
|
|
730
|
+
root.sha256 = exports.sha256;
|
|
731
|
+
root.sha224 = exports.sha224;
|
|
732
|
+
}
|
|
733
|
+
})();
|
|
734
|
+
} (sha256$1));
|
|
735
|
+
return sha256$1.exports;
|
|
736
|
+
}
|
|
705
737
|
|
|
706
|
-
|
|
738
|
+
var sha256Exports = requireSha256();
|
|
739
|
+
var sha256 = /*@__PURE__*/getDefaultExportFromCjs(sha256Exports);
|
|
707
740
|
|
|
708
741
|
class InvalidTokenError extends Error {
|
|
709
742
|
}
|
|
@@ -1136,7 +1169,7 @@ function Keycloak (config) {
|
|
|
1136
1169
|
case "S256":
|
|
1137
1170
|
// hash codeVerifier, then encode as url-safe base64 without padding
|
|
1138
1171
|
var hashBytes = new Uint8Array(sha256.arrayBuffer(codeVerifier));
|
|
1139
|
-
var encodedHash =
|
|
1172
|
+
var encodedHash = base64.fromByteArray(hashBytes)
|
|
1140
1173
|
.replace(/\+/g, '-')
|
|
1141
1174
|
.replace(/\//g, '_')
|
|
1142
1175
|
.replace(/\=/g, '');
|
|
@@ -1922,7 +1955,7 @@ function Keycloak (config) {
|
|
|
1922
1955
|
var timeoutHandle = null;
|
|
1923
1956
|
var timeoutPromise = new Promise(function (resolve, reject) {
|
|
1924
1957
|
timeoutHandle = setTimeout(function () {
|
|
1925
|
-
reject({ "error": errorMessage
|
|
1958
|
+
reject({ "error": errorMessage });
|
|
1926
1959
|
}, timeout);
|
|
1927
1960
|
});
|
|
1928
1961
|
|
|
@@ -2502,1374 +2535,1386 @@ function Keycloak (config) {
|
|
|
2502
2535
|
* SOFTWARE.
|
|
2503
2536
|
*/
|
|
2504
2537
|
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
}
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
//
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
}
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
}
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2538
|
+
var jdenticonModule;
|
|
2539
|
+
var hasRequiredJdenticonModule;
|
|
2540
|
+
|
|
2541
|
+
function requireJdenticonModule () {
|
|
2542
|
+
if (hasRequiredJdenticonModule) return jdenticonModule;
|
|
2543
|
+
hasRequiredJdenticonModule = 1;
|
|
2544
|
+
|
|
2545
|
+
/**
|
|
2546
|
+
* Parses a substring of the hash as a number.
|
|
2547
|
+
* @param {number} startPosition
|
|
2548
|
+
* @param {number=} octets
|
|
2549
|
+
*/
|
|
2550
|
+
function parseHex(hash, startPosition, octets) {
|
|
2551
|
+
return parseInt(hash.substr(startPosition, octets), 16);
|
|
2552
|
+
}
|
|
2553
|
+
|
|
2554
|
+
function decToHex(v) {
|
|
2555
|
+
v |= 0; // Ensure integer value
|
|
2556
|
+
return v < 0 ? "00" :
|
|
2557
|
+
v < 16 ? "0" + v.toString(16) :
|
|
2558
|
+
v < 256 ? v.toString(16) :
|
|
2559
|
+
"ff";
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2562
|
+
function hueToRgb(m1, m2, h) {
|
|
2563
|
+
h = h < 0 ? h + 6 : h > 6 ? h - 6 : h;
|
|
2564
|
+
return decToHex(255 * (
|
|
2565
|
+
h < 1 ? m1 + (m2 - m1) * h :
|
|
2566
|
+
h < 3 ? m2 :
|
|
2567
|
+
h < 4 ? m1 + (m2 - m1) * (4 - h) :
|
|
2568
|
+
m1));
|
|
2569
|
+
}
|
|
2570
|
+
|
|
2571
|
+
/**
|
|
2572
|
+
* @param {string} color Color value to parse. Currently hexadecimal strings on the format #rgb[a] and #rrggbb[aa] are supported.
|
|
2573
|
+
* @returns {string}
|
|
2574
|
+
*/
|
|
2575
|
+
function parseColor(color) {
|
|
2576
|
+
if (/^#[0-9a-f]{3,8}$/i.test(color)) {
|
|
2577
|
+
var result;
|
|
2578
|
+
var colorLength = color.length;
|
|
2579
|
+
|
|
2580
|
+
if (colorLength < 6) {
|
|
2581
|
+
var r = color[1],
|
|
2582
|
+
g = color[2],
|
|
2583
|
+
b = color[3],
|
|
2584
|
+
a = color[4] || "";
|
|
2585
|
+
result = "#" + r + r + g + g + b + b + a + a;
|
|
2586
|
+
}
|
|
2587
|
+
if (colorLength == 7 || colorLength > 8) {
|
|
2588
|
+
result = color;
|
|
2589
|
+
}
|
|
2590
|
+
|
|
2591
|
+
return result;
|
|
2592
|
+
}
|
|
2593
|
+
}
|
|
2594
|
+
|
|
2595
|
+
/**
|
|
2596
|
+
* Converts a hexadecimal color to a CSS3 compatible color.
|
|
2597
|
+
* @param {string} hexColor Color on the format "#RRGGBB" or "#RRGGBBAA"
|
|
2598
|
+
* @returns {string}
|
|
2599
|
+
*/
|
|
2600
|
+
function toCss3Color(hexColor) {
|
|
2601
|
+
var a = parseHex(hexColor, 7, 2);
|
|
2602
|
+
var result;
|
|
2603
|
+
|
|
2604
|
+
if (isNaN(a)) {
|
|
2605
|
+
result = hexColor;
|
|
2606
|
+
} else {
|
|
2607
|
+
var r = parseHex(hexColor, 1, 2),
|
|
2608
|
+
g = parseHex(hexColor, 3, 2),
|
|
2609
|
+
b = parseHex(hexColor, 5, 2);
|
|
2610
|
+
result = "rgba(" + r + "," + g + "," + b + "," + (a / 255).toFixed(2) + ")";
|
|
2611
|
+
}
|
|
2612
|
+
|
|
2613
|
+
return result;
|
|
2614
|
+
}
|
|
2615
|
+
|
|
2616
|
+
/**
|
|
2617
|
+
* Converts an HSL color to a hexadecimal RGB color.
|
|
2618
|
+
* @param {number} hue Hue in range [0, 1]
|
|
2619
|
+
* @param {number} saturation Saturation in range [0, 1]
|
|
2620
|
+
* @param {number} lightness Lightness in range [0, 1]
|
|
2621
|
+
* @returns {string}
|
|
2622
|
+
*/
|
|
2623
|
+
function hsl(hue, saturation, lightness) {
|
|
2624
|
+
// Based on http://www.w3.org/TR/2011/REC-css3-color-20110607/#hsl-color
|
|
2625
|
+
var result;
|
|
2626
|
+
|
|
2627
|
+
if (saturation == 0) {
|
|
2628
|
+
var partialHex = decToHex(lightness * 255);
|
|
2629
|
+
result = partialHex + partialHex + partialHex;
|
|
2630
|
+
}
|
|
2631
|
+
else {
|
|
2632
|
+
var m2 = lightness <= 0.5 ? lightness * (saturation + 1) : lightness + saturation - lightness * saturation,
|
|
2633
|
+
m1 = lightness * 2 - m2;
|
|
2634
|
+
result =
|
|
2635
|
+
hueToRgb(m1, m2, hue * 6 + 2) +
|
|
2636
|
+
hueToRgb(m1, m2, hue * 6) +
|
|
2637
|
+
hueToRgb(m1, m2, hue * 6 - 2);
|
|
2638
|
+
}
|
|
2639
|
+
|
|
2640
|
+
return "#" + result;
|
|
2641
|
+
}
|
|
2642
|
+
|
|
2643
|
+
/**
|
|
2644
|
+
* Converts an HSL color to a hexadecimal RGB color. This function will correct the lightness for the "dark" hues
|
|
2645
|
+
* @param {number} hue Hue in range [0, 1]
|
|
2646
|
+
* @param {number} saturation Saturation in range [0, 1]
|
|
2647
|
+
* @param {number} lightness Lightness in range [0, 1]
|
|
2648
|
+
* @returns {string}
|
|
2649
|
+
*/
|
|
2650
|
+
function correctedHsl(hue, saturation, lightness) {
|
|
2651
|
+
// The corrector specifies the perceived middle lightness for each hue
|
|
2652
|
+
var correctors = [ 0.55, 0.5, 0.5, 0.46, 0.6, 0.55, 0.55 ],
|
|
2653
|
+
corrector = correctors[(hue * 6 + 0.5) | 0];
|
|
2654
|
+
|
|
2655
|
+
// Adjust the input lightness relative to the corrector
|
|
2656
|
+
lightness = lightness < 0.5 ? lightness * corrector * 2 : corrector + (lightness - 0.5) * (1 - corrector) * 2;
|
|
2657
|
+
|
|
2658
|
+
return hsl(hue, saturation, lightness);
|
|
2659
|
+
}
|
|
2660
|
+
|
|
2661
|
+
// In the future we can replace `GLOBAL` with `globalThis`, but for now use the old school global detection for
|
|
2662
|
+
// backward compatibility.
|
|
2663
|
+
|
|
2664
|
+
var GLOBAL =
|
|
2665
|
+
typeof window !== "undefined" ? window :
|
|
2666
|
+
typeof self !== "undefined" ? self :
|
|
2667
|
+
typeof commonjsGlobal !== "undefined" ? commonjsGlobal :
|
|
2668
|
+
{};
|
|
2669
|
+
|
|
2670
|
+
/**
|
|
2671
|
+
* @typedef {Object} ParsedConfiguration
|
|
2672
|
+
* @property {number} colorSaturation
|
|
2673
|
+
* @property {number} grayscaleSaturation
|
|
2674
|
+
* @property {string} backColor
|
|
2675
|
+
* @property {number} iconPadding
|
|
2676
|
+
* @property {function(number):number} hue
|
|
2677
|
+
* @property {function(number):number} colorLightness
|
|
2678
|
+
* @property {function(number):number} grayscaleLightness
|
|
2679
|
+
*/
|
|
2680
|
+
|
|
2681
|
+
var CONFIG_PROPERTIES = {
|
|
2682
|
+
W/*GLOBAL*/: "jdenticon_config",
|
|
2683
|
+
n/*MODULE*/: "config",
|
|
2684
|
+
};
|
|
2685
|
+
|
|
2686
|
+
var rootConfigurationHolder = {};
|
|
2687
|
+
|
|
2688
|
+
/**
|
|
2689
|
+
* Defines the deprecated `config` property on the root Jdenticon object without printing a warning in the console
|
|
2690
|
+
* when it is being used.
|
|
2691
|
+
* @param {!Object} rootObject
|
|
2692
|
+
*/
|
|
2693
|
+
function defineConfigProperty(rootObject) {
|
|
2694
|
+
rootConfigurationHolder = rootObject;
|
|
2695
|
+
}
|
|
2696
|
+
|
|
2697
|
+
/**
|
|
2698
|
+
* Sets a new icon style configuration. The new configuration is not merged with the previous one. *
|
|
2699
|
+
* @param {Object} newConfiguration - New configuration object.
|
|
2700
|
+
*/
|
|
2701
|
+
function configure(newConfiguration) {
|
|
2702
|
+
if (arguments.length) {
|
|
2703
|
+
rootConfigurationHolder[CONFIG_PROPERTIES.n/*MODULE*/] = newConfiguration;
|
|
2704
|
+
}
|
|
2705
|
+
return rootConfigurationHolder[CONFIG_PROPERTIES.n/*MODULE*/];
|
|
2706
|
+
}
|
|
2707
|
+
|
|
2708
|
+
/**
|
|
2709
|
+
* Gets the normalized current Jdenticon color configuration. Missing fields have default values.
|
|
2710
|
+
* @param {Object|number|undefined} paddingOrLocalConfig - Configuration passed to the called API method. A
|
|
2711
|
+
* local configuration overrides the global configuration in it entirety. This parameter can for backward
|
|
2712
|
+
* compatibility also contain a padding value. A padding value only overrides the global padding, not the
|
|
2713
|
+
* entire global configuration.
|
|
2714
|
+
* @param {number} defaultPadding - Padding used if no padding is specified in neither the configuration nor
|
|
2715
|
+
* explicitly to the API method.
|
|
2716
|
+
* @returns {ParsedConfiguration}
|
|
2717
|
+
*/
|
|
2718
|
+
function getConfiguration(paddingOrLocalConfig, defaultPadding) {
|
|
2719
|
+
var configObject =
|
|
2720
|
+
typeof paddingOrLocalConfig == "object" && paddingOrLocalConfig ||
|
|
2721
|
+
rootConfigurationHolder[CONFIG_PROPERTIES.n/*MODULE*/] ||
|
|
2722
|
+
GLOBAL[CONFIG_PROPERTIES.W/*GLOBAL*/] ||
|
|
2723
|
+
{ },
|
|
2724
|
+
|
|
2725
|
+
lightnessConfig = configObject["lightness"] || { },
|
|
2726
|
+
|
|
2727
|
+
// In versions < 2.1.0 there was no grayscale saturation -
|
|
2728
|
+
// saturation was the color saturation.
|
|
2729
|
+
saturation = configObject["saturation"] || { },
|
|
2730
|
+
colorSaturation = "color" in saturation ? saturation["color"] : saturation,
|
|
2731
|
+
grayscaleSaturation = saturation["grayscale"],
|
|
2732
|
+
|
|
2733
|
+
backColor = configObject["backColor"],
|
|
2734
|
+
padding = configObject["padding"];
|
|
2735
|
+
|
|
2736
|
+
/**
|
|
2737
|
+
* Creates a lightness range.
|
|
2738
|
+
*/
|
|
2739
|
+
function lightness(configName, defaultRange) {
|
|
2740
|
+
var range = lightnessConfig[configName];
|
|
2741
|
+
|
|
2742
|
+
// Check if the lightness range is an array-like object. This way we ensure the
|
|
2743
|
+
// array contain two values at the same time.
|
|
2744
|
+
if (!(range && range.length > 1)) {
|
|
2745
|
+
range = defaultRange;
|
|
2746
|
+
}
|
|
2747
|
+
|
|
2748
|
+
/**
|
|
2749
|
+
* Gets a lightness relative the specified value in the specified lightness range.
|
|
2750
|
+
*/
|
|
2751
|
+
return function (value) {
|
|
2752
|
+
value = range[0] + value * (range[1] - range[0]);
|
|
2753
|
+
return value < 0 ? 0 : value > 1 ? 1 : value;
|
|
2754
|
+
};
|
|
2755
|
+
}
|
|
2756
|
+
|
|
2757
|
+
/**
|
|
2758
|
+
* Gets a hue allowed by the configured hue restriction,
|
|
2759
|
+
* provided the originally computed hue.
|
|
2760
|
+
*/
|
|
2761
|
+
function hueFunction(originalHue) {
|
|
2762
|
+
var hueConfig = configObject["hues"];
|
|
2763
|
+
var hue;
|
|
2764
|
+
|
|
2765
|
+
// Check if 'hues' is an array-like object. This way we also ensure that
|
|
2766
|
+
// the array is not empty, which would mean no hue restriction.
|
|
2767
|
+
if (hueConfig && hueConfig.length > 0) {
|
|
2768
|
+
// originalHue is in the range [0, 1]
|
|
2769
|
+
// Multiply with 0.999 to change the range to [0, 1) and then truncate the index.
|
|
2770
|
+
hue = hueConfig[0 | (0.999 * originalHue * hueConfig.length)];
|
|
2771
|
+
}
|
|
2772
|
+
|
|
2773
|
+
return typeof hue == "number" ?
|
|
2774
|
+
|
|
2775
|
+
// A hue was specified. We need to convert the hue from
|
|
2776
|
+
// degrees on any turn - e.g. 746° is a perfectly valid hue -
|
|
2777
|
+
// to turns in the range [0, 1).
|
|
2778
|
+
((((hue / 360) % 1) + 1) % 1) :
|
|
2779
|
+
|
|
2780
|
+
// No hue configured => use original hue
|
|
2781
|
+
originalHue;
|
|
2782
|
+
}
|
|
2783
|
+
|
|
2784
|
+
return {
|
|
2785
|
+
X/*hue*/: hueFunction,
|
|
2786
|
+
o/*colorSaturation*/: typeof colorSaturation == "number" ? colorSaturation : 0.5,
|
|
2787
|
+
F/*grayscaleSaturation*/: typeof grayscaleSaturation == "number" ? grayscaleSaturation : 0,
|
|
2788
|
+
p/*colorLightness*/: lightness("color", [0.4, 0.8]),
|
|
2789
|
+
G/*grayscaleLightness*/: lightness("grayscale", [0.3, 0.9]),
|
|
2790
|
+
H/*backColor*/: parseColor(backColor),
|
|
2791
|
+
Y/*iconPadding*/:
|
|
2792
|
+
typeof paddingOrLocalConfig == "number" ? paddingOrLocalConfig :
|
|
2793
|
+
typeof padding == "number" ? padding :
|
|
2794
|
+
defaultPadding
|
|
2795
|
+
}
|
|
2796
|
+
}
|
|
2797
|
+
|
|
2798
|
+
/**
|
|
2799
|
+
* Represents a point.
|
|
2800
|
+
*/
|
|
2801
|
+
function Point(x, y) {
|
|
2802
|
+
this.x = x;
|
|
2803
|
+
this.y = y;
|
|
2804
|
+
}
|
|
2805
|
+
|
|
2806
|
+
/**
|
|
2807
|
+
* Translates and rotates a point before being passed on to the canvas context. This was previously done by the canvas context itself,
|
|
2808
|
+
* but this caused a rendering issue in Chrome on sizes > 256 where the rotation transformation of inverted paths was not done properly.
|
|
2809
|
+
*/
|
|
2810
|
+
function Transform(x, y, size, rotation) {
|
|
2811
|
+
this.q/*_x*/ = x;
|
|
2812
|
+
this.t/*_y*/ = y;
|
|
2813
|
+
this.I/*_size*/ = size;
|
|
2814
|
+
this.Z/*_rotation*/ = rotation;
|
|
2815
|
+
}
|
|
2816
|
+
|
|
2817
|
+
/**
|
|
2818
|
+
* Transforms the specified point based on the translation and rotation specification for this Transform.
|
|
2819
|
+
* @param {number} x x-coordinate
|
|
2820
|
+
* @param {number} y y-coordinate
|
|
2821
|
+
* @param {number=} w The width of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle.
|
|
2822
|
+
* @param {number=} h The height of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle.
|
|
2823
|
+
*/
|
|
2824
|
+
Transform.prototype.J/*transformIconPoint*/ = function transformIconPoint (x, y, w, h) {
|
|
2825
|
+
var right = this.q/*_x*/ + this.I/*_size*/,
|
|
2826
|
+
bottom = this.t/*_y*/ + this.I/*_size*/,
|
|
2827
|
+
rotation = this.Z/*_rotation*/;
|
|
2828
|
+
return rotation === 1 ? new Point(right - y - (h || 0), this.t/*_y*/ + x) :
|
|
2829
|
+
rotation === 2 ? new Point(right - x - (w || 0), bottom - y - (h || 0)) :
|
|
2830
|
+
rotation === 3 ? new Point(this.q/*_x*/ + y, bottom - x - (w || 0)) :
|
|
2831
|
+
new Point(this.q/*_x*/ + x, this.t/*_y*/ + y);
|
|
2832
|
+
};
|
|
2833
|
+
|
|
2834
|
+
var NO_TRANSFORM = new Transform(0, 0, 0, 0);
|
|
2835
|
+
|
|
2836
|
+
|
|
2837
|
+
|
|
2838
|
+
/**
|
|
2839
|
+
* Provides helper functions for rendering common basic shapes.
|
|
2840
|
+
*/
|
|
2841
|
+
function Graphics(renderer) {
|
|
2842
|
+
/**
|
|
2843
|
+
* @type {Renderer}
|
|
2844
|
+
* @private
|
|
2845
|
+
*/
|
|
2846
|
+
this.K/*_renderer*/ = renderer;
|
|
2847
|
+
|
|
2848
|
+
/**
|
|
2849
|
+
* @type {Transform}
|
|
2850
|
+
*/
|
|
2851
|
+
this.u/*currentTransform*/ = NO_TRANSFORM;
|
|
2852
|
+
}
|
|
2853
|
+
var Graphics__prototype = Graphics.prototype;
|
|
2854
|
+
|
|
2855
|
+
/**
|
|
2856
|
+
* Adds a polygon to the underlying renderer.
|
|
2857
|
+
* @param {Array<number>} points The points of the polygon clockwise on the format [ x0, y0, x1, y1, ..., xn, yn ]
|
|
2858
|
+
* @param {boolean=} invert Specifies if the polygon will be inverted.
|
|
2859
|
+
*/
|
|
2860
|
+
Graphics__prototype.g/*addPolygon*/ = function addPolygon (points, invert) {
|
|
2861
|
+
var this$1$1 = this;
|
|
2862
|
+
|
|
2863
|
+
var di = invert ? -2 : 2,
|
|
2864
|
+
transformedPoints = [];
|
|
2865
|
+
|
|
2866
|
+
for (var i = invert ? points.length - 2 : 0; i < points.length && i >= 0; i += di) {
|
|
2867
|
+
transformedPoints.push(this$1$1.u/*currentTransform*/.J/*transformIconPoint*/(points[i], points[i + 1]));
|
|
2868
|
+
}
|
|
2869
|
+
|
|
2870
|
+
this.K/*_renderer*/.g/*addPolygon*/(transformedPoints);
|
|
2871
|
+
};
|
|
2872
|
+
|
|
2873
|
+
/**
|
|
2874
|
+
* Adds a polygon to the underlying renderer.
|
|
2875
|
+
* Source: http://stackoverflow.com/a/2173084
|
|
2876
|
+
* @param {number} x The x-coordinate of the upper left corner of the rectangle holding the entire ellipse.
|
|
2877
|
+
* @param {number} y The y-coordinate of the upper left corner of the rectangle holding the entire ellipse.
|
|
2878
|
+
* @param {number} size The size of the ellipse.
|
|
2879
|
+
* @param {boolean=} invert Specifies if the ellipse will be inverted.
|
|
2880
|
+
*/
|
|
2881
|
+
Graphics__prototype.h/*addCircle*/ = function addCircle (x, y, size, invert) {
|
|
2882
|
+
var p = this.u/*currentTransform*/.J/*transformIconPoint*/(x, y, size, size);
|
|
2883
|
+
this.K/*_renderer*/.h/*addCircle*/(p, size, invert);
|
|
2884
|
+
};
|
|
2885
|
+
|
|
2886
|
+
/**
|
|
2887
|
+
* Adds a rectangle to the underlying renderer.
|
|
2888
|
+
* @param {number} x The x-coordinate of the upper left corner of the rectangle.
|
|
2889
|
+
* @param {number} y The y-coordinate of the upper left corner of the rectangle.
|
|
2890
|
+
* @param {number} w The width of the rectangle.
|
|
2891
|
+
* @param {number} h The height of the rectangle.
|
|
2892
|
+
* @param {boolean=} invert Specifies if the rectangle will be inverted.
|
|
2893
|
+
*/
|
|
2894
|
+
Graphics__prototype.i/*addRectangle*/ = function addRectangle (x, y, w, h, invert) {
|
|
2895
|
+
this.g/*addPolygon*/([
|
|
2896
|
+
x, y,
|
|
2897
|
+
x + w, y,
|
|
2898
|
+
x + w, y + h,
|
|
2899
|
+
x, y + h
|
|
2900
|
+
], invert);
|
|
2901
|
+
};
|
|
2902
|
+
|
|
2903
|
+
/**
|
|
2904
|
+
* Adds a right triangle to the underlying renderer.
|
|
2905
|
+
* @param {number} x The x-coordinate of the upper left corner of the rectangle holding the triangle.
|
|
2906
|
+
* @param {number} y The y-coordinate of the upper left corner of the rectangle holding the triangle.
|
|
2907
|
+
* @param {number} w The width of the triangle.
|
|
2908
|
+
* @param {number} h The height of the triangle.
|
|
2909
|
+
* @param {number} r The rotation of the triangle (clockwise). 0 = right corner of the triangle in the lower left corner of the bounding rectangle.
|
|
2910
|
+
* @param {boolean=} invert Specifies if the triangle will be inverted.
|
|
2911
|
+
*/
|
|
2912
|
+
Graphics__prototype.j/*addTriangle*/ = function addTriangle (x, y, w, h, r, invert) {
|
|
2913
|
+
var points = [
|
|
2914
|
+
x + w, y,
|
|
2915
|
+
x + w, y + h,
|
|
2916
|
+
x, y + h,
|
|
2917
|
+
x, y
|
|
2918
|
+
];
|
|
2919
|
+
points.splice(((r || 0) % 4) * 2, 2);
|
|
2920
|
+
this.g/*addPolygon*/(points, invert);
|
|
2921
|
+
};
|
|
2922
|
+
|
|
2923
|
+
/**
|
|
2924
|
+
* Adds a rhombus to the underlying renderer.
|
|
2925
|
+
* @param {number} x The x-coordinate of the upper left corner of the rectangle holding the rhombus.
|
|
2926
|
+
* @param {number} y The y-coordinate of the upper left corner of the rectangle holding the rhombus.
|
|
2927
|
+
* @param {number} w The width of the rhombus.
|
|
2928
|
+
* @param {number} h The height of the rhombus.
|
|
2929
|
+
* @param {boolean=} invert Specifies if the rhombus will be inverted.
|
|
2930
|
+
*/
|
|
2931
|
+
Graphics__prototype.L/*addRhombus*/ = function addRhombus (x, y, w, h, invert) {
|
|
2932
|
+
this.g/*addPolygon*/([
|
|
2933
|
+
x + w / 2, y,
|
|
2934
|
+
x + w, y + h / 2,
|
|
2935
|
+
x + w / 2, y + h,
|
|
2936
|
+
x, y + h / 2
|
|
2937
|
+
], invert);
|
|
2938
|
+
};
|
|
2939
|
+
|
|
2940
|
+
/**
|
|
2941
|
+
* @param {number} index
|
|
2942
|
+
* @param {Graphics} g
|
|
2943
|
+
* @param {number} cell
|
|
2944
|
+
* @param {number} positionIndex
|
|
2945
|
+
*/
|
|
2946
|
+
function centerShape(index, g, cell, positionIndex) {
|
|
2947
|
+
index = index % 14;
|
|
2948
|
+
|
|
2949
|
+
var k, m, w, h, inner, outer;
|
|
2950
|
+
|
|
2951
|
+
!index ? (
|
|
2952
|
+
k = cell * 0.42,
|
|
2953
|
+
g.g/*addPolygon*/([
|
|
2954
|
+
0, 0,
|
|
2955
|
+
cell, 0,
|
|
2956
|
+
cell, cell - k * 2,
|
|
2957
|
+
cell - k, cell,
|
|
2958
|
+
0, cell
|
|
2959
|
+
])) :
|
|
2960
|
+
|
|
2961
|
+
index == 1 ? (
|
|
2962
|
+
w = 0 | (cell * 0.5),
|
|
2963
|
+
h = 0 | (cell * 0.8),
|
|
2964
|
+
|
|
2965
|
+
g.j/*addTriangle*/(cell - w, 0, w, h, 2)) :
|
|
2966
|
+
|
|
2967
|
+
index == 2 ? (
|
|
2968
|
+
w = 0 | (cell / 3),
|
|
2969
|
+
g.i/*addRectangle*/(w, w, cell - w, cell - w)) :
|
|
2970
|
+
|
|
2971
|
+
index == 3 ? (
|
|
2972
|
+
inner = cell * 0.1,
|
|
2973
|
+
// Use fixed outer border widths in small icons to ensure the border is drawn
|
|
2974
|
+
outer =
|
|
2975
|
+
cell < 6 ? 1 :
|
|
2976
|
+
cell < 8 ? 2 :
|
|
2977
|
+
(0 | (cell * 0.25)),
|
|
2978
|
+
|
|
2979
|
+
inner =
|
|
2980
|
+
inner > 1 ? (0 | inner) : // large icon => truncate decimals
|
|
2981
|
+
inner > 0.5 ? 1 : // medium size icon => fixed width
|
|
2982
|
+
inner, // small icon => anti-aliased border
|
|
2983
|
+
|
|
2984
|
+
g.i/*addRectangle*/(outer, outer, cell - inner - outer, cell - inner - outer)) :
|
|
2985
|
+
|
|
2986
|
+
index == 4 ? (
|
|
2987
|
+
m = 0 | (cell * 0.15),
|
|
2988
|
+
w = 0 | (cell * 0.5),
|
|
2989
|
+
g.h/*addCircle*/(cell - w - m, cell - w - m, w)) :
|
|
2990
|
+
|
|
2991
|
+
index == 5 ? (
|
|
2992
|
+
inner = cell * 0.1,
|
|
2993
|
+
outer = inner * 4,
|
|
2994
|
+
|
|
2995
|
+
// Align edge to nearest pixel in large icons
|
|
2996
|
+
outer > 3 && (outer = 0 | outer),
|
|
2997
|
+
|
|
2998
|
+
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
2999
|
+
g.g/*addPolygon*/([
|
|
3000
|
+
outer, outer,
|
|
3001
|
+
cell - inner, outer,
|
|
3002
|
+
outer + (cell - outer - inner) / 2, cell - inner
|
|
3003
|
+
], true)) :
|
|
3004
|
+
|
|
3005
|
+
index == 6 ?
|
|
3006
|
+
g.g/*addPolygon*/([
|
|
3007
|
+
0, 0,
|
|
3008
|
+
cell, 0,
|
|
3009
|
+
cell, cell * 0.7,
|
|
3010
|
+
cell * 0.4, cell * 0.4,
|
|
3011
|
+
cell * 0.7, cell,
|
|
3012
|
+
0, cell
|
|
3013
|
+
]) :
|
|
3014
|
+
|
|
3015
|
+
index == 7 ?
|
|
3016
|
+
g.j/*addTriangle*/(cell / 2, cell / 2, cell / 2, cell / 2, 3) :
|
|
3017
|
+
|
|
3018
|
+
index == 8 ? (
|
|
3019
|
+
g.i/*addRectangle*/(0, 0, cell, cell / 2),
|
|
3020
|
+
g.i/*addRectangle*/(0, cell / 2, cell / 2, cell / 2),
|
|
3021
|
+
g.j/*addTriangle*/(cell / 2, cell / 2, cell / 2, cell / 2, 1)) :
|
|
3022
|
+
|
|
3023
|
+
index == 9 ? (
|
|
3024
|
+
inner = cell * 0.14,
|
|
3025
|
+
// Use fixed outer border widths in small icons to ensure the border is drawn
|
|
3026
|
+
outer =
|
|
3027
|
+
cell < 4 ? 1 :
|
|
3028
|
+
cell < 6 ? 2 :
|
|
3029
|
+
(0 | (cell * 0.35)),
|
|
3030
|
+
|
|
3031
|
+
inner =
|
|
3032
|
+
cell < 8 ? inner : // small icon => anti-aliased border
|
|
3033
|
+
(0 | inner), // large icon => truncate decimals
|
|
3034
|
+
|
|
3035
|
+
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
3036
|
+
g.i/*addRectangle*/(outer, outer, cell - outer - inner, cell - outer - inner, true)) :
|
|
3037
|
+
|
|
3038
|
+
index == 10 ? (
|
|
3039
|
+
inner = cell * 0.12,
|
|
3040
|
+
outer = inner * 3,
|
|
3041
|
+
|
|
3042
|
+
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
3043
|
+
g.h/*addCircle*/(outer, outer, cell - inner - outer, true)) :
|
|
3044
|
+
|
|
3045
|
+
index == 11 ?
|
|
3046
|
+
g.j/*addTriangle*/(cell / 2, cell / 2, cell / 2, cell / 2, 3) :
|
|
3047
|
+
|
|
3048
|
+
index == 12 ? (
|
|
3049
|
+
m = cell * 0.25,
|
|
3050
|
+
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
3051
|
+
g.L/*addRhombus*/(m, m, cell - m, cell - m, true)) :
|
|
3052
|
+
|
|
3053
|
+
// 13
|
|
3054
|
+
(
|
|
3055
|
+
!positionIndex && (
|
|
3056
|
+
m = cell * 0.4, w = cell * 1.2,
|
|
3057
|
+
g.h/*addCircle*/(m, m, w)
|
|
3058
|
+
)
|
|
3059
|
+
);
|
|
3060
|
+
}
|
|
3061
|
+
|
|
3062
|
+
/**
|
|
3063
|
+
* @param {number} index
|
|
3064
|
+
* @param {Graphics} g
|
|
3065
|
+
* @param {number} cell
|
|
3066
|
+
*/
|
|
3067
|
+
function outerShape(index, g, cell) {
|
|
3068
|
+
index = index % 4;
|
|
3069
|
+
|
|
3070
|
+
var m;
|
|
3071
|
+
|
|
3072
|
+
!index ?
|
|
3073
|
+
g.j/*addTriangle*/(0, 0, cell, cell, 0) :
|
|
3074
|
+
|
|
3075
|
+
index == 1 ?
|
|
3076
|
+
g.j/*addTriangle*/(0, cell / 2, cell, cell / 2, 0) :
|
|
3077
|
+
|
|
3078
|
+
index == 2 ?
|
|
3079
|
+
g.L/*addRhombus*/(0, 0, cell, cell) :
|
|
3080
|
+
|
|
3081
|
+
// 3
|
|
3082
|
+
(
|
|
3083
|
+
m = cell / 6,
|
|
3084
|
+
g.h/*addCircle*/(m, m, cell - 2 * m)
|
|
3085
|
+
);
|
|
3086
|
+
}
|
|
3087
|
+
|
|
3088
|
+
/**
|
|
3089
|
+
* Gets a set of identicon color candidates for a specified hue and config.
|
|
3090
|
+
* @param {number} hue
|
|
3091
|
+
* @param {ParsedConfiguration} config
|
|
3092
|
+
*/
|
|
3093
|
+
function colorTheme(hue, config) {
|
|
3094
|
+
hue = config.X/*hue*/(hue);
|
|
3095
|
+
return [
|
|
3096
|
+
// Dark gray
|
|
3097
|
+
correctedHsl(hue, config.F/*grayscaleSaturation*/, config.G/*grayscaleLightness*/(0)),
|
|
3098
|
+
// Mid color
|
|
3099
|
+
correctedHsl(hue, config.o/*colorSaturation*/, config.p/*colorLightness*/(0.5)),
|
|
3100
|
+
// Light gray
|
|
3101
|
+
correctedHsl(hue, config.F/*grayscaleSaturation*/, config.G/*grayscaleLightness*/(1)),
|
|
3102
|
+
// Light color
|
|
3103
|
+
correctedHsl(hue, config.o/*colorSaturation*/, config.p/*colorLightness*/(1)),
|
|
3104
|
+
// Dark color
|
|
3105
|
+
correctedHsl(hue, config.o/*colorSaturation*/, config.p/*colorLightness*/(0))
|
|
3106
|
+
];
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3109
|
+
/**
|
|
3110
|
+
* Draws an identicon to a specified renderer.
|
|
3111
|
+
* @param {Renderer} renderer
|
|
3112
|
+
* @param {string} hash
|
|
3113
|
+
* @param {Object|number=} config
|
|
3114
|
+
*/
|
|
3115
|
+
function iconGenerator(renderer, hash, config) {
|
|
3116
|
+
var parsedConfig = getConfiguration(config, 0.08);
|
|
3117
|
+
|
|
3118
|
+
// Set background color
|
|
3119
|
+
if (parsedConfig.H/*backColor*/) {
|
|
3120
|
+
renderer.m/*setBackground*/(parsedConfig.H/*backColor*/);
|
|
3121
|
+
}
|
|
3122
|
+
|
|
3123
|
+
// Calculate padding and round to nearest integer
|
|
3124
|
+
var size = renderer.k/*iconSize*/;
|
|
3125
|
+
var padding = (0.5 + size * parsedConfig.Y/*iconPadding*/) | 0;
|
|
3126
|
+
size -= padding * 2;
|
|
3127
|
+
|
|
3128
|
+
var graphics = new Graphics(renderer);
|
|
3129
|
+
|
|
3130
|
+
// Calculate cell size and ensure it is an integer
|
|
3131
|
+
var cell = 0 | (size / 4);
|
|
3132
|
+
|
|
3133
|
+
// Since the cell size is integer based, the actual icon will be slightly smaller than specified => center icon
|
|
3134
|
+
var x = 0 | (padding + size / 2 - cell * 2);
|
|
3135
|
+
var y = 0 | (padding + size / 2 - cell * 2);
|
|
3136
|
+
|
|
3137
|
+
function renderShape(colorIndex, shapes, index, rotationIndex, positions) {
|
|
3138
|
+
var shapeIndex = parseHex(hash, index, 1);
|
|
3139
|
+
var r = rotationIndex ? parseHex(hash, rotationIndex, 1) : 0;
|
|
3140
|
+
|
|
3141
|
+
renderer.M/*beginShape*/(availableColors[selectedColorIndexes[colorIndex]]);
|
|
3142
|
+
|
|
3143
|
+
for (var i = 0; i < positions.length; i++) {
|
|
3144
|
+
graphics.u/*currentTransform*/ = new Transform(x + positions[i][0] * cell, y + positions[i][1] * cell, cell, r++ % 4);
|
|
3145
|
+
shapes(shapeIndex, graphics, cell, i);
|
|
3146
|
+
}
|
|
3147
|
+
|
|
3148
|
+
renderer.N/*endShape*/();
|
|
3149
|
+
}
|
|
3150
|
+
|
|
3151
|
+
// AVAILABLE COLORS
|
|
3152
|
+
var hue = parseHex(hash, -7) / 0xfffffff,
|
|
3153
|
+
|
|
3154
|
+
// Available colors for this icon
|
|
3155
|
+
availableColors = colorTheme(hue, parsedConfig),
|
|
3156
|
+
|
|
3157
|
+
// The index of the selected colors
|
|
3158
|
+
selectedColorIndexes = [];
|
|
3159
|
+
|
|
3160
|
+
var index;
|
|
3161
|
+
|
|
3162
|
+
function isDuplicate(values) {
|
|
3163
|
+
if (values.indexOf(index) >= 0) {
|
|
3164
|
+
for (var i = 0; i < values.length; i++) {
|
|
3165
|
+
if (selectedColorIndexes.indexOf(values[i]) >= 0) {
|
|
3166
|
+
return true;
|
|
3167
|
+
}
|
|
3168
|
+
}
|
|
3169
|
+
}
|
|
3170
|
+
}
|
|
3171
|
+
|
|
3172
|
+
for (var i = 0; i < 3; i++) {
|
|
3173
|
+
index = parseHex(hash, 8 + i, 1) % availableColors.length;
|
|
3174
|
+
if (isDuplicate([0, 4]) || // Disallow dark gray and dark color combo
|
|
3175
|
+
isDuplicate([2, 3])) { // Disallow light gray and light color combo
|
|
3176
|
+
index = 1;
|
|
3177
|
+
}
|
|
3178
|
+
selectedColorIndexes.push(index);
|
|
3179
|
+
}
|
|
3180
|
+
|
|
3181
|
+
// ACTUAL RENDERING
|
|
3182
|
+
// Sides
|
|
3183
|
+
renderShape(0, outerShape, 2, 3, [[1, 0], [2, 0], [2, 3], [1, 3], [0, 1], [3, 1], [3, 2], [0, 2]]);
|
|
3184
|
+
// Corners
|
|
3185
|
+
renderShape(1, outerShape, 4, 5, [[0, 0], [3, 0], [3, 3], [0, 3]]);
|
|
3186
|
+
// Center
|
|
3187
|
+
renderShape(2, centerShape, 1, null, [[1, 1], [2, 1], [2, 2], [1, 2]]);
|
|
3188
|
+
|
|
3189
|
+
renderer.finish();
|
|
3190
|
+
}
|
|
3191
|
+
|
|
3192
|
+
/**
|
|
3193
|
+
* Computes a SHA1 hash for any value and returns it as a hexadecimal string.
|
|
3194
|
+
*
|
|
3195
|
+
* This function is optimized for minimal code size and rather short messages.
|
|
3196
|
+
*
|
|
3197
|
+
* @param {string} message
|
|
3198
|
+
*/
|
|
3199
|
+
function sha1(message) {
|
|
3200
|
+
var HASH_SIZE_HALF_BYTES = 40;
|
|
3201
|
+
var BLOCK_SIZE_WORDS = 16;
|
|
3202
|
+
|
|
3203
|
+
// Variables
|
|
3204
|
+
// `var` is used to be able to minimize the number of `var` keywords.
|
|
3205
|
+
var i = 0,
|
|
3206
|
+
f = 0,
|
|
3207
|
+
|
|
3208
|
+
// Use `encodeURI` to UTF8 encode the message without any additional libraries
|
|
3209
|
+
// We could use `unescape` + `encodeURI` to minimize the code, but that would be slightly risky
|
|
3210
|
+
// since `unescape` is deprecated.
|
|
3211
|
+
urlEncodedMessage = encodeURI(message) + "%80", // trailing '1' bit padding
|
|
3212
|
+
|
|
3213
|
+
// This can be changed to a preallocated Uint32Array array for greater performance and larger code size
|
|
3214
|
+
data = [],
|
|
3215
|
+
dataSize,
|
|
3216
|
+
|
|
3217
|
+
hashBuffer = [],
|
|
3218
|
+
|
|
3219
|
+
a = 0x67452301,
|
|
3220
|
+
b = 0xefcdab89,
|
|
3221
|
+
c = ~a,
|
|
3222
|
+
d = ~b,
|
|
3223
|
+
e = 0xc3d2e1f0,
|
|
3224
|
+
hash = [a, b, c, d, e],
|
|
3225
|
+
|
|
3226
|
+
blockStartIndex = 0,
|
|
3227
|
+
hexHash = "";
|
|
3228
|
+
|
|
3229
|
+
/**
|
|
3230
|
+
* Rotates the value a specified number of bits to the left.
|
|
3231
|
+
* @param {number} value Value to rotate
|
|
3232
|
+
* @param {number} shift Bit count to shift.
|
|
3233
|
+
*/
|
|
3234
|
+
function rotl(value, shift) {
|
|
3235
|
+
return (value << shift) | (value >>> (32 - shift));
|
|
3236
|
+
}
|
|
3237
|
+
|
|
3238
|
+
// Message data
|
|
3239
|
+
for ( ; i < urlEncodedMessage.length; f++) {
|
|
3240
|
+
data[f >> 2] = data[f >> 2] |
|
|
3241
|
+
(
|
|
3242
|
+
(
|
|
3243
|
+
urlEncodedMessage[i] == "%"
|
|
3244
|
+
// Percent encoded byte
|
|
3245
|
+
? parseInt(urlEncodedMessage.substring(i + 1, i += 3), 16)
|
|
3246
|
+
// Unencoded byte
|
|
3247
|
+
: urlEncodedMessage.charCodeAt(i++)
|
|
3248
|
+
)
|
|
3249
|
+
|
|
3250
|
+
// Read bytes in reverse order (big endian words)
|
|
3251
|
+
<< ((3 - (f & 3)) * 8)
|
|
3252
|
+
);
|
|
3253
|
+
}
|
|
3254
|
+
|
|
3255
|
+
// f is now the length of the utf8 encoded message
|
|
3256
|
+
// 7 = 8 bytes (64 bit) for message size, -1 to round down
|
|
3257
|
+
// >> 6 = integer division with block size
|
|
3258
|
+
dataSize = (((f + 7) >> 6) + 1) * BLOCK_SIZE_WORDS;
|
|
3259
|
+
|
|
3260
|
+
// Message size in bits.
|
|
3261
|
+
// SHA1 uses a 64 bit integer to represent the size, but since we only support short messages only the least
|
|
3262
|
+
// significant 32 bits are set. -8 is for the '1' bit padding byte.
|
|
3263
|
+
data[dataSize - 1] = f * 8 - 8;
|
|
3264
|
+
|
|
3265
|
+
// Compute hash
|
|
3266
|
+
for ( ; blockStartIndex < dataSize; blockStartIndex += BLOCK_SIZE_WORDS) {
|
|
3267
|
+
for (i = 0; i < 80; i++) {
|
|
3268
|
+
f = rotl(a, 5) + e + (
|
|
3269
|
+
// Ch
|
|
3270
|
+
i < 20 ? ((b & c) ^ ((~b) & d)) + 0x5a827999 :
|
|
3271
|
+
|
|
3272
|
+
// Parity
|
|
3273
|
+
i < 40 ? (b ^ c ^ d) + 0x6ed9eba1 :
|
|
3274
|
+
|
|
3275
|
+
// Maj
|
|
3276
|
+
i < 60 ? ((b & c) ^ (b & d) ^ (c & d)) + 0x8f1bbcdc :
|
|
3277
|
+
|
|
3278
|
+
// Parity
|
|
3279
|
+
(b ^ c ^ d) + 0xca62c1d6
|
|
3280
|
+
) + (
|
|
3281
|
+
hashBuffer[i] = i < BLOCK_SIZE_WORDS
|
|
3282
|
+
// Bitwise OR is used to coerse `undefined` to 0
|
|
3283
|
+
? (data[blockStartIndex + i] | 0)
|
|
3284
|
+
: rotl(hashBuffer[i - 3] ^ hashBuffer[i - 8] ^ hashBuffer[i - 14] ^ hashBuffer[i - 16], 1)
|
|
3285
|
+
);
|
|
3286
|
+
|
|
3287
|
+
e = d;
|
|
3288
|
+
d = c;
|
|
3289
|
+
c = rotl(b, 30);
|
|
3290
|
+
b = a;
|
|
3291
|
+
a = f;
|
|
3292
|
+
}
|
|
3293
|
+
|
|
3294
|
+
hash[0] = a = ((hash[0] + a) | 0);
|
|
3295
|
+
hash[1] = b = ((hash[1] + b) | 0);
|
|
3296
|
+
hash[2] = c = ((hash[2] + c) | 0);
|
|
3297
|
+
hash[3] = d = ((hash[3] + d) | 0);
|
|
3298
|
+
hash[4] = e = ((hash[4] + e) | 0);
|
|
3299
|
+
}
|
|
3300
|
+
|
|
3301
|
+
// Format hex hash
|
|
3302
|
+
for (i = 0; i < HASH_SIZE_HALF_BYTES; i++) {
|
|
3303
|
+
hexHash += (
|
|
3304
|
+
(
|
|
3305
|
+
// Get word (2^3 half-bytes per word)
|
|
3306
|
+
hash[i >> 3] >>>
|
|
3307
|
+
|
|
3308
|
+
// Append half-bytes in reverse order
|
|
3309
|
+
((7 - (i & 7)) * 4)
|
|
3310
|
+
)
|
|
3311
|
+
// Clamp to half-byte
|
|
3312
|
+
& 0xf
|
|
3313
|
+
).toString(16);
|
|
3314
|
+
}
|
|
3315
|
+
|
|
3316
|
+
return hexHash;
|
|
3317
|
+
}
|
|
3318
|
+
|
|
3319
|
+
/**
|
|
3320
|
+
* Inputs a value that might be a valid hash string for Jdenticon and returns it
|
|
3321
|
+
* if it is determined valid, otherwise a falsy value is returned.
|
|
3322
|
+
*/
|
|
3323
|
+
function isValidHash(hashCandidate) {
|
|
3324
|
+
return /^[0-9a-f]{11,}$/i.test(hashCandidate) && hashCandidate;
|
|
3325
|
+
}
|
|
3326
|
+
|
|
3327
|
+
/**
|
|
3328
|
+
* Computes a hash for the specified value. Currently SHA1 is used. This function
|
|
3329
|
+
* always returns a valid hash.
|
|
3330
|
+
*/
|
|
3331
|
+
function computeHash(value) {
|
|
3332
|
+
return sha1(value == null ? "" : "" + value);
|
|
3333
|
+
}
|
|
3334
|
+
|
|
3335
|
+
|
|
3336
|
+
|
|
3337
|
+
/**
|
|
3338
|
+
* Renderer redirecting drawing commands to a canvas context.
|
|
3339
|
+
* @implements {Renderer}
|
|
3340
|
+
*/
|
|
3341
|
+
function CanvasRenderer(ctx, iconSize) {
|
|
3342
|
+
var canvas = ctx.canvas;
|
|
3343
|
+
var width = canvas.width;
|
|
3344
|
+
var height = canvas.height;
|
|
3345
|
+
|
|
3346
|
+
ctx.save();
|
|
3347
|
+
|
|
3348
|
+
if (!iconSize) {
|
|
3349
|
+
iconSize = Math.min(width, height);
|
|
3350
|
+
|
|
3351
|
+
ctx.translate(
|
|
3352
|
+
((width - iconSize) / 2) | 0,
|
|
3353
|
+
((height - iconSize) / 2) | 0);
|
|
3354
|
+
}
|
|
3355
|
+
|
|
3356
|
+
/**
|
|
3357
|
+
* @private
|
|
3358
|
+
*/
|
|
3359
|
+
this.l/*_ctx*/ = ctx;
|
|
3360
|
+
this.k/*iconSize*/ = iconSize;
|
|
3361
|
+
|
|
3362
|
+
ctx.clearRect(0, 0, iconSize, iconSize);
|
|
3363
|
+
}
|
|
3364
|
+
var CanvasRenderer__prototype = CanvasRenderer.prototype;
|
|
3365
|
+
|
|
3366
|
+
/**
|
|
3367
|
+
* Fills the background with the specified color.
|
|
3368
|
+
* @param {string} fillColor Fill color on the format #rrggbb[aa].
|
|
3369
|
+
*/
|
|
3370
|
+
CanvasRenderer__prototype.m/*setBackground*/ = function setBackground (fillColor) {
|
|
3371
|
+
var ctx = this.l/*_ctx*/;
|
|
3372
|
+
var iconSize = this.k/*iconSize*/;
|
|
3373
|
+
|
|
3374
|
+
ctx.fillStyle = toCss3Color(fillColor);
|
|
3375
|
+
ctx.fillRect(0, 0, iconSize, iconSize);
|
|
3376
|
+
};
|
|
3377
|
+
|
|
3378
|
+
/**
|
|
3379
|
+
* Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape.
|
|
3380
|
+
* @param {string} fillColor Fill color on format #rrggbb[aa].
|
|
3381
|
+
*/
|
|
3382
|
+
CanvasRenderer__prototype.M/*beginShape*/ = function beginShape (fillColor) {
|
|
3383
|
+
var ctx = this.l/*_ctx*/;
|
|
3384
|
+
ctx.fillStyle = toCss3Color(fillColor);
|
|
3385
|
+
ctx.beginPath();
|
|
3386
|
+
};
|
|
3387
|
+
|
|
3388
|
+
/**
|
|
3389
|
+
* Marks the end of the currently drawn shape. This causes the queued paths to be rendered on the canvas.
|
|
3390
|
+
*/
|
|
3391
|
+
CanvasRenderer__prototype.N/*endShape*/ = function endShape () {
|
|
3392
|
+
this.l/*_ctx*/.fill();
|
|
3393
|
+
};
|
|
3394
|
+
|
|
3395
|
+
/**
|
|
3396
|
+
* Adds a polygon to the rendering queue.
|
|
3397
|
+
* @param points An array of Point objects.
|
|
3398
|
+
*/
|
|
3399
|
+
CanvasRenderer__prototype.g/*addPolygon*/ = function addPolygon (points) {
|
|
3400
|
+
var ctx = this.l/*_ctx*/;
|
|
3401
|
+
ctx.moveTo(points[0].x, points[0].y);
|
|
3402
|
+
for (var i = 1; i < points.length; i++) {
|
|
3403
|
+
ctx.lineTo(points[i].x, points[i].y);
|
|
3404
|
+
}
|
|
3405
|
+
ctx.closePath();
|
|
3406
|
+
};
|
|
3407
|
+
|
|
3408
|
+
/**
|
|
3409
|
+
* Adds a circle to the rendering queue.
|
|
3410
|
+
* @param {Point} point The upper left corner of the circle bounding box.
|
|
3411
|
+
* @param {number} diameter The diameter of the circle.
|
|
3412
|
+
* @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path).
|
|
3413
|
+
*/
|
|
3414
|
+
CanvasRenderer__prototype.h/*addCircle*/ = function addCircle (point, diameter, counterClockwise) {
|
|
3415
|
+
var ctx = this.l/*_ctx*/,
|
|
3416
|
+
radius = diameter / 2;
|
|
3417
|
+
ctx.moveTo(point.x + radius, point.y + radius);
|
|
3418
|
+
ctx.arc(point.x + radius, point.y + radius, radius, 0, Math.PI * 2, counterClockwise);
|
|
3419
|
+
ctx.closePath();
|
|
3420
|
+
};
|
|
3421
|
+
|
|
3422
|
+
/**
|
|
3423
|
+
* Called when the icon has been completely drawn.
|
|
3424
|
+
*/
|
|
3425
|
+
CanvasRenderer__prototype.finish = function finish () {
|
|
3426
|
+
this.l/*_ctx*/.restore();
|
|
3427
|
+
};
|
|
3428
|
+
|
|
3429
|
+
var ICON_TYPE_SVG = 1;
|
|
3430
|
+
|
|
3431
|
+
var ICON_TYPE_CANVAS = 2;
|
|
3432
|
+
|
|
3433
|
+
var ATTRIBUTES = {
|
|
3434
|
+
O/*HASH*/: "data-jdenticon-hash",
|
|
3435
|
+
v/*VALUE*/: "data-jdenticon-value"
|
|
3436
|
+
};
|
|
3437
|
+
|
|
3438
|
+
var IS_RENDERED_PROPERTY = "jdenticonRendered";
|
|
3439
|
+
|
|
3440
|
+
var ICON_SELECTOR = "[" + ATTRIBUTES.O/*HASH*/ +"],[" + ATTRIBUTES.v/*VALUE*/ +"]";
|
|
3441
|
+
|
|
3442
|
+
var documentQuerySelectorAll = /** @type {!Function} */ (
|
|
3443
|
+
typeof document !== "undefined" && document.querySelectorAll.bind(document));
|
|
3444
|
+
|
|
3445
|
+
function getIdenticonType(el) {
|
|
3446
|
+
if (el) {
|
|
3447
|
+
var tagName = el["tagName"];
|
|
3448
|
+
|
|
3449
|
+
if (/^svg$/i.test(tagName)) {
|
|
3450
|
+
return ICON_TYPE_SVG;
|
|
3451
|
+
}
|
|
3452
|
+
|
|
3453
|
+
if (/^canvas$/i.test(tagName) && "getContext" in el) {
|
|
3454
|
+
return ICON_TYPE_CANVAS;
|
|
3455
|
+
}
|
|
3456
|
+
}
|
|
3457
|
+
}
|
|
3458
|
+
|
|
3459
|
+
/**
|
|
3460
|
+
* Draws an identicon to a context.
|
|
3461
|
+
* @param {CanvasRenderingContext2D} ctx - Canvas context on which the icon will be drawn at location (0, 0).
|
|
3462
|
+
* @param {*} hashOrValue - A hexadecimal hash string or any value that will be hashed by Jdenticon.
|
|
3463
|
+
* @param {number} size - Icon size in pixels.
|
|
3464
|
+
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3465
|
+
* global configuration in its entirety. For backward compatibility a padding value in the range [0.0, 0.5) can be
|
|
3466
|
+
* specified in place of a configuration object.
|
|
3467
|
+
*/
|
|
3468
|
+
function drawIcon(ctx, hashOrValue, size, config) {
|
|
3469
|
+
if (!ctx) {
|
|
3470
|
+
throw new Error("No canvas specified.");
|
|
3471
|
+
}
|
|
3472
|
+
|
|
3473
|
+
iconGenerator(new CanvasRenderer(ctx, size),
|
|
3474
|
+
isValidHash(hashOrValue) || computeHash(hashOrValue),
|
|
3475
|
+
config);
|
|
3476
|
+
|
|
3477
|
+
var canvas = ctx.canvas;
|
|
3478
|
+
if (canvas) {
|
|
3479
|
+
canvas[IS_RENDERED_PROPERTY] = true;
|
|
3480
|
+
}
|
|
3481
|
+
}
|
|
3482
|
+
|
|
3483
|
+
/**
|
|
3484
|
+
* Prepares a measure to be used as a measure in an SVG path, by
|
|
3485
|
+
* rounding the measure to a single decimal. This reduces the file
|
|
3486
|
+
* size of the generated SVG with more than 50% in some cases.
|
|
3487
|
+
*/
|
|
3488
|
+
function svgValue(value) {
|
|
3489
|
+
return ((value * 10 + 0.5) | 0) / 10;
|
|
3490
|
+
}
|
|
3491
|
+
|
|
3492
|
+
/**
|
|
3493
|
+
* Represents an SVG path element.
|
|
3494
|
+
*/
|
|
3495
|
+
function SvgPath() {
|
|
3496
|
+
/**
|
|
3497
|
+
* This property holds the data string (path.d) of the SVG path.
|
|
3498
|
+
* @type {string}
|
|
3499
|
+
*/
|
|
3500
|
+
this.A/*dataString*/ = "";
|
|
3501
|
+
}
|
|
3502
|
+
var SvgPath__prototype = SvgPath.prototype;
|
|
3503
|
+
|
|
3504
|
+
/**
|
|
3505
|
+
* Adds a polygon with the current fill color to the SVG path.
|
|
3506
|
+
* @param points An array of Point objects.
|
|
3507
|
+
*/
|
|
3508
|
+
SvgPath__prototype.g/*addPolygon*/ = function addPolygon (points) {
|
|
3509
|
+
var dataString = "";
|
|
3510
|
+
for (var i = 0; i < points.length; i++) {
|
|
3511
|
+
dataString += (i ? "L" : "M") + svgValue(points[i].x) + " " + svgValue(points[i].y);
|
|
3512
|
+
}
|
|
3513
|
+
this.A/*dataString*/ += dataString + "Z";
|
|
3514
|
+
};
|
|
3515
|
+
|
|
3516
|
+
/**
|
|
3517
|
+
* Adds a circle with the current fill color to the SVG path.
|
|
3518
|
+
* @param {Point} point The upper left corner of the circle bounding box.
|
|
3519
|
+
* @param {number} diameter The diameter of the circle.
|
|
3520
|
+
* @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path).
|
|
3521
|
+
*/
|
|
3522
|
+
SvgPath__prototype.h/*addCircle*/ = function addCircle (point, diameter, counterClockwise) {
|
|
3523
|
+
var sweepFlag = counterClockwise ? 0 : 1,
|
|
3524
|
+
svgRadius = svgValue(diameter / 2),
|
|
3525
|
+
svgDiameter = svgValue(diameter),
|
|
3526
|
+
svgArc = "a" + svgRadius + "," + svgRadius + " 0 1," + sweepFlag + " ";
|
|
3527
|
+
|
|
3528
|
+
this.A/*dataString*/ +=
|
|
3529
|
+
"M" + svgValue(point.x) + " " + svgValue(point.y + diameter / 2) +
|
|
3530
|
+
svgArc + svgDiameter + ",0" +
|
|
3531
|
+
svgArc + (-svgDiameter) + ",0";
|
|
3532
|
+
};
|
|
3533
|
+
|
|
3534
|
+
|
|
3535
|
+
|
|
3536
|
+
/**
|
|
3537
|
+
* Renderer producing SVG output.
|
|
3538
|
+
* @implements {Renderer}
|
|
3539
|
+
*/
|
|
3540
|
+
function SvgRenderer(target) {
|
|
3541
|
+
|
|
3542
|
+
/**
|
|
3543
|
+
* @type {Object.<string,SvgPath>}
|
|
3544
|
+
* @private
|
|
3545
|
+
*/
|
|
3546
|
+
this.C/*_pathsByColor*/ = { };
|
|
3547
|
+
|
|
3548
|
+
/**
|
|
3549
|
+
* @type {SvgElement|SvgWriter}
|
|
3550
|
+
* @private
|
|
3551
|
+
*/
|
|
3552
|
+
this.P/*_target*/ = target;
|
|
3553
|
+
|
|
3554
|
+
/**
|
|
3555
|
+
* @type {number}
|
|
3556
|
+
*/
|
|
3557
|
+
this.k/*iconSize*/ = target.k/*iconSize*/;
|
|
3558
|
+
}
|
|
3559
|
+
var SvgRenderer__prototype = SvgRenderer.prototype;
|
|
3560
|
+
|
|
3561
|
+
/**
|
|
3562
|
+
* Fills the background with the specified color.
|
|
3563
|
+
* @param {string} fillColor Fill color on the format #rrggbb[aa].
|
|
3564
|
+
*/
|
|
3565
|
+
SvgRenderer__prototype.m/*setBackground*/ = function setBackground (fillColor) {
|
|
3566
|
+
var match = /^(#......)(..)?/.exec(fillColor),
|
|
3567
|
+
opacity = match[2] ? parseHex(match[2], 0) / 255 : 1;
|
|
3568
|
+
this.P/*_target*/.m/*setBackground*/(match[1], opacity);
|
|
3569
|
+
};
|
|
3570
|
+
|
|
3571
|
+
/**
|
|
3572
|
+
* Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape.
|
|
3573
|
+
* @param {string} color Fill color on format #xxxxxx.
|
|
3574
|
+
*/
|
|
3575
|
+
SvgRenderer__prototype.M/*beginShape*/ = function beginShape (color) {
|
|
3576
|
+
this.B/*_path*/ = this.C/*_pathsByColor*/[color] || (this.C/*_pathsByColor*/[color] = new SvgPath());
|
|
3577
|
+
};
|
|
3578
|
+
|
|
3579
|
+
/**
|
|
3580
|
+
* Marks the end of the currently drawn shape.
|
|
3581
|
+
*/
|
|
3582
|
+
SvgRenderer__prototype.N/*endShape*/ = function endShape () { };
|
|
3583
|
+
|
|
3584
|
+
/**
|
|
3585
|
+
* Adds a polygon with the current fill color to the SVG.
|
|
3586
|
+
* @param points An array of Point objects.
|
|
3587
|
+
*/
|
|
3588
|
+
SvgRenderer__prototype.g/*addPolygon*/ = function addPolygon (points) {
|
|
3589
|
+
this.B/*_path*/.g/*addPolygon*/(points);
|
|
3590
|
+
};
|
|
3591
|
+
|
|
3592
|
+
/**
|
|
3593
|
+
* Adds a circle with the current fill color to the SVG.
|
|
3594
|
+
* @param {Point} point The upper left corner of the circle bounding box.
|
|
3595
|
+
* @param {number} diameter The diameter of the circle.
|
|
3596
|
+
* @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path).
|
|
3597
|
+
*/
|
|
3598
|
+
SvgRenderer__prototype.h/*addCircle*/ = function addCircle (point, diameter, counterClockwise) {
|
|
3599
|
+
this.B/*_path*/.h/*addCircle*/(point, diameter, counterClockwise);
|
|
3600
|
+
};
|
|
3601
|
+
|
|
3602
|
+
/**
|
|
3603
|
+
* Called when the icon has been completely drawn.
|
|
3604
|
+
*/
|
|
3605
|
+
SvgRenderer__prototype.finish = function finish () {
|
|
3606
|
+
var this$1$1 = this;
|
|
3607
|
+
|
|
3608
|
+
var pathsByColor = this.C/*_pathsByColor*/;
|
|
3609
|
+
for (var color in pathsByColor) {
|
|
3610
|
+
// hasOwnProperty cannot be shadowed in pathsByColor
|
|
3611
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
3612
|
+
if (pathsByColor.hasOwnProperty(color)) {
|
|
3613
|
+
this$1$1.P/*_target*/.R/*appendPath*/(color, pathsByColor[color].A/*dataString*/);
|
|
3614
|
+
}
|
|
3615
|
+
}
|
|
3616
|
+
};
|
|
3617
|
+
|
|
3618
|
+
var SVG_CONSTANTS = {
|
|
3619
|
+
S/*XMLNS*/: "http://www.w3.org/2000/svg",
|
|
3620
|
+
T/*WIDTH*/: "width",
|
|
3621
|
+
U/*HEIGHT*/: "height",
|
|
3622
|
+
};
|
|
3623
|
+
|
|
3624
|
+
/**
|
|
3625
|
+
* Renderer producing SVG output.
|
|
3626
|
+
*/
|
|
3627
|
+
function SvgWriter(iconSize) {
|
|
3628
|
+
/**
|
|
3629
|
+
* @type {number}
|
|
3630
|
+
*/
|
|
3631
|
+
this.k/*iconSize*/ = iconSize;
|
|
3632
|
+
|
|
3633
|
+
/**
|
|
3634
|
+
* @type {string}
|
|
3635
|
+
* @private
|
|
3636
|
+
*/
|
|
3637
|
+
this.D/*_s*/ =
|
|
3638
|
+
'<svg xmlns="' + SVG_CONSTANTS.S/*XMLNS*/ + '" width="' +
|
|
3639
|
+
iconSize + '" height="' + iconSize + '" viewBox="0 0 ' +
|
|
3640
|
+
iconSize + ' ' + iconSize + '">';
|
|
3641
|
+
}
|
|
3642
|
+
var SvgWriter__prototype = SvgWriter.prototype;
|
|
3643
|
+
|
|
3644
|
+
/**
|
|
3645
|
+
* Fills the background with the specified color.
|
|
3646
|
+
* @param {string} fillColor Fill color on the format #rrggbb.
|
|
3647
|
+
* @param {number} opacity Opacity in the range [0.0, 1.0].
|
|
3648
|
+
*/
|
|
3649
|
+
SvgWriter__prototype.m/*setBackground*/ = function setBackground (fillColor, opacity) {
|
|
3650
|
+
if (opacity) {
|
|
3651
|
+
this.D/*_s*/ += '<rect width="100%" height="100%" fill="' +
|
|
3652
|
+
fillColor + '" opacity="' + opacity.toFixed(2) + '"/>';
|
|
3653
|
+
}
|
|
3654
|
+
};
|
|
3655
|
+
|
|
3656
|
+
/**
|
|
3657
|
+
* Writes a path to the SVG string.
|
|
3658
|
+
* @param {string} color Fill color on format #rrggbb.
|
|
3659
|
+
* @param {string} dataString The SVG path data string.
|
|
3660
|
+
*/
|
|
3661
|
+
SvgWriter__prototype.R/*appendPath*/ = function appendPath (color, dataString) {
|
|
3662
|
+
this.D/*_s*/ += '<path fill="' + color + '" d="' + dataString + '"/>';
|
|
3663
|
+
};
|
|
3664
|
+
|
|
3665
|
+
/**
|
|
3666
|
+
* Gets the rendered image as an SVG string.
|
|
3667
|
+
*/
|
|
3668
|
+
SvgWriter__prototype.toString = function toString () {
|
|
3669
|
+
return this.D/*_s*/ + "</svg>";
|
|
3670
|
+
};
|
|
3671
|
+
|
|
3672
|
+
/**
|
|
3673
|
+
* Draws an identicon as an SVG string.
|
|
3674
|
+
* @param {*} hashOrValue - A hexadecimal hash string or any value that will be hashed by Jdenticon.
|
|
3675
|
+
* @param {number} size - Icon size in pixels.
|
|
3676
|
+
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3677
|
+
* global configuration in its entirety. For backward compatibility a padding value in the range [0.0, 0.5) can be
|
|
3678
|
+
* specified in place of a configuration object.
|
|
3679
|
+
* @returns {string} SVG string
|
|
3680
|
+
*/
|
|
3681
|
+
function toSvg(hashOrValue, size, config) {
|
|
3682
|
+
var writer = new SvgWriter(size);
|
|
3683
|
+
iconGenerator(new SvgRenderer(writer),
|
|
3684
|
+
isValidHash(hashOrValue) || computeHash(hashOrValue),
|
|
3685
|
+
config);
|
|
3686
|
+
return writer.toString();
|
|
3687
|
+
}
|
|
3688
|
+
|
|
3689
|
+
/**
|
|
3690
|
+
* Creates a new element and adds it to the specified parent.
|
|
3691
|
+
* @param {Element} parentNode
|
|
3692
|
+
* @param {string} name
|
|
3693
|
+
* @param {...(string|number)} keyValuePairs
|
|
3694
|
+
*/
|
|
3695
|
+
function SvgElement_append(parentNode, name) {
|
|
3696
|
+
var keyValuePairs = [], len = arguments.length - 2;
|
|
3697
|
+
while ( len-- > 0 ) keyValuePairs[ len ] = arguments[ len + 2 ];
|
|
3698
|
+
|
|
3699
|
+
var el = document.createElementNS(SVG_CONSTANTS.S/*XMLNS*/, name);
|
|
3700
|
+
|
|
3701
|
+
for (var i = 0; i + 1 < keyValuePairs.length; i += 2) {
|
|
3702
|
+
el.setAttribute(
|
|
3703
|
+
/** @type {string} */(keyValuePairs[i]),
|
|
3704
|
+
/** @type {string} */(keyValuePairs[i + 1])
|
|
3705
|
+
);
|
|
3706
|
+
}
|
|
3707
|
+
|
|
3708
|
+
parentNode.appendChild(el);
|
|
3709
|
+
}
|
|
3710
|
+
|
|
3711
|
+
|
|
3712
|
+
/**
|
|
3713
|
+
* Renderer producing SVG output.
|
|
3714
|
+
*/
|
|
3715
|
+
function SvgElement(element) {
|
|
3716
|
+
// Don't use the clientWidth and clientHeight properties on SVG elements
|
|
3717
|
+
// since Firefox won't serve a proper value of these properties on SVG
|
|
3718
|
+
// elements (https://bugzilla.mozilla.org/show_bug.cgi?id=874811)
|
|
3719
|
+
// Instead use 100px as a hardcoded size (the svg viewBox will rescale
|
|
3720
|
+
// the icon to the correct dimensions)
|
|
3721
|
+
var iconSize = this.k/*iconSize*/ = Math.min(
|
|
3722
|
+
(Number(element.getAttribute(SVG_CONSTANTS.T/*WIDTH*/)) || 100),
|
|
3723
|
+
(Number(element.getAttribute(SVG_CONSTANTS.U/*HEIGHT*/)) || 100)
|
|
3724
|
+
);
|
|
3725
|
+
|
|
3726
|
+
/**
|
|
3727
|
+
* @type {Element}
|
|
3728
|
+
* @private
|
|
3729
|
+
*/
|
|
3730
|
+
this.V/*_el*/ = element;
|
|
3731
|
+
|
|
3732
|
+
// Clear current SVG child elements
|
|
3733
|
+
while (element.firstChild) {
|
|
3734
|
+
element.removeChild(element.firstChild);
|
|
3735
|
+
}
|
|
3736
|
+
|
|
3737
|
+
// Set viewBox attribute to ensure the svg scales nicely.
|
|
3738
|
+
element.setAttribute("viewBox", "0 0 " + iconSize + " " + iconSize);
|
|
3739
|
+
element.setAttribute("preserveAspectRatio", "xMidYMid meet");
|
|
3740
|
+
}
|
|
3741
|
+
var SvgElement__prototype = SvgElement.prototype;
|
|
3742
|
+
|
|
3743
|
+
/**
|
|
3744
|
+
* Fills the background with the specified color.
|
|
3745
|
+
* @param {string} fillColor Fill color on the format #rrggbb.
|
|
3746
|
+
* @param {number} opacity Opacity in the range [0.0, 1.0].
|
|
3747
|
+
*/
|
|
3748
|
+
SvgElement__prototype.m/*setBackground*/ = function setBackground (fillColor, opacity) {
|
|
3749
|
+
if (opacity) {
|
|
3750
|
+
SvgElement_append(this.V/*_el*/, "rect",
|
|
3751
|
+
SVG_CONSTANTS.T/*WIDTH*/, "100%",
|
|
3752
|
+
SVG_CONSTANTS.U/*HEIGHT*/, "100%",
|
|
3753
|
+
"fill", fillColor,
|
|
3754
|
+
"opacity", opacity);
|
|
3755
|
+
}
|
|
3756
|
+
};
|
|
3757
|
+
|
|
3758
|
+
/**
|
|
3759
|
+
* Appends a path to the SVG element.
|
|
3760
|
+
* @param {string} color Fill color on format #xxxxxx.
|
|
3761
|
+
* @param {string} dataString The SVG path data string.
|
|
3762
|
+
*/
|
|
3763
|
+
SvgElement__prototype.R/*appendPath*/ = function appendPath (color, dataString) {
|
|
3764
|
+
SvgElement_append(this.V/*_el*/, "path",
|
|
3765
|
+
"fill", color,
|
|
3766
|
+
"d", dataString);
|
|
3767
|
+
};
|
|
3768
|
+
|
|
3769
|
+
/**
|
|
3770
|
+
* Updates all canvas elements with the `data-jdenticon-hash` or `data-jdenticon-value` attribute.
|
|
3771
|
+
*/
|
|
3772
|
+
function updateAll() {
|
|
3773
|
+
if (documentQuerySelectorAll) {
|
|
3774
|
+
update(ICON_SELECTOR);
|
|
3775
|
+
}
|
|
3776
|
+
}
|
|
3777
|
+
|
|
3778
|
+
/**
|
|
3779
|
+
* Updates the identicon in the specified `<canvas>` or `<svg>` elements.
|
|
3780
|
+
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3781
|
+
* `<svg>` or `<canvas>`, or a CSS selector to such an element.
|
|
3782
|
+
* @param {*=} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3783
|
+
* `data-jdenticon-value` attribute will be evaluated.
|
|
3784
|
+
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3785
|
+
* global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be
|
|
3786
|
+
* specified in place of a configuration object.
|
|
3787
|
+
*/
|
|
3788
|
+
function update(el, hashOrValue, config) {
|
|
3789
|
+
renderDomElement(el, hashOrValue, config, function (el, iconType) {
|
|
3790
|
+
if (iconType) {
|
|
3791
|
+
return iconType == ICON_TYPE_SVG ?
|
|
3792
|
+
new SvgRenderer(new SvgElement(el)) :
|
|
3793
|
+
new CanvasRenderer(/** @type {HTMLCanvasElement} */(el).getContext("2d"));
|
|
3794
|
+
}
|
|
3795
|
+
});
|
|
3796
|
+
}
|
|
3797
|
+
|
|
3798
|
+
/**
|
|
3799
|
+
* Updates the identicon in the specified `<canvas>` elements.
|
|
3800
|
+
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3801
|
+
* `<canvas>`, or a CSS selector to such an element.
|
|
3802
|
+
* @param {*=} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3803
|
+
* `data-jdenticon-value` attribute will be evaluated.
|
|
3804
|
+
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3805
|
+
* global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be
|
|
3806
|
+
* specified in place of a configuration object.
|
|
3807
|
+
*/
|
|
3808
|
+
function updateCanvas(el, hashOrValue, config) {
|
|
3809
|
+
renderDomElement(el, hashOrValue, config, function (el, iconType) {
|
|
3810
|
+
if (iconType == ICON_TYPE_CANVAS) {
|
|
3811
|
+
return new CanvasRenderer(/** @type {HTMLCanvasElement} */(el).getContext("2d"));
|
|
3812
|
+
}
|
|
3813
|
+
});
|
|
3814
|
+
}
|
|
3815
|
+
|
|
3816
|
+
/**
|
|
3817
|
+
* Updates the identicon in the specified `<svg>` elements.
|
|
3818
|
+
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3819
|
+
* `<svg>`, or a CSS selector to such an element.
|
|
3820
|
+
* @param {*=} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3821
|
+
* `data-jdenticon-value` attribute will be evaluated.
|
|
3822
|
+
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3823
|
+
* global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be
|
|
3824
|
+
* specified in place of a configuration object.
|
|
3825
|
+
*/
|
|
3826
|
+
function updateSvg(el, hashOrValue, config) {
|
|
3827
|
+
renderDomElement(el, hashOrValue, config, function (el, iconType) {
|
|
3828
|
+
if (iconType == ICON_TYPE_SVG) {
|
|
3829
|
+
return new SvgRenderer(new SvgElement(el));
|
|
3830
|
+
}
|
|
3831
|
+
});
|
|
3832
|
+
}
|
|
3833
|
+
|
|
3834
|
+
/**
|
|
3835
|
+
* Updates the identicon in the specified canvas or svg elements.
|
|
3836
|
+
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3837
|
+
* `<svg>` or `<canvas>`, or a CSS selector to such an element.
|
|
3838
|
+
* @param {*} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3839
|
+
* `data-jdenticon-value` attribute will be evaluated.
|
|
3840
|
+
* @param {Object|number|undefined} config
|
|
3841
|
+
* @param {function(Element,number):Renderer} rendererFactory - Factory function for creating an icon renderer.
|
|
3842
|
+
*/
|
|
3843
|
+
function renderDomElement(el, hashOrValue, config, rendererFactory) {
|
|
3844
|
+
if (typeof el === "string") {
|
|
3845
|
+
if (documentQuerySelectorAll) {
|
|
3846
|
+
var elements = documentQuerySelectorAll(el);
|
|
3847
|
+
for (var i = 0; i < elements.length; i++) {
|
|
3848
|
+
renderDomElement(elements[i], hashOrValue, config, rendererFactory);
|
|
3849
|
+
}
|
|
3850
|
+
}
|
|
3851
|
+
return;
|
|
3852
|
+
}
|
|
3853
|
+
|
|
3854
|
+
// Hash selection. The result from getValidHash or computeHash is
|
|
3855
|
+
// accepted as a valid hash.
|
|
3856
|
+
var hash =
|
|
3857
|
+
// 1. Explicit valid hash
|
|
3858
|
+
isValidHash(hashOrValue) ||
|
|
3859
|
+
|
|
3860
|
+
// 2. Explicit value (`!= null` catches both null and undefined)
|
|
3861
|
+
hashOrValue != null && computeHash(hashOrValue) ||
|
|
3862
|
+
|
|
3863
|
+
// 3. `data-jdenticon-hash` attribute
|
|
3864
|
+
isValidHash(el.getAttribute(ATTRIBUTES.O/*HASH*/)) ||
|
|
3865
|
+
|
|
3866
|
+
// 4. `data-jdenticon-value` attribute.
|
|
3867
|
+
// We want to treat an empty attribute as an empty value.
|
|
3868
|
+
// Some browsers return empty string even if the attribute
|
|
3869
|
+
// is not specified, so use hasAttribute to determine if
|
|
3870
|
+
// the attribute is specified.
|
|
3871
|
+
el.hasAttribute(ATTRIBUTES.v/*VALUE*/) && computeHash(el.getAttribute(ATTRIBUTES.v/*VALUE*/));
|
|
3872
|
+
|
|
3873
|
+
if (!hash) {
|
|
3874
|
+
// No hash specified. Don't render an icon.
|
|
3875
|
+
return;
|
|
3876
|
+
}
|
|
3877
|
+
|
|
3878
|
+
var renderer = rendererFactory(el, getIdenticonType(el));
|
|
3879
|
+
if (renderer) {
|
|
3880
|
+
// Draw icon
|
|
3881
|
+
iconGenerator(renderer, hash, config);
|
|
3882
|
+
el[IS_RENDERED_PROPERTY] = true;
|
|
3883
|
+
}
|
|
3884
|
+
}
|
|
3885
|
+
|
|
3886
|
+
// This file is compiled to dist/jdenticon-module.js
|
|
3887
|
+
|
|
3888
|
+
var jdenticon = updateAll;
|
|
3889
|
+
|
|
3890
|
+
defineConfigProperty(jdenticon);
|
|
3891
|
+
|
|
3892
|
+
// Export public API
|
|
3893
|
+
jdenticon["configure"] = configure;
|
|
3894
|
+
jdenticon["drawIcon"] = drawIcon;
|
|
3895
|
+
jdenticon["toSvg"] = toSvg;
|
|
3896
|
+
jdenticon["update"] = update;
|
|
3897
|
+
jdenticon["updateCanvas"] = updateCanvas;
|
|
3898
|
+
jdenticon["updateSvg"] = updateSvg;
|
|
3899
|
+
|
|
3900
|
+
/**
|
|
3901
|
+
* Specifies the version of the Jdenticon package in use.
|
|
3902
|
+
* @type {string}
|
|
3903
|
+
*/
|
|
3904
|
+
jdenticon["version"] = "3.3.0";
|
|
3905
|
+
|
|
3906
|
+
/**
|
|
3907
|
+
* Specifies which bundle of Jdenticon that is used.
|
|
3908
|
+
* @type {string}
|
|
3909
|
+
*/
|
|
3910
|
+
jdenticon["bundle"] = "browser-cjs";
|
|
3911
|
+
|
|
3912
|
+
jdenticonModule = jdenticon;
|
|
3913
|
+
|
|
3914
|
+
return jdenticonModule;
|
|
2764
3915
|
}
|
|
2765
3916
|
|
|
2766
|
-
|
|
2767
|
-
* Translates and rotates a point before being passed on to the canvas context. This was previously done by the canvas context itself,
|
|
2768
|
-
* but this caused a rendering issue in Chrome on sizes > 256 where the rotation transformation of inverted paths was not done properly.
|
|
2769
|
-
*/
|
|
2770
|
-
function Transform(x, y, size, rotation) {
|
|
2771
|
-
this.q/*_x*/ = x;
|
|
2772
|
-
this.t/*_y*/ = y;
|
|
2773
|
-
this.I/*_size*/ = size;
|
|
2774
|
-
this.Z/*_rotation*/ = rotation;
|
|
2775
|
-
}
|
|
2776
|
-
|
|
2777
|
-
/**
|
|
2778
|
-
* Transforms the specified point based on the translation and rotation specification for this Transform.
|
|
2779
|
-
* @param {number} x x-coordinate
|
|
2780
|
-
* @param {number} y y-coordinate
|
|
2781
|
-
* @param {number=} w The width of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle.
|
|
2782
|
-
* @param {number=} h The height of the transformed rectangle. If greater than 0, this will ensure the returned point is of the upper left corner of the transformed rectangle.
|
|
2783
|
-
*/
|
|
2784
|
-
Transform.prototype.J/*transformIconPoint*/ = function transformIconPoint (x, y, w, h) {
|
|
2785
|
-
var right = this.q/*_x*/ + this.I/*_size*/,
|
|
2786
|
-
bottom = this.t/*_y*/ + this.I/*_size*/,
|
|
2787
|
-
rotation = this.Z/*_rotation*/;
|
|
2788
|
-
return rotation === 1 ? new Point(right - y - (h || 0), this.t/*_y*/ + x) :
|
|
2789
|
-
rotation === 2 ? new Point(right - x - (w || 0), bottom - y - (h || 0)) :
|
|
2790
|
-
rotation === 3 ? new Point(this.q/*_x*/ + y, bottom - x - (w || 0)) :
|
|
2791
|
-
new Point(this.q/*_x*/ + x, this.t/*_y*/ + y);
|
|
2792
|
-
};
|
|
2793
|
-
|
|
2794
|
-
var NO_TRANSFORM = new Transform(0, 0, 0, 0);
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
|
|
2798
|
-
/**
|
|
2799
|
-
* Provides helper functions for rendering common basic shapes.
|
|
2800
|
-
*/
|
|
2801
|
-
function Graphics(renderer) {
|
|
2802
|
-
/**
|
|
2803
|
-
* @type {Renderer}
|
|
2804
|
-
* @private
|
|
2805
|
-
*/
|
|
2806
|
-
this.K/*_renderer*/ = renderer;
|
|
2807
|
-
|
|
2808
|
-
/**
|
|
2809
|
-
* @type {Transform}
|
|
2810
|
-
*/
|
|
2811
|
-
this.u/*currentTransform*/ = NO_TRANSFORM;
|
|
2812
|
-
}
|
|
2813
|
-
var Graphics__prototype = Graphics.prototype;
|
|
2814
|
-
|
|
2815
|
-
/**
|
|
2816
|
-
* Adds a polygon to the underlying renderer.
|
|
2817
|
-
* @param {Array<number>} points The points of the polygon clockwise on the format [ x0, y0, x1, y1, ..., xn, yn ]
|
|
2818
|
-
* @param {boolean=} invert Specifies if the polygon will be inverted.
|
|
2819
|
-
*/
|
|
2820
|
-
Graphics__prototype.g/*addPolygon*/ = function addPolygon (points, invert) {
|
|
2821
|
-
var this$1$1 = this;
|
|
2822
|
-
|
|
2823
|
-
var di = invert ? -2 : 2,
|
|
2824
|
-
transformedPoints = [];
|
|
2825
|
-
|
|
2826
|
-
for (var i = invert ? points.length - 2 : 0; i < points.length && i >= 0; i += di) {
|
|
2827
|
-
transformedPoints.push(this$1$1.u/*currentTransform*/.J/*transformIconPoint*/(points[i], points[i + 1]));
|
|
2828
|
-
}
|
|
2829
|
-
|
|
2830
|
-
this.K/*_renderer*/.g/*addPolygon*/(transformedPoints);
|
|
2831
|
-
};
|
|
2832
|
-
|
|
2833
|
-
/**
|
|
2834
|
-
* Adds a polygon to the underlying renderer.
|
|
2835
|
-
* Source: http://stackoverflow.com/a/2173084
|
|
2836
|
-
* @param {number} x The x-coordinate of the upper left corner of the rectangle holding the entire ellipse.
|
|
2837
|
-
* @param {number} y The y-coordinate of the upper left corner of the rectangle holding the entire ellipse.
|
|
2838
|
-
* @param {number} size The size of the ellipse.
|
|
2839
|
-
* @param {boolean=} invert Specifies if the ellipse will be inverted.
|
|
2840
|
-
*/
|
|
2841
|
-
Graphics__prototype.h/*addCircle*/ = function addCircle (x, y, size, invert) {
|
|
2842
|
-
var p = this.u/*currentTransform*/.J/*transformIconPoint*/(x, y, size, size);
|
|
2843
|
-
this.K/*_renderer*/.h/*addCircle*/(p, size, invert);
|
|
2844
|
-
};
|
|
2845
|
-
|
|
2846
|
-
/**
|
|
2847
|
-
* Adds a rectangle to the underlying renderer.
|
|
2848
|
-
* @param {number} x The x-coordinate of the upper left corner of the rectangle.
|
|
2849
|
-
* @param {number} y The y-coordinate of the upper left corner of the rectangle.
|
|
2850
|
-
* @param {number} w The width of the rectangle.
|
|
2851
|
-
* @param {number} h The height of the rectangle.
|
|
2852
|
-
* @param {boolean=} invert Specifies if the rectangle will be inverted.
|
|
2853
|
-
*/
|
|
2854
|
-
Graphics__prototype.i/*addRectangle*/ = function addRectangle (x, y, w, h, invert) {
|
|
2855
|
-
this.g/*addPolygon*/([
|
|
2856
|
-
x, y,
|
|
2857
|
-
x + w, y,
|
|
2858
|
-
x + w, y + h,
|
|
2859
|
-
x, y + h
|
|
2860
|
-
], invert);
|
|
2861
|
-
};
|
|
2862
|
-
|
|
2863
|
-
/**
|
|
2864
|
-
* Adds a right triangle to the underlying renderer.
|
|
2865
|
-
* @param {number} x The x-coordinate of the upper left corner of the rectangle holding the triangle.
|
|
2866
|
-
* @param {number} y The y-coordinate of the upper left corner of the rectangle holding the triangle.
|
|
2867
|
-
* @param {number} w The width of the triangle.
|
|
2868
|
-
* @param {number} h The height of the triangle.
|
|
2869
|
-
* @param {number} r The rotation of the triangle (clockwise). 0 = right corner of the triangle in the lower left corner of the bounding rectangle.
|
|
2870
|
-
* @param {boolean=} invert Specifies if the triangle will be inverted.
|
|
2871
|
-
*/
|
|
2872
|
-
Graphics__prototype.j/*addTriangle*/ = function addTriangle (x, y, w, h, r, invert) {
|
|
2873
|
-
var points = [
|
|
2874
|
-
x + w, y,
|
|
2875
|
-
x + w, y + h,
|
|
2876
|
-
x, y + h,
|
|
2877
|
-
x, y
|
|
2878
|
-
];
|
|
2879
|
-
points.splice(((r || 0) % 4) * 2, 2);
|
|
2880
|
-
this.g/*addPolygon*/(points, invert);
|
|
2881
|
-
};
|
|
2882
|
-
|
|
2883
|
-
/**
|
|
2884
|
-
* Adds a rhombus to the underlying renderer.
|
|
2885
|
-
* @param {number} x The x-coordinate of the upper left corner of the rectangle holding the rhombus.
|
|
2886
|
-
* @param {number} y The y-coordinate of the upper left corner of the rectangle holding the rhombus.
|
|
2887
|
-
* @param {number} w The width of the rhombus.
|
|
2888
|
-
* @param {number} h The height of the rhombus.
|
|
2889
|
-
* @param {boolean=} invert Specifies if the rhombus will be inverted.
|
|
2890
|
-
*/
|
|
2891
|
-
Graphics__prototype.L/*addRhombus*/ = function addRhombus (x, y, w, h, invert) {
|
|
2892
|
-
this.g/*addPolygon*/([
|
|
2893
|
-
x + w / 2, y,
|
|
2894
|
-
x + w, y + h / 2,
|
|
2895
|
-
x + w / 2, y + h,
|
|
2896
|
-
x, y + h / 2
|
|
2897
|
-
], invert);
|
|
2898
|
-
};
|
|
2899
|
-
|
|
2900
|
-
/**
|
|
2901
|
-
* @param {number} index
|
|
2902
|
-
* @param {Graphics} g
|
|
2903
|
-
* @param {number} cell
|
|
2904
|
-
* @param {number} positionIndex
|
|
2905
|
-
*/
|
|
2906
|
-
function centerShape(index, g, cell, positionIndex) {
|
|
2907
|
-
index = index % 14;
|
|
2908
|
-
|
|
2909
|
-
var k, m, w, h, inner, outer;
|
|
2910
|
-
|
|
2911
|
-
!index ? (
|
|
2912
|
-
k = cell * 0.42,
|
|
2913
|
-
g.g/*addPolygon*/([
|
|
2914
|
-
0, 0,
|
|
2915
|
-
cell, 0,
|
|
2916
|
-
cell, cell - k * 2,
|
|
2917
|
-
cell - k, cell,
|
|
2918
|
-
0, cell
|
|
2919
|
-
])) :
|
|
2920
|
-
|
|
2921
|
-
index == 1 ? (
|
|
2922
|
-
w = 0 | (cell * 0.5),
|
|
2923
|
-
h = 0 | (cell * 0.8),
|
|
2924
|
-
|
|
2925
|
-
g.j/*addTriangle*/(cell - w, 0, w, h, 2)) :
|
|
2926
|
-
|
|
2927
|
-
index == 2 ? (
|
|
2928
|
-
w = 0 | (cell / 3),
|
|
2929
|
-
g.i/*addRectangle*/(w, w, cell - w, cell - w)) :
|
|
2930
|
-
|
|
2931
|
-
index == 3 ? (
|
|
2932
|
-
inner = cell * 0.1,
|
|
2933
|
-
// Use fixed outer border widths in small icons to ensure the border is drawn
|
|
2934
|
-
outer =
|
|
2935
|
-
cell < 6 ? 1 :
|
|
2936
|
-
cell < 8 ? 2 :
|
|
2937
|
-
(0 | (cell * 0.25)),
|
|
2938
|
-
|
|
2939
|
-
inner =
|
|
2940
|
-
inner > 1 ? (0 | inner) : // large icon => truncate decimals
|
|
2941
|
-
inner > 0.5 ? 1 : // medium size icon => fixed width
|
|
2942
|
-
inner, // small icon => anti-aliased border
|
|
2943
|
-
|
|
2944
|
-
g.i/*addRectangle*/(outer, outer, cell - inner - outer, cell - inner - outer)) :
|
|
2945
|
-
|
|
2946
|
-
index == 4 ? (
|
|
2947
|
-
m = 0 | (cell * 0.15),
|
|
2948
|
-
w = 0 | (cell * 0.5),
|
|
2949
|
-
g.h/*addCircle*/(cell - w - m, cell - w - m, w)) :
|
|
2950
|
-
|
|
2951
|
-
index == 5 ? (
|
|
2952
|
-
inner = cell * 0.1,
|
|
2953
|
-
outer = inner * 4,
|
|
2954
|
-
|
|
2955
|
-
// Align edge to nearest pixel in large icons
|
|
2956
|
-
outer > 3 && (outer = 0 | outer),
|
|
2957
|
-
|
|
2958
|
-
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
2959
|
-
g.g/*addPolygon*/([
|
|
2960
|
-
outer, outer,
|
|
2961
|
-
cell - inner, outer,
|
|
2962
|
-
outer + (cell - outer - inner) / 2, cell - inner
|
|
2963
|
-
], true)) :
|
|
2964
|
-
|
|
2965
|
-
index == 6 ?
|
|
2966
|
-
g.g/*addPolygon*/([
|
|
2967
|
-
0, 0,
|
|
2968
|
-
cell, 0,
|
|
2969
|
-
cell, cell * 0.7,
|
|
2970
|
-
cell * 0.4, cell * 0.4,
|
|
2971
|
-
cell * 0.7, cell,
|
|
2972
|
-
0, cell
|
|
2973
|
-
]) :
|
|
2974
|
-
|
|
2975
|
-
index == 7 ?
|
|
2976
|
-
g.j/*addTriangle*/(cell / 2, cell / 2, cell / 2, cell / 2, 3) :
|
|
2977
|
-
|
|
2978
|
-
index == 8 ? (
|
|
2979
|
-
g.i/*addRectangle*/(0, 0, cell, cell / 2),
|
|
2980
|
-
g.i/*addRectangle*/(0, cell / 2, cell / 2, cell / 2),
|
|
2981
|
-
g.j/*addTriangle*/(cell / 2, cell / 2, cell / 2, cell / 2, 1)) :
|
|
2982
|
-
|
|
2983
|
-
index == 9 ? (
|
|
2984
|
-
inner = cell * 0.14,
|
|
2985
|
-
// Use fixed outer border widths in small icons to ensure the border is drawn
|
|
2986
|
-
outer =
|
|
2987
|
-
cell < 4 ? 1 :
|
|
2988
|
-
cell < 6 ? 2 :
|
|
2989
|
-
(0 | (cell * 0.35)),
|
|
2990
|
-
|
|
2991
|
-
inner =
|
|
2992
|
-
cell < 8 ? inner : // small icon => anti-aliased border
|
|
2993
|
-
(0 | inner), // large icon => truncate decimals
|
|
2994
|
-
|
|
2995
|
-
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
2996
|
-
g.i/*addRectangle*/(outer, outer, cell - outer - inner, cell - outer - inner, true)) :
|
|
2997
|
-
|
|
2998
|
-
index == 10 ? (
|
|
2999
|
-
inner = cell * 0.12,
|
|
3000
|
-
outer = inner * 3,
|
|
3001
|
-
|
|
3002
|
-
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
3003
|
-
g.h/*addCircle*/(outer, outer, cell - inner - outer, true)) :
|
|
3004
|
-
|
|
3005
|
-
index == 11 ?
|
|
3006
|
-
g.j/*addTriangle*/(cell / 2, cell / 2, cell / 2, cell / 2, 3) :
|
|
3007
|
-
|
|
3008
|
-
index == 12 ? (
|
|
3009
|
-
m = cell * 0.25,
|
|
3010
|
-
g.i/*addRectangle*/(0, 0, cell, cell),
|
|
3011
|
-
g.L/*addRhombus*/(m, m, cell - m, cell - m, true)) :
|
|
3012
|
-
|
|
3013
|
-
// 13
|
|
3014
|
-
(
|
|
3015
|
-
!positionIndex && (
|
|
3016
|
-
m = cell * 0.4, w = cell * 1.2,
|
|
3017
|
-
g.h/*addCircle*/(m, m, w)
|
|
3018
|
-
)
|
|
3019
|
-
);
|
|
3020
|
-
}
|
|
3021
|
-
|
|
3022
|
-
/**
|
|
3023
|
-
* @param {number} index
|
|
3024
|
-
* @param {Graphics} g
|
|
3025
|
-
* @param {number} cell
|
|
3026
|
-
*/
|
|
3027
|
-
function outerShape(index, g, cell) {
|
|
3028
|
-
index = index % 4;
|
|
3029
|
-
|
|
3030
|
-
var m;
|
|
3031
|
-
|
|
3032
|
-
!index ?
|
|
3033
|
-
g.j/*addTriangle*/(0, 0, cell, cell, 0) :
|
|
3034
|
-
|
|
3035
|
-
index == 1 ?
|
|
3036
|
-
g.j/*addTriangle*/(0, cell / 2, cell, cell / 2, 0) :
|
|
3037
|
-
|
|
3038
|
-
index == 2 ?
|
|
3039
|
-
g.L/*addRhombus*/(0, 0, cell, cell) :
|
|
3040
|
-
|
|
3041
|
-
// 3
|
|
3042
|
-
(
|
|
3043
|
-
m = cell / 6,
|
|
3044
|
-
g.h/*addCircle*/(m, m, cell - 2 * m)
|
|
3045
|
-
);
|
|
3046
|
-
}
|
|
3047
|
-
|
|
3048
|
-
/**
|
|
3049
|
-
* Gets a set of identicon color candidates for a specified hue and config.
|
|
3050
|
-
* @param {number} hue
|
|
3051
|
-
* @param {ParsedConfiguration} config
|
|
3052
|
-
*/
|
|
3053
|
-
function colorTheme(hue, config) {
|
|
3054
|
-
hue = config.X/*hue*/(hue);
|
|
3055
|
-
return [
|
|
3056
|
-
// Dark gray
|
|
3057
|
-
correctedHsl(hue, config.F/*grayscaleSaturation*/, config.G/*grayscaleLightness*/(0)),
|
|
3058
|
-
// Mid color
|
|
3059
|
-
correctedHsl(hue, config.o/*colorSaturation*/, config.p/*colorLightness*/(0.5)),
|
|
3060
|
-
// Light gray
|
|
3061
|
-
correctedHsl(hue, config.F/*grayscaleSaturation*/, config.G/*grayscaleLightness*/(1)),
|
|
3062
|
-
// Light color
|
|
3063
|
-
correctedHsl(hue, config.o/*colorSaturation*/, config.p/*colorLightness*/(1)),
|
|
3064
|
-
// Dark color
|
|
3065
|
-
correctedHsl(hue, config.o/*colorSaturation*/, config.p/*colorLightness*/(0))
|
|
3066
|
-
];
|
|
3067
|
-
}
|
|
3068
|
-
|
|
3069
|
-
/**
|
|
3070
|
-
* Draws an identicon to a specified renderer.
|
|
3071
|
-
* @param {Renderer} renderer
|
|
3072
|
-
* @param {string} hash
|
|
3073
|
-
* @param {Object|number=} config
|
|
3074
|
-
*/
|
|
3075
|
-
function iconGenerator(renderer, hash, config) {
|
|
3076
|
-
var parsedConfig = getConfiguration(config, 0.08);
|
|
3077
|
-
|
|
3078
|
-
// Set background color
|
|
3079
|
-
if (parsedConfig.H/*backColor*/) {
|
|
3080
|
-
renderer.m/*setBackground*/(parsedConfig.H/*backColor*/);
|
|
3081
|
-
}
|
|
3082
|
-
|
|
3083
|
-
// Calculate padding and round to nearest integer
|
|
3084
|
-
var size = renderer.k/*iconSize*/;
|
|
3085
|
-
var padding = (0.5 + size * parsedConfig.Y/*iconPadding*/) | 0;
|
|
3086
|
-
size -= padding * 2;
|
|
3087
|
-
|
|
3088
|
-
var graphics = new Graphics(renderer);
|
|
3089
|
-
|
|
3090
|
-
// Calculate cell size and ensure it is an integer
|
|
3091
|
-
var cell = 0 | (size / 4);
|
|
3092
|
-
|
|
3093
|
-
// Since the cell size is integer based, the actual icon will be slightly smaller than specified => center icon
|
|
3094
|
-
var x = 0 | (padding + size / 2 - cell * 2);
|
|
3095
|
-
var y = 0 | (padding + size / 2 - cell * 2);
|
|
3096
|
-
|
|
3097
|
-
function renderShape(colorIndex, shapes, index, rotationIndex, positions) {
|
|
3098
|
-
var shapeIndex = parseHex(hash, index, 1);
|
|
3099
|
-
var r = rotationIndex ? parseHex(hash, rotationIndex, 1) : 0;
|
|
3100
|
-
|
|
3101
|
-
renderer.M/*beginShape*/(availableColors[selectedColorIndexes[colorIndex]]);
|
|
3102
|
-
|
|
3103
|
-
for (var i = 0; i < positions.length; i++) {
|
|
3104
|
-
graphics.u/*currentTransform*/ = new Transform(x + positions[i][0] * cell, y + positions[i][1] * cell, cell, r++ % 4);
|
|
3105
|
-
shapes(shapeIndex, graphics, cell, i);
|
|
3106
|
-
}
|
|
3107
|
-
|
|
3108
|
-
renderer.N/*endShape*/();
|
|
3109
|
-
}
|
|
3110
|
-
|
|
3111
|
-
// AVAILABLE COLORS
|
|
3112
|
-
var hue = parseHex(hash, -7) / 0xfffffff,
|
|
3113
|
-
|
|
3114
|
-
// Available colors for this icon
|
|
3115
|
-
availableColors = colorTheme(hue, parsedConfig),
|
|
3116
|
-
|
|
3117
|
-
// The index of the selected colors
|
|
3118
|
-
selectedColorIndexes = [];
|
|
3119
|
-
|
|
3120
|
-
var index;
|
|
3121
|
-
|
|
3122
|
-
function isDuplicate(values) {
|
|
3123
|
-
if (values.indexOf(index) >= 0) {
|
|
3124
|
-
for (var i = 0; i < values.length; i++) {
|
|
3125
|
-
if (selectedColorIndexes.indexOf(values[i]) >= 0) {
|
|
3126
|
-
return true;
|
|
3127
|
-
}
|
|
3128
|
-
}
|
|
3129
|
-
}
|
|
3130
|
-
}
|
|
3131
|
-
|
|
3132
|
-
for (var i = 0; i < 3; i++) {
|
|
3133
|
-
index = parseHex(hash, 8 + i, 1) % availableColors.length;
|
|
3134
|
-
if (isDuplicate([0, 4]) || // Disallow dark gray and dark color combo
|
|
3135
|
-
isDuplicate([2, 3])) { // Disallow light gray and light color combo
|
|
3136
|
-
index = 1;
|
|
3137
|
-
}
|
|
3138
|
-
selectedColorIndexes.push(index);
|
|
3139
|
-
}
|
|
3140
|
-
|
|
3141
|
-
// ACTUAL RENDERING
|
|
3142
|
-
// Sides
|
|
3143
|
-
renderShape(0, outerShape, 2, 3, [[1, 0], [2, 0], [2, 3], [1, 3], [0, 1], [3, 1], [3, 2], [0, 2]]);
|
|
3144
|
-
// Corners
|
|
3145
|
-
renderShape(1, outerShape, 4, 5, [[0, 0], [3, 0], [3, 3], [0, 3]]);
|
|
3146
|
-
// Center
|
|
3147
|
-
renderShape(2, centerShape, 1, null, [[1, 1], [2, 1], [2, 2], [1, 2]]);
|
|
3148
|
-
|
|
3149
|
-
renderer.finish();
|
|
3150
|
-
}
|
|
3151
|
-
|
|
3152
|
-
/**
|
|
3153
|
-
* Computes a SHA1 hash for any value and returns it as a hexadecimal string.
|
|
3154
|
-
*
|
|
3155
|
-
* This function is optimized for minimal code size and rather short messages.
|
|
3156
|
-
*
|
|
3157
|
-
* @param {string} message
|
|
3158
|
-
*/
|
|
3159
|
-
function sha1(message) {
|
|
3160
|
-
var HASH_SIZE_HALF_BYTES = 40;
|
|
3161
|
-
var BLOCK_SIZE_WORDS = 16;
|
|
3162
|
-
|
|
3163
|
-
// Variables
|
|
3164
|
-
// `var` is used to be able to minimize the number of `var` keywords.
|
|
3165
|
-
var i = 0,
|
|
3166
|
-
f = 0,
|
|
3167
|
-
|
|
3168
|
-
// Use `encodeURI` to UTF8 encode the message without any additional libraries
|
|
3169
|
-
// We could use `unescape` + `encodeURI` to minimize the code, but that would be slightly risky
|
|
3170
|
-
// since `unescape` is deprecated.
|
|
3171
|
-
urlEncodedMessage = encodeURI(message) + "%80", // trailing '1' bit padding
|
|
3172
|
-
|
|
3173
|
-
// This can be changed to a preallocated Uint32Array array for greater performance and larger code size
|
|
3174
|
-
data = [],
|
|
3175
|
-
dataSize,
|
|
3176
|
-
|
|
3177
|
-
hashBuffer = [],
|
|
3178
|
-
|
|
3179
|
-
a = 0x67452301,
|
|
3180
|
-
b = 0xefcdab89,
|
|
3181
|
-
c = ~a,
|
|
3182
|
-
d = ~b,
|
|
3183
|
-
e = 0xc3d2e1f0,
|
|
3184
|
-
hash = [a, b, c, d, e],
|
|
3185
|
-
|
|
3186
|
-
blockStartIndex = 0,
|
|
3187
|
-
hexHash = "";
|
|
3188
|
-
|
|
3189
|
-
/**
|
|
3190
|
-
* Rotates the value a specified number of bits to the left.
|
|
3191
|
-
* @param {number} value Value to rotate
|
|
3192
|
-
* @param {number} shift Bit count to shift.
|
|
3193
|
-
*/
|
|
3194
|
-
function rotl(value, shift) {
|
|
3195
|
-
return (value << shift) | (value >>> (32 - shift));
|
|
3196
|
-
}
|
|
3197
|
-
|
|
3198
|
-
// Message data
|
|
3199
|
-
for ( ; i < urlEncodedMessage.length; f++) {
|
|
3200
|
-
data[f >> 2] = data[f >> 2] |
|
|
3201
|
-
(
|
|
3202
|
-
(
|
|
3203
|
-
urlEncodedMessage[i] == "%"
|
|
3204
|
-
// Percent encoded byte
|
|
3205
|
-
? parseInt(urlEncodedMessage.substring(i + 1, i += 3), 16)
|
|
3206
|
-
// Unencoded byte
|
|
3207
|
-
: urlEncodedMessage.charCodeAt(i++)
|
|
3208
|
-
)
|
|
3209
|
-
|
|
3210
|
-
// Read bytes in reverse order (big endian words)
|
|
3211
|
-
<< ((3 - (f & 3)) * 8)
|
|
3212
|
-
);
|
|
3213
|
-
}
|
|
3214
|
-
|
|
3215
|
-
// f is now the length of the utf8 encoded message
|
|
3216
|
-
// 7 = 8 bytes (64 bit) for message size, -1 to round down
|
|
3217
|
-
// >> 6 = integer division with block size
|
|
3218
|
-
dataSize = (((f + 7) >> 6) + 1) * BLOCK_SIZE_WORDS;
|
|
3219
|
-
|
|
3220
|
-
// Message size in bits.
|
|
3221
|
-
// SHA1 uses a 64 bit integer to represent the size, but since we only support short messages only the least
|
|
3222
|
-
// significant 32 bits are set. -8 is for the '1' bit padding byte.
|
|
3223
|
-
data[dataSize - 1] = f * 8 - 8;
|
|
3224
|
-
|
|
3225
|
-
// Compute hash
|
|
3226
|
-
for ( ; blockStartIndex < dataSize; blockStartIndex += BLOCK_SIZE_WORDS) {
|
|
3227
|
-
for (i = 0; i < 80; i++) {
|
|
3228
|
-
f = rotl(a, 5) + e + (
|
|
3229
|
-
// Ch
|
|
3230
|
-
i < 20 ? ((b & c) ^ ((~b) & d)) + 0x5a827999 :
|
|
3231
|
-
|
|
3232
|
-
// Parity
|
|
3233
|
-
i < 40 ? (b ^ c ^ d) + 0x6ed9eba1 :
|
|
3234
|
-
|
|
3235
|
-
// Maj
|
|
3236
|
-
i < 60 ? ((b & c) ^ (b & d) ^ (c & d)) + 0x8f1bbcdc :
|
|
3237
|
-
|
|
3238
|
-
// Parity
|
|
3239
|
-
(b ^ c ^ d) + 0xca62c1d6
|
|
3240
|
-
) + (
|
|
3241
|
-
hashBuffer[i] = i < BLOCK_SIZE_WORDS
|
|
3242
|
-
// Bitwise OR is used to coerse `undefined` to 0
|
|
3243
|
-
? (data[blockStartIndex + i] | 0)
|
|
3244
|
-
: rotl(hashBuffer[i - 3] ^ hashBuffer[i - 8] ^ hashBuffer[i - 14] ^ hashBuffer[i - 16], 1)
|
|
3245
|
-
);
|
|
3246
|
-
|
|
3247
|
-
e = d;
|
|
3248
|
-
d = c;
|
|
3249
|
-
c = rotl(b, 30);
|
|
3250
|
-
b = a;
|
|
3251
|
-
a = f;
|
|
3252
|
-
}
|
|
3253
|
-
|
|
3254
|
-
hash[0] = a = ((hash[0] + a) | 0);
|
|
3255
|
-
hash[1] = b = ((hash[1] + b) | 0);
|
|
3256
|
-
hash[2] = c = ((hash[2] + c) | 0);
|
|
3257
|
-
hash[3] = d = ((hash[3] + d) | 0);
|
|
3258
|
-
hash[4] = e = ((hash[4] + e) | 0);
|
|
3259
|
-
}
|
|
3260
|
-
|
|
3261
|
-
// Format hex hash
|
|
3262
|
-
for (i = 0; i < HASH_SIZE_HALF_BYTES; i++) {
|
|
3263
|
-
hexHash += (
|
|
3264
|
-
(
|
|
3265
|
-
// Get word (2^3 half-bytes per word)
|
|
3266
|
-
hash[i >> 3] >>>
|
|
3267
|
-
|
|
3268
|
-
// Append half-bytes in reverse order
|
|
3269
|
-
((7 - (i & 7)) * 4)
|
|
3270
|
-
)
|
|
3271
|
-
// Clamp to half-byte
|
|
3272
|
-
& 0xf
|
|
3273
|
-
).toString(16);
|
|
3274
|
-
}
|
|
3275
|
-
|
|
3276
|
-
return hexHash;
|
|
3277
|
-
}
|
|
3278
|
-
|
|
3279
|
-
/**
|
|
3280
|
-
* Inputs a value that might be a valid hash string for Jdenticon and returns it
|
|
3281
|
-
* if it is determined valid, otherwise a falsy value is returned.
|
|
3282
|
-
*/
|
|
3283
|
-
function isValidHash(hashCandidate) {
|
|
3284
|
-
return /^[0-9a-f]{11,}$/i.test(hashCandidate) && hashCandidate;
|
|
3285
|
-
}
|
|
3286
|
-
|
|
3287
|
-
/**
|
|
3288
|
-
* Computes a hash for the specified value. Currently SHA1 is used. This function
|
|
3289
|
-
* always returns a valid hash.
|
|
3290
|
-
*/
|
|
3291
|
-
function computeHash(value) {
|
|
3292
|
-
return sha1(value == null ? "" : "" + value);
|
|
3293
|
-
}
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
/**
|
|
3298
|
-
* Renderer redirecting drawing commands to a canvas context.
|
|
3299
|
-
* @implements {Renderer}
|
|
3300
|
-
*/
|
|
3301
|
-
function CanvasRenderer(ctx, iconSize) {
|
|
3302
|
-
var canvas = ctx.canvas;
|
|
3303
|
-
var width = canvas.width;
|
|
3304
|
-
var height = canvas.height;
|
|
3305
|
-
|
|
3306
|
-
ctx.save();
|
|
3307
|
-
|
|
3308
|
-
if (!iconSize) {
|
|
3309
|
-
iconSize = Math.min(width, height);
|
|
3310
|
-
|
|
3311
|
-
ctx.translate(
|
|
3312
|
-
((width - iconSize) / 2) | 0,
|
|
3313
|
-
((height - iconSize) / 2) | 0);
|
|
3314
|
-
}
|
|
3315
|
-
|
|
3316
|
-
/**
|
|
3317
|
-
* @private
|
|
3318
|
-
*/
|
|
3319
|
-
this.l/*_ctx*/ = ctx;
|
|
3320
|
-
this.k/*iconSize*/ = iconSize;
|
|
3321
|
-
|
|
3322
|
-
ctx.clearRect(0, 0, iconSize, iconSize);
|
|
3323
|
-
}
|
|
3324
|
-
var CanvasRenderer__prototype = CanvasRenderer.prototype;
|
|
3325
|
-
|
|
3326
|
-
/**
|
|
3327
|
-
* Fills the background with the specified color.
|
|
3328
|
-
* @param {string} fillColor Fill color on the format #rrggbb[aa].
|
|
3329
|
-
*/
|
|
3330
|
-
CanvasRenderer__prototype.m/*setBackground*/ = function setBackground (fillColor) {
|
|
3331
|
-
var ctx = this.l/*_ctx*/;
|
|
3332
|
-
var iconSize = this.k/*iconSize*/;
|
|
3333
|
-
|
|
3334
|
-
ctx.fillStyle = toCss3Color(fillColor);
|
|
3335
|
-
ctx.fillRect(0, 0, iconSize, iconSize);
|
|
3336
|
-
};
|
|
3337
|
-
|
|
3338
|
-
/**
|
|
3339
|
-
* Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape.
|
|
3340
|
-
* @param {string} fillColor Fill color on format #rrggbb[aa].
|
|
3341
|
-
*/
|
|
3342
|
-
CanvasRenderer__prototype.M/*beginShape*/ = function beginShape (fillColor) {
|
|
3343
|
-
var ctx = this.l/*_ctx*/;
|
|
3344
|
-
ctx.fillStyle = toCss3Color(fillColor);
|
|
3345
|
-
ctx.beginPath();
|
|
3346
|
-
};
|
|
3347
|
-
|
|
3348
|
-
/**
|
|
3349
|
-
* Marks the end of the currently drawn shape. This causes the queued paths to be rendered on the canvas.
|
|
3350
|
-
*/
|
|
3351
|
-
CanvasRenderer__prototype.N/*endShape*/ = function endShape () {
|
|
3352
|
-
this.l/*_ctx*/.fill();
|
|
3353
|
-
};
|
|
3354
|
-
|
|
3355
|
-
/**
|
|
3356
|
-
* Adds a polygon to the rendering queue.
|
|
3357
|
-
* @param points An array of Point objects.
|
|
3358
|
-
*/
|
|
3359
|
-
CanvasRenderer__prototype.g/*addPolygon*/ = function addPolygon (points) {
|
|
3360
|
-
var ctx = this.l/*_ctx*/;
|
|
3361
|
-
ctx.moveTo(points[0].x, points[0].y);
|
|
3362
|
-
for (var i = 1; i < points.length; i++) {
|
|
3363
|
-
ctx.lineTo(points[i].x, points[i].y);
|
|
3364
|
-
}
|
|
3365
|
-
ctx.closePath();
|
|
3366
|
-
};
|
|
3367
|
-
|
|
3368
|
-
/**
|
|
3369
|
-
* Adds a circle to the rendering queue.
|
|
3370
|
-
* @param {Point} point The upper left corner of the circle bounding box.
|
|
3371
|
-
* @param {number} diameter The diameter of the circle.
|
|
3372
|
-
* @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path).
|
|
3373
|
-
*/
|
|
3374
|
-
CanvasRenderer__prototype.h/*addCircle*/ = function addCircle (point, diameter, counterClockwise) {
|
|
3375
|
-
var ctx = this.l/*_ctx*/,
|
|
3376
|
-
radius = diameter / 2;
|
|
3377
|
-
ctx.moveTo(point.x + radius, point.y + radius);
|
|
3378
|
-
ctx.arc(point.x + radius, point.y + radius, radius, 0, Math.PI * 2, counterClockwise);
|
|
3379
|
-
ctx.closePath();
|
|
3380
|
-
};
|
|
3381
|
-
|
|
3382
|
-
/**
|
|
3383
|
-
* Called when the icon has been completely drawn.
|
|
3384
|
-
*/
|
|
3385
|
-
CanvasRenderer__prototype.finish = function finish () {
|
|
3386
|
-
this.l/*_ctx*/.restore();
|
|
3387
|
-
};
|
|
3388
|
-
|
|
3389
|
-
var ICON_TYPE_SVG = 1;
|
|
3390
|
-
|
|
3391
|
-
var ICON_TYPE_CANVAS = 2;
|
|
3392
|
-
|
|
3393
|
-
var ATTRIBUTES = {
|
|
3394
|
-
O/*HASH*/: "data-jdenticon-hash",
|
|
3395
|
-
v/*VALUE*/: "data-jdenticon-value"
|
|
3396
|
-
};
|
|
3397
|
-
|
|
3398
|
-
var IS_RENDERED_PROPERTY = "jdenticonRendered";
|
|
3399
|
-
|
|
3400
|
-
var ICON_SELECTOR = "[" + ATTRIBUTES.O/*HASH*/ +"],[" + ATTRIBUTES.v/*VALUE*/ +"]";
|
|
3401
|
-
|
|
3402
|
-
var documentQuerySelectorAll = /** @type {!Function} */ (
|
|
3403
|
-
typeof document !== "undefined" && document.querySelectorAll.bind(document));
|
|
3404
|
-
|
|
3405
|
-
function getIdenticonType(el) {
|
|
3406
|
-
if (el) {
|
|
3407
|
-
var tagName = el["tagName"];
|
|
3408
|
-
|
|
3409
|
-
if (/^svg$/i.test(tagName)) {
|
|
3410
|
-
return ICON_TYPE_SVG;
|
|
3411
|
-
}
|
|
3412
|
-
|
|
3413
|
-
if (/^canvas$/i.test(tagName) && "getContext" in el) {
|
|
3414
|
-
return ICON_TYPE_CANVAS;
|
|
3415
|
-
}
|
|
3416
|
-
}
|
|
3417
|
-
}
|
|
3418
|
-
|
|
3419
|
-
/**
|
|
3420
|
-
* Draws an identicon to a context.
|
|
3421
|
-
* @param {CanvasRenderingContext2D} ctx - Canvas context on which the icon will be drawn at location (0, 0).
|
|
3422
|
-
* @param {*} hashOrValue - A hexadecimal hash string or any value that will be hashed by Jdenticon.
|
|
3423
|
-
* @param {number} size - Icon size in pixels.
|
|
3424
|
-
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3425
|
-
* global configuration in its entirety. For backward compatibility a padding value in the range [0.0, 0.5) can be
|
|
3426
|
-
* specified in place of a configuration object.
|
|
3427
|
-
*/
|
|
3428
|
-
function drawIcon(ctx, hashOrValue, size, config) {
|
|
3429
|
-
if (!ctx) {
|
|
3430
|
-
throw new Error("No canvas specified.");
|
|
3431
|
-
}
|
|
3432
|
-
|
|
3433
|
-
iconGenerator(new CanvasRenderer(ctx, size),
|
|
3434
|
-
isValidHash(hashOrValue) || computeHash(hashOrValue),
|
|
3435
|
-
config);
|
|
3436
|
-
|
|
3437
|
-
var canvas = ctx.canvas;
|
|
3438
|
-
if (canvas) {
|
|
3439
|
-
canvas[IS_RENDERED_PROPERTY] = true;
|
|
3440
|
-
}
|
|
3441
|
-
}
|
|
3442
|
-
|
|
3443
|
-
/**
|
|
3444
|
-
* Prepares a measure to be used as a measure in an SVG path, by
|
|
3445
|
-
* rounding the measure to a single decimal. This reduces the file
|
|
3446
|
-
* size of the generated SVG with more than 50% in some cases.
|
|
3447
|
-
*/
|
|
3448
|
-
function svgValue(value) {
|
|
3449
|
-
return ((value * 10 + 0.5) | 0) / 10;
|
|
3450
|
-
}
|
|
3451
|
-
|
|
3452
|
-
/**
|
|
3453
|
-
* Represents an SVG path element.
|
|
3454
|
-
*/
|
|
3455
|
-
function SvgPath() {
|
|
3456
|
-
/**
|
|
3457
|
-
* This property holds the data string (path.d) of the SVG path.
|
|
3458
|
-
* @type {string}
|
|
3459
|
-
*/
|
|
3460
|
-
this.A/*dataString*/ = "";
|
|
3461
|
-
}
|
|
3462
|
-
var SvgPath__prototype = SvgPath.prototype;
|
|
3463
|
-
|
|
3464
|
-
/**
|
|
3465
|
-
* Adds a polygon with the current fill color to the SVG path.
|
|
3466
|
-
* @param points An array of Point objects.
|
|
3467
|
-
*/
|
|
3468
|
-
SvgPath__prototype.g/*addPolygon*/ = function addPolygon (points) {
|
|
3469
|
-
var dataString = "";
|
|
3470
|
-
for (var i = 0; i < points.length; i++) {
|
|
3471
|
-
dataString += (i ? "L" : "M") + svgValue(points[i].x) + " " + svgValue(points[i].y);
|
|
3472
|
-
}
|
|
3473
|
-
this.A/*dataString*/ += dataString + "Z";
|
|
3474
|
-
};
|
|
3475
|
-
|
|
3476
|
-
/**
|
|
3477
|
-
* Adds a circle with the current fill color to the SVG path.
|
|
3478
|
-
* @param {Point} point The upper left corner of the circle bounding box.
|
|
3479
|
-
* @param {number} diameter The diameter of the circle.
|
|
3480
|
-
* @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path).
|
|
3481
|
-
*/
|
|
3482
|
-
SvgPath__prototype.h/*addCircle*/ = function addCircle (point, diameter, counterClockwise) {
|
|
3483
|
-
var sweepFlag = counterClockwise ? 0 : 1,
|
|
3484
|
-
svgRadius = svgValue(diameter / 2),
|
|
3485
|
-
svgDiameter = svgValue(diameter),
|
|
3486
|
-
svgArc = "a" + svgRadius + "," + svgRadius + " 0 1," + sweepFlag + " ";
|
|
3487
|
-
|
|
3488
|
-
this.A/*dataString*/ +=
|
|
3489
|
-
"M" + svgValue(point.x) + " " + svgValue(point.y + diameter / 2) +
|
|
3490
|
-
svgArc + svgDiameter + ",0" +
|
|
3491
|
-
svgArc + (-svgDiameter) + ",0";
|
|
3492
|
-
};
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
/**
|
|
3497
|
-
* Renderer producing SVG output.
|
|
3498
|
-
* @implements {Renderer}
|
|
3499
|
-
*/
|
|
3500
|
-
function SvgRenderer(target) {
|
|
3501
|
-
|
|
3502
|
-
/**
|
|
3503
|
-
* @type {Object.<string,SvgPath>}
|
|
3504
|
-
* @private
|
|
3505
|
-
*/
|
|
3506
|
-
this.C/*_pathsByColor*/ = { };
|
|
3507
|
-
|
|
3508
|
-
/**
|
|
3509
|
-
* @type {SvgElement|SvgWriter}
|
|
3510
|
-
* @private
|
|
3511
|
-
*/
|
|
3512
|
-
this.P/*_target*/ = target;
|
|
3513
|
-
|
|
3514
|
-
/**
|
|
3515
|
-
* @type {number}
|
|
3516
|
-
*/
|
|
3517
|
-
this.k/*iconSize*/ = target.k/*iconSize*/;
|
|
3518
|
-
}
|
|
3519
|
-
var SvgRenderer__prototype = SvgRenderer.prototype;
|
|
3520
|
-
|
|
3521
|
-
/**
|
|
3522
|
-
* Fills the background with the specified color.
|
|
3523
|
-
* @param {string} fillColor Fill color on the format #rrggbb[aa].
|
|
3524
|
-
*/
|
|
3525
|
-
SvgRenderer__prototype.m/*setBackground*/ = function setBackground (fillColor) {
|
|
3526
|
-
var match = /^(#......)(..)?/.exec(fillColor),
|
|
3527
|
-
opacity = match[2] ? parseHex(match[2], 0) / 255 : 1;
|
|
3528
|
-
this.P/*_target*/.m/*setBackground*/(match[1], opacity);
|
|
3529
|
-
};
|
|
3530
|
-
|
|
3531
|
-
/**
|
|
3532
|
-
* Marks the beginning of a new shape of the specified color. Should be ended with a call to endShape.
|
|
3533
|
-
* @param {string} color Fill color on format #xxxxxx.
|
|
3534
|
-
*/
|
|
3535
|
-
SvgRenderer__prototype.M/*beginShape*/ = function beginShape (color) {
|
|
3536
|
-
this.B/*_path*/ = this.C/*_pathsByColor*/[color] || (this.C/*_pathsByColor*/[color] = new SvgPath());
|
|
3537
|
-
};
|
|
3538
|
-
|
|
3539
|
-
/**
|
|
3540
|
-
* Marks the end of the currently drawn shape.
|
|
3541
|
-
*/
|
|
3542
|
-
SvgRenderer__prototype.N/*endShape*/ = function endShape () { };
|
|
3543
|
-
|
|
3544
|
-
/**
|
|
3545
|
-
* Adds a polygon with the current fill color to the SVG.
|
|
3546
|
-
* @param points An array of Point objects.
|
|
3547
|
-
*/
|
|
3548
|
-
SvgRenderer__prototype.g/*addPolygon*/ = function addPolygon (points) {
|
|
3549
|
-
this.B/*_path*/.g/*addPolygon*/(points);
|
|
3550
|
-
};
|
|
3551
|
-
|
|
3552
|
-
/**
|
|
3553
|
-
* Adds a circle with the current fill color to the SVG.
|
|
3554
|
-
* @param {Point} point The upper left corner of the circle bounding box.
|
|
3555
|
-
* @param {number} diameter The diameter of the circle.
|
|
3556
|
-
* @param {boolean} counterClockwise True if the circle is drawn counter-clockwise (will result in a hole if rendered on a clockwise path).
|
|
3557
|
-
*/
|
|
3558
|
-
SvgRenderer__prototype.h/*addCircle*/ = function addCircle (point, diameter, counterClockwise) {
|
|
3559
|
-
this.B/*_path*/.h/*addCircle*/(point, diameter, counterClockwise);
|
|
3560
|
-
};
|
|
3561
|
-
|
|
3562
|
-
/**
|
|
3563
|
-
* Called when the icon has been completely drawn.
|
|
3564
|
-
*/
|
|
3565
|
-
SvgRenderer__prototype.finish = function finish () {
|
|
3566
|
-
var this$1$1 = this;
|
|
3567
|
-
|
|
3568
|
-
var pathsByColor = this.C/*_pathsByColor*/;
|
|
3569
|
-
for (var color in pathsByColor) {
|
|
3570
|
-
// hasOwnProperty cannot be shadowed in pathsByColor
|
|
3571
|
-
// eslint-disable-next-line no-prototype-builtins
|
|
3572
|
-
if (pathsByColor.hasOwnProperty(color)) {
|
|
3573
|
-
this$1$1.P/*_target*/.R/*appendPath*/(color, pathsByColor[color].A/*dataString*/);
|
|
3574
|
-
}
|
|
3575
|
-
}
|
|
3576
|
-
};
|
|
3577
|
-
|
|
3578
|
-
var SVG_CONSTANTS = {
|
|
3579
|
-
S/*XMLNS*/: "http://www.w3.org/2000/svg",
|
|
3580
|
-
T/*WIDTH*/: "width",
|
|
3581
|
-
U/*HEIGHT*/: "height",
|
|
3582
|
-
};
|
|
3583
|
-
|
|
3584
|
-
/**
|
|
3585
|
-
* Renderer producing SVG output.
|
|
3586
|
-
*/
|
|
3587
|
-
function SvgWriter(iconSize) {
|
|
3588
|
-
/**
|
|
3589
|
-
* @type {number}
|
|
3590
|
-
*/
|
|
3591
|
-
this.k/*iconSize*/ = iconSize;
|
|
3592
|
-
|
|
3593
|
-
/**
|
|
3594
|
-
* @type {string}
|
|
3595
|
-
* @private
|
|
3596
|
-
*/
|
|
3597
|
-
this.D/*_s*/ =
|
|
3598
|
-
'<svg xmlns="' + SVG_CONSTANTS.S/*XMLNS*/ + '" width="' +
|
|
3599
|
-
iconSize + '" height="' + iconSize + '" viewBox="0 0 ' +
|
|
3600
|
-
iconSize + ' ' + iconSize + '">';
|
|
3601
|
-
}
|
|
3602
|
-
var SvgWriter__prototype = SvgWriter.prototype;
|
|
3603
|
-
|
|
3604
|
-
/**
|
|
3605
|
-
* Fills the background with the specified color.
|
|
3606
|
-
* @param {string} fillColor Fill color on the format #rrggbb.
|
|
3607
|
-
* @param {number} opacity Opacity in the range [0.0, 1.0].
|
|
3608
|
-
*/
|
|
3609
|
-
SvgWriter__prototype.m/*setBackground*/ = function setBackground (fillColor, opacity) {
|
|
3610
|
-
if (opacity) {
|
|
3611
|
-
this.D/*_s*/ += '<rect width="100%" height="100%" fill="' +
|
|
3612
|
-
fillColor + '" opacity="' + opacity.toFixed(2) + '"/>';
|
|
3613
|
-
}
|
|
3614
|
-
};
|
|
3615
|
-
|
|
3616
|
-
/**
|
|
3617
|
-
* Writes a path to the SVG string.
|
|
3618
|
-
* @param {string} color Fill color on format #rrggbb.
|
|
3619
|
-
* @param {string} dataString The SVG path data string.
|
|
3620
|
-
*/
|
|
3621
|
-
SvgWriter__prototype.R/*appendPath*/ = function appendPath (color, dataString) {
|
|
3622
|
-
this.D/*_s*/ += '<path fill="' + color + '" d="' + dataString + '"/>';
|
|
3623
|
-
};
|
|
3624
|
-
|
|
3625
|
-
/**
|
|
3626
|
-
* Gets the rendered image as an SVG string.
|
|
3627
|
-
*/
|
|
3628
|
-
SvgWriter__prototype.toString = function toString () {
|
|
3629
|
-
return this.D/*_s*/ + "</svg>";
|
|
3630
|
-
};
|
|
3631
|
-
|
|
3632
|
-
/**
|
|
3633
|
-
* Draws an identicon as an SVG string.
|
|
3634
|
-
* @param {*} hashOrValue - A hexadecimal hash string or any value that will be hashed by Jdenticon.
|
|
3635
|
-
* @param {number} size - Icon size in pixels.
|
|
3636
|
-
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3637
|
-
* global configuration in its entirety. For backward compatibility a padding value in the range [0.0, 0.5) can be
|
|
3638
|
-
* specified in place of a configuration object.
|
|
3639
|
-
* @returns {string} SVG string
|
|
3640
|
-
*/
|
|
3641
|
-
function toSvg(hashOrValue, size, config) {
|
|
3642
|
-
var writer = new SvgWriter(size);
|
|
3643
|
-
iconGenerator(new SvgRenderer(writer),
|
|
3644
|
-
isValidHash(hashOrValue) || computeHash(hashOrValue),
|
|
3645
|
-
config);
|
|
3646
|
-
return writer.toString();
|
|
3647
|
-
}
|
|
3648
|
-
|
|
3649
|
-
/**
|
|
3650
|
-
* Creates a new element and adds it to the specified parent.
|
|
3651
|
-
* @param {Element} parentNode
|
|
3652
|
-
* @param {string} name
|
|
3653
|
-
* @param {...(string|number)} keyValuePairs
|
|
3654
|
-
*/
|
|
3655
|
-
function SvgElement_append(parentNode, name) {
|
|
3656
|
-
var keyValuePairs = [], len = arguments.length - 2;
|
|
3657
|
-
while ( len-- > 0 ) keyValuePairs[ len ] = arguments[ len + 2 ];
|
|
3658
|
-
|
|
3659
|
-
var el = document.createElementNS(SVG_CONSTANTS.S/*XMLNS*/, name);
|
|
3660
|
-
|
|
3661
|
-
for (var i = 0; i + 1 < keyValuePairs.length; i += 2) {
|
|
3662
|
-
el.setAttribute(
|
|
3663
|
-
/** @type {string} */(keyValuePairs[i]),
|
|
3664
|
-
/** @type {string} */(keyValuePairs[i + 1])
|
|
3665
|
-
);
|
|
3666
|
-
}
|
|
3667
|
-
|
|
3668
|
-
parentNode.appendChild(el);
|
|
3669
|
-
}
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
/**
|
|
3673
|
-
* Renderer producing SVG output.
|
|
3674
|
-
*/
|
|
3675
|
-
function SvgElement(element) {
|
|
3676
|
-
// Don't use the clientWidth and clientHeight properties on SVG elements
|
|
3677
|
-
// since Firefox won't serve a proper value of these properties on SVG
|
|
3678
|
-
// elements (https://bugzilla.mozilla.org/show_bug.cgi?id=874811)
|
|
3679
|
-
// Instead use 100px as a hardcoded size (the svg viewBox will rescale
|
|
3680
|
-
// the icon to the correct dimensions)
|
|
3681
|
-
var iconSize = this.k/*iconSize*/ = Math.min(
|
|
3682
|
-
(Number(element.getAttribute(SVG_CONSTANTS.T/*WIDTH*/)) || 100),
|
|
3683
|
-
(Number(element.getAttribute(SVG_CONSTANTS.U/*HEIGHT*/)) || 100)
|
|
3684
|
-
);
|
|
3685
|
-
|
|
3686
|
-
/**
|
|
3687
|
-
* @type {Element}
|
|
3688
|
-
* @private
|
|
3689
|
-
*/
|
|
3690
|
-
this.V/*_el*/ = element;
|
|
3691
|
-
|
|
3692
|
-
// Clear current SVG child elements
|
|
3693
|
-
while (element.firstChild) {
|
|
3694
|
-
element.removeChild(element.firstChild);
|
|
3695
|
-
}
|
|
3696
|
-
|
|
3697
|
-
// Set viewBox attribute to ensure the svg scales nicely.
|
|
3698
|
-
element.setAttribute("viewBox", "0 0 " + iconSize + " " + iconSize);
|
|
3699
|
-
element.setAttribute("preserveAspectRatio", "xMidYMid meet");
|
|
3700
|
-
}
|
|
3701
|
-
var SvgElement__prototype = SvgElement.prototype;
|
|
3702
|
-
|
|
3703
|
-
/**
|
|
3704
|
-
* Fills the background with the specified color.
|
|
3705
|
-
* @param {string} fillColor Fill color on the format #rrggbb.
|
|
3706
|
-
* @param {number} opacity Opacity in the range [0.0, 1.0].
|
|
3707
|
-
*/
|
|
3708
|
-
SvgElement__prototype.m/*setBackground*/ = function setBackground (fillColor, opacity) {
|
|
3709
|
-
if (opacity) {
|
|
3710
|
-
SvgElement_append(this.V/*_el*/, "rect",
|
|
3711
|
-
SVG_CONSTANTS.T/*WIDTH*/, "100%",
|
|
3712
|
-
SVG_CONSTANTS.U/*HEIGHT*/, "100%",
|
|
3713
|
-
"fill", fillColor,
|
|
3714
|
-
"opacity", opacity);
|
|
3715
|
-
}
|
|
3716
|
-
};
|
|
3717
|
-
|
|
3718
|
-
/**
|
|
3719
|
-
* Appends a path to the SVG element.
|
|
3720
|
-
* @param {string} color Fill color on format #xxxxxx.
|
|
3721
|
-
* @param {string} dataString The SVG path data string.
|
|
3722
|
-
*/
|
|
3723
|
-
SvgElement__prototype.R/*appendPath*/ = function appendPath (color, dataString) {
|
|
3724
|
-
SvgElement_append(this.V/*_el*/, "path",
|
|
3725
|
-
"fill", color,
|
|
3726
|
-
"d", dataString);
|
|
3727
|
-
};
|
|
3728
|
-
|
|
3729
|
-
/**
|
|
3730
|
-
* Updates all canvas elements with the `data-jdenticon-hash` or `data-jdenticon-value` attribute.
|
|
3731
|
-
*/
|
|
3732
|
-
function updateAll() {
|
|
3733
|
-
if (documentQuerySelectorAll) {
|
|
3734
|
-
update(ICON_SELECTOR);
|
|
3735
|
-
}
|
|
3736
|
-
}
|
|
3737
|
-
|
|
3738
|
-
/**
|
|
3739
|
-
* Updates the identicon in the specified `<canvas>` or `<svg>` elements.
|
|
3740
|
-
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3741
|
-
* `<svg>` or `<canvas>`, or a CSS selector to such an element.
|
|
3742
|
-
* @param {*=} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3743
|
-
* `data-jdenticon-value` attribute will be evaluated.
|
|
3744
|
-
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3745
|
-
* global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be
|
|
3746
|
-
* specified in place of a configuration object.
|
|
3747
|
-
*/
|
|
3748
|
-
function update(el, hashOrValue, config) {
|
|
3749
|
-
renderDomElement(el, hashOrValue, config, function (el, iconType) {
|
|
3750
|
-
if (iconType) {
|
|
3751
|
-
return iconType == ICON_TYPE_SVG ?
|
|
3752
|
-
new SvgRenderer(new SvgElement(el)) :
|
|
3753
|
-
new CanvasRenderer(/** @type {HTMLCanvasElement} */(el).getContext("2d"));
|
|
3754
|
-
}
|
|
3755
|
-
});
|
|
3756
|
-
}
|
|
3757
|
-
|
|
3758
|
-
/**
|
|
3759
|
-
* Updates the identicon in the specified `<canvas>` elements.
|
|
3760
|
-
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3761
|
-
* `<canvas>`, or a CSS selector to such an element.
|
|
3762
|
-
* @param {*=} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3763
|
-
* `data-jdenticon-value` attribute will be evaluated.
|
|
3764
|
-
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3765
|
-
* global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be
|
|
3766
|
-
* specified in place of a configuration object.
|
|
3767
|
-
*/
|
|
3768
|
-
function updateCanvas(el, hashOrValue, config) {
|
|
3769
|
-
renderDomElement(el, hashOrValue, config, function (el, iconType) {
|
|
3770
|
-
if (iconType == ICON_TYPE_CANVAS) {
|
|
3771
|
-
return new CanvasRenderer(/** @type {HTMLCanvasElement} */(el).getContext("2d"));
|
|
3772
|
-
}
|
|
3773
|
-
});
|
|
3774
|
-
}
|
|
3775
|
-
|
|
3776
|
-
/**
|
|
3777
|
-
* Updates the identicon in the specified `<svg>` elements.
|
|
3778
|
-
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3779
|
-
* `<svg>`, or a CSS selector to such an element.
|
|
3780
|
-
* @param {*=} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3781
|
-
* `data-jdenticon-value` attribute will be evaluated.
|
|
3782
|
-
* @param {Object|number=} config - Optional configuration. If specified, this configuration object overrides any
|
|
3783
|
-
* global configuration in its entirety. For backward compability a padding value in the range [0.0, 0.5) can be
|
|
3784
|
-
* specified in place of a configuration object.
|
|
3785
|
-
*/
|
|
3786
|
-
function updateSvg(el, hashOrValue, config) {
|
|
3787
|
-
renderDomElement(el, hashOrValue, config, function (el, iconType) {
|
|
3788
|
-
if (iconType == ICON_TYPE_SVG) {
|
|
3789
|
-
return new SvgRenderer(new SvgElement(el));
|
|
3790
|
-
}
|
|
3791
|
-
});
|
|
3792
|
-
}
|
|
3793
|
-
|
|
3794
|
-
/**
|
|
3795
|
-
* Updates the identicon in the specified canvas or svg elements.
|
|
3796
|
-
* @param {(string|Element)} el - Specifies the container in which the icon is rendered as a DOM element of the type
|
|
3797
|
-
* `<svg>` or `<canvas>`, or a CSS selector to such an element.
|
|
3798
|
-
* @param {*} hashOrValue - Optional hash or value to be rendered. If not specified, the `data-jdenticon-hash` or
|
|
3799
|
-
* `data-jdenticon-value` attribute will be evaluated.
|
|
3800
|
-
* @param {Object|number|undefined} config
|
|
3801
|
-
* @param {function(Element,number):Renderer} rendererFactory - Factory function for creating an icon renderer.
|
|
3802
|
-
*/
|
|
3803
|
-
function renderDomElement(el, hashOrValue, config, rendererFactory) {
|
|
3804
|
-
if (typeof el === "string") {
|
|
3805
|
-
if (documentQuerySelectorAll) {
|
|
3806
|
-
var elements = documentQuerySelectorAll(el);
|
|
3807
|
-
for (var i = 0; i < elements.length; i++) {
|
|
3808
|
-
renderDomElement(elements[i], hashOrValue, config, rendererFactory);
|
|
3809
|
-
}
|
|
3810
|
-
}
|
|
3811
|
-
return;
|
|
3812
|
-
}
|
|
3813
|
-
|
|
3814
|
-
// Hash selection. The result from getValidHash or computeHash is
|
|
3815
|
-
// accepted as a valid hash.
|
|
3816
|
-
var hash =
|
|
3817
|
-
// 1. Explicit valid hash
|
|
3818
|
-
isValidHash(hashOrValue) ||
|
|
3819
|
-
|
|
3820
|
-
// 2. Explicit value (`!= null` catches both null and undefined)
|
|
3821
|
-
hashOrValue != null && computeHash(hashOrValue) ||
|
|
3822
|
-
|
|
3823
|
-
// 3. `data-jdenticon-hash` attribute
|
|
3824
|
-
isValidHash(el.getAttribute(ATTRIBUTES.O/*HASH*/)) ||
|
|
3825
|
-
|
|
3826
|
-
// 4. `data-jdenticon-value` attribute.
|
|
3827
|
-
// We want to treat an empty attribute as an empty value.
|
|
3828
|
-
// Some browsers return empty string even if the attribute
|
|
3829
|
-
// is not specified, so use hasAttribute to determine if
|
|
3830
|
-
// the attribute is specified.
|
|
3831
|
-
el.hasAttribute(ATTRIBUTES.v/*VALUE*/) && computeHash(el.getAttribute(ATTRIBUTES.v/*VALUE*/));
|
|
3832
|
-
|
|
3833
|
-
if (!hash) {
|
|
3834
|
-
// No hash specified. Don't render an icon.
|
|
3835
|
-
return;
|
|
3836
|
-
}
|
|
3837
|
-
|
|
3838
|
-
var renderer = rendererFactory(el, getIdenticonType(el));
|
|
3839
|
-
if (renderer) {
|
|
3840
|
-
// Draw icon
|
|
3841
|
-
iconGenerator(renderer, hash, config);
|
|
3842
|
-
el[IS_RENDERED_PROPERTY] = true;
|
|
3843
|
-
}
|
|
3844
|
-
}
|
|
3845
|
-
|
|
3846
|
-
// This file is compiled to dist/jdenticon-module.js
|
|
3847
|
-
|
|
3848
|
-
var jdenticon = updateAll;
|
|
3849
|
-
|
|
3850
|
-
defineConfigProperty(jdenticon);
|
|
3851
|
-
|
|
3852
|
-
// Export public API
|
|
3853
|
-
jdenticon["configure"] = configure;
|
|
3854
|
-
jdenticon["drawIcon"] = drawIcon;
|
|
3855
|
-
jdenticon["toSvg"] = toSvg;
|
|
3856
|
-
jdenticon["update"] = update;
|
|
3857
|
-
jdenticon["updateCanvas"] = updateCanvas;
|
|
3858
|
-
jdenticon["updateSvg"] = updateSvg;
|
|
3859
|
-
|
|
3860
|
-
/**
|
|
3861
|
-
* Specifies the version of the Jdenticon package in use.
|
|
3862
|
-
* @type {string}
|
|
3863
|
-
*/
|
|
3864
|
-
jdenticon["version"] = "3.3.0";
|
|
3865
|
-
|
|
3866
|
-
/**
|
|
3867
|
-
* Specifies which bundle of Jdenticon that is used.
|
|
3868
|
-
* @type {string}
|
|
3869
|
-
*/
|
|
3870
|
-
jdenticon["bundle"] = "browser-cjs";
|
|
3871
|
-
|
|
3872
|
-
var jdenticonModule = jdenticon;
|
|
3917
|
+
var jdenticonModuleExports = requireJdenticonModule();
|
|
3873
3918
|
|
|
3874
3919
|
const DEFAULT_CONFIG = {
|
|
3875
3920
|
keycloak: {
|
|
@@ -3895,6 +3940,8 @@ const DEFAULT_CONFIG = {
|
|
|
3895
3940
|
isLoading: true,
|
|
3896
3941
|
duration: 800
|
|
3897
3942
|
},
|
|
3943
|
+
allowedGlobalDomain: '',
|
|
3944
|
+
whitelistedUrls: ''
|
|
3898
3945
|
};
|
|
3899
3946
|
// Fetch config from API
|
|
3900
3947
|
class ConfigService {
|
|
@@ -3930,9 +3977,23 @@ class ConfigService {
|
|
|
3930
3977
|
}
|
|
3931
3978
|
const configService = ConfigService.getInstance();
|
|
3932
3979
|
|
|
3980
|
+
// const getRootDomain = (hostOrUrl: string): string => {
|
|
3981
|
+
// // Ensure we can parse it with URL
|
|
3982
|
+
// const url = hostOrUrl.startsWith("http") ? new URL(hostOrUrl) : new URL(`https://${hostOrUrl}`);
|
|
3983
|
+
// const hostname = url.hostname;
|
|
3984
|
+
// const port = url.port ? `:${url.port}` : "";
|
|
3985
|
+
// const parts = hostname.split(".");
|
|
3986
|
+
// // localhost → return with port
|
|
3987
|
+
// if (hostname === "localhost") return hostname + port;
|
|
3988
|
+
// // sslip.io → keep last 3 parts
|
|
3989
|
+
// if (hostname.endsWith(".sslip.io")) return parts.slice(-5).join(".") + port;
|
|
3990
|
+
// // Normal domains → remove first label
|
|
3991
|
+
// return parts.slice(1).join(".") + port;
|
|
3992
|
+
// };
|
|
3933
3993
|
const getRootDomain = (hostOrUrl) => {
|
|
3934
|
-
|
|
3935
|
-
|
|
3994
|
+
const url = hostOrUrl.startsWith("http")
|
|
3995
|
+
? new URL(hostOrUrl)
|
|
3996
|
+
: new URL(`https://${hostOrUrl}`);
|
|
3936
3997
|
const hostname = url.hostname;
|
|
3937
3998
|
const port = url.port ? `:${url.port}` : "";
|
|
3938
3999
|
const parts = hostname.split(".");
|
|
@@ -3942,8 +4003,8 @@ const getRootDomain = (hostOrUrl) => {
|
|
|
3942
4003
|
// sslip.io → keep last 3 parts
|
|
3943
4004
|
if (hostname.endsWith(".sslip.io"))
|
|
3944
4005
|
return parts.slice(-5).join(".") + port;
|
|
3945
|
-
//
|
|
3946
|
-
return
|
|
4006
|
+
// Keep full hostname
|
|
4007
|
+
return hostname + port;
|
|
3947
4008
|
};
|
|
3948
4009
|
const getUrlProtocol = (url, defaultProtocol = "https://") => {
|
|
3949
4010
|
if (!url)
|
|
@@ -3995,33 +4056,61 @@ class MenuService {
|
|
|
3995
4056
|
}
|
|
3996
4057
|
const menuService = new MenuService();
|
|
3997
4058
|
|
|
3998
|
-
const dashButtonCss = "/*!\n * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2024 Fonticons, Inc.\n */.fa{font-family:var(--fa-style-family,\"Font Awesome 6 Free\");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:\"Font Awesome 6 Free\"}.fa-brands,.fab{font-family:\"Font Awesome 6 Brands\"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0{--fa:\"\\30\"}.fa-1{--fa:\"\\31\"}.fa-2{--fa:\"\\32\"}.fa-3{--fa:\"\\33\"}.fa-4{--fa:\"\\34\"}.fa-5{--fa:\"\\35\"}.fa-6{--fa:\"\\36\"}.fa-7{--fa:\"\\37\"}.fa-8{--fa:\"\\38\"}.fa-9{--fa:\"\\39\"}.fa-fill-drip{--fa:\"\\f576\"}.fa-arrows-to-circle{--fa:\"\\e4bd\"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:\"\\f138\"}.fa-at{--fa:\"\\40\"}.fa-trash-alt,.fa-trash-can{--fa:\"\\f2ed\"}.fa-text-height{--fa:\"\\f034\"}.fa-user-times,.fa-user-xmark{--fa:\"\\f235\"}.fa-stethoscope{--fa:\"\\f0f1\"}.fa-comment-alt,.fa-message{--fa:\"\\f27a\"}.fa-info{--fa:\"\\f129\"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:\"\\f422\"}.fa-explosion{--fa:\"\\e4e9\"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:\"\\f15c\"}.fa-wave-square{--fa:\"\\f83e\"}.fa-ring{--fa:\"\\f70b\"}.fa-building-un{--fa:\"\\e4d9\"}.fa-dice-three{--fa:\"\\f527\"}.fa-calendar-alt,.fa-calendar-days{--fa:\"\\f073\"}.fa-anchor-circle-check{--fa:\"\\e4aa\"}.fa-building-circle-arrow-right{--fa:\"\\e4d1\"}.fa-volleyball,.fa-volleyball-ball{--fa:\"\\f45f\"}.fa-arrows-up-to-line{--fa:\"\\e4c2\"}.fa-sort-desc,.fa-sort-down{--fa:\"\\f0dd\"}.fa-circle-minus,.fa-minus-circle{--fa:\"\\f056\"}.fa-door-open{--fa:\"\\f52b\"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:\"\\f2f5\"}.fa-atom{--fa:\"\\f5d2\"}.fa-soap{--fa:\"\\e06e\"}.fa-heart-music-camera-bolt,.fa-icons{--fa:\"\\f86d\"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:\"\\f539\"}.fa-bridge-circle-check{--fa:\"\\e4c9\"}.fa-pump-medical{--fa:\"\\e06a\"}.fa-fingerprint{--fa:\"\\f577\"}.fa-hand-point-right{--fa:\"\\f0a4\"}.fa-magnifying-glass-location,.fa-search-location{--fa:\"\\f689\"}.fa-forward-step,.fa-step-forward{--fa:\"\\f051\"}.fa-face-smile-beam,.fa-smile-beam{--fa:\"\\f5b8\"}.fa-flag-checkered{--fa:\"\\f11e\"}.fa-football,.fa-football-ball{--fa:\"\\f44e\"}.fa-school-circle-exclamation{--fa:\"\\e56c\"}.fa-crop{--fa:\"\\f125\"}.fa-angle-double-down,.fa-angles-down{--fa:\"\\f103\"}.fa-users-rectangle{--fa:\"\\e594\"}.fa-people-roof{--fa:\"\\e537\"}.fa-people-line{--fa:\"\\e534\"}.fa-beer,.fa-beer-mug-empty{--fa:\"\\f0fc\"}.fa-diagram-predecessor{--fa:\"\\e477\"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:\"\\f176\"}.fa-burn,.fa-fire-flame-simple{--fa:\"\\f46a\"}.fa-male,.fa-person{--fa:\"\\f183\"}.fa-laptop{--fa:\"\\f109\"}.fa-file-csv{--fa:\"\\f6dd\"}.fa-menorah{--fa:\"\\f676\"}.fa-truck-plane{--fa:\"\\e58f\"}.fa-record-vinyl{--fa:\"\\f8d9\"}.fa-face-grin-stars,.fa-grin-stars{--fa:\"\\f587\"}.fa-bong{--fa:\"\\f55c\"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:\"\\f67b\"}.fa-arrow-down-up-across-line{--fa:\"\\e4af\"}.fa-spoon,.fa-utensil-spoon{--fa:\"\\f2e5\"}.fa-jar-wheat{--fa:\"\\e517\"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:\"\\f674\"}.fa-file-circle-exclamation{--fa:\"\\e4eb\"}.fa-circle-h,.fa-hospital-symbol{--fa:\"\\f47e\"}.fa-pager{--fa:\"\\f815\"}.fa-address-book,.fa-contact-book{--fa:\"\\f2b9\"}.fa-strikethrough{--fa:\"\\f0cc\"}.fa-k{--fa:\"\\4b\"}.fa-landmark-flag{--fa:\"\\e51c\"}.fa-pencil,.fa-pencil-alt{--fa:\"\\f303\"}.fa-backward{--fa:\"\\f04a\"}.fa-caret-right{--fa:\"\\f0da\"}.fa-comments{--fa:\"\\f086\"}.fa-file-clipboard,.fa-paste{--fa:\"\\f0ea\"}.fa-code-pull-request{--fa:\"\\e13c\"}.fa-clipboard-list{--fa:\"\\f46d\"}.fa-truck-loading,.fa-truck-ramp-box{--fa:\"\\f4de\"}.fa-user-check{--fa:\"\\f4fc\"}.fa-vial-virus{--fa:\"\\e597\"}.fa-sheet-plastic{--fa:\"\\e571\"}.fa-blog{--fa:\"\\f781\"}.fa-user-ninja{--fa:\"\\f504\"}.fa-person-arrow-up-from-line{--fa:\"\\e539\"}.fa-scroll-torah,.fa-torah{--fa:\"\\f6a0\"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:\"\\f458\"}.fa-toggle-off{--fa:\"\\f204\"}.fa-archive,.fa-box-archive{--fa:\"\\f187\"}.fa-person-drowning{--fa:\"\\e545\"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:\"\\f886\"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:\"\\f58a\"}.fa-spray-can{--fa:\"\\f5bd\"}.fa-truck-monster{--fa:\"\\f63b\"}.fa-w{--fa:\"\\57\"}.fa-earth-africa,.fa-globe-africa{--fa:\"\\f57c\"}.fa-rainbow{--fa:\"\\f75b\"}.fa-circle-notch{--fa:\"\\f1ce\"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:\"\\f3fa\"}.fa-paw{--fa:\"\\f1b0\"}.fa-cloud{--fa:\"\\f0c2\"}.fa-trowel-bricks{--fa:\"\\e58a\"}.fa-face-flushed,.fa-flushed{--fa:\"\\f579\"}.fa-hospital-user{--fa:\"\\f80d\"}.fa-tent-arrow-left-right{--fa:\"\\e57f\"}.fa-gavel,.fa-legal{--fa:\"\\f0e3\"}.fa-binoculars{--fa:\"\\f1e5\"}.fa-microphone-slash{--fa:\"\\f131\"}.fa-box-tissue{--fa:\"\\e05b\"}.fa-motorcycle{--fa:\"\\f21c\"}.fa-bell-concierge,.fa-concierge-bell{--fa:\"\\f562\"}.fa-pen-ruler,.fa-pencil-ruler{--fa:\"\\f5ae\"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:\"\\e068\"}.fa-mars-and-venus-burst{--fa:\"\\e523\"}.fa-caret-square-right,.fa-square-caret-right{--fa:\"\\f152\"}.fa-cut,.fa-scissors{--fa:\"\\f0c4\"}.fa-sun-plant-wilt{--fa:\"\\e57a\"}.fa-toilets-portable{--fa:\"\\e584\"}.fa-hockey-puck{--fa:\"\\f453\"}.fa-table{--fa:\"\\f0ce\"}.fa-magnifying-glass-arrow-right{--fa:\"\\e521\"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:\"\\f566\"}.fa-users-slash{--fa:\"\\e073\"}.fa-clover{--fa:\"\\e139\"}.fa-mail-reply,.fa-reply{--fa:\"\\f3e5\"}.fa-star-and-crescent{--fa:\"\\f699\"}.fa-house-fire{--fa:\"\\e50c\"}.fa-minus-square,.fa-square-minus{--fa:\"\\f146\"}.fa-helicopter{--fa:\"\\f533\"}.fa-compass{--fa:\"\\f14e\"}.fa-caret-square-down,.fa-square-caret-down{--fa:\"\\f150\"}.fa-file-circle-question{--fa:\"\\e4ef\"}.fa-laptop-code{--fa:\"\\f5fc\"}.fa-swatchbook{--fa:\"\\f5c3\"}.fa-prescription-bottle{--fa:\"\\f485\"}.fa-bars,.fa-navicon{--fa:\"\\f0c9\"}.fa-people-group{--fa:\"\\e533\"}.fa-hourglass-3,.fa-hourglass-end{--fa:\"\\f253\"}.fa-heart-broken,.fa-heart-crack{--fa:\"\\f7a9\"}.fa-external-link-square-alt,.fa-square-up-right{--fa:\"\\f360\"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:\"\\f597\"}.fa-film{--fa:\"\\f008\"}.fa-ruler-horizontal{--fa:\"\\f547\"}.fa-people-robbery{--fa:\"\\e536\"}.fa-lightbulb{--fa:\"\\f0eb\"}.fa-caret-left{--fa:\"\\f0d9\"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:\"\\f06a\"}.fa-school-circle-xmark{--fa:\"\\e56d\"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:\"\\f08b\"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:\"\\f13a\"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:\"\\f13e\"}.fa-cloud-showers-heavy{--fa:\"\\f740\"}.fa-headphones-alt,.fa-headphones-simple{--fa:\"\\f58f\"}.fa-sitemap{--fa:\"\\f0e8\"}.fa-circle-dollar-to-slot,.fa-donate{--fa:\"\\f4b9\"}.fa-memory{--fa:\"\\f538\"}.fa-road-spikes{--fa:\"\\e568\"}.fa-fire-burner{--fa:\"\\e4f1\"}.fa-flag{--fa:\"\\f024\"}.fa-hanukiah{--fa:\"\\f6e6\"}.fa-feather{--fa:\"\\f52d\"}.fa-volume-down,.fa-volume-low{--fa:\"\\f027\"}.fa-comment-slash{--fa:\"\\f4b3\"}.fa-cloud-sun-rain{--fa:\"\\f743\"}.fa-compress{--fa:\"\\f066\"}.fa-wheat-alt,.fa-wheat-awn{--fa:\"\\e2cd\"}.fa-ankh{--fa:\"\\f644\"}.fa-hands-holding-child{--fa:\"\\e4fa\"}.fa-asterisk{--fa:\"\\2a\"}.fa-check-square,.fa-square-check{--fa:\"\\f14a\"}.fa-peseta-sign{--fa:\"\\e221\"}.fa-header,.fa-heading{--fa:\"\\f1dc\"}.fa-ghost{--fa:\"\\f6e2\"}.fa-list,.fa-list-squares{--fa:\"\\f03a\"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:\"\\f87b\"}.fa-cart-plus{--fa:\"\\f217\"}.fa-gamepad{--fa:\"\\f11b\"}.fa-circle-dot,.fa-dot-circle{--fa:\"\\f192\"}.fa-dizzy,.fa-face-dizzy{--fa:\"\\f567\"}.fa-egg{--fa:\"\\f7fb\"}.fa-house-medical-circle-xmark{--fa:\"\\e513\"}.fa-campground{--fa:\"\\f6bb\"}.fa-folder-plus{--fa:\"\\f65e\"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:\"\\f1e3\"}.fa-paint-brush,.fa-paintbrush{--fa:\"\\f1fc\"}.fa-lock{--fa:\"\\f023\"}.fa-gas-pump{--fa:\"\\f52f\"}.fa-hot-tub,.fa-hot-tub-person{--fa:\"\\f593\"}.fa-map-location,.fa-map-marked{--fa:\"\\f59f\"}.fa-house-flood-water{--fa:\"\\e50e\"}.fa-tree{--fa:\"\\f1bb\"}.fa-bridge-lock{--fa:\"\\e4cc\"}.fa-sack-dollar{--fa:\"\\f81d\"}.fa-edit,.fa-pen-to-square{--fa:\"\\f044\"}.fa-car-side{--fa:\"\\f5e4\"}.fa-share-alt,.fa-share-nodes{--fa:\"\\f1e0\"}.fa-heart-circle-minus{--fa:\"\\e4ff\"}.fa-hourglass-2,.fa-hourglass-half{--fa:\"\\f252\"}.fa-microscope{--fa:\"\\f610\"}.fa-sink{--fa:\"\\e06d\"}.fa-bag-shopping,.fa-shopping-bag{--fa:\"\\f290\"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:\"\\f881\"}.fa-mitten{--fa:\"\\f7b5\"}.fa-person-rays{--fa:\"\\e54d\"}.fa-users{--fa:\"\\f0c0\"}.fa-eye-slash{--fa:\"\\f070\"}.fa-flask-vial{--fa:\"\\e4f3\"}.fa-hand,.fa-hand-paper{--fa:\"\\f256\"}.fa-om{--fa:\"\\f679\"}.fa-worm{--fa:\"\\e599\"}.fa-house-circle-xmark{--fa:\"\\e50b\"}.fa-plug{--fa:\"\\f1e6\"}.fa-chevron-up{--fa:\"\\f077\"}.fa-hand-spock{--fa:\"\\f259\"}.fa-stopwatch{--fa:\"\\f2f2\"}.fa-face-kiss,.fa-kiss{--fa:\"\\f596\"}.fa-bridge-circle-xmark{--fa:\"\\e4cb\"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:\"\\f589\"}.fa-chess-bishop{--fa:\"\\f43a\"}.fa-face-grin-wink,.fa-grin-wink{--fa:\"\\f58c\"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:\"\\f2a4\"}.fa-road-circle-check{--fa:\"\\e564\"}.fa-dice-five{--fa:\"\\f523\"}.fa-rss-square,.fa-square-rss{--fa:\"\\f143\"}.fa-land-mine-on{--fa:\"\\e51b\"}.fa-i-cursor{--fa:\"\\f246\"}.fa-stamp{--fa:\"\\f5bf\"}.fa-stairs{--fa:\"\\e289\"}.fa-i{--fa:\"\\49\"}.fa-hryvnia,.fa-hryvnia-sign{--fa:\"\\f6f2\"}.fa-pills{--fa:\"\\f484\"}.fa-face-grin-wide,.fa-grin-alt{--fa:\"\\f581\"}.fa-tooth{--fa:\"\\f5c9\"}.fa-v{--fa:\"\\56\"}.fa-bangladeshi-taka-sign{--fa:\"\\e2e6\"}.fa-bicycle{--fa:\"\\f206\"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:\"\\e579\"}.fa-head-side-cough-slash{--fa:\"\\e062\"}.fa-ambulance,.fa-truck-medical{--fa:\"\\f0f9\"}.fa-wheat-awn-circle-exclamation{--fa:\"\\e598\"}.fa-snowman{--fa:\"\\f7d0\"}.fa-mortar-pestle{--fa:\"\\f5a7\"}.fa-road-barrier{--fa:\"\\e562\"}.fa-school{--fa:\"\\f549\"}.fa-igloo{--fa:\"\\f7ae\"}.fa-joint{--fa:\"\\f595\"}.fa-angle-right{--fa:\"\\f105\"}.fa-horse{--fa:\"\\f6f0\"}.fa-q{--fa:\"\\51\"}.fa-g{--fa:\"\\47\"}.fa-notes-medical{--fa:\"\\f481\"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:\"\\f2c9\"}.fa-dong-sign{--fa:\"\\e169\"}.fa-capsules{--fa:\"\\f46b\"}.fa-poo-bolt,.fa-poo-storm{--fa:\"\\f75a\"}.fa-face-frown-open,.fa-frown-open{--fa:\"\\f57a\"}.fa-hand-point-up{--fa:\"\\f0a6\"}.fa-money-bill{--fa:\"\\f0d6\"}.fa-bookmark{--fa:\"\\f02e\"}.fa-align-justify{--fa:\"\\f039\"}.fa-umbrella-beach{--fa:\"\\f5ca\"}.fa-helmet-un{--fa:\"\\e503\"}.fa-bullseye{--fa:\"\\f140\"}.fa-bacon{--fa:\"\\f7e5\"}.fa-hand-point-down{--fa:\"\\f0a7\"}.fa-arrow-up-from-bracket{--fa:\"\\e09a\"}.fa-folder,.fa-folder-blank{--fa:\"\\f07b\"}.fa-file-medical-alt,.fa-file-waveform{--fa:\"\\f478\"}.fa-radiation{--fa:\"\\f7b9\"}.fa-chart-simple{--fa:\"\\e473\"}.fa-mars-stroke{--fa:\"\\f229\"}.fa-vial{--fa:\"\\f492\"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:\"\\f624\"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:\"\\e2ca\"}.fa-e{--fa:\"\\45\"}.fa-pen-alt,.fa-pen-clip{--fa:\"\\f305\"}.fa-bridge-circle-exclamation{--fa:\"\\e4ca\"}.fa-user{--fa:\"\\f007\"}.fa-school-circle-check{--fa:\"\\e56b\"}.fa-dumpster{--fa:\"\\f793\"}.fa-shuttle-van,.fa-van-shuttle{--fa:\"\\f5b6\"}.fa-building-user{--fa:\"\\e4da\"}.fa-caret-square-left,.fa-square-caret-left{--fa:\"\\f191\"}.fa-highlighter{--fa:\"\\f591\"}.fa-key{--fa:\"\\f084\"}.fa-bullhorn{--fa:\"\\f0a1\"}.fa-globe{--fa:\"\\f0ac\"}.fa-synagogue{--fa:\"\\f69b\"}.fa-person-half-dress{--fa:\"\\e548\"}.fa-road-bridge{--fa:\"\\e563\"}.fa-location-arrow{--fa:\"\\f124\"}.fa-c{--fa:\"\\43\"}.fa-tablet-button{--fa:\"\\f10a\"}.fa-building-lock{--fa:\"\\e4d6\"}.fa-pizza-slice{--fa:\"\\f818\"}.fa-money-bill-wave{--fa:\"\\f53a\"}.fa-area-chart,.fa-chart-area{--fa:\"\\f1fe\"}.fa-house-flag{--fa:\"\\e50d\"}.fa-person-circle-minus{--fa:\"\\e540\"}.fa-ban,.fa-cancel{--fa:\"\\f05e\"}.fa-camera-rotate{--fa:\"\\e0d8\"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:\"\\f5d0\"}.fa-star{--fa:\"\\f005\"}.fa-repeat{--fa:\"\\f363\"}.fa-cross{--fa:\"\\f654\"}.fa-box{--fa:\"\\f466\"}.fa-venus-mars{--fa:\"\\f228\"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:\"\\f245\"}.fa-expand-arrows-alt,.fa-maximize{--fa:\"\\f31e\"}.fa-charging-station{--fa:\"\\f5e7\"}.fa-shapes,.fa-triangle-circle-square{--fa:\"\\f61f\"}.fa-random,.fa-shuffle{--fa:\"\\f074\"}.fa-person-running,.fa-running{--fa:\"\\f70c\"}.fa-mobile-retro{--fa:\"\\e527\"}.fa-grip-lines-vertical{--fa:\"\\f7a5\"}.fa-spider{--fa:\"\\f717\"}.fa-hands-bound{--fa:\"\\e4f9\"}.fa-file-invoice-dollar{--fa:\"\\f571\"}.fa-plane-circle-exclamation{--fa:\"\\e556\"}.fa-x-ray{--fa:\"\\f497\"}.fa-spell-check{--fa:\"\\f891\"}.fa-slash{--fa:\"\\f715\"}.fa-computer-mouse,.fa-mouse{--fa:\"\\f8cc\"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:\"\\f090\"}.fa-shop-slash,.fa-store-alt-slash{--fa:\"\\e070\"}.fa-server{--fa:\"\\f233\"}.fa-virus-covid-slash{--fa:\"\\e4a9\"}.fa-shop-lock{--fa:\"\\e4a5\"}.fa-hourglass-1,.fa-hourglass-start{--fa:\"\\f251\"}.fa-blender-phone{--fa:\"\\f6b6\"}.fa-building-wheat{--fa:\"\\e4db\"}.fa-person-breastfeeding{--fa:\"\\e53a\"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:\"\\f2f6\"}.fa-venus{--fa:\"\\f221\"}.fa-passport{--fa:\"\\f5ab\"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:\"\\e68f\"}.fa-heart-pulse,.fa-heartbeat{--fa:\"\\f21e\"}.fa-people-carry,.fa-people-carry-box{--fa:\"\\f4ce\"}.fa-temperature-high{--fa:\"\\f769\"}.fa-microchip{--fa:\"\\f2db\"}.fa-crown{--fa:\"\\f521\"}.fa-weight-hanging{--fa:\"\\f5cd\"}.fa-xmarks-lines{--fa:\"\\e59a\"}.fa-file-prescription{--fa:\"\\f572\"}.fa-weight,.fa-weight-scale{--fa:\"\\f496\"}.fa-user-friends,.fa-user-group{--fa:\"\\f500\"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:\"\\f15e\"}.fa-chess-knight{--fa:\"\\f441\"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:\"\\f59b\"}.fa-wheelchair{--fa:\"\\f193\"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:\"\\f0aa\"}.fa-toggle-on{--fa:\"\\f205\"}.fa-person-walking,.fa-walking{--fa:\"\\f554\"}.fa-l{--fa:\"\\4c\"}.fa-fire{--fa:\"\\f06d\"}.fa-bed-pulse,.fa-procedures{--fa:\"\\f487\"}.fa-shuttle-space,.fa-space-shuttle{--fa:\"\\f197\"}.fa-face-laugh,.fa-laugh{--fa:\"\\f599\"}.fa-folder-open{--fa:\"\\f07c\"}.fa-heart-circle-plus{--fa:\"\\e500\"}.fa-code-fork{--fa:\"\\e13b\"}.fa-city{--fa:\"\\f64f\"}.fa-microphone-alt,.fa-microphone-lines{--fa:\"\\f3c9\"}.fa-pepper-hot{--fa:\"\\f816\"}.fa-unlock{--fa:\"\\f09c\"}.fa-colon-sign{--fa:\"\\e140\"}.fa-headset{--fa:\"\\f590\"}.fa-store-slash{--fa:\"\\e071\"}.fa-road-circle-xmark{--fa:\"\\e566\"}.fa-user-minus{--fa:\"\\f503\"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:\"\\f22a\"}.fa-champagne-glasses,.fa-glass-cheers{--fa:\"\\f79f\"}.fa-clipboard{--fa:\"\\f328\"}.fa-house-circle-exclamation{--fa:\"\\e50a\"}.fa-file-arrow-up,.fa-file-upload{--fa:\"\\f574\"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:\"\\f1eb\"}.fa-bath,.fa-bathtub{--fa:\"\\f2cd\"}.fa-underline{--fa:\"\\f0cd\"}.fa-user-edit,.fa-user-pen{--fa:\"\\f4ff\"}.fa-signature{--fa:\"\\f5b7\"}.fa-stroopwafel{--fa:\"\\f551\"}.fa-bold{--fa:\"\\f032\"}.fa-anchor-lock{--fa:\"\\e4ad\"}.fa-building-ngo{--fa:\"\\e4d7\"}.fa-manat-sign{--fa:\"\\e1d5\"}.fa-not-equal{--fa:\"\\f53e\"}.fa-border-style,.fa-border-top-left{--fa:\"\\f853\"}.fa-map-location-dot,.fa-map-marked-alt{--fa:\"\\f5a0\"}.fa-jedi{--fa:\"\\f669\"}.fa-poll,.fa-square-poll-vertical{--fa:\"\\f681\"}.fa-mug-hot{--fa:\"\\f7b6\"}.fa-battery-car,.fa-car-battery{--fa:\"\\f5df\"}.fa-gift{--fa:\"\\f06b\"}.fa-dice-two{--fa:\"\\f528\"}.fa-chess-queen{--fa:\"\\f445\"}.fa-glasses{--fa:\"\\f530\"}.fa-chess-board{--fa:\"\\f43c\"}.fa-building-circle-check{--fa:\"\\e4d2\"}.fa-person-chalkboard{--fa:\"\\e53d\"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:\"\\f22b\"}.fa-hand-back-fist,.fa-hand-rock{--fa:\"\\f255\"}.fa-caret-square-up,.fa-square-caret-up{--fa:\"\\f151\"}.fa-cloud-showers-water{--fa:\"\\e4e4\"}.fa-bar-chart,.fa-chart-bar{--fa:\"\\f080\"}.fa-hands-bubbles,.fa-hands-wash{--fa:\"\\e05e\"}.fa-less-than-equal{--fa:\"\\f537\"}.fa-train{--fa:\"\\f238\"}.fa-eye-low-vision,.fa-low-vision{--fa:\"\\f2a8\"}.fa-crow{--fa:\"\\f520\"}.fa-sailboat{--fa:\"\\e445\"}.fa-window-restore{--fa:\"\\f2d2\"}.fa-plus-square,.fa-square-plus{--fa:\"\\f0fe\"}.fa-torii-gate{--fa:\"\\f6a1\"}.fa-frog{--fa:\"\\f52e\"}.fa-bucket{--fa:\"\\e4cf\"}.fa-image{--fa:\"\\f03e\"}.fa-microphone{--fa:\"\\f130\"}.fa-cow{--fa:\"\\f6c8\"}.fa-caret-up{--fa:\"\\f0d8\"}.fa-screwdriver{--fa:\"\\f54a\"}.fa-folder-closed{--fa:\"\\e185\"}.fa-house-tsunami{--fa:\"\\e515\"}.fa-square-nfi{--fa:\"\\e576\"}.fa-arrow-up-from-ground-water{--fa:\"\\e4b5\"}.fa-glass-martini-alt,.fa-martini-glass{--fa:\"\\f57b\"}.fa-square-binary{--fa:\"\\e69b\"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:\"\\f2ea\"}.fa-columns,.fa-table-columns{--fa:\"\\f0db\"}.fa-lemon{--fa:\"\\f094\"}.fa-head-side-mask{--fa:\"\\e063\"}.fa-handshake{--fa:\"\\f2b5\"}.fa-gem{--fa:\"\\f3a5\"}.fa-dolly,.fa-dolly-box{--fa:\"\\f472\"}.fa-smoking{--fa:\"\\f48d\"}.fa-compress-arrows-alt,.fa-minimize{--fa:\"\\f78c\"}.fa-monument{--fa:\"\\f5a6\"}.fa-snowplow{--fa:\"\\f7d2\"}.fa-angle-double-right,.fa-angles-right{--fa:\"\\f101\"}.fa-cannabis{--fa:\"\\f55f\"}.fa-circle-play,.fa-play-circle{--fa:\"\\f144\"}.fa-tablets{--fa:\"\\f490\"}.fa-ethernet{--fa:\"\\f796\"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:\"\\f153\"}.fa-chair{--fa:\"\\f6c0\"}.fa-check-circle,.fa-circle-check{--fa:\"\\f058\"}.fa-circle-stop,.fa-stop-circle{--fa:\"\\f28d\"}.fa-compass-drafting,.fa-drafting-compass{--fa:\"\\f568\"}.fa-plate-wheat{--fa:\"\\e55a\"}.fa-icicles{--fa:\"\\f7ad\"}.fa-person-shelter{--fa:\"\\e54f\"}.fa-neuter{--fa:\"\\f22c\"}.fa-id-badge{--fa:\"\\f2c1\"}.fa-marker{--fa:\"\\f5a1\"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:\"\\f59a\"}.fa-helicopter-symbol{--fa:\"\\e502\"}.fa-universal-access{--fa:\"\\f29a\"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:\"\\f139\"}.fa-lari-sign{--fa:\"\\e1c8\"}.fa-volcano{--fa:\"\\f770\"}.fa-person-walking-dashed-line-arrow-right{--fa:\"\\e553\"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:\"\\f154\"}.fa-viruses{--fa:\"\\e076\"}.fa-square-person-confined{--fa:\"\\e577\"}.fa-user-tie{--fa:\"\\f508\"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:\"\\f175\"}.fa-tent-arrow-down-to-line{--fa:\"\\e57e\"}.fa-certificate{--fa:\"\\f0a3\"}.fa-mail-reply-all,.fa-reply-all{--fa:\"\\f122\"}.fa-suitcase{--fa:\"\\f0f2\"}.fa-person-skating,.fa-skating{--fa:\"\\f7c5\"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:\"\\f662\"}.fa-camera-retro{--fa:\"\\f083\"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:\"\\f0ab\"}.fa-arrow-right-to-file,.fa-file-import{--fa:\"\\f56f\"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:\"\\f14c\"}.fa-box-open{--fa:\"\\f49e\"}.fa-scroll{--fa:\"\\f70e\"}.fa-spa{--fa:\"\\f5bb\"}.fa-location-pin-lock{--fa:\"\\e51f\"}.fa-pause{--fa:\"\\f04c\"}.fa-hill-avalanche{--fa:\"\\e507\"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:\"\\f2cb\"}.fa-bomb{--fa:\"\\f1e2\"}.fa-registered{--fa:\"\\f25d\"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:\"\\f2bb\"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:\"\\f516\"}.fa-subscript{--fa:\"\\f12c\"}.fa-diamond-turn-right,.fa-directions{--fa:\"\\f5eb\"}.fa-burst{--fa:\"\\e4dc\"}.fa-house-laptop,.fa-laptop-house{--fa:\"\\e066\"}.fa-face-tired,.fa-tired{--fa:\"\\f5c8\"}.fa-money-bills{--fa:\"\\e1f3\"}.fa-smog{--fa:\"\\f75f\"}.fa-crutch{--fa:\"\\f7f7\"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:\"\\f0ee\"}.fa-palette{--fa:\"\\f53f\"}.fa-arrows-turn-right{--fa:\"\\e4c0\"}.fa-vest{--fa:\"\\e085\"}.fa-ferry{--fa:\"\\e4ea\"}.fa-arrows-down-to-people{--fa:\"\\e4b9\"}.fa-seedling,.fa-sprout{--fa:\"\\f4d8\"}.fa-arrows-alt-h,.fa-left-right{--fa:\"\\f337\"}.fa-boxes-packing{--fa:\"\\e4c7\"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:\"\\f0a8\"}.fa-group-arrows-rotate{--fa:\"\\e4f6\"}.fa-bowl-food{--fa:\"\\e4c6\"}.fa-candy-cane{--fa:\"\\f786\"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:\"\\f160\"}.fa-cloud-bolt,.fa-thunderstorm{--fa:\"\\f76c\"}.fa-remove-format,.fa-text-slash{--fa:\"\\f87d\"}.fa-face-smile-wink,.fa-smile-wink{--fa:\"\\f4da\"}.fa-file-word{--fa:\"\\f1c2\"}.fa-file-powerpoint{--fa:\"\\f1c4\"}.fa-arrows-h,.fa-arrows-left-right{--fa:\"\\f07e\"}.fa-house-lock{--fa:\"\\e510\"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:\"\\f0ed\"}.fa-children{--fa:\"\\e4e1\"}.fa-blackboard,.fa-chalkboard{--fa:\"\\f51b\"}.fa-user-alt-slash,.fa-user-large-slash{--fa:\"\\f4fa\"}.fa-envelope-open{--fa:\"\\f2b6\"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:\"\\e05f\"}.fa-mattress-pillow{--fa:\"\\e525\"}.fa-guarani-sign{--fa:\"\\e19a\"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:\"\\f021\"}.fa-fire-extinguisher{--fa:\"\\f134\"}.fa-cruzeiro-sign{--fa:\"\\e152\"}.fa-greater-than-equal{--fa:\"\\f532\"}.fa-shield-alt,.fa-shield-halved{--fa:\"\\f3ed\"}.fa-atlas,.fa-book-atlas{--fa:\"\\f558\"}.fa-virus{--fa:\"\\e074\"}.fa-envelope-circle-check{--fa:\"\\e4e8\"}.fa-layer-group{--fa:\"\\f5fd\"}.fa-arrows-to-dot{--fa:\"\\e4be\"}.fa-archway{--fa:\"\\f557\"}.fa-heart-circle-check{--fa:\"\\e4fd\"}.fa-house-chimney-crack,.fa-house-damage{--fa:\"\\f6f1\"}.fa-file-archive,.fa-file-zipper{--fa:\"\\f1c6\"}.fa-square{--fa:\"\\f0c8\"}.fa-glass-martini,.fa-martini-glass-empty{--fa:\"\\f000\"}.fa-couch{--fa:\"\\f4b8\"}.fa-cedi-sign{--fa:\"\\e0df\"}.fa-italic{--fa:\"\\f033\"}.fa-table-cells-column-lock{--fa:\"\\e678\"}.fa-church{--fa:\"\\f51d\"}.fa-comments-dollar{--fa:\"\\f653\"}.fa-democrat{--fa:\"\\f747\"}.fa-z{--fa:\"\\5a\"}.fa-person-skiing,.fa-skiing{--fa:\"\\f7c9\"}.fa-road-lock{--fa:\"\\e567\"}.fa-a{--fa:\"\\41\"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:\"\\e03f\"}.fa-feather-alt,.fa-feather-pointed{--fa:\"\\f56b\"}.fa-p{--fa:\"\\50\"}.fa-snowflake{--fa:\"\\f2dc\"}.fa-newspaper{--fa:\"\\f1ea\"}.fa-ad,.fa-rectangle-ad{--fa:\"\\f641\"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:\"\\f0a9\"}.fa-filter-circle-xmark{--fa:\"\\e17b\"}.fa-locust{--fa:\"\\e520\"}.fa-sort,.fa-unsorted{--fa:\"\\f0dc\"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:\"\\f0cb\"}.fa-person-dress-burst{--fa:\"\\e544\"}.fa-money-check-alt,.fa-money-check-dollar{--fa:\"\\f53d\"}.fa-vector-square{--fa:\"\\f5cb\"}.fa-bread-slice{--fa:\"\\f7ec\"}.fa-language{--fa:\"\\f1ab\"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:\"\\f598\"}.fa-filter{--fa:\"\\f0b0\"}.fa-question{--fa:\"\\3f\"}.fa-file-signature{--fa:\"\\f573\"}.fa-arrows-alt,.fa-up-down-left-right{--fa:\"\\f0b2\"}.fa-house-chimney-user{--fa:\"\\e065\"}.fa-hand-holding-heart{--fa:\"\\f4be\"}.fa-puzzle-piece{--fa:\"\\f12e\"}.fa-money-check{--fa:\"\\f53c\"}.fa-star-half-alt,.fa-star-half-stroke{--fa:\"\\f5c0\"}.fa-code{--fa:\"\\f121\"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:\"\\f7a0\"}.fa-building-circle-exclamation{--fa:\"\\e4d3\"}.fa-magnifying-glass-chart{--fa:\"\\e522\"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:\"\\f08e\"}.fa-cubes-stacked{--fa:\"\\e4e6\"}.fa-krw,.fa-won,.fa-won-sign{--fa:\"\\f159\"}.fa-virus-covid{--fa:\"\\e4a8\"}.fa-austral-sign{--fa:\"\\e0a9\"}.fa-f{--fa:\"\\46\"}.fa-leaf{--fa:\"\\f06c\"}.fa-road{--fa:\"\\f018\"}.fa-cab,.fa-taxi{--fa:\"\\f1ba\"}.fa-person-circle-plus{--fa:\"\\e541\"}.fa-chart-pie,.fa-pie-chart{--fa:\"\\f200\"}.fa-bolt-lightning{--fa:\"\\e0b7\"}.fa-sack-xmark{--fa:\"\\e56a\"}.fa-file-excel{--fa:\"\\f1c3\"}.fa-file-contract{--fa:\"\\f56c\"}.fa-fish-fins{--fa:\"\\e4f2\"}.fa-building-flag{--fa:\"\\e4d5\"}.fa-face-grin-beam,.fa-grin-beam{--fa:\"\\f582\"}.fa-object-ungroup{--fa:\"\\f248\"}.fa-poop{--fa:\"\\f619\"}.fa-location-pin,.fa-map-marker{--fa:\"\\f041\"}.fa-kaaba{--fa:\"\\f66b\"}.fa-toilet-paper{--fa:\"\\f71e\"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:\"\\f807\"}.fa-eject{--fa:\"\\f052\"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:\"\\f35a\"}.fa-plane-circle-check{--fa:\"\\e555\"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:\"\\f5a5\"}.fa-object-group{--fa:\"\\f247\"}.fa-chart-line,.fa-line-chart{--fa:\"\\f201\"}.fa-mask-ventilator{--fa:\"\\e524\"}.fa-arrow-right{--fa:\"\\f061\"}.fa-map-signs,.fa-signs-post{--fa:\"\\f277\"}.fa-cash-register{--fa:\"\\f788\"}.fa-person-circle-question{--fa:\"\\e542\"}.fa-h{--fa:\"\\48\"}.fa-tarp{--fa:\"\\e57b\"}.fa-screwdriver-wrench,.fa-tools{--fa:\"\\f7d9\"}.fa-arrows-to-eye{--fa:\"\\e4bf\"}.fa-plug-circle-bolt{--fa:\"\\e55b\"}.fa-heart{--fa:\"\\f004\"}.fa-mars-and-venus{--fa:\"\\f224\"}.fa-home-user,.fa-house-user{--fa:\"\\e1b0\"}.fa-dumpster-fire{--fa:\"\\f794\"}.fa-house-crack{--fa:\"\\e3b1\"}.fa-cocktail,.fa-martini-glass-citrus{--fa:\"\\f561\"}.fa-face-surprise,.fa-surprise{--fa:\"\\f5c2\"}.fa-bottle-water{--fa:\"\\e4c5\"}.fa-circle-pause,.fa-pause-circle{--fa:\"\\f28b\"}.fa-toilet-paper-slash{--fa:\"\\e072\"}.fa-apple-alt,.fa-apple-whole{--fa:\"\\f5d1\"}.fa-kitchen-set{--fa:\"\\e51a\"}.fa-r{--fa:\"\\52\"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:\"\\f2ca\"}.fa-cube{--fa:\"\\f1b2\"}.fa-bitcoin-sign{--fa:\"\\e0b4\"}.fa-shield-dog{--fa:\"\\e573\"}.fa-solar-panel{--fa:\"\\f5ba\"}.fa-lock-open{--fa:\"\\f3c1\"}.fa-elevator{--fa:\"\\e16d\"}.fa-money-bill-transfer{--fa:\"\\e528\"}.fa-money-bill-trend-up{--fa:\"\\e529\"}.fa-house-flood-water-circle-arrow-right{--fa:\"\\e50f\"}.fa-poll-h,.fa-square-poll-horizontal{--fa:\"\\f682\"}.fa-circle{--fa:\"\\f111\"}.fa-backward-fast,.fa-fast-backward{--fa:\"\\f049\"}.fa-recycle{--fa:\"\\f1b8\"}.fa-user-astronaut{--fa:\"\\f4fb\"}.fa-plane-slash{--fa:\"\\e069\"}.fa-trademark{--fa:\"\\f25c\"}.fa-basketball,.fa-basketball-ball{--fa:\"\\f434\"}.fa-satellite-dish{--fa:\"\\f7c0\"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:\"\\f35b\"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:\"\\f3cd\"}.fa-volume-high,.fa-volume-up{--fa:\"\\f028\"}.fa-users-rays{--fa:\"\\e593\"}.fa-wallet{--fa:\"\\f555\"}.fa-clipboard-check{--fa:\"\\f46c\"}.fa-file-audio{--fa:\"\\f1c7\"}.fa-burger,.fa-hamburger{--fa:\"\\f805\"}.fa-wrench{--fa:\"\\f0ad\"}.fa-bugs{--fa:\"\\e4d0\"}.fa-rupee,.fa-rupee-sign{--fa:\"\\f156\"}.fa-file-image{--fa:\"\\f1c5\"}.fa-circle-question,.fa-question-circle{--fa:\"\\f059\"}.fa-plane-departure{--fa:\"\\f5b0\"}.fa-handshake-slash{--fa:\"\\e060\"}.fa-book-bookmark{--fa:\"\\e0bb\"}.fa-code-branch{--fa:\"\\f126\"}.fa-hat-cowboy{--fa:\"\\f8c0\"}.fa-bridge{--fa:\"\\e4c8\"}.fa-phone-alt,.fa-phone-flip{--fa:\"\\f879\"}.fa-truck-front{--fa:\"\\e2b7\"}.fa-cat{--fa:\"\\f6be\"}.fa-anchor-circle-exclamation{--fa:\"\\e4ab\"}.fa-truck-field{--fa:\"\\e58d\"}.fa-route{--fa:\"\\f4d7\"}.fa-clipboard-question{--fa:\"\\e4e3\"}.fa-panorama{--fa:\"\\e209\"}.fa-comment-medical{--fa:\"\\f7f5\"}.fa-teeth-open{--fa:\"\\f62f\"}.fa-file-circle-minus{--fa:\"\\e4ed\"}.fa-tags{--fa:\"\\f02c\"}.fa-wine-glass{--fa:\"\\f4e3\"}.fa-fast-forward,.fa-forward-fast{--fa:\"\\f050\"}.fa-face-meh-blank,.fa-meh-blank{--fa:\"\\f5a4\"}.fa-parking,.fa-square-parking{--fa:\"\\f540\"}.fa-house-signal{--fa:\"\\e012\"}.fa-bars-progress,.fa-tasks-alt{--fa:\"\\f828\"}.fa-faucet-drip{--fa:\"\\e006\"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:\"\\f474\"}.fa-ban-smoking,.fa-smoking-ban{--fa:\"\\f54d\"}.fa-terminal{--fa:\"\\f120\"}.fa-mobile-button{--fa:\"\\f10b\"}.fa-house-medical-flag{--fa:\"\\e514\"}.fa-basket-shopping,.fa-shopping-basket{--fa:\"\\f291\"}.fa-tape{--fa:\"\\f4db\"}.fa-bus-alt,.fa-bus-simple{--fa:\"\\f55e\"}.fa-eye{--fa:\"\\f06e\"}.fa-face-sad-cry,.fa-sad-cry{--fa:\"\\f5b3\"}.fa-audio-description{--fa:\"\\f29e\"}.fa-person-military-to-person{--fa:\"\\e54c\"}.fa-file-shield{--fa:\"\\e4f0\"}.fa-user-slash{--fa:\"\\f506\"}.fa-pen{--fa:\"\\f304\"}.fa-tower-observation{--fa:\"\\e586\"}.fa-file-code{--fa:\"\\f1c9\"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:\"\\f012\"}.fa-bus{--fa:\"\\f207\"}.fa-heart-circle-xmark{--fa:\"\\e501\"}.fa-home-lg,.fa-house-chimney{--fa:\"\\e3af\"}.fa-window-maximize{--fa:\"\\f2d0\"}.fa-face-frown,.fa-frown{--fa:\"\\f119\"}.fa-prescription{--fa:\"\\f5b1\"}.fa-shop,.fa-store-alt{--fa:\"\\f54f\"}.fa-floppy-disk,.fa-save{--fa:\"\\f0c7\"}.fa-vihara{--fa:\"\\f6a7\"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:\"\\f515\"}.fa-sort-asc,.fa-sort-up{--fa:\"\\f0de\"}.fa-comment-dots,.fa-commenting{--fa:\"\\f4ad\"}.fa-plant-wilt{--fa:\"\\e5aa\"}.fa-diamond{--fa:\"\\f219\"}.fa-face-grin-squint,.fa-grin-squint{--fa:\"\\f585\"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:\"\\f4c0\"}.fa-chart-diagram{--fa:\"\\e695\"}.fa-bacterium{--fa:\"\\e05a\"}.fa-hand-pointer{--fa:\"\\f25a\"}.fa-drum-steelpan{--fa:\"\\f56a\"}.fa-hand-scissors{--fa:\"\\f257\"}.fa-hands-praying,.fa-praying-hands{--fa:\"\\f684\"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:\"\\f01e\"}.fa-biohazard{--fa:\"\\f780\"}.fa-location,.fa-location-crosshairs{--fa:\"\\f601\"}.fa-mars-double{--fa:\"\\f227\"}.fa-child-dress{--fa:\"\\e59c\"}.fa-users-between-lines{--fa:\"\\e591\"}.fa-lungs-virus{--fa:\"\\e067\"}.fa-face-grin-tears,.fa-grin-tears{--fa:\"\\f588\"}.fa-phone{--fa:\"\\f095\"}.fa-calendar-times,.fa-calendar-xmark{--fa:\"\\f273\"}.fa-child-reaching{--fa:\"\\e59d\"}.fa-head-side-virus{--fa:\"\\e064\"}.fa-user-cog,.fa-user-gear{--fa:\"\\f4fe\"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:\"\\f163\"}.fa-door-closed{--fa:\"\\f52a\"}.fa-shield-virus{--fa:\"\\e06c\"}.fa-dice-six{--fa:\"\\f526\"}.fa-mosquito-net{--fa:\"\\e52c\"}.fa-file-fragment{--fa:\"\\e697\"}.fa-bridge-water{--fa:\"\\e4ce\"}.fa-person-booth{--fa:\"\\f756\"}.fa-text-width{--fa:\"\\f035\"}.fa-hat-wizard{--fa:\"\\f6e8\"}.fa-pen-fancy{--fa:\"\\f5ac\"}.fa-digging,.fa-person-digging{--fa:\"\\f85e\"}.fa-trash{--fa:\"\\f1f8\"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:\"\\f629\"}.fa-book-medical{--fa:\"\\f7e6\"}.fa-poo{--fa:\"\\f2fe\"}.fa-quote-right,.fa-quote-right-alt{--fa:\"\\f10e\"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:\"\\f553\"}.fa-cubes{--fa:\"\\f1b3\"}.fa-divide{--fa:\"\\f529\"}.fa-tenge,.fa-tenge-sign{--fa:\"\\f7d7\"}.fa-headphones{--fa:\"\\f025\"}.fa-hands-holding{--fa:\"\\f4c2\"}.fa-hands-clapping{--fa:\"\\e1a8\"}.fa-republican{--fa:\"\\f75e\"}.fa-arrow-left{--fa:\"\\f060\"}.fa-person-circle-xmark{--fa:\"\\e543\"}.fa-ruler{--fa:\"\\f545\"}.fa-align-left{--fa:\"\\f036\"}.fa-dice-d6{--fa:\"\\f6d1\"}.fa-restroom{--fa:\"\\f7bd\"}.fa-j{--fa:\"\\4a\"}.fa-users-viewfinder{--fa:\"\\e595\"}.fa-file-video{--fa:\"\\f1c8\"}.fa-external-link-alt,.fa-up-right-from-square{--fa:\"\\f35d\"}.fa-table-cells,.fa-th{--fa:\"\\f00a\"}.fa-file-pdf{--fa:\"\\f1c1\"}.fa-bible,.fa-book-bible{--fa:\"\\f647\"}.fa-o{--fa:\"\\4f\"}.fa-medkit,.fa-suitcase-medical{--fa:\"\\f0fa\"}.fa-user-secret{--fa:\"\\f21b\"}.fa-otter{--fa:\"\\f700\"}.fa-female,.fa-person-dress{--fa:\"\\f182\"}.fa-comment-dollar{--fa:\"\\f651\"}.fa-briefcase-clock,.fa-business-time{--fa:\"\\f64a\"}.fa-table-cells-large,.fa-th-large{--fa:\"\\f009\"}.fa-book-tanakh,.fa-tanakh{--fa:\"\\f827\"}.fa-phone-volume,.fa-volume-control-phone{--fa:\"\\f2a0\"}.fa-hat-cowboy-side{--fa:\"\\f8c1\"}.fa-clipboard-user{--fa:\"\\f7f3\"}.fa-child{--fa:\"\\f1ae\"}.fa-lira-sign{--fa:\"\\f195\"}.fa-satellite{--fa:\"\\f7bf\"}.fa-plane-lock{--fa:\"\\e558\"}.fa-tag{--fa:\"\\f02b\"}.fa-comment{--fa:\"\\f075\"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:\"\\f1fd\"}.fa-envelope{--fa:\"\\f0e0\"}.fa-angle-double-up,.fa-angles-up{--fa:\"\\f102\"}.fa-paperclip{--fa:\"\\f0c6\"}.fa-arrow-right-to-city{--fa:\"\\e4b3\"}.fa-ribbon{--fa:\"\\f4d6\"}.fa-lungs{--fa:\"\\f604\"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:\"\\f887\"}.fa-litecoin-sign{--fa:\"\\e1d3\"}.fa-border-none{--fa:\"\\f850\"}.fa-circle-nodes{--fa:\"\\e4e2\"}.fa-parachute-box{--fa:\"\\f4cd\"}.fa-indent{--fa:\"\\f03c\"}.fa-truck-field-un{--fa:\"\\e58e\"}.fa-hourglass,.fa-hourglass-empty{--fa:\"\\f254\"}.fa-mountain{--fa:\"\\f6fc\"}.fa-user-doctor,.fa-user-md{--fa:\"\\f0f0\"}.fa-circle-info,.fa-info-circle{--fa:\"\\f05a\"}.fa-cloud-meatball{--fa:\"\\f73b\"}.fa-camera,.fa-camera-alt{--fa:\"\\f030\"}.fa-square-virus{--fa:\"\\e578\"}.fa-meteor{--fa:\"\\f753\"}.fa-car-on{--fa:\"\\e4dd\"}.fa-sleigh{--fa:\"\\f7cc\"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:\"\\f162\"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:\"\\f4c1\"}.fa-water{--fa:\"\\f773\"}.fa-calendar-check{--fa:\"\\f274\"}.fa-braille{--fa:\"\\f2a1\"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:\"\\f486\"}.fa-landmark{--fa:\"\\f66f\"}.fa-truck{--fa:\"\\f0d1\"}.fa-crosshairs{--fa:\"\\f05b\"}.fa-person-cane{--fa:\"\\e53c\"}.fa-tent{--fa:\"\\e57d\"}.fa-vest-patches{--fa:\"\\e086\"}.fa-check-double{--fa:\"\\f560\"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:\"\\f15d\"}.fa-money-bill-wheat{--fa:\"\\e52a\"}.fa-cookie{--fa:\"\\f563\"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:\"\\f0e2\"}.fa-hard-drive,.fa-hdd{--fa:\"\\f0a0\"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:\"\\f586\"}.fa-dumbbell{--fa:\"\\f44b\"}.fa-list-alt,.fa-rectangle-list{--fa:\"\\f022\"}.fa-tarp-droplet{--fa:\"\\e57c\"}.fa-house-medical-circle-check{--fa:\"\\e511\"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:\"\\f7ca\"}.fa-calendar-plus{--fa:\"\\f271\"}.fa-plane-arrival{--fa:\"\\f5af\"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:\"\\f359\"}.fa-subway,.fa-train-subway{--fa:\"\\f239\"}.fa-chart-gantt{--fa:\"\\e0e4\"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:\"\\e1bc\"}.fa-crop-alt,.fa-crop-simple{--fa:\"\\f565\"}.fa-money-bill-1,.fa-money-bill-alt{--fa:\"\\f3d1\"}.fa-left-long,.fa-long-arrow-alt-left{--fa:\"\\f30a\"}.fa-dna{--fa:\"\\f471\"}.fa-virus-slash{--fa:\"\\e075\"}.fa-minus,.fa-subtract{--fa:\"\\f068\"}.fa-chess{--fa:\"\\f439\"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:\"\\f177\"}.fa-plug-circle-check{--fa:\"\\e55c\"}.fa-street-view{--fa:\"\\f21d\"}.fa-franc-sign{--fa:\"\\e18f\"}.fa-volume-off{--fa:\"\\f026\"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:\"\\f2a3\"}.fa-cog,.fa-gear{--fa:\"\\f013\"}.fa-droplet-slash,.fa-tint-slash{--fa:\"\\f5c7\"}.fa-mosque{--fa:\"\\f678\"}.fa-mosquito{--fa:\"\\e52b\"}.fa-star-of-david{--fa:\"\\f69a\"}.fa-person-military-rifle{--fa:\"\\e54b\"}.fa-cart-shopping,.fa-shopping-cart{--fa:\"\\f07a\"}.fa-vials{--fa:\"\\f493\"}.fa-plug-circle-plus{--fa:\"\\e55f\"}.fa-place-of-worship{--fa:\"\\f67f\"}.fa-grip-vertical{--fa:\"\\f58e\"}.fa-hexagon-nodes{--fa:\"\\e699\"}.fa-arrow-turn-up,.fa-level-up{--fa:\"\\f148\"}.fa-u{--fa:\"\\55\"}.fa-square-root-alt,.fa-square-root-variable{--fa:\"\\f698\"}.fa-clock,.fa-clock-four{--fa:\"\\f017\"}.fa-backward-step,.fa-step-backward{--fa:\"\\f048\"}.fa-pallet{--fa:\"\\f482\"}.fa-faucet{--fa:\"\\e005\"}.fa-baseball-bat-ball{--fa:\"\\f432\"}.fa-s{--fa:\"\\53\"}.fa-timeline{--fa:\"\\e29c\"}.fa-keyboard{--fa:\"\\f11c\"}.fa-caret-down{--fa:\"\\f0d7\"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:\"\\f7f2\"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:\"\\f2c8\"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:\"\\f3cf\"}.fa-plane-up{--fa:\"\\e22d\"}.fa-piggy-bank{--fa:\"\\f4d3\"}.fa-battery-3,.fa-battery-half{--fa:\"\\f242\"}.fa-mountain-city{--fa:\"\\e52e\"}.fa-coins{--fa:\"\\f51e\"}.fa-khanda{--fa:\"\\f66d\"}.fa-sliders,.fa-sliders-h{--fa:\"\\f1de\"}.fa-folder-tree{--fa:\"\\f802\"}.fa-network-wired{--fa:\"\\f6ff\"}.fa-map-pin{--fa:\"\\f276\"}.fa-hamsa{--fa:\"\\f665\"}.fa-cent-sign{--fa:\"\\e3f5\"}.fa-flask{--fa:\"\\f0c3\"}.fa-person-pregnant{--fa:\"\\e31e\"}.fa-wand-sparkles{--fa:\"\\f72b\"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:\"\\f142\"}.fa-ticket{--fa:\"\\f145\"}.fa-power-off{--fa:\"\\f011\"}.fa-long-arrow-alt-right,.fa-right-long{--fa:\"\\f30b\"}.fa-flag-usa{--fa:\"\\f74d\"}.fa-laptop-file{--fa:\"\\e51d\"}.fa-teletype,.fa-tty{--fa:\"\\f1e4\"}.fa-diagram-next{--fa:\"\\e476\"}.fa-person-rifle{--fa:\"\\e54e\"}.fa-house-medical-circle-exclamation{--fa:\"\\e512\"}.fa-closed-captioning{--fa:\"\\f20a\"}.fa-hiking,.fa-person-hiking{--fa:\"\\f6ec\"}.fa-venus-double{--fa:\"\\f226\"}.fa-images{--fa:\"\\f302\"}.fa-calculator{--fa:\"\\f1ec\"}.fa-people-pulling{--fa:\"\\e535\"}.fa-n{--fa:\"\\4e\"}.fa-cable-car,.fa-tram{--fa:\"\\f7da\"}.fa-cloud-rain{--fa:\"\\f73d\"}.fa-building-circle-xmark{--fa:\"\\e4d4\"}.fa-ship{--fa:\"\\f21a\"}.fa-arrows-down-to-line{--fa:\"\\e4b8\"}.fa-download{--fa:\"\\f019\"}.fa-face-grin,.fa-grin{--fa:\"\\f580\"}.fa-backspace,.fa-delete-left{--fa:\"\\f55a\"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:\"\\f1fb\"}.fa-file-circle-check{--fa:\"\\e5a0\"}.fa-forward{--fa:\"\\f04e\"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:\"\\f3ce\"}.fa-face-meh,.fa-meh{--fa:\"\\f11a\"}.fa-align-center{--fa:\"\\f037\"}.fa-book-dead,.fa-book-skull{--fa:\"\\f6b7\"}.fa-drivers-license,.fa-id-card{--fa:\"\\f2c2\"}.fa-dedent,.fa-outdent{--fa:\"\\f03b\"}.fa-heart-circle-exclamation{--fa:\"\\e4fe\"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:\"\\f015\"}.fa-calendar-week{--fa:\"\\f784\"}.fa-laptop-medical{--fa:\"\\f812\"}.fa-b{--fa:\"\\42\"}.fa-file-medical{--fa:\"\\f477\"}.fa-dice-one{--fa:\"\\f525\"}.fa-kiwi-bird{--fa:\"\\f535\"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:\"\\f0ec\"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:\"\\f2f9\"}.fa-cutlery,.fa-utensils{--fa:\"\\f2e7\"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:\"\\f161\"}.fa-mill-sign{--fa:\"\\e1ed\"}.fa-bowl-rice{--fa:\"\\e2eb\"}.fa-skull{--fa:\"\\f54c\"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:\"\\f519\"}.fa-truck-pickup{--fa:\"\\f63c\"}.fa-long-arrow-alt-up,.fa-up-long{--fa:\"\\f30c\"}.fa-stop{--fa:\"\\f04d\"}.fa-code-merge{--fa:\"\\f387\"}.fa-upload{--fa:\"\\f093\"}.fa-hurricane{--fa:\"\\f751\"}.fa-mound{--fa:\"\\e52d\"}.fa-toilet-portable{--fa:\"\\e583\"}.fa-compact-disc{--fa:\"\\f51f\"}.fa-file-arrow-down,.fa-file-download{--fa:\"\\f56d\"}.fa-caravan{--fa:\"\\f8ff\"}.fa-shield-cat{--fa:\"\\e572\"}.fa-bolt,.fa-zap{--fa:\"\\f0e7\"}.fa-glass-water{--fa:\"\\e4f4\"}.fa-oil-well{--fa:\"\\e532\"}.fa-vault{--fa:\"\\e2c5\"}.fa-mars{--fa:\"\\f222\"}.fa-toilet{--fa:\"\\f7d8\"}.fa-plane-circle-xmark{--fa:\"\\e557\"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:\"\\f157\"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:\"\\f158\"}.fa-sun{--fa:\"\\f185\"}.fa-guitar{--fa:\"\\f7a6\"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:\"\\f59c\"}.fa-horse-head{--fa:\"\\f7ab\"}.fa-bore-hole{--fa:\"\\e4c3\"}.fa-industry{--fa:\"\\f275\"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:\"\\f358\"}.fa-arrows-turn-to-dots{--fa:\"\\e4c1\"}.fa-florin-sign{--fa:\"\\e184\"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:\"\\f884\"}.fa-less-than{--fa:\"\\3c\"}.fa-angle-down{--fa:\"\\f107\"}.fa-car-tunnel{--fa:\"\\e4de\"}.fa-head-side-cough{--fa:\"\\e061\"}.fa-grip-lines{--fa:\"\\f7a4\"}.fa-thumbs-down{--fa:\"\\f165\"}.fa-user-lock{--fa:\"\\f502\"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:\"\\f178\"}.fa-anchor-circle-xmark{--fa:\"\\e4ac\"}.fa-ellipsis,.fa-ellipsis-h{--fa:\"\\f141\"}.fa-chess-pawn{--fa:\"\\f443\"}.fa-first-aid,.fa-kit-medical{--fa:\"\\f479\"}.fa-person-through-window{--fa:\"\\e5a9\"}.fa-toolbox{--fa:\"\\f552\"}.fa-hands-holding-circle{--fa:\"\\e4fb\"}.fa-bug{--fa:\"\\f188\"}.fa-credit-card,.fa-credit-card-alt{--fa:\"\\f09d\"}.fa-automobile,.fa-car{--fa:\"\\f1b9\"}.fa-hand-holding-hand{--fa:\"\\e4f7\"}.fa-book-open-reader,.fa-book-reader{--fa:\"\\f5da\"}.fa-mountain-sun{--fa:\"\\e52f\"}.fa-arrows-left-right-to-line{--fa:\"\\e4ba\"}.fa-dice-d20{--fa:\"\\f6cf\"}.fa-truck-droplet{--fa:\"\\e58c\"}.fa-file-circle-xmark{--fa:\"\\e5a1\"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:\"\\e040\"}.fa-medal{--fa:\"\\f5a2\"}.fa-bed{--fa:\"\\f236\"}.fa-h-square,.fa-square-h{--fa:\"\\f0fd\"}.fa-podcast{--fa:\"\\f2ce\"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:\"\\f2c7\"}.fa-bell{--fa:\"\\f0f3\"}.fa-superscript{--fa:\"\\f12b\"}.fa-plug-circle-xmark{--fa:\"\\e560\"}.fa-star-of-life{--fa:\"\\f621\"}.fa-phone-slash{--fa:\"\\f3dd\"}.fa-paint-roller{--fa:\"\\f5aa\"}.fa-hands-helping,.fa-handshake-angle{--fa:\"\\f4c4\"}.fa-location-dot,.fa-map-marker-alt{--fa:\"\\f3c5\"}.fa-file{--fa:\"\\f15b\"}.fa-greater-than{--fa:\"\\3e\"}.fa-person-swimming,.fa-swimmer{--fa:\"\\f5c4\"}.fa-arrow-down{--fa:\"\\f063\"}.fa-droplet,.fa-tint{--fa:\"\\f043\"}.fa-eraser{--fa:\"\\f12d\"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:\"\\f57d\"}.fa-person-burst{--fa:\"\\e53b\"}.fa-dove{--fa:\"\\f4ba\"}.fa-battery-0,.fa-battery-empty{--fa:\"\\f244\"}.fa-socks{--fa:\"\\f696\"}.fa-inbox{--fa:\"\\f01c\"}.fa-section{--fa:\"\\e447\"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:\"\\f625\"}.fa-envelope-open-text{--fa:\"\\f658\"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:\"\\f0f8\"}.fa-wine-bottle{--fa:\"\\f72f\"}.fa-chess-rook{--fa:\"\\f447\"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:\"\\f550\"}.fa-dharmachakra{--fa:\"\\f655\"}.fa-hotdog{--fa:\"\\f80f\"}.fa-blind,.fa-person-walking-with-cane{--fa:\"\\f29d\"}.fa-drum{--fa:\"\\f569\"}.fa-ice-cream{--fa:\"\\f810\"}.fa-heart-circle-bolt{--fa:\"\\e4fc\"}.fa-fax{--fa:\"\\f1ac\"}.fa-paragraph{--fa:\"\\f1dd\"}.fa-check-to-slot,.fa-vote-yea{--fa:\"\\f772\"}.fa-star-half{--fa:\"\\f089\"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:\"\\f468\"}.fa-chain,.fa-link{--fa:\"\\f0c1\"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:\"\\f2a2\"}.fa-tree-city{--fa:\"\\e587\"}.fa-play{--fa:\"\\f04b\"}.fa-font{--fa:\"\\f031\"}.fa-table-cells-row-lock{--fa:\"\\e67a\"}.fa-rupiah-sign{--fa:\"\\e23d\"}.fa-magnifying-glass,.fa-search{--fa:\"\\f002\"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:\"\\f45d\"}.fa-diagnoses,.fa-person-dots-from-line{--fa:\"\\f470\"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:\"\\f82a\"}.fa-naira-sign{--fa:\"\\e1f6\"}.fa-cart-arrow-down{--fa:\"\\f218\"}.fa-walkie-talkie{--fa:\"\\f8ef\"}.fa-file-edit,.fa-file-pen{--fa:\"\\f31c\"}.fa-receipt{--fa:\"\\f543\"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:\"\\f14b\"}.fa-suitcase-rolling{--fa:\"\\f5c1\"}.fa-person-circle-exclamation{--fa:\"\\e53f\"}.fa-chevron-down{--fa:\"\\f078\"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:\"\\f240\"}.fa-skull-crossbones{--fa:\"\\f714\"}.fa-code-compare{--fa:\"\\e13a\"}.fa-list-dots,.fa-list-ul{--fa:\"\\f0ca\"}.fa-school-lock{--fa:\"\\e56f\"}.fa-tower-cell{--fa:\"\\e585\"}.fa-down-long,.fa-long-arrow-alt-down{--fa:\"\\f309\"}.fa-ranking-star{--fa:\"\\e561\"}.fa-chess-king{--fa:\"\\f43f\"}.fa-person-harassing{--fa:\"\\e549\"}.fa-brazilian-real-sign{--fa:\"\\e46c\"}.fa-landmark-alt,.fa-landmark-dome{--fa:\"\\f752\"}.fa-arrow-up{--fa:\"\\f062\"}.fa-television,.fa-tv,.fa-tv-alt{--fa:\"\\f26c\"}.fa-shrimp{--fa:\"\\e448\"}.fa-list-check,.fa-tasks{--fa:\"\\f0ae\"}.fa-jug-detergent{--fa:\"\\e519\"}.fa-circle-user,.fa-user-circle{--fa:\"\\f2bd\"}.fa-user-shield{--fa:\"\\f505\"}.fa-wind{--fa:\"\\f72e\"}.fa-car-burst,.fa-car-crash{--fa:\"\\f5e1\"}.fa-y{--fa:\"\\59\"}.fa-person-snowboarding,.fa-snowboarding{--fa:\"\\f7ce\"}.fa-shipping-fast,.fa-truck-fast{--fa:\"\\f48b\"}.fa-fish{--fa:\"\\f578\"}.fa-user-graduate{--fa:\"\\f501\"}.fa-adjust,.fa-circle-half-stroke{--fa:\"\\f042\"}.fa-clapperboard{--fa:\"\\e131\"}.fa-circle-radiation,.fa-radiation-alt{--fa:\"\\f7ba\"}.fa-baseball,.fa-baseball-ball{--fa:\"\\f433\"}.fa-jet-fighter-up{--fa:\"\\e518\"}.fa-diagram-project,.fa-project-diagram{--fa:\"\\f542\"}.fa-copy{--fa:\"\\f0c5\"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:\"\\f6a9\"}.fa-hand-sparkles{--fa:\"\\e05d\"}.fa-grip,.fa-grip-horizontal{--fa:\"\\f58d\"}.fa-share-from-square,.fa-share-square{--fa:\"\\f14d\"}.fa-child-combatant,.fa-child-rifle{--fa:\"\\e4e0\"}.fa-gun{--fa:\"\\e19b\"}.fa-phone-square,.fa-square-phone{--fa:\"\\f098\"}.fa-add,.fa-plus{--fa:\"\\2b\"}.fa-expand{--fa:\"\\f065\"}.fa-computer{--fa:\"\\e4e5\"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:\"\\f00d\"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:\"\\f047\"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:\"\\f51c\"}.fa-peso-sign{--fa:\"\\e222\"}.fa-building-shield{--fa:\"\\e4d8\"}.fa-baby{--fa:\"\\f77c\"}.fa-users-line{--fa:\"\\e592\"}.fa-quote-left,.fa-quote-left-alt{--fa:\"\\f10d\"}.fa-tractor{--fa:\"\\f722\"}.fa-trash-arrow-up,.fa-trash-restore{--fa:\"\\f829\"}.fa-arrow-down-up-lock{--fa:\"\\e4b0\"}.fa-lines-leaning{--fa:\"\\e51e\"}.fa-ruler-combined{--fa:\"\\f546\"}.fa-copyright{--fa:\"\\f1f9\"}.fa-equals{--fa:\"\\3d\"}.fa-blender{--fa:\"\\f517\"}.fa-teeth{--fa:\"\\f62e\"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:\"\\f20b\"}.fa-map{--fa:\"\\f279\"}.fa-rocket{--fa:\"\\f135\"}.fa-photo-film,.fa-photo-video{--fa:\"\\f87c\"}.fa-folder-minus{--fa:\"\\f65d\"}.fa-hexagon-nodes-bolt{--fa:\"\\e69a\"}.fa-store{--fa:\"\\f54e\"}.fa-arrow-trend-up{--fa:\"\\e098\"}.fa-plug-circle-minus{--fa:\"\\e55e\"}.fa-sign,.fa-sign-hanging{--fa:\"\\f4d9\"}.fa-bezier-curve{--fa:\"\\f55b\"}.fa-bell-slash{--fa:\"\\f1f6\"}.fa-tablet,.fa-tablet-android{--fa:\"\\f3fb\"}.fa-school-flag{--fa:\"\\e56e\"}.fa-fill{--fa:\"\\f575\"}.fa-angle-up{--fa:\"\\f106\"}.fa-drumstick-bite{--fa:\"\\f6d7\"}.fa-holly-berry{--fa:\"\\f7aa\"}.fa-chevron-left{--fa:\"\\f053\"}.fa-bacteria{--fa:\"\\e059\"}.fa-hand-lizard{--fa:\"\\f258\"}.fa-notdef{--fa:\"\\e1fe\"}.fa-disease{--fa:\"\\f7fa\"}.fa-briefcase-medical{--fa:\"\\f469\"}.fa-genderless{--fa:\"\\f22d\"}.fa-chevron-right{--fa:\"\\f054\"}.fa-retweet{--fa:\"\\f079\"}.fa-car-alt,.fa-car-rear{--fa:\"\\f5de\"}.fa-pump-soap{--fa:\"\\e06b\"}.fa-video-slash{--fa:\"\\f4e2\"}.fa-battery-2,.fa-battery-quarter{--fa:\"\\f243\"}.fa-radio{--fa:\"\\f8d7\"}.fa-baby-carriage,.fa-carriage-baby{--fa:\"\\f77d\"}.fa-traffic-light{--fa:\"\\f637\"}.fa-thermometer{--fa:\"\\f491\"}.fa-vr-cardboard{--fa:\"\\f729\"}.fa-hand-middle-finger{--fa:\"\\f806\"}.fa-percent,.fa-percentage{--fa:\"\\25\"}.fa-truck-moving{--fa:\"\\f4df\"}.fa-glass-water-droplet{--fa:\"\\e4f5\"}.fa-display{--fa:\"\\e163\"}.fa-face-smile,.fa-smile{--fa:\"\\f118\"}.fa-thumb-tack,.fa-thumbtack{--fa:\"\\f08d\"}.fa-trophy{--fa:\"\\f091\"}.fa-person-praying,.fa-pray{--fa:\"\\f683\"}.fa-hammer{--fa:\"\\f6e3\"}.fa-hand-peace{--fa:\"\\f25b\"}.fa-rotate,.fa-sync-alt{--fa:\"\\f2f1\"}.fa-spinner{--fa:\"\\f110\"}.fa-robot{--fa:\"\\f544\"}.fa-peace{--fa:\"\\f67c\"}.fa-cogs,.fa-gears{--fa:\"\\f085\"}.fa-warehouse{--fa:\"\\f494\"}.fa-arrow-up-right-dots{--fa:\"\\e4b7\"}.fa-splotch{--fa:\"\\f5bc\"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:\"\\f584\"}.fa-dice-four{--fa:\"\\f524\"}.fa-sim-card{--fa:\"\\f7c4\"}.fa-transgender,.fa-transgender-alt{--fa:\"\\f225\"}.fa-mercury{--fa:\"\\f223\"}.fa-arrow-turn-down,.fa-level-down{--fa:\"\\f149\"}.fa-person-falling-burst{--fa:\"\\e547\"}.fa-award{--fa:\"\\f559\"}.fa-ticket-alt,.fa-ticket-simple{--fa:\"\\f3ff\"}.fa-building{--fa:\"\\f1ad\"}.fa-angle-double-left,.fa-angles-left{--fa:\"\\f100\"}.fa-qrcode{--fa:\"\\f029\"}.fa-clock-rotate-left,.fa-history{--fa:\"\\f1da\"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:\"\\f583\"}.fa-arrow-right-from-file,.fa-file-export{--fa:\"\\f56e\"}.fa-shield,.fa-shield-blank{--fa:\"\\f132\"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:\"\\f885\"}.fa-comment-nodes{--fa:\"\\e696\"}.fa-house-medical{--fa:\"\\e3b2\"}.fa-golf-ball,.fa-golf-ball-tee{--fa:\"\\f450\"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:\"\\f137\"}.fa-house-chimney-window{--fa:\"\\e00d\"}.fa-pen-nib{--fa:\"\\f5ad\"}.fa-tent-arrow-turn-left{--fa:\"\\e580\"}.fa-tents{--fa:\"\\e582\"}.fa-magic,.fa-wand-magic{--fa:\"\\f0d0\"}.fa-dog{--fa:\"\\f6d3\"}.fa-carrot{--fa:\"\\f787\"}.fa-moon{--fa:\"\\f186\"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:\"\\f5ce\"}.fa-cheese{--fa:\"\\f7ef\"}.fa-yin-yang{--fa:\"\\f6ad\"}.fa-music{--fa:\"\\f001\"}.fa-code-commit{--fa:\"\\f386\"}.fa-temperature-low{--fa:\"\\f76b\"}.fa-biking,.fa-person-biking{--fa:\"\\f84a\"}.fa-broom{--fa:\"\\f51a\"}.fa-shield-heart{--fa:\"\\e574\"}.fa-gopuram{--fa:\"\\f664\"}.fa-earth-oceania,.fa-globe-oceania{--fa:\"\\e47b\"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:\"\\f2d3\"}.fa-hashtag{--fa:\"\\23\"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:\"\\f424\"}.fa-oil-can{--fa:\"\\f613\"}.fa-t{--fa:\"\\54\"}.fa-hippo{--fa:\"\\f6ed\"}.fa-chart-column{--fa:\"\\e0e3\"}.fa-infinity{--fa:\"\\f534\"}.fa-vial-circle-check{--fa:\"\\e596\"}.fa-person-arrow-down-to-line{--fa:\"\\e538\"}.fa-voicemail{--fa:\"\\f897\"}.fa-fan{--fa:\"\\f863\"}.fa-person-walking-luggage{--fa:\"\\e554\"}.fa-arrows-alt-v,.fa-up-down{--fa:\"\\f338\"}.fa-cloud-moon-rain{--fa:\"\\f73c\"}.fa-calendar{--fa:\"\\f133\"}.fa-trailer{--fa:\"\\e041\"}.fa-bahai,.fa-haykal{--fa:\"\\f666\"}.fa-sd-card{--fa:\"\\f7c2\"}.fa-dragon{--fa:\"\\f6d5\"}.fa-shoe-prints{--fa:\"\\f54b\"}.fa-circle-plus,.fa-plus-circle{--fa:\"\\f055\"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:\"\\f58b\"}.fa-hand-holding{--fa:\"\\f4bd\"}.fa-plug-circle-exclamation{--fa:\"\\e55d\"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:\"\\f127\"}.fa-clone{--fa:\"\\f24d\"}.fa-person-walking-arrow-loop-left{--fa:\"\\e551\"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:\"\\f882\"}.fa-fire-alt,.fa-fire-flame-curved{--fa:\"\\f7e4\"}.fa-tornado{--fa:\"\\f76f\"}.fa-file-circle-plus{--fa:\"\\e494\"}.fa-book-quran,.fa-quran{--fa:\"\\f687\"}.fa-anchor{--fa:\"\\f13d\"}.fa-border-all{--fa:\"\\f84c\"}.fa-angry,.fa-face-angry{--fa:\"\\f556\"}.fa-cookie-bite{--fa:\"\\f564\"}.fa-arrow-trend-down{--fa:\"\\e097\"}.fa-feed,.fa-rss{--fa:\"\\f09e\"}.fa-draw-polygon{--fa:\"\\f5ee\"}.fa-balance-scale,.fa-scale-balanced{--fa:\"\\f24e\"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:\"\\f62a\"}.fa-shower{--fa:\"\\f2cc\"}.fa-desktop,.fa-desktop-alt{--fa:\"\\f390\"}.fa-m{--fa:\"\\4d\"}.fa-table-list,.fa-th-list{--fa:\"\\f00b\"}.fa-comment-sms,.fa-sms{--fa:\"\\f7cd\"}.fa-book{--fa:\"\\f02d\"}.fa-user-plus{--fa:\"\\f234\"}.fa-check{--fa:\"\\f00c\"}.fa-battery-4,.fa-battery-three-quarters{--fa:\"\\f241\"}.fa-house-circle-check{--fa:\"\\e509\"}.fa-angle-left{--fa:\"\\f104\"}.fa-diagram-successor{--fa:\"\\e47a\"}.fa-truck-arrow-right{--fa:\"\\e58b\"}.fa-arrows-split-up-and-left{--fa:\"\\e4bc\"}.fa-fist-raised,.fa-hand-fist{--fa:\"\\f6de\"}.fa-cloud-moon{--fa:\"\\f6c3\"}.fa-briefcase{--fa:\"\\f0b1\"}.fa-person-falling{--fa:\"\\e546\"}.fa-image-portrait,.fa-portrait{--fa:\"\\f3e0\"}.fa-user-tag{--fa:\"\\f507\"}.fa-rug{--fa:\"\\e569\"}.fa-earth-europe,.fa-globe-europe{--fa:\"\\f7a2\"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:\"\\f59d\"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:\"\\f410\"}.fa-baht-sign{--fa:\"\\e0ac\"}.fa-book-open{--fa:\"\\f518\"}.fa-book-journal-whills,.fa-journal-whills{--fa:\"\\f66a\"}.fa-handcuffs{--fa:\"\\e4f8\"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:\"\\f071\"}.fa-database{--fa:\"\\f1c0\"}.fa-mail-forward,.fa-share{--fa:\"\\f064\"}.fa-bottle-droplet{--fa:\"\\e4c4\"}.fa-mask-face{--fa:\"\\e1d7\"}.fa-hill-rockslide{--fa:\"\\e508\"}.fa-exchange-alt,.fa-right-left{--fa:\"\\f362\"}.fa-paper-plane{--fa:\"\\f1d8\"}.fa-road-circle-exclamation{--fa:\"\\e565\"}.fa-dungeon{--fa:\"\\f6d9\"}.fa-align-right{--fa:\"\\f038\"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:\"\\f53b\"}.fa-life-ring{--fa:\"\\f1cd\"}.fa-hands,.fa-sign-language,.fa-signing{--fa:\"\\f2a7\"}.fa-calendar-day{--fa:\"\\f783\"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:\"\\f5c5\"}.fa-arrows-up-down,.fa-arrows-v{--fa:\"\\f07d\"}.fa-face-grimace,.fa-grimace{--fa:\"\\f57f\"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:\"\\e2ce\"}.fa-level-down-alt,.fa-turn-down{--fa:\"\\f3be\"}.fa-person-walking-arrow-right{--fa:\"\\e552\"}.fa-envelope-square,.fa-square-envelope{--fa:\"\\f199\"}.fa-dice{--fa:\"\\f522\"}.fa-bowling-ball{--fa:\"\\f436\"}.fa-brain{--fa:\"\\f5dc\"}.fa-band-aid,.fa-bandage{--fa:\"\\f462\"}.fa-calendar-minus{--fa:\"\\f272\"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:\"\\f057\"}.fa-gifts{--fa:\"\\f79c\"}.fa-hotel{--fa:\"\\f594\"}.fa-earth-asia,.fa-globe-asia{--fa:\"\\f57e\"}.fa-id-card-alt,.fa-id-card-clip{--fa:\"\\f47f\"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:\"\\f00e\"}.fa-thumbs-up{--fa:\"\\f164\"}.fa-user-clock{--fa:\"\\f4fd\"}.fa-allergies,.fa-hand-dots{--fa:\"\\f461\"}.fa-file-invoice{--fa:\"\\f570\"}.fa-window-minimize{--fa:\"\\f2d1\"}.fa-coffee,.fa-mug-saucer{--fa:\"\\f0f4\"}.fa-brush{--fa:\"\\f55d\"}.fa-file-half-dashed{--fa:\"\\e698\"}.fa-mask{--fa:\"\\f6fa\"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:\"\\f010\"}.fa-ruler-vertical{--fa:\"\\f548\"}.fa-user-alt,.fa-user-large{--fa:\"\\f406\"}.fa-train-tram{--fa:\"\\e5b4\"}.fa-user-nurse{--fa:\"\\f82f\"}.fa-syringe{--fa:\"\\f48e\"}.fa-cloud-sun{--fa:\"\\f6c4\"}.fa-stopwatch-20{--fa:\"\\e06f\"}.fa-square-full{--fa:\"\\f45c\"}.fa-magnet{--fa:\"\\f076\"}.fa-jar{--fa:\"\\e516\"}.fa-note-sticky,.fa-sticky-note{--fa:\"\\f249\"}.fa-bug-slash{--fa:\"\\e490\"}.fa-arrow-up-from-water-pump{--fa:\"\\e4b6\"}.fa-bone{--fa:\"\\f5d7\"}.fa-table-cells-row-unlock{--fa:\"\\e691\"}.fa-user-injured{--fa:\"\\f728\"}.fa-face-sad-tear,.fa-sad-tear{--fa:\"\\f5b4\"}.fa-plane{--fa:\"\\f072\"}.fa-tent-arrows-down{--fa:\"\\e581\"}.fa-exclamation{--fa:\"\\21\"}.fa-arrows-spin{--fa:\"\\e4bb\"}.fa-print{--fa:\"\\f02f\"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:\"\\e2bb\"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:\"\\24\"}.fa-x{--fa:\"\\58\"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:\"\\f688\"}.fa-users-cog,.fa-users-gear{--fa:\"\\f509\"}.fa-person-military-pointing{--fa:\"\\e54a\"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:\"\\f19c\"}.fa-umbrella{--fa:\"\\f0e9\"}.fa-trowel{--fa:\"\\e589\"}.fa-d{--fa:\"\\44\"}.fa-stapler{--fa:\"\\e5af\"}.fa-masks-theater,.fa-theater-masks{--fa:\"\\f630\"}.fa-kip-sign{--fa:\"\\e1c4\"}.fa-hand-point-left{--fa:\"\\f0a5\"}.fa-handshake-alt,.fa-handshake-simple{--fa:\"\\f4c6\"}.fa-fighter-jet,.fa-jet-fighter{--fa:\"\\f0fb\"}.fa-share-alt-square,.fa-square-share-nodes{--fa:\"\\f1e1\"}.fa-barcode{--fa:\"\\f02a\"}.fa-plus-minus{--fa:\"\\e43c\"}.fa-video,.fa-video-camera{--fa:\"\\f03d\"}.fa-graduation-cap,.fa-mortar-board{--fa:\"\\f19d\"}.fa-hand-holding-medical{--fa:\"\\e05c\"}.fa-person-circle-check{--fa:\"\\e53e\"}.fa-level-up-alt,.fa-turn-up{--fa:\"\\f3bf\"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:\"Font Awesome 6 Brands\";--fa-font-brands:normal 400 1em/1 \"Font Awesome 6 Brands\"}@font-face{font-family:\"Font Awesome 6 Brands\";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format(\"woff2\"),url(../webfonts/fa-brands-400.ttf) format(\"truetype\")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:\"\\f3d0\"}.fa-hooli{--fa:\"\\f427\"}.fa-yelp{--fa:\"\\f1e9\"}.fa-cc-visa{--fa:\"\\f1f0\"}.fa-lastfm{--fa:\"\\f202\"}.fa-shopware{--fa:\"\\f5b5\"}.fa-creative-commons-nc{--fa:\"\\f4e8\"}.fa-aws{--fa:\"\\f375\"}.fa-redhat{--fa:\"\\f7bc\"}.fa-yoast{--fa:\"\\f2b1\"}.fa-cloudflare{--fa:\"\\e07d\"}.fa-ups{--fa:\"\\f7e0\"}.fa-pixiv{--fa:\"\\e640\"}.fa-wpexplorer{--fa:\"\\f2de\"}.fa-dyalog{--fa:\"\\f399\"}.fa-bity{--fa:\"\\f37a\"}.fa-stackpath{--fa:\"\\f842\"}.fa-buysellads{--fa:\"\\f20d\"}.fa-first-order{--fa:\"\\f2b0\"}.fa-modx{--fa:\"\\f285\"}.fa-guilded{--fa:\"\\e07e\"}.fa-vnv{--fa:\"\\f40b\"}.fa-js-square,.fa-square-js{--fa:\"\\f3b9\"}.fa-microsoft{--fa:\"\\f3ca\"}.fa-qq{--fa:\"\\f1d6\"}.fa-orcid{--fa:\"\\f8d2\"}.fa-java{--fa:\"\\f4e4\"}.fa-invision{--fa:\"\\f7b0\"}.fa-creative-commons-pd-alt{--fa:\"\\f4ed\"}.fa-centercode{--fa:\"\\f380\"}.fa-glide-g{--fa:\"\\f2a6\"}.fa-drupal{--fa:\"\\f1a9\"}.fa-jxl{--fa:\"\\e67b\"}.fa-dart-lang{--fa:\"\\e693\"}.fa-hire-a-helper{--fa:\"\\f3b0\"}.fa-creative-commons-by{--fa:\"\\f4e7\"}.fa-unity{--fa:\"\\e049\"}.fa-whmcs{--fa:\"\\f40d\"}.fa-rocketchat{--fa:\"\\f3e8\"}.fa-vk{--fa:\"\\f189\"}.fa-untappd{--fa:\"\\f405\"}.fa-mailchimp{--fa:\"\\f59e\"}.fa-css3-alt{--fa:\"\\f38b\"}.fa-reddit-square,.fa-square-reddit{--fa:\"\\f1a2\"}.fa-vimeo-v{--fa:\"\\f27d\"}.fa-contao{--fa:\"\\f26d\"}.fa-square-font-awesome{--fa:\"\\e5ad\"}.fa-deskpro{--fa:\"\\f38f\"}.fa-brave{--fa:\"\\e63c\"}.fa-sistrix{--fa:\"\\f3ee\"}.fa-instagram-square,.fa-square-instagram{--fa:\"\\e055\"}.fa-battle-net{--fa:\"\\f835\"}.fa-the-red-yeti{--fa:\"\\f69d\"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:\"\\f3af\"}.fa-edge{--fa:\"\\f282\"}.fa-threads{--fa:\"\\e618\"}.fa-napster{--fa:\"\\f3d2\"}.fa-snapchat-square,.fa-square-snapchat{--fa:\"\\f2ad\"}.fa-google-plus-g{--fa:\"\\f0d5\"}.fa-artstation{--fa:\"\\f77a\"}.fa-markdown{--fa:\"\\f60f\"}.fa-sourcetree{--fa:\"\\f7d3\"}.fa-google-plus{--fa:\"\\f2b3\"}.fa-diaspora{--fa:\"\\f791\"}.fa-foursquare{--fa:\"\\f180\"}.fa-stack-overflow{--fa:\"\\f16c\"}.fa-github-alt{--fa:\"\\f113\"}.fa-phoenix-squadron{--fa:\"\\f511\"}.fa-pagelines{--fa:\"\\f18c\"}.fa-algolia{--fa:\"\\f36c\"}.fa-red-river{--fa:\"\\f3e3\"}.fa-creative-commons-sa{--fa:\"\\f4ef\"}.fa-safari{--fa:\"\\f267\"}.fa-google{--fa:\"\\f1a0\"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:\"\\f35c\"}.fa-atlassian{--fa:\"\\f77b\"}.fa-linkedin-in{--fa:\"\\f0e1\"}.fa-digital-ocean{--fa:\"\\f391\"}.fa-nimblr{--fa:\"\\f5a8\"}.fa-chromecast{--fa:\"\\f838\"}.fa-evernote{--fa:\"\\f839\"}.fa-hacker-news{--fa:\"\\f1d4\"}.fa-creative-commons-sampling{--fa:\"\\f4f0\"}.fa-adversal{--fa:\"\\f36a\"}.fa-creative-commons{--fa:\"\\f25e\"}.fa-watchman-monitoring{--fa:\"\\e087\"}.fa-fonticons{--fa:\"\\f280\"}.fa-weixin{--fa:\"\\f1d7\"}.fa-shirtsinbulk{--fa:\"\\f214\"}.fa-codepen{--fa:\"\\f1cb\"}.fa-git-alt{--fa:\"\\f841\"}.fa-lyft{--fa:\"\\f3c3\"}.fa-rev{--fa:\"\\f5b2\"}.fa-windows{--fa:\"\\f17a\"}.fa-wizards-of-the-coast{--fa:\"\\f730\"}.fa-square-viadeo,.fa-viadeo-square{--fa:\"\\f2aa\"}.fa-meetup{--fa:\"\\f2e0\"}.fa-centos{--fa:\"\\f789\"}.fa-adn{--fa:\"\\f170\"}.fa-cloudsmith{--fa:\"\\f384\"}.fa-opensuse{--fa:\"\\e62b\"}.fa-pied-piper-alt{--fa:\"\\f1a8\"}.fa-dribbble-square,.fa-square-dribbble{--fa:\"\\f397\"}.fa-codiepie{--fa:\"\\f284\"}.fa-node{--fa:\"\\f419\"}.fa-mix{--fa:\"\\f3cb\"}.fa-steam{--fa:\"\\f1b6\"}.fa-cc-apple-pay{--fa:\"\\f416\"}.fa-scribd{--fa:\"\\f28a\"}.fa-debian{--fa:\"\\e60b\"}.fa-openid{--fa:\"\\f19b\"}.fa-instalod{--fa:\"\\e081\"}.fa-files-pinwheel{--fa:\"\\e69f\"}.fa-expeditedssl{--fa:\"\\f23e\"}.fa-sellcast{--fa:\"\\f2da\"}.fa-square-twitter,.fa-twitter-square{--fa:\"\\f081\"}.fa-r-project{--fa:\"\\f4f7\"}.fa-delicious{--fa:\"\\f1a5\"}.fa-freebsd{--fa:\"\\f3a4\"}.fa-vuejs{--fa:\"\\f41f\"}.fa-accusoft{--fa:\"\\f369\"}.fa-ioxhost{--fa:\"\\f208\"}.fa-fonticons-fi{--fa:\"\\f3a2\"}.fa-app-store{--fa:\"\\f36f\"}.fa-cc-mastercard{--fa:\"\\f1f1\"}.fa-itunes-note{--fa:\"\\f3b5\"}.fa-golang{--fa:\"\\e40f\"}.fa-kickstarter,.fa-square-kickstarter{--fa:\"\\f3bb\"}.fa-grav{--fa:\"\\f2d6\"}.fa-weibo{--fa:\"\\f18a\"}.fa-uncharted{--fa:\"\\e084\"}.fa-firstdraft{--fa:\"\\f3a1\"}.fa-square-youtube,.fa-youtube-square{--fa:\"\\f431\"}.fa-wikipedia-w{--fa:\"\\f266\"}.fa-rendact,.fa-wpressr{--fa:\"\\f3e4\"}.fa-angellist{--fa:\"\\f209\"}.fa-galactic-republic{--fa:\"\\f50c\"}.fa-nfc-directional{--fa:\"\\e530\"}.fa-skype{--fa:\"\\f17e\"}.fa-joget{--fa:\"\\f3b7\"}.fa-fedora{--fa:\"\\f798\"}.fa-stripe-s{--fa:\"\\f42a\"}.fa-meta{--fa:\"\\e49b\"}.fa-laravel{--fa:\"\\f3bd\"}.fa-hotjar{--fa:\"\\f3b1\"}.fa-bluetooth-b{--fa:\"\\f294\"}.fa-square-letterboxd{--fa:\"\\e62e\"}.fa-sticker-mule{--fa:\"\\f3f7\"}.fa-creative-commons-zero{--fa:\"\\f4f3\"}.fa-hips{--fa:\"\\f452\"}.fa-css{--fa:\"\\e6a2\"}.fa-behance{--fa:\"\\f1b4\"}.fa-reddit{--fa:\"\\f1a1\"}.fa-discord{--fa:\"\\f392\"}.fa-chrome{--fa:\"\\f268\"}.fa-app-store-ios{--fa:\"\\f370\"}.fa-cc-discover{--fa:\"\\f1f2\"}.fa-wpbeginner{--fa:\"\\f297\"}.fa-confluence{--fa:\"\\f78d\"}.fa-shoelace{--fa:\"\\e60c\"}.fa-mdb{--fa:\"\\f8ca\"}.fa-dochub{--fa:\"\\f394\"}.fa-accessible-icon{--fa:\"\\f368\"}.fa-ebay{--fa:\"\\f4f4\"}.fa-amazon{--fa:\"\\f270\"}.fa-unsplash{--fa:\"\\e07c\"}.fa-yarn{--fa:\"\\f7e3\"}.fa-square-steam,.fa-steam-square{--fa:\"\\f1b7\"}.fa-500px{--fa:\"\\f26e\"}.fa-square-vimeo,.fa-vimeo-square{--fa:\"\\f194\"}.fa-asymmetrik{--fa:\"\\f372\"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:\"\\f2b4\"}.fa-gratipay{--fa:\"\\f184\"}.fa-apple{--fa:\"\\f179\"}.fa-hive{--fa:\"\\e07f\"}.fa-gitkraken{--fa:\"\\f3a6\"}.fa-keybase{--fa:\"\\f4f5\"}.fa-apple-pay{--fa:\"\\f415\"}.fa-padlet{--fa:\"\\e4a0\"}.fa-amazon-pay{--fa:\"\\f42c\"}.fa-github-square,.fa-square-github{--fa:\"\\f092\"}.fa-stumbleupon{--fa:\"\\f1a4\"}.fa-fedex{--fa:\"\\f797\"}.fa-phoenix-framework{--fa:\"\\f3dc\"}.fa-shopify{--fa:\"\\e057\"}.fa-neos{--fa:\"\\f612\"}.fa-square-threads{--fa:\"\\e619\"}.fa-hackerrank{--fa:\"\\f5f7\"}.fa-researchgate{--fa:\"\\f4f8\"}.fa-swift{--fa:\"\\f8e1\"}.fa-angular{--fa:\"\\f420\"}.fa-speakap{--fa:\"\\f3f3\"}.fa-angrycreative{--fa:\"\\f36e\"}.fa-y-combinator{--fa:\"\\f23b\"}.fa-empire{--fa:\"\\f1d1\"}.fa-envira{--fa:\"\\f299\"}.fa-google-scholar{--fa:\"\\e63b\"}.fa-gitlab-square,.fa-square-gitlab{--fa:\"\\e5ae\"}.fa-studiovinari{--fa:\"\\f3f8\"}.fa-pied-piper{--fa:\"\\f2ae\"}.fa-wordpress{--fa:\"\\f19a\"}.fa-product-hunt{--fa:\"\\f288\"}.fa-firefox{--fa:\"\\f269\"}.fa-linode{--fa:\"\\f2b8\"}.fa-goodreads{--fa:\"\\f3a8\"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:\"\\f264\"}.fa-jsfiddle{--fa:\"\\f1cc\"}.fa-sith{--fa:\"\\f512\"}.fa-themeisle{--fa:\"\\f2b2\"}.fa-page4{--fa:\"\\f3d7\"}.fa-hashnode{--fa:\"\\e499\"}.fa-react{--fa:\"\\f41b\"}.fa-cc-paypal{--fa:\"\\f1f4\"}.fa-squarespace{--fa:\"\\f5be\"}.fa-cc-stripe{--fa:\"\\f1f5\"}.fa-creative-commons-share{--fa:\"\\f4f2\"}.fa-bitcoin{--fa:\"\\f379\"}.fa-keycdn{--fa:\"\\f3ba\"}.fa-opera{--fa:\"\\f26a\"}.fa-itch-io{--fa:\"\\f83a\"}.fa-umbraco{--fa:\"\\f8e8\"}.fa-galactic-senate{--fa:\"\\f50d\"}.fa-ubuntu{--fa:\"\\f7df\"}.fa-draft2digital{--fa:\"\\f396\"}.fa-stripe{--fa:\"\\f429\"}.fa-houzz{--fa:\"\\f27c\"}.fa-gg{--fa:\"\\f260\"}.fa-dhl{--fa:\"\\f790\"}.fa-pinterest-square,.fa-square-pinterest{--fa:\"\\f0d3\"}.fa-xing{--fa:\"\\f168\"}.fa-blackberry{--fa:\"\\f37b\"}.fa-creative-commons-pd{--fa:\"\\f4ec\"}.fa-playstation{--fa:\"\\f3df\"}.fa-quinscape{--fa:\"\\f459\"}.fa-less{--fa:\"\\f41d\"}.fa-blogger-b{--fa:\"\\f37d\"}.fa-opencart{--fa:\"\\f23d\"}.fa-vine{--fa:\"\\f1ca\"}.fa-signal-messenger{--fa:\"\\e663\"}.fa-paypal{--fa:\"\\f1ed\"}.fa-gitlab{--fa:\"\\f296\"}.fa-typo3{--fa:\"\\f42b\"}.fa-reddit-alien{--fa:\"\\f281\"}.fa-yahoo{--fa:\"\\f19e\"}.fa-dailymotion{--fa:\"\\e052\"}.fa-affiliatetheme{--fa:\"\\f36b\"}.fa-pied-piper-pp{--fa:\"\\f1a7\"}.fa-bootstrap{--fa:\"\\f836\"}.fa-odnoklassniki{--fa:\"\\f263\"}.fa-nfc-symbol{--fa:\"\\e531\"}.fa-mintbit{--fa:\"\\e62f\"}.fa-ethereum{--fa:\"\\f42e\"}.fa-speaker-deck{--fa:\"\\f83c\"}.fa-creative-commons-nc-eu{--fa:\"\\f4e9\"}.fa-patreon{--fa:\"\\f3d9\"}.fa-avianex{--fa:\"\\f374\"}.fa-ello{--fa:\"\\f5f1\"}.fa-gofore{--fa:\"\\f3a7\"}.fa-bimobject{--fa:\"\\f378\"}.fa-brave-reverse{--fa:\"\\e63d\"}.fa-facebook-f{--fa:\"\\f39e\"}.fa-google-plus-square,.fa-square-google-plus{--fa:\"\\f0d4\"}.fa-web-awesome{--fa:\"\\e682\"}.fa-mandalorian{--fa:\"\\f50f\"}.fa-first-order-alt{--fa:\"\\f50a\"}.fa-osi{--fa:\"\\f41a\"}.fa-google-wallet{--fa:\"\\f1ee\"}.fa-d-and-d-beyond{--fa:\"\\f6ca\"}.fa-periscope{--fa:\"\\f3da\"}.fa-fulcrum{--fa:\"\\f50b\"}.fa-cloudscale{--fa:\"\\f383\"}.fa-forumbee{--fa:\"\\f211\"}.fa-mizuni{--fa:\"\\f3cc\"}.fa-schlix{--fa:\"\\f3ea\"}.fa-square-xing,.fa-xing-square{--fa:\"\\f169\"}.fa-bandcamp{--fa:\"\\f2d5\"}.fa-wpforms{--fa:\"\\f298\"}.fa-cloudversify{--fa:\"\\f385\"}.fa-usps{--fa:\"\\f7e1\"}.fa-megaport{--fa:\"\\f5a3\"}.fa-magento{--fa:\"\\f3c4\"}.fa-spotify{--fa:\"\\f1bc\"}.fa-optin-monster{--fa:\"\\f23c\"}.fa-fly{--fa:\"\\f417\"}.fa-square-bluesky{--fa:\"\\e6a3\"}.fa-aviato{--fa:\"\\f421\"}.fa-itunes{--fa:\"\\f3b4\"}.fa-cuttlefish{--fa:\"\\f38c\"}.fa-blogger{--fa:\"\\f37c\"}.fa-flickr{--fa:\"\\f16e\"}.fa-viber{--fa:\"\\f409\"}.fa-soundcloud{--fa:\"\\f1be\"}.fa-digg{--fa:\"\\f1a6\"}.fa-tencent-weibo{--fa:\"\\f1d5\"}.fa-letterboxd{--fa:\"\\e62d\"}.fa-symfony{--fa:\"\\f83d\"}.fa-maxcdn{--fa:\"\\f136\"}.fa-etsy{--fa:\"\\f2d7\"}.fa-facebook-messenger{--fa:\"\\f39f\"}.fa-audible{--fa:\"\\f373\"}.fa-think-peaks{--fa:\"\\f731\"}.fa-bilibili{--fa:\"\\e3d9\"}.fa-erlang{--fa:\"\\f39d\"}.fa-x-twitter{--fa:\"\\e61b\"}.fa-cotton-bureau{--fa:\"\\f89e\"}.fa-dashcube{--fa:\"\\f210\"}.fa-42-group,.fa-innosoft{--fa:\"\\e080\"}.fa-stack-exchange{--fa:\"\\f18d\"}.fa-elementor{--fa:\"\\f430\"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:\"\\e01e\"}.fa-creative-commons-nd{--fa:\"\\f4eb\"}.fa-palfed{--fa:\"\\f3d8\"}.fa-superpowers{--fa:\"\\f2dd\"}.fa-resolving{--fa:\"\\f3e7\"}.fa-xbox{--fa:\"\\f412\"}.fa-square-web-awesome-stroke{--fa:\"\\e684\"}.fa-searchengin{--fa:\"\\f3eb\"}.fa-tiktok{--fa:\"\\e07b\"}.fa-facebook-square,.fa-square-facebook{--fa:\"\\f082\"}.fa-renren{--fa:\"\\f18b\"}.fa-linux{--fa:\"\\f17c\"}.fa-glide{--fa:\"\\f2a5\"}.fa-linkedin{--fa:\"\\f08c\"}.fa-hubspot{--fa:\"\\f3b2\"}.fa-deploydog{--fa:\"\\f38e\"}.fa-twitch{--fa:\"\\f1e8\"}.fa-flutter{--fa:\"\\e694\"}.fa-ravelry{--fa:\"\\f2d9\"}.fa-mixer{--fa:\"\\e056\"}.fa-lastfm-square,.fa-square-lastfm{--fa:\"\\f203\"}.fa-vimeo{--fa:\"\\f40a\"}.fa-mendeley{--fa:\"\\f7b3\"}.fa-uniregistry{--fa:\"\\f404\"}.fa-figma{--fa:\"\\f799\"}.fa-creative-commons-remix{--fa:\"\\f4ee\"}.fa-cc-amazon-pay{--fa:\"\\f42d\"}.fa-dropbox{--fa:\"\\f16b\"}.fa-instagram{--fa:\"\\f16d\"}.fa-cmplid{--fa:\"\\e360\"}.fa-upwork{--fa:\"\\e641\"}.fa-facebook{--fa:\"\\f09a\"}.fa-gripfire{--fa:\"\\f3ac\"}.fa-jedi-order{--fa:\"\\f50e\"}.fa-uikit{--fa:\"\\f403\"}.fa-fort-awesome-alt{--fa:\"\\f3a3\"}.fa-phabricator{--fa:\"\\f3db\"}.fa-ussunnah{--fa:\"\\f407\"}.fa-earlybirds{--fa:\"\\f39a\"}.fa-trade-federation{--fa:\"\\f513\"}.fa-autoprefixer{--fa:\"\\f41c\"}.fa-whatsapp{--fa:\"\\f232\"}.fa-square-upwork{--fa:\"\\e67c\"}.fa-slideshare{--fa:\"\\f1e7\"}.fa-google-play{--fa:\"\\f3ab\"}.fa-viadeo{--fa:\"\\f2a9\"}.fa-line{--fa:\"\\f3c0\"}.fa-google-drive{--fa:\"\\f3aa\"}.fa-servicestack{--fa:\"\\f3ec\"}.fa-simplybuilt{--fa:\"\\f215\"}.fa-bitbucket{--fa:\"\\f171\"}.fa-imdb{--fa:\"\\f2d8\"}.fa-deezer{--fa:\"\\e077\"}.fa-raspberry-pi{--fa:\"\\f7bb\"}.fa-jira{--fa:\"\\f7b1\"}.fa-docker{--fa:\"\\f395\"}.fa-screenpal{--fa:\"\\e570\"}.fa-bluetooth{--fa:\"\\f293\"}.fa-gitter{--fa:\"\\f426\"}.fa-d-and-d{--fa:\"\\f38d\"}.fa-microblog{--fa:\"\\e01a\"}.fa-cc-diners-club{--fa:\"\\f24c\"}.fa-gg-circle{--fa:\"\\f261\"}.fa-pied-piper-hat{--fa:\"\\f4e5\"}.fa-kickstarter-k{--fa:\"\\f3bc\"}.fa-yandex{--fa:\"\\f413\"}.fa-readme{--fa:\"\\f4d5\"}.fa-html5{--fa:\"\\f13b\"}.fa-sellsy{--fa:\"\\f213\"}.fa-square-web-awesome{--fa:\"\\e683\"}.fa-sass{--fa:\"\\f41e\"}.fa-wirsindhandwerk,.fa-wsh{--fa:\"\\e2d0\"}.fa-buromobelexperte{--fa:\"\\f37f\"}.fa-salesforce{--fa:\"\\f83b\"}.fa-octopus-deploy{--fa:\"\\e082\"}.fa-medapps{--fa:\"\\f3c6\"}.fa-ns8{--fa:\"\\f3d5\"}.fa-pinterest-p{--fa:\"\\f231\"}.fa-apper{--fa:\"\\f371\"}.fa-fort-awesome{--fa:\"\\f286\"}.fa-waze{--fa:\"\\f83f\"}.fa-bluesky{--fa:\"\\e671\"}.fa-cc-jcb{--fa:\"\\f24b\"}.fa-snapchat,.fa-snapchat-ghost{--fa:\"\\f2ab\"}.fa-fantasy-flight-games{--fa:\"\\f6dc\"}.fa-rust{--fa:\"\\e07a\"}.fa-wix{--fa:\"\\f5cf\"}.fa-behance-square,.fa-square-behance{--fa:\"\\f1b5\"}.fa-supple{--fa:\"\\f3f9\"}.fa-webflow{--fa:\"\\e65c\"}.fa-rebel{--fa:\"\\f1d0\"}.fa-css3{--fa:\"\\f13c\"}.fa-staylinked{--fa:\"\\f3f5\"}.fa-kaggle{--fa:\"\\f5fa\"}.fa-space-awesome{--fa:\"\\e5ac\"}.fa-deviantart{--fa:\"\\f1bd\"}.fa-cpanel{--fa:\"\\f388\"}.fa-goodreads-g{--fa:\"\\f3a9\"}.fa-git-square,.fa-square-git{--fa:\"\\f1d2\"}.fa-square-tumblr,.fa-tumblr-square{--fa:\"\\f174\"}.fa-trello{--fa:\"\\f181\"}.fa-creative-commons-nc-jp{--fa:\"\\f4ea\"}.fa-get-pocket{--fa:\"\\f265\"}.fa-perbyte{--fa:\"\\e083\"}.fa-grunt{--fa:\"\\f3ad\"}.fa-weebly{--fa:\"\\f5cc\"}.fa-connectdevelop{--fa:\"\\f20e\"}.fa-leanpub{--fa:\"\\f212\"}.fa-black-tie{--fa:\"\\f27e\"}.fa-themeco{--fa:\"\\f5c6\"}.fa-python{--fa:\"\\f3e2\"}.fa-android{--fa:\"\\f17b\"}.fa-bots{--fa:\"\\e340\"}.fa-free-code-camp{--fa:\"\\f2c5\"}.fa-hornbill{--fa:\"\\f592\"}.fa-js{--fa:\"\\f3b8\"}.fa-ideal{--fa:\"\\e013\"}.fa-git{--fa:\"\\f1d3\"}.fa-dev{--fa:\"\\f6cc\"}.fa-sketch{--fa:\"\\f7c6\"}.fa-yandex-international{--fa:\"\\f414\"}.fa-cc-amex{--fa:\"\\f1f3\"}.fa-uber{--fa:\"\\f402\"}.fa-github{--fa:\"\\f09b\"}.fa-php{--fa:\"\\f457\"}.fa-alipay{--fa:\"\\f642\"}.fa-youtube{--fa:\"\\f167\"}.fa-skyatlas{--fa:\"\\f216\"}.fa-firefox-browser{--fa:\"\\e007\"}.fa-replyd{--fa:\"\\f3e6\"}.fa-suse{--fa:\"\\f7d6\"}.fa-jenkins{--fa:\"\\f3b6\"}.fa-twitter{--fa:\"\\f099\"}.fa-rockrms{--fa:\"\\f3e9\"}.fa-pinterest{--fa:\"\\f0d2\"}.fa-buffer{--fa:\"\\f837\"}.fa-npm{--fa:\"\\f3d4\"}.fa-yammer{--fa:\"\\f840\"}.fa-btc{--fa:\"\\f15a\"}.fa-dribbble{--fa:\"\\f17d\"}.fa-stumbleupon-circle{--fa:\"\\f1a3\"}.fa-internet-explorer{--fa:\"\\f26b\"}.fa-stubber{--fa:\"\\e5c7\"}.fa-telegram,.fa-telegram-plane{--fa:\"\\f2c6\"}.fa-old-republic{--fa:\"\\f510\"}.fa-odysee{--fa:\"\\e5c6\"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:\"\\f40c\"}.fa-node-js{--fa:\"\\f3d3\"}.fa-edge-legacy{--fa:\"\\e078\"}.fa-slack,.fa-slack-hash{--fa:\"\\f198\"}.fa-medrt{--fa:\"\\f3c8\"}.fa-usb{--fa:\"\\f287\"}.fa-tumblr{--fa:\"\\f173\"}.fa-vaadin{--fa:\"\\f408\"}.fa-quora{--fa:\"\\f2c4\"}.fa-square-x-twitter{--fa:\"\\e61a\"}.fa-reacteurope{--fa:\"\\f75d\"}.fa-medium,.fa-medium-m{--fa:\"\\f23a\"}.fa-amilia{--fa:\"\\f36d\"}.fa-mixcloud{--fa:\"\\f289\"}.fa-flipboard{--fa:\"\\f44d\"}.fa-viacoin{--fa:\"\\f237\"}.fa-critical-role{--fa:\"\\f6c9\"}.fa-sitrox{--fa:\"\\e44a\"}.fa-discourse{--fa:\"\\f393\"}.fa-joomla{--fa:\"\\f1aa\"}.fa-mastodon{--fa:\"\\f4f6\"}.fa-airbnb{--fa:\"\\f834\"}.fa-wolf-pack-battalion{--fa:\"\\f514\"}.fa-buy-n-large{--fa:\"\\f8a6\"}.fa-gulp{--fa:\"\\f3ae\"}.fa-creative-commons-sampling-plus{--fa:\"\\f4f1\"}.fa-strava{--fa:\"\\f428\"}.fa-ember{--fa:\"\\f423\"}.fa-canadian-maple-leaf{--fa:\"\\f785\"}.fa-teamspeak{--fa:\"\\f4f9\"}.fa-pushed{--fa:\"\\f3e1\"}.fa-wordpress-simple{--fa:\"\\f411\"}.fa-nutritionix{--fa:\"\\f3d6\"}.fa-wodu{--fa:\"\\e088\"}.fa-google-pay{--fa:\"\\e079\"}.fa-intercom{--fa:\"\\f7af\"}.fa-zhihu{--fa:\"\\f63f\"}.fa-korvue{--fa:\"\\f42f\"}.fa-pix{--fa:\"\\e43a\"}.fa-steam-symbol{--fa:\"\\f3f6\"}:host,:root{--fa-font-regular:normal 400 1em/1 \"Font Awesome 6 Free\"}@font-face{font-family:\"Font Awesome 6 Free\";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format(\"woff2\"),url(../webfonts/fa-regular-400.ttf) format(\"truetype\")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:\"Font Awesome 6 Free\";--fa-font-solid:normal 900 1em/1 \"Font Awesome 6 Free\"}@font-face{font-family:\"Font Awesome 6 Free\";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format(\"woff2\"),url(../webfonts/fa-solid-900.ttf) format(\"truetype\")}.fa-solid,.fas{font-weight:900}@font-face{font-family:\"Font Awesome 5 Brands\";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format(\"woff2\"),url(../webfonts/fa-brands-400.ttf) format(\"truetype\")}@font-face{font-family:\"Font Awesome 5 Free\";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format(\"woff2\"),url(../webfonts/fa-solid-900.ttf) format(\"truetype\")}@font-face{font-family:\"Font Awesome 5 Free\";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format(\"woff2\"),url(../webfonts/fa-regular-400.ttf) format(\"truetype\")}@font-face{font-family:\"FontAwesome\";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format(\"woff2\"),url(../webfonts/fa-solid-900.ttf) format(\"truetype\")}@font-face{font-family:\"FontAwesome\";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format(\"woff2\"),url(../webfonts/fa-brands-400.ttf) format(\"truetype\")}@font-face{font-family:\"FontAwesome\";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format(\"woff2\"),url(../webfonts/fa-regular-400.ttf) format(\"truetype\");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:\"FontAwesome\";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format(\"woff2\"),url(../webfonts/fa-v4compatibility.ttf) format(\"truetype\");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}.button{display:flex;height:50px;padding:0;background:#3e7671;border:none;outline:none;border-radius:5px;overflow:hidden;font-size:16px;font-weight:500;cursor:pointer;min-width:220px;max-width:220px}.button:hover{background:#008168}.button:active{background:#3e7671}.button-text{display:block;margin:auto;padding:0 10px;color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:50%;text-transform:capitalize}.button-icon{margin:auto;padding:10px;font-size:20px;color:#ffffff}.button-profile{margin:auto}.button-profile svg{display:flex;margin-left:4px;background-color:#fff;border-radius:4px}.profile-image{display:flex;margin-left:4px;width:40px;height:40px;border-radius:4px;background-color:#fff}.button-text-full-width{width:auto!important}.button-link{text-decoration:none!important}.dropdown{position:relative;display:inline-block}.dropdown-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:180px;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);z-index:1;border-radius:5px;text-align:left!important}.dropdown-content-link a{color:#71797E;padding:16px 20px;text-decoration:none;display:block;cursor:pointer;font-size:1rem!important}.dropdown-content-link a:hover{background-color:#f1f1f1;color:#000;opacity:0.7}.dropdown:hover .dropdown-content{display:block}.modal{display:none;position:fixed;z-index:1;padding-top:100px;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4);text-align:center}.modal-content{background-color:#fefefe;margin:auto;padding:20px;border:1px solid #888;width:40%}.modal-body{max-height:50vh;overflow-y:auto}.close{color:#aaaaaa;float:right;font-size:28px;font-weight:bold}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.modal-app{background-color:#c3e9bc;padding:15px;margin:10px;border-radius:5px}.external-app-link{text-decoration:none;color:#000}.gray-text{color:#606060}.green-text{color:#3e7671}#countdown{position:relative;margin:auto;margin-top:30px;height:40px;width:40px;text-align:center}#countdown-number{color:#2e2e2e;display:inline-block;line-height:40px}#countdown svg{position:absolute;top:0;right:0;width:40px;height:40px;transform:rotateY(-180deg) rotateZ(-90deg)}#countdown svg circle{stroke-dasharray:113px;stroke-dashoffset:0px;stroke-linecap:round;stroke-width:4px;stroke:#008168;fill:none;animation:countdown 6s linear infinite forwards}@keyframes countdown{from{stroke-dashoffset:0px}to{stroke-dashoffset:113px}}.lds-ring{color:#fff}.lds-ring{display:flex;justify-content:center;align-items:center;margin:auto;position:relative}.lds-ring div{box-sizing:border-box;display:block;position:absolute;width:25px;height:25px;margin:3px;border:2px solid currentColor;border-radius:50%;animation:lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;border-color:currentColor transparent transparent transparent}.lds-ring div:nth-child(1){animation-delay:-0.45s}.lds-ring div:nth-child(2){animation-delay:-0.3s}.lds-ring div:nth-child(3){animation-delay:-0.15s}@keyframes lds-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.dropdown-content .dropdown-user-profile{padding:12px 10px 8px 18px;border-bottom:1px solid #aaaaaa}.dropdown-content .dropdown-user-profile .username{font-size:16px;color:#2e2e2e;text-transform:capitalize}.dropdown-content .dropdown-user-profile .first-last-name{font-size:13px;color:#606060}.menu-bar-icons{color:#008168;display:inline-block;margin-right:8px;font-size:18px}.other-links-list{padding:14px;background-color:#f1f1f1;margin-bottom:8px;text-align:start;border-radius:5px}.tab-list{margin:0px 40px;padding:0;list-style:none;display:flex;position:relative;width:85%;border-bottom:1px solid #aaa}.tab-item{flex:1;text-align:center;transition:.3s;opacity:0.5}.tab-toggle{display:none}.tab-content{display:none}.tab-toggle:nth-child(1):checked~.tab-list .tab-item:nth-child(1),.tab-toggle:nth-child(2):checked~.tab-list .tab-item:nth-child(2){opacity:1;color:#008168;border-bottom:2px solid #008168}.tab-toggle:nth-child(2):checked~.tab-list::before{transform:translateX(100%)}.tab-toggle:nth-child(3):checked~.tab-list::before{transform:translateX(200%)}.tab-toggle:nth-child(1):checked~.tab-container .tab-content:nth-child(1),.tab-toggle:nth-child(2):checked~.tab-container .tab-content:nth-child(2){display:block}.tab-trigger{display:block;padding:10px 0}.tab-container{padding:15px 30px}.grid-view-menu{display:grid;gap:4px;grid-template-columns:repeat(3, 1fr);align-content:start;padding:8px;max-height:230px;overflow-y:auto}.grid-view-link{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;width:75px;height:70px;padding:6px;text-decoration:none;font-size:13px;color:#128f8b;text-align:center;transition:transform 0.2s ease, background-color 0.1s ease;position:relative;z-index:1;border-radius:3px;cursor:pointer}.grid-view-link:hover{background-color:#eeeeee;transform:scale(1.1);z-index:5}.grid-view-link-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#71797e;width:100%}.grid-view-link:hover .grid-view-link-text{white-space:pre-wrap;overflow:visible;text-overflow:unset}.grid-view-link i{transition:transform 0.2s ease}.grid-view-link:hover i{transform:scale(1.1)}hr.solid{border-top:1px solid #bbb;margin:2px 0}.restricted-overlay{position:fixed;inset:0;background:linear-gradient(135deg, #0f3d3e, #128f8b);display:flex;justify-content:center;align-items:center;padding:20px;z-index:9999999;font-family:\"Segoe UI\", sans-serif}.restricted-card{background:#ffffff;border-radius:10px;padding:50px;max-width:540px;width:100%;text-align:center;box-shadow:0 25px 70px rgba(0, 0, 0, 0.25);animation:fadeInUp 0.3s ease}.restricted-icon{font-size:48px;color:#128f8b;margin-bottom:30px}.restricted-card h2{margin-bottom:10px;color:#128f8b}.restricted-message{color:#555;font-size:16px;margin-bottom:30px;line-height:1.5}.restricted-links h4{margin-bottom:20px;color:#128f8b}.link-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(120px, 1fr));gap:20px;margin-bottom:25px}.restricted-link{background:#ecf2f2;padding:10px;border-radius:10px;text-decoration:none;color:#128f8b;font-size:13px;display:flex;flex-direction:column;align-items:center;gap:4px;transition:all 0.2s ease}.restricted-link:hover{background:#128f8b;color:#fff}.restricted-actions{display:flex;justify-content:center;gap:15px}.btn-primary{background:#128f8b;color:#fff;padding:10px 20px;border-radius:8px;text-decoration:none;font-weight:500;transition:0.2s}.btn-primary:hover{background:#0f6e6b}.btn-secondary{background:transparent;border:2px solid #128f8b;color:#128f8b;padding:8px 18px;border-radius:8px;cursor:pointer;transition:0.2s}.btn-danger{background:transparent;border:2px solid #dc3545;color:#dc3545;padding:8px 18px;border-radius:8px;cursor:pointer;transition:0.2s}.btn-secondary:hover{background:#128f8b;color:#fff}@keyframes fadeInUp{from{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}";
|
|
3999
|
-
const DashButtonStyle0 = dashButtonCss;
|
|
4059
|
+
const dashButtonCss = () => `.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0{--fa:"\\30"}.fa-1{--fa:"\\31"}.fa-2{--fa:"\\32"}.fa-3{--fa:"\\33"}.fa-4{--fa:"\\34"}.fa-5{--fa:"\\35"}.fa-6{--fa:"\\36"}.fa-7{--fa:"\\37"}.fa-8{--fa:"\\38"}.fa-9{--fa:"\\39"}.fa-fill-drip{--fa:"\\f576"}.fa-arrows-to-circle{--fa:"\\e4bd"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\\f138"}.fa-at{--fa:"\\40"}.fa-trash-alt,.fa-trash-can{--fa:"\\f2ed"}.fa-text-height{--fa:"\\f034"}.fa-user-times,.fa-user-xmark{--fa:"\\f235"}.fa-stethoscope{--fa:"\\f0f1"}.fa-comment-alt,.fa-message{--fa:"\\f27a"}.fa-info{--fa:"\\f129"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\\f422"}.fa-explosion{--fa:"\\e4e9"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\\f15c"}.fa-wave-square{--fa:"\\f83e"}.fa-ring{--fa:"\\f70b"}.fa-building-un{--fa:"\\e4d9"}.fa-dice-three{--fa:"\\f527"}.fa-calendar-alt,.fa-calendar-days{--fa:"\\f073"}.fa-anchor-circle-check{--fa:"\\e4aa"}.fa-building-circle-arrow-right{--fa:"\\e4d1"}.fa-volleyball,.fa-volleyball-ball{--fa:"\\f45f"}.fa-arrows-up-to-line{--fa:"\\e4c2"}.fa-sort-desc,.fa-sort-down{--fa:"\\f0dd"}.fa-circle-minus,.fa-minus-circle{--fa:"\\f056"}.fa-door-open{--fa:"\\f52b"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\\f2f5"}.fa-atom{--fa:"\\f5d2"}.fa-soap{--fa:"\\e06e"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\\f86d"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\\f539"}.fa-bridge-circle-check{--fa:"\\e4c9"}.fa-pump-medical{--fa:"\\e06a"}.fa-fingerprint{--fa:"\\f577"}.fa-hand-point-right{--fa:"\\f0a4"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\\f689"}.fa-forward-step,.fa-step-forward{--fa:"\\f051"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\\f5b8"}.fa-flag-checkered{--fa:"\\f11e"}.fa-football,.fa-football-ball{--fa:"\\f44e"}.fa-school-circle-exclamation{--fa:"\\e56c"}.fa-crop{--fa:"\\f125"}.fa-angle-double-down,.fa-angles-down{--fa:"\\f103"}.fa-users-rectangle{--fa:"\\e594"}.fa-people-roof{--fa:"\\e537"}.fa-people-line{--fa:"\\e534"}.fa-beer,.fa-beer-mug-empty{--fa:"\\f0fc"}.fa-diagram-predecessor{--fa:"\\e477"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\\f176"}.fa-burn,.fa-fire-flame-simple{--fa:"\\f46a"}.fa-male,.fa-person{--fa:"\\f183"}.fa-laptop{--fa:"\\f109"}.fa-file-csv{--fa:"\\f6dd"}.fa-menorah{--fa:"\\f676"}.fa-truck-plane{--fa:"\\e58f"}.fa-record-vinyl{--fa:"\\f8d9"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\\f587"}.fa-bong{--fa:"\\f55c"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\\f67b"}.fa-arrow-down-up-across-line{--fa:"\\e4af"}.fa-spoon,.fa-utensil-spoon{--fa:"\\f2e5"}.fa-jar-wheat{--fa:"\\e517"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\\f674"}.fa-file-circle-exclamation{--fa:"\\e4eb"}.fa-circle-h,.fa-hospital-symbol{--fa:"\\f47e"}.fa-pager{--fa:"\\f815"}.fa-address-book,.fa-contact-book{--fa:"\\f2b9"}.fa-strikethrough{--fa:"\\f0cc"}.fa-k{--fa:"\\4b"}.fa-landmark-flag{--fa:"\\e51c"}.fa-pencil,.fa-pencil-alt{--fa:"\\f303"}.fa-backward{--fa:"\\f04a"}.fa-caret-right{--fa:"\\f0da"}.fa-comments{--fa:"\\f086"}.fa-file-clipboard,.fa-paste{--fa:"\\f0ea"}.fa-code-pull-request{--fa:"\\e13c"}.fa-clipboard-list{--fa:"\\f46d"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\\f4de"}.fa-user-check{--fa:"\\f4fc"}.fa-vial-virus{--fa:"\\e597"}.fa-sheet-plastic{--fa:"\\e571"}.fa-blog{--fa:"\\f781"}.fa-user-ninja{--fa:"\\f504"}.fa-person-arrow-up-from-line{--fa:"\\e539"}.fa-scroll-torah,.fa-torah{--fa:"\\f6a0"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\\f458"}.fa-toggle-off{--fa:"\\f204"}.fa-archive,.fa-box-archive{--fa:"\\f187"}.fa-person-drowning{--fa:"\\e545"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\\f886"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\\f58a"}.fa-spray-can{--fa:"\\f5bd"}.fa-truck-monster{--fa:"\\f63b"}.fa-w{--fa:"\\57"}.fa-earth-africa,.fa-globe-africa{--fa:"\\f57c"}.fa-rainbow{--fa:"\\f75b"}.fa-circle-notch{--fa:"\\f1ce"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\\f3fa"}.fa-paw{--fa:"\\f1b0"}.fa-cloud{--fa:"\\f0c2"}.fa-trowel-bricks{--fa:"\\e58a"}.fa-face-flushed,.fa-flushed{--fa:"\\f579"}.fa-hospital-user{--fa:"\\f80d"}.fa-tent-arrow-left-right{--fa:"\\e57f"}.fa-gavel,.fa-legal{--fa:"\\f0e3"}.fa-binoculars{--fa:"\\f1e5"}.fa-microphone-slash{--fa:"\\f131"}.fa-box-tissue{--fa:"\\e05b"}.fa-motorcycle{--fa:"\\f21c"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\\f562"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\\f5ae"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\\e068"}.fa-mars-and-venus-burst{--fa:"\\e523"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\\f152"}.fa-cut,.fa-scissors{--fa:"\\f0c4"}.fa-sun-plant-wilt{--fa:"\\e57a"}.fa-toilets-portable{--fa:"\\e584"}.fa-hockey-puck{--fa:"\\f453"}.fa-table{--fa:"\\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\\e521"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\\f566"}.fa-users-slash{--fa:"\\e073"}.fa-clover{--fa:"\\e139"}.fa-mail-reply,.fa-reply{--fa:"\\f3e5"}.fa-star-and-crescent{--fa:"\\f699"}.fa-house-fire{--fa:"\\e50c"}.fa-minus-square,.fa-square-minus{--fa:"\\f146"}.fa-helicopter{--fa:"\\f533"}.fa-compass{--fa:"\\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\\f150"}.fa-file-circle-question{--fa:"\\e4ef"}.fa-laptop-code{--fa:"\\f5fc"}.fa-swatchbook{--fa:"\\f5c3"}.fa-prescription-bottle{--fa:"\\f485"}.fa-bars,.fa-navicon{--fa:"\\f0c9"}.fa-people-group{--fa:"\\e533"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\\f253"}.fa-heart-broken,.fa-heart-crack{--fa:"\\f7a9"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\\f360"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\\f597"}.fa-film{--fa:"\\f008"}.fa-ruler-horizontal{--fa:"\\f547"}.fa-people-robbery{--fa:"\\e536"}.fa-lightbulb{--fa:"\\f0eb"}.fa-caret-left{--fa:"\\f0d9"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\\f06a"}.fa-school-circle-xmark{--fa:"\\e56d"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\\f08b"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\\f13a"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\\f13e"}.fa-cloud-showers-heavy{--fa:"\\f740"}.fa-headphones-alt,.fa-headphones-simple{--fa:"\\f58f"}.fa-sitemap{--fa:"\\f0e8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\\f4b9"}.fa-memory{--fa:"\\f538"}.fa-road-spikes{--fa:"\\e568"}.fa-fire-burner{--fa:"\\e4f1"}.fa-flag{--fa:"\\f024"}.fa-hanukiah{--fa:"\\f6e6"}.fa-feather{--fa:"\\f52d"}.fa-volume-down,.fa-volume-low{--fa:"\\f027"}.fa-comment-slash{--fa:"\\f4b3"}.fa-cloud-sun-rain{--fa:"\\f743"}.fa-compress{--fa:"\\f066"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\\e2cd"}.fa-ankh{--fa:"\\f644"}.fa-hands-holding-child{--fa:"\\e4fa"}.fa-asterisk{--fa:"\\2a"}.fa-check-square,.fa-square-check{--fa:"\\f14a"}.fa-peseta-sign{--fa:"\\e221"}.fa-header,.fa-heading{--fa:"\\f1dc"}.fa-ghost{--fa:"\\f6e2"}.fa-list,.fa-list-squares{--fa:"\\f03a"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\\f87b"}.fa-cart-plus{--fa:"\\f217"}.fa-gamepad{--fa:"\\f11b"}.fa-circle-dot,.fa-dot-circle{--fa:"\\f192"}.fa-dizzy,.fa-face-dizzy{--fa:"\\f567"}.fa-egg{--fa:"\\f7fb"}.fa-house-medical-circle-xmark{--fa:"\\e513"}.fa-campground{--fa:"\\f6bb"}.fa-folder-plus{--fa:"\\f65e"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\\f1e3"}.fa-paint-brush,.fa-paintbrush{--fa:"\\f1fc"}.fa-lock{--fa:"\\f023"}.fa-gas-pump{--fa:"\\f52f"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\\f593"}.fa-map-location,.fa-map-marked{--fa:"\\f59f"}.fa-house-flood-water{--fa:"\\e50e"}.fa-tree{--fa:"\\f1bb"}.fa-bridge-lock{--fa:"\\e4cc"}.fa-sack-dollar{--fa:"\\f81d"}.fa-edit,.fa-pen-to-square{--fa:"\\f044"}.fa-car-side{--fa:"\\f5e4"}.fa-share-alt,.fa-share-nodes{--fa:"\\f1e0"}.fa-heart-circle-minus{--fa:"\\e4ff"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\\f252"}.fa-microscope{--fa:"\\f610"}.fa-sink{--fa:"\\e06d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\\f290"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\\f881"}.fa-mitten{--fa:"\\f7b5"}.fa-person-rays{--fa:"\\e54d"}.fa-users{--fa:"\\f0c0"}.fa-eye-slash{--fa:"\\f070"}.fa-flask-vial{--fa:"\\e4f3"}.fa-hand,.fa-hand-paper{--fa:"\\f256"}.fa-om{--fa:"\\f679"}.fa-worm{--fa:"\\e599"}.fa-house-circle-xmark{--fa:"\\e50b"}.fa-plug{--fa:"\\f1e6"}.fa-chevron-up{--fa:"\\f077"}.fa-hand-spock{--fa:"\\f259"}.fa-stopwatch{--fa:"\\f2f2"}.fa-face-kiss,.fa-kiss{--fa:"\\f596"}.fa-bridge-circle-xmark{--fa:"\\e4cb"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\\f589"}.fa-chess-bishop{--fa:"\\f43a"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\\f58c"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\\f2a4"}.fa-road-circle-check{--fa:"\\e564"}.fa-dice-five{--fa:"\\f523"}.fa-rss-square,.fa-square-rss{--fa:"\\f143"}.fa-land-mine-on{--fa:"\\e51b"}.fa-i-cursor{--fa:"\\f246"}.fa-stamp{--fa:"\\f5bf"}.fa-stairs{--fa:"\\e289"}.fa-i{--fa:"\\49"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\\f6f2"}.fa-pills{--fa:"\\f484"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\\f581"}.fa-tooth{--fa:"\\f5c9"}.fa-v{--fa:"\\56"}.fa-bangladeshi-taka-sign{--fa:"\\e2e6"}.fa-bicycle{--fa:"\\f206"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\\e579"}.fa-head-side-cough-slash{--fa:"\\e062"}.fa-ambulance,.fa-truck-medical{--fa:"\\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\\e598"}.fa-snowman{--fa:"\\f7d0"}.fa-mortar-pestle{--fa:"\\f5a7"}.fa-road-barrier{--fa:"\\e562"}.fa-school{--fa:"\\f549"}.fa-igloo{--fa:"\\f7ae"}.fa-joint{--fa:"\\f595"}.fa-angle-right{--fa:"\\f105"}.fa-horse{--fa:"\\f6f0"}.fa-q{--fa:"\\51"}.fa-g{--fa:"\\47"}.fa-notes-medical{--fa:"\\f481"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\\f2c9"}.fa-dong-sign{--fa:"\\e169"}.fa-capsules{--fa:"\\f46b"}.fa-poo-bolt,.fa-poo-storm{--fa:"\\f75a"}.fa-face-frown-open,.fa-frown-open{--fa:"\\f57a"}.fa-hand-point-up{--fa:"\\f0a6"}.fa-money-bill{--fa:"\\f0d6"}.fa-bookmark{--fa:"\\f02e"}.fa-align-justify{--fa:"\\f039"}.fa-umbrella-beach{--fa:"\\f5ca"}.fa-helmet-un{--fa:"\\e503"}.fa-bullseye{--fa:"\\f140"}.fa-bacon{--fa:"\\f7e5"}.fa-hand-point-down{--fa:"\\f0a7"}.fa-arrow-up-from-bracket{--fa:"\\e09a"}.fa-folder,.fa-folder-blank{--fa:"\\f07b"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\\f478"}.fa-radiation{--fa:"\\f7b9"}.fa-chart-simple{--fa:"\\e473"}.fa-mars-stroke{--fa:"\\f229"}.fa-vial{--fa:"\\f492"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\\f624"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\\e2ca"}.fa-e{--fa:"\\45"}.fa-pen-alt,.fa-pen-clip{--fa:"\\f305"}.fa-bridge-circle-exclamation{--fa:"\\e4ca"}.fa-user{--fa:"\\f007"}.fa-school-circle-check{--fa:"\\e56b"}.fa-dumpster{--fa:"\\f793"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\\f5b6"}.fa-building-user{--fa:"\\e4da"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\\f191"}.fa-highlighter{--fa:"\\f591"}.fa-key{--fa:"\\f084"}.fa-bullhorn{--fa:"\\f0a1"}.fa-globe{--fa:"\\f0ac"}.fa-synagogue{--fa:"\\f69b"}.fa-person-half-dress{--fa:"\\e548"}.fa-road-bridge{--fa:"\\e563"}.fa-location-arrow{--fa:"\\f124"}.fa-c{--fa:"\\43"}.fa-tablet-button{--fa:"\\f10a"}.fa-building-lock{--fa:"\\e4d6"}.fa-pizza-slice{--fa:"\\f818"}.fa-money-bill-wave{--fa:"\\f53a"}.fa-area-chart,.fa-chart-area{--fa:"\\f1fe"}.fa-house-flag{--fa:"\\e50d"}.fa-person-circle-minus{--fa:"\\e540"}.fa-ban,.fa-cancel{--fa:"\\f05e"}.fa-camera-rotate{--fa:"\\e0d8"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\\f5d0"}.fa-star{--fa:"\\f005"}.fa-repeat{--fa:"\\f363"}.fa-cross{--fa:"\\f654"}.fa-box{--fa:"\\f466"}.fa-venus-mars{--fa:"\\f228"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\\f245"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\\f31e"}.fa-charging-station{--fa:"\\f5e7"}.fa-shapes,.fa-triangle-circle-square{--fa:"\\f61f"}.fa-random,.fa-shuffle{--fa:"\\f074"}.fa-person-running,.fa-running{--fa:"\\f70c"}.fa-mobile-retro{--fa:"\\e527"}.fa-grip-lines-vertical{--fa:"\\f7a5"}.fa-spider{--fa:"\\f717"}.fa-hands-bound{--fa:"\\e4f9"}.fa-file-invoice-dollar{--fa:"\\f571"}.fa-plane-circle-exclamation{--fa:"\\e556"}.fa-x-ray{--fa:"\\f497"}.fa-spell-check{--fa:"\\f891"}.fa-slash{--fa:"\\f715"}.fa-computer-mouse,.fa-mouse{--fa:"\\f8cc"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\\f090"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\\e070"}.fa-server{--fa:"\\f233"}.fa-virus-covid-slash{--fa:"\\e4a9"}.fa-shop-lock{--fa:"\\e4a5"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\\f251"}.fa-blender-phone{--fa:"\\f6b6"}.fa-building-wheat{--fa:"\\e4db"}.fa-person-breastfeeding{--fa:"\\e53a"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\\f2f6"}.fa-venus{--fa:"\\f221"}.fa-passport{--fa:"\\f5ab"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\\e68f"}.fa-heart-pulse,.fa-heartbeat{--fa:"\\f21e"}.fa-people-carry,.fa-people-carry-box{--fa:"\\f4ce"}.fa-temperature-high{--fa:"\\f769"}.fa-microchip{--fa:"\\f2db"}.fa-crown{--fa:"\\f521"}.fa-weight-hanging{--fa:"\\f5cd"}.fa-xmarks-lines{--fa:"\\e59a"}.fa-file-prescription{--fa:"\\f572"}.fa-weight,.fa-weight-scale{--fa:"\\f496"}.fa-user-friends,.fa-user-group{--fa:"\\f500"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\\f15e"}.fa-chess-knight{--fa:"\\f441"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\\f59b"}.fa-wheelchair{--fa:"\\f193"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\\f0aa"}.fa-toggle-on{--fa:"\\f205"}.fa-person-walking,.fa-walking{--fa:"\\f554"}.fa-l{--fa:"\\4c"}.fa-fire{--fa:"\\f06d"}.fa-bed-pulse,.fa-procedures{--fa:"\\f487"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\\f197"}.fa-face-laugh,.fa-laugh{--fa:"\\f599"}.fa-folder-open{--fa:"\\f07c"}.fa-heart-circle-plus{--fa:"\\e500"}.fa-code-fork{--fa:"\\e13b"}.fa-city{--fa:"\\f64f"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\\f3c9"}.fa-pepper-hot{--fa:"\\f816"}.fa-unlock{--fa:"\\f09c"}.fa-colon-sign{--fa:"\\e140"}.fa-headset{--fa:"\\f590"}.fa-store-slash{--fa:"\\e071"}.fa-road-circle-xmark{--fa:"\\e566"}.fa-user-minus{--fa:"\\f503"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\\f22a"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\\f79f"}.fa-clipboard{--fa:"\\f328"}.fa-house-circle-exclamation{--fa:"\\e50a"}.fa-file-arrow-up,.fa-file-upload{--fa:"\\f574"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\\f1eb"}.fa-bath,.fa-bathtub{--fa:"\\f2cd"}.fa-underline{--fa:"\\f0cd"}.fa-user-edit,.fa-user-pen{--fa:"\\f4ff"}.fa-signature{--fa:"\\f5b7"}.fa-stroopwafel{--fa:"\\f551"}.fa-bold{--fa:"\\f032"}.fa-anchor-lock{--fa:"\\e4ad"}.fa-building-ngo{--fa:"\\e4d7"}.fa-manat-sign{--fa:"\\e1d5"}.fa-not-equal{--fa:"\\f53e"}.fa-border-style,.fa-border-top-left{--fa:"\\f853"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\\f5a0"}.fa-jedi{--fa:"\\f669"}.fa-poll,.fa-square-poll-vertical{--fa:"\\f681"}.fa-mug-hot{--fa:"\\f7b6"}.fa-battery-car,.fa-car-battery{--fa:"\\f5df"}.fa-gift{--fa:"\\f06b"}.fa-dice-two{--fa:"\\f528"}.fa-chess-queen{--fa:"\\f445"}.fa-glasses{--fa:"\\f530"}.fa-chess-board{--fa:"\\f43c"}.fa-building-circle-check{--fa:"\\e4d2"}.fa-person-chalkboard{--fa:"\\e53d"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\\f22b"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\\f255"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\\f151"}.fa-cloud-showers-water{--fa:"\\e4e4"}.fa-bar-chart,.fa-chart-bar{--fa:"\\f080"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\\e05e"}.fa-less-than-equal{--fa:"\\f537"}.fa-train{--fa:"\\f238"}.fa-eye-low-vision,.fa-low-vision{--fa:"\\f2a8"}.fa-crow{--fa:"\\f520"}.fa-sailboat{--fa:"\\e445"}.fa-window-restore{--fa:"\\f2d2"}.fa-plus-square,.fa-square-plus{--fa:"\\f0fe"}.fa-torii-gate{--fa:"\\f6a1"}.fa-frog{--fa:"\\f52e"}.fa-bucket{--fa:"\\e4cf"}.fa-image{--fa:"\\f03e"}.fa-microphone{--fa:"\\f130"}.fa-cow{--fa:"\\f6c8"}.fa-caret-up{--fa:"\\f0d8"}.fa-screwdriver{--fa:"\\f54a"}.fa-folder-closed{--fa:"\\e185"}.fa-house-tsunami{--fa:"\\e515"}.fa-square-nfi{--fa:"\\e576"}.fa-arrow-up-from-ground-water{--fa:"\\e4b5"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\\f57b"}.fa-square-binary{--fa:"\\e69b"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\\f2ea"}.fa-columns,.fa-table-columns{--fa:"\\f0db"}.fa-lemon{--fa:"\\f094"}.fa-head-side-mask{--fa:"\\e063"}.fa-handshake{--fa:"\\f2b5"}.fa-gem{--fa:"\\f3a5"}.fa-dolly,.fa-dolly-box{--fa:"\\f472"}.fa-smoking{--fa:"\\f48d"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\\f78c"}.fa-monument{--fa:"\\f5a6"}.fa-snowplow{--fa:"\\f7d2"}.fa-angle-double-right,.fa-angles-right{--fa:"\\f101"}.fa-cannabis{--fa:"\\f55f"}.fa-circle-play,.fa-play-circle{--fa:"\\f144"}.fa-tablets{--fa:"\\f490"}.fa-ethernet{--fa:"\\f796"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\\f153"}.fa-chair{--fa:"\\f6c0"}.fa-check-circle,.fa-circle-check{--fa:"\\f058"}.fa-circle-stop,.fa-stop-circle{--fa:"\\f28d"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\\f568"}.fa-plate-wheat{--fa:"\\e55a"}.fa-icicles{--fa:"\\f7ad"}.fa-person-shelter{--fa:"\\e54f"}.fa-neuter{--fa:"\\f22c"}.fa-id-badge{--fa:"\\f2c1"}.fa-marker{--fa:"\\f5a1"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\\f59a"}.fa-helicopter-symbol{--fa:"\\e502"}.fa-universal-access{--fa:"\\f29a"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\\f139"}.fa-lari-sign{--fa:"\\e1c8"}.fa-volcano{--fa:"\\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\\e553"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\\f154"}.fa-viruses{--fa:"\\e076"}.fa-square-person-confined{--fa:"\\e577"}.fa-user-tie{--fa:"\\f508"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\\f175"}.fa-tent-arrow-down-to-line{--fa:"\\e57e"}.fa-certificate{--fa:"\\f0a3"}.fa-mail-reply-all,.fa-reply-all{--fa:"\\f122"}.fa-suitcase{--fa:"\\f0f2"}.fa-person-skating,.fa-skating{--fa:"\\f7c5"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\\f662"}.fa-camera-retro{--fa:"\\f083"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\\f0ab"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\\f56f"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\\f14c"}.fa-box-open{--fa:"\\f49e"}.fa-scroll{--fa:"\\f70e"}.fa-spa{--fa:"\\f5bb"}.fa-location-pin-lock{--fa:"\\e51f"}.fa-pause{--fa:"\\f04c"}.fa-hill-avalanche{--fa:"\\e507"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\\f2cb"}.fa-bomb{--fa:"\\f1e2"}.fa-registered{--fa:"\\f25d"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\\f2bb"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\\f516"}.fa-subscript{--fa:"\\f12c"}.fa-diamond-turn-right,.fa-directions{--fa:"\\f5eb"}.fa-burst{--fa:"\\e4dc"}.fa-house-laptop,.fa-laptop-house{--fa:"\\e066"}.fa-face-tired,.fa-tired{--fa:"\\f5c8"}.fa-money-bills{--fa:"\\e1f3"}.fa-smog{--fa:"\\f75f"}.fa-crutch{--fa:"\\f7f7"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\\f0ee"}.fa-palette{--fa:"\\f53f"}.fa-arrows-turn-right{--fa:"\\e4c0"}.fa-vest{--fa:"\\e085"}.fa-ferry{--fa:"\\e4ea"}.fa-arrows-down-to-people{--fa:"\\e4b9"}.fa-seedling,.fa-sprout{--fa:"\\f4d8"}.fa-arrows-alt-h,.fa-left-right{--fa:"\\f337"}.fa-boxes-packing{--fa:"\\e4c7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\\f0a8"}.fa-group-arrows-rotate{--fa:"\\e4f6"}.fa-bowl-food{--fa:"\\e4c6"}.fa-candy-cane{--fa:"\\f786"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\\f160"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\\f76c"}.fa-remove-format,.fa-text-slash{--fa:"\\f87d"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\\f4da"}.fa-file-word{--fa:"\\f1c2"}.fa-file-powerpoint{--fa:"\\f1c4"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\\f07e"}.fa-house-lock{--fa:"\\e510"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\\f0ed"}.fa-children{--fa:"\\e4e1"}.fa-blackboard,.fa-chalkboard{--fa:"\\f51b"}.fa-user-alt-slash,.fa-user-large-slash{--fa:"\\f4fa"}.fa-envelope-open{--fa:"\\f2b6"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:"\\e05f"}.fa-mattress-pillow{--fa:"\\e525"}.fa-guarani-sign{--fa:"\\e19a"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\\f021"}.fa-fire-extinguisher{--fa:"\\f134"}.fa-cruzeiro-sign{--fa:"\\e152"}.fa-greater-than-equal{--fa:"\\f532"}.fa-shield-alt,.fa-shield-halved{--fa:"\\f3ed"}.fa-atlas,.fa-book-atlas{--fa:"\\f558"}.fa-virus{--fa:"\\e074"}.fa-envelope-circle-check{--fa:"\\e4e8"}.fa-layer-group{--fa:"\\f5fd"}.fa-arrows-to-dot{--fa:"\\e4be"}.fa-archway{--fa:"\\f557"}.fa-heart-circle-check{--fa:"\\e4fd"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\\f6f1"}.fa-file-archive,.fa-file-zipper{--fa:"\\f1c6"}.fa-square{--fa:"\\f0c8"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\\f000"}.fa-couch{--fa:"\\f4b8"}.fa-cedi-sign{--fa:"\\e0df"}.fa-italic{--fa:"\\f033"}.fa-table-cells-column-lock{--fa:"\\e678"}.fa-church{--fa:"\\f51d"}.fa-comments-dollar{--fa:"\\f653"}.fa-democrat{--fa:"\\f747"}.fa-z{--fa:"\\5a"}.fa-person-skiing,.fa-skiing{--fa:"\\f7c9"}.fa-road-lock{--fa:"\\e567"}.fa-a{--fa:"\\41"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\\e03f"}.fa-feather-alt,.fa-feather-pointed{--fa:"\\f56b"}.fa-p{--fa:"\\50"}.fa-snowflake{--fa:"\\f2dc"}.fa-newspaper{--fa:"\\f1ea"}.fa-ad,.fa-rectangle-ad{--fa:"\\f641"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\\f0a9"}.fa-filter-circle-xmark{--fa:"\\e17b"}.fa-locust{--fa:"\\e520"}.fa-sort,.fa-unsorted{--fa:"\\f0dc"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\\f0cb"}.fa-person-dress-burst{--fa:"\\e544"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\\f53d"}.fa-vector-square{--fa:"\\f5cb"}.fa-bread-slice{--fa:"\\f7ec"}.fa-language{--fa:"\\f1ab"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\\f598"}.fa-filter{--fa:"\\f0b0"}.fa-question{--fa:"\\3f"}.fa-file-signature{--fa:"\\f573"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\\f0b2"}.fa-house-chimney-user{--fa:"\\e065"}.fa-hand-holding-heart{--fa:"\\f4be"}.fa-puzzle-piece{--fa:"\\f12e"}.fa-money-check{--fa:"\\f53c"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\\f5c0"}.fa-code{--fa:"\\f121"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\\f7a0"}.fa-building-circle-exclamation{--fa:"\\e4d3"}.fa-magnifying-glass-chart{--fa:"\\e522"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\\f08e"}.fa-cubes-stacked{--fa:"\\e4e6"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\\f159"}.fa-virus-covid{--fa:"\\e4a8"}.fa-austral-sign{--fa:"\\e0a9"}.fa-f{--fa:"\\46"}.fa-leaf{--fa:"\\f06c"}.fa-road{--fa:"\\f018"}.fa-cab,.fa-taxi{--fa:"\\f1ba"}.fa-person-circle-plus{--fa:"\\e541"}.fa-chart-pie,.fa-pie-chart{--fa:"\\f200"}.fa-bolt-lightning{--fa:"\\e0b7"}.fa-sack-xmark{--fa:"\\e56a"}.fa-file-excel{--fa:"\\f1c3"}.fa-file-contract{--fa:"\\f56c"}.fa-fish-fins{--fa:"\\e4f2"}.fa-building-flag{--fa:"\\e4d5"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\\f582"}.fa-object-ungroup{--fa:"\\f248"}.fa-poop{--fa:"\\f619"}.fa-location-pin,.fa-map-marker{--fa:"\\f041"}.fa-kaaba{--fa:"\\f66b"}.fa-toilet-paper{--fa:"\\f71e"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\\f807"}.fa-eject{--fa:"\\f052"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\\f35a"}.fa-plane-circle-check{--fa:"\\e555"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\\f5a5"}.fa-object-group{--fa:"\\f247"}.fa-chart-line,.fa-line-chart{--fa:"\\f201"}.fa-mask-ventilator{--fa:"\\e524"}.fa-arrow-right{--fa:"\\f061"}.fa-map-signs,.fa-signs-post{--fa:"\\f277"}.fa-cash-register{--fa:"\\f788"}.fa-person-circle-question{--fa:"\\e542"}.fa-h{--fa:"\\48"}.fa-tarp{--fa:"\\e57b"}.fa-screwdriver-wrench,.fa-tools{--fa:"\\f7d9"}.fa-arrows-to-eye{--fa:"\\e4bf"}.fa-plug-circle-bolt{--fa:"\\e55b"}.fa-heart{--fa:"\\f004"}.fa-mars-and-venus{--fa:"\\f224"}.fa-home-user,.fa-house-user{--fa:"\\e1b0"}.fa-dumpster-fire{--fa:"\\f794"}.fa-house-crack{--fa:"\\e3b1"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\\f561"}.fa-face-surprise,.fa-surprise{--fa:"\\f5c2"}.fa-bottle-water{--fa:"\\e4c5"}.fa-circle-pause,.fa-pause-circle{--fa:"\\f28b"}.fa-toilet-paper-slash{--fa:"\\e072"}.fa-apple-alt,.fa-apple-whole{--fa:"\\f5d1"}.fa-kitchen-set{--fa:"\\e51a"}.fa-r{--fa:"\\52"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\\f2ca"}.fa-cube{--fa:"\\f1b2"}.fa-bitcoin-sign{--fa:"\\e0b4"}.fa-shield-dog{--fa:"\\e573"}.fa-solar-panel{--fa:"\\f5ba"}.fa-lock-open{--fa:"\\f3c1"}.fa-elevator{--fa:"\\e16d"}.fa-money-bill-transfer{--fa:"\\e528"}.fa-money-bill-trend-up{--fa:"\\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\\e50f"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\\f682"}.fa-circle{--fa:"\\f111"}.fa-backward-fast,.fa-fast-backward{--fa:"\\f049"}.fa-recycle{--fa:"\\f1b8"}.fa-user-astronaut{--fa:"\\f4fb"}.fa-plane-slash{--fa:"\\e069"}.fa-trademark{--fa:"\\f25c"}.fa-basketball,.fa-basketball-ball{--fa:"\\f434"}.fa-satellite-dish{--fa:"\\f7c0"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\\f35b"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\\f3cd"}.fa-volume-high,.fa-volume-up{--fa:"\\f028"}.fa-users-rays{--fa:"\\e593"}.fa-wallet{--fa:"\\f555"}.fa-clipboard-check{--fa:"\\f46c"}.fa-file-audio{--fa:"\\f1c7"}.fa-burger,.fa-hamburger{--fa:"\\f805"}.fa-wrench{--fa:"\\f0ad"}.fa-bugs{--fa:"\\e4d0"}.fa-rupee,.fa-rupee-sign{--fa:"\\f156"}.fa-file-image{--fa:"\\f1c5"}.fa-circle-question,.fa-question-circle{--fa:"\\f059"}.fa-plane-departure{--fa:"\\f5b0"}.fa-handshake-slash{--fa:"\\e060"}.fa-book-bookmark{--fa:"\\e0bb"}.fa-code-branch{--fa:"\\f126"}.fa-hat-cowboy{--fa:"\\f8c0"}.fa-bridge{--fa:"\\e4c8"}.fa-phone-alt,.fa-phone-flip{--fa:"\\f879"}.fa-truck-front{--fa:"\\e2b7"}.fa-cat{--fa:"\\f6be"}.fa-anchor-circle-exclamation{--fa:"\\e4ab"}.fa-truck-field{--fa:"\\e58d"}.fa-route{--fa:"\\f4d7"}.fa-clipboard-question{--fa:"\\e4e3"}.fa-panorama{--fa:"\\e209"}.fa-comment-medical{--fa:"\\f7f5"}.fa-teeth-open{--fa:"\\f62f"}.fa-file-circle-minus{--fa:"\\e4ed"}.fa-tags{--fa:"\\f02c"}.fa-wine-glass{--fa:"\\f4e3"}.fa-fast-forward,.fa-forward-fast{--fa:"\\f050"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\\f5a4"}.fa-parking,.fa-square-parking{--fa:"\\f540"}.fa-house-signal{--fa:"\\e012"}.fa-bars-progress,.fa-tasks-alt{--fa:"\\f828"}.fa-faucet-drip{--fa:"\\e006"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\\f474"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\\f54d"}.fa-terminal{--fa:"\\f120"}.fa-mobile-button{--fa:"\\f10b"}.fa-house-medical-flag{--fa:"\\e514"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\\f291"}.fa-tape{--fa:"\\f4db"}.fa-bus-alt,.fa-bus-simple{--fa:"\\f55e"}.fa-eye{--fa:"\\f06e"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\\f5b3"}.fa-audio-description{--fa:"\\f29e"}.fa-person-military-to-person{--fa:"\\e54c"}.fa-file-shield{--fa:"\\e4f0"}.fa-user-slash{--fa:"\\f506"}.fa-pen{--fa:"\\f304"}.fa-tower-observation{--fa:"\\e586"}.fa-file-code{--fa:"\\f1c9"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\\f012"}.fa-bus{--fa:"\\f207"}.fa-heart-circle-xmark{--fa:"\\e501"}.fa-home-lg,.fa-house-chimney{--fa:"\\e3af"}.fa-window-maximize{--fa:"\\f2d0"}.fa-face-frown,.fa-frown{--fa:"\\f119"}.fa-prescription{--fa:"\\f5b1"}.fa-shop,.fa-store-alt{--fa:"\\f54f"}.fa-floppy-disk,.fa-save{--fa:"\\f0c7"}.fa-vihara{--fa:"\\f6a7"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\\f515"}.fa-sort-asc,.fa-sort-up{--fa:"\\f0de"}.fa-comment-dots,.fa-commenting{--fa:"\\f4ad"}.fa-plant-wilt{--fa:"\\e5aa"}.fa-diamond{--fa:"\\f219"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\\f585"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\\f4c0"}.fa-chart-diagram{--fa:"\\e695"}.fa-bacterium{--fa:"\\e05a"}.fa-hand-pointer{--fa:"\\f25a"}.fa-drum-steelpan{--fa:"\\f56a"}.fa-hand-scissors{--fa:"\\f257"}.fa-hands-praying,.fa-praying-hands{--fa:"\\f684"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\\f01e"}.fa-biohazard{--fa:"\\f780"}.fa-location,.fa-location-crosshairs{--fa:"\\f601"}.fa-mars-double{--fa:"\\f227"}.fa-child-dress{--fa:"\\e59c"}.fa-users-between-lines{--fa:"\\e591"}.fa-lungs-virus{--fa:"\\e067"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\\f588"}.fa-phone{--fa:"\\f095"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\\f273"}.fa-child-reaching{--fa:"\\e59d"}.fa-head-side-virus{--fa:"\\e064"}.fa-user-cog,.fa-user-gear{--fa:"\\f4fe"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\\f163"}.fa-door-closed{--fa:"\\f52a"}.fa-shield-virus{--fa:"\\e06c"}.fa-dice-six{--fa:"\\f526"}.fa-mosquito-net{--fa:"\\e52c"}.fa-file-fragment{--fa:"\\e697"}.fa-bridge-water{--fa:"\\e4ce"}.fa-person-booth{--fa:"\\f756"}.fa-text-width{--fa:"\\f035"}.fa-hat-wizard{--fa:"\\f6e8"}.fa-pen-fancy{--fa:"\\f5ac"}.fa-digging,.fa-person-digging{--fa:"\\f85e"}.fa-trash{--fa:"\\f1f8"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\\f629"}.fa-book-medical{--fa:"\\f7e6"}.fa-poo{--fa:"\\f2fe"}.fa-quote-right,.fa-quote-right-alt{--fa:"\\f10e"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\\f553"}.fa-cubes{--fa:"\\f1b3"}.fa-divide{--fa:"\\f529"}.fa-tenge,.fa-tenge-sign{--fa:"\\f7d7"}.fa-headphones{--fa:"\\f025"}.fa-hands-holding{--fa:"\\f4c2"}.fa-hands-clapping{--fa:"\\e1a8"}.fa-republican{--fa:"\\f75e"}.fa-arrow-left{--fa:"\\f060"}.fa-person-circle-xmark{--fa:"\\e543"}.fa-ruler{--fa:"\\f545"}.fa-align-left{--fa:"\\f036"}.fa-dice-d6{--fa:"\\f6d1"}.fa-restroom{--fa:"\\f7bd"}.fa-j{--fa:"\\4a"}.fa-users-viewfinder{--fa:"\\e595"}.fa-file-video{--fa:"\\f1c8"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\\f35d"}.fa-table-cells,.fa-th{--fa:"\\f00a"}.fa-file-pdf{--fa:"\\f1c1"}.fa-bible,.fa-book-bible{--fa:"\\f647"}.fa-o{--fa:"\\4f"}.fa-medkit,.fa-suitcase-medical{--fa:"\\f0fa"}.fa-user-secret{--fa:"\\f21b"}.fa-otter{--fa:"\\f700"}.fa-female,.fa-person-dress{--fa:"\\f182"}.fa-comment-dollar{--fa:"\\f651"}.fa-briefcase-clock,.fa-business-time{--fa:"\\f64a"}.fa-table-cells-large,.fa-th-large{--fa:"\\f009"}.fa-book-tanakh,.fa-tanakh{--fa:"\\f827"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\\f2a0"}.fa-hat-cowboy-side{--fa:"\\f8c1"}.fa-clipboard-user{--fa:"\\f7f3"}.fa-child{--fa:"\\f1ae"}.fa-lira-sign{--fa:"\\f195"}.fa-satellite{--fa:"\\f7bf"}.fa-plane-lock{--fa:"\\e558"}.fa-tag{--fa:"\\f02b"}.fa-comment{--fa:"\\f075"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\\f1fd"}.fa-envelope{--fa:"\\f0e0"}.fa-angle-double-up,.fa-angles-up{--fa:"\\f102"}.fa-paperclip{--fa:"\\f0c6"}.fa-arrow-right-to-city{--fa:"\\e4b3"}.fa-ribbon{--fa:"\\f4d6"}.fa-lungs{--fa:"\\f604"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\\f887"}.fa-litecoin-sign{--fa:"\\e1d3"}.fa-border-none{--fa:"\\f850"}.fa-circle-nodes{--fa:"\\e4e2"}.fa-parachute-box{--fa:"\\f4cd"}.fa-indent{--fa:"\\f03c"}.fa-truck-field-un{--fa:"\\e58e"}.fa-hourglass,.fa-hourglass-empty{--fa:"\\f254"}.fa-mountain{--fa:"\\f6fc"}.fa-user-doctor,.fa-user-md{--fa:"\\f0f0"}.fa-circle-info,.fa-info-circle{--fa:"\\f05a"}.fa-cloud-meatball{--fa:"\\f73b"}.fa-camera,.fa-camera-alt{--fa:"\\f030"}.fa-square-virus{--fa:"\\e578"}.fa-meteor{--fa:"\\f753"}.fa-car-on{--fa:"\\e4dd"}.fa-sleigh{--fa:"\\f7cc"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\\f162"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\\f4c1"}.fa-water{--fa:"\\f773"}.fa-calendar-check{--fa:"\\f274"}.fa-braille{--fa:"\\f2a1"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\\f486"}.fa-landmark{--fa:"\\f66f"}.fa-truck{--fa:"\\f0d1"}.fa-crosshairs{--fa:"\\f05b"}.fa-person-cane{--fa:"\\e53c"}.fa-tent{--fa:"\\e57d"}.fa-vest-patches{--fa:"\\e086"}.fa-check-double{--fa:"\\f560"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\\f15d"}.fa-money-bill-wheat{--fa:"\\e52a"}.fa-cookie{--fa:"\\f563"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\\f0e2"}.fa-hard-drive,.fa-hdd{--fa:"\\f0a0"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\\f586"}.fa-dumbbell{--fa:"\\f44b"}.fa-list-alt,.fa-rectangle-list{--fa:"\\f022"}.fa-tarp-droplet{--fa:"\\e57c"}.fa-house-medical-circle-check{--fa:"\\e511"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\\f7ca"}.fa-calendar-plus{--fa:"\\f271"}.fa-plane-arrival{--fa:"\\f5af"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\\f359"}.fa-subway,.fa-train-subway{--fa:"\\f239"}.fa-chart-gantt{--fa:"\\e0e4"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\\e1bc"}.fa-crop-alt,.fa-crop-simple{--fa:"\\f565"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\\f3d1"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\\f30a"}.fa-dna{--fa:"\\f471"}.fa-virus-slash{--fa:"\\e075"}.fa-minus,.fa-subtract{--fa:"\\f068"}.fa-chess{--fa:"\\f439"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\\f177"}.fa-plug-circle-check{--fa:"\\e55c"}.fa-street-view{--fa:"\\f21d"}.fa-franc-sign{--fa:"\\e18f"}.fa-volume-off{--fa:"\\f026"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\\f2a3"}.fa-cog,.fa-gear{--fa:"\\f013"}.fa-droplet-slash,.fa-tint-slash{--fa:"\\f5c7"}.fa-mosque{--fa:"\\f678"}.fa-mosquito{--fa:"\\e52b"}.fa-star-of-david{--fa:"\\f69a"}.fa-person-military-rifle{--fa:"\\e54b"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\\f07a"}.fa-vials{--fa:"\\f493"}.fa-plug-circle-plus{--fa:"\\e55f"}.fa-place-of-worship{--fa:"\\f67f"}.fa-grip-vertical{--fa:"\\f58e"}.fa-hexagon-nodes{--fa:"\\e699"}.fa-arrow-turn-up,.fa-level-up{--fa:"\\f148"}.fa-u{--fa:"\\55"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\\f698"}.fa-clock,.fa-clock-four{--fa:"\\f017"}.fa-backward-step,.fa-step-backward{--fa:"\\f048"}.fa-pallet{--fa:"\\f482"}.fa-faucet{--fa:"\\e005"}.fa-baseball-bat-ball{--fa:"\\f432"}.fa-s{--fa:"\\53"}.fa-timeline{--fa:"\\e29c"}.fa-keyboard{--fa:"\\f11c"}.fa-caret-down{--fa:"\\f0d7"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\\f7f2"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\\f2c8"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\\f3cf"}.fa-plane-up{--fa:"\\e22d"}.fa-piggy-bank{--fa:"\\f4d3"}.fa-battery-3,.fa-battery-half{--fa:"\\f242"}.fa-mountain-city{--fa:"\\e52e"}.fa-coins{--fa:"\\f51e"}.fa-khanda{--fa:"\\f66d"}.fa-sliders,.fa-sliders-h{--fa:"\\f1de"}.fa-folder-tree{--fa:"\\f802"}.fa-network-wired{--fa:"\\f6ff"}.fa-map-pin{--fa:"\\f276"}.fa-hamsa{--fa:"\\f665"}.fa-cent-sign{--fa:"\\e3f5"}.fa-flask{--fa:"\\f0c3"}.fa-person-pregnant{--fa:"\\e31e"}.fa-wand-sparkles{--fa:"\\f72b"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\\f142"}.fa-ticket{--fa:"\\f145"}.fa-power-off{--fa:"\\f011"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\\f30b"}.fa-flag-usa{--fa:"\\f74d"}.fa-laptop-file{--fa:"\\e51d"}.fa-teletype,.fa-tty{--fa:"\\f1e4"}.fa-diagram-next{--fa:"\\e476"}.fa-person-rifle{--fa:"\\e54e"}.fa-house-medical-circle-exclamation{--fa:"\\e512"}.fa-closed-captioning{--fa:"\\f20a"}.fa-hiking,.fa-person-hiking{--fa:"\\f6ec"}.fa-venus-double{--fa:"\\f226"}.fa-images{--fa:"\\f302"}.fa-calculator{--fa:"\\f1ec"}.fa-people-pulling{--fa:"\\e535"}.fa-n{--fa:"\\4e"}.fa-cable-car,.fa-tram{--fa:"\\f7da"}.fa-cloud-rain{--fa:"\\f73d"}.fa-building-circle-xmark{--fa:"\\e4d4"}.fa-ship{--fa:"\\f21a"}.fa-arrows-down-to-line{--fa:"\\e4b8"}.fa-download{--fa:"\\f019"}.fa-face-grin,.fa-grin{--fa:"\\f580"}.fa-backspace,.fa-delete-left{--fa:"\\f55a"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\\f1fb"}.fa-file-circle-check{--fa:"\\e5a0"}.fa-forward{--fa:"\\f04e"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\\f3ce"}.fa-face-meh,.fa-meh{--fa:"\\f11a"}.fa-align-center{--fa:"\\f037"}.fa-book-dead,.fa-book-skull{--fa:"\\f6b7"}.fa-drivers-license,.fa-id-card{--fa:"\\f2c2"}.fa-dedent,.fa-outdent{--fa:"\\f03b"}.fa-heart-circle-exclamation{--fa:"\\e4fe"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\\f015"}.fa-calendar-week{--fa:"\\f784"}.fa-laptop-medical{--fa:"\\f812"}.fa-b{--fa:"\\42"}.fa-file-medical{--fa:"\\f477"}.fa-dice-one{--fa:"\\f525"}.fa-kiwi-bird{--fa:"\\f535"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\\f0ec"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\\f2f9"}.fa-cutlery,.fa-utensils{--fa:"\\f2e7"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\\f161"}.fa-mill-sign{--fa:"\\e1ed"}.fa-bowl-rice{--fa:"\\e2eb"}.fa-skull{--fa:"\\f54c"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\\f519"}.fa-truck-pickup{--fa:"\\f63c"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\\f30c"}.fa-stop{--fa:"\\f04d"}.fa-code-merge{--fa:"\\f387"}.fa-upload{--fa:"\\f093"}.fa-hurricane{--fa:"\\f751"}.fa-mound{--fa:"\\e52d"}.fa-toilet-portable{--fa:"\\e583"}.fa-compact-disc{--fa:"\\f51f"}.fa-file-arrow-down,.fa-file-download{--fa:"\\f56d"}.fa-caravan{--fa:"\\f8ff"}.fa-shield-cat{--fa:"\\e572"}.fa-bolt,.fa-zap{--fa:"\\f0e7"}.fa-glass-water{--fa:"\\e4f4"}.fa-oil-well{--fa:"\\e532"}.fa-vault{--fa:"\\e2c5"}.fa-mars{--fa:"\\f222"}.fa-toilet{--fa:"\\f7d8"}.fa-plane-circle-xmark{--fa:"\\e557"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\\f158"}.fa-sun{--fa:"\\f185"}.fa-guitar{--fa:"\\f7a6"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\\f59c"}.fa-horse-head{--fa:"\\f7ab"}.fa-bore-hole{--fa:"\\e4c3"}.fa-industry{--fa:"\\f275"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\\f358"}.fa-arrows-turn-to-dots{--fa:"\\e4c1"}.fa-florin-sign{--fa:"\\e184"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\\f884"}.fa-less-than{--fa:"\\3c"}.fa-angle-down{--fa:"\\f107"}.fa-car-tunnel{--fa:"\\e4de"}.fa-head-side-cough{--fa:"\\e061"}.fa-grip-lines{--fa:"\\f7a4"}.fa-thumbs-down{--fa:"\\f165"}.fa-user-lock{--fa:"\\f502"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\\f178"}.fa-anchor-circle-xmark{--fa:"\\e4ac"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\\f141"}.fa-chess-pawn{--fa:"\\f443"}.fa-first-aid,.fa-kit-medical{--fa:"\\f479"}.fa-person-through-window{--fa:"\\e5a9"}.fa-toolbox{--fa:"\\f552"}.fa-hands-holding-circle{--fa:"\\e4fb"}.fa-bug{--fa:"\\f188"}.fa-credit-card,.fa-credit-card-alt{--fa:"\\f09d"}.fa-automobile,.fa-car{--fa:"\\f1b9"}.fa-hand-holding-hand{--fa:"\\e4f7"}.fa-book-open-reader,.fa-book-reader{--fa:"\\f5da"}.fa-mountain-sun{--fa:"\\e52f"}.fa-arrows-left-right-to-line{--fa:"\\e4ba"}.fa-dice-d20{--fa:"\\f6cf"}.fa-truck-droplet{--fa:"\\e58c"}.fa-file-circle-xmark{--fa:"\\e5a1"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\\e040"}.fa-medal{--fa:"\\f5a2"}.fa-bed{--fa:"\\f236"}.fa-h-square,.fa-square-h{--fa:"\\f0fd"}.fa-podcast{--fa:"\\f2ce"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\\f2c7"}.fa-bell{--fa:"\\f0f3"}.fa-superscript{--fa:"\\f12b"}.fa-plug-circle-xmark{--fa:"\\e560"}.fa-star-of-life{--fa:"\\f621"}.fa-phone-slash{--fa:"\\f3dd"}.fa-paint-roller{--fa:"\\f5aa"}.fa-hands-helping,.fa-handshake-angle{--fa:"\\f4c4"}.fa-location-dot,.fa-map-marker-alt{--fa:"\\f3c5"}.fa-file{--fa:"\\f15b"}.fa-greater-than{--fa:"\\3e"}.fa-person-swimming,.fa-swimmer{--fa:"\\f5c4"}.fa-arrow-down{--fa:"\\f063"}.fa-droplet,.fa-tint{--fa:"\\f043"}.fa-eraser{--fa:"\\f12d"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\\f57d"}.fa-person-burst{--fa:"\\e53b"}.fa-dove{--fa:"\\f4ba"}.fa-battery-0,.fa-battery-empty{--fa:"\\f244"}.fa-socks{--fa:"\\f696"}.fa-inbox{--fa:"\\f01c"}.fa-section{--fa:"\\e447"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\\f625"}.fa-envelope-open-text{--fa:"\\f658"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\\f0f8"}.fa-wine-bottle{--fa:"\\f72f"}.fa-chess-rook{--fa:"\\f447"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\\f550"}.fa-dharmachakra{--fa:"\\f655"}.fa-hotdog{--fa:"\\f80f"}.fa-blind,.fa-person-walking-with-cane{--fa:"\\f29d"}.fa-drum{--fa:"\\f569"}.fa-ice-cream{--fa:"\\f810"}.fa-heart-circle-bolt{--fa:"\\e4fc"}.fa-fax{--fa:"\\f1ac"}.fa-paragraph{--fa:"\\f1dd"}.fa-check-to-slot,.fa-vote-yea{--fa:"\\f772"}.fa-star-half{--fa:"\\f089"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\\f468"}.fa-chain,.fa-link{--fa:"\\f0c1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\\f2a2"}.fa-tree-city{--fa:"\\e587"}.fa-play{--fa:"\\f04b"}.fa-font{--fa:"\\f031"}.fa-table-cells-row-lock{--fa:"\\e67a"}.fa-rupiah-sign{--fa:"\\e23d"}.fa-magnifying-glass,.fa-search{--fa:"\\f002"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\\f45d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\\f470"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\\f82a"}.fa-naira-sign{--fa:"\\e1f6"}.fa-cart-arrow-down{--fa:"\\f218"}.fa-walkie-talkie{--fa:"\\f8ef"}.fa-file-edit,.fa-file-pen{--fa:"\\f31c"}.fa-receipt{--fa:"\\f543"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\\f14b"}.fa-suitcase-rolling{--fa:"\\f5c1"}.fa-person-circle-exclamation{--fa:"\\e53f"}.fa-chevron-down{--fa:"\\f078"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\\f240"}.fa-skull-crossbones{--fa:"\\f714"}.fa-code-compare{--fa:"\\e13a"}.fa-list-dots,.fa-list-ul{--fa:"\\f0ca"}.fa-school-lock{--fa:"\\e56f"}.fa-tower-cell{--fa:"\\e585"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\\f309"}.fa-ranking-star{--fa:"\\e561"}.fa-chess-king{--fa:"\\f43f"}.fa-person-harassing{--fa:"\\e549"}.fa-brazilian-real-sign{--fa:"\\e46c"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\\f752"}.fa-arrow-up{--fa:"\\f062"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\\f26c"}.fa-shrimp{--fa:"\\e448"}.fa-list-check,.fa-tasks{--fa:"\\f0ae"}.fa-jug-detergent{--fa:"\\e519"}.fa-circle-user,.fa-user-circle{--fa:"\\f2bd"}.fa-user-shield{--fa:"\\f505"}.fa-wind{--fa:"\\f72e"}.fa-car-burst,.fa-car-crash{--fa:"\\f5e1"}.fa-y{--fa:"\\59"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\\f7ce"}.fa-shipping-fast,.fa-truck-fast{--fa:"\\f48b"}.fa-fish{--fa:"\\f578"}.fa-user-graduate{--fa:"\\f501"}.fa-adjust,.fa-circle-half-stroke{--fa:"\\f042"}.fa-clapperboard{--fa:"\\e131"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\\f7ba"}.fa-baseball,.fa-baseball-ball{--fa:"\\f433"}.fa-jet-fighter-up{--fa:"\\e518"}.fa-diagram-project,.fa-project-diagram{--fa:"\\f542"}.fa-copy{--fa:"\\f0c5"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\\f6a9"}.fa-hand-sparkles{--fa:"\\e05d"}.fa-grip,.fa-grip-horizontal{--fa:"\\f58d"}.fa-share-from-square,.fa-share-square{--fa:"\\f14d"}.fa-child-combatant,.fa-child-rifle{--fa:"\\e4e0"}.fa-gun{--fa:"\\e19b"}.fa-phone-square,.fa-square-phone{--fa:"\\f098"}.fa-add,.fa-plus{--fa:"\\2b"}.fa-expand{--fa:"\\f065"}.fa-computer{--fa:"\\e4e5"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\\f00d"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\\f047"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\\f51c"}.fa-peso-sign{--fa:"\\e222"}.fa-building-shield{--fa:"\\e4d8"}.fa-baby{--fa:"\\f77c"}.fa-users-line{--fa:"\\e592"}.fa-quote-left,.fa-quote-left-alt{--fa:"\\f10d"}.fa-tractor{--fa:"\\f722"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\\f829"}.fa-arrow-down-up-lock{--fa:"\\e4b0"}.fa-lines-leaning{--fa:"\\e51e"}.fa-ruler-combined{--fa:"\\f546"}.fa-copyright{--fa:"\\f1f9"}.fa-equals{--fa:"\\3d"}.fa-blender{--fa:"\\f517"}.fa-teeth{--fa:"\\f62e"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\\f20b"}.fa-map{--fa:"\\f279"}.fa-rocket{--fa:"\\f135"}.fa-photo-film,.fa-photo-video{--fa:"\\f87c"}.fa-folder-minus{--fa:"\\f65d"}.fa-hexagon-nodes-bolt{--fa:"\\e69a"}.fa-store{--fa:"\\f54e"}.fa-arrow-trend-up{--fa:"\\e098"}.fa-plug-circle-minus{--fa:"\\e55e"}.fa-sign,.fa-sign-hanging{--fa:"\\f4d9"}.fa-bezier-curve{--fa:"\\f55b"}.fa-bell-slash{--fa:"\\f1f6"}.fa-tablet,.fa-tablet-android{--fa:"\\f3fb"}.fa-school-flag{--fa:"\\e56e"}.fa-fill{--fa:"\\f575"}.fa-angle-up{--fa:"\\f106"}.fa-drumstick-bite{--fa:"\\f6d7"}.fa-holly-berry{--fa:"\\f7aa"}.fa-chevron-left{--fa:"\\f053"}.fa-bacteria{--fa:"\\e059"}.fa-hand-lizard{--fa:"\\f258"}.fa-notdef{--fa:"\\e1fe"}.fa-disease{--fa:"\\f7fa"}.fa-briefcase-medical{--fa:"\\f469"}.fa-genderless{--fa:"\\f22d"}.fa-chevron-right{--fa:"\\f054"}.fa-retweet{--fa:"\\f079"}.fa-car-alt,.fa-car-rear{--fa:"\\f5de"}.fa-pump-soap{--fa:"\\e06b"}.fa-video-slash{--fa:"\\f4e2"}.fa-battery-2,.fa-battery-quarter{--fa:"\\f243"}.fa-radio{--fa:"\\f8d7"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\\f77d"}.fa-traffic-light{--fa:"\\f637"}.fa-thermometer{--fa:"\\f491"}.fa-vr-cardboard{--fa:"\\f729"}.fa-hand-middle-finger{--fa:"\\f806"}.fa-percent,.fa-percentage{--fa:"\\25"}.fa-truck-moving{--fa:"\\f4df"}.fa-glass-water-droplet{--fa:"\\e4f5"}.fa-display{--fa:"\\e163"}.fa-face-smile,.fa-smile{--fa:"\\f118"}.fa-thumb-tack,.fa-thumbtack{--fa:"\\f08d"}.fa-trophy{--fa:"\\f091"}.fa-person-praying,.fa-pray{--fa:"\\f683"}.fa-hammer{--fa:"\\f6e3"}.fa-hand-peace{--fa:"\\f25b"}.fa-rotate,.fa-sync-alt{--fa:"\\f2f1"}.fa-spinner{--fa:"\\f110"}.fa-robot{--fa:"\\f544"}.fa-peace{--fa:"\\f67c"}.fa-cogs,.fa-gears{--fa:"\\f085"}.fa-warehouse{--fa:"\\f494"}.fa-arrow-up-right-dots{--fa:"\\e4b7"}.fa-splotch{--fa:"\\f5bc"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\\f584"}.fa-dice-four{--fa:"\\f524"}.fa-sim-card{--fa:"\\f7c4"}.fa-transgender,.fa-transgender-alt{--fa:"\\f225"}.fa-mercury{--fa:"\\f223"}.fa-arrow-turn-down,.fa-level-down{--fa:"\\f149"}.fa-person-falling-burst{--fa:"\\e547"}.fa-award{--fa:"\\f559"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\\f3ff"}.fa-building{--fa:"\\f1ad"}.fa-angle-double-left,.fa-angles-left{--fa:"\\f100"}.fa-qrcode{--fa:"\\f029"}.fa-clock-rotate-left,.fa-history{--fa:"\\f1da"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\\f583"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\\f56e"}.fa-shield,.fa-shield-blank{--fa:"\\f132"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\\f885"}.fa-comment-nodes{--fa:"\\e696"}.fa-house-medical{--fa:"\\e3b2"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\\f450"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\\f137"}.fa-house-chimney-window{--fa:"\\e00d"}.fa-pen-nib{--fa:"\\f5ad"}.fa-tent-arrow-turn-left{--fa:"\\e580"}.fa-tents{--fa:"\\e582"}.fa-magic,.fa-wand-magic{--fa:"\\f0d0"}.fa-dog{--fa:"\\f6d3"}.fa-carrot{--fa:"\\f787"}.fa-moon{--fa:"\\f186"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\\f5ce"}.fa-cheese{--fa:"\\f7ef"}.fa-yin-yang{--fa:"\\f6ad"}.fa-music{--fa:"\\f001"}.fa-code-commit{--fa:"\\f386"}.fa-temperature-low{--fa:"\\f76b"}.fa-biking,.fa-person-biking{--fa:"\\f84a"}.fa-broom{--fa:"\\f51a"}.fa-shield-heart{--fa:"\\e574"}.fa-gopuram{--fa:"\\f664"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\\e47b"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\\f2d3"}.fa-hashtag{--fa:"\\23"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\\f424"}.fa-oil-can{--fa:"\\f613"}.fa-t{--fa:"\\54"}.fa-hippo{--fa:"\\f6ed"}.fa-chart-column{--fa:"\\e0e3"}.fa-infinity{--fa:"\\f534"}.fa-vial-circle-check{--fa:"\\e596"}.fa-person-arrow-down-to-line{--fa:"\\e538"}.fa-voicemail{--fa:"\\f897"}.fa-fan{--fa:"\\f863"}.fa-person-walking-luggage{--fa:"\\e554"}.fa-arrows-alt-v,.fa-up-down{--fa:"\\f338"}.fa-cloud-moon-rain{--fa:"\\f73c"}.fa-calendar{--fa:"\\f133"}.fa-trailer{--fa:"\\e041"}.fa-bahai,.fa-haykal{--fa:"\\f666"}.fa-sd-card{--fa:"\\f7c2"}.fa-dragon{--fa:"\\f6d5"}.fa-shoe-prints{--fa:"\\f54b"}.fa-circle-plus,.fa-plus-circle{--fa:"\\f055"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\\f58b"}.fa-hand-holding{--fa:"\\f4bd"}.fa-plug-circle-exclamation{--fa:"\\e55d"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\\f127"}.fa-clone{--fa:"\\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\\e551"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\\f882"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\\f7e4"}.fa-tornado{--fa:"\\f76f"}.fa-file-circle-plus{--fa:"\\e494"}.fa-book-quran,.fa-quran{--fa:"\\f687"}.fa-anchor{--fa:"\\f13d"}.fa-border-all{--fa:"\\f84c"}.fa-angry,.fa-face-angry{--fa:"\\f556"}.fa-cookie-bite{--fa:"\\f564"}.fa-arrow-trend-down{--fa:"\\e097"}.fa-feed,.fa-rss{--fa:"\\f09e"}.fa-draw-polygon{--fa:"\\f5ee"}.fa-balance-scale,.fa-scale-balanced{--fa:"\\f24e"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\\f62a"}.fa-shower{--fa:"\\f2cc"}.fa-desktop,.fa-desktop-alt{--fa:"\\f390"}.fa-m{--fa:"\\4d"}.fa-table-list,.fa-th-list{--fa:"\\f00b"}.fa-comment-sms,.fa-sms{--fa:"\\f7cd"}.fa-book{--fa:"\\f02d"}.fa-user-plus{--fa:"\\f234"}.fa-check{--fa:"\\f00c"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\\f241"}.fa-house-circle-check{--fa:"\\e509"}.fa-angle-left{--fa:"\\f104"}.fa-diagram-successor{--fa:"\\e47a"}.fa-truck-arrow-right{--fa:"\\e58b"}.fa-arrows-split-up-and-left{--fa:"\\e4bc"}.fa-fist-raised,.fa-hand-fist{--fa:"\\f6de"}.fa-cloud-moon{--fa:"\\f6c3"}.fa-briefcase{--fa:"\\f0b1"}.fa-person-falling{--fa:"\\e546"}.fa-image-portrait,.fa-portrait{--fa:"\\f3e0"}.fa-user-tag{--fa:"\\f507"}.fa-rug{--fa:"\\e569"}.fa-earth-europe,.fa-globe-europe{--fa:"\\f7a2"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\\f59d"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\\f410"}.fa-baht-sign{--fa:"\\e0ac"}.fa-book-open{--fa:"\\f518"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\\f66a"}.fa-handcuffs{--fa:"\\e4f8"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\\f071"}.fa-database{--fa:"\\f1c0"}.fa-mail-forward,.fa-share{--fa:"\\f064"}.fa-bottle-droplet{--fa:"\\e4c4"}.fa-mask-face{--fa:"\\e1d7"}.fa-hill-rockslide{--fa:"\\e508"}.fa-exchange-alt,.fa-right-left{--fa:"\\f362"}.fa-paper-plane{--fa:"\\f1d8"}.fa-road-circle-exclamation{--fa:"\\e565"}.fa-dungeon{--fa:"\\f6d9"}.fa-align-right{--fa:"\\f038"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\\f53b"}.fa-life-ring{--fa:"\\f1cd"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\\f2a7"}.fa-calendar-day{--fa:"\\f783"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\\f5c5"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\\f07d"}.fa-face-grimace,.fa-grimace{--fa:"\\f57f"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\\e2ce"}.fa-level-down-alt,.fa-turn-down{--fa:"\\f3be"}.fa-person-walking-arrow-right{--fa:"\\e552"}.fa-envelope-square,.fa-square-envelope{--fa:"\\f199"}.fa-dice{--fa:"\\f522"}.fa-bowling-ball{--fa:"\\f436"}.fa-brain{--fa:"\\f5dc"}.fa-band-aid,.fa-bandage{--fa:"\\f462"}.fa-calendar-minus{--fa:"\\f272"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\\f057"}.fa-gifts{--fa:"\\f79c"}.fa-hotel{--fa:"\\f594"}.fa-earth-asia,.fa-globe-asia{--fa:"\\f57e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\\f47f"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\\f00e"}.fa-thumbs-up{--fa:"\\f164"}.fa-user-clock{--fa:"\\f4fd"}.fa-allergies,.fa-hand-dots{--fa:"\\f461"}.fa-file-invoice{--fa:"\\f570"}.fa-window-minimize{--fa:"\\f2d1"}.fa-coffee,.fa-mug-saucer{--fa:"\\f0f4"}.fa-brush{--fa:"\\f55d"}.fa-file-half-dashed{--fa:"\\e698"}.fa-mask{--fa:"\\f6fa"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\\f010"}.fa-ruler-vertical{--fa:"\\f548"}.fa-user-alt,.fa-user-large{--fa:"\\f406"}.fa-train-tram{--fa:"\\e5b4"}.fa-user-nurse{--fa:"\\f82f"}.fa-syringe{--fa:"\\f48e"}.fa-cloud-sun{--fa:"\\f6c4"}.fa-stopwatch-20{--fa:"\\e06f"}.fa-square-full{--fa:"\\f45c"}.fa-magnet{--fa:"\\f076"}.fa-jar{--fa:"\\e516"}.fa-note-sticky,.fa-sticky-note{--fa:"\\f249"}.fa-bug-slash{--fa:"\\e490"}.fa-arrow-up-from-water-pump{--fa:"\\e4b6"}.fa-bone{--fa:"\\f5d7"}.fa-table-cells-row-unlock{--fa:"\\e691"}.fa-user-injured{--fa:"\\f728"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\\f5b4"}.fa-plane{--fa:"\\f072"}.fa-tent-arrows-down{--fa:"\\e581"}.fa-exclamation{--fa:"\\21"}.fa-arrows-spin{--fa:"\\e4bb"}.fa-print{--fa:"\\f02f"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\\e2bb"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\\24"}.fa-x{--fa:"\\58"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\\f688"}.fa-users-cog,.fa-users-gear{--fa:"\\f509"}.fa-person-military-pointing{--fa:"\\e54a"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\\f19c"}.fa-umbrella{--fa:"\\f0e9"}.fa-trowel{--fa:"\\e589"}.fa-d{--fa:"\\44"}.fa-stapler{--fa:"\\e5af"}.fa-masks-theater,.fa-theater-masks{--fa:"\\f630"}.fa-kip-sign{--fa:"\\e1c4"}.fa-hand-point-left{--fa:"\\f0a5"}.fa-handshake-alt,.fa-handshake-simple{--fa:"\\f4c6"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\\f0fb"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\\f1e1"}.fa-barcode{--fa:"\\f02a"}.fa-plus-minus{--fa:"\\e43c"}.fa-video,.fa-video-camera{--fa:"\\f03d"}.fa-graduation-cap,.fa-mortar-board{--fa:"\\f19d"}.fa-hand-holding-medical{--fa:"\\e05c"}.fa-person-circle-check{--fa:"\\e53e"}.fa-level-up-alt,.fa-turn-up{--fa:"\\f3bf"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:"\\f3d0"}.fa-hooli{--fa:"\\f427"}.fa-yelp{--fa:"\\f1e9"}.fa-cc-visa{--fa:"\\f1f0"}.fa-lastfm{--fa:"\\f202"}.fa-shopware{--fa:"\\f5b5"}.fa-creative-commons-nc{--fa:"\\f4e8"}.fa-aws{--fa:"\\f375"}.fa-redhat{--fa:"\\f7bc"}.fa-yoast{--fa:"\\f2b1"}.fa-cloudflare{--fa:"\\e07d"}.fa-ups{--fa:"\\f7e0"}.fa-pixiv{--fa:"\\e640"}.fa-wpexplorer{--fa:"\\f2de"}.fa-dyalog{--fa:"\\f399"}.fa-bity{--fa:"\\f37a"}.fa-stackpath{--fa:"\\f842"}.fa-buysellads{--fa:"\\f20d"}.fa-first-order{--fa:"\\f2b0"}.fa-modx{--fa:"\\f285"}.fa-guilded{--fa:"\\e07e"}.fa-vnv{--fa:"\\f40b"}.fa-js-square,.fa-square-js{--fa:"\\f3b9"}.fa-microsoft{--fa:"\\f3ca"}.fa-qq{--fa:"\\f1d6"}.fa-orcid{--fa:"\\f8d2"}.fa-java{--fa:"\\f4e4"}.fa-invision{--fa:"\\f7b0"}.fa-creative-commons-pd-alt{--fa:"\\f4ed"}.fa-centercode{--fa:"\\f380"}.fa-glide-g{--fa:"\\f2a6"}.fa-drupal{--fa:"\\f1a9"}.fa-jxl{--fa:"\\e67b"}.fa-dart-lang{--fa:"\\e693"}.fa-hire-a-helper{--fa:"\\f3b0"}.fa-creative-commons-by{--fa:"\\f4e7"}.fa-unity{--fa:"\\e049"}.fa-whmcs{--fa:"\\f40d"}.fa-rocketchat{--fa:"\\f3e8"}.fa-vk{--fa:"\\f189"}.fa-untappd{--fa:"\\f405"}.fa-mailchimp{--fa:"\\f59e"}.fa-css3-alt{--fa:"\\f38b"}.fa-reddit-square,.fa-square-reddit{--fa:"\\f1a2"}.fa-vimeo-v{--fa:"\\f27d"}.fa-contao{--fa:"\\f26d"}.fa-square-font-awesome{--fa:"\\e5ad"}.fa-deskpro{--fa:"\\f38f"}.fa-brave{--fa:"\\e63c"}.fa-sistrix{--fa:"\\f3ee"}.fa-instagram-square,.fa-square-instagram{--fa:"\\e055"}.fa-battle-net{--fa:"\\f835"}.fa-the-red-yeti{--fa:"\\f69d"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\\f3af"}.fa-edge{--fa:"\\f282"}.fa-threads{--fa:"\\e618"}.fa-napster{--fa:"\\f3d2"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\\f2ad"}.fa-google-plus-g{--fa:"\\f0d5"}.fa-artstation{--fa:"\\f77a"}.fa-markdown{--fa:"\\f60f"}.fa-sourcetree{--fa:"\\f7d3"}.fa-google-plus{--fa:"\\f2b3"}.fa-diaspora{--fa:"\\f791"}.fa-foursquare{--fa:"\\f180"}.fa-stack-overflow{--fa:"\\f16c"}.fa-github-alt{--fa:"\\f113"}.fa-phoenix-squadron{--fa:"\\f511"}.fa-pagelines{--fa:"\\f18c"}.fa-algolia{--fa:"\\f36c"}.fa-red-river{--fa:"\\f3e3"}.fa-creative-commons-sa{--fa:"\\f4ef"}.fa-safari{--fa:"\\f267"}.fa-google{--fa:"\\f1a0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\\f35c"}.fa-atlassian{--fa:"\\f77b"}.fa-linkedin-in{--fa:"\\f0e1"}.fa-digital-ocean{--fa:"\\f391"}.fa-nimblr{--fa:"\\f5a8"}.fa-chromecast{--fa:"\\f838"}.fa-evernote{--fa:"\\f839"}.fa-hacker-news{--fa:"\\f1d4"}.fa-creative-commons-sampling{--fa:"\\f4f0"}.fa-adversal{--fa:"\\f36a"}.fa-creative-commons{--fa:"\\f25e"}.fa-watchman-monitoring{--fa:"\\e087"}.fa-fonticons{--fa:"\\f280"}.fa-weixin{--fa:"\\f1d7"}.fa-shirtsinbulk{--fa:"\\f214"}.fa-codepen{--fa:"\\f1cb"}.fa-git-alt{--fa:"\\f841"}.fa-lyft{--fa:"\\f3c3"}.fa-rev{--fa:"\\f5b2"}.fa-windows{--fa:"\\f17a"}.fa-wizards-of-the-coast{--fa:"\\f730"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\\f2aa"}.fa-meetup{--fa:"\\f2e0"}.fa-centos{--fa:"\\f789"}.fa-adn{--fa:"\\f170"}.fa-cloudsmith{--fa:"\\f384"}.fa-opensuse{--fa:"\\e62b"}.fa-pied-piper-alt{--fa:"\\f1a8"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\\f397"}.fa-codiepie{--fa:"\\f284"}.fa-node{--fa:"\\f419"}.fa-mix{--fa:"\\f3cb"}.fa-steam{--fa:"\\f1b6"}.fa-cc-apple-pay{--fa:"\\f416"}.fa-scribd{--fa:"\\f28a"}.fa-debian{--fa:"\\e60b"}.fa-openid{--fa:"\\f19b"}.fa-instalod{--fa:"\\e081"}.fa-files-pinwheel{--fa:"\\e69f"}.fa-expeditedssl{--fa:"\\f23e"}.fa-sellcast{--fa:"\\f2da"}.fa-square-twitter,.fa-twitter-square{--fa:"\\f081"}.fa-r-project{--fa:"\\f4f7"}.fa-delicious{--fa:"\\f1a5"}.fa-freebsd{--fa:"\\f3a4"}.fa-vuejs{--fa:"\\f41f"}.fa-accusoft{--fa:"\\f369"}.fa-ioxhost{--fa:"\\f208"}.fa-fonticons-fi{--fa:"\\f3a2"}.fa-app-store{--fa:"\\f36f"}.fa-cc-mastercard{--fa:"\\f1f1"}.fa-itunes-note{--fa:"\\f3b5"}.fa-golang{--fa:"\\e40f"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\\f3bb"}.fa-grav{--fa:"\\f2d6"}.fa-weibo{--fa:"\\f18a"}.fa-uncharted{--fa:"\\e084"}.fa-firstdraft{--fa:"\\f3a1"}.fa-square-youtube,.fa-youtube-square{--fa:"\\f431"}.fa-wikipedia-w{--fa:"\\f266"}.fa-rendact,.fa-wpressr{--fa:"\\f3e4"}.fa-angellist{--fa:"\\f209"}.fa-galactic-republic{--fa:"\\f50c"}.fa-nfc-directional{--fa:"\\e530"}.fa-skype{--fa:"\\f17e"}.fa-joget{--fa:"\\f3b7"}.fa-fedora{--fa:"\\f798"}.fa-stripe-s{--fa:"\\f42a"}.fa-meta{--fa:"\\e49b"}.fa-laravel{--fa:"\\f3bd"}.fa-hotjar{--fa:"\\f3b1"}.fa-bluetooth-b{--fa:"\\f294"}.fa-square-letterboxd{--fa:"\\e62e"}.fa-sticker-mule{--fa:"\\f3f7"}.fa-creative-commons-zero{--fa:"\\f4f3"}.fa-hips{--fa:"\\f452"}.fa-css{--fa:"\\e6a2"}.fa-behance{--fa:"\\f1b4"}.fa-reddit{--fa:"\\f1a1"}.fa-discord{--fa:"\\f392"}.fa-chrome{--fa:"\\f268"}.fa-app-store-ios{--fa:"\\f370"}.fa-cc-discover{--fa:"\\f1f2"}.fa-wpbeginner{--fa:"\\f297"}.fa-confluence{--fa:"\\f78d"}.fa-shoelace{--fa:"\\e60c"}.fa-mdb{--fa:"\\f8ca"}.fa-dochub{--fa:"\\f394"}.fa-accessible-icon{--fa:"\\f368"}.fa-ebay{--fa:"\\f4f4"}.fa-amazon{--fa:"\\f270"}.fa-unsplash{--fa:"\\e07c"}.fa-yarn{--fa:"\\f7e3"}.fa-square-steam,.fa-steam-square{--fa:"\\f1b7"}.fa-500px{--fa:"\\f26e"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\\f194"}.fa-asymmetrik{--fa:"\\f372"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\\f2b4"}.fa-gratipay{--fa:"\\f184"}.fa-apple{--fa:"\\f179"}.fa-hive{--fa:"\\e07f"}.fa-gitkraken{--fa:"\\f3a6"}.fa-keybase{--fa:"\\f4f5"}.fa-apple-pay{--fa:"\\f415"}.fa-padlet{--fa:"\\e4a0"}.fa-amazon-pay{--fa:"\\f42c"}.fa-github-square,.fa-square-github{--fa:"\\f092"}.fa-stumbleupon{--fa:"\\f1a4"}.fa-fedex{--fa:"\\f797"}.fa-phoenix-framework{--fa:"\\f3dc"}.fa-shopify{--fa:"\\e057"}.fa-neos{--fa:"\\f612"}.fa-square-threads{--fa:"\\e619"}.fa-hackerrank{--fa:"\\f5f7"}.fa-researchgate{--fa:"\\f4f8"}.fa-swift{--fa:"\\f8e1"}.fa-angular{--fa:"\\f420"}.fa-speakap{--fa:"\\f3f3"}.fa-angrycreative{--fa:"\\f36e"}.fa-y-combinator{--fa:"\\f23b"}.fa-empire{--fa:"\\f1d1"}.fa-envira{--fa:"\\f299"}.fa-google-scholar{--fa:"\\e63b"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\\e5ae"}.fa-studiovinari{--fa:"\\f3f8"}.fa-pied-piper{--fa:"\\f2ae"}.fa-wordpress{--fa:"\\f19a"}.fa-product-hunt{--fa:"\\f288"}.fa-firefox{--fa:"\\f269"}.fa-linode{--fa:"\\f2b8"}.fa-goodreads{--fa:"\\f3a8"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\\f264"}.fa-jsfiddle{--fa:"\\f1cc"}.fa-sith{--fa:"\\f512"}.fa-themeisle{--fa:"\\f2b2"}.fa-page4{--fa:"\\f3d7"}.fa-hashnode{--fa:"\\e499"}.fa-react{--fa:"\\f41b"}.fa-cc-paypal{--fa:"\\f1f4"}.fa-squarespace{--fa:"\\f5be"}.fa-cc-stripe{--fa:"\\f1f5"}.fa-creative-commons-share{--fa:"\\f4f2"}.fa-bitcoin{--fa:"\\f379"}.fa-keycdn{--fa:"\\f3ba"}.fa-opera{--fa:"\\f26a"}.fa-itch-io{--fa:"\\f83a"}.fa-umbraco{--fa:"\\f8e8"}.fa-galactic-senate{--fa:"\\f50d"}.fa-ubuntu{--fa:"\\f7df"}.fa-draft2digital{--fa:"\\f396"}.fa-stripe{--fa:"\\f429"}.fa-houzz{--fa:"\\f27c"}.fa-gg{--fa:"\\f260"}.fa-dhl{--fa:"\\f790"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\\f0d3"}.fa-xing{--fa:"\\f168"}.fa-blackberry{--fa:"\\f37b"}.fa-creative-commons-pd{--fa:"\\f4ec"}.fa-playstation{--fa:"\\f3df"}.fa-quinscape{--fa:"\\f459"}.fa-less{--fa:"\\f41d"}.fa-blogger-b{--fa:"\\f37d"}.fa-opencart{--fa:"\\f23d"}.fa-vine{--fa:"\\f1ca"}.fa-signal-messenger{--fa:"\\e663"}.fa-paypal{--fa:"\\f1ed"}.fa-gitlab{--fa:"\\f296"}.fa-typo3{--fa:"\\f42b"}.fa-reddit-alien{--fa:"\\f281"}.fa-yahoo{--fa:"\\f19e"}.fa-dailymotion{--fa:"\\e052"}.fa-affiliatetheme{--fa:"\\f36b"}.fa-pied-piper-pp{--fa:"\\f1a7"}.fa-bootstrap{--fa:"\\f836"}.fa-odnoklassniki{--fa:"\\f263"}.fa-nfc-symbol{--fa:"\\e531"}.fa-mintbit{--fa:"\\e62f"}.fa-ethereum{--fa:"\\f42e"}.fa-speaker-deck{--fa:"\\f83c"}.fa-creative-commons-nc-eu{--fa:"\\f4e9"}.fa-patreon{--fa:"\\f3d9"}.fa-avianex{--fa:"\\f374"}.fa-ello{--fa:"\\f5f1"}.fa-gofore{--fa:"\\f3a7"}.fa-bimobject{--fa:"\\f378"}.fa-brave-reverse{--fa:"\\e63d"}.fa-facebook-f{--fa:"\\f39e"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\\f0d4"}.fa-web-awesome{--fa:"\\e682"}.fa-mandalorian{--fa:"\\f50f"}.fa-first-order-alt{--fa:"\\f50a"}.fa-osi{--fa:"\\f41a"}.fa-google-wallet{--fa:"\\f1ee"}.fa-d-and-d-beyond{--fa:"\\f6ca"}.fa-periscope{--fa:"\\f3da"}.fa-fulcrum{--fa:"\\f50b"}.fa-cloudscale{--fa:"\\f383"}.fa-forumbee{--fa:"\\f211"}.fa-mizuni{--fa:"\\f3cc"}.fa-schlix{--fa:"\\f3ea"}.fa-square-xing,.fa-xing-square{--fa:"\\f169"}.fa-bandcamp{--fa:"\\f2d5"}.fa-wpforms{--fa:"\\f298"}.fa-cloudversify{--fa:"\\f385"}.fa-usps{--fa:"\\f7e1"}.fa-megaport{--fa:"\\f5a3"}.fa-magento{--fa:"\\f3c4"}.fa-spotify{--fa:"\\f1bc"}.fa-optin-monster{--fa:"\\f23c"}.fa-fly{--fa:"\\f417"}.fa-square-bluesky{--fa:"\\e6a3"}.fa-aviato{--fa:"\\f421"}.fa-itunes{--fa:"\\f3b4"}.fa-cuttlefish{--fa:"\\f38c"}.fa-blogger{--fa:"\\f37c"}.fa-flickr{--fa:"\\f16e"}.fa-viber{--fa:"\\f409"}.fa-soundcloud{--fa:"\\f1be"}.fa-digg{--fa:"\\f1a6"}.fa-tencent-weibo{--fa:"\\f1d5"}.fa-letterboxd{--fa:"\\e62d"}.fa-symfony{--fa:"\\f83d"}.fa-maxcdn{--fa:"\\f136"}.fa-etsy{--fa:"\\f2d7"}.fa-facebook-messenger{--fa:"\\f39f"}.fa-audible{--fa:"\\f373"}.fa-think-peaks{--fa:"\\f731"}.fa-bilibili{--fa:"\\e3d9"}.fa-erlang{--fa:"\\f39d"}.fa-x-twitter{--fa:"\\e61b"}.fa-cotton-bureau{--fa:"\\f89e"}.fa-dashcube{--fa:"\\f210"}.fa-42-group,.fa-innosoft{--fa:"\\e080"}.fa-stack-exchange{--fa:"\\f18d"}.fa-elementor{--fa:"\\f430"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\\e01e"}.fa-creative-commons-nd{--fa:"\\f4eb"}.fa-palfed{--fa:"\\f3d8"}.fa-superpowers{--fa:"\\f2dd"}.fa-resolving{--fa:"\\f3e7"}.fa-xbox{--fa:"\\f412"}.fa-square-web-awesome-stroke{--fa:"\\e684"}.fa-searchengin{--fa:"\\f3eb"}.fa-tiktok{--fa:"\\e07b"}.fa-facebook-square,.fa-square-facebook{--fa:"\\f082"}.fa-renren{--fa:"\\f18b"}.fa-linux{--fa:"\\f17c"}.fa-glide{--fa:"\\f2a5"}.fa-linkedin{--fa:"\\f08c"}.fa-hubspot{--fa:"\\f3b2"}.fa-deploydog{--fa:"\\f38e"}.fa-twitch{--fa:"\\f1e8"}.fa-flutter{--fa:"\\e694"}.fa-ravelry{--fa:"\\f2d9"}.fa-mixer{--fa:"\\e056"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\\f203"}.fa-vimeo{--fa:"\\f40a"}.fa-mendeley{--fa:"\\f7b3"}.fa-uniregistry{--fa:"\\f404"}.fa-figma{--fa:"\\f799"}.fa-creative-commons-remix{--fa:"\\f4ee"}.fa-cc-amazon-pay{--fa:"\\f42d"}.fa-dropbox{--fa:"\\f16b"}.fa-instagram{--fa:"\\f16d"}.fa-cmplid{--fa:"\\e360"}.fa-upwork{--fa:"\\e641"}.fa-facebook{--fa:"\\f09a"}.fa-gripfire{--fa:"\\f3ac"}.fa-jedi-order{--fa:"\\f50e"}.fa-uikit{--fa:"\\f403"}.fa-fort-awesome-alt{--fa:"\\f3a3"}.fa-phabricator{--fa:"\\f3db"}.fa-ussunnah{--fa:"\\f407"}.fa-earlybirds{--fa:"\\f39a"}.fa-trade-federation{--fa:"\\f513"}.fa-autoprefixer{--fa:"\\f41c"}.fa-whatsapp{--fa:"\\f232"}.fa-square-upwork{--fa:"\\e67c"}.fa-slideshare{--fa:"\\f1e7"}.fa-google-play{--fa:"\\f3ab"}.fa-viadeo{--fa:"\\f2a9"}.fa-line{--fa:"\\f3c0"}.fa-google-drive{--fa:"\\f3aa"}.fa-servicestack{--fa:"\\f3ec"}.fa-simplybuilt{--fa:"\\f215"}.fa-bitbucket{--fa:"\\f171"}.fa-imdb{--fa:"\\f2d8"}.fa-deezer{--fa:"\\e077"}.fa-raspberry-pi{--fa:"\\f7bb"}.fa-jira{--fa:"\\f7b1"}.fa-docker{--fa:"\\f395"}.fa-screenpal{--fa:"\\e570"}.fa-bluetooth{--fa:"\\f293"}.fa-gitter{--fa:"\\f426"}.fa-d-and-d{--fa:"\\f38d"}.fa-microblog{--fa:"\\e01a"}.fa-cc-diners-club{--fa:"\\f24c"}.fa-gg-circle{--fa:"\\f261"}.fa-pied-piper-hat{--fa:"\\f4e5"}.fa-kickstarter-k{--fa:"\\f3bc"}.fa-yandex{--fa:"\\f413"}.fa-readme{--fa:"\\f4d5"}.fa-html5{--fa:"\\f13b"}.fa-sellsy{--fa:"\\f213"}.fa-square-web-awesome{--fa:"\\e683"}.fa-sass{--fa:"\\f41e"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\\e2d0"}.fa-buromobelexperte{--fa:"\\f37f"}.fa-salesforce{--fa:"\\f83b"}.fa-octopus-deploy{--fa:"\\e082"}.fa-medapps{--fa:"\\f3c6"}.fa-ns8{--fa:"\\f3d5"}.fa-pinterest-p{--fa:"\\f231"}.fa-apper{--fa:"\\f371"}.fa-fort-awesome{--fa:"\\f286"}.fa-waze{--fa:"\\f83f"}.fa-bluesky{--fa:"\\e671"}.fa-cc-jcb{--fa:"\\f24b"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\\f2ab"}.fa-fantasy-flight-games{--fa:"\\f6dc"}.fa-rust{--fa:"\\e07a"}.fa-wix{--fa:"\\f5cf"}.fa-behance-square,.fa-square-behance{--fa:"\\f1b5"}.fa-supple{--fa:"\\f3f9"}.fa-webflow{--fa:"\\e65c"}.fa-rebel{--fa:"\\f1d0"}.fa-css3{--fa:"\\f13c"}.fa-staylinked{--fa:"\\f3f5"}.fa-kaggle{--fa:"\\f5fa"}.fa-space-awesome{--fa:"\\e5ac"}.fa-deviantart{--fa:"\\f1bd"}.fa-cpanel{--fa:"\\f388"}.fa-goodreads-g{--fa:"\\f3a9"}.fa-git-square,.fa-square-git{--fa:"\\f1d2"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\\f174"}.fa-trello{--fa:"\\f181"}.fa-creative-commons-nc-jp{--fa:"\\f4ea"}.fa-get-pocket{--fa:"\\f265"}.fa-perbyte{--fa:"\\e083"}.fa-grunt{--fa:"\\f3ad"}.fa-weebly{--fa:"\\f5cc"}.fa-connectdevelop{--fa:"\\f20e"}.fa-leanpub{--fa:"\\f212"}.fa-black-tie{--fa:"\\f27e"}.fa-themeco{--fa:"\\f5c6"}.fa-python{--fa:"\\f3e2"}.fa-android{--fa:"\\f17b"}.fa-bots{--fa:"\\e340"}.fa-free-code-camp{--fa:"\\f2c5"}.fa-hornbill{--fa:"\\f592"}.fa-js{--fa:"\\f3b8"}.fa-ideal{--fa:"\\e013"}.fa-git{--fa:"\\f1d3"}.fa-dev{--fa:"\\f6cc"}.fa-sketch{--fa:"\\f7c6"}.fa-yandex-international{--fa:"\\f414"}.fa-cc-amex{--fa:"\\f1f3"}.fa-uber{--fa:"\\f402"}.fa-github{--fa:"\\f09b"}.fa-php{--fa:"\\f457"}.fa-alipay{--fa:"\\f642"}.fa-youtube{--fa:"\\f167"}.fa-skyatlas{--fa:"\\f216"}.fa-firefox-browser{--fa:"\\e007"}.fa-replyd{--fa:"\\f3e6"}.fa-suse{--fa:"\\f7d6"}.fa-jenkins{--fa:"\\f3b6"}.fa-twitter{--fa:"\\f099"}.fa-rockrms{--fa:"\\f3e9"}.fa-pinterest{--fa:"\\f0d2"}.fa-buffer{--fa:"\\f837"}.fa-npm{--fa:"\\f3d4"}.fa-yammer{--fa:"\\f840"}.fa-btc{--fa:"\\f15a"}.fa-dribbble{--fa:"\\f17d"}.fa-stumbleupon-circle{--fa:"\\f1a3"}.fa-internet-explorer{--fa:"\\f26b"}.fa-stubber{--fa:"\\e5c7"}.fa-telegram,.fa-telegram-plane{--fa:"\\f2c6"}.fa-old-republic{--fa:"\\f510"}.fa-odysee{--fa:"\\e5c6"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\\f40c"}.fa-node-js{--fa:"\\f3d3"}.fa-edge-legacy{--fa:"\\e078"}.fa-slack,.fa-slack-hash{--fa:"\\f198"}.fa-medrt{--fa:"\\f3c8"}.fa-usb{--fa:"\\f287"}.fa-tumblr{--fa:"\\f173"}.fa-vaadin{--fa:"\\f408"}.fa-quora{--fa:"\\f2c4"}.fa-square-x-twitter{--fa:"\\e61a"}.fa-reacteurope{--fa:"\\f75d"}.fa-medium,.fa-medium-m{--fa:"\\f23a"}.fa-amilia{--fa:"\\f36d"}.fa-mixcloud{--fa:"\\f289"}.fa-flipboard{--fa:"\\f44d"}.fa-viacoin{--fa:"\\f237"}.fa-critical-role{--fa:"\\f6c9"}.fa-sitrox{--fa:"\\e44a"}.fa-discourse{--fa:"\\f393"}.fa-joomla{--fa:"\\f1aa"}.fa-mastodon{--fa:"\\f4f6"}.fa-airbnb{--fa:"\\f834"}.fa-wolf-pack-battalion{--fa:"\\f514"}.fa-buy-n-large{--fa:"\\f8a6"}.fa-gulp{--fa:"\\f3ae"}.fa-creative-commons-sampling-plus{--fa:"\\f4f1"}.fa-strava{--fa:"\\f428"}.fa-ember{--fa:"\\f423"}.fa-canadian-maple-leaf{--fa:"\\f785"}.fa-teamspeak{--fa:"\\f4f9"}.fa-pushed{--fa:"\\f3e1"}.fa-wordpress-simple{--fa:"\\f411"}.fa-nutritionix{--fa:"\\f3d6"}.fa-wodu{--fa:"\\e088"}.fa-google-pay{--fa:"\\e079"}.fa-intercom{--fa:"\\f7af"}.fa-zhihu{--fa:"\\f63f"}.fa-korvue{--fa:"\\f42f"}.fa-pix{--fa:"\\e43a"}.fa-steam-symbol{--fa:"\\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}.button{display:flex;height:50px;padding:0;background:#3e7671;border:none;outline:none;border-radius:5px;overflow:hidden;font-size:16px;font-weight:500;cursor:pointer;min-width:220px;max-width:220px}.button:hover{background:#008168}.button:active{background:#3e7671}.button-text{display:block;margin:auto;padding:0 10px;color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:50%;text-transform:capitalize}.button-icon{margin:auto;padding:10px;font-size:20px;color:#ffffff}.button-profile{margin:auto}.button-profile svg{display:flex;margin-left:4px;background-color:#fff;border-radius:4px}.profile-image{display:flex;margin-left:4px;width:40px;height:40px;border-radius:4px;background-color:#fff}.button-text-full-width{width:auto!important}.button-link{text-decoration:none!important}.dropdown{position:relative;display:inline-block}.dropdown-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:180px;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);z-index:1;border-radius:5px;text-align:left!important}.dropdown-content-link a{color:#71797E;padding:16px 20px;text-decoration:none;display:block;cursor:pointer;font-size:1rem!important}.dropdown-content-link a:hover{background-color:#f1f1f1;color:#000;opacity:0.7}.dropdown:hover .dropdown-content{display:block}.modal{display:none;position:fixed;z-index:1;padding-top:100px;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4);text-align:center}.modal-content{background-color:#fefefe;margin:auto;padding:20px;border:1px solid #888;width:40%}.modal-body{max-height:50vh;overflow-y:auto}.close{color:#aaaaaa;float:right;font-size:28px;font-weight:bold}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.modal-app{background-color:#c3e9bc;padding:15px;margin:10px;border-radius:5px}.external-app-link{text-decoration:none;color:#000}.gray-text{color:#606060}.green-text{color:#3e7671}#countdown{position:relative;margin:auto;margin-top:30px;height:40px;width:40px;text-align:center}#countdown-number{color:#2e2e2e;display:inline-block;line-height:40px}#countdown svg{position:absolute;top:0;right:0;width:40px;height:40px;transform:rotateY(-180deg) rotateZ(-90deg)}#countdown svg circle{stroke-dasharray:113px;stroke-dashoffset:0px;stroke-linecap:round;stroke-width:4px;stroke:#008168;fill:none;animation:countdown 6s linear infinite forwards}@keyframes countdown{from{stroke-dashoffset:0px}to{stroke-dashoffset:113px}}.lds-ring{color:#fff}.lds-ring{display:flex;justify-content:center;align-items:center;margin:auto;position:relative}.lds-ring div{box-sizing:border-box;display:block;position:absolute;width:25px;height:25px;margin:3px;border:2px solid currentColor;border-radius:50%;animation:lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;border-color:currentColor transparent transparent transparent}.lds-ring div:nth-child(1){animation-delay:-0.45s}.lds-ring div:nth-child(2){animation-delay:-0.3s}.lds-ring div:nth-child(3){animation-delay:-0.15s}@keyframes lds-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.dropdown-content .dropdown-user-profile{padding:12px 10px 8px 18px;border-bottom:1px solid #aaaaaa}.dropdown-content .dropdown-user-profile .username{font-size:16px;color:#2e2e2e;text-transform:capitalize}.dropdown-content .dropdown-user-profile .first-last-name{font-size:13px;color:#606060}.menu-bar-icons{color:#008168;display:inline-block;margin-right:8px;font-size:18px}.other-links-list{padding:14px;background-color:#f1f1f1;margin-bottom:8px;text-align:start;border-radius:5px}.tab-list{margin:0px 40px;padding:0;list-style:none;display:flex;position:relative;width:85%;border-bottom:1px solid #aaa}.tab-item{flex:1;text-align:center;transition:.3s;opacity:0.5}.tab-toggle{display:none}.tab-content{display:none}.tab-toggle:nth-child(1):checked~.tab-list .tab-item:nth-child(1),.tab-toggle:nth-child(2):checked~.tab-list .tab-item:nth-child(2){opacity:1;color:#008168;border-bottom:2px solid #008168}.tab-toggle:nth-child(2):checked~.tab-list::before{transform:translateX(100%)}.tab-toggle:nth-child(3):checked~.tab-list::before{transform:translateX(200%)}.tab-toggle:nth-child(1):checked~.tab-container .tab-content:nth-child(1),.tab-toggle:nth-child(2):checked~.tab-container .tab-content:nth-child(2){display:block}.tab-trigger{display:block;padding:10px 0}.tab-container{padding:15px 30px}.grid-view-menu{display:grid;gap:4px;grid-template-columns:repeat(3, 1fr);align-content:start;padding:8px;max-height:230px;overflow-y:auto}.grid-view-link{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;width:75px;height:70px;padding:6px;text-decoration:none;font-size:13px;color:#128f8b;text-align:center;transition:transform 0.2s ease, background-color 0.1s ease;position:relative;z-index:1;border-radius:3px;cursor:pointer}.grid-view-link:hover{background-color:#eeeeee;transform:scale(1.1);z-index:5}.grid-view-link-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#71797e;width:100%}.grid-view-link:hover .grid-view-link-text{white-space:pre-wrap;overflow:visible;text-overflow:unset}.grid-view-link i{transition:transform 0.2s ease}.grid-view-link:hover i{transform:scale(1.1)}hr.solid{border-top:1px solid #bbb;margin:2px 0}.restricted-overlay{position:fixed;inset:0;background:linear-gradient(135deg, #0f3d3e, #128f8b);display:flex;justify-content:center;align-items:center;padding:20px;z-index:9999999;font-family:"Segoe UI", sans-serif}.restricted-card{background:#ffffff;border-radius:10px;padding:50px;max-width:540px;width:100%;text-align:center;box-shadow:0 25px 70px rgba(0, 0, 0, 0.25);animation:fadeInUp 0.3s ease}.restricted-icon{font-size:48px;color:#128f8b;margin-bottom:30px}.restricted-card h2{margin-bottom:10px;color:#128f8b}.restricted-message{color:#555;font-size:16px;margin-bottom:30px;line-height:1.5}.restricted-links h4{margin-bottom:20px;color:#128f8b}.link-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(120px, 1fr));gap:20px;margin-bottom:25px}.restricted-link{background:#ecf2f2;padding:10px;border-radius:10px;text-decoration:none;color:#128f8b;font-size:13px;display:flex;flex-direction:column;align-items:center;gap:4px;transition:all 0.2s ease}.restricted-link:hover{background:#128f8b;color:#fff}.restricted-actions{display:flex;justify-content:center;gap:15px}.btn-primary{background:#128f8b;color:#fff;padding:10px 20px;border-radius:8px;text-decoration:none;font-weight:500;transition:0.2s}.btn-primary:hover{background:#0f6e6b}.btn-secondary{background:transparent;border:2px solid #128f8b;color:#128f8b;padding:8px 18px;border-radius:8px;cursor:pointer;transition:0.2s}.btn-danger{background:transparent;border:2px solid #dc3545;color:#dc3545;padding:8px 18px;border-radius:8px;cursor:pointer;transition:0.2s}.btn-secondary:hover{background:#128f8b;color:#fff}@keyframes fadeInUp{from{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}`;
|
|
4000
4060
|
|
|
4001
4061
|
const DashButtonComponent = class {
|
|
4002
4062
|
constructor(hostRef) {
|
|
4003
4063
|
registerInstance(this, hostRef);
|
|
4004
4064
|
this.showPostLoginText = false;
|
|
4005
4065
|
this.silentCheckSso = false;
|
|
4006
|
-
this.redirectUri = undefined;
|
|
4007
4066
|
this.authMethod = "check-sso";
|
|
4008
4067
|
this.portalApiUrl = "";
|
|
4009
4068
|
this.plmUrl = "https://productlicensemanager-zdzw.cloud.zdzw-project.com";
|
|
4010
4069
|
this.showUnauthorizedModal = false;
|
|
4011
4070
|
this.primaryColor = "";
|
|
4012
4071
|
this.accentColor = "";
|
|
4072
|
+
this.notificationPosition = "left";
|
|
4013
4073
|
this.keycloak = null;
|
|
4014
4074
|
this.isAuth = false;
|
|
4015
4075
|
this.givenUserName = "";
|
|
4016
4076
|
this.silentCheckSsoRedirectUri = window.location.origin + '/assets/verificar-sso.html';
|
|
4017
4077
|
this.appList = [];
|
|
4018
|
-
this.avatarSvg =
|
|
4078
|
+
this.avatarSvg = jdenticonModuleExports.toSvg("init-avatar", 40);
|
|
4019
4079
|
this.isLoading = false;
|
|
4020
|
-
this.config = undefined;
|
|
4021
|
-
this.localMenuLinks = undefined;
|
|
4022
|
-
this.organizationUrl = undefined;
|
|
4023
4080
|
this.isRestricted = false;
|
|
4024
4081
|
}
|
|
4082
|
+
componentDidLoad() {
|
|
4083
|
+
// Add a click listener to this specific component instance
|
|
4084
|
+
this.el.addEventListener('click', (event) => {
|
|
4085
|
+
const path = event.composedPath();
|
|
4086
|
+
// Ensure this click originated from inside the notification module
|
|
4087
|
+
const isInsideNotification = path.some((target) => target && target.tagName === 'NOTIFICATION-COMPONENT');
|
|
4088
|
+
// If the click is outside the notification module (e.g., somewhere else in dash-button), exit early
|
|
4089
|
+
if (!isInsideNotification) {
|
|
4090
|
+
return;
|
|
4091
|
+
}
|
|
4092
|
+
// 2. Identify the specific link element inside the path array
|
|
4093
|
+
const clickedLink = path.find((target) => target && (target.tagName === 'A' || (typeof target.hasAttribute === 'function' && target.hasAttribute('href'))));
|
|
4094
|
+
if (clickedLink) {
|
|
4095
|
+
const destinationUrl = clickedLink.getAttribute('href');
|
|
4096
|
+
if (destinationUrl) {
|
|
4097
|
+
// Prevent the default behavior ONLY for the notification component links
|
|
4098
|
+
event.preventDefault();
|
|
4099
|
+
event.stopPropagation();
|
|
4100
|
+
// Check if the link contains the unique class name
|
|
4101
|
+
const isHomeIconLink = clickedLink.classList.contains('button-link');
|
|
4102
|
+
if (isHomeIconLink) {
|
|
4103
|
+
console.log('Notification module home link intercepted. Opening in new tab:', destinationUrl);
|
|
4104
|
+
window.open(destinationUrl, '_blank', 'noopener,noreferrer');
|
|
4105
|
+
}
|
|
4106
|
+
else {
|
|
4107
|
+
console.log('Notification module standard link intercepted. Navigating in current view:', destinationUrl);
|
|
4108
|
+
window.location.href = destinationUrl;
|
|
4109
|
+
}
|
|
4110
|
+
}
|
|
4111
|
+
}
|
|
4112
|
+
});
|
|
4113
|
+
}
|
|
4025
4114
|
async componentWillLoad() {
|
|
4026
4115
|
var _a, _b, _c, _d;
|
|
4027
4116
|
// Fetch config from API
|
|
@@ -4064,16 +4153,17 @@ const DashButtonComponent = class {
|
|
|
4064
4153
|
onLoad: this.authMethod,
|
|
4065
4154
|
checkLoginIframe: false,
|
|
4066
4155
|
silentCheckSsoRedirectUri: this.silentCheckSso ? this.silentCheckSsoRedirectUri : '',
|
|
4067
|
-
}).then(res => {
|
|
4156
|
+
}).then((res) => {
|
|
4157
|
+
var _a, _b, _c;
|
|
4068
4158
|
if (res) {
|
|
4069
4159
|
this.isAuth = true;
|
|
4070
4160
|
localStorage.setItem("keycloak", JSON.stringify(this.keycloak));
|
|
4071
4161
|
// document.cookie = "DASH_BTN=" + JSON.parse(localStorage.getItem('keycloak')).token;
|
|
4072
|
-
document.cookie = this.config.cookieName + "=" + JSON.parse(localStorage.getItem('keycloak')).token;
|
|
4162
|
+
document.cookie = this.config.cookieName + "=" + JSON.parse((_a = localStorage.getItem('keycloak')) !== null && _a !== void 0 ? _a : '{}').token;
|
|
4073
4163
|
// Set userName
|
|
4074
|
-
this.givenUserName = JSON.parse(localStorage.getItem('keycloak')).idTokenParsed.preferred_username;
|
|
4164
|
+
this.givenUserName = JSON.parse((_b = localStorage.getItem('keycloak')) !== null && _b !== void 0 ? _b : '{}').idTokenParsed.preferred_username;
|
|
4075
4165
|
// Set user avatar
|
|
4076
|
-
this.avatarSvg =
|
|
4166
|
+
this.avatarSvg = jdenticonModuleExports.toSvg(JSON.parse((_c = localStorage.getItem('keycloak')) !== null && _c !== void 0 ? _c : '{}').idTokenParsed.sub, 40);
|
|
4077
4167
|
}
|
|
4078
4168
|
});
|
|
4079
4169
|
}
|
|
@@ -4104,27 +4194,44 @@ const DashButtonComponent = class {
|
|
|
4104
4194
|
}
|
|
4105
4195
|
}
|
|
4106
4196
|
}
|
|
4197
|
+
// First, check global links
|
|
4198
|
+
// Then, check the token's organization URL
|
|
4199
|
+
// Finally, check against dashbutton configuration: allowedGlobalDomain and whitelistedUrls
|
|
4107
4200
|
validateAppAccessByUrl() {
|
|
4108
|
-
var _a, _b, _c, _d;
|
|
4109
|
-
const
|
|
4110
|
-
const
|
|
4201
|
+
var _a, _b, _c, _d, _e, _f;
|
|
4202
|
+
const normalizeUrl = (url) => url.replace(/\/+$/, '');
|
|
4203
|
+
const currentUrl = normalizeUrl(window.location.href);
|
|
4204
|
+
const currentOrigin = normalizeUrl(window.location.origin);
|
|
4111
4205
|
const globalLinks = ((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.menu) === null || _b === void 0 ? void 0 : _b.global) === null || _c === void 0 ? void 0 : _c.links) || [];
|
|
4112
|
-
|
|
4206
|
+
const allowedGlobalDomain = ((_d = this.config) === null || _d === void 0 ? void 0 : _d.allowedGlobalDomain) || '';
|
|
4207
|
+
const whitelistedUrls = ((_e = this.config) === null || _e === void 0 ? void 0 : _e.whitelistedUrls) || '';
|
|
4208
|
+
// First, check global links
|
|
4113
4209
|
const matchGlobal = globalLinks.some(link => {
|
|
4114
4210
|
try {
|
|
4115
|
-
const linkOrigin = new URL(link.url).origin;
|
|
4211
|
+
const linkOrigin = normalizeUrl(new URL(link.url).origin);
|
|
4116
4212
|
return currentOrigin === linkOrigin;
|
|
4117
4213
|
}
|
|
4118
4214
|
catch (_a) {
|
|
4119
4215
|
return false;
|
|
4120
4216
|
}
|
|
4121
4217
|
});
|
|
4122
|
-
//
|
|
4123
|
-
const tokenParsed = (
|
|
4218
|
+
// Then check the token organization URL
|
|
4219
|
+
const tokenParsed = (_f = this.keycloak) === null || _f === void 0 ? void 0 : _f.tokenParsed;
|
|
4124
4220
|
const allowedOrg = tokenParsed === null || tokenParsed === void 0 ? void 0 : tokenParsed.organizationUrl;
|
|
4125
|
-
const matchOrganization = allowedOrg && currentUrl.includes(allowedOrg);
|
|
4126
|
-
//
|
|
4127
|
-
const
|
|
4221
|
+
const matchOrganization = allowedOrg && currentUrl.includes(normalizeUrl(allowedOrg));
|
|
4222
|
+
// Check allowedGlobalDomain (single domain)
|
|
4223
|
+
const matchAllowedDomain = allowedGlobalDomain &&
|
|
4224
|
+
currentOrigin.includes(normalizeUrl(allowedGlobalDomain));
|
|
4225
|
+
// Check whitelistedUrls (comma-separated string)
|
|
4226
|
+
const whitelistedArray = whitelistedUrls
|
|
4227
|
+
? whitelistedUrls.split(',').map(url => normalizeUrl(url.trim()))
|
|
4228
|
+
: [];
|
|
4229
|
+
const matchWhitelisted = whitelistedArray.some(url => currentUrl.includes(url));
|
|
4230
|
+
// Final validation
|
|
4231
|
+
const isAllowed = matchGlobal ||
|
|
4232
|
+
matchOrganization ||
|
|
4233
|
+
matchAllowedDomain ||
|
|
4234
|
+
matchWhitelisted;
|
|
4128
4235
|
this.isRestricted = !isAllowed;
|
|
4129
4236
|
}
|
|
4130
4237
|
login() {
|
|
@@ -4144,10 +4251,20 @@ const DashButtonComponent = class {
|
|
|
4144
4251
|
const appModal = this.el.shadowRoot.querySelector('#appListModal');
|
|
4145
4252
|
appModal.style.display = "none";
|
|
4146
4253
|
}
|
|
4254
|
+
renderNotificationComponent() {
|
|
4255
|
+
var _a;
|
|
4256
|
+
const token = (_a = this.keycloak) === null || _a === void 0 ? void 0 : _a.idTokenParsed;
|
|
4257
|
+
const owner = (token === null || token === void 0 ? void 0 : token.preferred_username) || (token === null || token === void 0 ? void 0 : token.sub) || '';
|
|
4258
|
+
const orgUrlRaw = (token === null || token === void 0 ? void 0 : token.organizationUrl) || '';
|
|
4259
|
+
const orgHost = orgUrlRaw
|
|
4260
|
+
? new URL(orgUrlRaw.startsWith('http') ? orgUrlRaw : `https://${orgUrlRaw}`).hostname
|
|
4261
|
+
: '';
|
|
4262
|
+
return orgHost && owner ? (h("notification-component", { owner: owner, "max-records": 10, "display-type": "icon", "notification-url": `https://notifications.${orgHost}/notifications-api`, "socket-connect": true, "socket-url": `wss://repository.${orgHost}/socket`, "list-url": `https://notifications.${orgHost}/notifications` })) : null;
|
|
4263
|
+
}
|
|
4147
4264
|
render() {
|
|
4148
4265
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
|
|
4149
|
-
return h("div", { key: '
|
|
4150
|
-
var _a, _b, _c, _d, _e, _f;
|
|
4266
|
+
return h("div", { key: '6c2ac818d23abd54b4548eb41c7536f2609356e9' }, h("div", { key: '1009063ae416ebba5624b67468c5711421e2aff8' }, (() => {
|
|
4267
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
4151
4268
|
// GLOBAL LOADING SPINNER
|
|
4152
4269
|
if (this.isLoading) {
|
|
4153
4270
|
return (h("a", { id: "login-btn", class: "button button-link" }, h("div", { class: "lds-ring" }, h("div", null), h("div", null), h("div", null), h("div", null))));
|
|
@@ -4159,21 +4276,23 @@ const DashButtonComponent = class {
|
|
|
4159
4276
|
return (h("a", { style: { background: this.primaryColor != undefined ? this.primaryColor : "" }, href: this.redirectUri, id: "login-btn", class: "button button-link" }, h("span", { style: { color: this.accentColor != undefined ? this.accentColor : "" }, class: "button-text button-text-full-width" }, "Go to Dashboard")));
|
|
4160
4277
|
}
|
|
4161
4278
|
else if (this.isAuth) {
|
|
4162
|
-
return (h("div", { id: "profile-btn", class: "dropdown" }, h("button", { style: { background: this.primaryColor != undefined ? this.primaryColor : "" }, type: "button", class: "button" }, h("span", { class: "button-profile" }, JSON.parse(localStorage.getItem('keycloak')).idTokenParsed.imageUrl ?
|
|
4279
|
+
return (h("div", { class: "profile-actions", style: { display: "inline-flex", alignItems: "center", gap: "15px" } }, this.notificationPosition !== "right" && this.renderNotificationComponent(), h("div", { id: "profile-btn", class: "dropdown" }, h("button", { style: { background: this.primaryColor != undefined ? this.primaryColor : "" }, type: "button", class: "button" }, h("span", { class: "button-profile" }, JSON.parse((_g = localStorage.getItem('keycloak')) !== null && _g !== void 0 ? _g : '{}').idTokenParsed.imageUrl ?
|
|
4163
4280
|
h("img", { class: "profile-image", src: "https://s-damith.github.io/test-avatar/images/e24da9c5-0b1f-46fa-82cd-7c711c77b5c7.png" })
|
|
4164
4281
|
:
|
|
4165
|
-
h("div", { innerHTML: this.avatarSvg })), h("span", { style: { color: this.accentColor != undefined ? this.accentColor : "" }, id: "given-name", class: "button-text" }, this.givenUserName), h("div", { class: "button-icon" }, (this.config.menuViewType == "grid") ? h("i", { class: "fa-solid fa-grip-vertical" }) : h("i", { class: "fa-solid fa-bars" }))), h("div", { class: "dropdown-content" }, h("div", { class: "dropdown-user-profile" }, h("div", { class: "username" }, "@", this.givenUserName), h("div", { class: "first-last-name" }, JSON.parse(localStorage.getItem('keycloak')).idTokenParsed.name)), (this.config.menuViewType == "grid") ? (h("div", null, h("div", { class: "grid-view-menu" }, this.config.menu.global.links.map(item => {
|
|
4282
|
+
h("div", { innerHTML: this.avatarSvg })), h("span", { style: { color: this.accentColor != undefined ? this.accentColor : "" }, id: "given-name", class: "button-text" }, this.givenUserName), h("div", { class: "button-icon" }, (this.config.menuViewType == "grid") ? h("i", { class: "fa-solid fa-grip-vertical" }) : h("i", { class: "fa-solid fa-bars" }))), h("div", { class: "dropdown-content" }, h("div", { class: "dropdown-user-profile" }, h("div", { class: "username" }, "@", this.givenUserName), h("div", { class: "first-last-name" }, JSON.parse((_h = localStorage.getItem('keycloak')) !== null && _h !== void 0 ? _h : '{}').idTokenParsed.name)), (this.config.menuViewType == "grid") ? (h("div", null, h("div", { class: "grid-view-menu" }, this.config.menu.global.links.map(item => {
|
|
4166
4283
|
return (h("a", { href: item.url, target: '_blank', class: "grid-view-link" }, h("i", { class: item.icon + " fa-2x" }), h("div", { class: "grid-view-link-text" }, item.name)));
|
|
4167
|
-
})), this.config.menu.global.links.length != 0 && h("hr", { class: "solid" }), h("div", { class: "grid-view-menu", style: this.config.menu.global.links.length
|
|
4284
|
+
})), this.config.menu.global.links.length != 0 && h("hr", { class: "solid" }), h("div", { class: "grid-view-menu", style: this.config.menu.global.links.length === 0
|
|
4285
|
+
? { marginBottom: '12px' }
|
|
4286
|
+
: undefined }, h("a", { onClick: this.showModal.bind(this), class: "grid-view-link" }, h("i", { class: "fa-regular fa-window-restore fa-2x" }), h("div", { class: "grid-view-link-text" }, "Modules")), h("a", { href: this.config.defaultLink.url, target: '_blank', class: "grid-view-link" }, h("i", { class: "fa-solid fa-globe fa-2x" }), h("div", { class: "grid-view-link-text" }, this.config.defaultLink.name)), h("a", { onClick: this.logout.bind(this), class: "grid-view-link" }, h("i", { class: "fa-solid fa-right-from-bracket fa-2x" }), h("div", { class: "grid-view-link-text" }, "Logout"))))) : (
|
|
4168
4287
|
// List View
|
|
4169
4288
|
h("div", { class: "dropdown-content-link" }, this.config.menu.global.links.map(item => {
|
|
4170
4289
|
return (h("a", { href: item.url, target: '_blank', id: "applications-btn" }, h("i", { class: item.icon + " menu-bar-icons" }), item.name));
|
|
4171
|
-
}), h("a", { onClick: this.showModal.bind(this), id: "applications-btn" }, h("i", { class: "fa-regular fa-window-restore menu-bar-icons" }), "Modules"), h("a", { href: this.config.defaultLink.url, target: '_blank', id: "applications-btn" }, h("i", { class: "fa-solid fa-globe menu-bar-icons" }), this.config.defaultLink.name), h("a", { onClick: this.logout.bind(this), id: "logout-btn" }, h("i", { class: "fa-solid fa-right-from-bracket menu-bar-icons" }), "Logout"))))));
|
|
4290
|
+
}), h("a", { onClick: this.showModal.bind(this), id: "applications-btn" }, h("i", { class: "fa-regular fa-window-restore menu-bar-icons" }), "Modules"), h("a", { href: this.config.defaultLink.url, target: '_blank', id: "applications-btn" }, h("i", { class: "fa-solid fa-globe menu-bar-icons" }), this.config.defaultLink.name), h("a", { onClick: this.logout.bind(this), id: "logout-btn" }, h("i", { class: "fa-solid fa-right-from-bracket menu-bar-icons" }), "Logout"))))), this.notificationPosition === "right" && this.renderNotificationComponent()));
|
|
4172
4291
|
}
|
|
4173
4292
|
else {
|
|
4174
4293
|
return (h("button", { style: { background: this.primaryColor != undefined ? this.primaryColor : "" }, onClick: this.login.bind(this), id: "login-btn", type: "button", class: "button" }, h("span", { style: { color: this.accentColor != undefined ? this.accentColor : "" }, class: "button-text" }, "Login")));
|
|
4175
4294
|
}
|
|
4176
|
-
})()), h("div", { key: '
|
|
4295
|
+
})()), h("div", { key: '051c1ac1086683050a19e713ee92c84dbd95cf31', id: "appListModal", class: "modal" }, h("div", { key: '0233801fbaec4a37c840039e531b775e5d5aa0f0', class: "modal-content" }, h("span", { key: '593cd28e612ec14e620bc54b341c68245385d3d1', onClick: this.closeModal.bind(this), class: "close" }, "\u00D7"), h("div", { key: '7d2c59e86c7a044136c7ad1962c35f34ac994d9b', class: "box" }, h("input", { key: '7d081171cb9858947fbe049dff08fabc1fe76655', type: "radio", class: "tab-toggle", name: "tab-toggle", id: "tab1", checked: true }), h("ul", { key: 'ffa4ab2f57ac98ef9097f2f609a9c8b020476cc3', class: "tab-list" }, h("li", { key: '3f37fda895caa295c7cbea584deac6c7a9ad780f', class: "tab-item" }, h("label", { key: '60b4e3a4b99b26b43df9f806ff9a374e2fe4047d', class: "tab-trigger", htmlFor: "tab1" }, h("i", { key: 'cb0d59237ff0f70544a6bb255b8048cde7fe0e9b', class: "fa-solid fa-table-list menu-bar-icons" }), " ", this.config.menu.local.name))), h("div", { key: 'f430fc9079ac64f3b857c4c4c47b408b1121f751', class: "tab-container" }, h("div", { key: 'e0db3bbf88afb5da03ec95332beb3a4700e51a65', class: "tab-content" }, h("div", { key: '12340dceb0bc90990593852ca1e62f27fffb4671', class: "modal-body" }, !((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.menu) === null || _b === void 0 ? void 0 : _b.local) === null || _c === void 0 ? void 0 : _c.enableCustomLocalMenu) ? (
|
|
4177
4296
|
// <div>{this.localMenuLinks}</div>
|
|
4178
4297
|
(_d = this.localMenuLinks) === null || _d === void 0 ? void 0 : _d.map((app, index) => {
|
|
4179
4298
|
const isDisabled = !app.url;
|
|
@@ -4181,14 +4300,12 @@ const DashButtonComponent = class {
|
|
|
4181
4300
|
})) : ((_e = this.config.menu.local.links) === null || _e === void 0 ? void 0 : _e.map((app, index) => (h("a", { key: index, class: "external-app-link", target: "_blank", rel: "noopener noreferrer", href: app.url }, h("div", { class: "modal-app" }, h("div", null, app.name)))))), !this.organizationUrl ? (h("div", null, h("h3", { class: "gray-text" }, "Organization Domain URL not set"), h("p", { class: "gray-text" }, "Please set your Organization Domain URL on the Portal profile page."))) : (((!((_h = (_g = (_f = this.config) === null || _f === void 0 ? void 0 : _f.menu) === null || _g === void 0 ? void 0 : _g.local) === null || _h === void 0 ? void 0 : _h.enableCustomLocalMenu) &&
|
|
4182
4301
|
((_k = (_j = this.localMenuLinks) === null || _j === void 0 ? void 0 : _j.length) !== null && _k !== void 0 ? _k : 0) === 0) ||
|
|
4183
4302
|
(((_o = (_m = (_l = this.config) === null || _l === void 0 ? void 0 : _l.menu) === null || _m === void 0 ? void 0 : _m.local) === null || _o === void 0 ? void 0 : _o.enableCustomLocalMenu) &&
|
|
4184
|
-
((_t = (_s = (_r = (_q = (_p = this.config) === null || _p === void 0 ? void 0 : _p.menu) === null || _q === void 0 ? void 0 : _q.local) === null || _r === void 0 ? void 0 : _r.links) === null || _s === void 0 ? void 0 : _s.length) !== null && _t !== void 0 ? _t : 0) === 0)) && (h("div", null, h("h3", { class: "gray-text" }, "No installed ", ((_w = (_v = (_u = this.config) === null || _u === void 0 ? void 0 : _u.menu) === null || _v === void 0 ? void 0 : _v.local) === null || _w === void 0 ? void 0 : _w.name) || "menu", " found."), h("p", { class: "gray-text" }, "Please contact administration.")))))))))), h("div", { key: '
|
|
4303
|
+
((_t = (_s = (_r = (_q = (_p = this.config) === null || _p === void 0 ? void 0 : _p.menu) === null || _q === void 0 ? void 0 : _q.local) === null || _r === void 0 ? void 0 : _r.links) === null || _s === void 0 ? void 0 : _s.length) !== null && _t !== void 0 ? _t : 0) === 0)) && (h("div", null, h("h3", { class: "gray-text" }, "No installed ", ((_w = (_v = (_u = this.config) === null || _u === void 0 ? void 0 : _u.menu) === null || _v === void 0 ? void 0 : _v.local) === null || _w === void 0 ? void 0 : _w.name) || "menu", " found."), h("p", { class: "gray-text" }, "Please contact administration.")))))))))), h("div", { key: '515bb25f527f3d7a6e0499c2ceb55265afcfa829', id: "appPermissionErrorModal", class: "modal" }, h("div", { key: '4127074cd4e5b207b8699aa59e80ca9c3bd95811', class: "modal-content" }, h("img", { key: '938f69e927df06b10a9a43a9e6b9d51729773d74', src: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGD0lEQVR4nO2cbU8TWRTH/W5WEAmF4nNiieFFoeBjYhQUWzUWYkpbDfGFCR9CoolvQF9aWgG3kMCG8LACC1ikuCuUh7bH/M/MmW131S2ZqTDjPcmkdub2tvPj3HP/55yJR44oU6ZMmTJlyg7YOsL9pI7+shkogGFzDqMAhhVAOsiQozwwrACS8sCwfXd+tYTDCiApDwwf/FJUSzisAJKjNhFlPzYF0KQpgCZNATRpCqBJUwBNmgJo0hRAk6YAmjQF0KkAs4uLtPz8OU2HQpRqaaFkQwPFq6v5SHo8fA7XVgYGKLu0dGC/81ABLORylB4cpInLl+nt0aP7OiauXKH00BAV8vlfE2AmkaCxpiYDSKK6mqaammjx+nX6FAzS348e0VYkwgf+jXO4Nun18lj53PuLF2kjmfx1AOa3t2mmt9cAkDxxghauXaPN3l7KxmJlHRgLmKNutzHPTCTCczsa4G4mQ6nWVr7h4WPHaL6trQTc+r17NOf30/iZMzTmdtNwVRWPA2Scm/H56FMgQNlolMfDO/9ob+cxmDPl99PuxoYzAe5mMrzcxOvWAALgolFauXmTxurry45/gPvnjRsG+LW7d3lOWdKVhHggAPPb24bnvW9ooL96evjGP4dC9NvJkwaY0fPnaa6vjzLJJG19+ED5bJY/u5NOUyYep/lnz2jk3Ll/4p/Hw/B4ru5unls8Mb+z4xyAM3rMg5cIvHRXFyVqavg8oKy+elXWjooxqy9f0luXy5gTm4xAFE+cjcWcATCTSGgxr6rKWLaAF9fj1u+BAOW2tsqeL7+7S5OdnRq8mhpaf/CA5xSI8EiJiRsjI/YGWMjlDKmCDUOWrXje3NOnRIWCaXh45biqL+f59nYjHlqtE38qwPTgoLHMeLeNRo2YB8+zEp7ExK1olI+Rujo+t/b6tX0BTugZBnQebha7rcQ8K5Ytw9O9WWKi7M7QiZKx2BJgdnHRyDDE+0SqYMOwEt7k7dvaxqJLHHwXvpMzFpeLtpeX7QdwZWCAbwjpmYhkkSrlxqVy4WEc4q1IHBbbsRhNXrjA71devLAfwOlQiH88lhJuBhkGbxx9fZbDE4NO5LTO5+OxCB14P93dbT+AKZ9P84ZgkG8GqRjeQ9ZUAh4MYhvXxs+e5fHwRBbWra32A5j0ePjHf9H1mST+2YWFisCDba+u8vV3tbWGNuT3jY32AxjXS06QFLgZKUH9aPct7O3RVFfXf+BlHj6kZG2tBq+j47tpGs5LoYKrNpGI9v74cfsDHNazg+/dvFl4sNzmprHz2x5g8l9LWMTuzsePli7bYkMBgqVMfb39l3CqpeXbm0g8XhF439xEgkGjOmN7GTOjA4XU2Be8zs6y4MFmnzzRpJLfXypjenrsK6Qnvd4SSQGxCyFtNbxiIb1+/74mpL1e+wrp7NISp1ElqZwuZZB2WQkPZqRyevz7Eg5zCc22qVxxMUGWMRL94sTfKnjYfd+dPq15261bpcWEq1fJvuWsoSEt/3W7tRZlNMolJylxWQEPJTGRP6lTpwz5YpSz3ryxcUE1nzcaSeieFTeArIKH3Fq8GSX9koJqc7O9C6owNL0lO5CKsZTfzS7bqTt3+LPxornxKu2Cz6Oj5IymUkTLCOB54iWAKOIaMRE7JXbS/zOMwYYhMQ9/gOLOnPxBZh8/dlhb06+Vs9B6FIi4cYmJInGgEyGIkbHgc8idkWHgHHRecVsTMU/mwuuY3tYcv3TJWW1NGJrdJY113WtkdxaJU84BqSK7rRFXdc/Dd+w5rbFeDHG8rc2IiQj2UmwQsY1iKFIxlKSg46AjARfnkGGISOZHO6JRnkNiHjzPsY92iGFZoultLNu6OtZs+3m4CCIZnxGpIjGvUsv2UAEUQ9NblrSUoNDDQP4KT+TH2/QWJT/eFgjwNaRnnGHI4x3NzRXZbQ89QBg0GsQ2Wo+SnZR1uFycYbBI3kdv2XEAiw35KqQMGkDoYaCeaDzi29jIuziuYYyVua1jANrFFECTpgCaNAXQpCmAJk0BNGkKoElTACsNUB39ZTFQAMMW/78xypQpU6ZMmbIjP9e+AkAlsBlIjsPOAAAAAElFTkSuQmCC" }), h("h2", { key: 'e4b224018cd85b9b8e7ae8025a16e15b1d7305ca', class: "green-text margin-b" }, "You don't have permission to access this application."), h("h3", { key: 'c6566424fa314d3ce884263321a74b268cb2f0f1', class: "green-text" }, "Please contact the administration."), (this.config.defaultLink.url && this.showUnauthorizedModal) ?
|
|
4185
4304
|
h("div", null, h("h4", { class: "gray-text" }, "You will be automatically redirected to the portal."), h("div", { id: "countdown" }, h("div", { id: "countdown-number" }), h("svg", null, h("circle", { r: "18", cx: "20", cy: "20" }))))
|
|
4186
4305
|
: h("div", null))));
|
|
4187
4306
|
}
|
|
4188
4307
|
get el() { return getElement(this); }
|
|
4189
4308
|
};
|
|
4190
|
-
DashButtonComponent.style =
|
|
4309
|
+
DashButtonComponent.style = dashButtonCss();
|
|
4191
4310
|
|
|
4192
4311
|
export { DashButtonComponent as dash_button };
|
|
4193
|
-
|
|
4194
|
-
//# sourceMappingURL=dash-button.entry.js.map
|