diff --git a/hwe/install.php b/hwe/install.php
index b88aba19..cc1fdf20 100644
--- a/hwe/install.php
+++ b/hwe/install.php
@@ -30,9 +30,6 @@ if($session->userGrade < 5 && !$allowReset){
=WebUtil::printJS('../d_shared/common_path.js')?>
=WebUtil::printJS('js/vendors.js')?>
-=WebUtil::printJS('js/common.js')?>
-=WebUtil::printJS('../e_lib/jquery.validate.min.js')?>
-
=WebUtil::printJS('js/install.js')?>
=WebUtil::printCSS('css/normalize.css')?>
=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
diff --git a/hwe/ts/install.ts b/hwe/ts/install.ts
new file mode 100644
index 00000000..a6335d26
--- /dev/null
+++ b/hwe/ts/install.ts
@@ -0,0 +1,251 @@
+import $ from "jquery";
+import 'bootstrap';
+import { setAxiosXMLHttpRequest } from "./util/setAxiosXMLHttpRequest";
+import axios from "axios";
+import { InvalidResponse } from "./defs";
+import { Rules } from "async-validator";
+import { isArray } from "lodash";
+import { JQValidateForm } from "./util/jqValidateForm";
+import { unwrap } from "./util";
+import { convertFormData } from "./util/convertFormData";
+
+type ResponseScenarioItem = {
+ year?: number,
+ title: string,
+ npc_cnt: number,
+ npcEx_cnt: number,
+ npcNeutral_cnt: number,
+ nation: Record
+}
+
+type ExpandedScenarioItem = ResponseScenarioItem & {
+ category: string,
+ idx: string,
+ year: number,
+}
+
+type ResponseScenario = {
+ result: true,
+ scenario: Record
+}
+
+async function loadScenarios() {
+
+ let result: InvalidResponse | ResponseScenario;
+ try {
+ const response = await axios({
+ url: 'j_load_scenarios.php',
+ method: 'post',
+ responseType: 'json'
+ });
+ result = response.data;
+ }
+ catch (e) {
+ alert(`시나리오를 불러오는데 실패했습니다.: ${e}`);
+ return;
+ }
+
+ if (!result.result) {
+ alert(result.reason);
+ return;
+ }
+
+ const list: Record> = {};
+ const pat = /【(.*?)[0-9\-_.a-zA-Z]*】/;
+
+ for (const [idx, value] of Object.entries(result.scenario)) {
+ const title = value.title || "-";
+ const categoryRes = pat.exec(title);
+ const category = categoryRes ? categoryRes[1] : '-';
+
+ if (!(category in list)) {
+ list[category] = {};
+ }
+
+ list[category][idx] = {
+ ...value,
+ title: title,
+ category: category,
+ idx: idx,
+ year: value.year ?? 180
+ };
+ }
+
+
+ const $select = $('#scenario_sel');
+ for (const [category, items] of Object.entries(list)) {
+ const $optgroup = $('