oipage 0.3.0 → 1.0.0-alpha.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/CHANGELOG +15 -13
- package/README.md +1 -102
- package/bin/mineTypes.json +105 -0
- package/{nodejs/core → bin}/network.js +7 -4
- package/bin/resolve404.js +78 -0
- package/bin/run +8 -200
- package/bin/serve.js +64 -0
- package/images/file.png +0 -0
- package/images/folder.png +0 -0
- package/images/goback.png +0 -0
- package/{corejs → nodejs}/animation/index.js +8 -2
- package/nodejs/deeplog/index.d.ts +10 -0
- package/nodejs/deeplog/index.js +35 -0
- package/nodejs/linelog/index.d.ts +9 -0
- package/nodejs/{core/log.js → linelog/index.js} +12 -55
- package/{corejs → nodejs}/throttle/index.js +9 -3
- package/package.json +12 -5
- package/web/animation/index.d.ts +12 -0
- package/web/animation/index.js +108 -0
- package/{browserjs → web}/getStyle/index.js +8 -2
- package/{browserjs → web}/onReady/index.js +8 -2
- package/web/setStyle/index.js +11 -0
- package/web/throttle/index.d.ts +31 -0
- package/web/throttle/index.js +56 -0
- package/AUTHORS.txt +0 -6
- package/bin/options.js +0 -74
- package/browserjs/index.d.ts +0 -13
- package/browserjs/index.js +0 -9
- package/browserjs/setStyle/index.js +0 -5
- package/corejs/index.d.ts +0 -10
- package/corejs/index.js +0 -7
- package/nodejs/core/file.js +0 -163
- package/nodejs/core/image.js +0 -5
- package/nodejs/core/options.js +0 -49
- package/nodejs/core/remote.js +0 -60
- package/nodejs/core/responseFileList.js +0 -28
- package/nodejs/core/server.js +0 -190
- package/nodejs/data/404.js +0 -52
- package/nodejs/data/images/file.js +0 -1
- package/nodejs/data/images/folder.js +0 -1
- package/nodejs/data/mime.types.js +0 -112
- package/nodejs/form/common.js +0 -3
- package/nodejs/form/index.js +0 -80
- package/nodejs/form/select.js +0 -10
- package/nodejs/index.js +0 -58
- package/nodejs/loader/simpleScss.js +0 -248
- package/nodejs/loader/xhtml.js +0 -521
- package/nodejs/reader/plain.js +0 -20
- package/stylecss/index.css +0 -3
- package/stylecss/normalize.css +0 -94
- package/stylecss/rasterize.css +0 -318
- package/stylecss/skeleton.css +0 -16
- package/types/get-options.d.ts +0 -6
- package/types/index.d.ts +0 -187
- /package/{corejs → nodejs}/animation/index.d.ts +0 -0
- /package/{corejs → nodejs}/throttle/index.d.ts +0 -0
- /package/{browserjs → web}/getStyle/index.d.ts +0 -0
- /package/{browserjs → web}/onReady/index.d.ts +0 -0
- /package/{browserjs → web}/setStyle/index.d.ts +0 -0
package/nodejs/core/file.js
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
// 删除文件或文件夹
|
|
5
|
-
function deleteSync(target) {
|
|
6
|
-
|
|
7
|
-
// 如果文件夹不存在,直接返回即可
|
|
8
|
-
if (!fs.existsSync(target)) return;
|
|
9
|
-
|
|
10
|
-
// 如果是文件,直接删除即可
|
|
11
|
-
if (!fs.lstatSync(target).isDirectory()) {
|
|
12
|
-
fs.unlinkSync(target);
|
|
13
|
-
} else {
|
|
14
|
-
|
|
15
|
-
// 读取子文件
|
|
16
|
-
const subFiles = fs.readdirSync(target);
|
|
17
|
-
|
|
18
|
-
subFiles.forEach(function (file) {
|
|
19
|
-
|
|
20
|
-
// 调用这个方法,删除子文件或文件夹
|
|
21
|
-
const curPath = path.join(target, "./" + file);
|
|
22
|
-
deleteSync(curPath);
|
|
23
|
-
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
// 等子文件或文件夹删除完毕以后,删除本文件夹
|
|
27
|
-
fs.rmdirSync(target);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
// 复制文件或文件夹
|
|
33
|
-
function copySync(source, target) {
|
|
34
|
-
|
|
35
|
-
// 如果是文件,直接复制即可
|
|
36
|
-
if (!fs.lstatSync(source).isDirectory()) {
|
|
37
|
-
if (!fs.existsSync(path.join(target, "../"))) fs.mkdirSync(path.join(target, "../"), { recursive: true });
|
|
38
|
-
|
|
39
|
-
fs.copyFileSync(source, target);
|
|
40
|
-
} else {
|
|
41
|
-
|
|
42
|
-
// 读取子文件
|
|
43
|
-
const subFiles = fs.readdirSync(source);
|
|
44
|
-
|
|
45
|
-
// 如果文件夹不存在,创建
|
|
46
|
-
if (!fs.existsSync(target)) {
|
|
47
|
-
fs.mkdirSync(target, { recursive: true });
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// 复制子文件或文件夹
|
|
51
|
-
subFiles.forEach(function (file) {
|
|
52
|
-
copySync(path.join(source, "./" + file), path.join(target, "./" + file));
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// 移动文件或文件夹
|
|
59
|
-
function moveSync(source, target) {
|
|
60
|
-
|
|
61
|
-
// 如果是文件,直接剪切即可
|
|
62
|
-
if (!fs.lstatSync(source).isDirectory()) {
|
|
63
|
-
if (!fs.existsSync(path.join(target, "../"))) fs.mkdirSync(path.join(target, "../"), { recursive: true });
|
|
64
|
-
|
|
65
|
-
fs.copyFileSync(source, target);
|
|
66
|
-
fs.unlinkSync(source);
|
|
67
|
-
} else {
|
|
68
|
-
|
|
69
|
-
// 读取子文件
|
|
70
|
-
const subFiles = fs.readdirSync(source);
|
|
71
|
-
|
|
72
|
-
// 如果文件夹不存在,创建
|
|
73
|
-
if (!fs.existsSync(target)) {
|
|
74
|
-
fs.mkdirSync(target, { recursive: true });
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// 移动子文件或文件夹
|
|
78
|
-
subFiles.forEach(function (file) {
|
|
79
|
-
moveSync(path.join(source, "./" + file), path.join(target, "./" + file));
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// 移动完子文件或文件夹以后(移动完毕也意味着子文件或文件夹被删除了)
|
|
83
|
-
fs.rmdirSync(source);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// 遍历文件或文件夹中所有文件
|
|
88
|
-
function listFileSync(source, callback) {
|
|
89
|
-
// 文件夹
|
|
90
|
-
if (fs.lstatSync(source).isDirectory()) {
|
|
91
|
-
|
|
92
|
-
// 读取子内容
|
|
93
|
-
const subItems = fs.readdirSync(source);
|
|
94
|
-
subItems.forEach(function (item) {
|
|
95
|
-
listFileSync(path.join(source, "./" + item), callback);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// 文件
|
|
100
|
-
else {
|
|
101
|
-
let folder = path.join(source, "../");
|
|
102
|
-
|
|
103
|
-
callback({
|
|
104
|
-
"name": source.replace(folder, ""),
|
|
105
|
-
"path": source,
|
|
106
|
-
"folder": folder
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// 遍历文件夹中所有文件夹
|
|
112
|
-
function listFolderSync(source, callback) {
|
|
113
|
-
if (fs.lstatSync(source).isDirectory()) {
|
|
114
|
-
(function doIt(source) {
|
|
115
|
-
|
|
116
|
-
// 读取子内容
|
|
117
|
-
const subItems = fs.readdirSync(source);
|
|
118
|
-
subItems.forEach(function (item) {
|
|
119
|
-
let itemPath = path.join(source, "./" + item);
|
|
120
|
-
|
|
121
|
-
// 如果是文件夹
|
|
122
|
-
if (fs.lstatSync(itemPath).isDirectory()) {
|
|
123
|
-
|
|
124
|
-
let notDeep = callback({
|
|
125
|
-
"name": item,
|
|
126
|
-
"path": itemPath
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// 深入
|
|
130
|
-
if (!notDeep) {
|
|
131
|
-
doIt(itemPath);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
})(source);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// 获取文件或文件夹的全路径
|
|
142
|
-
function fullPathSync(pathString, contextPath) {
|
|
143
|
-
if (/^\//.test(pathString) || /^[A-Za-z]:\\/.test(pathString)) {
|
|
144
|
-
// 如果传递的就是全路径
|
|
145
|
-
return pathString;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (arguments.length <= 1) {
|
|
149
|
-
// 默认把当前命令行作为上下文路径
|
|
150
|
-
contextPath = process.cwd();
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// 拼全路径
|
|
154
|
-
return path.join(contextPath, pathString);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// 导出
|
|
158
|
-
exports.deleteSync = deleteSync;
|
|
159
|
-
exports.copySync = copySync;
|
|
160
|
-
exports.moveSync = moveSync;
|
|
161
|
-
exports.listFileSync = listFileSync;
|
|
162
|
-
exports.listFolderSync = listFolderSync;
|
|
163
|
-
exports.fullPathSync = fullPathSync;
|
package/nodejs/core/image.js
DELETED
package/nodejs/core/options.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* 命令行参数解析
|
|
4
|
-
*
|
|
5
|
-
* @param {JSON} config 命令参数缩小到全写的映射
|
|
6
|
-
* @param {Array} argv 需要判断类型的值
|
|
7
|
-
*
|
|
8
|
-
* @returns {JSON} 返回整理后的参数
|
|
9
|
-
*
|
|
10
|
-
*/
|
|
11
|
-
module.exports = function (config, argv) {
|
|
12
|
-
|
|
13
|
-
let resultConfig = {
|
|
14
|
-
__terminal__: []
|
|
15
|
-
}, flag = null;
|
|
16
|
-
for (let i = 2; i < argv.length; i++) {
|
|
17
|
-
|
|
18
|
-
// 如果是新的配置
|
|
19
|
-
if (/^--[0-9a-zA-Z]+$/.test(argv[i]) || /^-[0-9a-zA-Z]$/.test(argv[i])) {
|
|
20
|
-
let key = argv[i];
|
|
21
|
-
|
|
22
|
-
// 如果是缩写,需要映射
|
|
23
|
-
if (key.length == 2) {
|
|
24
|
-
key = config[key];
|
|
25
|
-
|
|
26
|
-
// 如果是错误缩写
|
|
27
|
-
if (!key) {
|
|
28
|
-
flag = null;
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
flag = key.replace(/^--/, "");
|
|
34
|
-
resultConfig[flag] = [];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// 如果是普通的参数
|
|
38
|
-
else if (flag != null) {
|
|
39
|
-
resultConfig[flag].push(argv[i]);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
else {
|
|
43
|
-
resultConfig.__terminal__.push(argv[i]);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return resultConfig;
|
|
49
|
-
};
|
package/nodejs/core/remote.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
const https = require('https');
|
|
2
|
-
const http = require('http');
|
|
3
|
-
|
|
4
|
-
exports.get = function (url, options = {}) {
|
|
5
|
-
return new Promise((resolve, reject) => {
|
|
6
|
-
|
|
7
|
-
let handler = /^https/.test(url) ? https : http;
|
|
8
|
-
|
|
9
|
-
handler.get(url, res => {
|
|
10
|
-
res.on('data', (data) => {
|
|
11
|
-
if (options.json) {
|
|
12
|
-
resolve(JSON.parse(data.toString('utf8')));
|
|
13
|
-
} else {
|
|
14
|
-
resolve(data);
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
}).on('error', (e) => {
|
|
18
|
-
reject(e);
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
exports.post = function (url, options = {}) {
|
|
24
|
-
return new Promise((resolve, reject) => {
|
|
25
|
-
|
|
26
|
-
let handler = /^https/.test(url) ? https : http;
|
|
27
|
-
|
|
28
|
-
let execArray = /https*:\/\/([^\/]+)(.+)?/.exec(url);
|
|
29
|
-
let hostport = execArray[1].split(":");
|
|
30
|
-
|
|
31
|
-
const req = handler.request({
|
|
32
|
-
hostname: hostport[0],
|
|
33
|
-
port: hostport[1] || 80,
|
|
34
|
-
path: execArray[2] || "/",
|
|
35
|
-
method: "POST",
|
|
36
|
-
headers: options.header || {}
|
|
37
|
-
}, (res) => {
|
|
38
|
-
res.setEncoding('utf8');
|
|
39
|
-
|
|
40
|
-
let data = "";
|
|
41
|
-
res.on('data', (chunk) => {
|
|
42
|
-
data += chunk;
|
|
43
|
-
});
|
|
44
|
-
res.on('end', () => {
|
|
45
|
-
if (options.json) {
|
|
46
|
-
resolve(JSON.parse(data.toString('utf8')));
|
|
47
|
-
} else {
|
|
48
|
-
resolve(data);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
req.write(options.params || "{}");
|
|
54
|
-
|
|
55
|
-
req.on('error', (e) => {
|
|
56
|
-
reject(e);
|
|
57
|
-
});
|
|
58
|
-
req.end();
|
|
59
|
-
});
|
|
60
|
-
};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
const Template_404 = require('../data/404');
|
|
5
|
-
|
|
6
|
-
// 读取当前路径下的文件,方便服务器404的时候导航
|
|
7
|
-
module.exports = function (fullUrl) {
|
|
8
|
-
|
|
9
|
-
let files, content = fullUrl;
|
|
10
|
-
try {
|
|
11
|
-
files = fs.readdirSync(fullUrl);
|
|
12
|
-
} catch (e) {
|
|
13
|
-
try {
|
|
14
|
-
content = path.resolve(fullUrl, '../');
|
|
15
|
-
files = fs.readdirSync(content);
|
|
16
|
-
} catch (e) {
|
|
17
|
-
files = [];
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let template = "<a href='../'>..</a>";
|
|
22
|
-
for (let i in files) {
|
|
23
|
-
let isDirectory = fs.lstatSync(path.join(content, files[i])).isDirectory();
|
|
24
|
-
template += "<a class='" + (isDirectory ? "folder" : "file") + "' href='./" + files[i] + (isDirectory ? "/" : "") + "'>" + files[i] + "</a>";
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return Template_404(template);
|
|
28
|
-
};
|
package/nodejs/core/server.js
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
const http = require('http');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
|
|
4
|
-
const mineTypes = require('../data/mime.types.js');
|
|
5
|
-
const { log, warn, error } = require('./log.js');
|
|
6
|
-
const responseFileList = require('./responseFileList.js');
|
|
7
|
-
const path = require('path');
|
|
8
|
-
const network = require('./network.js');
|
|
9
|
-
|
|
10
|
-
const jsonfile = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json')));
|
|
11
|
-
|
|
12
|
-
module.exports = function (config = {}) {
|
|
13
|
-
|
|
14
|
-
let port = config.port || 20000; // 端口号
|
|
15
|
-
let handler = typeof config.handler == 'function' ? config.handler : function () { return false; };
|
|
16
|
-
let suffixs = Array.isArray(config.suffix) ? config.suffix : [".html", ".htm", ".js", ".json", ".css"];
|
|
17
|
-
|
|
18
|
-
let proxy = [];
|
|
19
|
-
if (config.proxy) {
|
|
20
|
-
for (let item of config.proxy) {
|
|
21
|
-
let target = /(https*):\/\/([^/:]+):*(\d+)*(.*)/.exec(item.target) || [];
|
|
22
|
-
proxy.push({
|
|
23
|
-
test: item.test,
|
|
24
|
-
target: {
|
|
25
|
-
protocol: target[1], // 使用的协议
|
|
26
|
-
hostname: target[2], // 请求发送至的服务器的域名或 IP 地址
|
|
27
|
-
port: target[3] || 80, // 端口号
|
|
28
|
-
path: target[4] || "", // 路径前缀
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
let basePath = path.join(process.cwd(), config.basePath || "./"); // 服务器根路径
|
|
35
|
-
|
|
36
|
-
let index = 0;
|
|
37
|
-
let Server = http.createServer(function (request, response) {
|
|
38
|
-
try {
|
|
39
|
-
let requestData = "";
|
|
40
|
-
|
|
41
|
-
request.on('data', (chunk) => {
|
|
42
|
-
requestData += chunk;
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
request.on('end', () => {
|
|
46
|
-
let url = decodeURIComponent(request.url);
|
|
47
|
-
|
|
48
|
-
url = url.split("?")[0];
|
|
49
|
-
|
|
50
|
-
// 请求的文件路径
|
|
51
|
-
let filePath = path.join(basePath, url == "/" ? "index.html" : url.replace(/^\//, ""));
|
|
52
|
-
|
|
53
|
-
log("[" + index++ + "]" + url);
|
|
54
|
-
|
|
55
|
-
let getFileInfo = function (filePath) {
|
|
56
|
-
let dotName = /\./.test(filePath) ? filePath.match(/\.([^.]+)$/)[1] : "";
|
|
57
|
-
let type = mineTypes[dotName];
|
|
58
|
-
if (fs.existsSync(filePath) && !fs.lstatSync(filePath).isDirectory()) {
|
|
59
|
-
return {
|
|
60
|
-
type,
|
|
61
|
-
path: filePath
|
|
62
|
-
};
|
|
63
|
-
} else {
|
|
64
|
-
for (let suffix of suffixs) {
|
|
65
|
-
if (fs.existsSync(filePath + suffix) && !fs.lstatSync(filePath + suffix).isDirectory()) {
|
|
66
|
-
type = mineTypes[suffix.replace(/^\./, "")];
|
|
67
|
-
return {
|
|
68
|
-
type,
|
|
69
|
-
path: filePath + suffix
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
// 自定义拦截
|
|
77
|
-
if (handler.call({
|
|
78
|
-
data: requestData,
|
|
79
|
-
base: basePath,
|
|
80
|
-
getFileInfo,
|
|
81
|
-
filePath
|
|
82
|
-
}, request, response)) return;
|
|
83
|
-
|
|
84
|
-
// proxy拦截
|
|
85
|
-
for (let item of proxy) {
|
|
86
|
-
if (item.test.test(url)) {
|
|
87
|
-
let _path = item.target.path + (url.replace(item.test, ""));
|
|
88
|
-
|
|
89
|
-
warn(" ↳ [" + request.method + "] " + item.target.protocol + "://" + item.target.hostname + ":" + item.target.port + _path);
|
|
90
|
-
|
|
91
|
-
// https://www.nodeapp.cn/http.html#http_http_request_options_callback
|
|
92
|
-
const req = http.request({
|
|
93
|
-
hostname: item.target.hostname,
|
|
94
|
-
port: item.target.port,
|
|
95
|
-
path: _path,
|
|
96
|
-
method: request.method,
|
|
97
|
-
headers: request.headers
|
|
98
|
-
}, (res) => {
|
|
99
|
-
res.setEncoding('utf8');
|
|
100
|
-
|
|
101
|
-
let responseData = "";
|
|
102
|
-
res.on('data', (chunk) => {
|
|
103
|
-
responseData += chunk;
|
|
104
|
-
});
|
|
105
|
-
res.on('end', () => {
|
|
106
|
-
let responseHeaders = res.headers;
|
|
107
|
-
responseHeaders['proxy-server'] = "Powered by OIPage@" + jsonfile.version;
|
|
108
|
-
responseHeaders['Access-Control-Allow-Origin'] = '*';
|
|
109
|
-
response.writeHead(res.statusCode, responseHeaders);
|
|
110
|
-
response.write(responseData);
|
|
111
|
-
response.end();
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
req.on('error', (e) => {
|
|
116
|
-
error(` 转发的时候遇到问题: ${e.message}`);
|
|
117
|
-
response.writeHead('500', {
|
|
118
|
-
'Content-type': "text/plain;charset=utf-8",
|
|
119
|
-
'Access-Control-Allow-Origin': '*',
|
|
120
|
-
"proxy-server": "Powered by OIPage@" + jsonfile.version
|
|
121
|
-
});
|
|
122
|
-
response.write(e + "");
|
|
123
|
-
response.end();
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
req.write(requestData);
|
|
127
|
-
req.end();
|
|
128
|
-
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
let is404 = true;
|
|
134
|
-
let doResponse = function (type, filePath) {
|
|
135
|
-
response.writeHead(200, {
|
|
136
|
-
'Content-type': (type || "text/plain") + ";charset=utf-8",
|
|
137
|
-
'Access-Control-Allow-Origin': '*',
|
|
138
|
-
'Server': "Powered by OIPage@" + jsonfile.version
|
|
139
|
-
});
|
|
140
|
-
response.write(fs.readFileSync(filePath));
|
|
141
|
-
is404 = false;
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
let fileInfo = getFileInfo(filePath);
|
|
145
|
-
if (fileInfo) { // 如果文件存在
|
|
146
|
-
doResponse(fileInfo.type, fileInfo.path);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (is404) {
|
|
150
|
-
response.writeHead(404, {
|
|
151
|
-
'Content-type': "text/html;charset=utf-8",
|
|
152
|
-
'Access-Control-Allow-Origin': '*',
|
|
153
|
-
'Server': "Powered by OIPage@" + jsonfile.version
|
|
154
|
-
});
|
|
155
|
-
response.write(responseFileList(filePath));
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
response.end();
|
|
159
|
-
});
|
|
160
|
-
} catch (e) {
|
|
161
|
-
error(e);
|
|
162
|
-
|
|
163
|
-
response.writeHead(500, {
|
|
164
|
-
'Content-type': "text/plain;charset=utf-8",
|
|
165
|
-
'Access-Control-Allow-Origin': '*',
|
|
166
|
-
'Server': "Powered by OIPage@" + jsonfile.version
|
|
167
|
-
});
|
|
168
|
-
response.write(e + "");
|
|
169
|
-
|
|
170
|
-
response.end();
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
Server.listen(port);
|
|
176
|
-
|
|
177
|
-
// 打印启动成功信息
|
|
178
|
-
|
|
179
|
-
log('\n<i> [OIPage-server] Project is running at:');
|
|
180
|
-
log('<i> [OIPage-server] Loopback: http://localhost:' + port + '/');
|
|
181
|
-
|
|
182
|
-
let networkInfo = network();
|
|
183
|
-
|
|
184
|
-
// 打印IPv4地址
|
|
185
|
-
for (let ipv4 of networkInfo.IPv4) {
|
|
186
|
-
log('<i> [OIPage-server] On Your Network (IPv4): http://' + ipv4.address + ':' + port + '/');
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
log('\nOIPage Server compiled successfully\n');
|
|
190
|
-
};
|
package/nodejs/data/404.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
const img_folder = require("./images/folder");
|
|
2
|
-
const img_file = require("./images/file");
|
|
3
|
-
|
|
4
|
-
module.exports = function (template) {
|
|
5
|
-
return `<!DOCTYPE html>
|
|
6
|
-
<html lang="zh-cn">
|
|
7
|
-
|
|
8
|
-
<head>
|
|
9
|
-
<meta charset="UTF-8">
|
|
10
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
11
|
-
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
|
12
|
-
<title>404 Not Found</title>
|
|
13
|
-
<style>
|
|
14
|
-
body{
|
|
15
|
-
margin: 0px;
|
|
16
|
-
background-color:#fcfcfc;
|
|
17
|
-
display: flex;
|
|
18
|
-
flex-wrap:wrap;
|
|
19
|
-
padding:100px;
|
|
20
|
-
}
|
|
21
|
-
body>a{
|
|
22
|
-
text-decoration: none;
|
|
23
|
-
padding:10px;
|
|
24
|
-
color:#000000;
|
|
25
|
-
text-align:center;
|
|
26
|
-
width:100px;
|
|
27
|
-
background-repeat: no-repeat;
|
|
28
|
-
background-position: center 0px;
|
|
29
|
-
padding-top: 65px;
|
|
30
|
-
margin-top: 50px;
|
|
31
|
-
font-size:12px;
|
|
32
|
-
}
|
|
33
|
-
body>a:hover{
|
|
34
|
-
outline:1px solid #55b9e6;
|
|
35
|
-
}
|
|
36
|
-
body>a.folder{
|
|
37
|
-
background-image:url('${img_folder}');
|
|
38
|
-
}
|
|
39
|
-
body>a.file{
|
|
40
|
-
background-image:url('${img_file}');
|
|
41
|
-
}
|
|
42
|
-
</style>
|
|
43
|
-
</head>
|
|
44
|
-
|
|
45
|
-
<body>
|
|
46
|
-
|
|
47
|
-
${template}
|
|
48
|
-
|
|
49
|
-
</body>
|
|
50
|
-
|
|
51
|
-
</html>`;
|
|
52
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEAYABgAAD/4QR7RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodpAAQAAAABAAAApAAAANAADqV6AAAnEAAOpXoAACcQQWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dzADIwMjE6MDU6MDggMDk6NDg6MjcAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAMqADAAQAAAABAAAAPAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAAANFAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklGAAECAABIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAPAAyAwEiAAIRAQMRAf/dAAQABP/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9TSSQK6aXNLnMBJc+Sf6zklJ0kL7PR/owmONSdAwCdJSUmSWdh5NlNVQyDNNjW+nafzSeK7D/wBRZ/nrRSUpJJJJT//Q9TQ6voH+s/8A6pyIh1fQP9Z//VOSUzTJJklIfsOGdDU2DoRrEHkQo9KsdZ03Ge8lzjW2SeTorA5Cq9G/5Lxf+LakpupJJJKf/9H1NCr+h/af/wBU5FQqwdp0/Of/ANU5JTJMng+CaD4JJXHI+Kq9G/5Lxf8Ai2q0AZGndVejf8l4v/FtSQ3UkkklP//S9TVZ+BQ95eXWNLjJDbHtEn+S121WUklNT9m0fv3f9u2f+TS/ZtH793/btn/k1bSSU1P2bR+/d/29Z/5NWKaa6Km01Daxgho8AppJKUkkkkp//9n/7QlAUGhvdG9zaG9wIDMuMAA4QklNBCUAAAAAABAAAAAAAAAAAAAAAAAAAAAAOEJJTQPtAAAAAAAQAF/8kgABAAIAX/ySAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAeDhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAAAAAAAAAIAAThCSU0EAgAAAAAABAAAAAA4QklNBDAAAAAAAAIBAThCSU0ELQAAAAAABgABAAAAAzhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAAM/AAAABgAAAAAAAAAAAAAAPAAAADIAAAAFZypoB5iYAC0AMQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAMgAAADwAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAAC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TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjIuMi1jMDYzIDUzLjM1MjYyNCwgMjAwOC8wNy8zMC0xODoxMjoxOCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDUtMDhUMDk6NDg6MjcrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTA1LTA4VDA5OjQ4OjI3KzA4OjAwIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMS0wNS0wOFQwOTo0ODoyNyswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMDBCNjA2NTlGQUZFQjExOTBCNEMyQjY4Q0Q4M0YwQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyRjBCNjA2NTlGQUZFQjExOTBCNEMyQjY4Q0Q4M0YwQiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjJGMEI2MDY1OUZBRkVCMTE5MEI0QzJCNjhDRDgzRjBCIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgdGlmZjpPcmllbnRhdGlvbj0iMSIgdGlmZjpYUmVzb2x1dGlvbj0iOTU5ODY2LzEwMDAwIiB0aWZmOllSZXNvbHV0aW9uPSI5NTk4NjYvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwzMzQzMjtGOTczNkI5MzBGQUQ2QzBBMjM0ODBDQTRFMzBGOEZBRiIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjUwIiBleGlmOlBpeGVsWURpbWVuc2lvbj0iNjAiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpOYXRpdmVEaWdlc3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtFRjZEMzczRjg2RThDNzE3RkY4Q0M2NDlDOTAxQUIzMiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MkYwQjYwNjU5RkFGRUIxMTkwQjRDMkI2OENEODNGMEIiIHN0RXZ0OndoZW49IjIwMjEtMDUtMDhUMDk6NDg6MjcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MzAwQjYwNjU5RkFGRUIxMTkwQjRDMkI2OENEODNGMEIiIHN0RXZ0OndoZW49IjIwMjEtMDUtMDhUMDk6NDg6MjcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rl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";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEAYABgAAD/4QUiRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodpAAQAAAABAAAApAAAANAADqV6AAAnEAAOpXoAACcQQWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dzADIwMjE6MDU6MDggMDk6NDc6NTAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAMqADAAQAAAABAAAAPAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAAAPsAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklGAAECAABIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAPAAyAwEiAAIRAQMRAf/dAAQABP/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9TQ25FDnFoeNw0LSYP3FEVG/FryGifa8fReOR/5ioc+U4+GgDd7roxB3bsg8J1mUMeHGv1BvaYIMifgrH6yzkO/L+RAZp1cscq7x9aeEdJfa20kDHudYXNdy2PxR1LGQlESHXutIo0pJJJOQ/wD/0PU1XbwrCrNMNVTnNofVfDq5rL9nVbGO1re8NcDx9HlXeo3nDFRrnda7a0c6gb/++rNEO6peCJBI0+QVrqzjs6cTqfWE/wCY9WMPyR8gtlu6db6shgdAdGhB1gp6/wCbb8B+RCxPp2R4N/78i1fzbP6o/InoZJJJJKf/0fU1QL4CvrNyGOqeWnjkHyVLn7EIyGwOv1ZcNWQ5mJZ62dbYBEu4+HtV3q/8307/AI4f9Q9UeliLXucIBcYJ458Vf6uCa+nQCYuEwJP0Hq3hFQj5Mc9y6GJ9N/wb/wB+RKv5tn9UfkQsMy+zQjRuhBB/O8USpwNbR5BPO6EiSSSCn//S9TQsikXVx+cNWlFSTMvBwS4/kr1Jjdit2tRhsZW2RFm0BxHw/O/Nf/aUnUbzW2xrHMr1bp8h7PzUdJOjVCtqUd9WHpR9Bzm/Az+D9yVdYraGjXzKmkihSSSSSn//2f/tCeRQaG90b3Nob3AgMy4wADhCSU0EJQAAAAAAEAAAAAAAAAAAAAAAAAAAAAA4QklNA+0AAAAAABAAX/ySAAEAAgBf/JIAAQACOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD+AAAA4QklNBA0AAAAAAAQAAAB4OEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0EAAAAAAAAAgAAOEJJTQQCAAAAAAACAAA4QklNBDAAAAAAAAEBADhCSU0ELQAAAAAABgABAAAAAjhCSU0ECAAAAAAAEAAAAAEAAAJA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cDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dzIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTA1LTA4VDA5OjQ3OjUwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNS0wOFQwOTo0Nzo1MCswODowMCIgeG1wOkNyZWF0ZURhdGU9IjIwMjEtMDUtMDhUMDk6NDc6NTArMDg6MDAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkUwQjYwNjU5RkFGRUIxMTkwQjRDMkI2OENEODNGMEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkQwQjYwNjU5RkFGRUIxMTkwQjRDMkI2OENEODNGMEIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyRDBCNjA2NTlGQUZFQjExOTBCNEMyQjY4Q0Q4M0YwQiIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249Ijk1OTg2Ni8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iOTU5ODY2LzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiB0aWZmOk5hdGl2ZURpZ2VzdD0iMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7MEFGMkU2MzI0QzA3RTM5NkM3NzhBRTE5NTg0NERBMUYiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI1MCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjYwIiBleGlmOkNvbG9yU3BhY2U9IjEiIGV4aWY6TmF0aXZlRGlnZXN0PSIzNjg2NCw0MDk2MCw0MDk2MSwzNzEyMSwzNzEyMiw0MDk2Miw0MDk2MywzNzUxMCw0MDk2NCwzNjg2NywzNjg2OCwzMzQzNCwzMzQzNywzNDg1MCwzNDg1MiwzNDg1NSwzNDg1NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4MywzNzM4NCwzNzM4NSwzNzM4NiwzNzM5Niw0MTQ4Myw0MTQ4NCw0MTQ4Niw0MTQ4Nyw0MTQ4OCw0MTQ5Miw0MTQ5Myw0MTQ5NSw0MTcyOCw0MTcyOSw0MTczMCw0MTk4NSw0MTk4Niw0MTk4Nyw0MTk4OCw0MTk4OSw0MTk5MCw0MTk5MSw0MTk5Miw0MTk5Myw0MTk5NCw0MTk5NSw0MTk5Niw0MjAxNiwwLDIsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMjAsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMzA7RUY2RDM3M0Y4NkU4QzcxN0ZGOENDNjQ5QzkwMUFCMzIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJEMEI2MDY1OUZBRkVCMTE5MEI0QzJCNjhDRDgzRjBCIiBzdEV2dDp3aGVuPSIyMDIxLTA1LTA4VDA5OjQ3OjUwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJFMEI2MDY1OUZBRkVCMTE5MEI0QzJCNjhDRDgzRjBCIiBzdEV2dDp3aGVuPSIyMDIxLTA1LTA4VDA5OjQ3OjUwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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";
|