dash-button-web 0.0.22 → 0.0.23-beta.1
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 +2172 -2070
- 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 +135 -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 +0 -1
- package/dist/components/dash-button.js +1 -4247
- 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 +2172 -2068
- 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-6_Ga3Eox.js +3 -0
- package/dist/web-compnont/p-7de50cbc.entry.js +1 -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 +21 -0
- 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-ad318f06.entry.js +0 -10
- package/dist/web-compnont/p-ad318f06.entry.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/web-compnont.esm.js.map +0 -1
- package/loader/package.json +0 -11
|
@@ -1,4247 +1 @@
|
|
|
1
|
-
import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client';
|
|
2
|
-
|
|
3
|
-
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
4
|
-
|
|
5
|
-
function getAugmentedNamespace(n) {
|
|
6
|
-
if (n.__esModule) return n;
|
|
7
|
-
var a = Object.defineProperty({}, '__esModule', {value: true});
|
|
8
|
-
Object.keys(n).forEach(function (k) {
|
|
9
|
-
var d = Object.getOwnPropertyDescriptor(n, k);
|
|
10
|
-
Object.defineProperty(a, k, d.get ? d : {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
get: function () {
|
|
13
|
-
return n[k];
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
return a;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
var base64Js = {};
|
|
21
|
-
|
|
22
|
-
base64Js.byteLength = byteLength;
|
|
23
|
-
base64Js.toByteArray = toByteArray;
|
|
24
|
-
base64Js.fromByteArray = fromByteArray;
|
|
25
|
-
|
|
26
|
-
var lookup = [];
|
|
27
|
-
var revLookup = [];
|
|
28
|
-
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
|
|
29
|
-
|
|
30
|
-
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
31
|
-
for (var i = 0, len = code.length; i < len; ++i) {
|
|
32
|
-
lookup[i] = code[i];
|
|
33
|
-
revLookup[code.charCodeAt(i)] = i;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Support decoding URL-safe base64 strings, as Node.js does.
|
|
37
|
-
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
|
38
|
-
revLookup['-'.charCodeAt(0)] = 62;
|
|
39
|
-
revLookup['_'.charCodeAt(0)] = 63;
|
|
40
|
-
|
|
41
|
-
function getLens (b64) {
|
|
42
|
-
var len = b64.length;
|
|
43
|
-
|
|
44
|
-
if (len % 4 > 0) {
|
|
45
|
-
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Trim off extra bytes after placeholder bytes are found
|
|
49
|
-
// See: https://github.com/beatgammit/base64-js/issues/42
|
|
50
|
-
var validLen = b64.indexOf('=');
|
|
51
|
-
if (validLen === -1) validLen = len;
|
|
52
|
-
|
|
53
|
-
var placeHoldersLen = validLen === len
|
|
54
|
-
? 0
|
|
55
|
-
: 4 - (validLen % 4);
|
|
56
|
-
|
|
57
|
-
return [validLen, placeHoldersLen]
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// base64 is 4/3 + up to two characters of the original data
|
|
61
|
-
function byteLength (b64) {
|
|
62
|
-
var lens = getLens(b64);
|
|
63
|
-
var validLen = lens[0];
|
|
64
|
-
var placeHoldersLen = lens[1];
|
|
65
|
-
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function _byteLength (b64, validLen, placeHoldersLen) {
|
|
69
|
-
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function toByteArray (b64) {
|
|
73
|
-
var tmp;
|
|
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
|
-
}
|
|
170
|
-
|
|
171
|
-
var sha256$1 = {exports: {}};
|
|
172
|
-
|
|
173
|
-
const _nodeResolve_empty = {};
|
|
174
|
-
|
|
175
|
-
const _nodeResolve_empty$1 = /*#__PURE__*/Object.freeze({
|
|
176
|
-
__proto__: null,
|
|
177
|
-
'default': _nodeResolve_empty
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
const require$$1 = /*@__PURE__*/getAugmentedNamespace(_nodeResolve_empty$1);
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
|
184
|
-
*
|
|
185
|
-
* @version 0.10.1
|
|
186
|
-
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
|
187
|
-
* @copyright Chen, Yi-Cyuan 2014-2023
|
|
188
|
-
* @license MIT
|
|
189
|
-
*/
|
|
190
|
-
|
|
191
|
-
(function (module) {
|
|
192
|
-
/*jslint bitwise: true */
|
|
193
|
-
(function () {
|
|
194
|
-
|
|
195
|
-
var ERROR = 'input is invalid type';
|
|
196
|
-
var WINDOW = typeof window === 'object';
|
|
197
|
-
var root = WINDOW ? window : {};
|
|
198
|
-
if (root.JS_SHA256_NO_WINDOW) {
|
|
199
|
-
WINDOW = false;
|
|
200
|
-
}
|
|
201
|
-
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
|
202
|
-
var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
|
203
|
-
if (NODE_JS) {
|
|
204
|
-
root = commonjsGlobal;
|
|
205
|
-
} else if (WEB_WORKER) {
|
|
206
|
-
root = self;
|
|
207
|
-
}
|
|
208
|
-
var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
|
209
|
-
var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
|
210
|
-
var HEX_CHARS = '0123456789abcdef'.split('');
|
|
211
|
-
var EXTRA = [-2147483648, 8388608, 32768, 128];
|
|
212
|
-
var SHIFT = [24, 16, 8, 0];
|
|
213
|
-
var K = [
|
|
214
|
-
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
215
|
-
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
216
|
-
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
217
|
-
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
218
|
-
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
219
|
-
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
220
|
-
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
221
|
-
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
222
|
-
];
|
|
223
|
-
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
|
224
|
-
|
|
225
|
-
var blocks = [];
|
|
226
|
-
|
|
227
|
-
if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
|
|
228
|
-
Array.isArray = function (obj) {
|
|
229
|
-
return Object.prototype.toString.call(obj) === '[object Array]';
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
|
234
|
-
ArrayBuffer.isView = function (obj) {
|
|
235
|
-
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
var createOutputMethod = function (outputType, is224) {
|
|
240
|
-
return function (message) {
|
|
241
|
-
return new Sha256(is224, true).update(message)[outputType]();
|
|
242
|
-
};
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
var createMethod = function (is224) {
|
|
246
|
-
var method = createOutputMethod('hex', is224);
|
|
247
|
-
if (NODE_JS) {
|
|
248
|
-
method = nodeWrap(method, is224);
|
|
249
|
-
}
|
|
250
|
-
method.create = function () {
|
|
251
|
-
return new Sha256(is224);
|
|
252
|
-
};
|
|
253
|
-
method.update = function (message) {
|
|
254
|
-
return method.create().update(message);
|
|
255
|
-
};
|
|
256
|
-
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
|
257
|
-
var type = OUTPUT_TYPES[i];
|
|
258
|
-
method[type] = createOutputMethod(type, is224);
|
|
259
|
-
}
|
|
260
|
-
return method;
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
var nodeWrap = function (method, is224) {
|
|
264
|
-
var crypto = require$$1;
|
|
265
|
-
var Buffer = require$$1.Buffer;
|
|
266
|
-
var algorithm = is224 ? 'sha224' : 'sha256';
|
|
267
|
-
var bufferFrom;
|
|
268
|
-
if (Buffer.from && !root.JS_SHA256_NO_BUFFER_FROM) {
|
|
269
|
-
bufferFrom = Buffer.from;
|
|
270
|
-
} else {
|
|
271
|
-
bufferFrom = function (message) {
|
|
272
|
-
return new Buffer(message);
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
var nodeMethod = function (message) {
|
|
276
|
-
if (typeof message === 'string') {
|
|
277
|
-
return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
|
|
278
|
-
} else {
|
|
279
|
-
if (message === null || message === undefined) {
|
|
280
|
-
throw new Error(ERROR);
|
|
281
|
-
} else if (message.constructor === ArrayBuffer) {
|
|
282
|
-
message = new Uint8Array(message);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
|
286
|
-
message.constructor === Buffer) {
|
|
287
|
-
return crypto.createHash(algorithm).update(bufferFrom(message)).digest('hex');
|
|
288
|
-
} else {
|
|
289
|
-
return method(message);
|
|
290
|
-
}
|
|
291
|
-
};
|
|
292
|
-
return nodeMethod;
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
var createHmacOutputMethod = function (outputType, is224) {
|
|
296
|
-
return function (key, message) {
|
|
297
|
-
return new HmacSha256(key, is224, true).update(message)[outputType]();
|
|
298
|
-
};
|
|
299
|
-
};
|
|
300
|
-
|
|
301
|
-
var createHmacMethod = function (is224) {
|
|
302
|
-
var method = createHmacOutputMethod('hex', is224);
|
|
303
|
-
method.create = function (key) {
|
|
304
|
-
return new HmacSha256(key, is224);
|
|
305
|
-
};
|
|
306
|
-
method.update = function (key, message) {
|
|
307
|
-
return method.create(key).update(message);
|
|
308
|
-
};
|
|
309
|
-
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
|
310
|
-
var type = OUTPUT_TYPES[i];
|
|
311
|
-
method[type] = createHmacOutputMethod(type, is224);
|
|
312
|
-
}
|
|
313
|
-
return method;
|
|
314
|
-
};
|
|
315
|
-
|
|
316
|
-
function Sha256(is224, sharedMemory) {
|
|
317
|
-
if (sharedMemory) {
|
|
318
|
-
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
319
|
-
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
320
|
-
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
321
|
-
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
322
|
-
this.blocks = blocks;
|
|
323
|
-
} else {
|
|
324
|
-
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
if (is224) {
|
|
328
|
-
this.h0 = 0xc1059ed8;
|
|
329
|
-
this.h1 = 0x367cd507;
|
|
330
|
-
this.h2 = 0x3070dd17;
|
|
331
|
-
this.h3 = 0xf70e5939;
|
|
332
|
-
this.h4 = 0xffc00b31;
|
|
333
|
-
this.h5 = 0x68581511;
|
|
334
|
-
this.h6 = 0x64f98fa7;
|
|
335
|
-
this.h7 = 0xbefa4fa4;
|
|
336
|
-
} else { // 256
|
|
337
|
-
this.h0 = 0x6a09e667;
|
|
338
|
-
this.h1 = 0xbb67ae85;
|
|
339
|
-
this.h2 = 0x3c6ef372;
|
|
340
|
-
this.h3 = 0xa54ff53a;
|
|
341
|
-
this.h4 = 0x510e527f;
|
|
342
|
-
this.h5 = 0x9b05688c;
|
|
343
|
-
this.h6 = 0x1f83d9ab;
|
|
344
|
-
this.h7 = 0x5be0cd19;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
this.block = this.start = this.bytes = this.hBytes = 0;
|
|
348
|
-
this.finalized = this.hashed = false;
|
|
349
|
-
this.first = true;
|
|
350
|
-
this.is224 = is224;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
Sha256.prototype.update = function (message) {
|
|
354
|
-
if (this.finalized) {
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
var notString, type = typeof message;
|
|
358
|
-
if (type !== 'string') {
|
|
359
|
-
if (type === 'object') {
|
|
360
|
-
if (message === null) {
|
|
361
|
-
throw new Error(ERROR);
|
|
362
|
-
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
|
363
|
-
message = new Uint8Array(message);
|
|
364
|
-
} else if (!Array.isArray(message)) {
|
|
365
|
-
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
|
366
|
-
throw new Error(ERROR);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
} else {
|
|
370
|
-
throw new Error(ERROR);
|
|
371
|
-
}
|
|
372
|
-
notString = true;
|
|
373
|
-
}
|
|
374
|
-
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
|
375
|
-
|
|
376
|
-
while (index < length) {
|
|
377
|
-
if (this.hashed) {
|
|
378
|
-
this.hashed = false;
|
|
379
|
-
blocks[0] = this.block;
|
|
380
|
-
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
381
|
-
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
382
|
-
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
383
|
-
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
if (notString) {
|
|
387
|
-
for (i = this.start; index < length && i < 64; ++index) {
|
|
388
|
-
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
|
389
|
-
}
|
|
390
|
-
} else {
|
|
391
|
-
for (i = this.start; index < length && i < 64; ++index) {
|
|
392
|
-
code = message.charCodeAt(index);
|
|
393
|
-
if (code < 0x80) {
|
|
394
|
-
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
|
395
|
-
} else if (code < 0x800) {
|
|
396
|
-
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
|
397
|
-
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
398
|
-
} else if (code < 0xd800 || code >= 0xe000) {
|
|
399
|
-
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
|
400
|
-
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
401
|
-
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
402
|
-
} else {
|
|
403
|
-
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
|
404
|
-
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
|
405
|
-
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
|
406
|
-
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
|
407
|
-
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
this.lastByteIndex = i;
|
|
413
|
-
this.bytes += i - this.start;
|
|
414
|
-
if (i >= 64) {
|
|
415
|
-
this.block = blocks[16];
|
|
416
|
-
this.start = i - 64;
|
|
417
|
-
this.hash();
|
|
418
|
-
this.hashed = true;
|
|
419
|
-
} else {
|
|
420
|
-
this.start = i;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
if (this.bytes > 4294967295) {
|
|
424
|
-
this.hBytes += this.bytes / 4294967296 << 0;
|
|
425
|
-
this.bytes = this.bytes % 4294967296;
|
|
426
|
-
}
|
|
427
|
-
return this;
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
Sha256.prototype.finalize = function () {
|
|
431
|
-
if (this.finalized) {
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
this.finalized = true;
|
|
435
|
-
var blocks = this.blocks, i = this.lastByteIndex;
|
|
436
|
-
blocks[16] = this.block;
|
|
437
|
-
blocks[i >> 2] |= EXTRA[i & 3];
|
|
438
|
-
this.block = blocks[16];
|
|
439
|
-
if (i >= 56) {
|
|
440
|
-
if (!this.hashed) {
|
|
441
|
-
this.hash();
|
|
442
|
-
}
|
|
443
|
-
blocks[0] = this.block;
|
|
444
|
-
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
445
|
-
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
446
|
-
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
447
|
-
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
448
|
-
}
|
|
449
|
-
blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
|
|
450
|
-
blocks[15] = this.bytes << 3;
|
|
451
|
-
this.hash();
|
|
452
|
-
};
|
|
453
|
-
|
|
454
|
-
Sha256.prototype.hash = function () {
|
|
455
|
-
var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,
|
|
456
|
-
h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
|
|
457
|
-
|
|
458
|
-
for (j = 16; j < 64; ++j) {
|
|
459
|
-
// rightrotate
|
|
460
|
-
t1 = blocks[j - 15];
|
|
461
|
-
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
|
462
|
-
t1 = blocks[j - 2];
|
|
463
|
-
s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
|
|
464
|
-
blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
bc = b & c;
|
|
468
|
-
for (j = 0; j < 64; j += 4) {
|
|
469
|
-
if (this.first) {
|
|
470
|
-
if (this.is224) {
|
|
471
|
-
ab = 300032;
|
|
472
|
-
t1 = blocks[0] - 1413257819;
|
|
473
|
-
h = t1 - 150054599 << 0;
|
|
474
|
-
d = t1 + 24177077 << 0;
|
|
475
|
-
} else {
|
|
476
|
-
ab = 704751109;
|
|
477
|
-
t1 = blocks[0] - 210244248;
|
|
478
|
-
h = t1 - 1521486534 << 0;
|
|
479
|
-
d = t1 + 143694565 << 0;
|
|
480
|
-
}
|
|
481
|
-
this.first = false;
|
|
482
|
-
} else {
|
|
483
|
-
s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
|
484
|
-
s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
|
485
|
-
ab = a & b;
|
|
486
|
-
maj = ab ^ (a & c) ^ bc;
|
|
487
|
-
ch = (e & f) ^ (~e & g);
|
|
488
|
-
t1 = h + s1 + ch + K[j] + blocks[j];
|
|
489
|
-
t2 = s0 + maj;
|
|
490
|
-
h = d + t1 << 0;
|
|
491
|
-
d = t1 + t2 << 0;
|
|
492
|
-
}
|
|
493
|
-
s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
|
|
494
|
-
s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
|
|
495
|
-
da = d & a;
|
|
496
|
-
maj = da ^ (d & b) ^ ab;
|
|
497
|
-
ch = (h & e) ^ (~h & f);
|
|
498
|
-
t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
|
|
499
|
-
t2 = s0 + maj;
|
|
500
|
-
g = c + t1 << 0;
|
|
501
|
-
c = t1 + t2 << 0;
|
|
502
|
-
s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
|
|
503
|
-
s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
|
|
504
|
-
cd = c & d;
|
|
505
|
-
maj = cd ^ (c & a) ^ da;
|
|
506
|
-
ch = (g & h) ^ (~g & e);
|
|
507
|
-
t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
|
|
508
|
-
t2 = s0 + maj;
|
|
509
|
-
f = b + t1 << 0;
|
|
510
|
-
b = t1 + t2 << 0;
|
|
511
|
-
s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
|
|
512
|
-
s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
|
|
513
|
-
bc = b & c;
|
|
514
|
-
maj = bc ^ (b & d) ^ cd;
|
|
515
|
-
ch = (f & g) ^ (~f & h);
|
|
516
|
-
t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
|
|
517
|
-
t2 = s0 + maj;
|
|
518
|
-
e = a + t1 << 0;
|
|
519
|
-
a = t1 + t2 << 0;
|
|
520
|
-
this.chromeBugWorkAround = true;
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
this.h0 = this.h0 + a << 0;
|
|
524
|
-
this.h1 = this.h1 + b << 0;
|
|
525
|
-
this.h2 = this.h2 + c << 0;
|
|
526
|
-
this.h3 = this.h3 + d << 0;
|
|
527
|
-
this.h4 = this.h4 + e << 0;
|
|
528
|
-
this.h5 = this.h5 + f << 0;
|
|
529
|
-
this.h6 = this.h6 + g << 0;
|
|
530
|
-
this.h7 = this.h7 + h << 0;
|
|
531
|
-
};
|
|
532
|
-
|
|
533
|
-
Sha256.prototype.hex = function () {
|
|
534
|
-
this.finalize();
|
|
535
|
-
|
|
536
|
-
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
|
537
|
-
h6 = this.h6, h7 = this.h7;
|
|
538
|
-
|
|
539
|
-
var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
|
540
|
-
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
|
541
|
-
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
|
|
542
|
-
HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
|
543
|
-
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
|
|
544
|
-
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
|
|
545
|
-
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
|
|
546
|
-
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
|
547
|
-
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
|
|
548
|
-
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
|
|
549
|
-
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
|
|
550
|
-
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
|
551
|
-
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] +
|
|
552
|
-
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
|
|
553
|
-
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
|
|
554
|
-
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
|
555
|
-
HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] +
|
|
556
|
-
HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] +
|
|
557
|
-
HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] +
|
|
558
|
-
HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +
|
|
559
|
-
HEX_CHARS[(h5 >> 28) & 0x0F] + HEX_CHARS[(h5 >> 24) & 0x0F] +
|
|
560
|
-
HEX_CHARS[(h5 >> 20) & 0x0F] + HEX_CHARS[(h5 >> 16) & 0x0F] +
|
|
561
|
-
HEX_CHARS[(h5 >> 12) & 0x0F] + HEX_CHARS[(h5 >> 8) & 0x0F] +
|
|
562
|
-
HEX_CHARS[(h5 >> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +
|
|
563
|
-
HEX_CHARS[(h6 >> 28) & 0x0F] + HEX_CHARS[(h6 >> 24) & 0x0F] +
|
|
564
|
-
HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +
|
|
565
|
-
HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +
|
|
566
|
-
HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
|
|
567
|
-
if (!this.is224) {
|
|
568
|
-
hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +
|
|
569
|
-
HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +
|
|
570
|
-
HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +
|
|
571
|
-
HEX_CHARS[(h7 >> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];
|
|
572
|
-
}
|
|
573
|
-
return hex;
|
|
574
|
-
};
|
|
575
|
-
|
|
576
|
-
Sha256.prototype.toString = Sha256.prototype.hex;
|
|
577
|
-
|
|
578
|
-
Sha256.prototype.digest = function () {
|
|
579
|
-
this.finalize();
|
|
580
|
-
|
|
581
|
-
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
|
582
|
-
h6 = this.h6, h7 = this.h7;
|
|
583
|
-
|
|
584
|
-
var arr = [
|
|
585
|
-
(h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF,
|
|
586
|
-
(h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF,
|
|
587
|
-
(h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF,
|
|
588
|
-
(h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, h3 & 0xFF,
|
|
589
|
-
(h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, h4 & 0xFF,
|
|
590
|
-
(h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, h5 & 0xFF,
|
|
591
|
-
(h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, h6 & 0xFF
|
|
592
|
-
];
|
|
593
|
-
if (!this.is224) {
|
|
594
|
-
arr.push((h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, h7 & 0xFF);
|
|
595
|
-
}
|
|
596
|
-
return arr;
|
|
597
|
-
};
|
|
598
|
-
|
|
599
|
-
Sha256.prototype.array = Sha256.prototype.digest;
|
|
600
|
-
|
|
601
|
-
Sha256.prototype.arrayBuffer = function () {
|
|
602
|
-
this.finalize();
|
|
603
|
-
|
|
604
|
-
var buffer = new ArrayBuffer(this.is224 ? 28 : 32);
|
|
605
|
-
var dataView = new DataView(buffer);
|
|
606
|
-
dataView.setUint32(0, this.h0);
|
|
607
|
-
dataView.setUint32(4, this.h1);
|
|
608
|
-
dataView.setUint32(8, this.h2);
|
|
609
|
-
dataView.setUint32(12, this.h3);
|
|
610
|
-
dataView.setUint32(16, this.h4);
|
|
611
|
-
dataView.setUint32(20, this.h5);
|
|
612
|
-
dataView.setUint32(24, this.h6);
|
|
613
|
-
if (!this.is224) {
|
|
614
|
-
dataView.setUint32(28, this.h7);
|
|
615
|
-
}
|
|
616
|
-
return buffer;
|
|
617
|
-
};
|
|
618
|
-
|
|
619
|
-
function HmacSha256(key, is224, sharedMemory) {
|
|
620
|
-
var i, type = typeof key;
|
|
621
|
-
if (type === 'string') {
|
|
622
|
-
var bytes = [], length = key.length, index = 0, code;
|
|
623
|
-
for (i = 0; i < length; ++i) {
|
|
624
|
-
code = key.charCodeAt(i);
|
|
625
|
-
if (code < 0x80) {
|
|
626
|
-
bytes[index++] = code;
|
|
627
|
-
} else if (code < 0x800) {
|
|
628
|
-
bytes[index++] = (0xc0 | (code >> 6));
|
|
629
|
-
bytes[index++] = (0x80 | (code & 0x3f));
|
|
630
|
-
} else if (code < 0xd800 || code >= 0xe000) {
|
|
631
|
-
bytes[index++] = (0xe0 | (code >> 12));
|
|
632
|
-
bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
|
|
633
|
-
bytes[index++] = (0x80 | (code & 0x3f));
|
|
634
|
-
} else {
|
|
635
|
-
code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
|
|
636
|
-
bytes[index++] = (0xf0 | (code >> 18));
|
|
637
|
-
bytes[index++] = (0x80 | ((code >> 12) & 0x3f));
|
|
638
|
-
bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
|
|
639
|
-
bytes[index++] = (0x80 | (code & 0x3f));
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
key = bytes;
|
|
643
|
-
} else {
|
|
644
|
-
if (type === 'object') {
|
|
645
|
-
if (key === null) {
|
|
646
|
-
throw new Error(ERROR);
|
|
647
|
-
} else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {
|
|
648
|
-
key = new Uint8Array(key);
|
|
649
|
-
} else if (!Array.isArray(key)) {
|
|
650
|
-
if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {
|
|
651
|
-
throw new Error(ERROR);
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
} else {
|
|
655
|
-
throw new Error(ERROR);
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
if (key.length > 64) {
|
|
660
|
-
key = (new Sha256(is224, true)).update(key).array();
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
var oKeyPad = [], iKeyPad = [];
|
|
664
|
-
for (i = 0; i < 64; ++i) {
|
|
665
|
-
var b = key[i] || 0;
|
|
666
|
-
oKeyPad[i] = 0x5c ^ b;
|
|
667
|
-
iKeyPad[i] = 0x36 ^ b;
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
Sha256.call(this, is224, sharedMemory);
|
|
671
|
-
|
|
672
|
-
this.update(iKeyPad);
|
|
673
|
-
this.oKeyPad = oKeyPad;
|
|
674
|
-
this.inner = true;
|
|
675
|
-
this.sharedMemory = sharedMemory;
|
|
676
|
-
}
|
|
677
|
-
HmacSha256.prototype = new Sha256();
|
|
678
|
-
|
|
679
|
-
HmacSha256.prototype.finalize = function () {
|
|
680
|
-
Sha256.prototype.finalize.call(this);
|
|
681
|
-
if (this.inner) {
|
|
682
|
-
this.inner = false;
|
|
683
|
-
var innerHash = this.array();
|
|
684
|
-
Sha256.call(this, this.is224, this.sharedMemory);
|
|
685
|
-
this.update(this.oKeyPad);
|
|
686
|
-
this.update(innerHash);
|
|
687
|
-
Sha256.prototype.finalize.call(this);
|
|
688
|
-
}
|
|
689
|
-
};
|
|
690
|
-
|
|
691
|
-
var exports = createMethod();
|
|
692
|
-
exports.sha256 = exports;
|
|
693
|
-
exports.sha224 = createMethod(true);
|
|
694
|
-
exports.sha256.hmac = createHmacMethod();
|
|
695
|
-
exports.sha224.hmac = createHmacMethod(true);
|
|
696
|
-
|
|
697
|
-
if (COMMON_JS) {
|
|
698
|
-
module.exports = exports;
|
|
699
|
-
} else {
|
|
700
|
-
root.sha256 = exports.sha256;
|
|
701
|
-
root.sha224 = exports.sha224;
|
|
702
|
-
}
|
|
703
|
-
})();
|
|
704
|
-
}(sha256$1));
|
|
705
|
-
|
|
706
|
-
const sha256 = sha256$1.exports;
|
|
707
|
-
|
|
708
|
-
class InvalidTokenError extends Error {
|
|
709
|
-
}
|
|
710
|
-
InvalidTokenError.prototype.name = "InvalidTokenError";
|
|
711
|
-
function b64DecodeUnicode(str) {
|
|
712
|
-
return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
|
|
713
|
-
let code = p.charCodeAt(0).toString(16).toUpperCase();
|
|
714
|
-
if (code.length < 2) {
|
|
715
|
-
code = "0" + code;
|
|
716
|
-
}
|
|
717
|
-
return "%" + code;
|
|
718
|
-
}));
|
|
719
|
-
}
|
|
720
|
-
function base64UrlDecode(str) {
|
|
721
|
-
let output = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
722
|
-
switch (output.length % 4) {
|
|
723
|
-
case 0:
|
|
724
|
-
break;
|
|
725
|
-
case 2:
|
|
726
|
-
output += "==";
|
|
727
|
-
break;
|
|
728
|
-
case 3:
|
|
729
|
-
output += "=";
|
|
730
|
-
break;
|
|
731
|
-
default:
|
|
732
|
-
throw new Error("base64 string is not of the correct length");
|
|
733
|
-
}
|
|
734
|
-
try {
|
|
735
|
-
return b64DecodeUnicode(output);
|
|
736
|
-
}
|
|
737
|
-
catch (err) {
|
|
738
|
-
return atob(output);
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
function jwtDecode(token, options) {
|
|
742
|
-
if (typeof token !== "string") {
|
|
743
|
-
throw new InvalidTokenError("Invalid token specified: must be a string");
|
|
744
|
-
}
|
|
745
|
-
options || (options = {});
|
|
746
|
-
const pos = options.header === true ? 0 : 1;
|
|
747
|
-
const part = token.split(".")[pos];
|
|
748
|
-
if (typeof part !== "string") {
|
|
749
|
-
throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
|
|
750
|
-
}
|
|
751
|
-
let decoded;
|
|
752
|
-
try {
|
|
753
|
-
decoded = base64UrlDecode(part);
|
|
754
|
-
}
|
|
755
|
-
catch (e) {
|
|
756
|
-
throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
|
|
757
|
-
}
|
|
758
|
-
try {
|
|
759
|
-
return JSON.parse(decoded);
|
|
760
|
-
}
|
|
761
|
-
catch (e) {
|
|
762
|
-
throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
/*
|
|
767
|
-
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
768
|
-
* and other contributors as indicated by the @author tags.
|
|
769
|
-
*
|
|
770
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
771
|
-
* you may not use this file except in compliance with the License.
|
|
772
|
-
* You may obtain a copy of the License at
|
|
773
|
-
*
|
|
774
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
775
|
-
*
|
|
776
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
777
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
778
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
779
|
-
* See the License for the specific language governing permissions and
|
|
780
|
-
* limitations under the License.
|
|
781
|
-
*/
|
|
782
|
-
|
|
783
|
-
if (typeof Promise === 'undefined') {
|
|
784
|
-
throw Error('Keycloak requires an environment that supports Promises. Make sure that you include the appropriate polyfill.');
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
function Keycloak (config) {
|
|
788
|
-
if (!(this instanceof Keycloak)) {
|
|
789
|
-
throw new Error("The 'Keycloak' constructor must be invoked with 'new'.")
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
var kc = this;
|
|
793
|
-
var adapter;
|
|
794
|
-
var refreshQueue = [];
|
|
795
|
-
var callbackStorage;
|
|
796
|
-
|
|
797
|
-
var loginIframe = {
|
|
798
|
-
enable: true,
|
|
799
|
-
callbackList: [],
|
|
800
|
-
interval: 5
|
|
801
|
-
};
|
|
802
|
-
|
|
803
|
-
var scripts = document.getElementsByTagName('script');
|
|
804
|
-
for (var i = 0; i < scripts.length; i++) {
|
|
805
|
-
if ((scripts[i].src.indexOf('keycloak.js') !== -1 || scripts[i].src.indexOf('keycloak.min.js') !== -1) && scripts[i].src.indexOf('version=') !== -1) {
|
|
806
|
-
kc.iframeVersion = scripts[i].src.substring(scripts[i].src.indexOf('version=') + 8).split('&')[0];
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
var useNonce = true;
|
|
811
|
-
var logInfo = createLogger(console.info);
|
|
812
|
-
var logWarn = createLogger(console.warn);
|
|
813
|
-
|
|
814
|
-
kc.init = function (initOptions) {
|
|
815
|
-
if (kc.didInitialize) {
|
|
816
|
-
throw new Error("A 'Keycloak' instance can only be initialized once.");
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
kc.didInitialize = true;
|
|
820
|
-
|
|
821
|
-
kc.authenticated = false;
|
|
822
|
-
|
|
823
|
-
callbackStorage = createCallbackStorage();
|
|
824
|
-
var adapters = ['default', 'cordova', 'cordova-native'];
|
|
825
|
-
|
|
826
|
-
if (initOptions && adapters.indexOf(initOptions.adapter) > -1) {
|
|
827
|
-
adapter = loadAdapter(initOptions.adapter);
|
|
828
|
-
} else if (initOptions && typeof initOptions.adapter === "object") {
|
|
829
|
-
adapter = initOptions.adapter;
|
|
830
|
-
} else {
|
|
831
|
-
if (window.Cordova || window.cordova) {
|
|
832
|
-
adapter = loadAdapter('cordova');
|
|
833
|
-
} else {
|
|
834
|
-
adapter = loadAdapter();
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
if (initOptions) {
|
|
839
|
-
if (typeof initOptions.useNonce !== 'undefined') {
|
|
840
|
-
useNonce = initOptions.useNonce;
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
if (typeof initOptions.checkLoginIframe !== 'undefined') {
|
|
844
|
-
loginIframe.enable = initOptions.checkLoginIframe;
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
if (initOptions.checkLoginIframeInterval) {
|
|
848
|
-
loginIframe.interval = initOptions.checkLoginIframeInterval;
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
if (initOptions.onLoad === 'login-required') {
|
|
852
|
-
kc.loginRequired = true;
|
|
853
|
-
}
|
|
854
|
-
|
|
855
|
-
if (initOptions.responseMode) {
|
|
856
|
-
if (initOptions.responseMode === 'query' || initOptions.responseMode === 'fragment') {
|
|
857
|
-
kc.responseMode = initOptions.responseMode;
|
|
858
|
-
} else {
|
|
859
|
-
throw 'Invalid value for responseMode';
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
if (initOptions.flow) {
|
|
864
|
-
switch (initOptions.flow) {
|
|
865
|
-
case 'standard':
|
|
866
|
-
kc.responseType = 'code';
|
|
867
|
-
break;
|
|
868
|
-
case 'implicit':
|
|
869
|
-
kc.responseType = 'id_token token';
|
|
870
|
-
break;
|
|
871
|
-
case 'hybrid':
|
|
872
|
-
kc.responseType = 'code id_token token';
|
|
873
|
-
break;
|
|
874
|
-
default:
|
|
875
|
-
throw 'Invalid value for flow';
|
|
876
|
-
}
|
|
877
|
-
kc.flow = initOptions.flow;
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
if (initOptions.timeSkew != null) {
|
|
881
|
-
kc.timeSkew = initOptions.timeSkew;
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
if(initOptions.redirectUri) {
|
|
885
|
-
kc.redirectUri = initOptions.redirectUri;
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
if (initOptions.silentCheckSsoRedirectUri) {
|
|
889
|
-
kc.silentCheckSsoRedirectUri = initOptions.silentCheckSsoRedirectUri;
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
if (typeof initOptions.silentCheckSsoFallback === 'boolean') {
|
|
893
|
-
kc.silentCheckSsoFallback = initOptions.silentCheckSsoFallback;
|
|
894
|
-
} else {
|
|
895
|
-
kc.silentCheckSsoFallback = true;
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
if (initOptions.pkceMethod) {
|
|
899
|
-
if (initOptions.pkceMethod !== "S256") {
|
|
900
|
-
throw 'Invalid value for pkceMethod';
|
|
901
|
-
}
|
|
902
|
-
kc.pkceMethod = initOptions.pkceMethod;
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
if (typeof initOptions.enableLogging === 'boolean') {
|
|
906
|
-
kc.enableLogging = initOptions.enableLogging;
|
|
907
|
-
} else {
|
|
908
|
-
kc.enableLogging = false;
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
if (typeof initOptions.scope === 'string') {
|
|
912
|
-
kc.scope = initOptions.scope;
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
if (typeof initOptions.acrValues === 'string') {
|
|
916
|
-
kc.acrValues = initOptions.acrValues;
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
if (typeof initOptions.messageReceiveTimeout === 'number' && initOptions.messageReceiveTimeout > 0) {
|
|
920
|
-
kc.messageReceiveTimeout = initOptions.messageReceiveTimeout;
|
|
921
|
-
} else {
|
|
922
|
-
kc.messageReceiveTimeout = 10000;
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
if (!kc.responseMode) {
|
|
927
|
-
kc.responseMode = 'fragment';
|
|
928
|
-
}
|
|
929
|
-
if (!kc.responseType) {
|
|
930
|
-
kc.responseType = 'code';
|
|
931
|
-
kc.flow = 'standard';
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
var promise = createPromise();
|
|
935
|
-
|
|
936
|
-
var initPromise = createPromise();
|
|
937
|
-
initPromise.promise.then(function() {
|
|
938
|
-
kc.onReady && kc.onReady(kc.authenticated);
|
|
939
|
-
promise.setSuccess(kc.authenticated);
|
|
940
|
-
}).catch(function(error) {
|
|
941
|
-
promise.setError(error);
|
|
942
|
-
});
|
|
943
|
-
|
|
944
|
-
var configPromise = loadConfig();
|
|
945
|
-
|
|
946
|
-
function onLoad() {
|
|
947
|
-
var doLogin = function(prompt) {
|
|
948
|
-
if (!prompt) {
|
|
949
|
-
options.prompt = 'none';
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
if (initOptions && initOptions.locale) {
|
|
953
|
-
options.locale = initOptions.locale;
|
|
954
|
-
}
|
|
955
|
-
kc.login(options).then(function () {
|
|
956
|
-
initPromise.setSuccess();
|
|
957
|
-
}).catch(function (error) {
|
|
958
|
-
initPromise.setError(error);
|
|
959
|
-
});
|
|
960
|
-
};
|
|
961
|
-
|
|
962
|
-
var checkSsoSilently = function() {
|
|
963
|
-
var ifrm = document.createElement("iframe");
|
|
964
|
-
var src = kc.createLoginUrl({prompt: 'none', redirectUri: kc.silentCheckSsoRedirectUri});
|
|
965
|
-
ifrm.setAttribute("src", src);
|
|
966
|
-
ifrm.setAttribute("sandbox", "allow-storage-access-by-user-activation allow-scripts allow-same-origin");
|
|
967
|
-
ifrm.setAttribute("title", "keycloak-silent-check-sso");
|
|
968
|
-
ifrm.style.display = "none";
|
|
969
|
-
document.body.appendChild(ifrm);
|
|
970
|
-
|
|
971
|
-
var messageCallback = function(event) {
|
|
972
|
-
if (event.origin !== window.location.origin || ifrm.contentWindow !== event.source) {
|
|
973
|
-
return;
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
var oauth = parseCallback(event.data);
|
|
977
|
-
processCallback(oauth, initPromise);
|
|
978
|
-
|
|
979
|
-
document.body.removeChild(ifrm);
|
|
980
|
-
window.removeEventListener("message", messageCallback);
|
|
981
|
-
};
|
|
982
|
-
|
|
983
|
-
window.addEventListener("message", messageCallback);
|
|
984
|
-
};
|
|
985
|
-
|
|
986
|
-
var options = {};
|
|
987
|
-
switch (initOptions.onLoad) {
|
|
988
|
-
case 'check-sso':
|
|
989
|
-
if (loginIframe.enable) {
|
|
990
|
-
setupCheckLoginIframe().then(function() {
|
|
991
|
-
checkLoginIframe().then(function (unchanged) {
|
|
992
|
-
if (!unchanged) {
|
|
993
|
-
kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false);
|
|
994
|
-
} else {
|
|
995
|
-
initPromise.setSuccess();
|
|
996
|
-
}
|
|
997
|
-
}).catch(function (error) {
|
|
998
|
-
initPromise.setError(error);
|
|
999
|
-
});
|
|
1000
|
-
});
|
|
1001
|
-
} else {
|
|
1002
|
-
kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false);
|
|
1003
|
-
}
|
|
1004
|
-
break;
|
|
1005
|
-
case 'login-required':
|
|
1006
|
-
doLogin(true);
|
|
1007
|
-
break;
|
|
1008
|
-
default:
|
|
1009
|
-
throw 'Invalid value for onLoad';
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
function processInit() {
|
|
1014
|
-
var callback = parseCallback(window.location.href);
|
|
1015
|
-
|
|
1016
|
-
if (callback) {
|
|
1017
|
-
window.history.replaceState(window.history.state, null, callback.newUrl);
|
|
1018
|
-
}
|
|
1019
|
-
|
|
1020
|
-
if (callback && callback.valid) {
|
|
1021
|
-
return setupCheckLoginIframe().then(function() {
|
|
1022
|
-
processCallback(callback, initPromise);
|
|
1023
|
-
}).catch(function (error) {
|
|
1024
|
-
initPromise.setError(error);
|
|
1025
|
-
});
|
|
1026
|
-
} else if (initOptions) {
|
|
1027
|
-
if (initOptions.token && initOptions.refreshToken) {
|
|
1028
|
-
setToken(initOptions.token, initOptions.refreshToken, initOptions.idToken);
|
|
1029
|
-
|
|
1030
|
-
if (loginIframe.enable) {
|
|
1031
|
-
setupCheckLoginIframe().then(function() {
|
|
1032
|
-
checkLoginIframe().then(function (unchanged) {
|
|
1033
|
-
if (unchanged) {
|
|
1034
|
-
kc.onAuthSuccess && kc.onAuthSuccess();
|
|
1035
|
-
initPromise.setSuccess();
|
|
1036
|
-
scheduleCheckIframe();
|
|
1037
|
-
} else {
|
|
1038
|
-
initPromise.setSuccess();
|
|
1039
|
-
}
|
|
1040
|
-
}).catch(function (error) {
|
|
1041
|
-
initPromise.setError(error);
|
|
1042
|
-
});
|
|
1043
|
-
});
|
|
1044
|
-
} else {
|
|
1045
|
-
kc.updateToken(-1).then(function() {
|
|
1046
|
-
kc.onAuthSuccess && kc.onAuthSuccess();
|
|
1047
|
-
initPromise.setSuccess();
|
|
1048
|
-
}).catch(function(error) {
|
|
1049
|
-
kc.onAuthError && kc.onAuthError();
|
|
1050
|
-
if (initOptions.onLoad) {
|
|
1051
|
-
onLoad();
|
|
1052
|
-
} else {
|
|
1053
|
-
initPromise.setError(error);
|
|
1054
|
-
}
|
|
1055
|
-
});
|
|
1056
|
-
}
|
|
1057
|
-
} else if (initOptions.onLoad) {
|
|
1058
|
-
onLoad();
|
|
1059
|
-
} else {
|
|
1060
|
-
initPromise.setSuccess();
|
|
1061
|
-
}
|
|
1062
|
-
} else {
|
|
1063
|
-
initPromise.setSuccess();
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
function domReady() {
|
|
1068
|
-
var promise = createPromise();
|
|
1069
|
-
|
|
1070
|
-
var checkReadyState = function () {
|
|
1071
|
-
if (document.readyState === 'interactive' || document.readyState === 'complete') {
|
|
1072
|
-
document.removeEventListener('readystatechange', checkReadyState);
|
|
1073
|
-
promise.setSuccess();
|
|
1074
|
-
}
|
|
1075
|
-
};
|
|
1076
|
-
document.addEventListener('readystatechange', checkReadyState);
|
|
1077
|
-
|
|
1078
|
-
checkReadyState(); // just in case the event was already fired and we missed it (in case the init is done later than at the load time, i.e. it's done from code)
|
|
1079
|
-
|
|
1080
|
-
return promise.promise;
|
|
1081
|
-
}
|
|
1082
|
-
|
|
1083
|
-
configPromise.then(function () {
|
|
1084
|
-
domReady()
|
|
1085
|
-
.then(check3pCookiesSupported)
|
|
1086
|
-
.then(processInit)
|
|
1087
|
-
.catch(function (error) {
|
|
1088
|
-
promise.setError(error);
|
|
1089
|
-
});
|
|
1090
|
-
});
|
|
1091
|
-
configPromise.catch(function (error) {
|
|
1092
|
-
promise.setError(error);
|
|
1093
|
-
});
|
|
1094
|
-
|
|
1095
|
-
return promise.promise;
|
|
1096
|
-
};
|
|
1097
|
-
|
|
1098
|
-
kc.login = function (options) {
|
|
1099
|
-
return adapter.login(options);
|
|
1100
|
-
};
|
|
1101
|
-
|
|
1102
|
-
function generateRandomData(len) {
|
|
1103
|
-
// use web crypto APIs if possible
|
|
1104
|
-
var array = null;
|
|
1105
|
-
var crypto = window.crypto || window.msCrypto;
|
|
1106
|
-
if (crypto && crypto.getRandomValues && window.Uint8Array) {
|
|
1107
|
-
array = new Uint8Array(len);
|
|
1108
|
-
crypto.getRandomValues(array);
|
|
1109
|
-
return array;
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
// fallback to Math random
|
|
1113
|
-
array = new Array(len);
|
|
1114
|
-
for (var j = 0; j < array.length; j++) {
|
|
1115
|
-
array[j] = Math.floor(256 * Math.random());
|
|
1116
|
-
}
|
|
1117
|
-
return array;
|
|
1118
|
-
}
|
|
1119
|
-
|
|
1120
|
-
function generateCodeVerifier(len) {
|
|
1121
|
-
return generateRandomString(len, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789');
|
|
1122
|
-
}
|
|
1123
|
-
|
|
1124
|
-
function generateRandomString(len, alphabet){
|
|
1125
|
-
var randomData = generateRandomData(len);
|
|
1126
|
-
var chars = new Array(len);
|
|
1127
|
-
for (var i = 0; i < len; i++) {
|
|
1128
|
-
chars[i] = alphabet.charCodeAt(randomData[i] % alphabet.length);
|
|
1129
|
-
}
|
|
1130
|
-
return String.fromCharCode.apply(null, chars);
|
|
1131
|
-
}
|
|
1132
|
-
|
|
1133
|
-
function generatePkceChallenge(pkceMethod, codeVerifier) {
|
|
1134
|
-
switch (pkceMethod) {
|
|
1135
|
-
// The use of the "plain" method is considered insecure and therefore not supported.
|
|
1136
|
-
case "S256":
|
|
1137
|
-
// hash codeVerifier, then encode as url-safe base64 without padding
|
|
1138
|
-
var hashBytes = new Uint8Array(sha256.arrayBuffer(codeVerifier));
|
|
1139
|
-
var encodedHash = base64Js.fromByteArray(hashBytes)
|
|
1140
|
-
.replace(/\+/g, '-')
|
|
1141
|
-
.replace(/\//g, '_')
|
|
1142
|
-
.replace(/\=/g, '');
|
|
1143
|
-
return encodedHash;
|
|
1144
|
-
default:
|
|
1145
|
-
throw 'Invalid value for pkceMethod';
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
|
|
1149
|
-
function buildClaimsParameter(requestedAcr){
|
|
1150
|
-
var claims = {
|
|
1151
|
-
id_token: {
|
|
1152
|
-
acr: requestedAcr
|
|
1153
|
-
}
|
|
1154
|
-
};
|
|
1155
|
-
return JSON.stringify(claims);
|
|
1156
|
-
}
|
|
1157
|
-
|
|
1158
|
-
kc.createLoginUrl = function(options) {
|
|
1159
|
-
var state = createUUID();
|
|
1160
|
-
var nonce = createUUID();
|
|
1161
|
-
|
|
1162
|
-
var redirectUri = adapter.redirectUri(options);
|
|
1163
|
-
|
|
1164
|
-
var callbackState = {
|
|
1165
|
-
state: state,
|
|
1166
|
-
nonce: nonce,
|
|
1167
|
-
redirectUri: encodeURIComponent(redirectUri)
|
|
1168
|
-
};
|
|
1169
|
-
|
|
1170
|
-
if (options && options.prompt) {
|
|
1171
|
-
callbackState.prompt = options.prompt;
|
|
1172
|
-
}
|
|
1173
|
-
|
|
1174
|
-
var baseUrl;
|
|
1175
|
-
if (options && options.action == 'register') {
|
|
1176
|
-
baseUrl = kc.endpoints.register();
|
|
1177
|
-
} else {
|
|
1178
|
-
baseUrl = kc.endpoints.authorize();
|
|
1179
|
-
}
|
|
1180
|
-
|
|
1181
|
-
var scope = options && options.scope || kc.scope;
|
|
1182
|
-
if (!scope) {
|
|
1183
|
-
// if scope is not set, default to "openid"
|
|
1184
|
-
scope = "openid";
|
|
1185
|
-
} else if (scope.indexOf("openid") === -1) {
|
|
1186
|
-
// if openid scope is missing, prefix the given scopes with it
|
|
1187
|
-
scope = "openid " + scope;
|
|
1188
|
-
}
|
|
1189
|
-
|
|
1190
|
-
var url = baseUrl
|
|
1191
|
-
+ '?client_id=' + encodeURIComponent(kc.clientId)
|
|
1192
|
-
+ '&redirect_uri=' + encodeURIComponent(redirectUri)
|
|
1193
|
-
+ '&state=' + encodeURIComponent(state)
|
|
1194
|
-
+ '&response_mode=' + encodeURIComponent(kc.responseMode)
|
|
1195
|
-
+ '&response_type=' + encodeURIComponent(kc.responseType)
|
|
1196
|
-
+ '&scope=' + encodeURIComponent(scope);
|
|
1197
|
-
if (useNonce) {
|
|
1198
|
-
url = url + '&nonce=' + encodeURIComponent(nonce);
|
|
1199
|
-
}
|
|
1200
|
-
|
|
1201
|
-
if (options && options.prompt) {
|
|
1202
|
-
url += '&prompt=' + encodeURIComponent(options.prompt);
|
|
1203
|
-
}
|
|
1204
|
-
|
|
1205
|
-
if (options && options.maxAge) {
|
|
1206
|
-
url += '&max_age=' + encodeURIComponent(options.maxAge);
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
if (options && options.loginHint) {
|
|
1210
|
-
url += '&login_hint=' + encodeURIComponent(options.loginHint);
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
if (options && options.idpHint) {
|
|
1214
|
-
url += '&kc_idp_hint=' + encodeURIComponent(options.idpHint);
|
|
1215
|
-
}
|
|
1216
|
-
|
|
1217
|
-
if (options && options.action && options.action != 'register') {
|
|
1218
|
-
url += '&kc_action=' + encodeURIComponent(options.action);
|
|
1219
|
-
}
|
|
1220
|
-
|
|
1221
|
-
if (options && options.locale) {
|
|
1222
|
-
url += '&ui_locales=' + encodeURIComponent(options.locale);
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
if (options && options.acr) {
|
|
1226
|
-
var claimsParameter = buildClaimsParameter(options.acr);
|
|
1227
|
-
url += '&claims=' + encodeURIComponent(claimsParameter);
|
|
1228
|
-
}
|
|
1229
|
-
|
|
1230
|
-
if ((options && options.acrValues) || kc.acrValues) {
|
|
1231
|
-
url += '&acr_values=' + encodeURIComponent(options.acrValues || kc.acrValues);
|
|
1232
|
-
}
|
|
1233
|
-
|
|
1234
|
-
if (kc.pkceMethod) {
|
|
1235
|
-
var codeVerifier = generateCodeVerifier(96);
|
|
1236
|
-
callbackState.pkceCodeVerifier = codeVerifier;
|
|
1237
|
-
var pkceChallenge = generatePkceChallenge(kc.pkceMethod, codeVerifier);
|
|
1238
|
-
url += '&code_challenge=' + pkceChallenge;
|
|
1239
|
-
url += '&code_challenge_method=' + kc.pkceMethod;
|
|
1240
|
-
}
|
|
1241
|
-
|
|
1242
|
-
callbackStorage.add(callbackState);
|
|
1243
|
-
|
|
1244
|
-
return url;
|
|
1245
|
-
};
|
|
1246
|
-
|
|
1247
|
-
kc.logout = function(options) {
|
|
1248
|
-
return adapter.logout(options);
|
|
1249
|
-
};
|
|
1250
|
-
|
|
1251
|
-
kc.createLogoutUrl = function(options) {
|
|
1252
|
-
var url = kc.endpoints.logout()
|
|
1253
|
-
+ '?client_id=' + encodeURIComponent(kc.clientId)
|
|
1254
|
-
+ '&post_logout_redirect_uri=' + encodeURIComponent(adapter.redirectUri(options, false));
|
|
1255
|
-
|
|
1256
|
-
if (kc.idToken) {
|
|
1257
|
-
url += '&id_token_hint=' + encodeURIComponent(kc.idToken);
|
|
1258
|
-
}
|
|
1259
|
-
|
|
1260
|
-
return url;
|
|
1261
|
-
};
|
|
1262
|
-
|
|
1263
|
-
kc.register = function (options) {
|
|
1264
|
-
return adapter.register(options);
|
|
1265
|
-
};
|
|
1266
|
-
|
|
1267
|
-
kc.createRegisterUrl = function(options) {
|
|
1268
|
-
if (!options) {
|
|
1269
|
-
options = {};
|
|
1270
|
-
}
|
|
1271
|
-
options.action = 'register';
|
|
1272
|
-
return kc.createLoginUrl(options);
|
|
1273
|
-
};
|
|
1274
|
-
|
|
1275
|
-
kc.createAccountUrl = function(options) {
|
|
1276
|
-
var realm = getRealmUrl();
|
|
1277
|
-
var url = undefined;
|
|
1278
|
-
if (typeof realm !== 'undefined') {
|
|
1279
|
-
url = realm
|
|
1280
|
-
+ '/account'
|
|
1281
|
-
+ '?referrer=' + encodeURIComponent(kc.clientId)
|
|
1282
|
-
+ '&referrer_uri=' + encodeURIComponent(adapter.redirectUri(options));
|
|
1283
|
-
}
|
|
1284
|
-
return url;
|
|
1285
|
-
};
|
|
1286
|
-
|
|
1287
|
-
kc.accountManagement = function() {
|
|
1288
|
-
return adapter.accountManagement();
|
|
1289
|
-
};
|
|
1290
|
-
|
|
1291
|
-
kc.hasRealmRole = function (role) {
|
|
1292
|
-
var access = kc.realmAccess;
|
|
1293
|
-
return !!access && access.roles.indexOf(role) >= 0;
|
|
1294
|
-
};
|
|
1295
|
-
|
|
1296
|
-
kc.hasResourceRole = function(role, resource) {
|
|
1297
|
-
if (!kc.resourceAccess) {
|
|
1298
|
-
return false;
|
|
1299
|
-
}
|
|
1300
|
-
|
|
1301
|
-
var access = kc.resourceAccess[resource || kc.clientId];
|
|
1302
|
-
return !!access && access.roles.indexOf(role) >= 0;
|
|
1303
|
-
};
|
|
1304
|
-
|
|
1305
|
-
kc.loadUserProfile = function() {
|
|
1306
|
-
var url = getRealmUrl() + '/account';
|
|
1307
|
-
var req = new XMLHttpRequest();
|
|
1308
|
-
req.open('GET', url, true);
|
|
1309
|
-
req.setRequestHeader('Accept', 'application/json');
|
|
1310
|
-
req.setRequestHeader('Authorization', 'bearer ' + kc.token);
|
|
1311
|
-
|
|
1312
|
-
var promise = createPromise();
|
|
1313
|
-
|
|
1314
|
-
req.onreadystatechange = function () {
|
|
1315
|
-
if (req.readyState == 4) {
|
|
1316
|
-
if (req.status == 200) {
|
|
1317
|
-
kc.profile = JSON.parse(req.responseText);
|
|
1318
|
-
promise.setSuccess(kc.profile);
|
|
1319
|
-
} else {
|
|
1320
|
-
promise.setError();
|
|
1321
|
-
}
|
|
1322
|
-
}
|
|
1323
|
-
};
|
|
1324
|
-
|
|
1325
|
-
req.send();
|
|
1326
|
-
|
|
1327
|
-
return promise.promise;
|
|
1328
|
-
};
|
|
1329
|
-
|
|
1330
|
-
kc.loadUserInfo = function() {
|
|
1331
|
-
var url = kc.endpoints.userinfo();
|
|
1332
|
-
var req = new XMLHttpRequest();
|
|
1333
|
-
req.open('GET', url, true);
|
|
1334
|
-
req.setRequestHeader('Accept', 'application/json');
|
|
1335
|
-
req.setRequestHeader('Authorization', 'bearer ' + kc.token);
|
|
1336
|
-
|
|
1337
|
-
var promise = createPromise();
|
|
1338
|
-
|
|
1339
|
-
req.onreadystatechange = function () {
|
|
1340
|
-
if (req.readyState == 4) {
|
|
1341
|
-
if (req.status == 200) {
|
|
1342
|
-
kc.userInfo = JSON.parse(req.responseText);
|
|
1343
|
-
promise.setSuccess(kc.userInfo);
|
|
1344
|
-
} else {
|
|
1345
|
-
promise.setError();
|
|
1346
|
-
}
|
|
1347
|
-
}
|
|
1348
|
-
};
|
|
1349
|
-
|
|
1350
|
-
req.send();
|
|
1351
|
-
|
|
1352
|
-
return promise.promise;
|
|
1353
|
-
};
|
|
1354
|
-
|
|
1355
|
-
kc.isTokenExpired = function(minValidity) {
|
|
1356
|
-
if (!kc.tokenParsed || (!kc.refreshToken && kc.flow != 'implicit' )) {
|
|
1357
|
-
throw 'Not authenticated';
|
|
1358
|
-
}
|
|
1359
|
-
|
|
1360
|
-
if (kc.timeSkew == null) {
|
|
1361
|
-
logInfo('[KEYCLOAK] Unable to determine if token is expired as timeskew is not set');
|
|
1362
|
-
return true;
|
|
1363
|
-
}
|
|
1364
|
-
|
|
1365
|
-
var expiresIn = kc.tokenParsed['exp'] - Math.ceil(new Date().getTime() / 1000) + kc.timeSkew;
|
|
1366
|
-
if (minValidity) {
|
|
1367
|
-
if (isNaN(minValidity)) {
|
|
1368
|
-
throw 'Invalid minValidity';
|
|
1369
|
-
}
|
|
1370
|
-
expiresIn -= minValidity;
|
|
1371
|
-
}
|
|
1372
|
-
return expiresIn < 0;
|
|
1373
|
-
};
|
|
1374
|
-
|
|
1375
|
-
kc.updateToken = function(minValidity) {
|
|
1376
|
-
var promise = createPromise();
|
|
1377
|
-
|
|
1378
|
-
if (!kc.refreshToken) {
|
|
1379
|
-
promise.setError();
|
|
1380
|
-
return promise.promise;
|
|
1381
|
-
}
|
|
1382
|
-
|
|
1383
|
-
minValidity = minValidity || 5;
|
|
1384
|
-
|
|
1385
|
-
var exec = function() {
|
|
1386
|
-
var refreshToken = false;
|
|
1387
|
-
if (minValidity == -1) {
|
|
1388
|
-
refreshToken = true;
|
|
1389
|
-
logInfo('[KEYCLOAK] Refreshing token: forced refresh');
|
|
1390
|
-
} else if (!kc.tokenParsed || kc.isTokenExpired(minValidity)) {
|
|
1391
|
-
refreshToken = true;
|
|
1392
|
-
logInfo('[KEYCLOAK] Refreshing token: token expired');
|
|
1393
|
-
}
|
|
1394
|
-
|
|
1395
|
-
if (!refreshToken) {
|
|
1396
|
-
promise.setSuccess(false);
|
|
1397
|
-
} else {
|
|
1398
|
-
var params = 'grant_type=refresh_token&' + 'refresh_token=' + kc.refreshToken;
|
|
1399
|
-
var url = kc.endpoints.token();
|
|
1400
|
-
|
|
1401
|
-
refreshQueue.push(promise);
|
|
1402
|
-
|
|
1403
|
-
if (refreshQueue.length == 1) {
|
|
1404
|
-
var req = new XMLHttpRequest();
|
|
1405
|
-
req.open('POST', url, true);
|
|
1406
|
-
req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
1407
|
-
req.withCredentials = true;
|
|
1408
|
-
|
|
1409
|
-
params += '&client_id=' + encodeURIComponent(kc.clientId);
|
|
1410
|
-
|
|
1411
|
-
var timeLocal = new Date().getTime();
|
|
1412
|
-
|
|
1413
|
-
req.onreadystatechange = function () {
|
|
1414
|
-
if (req.readyState == 4) {
|
|
1415
|
-
if (req.status == 200) {
|
|
1416
|
-
logInfo('[KEYCLOAK] Token refreshed');
|
|
1417
|
-
|
|
1418
|
-
timeLocal = (timeLocal + new Date().getTime()) / 2;
|
|
1419
|
-
|
|
1420
|
-
var tokenResponse = JSON.parse(req.responseText);
|
|
1421
|
-
|
|
1422
|
-
setToken(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], timeLocal);
|
|
1423
|
-
|
|
1424
|
-
kc.onAuthRefreshSuccess && kc.onAuthRefreshSuccess();
|
|
1425
|
-
for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {
|
|
1426
|
-
p.setSuccess(true);
|
|
1427
|
-
}
|
|
1428
|
-
} else {
|
|
1429
|
-
logWarn('[KEYCLOAK] Failed to refresh token');
|
|
1430
|
-
|
|
1431
|
-
if (req.status == 400) {
|
|
1432
|
-
kc.clearToken();
|
|
1433
|
-
}
|
|
1434
|
-
|
|
1435
|
-
kc.onAuthRefreshError && kc.onAuthRefreshError();
|
|
1436
|
-
for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {
|
|
1437
|
-
p.setError(true);
|
|
1438
|
-
}
|
|
1439
|
-
}
|
|
1440
|
-
}
|
|
1441
|
-
};
|
|
1442
|
-
|
|
1443
|
-
req.send(params);
|
|
1444
|
-
}
|
|
1445
|
-
}
|
|
1446
|
-
};
|
|
1447
|
-
|
|
1448
|
-
if (loginIframe.enable) {
|
|
1449
|
-
var iframePromise = checkLoginIframe();
|
|
1450
|
-
iframePromise.then(function() {
|
|
1451
|
-
exec();
|
|
1452
|
-
}).catch(function(error) {
|
|
1453
|
-
promise.setError(error);
|
|
1454
|
-
});
|
|
1455
|
-
} else {
|
|
1456
|
-
exec();
|
|
1457
|
-
}
|
|
1458
|
-
|
|
1459
|
-
return promise.promise;
|
|
1460
|
-
};
|
|
1461
|
-
|
|
1462
|
-
kc.clearToken = function() {
|
|
1463
|
-
if (kc.token) {
|
|
1464
|
-
setToken(null, null, null);
|
|
1465
|
-
kc.onAuthLogout && kc.onAuthLogout();
|
|
1466
|
-
if (kc.loginRequired) {
|
|
1467
|
-
kc.login();
|
|
1468
|
-
}
|
|
1469
|
-
}
|
|
1470
|
-
};
|
|
1471
|
-
|
|
1472
|
-
function getRealmUrl() {
|
|
1473
|
-
if (typeof kc.authServerUrl !== 'undefined') {
|
|
1474
|
-
if (kc.authServerUrl.charAt(kc.authServerUrl.length - 1) == '/') {
|
|
1475
|
-
return kc.authServerUrl + 'realms/' + encodeURIComponent(kc.realm);
|
|
1476
|
-
} else {
|
|
1477
|
-
return kc.authServerUrl + '/realms/' + encodeURIComponent(kc.realm);
|
|
1478
|
-
}
|
|
1479
|
-
} else {
|
|
1480
|
-
return undefined;
|
|
1481
|
-
}
|
|
1482
|
-
}
|
|
1483
|
-
|
|
1484
|
-
function getOrigin() {
|
|
1485
|
-
if (!window.location.origin) {
|
|
1486
|
-
return window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
|
|
1487
|
-
} else {
|
|
1488
|
-
return window.location.origin;
|
|
1489
|
-
}
|
|
1490
|
-
}
|
|
1491
|
-
|
|
1492
|
-
function processCallback(oauth, promise) {
|
|
1493
|
-
var code = oauth.code;
|
|
1494
|
-
var error = oauth.error;
|
|
1495
|
-
var prompt = oauth.prompt;
|
|
1496
|
-
|
|
1497
|
-
var timeLocal = new Date().getTime();
|
|
1498
|
-
|
|
1499
|
-
if (oauth['kc_action_status']) {
|
|
1500
|
-
kc.onActionUpdate && kc.onActionUpdate(oauth['kc_action_status']);
|
|
1501
|
-
}
|
|
1502
|
-
|
|
1503
|
-
if (error) {
|
|
1504
|
-
if (prompt != 'none') {
|
|
1505
|
-
var errorData = { error: error, error_description: oauth.error_description };
|
|
1506
|
-
kc.onAuthError && kc.onAuthError(errorData);
|
|
1507
|
-
promise && promise.setError(errorData);
|
|
1508
|
-
} else {
|
|
1509
|
-
promise && promise.setSuccess();
|
|
1510
|
-
}
|
|
1511
|
-
return;
|
|
1512
|
-
} else if ((kc.flow != 'standard') && (oauth.access_token || oauth.id_token)) {
|
|
1513
|
-
authSuccess(oauth.access_token, null, oauth.id_token, true);
|
|
1514
|
-
}
|
|
1515
|
-
|
|
1516
|
-
if ((kc.flow != 'implicit') && code) {
|
|
1517
|
-
var params = 'code=' + code + '&grant_type=authorization_code';
|
|
1518
|
-
var url = kc.endpoints.token();
|
|
1519
|
-
|
|
1520
|
-
var req = new XMLHttpRequest();
|
|
1521
|
-
req.open('POST', url, true);
|
|
1522
|
-
req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
1523
|
-
|
|
1524
|
-
params += '&client_id=' + encodeURIComponent(kc.clientId);
|
|
1525
|
-
params += '&redirect_uri=' + oauth.redirectUri;
|
|
1526
|
-
|
|
1527
|
-
if (oauth.pkceCodeVerifier) {
|
|
1528
|
-
params += '&code_verifier=' + oauth.pkceCodeVerifier;
|
|
1529
|
-
}
|
|
1530
|
-
|
|
1531
|
-
req.withCredentials = true;
|
|
1532
|
-
|
|
1533
|
-
req.onreadystatechange = function() {
|
|
1534
|
-
if (req.readyState == 4) {
|
|
1535
|
-
if (req.status == 200) {
|
|
1536
|
-
|
|
1537
|
-
var tokenResponse = JSON.parse(req.responseText);
|
|
1538
|
-
authSuccess(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], kc.flow === 'standard');
|
|
1539
|
-
scheduleCheckIframe();
|
|
1540
|
-
} else {
|
|
1541
|
-
kc.onAuthError && kc.onAuthError();
|
|
1542
|
-
promise && promise.setError();
|
|
1543
|
-
}
|
|
1544
|
-
}
|
|
1545
|
-
};
|
|
1546
|
-
|
|
1547
|
-
req.send(params);
|
|
1548
|
-
}
|
|
1549
|
-
|
|
1550
|
-
function authSuccess(accessToken, refreshToken, idToken, fulfillPromise) {
|
|
1551
|
-
timeLocal = (timeLocal + new Date().getTime()) / 2;
|
|
1552
|
-
|
|
1553
|
-
setToken(accessToken, refreshToken, idToken, timeLocal);
|
|
1554
|
-
|
|
1555
|
-
if (useNonce && ((kc.tokenParsed && kc.tokenParsed.nonce != oauth.storedNonce) ||
|
|
1556
|
-
(kc.refreshTokenParsed && kc.refreshTokenParsed.nonce != oauth.storedNonce) ||
|
|
1557
|
-
(kc.idTokenParsed && kc.idTokenParsed.nonce != oauth.storedNonce))) {
|
|
1558
|
-
|
|
1559
|
-
logInfo('[KEYCLOAK] Invalid nonce, clearing token');
|
|
1560
|
-
kc.clearToken();
|
|
1561
|
-
promise && promise.setError();
|
|
1562
|
-
} else {
|
|
1563
|
-
if (fulfillPromise) {
|
|
1564
|
-
kc.onAuthSuccess && kc.onAuthSuccess();
|
|
1565
|
-
promise && promise.setSuccess();
|
|
1566
|
-
}
|
|
1567
|
-
}
|
|
1568
|
-
}
|
|
1569
|
-
|
|
1570
|
-
}
|
|
1571
|
-
|
|
1572
|
-
function loadConfig(url) {
|
|
1573
|
-
var promise = createPromise();
|
|
1574
|
-
var configUrl;
|
|
1575
|
-
|
|
1576
|
-
if (!config) {
|
|
1577
|
-
configUrl = 'keycloak.json';
|
|
1578
|
-
} else if (typeof config === 'string') {
|
|
1579
|
-
configUrl = config;
|
|
1580
|
-
}
|
|
1581
|
-
|
|
1582
|
-
function setupOidcEndoints(oidcConfiguration) {
|
|
1583
|
-
if (! oidcConfiguration) {
|
|
1584
|
-
kc.endpoints = {
|
|
1585
|
-
authorize: function() {
|
|
1586
|
-
return getRealmUrl() + '/protocol/openid-connect/auth';
|
|
1587
|
-
},
|
|
1588
|
-
token: function() {
|
|
1589
|
-
return getRealmUrl() + '/protocol/openid-connect/token';
|
|
1590
|
-
},
|
|
1591
|
-
logout: function() {
|
|
1592
|
-
return getRealmUrl() + '/protocol/openid-connect/logout';
|
|
1593
|
-
},
|
|
1594
|
-
checkSessionIframe: function() {
|
|
1595
|
-
var src = getRealmUrl() + '/protocol/openid-connect/login-status-iframe.html';
|
|
1596
|
-
if (kc.iframeVersion) {
|
|
1597
|
-
src = src + '?version=' + kc.iframeVersion;
|
|
1598
|
-
}
|
|
1599
|
-
return src;
|
|
1600
|
-
},
|
|
1601
|
-
thirdPartyCookiesIframe: function() {
|
|
1602
|
-
var src = getRealmUrl() + '/protocol/openid-connect/3p-cookies/step1.html';
|
|
1603
|
-
if (kc.iframeVersion) {
|
|
1604
|
-
src = src + '?version=' + kc.iframeVersion;
|
|
1605
|
-
}
|
|
1606
|
-
return src;
|
|
1607
|
-
},
|
|
1608
|
-
register: function() {
|
|
1609
|
-
return getRealmUrl() + '/protocol/openid-connect/registrations';
|
|
1610
|
-
},
|
|
1611
|
-
userinfo: function() {
|
|
1612
|
-
return getRealmUrl() + '/protocol/openid-connect/userinfo';
|
|
1613
|
-
}
|
|
1614
|
-
};
|
|
1615
|
-
} else {
|
|
1616
|
-
kc.endpoints = {
|
|
1617
|
-
authorize: function() {
|
|
1618
|
-
return oidcConfiguration.authorization_endpoint;
|
|
1619
|
-
},
|
|
1620
|
-
token: function() {
|
|
1621
|
-
return oidcConfiguration.token_endpoint;
|
|
1622
|
-
},
|
|
1623
|
-
logout: function() {
|
|
1624
|
-
if (!oidcConfiguration.end_session_endpoint) {
|
|
1625
|
-
throw "Not supported by the OIDC server";
|
|
1626
|
-
}
|
|
1627
|
-
return oidcConfiguration.end_session_endpoint;
|
|
1628
|
-
},
|
|
1629
|
-
checkSessionIframe: function() {
|
|
1630
|
-
if (!oidcConfiguration.check_session_iframe) {
|
|
1631
|
-
throw "Not supported by the OIDC server";
|
|
1632
|
-
}
|
|
1633
|
-
return oidcConfiguration.check_session_iframe;
|
|
1634
|
-
},
|
|
1635
|
-
register: function() {
|
|
1636
|
-
throw 'Redirection to "Register user" page not supported in standard OIDC mode';
|
|
1637
|
-
},
|
|
1638
|
-
userinfo: function() {
|
|
1639
|
-
if (!oidcConfiguration.userinfo_endpoint) {
|
|
1640
|
-
throw "Not supported by the OIDC server";
|
|
1641
|
-
}
|
|
1642
|
-
return oidcConfiguration.userinfo_endpoint;
|
|
1643
|
-
}
|
|
1644
|
-
};
|
|
1645
|
-
}
|
|
1646
|
-
}
|
|
1647
|
-
|
|
1648
|
-
if (configUrl) {
|
|
1649
|
-
var req = new XMLHttpRequest();
|
|
1650
|
-
req.open('GET', configUrl, true);
|
|
1651
|
-
req.setRequestHeader('Accept', 'application/json');
|
|
1652
|
-
|
|
1653
|
-
req.onreadystatechange = function () {
|
|
1654
|
-
if (req.readyState == 4) {
|
|
1655
|
-
if (req.status == 200 || fileLoaded(req)) {
|
|
1656
|
-
var config = JSON.parse(req.responseText);
|
|
1657
|
-
|
|
1658
|
-
kc.authServerUrl = config['auth-server-url'];
|
|
1659
|
-
kc.realm = config['realm'];
|
|
1660
|
-
kc.clientId = config['resource'];
|
|
1661
|
-
setupOidcEndoints(null);
|
|
1662
|
-
promise.setSuccess();
|
|
1663
|
-
} else {
|
|
1664
|
-
promise.setError();
|
|
1665
|
-
}
|
|
1666
|
-
}
|
|
1667
|
-
};
|
|
1668
|
-
|
|
1669
|
-
req.send();
|
|
1670
|
-
} else {
|
|
1671
|
-
if (!config.clientId) {
|
|
1672
|
-
throw 'clientId missing';
|
|
1673
|
-
}
|
|
1674
|
-
|
|
1675
|
-
kc.clientId = config.clientId;
|
|
1676
|
-
|
|
1677
|
-
var oidcProvider = config['oidcProvider'];
|
|
1678
|
-
if (!oidcProvider) {
|
|
1679
|
-
if (!config['url']) {
|
|
1680
|
-
var scripts = document.getElementsByTagName('script');
|
|
1681
|
-
for (var i = 0; i < scripts.length; i++) {
|
|
1682
|
-
if (scripts[i].src.match(/.*keycloak\.js/)) {
|
|
1683
|
-
config.url = scripts[i].src.substr(0, scripts[i].src.indexOf('/js/keycloak.js'));
|
|
1684
|
-
break;
|
|
1685
|
-
}
|
|
1686
|
-
}
|
|
1687
|
-
}
|
|
1688
|
-
if (!config.realm) {
|
|
1689
|
-
throw 'realm missing';
|
|
1690
|
-
}
|
|
1691
|
-
|
|
1692
|
-
kc.authServerUrl = config.url;
|
|
1693
|
-
kc.realm = config.realm;
|
|
1694
|
-
setupOidcEndoints(null);
|
|
1695
|
-
promise.setSuccess();
|
|
1696
|
-
} else {
|
|
1697
|
-
if (typeof oidcProvider === 'string') {
|
|
1698
|
-
var oidcProviderConfigUrl;
|
|
1699
|
-
if (oidcProvider.charAt(oidcProvider.length - 1) == '/') {
|
|
1700
|
-
oidcProviderConfigUrl = oidcProvider + '.well-known/openid-configuration';
|
|
1701
|
-
} else {
|
|
1702
|
-
oidcProviderConfigUrl = oidcProvider + '/.well-known/openid-configuration';
|
|
1703
|
-
}
|
|
1704
|
-
var req = new XMLHttpRequest();
|
|
1705
|
-
req.open('GET', oidcProviderConfigUrl, true);
|
|
1706
|
-
req.setRequestHeader('Accept', 'application/json');
|
|
1707
|
-
|
|
1708
|
-
req.onreadystatechange = function () {
|
|
1709
|
-
if (req.readyState == 4) {
|
|
1710
|
-
if (req.status == 200 || fileLoaded(req)) {
|
|
1711
|
-
var oidcProviderConfig = JSON.parse(req.responseText);
|
|
1712
|
-
setupOidcEndoints(oidcProviderConfig);
|
|
1713
|
-
promise.setSuccess();
|
|
1714
|
-
} else {
|
|
1715
|
-
promise.setError();
|
|
1716
|
-
}
|
|
1717
|
-
}
|
|
1718
|
-
};
|
|
1719
|
-
|
|
1720
|
-
req.send();
|
|
1721
|
-
} else {
|
|
1722
|
-
setupOidcEndoints(oidcProvider);
|
|
1723
|
-
promise.setSuccess();
|
|
1724
|
-
}
|
|
1725
|
-
}
|
|
1726
|
-
}
|
|
1727
|
-
|
|
1728
|
-
return promise.promise;
|
|
1729
|
-
}
|
|
1730
|
-
|
|
1731
|
-
function fileLoaded(xhr) {
|
|
1732
|
-
return xhr.status == 0 && xhr.responseText && xhr.responseURL.startsWith('file:');
|
|
1733
|
-
}
|
|
1734
|
-
|
|
1735
|
-
function setToken(token, refreshToken, idToken, timeLocal) {
|
|
1736
|
-
if (kc.tokenTimeoutHandle) {
|
|
1737
|
-
clearTimeout(kc.tokenTimeoutHandle);
|
|
1738
|
-
kc.tokenTimeoutHandle = null;
|
|
1739
|
-
}
|
|
1740
|
-
|
|
1741
|
-
if (refreshToken) {
|
|
1742
|
-
kc.refreshToken = refreshToken;
|
|
1743
|
-
kc.refreshTokenParsed = jwtDecode(refreshToken);
|
|
1744
|
-
} else {
|
|
1745
|
-
delete kc.refreshToken;
|
|
1746
|
-
delete kc.refreshTokenParsed;
|
|
1747
|
-
}
|
|
1748
|
-
|
|
1749
|
-
if (idToken) {
|
|
1750
|
-
kc.idToken = idToken;
|
|
1751
|
-
kc.idTokenParsed = jwtDecode(idToken);
|
|
1752
|
-
} else {
|
|
1753
|
-
delete kc.idToken;
|
|
1754
|
-
delete kc.idTokenParsed;
|
|
1755
|
-
}
|
|
1756
|
-
|
|
1757
|
-
if (token) {
|
|
1758
|
-
kc.token = token;
|
|
1759
|
-
kc.tokenParsed = jwtDecode(token);
|
|
1760
|
-
kc.sessionId = kc.tokenParsed.session_state;
|
|
1761
|
-
kc.authenticated = true;
|
|
1762
|
-
kc.subject = kc.tokenParsed.sub;
|
|
1763
|
-
kc.realmAccess = kc.tokenParsed.realm_access;
|
|
1764
|
-
kc.resourceAccess = kc.tokenParsed.resource_access;
|
|
1765
|
-
|
|
1766
|
-
if (timeLocal) {
|
|
1767
|
-
kc.timeSkew = Math.floor(timeLocal / 1000) - kc.tokenParsed.iat;
|
|
1768
|
-
}
|
|
1769
|
-
|
|
1770
|
-
if (kc.timeSkew != null) {
|
|
1771
|
-
logInfo('[KEYCLOAK] Estimated time difference between browser and server is ' + kc.timeSkew + ' seconds');
|
|
1772
|
-
|
|
1773
|
-
if (kc.onTokenExpired) {
|
|
1774
|
-
var expiresIn = (kc.tokenParsed['exp'] - (new Date().getTime() / 1000) + kc.timeSkew) * 1000;
|
|
1775
|
-
logInfo('[KEYCLOAK] Token expires in ' + Math.round(expiresIn / 1000) + ' s');
|
|
1776
|
-
if (expiresIn <= 0) {
|
|
1777
|
-
kc.onTokenExpired();
|
|
1778
|
-
} else {
|
|
1779
|
-
kc.tokenTimeoutHandle = setTimeout(kc.onTokenExpired, expiresIn);
|
|
1780
|
-
}
|
|
1781
|
-
}
|
|
1782
|
-
}
|
|
1783
|
-
} else {
|
|
1784
|
-
delete kc.token;
|
|
1785
|
-
delete kc.tokenParsed;
|
|
1786
|
-
delete kc.subject;
|
|
1787
|
-
delete kc.realmAccess;
|
|
1788
|
-
delete kc.resourceAccess;
|
|
1789
|
-
|
|
1790
|
-
kc.authenticated = false;
|
|
1791
|
-
}
|
|
1792
|
-
}
|
|
1793
|
-
|
|
1794
|
-
function createUUID() {
|
|
1795
|
-
var hexDigits = '0123456789abcdef';
|
|
1796
|
-
var s = generateRandomString(36, hexDigits).split("");
|
|
1797
|
-
s[14] = '4';
|
|
1798
|
-
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
|
|
1799
|
-
s[8] = s[13] = s[18] = s[23] = '-';
|
|
1800
|
-
var uuid = s.join('');
|
|
1801
|
-
return uuid;
|
|
1802
|
-
}
|
|
1803
|
-
|
|
1804
|
-
function parseCallback(url) {
|
|
1805
|
-
var oauth = parseCallbackUrl(url);
|
|
1806
|
-
if (!oauth) {
|
|
1807
|
-
return;
|
|
1808
|
-
}
|
|
1809
|
-
|
|
1810
|
-
var oauthState = callbackStorage.get(oauth.state);
|
|
1811
|
-
|
|
1812
|
-
if (oauthState) {
|
|
1813
|
-
oauth.valid = true;
|
|
1814
|
-
oauth.redirectUri = oauthState.redirectUri;
|
|
1815
|
-
oauth.storedNonce = oauthState.nonce;
|
|
1816
|
-
oauth.prompt = oauthState.prompt;
|
|
1817
|
-
oauth.pkceCodeVerifier = oauthState.pkceCodeVerifier;
|
|
1818
|
-
}
|
|
1819
|
-
|
|
1820
|
-
return oauth;
|
|
1821
|
-
}
|
|
1822
|
-
|
|
1823
|
-
function parseCallbackUrl(url) {
|
|
1824
|
-
var supportedParams;
|
|
1825
|
-
switch (kc.flow) {
|
|
1826
|
-
case 'standard':
|
|
1827
|
-
supportedParams = ['code', 'state', 'session_state', 'kc_action_status', 'iss'];
|
|
1828
|
-
break;
|
|
1829
|
-
case 'implicit':
|
|
1830
|
-
supportedParams = ['access_token', 'token_type', 'id_token', 'state', 'session_state', 'expires_in', 'kc_action_status', 'iss'];
|
|
1831
|
-
break;
|
|
1832
|
-
case 'hybrid':
|
|
1833
|
-
supportedParams = ['access_token', 'token_type', 'id_token', 'code', 'state', 'session_state', 'expires_in', 'kc_action_status', 'iss'];
|
|
1834
|
-
break;
|
|
1835
|
-
}
|
|
1836
|
-
|
|
1837
|
-
supportedParams.push('error');
|
|
1838
|
-
supportedParams.push('error_description');
|
|
1839
|
-
supportedParams.push('error_uri');
|
|
1840
|
-
|
|
1841
|
-
var queryIndex = url.indexOf('?');
|
|
1842
|
-
var fragmentIndex = url.indexOf('#');
|
|
1843
|
-
|
|
1844
|
-
var newUrl;
|
|
1845
|
-
var parsed;
|
|
1846
|
-
|
|
1847
|
-
if (kc.responseMode === 'query' && queryIndex !== -1) {
|
|
1848
|
-
newUrl = url.substring(0, queryIndex);
|
|
1849
|
-
parsed = parseCallbackParams(url.substring(queryIndex + 1, fragmentIndex !== -1 ? fragmentIndex : url.length), supportedParams);
|
|
1850
|
-
if (parsed.paramsString !== '') {
|
|
1851
|
-
newUrl += '?' + parsed.paramsString;
|
|
1852
|
-
}
|
|
1853
|
-
if (fragmentIndex !== -1) {
|
|
1854
|
-
newUrl += url.substring(fragmentIndex);
|
|
1855
|
-
}
|
|
1856
|
-
} else if (kc.responseMode === 'fragment' && fragmentIndex !== -1) {
|
|
1857
|
-
newUrl = url.substring(0, fragmentIndex);
|
|
1858
|
-
parsed = parseCallbackParams(url.substring(fragmentIndex + 1), supportedParams);
|
|
1859
|
-
if (parsed.paramsString !== '') {
|
|
1860
|
-
newUrl += '#' + parsed.paramsString;
|
|
1861
|
-
}
|
|
1862
|
-
}
|
|
1863
|
-
|
|
1864
|
-
if (parsed && parsed.oauthParams) {
|
|
1865
|
-
if (kc.flow === 'standard' || kc.flow === 'hybrid') {
|
|
1866
|
-
if ((parsed.oauthParams.code || parsed.oauthParams.error) && parsed.oauthParams.state) {
|
|
1867
|
-
parsed.oauthParams.newUrl = newUrl;
|
|
1868
|
-
return parsed.oauthParams;
|
|
1869
|
-
}
|
|
1870
|
-
} else if (kc.flow === 'implicit') {
|
|
1871
|
-
if ((parsed.oauthParams.access_token || parsed.oauthParams.error) && parsed.oauthParams.state) {
|
|
1872
|
-
parsed.oauthParams.newUrl = newUrl;
|
|
1873
|
-
return parsed.oauthParams;
|
|
1874
|
-
}
|
|
1875
|
-
}
|
|
1876
|
-
}
|
|
1877
|
-
}
|
|
1878
|
-
|
|
1879
|
-
function parseCallbackParams(paramsString, supportedParams) {
|
|
1880
|
-
var p = paramsString.split('&');
|
|
1881
|
-
var result = {
|
|
1882
|
-
paramsString: '',
|
|
1883
|
-
oauthParams: {}
|
|
1884
|
-
};
|
|
1885
|
-
for (var i = 0; i < p.length; i++) {
|
|
1886
|
-
var split = p[i].indexOf("=");
|
|
1887
|
-
var key = p[i].slice(0, split);
|
|
1888
|
-
if (supportedParams.indexOf(key) !== -1) {
|
|
1889
|
-
result.oauthParams[key] = p[i].slice(split + 1);
|
|
1890
|
-
} else {
|
|
1891
|
-
if (result.paramsString !== '') {
|
|
1892
|
-
result.paramsString += '&';
|
|
1893
|
-
}
|
|
1894
|
-
result.paramsString += p[i];
|
|
1895
|
-
}
|
|
1896
|
-
}
|
|
1897
|
-
return result;
|
|
1898
|
-
}
|
|
1899
|
-
|
|
1900
|
-
function createPromise() {
|
|
1901
|
-
// Need to create a native Promise which also preserves the
|
|
1902
|
-
// interface of the custom promise type previously used by the API
|
|
1903
|
-
var p = {
|
|
1904
|
-
setSuccess: function(result) {
|
|
1905
|
-
p.resolve(result);
|
|
1906
|
-
},
|
|
1907
|
-
|
|
1908
|
-
setError: function(result) {
|
|
1909
|
-
p.reject(result);
|
|
1910
|
-
}
|
|
1911
|
-
};
|
|
1912
|
-
p.promise = new Promise(function(resolve, reject) {
|
|
1913
|
-
p.resolve = resolve;
|
|
1914
|
-
p.reject = reject;
|
|
1915
|
-
});
|
|
1916
|
-
|
|
1917
|
-
return p;
|
|
1918
|
-
}
|
|
1919
|
-
|
|
1920
|
-
// Function to extend existing native Promise with timeout
|
|
1921
|
-
function applyTimeoutToPromise(promise, timeout, errorMessage) {
|
|
1922
|
-
var timeoutHandle = null;
|
|
1923
|
-
var timeoutPromise = new Promise(function (resolve, reject) {
|
|
1924
|
-
timeoutHandle = setTimeout(function () {
|
|
1925
|
-
reject({ "error": errorMessage || "Promise is not settled within timeout of " + timeout + "ms" });
|
|
1926
|
-
}, timeout);
|
|
1927
|
-
});
|
|
1928
|
-
|
|
1929
|
-
return Promise.race([promise, timeoutPromise]).finally(function () {
|
|
1930
|
-
clearTimeout(timeoutHandle);
|
|
1931
|
-
});
|
|
1932
|
-
}
|
|
1933
|
-
|
|
1934
|
-
function setupCheckLoginIframe() {
|
|
1935
|
-
var promise = createPromise();
|
|
1936
|
-
|
|
1937
|
-
if (!loginIframe.enable) {
|
|
1938
|
-
promise.setSuccess();
|
|
1939
|
-
return promise.promise;
|
|
1940
|
-
}
|
|
1941
|
-
|
|
1942
|
-
if (loginIframe.iframe) {
|
|
1943
|
-
promise.setSuccess();
|
|
1944
|
-
return promise.promise;
|
|
1945
|
-
}
|
|
1946
|
-
|
|
1947
|
-
var iframe = document.createElement('iframe');
|
|
1948
|
-
loginIframe.iframe = iframe;
|
|
1949
|
-
|
|
1950
|
-
iframe.onload = function() {
|
|
1951
|
-
var authUrl = kc.endpoints.authorize();
|
|
1952
|
-
if (authUrl.charAt(0) === '/') {
|
|
1953
|
-
loginIframe.iframeOrigin = getOrigin();
|
|
1954
|
-
} else {
|
|
1955
|
-
loginIframe.iframeOrigin = authUrl.substring(0, authUrl.indexOf('/', 8));
|
|
1956
|
-
}
|
|
1957
|
-
promise.setSuccess();
|
|
1958
|
-
};
|
|
1959
|
-
|
|
1960
|
-
var src = kc.endpoints.checkSessionIframe();
|
|
1961
|
-
iframe.setAttribute('src', src );
|
|
1962
|
-
iframe.setAttribute('sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin');
|
|
1963
|
-
iframe.setAttribute('title', 'keycloak-session-iframe' );
|
|
1964
|
-
iframe.style.display = 'none';
|
|
1965
|
-
document.body.appendChild(iframe);
|
|
1966
|
-
|
|
1967
|
-
var messageCallback = function(event) {
|
|
1968
|
-
if ((event.origin !== loginIframe.iframeOrigin) || (loginIframe.iframe.contentWindow !== event.source)) {
|
|
1969
|
-
return;
|
|
1970
|
-
}
|
|
1971
|
-
|
|
1972
|
-
if (!(event.data == 'unchanged' || event.data == 'changed' || event.data == 'error')) {
|
|
1973
|
-
return;
|
|
1974
|
-
}
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
if (event.data != 'unchanged') {
|
|
1978
|
-
kc.clearToken();
|
|
1979
|
-
}
|
|
1980
|
-
|
|
1981
|
-
var callbacks = loginIframe.callbackList.splice(0, loginIframe.callbackList.length);
|
|
1982
|
-
|
|
1983
|
-
for (var i = callbacks.length - 1; i >= 0; --i) {
|
|
1984
|
-
var promise = callbacks[i];
|
|
1985
|
-
if (event.data == 'error') {
|
|
1986
|
-
promise.setError();
|
|
1987
|
-
} else {
|
|
1988
|
-
promise.setSuccess(event.data == 'unchanged');
|
|
1989
|
-
}
|
|
1990
|
-
}
|
|
1991
|
-
};
|
|
1992
|
-
|
|
1993
|
-
window.addEventListener('message', messageCallback, false);
|
|
1994
|
-
|
|
1995
|
-
return promise.promise;
|
|
1996
|
-
}
|
|
1997
|
-
|
|
1998
|
-
function scheduleCheckIframe() {
|
|
1999
|
-
if (loginIframe.enable) {
|
|
2000
|
-
if (kc.token) {
|
|
2001
|
-
setTimeout(function() {
|
|
2002
|
-
checkLoginIframe().then(function(unchanged) {
|
|
2003
|
-
if (unchanged) {
|
|
2004
|
-
scheduleCheckIframe();
|
|
2005
|
-
}
|
|
2006
|
-
});
|
|
2007
|
-
}, loginIframe.interval * 1000);
|
|
2008
|
-
}
|
|
2009
|
-
}
|
|
2010
|
-
}
|
|
2011
|
-
|
|
2012
|
-
function checkLoginIframe() {
|
|
2013
|
-
var promise = createPromise();
|
|
2014
|
-
|
|
2015
|
-
if (loginIframe.iframe && loginIframe.iframeOrigin ) {
|
|
2016
|
-
var msg = kc.clientId + ' ' + (kc.sessionId ? kc.sessionId : '');
|
|
2017
|
-
loginIframe.callbackList.push(promise);
|
|
2018
|
-
var origin = loginIframe.iframeOrigin;
|
|
2019
|
-
if (loginIframe.callbackList.length == 1) {
|
|
2020
|
-
loginIframe.iframe.contentWindow.postMessage(msg, origin);
|
|
2021
|
-
}
|
|
2022
|
-
} else {
|
|
2023
|
-
promise.setSuccess();
|
|
2024
|
-
}
|
|
2025
|
-
|
|
2026
|
-
return promise.promise;
|
|
2027
|
-
}
|
|
2028
|
-
|
|
2029
|
-
function check3pCookiesSupported() {
|
|
2030
|
-
var promise = createPromise();
|
|
2031
|
-
|
|
2032
|
-
if (loginIframe.enable || kc.silentCheckSsoRedirectUri) {
|
|
2033
|
-
var iframe = document.createElement('iframe');
|
|
2034
|
-
iframe.setAttribute('src', kc.endpoints.thirdPartyCookiesIframe());
|
|
2035
|
-
iframe.setAttribute('sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin');
|
|
2036
|
-
iframe.setAttribute('title', 'keycloak-3p-check-iframe' );
|
|
2037
|
-
iframe.style.display = 'none';
|
|
2038
|
-
document.body.appendChild(iframe);
|
|
2039
|
-
|
|
2040
|
-
var messageCallback = function(event) {
|
|
2041
|
-
if (iframe.contentWindow !== event.source) {
|
|
2042
|
-
return;
|
|
2043
|
-
}
|
|
2044
|
-
|
|
2045
|
-
if (event.data !== "supported" && event.data !== "unsupported") {
|
|
2046
|
-
return;
|
|
2047
|
-
} else if (event.data === "unsupported") {
|
|
2048
|
-
logWarn(
|
|
2049
|
-
"[KEYCLOAK] Your browser is blocking access to 3rd-party cookies, this means:\n\n" +
|
|
2050
|
-
" - It is not possible to retrieve tokens without redirecting to the Keycloak server (a.k.a. no support for silent authentication).\n" +
|
|
2051
|
-
" - It is not possible to automatically detect changes to the session status (such as the user logging out in another tab).\n\n" +
|
|
2052
|
-
"For more information see: https://www.keycloak.org/docs/latest/securing_apps/#_modern_browsers"
|
|
2053
|
-
);
|
|
2054
|
-
|
|
2055
|
-
loginIframe.enable = false;
|
|
2056
|
-
if (kc.silentCheckSsoFallback) {
|
|
2057
|
-
kc.silentCheckSsoRedirectUri = false;
|
|
2058
|
-
}
|
|
2059
|
-
}
|
|
2060
|
-
|
|
2061
|
-
document.body.removeChild(iframe);
|
|
2062
|
-
window.removeEventListener("message", messageCallback);
|
|
2063
|
-
promise.setSuccess();
|
|
2064
|
-
};
|
|
2065
|
-
|
|
2066
|
-
window.addEventListener('message', messageCallback, false);
|
|
2067
|
-
} else {
|
|
2068
|
-
promise.setSuccess();
|
|
2069
|
-
}
|
|
2070
|
-
|
|
2071
|
-
return applyTimeoutToPromise(promise.promise, kc.messageReceiveTimeout, "Timeout when waiting for 3rd party check iframe message.");
|
|
2072
|
-
}
|
|
2073
|
-
|
|
2074
|
-
function loadAdapter(type) {
|
|
2075
|
-
if (!type || type == 'default') {
|
|
2076
|
-
return {
|
|
2077
|
-
login: function(options) {
|
|
2078
|
-
window.location.assign(kc.createLoginUrl(options));
|
|
2079
|
-
return createPromise().promise;
|
|
2080
|
-
},
|
|
2081
|
-
|
|
2082
|
-
logout: function(options) {
|
|
2083
|
-
window.location.replace(kc.createLogoutUrl(options));
|
|
2084
|
-
return createPromise().promise;
|
|
2085
|
-
},
|
|
2086
|
-
|
|
2087
|
-
register: function(options) {
|
|
2088
|
-
window.location.assign(kc.createRegisterUrl(options));
|
|
2089
|
-
return createPromise().promise;
|
|
2090
|
-
},
|
|
2091
|
-
|
|
2092
|
-
accountManagement : function() {
|
|
2093
|
-
var accountUrl = kc.createAccountUrl();
|
|
2094
|
-
if (typeof accountUrl !== 'undefined') {
|
|
2095
|
-
window.location.href = accountUrl;
|
|
2096
|
-
} else {
|
|
2097
|
-
throw "Not supported by the OIDC server";
|
|
2098
|
-
}
|
|
2099
|
-
return createPromise().promise;
|
|
2100
|
-
},
|
|
2101
|
-
|
|
2102
|
-
redirectUri: function(options, encodeHash) {
|
|
2103
|
-
|
|
2104
|
-
if (options && options.redirectUri) {
|
|
2105
|
-
return options.redirectUri;
|
|
2106
|
-
} else if (kc.redirectUri) {
|
|
2107
|
-
return kc.redirectUri;
|
|
2108
|
-
} else {
|
|
2109
|
-
return location.href;
|
|
2110
|
-
}
|
|
2111
|
-
}
|
|
2112
|
-
};
|
|
2113
|
-
}
|
|
2114
|
-
|
|
2115
|
-
if (type == 'cordova') {
|
|
2116
|
-
loginIframe.enable = false;
|
|
2117
|
-
var cordovaOpenWindowWrapper = function(loginUrl, target, options) {
|
|
2118
|
-
if (window.cordova && window.cordova.InAppBrowser) {
|
|
2119
|
-
// Use inappbrowser for IOS and Android if available
|
|
2120
|
-
return window.cordova.InAppBrowser.open(loginUrl, target, options);
|
|
2121
|
-
} else {
|
|
2122
|
-
return window.open(loginUrl, target, options);
|
|
2123
|
-
}
|
|
2124
|
-
};
|
|
2125
|
-
|
|
2126
|
-
var shallowCloneCordovaOptions = function (userOptions) {
|
|
2127
|
-
if (userOptions && userOptions.cordovaOptions) {
|
|
2128
|
-
return Object.keys(userOptions.cordovaOptions).reduce(function (options, optionName) {
|
|
2129
|
-
options[optionName] = userOptions.cordovaOptions[optionName];
|
|
2130
|
-
return options;
|
|
2131
|
-
}, {});
|
|
2132
|
-
} else {
|
|
2133
|
-
return {};
|
|
2134
|
-
}
|
|
2135
|
-
};
|
|
2136
|
-
|
|
2137
|
-
var formatCordovaOptions = function (cordovaOptions) {
|
|
2138
|
-
return Object.keys(cordovaOptions).reduce(function (options, optionName) {
|
|
2139
|
-
options.push(optionName+"="+cordovaOptions[optionName]);
|
|
2140
|
-
return options;
|
|
2141
|
-
}, []).join(",");
|
|
2142
|
-
};
|
|
2143
|
-
|
|
2144
|
-
var createCordovaOptions = function (userOptions) {
|
|
2145
|
-
var cordovaOptions = shallowCloneCordovaOptions(userOptions);
|
|
2146
|
-
cordovaOptions.location = 'no';
|
|
2147
|
-
if (userOptions && userOptions.prompt == 'none') {
|
|
2148
|
-
cordovaOptions.hidden = 'yes';
|
|
2149
|
-
}
|
|
2150
|
-
return formatCordovaOptions(cordovaOptions);
|
|
2151
|
-
};
|
|
2152
|
-
|
|
2153
|
-
var getCordovaRedirectUri = function() {
|
|
2154
|
-
return kc.redirectUri || 'http://localhost';
|
|
2155
|
-
};
|
|
2156
|
-
|
|
2157
|
-
return {
|
|
2158
|
-
login: function(options) {
|
|
2159
|
-
var promise = createPromise();
|
|
2160
|
-
|
|
2161
|
-
var cordovaOptions = createCordovaOptions(options);
|
|
2162
|
-
var loginUrl = kc.createLoginUrl(options);
|
|
2163
|
-
var ref = cordovaOpenWindowWrapper(loginUrl, '_blank', cordovaOptions);
|
|
2164
|
-
var completed = false;
|
|
2165
|
-
|
|
2166
|
-
var closed = false;
|
|
2167
|
-
var closeBrowser = function() {
|
|
2168
|
-
closed = true;
|
|
2169
|
-
ref.close();
|
|
2170
|
-
};
|
|
2171
|
-
|
|
2172
|
-
ref.addEventListener('loadstart', function(event) {
|
|
2173
|
-
if (event.url.indexOf(getCordovaRedirectUri()) == 0) {
|
|
2174
|
-
var callback = parseCallback(event.url);
|
|
2175
|
-
processCallback(callback, promise);
|
|
2176
|
-
closeBrowser();
|
|
2177
|
-
completed = true;
|
|
2178
|
-
}
|
|
2179
|
-
});
|
|
2180
|
-
|
|
2181
|
-
ref.addEventListener('loaderror', function(event) {
|
|
2182
|
-
if (!completed) {
|
|
2183
|
-
if (event.url.indexOf(getCordovaRedirectUri()) == 0) {
|
|
2184
|
-
var callback = parseCallback(event.url);
|
|
2185
|
-
processCallback(callback, promise);
|
|
2186
|
-
closeBrowser();
|
|
2187
|
-
completed = true;
|
|
2188
|
-
} else {
|
|
2189
|
-
promise.setError();
|
|
2190
|
-
closeBrowser();
|
|
2191
|
-
}
|
|
2192
|
-
}
|
|
2193
|
-
});
|
|
2194
|
-
|
|
2195
|
-
ref.addEventListener('exit', function(event) {
|
|
2196
|
-
if (!closed) {
|
|
2197
|
-
promise.setError({
|
|
2198
|
-
reason: "closed_by_user"
|
|
2199
|
-
});
|
|
2200
|
-
}
|
|
2201
|
-
});
|
|
2202
|
-
|
|
2203
|
-
return promise.promise;
|
|
2204
|
-
},
|
|
2205
|
-
|
|
2206
|
-
logout: function(options) {
|
|
2207
|
-
var promise = createPromise();
|
|
2208
|
-
|
|
2209
|
-
var logoutUrl = kc.createLogoutUrl(options);
|
|
2210
|
-
var ref = cordovaOpenWindowWrapper(logoutUrl, '_blank', 'location=no,hidden=yes,clearcache=yes');
|
|
2211
|
-
|
|
2212
|
-
var error;
|
|
2213
|
-
|
|
2214
|
-
ref.addEventListener('loadstart', function(event) {
|
|
2215
|
-
if (event.url.indexOf(getCordovaRedirectUri()) == 0) {
|
|
2216
|
-
ref.close();
|
|
2217
|
-
}
|
|
2218
|
-
});
|
|
2219
|
-
|
|
2220
|
-
ref.addEventListener('loaderror', function(event) {
|
|
2221
|
-
if (event.url.indexOf(getCordovaRedirectUri()) == 0) {
|
|
2222
|
-
ref.close();
|
|
2223
|
-
} else {
|
|
2224
|
-
error = true;
|
|
2225
|
-
ref.close();
|
|
2226
|
-
}
|
|
2227
|
-
});
|
|
2228
|
-
|
|
2229
|
-
ref.addEventListener('exit', function(event) {
|
|
2230
|
-
if (error) {
|
|
2231
|
-
promise.setError();
|
|
2232
|
-
} else {
|
|
2233
|
-
kc.clearToken();
|
|
2234
|
-
promise.setSuccess();
|
|
2235
|
-
}
|
|
2236
|
-
});
|
|
2237
|
-
|
|
2238
|
-
return promise.promise;
|
|
2239
|
-
},
|
|
2240
|
-
|
|
2241
|
-
register : function(options) {
|
|
2242
|
-
var promise = createPromise();
|
|
2243
|
-
var registerUrl = kc.createRegisterUrl();
|
|
2244
|
-
var cordovaOptions = createCordovaOptions(options);
|
|
2245
|
-
var ref = cordovaOpenWindowWrapper(registerUrl, '_blank', cordovaOptions);
|
|
2246
|
-
ref.addEventListener('loadstart', function(event) {
|
|
2247
|
-
if (event.url.indexOf(getCordovaRedirectUri()) == 0) {
|
|
2248
|
-
ref.close();
|
|
2249
|
-
var oauth = parseCallback(event.url);
|
|
2250
|
-
processCallback(oauth, promise);
|
|
2251
|
-
}
|
|
2252
|
-
});
|
|
2253
|
-
return promise.promise;
|
|
2254
|
-
},
|
|
2255
|
-
|
|
2256
|
-
accountManagement : function() {
|
|
2257
|
-
var accountUrl = kc.createAccountUrl();
|
|
2258
|
-
if (typeof accountUrl !== 'undefined') {
|
|
2259
|
-
var ref = cordovaOpenWindowWrapper(accountUrl, '_blank', 'location=no');
|
|
2260
|
-
ref.addEventListener('loadstart', function(event) {
|
|
2261
|
-
if (event.url.indexOf(getCordovaRedirectUri()) == 0) {
|
|
2262
|
-
ref.close();
|
|
2263
|
-
}
|
|
2264
|
-
});
|
|
2265
|
-
} else {
|
|
2266
|
-
throw "Not supported by the OIDC server";
|
|
2267
|
-
}
|
|
2268
|
-
},
|
|
2269
|
-
|
|
2270
|
-
redirectUri: function(options) {
|
|
2271
|
-
return getCordovaRedirectUri();
|
|
2272
|
-
}
|
|
2273
|
-
}
|
|
2274
|
-
}
|
|
2275
|
-
|
|
2276
|
-
if (type == 'cordova-native') {
|
|
2277
|
-
loginIframe.enable = false;
|
|
2278
|
-
|
|
2279
|
-
return {
|
|
2280
|
-
login: function(options) {
|
|
2281
|
-
var promise = createPromise();
|
|
2282
|
-
var loginUrl = kc.createLoginUrl(options);
|
|
2283
|
-
|
|
2284
|
-
universalLinks.subscribe('keycloak', function(event) {
|
|
2285
|
-
universalLinks.unsubscribe('keycloak');
|
|
2286
|
-
window.cordova.plugins.browsertab.close();
|
|
2287
|
-
var oauth = parseCallback(event.url);
|
|
2288
|
-
processCallback(oauth, promise);
|
|
2289
|
-
});
|
|
2290
|
-
|
|
2291
|
-
window.cordova.plugins.browsertab.openUrl(loginUrl);
|
|
2292
|
-
return promise.promise;
|
|
2293
|
-
},
|
|
2294
|
-
|
|
2295
|
-
logout: function(options) {
|
|
2296
|
-
var promise = createPromise();
|
|
2297
|
-
var logoutUrl = kc.createLogoutUrl(options);
|
|
2298
|
-
|
|
2299
|
-
universalLinks.subscribe('keycloak', function(event) {
|
|
2300
|
-
universalLinks.unsubscribe('keycloak');
|
|
2301
|
-
window.cordova.plugins.browsertab.close();
|
|
2302
|
-
kc.clearToken();
|
|
2303
|
-
promise.setSuccess();
|
|
2304
|
-
});
|
|
2305
|
-
|
|
2306
|
-
window.cordova.plugins.browsertab.openUrl(logoutUrl);
|
|
2307
|
-
return promise.promise;
|
|
2308
|
-
},
|
|
2309
|
-
|
|
2310
|
-
register : function(options) {
|
|
2311
|
-
var promise = createPromise();
|
|
2312
|
-
var registerUrl = kc.createRegisterUrl(options);
|
|
2313
|
-
universalLinks.subscribe('keycloak' , function(event) {
|
|
2314
|
-
universalLinks.unsubscribe('keycloak');
|
|
2315
|
-
window.cordova.plugins.browsertab.close();
|
|
2316
|
-
var oauth = parseCallback(event.url);
|
|
2317
|
-
processCallback(oauth, promise);
|
|
2318
|
-
});
|
|
2319
|
-
window.cordova.plugins.browsertab.openUrl(registerUrl);
|
|
2320
|
-
return promise.promise;
|
|
2321
|
-
|
|
2322
|
-
},
|
|
2323
|
-
|
|
2324
|
-
accountManagement : function() {
|
|
2325
|
-
var accountUrl = kc.createAccountUrl();
|
|
2326
|
-
if (typeof accountUrl !== 'undefined') {
|
|
2327
|
-
window.cordova.plugins.browsertab.openUrl(accountUrl);
|
|
2328
|
-
} else {
|
|
2329
|
-
throw "Not supported by the OIDC server";
|
|
2330
|
-
}
|
|
2331
|
-
},
|
|
2332
|
-
|
|
2333
|
-
redirectUri: function(options) {
|
|
2334
|
-
if (options && options.redirectUri) {
|
|
2335
|
-
return options.redirectUri;
|
|
2336
|
-
} else if (kc.redirectUri) {
|
|
2337
|
-
return kc.redirectUri;
|
|
2338
|
-
} else {
|
|
2339
|
-
return "http://localhost";
|
|
2340
|
-
}
|
|
2341
|
-
}
|
|
2342
|
-
}
|
|
2343
|
-
}
|
|
2344
|
-
|
|
2345
|
-
throw 'invalid adapter type: ' + type;
|
|
2346
|
-
}
|
|
2347
|
-
|
|
2348
|
-
var LocalStorage = function() {
|
|
2349
|
-
if (!(this instanceof LocalStorage)) {
|
|
2350
|
-
return new LocalStorage();
|
|
2351
|
-
}
|
|
2352
|
-
|
|
2353
|
-
localStorage.setItem('kc-test', 'test');
|
|
2354
|
-
localStorage.removeItem('kc-test');
|
|
2355
|
-
|
|
2356
|
-
var cs = this;
|
|
2357
|
-
|
|
2358
|
-
function clearExpired() {
|
|
2359
|
-
var time = new Date().getTime();
|
|
2360
|
-
for (var i = 0; i < localStorage.length; i++) {
|
|
2361
|
-
var key = localStorage.key(i);
|
|
2362
|
-
if (key && key.indexOf('kc-callback-') == 0) {
|
|
2363
|
-
var value = localStorage.getItem(key);
|
|
2364
|
-
if (value) {
|
|
2365
|
-
try {
|
|
2366
|
-
var expires = JSON.parse(value).expires;
|
|
2367
|
-
if (!expires || expires < time) {
|
|
2368
|
-
localStorage.removeItem(key);
|
|
2369
|
-
}
|
|
2370
|
-
} catch (err) {
|
|
2371
|
-
localStorage.removeItem(key);
|
|
2372
|
-
}
|
|
2373
|
-
}
|
|
2374
|
-
}
|
|
2375
|
-
}
|
|
2376
|
-
}
|
|
2377
|
-
|
|
2378
|
-
cs.get = function(state) {
|
|
2379
|
-
if (!state) {
|
|
2380
|
-
return;
|
|
2381
|
-
}
|
|
2382
|
-
|
|
2383
|
-
var key = 'kc-callback-' + state;
|
|
2384
|
-
var value = localStorage.getItem(key);
|
|
2385
|
-
if (value) {
|
|
2386
|
-
localStorage.removeItem(key);
|
|
2387
|
-
value = JSON.parse(value);
|
|
2388
|
-
}
|
|
2389
|
-
|
|
2390
|
-
clearExpired();
|
|
2391
|
-
return value;
|
|
2392
|
-
};
|
|
2393
|
-
|
|
2394
|
-
cs.add = function(state) {
|
|
2395
|
-
clearExpired();
|
|
2396
|
-
|
|
2397
|
-
var key = 'kc-callback-' + state.state;
|
|
2398
|
-
state.expires = new Date().getTime() + (60 * 60 * 1000);
|
|
2399
|
-
localStorage.setItem(key, JSON.stringify(state));
|
|
2400
|
-
};
|
|
2401
|
-
};
|
|
2402
|
-
|
|
2403
|
-
var CookieStorage = function() {
|
|
2404
|
-
if (!(this instanceof CookieStorage)) {
|
|
2405
|
-
return new CookieStorage();
|
|
2406
|
-
}
|
|
2407
|
-
|
|
2408
|
-
var cs = this;
|
|
2409
|
-
|
|
2410
|
-
cs.get = function(state) {
|
|
2411
|
-
if (!state) {
|
|
2412
|
-
return;
|
|
2413
|
-
}
|
|
2414
|
-
|
|
2415
|
-
var value = getCookie('kc-callback-' + state);
|
|
2416
|
-
setCookie('kc-callback-' + state, '', cookieExpiration(-100));
|
|
2417
|
-
if (value) {
|
|
2418
|
-
return JSON.parse(value);
|
|
2419
|
-
}
|
|
2420
|
-
};
|
|
2421
|
-
|
|
2422
|
-
cs.add = function(state) {
|
|
2423
|
-
setCookie('kc-callback-' + state.state, JSON.stringify(state), cookieExpiration(60));
|
|
2424
|
-
};
|
|
2425
|
-
|
|
2426
|
-
cs.removeItem = function(key) {
|
|
2427
|
-
setCookie(key, '', cookieExpiration(-100));
|
|
2428
|
-
};
|
|
2429
|
-
|
|
2430
|
-
var cookieExpiration = function (minutes) {
|
|
2431
|
-
var exp = new Date();
|
|
2432
|
-
exp.setTime(exp.getTime() + (minutes*60*1000));
|
|
2433
|
-
return exp;
|
|
2434
|
-
};
|
|
2435
|
-
|
|
2436
|
-
var getCookie = function (key) {
|
|
2437
|
-
var name = key + '=';
|
|
2438
|
-
var ca = document.cookie.split(';');
|
|
2439
|
-
for (var i = 0; i < ca.length; i++) {
|
|
2440
|
-
var c = ca[i];
|
|
2441
|
-
while (c.charAt(0) == ' ') {
|
|
2442
|
-
c = c.substring(1);
|
|
2443
|
-
}
|
|
2444
|
-
if (c.indexOf(name) == 0) {
|
|
2445
|
-
return c.substring(name.length, c.length);
|
|
2446
|
-
}
|
|
2447
|
-
}
|
|
2448
|
-
return '';
|
|
2449
|
-
};
|
|
2450
|
-
|
|
2451
|
-
var setCookie = function (key, value, expirationDate) {
|
|
2452
|
-
var cookie = key + '=' + value + '; '
|
|
2453
|
-
+ 'expires=' + expirationDate.toUTCString() + '; ';
|
|
2454
|
-
document.cookie = cookie;
|
|
2455
|
-
};
|
|
2456
|
-
};
|
|
2457
|
-
|
|
2458
|
-
function createCallbackStorage() {
|
|
2459
|
-
try {
|
|
2460
|
-
return new LocalStorage();
|
|
2461
|
-
} catch (err) {
|
|
2462
|
-
}
|
|
2463
|
-
|
|
2464
|
-
return new CookieStorage();
|
|
2465
|
-
}
|
|
2466
|
-
|
|
2467
|
-
function createLogger(fn) {
|
|
2468
|
-
return function() {
|
|
2469
|
-
if (kc.enableLogging) {
|
|
2470
|
-
fn.apply(console, Array.prototype.slice.call(arguments));
|
|
2471
|
-
}
|
|
2472
|
-
};
|
|
2473
|
-
}
|
|
2474
|
-
}
|
|
2475
|
-
|
|
2476
|
-
/**
|
|
2477
|
-
* Jdenticon 3.3.0
|
|
2478
|
-
* http://jdenticon.com
|
|
2479
|
-
*
|
|
2480
|
-
* Built: 2024-05-10T09:48:41.921Z
|
|
2481
|
-
*
|
|
2482
|
-
* MIT License
|
|
2483
|
-
*
|
|
2484
|
-
* Copyright (c) 2014-2024 Daniel Mester Pirttijärvi
|
|
2485
|
-
*
|
|
2486
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
2487
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
2488
|
-
* in the Software without restriction, including without limitation the rights
|
|
2489
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
2490
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
2491
|
-
* furnished to do so, subject to the following conditions:
|
|
2492
|
-
*
|
|
2493
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
2494
|
-
* copies or substantial portions of the Software.
|
|
2495
|
-
*
|
|
2496
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
2497
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
2498
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
2499
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
2500
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
2501
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
2502
|
-
* SOFTWARE.
|
|
2503
|
-
*/
|
|
2504
|
-
|
|
2505
|
-
/**
|
|
2506
|
-
* Parses a substring of the hash as a number.
|
|
2507
|
-
* @param {number} startPosition
|
|
2508
|
-
* @param {number=} octets
|
|
2509
|
-
*/
|
|
2510
|
-
function parseHex(hash, startPosition, octets) {
|
|
2511
|
-
return parseInt(hash.substr(startPosition, octets), 16);
|
|
2512
|
-
}
|
|
2513
|
-
|
|
2514
|
-
function decToHex(v) {
|
|
2515
|
-
v |= 0; // Ensure integer value
|
|
2516
|
-
return v < 0 ? "00" :
|
|
2517
|
-
v < 16 ? "0" + v.toString(16) :
|
|
2518
|
-
v < 256 ? v.toString(16) :
|
|
2519
|
-
"ff";
|
|
2520
|
-
}
|
|
2521
|
-
|
|
2522
|
-
function hueToRgb(m1, m2, h) {
|
|
2523
|
-
h = h < 0 ? h + 6 : h > 6 ? h - 6 : h;
|
|
2524
|
-
return decToHex(255 * (
|
|
2525
|
-
h < 1 ? m1 + (m2 - m1) * h :
|
|
2526
|
-
h < 3 ? m2 :
|
|
2527
|
-
h < 4 ? m1 + (m2 - m1) * (4 - h) :
|
|
2528
|
-
m1));
|
|
2529
|
-
}
|
|
2530
|
-
|
|
2531
|
-
/**
|
|
2532
|
-
* @param {string} color Color value to parse. Currently hexadecimal strings on the format #rgb[a] and #rrggbb[aa] are supported.
|
|
2533
|
-
* @returns {string}
|
|
2534
|
-
*/
|
|
2535
|
-
function parseColor(color) {
|
|
2536
|
-
if (/^#[0-9a-f]{3,8}$/i.test(color)) {
|
|
2537
|
-
var result;
|
|
2538
|
-
var colorLength = color.length;
|
|
2539
|
-
|
|
2540
|
-
if (colorLength < 6) {
|
|
2541
|
-
var r = color[1],
|
|
2542
|
-
g = color[2],
|
|
2543
|
-
b = color[3],
|
|
2544
|
-
a = color[4] || "";
|
|
2545
|
-
result = "#" + r + r + g + g + b + b + a + a;
|
|
2546
|
-
}
|
|
2547
|
-
if (colorLength == 7 || colorLength > 8) {
|
|
2548
|
-
result = color;
|
|
2549
|
-
}
|
|
2550
|
-
|
|
2551
|
-
return result;
|
|
2552
|
-
}
|
|
2553
|
-
}
|
|
2554
|
-
|
|
2555
|
-
/**
|
|
2556
|
-
* Converts a hexadecimal color to a CSS3 compatible color.
|
|
2557
|
-
* @param {string} hexColor Color on the format "#RRGGBB" or "#RRGGBBAA"
|
|
2558
|
-
* @returns {string}
|
|
2559
|
-
*/
|
|
2560
|
-
function toCss3Color(hexColor) {
|
|
2561
|
-
var a = parseHex(hexColor, 7, 2);
|
|
2562
|
-
var result;
|
|
2563
|
-
|
|
2564
|
-
if (isNaN(a)) {
|
|
2565
|
-
result = hexColor;
|
|
2566
|
-
} else {
|
|
2567
|
-
var r = parseHex(hexColor, 1, 2),
|
|
2568
|
-
g = parseHex(hexColor, 3, 2),
|
|
2569
|
-
b = parseHex(hexColor, 5, 2);
|
|
2570
|
-
result = "rgba(" + r + "," + g + "," + b + "," + (a / 255).toFixed(2) + ")";
|
|
2571
|
-
}
|
|
2572
|
-
|
|
2573
|
-
return result;
|
|
2574
|
-
}
|
|
2575
|
-
|
|
2576
|
-
/**
|
|
2577
|
-
* Converts an HSL color to a hexadecimal RGB color.
|
|
2578
|
-
* @param {number} hue Hue in range [0, 1]
|
|
2579
|
-
* @param {number} saturation Saturation in range [0, 1]
|
|
2580
|
-
* @param {number} lightness Lightness in range [0, 1]
|
|
2581
|
-
* @returns {string}
|
|
2582
|
-
*/
|
|
2583
|
-
function hsl(hue, saturation, lightness) {
|
|
2584
|
-
// Based on http://www.w3.org/TR/2011/REC-css3-color-20110607/#hsl-color
|
|
2585
|
-
var result;
|
|
2586
|
-
|
|
2587
|
-
if (saturation == 0) {
|
|
2588
|
-
var partialHex = decToHex(lightness * 255);
|
|
2589
|
-
result = partialHex + partialHex + partialHex;
|
|
2590
|
-
}
|
|
2591
|
-
else {
|
|
2592
|
-
var m2 = lightness <= 0.5 ? lightness * (saturation + 1) : lightness + saturation - lightness * saturation,
|
|
2593
|
-
m1 = lightness * 2 - m2;
|
|
2594
|
-
result =
|
|
2595
|
-
hueToRgb(m1, m2, hue * 6 + 2) +
|
|
2596
|
-
hueToRgb(m1, m2, hue * 6) +
|
|
2597
|
-
hueToRgb(m1, m2, hue * 6 - 2);
|
|
2598
|
-
}
|
|
2599
|
-
|
|
2600
|
-
return "#" + result;
|
|
2601
|
-
}
|
|
2602
|
-
|
|
2603
|
-
/**
|
|
2604
|
-
* Converts an HSL color to a hexadecimal RGB color. This function will correct the lightness for the "dark" hues
|
|
2605
|
-
* @param {number} hue Hue in range [0, 1]
|
|
2606
|
-
* @param {number} saturation Saturation in range [0, 1]
|
|
2607
|
-
* @param {number} lightness Lightness in range [0, 1]
|
|
2608
|
-
* @returns {string}
|
|
2609
|
-
*/
|
|
2610
|
-
function correctedHsl(hue, saturation, lightness) {
|
|
2611
|
-
// The corrector specifies the perceived middle lightness for each hue
|
|
2612
|
-
var correctors = [ 0.55, 0.5, 0.5, 0.46, 0.6, 0.55, 0.55 ],
|
|
2613
|
-
corrector = correctors[(hue * 6 + 0.5) | 0];
|
|
2614
|
-
|
|
2615
|
-
// Adjust the input lightness relative to the corrector
|
|
2616
|
-
lightness = lightness < 0.5 ? lightness * corrector * 2 : corrector + (lightness - 0.5) * (1 - corrector) * 2;
|
|
2617
|
-
|
|
2618
|
-
return hsl(hue, saturation, lightness);
|
|
2619
|
-
}
|
|
2620
|
-
|
|
2621
|
-
// In the future we can replace `GLOBAL` with `globalThis`, but for now use the old school global detection for
|
|
2622
|
-
// backward compatibility.
|
|
2623
|
-
|
|
2624
|
-
var GLOBAL =
|
|
2625
|
-
typeof window !== "undefined" ? window :
|
|
2626
|
-
typeof self !== "undefined" ? self :
|
|
2627
|
-
typeof commonjsGlobal !== "undefined" ? commonjsGlobal :
|
|
2628
|
-
{};
|
|
2629
|
-
|
|
2630
|
-
/**
|
|
2631
|
-
* @typedef {Object} ParsedConfiguration
|
|
2632
|
-
* @property {number} colorSaturation
|
|
2633
|
-
* @property {number} grayscaleSaturation
|
|
2634
|
-
* @property {string} backColor
|
|
2635
|
-
* @property {number} iconPadding
|
|
2636
|
-
* @property {function(number):number} hue
|
|
2637
|
-
* @property {function(number):number} colorLightness
|
|
2638
|
-
* @property {function(number):number} grayscaleLightness
|
|
2639
|
-
*/
|
|
2640
|
-
|
|
2641
|
-
var CONFIG_PROPERTIES = {
|
|
2642
|
-
W/*GLOBAL*/: "jdenticon_config",
|
|
2643
|
-
n/*MODULE*/: "config",
|
|
2644
|
-
};
|
|
2645
|
-
|
|
2646
|
-
var rootConfigurationHolder = {};
|
|
2647
|
-
|
|
2648
|
-
/**
|
|
2649
|
-
* Defines the deprecated `config` property on the root Jdenticon object without printing a warning in the console
|
|
2650
|
-
* when it is being used.
|
|
2651
|
-
* @param {!Object} rootObject
|
|
2652
|
-
*/
|
|
2653
|
-
function defineConfigProperty(rootObject) {
|
|
2654
|
-
rootConfigurationHolder = rootObject;
|
|
2655
|
-
}
|
|
2656
|
-
|
|
2657
|
-
/**
|
|
2658
|
-
* Sets a new icon style configuration. The new configuration is not merged with the previous one. *
|
|
2659
|
-
* @param {Object} newConfiguration - New configuration object.
|
|
2660
|
-
*/
|
|
2661
|
-
function configure(newConfiguration) {
|
|
2662
|
-
if (arguments.length) {
|
|
2663
|
-
rootConfigurationHolder[CONFIG_PROPERTIES.n/*MODULE*/] = newConfiguration;
|
|
2664
|
-
}
|
|
2665
|
-
return rootConfigurationHolder[CONFIG_PROPERTIES.n/*MODULE*/];
|
|
2666
|
-
}
|
|
2667
|
-
|
|
2668
|
-
/**
|
|
2669
|
-
* Gets the normalized current Jdenticon color configuration. Missing fields have default values.
|
|
2670
|
-
* @param {Object|number|undefined} paddingOrLocalConfig - Configuration passed to the called API method. A
|
|
2671
|
-
* local configuration overrides the global configuration in it entirety. This parameter can for backward
|
|
2672
|
-
* compatibility also contain a padding value. A padding value only overrides the global padding, not the
|
|
2673
|
-
* entire global configuration.
|
|
2674
|
-
* @param {number} defaultPadding - Padding used if no padding is specified in neither the configuration nor
|
|
2675
|
-
* explicitly to the API method.
|
|
2676
|
-
* @returns {ParsedConfiguration}
|
|
2677
|
-
*/
|
|
2678
|
-
function getConfiguration(paddingOrLocalConfig, defaultPadding) {
|
|
2679
|
-
var configObject =
|
|
2680
|
-
typeof paddingOrLocalConfig == "object" && paddingOrLocalConfig ||
|
|
2681
|
-
rootConfigurationHolder[CONFIG_PROPERTIES.n/*MODULE*/] ||
|
|
2682
|
-
GLOBAL[CONFIG_PROPERTIES.W/*GLOBAL*/] ||
|
|
2683
|
-
{ },
|
|
2684
|
-
|
|
2685
|
-
lightnessConfig = configObject["lightness"] || { },
|
|
2686
|
-
|
|
2687
|
-
// In versions < 2.1.0 there was no grayscale saturation -
|
|
2688
|
-
// saturation was the color saturation.
|
|
2689
|
-
saturation = configObject["saturation"] || { },
|
|
2690
|
-
colorSaturation = "color" in saturation ? saturation["color"] : saturation,
|
|
2691
|
-
grayscaleSaturation = saturation["grayscale"],
|
|
2692
|
-
|
|
2693
|
-
backColor = configObject["backColor"],
|
|
2694
|
-
padding = configObject["padding"];
|
|
2695
|
-
|
|
2696
|
-
/**
|
|
2697
|
-
* Creates a lightness range.
|
|
2698
|
-
*/
|
|
2699
|
-
function lightness(configName, defaultRange) {
|
|
2700
|
-
var range = lightnessConfig[configName];
|
|
2701
|
-
|
|
2702
|
-
// Check if the lightness range is an array-like object. This way we ensure the
|
|
2703
|
-
// array contain two values at the same time.
|
|
2704
|
-
if (!(range && range.length > 1)) {
|
|
2705
|
-
range = defaultRange;
|
|
2706
|
-
}
|
|
2707
|
-
|
|
2708
|
-
/**
|
|
2709
|
-
* Gets a lightness relative the specified value in the specified lightness range.
|
|
2710
|
-
*/
|
|
2711
|
-
return function (value) {
|
|
2712
|
-
value = range[0] + value * (range[1] - range[0]);
|
|
2713
|
-
return value < 0 ? 0 : value > 1 ? 1 : value;
|
|
2714
|
-
};
|
|
2715
|
-
}
|
|
2716
|
-
|
|
2717
|
-
/**
|
|
2718
|
-
* Gets a hue allowed by the configured hue restriction,
|
|
2719
|
-
* provided the originally computed hue.
|
|
2720
|
-
*/
|
|
2721
|
-
function hueFunction(originalHue) {
|
|
2722
|
-
var hueConfig = configObject["hues"];
|
|
2723
|
-
var hue;
|
|
2724
|
-
|
|
2725
|
-
// Check if 'hues' is an array-like object. This way we also ensure that
|
|
2726
|
-
// the array is not empty, which would mean no hue restriction.
|
|
2727
|
-
if (hueConfig && hueConfig.length > 0) {
|
|
2728
|
-
// originalHue is in the range [0, 1]
|
|
2729
|
-
// Multiply with 0.999 to change the range to [0, 1) and then truncate the index.
|
|
2730
|
-
hue = hueConfig[0 | (0.999 * originalHue * hueConfig.length)];
|
|
2731
|
-
}
|
|
2732
|
-
|
|
2733
|
-
return typeof hue == "number" ?
|
|
2734
|
-
|
|
2735
|
-
// A hue was specified. We need to convert the hue from
|
|
2736
|
-
// degrees on any turn - e.g. 746° is a perfectly valid hue -
|
|
2737
|
-
// to turns in the range [0, 1).
|
|
2738
|
-
((((hue / 360) % 1) + 1) % 1) :
|
|
2739
|
-
|
|
2740
|
-
// No hue configured => use original hue
|
|
2741
|
-
originalHue;
|
|
2742
|
-
}
|
|
2743
|
-
|
|
2744
|
-
return {
|
|
2745
|
-
X/*hue*/: hueFunction,
|
|
2746
|
-
o/*colorSaturation*/: typeof colorSaturation == "number" ? colorSaturation : 0.5,
|
|
2747
|
-
F/*grayscaleSaturation*/: typeof grayscaleSaturation == "number" ? grayscaleSaturation : 0,
|
|
2748
|
-
p/*colorLightness*/: lightness("color", [0.4, 0.8]),
|
|
2749
|
-
G/*grayscaleLightness*/: lightness("grayscale", [0.3, 0.9]),
|
|
2750
|
-
H/*backColor*/: parseColor(backColor),
|
|
2751
|
-
Y/*iconPadding*/:
|
|
2752
|
-
typeof paddingOrLocalConfig == "number" ? paddingOrLocalConfig :
|
|
2753
|
-
typeof padding == "number" ? padding :
|
|
2754
|
-
defaultPadding
|
|
2755
|
-
}
|
|
2756
|
-
}
|
|
2757
|
-
|
|
2758
|
-
/**
|
|
2759
|
-
* Represents a point.
|
|
2760
|
-
*/
|
|
2761
|
-
function Point(x, y) {
|
|
2762
|
-
this.x = x;
|
|
2763
|
-
this.y = y;
|
|
2764
|
-
}
|
|
2765
|
-
|
|
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;
|
|
3873
|
-
|
|
3874
|
-
const DEFAULT_CONFIG = {
|
|
3875
|
-
keycloak: {
|
|
3876
|
-
url: 'https://keycloak.ds2.icelab.cloud',
|
|
3877
|
-
realm: 'ds2',
|
|
3878
|
-
clientId: 'dashbtn'
|
|
3879
|
-
},
|
|
3880
|
-
defaultLink: { name: 'Portal', url: 'https://portal.ds2.icelab.cloud' },
|
|
3881
|
-
menuViewType: 'grid',
|
|
3882
|
-
cookieName: 'ZDZW_cookie',
|
|
3883
|
-
menu: {
|
|
3884
|
-
global: {
|
|
3885
|
-
name: 'Applications',
|
|
3886
|
-
links: []
|
|
3887
|
-
},
|
|
3888
|
-
local: {
|
|
3889
|
-
name: 'Applications',
|
|
3890
|
-
enableCustomLocalMenu: true,
|
|
3891
|
-
links: []
|
|
3892
|
-
}
|
|
3893
|
-
},
|
|
3894
|
-
loading: {
|
|
3895
|
-
isLoading: true,
|
|
3896
|
-
duration: 800
|
|
3897
|
-
},
|
|
3898
|
-
};
|
|
3899
|
-
// Fetch config from API
|
|
3900
|
-
class ConfigService {
|
|
3901
|
-
constructor() {
|
|
3902
|
-
this._config = DEFAULT_CONFIG;
|
|
3903
|
-
}
|
|
3904
|
-
static getInstance() {
|
|
3905
|
-
if (!ConfigService.instance) {
|
|
3906
|
-
ConfigService.instance = new ConfigService();
|
|
3907
|
-
}
|
|
3908
|
-
return ConfigService.instance;
|
|
3909
|
-
}
|
|
3910
|
-
async fetchConfig(portalApiUrl) {
|
|
3911
|
-
try {
|
|
3912
|
-
const res = await fetch(portalApiUrl + '/developer/dashbuttons/config');
|
|
3913
|
-
if (!res.ok)
|
|
3914
|
-
throw new Error('Failed to fetch config');
|
|
3915
|
-
const data = await res.json();
|
|
3916
|
-
this._config = Object.assign(Object.assign({}, DEFAULT_CONFIG), data); // Merge API data with defaults
|
|
3917
|
-
}
|
|
3918
|
-
catch (e) {
|
|
3919
|
-
console.warn('Using default config due to API failure', e);
|
|
3920
|
-
this._config = DEFAULT_CONFIG; // fallback to defaults
|
|
3921
|
-
}
|
|
3922
|
-
return this._config;
|
|
3923
|
-
}
|
|
3924
|
-
/**
|
|
3925
|
-
* Return cached config without calling API
|
|
3926
|
-
*/
|
|
3927
|
-
get config() {
|
|
3928
|
-
return this._config;
|
|
3929
|
-
}
|
|
3930
|
-
}
|
|
3931
|
-
const configService = ConfigService.getInstance();
|
|
3932
|
-
|
|
3933
|
-
// const getRootDomain = (hostOrUrl: string): string => {
|
|
3934
|
-
// // Ensure we can parse it with URL
|
|
3935
|
-
// const url = hostOrUrl.startsWith("http") ? new URL(hostOrUrl) : new URL(`https://${hostOrUrl}`);
|
|
3936
|
-
// const hostname = url.hostname;
|
|
3937
|
-
// const port = url.port ? `:${url.port}` : "";
|
|
3938
|
-
// const parts = hostname.split(".");
|
|
3939
|
-
// // localhost → return with port
|
|
3940
|
-
// if (hostname === "localhost") return hostname + port;
|
|
3941
|
-
// // sslip.io → keep last 3 parts
|
|
3942
|
-
// if (hostname.endsWith(".sslip.io")) return parts.slice(-5).join(".") + port;
|
|
3943
|
-
// // Normal domains → remove first label
|
|
3944
|
-
// return parts.slice(1).join(".") + port;
|
|
3945
|
-
// };
|
|
3946
|
-
const getRootDomain = (hostOrUrl) => {
|
|
3947
|
-
const url = hostOrUrl.startsWith("http")
|
|
3948
|
-
? new URL(hostOrUrl)
|
|
3949
|
-
: new URL(`https://${hostOrUrl}`);
|
|
3950
|
-
const hostname = url.hostname;
|
|
3951
|
-
const port = url.port ? `:${url.port}` : "";
|
|
3952
|
-
const parts = hostname.split(".");
|
|
3953
|
-
// localhost → return with port
|
|
3954
|
-
if (hostname === "localhost")
|
|
3955
|
-
return hostname + port;
|
|
3956
|
-
// sslip.io → keep last 3 parts
|
|
3957
|
-
if (hostname.endsWith(".sslip.io"))
|
|
3958
|
-
return parts.slice(-5).join(".") + port;
|
|
3959
|
-
// Keep full hostname
|
|
3960
|
-
return hostname + port;
|
|
3961
|
-
};
|
|
3962
|
-
const getUrlProtocol = (url, defaultProtocol = "https://") => {
|
|
3963
|
-
if (!url)
|
|
3964
|
-
return defaultProtocol;
|
|
3965
|
-
const trimmed = url.trim();
|
|
3966
|
-
// Match protocol (http:// or https://)
|
|
3967
|
-
const match = trimmed.match(/^(https?:\/\/)/i);
|
|
3968
|
-
return match ? match[1] : defaultProtocol;
|
|
3969
|
-
};
|
|
3970
|
-
class MenuService {
|
|
3971
|
-
async getMenuConfig(url) {
|
|
3972
|
-
try {
|
|
3973
|
-
const res = await fetch(url);
|
|
3974
|
-
if (!res.ok)
|
|
3975
|
-
throw new Error('API error');
|
|
3976
|
-
return await res.json();
|
|
3977
|
-
}
|
|
3978
|
-
catch (_a) {
|
|
3979
|
-
return { data: [], total: 0, page: 1, perPage: 0, totalPages: 0 };
|
|
3980
|
-
}
|
|
3981
|
-
}
|
|
3982
|
-
setDefaultProtocol(url) {
|
|
3983
|
-
// If protocol already exists (http:// or https://), keep it
|
|
3984
|
-
if (/^https?:\/\//i.test(url)) {
|
|
3985
|
-
return url;
|
|
3986
|
-
}
|
|
3987
|
-
// Otherwise default to https
|
|
3988
|
-
return `https://${url}`;
|
|
3989
|
-
}
|
|
3990
|
-
async getMenuLinks(BASE_URL) {
|
|
3991
|
-
const normalizedBaseUrl = this.setDefaultProtocol(BASE_URL);
|
|
3992
|
-
// Create a URL object from normalizedBaseUrl
|
|
3993
|
-
const urlObj = new URL(normalizedBaseUrl);
|
|
3994
|
-
// Add the 'containerisationbackend' subdomain
|
|
3995
|
-
urlObj.hostname = `containerisationbackend.${urlObj.hostname}`;
|
|
3996
|
-
const { data } = await this.getMenuConfig(`${urlObj.origin}/developer/charts/installed`);
|
|
3997
|
-
return data.map(d => {
|
|
3998
|
-
var _a, _b, _c;
|
|
3999
|
-
const frontendUrlPrefix = (_a = d.metadata) === null || _a === void 0 ? void 0 : _a.frontendUrlPrefix;
|
|
4000
|
-
const rootDomain = getRootDomain(BASE_URL);
|
|
4001
|
-
const generatedUrl = `${getUrlProtocol(BASE_URL)}${frontendUrlPrefix}.${rootDomain}`;
|
|
4002
|
-
return {
|
|
4003
|
-
name: d.installChartName,
|
|
4004
|
-
url: frontendUrlPrefix ? generatedUrl : "",
|
|
4005
|
-
category: (_c = (_b = d.metadata) === null || _b === void 0 ? void 0 : _b.category) !== null && _c !== void 0 ? _c : "",
|
|
4006
|
-
};
|
|
4007
|
-
});
|
|
4008
|
-
}
|
|
4009
|
-
}
|
|
4010
|
-
const menuService = new MenuService();
|
|
4011
|
-
|
|
4012
|
-
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)}}";
|
|
4013
|
-
const DashButtonStyle0 = dashButtonCss;
|
|
4014
|
-
|
|
4015
|
-
const DashButtonComponent = /*@__PURE__*/ proxyCustomElement(class DashButtonComponent extends HTMLElement {
|
|
4016
|
-
constructor() {
|
|
4017
|
-
super();
|
|
4018
|
-
this.__registerHost();
|
|
4019
|
-
this.__attachShadow();
|
|
4020
|
-
this.showPostLoginText = false;
|
|
4021
|
-
this.silentCheckSso = false;
|
|
4022
|
-
this.redirectUri = undefined;
|
|
4023
|
-
this.authMethod = "check-sso";
|
|
4024
|
-
this.portalApiUrl = "";
|
|
4025
|
-
this.plmUrl = "https://productlicensemanager-zdzw.cloud.zdzw-project.com";
|
|
4026
|
-
this.showUnauthorizedModal = false;
|
|
4027
|
-
this.primaryColor = "";
|
|
4028
|
-
this.accentColor = "";
|
|
4029
|
-
this.keycloak = null;
|
|
4030
|
-
this.isAuth = false;
|
|
4031
|
-
this.givenUserName = "";
|
|
4032
|
-
this.silentCheckSsoRedirectUri = window.location.origin + '/assets/verificar-sso.html';
|
|
4033
|
-
this.appList = [];
|
|
4034
|
-
this.avatarSvg = jdenticonModule.toSvg("init-avatar", 40);
|
|
4035
|
-
this.isLoading = false;
|
|
4036
|
-
this.config = undefined;
|
|
4037
|
-
this.localMenuLinks = undefined;
|
|
4038
|
-
this.organizationUrl = undefined;
|
|
4039
|
-
this.isRestricted = false;
|
|
4040
|
-
}
|
|
4041
|
-
async componentWillLoad() {
|
|
4042
|
-
var _a, _b, _c, _d;
|
|
4043
|
-
// Fetch config from API
|
|
4044
|
-
this.config = await configService.fetchConfig(this.portalApiUrl);
|
|
4045
|
-
console.log(this.config);
|
|
4046
|
-
if (!this.config)
|
|
4047
|
-
return; // prevent Keycloak init if fetch failed
|
|
4048
|
-
// render will show spinner
|
|
4049
|
-
if ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.loading) === null || _b === void 0 ? void 0 : _b.isLoading) {
|
|
4050
|
-
this.isLoading = true;
|
|
4051
|
-
setTimeout(() => {
|
|
4052
|
-
this.isLoading = false;
|
|
4053
|
-
}, (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.loading) === null || _d === void 0 ? void 0 : _d.duration);
|
|
4054
|
-
}
|
|
4055
|
-
// Initialize Keycloak
|
|
4056
|
-
this.keycloak = new Keycloak({
|
|
4057
|
-
url: this.config.keycloak.url,
|
|
4058
|
-
realm: this.config.keycloak.realm,
|
|
4059
|
-
clientId: this.config.keycloak.clientId
|
|
4060
|
-
});
|
|
4061
|
-
//
|
|
4062
|
-
// Init Keycloak
|
|
4063
|
-
//
|
|
4064
|
-
this.initKeycloak().then(() => {
|
|
4065
|
-
// Check if the user is authenticated
|
|
4066
|
-
if (this.isAuth) {
|
|
4067
|
-
// Get organization URL and load local menu items
|
|
4068
|
-
// If the user has not set an organization URL, they can configure it in the Portal profile page
|
|
4069
|
-
this.loadOrganizationUrlAndLinks();
|
|
4070
|
-
// Validate user access permission for the application.
|
|
4071
|
-
// If unauthorized, display the restricted access modal.
|
|
4072
|
-
this.validateAppAccessByUrl();
|
|
4073
|
-
}
|
|
4074
|
-
});
|
|
4075
|
-
}
|
|
4076
|
-
async initKeycloak() {
|
|
4077
|
-
// Remove the initiation time permission localstorage object
|
|
4078
|
-
localStorage.removeItem("ZDZW_app_permission");
|
|
4079
|
-
await this.keycloak.init({
|
|
4080
|
-
onLoad: this.authMethod,
|
|
4081
|
-
checkLoginIframe: false,
|
|
4082
|
-
silentCheckSsoRedirectUri: this.silentCheckSso ? this.silentCheckSsoRedirectUri : '',
|
|
4083
|
-
}).then(res => {
|
|
4084
|
-
if (res) {
|
|
4085
|
-
this.isAuth = true;
|
|
4086
|
-
localStorage.setItem("keycloak", JSON.stringify(this.keycloak));
|
|
4087
|
-
// document.cookie = "DASH_BTN=" + JSON.parse(localStorage.getItem('keycloak')).token;
|
|
4088
|
-
document.cookie = this.config.cookieName + "=" + JSON.parse(localStorage.getItem('keycloak')).token;
|
|
4089
|
-
// Set userName
|
|
4090
|
-
this.givenUserName = JSON.parse(localStorage.getItem('keycloak')).idTokenParsed.preferred_username;
|
|
4091
|
-
// Set user avatar
|
|
4092
|
-
this.avatarSvg = jdenticonModule.toSvg(JSON.parse(localStorage.getItem('keycloak')).idTokenParsed.sub, 40);
|
|
4093
|
-
}
|
|
4094
|
-
});
|
|
4095
|
-
}
|
|
4096
|
-
async loadOrganizationUrlAndLinks() {
|
|
4097
|
-
var _a, _b, _c;
|
|
4098
|
-
// Read org URL safely
|
|
4099
|
-
try {
|
|
4100
|
-
const kc = JSON.parse(localStorage.getItem("keycloak") || "{}");
|
|
4101
|
-
this.organizationUrl = ((_a = kc === null || kc === void 0 ? void 0 : kc.idTokenParsed) === null || _a === void 0 ? void 0 : _a.organizationUrl) || null;
|
|
4102
|
-
}
|
|
4103
|
-
catch (_d) {
|
|
4104
|
-
this.organizationUrl = null;
|
|
4105
|
-
}
|
|
4106
|
-
// If no organization, do nothing
|
|
4107
|
-
if (!this.organizationUrl)
|
|
4108
|
-
return;
|
|
4109
|
-
// If config or menu not ready, skip
|
|
4110
|
-
if (!((_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.menu) === null || _c === void 0 ? void 0 : _c.local))
|
|
4111
|
-
return;
|
|
4112
|
-
// Only load when custom menu is NOT enabled
|
|
4113
|
-
if (!this.config.menu.local.enableCustomLocalMenu) {
|
|
4114
|
-
try {
|
|
4115
|
-
this.localMenuLinks = await menuService.getMenuLinks(this.organizationUrl);
|
|
4116
|
-
}
|
|
4117
|
-
catch (e) {
|
|
4118
|
-
console.error("Failed to load local menu", e);
|
|
4119
|
-
this.localMenuLinks = [];
|
|
4120
|
-
}
|
|
4121
|
-
}
|
|
4122
|
-
}
|
|
4123
|
-
validateAppAccessByUrl() {
|
|
4124
|
-
var _a, _b, _c, _d;
|
|
4125
|
-
const currentUrl = window.location.href;
|
|
4126
|
-
const currentOrigin = window.location.origin;
|
|
4127
|
-
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) || [];
|
|
4128
|
-
// Check Global Links
|
|
4129
|
-
const matchGlobal = globalLinks.some(link => {
|
|
4130
|
-
try {
|
|
4131
|
-
const linkOrigin = new URL(link.url).origin;
|
|
4132
|
-
return currentOrigin === linkOrigin;
|
|
4133
|
-
}
|
|
4134
|
-
catch (_a) {
|
|
4135
|
-
return false;
|
|
4136
|
-
}
|
|
4137
|
-
});
|
|
4138
|
-
// Check Token organizationUrl
|
|
4139
|
-
const tokenParsed = (_d = this.keycloak) === null || _d === void 0 ? void 0 : _d.tokenParsed;
|
|
4140
|
-
const allowedOrg = tokenParsed === null || tokenParsed === void 0 ? void 0 : tokenParsed.organizationUrl;
|
|
4141
|
-
const matchOrganization = allowedOrg && currentUrl.includes(allowedOrg);
|
|
4142
|
-
// global and org url validations
|
|
4143
|
-
const isAllowed = matchGlobal || matchOrganization;
|
|
4144
|
-
this.isRestricted = !isAllowed;
|
|
4145
|
-
}
|
|
4146
|
-
login() {
|
|
4147
|
-
this.keycloak.login();
|
|
4148
|
-
}
|
|
4149
|
-
logout() {
|
|
4150
|
-
localStorage.removeItem("keycloak");
|
|
4151
|
-
// document.cookie = "DASH_BTN=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
|
|
4152
|
-
document.cookie = this.config.cookieName + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
|
|
4153
|
-
this.keycloak.logout();
|
|
4154
|
-
}
|
|
4155
|
-
showModal() {
|
|
4156
|
-
const appModal = this.el.shadowRoot.querySelector('#appListModal');
|
|
4157
|
-
appModal.style.display = "block";
|
|
4158
|
-
}
|
|
4159
|
-
closeModal() {
|
|
4160
|
-
const appModal = this.el.shadowRoot.querySelector('#appListModal');
|
|
4161
|
-
appModal.style.display = "none";
|
|
4162
|
-
}
|
|
4163
|
-
render() {
|
|
4164
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
|
|
4165
|
-
return h("div", { key: 'd186318626a3fbd1d011d3532559901d1c36859e' }, h("div", { key: 'a5887ec423aabb35ca7988169cfa7a9f0bd588e6' }, (() => {
|
|
4166
|
-
var _a, _b, _c, _d, _e, _f;
|
|
4167
|
-
// GLOBAL LOADING SPINNER
|
|
4168
|
-
if (this.isLoading) {
|
|
4169
|
-
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))));
|
|
4170
|
-
}
|
|
4171
|
-
if (this.isRestricted) {
|
|
4172
|
-
return (h("div", { class: "restricted-overlay" }, h("div", { class: "restricted-card" }, h("div", { class: "restricted-icon" }, h("i", { class: "fa-solid fa-shield-halved" })), h("h2", null, "Access Restricted"), h("p", { class: "restricted-message" }, "You do not have permission to access this application. Please contact your administrator if you believe this is an error."), ((_d = (_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) === null || _d === void 0 ? void 0 : _d.length) > 0 && (h("div", { class: "restricted-links" }, h("h4", null, "Publicly Available Modules"), h("div", { class: "link-grid" }, this.config.menu.global.links.map(item => (h("a", { href: item.url, target: "_blank", class: "restricted-link" }, h("i", { class: item.icon }), h("span", null, item.name))))))), h("div", { class: "restricted-actions" }, ((_f = (_e = this.config) === null || _e === void 0 ? void 0 : _e.defaultLink) === null || _f === void 0 ? void 0 : _f.url) && (h("a", { href: this.config.defaultLink.url, target: "_blank", class: "btn-primary" }, "Go to Portal")), h("button", { class: "btn-danger", onClick: this.logout.bind(this) }, "Logout")))));
|
|
4173
|
-
}
|
|
4174
|
-
if (this.isAuth && this.showPostLoginText) {
|
|
4175
|
-
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")));
|
|
4176
|
-
}
|
|
4177
|
-
else if (this.isAuth) {
|
|
4178
|
-
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 ?
|
|
4179
|
-
h("img", { class: "profile-image", src: "https://s-damith.github.io/test-avatar/images/e24da9c5-0b1f-46fa-82cd-7c711c77b5c7.png" })
|
|
4180
|
-
:
|
|
4181
|
-
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 => {
|
|
4182
|
-
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)));
|
|
4183
|
-
})), 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 && { "margin-bottom": "12px" } }, 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"))))) : (
|
|
4184
|
-
// List View
|
|
4185
|
-
h("div", { class: "dropdown-content-link" }, this.config.menu.global.links.map(item => {
|
|
4186
|
-
return (h("a", { href: item.url, target: '_blank', id: "applications-btn" }, h("i", { class: item.icon + " menu-bar-icons" }), item.name));
|
|
4187
|
-
}), 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"))))));
|
|
4188
|
-
}
|
|
4189
|
-
else {
|
|
4190
|
-
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")));
|
|
4191
|
-
}
|
|
4192
|
-
})()), h("div", { key: '1ad6675f4e190df28410c54f7ad9f097578e0403', id: "appListModal", class: "modal" }, h("div", { key: '655f51c1d18372eca86610750d1ac3c8e1eeeefa', class: "modal-content" }, h("span", { key: 'bb850ddc02afdbbc04b5fbc6258d6ab2b1e92bfb', onClick: this.closeModal.bind(this), class: "close" }, "\u00D7"), h("div", { key: '4fdec67f888e554e1c8a3328ae2b55fb1a0fea4d', class: "box" }, h("input", { type: "radio", class: "tab-toggle", name: "tab-toggle", id: "tab1", checked: true }), h("ul", { key: '4317ec4e90f682b549aea49971d12426aaa5c0ef', class: "tab-list" }, h("li", { class: "tab-item" }, h("label", { class: "tab-trigger", htmlFor: "tab1" }, h("i", { class: "fa-solid fa-table-list menu-bar-icons" }), " ", this.config.menu.local.name))), h("div", { key: '8f1b8e0ec034d45a9c04776b90afcbd3cd9fea3e', class: "tab-container" }, h("div", { key: 'e59e81838b0c2fa419314503ab0c2d56143496cb', class: "tab-content" }, h("div", { key: 'f393c5497bfeddae25469d2d4475f9aacdf13629', 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) ? (
|
|
4193
|
-
// <div>{this.localMenuLinks}</div>
|
|
4194
|
-
(_d = this.localMenuLinks) === null || _d === void 0 ? void 0 : _d.map((app, index) => {
|
|
4195
|
-
const isDisabled = !app.url;
|
|
4196
|
-
return (h("a", { key: index, class: "external-app-link", href: isDisabled ? undefined : app.url, target: isDisabled ? undefined : "_blank", rel: isDisabled ? undefined : "noopener noreferrer", onClick: isDisabled ? (e) => e.preventDefault() : undefined }, h("div", { class: "modal-app" }, h("div", null, app.name))));
|
|
4197
|
-
})) : ((_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) &&
|
|
4198
|
-
((_k = (_j = this.localMenuLinks) === null || _j === void 0 ? void 0 : _j.length) !== null && _k !== void 0 ? _k : 0) === 0) ||
|
|
4199
|
-
(((_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) &&
|
|
4200
|
-
((_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: 'c47c1a2e57cbd3d42fcb19d559343a7104e092c0', id: "appPermissionErrorModal", class: "modal" }, h("div", { key: 'cd8a0b1837afc3089bda1bd4d9e7ec0c2a7c3f45', class: "modal-content" }, h("img", { key: 'e21aa2b61cbedff394e4cbbc6993fd06b3c3906e', 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: '0ea76a87518b2a0c2a171bc0f40cb4767f6683e9', class: "green-text margin-b" }, "You don't have permission to access this application."), h("h3", { key: '1dc9d8f8f2ef3a34bf8cb887679c574a59fe5a75', class: "green-text" }, "Please contact the administration."), (this.config.defaultLink.url && this.showUnauthorizedModal) ?
|
|
4201
|
-
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" }))))
|
|
4202
|
-
: h("div", null))));
|
|
4203
|
-
}
|
|
4204
|
-
get el() { return this; }
|
|
4205
|
-
static get style() { return DashButtonStyle0; }
|
|
4206
|
-
}, [1, "dash-button", {
|
|
4207
|
-
"showPostLoginText": [4, "show-post-login-text"],
|
|
4208
|
-
"silentCheckSso": [4, "silent-check-sso"],
|
|
4209
|
-
"redirectUri": [1, "redirect-uri"],
|
|
4210
|
-
"authMethod": [1, "auth-method"],
|
|
4211
|
-
"portalApiUrl": [1, "portal-api-url"],
|
|
4212
|
-
"plmUrl": [1, "plm-url"],
|
|
4213
|
-
"showUnauthorizedModal": [4, "show-unauthorized-modal"],
|
|
4214
|
-
"primaryColor": [1, "primary-color"],
|
|
4215
|
-
"accentColor": [1, "accent-color"],
|
|
4216
|
-
"keycloak": [32],
|
|
4217
|
-
"isAuth": [32],
|
|
4218
|
-
"givenUserName": [32],
|
|
4219
|
-
"silentCheckSsoRedirectUri": [32],
|
|
4220
|
-
"appList": [32],
|
|
4221
|
-
"avatarSvg": [32],
|
|
4222
|
-
"isLoading": [32],
|
|
4223
|
-
"config": [32],
|
|
4224
|
-
"localMenuLinks": [32],
|
|
4225
|
-
"organizationUrl": [32],
|
|
4226
|
-
"isRestricted": [32]
|
|
4227
|
-
}]);
|
|
4228
|
-
function defineCustomElement$1() {
|
|
4229
|
-
if (typeof customElements === "undefined") {
|
|
4230
|
-
return;
|
|
4231
|
-
}
|
|
4232
|
-
const components = ["dash-button"];
|
|
4233
|
-
components.forEach(tagName => { switch (tagName) {
|
|
4234
|
-
case "dash-button":
|
|
4235
|
-
if (!customElements.get(tagName)) {
|
|
4236
|
-
customElements.define(tagName, DashButtonComponent);
|
|
4237
|
-
}
|
|
4238
|
-
break;
|
|
4239
|
-
} });
|
|
4240
|
-
}
|
|
4241
|
-
|
|
4242
|
-
const DashButton = DashButtonComponent;
|
|
4243
|
-
const defineCustomElement = defineCustomElement$1;
|
|
4244
|
-
|
|
4245
|
-
export { DashButton, defineCustomElement };
|
|
4246
|
-
|
|
4247
|
-
//# sourceMappingURL=dash-button.js.map
|
|
1
|
+
import{proxyCustomElement as a,HTMLElement as f,h as e,transformTag as t}from"@stencil/core/internal/client";var r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function i(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}function o(a){if(a.__esModule)return a;var f=a.default;if("function"==typeof f){var e=function a(){return this instanceof a?Reflect.construct(f,arguments,this.constructor):f.apply(this,arguments)};e.prototype=f.prototype}else e={};return Object.defineProperty(e,"__esModule",{value:!0}),Object.keys(a).forEach((function(f){var t=Object.getOwnPropertyDescriptor(a,f);Object.defineProperty(e,f,t.get?t:{enumerable:!0,get:function(){return a[f]}})})),e}var n,s,l,c,d={},u=i(function(){if(n)return d;n=1,d.byteLength=function(a){var f=i(a),e=f[1];return 3*(f[0]+e)/4-e},d.toByteArray=function(a){var t,r,o=i(a),n=o[0],s=o[1],l=new e(function(a,f,e){return 3*(f+e)/4-e}(0,n,s)),c=0,d=s>0?n-4:n;for(r=0;r<d;r+=4)t=f[a.charCodeAt(r)]<<18|f[a.charCodeAt(r+1)]<<12|f[a.charCodeAt(r+2)]<<6|f[a.charCodeAt(r+3)],l[c++]=t>>16&255,l[c++]=t>>8&255,l[c++]=255&t;return 2===s&&(t=f[a.charCodeAt(r)]<<2|f[a.charCodeAt(r+1)]>>4,l[c++]=255&t),1===s&&(t=f[a.charCodeAt(r)]<<10|f[a.charCodeAt(r+1)]<<4|f[a.charCodeAt(r+2)]>>2,l[c++]=t>>8&255,l[c++]=255&t),l},d.fromByteArray=function(f){for(var e,t=f.length,r=t%3,i=[],o=16383,n=0,l=t-r;n<l;n+=o)i.push(s(f,n,n+o>l?l:n+o));return 1===r?i.push(a[(e=f[t-1])>>2]+a[e<<4&63]+"=="):2===r&&i.push(a[(e=(f[t-2]<<8)+f[t-1])>>10]+a[e>>4&63]+a[e<<2&63]+"="),i.join("")};for(var a=[],f=[],e="undefined"!=typeof Uint8Array?Uint8Array:Array,t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r=0;r<64;++r)a[r]=t[r],f[t.charCodeAt(r)]=r;function i(a){var f=a.length;if(f%4>0)throw Error("Invalid string. Length must be a multiple of 4");var e=a.indexOf("=");return-1===e&&(e=f),[e,e===f?0:4-e%4]}function o(f){return a[f>>18&63]+a[f>>12&63]+a[f>>6&63]+a[63&f]}function s(a,f,e){for(var t=[],r=f;r<e;r+=3)t.push(o((a[r]<<16&16711680)+(a[r+1]<<8&65280)+(255&a[r+2])));return t.join("")}return f[45]=62,f[95]=63,d}()),h={exports:{}},p=o(Object.freeze({__proto__:null,default:{}})),m=(s||(s=1,function(a){!function(){var f="input is invalid type",e="object"==typeof window,t=e?window:{};t.JS_SHA256_NO_WINDOW&&(e=!1);var i=!e&&"object"==typeof self,o=!t.JS_SHA256_NO_NODE_JS&&"object"==typeof process&&process.versions&&process.versions.node;o?t=r:i&&(t=self);var n=!t.JS_SHA256_NO_COMMON_JS&&a.exports,s=!t.JS_SHA256_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,l="0123456789abcdef".split(""),c=[-2147483648,8388608,32768,128],d=[24,16,8,0],u=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],h=["hex","array","digest","arrayBuffer"],m=[];!t.JS_SHA256_NO_NODE_JS&&Array.isArray||(Array.isArray=function(a){return"[object Array]"===Object.prototype.toString.call(a)}),!s||!t.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(a){return"object"==typeof a&&a.buffer&&a.buffer.constructor===ArrayBuffer});var b=function(a,f){return function(e){return new y(f,!0).update(e)[a]()}},g=function(a){var f=b("hex",a);o&&(f=w(f,a)),f.create=function(){return new y(a)},f.update=function(a){return f.create().update(a)};for(var e=0;e<h.length;++e){var t=h[e];f[t]=b(t,a)}return f},w=function(a,e){var r,i=p,o=p.Buffer,n=e?"sha224":"sha256";return r=o.from&&!t.JS_SHA256_NO_BUFFER_FROM?o.from:function(a){return new o(a)},function(e){if("string"==typeof e)return i.createHash(n).update(e,"utf8").digest("hex");if(null==e)throw Error(f);return e.constructor===ArrayBuffer&&(e=new Uint8Array(e)),Array.isArray(e)||ArrayBuffer.isView(e)||e.constructor===o?i.createHash(n).update(r(e)).digest("hex"):a(e)}},v=function(a,f){return function(e,t){return new x(e,f,!0).update(t)[a]()}},k=function(a){var f=v("hex",a);f.create=function(f){return new x(f,a)},f.update=function(a,e){return f.create(a).update(e)};for(var e=0;e<h.length;++e){var t=h[e];f[t]=v(t,a)}return f};function y(a,f){f?(m[0]=m[16]=m[1]=m[2]=m[3]=m[4]=m[5]=m[6]=m[7]=m[8]=m[9]=m[10]=m[11]=m[12]=m[13]=m[14]=m[15]=0,this.blocks=m):this.blocks=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],a?(this.h0=3238371032,this.h1=914150663,this.h2=812702999,this.h3=4144912697,this.h4=4290775857,this.h5=1750603025,this.h6=1694076839,this.h7=3204075428):(this.h0=1779033703,this.h1=3144134277,this.h2=1013904242,this.h3=2773480762,this.h4=1359893119,this.h5=2600822924,this.h6=528734635,this.h7=1541459225),this.block=this.start=this.bytes=this.hBytes=0,this.finalized=this.hashed=!1,this.first=!0,this.is224=a}function x(a,e,t){var r,i=typeof a;if("string"===i){var o,n=[],l=a.length,c=0;for(r=0;r<l;++r)(o=a.charCodeAt(r))<128?n[c++]=o:o<2048?(n[c++]=192|o>>6,n[c++]=128|63&o):o<55296||o>=57344?(n[c++]=224|o>>12,n[c++]=128|o>>6&63,n[c++]=128|63&o):(o=65536+((1023&o)<<10|1023&a.charCodeAt(++r)),n[c++]=240|o>>18,n[c++]=128|o>>12&63,n[c++]=128|o>>6&63,n[c++]=128|63&o);a=n}else{if("object"!==i)throw Error(f);if(null===a)throw Error(f);if(s&&a.constructor===ArrayBuffer)a=new Uint8Array(a);else if(!(Array.isArray(a)||s&&ArrayBuffer.isView(a)))throw Error(f)}a.length>64&&(a=new y(e,!0).update(a).array());var d=[],u=[];for(r=0;r<64;++r){var h=a[r]||0;d[r]=92^h,u[r]=54^h}y.call(this,e,t),this.update(u),this.oKeyPad=d,this.inner=!0,this.sharedMemory=t}y.prototype.update=function(a){if(!this.finalized){var e,t=typeof a;if("string"!==t){if("object"!==t)throw Error(f);if(null===a)throw Error(f);if(s&&a.constructor===ArrayBuffer)a=new Uint8Array(a);else if(!(Array.isArray(a)||s&&ArrayBuffer.isView(a)))throw Error(f);e=!0}for(var r,i,o=0,n=a.length,l=this.blocks;o<n;){if(this.hashed&&(this.hashed=!1,l[0]=this.block,l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0),e)for(i=this.start;o<n&&i<64;++o)l[i>>2]|=a[o]<<d[3&i++];else for(i=this.start;o<n&&i<64;++o)(r=a.charCodeAt(o))<128?l[i>>2]|=r<<d[3&i++]:r<2048?(l[i>>2]|=(192|r>>6)<<d[3&i++],l[i>>2]|=(128|63&r)<<d[3&i++]):r<55296||r>=57344?(l[i>>2]|=(224|r>>12)<<d[3&i++],l[i>>2]|=(128|r>>6&63)<<d[3&i++],l[i>>2]|=(128|63&r)<<d[3&i++]):(r=65536+((1023&r)<<10|1023&a.charCodeAt(++o)),l[i>>2]|=(240|r>>18)<<d[3&i++],l[i>>2]|=(128|r>>12&63)<<d[3&i++],l[i>>2]|=(128|r>>6&63)<<d[3&i++],l[i>>2]|=(128|63&r)<<d[3&i++]);this.lastByteIndex=i,this.bytes+=i-this.start,i>=64?(this.block=l[16],this.start=i-64,this.hash(),this.hashed=!0):this.start=i}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296|0,this.bytes=this.bytes%4294967296),this}},y.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var a=this.blocks,f=this.lastByteIndex;a[16]=this.block,a[f>>2]|=c[3&f],this.block=a[16],f>=56&&(this.hashed||this.hash(),a[0]=this.block,a[16]=a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=a[8]=a[9]=a[10]=a[11]=a[12]=a[13]=a[14]=a[15]=0),a[14]=this.hBytes<<3|this.bytes>>>29,a[15]=this.bytes<<3,this.hash()}},y.prototype.hash=function(){var a,f,e,t,r,i,o=this.h0,n=this.h1,s=this.h2,l=this.h3,c=this.h4,d=this.h5,h=this.h6,p=this.h7,m=this.blocks;for(a=16;a<64;++a)m[a]=m[a-16]+(((f=m[a-15])>>>7|f<<25)^(f>>>18|f<<14)^f>>>3)+m[a-7]+(((f=m[a-2])>>>17|f<<15)^(f>>>19|f<<13)^f>>>10)|0;for(i=n&s,a=0;a<64;a+=4)this.first?(this.is224?(e=300032,p=(f=m[0]-1413257819)-150054599|0,l=f+24177077|0):(e=704751109,p=(f=m[0]-210244248)-1521486534|0,l=f+143694565|0),this.first=!1):(p=l+(f=p+((c>>>6|c<<26)^(c>>>11|c<<21)^(c>>>25|c<<7))+(c&d^~c&h)+u[a]+m[a])|0,l=f+(((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((e=o&n)^o&s^i))|0),h=s+(f=h+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+(p&c^~p&d)+u[a+1]+m[a+1])|0,s=f+(((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+((t=l&o)^l&n^e))|0,d=n+(f=d+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+(h&p^~h&c)+u[a+2]+m[a+2])|0,n=f+(((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((r=s&l)^s&o^t))|0,c=o+(f=c+((d>>>6|d<<26)^(d>>>11|d<<21)^(d>>>25|d<<7))+(d&h^~d&p)+u[a+3]+m[a+3])|0,o=f+(((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((i=n&s)^n&l^r))|0,this.chromeBugWorkAround=!0;this.h0=this.h0+o|0,this.h1=this.h1+n|0,this.h2=this.h2+s|0,this.h3=this.h3+l|0,this.h4=this.h4+c|0,this.h5=this.h5+d|0,this.h6=this.h6+h|0,this.h7=this.h7+p|0},y.prototype.toString=y.prototype.hex=function(){this.finalize();var a=this.h0,f=this.h1,e=this.h2,t=this.h3,r=this.h4,i=this.h5,o=this.h6,n=this.h7,s=l[a>>28&15]+l[a>>24&15]+l[a>>20&15]+l[a>>16&15]+l[a>>12&15]+l[a>>8&15]+l[a>>4&15]+l[15&a]+l[f>>28&15]+l[f>>24&15]+l[f>>20&15]+l[f>>16&15]+l[f>>12&15]+l[f>>8&15]+l[f>>4&15]+l[15&f]+l[e>>28&15]+l[e>>24&15]+l[e>>20&15]+l[e>>16&15]+l[e>>12&15]+l[e>>8&15]+l[e>>4&15]+l[15&e]+l[t>>28&15]+l[t>>24&15]+l[t>>20&15]+l[t>>16&15]+l[t>>12&15]+l[t>>8&15]+l[t>>4&15]+l[15&t]+l[r>>28&15]+l[r>>24&15]+l[r>>20&15]+l[r>>16&15]+l[r>>12&15]+l[r>>8&15]+l[r>>4&15]+l[15&r]+l[i>>28&15]+l[i>>24&15]+l[i>>20&15]+l[i>>16&15]+l[i>>12&15]+l[i>>8&15]+l[i>>4&15]+l[15&i]+l[o>>28&15]+l[o>>24&15]+l[o>>20&15]+l[o>>16&15]+l[o>>12&15]+l[o>>8&15]+l[o>>4&15]+l[15&o];return this.is224||(s+=l[n>>28&15]+l[n>>24&15]+l[n>>20&15]+l[n>>16&15]+l[n>>12&15]+l[n>>8&15]+l[n>>4&15]+l[15&n]),s},y.prototype.array=y.prototype.digest=function(){this.finalize();var a=this.h0,f=this.h1,e=this.h2,t=this.h3,r=this.h4,i=this.h5,o=this.h6,n=this.h7,s=[a>>24&255,a>>16&255,a>>8&255,255&a,f>>24&255,f>>16&255,f>>8&255,255&f,e>>24&255,e>>16&255,e>>8&255,255&e,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,i>>24&255,i>>16&255,i>>8&255,255&i,o>>24&255,o>>16&255,o>>8&255,255&o];return this.is224||s.push(n>>24&255,n>>16&255,n>>8&255,255&n),s},y.prototype.arrayBuffer=function(){this.finalize();var a=new ArrayBuffer(this.is224?28:32),f=new DataView(a);return f.setUint32(0,this.h0),f.setUint32(4,this.h1),f.setUint32(8,this.h2),f.setUint32(12,this.h3),f.setUint32(16,this.h4),f.setUint32(20,this.h5),f.setUint32(24,this.h6),this.is224||f.setUint32(28,this.h7),a},(x.prototype=new y).finalize=function(){if(y.prototype.finalize.call(this),this.inner){this.inner=!1;var a=this.array();y.call(this,this.is224,this.sharedMemory),this.update(this.oKeyPad),this.update(a),y.prototype.finalize.call(this)}};var q=g();q.sha256=q,q.sha224=g(!0),q.sha256.hmac=k(),q.sha224.hmac=k(!0),n?a.exports=q:(t.sha256=q.sha256,t.sha224=q.sha224)}()}(h)),h.exports),b=i(m);class g extends Error{}function w(a,f){if("string"!=typeof a)throw new g("Invalid token specified: must be a string");f||(f={});const e=!0===f.header?0:1,t=a.split(".")[e];if("string"!=typeof t)throw new g("Invalid token specified: missing part #"+(e+1));let r;try{r=function(a){let f=a.replace(/-/g,"+").replace(/_/g,"/");switch(f.length%4){case 0:break;case 2:f+="==";break;case 3:f+="=";break;default:throw Error("base64 string is not of the correct length")}try{return function(a){return decodeURIComponent(atob(a).replace(/(.)/g,((a,f)=>{let e=f.charCodeAt(0).toString(16).toUpperCase();return e.length<2&&(e="0"+e),"%"+e})))}(f)}catch(a){return atob(f)}}(t)}catch(a){throw new g(`Invalid token specified: invalid base64 for part #${e+1} (${a.message})`)}try{return JSON.parse(r)}catch(a){throw new g(`Invalid token specified: invalid json for part #${e+1} (${a.message})`)}}if(g.prototype.name="InvalidTokenError","undefined"==typeof Promise)throw Error("Keycloak requires an environment that supports Promises. Make sure that you include the appropriate polyfill.");function v(a){if(!(this instanceof v))throw Error("The 'Keycloak' constructor must be invoked with 'new'.");for(var f,e,t=this,r=[],i={enable:!0,callbackList:[],interval:5},o=document.getElementsByTagName("script"),n=0;n<o.length;n++)-1===o[n].src.indexOf("keycloak.js")&&-1===o[n].src.indexOf("keycloak.min.js")||-1===o[n].src.indexOf("version=")||(t.iframeVersion=o[n].src.substring(o[n].src.indexOf("version=")+8).split("&")[0]);var s=!0,l=L(console.info),c=L(console.warn);function d(a,f){for(var e=function(a){var f=null,e=window.crypto||window.msCrypto;if(e&&e.getRandomValues&&window.Uint8Array)return f=new Uint8Array(a),e.getRandomValues(f),f;f=Array(a);for(var t=0;t<f.length;t++)f[t]=Math.floor(256*Math.random());return f}(a),t=Array(a),r=0;r<a;r++)t[r]=f.charCodeAt(e[r]%f.length);return String.fromCharCode.apply(null,t)}function h(){return void 0!==t.authServerUrl?"/"==t.authServerUrl.charAt(t.authServerUrl.length-1)?t.authServerUrl+"realms/"+encodeURIComponent(t.realm):t.authServerUrl+"/realms/"+encodeURIComponent(t.realm):void 0}function p(a,f){var e=a.code,r=a.error,i=a.prompt,o=(new Date).getTime();if(a.kc_action_status&&t.onActionUpdate&&t.onActionUpdate(a.kc_action_status),r)if("none"!=i){var n={error:r,error_description:a.error_description};t.onAuthError&&t.onAuthError(n),f&&f.setError(n)}else f&&f.setSuccess();else if("standard"!=t.flow&&(a.access_token||a.id_token)&&h(a.access_token,null,a.id_token,!0),"implicit"!=t.flow&&e){var c="code="+e+"&grant_type=authorization_code",d=t.endpoints.token(),u=new XMLHttpRequest;u.open("POST",d,!0),u.setRequestHeader("Content-type","application/x-www-form-urlencoded"),c+="&client_id="+encodeURIComponent(t.clientId),c+="&redirect_uri="+a.redirectUri,a.pkceCodeVerifier&&(c+="&code_verifier="+a.pkceCodeVerifier),u.withCredentials=!0,u.onreadystatechange=function(){if(4==u.readyState)if(200==u.status){var a=JSON.parse(u.responseText);h(a.access_token,a.refresh_token,a.id_token,"standard"===t.flow),z()}else t.onAuthError&&t.onAuthError(),f&&f.setError()},u.send(c)}function h(e,r,i,n){g(e,r,i,o=(o+(new Date).getTime())/2),s&&(t.tokenParsed&&t.tokenParsed.nonce!=a.storedNonce||t.refreshTokenParsed&&t.refreshTokenParsed.nonce!=a.storedNonce||t.idTokenParsed&&t.idTokenParsed.nonce!=a.storedNonce)?(l("[KEYCLOAK] Invalid nonce, clearing token"),t.clearToken(),f&&f.setError()):n&&(t.onAuthSuccess&&t.onAuthSuccess(),f&&f.setSuccess())}}function m(a){return 0==a.status&&a.responseText&&a.responseURL.startsWith("file:")}function g(a,f,e,r){if(t.tokenTimeoutHandle&&(clearTimeout(t.tokenTimeoutHandle),t.tokenTimeoutHandle=null),f?(t.refreshToken=f,t.refreshTokenParsed=w(f)):(delete t.refreshToken,delete t.refreshTokenParsed),e?(t.idToken=e,t.idTokenParsed=w(e)):(delete t.idToken,delete t.idTokenParsed),a){if(t.token=a,t.tokenParsed=w(a),t.sessionId=t.tokenParsed.session_state,t.authenticated=!0,t.subject=t.tokenParsed.sub,t.realmAccess=t.tokenParsed.realm_access,t.resourceAccess=t.tokenParsed.resource_access,r&&(t.timeSkew=Math.floor(r/1e3)-t.tokenParsed.iat),null!=t.timeSkew&&(l("[KEYCLOAK] Estimated time difference between browser and server is "+t.timeSkew+" seconds"),t.onTokenExpired)){var i=1e3*(t.tokenParsed.exp-(new Date).getTime()/1e3+t.timeSkew);l("[KEYCLOAK] Token expires in "+Math.round(i/1e3)+" s"),i<=0?t.onTokenExpired():t.tokenTimeoutHandle=setTimeout(t.onTokenExpired,i)}}else delete t.token,delete t.tokenParsed,delete t.subject,delete t.realmAccess,delete t.resourceAccess,t.authenticated=!1}function k(){var a="0123456789abcdef",f=d(36,a).split("");return f[14]="4",f[19]=a.substr(3&f[19]|8,1),f[8]=f[13]=f[18]=f[23]="-",f.join("")}function y(a){var f=function(a){var f;switch(t.flow){case"standard":f=["code","state","session_state","kc_action_status","iss"];break;case"implicit":f=["access_token","token_type","id_token","state","session_state","expires_in","kc_action_status","iss"];break;case"hybrid":f=["access_token","token_type","id_token","code","state","session_state","expires_in","kc_action_status","iss"]}f.push("error"),f.push("error_description"),f.push("error_uri");var e,r,i=a.indexOf("?"),o=a.indexOf("#");if("query"===t.responseMode&&-1!==i?(e=a.substring(0,i),""!==(r=x(a.substring(i+1,-1!==o?o:a.length),f)).paramsString&&(e+="?"+r.paramsString),-1!==o&&(e+=a.substring(o))):"fragment"===t.responseMode&&-1!==o&&(e=a.substring(0,o),""!==(r=x(a.substring(o+1),f)).paramsString&&(e+="#"+r.paramsString)),r&&r.oauthParams)if("standard"===t.flow||"hybrid"===t.flow){if((r.oauthParams.code||r.oauthParams.error)&&r.oauthParams.state)return r.oauthParams.newUrl=e,r.oauthParams}else if("implicit"===t.flow&&(r.oauthParams.access_token||r.oauthParams.error)&&r.oauthParams.state)return r.oauthParams.newUrl=e,r.oauthParams}(a);if(f){var r=e.get(f.state);return r&&(f.valid=!0,f.redirectUri=r.redirectUri,f.storedNonce=r.nonce,f.prompt=r.prompt,f.pkceCodeVerifier=r.pkceCodeVerifier),f}}function x(a,f){for(var e=a.split("&"),t={paramsString:"",oauthParams:{}},r=0;r<e.length;r++){var i=e[r].indexOf("="),o=e[r].slice(0,i);-1!==f.indexOf(o)?t.oauthParams[o]=e[r].slice(i+1):(""!==t.paramsString&&(t.paramsString+="&"),t.paramsString+=e[r])}return t}function q(){var a={setSuccess:function(f){a.resolve(f)},setError:function(f){a.reject(f)}};return a.promise=new Promise((function(f,e){a.resolve=f,a.reject=e})),a}function A(){var a=q();if(!i.enable)return a.setSuccess(),a.promise;if(i.iframe)return a.setSuccess(),a.promise;var f=document.createElement("iframe");i.iframe=f,f.onload=function(){var f=t.endpoints.authorize();i.iframeOrigin="/"===f.charAt(0)?window.location.origin?window.location.origin:window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:""):f.substring(0,f.indexOf("/",8)),a.setSuccess()};var e=t.endpoints.checkSessionIframe();return f.setAttribute("src",e),f.setAttribute("sandbox","allow-storage-access-by-user-activation allow-scripts allow-same-origin"),f.setAttribute("title","keycloak-session-iframe"),f.style.display="none",document.body.appendChild(f),window.addEventListener("message",(function(a){if(a.origin===i.iframeOrigin&&i.iframe.contentWindow===a.source&&("unchanged"==a.data||"changed"==a.data||"error"==a.data)){"unchanged"!=a.data&&t.clearToken();for(var f=i.callbackList.splice(0,i.callbackList.length),e=f.length-1;e>=0;--e){var r=f[e];"error"==a.data?r.setError():r.setSuccess("unchanged"==a.data)}}}),!1),a.promise}function z(){i.enable&&t.token&&setTimeout((function(){j().then((function(a){a&&z()}))}),1e3*i.interval)}function j(){var a=q();if(i.iframe&&i.iframeOrigin){var f=t.clientId+" "+(t.sessionId?t.sessionId:"");i.callbackList.push(a),1==i.callbackList.length&&i.iframe.contentWindow.postMessage(f,i.iframeOrigin)}else a.setSuccess();return a.promise}function C(){var a=q();if(i.enable||t.silentCheckSsoRedirectUri){var f=document.createElement("iframe");f.setAttribute("src",t.endpoints.thirdPartyCookiesIframe()),f.setAttribute("sandbox","allow-storage-access-by-user-activation allow-scripts allow-same-origin"),f.setAttribute("title","keycloak-3p-check-iframe"),f.style.display="none",document.body.appendChild(f);var e=function(r){f.contentWindow===r.source&&("supported"!==r.data&&"unsupported"!==r.data||("unsupported"===r.data&&(c("[KEYCLOAK] Your browser is blocking access to 3rd-party cookies, this means:\n\n - It is not possible to retrieve tokens without redirecting to the Keycloak server (a.k.a. no support for silent authentication).\n - It is not possible to automatically detect changes to the session status (such as the user logging out in another tab).\n\nFor more information see: https://www.keycloak.org/docs/latest/securing_apps/#_modern_browsers"),i.enable=!1,t.silentCheckSsoFallback&&(t.silentCheckSsoRedirectUri=!1)),document.body.removeChild(f),window.removeEventListener("message",e),a.setSuccess()))};window.addEventListener("message",e,!1)}else a.setSuccess();return function(a,f){var e=null,t=new Promise((function(a,t){e=setTimeout((function(){t({error:"Timeout when waiting for 3rd party check iframe message."})}),f)}));return Promise.race([a,t]).finally((function(){clearTimeout(e)}))}(a.promise,t.messageReceiveTimeout)}function O(a){if(!a||"default"==a)return{login:function(a){return window.location.assign(t.createLoginUrl(a)),q().promise},logout:function(a){return window.location.replace(t.createLogoutUrl(a)),q().promise},register:function(a){return window.location.assign(t.createRegisterUrl(a)),q().promise},accountManagement:function(){var a=t.createAccountUrl();if(void 0===a)throw"Not supported by the OIDC server";return window.location.href=a,q().promise},redirectUri:function(a){return a&&a.redirectUri?a.redirectUri:t.redirectUri?t.redirectUri:location.href}};if("cordova"==a){i.enable=!1;var f=function(a,f,e){return window.cordova&&window.cordova.InAppBrowser?window.cordova.InAppBrowser.open(a,f,e):window.open(a,f,e)},e=function(a){var f=function(a){return a&&a.cordovaOptions?Object.keys(a.cordovaOptions).reduce((function(f,e){return f[e]=a.cordovaOptions[e],f}),{}):{}}(a);return f.location="no",a&&"none"==a.prompt&&(f.hidden="yes"),function(a){return Object.keys(a).reduce((function(f,e){return f.push(e+"="+a[e]),f}),[]).join(",")}(f)},r=function(){return t.redirectUri||"http://localhost"};return{login:function(a){var i=q(),o=e(a),n=t.createLoginUrl(a),s=f(n,"_blank",o),l=!1,c=!1,d=function(){c=!0,s.close()};return s.addEventListener("loadstart",(function(a){0==a.url.indexOf(r())&&(p(y(a.url),i),d(),l=!0)})),s.addEventListener("loaderror",(function(a){l||(0==a.url.indexOf(r())?(p(y(a.url),i),d(),l=!0):(i.setError(),d()))})),s.addEventListener("exit",(function(){c||i.setError({reason:"closed_by_user"})})),i.promise},logout:function(a){var e,i=q(),o=t.createLogoutUrl(a),n=f(o,"_blank","location=no,hidden=yes,clearcache=yes");return n.addEventListener("loadstart",(function(a){0==a.url.indexOf(r())&&n.close()})),n.addEventListener("loaderror",(function(a){0==a.url.indexOf(r())||(e=!0),n.close()})),n.addEventListener("exit",(function(){e?i.setError():(t.clearToken(),i.setSuccess())})),i.promise},register:function(a){var i=q(),o=t.createRegisterUrl(),n=e(a),s=f(o,"_blank",n);return s.addEventListener("loadstart",(function(a){0==a.url.indexOf(r())&&(s.close(),p(y(a.url),i))})),i.promise},accountManagement:function(){var a=t.createAccountUrl();if(void 0===a)throw"Not supported by the OIDC server";var e=f(a,"_blank","location=no");e.addEventListener("loadstart",(function(a){0==a.url.indexOf(r())&&e.close()}))},redirectUri:function(){return r()}}}if("cordova-native"==a)return i.enable=!1,{login:function(a){var f=q(),e=t.createLoginUrl(a);return universalLinks.subscribe("keycloak",(function(a){universalLinks.unsubscribe("keycloak"),window.cordova.plugins.browsertab.close(),p(y(a.url),f)})),window.cordova.plugins.browsertab.openUrl(e),f.promise},logout:function(a){var f=q(),e=t.createLogoutUrl(a);return universalLinks.subscribe("keycloak",(function(){universalLinks.unsubscribe("keycloak"),window.cordova.plugins.browsertab.close(),t.clearToken(),f.setSuccess()})),window.cordova.plugins.browsertab.openUrl(e),f.promise},register:function(a){var f=q(),e=t.createRegisterUrl(a);return universalLinks.subscribe("keycloak",(function(a){universalLinks.unsubscribe("keycloak"),window.cordova.plugins.browsertab.close(),p(y(a.url),f)})),window.cordova.plugins.browsertab.openUrl(e),f.promise},accountManagement:function(){var a=t.createAccountUrl();if(void 0===a)throw"Not supported by the OIDC server";window.cordova.plugins.browsertab.openUrl(a)},redirectUri:function(a){return a&&a.redirectUri?a.redirectUri:t.redirectUri?t.redirectUri:"http://localhost"}};throw"invalid adapter type: "+a}t.init=function(r){if(t.didInitialize)throw Error("A 'Keycloak' instance can only be initialized once.");if(t.didInitialize=!0,t.authenticated=!1,e=function(){try{return new I}catch(a){}return new U}(),f=r&&["default","cordova","cordova-native"].indexOf(r.adapter)>-1?O(r.adapter):r&&"object"==typeof r.adapter?r.adapter:window.Cordova||window.cordova?O("cordova"):O(),r){if(void 0!==r.useNonce&&(s=r.useNonce),void 0!==r.checkLoginIframe&&(i.enable=r.checkLoginIframe),r.checkLoginIframeInterval&&(i.interval=r.checkLoginIframeInterval),"login-required"===r.onLoad&&(t.loginRequired=!0),r.responseMode){if("query"!==r.responseMode&&"fragment"!==r.responseMode)throw"Invalid value for responseMode";t.responseMode=r.responseMode}if(r.flow){switch(r.flow){case"standard":t.responseType="code";break;case"implicit":t.responseType="id_token token";break;case"hybrid":t.responseType="code id_token token";break;default:throw"Invalid value for flow"}t.flow=r.flow}if(null!=r.timeSkew&&(t.timeSkew=r.timeSkew),r.redirectUri&&(t.redirectUri=r.redirectUri),r.silentCheckSsoRedirectUri&&(t.silentCheckSsoRedirectUri=r.silentCheckSsoRedirectUri),t.silentCheckSsoFallback="boolean"!=typeof r.silentCheckSsoFallback||r.silentCheckSsoFallback,r.pkceMethod){if("S256"!==r.pkceMethod)throw"Invalid value for pkceMethod";t.pkceMethod=r.pkceMethod}t.enableLogging="boolean"==typeof r.enableLogging&&r.enableLogging,"string"==typeof r.scope&&(t.scope=r.scope),"string"==typeof r.acrValues&&(t.acrValues=r.acrValues),t.messageReceiveTimeout="number"==typeof r.messageReceiveTimeout&&r.messageReceiveTimeout>0?r.messageReceiveTimeout:1e4}t.responseMode||(t.responseMode="fragment"),t.responseType||(t.responseType="code",t.flow="standard");var o=q(),n=q();n.promise.then((function(){t.onReady&&t.onReady(t.authenticated),o.setSuccess(t.authenticated)})).catch((function(a){o.setError(a)}));var l=function(){var f,e=q();function r(a){t.endpoints=a?{authorize:function(){return a.authorization_endpoint},token:function(){return a.token_endpoint},logout:function(){if(!a.end_session_endpoint)throw"Not supported by the OIDC server";return a.end_session_endpoint},checkSessionIframe:function(){if(!a.check_session_iframe)throw"Not supported by the OIDC server";return a.check_session_iframe},register:function(){throw'Redirection to "Register user" page not supported in standard OIDC mode'},userinfo:function(){if(!a.userinfo_endpoint)throw"Not supported by the OIDC server";return a.userinfo_endpoint}}:{authorize:function(){return h()+"/protocol/openid-connect/auth"},token:function(){return h()+"/protocol/openid-connect/token"},logout:function(){return h()+"/protocol/openid-connect/logout"},checkSessionIframe:function(){var a=h()+"/protocol/openid-connect/login-status-iframe.html";return t.iframeVersion&&(a=a+"?version="+t.iframeVersion),a},thirdPartyCookiesIframe:function(){var a=h()+"/protocol/openid-connect/3p-cookies/step1.html";return t.iframeVersion&&(a=a+"?version="+t.iframeVersion),a},register:function(){return h()+"/protocol/openid-connect/registrations"},userinfo:function(){return h()+"/protocol/openid-connect/userinfo"}}}if(a?"string"==typeof a&&(f=a):f="keycloak.json",f)(n=new XMLHttpRequest).open("GET",f,!0),n.setRequestHeader("Accept","application/json"),n.onreadystatechange=function(){if(4==n.readyState)if(200==n.status||m(n)){var a=JSON.parse(n.responseText);t.authServerUrl=a["auth-server-url"],t.realm=a.realm,t.clientId=a.resource,r(null),e.setSuccess()}else e.setError()},n.send();else{if(!a.clientId)throw"clientId missing";t.clientId=a.clientId;var i=a.oidcProvider;if(i){var o,n;"string"==typeof i?(o="/"==i.charAt(i.length-1)?i+".well-known/openid-configuration":i+"/.well-known/openid-configuration",(n=new XMLHttpRequest).open("GET",o,!0),n.setRequestHeader("Accept","application/json"),n.onreadystatechange=function(){4==n.readyState&&(200==n.status||m(n)?(r(JSON.parse(n.responseText)),e.setSuccess()):e.setError())},n.send()):(r(i),e.setSuccess())}else{if(!a.url)for(var s=document.getElementsByTagName("script"),l=0;l<s.length;l++)if(s[l].src.match(/.*keycloak\.js/)){a.url=s[l].src.substr(0,s[l].src.indexOf("/js/keycloak.js"));break}if(!a.realm)throw"realm missing";t.authServerUrl=a.url,t.realm=a.realm,r(null),e.setSuccess()}}return e.promise}();function c(){var a=function(a){a||(e.prompt="none"),r&&r.locale&&(e.locale=r.locale),t.login(e).then((function(){n.setSuccess()})).catch((function(a){n.setError(a)}))},f=function(){var a=document.createElement("iframe"),f=t.createLoginUrl({prompt:"none",redirectUri:t.silentCheckSsoRedirectUri});a.setAttribute("src",f),a.setAttribute("sandbox","allow-storage-access-by-user-activation allow-scripts allow-same-origin"),a.setAttribute("title","keycloak-silent-check-sso"),a.style.display="none",document.body.appendChild(a);var e=function(f){f.origin===window.location.origin&&a.contentWindow===f.source&&(p(y(f.data),n),document.body.removeChild(a),window.removeEventListener("message",e))};window.addEventListener("message",e)},e={};switch(r.onLoad){case"check-sso":i.enable?A().then((function(){j().then((function(e){e?n.setSuccess():t.silentCheckSsoRedirectUri?f():a(!1)})).catch((function(a){n.setError(a)}))})):t.silentCheckSsoRedirectUri?f():a(!1);break;case"login-required":a(!0);break;default:throw"Invalid value for onLoad"}}function d(){var a=y(window.location.href);if(a&&window.history.replaceState(window.history.state,null,a.newUrl),a&&a.valid)return A().then((function(){p(a,n)})).catch((function(a){n.setError(a)}));r?r.token&&r.refreshToken?(g(r.token,r.refreshToken,r.idToken),i.enable?A().then((function(){j().then((function(a){a?(t.onAuthSuccess&&t.onAuthSuccess(),n.setSuccess(),z()):n.setSuccess()})).catch((function(a){n.setError(a)}))})):t.updateToken(-1).then((function(){t.onAuthSuccess&&t.onAuthSuccess(),n.setSuccess()})).catch((function(a){t.onAuthError&&t.onAuthError(),r.onLoad?c():n.setError(a)}))):r.onLoad?c():n.setSuccess():n.setSuccess()}return l.then((function(){(function(){var a=q(),f=function(){"interactive"!==document.readyState&&"complete"!==document.readyState||(document.removeEventListener("readystatechange",f),a.setSuccess())};return document.addEventListener("readystatechange",f),f(),a.promise})().then(C).then(d).catch((function(a){o.setError(a)}))})),l.catch((function(a){o.setError(a)})),o.promise},t.login=function(a){return f.login(a)},t.createLoginUrl=function(a){var r,i=k(),o=k(),n=f.redirectUri(a),l={state:i,nonce:o,redirectUri:encodeURIComponent(n)};a&&a.prompt&&(l.prompt=a.prompt),r=a&&"register"==a.action?t.endpoints.register():t.endpoints.authorize();var c=a&&a.scope||t.scope;c?-1===c.indexOf("openid")&&(c="openid "+c):c="openid";var h=r+"?client_id="+encodeURIComponent(t.clientId)+"&redirect_uri="+encodeURIComponent(n)+"&state="+encodeURIComponent(i)+"&response_mode="+encodeURIComponent(t.responseMode)+"&response_type="+encodeURIComponent(t.responseType)+"&scope="+encodeURIComponent(c);if(s&&(h=h+"&nonce="+encodeURIComponent(o)),a&&a.prompt&&(h+="&prompt="+encodeURIComponent(a.prompt)),a&&a.maxAge&&(h+="&max_age="+encodeURIComponent(a.maxAge)),a&&a.loginHint&&(h+="&login_hint="+encodeURIComponent(a.loginHint)),a&&a.idpHint&&(h+="&kc_idp_hint="+encodeURIComponent(a.idpHint)),a&&a.action&&"register"!=a.action&&(h+="&kc_action="+encodeURIComponent(a.action)),a&&a.locale&&(h+="&ui_locales="+encodeURIComponent(a.locale)),a&&a.acr){var p=function(a){return JSON.stringify({id_token:{acr:a}})}(a.acr);h+="&claims="+encodeURIComponent(p)}if((a&&a.acrValues||t.acrValues)&&(h+="&acr_values="+encodeURIComponent(a.acrValues||t.acrValues)),t.pkceMethod){var m=d(96,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");l.pkceCodeVerifier=m;var g=function(a,f){if("S256"===a){var e=new Uint8Array(b.arrayBuffer(f));return u.fromByteArray(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,"")}throw"Invalid value for pkceMethod"}(t.pkceMethod,m);h+="&code_challenge="+g,h+="&code_challenge_method="+t.pkceMethod}return e.add(l),h},t.logout=function(a){return f.logout(a)},t.createLogoutUrl=function(a){var e=t.endpoints.logout()+"?client_id="+encodeURIComponent(t.clientId)+"&post_logout_redirect_uri="+encodeURIComponent(f.redirectUri(a,!1));return t.idToken&&(e+="&id_token_hint="+encodeURIComponent(t.idToken)),e},t.register=function(a){return f.register(a)},t.createRegisterUrl=function(a){return a||(a={}),a.action="register",t.createLoginUrl(a)},t.createAccountUrl=function(a){var e=h(),r=void 0;return void 0!==e&&(r=e+"/account?referrer="+encodeURIComponent(t.clientId)+"&referrer_uri="+encodeURIComponent(f.redirectUri(a))),r},t.accountManagement=function(){return f.accountManagement()},t.hasRealmRole=function(a){var f=t.realmAccess;return!!f&&f.roles.indexOf(a)>=0},t.hasResourceRole=function(a,f){if(!t.resourceAccess)return!1;var e=t.resourceAccess[f||t.clientId];return!!e&&e.roles.indexOf(a)>=0},t.loadUserProfile=function(){var a=h()+"/account",f=new XMLHttpRequest;f.open("GET",a,!0),f.setRequestHeader("Accept","application/json"),f.setRequestHeader("Authorization","bearer "+t.token);var e=q();return f.onreadystatechange=function(){4==f.readyState&&(200==f.status?(t.profile=JSON.parse(f.responseText),e.setSuccess(t.profile)):e.setError())},f.send(),e.promise},t.loadUserInfo=function(){var a=t.endpoints.userinfo(),f=new XMLHttpRequest;f.open("GET",a,!0),f.setRequestHeader("Accept","application/json"),f.setRequestHeader("Authorization","bearer "+t.token);var e=q();return f.onreadystatechange=function(){4==f.readyState&&(200==f.status?(t.userInfo=JSON.parse(f.responseText),e.setSuccess(t.userInfo)):e.setError())},f.send(),e.promise},t.isTokenExpired=function(a){if(!t.tokenParsed||!t.refreshToken&&"implicit"!=t.flow)throw"Not authenticated";if(null==t.timeSkew)return l("[KEYCLOAK] Unable to determine if token is expired as timeskew is not set"),!0;var f=t.tokenParsed.exp-Math.ceil((new Date).getTime()/1e3)+t.timeSkew;if(a){if(isNaN(a))throw"Invalid minValidity";f-=a}return f<0},t.updateToken=function(a){var f=q();if(!t.refreshToken)return f.setError(),f.promise;a=a||5;var e=function(){var e=!1;if(-1==a?(e=!0,l("[KEYCLOAK] Refreshing token: forced refresh")):t.tokenParsed&&!t.isTokenExpired(a)||(e=!0,l("[KEYCLOAK] Refreshing token: token expired")),e){var i="grant_type=refresh_token&refresh_token="+t.refreshToken,o=t.endpoints.token();if(r.push(f),1==r.length){var n=new XMLHttpRequest;n.open("POST",o,!0),n.setRequestHeader("Content-type","application/x-www-form-urlencoded"),n.withCredentials=!0,i+="&client_id="+encodeURIComponent(t.clientId);var s=(new Date).getTime();n.onreadystatechange=function(){if(4==n.readyState)if(200==n.status){l("[KEYCLOAK] Token refreshed"),s=(s+(new Date).getTime())/2;var a=JSON.parse(n.responseText);g(a.access_token,a.refresh_token,a.id_token,s),t.onAuthRefreshSuccess&&t.onAuthRefreshSuccess();for(var f=r.pop();null!=f;f=r.pop())f.setSuccess(!0)}else for(c("[KEYCLOAK] Failed to refresh token"),400==n.status&&t.clearToken(),t.onAuthRefreshError&&t.onAuthRefreshError(),f=r.pop();null!=f;f=r.pop())f.setError(!0)},n.send(i)}}else f.setSuccess(!1)};return i.enable?j().then((function(){e()})).catch((function(a){f.setError(a)})):e(),f.promise},t.clearToken=function(){t.token&&(g(null,null,null),t.onAuthLogout&&t.onAuthLogout(),t.loginRequired&&t.login())};var I=function(){if(!(this instanceof I))return new I;function a(){for(var a=(new Date).getTime(),f=0;f<localStorage.length;f++){var e=localStorage.key(f);if(e&&0==e.indexOf("kc-callback-")){var t=localStorage.getItem(e);if(t)try{var r=JSON.parse(t).expires;(!r||r<a)&&localStorage.removeItem(e)}catch(a){localStorage.removeItem(e)}}}}localStorage.setItem("kc-test","test"),localStorage.removeItem("kc-test"),this.get=function(f){if(f){var e="kc-callback-"+f,t=localStorage.getItem(e);return t&&(localStorage.removeItem(e),t=JSON.parse(t)),a(),t}},this.add=function(f){a();var e="kc-callback-"+f.state;f.expires=(new Date).getTime()+36e5,localStorage.setItem(e,JSON.stringify(f))}},U=function(){if(!(this instanceof U))return new U;var a=this;a.get=function(a){if(a){var r=e("kc-callback-"+a);return t("kc-callback-"+a,"",f(-100)),r?JSON.parse(r):void 0}},a.add=function(a){t("kc-callback-"+a.state,JSON.stringify(a),f(60))},a.removeItem=function(a){t(a,"",f(-100))};var f=function(a){var f=new Date;return f.setTime(f.getTime()+60*a*1e3),f},e=function(a){for(var f=a+"=",e=document.cookie.split(";"),t=0;t<e.length;t++){for(var r=e[t];" "==r.charAt(0);)r=r.substring(1);if(0==r.indexOf(f))return r.substring(f.length,r.length)}return""},t=function(a,f,e){var t=a+"="+f+"; expires="+e.toUTCString()+"; ";document.cookie=t}};function L(a){return function(){t.enableLogging&&a.apply(console,Array.prototype.slice.call(arguments))}}}var k=function(){if(c)return l;function a(a,f,e){return parseInt(a.substr(f,e),16)}function f(a){return(a|=0)<0?"00":a<16?"0"+a.toString(16):a<256?a.toString(16):"ff"}function e(a,e,t){return f(255*((t=t<0?t+6:t>6?t-6:t)<1?a+(e-a)*t:t<3?e:t<4?a+(e-a)*(4-t):a))}function t(a){if(/^#[0-9a-f]{3,8}$/i.test(a)){var f,e=a.length;if(e<6){var t=a[1],r=a[2],i=a[3],o=a[4]||"";f="#"+t+t+r+r+i+i+o+o}return(7==e||e>8)&&(f=a),f}}function i(f){var e=a(f,7,2);return isNaN(e)?f:"rgba("+a(f,1,2)+","+a(f,3,2)+","+a(f,5,2)+","+(e/255).toFixed(2)+")"}function o(a,t,r){var i=[.55,.5,.5,.46,.6,.55,.55][6*a+.5|0];return function(a,t,r){var i;if(0==t){var o=f(255*r);i=o+o+o}else{var n=r<=.5?r*(t+1):r+t-r*t,s=2*r-n;i=e(s,n,6*a+2)+e(s,n,6*a)+e(s,n,6*a-2)}return"#"+i}(a,t,r=r<.5?r*i*2:i+(r-.5)*(1-i)*2)}c=1;var n="undefined"!=typeof window?window:"undefined"!=typeof self?self:void 0!==r?r:{},s="config",d={};function u(a,f){this.x=a,this.y=f}function h(a,f,e,t){this.q=a,this.t=f,this.I=e,this.Z=t}h.prototype.J=function(a,f,e,t){var r=this.q+this.I,i=this.t+this.I,o=this.Z;return 1===o?new u(r-f-(t||0),this.t+a):2===o?new u(r-a-(e||0),i-f-(t||0)):3===o?new u(this.q+f,i-a-(e||0)):new u(this.q+a,this.t+f)};var p=new h(0,0,0,0);function m(a){this.K=a,this.u=p}var b=m.prototype;function g(a,f,e,t){var r,i,o,n,s;(a%=14)?1==a?f.j(e-(o=0|.5*e),0,o,0|.8*e,2):2==a?f.i(o=0|e/3,o,e-o,e-o):3==a?f.i(s=e<6?1:e<8?2:0|.25*e,s,e-(n=(n=.1*e)>1?0|n:n>.5?1:n)-s,e-n-s):4==a?f.h(e-(o=0|.5*e)-(i=0|.15*e),e-o-i,o):5==a?((s=4*(n=.1*e))>3&&(s|=0),f.i(0,0,e,e),f.g([s,s,e-n,s,s+(e-s-n)/2,e-n],!0)):6==a?f.g([0,0,e,0,e,.7*e,.4*e,.4*e,.7*e,e,0,e]):7==a?f.j(e/2,e/2,e/2,e/2,3):8==a?(f.i(0,0,e,e/2),f.i(0,e/2,e/2,e/2),f.j(e/2,e/2,e/2,e/2,1)):9==a?(n=.14*e,s=e<4?1:e<6?2:0|.35*e,n=e<8?n:0|n,f.i(0,0,e,e),f.i(s,s,e-s-n,e-s-n,!0)):10==a?(s=3*(n=.12*e),f.i(0,0,e,e),f.h(s,s,e-n-s,!0)):11==a?f.j(e/2,e/2,e/2,e/2,3):12==a?(i=.25*e,f.i(0,0,e,e),f.L(i,i,e-i,e-i,!0)):!t&&f.h(i=.4*e,i,o=1.2*e):f.g([0,0,e,0,e,e-2*(r=.42*e),e-r,e,0,e])}function w(a,f,e){var t;(a%=4)?1==a?f.j(0,e/2,e,e/2,0):2==a?f.L(0,0,e,e):f.h(t=e/6,t,e-2*t):f.j(0,0,e,e,0)}function v(f,e,r){var i=function(a){var f="object"==typeof a&&a||d[s]||n.jdenticon_config||{},e=f.lightness||{},r=f.saturation||{},i="color"in r?r.color:r,o=r.grayscale,l=f.backColor,c=f.padding;function u(a,f){var t=e[a];return t&&t.length>1||(t=f),function(a){return(a=t[0]+a*(t[1]-t[0]))<0?0:a>1?1:a}}return{X:function(a){var e,t=f.hues;return t&&t.length>0&&(e=t[0|.999*a*t.length]),"number"==typeof e?(e/360%1+1)%1:a},o:"number"==typeof i?i:.5,F:"number"==typeof o?o:0,p:u("color",[.4,.8]),G:u("grayscale",[.3,.9]),H:t(l),Y:"number"==typeof a?a:"number"==typeof c?c:.08}}(r);i.H&&f.m(i.H);var l=f.k,c=.5+l*i.Y|0;l-=2*c;var u=new m(f),p=0|l/4,b=0|c+l/2-2*p,v=0|c+l/2-2*p;function k(t,r,i,o,n){var s=a(e,i,1),l=o?a(e,o,1):0;f.M(x[q[t]]);for(var c=0;c<n.length;c++)u.u=new h(b+n[c][0]*p,v+n[c][1]*p,p,l++%4),r(s,u,p,c);f.N()}var y,x=function(a,f){return[o(a=f.X(a),f.F,f.G(0)),o(a,f.o,f.p(.5)),o(a,f.F,f.G(1)),o(a,f.o,f.p(1)),o(a,f.o,f.p(0))]}(a(e,-7)/268435455,i),q=[];function A(a){if(a.indexOf(y)>=0)for(var f=0;f<a.length;f++)if(q.indexOf(a[f])>=0)return!0}for(var z=0;z<3;z++)y=a(e,8+z,1)%x.length,(A([0,4])||A([2,3]))&&(y=1),q.push(y);k(0,w,2,3,[[1,0],[2,0],[2,3],[1,3],[0,1],[3,1],[3,2],[0,2]]),k(1,w,4,5,[[0,0],[3,0],[3,3],[0,3]]),k(2,g,1,null,[[1,1],[2,1],[2,2],[1,2]]),f.finish()}function k(a){return/^[0-9a-f]{11,}$/i.test(a)&&a}function y(a){return function(a){var f,e=0,t=0,r=encodeURI(a)+"%80",i=[],o=[],n=1732584193,s=4023233417,l=~n,c=~s,d=3285377520,u=[n,s,l,c,d],h=0,p="";function m(a,f){return a<<f|a>>>32-f}for(;e<r.length;t++)i[t>>2]=i[t>>2]|("%"==r[e]?parseInt(r.substring(e+1,e+=3),16):r.charCodeAt(e++))<<8*(3-(3&t));for(i[(f=16*(1+(t+7>>6)))-1]=8*t-8;h<f;h+=16){for(e=0;e<80;e++)t=m(n,5)+d+(e<20?1518500249+(s&l^~s&c):e<40?1859775393+(s^l^c):e<60?2400959708+(s&l^s&c^l&c):3395469782+(s^l^c))+(o[e]=e<16?0|i[h+e]:m(o[e-3]^o[e-8]^o[e-14]^o[e-16],1)),d=c,c=l,l=m(s,30),s=n,n=t;u[0]=n=u[0]+n|0,u[1]=s=u[1]+s|0,u[2]=l=u[2]+l|0,u[3]=c=u[3]+c|0,u[4]=d=u[4]+d|0}for(e=0;e<40;e++)p+=(u[e>>3]>>>4*(7-(7&e))&15).toString(16);return p}(null==a?"":""+a)}function x(a,f){var e=a.canvas,t=e.width,r=e.height;a.save(),f||a.translate((t-(f=Math.min(t,r)))/2|0,(r-f)/2|0),this.l=a,this.k=f,a.clearRect(0,0,f,f)}b.g=function(a,f){for(var e=f?-2:2,t=[],r=f?a.length-2:0;r<a.length&&r>=0;r+=e)t.push(this.u.J(a[r],a[r+1]));this.K.g(t)},b.h=function(a,f,e,t){var r=this.u.J(a,f,e,e);this.K.h(r,e,t)},b.i=function(a,f,e,t,r){this.g([a,f,a+e,f,a+e,f+t,a,f+t],r)},b.j=function(a,f,e,t,r,i){var o=[a+e,f,a+e,f+t,a,f+t,a,f];o.splice((r||0)%4*2,2),this.g(o,i)},b.L=function(a,f,e,t,r){this.g([a+e/2,f,a+e,f+t/2,a+e/2,f+t,a,f+t/2],r)};var q=x.prototype;q.m=function(a){var f=this.l,e=this.k;f.fillStyle=i(a),f.fillRect(0,0,e,e)},q.M=function(a){var f=this.l;f.fillStyle=i(a),f.beginPath()},q.N=function(){this.l.fill()},q.g=function(a){var f=this.l;f.moveTo(a[0].x,a[0].y);for(var e=1;e<a.length;e++)f.lineTo(a[e].x,a[e].y);f.closePath()},q.h=function(a,f,e){var t=this.l,r=f/2;t.moveTo(a.x+r,a.y+r),t.arc(a.x+r,a.y+r,r,0,2*Math.PI,e),t.closePath()},q.finish=function(){this.l.restore()};var A="data-jdenticon-hash",z="data-jdenticon-value",j="jdenticonRendered",C="["+A+"],["+z+"]",O="undefined"!=typeof document&&document.querySelectorAll.bind(document);function I(a){return(10*a+.5|0)/10}function U(){this.A=""}var L=U.prototype;function R(a){this.C={},this.P=a,this.k=a.k}L.g=function(a){for(var f="",e=0;e<a.length;e++)f+=(e?"L":"M")+I(a[e].x)+" "+I(a[e].y);this.A+=f+"Z"},L.h=function(a,f,e){var t=e?0:1,r=I(f/2),i=I(f),o="a"+r+","+r+" 0 1,"+t+" ";this.A+="M"+I(a.x)+" "+I(a.y+f/2)+o+i+",0"+o+-i+",0"};var N=R.prototype;N.m=function(f){var e=/^(#......)(..)?/.exec(f),t=e[2]?a(e[2],0)/255:1;this.P.m(e[1],t)},N.M=function(a){this.B=this.C[a]||(this.C[a]=new U)},N.N=function(){},N.g=function(a){this.B.g(a)},N.h=function(a,f,e){this.B.h(a,f,e)},N.finish=function(){var a=this.C;for(var f in a)a.hasOwnProperty(f)&&this.P.R(f,a[f].A)};var S="http://www.w3.org/2000/svg",_="width",M="height";function F(a){this.k=a,this.D='<svg xmlns="'+S+'" width="'+a+'" height="'+a+'" viewBox="0 0 '+a+" "+a+'">'}var E=F.prototype;function T(a,f){for(var e=[],t=arguments.length-2;t-- >0;)e[t]=arguments[t+2];for(var r=document.createElementNS(S,f),i=0;i+1<e.length;i+=2)r.setAttribute(e[i],e[i+1]);a.appendChild(r)}function Y(a){var f=this.k=Math.min(Number(a.getAttribute(_))||100,Number(a.getAttribute(M))||100);for(this.V=a;a.firstChild;)a.removeChild(a.firstChild);a.setAttribute("viewBox","0 0 "+f+" "+f),a.setAttribute("preserveAspectRatio","xMidYMid meet")}E.m=function(a,f){f&&(this.D+='<rect width="100%" height="100%" fill="'+a+'" opacity="'+f.toFixed(2)+'"/>')},E.R=function(a,f){this.D+='<path fill="'+a+'" d="'+f+'"/>'},E.toString=function(){return this.D+"</svg>"};var P=Y.prototype;function K(a,f,e){B(a,f,e,(function(a,f){if(f)return 1==f?new R(new Y(a)):new x(a.getContext("2d"))}))}function B(a,f,e,t){if("string"!=typeof a){var r=k(f)||null!=f&&y(f)||k(a.getAttribute(A))||a.hasAttribute(z)&&y(a.getAttribute(z));if(r){var i=t(a,function(a){if(a){var f=a.tagName;if(/^svg$/i.test(f))return 1;if(/^canvas$/i.test(f)&&"getContext"in a)return 2}}(a));i&&(v(i,r,e),a[j]=!0)}}else if(O)for(var o=O(a),n=0;n<o.length;n++)B(o[n],f,e,t)}P.m=function(a,f){f&&T(this.V,"rect",_,"100%",M,"100%","fill",a,"opacity",f)},P.R=function(a,f){T(this.V,"path","fill",a,"d",f)};var J=function(){O&&K(C)};return function(a){d=a}(J),J.configure=function(a){return arguments.length&&(d[s]=a),d[s]},J.drawIcon=function(a,f,e,t){if(!a)throw Error("No canvas specified.");v(new x(a,e),k(f)||y(f),t);var r=a.canvas;r&&(r[j]=!0)},J.toSvg=function(a,f,e){var t=new F(f);return v(new R(t),k(a)||y(a),e),""+t},J.update=K,J.updateCanvas=function(a,f,e){B(a,f,e,(function(a,f){if(2==f)return new x(a.getContext("2d"))}))},J.updateSvg=function(a,f,e){B(a,f,e,(function(a,f){if(1==f)return new R(new Y(a))}))},J.version="3.3.0",J.bundle="browser-cjs",l=J}();const y={keycloak:{url:"https://keycloak.ds2.icelab.cloud",realm:"ds2",clientId:"dashbtn"},defaultLink:{name:"Portal",url:"https://portal.ds2.icelab.cloud"},menuViewType:"grid",cookieName:"ZDZW_cookie",menu:{global:{name:"Applications",links:[]},local:{name:"Applications",enableCustomLocalMenu:!0,links:[]}},loading:{isLoading:!0,duration:800},allowedGlobalDomain:"",whitelistedUrls:""};class x{constructor(){this._config=y}static getInstance(){return x.instance||(x.instance=new x),x.instance}async fetchConfig(a){try{const f=await fetch(a+"/developer/dashbuttons/config");if(!f.ok)throw Error("Failed to fetch config");const e=await f.json();this._config=Object.assign(Object.assign({},y),e)}catch(a){console.warn("Using default config due to API failure",a),this._config=y}return this._config}get config(){return this._config}}const q=x.getInstance(),A=new class{async getMenuConfig(a){try{const f=await fetch(a);if(!f.ok)throw Error("API error");return await f.json()}catch(a){return{data:[],total:0,page:1,perPage:0,totalPages:0}}}setDefaultProtocol(a){return/^https?:\/\//i.test(a)?a:"https://"+a}async getMenuLinks(a){const f=this.setDefaultProtocol(a),e=new URL(f);e.hostname="containerisationbackend."+e.hostname;const{data:t}=await this.getMenuConfig(e.origin+"/developer/charts/installed");return t.map((f=>{var e,t,r;const i=null===(e=f.metadata)||void 0===e?void 0:e.frontendUrlPrefix,o=(a=>{const f=a.startsWith("http")?new URL(a):new URL("https://"+a),e=f.hostname,t=f.port?":"+f.port:"",r=e.split(".");return"localhost"===e?e+t:e.endsWith(".sslip.io")?r.slice(-5).join(".")+t:e+t})(a),n=`${((a,f="https://")=>{if(!a)return f;const e=a.trim().match(/^(https?:\/\/)/i);return e?e[1]:f})(a)}${i}.${o}`;return{name:f.installChartName,url:i?n:"",category:null!==(r=null===(t=f.metadata)||void 0===t?void 0:t.category)&&void 0!==r?r:""}}))}},z=a(class extends f{constructor(a){super(),!1!==a&&this.__registerHost(),this.__attachShadow(),this.showPostLoginText=!1,this.silentCheckSso=!1,this.authMethod="check-sso",this.portalApiUrl="",this.plmUrl="https://productlicensemanager-zdzw.cloud.zdzw-project.com",this.showUnauthorizedModal=!1,this.primaryColor="",this.accentColor="",this.notificationPosition="left",this.keycloak=null,this.isAuth=!1,this.givenUserName="",this.silentCheckSsoRedirectUri=window.location.origin+"/assets/verificar-sso.html",this.appList=[],this.avatarSvg=k.toSvg("init-avatar",40),this.isLoading=!1,this.isRestricted=!1}componentDidLoad(){console.log("New version!!!"),this.el.addEventListener("click",(a=>{const f=a.composedPath();if(!f.some((a=>a&&"NOTIFICATION-COMPONENT"===a.tagName)))return;const e=f.find((a=>a&&("A"===a.tagName||"function"==typeof a.hasAttribute&&a.hasAttribute("href"))));if(e){const f=e.getAttribute("href");f&&(a.preventDefault(),a.stopPropagation(),e.classList.contains("button-link")?(console.log("Notification module home link intercepted. Opening in new tab:",f),window.open(f,"_blank","noopener,noreferrer")):(console.log("Notification module standard link intercepted. Navigating in current view:",f),window.location.href=f))}}))}async componentWillLoad(){var a,f,e,t;this.config=await q.fetchConfig(this.portalApiUrl),console.log(this.config),this.config&&((null===(f=null===(a=this.config)||void 0===a?void 0:a.loading)||void 0===f?void 0:f.isLoading)&&(this.isLoading=!0,setTimeout((()=>{this.isLoading=!1}),null===(t=null===(e=this.config)||void 0===e?void 0:e.loading)||void 0===t?void 0:t.duration)),this.keycloak=new v({url:this.config.keycloak.url,realm:this.config.keycloak.realm,clientId:this.config.keycloak.clientId}),this.initKeycloak().then((()=>{this.isAuth&&(this.loadOrganizationUrlAndLinks(),this.validateAppAccessByUrl())})))}async initKeycloak(){localStorage.removeItem("ZDZW_app_permission"),await this.keycloak.init({onLoad:this.authMethod,checkLoginIframe:!1,silentCheckSsoRedirectUri:this.silentCheckSso?this.silentCheckSsoRedirectUri:""}).then((a=>{var f,e,t;a&&(this.isAuth=!0,localStorage.setItem("keycloak",JSON.stringify(this.keycloak)),document.cookie=this.config.cookieName+"="+JSON.parse(null!==(f=localStorage.getItem("keycloak"))&&void 0!==f?f:"{}").token,this.givenUserName=JSON.parse(null!==(e=localStorage.getItem("keycloak"))&&void 0!==e?e:"{}").idTokenParsed.preferred_username,this.avatarSvg=k.toSvg(JSON.parse(null!==(t=localStorage.getItem("keycloak"))&&void 0!==t?t:"{}").idTokenParsed.sub,40))}))}async loadOrganizationUrlAndLinks(){var a,f,e;try{const f=JSON.parse(localStorage.getItem("keycloak")||"{}");this.organizationUrl=(null===(a=null==f?void 0:f.idTokenParsed)||void 0===a?void 0:a.organizationUrl)||null}catch(a){this.organizationUrl=null}if(this.organizationUrl&&(null===(e=null===(f=this.config)||void 0===f?void 0:f.menu)||void 0===e?void 0:e.local)&&!this.config.menu.local.enableCustomLocalMenu)try{this.localMenuLinks=await A.getMenuLinks(this.organizationUrl)}catch(a){console.error("Failed to load local menu",a),this.localMenuLinks=[]}}validateAppAccessByUrl(){var a,f,e,t,r,i;const o=a=>a.replace(/\/+$/,""),n=o(window.location.href),s=o(window.location.origin),l=(null===(e=null===(f=null===(a=this.config)||void 0===a?void 0:a.menu)||void 0===f?void 0:f.global)||void 0===e?void 0:e.links)||[],c=(null===(t=this.config)||void 0===t?void 0:t.allowedGlobalDomain)||"",d=(null===(r=this.config)||void 0===r?void 0:r.whitelistedUrls)||"",u=l.some((a=>{try{const f=o(new URL(a.url).origin);return s===f}catch(a){return!1}})),h=null===(i=this.keycloak)||void 0===i?void 0:i.tokenParsed,p=null==h?void 0:h.organizationUrl,m=p&&n.includes(o(p)),b=c&&s.includes(o(c)),g=(d?d.split(",").map((a=>o(a.trim()))):[]).some((a=>n.includes(a)));this.isRestricted=!(u||m||b||g)}login(){this.keycloak.login()}logout(){localStorage.removeItem("keycloak"),document.cookie=this.config.cookieName+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;",this.keycloak.logout()}showModal(){this.el.shadowRoot.querySelector("#appListModal").style.display="block"}closeModal(){this.el.shadowRoot.querySelector("#appListModal").style.display="none"}renderNotificationComponent(){var a;const f=null===(a=this.keycloak)||void 0===a?void 0:a.idTokenParsed,t=(null==f?void 0:f.preferred_username)||(null==f?void 0:f.sub)||"",r=(null==f?void 0:f.organizationUrl)||"",i=r?new URL(r.startsWith("http")?r:"https://"+r).hostname:"";return i&&t?e("notification-component",{owner:t,"max-records":10,"display-type":"icon","notification-url":`https://notifications.${i}/notifications-api`,"socket-connect":!0,"socket-url":`wss://repository.${i}/socket`,"list-url":`https://notifications.${i}/notifications`}):null}render(){var a,f,t,r,i,o,n,s,l,c,d,u,h,p,m,b,g,w,v,k,y;return e("div",{key:"a2d1650d96fcbbfa5128da4315e70dc0c2682dfd"},e("div",{key:"975ab012c618442f627f00a9ee29773c08d55824"},(()=>{var a,f,t,r,i,o,n,s;return this.isLoading?e("a",{id:"login-btn",class:"button button-link"},e("div",{class:"lds-ring"},e("div",null),e("div",null),e("div",null),e("div",null))):this.isRestricted?e("div",{class:"restricted-overlay"},e("div",{class:"restricted-card"},e("div",{class:"restricted-icon"},e("i",{class:"fa-solid fa-shield-halved"})),e("h2",null,"Access Restricted"),e("p",{class:"restricted-message"},"You do not have permission to access this application. Please contact your administrator if you believe this is an error."),(null===(r=null===(t=null===(f=null===(a=this.config)||void 0===a?void 0:a.menu)||void 0===f?void 0:f.global)||void 0===t?void 0:t.links)||void 0===r?void 0:r.length)>0&&e("div",{class:"restricted-links"},e("h4",null,"Publicly Available Modules"),e("div",{class:"link-grid"},this.config.menu.global.links.map((a=>e("a",{href:a.url,target:"_blank",class:"restricted-link"},e("i",{class:a.icon}),e("span",null,a.name)))))),e("div",{class:"restricted-actions"},(null===(o=null===(i=this.config)||void 0===i?void 0:i.defaultLink)||void 0===o?void 0:o.url)&&e("a",{href:this.config.defaultLink.url,target:"_blank",class:"btn-primary"},"Go to Portal"),e("button",{class:"btn-danger",onClick:this.logout.bind(this)},"Logout")))):this.isAuth&&this.showPostLoginText?e("a",{style:{background:null!=this.primaryColor?this.primaryColor:""},href:this.redirectUri,id:"login-btn",class:"button button-link"},e("span",{style:{color:null!=this.accentColor?this.accentColor:""},class:"button-text button-text-full-width"},"Go to Dashboard")):this.isAuth?e("div",{class:"profile-actions",style:{display:"inline-flex",alignItems:"center",gap:"15px"}},"right"!==this.notificationPosition&&this.renderNotificationComponent(),e("div",{id:"profile-btn",class:"dropdown"},e("button",{style:{background:null!=this.primaryColor?this.primaryColor:""},type:"button",class:"button"},e("span",{class:"button-profile"},JSON.parse(null!==(n=localStorage.getItem("keycloak"))&&void 0!==n?n:"{}").idTokenParsed.imageUrl?e("img",{class:"profile-image",src:"https://s-damith.github.io/test-avatar/images/e24da9c5-0b1f-46fa-82cd-7c711c77b5c7.png"}):e("div",{innerHTML:this.avatarSvg})),e("span",{style:{color:null!=this.accentColor?this.accentColor:""},id:"given-name",class:"button-text"},this.givenUserName),e("div",{class:"button-icon"},e("i","grid"==this.config.menuViewType?{class:"fa-solid fa-grip-vertical"}:{class:"fa-solid fa-bars"}))),e("div",{class:"dropdown-content"},e("div",{class:"dropdown-user-profile"},e("div",{class:"username"},"@",this.givenUserName),e("div",{class:"first-last-name"},JSON.parse(null!==(s=localStorage.getItem("keycloak"))&&void 0!==s?s:"{}").idTokenParsed.name)),"grid"==this.config.menuViewType?e("div",null,e("div",{class:"grid-view-menu"},this.config.menu.global.links.map((a=>e("a",{href:a.url,target:"_blank",class:"grid-view-link"},e("i",{class:a.icon+" fa-2x"}),e("div",{class:"grid-view-link-text"},a.name))))),0!=this.config.menu.global.links.length&&e("hr",{class:"solid"}),e("div",{class:"grid-view-menu",style:0===this.config.menu.global.links.length?{marginBottom:"12px"}:void 0},e("a",{onClick:this.showModal.bind(this),class:"grid-view-link"},e("i",{class:"fa-regular fa-window-restore fa-2x"}),e("div",{class:"grid-view-link-text"},"Modules")),e("a",{href:this.config.defaultLink.url,target:"_blank",class:"grid-view-link"},e("i",{class:"fa-solid fa-globe fa-2x"}),e("div",{class:"grid-view-link-text"},this.config.defaultLink.name)),e("a",{onClick:this.logout.bind(this),class:"grid-view-link"},e("i",{class:"fa-solid fa-right-from-bracket fa-2x"}),e("div",{class:"grid-view-link-text"},"Logout")))):e("div",{class:"dropdown-content-link"},this.config.menu.global.links.map((a=>e("a",{href:a.url,target:"_blank",id:"applications-btn"},e("i",{class:a.icon+" menu-bar-icons"}),a.name))),e("a",{onClick:this.showModal.bind(this),id:"applications-btn"},e("i",{class:"fa-regular fa-window-restore menu-bar-icons"}),"Modules"),e("a",{href:this.config.defaultLink.url,target:"_blank",id:"applications-btn"},e("i",{class:"fa-solid fa-globe menu-bar-icons"}),this.config.defaultLink.name),e("a",{onClick:this.logout.bind(this),id:"logout-btn"},e("i",{class:"fa-solid fa-right-from-bracket menu-bar-icons"}),"Logout")))),"right"===this.notificationPosition&&this.renderNotificationComponent()):e("button",{style:{background:null!=this.primaryColor?this.primaryColor:""},onClick:this.login.bind(this),id:"login-btn",type:"button",class:"button"},e("span",{style:{color:null!=this.accentColor?this.accentColor:""},class:"button-text"},"Login"))})()),e("div",{key:"3a9e8bd2730ba8d71f1e8416bab4d745a68dda9a",id:"appListModal",class:"modal"},e("div",{key:"8f85ebe690af26900e003755e68fa5cd1401b502",class:"modal-content"},e("span",{key:"445d67c3803859bbec76177291fd71389ccf5917",onClick:this.closeModal.bind(this),class:"close"},"×"),e("div",{key:"0a0df9bb6fc5258568fb9363353f58486a30f744",class:"box"},e("input",{key:"eec587753688b1ac0bd1a3b87975f0b9692d7719",type:"radio",class:"tab-toggle",name:"tab-toggle",id:"tab1",checked:!0}),e("ul",{key:"4db9fff924d2f38e3e42b83bd96fe2589dc2c701",class:"tab-list"},e("li",{key:"99e9a21d90012e521aa10d21194f44013dbd5931",class:"tab-item"},e("label",{key:"c4fadd0b70b3e944860056a37e9d5f52b7c625b5",class:"tab-trigger",htmlFor:"tab1"},e("i",{key:"5252821523386c869725b0e13bf662ec03f24d81",class:"fa-solid fa-table-list menu-bar-icons"})," ",this.config.menu.local.name))),e("div",{key:"2da9e2383580f6d5130883051c4b0d1cba1354a7",class:"tab-container"},e("div",{key:"a51f2e9b923836b63b9ff2453d08dc3ee93213e6",class:"tab-content"},e("div",{key:"9c7146fa59070eace7bcb1b76fb2b59468e23b5c",class:"modal-body"},(null===(t=null===(f=null===(a=this.config)||void 0===a?void 0:a.menu)||void 0===f?void 0:f.local)||void 0===t?void 0:t.enableCustomLocalMenu)?null===(i=this.config.menu.local.links)||void 0===i?void 0:i.map(((a,f)=>e("a",{key:f,class:"external-app-link",target:"_blank",rel:"noopener noreferrer",href:a.url},e("div",{class:"modal-app"},e("div",null,a.name))))):null===(r=this.localMenuLinks)||void 0===r?void 0:r.map(((a,f)=>{const t=!a.url;return e("a",{key:f,class:"external-app-link",href:t?void 0:a.url,target:t?void 0:"_blank",rel:t?void 0:"noopener noreferrer",onClick:t?a=>a.preventDefault():void 0},e("div",{class:"modal-app"},e("div",null,a.name)))})),this.organizationUrl?(!(null===(s=null===(n=null===(o=this.config)||void 0===o?void 0:o.menu)||void 0===n?void 0:n.local)||void 0===s?void 0:s.enableCustomLocalMenu)&&0===(null!==(c=null===(l=this.localMenuLinks)||void 0===l?void 0:l.length)&&void 0!==c?c:0)||(null===(h=null===(u=null===(d=this.config)||void 0===d?void 0:d.menu)||void 0===u?void 0:u.local)||void 0===h?void 0:h.enableCustomLocalMenu)&&0===(null!==(w=null===(g=null===(b=null===(m=null===(p=this.config)||void 0===p?void 0:p.menu)||void 0===m?void 0:m.local)||void 0===b?void 0:b.links)||void 0===g?void 0:g.length)&&void 0!==w?w:0))&&e("div",null,e("h3",{class:"gray-text"},"No installed ",(null===(y=null===(k=null===(v=this.config)||void 0===v?void 0:v.menu)||void 0===k?void 0:k.local)||void 0===y?void 0:y.name)||"menu"," found."),e("p",{class:"gray-text"},"Please contact administration.")):e("div",null,e("h3",{class:"gray-text"},"Organization Domain URL not set"),e("p",{class:"gray-text"},"Please set your Organization Domain URL on the Portal profile page.")))))))),e("div",{key:"2a36c585f0f83380bc08b30141df91c1532b4a28",id:"appPermissionErrorModal",class:"modal"},e("div",{key:"8fbbb80e22591c105c5010689d2f91909652ed8c",class:"modal-content"},e("img",{key:"1621c2b97802968da0e6429e1b1571eb4080ef68",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"}),e("h2",{key:"f9a6ba63c8d9ca116ad61a1eae25fca676b88767",class:"green-text margin-b"},"You don't have permission to access this application."),e("h3",{key:"12783289a6b8ef86c096457555f3371cbbde39dc",class:"green-text"},"Please contact the administration."),this.config.defaultLink.url&&this.showUnauthorizedModal?e("div",null,e("h4",{class:"gray-text"},"You will be automatically redirected to the portal."),e("div",{id:"countdown"},e("div",{id:"countdown-number"}),e("svg",null,e("circle",{r:"18",cx:"20",cy:"20"})))):e("div",null))))}get el(){return this}static get style(){return'.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)}}'}},[1,"dash-button",{showPostLoginText:[4,"show-post-login-text"],silentCheckSso:[4,"silent-check-sso"],redirectUri:[1,"redirect-uri"],authMethod:[1,"auth-method"],portalApiUrl:[1,"portal-api-url"],plmUrl:[1,"plm-url"],showUnauthorizedModal:[4,"show-unauthorized-modal"],primaryColor:[1,"primary-color"],accentColor:[1,"accent-color"],notificationPosition:[1,"notification-position"],keycloak:[32],isAuth:[32],givenUserName:[32],silentCheckSsoRedirectUri:[32],appList:[32],avatarSvg:[32],isLoading:[32],config:[32],localMenuLinks:[32],organizationUrl:[32],isRestricted:[32]}]),j=z,C=function(){"undefined"!=typeof customElements&&["dash-button"].forEach((a=>{"dash-button"===a&&(customElements.get(t(a))||customElements.define(t(a),z))}))};export{j as DashButton,C as defineCustomElement}
|