@ethernity-cloud/sdk-js 1.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/LICENSE +661 -0
- package/README.md +185 -0
- package/build.js +22 -0
- package/init.js +301 -0
- package/nodenithy/build/las/Dockerfile +5 -0
- package/nodenithy/build/securelock/Dockerfile.tmpl +65 -0
- package/nodenithy/build/securelock/scripts/binary-fs-build.sh +28 -0
- package/nodenithy/build/securelock/src/.env +3 -0
- package/nodenithy/build/securelock/src/etny_crypto.js +201 -0
- package/nodenithy/build/securelock/src/etny_exec.js +65 -0
- package/nodenithy/build/securelock/src/image_registry_abi.js +808 -0
- package/nodenithy/build/securelock/src/models.js +261 -0
- package/nodenithy/build/securelock/src/package.json +40 -0
- package/nodenithy/build/securelock/src/pox_abi.js +1491 -0
- package/nodenithy/build/securelock/src/securelock.js.tmpl +421 -0
- package/nodenithy/build/securelock/src/swift_stream_service.js +147 -0
- package/nodenithy/build/securelock/src/task_status.js +15 -0
- package/nodenithy/build/securelock/src/wallet.js +29 -0
- package/nodenithy/build/squash/Dockerfile +7 -0
- package/nodenithy/build/trustedzone/Dockerfile.tmpl +57 -0
- package/nodenithy/build/trustedzone/scripts/binary-fs-build.sh +22 -0
- package/nodenithy/build/trustedzone/src/.env +3 -0
- package/nodenithy/build/trustedzone/src/etny_crypto.js +202 -0
- package/nodenithy/build/trustedzone/src/etny_exec.js +54 -0
- package/nodenithy/build/trustedzone/src/image_registry_abi.js +808 -0
- package/nodenithy/build/trustedzone/src/models.js +261 -0
- package/nodenithy/build/trustedzone/src/package.json +40 -0
- package/nodenithy/build/trustedzone/src/pox_abi.js +1491 -0
- package/nodenithy/build/trustedzone/src/swift_stream_service.js +147 -0
- package/nodenithy/build/trustedzone/src/task_status.js +15 -0
- package/nodenithy/build/trustedzone/src/test.js +44 -0
- package/nodenithy/build/trustedzone/src/trustedzone.js.tmpl +508 -0
- package/nodenithy/build/trustedzone/src/wallet.js +28 -0
- package/nodenithy/build/validator/Dockerfile +58 -0
- package/nodenithy/build/validator/package-lock.json +6 -0
- package/nodenithy/build/validator/scripts/binary-fs-build.sh +19 -0
- package/nodenithy/build/validator/src/.env +3 -0
- package/nodenithy/build/validator/src/cert.pem +5 -0
- package/nodenithy/build/validator/src/etny_crypto.js +204 -0
- package/nodenithy/build/validator/src/etny_exec.js +52 -0
- package/nodenithy/build/validator/src/image_registry_abi.js +808 -0
- package/nodenithy/build/validator/src/key.pem +6 -0
- package/nodenithy/build/validator/src/models.js +261 -0
- package/nodenithy/build/validator/src/package-lock.json +2498 -0
- package/nodenithy/build/validator/src/package.json +40 -0
- package/nodenithy/build/validator/src/pox_abi.js +1491 -0
- package/nodenithy/build/validator/src/swift_stream_service.js +147 -0
- package/nodenithy/build/validator/src/task_status.js +15 -0
- package/nodenithy/build/validator/src/test.js +44 -0
- package/nodenithy/build/validator/src/trustedzone.js +613 -0
- package/nodenithy/build/validator/src/validator_abi.js +834 -0
- package/nodenithy/build/validator/src/wallet.js +28 -0
- package/nodenithy/build.js +184 -0
- package/nodenithy/build.mjs +179 -0
- package/nodenithy/build.sh +161 -0
- package/nodenithy/ipfs.js +135 -0
- package/nodenithy/ipfs.mjs +551 -0
- package/nodenithy/public/favicon.ico +0 -0
- package/nodenithy/public/index.html +43 -0
- package/nodenithy/public/logo192.png +0 -0
- package/nodenithy/public/logo512.png +0 -0
- package/nodenithy/public/manifest.json +25 -0
- package/nodenithy/public/robots.txt +3 -0
- package/nodenithy/run/__pycache__/swift_stream_service.cpython-312.pyc +0 -0
- package/nodenithy/run/app/input.txt +4 -0
- package/nodenithy/run/app/payload.js +4 -0
- package/nodenithy/run/docker-compose-final.yml.tmpl +65 -0
- package/nodenithy/run/docker-compose-swift-stream.yml +17 -0
- package/nodenithy/run/docker-compose.yml.tmpl +76 -0
- package/nodenithy/run/etny-securelock-test.yaml.tpl +46 -0
- package/nodenithy/run/etny-trustedzone-test.yaml.tpl +45 -0
- package/nodenithy/run/git.sh +22 -0
- package/nodenithy/run/image_registry.abi +1 -0
- package/nodenithy/run/image_registry.js +372 -0
- package/nodenithy/run/image_registry.py +327 -0
- package/nodenithy/run/image_registry_runner.py +71 -0
- package/nodenithy/run/ipfs.sh +58 -0
- package/nodenithy/run/ipfs_pre.sh +75 -0
- package/nodenithy/run/public_key_service.js +90 -0
- package/nodenithy/run/public_key_service.py +107 -0
- package/nodenithy/run/swift_stream_service.py +212 -0
- package/nodenithy/run/swiftstream.py +37 -0
- package/nodenithy/run/swiftstream1.py +27 -0
- package/nodenithy/run.js +538 -0
- package/nodenithy/run.sh +277 -0
- package/nodenithy/scripts/build-ipfs-upload.sh +23 -0
- package/nodenithy/scripts/build.sh +40 -0
- package/nodenithy/scripts/ipfs-daemon.sh +7 -0
- package/nodenithy/scripts/run.sh +50 -0
- package/nodenithy/src/App.css +57 -0
- package/nodenithy/src/ec_helloworld_example.js +64 -0
- package/nodenithy/src/index.css +13 -0
- package/nodenithy/src/index.js +17 -0
- package/nodenithy/src/preStart.js +45 -0
- package/nodenithy/src/preStart.mjs +57 -0
- package/nodenithy/src/reportWebVitals.js +13 -0
- package/nodenithy/src/serverless/backend.js +5 -0
- package/package.json +48 -0
- package/postinstall.js +34 -0
- package/publish.js +126 -0
- package/pynithy/build/docker-compose.yml +68 -0
- package/pynithy/build/las/Dockerfile +11 -0
- package/pynithy/build/las/src/etny_entrypoint.sh +6 -0
- package/pynithy/build/las/src/las_entrypoint.sh +26 -0
- package/pynithy/build/scripts/binary-fs-build.sh +28 -0
- package/pynithy/build/securelock/Dockerfile.tmpl +78 -0
- package/pynithy/build/securelock/scripts/binary-fs-build.sh +41 -0
- package/pynithy/build/securelock/src/app/.env +5 -0
- package/pynithy/build/securelock/src/app/cert1-ca1-clean.crt +10 -0
- package/pynithy/build/securelock/src/app/cert1-ca1-clean.key +6 -0
- package/pynithy/build/securelock/src/app/enclave_pub_cert.pem +10 -0
- package/pynithy/build/securelock/src/app/input.txt +1 -0
- package/pynithy/build/securelock/src/app/payload.py +25 -0
- package/pynithy/build/securelock/src/app/public-cert-clean.pem +10 -0
- package/pynithy/build/securelock/src/app/result.txt +1 -0
- package/pynithy/build/securelock/src/app/transaction.txt +1 -0
- package/pynithy/build/securelock/src/etny_crypto.py +167 -0
- package/pynithy/build/securelock/src/etny_exec.py +79 -0
- package/pynithy/build/securelock/src/image_registry.abi +1 -0
- package/pynithy/build/securelock/src/key_generation.py +17 -0
- package/pynithy/build/securelock/src/models.py +176 -0
- package/pynithy/build/securelock/src/pox.abi +1489 -0
- package/pynithy/build/securelock/src/securelock.py.tmpl +411 -0
- package/pynithy/build/securelock/src/swift_stream_service.py +186 -0
- package/pynithy/build/trustedzone/Dockerfile.tmpl +56 -0
- package/pynithy/build/trustedzone/scripts/binary-fs-build.sh +32 -0
- package/pynithy/build/trustedzone/src/app/.env +5 -0
- package/pynithy/build/trustedzone/src/app/cert1-ca1-clean.crt +10 -0
- package/pynithy/build/trustedzone/src/app/cert1-ca1-clean.key +6 -0
- package/pynithy/build/trustedzone/src/app/enclave_pub_cert.pem +10 -0
- package/pynithy/build/trustedzone/src/app/input.txt +1 -0
- package/pynithy/build/trustedzone/src/app/payload.py +25 -0
- package/pynithy/build/trustedzone/src/app/public-cert-clean.pem +10 -0
- package/pynithy/build/trustedzone/src/app/result.txt +1 -0
- package/pynithy/build/trustedzone/src/app/securelock.crt +10 -0
- package/pynithy/build/trustedzone/src/app/transaction.txt +1 -0
- package/pynithy/build/trustedzone/src/app/trustedzone.crt +10 -0
- package/pynithy/build/trustedzone/src/etny_crypto.py +188 -0
- package/pynithy/build/trustedzone/src/etny_exec.py +56 -0
- package/pynithy/build/trustedzone/src/formatter.py +42 -0
- package/pynithy/build/trustedzone/src/image_registry.abi +1 -0
- package/pynithy/build/trustedzone/src/key_generation.py +17 -0
- package/pynithy/build/trustedzone/src/models.py +176 -0
- package/pynithy/build/trustedzone/src/pox.abi +1489 -0
- package/pynithy/build/trustedzone/src/swift_stream_service.py +186 -0
- package/pynithy/build/trustedzone/src/trustedzone.py.tmpl +460 -0
- package/pynithy/build.mjs +179 -0
- package/pynithy/docker-compose.yml +0 -0
- package/pynithy/ipfs.mjs +244 -0
- package/pynithy/public/favicon.ico +0 -0
- package/pynithy/public/index.html +43 -0
- package/pynithy/public/logo192.png +0 -0
- package/pynithy/public/logo512.png +0 -0
- package/pynithy/public/manifest.json +25 -0
- package/pynithy/public/robots.txt +3 -0
- package/pynithy/run/certs/cert.pem +31 -0
- package/pynithy/run/certs/challenge.crt +10 -0
- package/pynithy/run/certs/key.pem +52 -0
- package/pynithy/run/docker-compose-final.yml +59 -0
- package/pynithy/run/docker-compose-final.yml.tmpl +59 -0
- package/pynithy/run/docker-compose-swift-stream.yml +27 -0
- package/pynithy/run/docker-compose-swift-stream.yml.tmpl +27 -0
- package/pynithy/run/docker-compose.yml +55 -0
- package/pynithy/run/docker-compose.yml.tmpl +55 -0
- package/pynithy/run/etny-pynity-test.yaml.tpl +46 -0
- package/pynithy/run/etny-securelock-test.yaml.tpl +46 -0
- package/pynithy/run/etny-trustedzone-test.yaml.tpl +46 -0
- package/pynithy/run/git.sh +22 -0
- package/pynithy/run/image_registry.abi +1 -0
- package/pynithy/run/image_registry.js +372 -0
- package/pynithy/run/image_registry.py +139 -0
- package/pynithy/run/image_registry_runner.py +45 -0
- package/pynithy/run/ipfs.sh +89 -0
- package/pynithy/run/public_key_service.js +90 -0
- package/pynithy/run/swiftstream.py +28 -0
- package/pynithy/run.js +538 -0
- package/pynithy/src/App.css +57 -0
- package/pynithy/src/ec_helloworld_example.js +64 -0
- package/pynithy/src/index.css +13 -0
- package/pynithy/src/index.js +17 -0
- package/pynithy/src/preStart.mjs +57 -0
- package/pynithy/src/reportWebVitals.js +13 -0
- package/pynithy/src/serverless/__init__.py +0 -0
- package/pynithy/src/serverless/backend.py +2 -0
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ethernity-cloud/sdk-js",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "A package to run ethernity cloud build scripts",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"ecld-build": "cross-env node ./node_modules/@ethernity-cloud/sdk-js/build.js",
|
|
7
|
+
"ecld-publish": "cross-env node ./node_modules/@ethernity-cloud/sdk-js/publish.js",
|
|
8
|
+
"ecld-init": "cross-env node ./node_modules/@ethernity-cloud/sdk-js/init.js",
|
|
9
|
+
"ecld-run": "cross-env ecld-run",
|
|
10
|
+
"postinstall": "node postinstall.js"
|
|
11
|
+
},
|
|
12
|
+
"bin": {
|
|
13
|
+
"ecld-build": "./build.js",
|
|
14
|
+
"ecld-publish": "./publish.js",
|
|
15
|
+
"ecld-init": "./init.js",
|
|
16
|
+
"postinstall": "./postinstall.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"nodenithy/*",
|
|
20
|
+
"pynithy/*",
|
|
21
|
+
"build.js",
|
|
22
|
+
"init.js",
|
|
23
|
+
"publish.js",
|
|
24
|
+
"postinstall.js"
|
|
25
|
+
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@ethernity-cloud/runner": "^0.0.26",
|
|
28
|
+
"axios": "^1.7.2",
|
|
29
|
+
"commander": "^12.1.0",
|
|
30
|
+
"dotenv": "^16.4.5",
|
|
31
|
+
"eth-lib": "^0.1.29",
|
|
32
|
+
"ethers": "^5.5.4",
|
|
33
|
+
"kubo-rpc-client": "^4.1.1",
|
|
34
|
+
"web3": "^4.9.0",
|
|
35
|
+
"cross-env": "^7.0.3",
|
|
36
|
+
"shelljs": "^0.8.5",
|
|
37
|
+
"shx": "^0.3.4",
|
|
38
|
+
"node-forge": "^1.3.1",
|
|
39
|
+
"cli-progress": "^3.12.0",
|
|
40
|
+
"react": "^18.3.1",
|
|
41
|
+
"react-dom": "^18.3.1",
|
|
42
|
+
"react-scripts": "^5.0.1",
|
|
43
|
+
"web-vitals": "^2.1.4",
|
|
44
|
+
"adm-zip": "^0.5.14"
|
|
45
|
+
},
|
|
46
|
+
"author": "Alexandru Luca",
|
|
47
|
+
"license": "AGPL-3.0"
|
|
48
|
+
}
|
package/postinstall.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// console.log("Running postinstall script...");
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
// Path to the package.json file
|
|
6
|
+
// should be the package.json file from the root of the project
|
|
7
|
+
const packageJsonPath = path.join(__dirname, '../..', 'package.json');
|
|
8
|
+
|
|
9
|
+
// console.log("packageJsonPath: ", packageJsonPath);
|
|
10
|
+
|
|
11
|
+
// Read the package.json file
|
|
12
|
+
// if it does not exist, create an empty object
|
|
13
|
+
const packageJson = fs.existsSync(packageJsonPath) ? JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) : {};
|
|
14
|
+
|
|
15
|
+
// Default scripts to add
|
|
16
|
+
const defaultScripts = {
|
|
17
|
+
"ecld-build": "cross-env node ./node_modules/@ethernity-cloud/sdk-js/build.js",
|
|
18
|
+
"ecld-publish": "cross-env node ./node_modules/@ethernity-cloud/sdk-js/publish.js",
|
|
19
|
+
"ecld-init": "cross-env node ./node_modules/@ethernity-cloud/sdk-js/init.js",
|
|
20
|
+
"ecld-run": "cross-env ecld-run",
|
|
21
|
+
"start": "node src/preStart.mjs && react-scripts start"
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Add default scripts to the package.json scripts section
|
|
25
|
+
packageJson.scripts = {
|
|
26
|
+
...packageJson.scripts,
|
|
27
|
+
...defaultScripts
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Write the updated package.json back to the file
|
|
31
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8');
|
|
32
|
+
|
|
33
|
+
// console.log('Default scripts added to package.json');
|
|
34
|
+
process.stdout.write("Installation complete! Please run `npm run ecld-init` to initialize the project.\n");
|
package/publish.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const readline = require('readline');
|
|
3
|
+
const { execSync, spawn } = require('child_process');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
require('dotenv').config();
|
|
6
|
+
|
|
7
|
+
// Function to write to .env file
|
|
8
|
+
const writeEnv = (key, value) => {
|
|
9
|
+
try {
|
|
10
|
+
const envFile = '.env';
|
|
11
|
+
let envContent = '';
|
|
12
|
+
|
|
13
|
+
if (fs.existsSync(envFile)) {
|
|
14
|
+
envContent = fs.readFileSync(envFile, 'utf8');
|
|
15
|
+
const regex = new RegExp(`^${key}=.*`, 'm');
|
|
16
|
+
if (regex.test(envContent)) {
|
|
17
|
+
envContent = envContent.replace(regex, `${key}=${value}`);
|
|
18
|
+
} else {
|
|
19
|
+
envContent += `\n${key}=${value}`;
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
envContent = `${key}=${value}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fs.writeFileSync(envFile, envContent, 'utf8');
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.log(error);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Function to prompt user input
|
|
32
|
+
async function prompt(question) {
|
|
33
|
+
const rl = readline.createInterface({
|
|
34
|
+
input: process.stdin,
|
|
35
|
+
output: process.stdout
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
return new Promise(resolve => rl.question(question, answer => {
|
|
39
|
+
rl.close();
|
|
40
|
+
resolve(answer);
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
(async () => {
|
|
45
|
+
const { PROJECT_NAME, BLOCKCHAIN_NETWORK, PRIVATE_KEY, DEVELOPER_FEE, SERVICE_TYPE } = process.env;
|
|
46
|
+
const scriptPath = path.resolve(__dirname, 'nodenithy/run/image_registry.js');
|
|
47
|
+
process.env.NODE_NO_WARNINGS = 1
|
|
48
|
+
let result = '';
|
|
49
|
+
if (!PROJECT_NAME || !BLOCKCHAIN_NETWORK || !PRIVATE_KEY || !DEVELOPER_FEE) {
|
|
50
|
+
const hasWallet = await prompt('Do you have an existing wallet? (yes/no) (default value: no) ') || 'no';
|
|
51
|
+
console.log()
|
|
52
|
+
if (hasWallet.toLowerCase() !== 'yes') {
|
|
53
|
+
console.log('Without a wallet, you will not be able to publish.');
|
|
54
|
+
console.log('Please refer to Blockchain Wallets Documentation (https://docs.ethernity.cloud/ethernity-node/prerequisites-ethernity-node/blockchain-wallets).');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let privateKey = await prompt('Enter your private key: ');
|
|
59
|
+
result = execSync(`node ${scriptPath} "" "" "" "${privateKey}" "validateAddress"`).toString().trim();
|
|
60
|
+
|
|
61
|
+
while (result !== 'OK') {
|
|
62
|
+
console.log(result);
|
|
63
|
+
privateKey = await prompt('Invalid private key. Please enter a valid private key: ');
|
|
64
|
+
result = execSync(`node ${scriptPath} "" "" "" "${privateKey}" "validateAddress"`).toString().trim();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
console.log('Inputted Private key is valid.');
|
|
68
|
+
writeEnv('PRIVATE_KEY', privateKey);
|
|
69
|
+
console.log()
|
|
70
|
+
console.log('Checking blockchain for required funds...');
|
|
71
|
+
|
|
72
|
+
result = execSync(`node ${scriptPath} "" "" "" "" "checkBalance"`).toString().trim();
|
|
73
|
+
|
|
74
|
+
console.log(`Available funds: ${result}`);
|
|
75
|
+
console.log()
|
|
76
|
+
console.log(`Checking if project name is available on ${BLOCKCHAIN_NETWORK} network and ownership...`);
|
|
77
|
+
result = execSync(`node ${scriptPath} ${BLOCKCHAIN_NETWORK} ${process.env.PROJECT_NAME} ${process.env.VERSION} ${process.env.PRIVATE_KEY}`,).toString().trim();
|
|
78
|
+
console.log(result);
|
|
79
|
+
console.log()
|
|
80
|
+
|
|
81
|
+
const taskPercentage = await prompt('Please specify the % of a task which will be transferred to your wallet upon successful execution (default 10%): ') || '10';
|
|
82
|
+
writeEnv('DEVELOPER_FEE', taskPercentage);
|
|
83
|
+
} else {
|
|
84
|
+
console.log('Using PROJECT_NAME, BLOCKCHAIN_NETWORK, PRIVATE_KEY, DEVELOPER_FEE from .env');
|
|
85
|
+
console.log('Checking blockchain for required funds...');
|
|
86
|
+
result = result = execSync(`node ${scriptPath} "" "" "" "" "checkBalance"`).toString().trim();
|
|
87
|
+
|
|
88
|
+
console.log(`Available funds: ${result}`);
|
|
89
|
+
console.log()
|
|
90
|
+
let privateKey = PRIVATE_KEY;
|
|
91
|
+
result = execSync(`node ${scriptPath} "" "" "" "${privateKey}" "validateAddress"`).toString().trim();
|
|
92
|
+
|
|
93
|
+
while (result !== 'OK') {
|
|
94
|
+
console.log(result);
|
|
95
|
+
privateKey = await prompt('Invalid private key. Please enter a valid private key: ');
|
|
96
|
+
result = execSync(`node ${scriptPath} "" "" "" "${privateKey}" "validateAddress"`).toString().trim();
|
|
97
|
+
}
|
|
98
|
+
writeEnv('PRIVATE_KEY', privateKey);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (SERVICE_TYPE === 'Nodenithy') {
|
|
102
|
+
console.log('Adding prerequisites for Nodenithy...');
|
|
103
|
+
// the current process can be exited 'cross-env node ./node_modules/@ethernity-cloud/sdk-js/nodenithy/run.js'
|
|
104
|
+
const run = spawn('node', ['./node_modules/@ethernity-cloud/sdk-js/nodenithy/run.js'], {
|
|
105
|
+
stdio: 'inherit'
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
run.on('exit', code => {
|
|
109
|
+
console.log('Exit code:', code);
|
|
110
|
+
process.exit(code);
|
|
111
|
+
});
|
|
112
|
+
} else if (SERVICE_TYPE === 'Pynithy') {
|
|
113
|
+
console.log('Adding prerequisites for Pynithy...');
|
|
114
|
+
const run = spawn('node', ['./node_modules/@ethernity-cloud/sdk-js/pynithy/run.js'], {
|
|
115
|
+
stdio: 'inherit'
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
run.on('exit', code => {
|
|
119
|
+
console.log('Exit code:', code);
|
|
120
|
+
process.exit(code);
|
|
121
|
+
});
|
|
122
|
+
} else {
|
|
123
|
+
console.log('Something went wrong');
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
})();
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
version: '3.2'
|
|
2
|
+
services:
|
|
3
|
+
las:
|
|
4
|
+
container_name: las
|
|
5
|
+
privileged: true
|
|
6
|
+
image: etny-las
|
|
7
|
+
entrypoint: "/las_entrypoint.sh"
|
|
8
|
+
command: "/usr/local/bin/las"
|
|
9
|
+
devices:
|
|
10
|
+
- "/dev/sgx_enclave:/dev/sgx_enclave"
|
|
11
|
+
restart: on-failure
|
|
12
|
+
networks:
|
|
13
|
+
- ethernity
|
|
14
|
+
ports:
|
|
15
|
+
- target: 18766
|
|
16
|
+
published: 18766
|
|
17
|
+
protocol: tcp
|
|
18
|
+
mode: host
|
|
19
|
+
|
|
20
|
+
etny-securelock:
|
|
21
|
+
container_name: etny-securelock
|
|
22
|
+
privileged: true
|
|
23
|
+
image: etny-securelock
|
|
24
|
+
entrypoint: ""
|
|
25
|
+
command: [ "/usr/local/bin/python", "/etny-securelock/securelock.py" ]
|
|
26
|
+
environment:
|
|
27
|
+
- SCONE_CAS_ADDR=scone-cas.cf
|
|
28
|
+
- SCONE_LAS_ADDR=las
|
|
29
|
+
- SCONE_CONFIG_ID=etny-pynity-test-0.0.18/application
|
|
30
|
+
- SCONE_HEAP=128M
|
|
31
|
+
- SCONE_LOG=DEBUG
|
|
32
|
+
- SCONE_MODE=SIM
|
|
33
|
+
- SCONE_ALLOW_DLOPEN=2
|
|
34
|
+
- SCONE_EXTENSIONS_PATH=/lib/libbinary-fs.so
|
|
35
|
+
restart: on-failure
|
|
36
|
+
networks:
|
|
37
|
+
- ethernity
|
|
38
|
+
devices:
|
|
39
|
+
- "/dev/sgx_enclave:/dev/sgx_enclave"
|
|
40
|
+
depends_on:
|
|
41
|
+
- las
|
|
42
|
+
|
|
43
|
+
etny-trustedzone:
|
|
44
|
+
container_name: etny-trustedzone
|
|
45
|
+
privileged: true
|
|
46
|
+
image: etny-trustedzone
|
|
47
|
+
entrypoint: ""
|
|
48
|
+
command: [ "/usr/local/bin/python", "/etny-trustedzone/trustedzone.py" ]
|
|
49
|
+
environment:
|
|
50
|
+
- SCONE_CAS_ADDR=scone-cas.cf
|
|
51
|
+
- SCONE_LAS_ADDR=las
|
|
52
|
+
- SCONE_CONFIG_ID=etny-pynity-trustedzone-0.0.18/application
|
|
53
|
+
- SCONE_HEAP=128M
|
|
54
|
+
- SCONE_LOG=DEBUG
|
|
55
|
+
- SCONE_MODE=SIM
|
|
56
|
+
- SCONE_ALLOW_DLOPEN=2
|
|
57
|
+
- SCONE_EXTENSIONS_PATH=/lib/libbinary-fs.so
|
|
58
|
+
restart: on-failure
|
|
59
|
+
networks:
|
|
60
|
+
- ethernity
|
|
61
|
+
devices:
|
|
62
|
+
- "/dev/sgx_enclave:/dev/sgx_enclave"
|
|
63
|
+
depends_on:
|
|
64
|
+
- las
|
|
65
|
+
|
|
66
|
+
networks:
|
|
67
|
+
ethernity:
|
|
68
|
+
external: true
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
SOCKET="/var/run/aesmd/aesm.socket"
|
|
6
|
+
|
|
7
|
+
# Try to connect to the socket
|
|
8
|
+
# Previously we merely checked that the socket file exists. However, the
|
|
9
|
+
# file is not removed when the container stops and, thus, when we restart
|
|
10
|
+
# the file still exists and we assume that we are supposed to use an
|
|
11
|
+
# outside AESM.
|
|
12
|
+
if socat -u OPEN:/dev/null UNIX-CONNECT:${SOCKET}; then
|
|
13
|
+
# An AESM socket was already mounted into the container, don't start a local AESM service, start LAS directly
|
|
14
|
+
echo "${SOCKET} exists - Will use mounted AESM socket; the local in-container AESM service will not be started!"
|
|
15
|
+
exec "$@"
|
|
16
|
+
else
|
|
17
|
+
# No AESM socket present, delegate execution to the local AESM service
|
|
18
|
+
echo "${SOCKET} not found or unable to connect - Starting local in-container AESM service"
|
|
19
|
+
if [ -e ${SOCKET} ]; then
|
|
20
|
+
# Ensure the socket file does not exist - AESM won't start if it does...
|
|
21
|
+
rm ${SOCKET}
|
|
22
|
+
fi
|
|
23
|
+
exec /entrypoint.sh "$@"
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
/etny_entrypoint.sh &
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/bin/bash -v
|
|
2
|
+
|
|
3
|
+
pip3 install pyinstaller
|
|
4
|
+
apk add binutils
|
|
5
|
+
|
|
6
|
+
cd /etny-securelock
|
|
7
|
+
pyinstaller etny_result.py
|
|
8
|
+
|
|
9
|
+
EXEC=(scone binaryfs / /binary-fs-dir -v \
|
|
10
|
+
--include '/usr/local/lib/python3.10/*' \
|
|
11
|
+
--include '/etny-securelock/*' \
|
|
12
|
+
--host-path=/etc/resolv.conf \
|
|
13
|
+
--host-path=/etc/hosts)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
for FILE in `cat ./build/etny_result/COLLECT-00.toc | grep '.so' | grep BINARY | awk -F "'" '{print $4}'`
|
|
17
|
+
do
|
|
18
|
+
EXEC+=(--include "${FILE}"'*')
|
|
19
|
+
done
|
|
20
|
+
|
|
21
|
+
rm -rf build dist etny_result.spec
|
|
22
|
+
|
|
23
|
+
echo "${EXEC[@]}"
|
|
24
|
+
|
|
25
|
+
SCONE_MODE=auto
|
|
26
|
+
exec "${EXEC[@]}"
|
|
27
|
+
|
|
28
|
+
exit
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# FROM registry.scontain.com:5050/sconecuratedimages/apps:python3.10.5-alpine3.15-scone5.8-pre-release as release
|
|
2
|
+
FROM registry.ethernity.cloud:443/debuggingdelight/ethernity-cloud-sdk-registry/sconecuratedimages/apps:python3.10.5-alpine3.15-scone5.8-pre-release as release
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
RUN apk update
|
|
7
|
+
|
|
8
|
+
RUN cd /
|
|
9
|
+
RUN apk add bash openrc bind-tools sudo npm binutils curl
|
|
10
|
+
RUN pip3 install --upgrade pip
|
|
11
|
+
RUN pip3 install --upgrade setuptools
|
|
12
|
+
RUN pip3 install python-dotenv
|
|
13
|
+
RUN pip3 install web3==5.31.0
|
|
14
|
+
RUN pip3 install cryptography==42.0.7
|
|
15
|
+
RUN pip3 install ecdsa
|
|
16
|
+
RUN pip3 install pyasn1
|
|
17
|
+
RUN pip3 install tinyec
|
|
18
|
+
RUN pip3 install pyinstaller
|
|
19
|
+
RUN pip3 install minio
|
|
20
|
+
RUN pip3 install pynacl
|
|
21
|
+
RUN pip3 install pytest
|
|
22
|
+
RUN pip3 install numpy
|
|
23
|
+
RUN pip3 install scipy
|
|
24
|
+
RUN pip3 install hypothesis
|
|
25
|
+
RUN pip3 install pooch
|
|
26
|
+
RUN pip3 install ipywidgets
|
|
27
|
+
|
|
28
|
+
#RUN pip3 install requests
|
|
29
|
+
#RUN pip3 install beautifulsoup4
|
|
30
|
+
#RUN pip3 install tokenizers
|
|
31
|
+
#RUN pip3 install transformers
|
|
32
|
+
#RUN pip3 install tensorflow
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
ENV ENCLAVE_NAME_SECURELOCK=__ENCLAVE_NAME_SECURELOCK__
|
|
36
|
+
ENV BUCKET_NAME=__BUCKET_NAME__
|
|
37
|
+
ENV SMART_CONTRACT_ADDRESS=__SMART_CONTRACT_ADDRESS__
|
|
38
|
+
ENV IMAGE_REGISTRY_ADDRESS=__IMAGE_REGISTRY_ADDRESS__
|
|
39
|
+
ENV RPC_URL=__RPC_URL__
|
|
40
|
+
ENV CHAIN_ID=__CHAIN_ID__
|
|
41
|
+
ENV TRUSTED_ZONE_IMAGE=__TRUSTED_ZONE_IMAGE__
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
RUN mkdir binary-fs-dir
|
|
45
|
+
|
|
46
|
+
COPY ./src /etny-securelock/
|
|
47
|
+
COPY ./scripts/* /etny-securelock/
|
|
48
|
+
|
|
49
|
+
RUN etny-securelock/binary-fs-build.sh
|
|
50
|
+
|
|
51
|
+
FROM registry.ethernity.cloud:443/debuggingdelight/ethernity-cloud-sdk-registry/sconecuratedimages/crosscompilers as build
|
|
52
|
+
|
|
53
|
+
COPY --from=release /binary-fs-dir /.
|
|
54
|
+
|
|
55
|
+
RUN scone gcc ./binary_fs_blob.s ./libbinary_fs_template.a -shared -o /libbinary-fs.so
|
|
56
|
+
|
|
57
|
+
FROM registry.ethernity.cloud:443/debuggingdelight/ethernity-cloud-sdk-registry/sconecuratedimages/apps:python3.10.5-alpine3.15-scone5.8-pre-release
|
|
58
|
+
|
|
59
|
+
COPY --from=build /usr/local/bin/scone /usr/local/bin/scone
|
|
60
|
+
|
|
61
|
+
#RUN scone cas attest scone-cas.cf 3061b9feb7fa67f3815336a085f629a13f04b0a1667c93b14ff35581dc8271e4 -GCS --only_for_testing-debug --only_for_testing-ignore-signer
|
|
62
|
+
|
|
63
|
+
COPY --from=build /libbinary-fs.so /lib/libbinary-fs.so
|
|
64
|
+
|
|
65
|
+
RUN openssl genrsa -3 -out /enclave-key.pem 3072
|
|
66
|
+
|
|
67
|
+
ENV SCONE_LOG=INFO
|
|
68
|
+
ENV SCONE_HEAP=1024M
|
|
69
|
+
ENV SCONE_ALLOW_DLOPEN=1
|
|
70
|
+
ENV SCONE_EXTENSIONS_PATH=/lib/libbinary-fs.so
|
|
71
|
+
|
|
72
|
+
# Disabled production mode for testnet
|
|
73
|
+
# RUN scone-signer sign --key=/enclave-key.pem --env --production /usr/local/bin/python3
|
|
74
|
+
|
|
75
|
+
RUN rm -rf /enclave-key.pem
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
ENTRYPOINT ["/usr/local/bin/python", "/etny-securelock/securelock.py"]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/bin/bash -v
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
pip3 install pyinstaller
|
|
5
|
+
apk add binutils
|
|
6
|
+
|
|
7
|
+
cd /etny-securelock
|
|
8
|
+
|
|
9
|
+
echo "ENCLAVE_NAME_SECURE_LOCK = ${ENCLAVE_NAME_SECURELOCK}"
|
|
10
|
+
|
|
11
|
+
cat securelock.py.tmpl | sed s/"__ENCLAVE_NAME_SECURELOCK__"/"${ENCLAVE_NAME_SECURELOCK}"/g > securelock.py.tmp
|
|
12
|
+
sed -i "s/__BUCKET_NAME__/${BUCKET_NAME}/g" securelock.py.tmp
|
|
13
|
+
sed -i "s/__SMART_CONTRACT_ADDRESS__/${SMART_CONTRACT_ADDRESS}/g" securelock.py.tmp
|
|
14
|
+
sed -i "s/__IMAGE_REGISTRY_ADDRESS__/${IMAGE_REGISTRY_ADDRESS}/g" securelock.py.tmp
|
|
15
|
+
sed -i "s/__RPC_URL__/${RPC_URL}/g" securelock.py.tmp
|
|
16
|
+
sed -i "s/__CHAIN_ID__/${CHAIN_ID}/g" securelock.py.tmp
|
|
17
|
+
sed -i "s/__TRUSTED_ZONE_IMAGE__/${TRUSTED_ZONE_IMAGE}/g" securelock.py.tmp
|
|
18
|
+
mv securelock.py.tmp securelock.py
|
|
19
|
+
|
|
20
|
+
pyinstaller securelock.py
|
|
21
|
+
|
|
22
|
+
EXEC=(scone binaryfs / /binary-fs-dir -v \
|
|
23
|
+
--include '/usr/local/lib/python3.10/*' \
|
|
24
|
+
--include '/etny-securelock/*' \
|
|
25
|
+
--host-path=/etc/resolv.conf \
|
|
26
|
+
--host-path=/etc/hosts)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
for FILE in `cat ./build/securelock/COLLECT-00.toc | grep '.so' | grep BINARY | awk -F "'" '{print $4}'`
|
|
30
|
+
do
|
|
31
|
+
EXEC+=(--include "${FILE}"'*')
|
|
32
|
+
done
|
|
33
|
+
|
|
34
|
+
rm -rf build dist securelock.spec
|
|
35
|
+
|
|
36
|
+
echo "${EXEC[@]}"
|
|
37
|
+
|
|
38
|
+
SCONE_MODE=auto
|
|
39
|
+
exec "${EXEC[@]}"
|
|
40
|
+
|
|
41
|
+
exit
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
ETNY_CHAIN_ID=8995
|
|
2
|
+
ETNY_SMART_CONTRACT_ADDRESS=0x549A6E06BB2084100148D50F51CF77a3436C3Ae7
|
|
3
|
+
ETNY_WEB3_PROVIDER=https://bloxberg.ethernity.cloud
|
|
4
|
+
ETNY_CLIENT_CHALLENGE=eyJjaXBoZXJ0ZXh0IjogImNjMDQ4Y2NjNzUxZDkwNjE2N2M3YTliNjZkZWZiYjVlMjE3N2E2NTU0MzYxNWEwNTYzYTBmMzViMzkiLCAibm9uY2UiOiAiMTZmYTk5MzRmNDcxMTczZTVmMjg5NDNlY2U4NjZiMzgiLCAiYXV0aFRhZyI6ICJmZTlmY2QyMDk5MzI1NTY2MTRlZTZmMTMwNzIwNzk0ZiIsICJ4IjogIjB4ZDU1ZjgwOWI5MGI0ZGQxYjk4YmJlYmYxYmQzNzlhYzEwNTU1MzFkMjYxMzBhYWU1MGI3MjA3ZGM0N2RlZjNkZWYzYTc1NTliYjkwMWQ1MmE1MWQ1YjNmNDNkODMyZmY5IiwgInkiOiAiMHgyYmMzYmE4ZjA2N2U3YjhiMGQ5NDM0ZWI4NjY2ZjA2ZGIxNjZhMjQ2M2YyNTE4NzcyYmVkYmUxMWM0ZTExNjIzZmIxODMzN2ZiNjRmNjE0OGY3YjEwZDgzMWE1NjYyZDgifQ==
|
|
5
|
+
ETNY_ORDER_ID=5602
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIBczCB+qADAgECAgh7c9xYZiMrNDAKBggqhkjOPQQDAzASMRAwDgYDVQQDDAdD
|
|
3
|
+
QV9DRVJUMCAXDTIyMTIxNTEyNTczNVoYDzQwOTYwMTAxMDAwMDAwWjAWMRQwEgYD
|
|
4
|
+
VQQDDAtTRVJWRVJfQ0VSVDB2MBAGByqGSM49AgEGBSuBBAAiA2IABP8MVsw/zCoO
|
|
5
|
+
SH1Hi/jdGfD6w9zWWKs/Z1dm6RBzmeKdJ8g37kGT35mMHiZw4QZEsnaDtTl2dEmM
|
|
6
|
+
0b8vePjERUaiwv4kMQ4r/r54KiM9dmeKViP+qwMrNsO5KNBsOR6t2aMXMBUwEwYD
|
|
7
|
+
VR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwMDaAAwZQIxAMlYmEz4z6e34Ui/
|
|
8
|
+
l5GNmChI3NUYc5MTL4Zu9X8b/tK82xI2XCv9XWYPHo/gNyA/oAIwDdhKVmDPZjGN
|
|
9
|
+
rU1rl8/+lPT/O1+4mrnyyEB2Vx7Ku1s2MoPf5bS0S/hofEJRmixM
|
|
10
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDD7xfiPdY+Du8Cn0/yT
|
|
3
|
+
WsYqBPVo7e271N0dZ5Rs9Mur8+M/VyH4g/nDReh3l0mzP4ihZANiAAT/DFbMP8wq
|
|
4
|
+
Dkh9R4v43Rnw+sPc1lirP2dXZukQc5ninSfIN+5Bk9+ZjB4mcOEGRLJ2g7U5dnRJ
|
|
5
|
+
jNG/L3j4xEVGosL+JDEOK/6+eCojPXZnilYj/qsDKzbDuSjQbDkerdk=
|
|
6
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIBczCB+qADAgECAgh7c9xYZiMrNDAKBggqhkjOPQQDAzASMRAwDgYDVQQDDAdD
|
|
3
|
+
QV9DRVJUMCAXDTIyMTIxNTEyNTczNVoYDzQwOTYwMTAxMDAwMDAwWjAWMRQwEgYD
|
|
4
|
+
VQQDDAtTRVJWRVJfQ0VSVDB2MBAGByqGSM49AgEGBSuBBAAiA2IABP8MVsw/zCoO
|
|
5
|
+
SH1Hi/jdGfD6w9zWWKs/Z1dm6RBzmeKdJ8g37kGT35mMHiZw4QZEsnaDtTl2dEmM
|
|
6
|
+
0b8vePjERUaiwv4kMQ4r/r54KiM9dmeKViP+qwMrNsO5KNBsOR6t2aMXMBUwEwYD
|
|
7
|
+
VR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwMDaAAwZQIxAMlYmEz4z6e34Ui/
|
|
8
|
+
l5GNmChI3NUYc5MTL4Zu9X8b/tK82xI2XCv9XWYPHo/gNyA/oAIwDdhKVmDPZjGN
|
|
9
|
+
rU1rl8/+lPT/O1+4mrnyyEB2Vx7Ku1s2MoPf5bS0S/hofEJRmixM
|
|
10
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sample input data
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from decimal import Decimal, getcontext
|
|
3
|
+
|
|
4
|
+
def compute(n):
|
|
5
|
+
getcontext().prec = n
|
|
6
|
+
res = Decimal(0)
|
|
7
|
+
for i in range(n):
|
|
8
|
+
a = Decimal(1)/(16**i)
|
|
9
|
+
b = Decimal(4)/(8*i+1)
|
|
10
|
+
c = Decimal(2)/(8*i+4)
|
|
11
|
+
d = Decimal(1)/(8*i+5)
|
|
12
|
+
e = Decimal(1)/(8*i+6)
|
|
13
|
+
r = a*(b-c-d-e)
|
|
14
|
+
res += r
|
|
15
|
+
return res
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
t1 = time.time()
|
|
19
|
+
res = compute(2000)
|
|
20
|
+
dt = time.time()-t1
|
|
21
|
+
|
|
22
|
+
___etny_result___(str(res))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIBczCB+qADAgECAghVH/dYKMPvcjAKBggqhkjOPQQDAzASMRAwDgYDVQQDDAdD
|
|
3
|
+
QV9DRVJUMCAXDTIyMTIyMzE2NTY0NVoYDzQwOTYwMTAxMDAwMDAwWjAWMRQwEgYD
|
|
4
|
+
VQQDDAtTRVJWRVJfQ0VSVDB2MBAGByqGSM49AgEGBSuBBAAiA2IABJswHiJ0gxgS
|
|
5
|
+
Z5UuIWpbgsZGl6K6iEucllY7z64mulQaI2gpBqa2SvRjmXPAzpVeBgyRMxWlj7/c
|
|
6
|
+
vpIpSaaHWxmo1H0IXILtykxS+icwdtsBc/VNdQga/Af4Kvb1g0Cgo6MXMBUwEwYD
|
|
7
|
+
VR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwMDaAAwZQIxALpMDGNogbZ/fYGP
|
|
8
|
+
nMsr7iAX5ereCqErg6BISUEaIC4kjVHaCbaRQpFFyl4A16cW6AIwSmAY5M8O4nAD
|
|
9
|
+
Ow4YZQBfOv1MySqCQOuLPmMhp84AU7gxQCjRJiWEKQuBlH/aH6Zc
|
|
10
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275910
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
f9012a80830f4240830f424094549a6e06bb2084100148d50f51cf77a3436c3ae780b8c414e9f38400000000000000000000000000000000000000000000000000000000000015e20000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005b76313a303a626563353065616630323933623439633761653461393932656137383436336661306539653165376165386332626330653733336435343234383832303764363a726172616a676d7a686c626f736978717a6272793a0000000000824669a0304b2c4abee5a3c945dda995926b0c2fe72fde420468cfbc24eaccd5b8cdab87a0328656248b926043795515c05bc4cf90a1bb3e112818f6116d00a7cfc9bb3215
|