├── README.md
├── LICENSE
├── upload.htm
├── minimalUploadAuthESP32.ino
└── upload_htm.h
/README.md:
--------------------------------------------------------------------------------
1 | # minimalUploadAuthESP32
2 | A simple Arduino IDE authorized upload example for ESP32 with `ESPAsyncWebServer`.
3 |
4 | ## Install
5 | - Install [AsyncTCP](https://github.com/me-no-dev/AsyncTCP) and [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer).
6 | - Change your network credentials in `minimalUploadAuthESP32.ino`.
7 | - Set a `MAX_FILESIZE` in `minimalUploadAuthESP32.ino`.
8 | - Flash your ESP and browse to the ESP web page.
9 |
10 | ## On the file size
11 | The standard `Content-Length` header gives a wrong filesize, so a custom `FileSize` header is used instead.
12 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Cellie
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/upload.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | ESP32 UPLOAD
5 |
6 |
7 |
8 |
45 |
46 |
47 |
58 |
142 |
143 |
144 |
--------------------------------------------------------------------------------
/minimalUploadAuthESP32.ino:
--------------------------------------------------------------------------------
1 | /****************************************************************************
2 |
3 | POC to upload a file to esp32 with authorization
4 |
5 | Browse to your esp32 to upload files
6 |
7 | *****************************************************************************/
8 | #include
9 | #include
10 |
11 | #include "upload_htm.h"
12 |
13 | const char* WIFI_SSID = "----------";
14 | const char* WIFI_PASSWORD = "----------";
15 | const char* HTTP_USERNAME = "admin";
16 | const char* HTTP_PASSWORD = "admin";
17 | const size_t MAX_FILESIZE = 1024 * 1024 * 15;
18 |
19 | /* format bytes as KB, MB or GB string */
20 | String humanReadableSize(const size_t bytes) {
21 | if (bytes < 1024) return String(bytes) + " B";
22 | else if (bytes < (1024 * 1024)) return String(bytes / 1024.0) + " KB";
23 | else if (bytes < (1024 * 1024 * 1024)) return String(bytes / 1024.0 / 1024.0) + " MB";
24 | else return String(bytes / 1024.0 / 1024.0 / 1024.0) + " GB";
25 | }
26 |
27 | void setup() {
28 | Serial.begin(115200);
29 |
30 | WiFi.mode(WIFI_STA);
31 | WiFi.setSleep(false);
32 | WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
33 | Serial.printf("Connecting to WIFI_SSID %s with PSK %s...\n", WIFI_SSID, WIFI_PASSWORD);
34 | if (WiFi.waitForConnectResult() != WL_CONNECTED) {
35 | Serial.printf("WiFi Failed!\n");
36 | return;
37 | }
38 |
39 | static AsyncWebServer server(80);
40 | static const char* MIMETYPE_HTML{"text/html"};
41 |
42 | server.on("/", HTTP_GET, [](AsyncWebServerRequest * request)
43 | {
44 | AsyncWebServerResponse *response = request->beginResponse_P(200, MIMETYPE_HTML, upload_htm, upload_htm_len);
45 | response->addHeader("Server", "ESP Async Web Server");
46 | request->send(response);
47 | });
48 |
49 | // preflight cors check
50 | server.on("/", HTTP_OPTIONS, [](AsyncWebServerRequest * request)
51 | {
52 | AsyncWebServerResponse* response = request->beginResponse(204);
53 | response->addHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS");
54 | response->addHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Authorization, FileSize");
55 | response->addHeader("Access-Control-Allow-Credentials", "true");
56 | request->send(response);
57 | });
58 |
59 | server.on("/", HTTP_POST, [](AsyncWebServerRequest * request)
60 | {
61 | if (request->authenticate(HTTP_USERNAME, HTTP_PASSWORD))
62 | request->send(200);
63 | else {
64 | request->send(401);
65 | request->client()->close();
66 | }
67 | },
68 | [](AsyncWebServerRequest * request, String filename, size_t index, uint8_t *data, size_t len, bool final)
69 | {
70 | if (!request->authenticate(HTTP_USERNAME, HTTP_PASSWORD)) {
71 | request->send(401);
72 | request->client()->close();
73 | return;
74 | }
75 |
76 | // https://javascript.info/formdata
77 |
78 | static unsigned long startTimer;
79 | if (!index) {
80 | startTimer = millis();
81 | const char* FILESIZE_HEADER{"FileSize"};
82 |
83 | Serial.printf("UPLOAD: Receiving: '%s'\n", filename.c_str());
84 |
85 | if (!request->hasHeader(FILESIZE_HEADER)) {
86 | request->send(400, MIMETYPE_HTML, "No filesize header present!");
87 | request->client()->close();
88 | Serial.printf("UPLOAD: Aborted upload because missing filesize header.\n");
89 | return;
90 | }
91 |
92 | Serial.printf("UPLOAD: fileSize: %s\n", request->header(FILESIZE_HEADER));
93 |
94 | if (request->header(FILESIZE_HEADER).toInt() >= MAX_FILESIZE) {
95 | request->send(400, MIMETYPE_HTML,
96 | "Too large. (" + humanReadableSize(request->header(FILESIZE_HEADER).toInt()) +
97 | ") Max size is " + humanReadableSize(MAX_FILESIZE) + ".");
98 |
99 | request->client()->close();
100 | Serial.printf("UPLOAD: Aborted upload because filesize limit.\n");
101 | return;
102 | }
103 | }
104 |
105 | //Store or do something with the data...
106 | //Serial.printf("file: '%s' received %i bytes\ttotal: %i\n", filename.c_str(), len, index + len);
107 |
108 | if (final)
109 | Serial.printf("UPLOAD: Done. Received %i bytes in %.2fs which is %.2f kB/s.\n",
110 | index + len,
111 | (millis() - startTimer) / 1000.0,
112 | 1.0 * (index + len) / (millis() - startTimer));
113 | });
114 |
115 | server.onNotFound([](AsyncWebServerRequest * request)
116 | {
117 | Serial.printf("NOT_FOUND: ");
118 | if (request->method() == HTTP_GET)
119 | Serial.printf("GET");
120 | else if (request->method() == HTTP_POST)
121 | Serial.printf("POST");
122 | else if (request->method() == HTTP_DELETE)
123 | Serial.printf("DELETE");
124 | else if (request->method() == HTTP_PUT)
125 | Serial.printf("PUT");
126 | else if (request->method() == HTTP_PATCH)
127 | Serial.printf("PATCH");
128 | else if (request->method() == HTTP_HEAD)
129 | Serial.printf("HEAD");
130 | else if (request->method() == HTTP_OPTIONS)
131 | Serial.printf("OPTIONS");
132 | else
133 | Serial.printf("UNKNOWN");
134 |
135 | Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str());
136 | request->send(404, MIMETYPE_HTML, "404 - Not found.");
137 | });
138 |
139 | DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
140 |
141 | server.begin();
142 |
143 | Serial.print("Upload files at ");
144 | Serial.println(WiFi.localIP());
145 | }
146 |
147 | void loop() {
148 | delay(1000);
149 | }
150 |
--------------------------------------------------------------------------------
/upload_htm.h:
--------------------------------------------------------------------------------
1 | unsigned char upload_htm[] = {
2 | 0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x48, 0x54,
3 | 0x4d, 0x4c, 0x3e, 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61,
4 | 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x6e, 0x22, 0x3e, 0x0a, 0x3c, 0x68, 0x65,
5 | 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x45,
6 | 0x53, 0x50, 0x33, 0x32, 0x20, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x3c,
7 | 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74,
8 | 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75,
9 | 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61,
10 | 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d,
11 | 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70,
12 | 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22,
13 | 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63,
14 | 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38,
15 | 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72,
16 | 0x65, 0x6c, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72,
17 | 0x65, 0x66, 0x3d, 0x22, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x3b, 0x62, 0x61,
18 | 0x73, 0x65, 0x36, 0x34, 0x2c, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30,
19 | 0x4b, 0x47, 0x67, 0x6f, 0x3d, 0x22, 0x3e, 0x20, 0x20, 0x3c, 0x21, 0x2d,
20 | 0x2d, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x76,
21 | 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
22 | 0x73, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e,
23 | 0x0a, 0x23, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d,
24 | 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
25 | 0x3a, 0x33, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
26 | 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x20, 0x61, 0x75, 0x74,
27 | 0x6f, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67,
28 | 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
29 | 0x62, 0x65, 0x69, 0x67, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74,
30 | 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x63, 0x65,
31 | 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f,
32 | 0x72, 0x64, 0x65, 0x72, 0x3a, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x31,
33 | 0x70, 0x78, 0x20, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x3b, 0x0a, 0x7d, 0x0a,
34 | 0x23, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
35 | 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x63,
36 | 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d,
37 | 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x0a, 0x7d,
38 | 0x0a, 0x23, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,
39 | 0x69, 0x6f, 0x6e, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69,
40 | 0x67, 0x68, 0x74, 0x3a, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20,
41 | 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x73, 0x6f, 0x6c,
42 | 0x69, 0x64, 0x20, 0x31, 0x70, 0x78, 0x20, 0x62, 0x6c, 0x61, 0x63, 0x6b,
43 | 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50,
44 | 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x72, 0x7b, 0x0a,
45 | 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x31,
46 | 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x75, 0x70, 0x6c, 0x6f,
47 | 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e,
48 | 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a,
49 | 0x31, 0x30, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68,
50 | 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x0a,
51 | 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x31,
52 | 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x73, 0x74, 0x61, 0x74,
53 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
54 | 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x0a,
55 | 0x7d, 0x0a, 0x23, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61,
56 | 0x6c, 0x73, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67,
57 | 0x69, 0x6e, 0x3a, 0x32, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
58 | 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78,
59 | 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d,
60 | 0x65, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
61 | 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
62 | 0x3a, 0x34, 0x38, 0x25, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61,
63 | 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20,
64 | 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e,
65 | 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x3c,
66 | 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65,
67 | 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x20,
68 | 0x20, 0x20, 0x20, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x64, 0x3d,
69 | 0x22, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x22,
70 | 0x20, 0x65, 0x6e, 0x63, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x6d, 0x75,
71 | 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x2f, 0x66, 0x6f, 0x72, 0x6d,
72 | 0x2d, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
73 | 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74,
74 | 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65,
75 | 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
76 | 0x65, 0x64, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x65, 0x78,
77 | 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3c, 0x62, 0x72, 0x3e, 0x66, 0x6f, 0x72,
78 | 0x20, 0x45, 0x53, 0x50, 0x33, 0x32, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45,
79 | 0x53, 0x50, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x57, 0x65, 0x62, 0x53, 0x65,
80 | 0x72, 0x76, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20,
81 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22,
82 | 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22,
83 | 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
84 | 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70,
85 | 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d,
86 | 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x6e,
87 | 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d,
88 | 0x65, 0x22, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64,
89 | 0x65, 0x72, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,
90 | 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
91 | 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79,
92 | 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
93 | 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
94 | 0x72, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x61,
95 | 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x70, 0x6c, 0x61, 0x63,
96 | 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x70, 0x61, 0x73,
97 | 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20,
98 | 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20,
99 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
100 | 0x69, 0x64, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65,
101 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
102 | 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
103 | 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20,
104 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x72, 0x6f, 0x67, 0x72,
105 | 0x65, 0x73, 0x73, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x70, 0x6c, 0x6f,
106 | 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61,
107 | 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x30, 0x22,
108 | 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x30, 0x22, 0x3e, 0x3c, 0x2f, 0x70,
109 | 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20,
110 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22,
111 | 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x22, 0x3e,
112 | 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20,
113 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75,
114 | 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
115 | 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20,
116 | 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74,
117 | 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x55, 0x70, 0x6c,
118 | 0x6f, 0x61, 0x64, 0x22, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
119 | 0x64, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22,
120 | 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x6f, 0x72,
121 | 0x6d, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74,
122 | 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61,
123 | 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x3e, 0x0a, 0x0a,
124 | 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61,
125 | 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x29, 0x20, 0x7b,
126 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x71,
127 | 0x75, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58,
128 | 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
129 | 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
130 | 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f,
131 | 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
132 | 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
133 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74,
134 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72,
135 | 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x45, 0x52, 0x52, 0x4f,
136 | 0x52, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x20, 0x72, 0x65, 0x71, 0x75,
137 | 0x65, 0x73, 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x21, 0x27,
138 | 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20,
139 | 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x6f, 0x6e, 0x74,
140 | 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e,
141 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20,
142 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
143 | 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e,
144 | 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20,
145 | 0x27, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x6e,
146 | 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f,
147 | 0x75, 0x74, 0x21, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
148 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
149 | 0x2e, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74,
150 | 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75,
151 | 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20,
152 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74,
153 | 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d,
154 | 0x3d, 0x20, 0x34, 0x30, 0x34, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
155 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e,
156 | 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65,
157 | 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c,
158 | 0x20, 0x3d, 0x20, 0x27, 0x34, 0x30, 0x34, 0x20, 0x2d, 0x20, 0x55, 0x70,
159 | 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6e, 0x6f, 0x74,
160 | 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x65,
161 | 0x72, 0x76, 0x65, 0x72, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
162 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f,
163 | 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,
164 | 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20,
165 | 0x27, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
166 | 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
167 | 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64,
168 | 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x29,
169 | 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
170 | 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x74,
171 | 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x20,
172 | 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
173 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32,
174 | 0x30, 0x30, 0x20, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
175 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
176 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74,
177 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72,
178 | 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x55, 0x70, 0x6c, 0x6f,
179 | 0x61, 0x64, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x21, 0x27, 0x3b,
180 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
181 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e,
182 | 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65,
183 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
184 | 0x3d, 0x20, 0x27, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
185 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
186 | 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c,
187 | 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64,
188 | 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61,
189 | 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
190 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
191 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 0x70, 0x6c, 0x6f,
192 | 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e,
193 | 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20,
194 | 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
195 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
196 | 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20,
197 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
198 | 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x30, 0x30, 0x20, 0x3a, 0x0a,
199 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
200 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64,
201 | 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78,
202 | 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20,
203 | 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f,
204 | 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20,
205 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
206 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e,
207 | 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
208 | 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d,
209 | 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
210 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
211 | 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20,
212 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
213 | 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x30, 0x31, 0x20,
214 | 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
215 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69,
216 | 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54,
217 | 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d,
218 | 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x76,
219 | 0x61, 0x6c, 0x69, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d,
220 | 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
221 | 0x72, 0x64, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
222 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
223 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65,
224 | 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64, 0x69,
225 | 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c,
226 | 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
227 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
228 | 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 0x70, 0x6c, 0x6f, 0x61,
229 | 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2e,
230 | 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66,
231 | 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
232 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
233 | 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20,
234 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
235 | 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x3a, 0x20, 0x63,
236 | 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27,
237 | 0x68, 0x74, 0x74, 0x70, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20,
238 | 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x74, 0x68,
239 | 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x0a,
240 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
241 | 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a,
242 | 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
243 | 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x75, 0x70, 0x6c, 0x6f,
244 | 0x61, 0x64, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c,
245 | 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x70, 0x72, 0x6f,
246 | 0x67, 0x72, 0x65, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63,
247 | 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20,
248 | 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f,
249 | 0x6e, 0x73, 0x74, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20,
250 | 0x3d, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x61,
251 | 0x64, 0x65, 0x64, 0x20, 0x2f, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e,
252 | 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x30,
253 | 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69,
254 | 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54,
255 | 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d,
256 | 0x4c, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75,
257 | 0x6e, 0x64, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x29, 0x20,
258 | 0x2b, 0x20, 0x27, 0x25, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65,
259 | 0x64, 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x77, 0x61,
260 | 0x69, 0x74, 0x2e, 0x2e, 0x2e, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
261 | 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67,
262 | 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f,
263 | 0x77, 0x2e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67,
264 | 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20,
265 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
266 | 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
267 | 0x74, 0x65, 0x28, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x20,
268 | 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64,
269 | 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70,
270 | 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41,
271 | 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x6d, 0x61,
272 | 0x78, 0x27, 0x2c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x6f,
273 | 0x74, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29,
274 | 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65,
275 | 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c,
276 | 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x6c, 0x6f, 0x61,
277 | 0x64, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
278 | 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
279 | 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
280 | 0x73, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75,
281 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
282 | 0x73, 0x42, 0x61, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
283 | 0x20, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x73,
284 | 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28,
285 | 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x20, 0x30, 0x29, 0x3b,
286 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f,
287 | 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74,
288 | 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x6d, 0x61, 0x78, 0x27,
289 | 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29,
290 | 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65,
291 | 0x73, 0x74, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x27, 0x50, 0x4f, 0x53,
292 | 0x54, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x3b, 0x0a, 0x20, 0x20,
293 | 0x20, 0x20, 0x2f, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
294 | 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c,
295 | 0x20, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x31, 0x39, 0x32,
296 | 0x2e, 0x31, 0x36, 0x38, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x37, 0x2f, 0x27,
297 | 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x72,
298 | 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e,
299 | 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61,
300 | 0x67, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75,
301 | 0x65, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
302 | 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x27, 0x41, 0x75,
303 | 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27,
304 | 0x2c, 0x20, 0x27, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x27, 0x20, 0x2b,
305 | 0x20, 0x62, 0x74, 0x6f, 0x61, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
306 | 0x2e, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x76, 0x61,
307 | 0x6c, 0x75, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2b, 0x20,
308 | 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77,
309 | 0x6f, 0x72, 0x64, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x3b,
310 | 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20,
311 | 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f,
312 | 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,
313 | 0x69, 0x6f, 0x6e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5b, 0x30, 0x5d,
314 | 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
315 | 0x74, 0x2e, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
316 | 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x27, 0x46, 0x69, 0x6c, 0x65,
317 | 0x53, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e,
318 | 0x73, 0x69, 0x7a, 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20,
319 | 0x6c, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6e,
320 | 0x65, 0x77, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x28,
321 | 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e,
322 | 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x66, 0x69, 0x6c, 0x65,
323 | 0x27, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20,
324 | 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74,
325 | 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e,
326 | 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x49, 0x6e,
327 | 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x20, 0x75,
328 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x2e, 0x2e, 0x27, 0x3b, 0x0a, 0x0a,
329 | 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
330 | 0x73, 0x65, 0x6e, 0x64, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a,
331 | 0x7d, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
332 | 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79,
333 | 0x49, 0x64, 0x28, 0x27, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65,
334 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x61, 0x64, 0x64, 0x45,
335 | 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72,
336 | 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66,
337 | 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a,
338 | 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75,
339 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74,
340 | 0x74, 0x6f, 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64,
341 | 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65,
342 | 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3f, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65,
343 | 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20,
344 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74,
345 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72,
346 | 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x26, 0x6e, 0x62, 0x73,
347 | 0x70, 0x3b, 0x27, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x64, 0x6f,
348 | 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c,
349 | 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x75,
350 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74,
351 | 0x74, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65,
352 | 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27,
353 | 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63,
354 | 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b,
355 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70,
356 | 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c,
357 | 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69,
358 | 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d,
359 | 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77,
360 | 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65,
361 | 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61,
362 | 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b,
363 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70,
364 | 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a,
365 | 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c,
366 | 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d,
367 | 0x6c, 0x3e, 0x0a
368 | };
369 | unsigned int upload_htm_len = 4383;
370 |
--------------------------------------------------------------------------------