devicely 2.0.11 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/devicely.js +1 -1
- package/lib/.env.example +20 -0
- package/lib/androidDeviceDetection.js +1 -1
- package/lib/appMappings.js +1 -1
- package/lib/deviceDetection.js +1 -1
- package/lib/devices.js +1 -1
- package/lib/doctor.js +1 -1
- package/lib/executor.js +1 -1
- package/lib/frontend/static/js/main.96600727.js +3 -1
- package/lib/logger.js +1 -1
- package/lib/server.js +1 -1
- package/package.json +7 -2
- package/scripts/shell/android_device_control.enc +1 -0
- package/scripts/shell/connect_android_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_android_wireless.enc +1 -0
- package/scripts/shell/connect_android_wireless_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -0
- package/scripts/shell/ios_device_control.enc +1 -0
- package/config/apps_presets.conf +0 -271
- package/config/devices.conf +0 -24
- package/scripts/shell/android_device_control.sh +0 -64
- package/scripts/shell/connect_android_usb_multi_final.sh +0 -64
- package/scripts/shell/connect_android_wireless.sh +0 -64
- package/scripts/shell/connect_android_wireless_multi_final.sh +0 -64
- package/scripts/shell/connect_ios_usb_multi_final.sh +0 -64
- package/scripts/shell/connect_ios_wireless_multi_final.sh +0 -64
- package/scripts/shell/create_production_scripts.sh +0 -64
- package/scripts/shell/install_uiautomator2.sh +0 -64
- package/scripts/shell/ios_device_control.sh +0 -64
- package/scripts/shell/organize_project.sh +0 -64
- package/scripts/shell/pre-publish-check.sh +0 -64
- package/scripts/shell/publish-to-npm.sh +0 -64
- package/scripts/shell/publish.sh +0 -64
- package/scripts/shell/setup.sh +0 -64
- package/scripts/shell/start.sh +0 -64
- package/scripts/shell/sync-to-npm-package-final.sh +0 -64
- package/scripts/shell/sync-to-npm-package.sh +0 -64
- package/scripts/shell/test-local-package.sh +0 -64
- package/scripts/shell/verify-shell-protection.sh +0 -64
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '1d55235e5f22e04cd0ca2c7199902cc4',
|
|
33
|
-
content: '1db2d574ab3d55285692365e14a7963b063115af2d9188ab5b7f60aebce7d6f61cb7f448fb2a432b4cacd74831c03b81d2dbdc35d23f6b45c6882ac834e47dfc7f3e7803f4f4e79f150e54d6dcf4e409d74da48df54e45891b561c9979a79c9d6c867d29d86edb3c4b0fdf6f8711a4de71c325364386f4e59e4ef4bf3aecd75116e08c80adb6561078f0ff9258e5bae810124428fb70305bb8d2135c2c9fa87fd85ffe0a5def344590e5cc8fd58ba02a4e547d66467d12f34338703a07632e3d10ccd5dc237a7e2bdb81f356fc1bc0ebdbd4f31009f3c6d62d4f72067f83871bad53eed5bd4f2f0b3c594bb226d8b5ad5c0eec885ea00d23e912f990fd12646c1e1cfe1d2d1f2d2b891d7b62a216c255f144ebffc22855be069503c4665d326b9ea16927c9d5002eda4c8c1e8dacbdadc5892ea375460a7cd545fc90673ff6b31082bf33e80c65d152eb414e3aaf22da78bfd57d752fffd4af9ef9d6546150fd87b32a1a26466afedaa534d344e3bea1cd330cd94be49f318b59601b70bdd8f7ac64e6f7501d33591bb4f50a86b99368c2b2210cae24e009be1e979c2bd1c47fd46dacec6d7c8338fe29b714557bc82cc27fe5e35b6d91c3d0e9cfea1a080f26dc1b5e442eb8ed719024e98b9c406c194388218a9393350abbbe908fa2add02cbae4d1601f0846c6b261e3cd7352c150f08f090f40491b75d0784f52f5fb2400d07b92541cfdcc4a14d57205cbf053bb74a2e8374cedeaa9c6b6e9ab1b5a8b4ac761074dd03aa9b3eb4ab6f5d9f4b9a20f81f8f94babeeae6041f20ddfbe69cb7834d7eb38281321d685589df6b3a2a00891e70e2e0f538f34033994ced659859b349006c57b26a450739db890352cf374fbe57863c2625a05ec53f4e123b4969b417450a029ac68ad0691f270e39df2bdc32bd8f395b068536ea8b0db11103e53aac04a2324fe47dd4362582fe86c213b9ef20a3c8cd80e17e50142452914fbd978a2348ce43b1139a800a4058c23756c98164287feace4596203d6f3bac8f2db25c0208c9553b871d0e5d533b92446f087b66a5547e34556c08c8deccc9a7e0c4a535263421e67f853fc2a48d8015e9fc4531832268bdfc3cf5cff06a0883bf3c730e942ef5202c0a750f7f2aa038f008562e4545384a4efc70774aafe84f0885a6ec9cbac74bdcdb8f71f8585be8bf93b9baf057757d9e7d20705ac92e8dcd96f7a8cef00092f08cac120ec519c5a8ef90fd306a4688b3863f78137ebe8923321d1b4ce3acf32b393aec98636f653f39dcc8bc0fb1b9620c963bb03450e8268e2744f0823bbff4eef59fa00fcfc0cf2c192293e9bd3cf312f9b6ebfddf3defca0fc40d795d8ab5144d36d2a78ebdb4f523edc8044c488b0fb734f2f746e4ee46096cde44707deb43f9ba3f1f4dc1fb360e902f337743897026412c481000d3395570c72e8224b3e2607adec9db3acf828936aadead3e1b5112203a8953bdb0883b6c8b463dd624b3a9a1427b7b592c12fa844544d7c67b0b0b0189998dea0493af1788b63b6f4b60e5a5c0d91328f4d90d5777f9dd5517951a239a1435dfdf1bc04dac6cf6342f228ea5a69b8d29632caf28ff741b496a5e39226b6c2ddd5f375fec205b1189591bf24ab0780b74e3b64f5fdc6a1fa78e087ca0804a5329f8bda4916d254dfda2b68abf6c0d00d21dfba8ab0f1bc49ae6f4cc360be4b1e7bc44eae4219020efb6e7dcee1bc087d585684fe0fa26118723a4933ab85ed1491acc9ae8e44f573a29980127b46d6133bb2ce69e047c53fc2e18ae9405065e3b3d858d9b6ad97c3a468765d3daef02486c57e802bfdd2da21a3f36ce6ef7ef87206943b33e792c0f33443c04b56f0c89d983a3336ba4a35f85a82b4d49621f0b318042af46827c22c55bfa9600e69c3ded75b32b8a3b29bb37d22e1abc2f481b9ae0fb64b6b5b85c79c814bb53e6b0b0a7f6f46e209e68f257dd85d84d339e97afedf20b9df82cb855ec4901f7ac30f3e1dabcac9aa2403fbf615141c8cfd6b66d398efa9107b092c11bf4cbd24fcca944b3c0e21a4eaff2d7f2bbb2685228d5f794d2990c711d13be52e18a61a83dd1679fe21e5ea1e058e1714fbb1ffa66d0bf91732b3cd73b3eef932be0fe6d2e0b39031271e3bbc7a7721f0b54281a7d0ed'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '60f5e0bb12ab6f14cfd6f77184da9978',
|
|
33
|
-
content: '32618c200309e69e965f97924142471a8f66be1b62dc08117d597c1bd0ae42af7f8c8347ed649ade672071e881997b62d7402d820a3a954349e3267836e696d3a037355fdb612c73853ac88731cdf3577afb6d5b6da453449407ce4761e8e9bc6b7247902870144ca9a35c02418996fbe96950a0674b0427cf938cafaad3e273a94ab3c8bbdbe59dbecc362480f5f8de09ce474a23c55a9bc0da94b80c2f41f8ddf41f7affcf08c1314ee35b3b9bf2d90f43f411c483f2801b33bfd3e1ad054a627abe706a4e9e6ffc3a97d1232642a1766687b0136f9b0a7898db7c1495dc9913b961514f801eed4e7468f75217a6ec70a7163368ed76b574da3c3f6a0b653bc7726084c9e3c9362e3408c9faaf6c44b5d1586ba38bcc33caa63d804447052b1ef08f646abb51f10a07b3ee0adf84d96ea7accabd90df33128a008b13914d4dff92874be2b770101196d69339f4340cb3cbdbccb1fa840912b74df1ce61e60d67cf76867bcc981e5d44a61e7724b99604a5cf96279786c056eecf0b059e58a7b780dc5d351fb7847841684dfbec3d5c3b6ab2bb2f819f78c825ab352324adacb7c5f353ec59c084adfef8470beb4ef881823fabf506cbb83660a0b7ca2e618e6788ec9ab1605c047432ef6dc5f6536ffd00d896305e30e36b5bf2063e023167b0649b8841ec2294179857ff93180bb2c341a80f89eb60c9af43ae0128cfc49729ce36d506c93de4c98c983db0c489b8abff5cb4d7bbb1da937e109f7865e445e4ca63be17b7ea6ee8c957909d8be362db17f4c5273ece5de394ae875dc80c55331cb42643a198bae388073828f48046f00d80225d0d56832a6e11bd4e3f57ca9463d206239cb7fbffbbeee20be82b1a778df442d323a46203de14d6293b0f60831fd9d26f7391be6a8ac08ddef36d8e3fb25443a14f9f74c687ee1756e91cd08f0af9ed3d28a92a2fa28e42ecd89ea95a4cf369a88ac0aba52369a080b6142760479fa45d0488736c4961c46cff77c27df0a1f243e6ea848e0193e9a03d129e6dae65fd58e3b59bd042442ea364ea3561c82013dde6e97c2b45433d49db9764673f15e4c25ebecbd3b201189e0272a31c93f69cdc5261284b792a271b80584389ec98a7a8d3cb5201203ca942b0a8146c96b687f6b9285beeade2c8592b7bf71e535b379580328e41ab9209aadecbcbfdcd64c0041e0852bbfb4cd0510e7312ac8bb640587e3fef5a67a20ac7e6f45c278df2e79c02ac4c6b203ec416f284376d418849fc4d799a1a8bbfa1d717da91dc68beffda7a0b747f0c1f256554ea049e2f61fb60c5cb0f82aec032c17eca92f4394d0a0e194c04dae1531132884ab08ecfb5b4be791eff302db63e982f3116a04c2aec8927c813717379a0cd5f9f6475e4999a075454e263adb6208791f290a8ec16ca9c3826d53507ac4be8252e68329ef741bb8f3986177d97bd13505152d393f09b71fdd4f4566816b4daab8d7320e2ab269423589f1a4de044b4c0f1a176116b03eebd435d849f4849085bce6caba1196bc02efa2afa6c7d35176ca8342198f3149eac90f593eb919e957676daf445aff32e8f17eecb1cad96bf258425e4ce32098db1c3952f62a47ab32e9b0596749dadd93201c9dd32b4d48b90e7fbbc612544e2756c7ec2a108a40db741ba35178cae9e4e9fdace376956b5209b51a42e6fe172deba879c37eab3b3ba5bdc7acc7ea048968b0197edf54238387d7ab1cff25867b96178e73ebcb7fcf218a3f21bea9e555f77b6e786420014727fea8492f96436393bfc3c5a3e06c03e40a51e2b2ed405ece4141799e062e4148b8890158de4625d5746a9bc9db42a8d7e65b6fd5aae53d2b5b560fe3fdf0d528af5d7f9d44e1cbd884260c0577f9f385cd70593e962b73050286a2d2d0b5e6362f4b5141377e75da15d17ff74064f4453c187f584cea7b4eb1458504125603d56f4a9d1ee25456914dafe0fb7416262c673e360f88a0afe315a6e450b9c3b2266c0bb89936ef7c260724a5109994f423aeec684156d35143a60197a4d73c002446033a70cc1213f74caa01507db994079c7cd21ac73a740d86f22c3b33a31e685dbb80251c4b11f4c2daaf484b69e27c1d46e22317a68586b383c0129fc38ce4ddd3cc3ddb37181bb5f97f1fbe6dcfd5db34b8f04ece9955dde4a794ba991df08f33e72b00f690f97189545b1be05903dd4429202f5c3973a749f37c0a1e2d4b313fb8ff880da90fce4729fa1117bff77c2edf60139d1e7cd29cedac83a23adf0beb31ac805cf2b327bfaf69be05163857baeed04e8b9828e46719f32145dbc6fbe1f0a2c97d75fe1369dd4d97ec25e5077ad23bcc507f37b1427b1807481ee6da81da308149781b0471d7d0ef877dcc7afc3411b0efede47f9ff8733f6b1935b9a99143cab3a571bcc3c4c73a26457d26066889e40c28ee7ac19398750c56d38bd3a3adef0f029cffb7cd8f7d58cd9bc461b9a1d1cc5c4a0cff2cd2dba5eef20a8c72dbe4f79054bebe13ba50f9f0f64840f9d23dc41dd59933081ed13a712d8b09b755db08747311bfa390aa646beb0a9f4238d8aa858557edf62a3da4f1bca4630d9a76db308ba007c93089c0540137c1185caf1fa1b636a5b3fdb90d6f2e6c84966cb15c153a899318dcc39d6969d18f0416b42fe1b258e665a04c833c7fbda922593a3c89b49abd1f0b2528c2b5ab6640a45e94baca239e6fd00cd4cce7af1b4966d194e6756eb2f4227d90b26542164f1005830d2ce6a24d32c2a66b4b2fd5deba89989753251fe040014ec355fa4dd05cf2615d4ee9f26f6be147143cab380509402680f62fc13256c53127711c7e9d31978320c9921d709e0c3698dbfb29188f8749bb3006c57d6596892846ee4cb4f6bb59ae29e185f69c6024711a53e503ce167a6692c8bf005e9f0dd84093320cf2201a317c53c2003c9c18dacb3c3958a91a932bc48524d37c2b9549e1ea96fef9a9e8dfe39a8a7cb3c99a668d12d24aa81017c4414b1a713f6088b09603e63840ea31246f10b8ea24fdda28b2661ceba5aa971a57782df8c1f6ad0ee813fdaf25b86e0b5f756ec21646d26a25f223bd6a93ae6bd71f1473d85f6298b5cc7d91bcc6e9040f1edd5dc74c65589eb598a3937eb5cc9cd774abf3e42268eaceb66779ae40e0096f72ef85aeda4b317b5a9610b4bdef5cdd9a3ad4b2c23bf4d108611c332a84eff7ab92d8bbc058b2c178ea22a167e0bfee9ec3229355bdc3e0cf604acff34fba766157bd8d24ca08d33578b12d940c1d588ba8d4e0a47d38ae6c55930e3e68bb34bec06d6962ada743c7220bbccc76c3841a9883cc0fd5aa9e92eb732d24d39aae4b7213c76719ac9ef890c5f4dad85c37cca394e03cbf0e5efb2bc2b7f9c1ca70efe89b54df858dd43d566580189e96b1d9a13fba2c841ac7b005d9d5e25d11740720da5cd8df8f1a53f8fd0c945cdde45f5842c126bc1d0314078e9fdbeb7f7777d585cf4378bb05068c29eac22bd6c753b62f473693487878c34754c385c58ebad3db5e6c35cc4f18be3c532e9b3e9aec676a14659cf15038c86454eaac7628f7a8c60e80f771b08664901edcdd0b3921bf72677013ece925ce39a8f5b406ba6d33819cc787fff3393e2b258a188a4488d52de6aaadb2254626b503a27377bca604494c172cce8a34ac3a24ed1135bf115558648dde76dae3d620efd52b82cb8cf95b57bf20a191336d999bda39e64fa43d5bb360916f5168154aef9020bd9e9892ee0d55cd3b0a7e70226d3c2c30987aab1468e664c8ac52c29a5c7e08d6194c8f7eac2838da9efdbd69c69075bb0d1edfe3054f06390c6bbd41da2be3fc30931d573bcfa1a599b6430be8d26419386d05f45d6a66611352c0175cb3be803474bd0ebc82a4ed2b3a2156b1340298440159bab10be0da604d5761282a8d5c4691afc36b6b9f2e9ace6e28e84592713205f573f89aba0cbea7f422cb573e34f890b4c18b6d3b33285c2ae1cf05fe385b608f1108439dd66ed1e758424ab52edf2e393b31fee9e732faa94e5c4e63912ffedb8c9a2802cbb5e0411cb801245cbca8a2c5479958c893ac91ac60b4188588386251ac422a39cc8457e5236720c2b96a81796930d8edc12b437682b4dd08088289257b5dec302284da33f7791b2b3623bd1c884b04f9750b05829883bb73338b6bbba8d650e0bf8b46ace033f775480dcdd12e71872a96d5c2cc2f805088deec8dd639e98ba105f43007fa914fe58c9904e0d30b750483c6fc93f051a6b10498845166085b5d12c910457f8c9c9a537ede33fe3d5f7e050d4ceb8bac6a92637e7f5028f54774bd5a80090857407f99b59736588fb337fe6d898df98268c986d1e6083b0af8d7e348ff45d5d4968d322b650f3ecbf183d3d99e270abf263f28ee75e4e9d44b72e794cde37297a796e8682f7383ab2daa80ac83f16c3eb10140c8a45d42e80a2b41643696b5a2a3673d34eda8939367a7460fa6abe563d29fa425c3319529015cf1009a376e9dd8808ab6d90819c106f8abf77567889e41c86534a26a5001739c4340da856a82b00a94a621615f2ad67e203355904d1242625baca1bcdfe77f3d1a5c2848fd5f153dfedf8b26e6f28327a3df37fcdca6d09afad98d719a36484be457e24a96380c856e29af6ff5fd34e832240397d04ce874671f6d696bc841495070cb62a1a03ae998d46a63854d4e403b33f8723a6823970758676d1cb5a5de27196a4d7babb7c2dff976ee1b172fc3962402c68a175203c1735f14eea5b686daf47128132fa79bdec8a0a4f44c2371739b0668d0ee334474e0466796208e7724657d04a54d4044e1263e99729cd920c863b038e8e013cf6827b919e90fc802bdeda89319c679938053c46a4731c9bede9384327167a0b26e5501283fc1ab9631fb7e577db017d4ceba0260a63c7e61e48ed1e542e2cf7f85d446fb75a4ff228cd15c87badc057d2b55531b8217d6f412def71a850f9d2c1fca407b045a4bc94574ba0a9d60eb10b2efaecb0a6f882ded099c2a73dd735b00a7f23b3c527eec371c5939d09ead62f04835de196c2d6e202db66aa81a9e72b750b4c03b1e4b66022672d028829315028781a9ee296feffe3ca9df9b9f7a7fc08838bf278689303ec7779c0d006ee492ae9aa5673db75919e46e4c05438ab5c3dc146ff93c3d4788a65e7d48755dd6e3ead0ccc03ad6212c82924cf853878a2a2c7804dee2921cf3a448992dddb0664f7383f77c2ef50c6c23ee325dda14b76e6b79b06922b7dd1e883661fb21fde925b439f924bb27a594c60a490ac160114d5173fdf395802f1e164f7cd54eea5a1a1c85e19b399aac1761ba34336ee9f0c90a26634792ba554a9b01860901f7d09d45b50044ddc0ebdc1491a2bc71005f4232dd3e6a7ee6bd45d8b17ce69a3e6f36474a31382c37128e798042b4b1cf0dd73dfcafaa82818a946cdb8a301d10bc409dd9d6cad70af966ad67359ff7c53f1c6ad5444f2af9e426c281780ba5a44354bf67f265c759507cd72629360afc7a6ddc6b169601d4e00a70c55b757cba26b041de77ec3014391e077cad3cd8d821ce1171db86fd94e8fe2f3f9408160c89ef5b70fc1abb8a40126f9da0d6c20dc6067ab3756c5153fea6a3a171ded102f1fff3147f945d2ea086443ee1430474321f71fd8e2ee68a120540eb4d3c0092b5da0f12bccacd7be6dc74da5baedc3e9da144f36303f2e54d0b1d928e016024ce784775b6e598d37fcbaaf631d1374c7f04750cfb71b03556abeaa8fd321e7ea19eff80e8005bdeb0878df18d9c557708ce1f4bd2486e1ec1fcbb19123fa39ae6dcc75e09509b9add167a797f8ff3a889381f2a01ef9af50f612413cf5d00f21877fd13272c231c5072961a5457aaacf9d2040e354faa39be73f0fb7a70e35b7ad2620d6ab2145352257745764cd913664c164c5341ae4fe9cb4cb49557d519d3ed8cb7327a8c9dd65d2d97a6ef83b1a843d7d1b110586b580906fd7ab3bddf5e5880d952e3c41953fadba777e182a36e95f4eb17d9f6f5fed03149a532ea212537d24518c57751606a5b6d6f61af409572757a8c4889b06954bf282e67d7c9132130a4c26313a539c14512e96f68f3cbe339027152858a036b196cfed9952b3c1c4ee8da7aff7fec54e862f46388f5949aa10dede6e55648cb96b6293e12ff29f4b498d285685ed9f1e70a772dc5b106bc29923006c878025b9ca388caf7ac72d451a268dfde6fadd2645aa83d229a1e6e51e9452e4a968777456eeb04600f48d4e5638d065bb7e85aa737f567c62032cfd2197179c1cc151b892a7347c20c1fc18740e8f0c8e78299e2a2a4cdf3a9d7a250880e24d29302c9695a05590d5627e9eccb1bc6d78e5a2935ef47d1fbbef179c16199258ab78e92538dcf439e879ad0067da6d83e6808d5b4372c4d3a3819548b444d6f794026b3e083f8460e35f1a622e7a17017c18adb398378919c5331d66b792057771312150d4045273cb9a673ecb51a80791203bc6c91235ef1f1346cd172cc2f1691d086935d789562ae6d2ec5ace3c51503f2a84886bac62b126ba4353d315cf1f9287191a2eff11a8dd31ef6ce042af48a7ccf6f44ab708de557dc69311ecd3099a4575244b5f004b31e9130ba6b953f9fa00bdbf0bb219b56f9e7078b5ae9bfbea3de422a13e8a422a81cfcc5de8c36534117389d15f24895dc78d9c15a7d9d2284c145089cfe572a8486b46c048c779fe336a8b47a7b6e8124cf63bd8ff9d838c47c7418b5a3bcdccc6c6aca4ea9591069ea17591489c7c6335eb57eb177e642ed5feedb296a468a73a55d208cce6a98012a5b7e7821344f8435210cdd1e455b0256eab1b801226151798eb5eaf8dd1219cca35ba1241c09d4b25c514e1014081068e0ae4fe41ac2fb4b2620d3e3ed36c09e44f18577ea7fb5c36a44b50b0d4040d38fe7e792798c653456dde43cdeed43d327570ef8d0e891cbb026e0b7ec503569a0cd48cf24e82ed8051b286c0f95136fc1fa37c2631144b025dc6882e109ec7d8dc050d8da6204ea6c8b55b30a665aba2131d31945cc943524d34fd5881613a25c3f6a0aa2a1f000d2c5ba525cb0dbb75b3d2e85b869fe045ea9652654f22edd84d217f036ae5f5c2846a8acde6b87abe8598e719fab79cfb24fafb335c665c077e165e5defa398e58f1b361360277b0c7c4816ba338e499074f969e49ed3f1ecd4720120363f1f0aebc5050500c3d2316c9e7a8fe335f97d5a5c4cde655070213bff6c5c5257220e0af9a546f27a6bae5fde2fe9ff832346fa8cf2e04006f9e114a61c06f05f7e3e2a42b1deef866144c73a9cb8746acbafc3a138d5e07081088c5983f6e1c03d2de08001d270da24e8ee2a63443a43b7511d30f17de42f86559c8ac4dd2a96ddbace968d0c9883576e1fc23eb0e4f05cf9dfb7e78d1d0177dcf4a8a8fa74c2f9796fbb0f83b0a86f6ad66b8e39a09f3d24ae828deedc5a0a6af2e469a561becafbb8fbf68d7c2fcf003f69265ff4d1e61940b06b4ec3f13156cc94b77f63c374083921f1998de7ecf7c143cb9d61edd9de556a3f919181396f04863b0f71768a70d51fa90b0ec849efba18c44e69e654a14bada9dba237653a9ff8fc880662dd7446fa74d288f8e0552f36c466a95d22e7c6695cf6662b5ee62ecc7431477363b8d3aa8b24f519ecfc53cd65475dc19ef6e5278c43eca7918fb7cf9054aa496f0d2e41191f2ffb71ebd789441bd8e98526c21abca9aa7d8d981814e20d33e91de726f8ac0eead7ab7c3825b7a65d770e264ababd0e34146988f579d59d826e44ca0f7d8e5be7277c43810ddbfe1066d442231b8c05451632034fb2f8a3480a3ab478f6523877e2a605406b47e3d93b40709c455f20cd4ec7e81b7666e3d082534d3acd19151ddda9c78785927bed94c3d9d023c0d90cc283c17bfa68f9aad712b8057f05de5ba5aef59608b5be5538ec17a68c76b93a82425c17b0c884b452d855285272cf7841d403d668051721d194c4387a1c148272b8843457ae3670466dd3b8fd6dbc1f29d9ff9dc8cdcaf8c448bca2f1900883a22ac7a421762d181edf242f7467fa1688e366386aa987a819af5652e38daa78b95475766d4fc7592febfee489ac7456b866fdf4512d198cb48392948dbb4f814090667107d25335e5538d685af7f8b2762a318b8d6cca3340b4e7ef0e416f21d303a8fdbabea91bb0eaf9585b48ca26ab7f1e404ddc26e712aeb26b4872d438e8daf0c5e1b2b4db3b525698938dc4957a8eb0b745711dc1497b57d51a20ee2ab8e83b21a7b55c83008e77c32eef31a8860dcdfea34b965ed81d343a4292d595378a1f324d42c45661bbb4f517e6ebd69a3f1547cf8884ef09c3e7c85a551d2206ed4066959e639c2fae3ea665d2be6e500da0a82ae9bb2aede506d8aa3246e875bf3760dd2afc9bff6cb6fef1c011783c4b9f8b0c5e35f710357d1b209b2a27d9405ed5fb5a9c798482cc74eb1f3181055c624a29665df6f1cd193cda2aca3ebcf72bc766f5416069f91570001354788a228fa645903c10dfe0f06be42a00bd8966c57733d1c4a6336f61bfa43443af8b63d23c056fc6ffc29629c64a5c82fa8f8ab6bbdcfc306d87428146a2b4e7eb22571318a47a8ca6abdb0f5336297b504459597c27e87bfd84fd42e7398bcd926101797be7cce82c4c5fce109233642530ba1866a9e0d940dd12685984b798f072eb6ba5a1680dde0fe4c6c65e26a130a2f6e70e9a052fbda2dc3ef703568cf1ea40b7e5a0c61966ed71168d8783b410e9360f734b30ab91cd5fd752fc0af2b608e241d4b89e9a367008198ccbdc0537e005d33cafb0f041296c3f8eae27c85b8491c773395f800bba3b3a1a507d7c32d97da64443ace9f8b9991a00761cacb70f566e0cf1c130cfa8b8960b4be1c0b8baa109bfd94b6d3d5bfef506a49332dc84d3cc587230edb64ac9c33010158caa3b2c74df1a497203a6834e84bc21b66b0ed1bdbe228f69c36d3de635c04d780102d12150e4b4421c21076306b1176cd9acd274538801dcb8345255ea0ff6f074d8a32f129e290582e9bad935b6c34540451f727f04b27e24253199b77b7e1ef6970a379721bfed4b360f1bddac37f58e5457ae26116c68407cb15a28de66230f56ca7140ecba2d4e8bed91aaa837fce96cc58ebb5bd100a31ce4dbb7c1516072e5e5a6868229b33981d77ab729bc0a4d7dc2e21e0cdd0e751ec91789376edb1b3d82046fc9e78e82f01ead301033a1110df966ec6e4005f9b9d5c30fb120605ce4ec8fa1fb5104ba4d9f34190bfa3f67791054f5a50c9c212c3f46611423e9f02ffe2ddd392c4442306632174091ff88d1687bd7e571f8324e80c4a6748c9bdf3a0a454bb65118d0871a1f28b3ee7cb5e1cc2dfa6afbade17aca8bc24b7dd28472b56b88c269c60a2d1330acd2de64047026d55b17c3fdcb06b475601c7905e9f88bae01d87c0d0edefbf52f7fbb6feb457a961733575c1a5752f0eae55955aee03f3380692ee31e32dc5ccbfb14fc456086b68fc12ac0ad9f8ff995f2ab00c59d44e6c2b1468c031c099642ab8efe1300eb533b2cd7c025b3b4b7f8d411e1bad31c5e3761f71601d42cf6f414b62a36264eea86495b1411dc72c2308b14e79cb1e2dd7cc9287bc5f1f3930afbc11931c8c487bfbb2ceb286985daae40accbdbc809697851d2fb756afdf425ee18bf5ce68ada8c91cfcdaccd242e5f35dd39df948486e8947417423e22519fd59f659335f2185ba5010f22a435a80dc20ab5c69ef7c5dafc0276d584d84971970a64161b5a7abfaad65624f39d845700c4184238ec89db278d4eab027ae520bf0e18018cd291a91af8c9472be6db00401c5f33f5e02ff220c33e14cd6d3d4d6b8992fde6e9b628b39fd49fd3900c8718b9f413d6d48d6512b6db3b08eb1ffb44ba11a8aa469bd0d3e24d5c4b5caf937c4648cd9b83c4c73b0be14bec32aff23afcf32f25f0201761cd633ffbc21618c76bc8fccfb7680e00ec68c1e037f4e22b9326aa2b53298eac8f535ea08bc28fbd8d0b2fa26f29cc7295f2321a55157a660769e335f297c8c500a7288b99fdd701f7f0dfc6236633b0f4962dc23b879d333766edb8c044f8fb7f03bca9968dced6fb5f3164deeef24263383e7e76ee73a21f560ee89a0266c1c63263c860384c0ebcddab3a8f2d02d798f3af8bacdb429afdde450119b061561e63bbd655bcfa5b281529d68cb5b798514e000af91c31ded0700f01b277eb39b7e6318d703b33da954e1a1b8fb2eb45b74b32fc89220fa21dc0417e19a9acef5dab92959b8717e1d598b5a820e14b9dd6167214f815235aa438703a8cdd1d336e9178a641c82d31c19963d0f7115bf9618e73eb599e78f1fc696cc4139c20d223cf671cc25e48692f0425b96f4ac2e8c72aed1810d5c449b2c2d5103e6595fb840344500df7c993cef1895d957757990852dd51ed1f7d86ce631721f3805d4c53dc2218251238a09c23a6602f903a79d6e9eed2aefeb7224d6ca784c29895242b146efe1fbdcfc20eee983d50d57ba3313162d2d42b6861f0541097613ad7b3e84af654249129948504d0a40835bd1f8be3340707d5cff8c19a2164a082c9cbac62ba9dad7d289888ec2a51eb0f98ff9216de60278778e4374e9b39cad49e4696d650f4d3704a95ceb1853cc70a5456769d9760b8704c9a62989757a3f6c748e19a76036d2093b8912639db6a2043a4f6c0395b275984da5b4e080585688892eeca404b366e90f6a6b291520f7d808e620b44577bf335a4c470ceb301470c37342d0909d8e870df01f289ab30e9fee25043b1f060991ac015b5db0581515150d6bc4b81139e72e4b09cca8f68ad3e12726b459aeda3f9c498649d600ca1337eacc42767198b65b605752623696db738898e29c4e0fd754fef3031dbff92de3b7fd53dc7d242d3896649065efb69a8d9ca26d4b75cd0c8e93577e43d274acd156c982a482306cea56976af2eed6ce6f39d34f036b1d5c662a30f570d1d506b3cfcf1f4196292849d21da065c00db268e9f8cff96a2c09dbb176e4661b945f3f3f877a8daae1ed7266c2e3b1c7e0391a71b63e1081f97aed62b20076ca8424a1664c49c7348bcbd737fa62120ed24f3c8921dec3b567ede76d9291d6eb49df87b6a17132dbeec4c3ace7670a9738974ef2b755c26c0859a832b949b5d38613a97fb212704c5052f6ee5e313e307fdc437b1162c3d69056a103673d654b71fa7b46202191d35f93ff9557c0c0ee8940bad4abf864739592c3414090201b4e41c1c87dd12039094d487cff3c326f2c3e5b3c4824b3472427d1da9a9a63ae2afdfa086c7d043b8d90c88f86d18a5fecf3664213d0a852e18f7aba42d3183b00165585941c9ddd4c006092929872d7891d5e9a44bd5078f394b7a55d22e85b32fb1ee0a9e8b012edfaa9ee4c95934262ab6d7b29934d198cc44217c75363d8308c52c676be82d5072c6351c48456c8f15e3d1f28f6784fc01c39672f7221995011de8366dfdc0efccfbf6273c9936501f4f69c0489df1cda4eb81d405928705abce66dfdab5a70e34e78b5c2d2574cec22db34e1bba9119690820cf8e45840a484df7e5cc1920b94658c6cbccb167af24829b206abbc230564fe25e87dd41b920caf9388e48601d05722d0187816eca1f4fd27e852b57c711c8c8a6bef413bf6a5eb500d687523f31260ae0e5552f013771e56c98c6141bb4850b2179cea83e3fd68f6ebfc1548bc5439d72fef2fe9e1f58d0ad0a740fee68b31724b9ad5c6d09a7b769023fcd5f1c78f31e9e5eacdef502bc37b3512c3c37943cf9ee32c91af2ef79e1fdb77778006717c89778ba7a86ba92c8aebb7d98531e4bd1e6c88502167950ba1167adf832324add23e149c55730e64bc854e0b7e7a86cf2de48516710bf59b06aae1336d08571397972ec19b67ca7e11014fe18d668e6040a888cbaf2da603415e01849bb73e9c96cb728e480582f236f8b051e18779a0c69399bd78058ab0cf301776e1a96ea09d1ee07ed6972d46d23a88197547af539a2fadaf76299238c9cfba384787650e9555c6c4cbe98e16a1616965612fb0cdbf9df18b3af20ce9f31bbebdb7fb7a95c751503630620130092543fed053755dae3b4f0748d1e3d2327912919f81e458181661fd28dc1ddc0b7f02c6a7c143cc6e99008c2153555113838d598d908f5cd23a252a65ea06ada85170e30f1fb0abdc71f5bda182c2628c878ff70606693fc9dac0fc3a1a02563753d2543c931ddd08e4b34acb4297a98c94a0f84dcdcbad244a3a0245cd8854b99af15e14fb846d09d0419485ecce778d8a43bb45a7fec5e3ed70c71b4569156ca28bcf30cb3477342e4220a1921c1bda18e3f26afc1aa8feeb3a2ab64de72aa36d08dce994bafa96012c31fec6508c17712d0349caa727b9b62485b050cfe2bdaf4c0bd00cd23eb0fc4eecf7429078af62862e319dd59ffc142cf605c78bd79fe890ef917935d5d8e7e8f8991fdd5f1f771a494835869419a07635ba73084026da0a2f5b5532b2d18c0576e916a96f891ee5bc52ab250166aa2ebc58db9686cbebeed4d3f96bc7ce7277500404141b4a6f382b459d1e5402ab0993fa46eb8db7fb6a51e4090b6503e6c0ff4cca128271f18cc8fb9b7ac69fd905a70473c645c7b2275ba767a315a9484d73973114e0695a05c2ca83ca30231b6ccc870f201f4fa3b3687541903b8075668e0ca3430eb13f469e9d56d0e9353d382d3343214062fa6bfe68dd79bd5a3ac8a068aa5247017efb4e1442917e564020167845e38b538376f04e54ad0cfb8cd16dacf551983aa8e5cadbb562206a07ea00581dd63b16791956a5a3f4013b3a69dcd7e4c1975b570d0b9b46e0784effdef97888bb1914596afa312c2337b59f2f8b66eff6a9d09d171560caf7a067d05b8a72df6cf4e338b94dbd201d6f703f8b8274b6623e5d328b540d09b955c866e54da25140d69f507e5bfd400f77024c8669c2d6a68e0bd2a9bf911478f30138fc7c9ff43e9a712184e16eefeeeee30a64aa7ce78e81b692f71a4570d6218fc8277b8da884a40fd7ffb9ee1c5db4ed05cfd03afcf14b1566584271d08e12dcee5be5a082aa8b667587d239cddcbb0acc2a2ad29a62162192a1d1567bade7024285bd26222fabe8044e23ead93c1fbc1c38619b9c009a737ab1de13d41b50dce25f1701da0df5adde30f711df7cb3357d1434c207d1fb97a4bcaa627bfc3cc2d1106987e3e91e5a85d8effee6eb6d4e281d6425954362d338e2e4ecf1e088948f26f8c38aa212ca750f1d3c05f10336fa97716b320b55c182c93dd30e94af714aa7fdf18392bfb55fe48b253500e2c130b0eb33142c0f8bdaa2ba2b5dc276625cace5f981af926ac41f09234d933ff0c24cbf28b71552a022644f4ea38ef42245c62857d62e6b1ed93abb90c2d4ba0245f7cac0e5821c2eb335f9718767a272bb991a60d0a45a363778c927603583e4eeaf720d0fec623addd0a0cc42cb5ba7a5f4bd04cb4daea5a02fbf3ee9817f9aeb2e0c69fe2bc20762ca519c7bc77fe6845f24451e860d0b61b8b269134a0b946509e04feb7c76bf155e9f3b396b65d39a5a0f4f293847e8ff851cfc0e9d5e63d182f1d20e92b991e53d436bac89ebf1d4f5cc358ac77f58c9abfde8c28374a5be34166c3cea28cdd46be68ab03a99b17ca02e6e057b1c1227cacae1255b446d95e7cfbd6d5efa511948a2917ecfd5e0c11d901db933b7fdc1447ee9f1b3fe4a546e863e8e77eb5408166f5d5e061361efae51b0d4bcd7c42e4eb64158ef9d2f57db1827b53c6a4fd118e72b1905c1e73401d08cddc618a222ae748b2a4f56264d2faf1272723348319f6d0b1686d33761adcb795f9912d851d41c62d76c6dc9afcf9a31abbcb01a7751ef9a375d4d6970e79cd51ba72b1e0a381b517c665f5f0050bc41b45f10f662d4dd6d99aad05dd8c3d7a0b80bb39fe48e89f11cc3844258a22e2bb11bbd844a2f725d7ab66b22f04015d73efcd3d81b9f5bf95b1e1898e492a0496fc0b1e0051084eb1bd50baba44b950b186e59d6f6b93f646552d5a8c59e28c6e95340ed1519fa9ce41ad55ac97c9427e7e30781d9eafb0298fb8eaf18da5a1e37a8d32382e260a1471abd898d67d04796be9f7fb86dda7977918636822c880fdb3c5d1030041c3f185a5d0f2fafe0329f1a899c0aa1c539516c36f1f97e262f87a060ea8018201f37136fcd9341e85d10bd26a783210f890985c09d3be777807564d8fee6651bf5349f9e6961b6171376cd9b4dc726288c01d0ea756729dfd290493038094b0db364e975a2e31631533b0b103a59177f10aace6f9de0f637c9904c8a3cb0efd67234085ddd8df5d187de60533decbf49fcca4894422874ed3868948f54deb860d1a6d0e0014af8b34126d8723483f8b5f409e4ebf9f18078ce2c9099a674d44faf100addf0002ef830094a51641c22d2d1ad5bdf1fa2e940af65e91dd20c67c04c913fdbf428b9d6768de6b4560d77895c7cdc9e51165aa81a842f34fa98073cd44e0e68ff4a8a006f7f623945cbe12d32fe6160e9c622a4ae141043aac27263486322af672777482872e14ab60488775c2ccd99dd856cf8dd0aca928910e35d613c7b9ae64b11f26d178a8dcbb87cca74610f1629e3c145f9b9401fa0c677c3c71b2708dd1f794cdef11b1d0ba0f59ca848dfc49cd277045dfa885cb33239d8a930e0112a5a73bebdf4a722153076a215eccf8e0a04ad5146ac16b20f88057c404ac1ce9b02d26feda9cd1430e5a7d63f007bbc8fe144f8b7b40051d6c3552b72ed92f302b4c046cdebf061efbdc529b361bf849d038d6049e34e42533ced4b835b029ba8915b9748b06685a22680ad336686585eef38eca384b5f6e0ac2a599daba22ea2168af7150239ff62ca613becf098705fd45952b53d0fe23ed542b2ac256a6805e008fa87785be7c9d4bb29176822e8c7cf69da82454b511fc64b38052b26bba42c63148dbdc1dd31ca99911b351d56206c7797e6bc2d5f8d933fe52d4e81266a153c9fc7ee131f31f3a0ce5958024e4cc264e155ffc8df1f36ce3c7ed3660611def233ff1f7f6c7ea5dd774941411a0ec80ed4ccc9804814020debef9d00a6c76a32a653bd73b28d71bb44f4f66f035d8f52a69e521447ed831f371d82f8a819dd77c64c6e9d1f5a4dca69102df97609147f912388a5971eb3666c226daebfc372e3c16e2bc24961e2544b67a5c7e6007b04ce88e06f61ed4bf908d2815f2bf46a2c23c26487e7cbce71bf8fb269d18a9d4e5e84309562189b86ea55e9f6a208b1fd83cdd4c83de1647514879dfda580ee7fe5b528783d67578bdda4a06510201da765d6ce671388397efb78d7bd0955766a708dea6561db699f191130f3d190d168886b8d8c7b781efedf486ff6ad228b4871d070219cdc936653cb03d0a8d1d996c8832953ed419775cde386b8ee6536635932f8540274ec086aab0767bef49ceba8c3248fd4f643fc2cdcebf631d8aac3ee9c16923791355c081f81c7472a35196267377ae1fdbcd12cb084dd63e4d03302f0ffb48c721da32cf121a68aa1da49773031f10b2284bf626ae9d203094b98176f521db9d6537fca2986399c1c652eda5542f1f1ab90189279362ae1f74fe45262b4698ba86dfb95864051a0eaaf9114c7f188ae3872b2cbf6144d9390186c9629ac1733996478aa54d2ffeab892a8f5a823aa1da5d3c50c491adf9ec5eaf3cac935b71ee84b6e9ac125b3b8a284927891a7c3917f58e16b4fdc6dd0f59dacff357c9a2e46c8f87f6f3913c7494f2c58ade290a8f05c3e81ac76483a6d5362ea02033ecfcd603bb7f6a49e10c85d6844674b09ea822524d964c93641855a15b4082e0d5dc955b04b9f526f577f6f639426122ad028851a28b10bf84d7b31ab0ffddcdeda735a813a7731d3afeabf5df9831b523f829efafbf6db75b5a5b8f1e6a0516f1ec1613472cb6023283c8399723deea731678196a3b8045fbd12fc6d260ed698a31cd98993c43dd20328fa691761694f5f6fec9a661afb3182bc80755907cc3271d731d0cf3f356946d085bb3ba8c087548ee7f9bd0dc671faf839d1e100917b3a34024e8a68c87646de343bf51a3de3ee928fb08b53e8c72e59bbe23aec21a7b3f4a8c8df0313b0c5032d3cf83db737630fae9649f7ae97e8dc1a8d1bfe287ebcf79a2912d2f0d618dbec6494ba7042ead74b259ef575acbd279cadef71b38ef19937b835c462e7e8b269168257ab4a9fe566e16ce416ddb7053474969c5afcf7968ae88ead4834a060fa93d986a2f0da72aa24507df177e91e3c189c0d7d7ead04c02d43059b9cdd8a63c79c2b7d55c194ac8b123e0be23612a563566583fe730165f6c6ee95f8d751f0172fa268f142266e3fdca5bf4918b4de5663f37adf816b9a4621c46cd978b73adf4305cc51cf1709d2813fd7fed09c7690a6c6f344dab62f3020a90e38e75f52d5f89b93ef129a60682c010c63430c861390b89ae005a5dcb674444aebff52726b9a937959848eadfd4de94424be39cc96f4dd21af139c965a1679147fc45b30a3ba636d9bd661c902b902f41e2b57551770cc2d673976f72388d648ac41c2d6304204e1e930b632af65d7d4b9efb45cc65be648ef28f2cc0d951b6ac05476b6ad74e60936b8810ea40149e29670c6d132211558c10012ae1aa00e7968c438fd4a84c7e22a5029baac197c7c08cb6eb39973391222de3f1ada075f93eb9a9034309b10cba9fb77823f57b3240b8c627fe427f8a230686de0a4f56de2c1826e4465bd65dbeece151518d4347832b9225c8f82c26c0c5ad8e8d00a94a0e2d3fdfa96328ec962bf29024f8ea063709de7be64eb084c76d82975cb6ed98fcd76ce2d7b735e1c178e12cafcab4f81b35f6bbc2ba10c8ba278f6a35fc9c41e552ead350b08fbb603907717886cf4a2177b81779b2a98222b596befc2e75710bf58053946af14ffdda754ae5994a31f3c3130e0e86518b7d9a109620bba6d1a934d0c6f66c12022ec9cf6a725d46e9162d7ceb9c275281e1a508e174f876a0875153b922f3ce13f492bf63859a80955c0ead816bcb9debe2dc2fae35321d17be955319cd36006bc554d4317e4b32de0b88fa5e33ab7bc68ab6a60940c6290d3879814042b94d5374e039f6b3412adf538b89cc7b5d2b990bd69e7af5ccd61b230b5aae9863fe9196041598de1e1aea943f255232e03f3e1e4ae23c2e052fe0c837d44a4795ad57ec415092301766e8aba9933fb5faaded4aeb9f9ab2c696779ccd0276e832b78379d66eb5581159ba46b45e8fb7f8560d92f1df9cc91e6b51fbb6e9f7b350550041afa1dff34b86cc4d953ccc72444924c87ec938758ab183aaa4402698706dae9465bf4e2f14dc7fc5fd762cb585a155b980b9b280849a7c4d4f9897be6c8f51827f82cbaf14879df56337ef714e751568d3206d8ebd5beeefcba4fe98a765fc4aa98ab77a403ace3383bfbadf8e15b60667bcf1bdcc215019360a360d74ff48bd66cc84650d67c65d2f76d612a87c53ce94ac2ddce5d87e97c9cd04503b9e31baa41e3ad09811750a849f10c3134937efeb9facaeac8dda3c0d930e6dc0a11586199c48f28ddd14f4b255101ebeb8b36f5a68df7b6fccec100475d9c5a2f4d8893c06f5aac3a56150d21d3871046029de9e4c77951f35c6b0fec12289bf7510523c76a60515f05c26d5dcf668c755ebbf90bf432b43775e743e6773da3adc97871a34834d4e357e7012dbe552bbe29e89e98195f263042fc7dd73b5c612a2d2bdcfb8a52c595ffe7ae613f7f44b50183a45fc6b35523e976954dd300130d17d622ee46267ad172e78816c2572e112247d1e48ea72f75821863f9f3944c016ea588fd2b8a8119854c4082080fd7eb6f8a8dbc32ac8bbb1a28f9f61dae700c9c23bf7b5d102b0347365c16c74ee7ac2732676ceb85722a7b4c581c66f373b76957fa1827c679fa1e1c2709600af4589638920770fff16d38104e102da2baffa2be73947891159f522cc5530e084742d024d93b87534528890b6e8f601181fa153bbbaa3c04e1f97598e1e6e48f47a20db30c74ea6a66a3be7d76103e8007b4b7cdc034bf4673fa1b827a45d7bcea5e9a8ce53475498f8c2e4a3dfbccb58d72ce9071ed414cd4c5ca4d17b69b8e717ad2f14e5c7ab2306b46cf7ca43c928d720e165c7dee5fbd7d98c77b7bf2bbdf1d9fab9b1977c458261962531613807bf6c9cb45b214d0c7f5c2e831c977a1a9fbdb9cef500a7da0a9c1622123bbe96d49092d91613276e14f2ecc935b348a5937c203e0015d3c631ace84d3a3d0f24d5793376a14315ef060efcd1e15c9cd26cad4d1c9c131b7e79fd5ba7c618ecefef55acfef25a1cec753e2fd4cb210a075013668d2702b87b2f8b91ed71828707475e23309c780ea4d4c1410de71a2065927b928efe9f4db28b861ae5c051235954d90686ddeba865982352d6358d6328b6ea718b6a2c0b56f7739246039c2d11cb0ef191e880640f3d38cc8aa3194efb90d027236869b7ecec338ade78a3aee548152990e5aab71ee982846a552f3a9cde324c58b84c7ef3c87f854658b11f9c42de0a73f0473533e492949885b1d9dd5591a396209ffb22b276beb556989f3694b258e2ad3237882e18f0029418c178aa709fcf9789933a89548e4f9530752ea8c574c1516fbf879b541c100f582ea3358b46cdc898cb79dd11d7c3695cd212e9de93b928ddd5efe491c6da95d80803531fd094a59bbe0fd66409f19a34717ddd37d3c92a4d8063bded66be33f78ba70364bb0de2a33bd6637edbc2934a16608da44482de2dd9e88a198af292b9dc28109b960fa69be718c34c8a5e8c5e6fb0dd62edbd7ccfc70463c645b1e2e936f6c47309941db51910433b812f940425b1f7ab57dffed6154bfd8edf78e070a50868058842106018acb7f44dc91eb61ae352b5fa7958fde877a1a09af80eb47e199ae0fa3550242bdf5c8ce6ef9973b566c7187a8712c9d346df4b89d6b795a7212e99b4982270981c9627b4b743857f37348dcb70875954cf85fe55015247b6449ea292d7162619025863d706b61281f12cdb1f006c1d118c4bbf2a17a9c37267ea5569eaad35d6cebe4ab38abe521978c97e7e6fda67bda661fd4f0e3a15c716973624778d730f135e1539e3e043951ea72bbd207c9502153e39c1082a784aa792395e70f768bd79ac269a7af3ca76d10c9f881032f28910c13bb2dd1c2047f615c8d306e465c35abded81094f6f0971b472c5f38e28d250c595289df96ab496d52307a6854304ba15352d76888fdb5b01411f5183b06448748fe14604173f56a591ec8f67b484b9838084d0371a7fd93c88b4a1b9a3204167819a64141a70e8f7b3e5005e07bba713d713ccc66e8d81fb831335840cac22319eb57f72b4f143ef37fc7172d8cf6d97a08842a804409b2957d22db5c23f88cf30e311b261bb6323ffd76946aa9f40fe2804e2ebb067f4a3b73f0392a3d2c98021b320c4048af3e3528c72f6b7028fc650d300373b8fdf1684b3022f7e41bab4ad7316a598d2c20e716895d20e06b8dd39aa95a2a1f19d59aa738c9029a43ae2e099597c4eb4053e979e1c30fedf213085cf58c73978682dceb756ad741007b9b9e138ba07936ceb74b3810919f5f9beb6fcc4bdbc581e58e40d6bf1e4b9a2143c546ea712137087692a1dc96d6312c9fa1614e2becc8c86203851b246c240ed04131ce5d932b24d85e8eddb7870af9c12c692916072bc100819fe1a6af530c82941ac6943da3fc3845dc6b3a85e995fffc0978e505b99fc5beb1d5b12cbe15b7991804c970a81137de9a94a22ce0e2a34c0440674ba16cc084769ba967a2a959fcdc733d6c2b222556a08513f967b267a68e2b43bdbb309c1977b057cb8d6a9a8c850a9a4b9b6665fd659eaf2272c4062e03be28b16fe123c46b32f54ca8efc06e2c2aa43b97b7434da99aeed6b304d581850f65ad18c618ae0fd27fe4952241cd38ac054f0b391c77832e84fa437c7a41e2f2158a245958bc6d8cc75715689fb9a5cd53d17c2ffc82b81e6366d496eea8ed18e775eb8456a5b934e752c0308da25b7168262ad7b9a321e49ced9ae370054db0ab6bc801dea5abe60c57ee5826f21b2df6cf7387b7a46048b56dd1ec98538d34bd8fb9c6a2760aa422e8f1fe24c3bb12307a7e60e5547ee2cf51006bfafda586ba80a3395e3d846217122779ce9ba346204938597dc34cf0d37c1d7271ec9958a910244f971d616b4eac03f67f1404f617c3766a151074de85fc1c502212b339d8cbe93f5083cc3e1204e80c864194003a95e575475321f429203ccb8d369f5dcfb3287fe4496810179c41681c816db940d80c353189ef7f0973bf255de126e343b04b87365e82c81097c17f924dab078f2029191682f4170e74fd010d7110ab8c2626eead4d4803d68ce5e96aa02e52ff40d9dd56da17361da2a485283d291eba96bdb7ae4110a5ed2b5064a79f44436d455108627da74e11dba94699e335868858711dae1d2714045e0e19583f946c1e21e6629191aa51436c7ec408ca0796be53750b5672f32bf3f84c54f6d6ddf37e42b0f28e1d09d08daab3e63c425e5040765b85adc304b043651e2886dff7687a06b59e7430e0a629b60702adf7fdde1b6127aab5f97320807a8b4667ef422cc3535b1da6ca3368b31a0afed884495ae91707d08b1e161e2e77b82572f13ee3df8487ff561875ec5956155dcd4c0acfe22abaead2496f7cbdf25e725a7b7d5261c0773c46fc2a16d311ca9edcb0ef893e04cb81479f502017e29d237829ce133dfc4f083387dba7c0d5d1734de4e2d7297f69a33af3a08427d20b791b1ba4728f5ea295f8d6f1663f4ac88db100eb7675d66669320349ff097e062128723b569c375c4868ebba0445bca3d398c67452ef6646c41592881b45621cecf9a9669ac417b61521950dd232b54bdcf84c0a8f2024d71b54d5623e38fab71c38eb92aa1ec5bbd3d4b3640cf7cdc2f46142c77ace64af7b8a5d5747d0d2d462d611d0036d7f9585b02711848e242ee32043451773365e51b06d1e11c0c339dc8903fdf42a6e501acdc71d79c6236a1f26b70d6d9758f6bb0b502999c9bd287b3f468e5cb45a6a1423c556216bdedba8c7352d25152a5796760f7f18862bd4a3836cb4dda61ebf16cd943afe93c8c0ab48ab95970ef753fc61035bdee0db27966e130a62b286ee6bdc298a234ca624f3beedce2b35f6fa36699c1f4930fd7c4d91c72b6ec0cf44536d019c388f14eebf121c506fae4f97e65301a7c8ad3190d904f6d183d1ece6724965e8d046ea0b43be61f6924a55a69c67c3e67b1d1cfd947be48a11ed491441ccf71573cdb6e6d257524cc996d4ebd08cce471b5dcb1877111df2f8d74ce6cebac1ea086b9277f15e0800663dd42c1095ff2a39c1a0a233104ee02f48d592fc7b4a795e6f6a53725dfe676f89afd3b15651cd8502ad7826873027c4218ca29844564205828a993a65e97852b353854d1474d1fb93c87bfe46b5176e99a3544984b9b5279bda9727fa4bc36e508248b813ec4b58a127a1cfef1c758565aea334eedf02f407ae46c7363147ccd3d96b5b65703cc92f37bdd0ddf982efae733a38741cde4c1b2598b7a088a6dda0013db9fd376150b02f483e21071c7f9668ffecd5a8e48e449570d44be6b062930409b6423359db9d7885765b0043fdb6a58dcf2ce810988af2a6bbf2d4f2df4077b50457adead661df7793d1199d5096c2aa39a365087e0e8f2710b7af498142ce5313dce8d0907845a14bf2ea24be55f53ad30e7df4dccebf7c4c14b37090e71ac15fdbfeba1c740a0625dff2423bee6ea6e9a6950ee6af435efbef007fd90ce4462c9ae3ddf6aab62e9c0846703133dba323fa79cd2da0598510afd3ee3adba461d342897d25af927602cc85fc2c469f59dc5e4cc974ce6e075f8660b9bd1c77c22796f94fc351d75e5c8e3ec1c0e2c3a3253d3b2b476cc1f2909ceb568cf2701d73fbe2bb7ad6a2819f794582626ed00bc5611022013ee2b797e2a4a424967caba3b717a7f68d361db7729088138620871a65e335eec6b963e89f73a48a9fad1b16481e18e92af92fa7e70031fdbfc5941f9963e36a8f021074b28289c1b889270bee5a0fe2fc73746d129509958afa7cf449ab615f792b2ed60160b031a1361334e1a8f17149b383ecdc315a5de71a97c3ef4ad30d393aad6ea4014a043b1b139d98882692d36fd28b6e583c1385590bdd5dd12d610990489c1dbcd6e287ad8b289b299cf9356de315249bf20facbd497123af77c932fd6eb6cbd087b3ec17d9acbc296a766c21aa0a284e976e9e13f7063698b1cb8f5865ea7fc345eecf0d71af59ac2451fcfa7c52e2beb12bc8f565b5cc9cd53f5d301a6eb3ee5535bd51370d61efe80add49145d65fbdcca20a07c0a086812d1fd126eb67aa2eaf734bbb699003ec79992f8facbcb153ae4c54c1c30848bc63fafd8b52ed7e85331e779753fa641bc328bdf5fc364ee5454c5a17db84e426b261385e11c8a20601b443cc336d95751b35db7d2c6e0e6509d1e2efc5c38b0a7c4ec2ae6ce4bce5a15c7a2e78992b0a0d3621c5bdf69b802fe6fdeca20797c10d33253d7742705e8bfd0a301080bbd35b31fc63ba880da9acee2604157702ec4bf20d908e1b684dbb9c87ac1f56bb2e8671c01d732e60456b9f486381e41971851d57d0fa1922ea645dd57e246990e0f372cebe36f0e8bff51a504a8bb5b5c63ddfd7ce47dd995bd1c8d0b7778571bac80401deeb85cde0b71a113e5689886f615fcc2530ab2a7be12aa89f68dfc8954d12501856ccd7b0588b0215c90409a8182f15e1c3e2ee717862249d895e0b6ee2084ffafdffe29c4fac638f87d7434cb092fc50c4caf96ec44465d705ca63357032d4a8215137bd26d21c5884dad6cb220ca60a6440bebc1a216145cfe5f2a6252b4169c8d4e9278c8cd11a58c2790599e8d7c779afbaa77768843edf261515687153c022666d2adcfc57a84232a3e7f9271f19e609ebf9185477c134197eb55eb56e11b3e01fa6b136b6afe2c175a7fdf960946c20aae72f615350e45f3f53719aa140c8e9f9204a48507b0e323d57aa559fd33bd91206ad3d6aabaf840bf19319edc0ddb98c457467cdf83d9ca0f0df5c5bf73f1726d6d5f1b5cd479e9733f36043a8a688b19d4696a54891f0631a143191f9e6ab4bd1cc4720b3ec09d324eaef3dbdbc2952ac3a195cc688988c158a03e0143be0eafa78cee41ecef948dbf8af69ced345124d3ed8f3e0b715913013ab18f1ac5e1ac8141d9d108c5d87b01793017843dad517b52d1b49a1691821d5ca69b173c140a9fdd2910ba102d44f3796536965665e6e06b78fdc32bd00606b8935c3fd99e0390bd9d035eb2f1464253987194ac6726d30add81e48dfa4b982f4b34f3b38bb00bbdf2ca98417982e9ce7fd61e5f84292c3f2f343a5e986030bdebb32752f2b65543de87cc72d8282f5a1f048fa6f9d81681fb4dd9afa53038af8ca9c0c28418c81ccee0c36ed213764e0c6b99259a44695cc628a84e892483271e13a14cc7d67bb10f9045e997d4c30eb4f7a3273ddec73018ed36bb74b1ea393ffa943bdcdd1644b1274ff41471fa9043184de465446e824822763e5b23eed36740bb0b002cdfd0eec509a7f70a718169c2ca8815fa67f613eec4e6a2e3063df152174807d31dd33db9fcc4ac4f643e5a2cb0dba2eca755bbabe2888a7bd95a817c3f5fdc2a599a9154fa49bdc10ac4eab13e45b0217105c42652a011590'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
|
|
42
|
-
// Create a temporary file for the decrypted script
|
|
43
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
44
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
45
|
-
|
|
46
|
-
// Execute the decrypted script with arguments using spawn
|
|
47
|
-
const child = spawn(tmpScript, args, {
|
|
48
|
-
stdio: 'inherit',
|
|
49
|
-
env: process.env
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
child.on('exit', (code) => {
|
|
53
|
-
// Clean up temp file
|
|
54
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
55
|
-
process.exit(code || 0);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
// Clean up temp file on error
|
|
60
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
61
|
-
console.error('Error executing script:', error);
|
|
62
|
-
process.exit(1);
|
|
63
|
-
});
|
|
64
|
-
"
|