From b7bed6a59c9741995237c262601db78f3737d6d6 Mon Sep 17 00:00:00 2001 From: Pidgey <35320204+PidgeyThePirate@users.noreply.github.com> Date: Wed, 2 Oct 2019 16:53:46 +1000 Subject: [PATCH 01/48] NO_DNA humans can no longer husk. --- code/modules/mob/living/carbon/human/death.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 4ceedc5b49c..d95badbbb01 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -158,10 +158,14 @@ return /mob/living/carbon/human/proc/ChangeToHusk() - var/obj/item/organ/external/head/H = bodyparts_by_name["head"] + + // If the target has no DNA to begin with, its DNA can't be damaged beyond repair. + if(NO_DNA in dna.species.species_traits) + return if(HUSK in mutations) return + var/obj/item/organ/external/head/H = bodyparts_by_name["head"] if(istype(H)) H.disfigured = TRUE //makes them unknown without fucking up other stuff like admintools if(H.f_style) From e2fdc0472a37d34d50e66da06088aca9e36ca209 Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Mon, 21 Oct 2019 14:29:10 -0400 Subject: [PATCH 02/48] Adds vscode extension recommendations for highlighting and langserv --- .gitignore | 3 ++- .vscode/extensions.json | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.gitignore b/.gitignore index a4634f3fc84..d9f4a187400 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ data/ *.db stddef.dm .atom-build.json -*.vscode/* \ No newline at end of file +*.vscode/* +!/.vscode/extensions.json \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000000..9099488143b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "gbasood.byond-dm-language-support", + "platymuus.dm-langclient" + ] +} From 9061742db56fe277816e2588aa05640a4d69219c Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 27 Oct 2019 23:16:42 -0700 Subject: [PATCH 03/48] Dead mice squeak no tails --- code/datums/components/squeak.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index e5b948f4f26..aca505e6a03 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -41,6 +41,10 @@ use_delay = use_delay_override /datum/component/squeak/proc/play_squeak() + if(ismob(parent)) + var/mob/M = parent + if(M.stat == DEAD) + return if(prob(squeak_chance)) if(!override_squeak_sounds) playsound(parent, pickweight(default_squeak_sounds), volume, 1, -1) From 3d638b8aec2834e8d2b93905208ec0f9e104c6a2 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 27 Oct 2019 23:40:29 -0700 Subject: [PATCH 04/48] Fixes held/carried mice eating cables --- code/modules/mob/living/simple_animal/friendly/mouse.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 3ca0c840efd..d6f38d33268 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -41,7 +41,7 @@ AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100) /mob/living/simple_animal/mouse/handle_automated_action() - if(prob(chew_probability)) + if(prob(chew_probability) && isturf(loc)) var/turf/simulated/floor/F = get_turf(src) if(istype(F) && !F.intact) var/obj/structure/cable/C = locate() in F From a24013be5b9cea17bcad4cb904cfdfdafe3d934d Mon Sep 17 00:00:00 2001 From: moxian Date: Mon, 28 Oct 2019 10:19:52 +0000 Subject: [PATCH 05/48] Fix stacks being consumed by redspace. Fixes #12606 --- code/game/objects/items/stacks/stack.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index a4141a7a58a..793eb1062d5 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -296,6 +296,8 @@ else return ..() +// Returns TRUE if the stack amount is zero. +// Also qdels the stack gracefully if it is. /obj/item/stack/proc/zero_amount() if(amount < 1) if(isrobot(loc)) @@ -305,8 +307,9 @@ if(ismob(loc)) var/mob/living/L = loc // At this stage, stack code is so horrible and atrocious, I wouldn't be all surprised ghosts can somehow have stacks. If this happens, then the world deserves to burn. L.unEquip(src, TRUE) - qdel(src) - return TRUE + if(amount < 1) // check again. Dropping the stuff could have incresed the amount in src (somehow...) + qdel(src) + return TRUE return FALSE /obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible From 4fab6f14e669f358c5a7ce91680f99c9f4446d1b Mon Sep 17 00:00:00 2001 From: moxian Date: Mon, 28 Oct 2019 10:34:47 +0000 Subject: [PATCH 06/48] Add comment on why (I think) the stack fix happens to work. --- code/game/objects/items/stacks/stack.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 793eb1062d5..0d864492266 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -307,7 +307,10 @@ if(ismob(loc)) var/mob/living/L = loc // At this stage, stack code is so horrible and atrocious, I wouldn't be all surprised ghosts can somehow have stacks. If this happens, then the world deserves to burn. L.unEquip(src, TRUE) - if(amount < 1) // check again. Dropping the stuff could have incresed the amount in src (somehow...) + if(amount < 1) + // If you stand on top of a stack, and drop a - different - 0-amount stack on the floor, + // the two get merged, so the amount of items in the stack can increase from the 0 that it had before. + // Check the amount again, to be sure we're not qdeling healthy stacks. qdel(src) return TRUE return FALSE From 6520b32e56d6a5707a422b3be16a118154a3a107 Mon Sep 17 00:00:00 2001 From: moxian Date: Thu, 31 Oct 2019 03:42:04 +0000 Subject: [PATCH 07/48] Fix a potential minor logic error. If the stack has no items left, we drop it, it gets merged with another stack on the ground, then we should still report the stack as having zero items. Otherwise there's a potential to accidentally use items on the ground once you run out of items in hand, which is slightly surprising. --- code/game/objects/items/stacks/stack.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 0d864492266..1db390a2c91 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -312,7 +312,7 @@ // the two get merged, so the amount of items in the stack can increase from the 0 that it had before. // Check the amount again, to be sure we're not qdeling healthy stacks. qdel(src) - return TRUE + return TRUE return FALSE /obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible From 692301efb6aae1b061a2646c742afb246a235eaa Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Wed, 8 Jan 2020 09:02:52 -0600 Subject: [PATCH 08/48] Fixes a runtime with revenants --- code/_onclick/observer.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 5f0c94ecee6..8397a689089 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -61,6 +61,8 @@ // health + cyborg analyzer for ghosts /mob/living/attack_ghost(mob/dead/observer/user) + if(!istype(user)) + return if(user.client && user.health_scan) if(issilicon(src) || ismachine(src)) robot_healthscan(user, src) From f0b50ab60c89f02838f787adb3d8d15b01c87424 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sat, 11 Jan 2020 21:24:08 -0600 Subject: [PATCH 09/48] explanation comment --- code/_onclick/observer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 8397a689089..460bc0193f6 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -61,7 +61,7 @@ // health + cyborg analyzer for ghosts /mob/living/attack_ghost(mob/dead/observer/user) - if(!istype(user)) + if(!istype(user)) // Make sure user is actually an observer. Revenents also use attack_ghost, but do not have the health_scan var. return if(user.client && user.health_scan) if(issilicon(src) || ismachine(src)) From a4a79c485b26f97b01350e1682582971bb18e8af Mon Sep 17 00:00:00 2001 From: ppi13 Date: Thu, 23 Jan 2020 23:58:28 +0100 Subject: [PATCH 10/48] Fixes Unknown game mode probability --- config/example/config.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/config/example/config.txt b/config/example/config.txt index f4de07f581f..18c280f6141 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -114,7 +114,6 @@ PROBABILITY RAGINMAGES 0 PROBABILITY METEOR 0 PROBABILITY HEIST 0 PROBABILITY VAMPIRE 3 -PROBABILITY NATIONS 0 PROBABILITY EXTENDED 2 PROBABILITY NUCLEAR 3 PROBABILITY ABDUCTION 0 From 42d88394e2574ce96b28a7b0a97dffee599ead64 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 29 Jan 2020 20:21:03 -0800 Subject: [PATCH 11/48] DB update for utf8 --- SQL/paradise_schema.sql | 50 ++++++++++++++++---------------- SQL/paradise_schema_prefixed.sql | 50 ++++++++++++++++---------------- SQL/updates/10-11.sql | 41 ++++++++++++++++++++++++++ code/__DEFINES/misc.dm | 2 +- 4 files changed, 92 insertions(+), 51 deletions(-) create mode 100644 SQL/updates/10-11.sql diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 01f83ba0194..837f8f440d6 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -97,7 +97,7 @@ CREATE TABLE `customuseritems` ( `cuiPropAdjust` text, `cuiJobMask` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=56 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=56 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -124,7 +124,7 @@ CREATE TABLE `death` ( `fireloss` int(11) NOT NULL, `oxyloss` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=166546 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=166546 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -160,7 +160,7 @@ CREATE TABLE `admin` ( `level` int(2) NOT NULL DEFAULT '0', `flags` int(16) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=latin1; +) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -177,7 +177,7 @@ CREATE TABLE `admin_log` ( `adminip` varchar(18) NOT NULL, `log` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -212,7 +212,7 @@ CREATE TABLE `ban` ( `unbanned_computerid` varchar(32) DEFAULT NULL, `unbanned_ip` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10685 DEFAULT CHARSET=latin1; +) ENGINE=InnoDB AUTO_INCREMENT=10685 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -230,7 +230,7 @@ CREATE TABLE `feedback` ( `var_value` int(16) DEFAULT NULL, `details` text, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=257638 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=257638 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -272,7 +272,7 @@ CREATE TABLE `player` ( `parallax` tinyint(1) DEFAULT '8', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) -) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; +) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -293,7 +293,7 @@ CREATE TABLE `poll_option` ( `descmid` varchar(32) DEFAULT NULL, `descmax` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -314,7 +314,7 @@ CREATE TABLE `poll_question` ( `createdby_ckey` varchar(45) NULL DEFAULT NULL, `createdby_ip` varchar(45) NULL DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -333,7 +333,7 @@ CREATE TABLE `poll_textreply` ( `replytext` text NOT NULL, `adminrank` varchar(32) NOT NULL DEFAULT 'Player', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -353,7 +353,7 @@ CREATE TABLE `poll_vote` ( `adminrank` varchar(32) NOT NULL, `rating` int(2) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -369,7 +369,7 @@ CREATE TABLE `privacy` ( `consent` bit(1) NOT NULL, PRIMARY KEY (`ckey`), UNIQUE KEY `ckey_UNIQUE` (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -391,7 +391,7 @@ CREATE TABLE `karma` ( `spenderip` text NOT NULL, `time` datetime NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=73614 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=73614 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -407,7 +407,7 @@ CREATE TABLE `karmatotals` ( `karma` int(11) NOT NULL, `karmaspent` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=6765 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=6765 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -426,7 +426,7 @@ CREATE TABLE `library` ( `ckey` varchar(45) NOT NULL, `flagged` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=929 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=929 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -442,7 +442,7 @@ CREATE TABLE `legacy_population` ( `admincount` int(11) DEFAULT NULL, `time` datetime NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=2550 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=2550 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -458,7 +458,7 @@ CREATE TABLE `whitelist` ( `job` text, `species` text, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=877 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=877 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -485,7 +485,7 @@ CREATE TABLE `watch` ( `last_editor` varchar(32), `edits` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; @@ -507,7 +507,7 @@ CREATE TABLE `notes` ( `server` varchar(50) NOT NULL, `crew_playtime` mediumint(8) UNSIGNED DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -524,7 +524,7 @@ CREATE TABLE `memo` ( `last_editor` varchar(32), `edits` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -538,7 +538,7 @@ CREATE TABLE `ipintel` ( `date` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL, `intel` real NOT NULL DEFAULT '0', PRIMARY KEY (`ip`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -551,7 +551,7 @@ CREATE TABLE `vpn_whitelist` ( `ckey` varchar(32) NOT NULL, `reason` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -564,7 +564,7 @@ CREATE TABLE `oauth_tokens` ( `ckey` varchar(32) NOT NULL, `token` varchar(32) NOT NULL, PRIMARY KEY (`token`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; @@ -580,7 +580,7 @@ CREATE TABLE `playtime_history` ( `time_living` SMALLINT NOT NULL, `time_ghost` SMALLINT NOT NULL, PRIMARY KEY (`ckey`, `date`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- @@ -594,4 +594,4 @@ CREATE TABLE `connection_log` ( `ip` varchar(32) NOT NULL, `computerid` varchar(32) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 9801c54d6f9..b43141f6784 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -97,7 +97,7 @@ CREATE TABLE `SS13_customuseritems` ( `cuiPropAdjust` text, `cuiJobMask` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=56 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=56 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -124,7 +124,7 @@ CREATE TABLE `SS13_death` ( `fireloss` int(11) NOT NULL, `oxyloss` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=166546 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=166546 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -159,7 +159,7 @@ CREATE TABLE `SS13_admin` ( `level` int(2) NOT NULL DEFAULT '0', `flags` int(16) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=latin1; +) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -176,7 +176,7 @@ CREATE TABLE `SS13_admin_log` ( `adminip` varchar(18) NOT NULL, `log` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -211,7 +211,7 @@ CREATE TABLE `SS13_ban` ( `unbanned_computerid` varchar(32) DEFAULT NULL, `unbanned_ip` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10685 DEFAULT CHARSET=latin1; +) ENGINE=InnoDB AUTO_INCREMENT=10685 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -229,7 +229,7 @@ CREATE TABLE `SS13_feedback` ( `var_value` int(16) DEFAULT NULL, `details` text, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=257638 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=257638 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -271,7 +271,7 @@ CREATE TABLE `SS13_player` ( `parallax` tinyint(1) DEFAULT '8', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) -) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; +) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -292,7 +292,7 @@ CREATE TABLE `SS13_poll_option` ( `descmid` varchar(32) DEFAULT NULL, `descmax` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -313,7 +313,7 @@ CREATE TABLE `SS13_poll_question` ( `createdby_ckey` varchar(45) NULL DEFAULT NULL, `createdby_ip` varchar(45) NULL DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -332,7 +332,7 @@ CREATE TABLE `SS13_poll_textreply` ( `replytext` text NOT NULL, `adminrank` varchar(32) NOT NULL DEFAULT 'Player', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -352,7 +352,7 @@ CREATE TABLE `SS13_poll_vote` ( `adminrank` varchar(32) NOT NULL, `rating` int(2) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -368,7 +368,7 @@ CREATE TABLE `ss13_privacy` ( `consent` bit(1) NOT NULL, PRIMARY KEY (`ckey`), UNIQUE KEY `ckey_UNIQUE` (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -390,7 +390,7 @@ CREATE TABLE `SS13_karma` ( `spenderip` text NOT NULL, `time` datetime NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=73614 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=73614 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -406,7 +406,7 @@ CREATE TABLE `SS13_karmatotals` ( `karma` int(11) NOT NULL, `karmaspent` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=6765 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=6765 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -425,7 +425,7 @@ CREATE TABLE `SS13_library` ( `ckey` varchar(45) NOT NULL, `flagged` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=929 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=929 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -441,7 +441,7 @@ CREATE TABLE `SS13_legacy_population` ( `admincount` int(11) DEFAULT NULL, `time` datetime NOT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=2550 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=2550 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -457,7 +457,7 @@ CREATE TABLE `SS13_whitelist` ( `job` text, `species` text, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=877 DEFAULT CHARSET=latin1; +) ENGINE=MyISAM AUTO_INCREMENT=877 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -484,7 +484,7 @@ CREATE TABLE `SS13_watch` ( `last_editor` varchar(32), `edits` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; @@ -506,7 +506,7 @@ CREATE TABLE `SS13_notes` ( `server` varchar(50) NOT NULL, `crew_playtime` mediumint(8) UNSIGNED DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -523,7 +523,7 @@ CREATE TABLE `SS13_memo` ( `last_editor` varchar(32), `edits` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -537,7 +537,7 @@ CREATE TABLE `SS13_ipintel` ( `date` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL, `intel` real NOT NULL DEFAULT '0', PRIMARY key (`ip`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -550,7 +550,7 @@ CREATE TABLE `SS13_vpn_whitelist` ( `ckey` varchar(32) NOT NULL, `reason` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -563,7 +563,7 @@ CREATE TABLE `SS13_oauth_tokens` ( `ckey` varchar(32) NOT NULL, `token` varchar(32) NOT NULL, PRIMARY KEY (`token`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -578,7 +578,7 @@ CREATE TABLE `SS13_playtime_history` ( `time_living` SMALLINT NOT NULL, `time_ghost` SMALLINT NOT NULL, PRIMARY KEY (`ckey`, `date`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -- Table structure for table `SS13_connection_log` @@ -591,4 +591,4 @@ CREATE TABLE `SS13_connection_log` ( `ip` varchar(32) NOT NULL, `computerid` varchar(32) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file diff --git a/SQL/updates/10-11.sql b/SQL/updates/10-11.sql new file mode 100644 index 00000000000..7d83458c4b2 --- /dev/null +++ b/SQL/updates/10-11.sql @@ -0,0 +1,41 @@ +# Updating SQL from ver 10 to 11 +# Changes tables from latin1 to utf8mb4 +# Based on: https://github.com/BeeStation/BeeStation-Hornet/pull/1074/files +# -Kyet + +# Generation (not necessary to run unless your DB has extra tables) +SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") AS ExecuteTheString +FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_SCHEMA="paradise" +AND TABLE_TYPE="BASE TABLE"; + +# Actual table conversion stuff +ALTER TABLE paradise.admin CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.admin_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.ban CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.characters CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.connection_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.customuseritems CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.death CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.donators CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.erro_privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.feedback CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.ipintel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.karma CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.karmatotals CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.legacy_population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.library CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.memo CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.notes CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.oauth_tokens CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.player CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.playtime_history CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.poll_option CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.poll_question CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.poll_textreply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.poll_vote CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.vpn_whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.watch CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE paradise.whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6e1fa5e01fd..51b895ff12d 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -319,7 +319,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 10 +#define SQL_VERSION 11 // Vending machine stuff #define CAT_NORMAL 1 From 3479297bdcda3553a6e5c1a0fec2e5e4007d7566 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 29 Jan 2020 23:29:08 -0800 Subject: [PATCH 12/48] db version 11 --- config/example/dbconfig.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 654a7e348d5..b1113fb625d 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 10 +DB_VERSION 11 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. From 244d4f08247a15267823c39e940ec0eb010ca1a2 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 29 Jan 2020 23:30:27 -0800 Subject: [PATCH 13/48] change update values to be copy-pastable with default db name --- SQL/updates/10-11.sql | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/SQL/updates/10-11.sql b/SQL/updates/10-11.sql index 7d83458c4b2..9564d3efaad 100644 --- a/SQL/updates/10-11.sql +++ b/SQL/updates/10-11.sql @@ -6,36 +6,36 @@ # Generation (not necessary to run unless your DB has extra tables) SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") AS ExecuteTheString FROM INFORMATION_SCHEMA.TABLES -WHERE TABLE_SCHEMA="paradise" +WHERE TABLE_SCHEMA="feedback" AND TABLE_TYPE="BASE TABLE"; # Actual table conversion stuff -ALTER TABLE paradise.admin CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.admin_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.ban CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.characters CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.connection_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.customuseritems CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.death CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.donators CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.erro_privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.feedback CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.ipintel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.karma CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.karmatotals CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.legacy_population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.library CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.memo CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.notes CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.oauth_tokens CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.player CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.playtime_history CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.poll_option CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.poll_question CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.poll_textreply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.poll_vote CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.vpn_whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.watch CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -ALTER TABLE paradise.whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; \ No newline at end of file +ALTER TABLE feedback.admin CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.admin_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.ban CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.characters CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.connection_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.customuseritems CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.death CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.donators CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.erro_privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.feedback CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.ipintel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.karma CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.karmatotals CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.legacy_population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.library CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.memo CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.notes CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.oauth_tokens CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.player CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.playtime_history CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.poll_option CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.poll_question CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.poll_textreply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.poll_vote CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.population CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.privacy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.vpn_whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.watch CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE feedback.whitelist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; \ No newline at end of file From 2ee7893c71a504f2b2a2bcb7a5e1ac75e1f7e9a6 Mon Sep 17 00:00:00 2001 From: Eman Date: Thu, 30 Jan 2020 21:24:44 +0100 Subject: [PATCH 14/48] Readds otherthing-dead The death sprite for "creature" was removed somehow in my last commit to animal.dmi. This readds it --- icons/mob/animal.dmi | Bin 303466 -> 305032 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index c0c259af7ac04a0f9b94fd0f8c66c3e313b08d73..549304a43f31e3267d84aa26d82082a526e8b976 100644 GIT binary patch delta 23409 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 K7+0uc7xI5>-i^2b delta 21831 zcmZ5{1y~i)x9`wMqjW1$0)ljhN+>1LASK-?Da-*xKw40w5fGH_hC_oO-QC@t=bSg( z|GoFU@9po~9L|}Uy=L}a@ms&WCUoHbcI*9^$7l<&EX*KVT2;6`QI5zDxf{HI_jX(l zzgR0CQ*DiS#)gx3@onXFxbw0f9!&(3$ql8)p_)*rbAE5ckr0YxoP+nT&=i->iC+F| zo;ZiH{&jv1O%}wJbiW(VSBGO8p7y5*f%I=Zb>_+0CsXxn3QN$h4pN-K>$%V`1s85S zF_N4mpue`sNeWP%ieN1{kgb1v=<1a%rT51V^Pj>xS^7dfHk0zOt3`@q9w>WX$LXhF z1%2b!2f?WQd7*jynvbuVZ<{F^T=XZcdXq0c09@olb5eW4n&ov>Z}redO)8^XI%za z9@M?Mon>i;PHV9&VZ^_>ZqI;Wq0>}Oo=Rt;)aJ+(b^@`on$mV!{pbkcCumjZ2Uux= zpyOi)3v%aZTkU2^Eh4(KjwgU{S|c`*G1g*x{rZQOQuV}J@xQq0QMA^Av&-uGg0oSg z_9TWXCd|RROtgRWaHbT!#k%F649N)5}VBKpheV6!d&1uy!)2`*eO~3ZRPh$g=@;XP@%ti6p}jmk?7lwY(>+V zSM)z!0(I@Mxg64d28=u(ZKE*l`&KRxjXRp8K(yKx^KC75qlZb%Lh##Kt`&t_ReA}9 zej-DOhPIoK*LzV)v}qq2HtuE@o%W*94?N}lR@xOk@m4DL=EoKXCLH=7^|Y@oaDg&i z)7V+%-kOgh?P!$Pb(GCwT`hnPp5UmCgHKT%#ZY&GIuFzjf}rnEcM3`}z;D+-ZI$o(Zht@u7XEuaUsrrO3a7pNRnR|)262FX~c-~Zs6VP=@ zJ)^gD$n0hMs;&CnOeg8H<)4cRQJ&27(ys3*%QV>-Je1z2KKigcY7`bX>(#?GK&Nt= z-JnTVY{*0ROe&tE_Oqf!uFieQBz1gVgI?1o>=NVledDpM81~$MK;qA@uV4SxWx|O( zOj+ZyqOCI3({=GP-I}OBE`}|e1W?|e%eGG}x2OK``e)^*&X;_0hhfXZNBF+}!Yi?E zue3tv3pLTE>k(gcv=6N{U?Qt>D_0%H!ANIfJi@|1CdK4Sv{;?ke%)hyR{0j4Pr;3H z=8vISyhx+tW|a=^MR1~(Jmr}Ei2zv$h5ci#$PX&M=%B#%q#GBVxY-2A{5Cs;dMR$C zj*{?M7l~A~$~PKsK;u`ZEp8t6G)E#UnUlKm$Q6G5$wTE8k1|o$@)M!yeTJrB>&~FR zkE@$+OhWm+bOcc8pM?pf5X1IQ0TcGB~dBmXo*HV>;U#4I8Fmq=11%*R8 z7+yE@OJ-Hj^dGkAnk}=W4B6K1qlo-0T|P5DBBkpNc3KUUR`}GK+B0P)yy13?*swdk zUU5LuB5o~}5^Xe;j|k2Mt5Ri}SrRp)H^EkP!Ea#u%nf83LhF9?`CK-KK4jU?JGnwyjNm{Bskj<%0#aJ3YWw$+0+!6Np?EMCD{XX`a zj|F=oN!vR^^Rr)`?2rN?*rM0P>zC)JhUJtpa@D_RJBmL>B>Lq7@9Nwcif&H`YuvXa z%;%9xA5lxfHT$0MmcEIBHYH-or~)_EM{VZdLo7K7Joh~cv9dvHzj ze|0-FfNSUTBTmMwnPI~28T|9}v(m0aI{CmD(Gpi%)$#+s_#LEBYdTthqiwA5uR!|uoU#}7v2m03Tm~Lm#@-G|gym;wv|!dn}9KAfJy0PTbSfs0}>fsYtZ%6Uhsb^O6Df;BrJM z$4EB4$I=_(Zb|!JPQ##4a#NW!6W9r-LcPC@JJ%y&3`x7xYz>@zUl)4` zpIcj>d(eHJKxyW>%ZIh;F*$Po6gJzYea(j0sN9M|Od&S40niTxH!yMlcWm2s)%LqO zP|1-|$MWy$R%t3Kx?|7Rxus3!3xyX`ag4RjQ6VTe!Kr&?+i2hhKv$5L-xeB*s~F@n zG&n>65Zd)t{mFq}kYn0^ZdgFZ^%*;X&mOzS+&?3(UnQ_doXlL>kKJ6}b`bNr83}Fg z*Z~0HhcWhPozDeZlrf+jtbe^<`{m<^fU|Bj+j!MjUJ107<&`17Z8E^UKfF8UyP+@t zx}iTg&30aZd`43fHvfjj$_b@(vsM0l*SIu1vP7xBImX!=|Am?ktq|CVkOR_B&k7Tt z`fqX^KTWzgxjjmJJ1=+Qe=hH9?<0~b)~V`0K<@aK&a`a#RWbN+_=d?4t2U%Uwpt}+ zL6q~L-7PqIcRx#mbn4X`wQb*$3r1(<2iYHD0^^9{NR#h(uXwPKzYR~n0OWIF*JTI# z#HdrN9eK4XaT-3sr*v-r^y)6rOrk`U!jQ4dj9a1M{Gy}o857t(ADXvEX=jTL%Uv%= zkf%5Hqmhnn^c!G^ClBr1V``-eu2nbVY2ye`s{N931Et1X3^_?TcI=45pW^fJ-f85yB_<7e~DF_MNRkuBYk3$ke|-b1)i(2Jw4n4()7v* zs?vxADunJl3S_-Ld9kk`rJxUPm_VKohEz9I|JjZkP?UtJXr;&7=UuOs*Zp9fy;*j3 zPb&kL@-vGECz*?XXfYPbjGy8k?gjYe^5t5|24boay|=e^fEDIqE~4A-lS=Ny2xV^R}fTnqV z)|XZO&?W?QeEC`P%usF^L#;q&4D=*_l~$pY*LQrL5G$ZSbGqs}Zb7+h;+G3)$MERi z_QQ(3j1hj=J;m1yVX!#n^HAn@Gs6)734Ur zFfbNf>+uC?OAwC+x9h8GDyLZ&f)iP=JQA6TrWrQ}Zhz>#T{Lm?+&v)j0>zjPj@-9Z z90mQW9GG{DvH3bD5rak3>E9EoFLdymO8(0|gdZKyVL04AU<*_|@eo3Wtt{^!xk>nc zwH;_8p3HS(WG`GluGffAjWo#Lt2o6hP~!HaLg`x#jxcd-!4Q|m3HtlZZE;v{CIZA4 zw_pujBY%Wz$1bO;B1=FxjUokLK-{8rGje=m3b<#+F}xZ5r*wQh)voHi z4^-w}J@i_k^nB=kXyWeCBXtV}h318RIBnxwp5udekyYxABG0l3)ey{#JM&24{n|B4 zU4wjeZNqy8LC8@`U?`l`C=K^YAdmqtKohXP-p+DJ&XeLm0|$YOc~hHMJ44R zi%(d_+R?>(>Fhe%hXP| z(_-8>MrpN2i|#Ix!0XlIb?vzDZZ)Gg0m=E7G`oo0mJu|<>q|!TDiiW(1Db96SL(Ku}7qMrv^;mBGuP|`UE11y7&QO^2Y>OFNju5aygBiPhjM5O;6 zt2f*dpX=|$F)H!Bw3_+Jc&g`RfFsa;xp4yNf@n2^|M%YH+xNFK3Z&jv`8(98Q@{Sq z4WG+Oyq2SRw}b_9$M5NV=q6q8G$=sPR2~h8KQK~xYP<#8b-KX%@2iWPPbjd#%|amC z2hQo2JEK?rWTF2G5=QSw;q!q64}g}8;oeom_0Jf5v?`f?%-=lHF6f4pDk5&%)Ly=4 zy`eO;K@(~ISdER1HG9Foy6cf1w*#UH%i#x2?L0ZZFn~0~4y`Wl#uEX3+LB*2xCfrr zl+tPSmUUMl#;~O>PIrgw&;$`cmS0@9@ze2ue zm0WU?IV`~L|FuP5^}GH)X{tyS7m;ab%yCd3cp?5;`Q#B_c0OM@i5>N4Pa#LyR?)wT zGJJW_+KYKg>+iMKu`X9u)J)nxJ#Kh+igX03xstrDM$2&`d8m_PKY@WxaIdoB+NVG{ z6Axy}JLv8h(KHLWXS9DQd~XO}Z=6vd=Vb(t$H(O{Q3CJTU^fhg0o1+gW*cA5yo6Aq zvvIzj!fQbovfT?UdoGBe&4BY9~RvxuuLXiWTG3HriPUfAnX_ zj!P>SF(~@aWo?|kEGF;nacWW;O;Vb#K*&AwGN2*{O$gilQ?1}0Fp%B)b_mr2`zp8zce1oMyF{* zozIyVEM9Ia*um){C|CnaGc}wh-uIu3oF282j|p|&#oxW3q<6>3=-FHL>-ZqmYAS1n zMlg8$U?wn-I~}7Ljz*XMVg4WYgzi&)7f4|4op>>TA5h-fsef{ZO!gtY0kfmZK40;F z{~Pr2KzLzgNoxQdNb|aKc{e1E4LGaq&jBz<+p@9>9@;p5I&tS09E`))8`2J%wmPLg z+m~;CwdOm|z|ZY?Og%%~hylV7|sHjd2l1p}{iDbM$$BeKimTrN2CA9kSkexD73{K3yw%Z^>YSv0Y5mLQCWU@Y3C%) zr%bW69$TL6O-lVX%v^BpX1iR5QF^IFNT_*w686QGvn`=4M_yy9;??R4c zWFoGy+5Gv02ChAXWD{?_eZhMX71G=oLm?2Hxy0x|_7Arj7Sa@B*AYr`Oh9qyMFe=~ zIy?<=+*_Wdtz-xy^+F2jcNIMi?dCJZ{*r7Io&a`5z_OSWLvV0D_ zw7Nh(i0L`4!04Xg+*hGLG-tX#q^PCV0}j>X(411IdW$ zeIIn4Usk5QorD0iiugH1N^L3pR^Z~bo~TF-{Qie7LH@ZAAoO-^ir*g#kYn7H(NUx1 zvowYoKdnI@;L`hymrQ=}u@+0N{xz@NHC9Q-^c&Oi_eL*2x38!P^`gphtTL=8bgl*a z?>@Sd(tcJXq?n)q_ER-zkldxh`ZNI0oGgH@yStoyS}V}AX*LjqM!g&SP6%~5&z;OK zQj=)F=8m1Y@j|T#k9i6vAg)u;Wj1h&6{MiB{7qcPWbCWfy%%?EL%Q2j%_ip@*odNK^lFjCxhTBlUjI?4 zd#5Gejh)V{8fRf{H|6ThIaL%1%rF%P?z$)7%?wh)-`M$N8kg**+@`Ak{G~5#J6fg% z6JOX7&t0mExcG8((Dcqudre%E3hp=plJy-8^&Mz|IR#RFAH`w;Y~(O z$JkdbCQ8o*nU4G#L@@?~AjrKFn)O1V2gqFt;|Ztyk=7$PZ=D$95xL1hJ}FnPp^woKdmS69H{%AygfNR zg$7*y?Ef6xbs@&(Uei|SL1>3@EvAifw_TkpFRBdxTr=z`=-7CUv#Sm`jbz%!Cn$5Qw6z|KD8HxZxSfHE(W#!di%zAKp8NU2|q)6mz7WC1$g8^ zF(W3iPg?um)TQSK6ntFJ-QddZc(2GzBV%iH^Pm0Ase{$6PfeKHuTHgInKGdJav~W` zrc;_8VKtMRHTd#-N(!BvbiuB^pXSZGUS!3CZEnX(JM<}J1xO$uP3RegzB>0J{dIG` z`eGE}b0(d2vu7AAIg(P7k%Lak|%U&s2wpt=7k}~evJ(p#jWL2VDZRc zA2ww#FJ~zD_H1o-d<}ofGkL2=NQo9ufE8Gn3gE{=xCtg7FDS;51lb(xF4VlPoDOQ*QU44tnr$I|M4669VZShv&~`SD>EiASqOb~E!YyHU z7ehu)4(rKwo~cms(IvMh0NmZg-ObQ!ulgDzXT)o^=A}*TRE8b^yyv?|xZ$`sbuR!D z5OO8f^bbwXf(C$?asV({YN)MQJhpFe1vl^t{Fkvt>GC`Gc({VxD@ZNU|E`fT7&glH zWB(w*_*36yBVDb?lH*EH?HjF3xBIwVRpNBDM-^tCIa==&gVngKx}VD?lSXj*@?TGf z>gP48C#Oou$GJn?_S!D>21KQ;)TwB=M}l?eqLJJ06XP1z zk4C;tdOM(>&k$O(#T4nud;!<~9M$*qF&uREbi@U4p>JaC+>X>)t-Z&e__L+diw$Ms zjtNm;>e~uC!Me%x1o9T6jlUeYtN!zWfI)gQJ?*EvR2j&~Iey7~p0Fq9t0wNB_Xi!u znAg{5Rpf-|Jl)NA$|%SrASWlcmUyVpPU|2PKc)U;i=a&l308o zx8Cigu$C~DlLO_jdY<$gLN^KPCSF|06XPU7kN2y_QP7Wme&aN#{)`l z6&Y!&k~n-xw66#|E5r3$u6Nf2?|c~Po!)0zn1O7vNy+|uuQ4C#-l!FgFt_b#iPP<$ z#V0pu_hQ>#>x?vV`gwL1b_~QV)wZgL=q`j!xfH7INsAYey+*M$v8xay74 z|7M1>0bx)b3kdi`J<`-PFlE@5z{)Kh`trrrJ9a5=7vyTtDCsC_^sI7hu2WzPsVpKT zZe-V4N%xu8y!G#Y*HG(%VX2b-C3BdsK8u((pT=`})^V3(CNguF(c}xG`Ow#;s{-0z zhgG~0gp5&J2`Ua7gJAu@JU5>2JfU2H$?19uwd>}t%u zqTA4HfxUj&$s>}MSx_GbcAK%R{5hXTsg2H!qU^oTGbw)oqgOpuJ3*YY0&pYR!_$Eg z!b0EsTk1RY#d|yonV-uHt1Q!*hfwQ(BB=ZJpPCTe z*}rMKQhUJb4k0vHs4z|R4JZ*Q@vtEjT~56ZZJ97JSB=>4|?gN=dT0tZ+}a@Y(c&P zy>G<4LzWafZ+l~_1#~nn>~D7cy{yVk>=*M8Hf-@xCG~A8C+Sh=Y=R^y>J3x*(yz&XJSy3DeM<&+(SS?YZQkins4+pi(w&BXDX%YITF z*C3h@k_X{k_F0zR*IBt2Wby>G_kIL?j$&=lIZs`89qk`({1Gb!QXhP5#3+Ve@VvVW zCm?th%%OnTgEAjA=`w-~$vX5IZ2C3@CC09+KUStze^Ne=y;*>jF11y%(={h!>cyLh zD1J&(M*bJT{n7AkJ(9Q~Ls`+v(Bt9Z7U=SgnS7Yq4MgF4K=>axW~VR6p!T8_SE=*5@@jx8bS$l^9!jgqdwG> zmV#s0y_o#0kMuk;IdACSyArN^bYj1da*braD$|3WUr$*QXO-9pmbt)@6Di=L1$a`Rh?)vD7b`?FL^K2;i8 zDLVdPHnW-Nh2@uKw4I-cyO=@4NChW7Ffe)FI50Gu%3k-J1~9RT+`Tn+`%Cb##*Zz^ zJ*_?Pq})YkXh91{9A5}eMut`8dI?r=J)q~EJNH^7@prfH>O(mPtz;Y{S(Xg&z2WKN z{ay1+Vrcz;wmlx$2^wFe+(mdQe1_Bl=1|%8O|iLZT2*VGEXDnrMA0~F9D5FQ(nn=) z#?{wRo_iW%AIB7ih)?dSEfyiRG>w>mJ=B@U?d2BuA3%yi6GGmECz4MhROn)F1+R3C zOBkR;#?0VI)8ZDDuWJNkXe5S>e2dwdy_a3AZilfMEw;hkC#M?4#lvwe|ESzuK$lZY zsad|od$#@F%F#%FMm@*}Tz^pOjs2dsxVUH%3mRjqs=_FU`$&8teS2%nB`4oexvzrRnsWY z$rlv5Td`@qI?5AEqc7{MwV~ZTYrQ6k0yN`@t|9d?OyEcCQymlfXReq+jx+n;Pl$oj zRRy)t)0dgw12^oC%Q~hzi^f3kxfm z0_`VnufRE1q<8+jz~(4FAL*Y$%ea9pzaVHA*|9oFg_X<0BGr>#JV0zkYvw{e$dHf{ zaR34?3fP`Cdj7|0cOh;uZ$B6jjIi-H1x-Q8S$kv2*nmU4n-@b^#I4Ata_K$TU~q5u zLcxPJdA_aZ7MQkj6V|z(JYe0v6=1pCi^5GBH6ot@v0~}RT1j_I-uc)AYTV-bx{0s7 ziG*H6zf0h5j#b5J-7;R0Wgz2dbbm>@Lwpx(L&}(yPD+&n8ihT%-T;z!@Ae#6G zZQ6QK1Mi9qS-#ktbHd7{wpywirIP`ZrXi!KN!!d(BN4z+x46qQ)xaaeukc z`oZ9X2Z_G{q+aD|w!D-T8{2g`B7M)bCc%(&LnSJkp5}C3^p}(0>~1?_1R^&JZNFRQ zZGhpLrG~6wC7K#)e^Y7_j%r1=BKLcmN5YICwHaAJzP}~rx+#|%+ibOktx#`dlTf>; z?naB1FI3MS%yz5ZO9t^&Q+UQnm*uo<^t|ORHUmG{%X!uIef&l5vrugWWh(j#McvK* zIXV{wZi>@Ci-s%EXbCCKiKT94EP$BCJ^P9zky%@H-$tgrd~N^}51y~?Ls8J+jt$G* z8>vLgG|SwRvU9Zc5Zz;3R11^=ZK)9qlBBV(qPX9*1*WE?gZ_)$KoltqN|L^d2OKvm zVLZP0^H+5qW03?6cOB{bs4eB2=d|Ggk?@k|7`D&pf%3(^>(1H)GZd6cq@Ay)7&G3+ zN-nbAwjy&A5FM9{BIj)CgIdY1wW*J22zSl~h zSsqf;dXR~UEH!-^x^2STyB+9D!?OE;^@XULjnvETp^4R&5#5%=A9MT~j7otT32kFBfF)Du8<)5@IMIlE2~;SIHe~G6%WYuTW!46#S~EJ67QHrGSqS`viamJtseS}Qn& zN2N*Lox^>{D~&eRkMM6Um}7Q%p!yF}cZ;B=ObEfHeAbxoc>%)d3}Nf5#+75yY-j0vh0z zhTJELSifLXt!@(Yr84>H`PGdQ`JHX@=71Ii^ZK6rv7O7!^rr1$wQ?&G zxiS(Y6aPx)e;bo?izF88a~d;E#s1MK>9eoKJi@j8#;OVBW}KUL0BWxeGk3yR_I|hNqMHnndd`k&|pSlI|bwY>Ce- z1mkFY+{gWTp3wEn#L%`@BXRQPd0cU3?`OscEwf@5Do5q>f?T=$jj!ohrRDm&EbfSzaN8 z5VE|(@u<5#{6 z>_d7hxsmtN7i;OAlrRn&9 z&@5B`LYh@~uw_@UxzJmNBaalN|Io547z2QwnE>#b_8_@P)Ce%RNrg|01LDWmH0;>+ z)vR|n)=x*W3>)g#K_-1%JAkHP&1u=o(sF}6{6RbEqbSlrM$!+R1FjDg!Z&b7h;*PG zLca1ouO|;_A&OX6*oQCeH;?DEPGiXr<>BKRkPIrBU}kx!?t%;>s-SbKeUxn{HdrR@ zK&g*YK+y6Y1>vkO$~~EY>xVNfo=}zR8_c4U1Hzm90Fex*hEpaJySFJu0Pa?)Xm3Y1nkQ#b@Dg zXv5(FS1~A3`k2rs^e))2M34pRw}XxRM@<1}&oraFe57#un}C?OIQa&=>K8S?(sioi z^wKYSr$8GjA!zQVy07p>9=u^g?jQPKPgTpsF`9_B+;Cqd_==l;j zMbv)v`~44;86%Hnr?rY281FmDS`ov>J?Q3~&VCpBtjXAki}{*6qJuU%qGBrd*Nr>_ z)Yf=k6U$#1{Es!8m@vKEX&e6MuW&ftWbKHj`Xm+v?sWKg+sq?stI!(}#pr^ZMcX?i zDcR~@z3piDRr@7Q5qjpX{#O(D!$tfGKi=V-TD@$4DgRLF2~FaZWps*6_}|ACmdT`y zbGsB8ak$rbG)p85j}l+v2<_$K4YR z9w*6Q&5`b&HLwd7Wg)C;llBRIL2MraeiCI-32VS8Q!ad17SZ%s-G{gC|JC<+ZonP$ zRK}+ASlZ;E-S8a&mqZigot1i@fzJS$kDBi3W@7O>hq1r&Zl$FO6DbiEsiNG2zC-sm zH@(0o70l8+*GkpDPXAEp4v4f0ST{mCYX((baaHV%&EZgd6RIr&GBY-PmW~>A6CBo! z)Kc8XvEAeK`>=iX)ZXrGZ2YSpaf0js(t|gz$X zxzijaO5qF=|xYb%u}AJ$b=bCDW=V?Z3U!dz-gSHRCWx8(eig?rW50T{D zU1}LvGFP!}RCM%fZvOhj4|t!uAn*07sGW&z)NcLh?%!p^5&weEyWM->{JXH<2|+>f zp9YeMAb$D~Fu9ajZ*Z`&;h;Y5`F0$!F%`dhDAPPI`)F*~5UqYA5vL5U=MjacsnNJ) zUCBR4^psxEf?i*+2&(F0&mBIU>qF1TLb=Z@zC?vRz!edjuOI{vQ6));0Dr4wk<3;8 zD&A$8YUxIj=T@pQ0~O{I;a8$3dr_Cnbl~X*UxOV;VaBR=*y`rA(kV*0w3DVWso_K7 zVyb?5VK9(+;VkNpnDGSwH)g)az~rF%^4NR#?73%gTro7XOoBqdE9RlM+MkO#iO_+% z@$?=}-01%zyJO~iz}GJRCutwCfs*A5 zct_Q8YN%>O#*H}!c2_&oQ!YH;*Tj!}-+ZZ9(X7>>eCXxl1=YXwP9B2dZx+S^-9|J@ zU9a75`*Auhms>NL$o<3W!d~e*4?JlPmRl`(~=U$N6d!X6sfAxoiO5{x+V3JC7 zU-ovxZeitwpvg@=YAG~e?4jK3x5nB2%gRTMFf;RUdVfL3s%ouh6@^W zY|6o{_2P=Dm?_FFwp_g5awr=Tw!s;(?!SL!ku<|;SwyRv?p~3}o@z`p=|#_EC@dAl zp=}NElDm}85${6 zkkfee-4%HYowBuuLm?~XG0XjwTQS&p8Pr_1zI9pCXQ?+is+bxcUG;KLw{M2S*)f4x z{ta7#uuvH}ztoAlxdLF){eN4PXu}Uj357GOmt%xCFLCj^O6J+`rYG91%$crvajC7u zaW2H`vW~N4tLybHhvep%KMwlaxJP?Vt+5=K;2FQU;kDDCt^1`XJk;%zfo@L-5P6#v;l-7?uw$m z#^B1#WAn}z>@|!~ISH99$%-IbA6PsFHiDZ%y%%Yc`v`(UWQpzjHvCOWqZ}9>jxQDsxIg^;-HHfbqoDM^W_Cj&*0S5z1~m!q>$A^{_XW1pqB9q z2MCQ0#RNum7y`}D{I8`0%qugS-uCl$FI-YH+-$IU?G?TIwGi7@|FP2nv%9UD-WGPu ziMSwnN(Z22nVeoMSo=3Bs(gv>DYnP4-CekFFTj3|ibNuwB^mRygXn|JYZKuCHNfi5 z0i!2Akox*xxXExADptVLm4FG2w$VJi-6o)`SPQp*%D3ncs?qe9cPpTk)N@%}lY_Y$ z&H#$n(tZbZLvaD4{zORzeJv-yh!kz>jgkp8Z${1-H*aq2SjgCCFuWA5MB~i*@;-(v z2MUB{4criU*FB~uZ`b2pC}5@I%yq_Bmn1ikAd$$m;u0MBQ2caLA-x1 zae8Q3kAATm?Y*s1LtaS$cy)Rpmd)UyUuZT@3x1Y)3N-ZypL>K0StZYggD5 zmDHNW;l2u&{iEwx9b2MM{Db`vE}w!g%WylaRAd zRGohdJ37a?lq25Kpx)fc3qP|W1#8-5d-sY6tw%j8O-8$8t@mQUPpY31W8$O;$Ic=Z zLnGS5uHzIVsPJaOd^(2CgC8i1!+D;2+^Qw2qLIGf<$6qZlJ28fd)~=e)XI6_|HbZW zu8FfU0ff0E)+dJBgxLyzq*=F2#BtSlpS?~IJ*WG{8Yp~}a3GXSp_a@&2R8Vyd^f&T zBA}Hf!a3h*9KR(`wNXiou~Cjde=rE?t^gl`h7KV)bx zEzHc?-rBzFUp=itY?)nk+X-g>VypS~S^B@L_%Iu|0H;X+sH?9Znj6V#n6ElB6NqPg zUT+@w_|+zj1g>ci&PwUb#`}oqltuW*>M8g2NjK+{?Qc||z{&H`(b2_qNHb4Xh)t0Q z&y~m<#*Q|Ax5Jyi8ypugJ(u%=Nesgwou=;3B>)q*y#ZEZ5foaDPkFjfR3@ zA)L6sZg5}nEoJjF`Z~But-UlI|ab!`o_qQK)5aj z4T^5RX%IMc10QmuS58K;`*+oPW0Dg%89!{WIC3LpAc%DSPEznWp}rPEFYzyGz6?#) z&5ggmo(Ug#b9p6o>wg}sC^ilNBE58xooO1I+nX{UKT2q?8bw=N9b8MG69M3WF9^^N zy&##fdv0*S@hLdznUDqg{45tGDl59{1Y7fr*M~saG%w_j7k#oFD8!v6WS}4GD>+@~ z1EZJw{hBW4RNTUyuIU)<0PgRb?C#R@k|69$OLTpcto1Fsvf)X|fKD^9c4eY&Zax&w zIIfyNT(;RYovIm?I)7uB$wNLSFpw3awfg{MI@}2kQub|#SKl0y@?DbU`nNeQOh7Nkv3Ab&<83`)sOXfQc>>=0?<=~! zP_CHf!;5S@u^H@FzWsf@SP*|Vfvb!Bw@Vj7=BHMJW_?`F2RU)-BT#+F6&uiES10@? zL@PDWEvsP=zC91pv~#e0e0;n^Nb9^eu*7zK$SN$$G@Y(muBN2+=Fwr=`51j|C_z(+ zG!Q{AP9crDbOB%+N9!trl!6TYPh&+Yr( z(1=?Ckq}!;wEmIlAlTDf)BcjqMkFk>ib7yoY-ngaDt%_=js7*W?ap+(FNEkDI*b2= zl<}pXC1VY}(9@&-%9g#jqj*m)Jz@H6W@ggw!tAX<$fp-)ks>a??`yE-nA*=e?;6zU zU)QdGI`tb4?@5Wu)?UxTRJE$e$w_BZZ$Vup{Sn)>PQ z3NChZeS(tL*l^8n$|nwo5pyoh-WM@a!&SL!=idpf;}a6hws}^`P9XTeKI7E!LC0!Y zQ;C0=HGBDuFSA%(y>mqs_R9SSXa;NyjeGLNpjg}8n%w=Ll2_Puw-kkivQ}!sNi;M= zBXbyT3gR9NmCM!^+?~p08BG;f5dLqd0~VEu4XcQXFOsneLn`k5v39a~K0G<(bs}9K z?|*|nCn*^k9wmRJ&Urti>u2NG=kuDDA0k4ejWNophI4PVy8p`lT_=5uoHh6b&Jq@1 z?aP|PBb18bun**I_82hP{Xy4}gIF9OO+w1;qX@A~(>hK@EwDuCPbhlZqh`{42WjT$ zvKDWYzcJk)?qT{{y<0sve&@|tqeck}+`Nz`xzrQcY#5lA=K`+sQBAkVV00K%8+Cf* z2BSlKW6mwhlFfuei3CP62m_67B%dZ!H!VxKJxQygZ}+pjS%Ht{{nnxEO<5I;Hr^vc zzZTpp7`n-Lg&8j*SHP@z@_!4aj4%f=#;g6v_`7a5z~lJ z+NdM&`w?(`v$r>mbEgJeLqoV|ye{_l>*{=5YH}Dt?6%Q>jR*#!Ke=6G;sW=rbmbFS zBVWnP#TCB-c$ZrY{H}RT^v%D<;I|FO628L9VF2P0f5|?c9jd_Y2O(4WgKh9J_V7g@W>z;>M33^~l>x zu8l8m{EdOjtI8Ss^I}oNy?X1`z{MI@0U;v@>VF&c6`UJkiVkN5>MgZg!qKq;qfti=GNxcB0jNX55j*xB&C9=&Gr%z3Ajh9>t5ntv%{=P zit*3#?<7PChZ_f!a;)}`r_6tpX&D7?6b54W|A??Np%bQK9&B3H_63eX95^Q_mD5Rm z655i3zZH~Y9T59hvQq+UrVH#;g0y6cNoBsq?k$NY0Xcc#(=Uhn~2yo0&H3*GQ?i z!w|>7si6B1C;;^QpHj{|9;&|m330ZM31XkC;h9*;1*f48?;+MkSMN&RB{f zgtXaegf_ZEwls(s-C2^X8C#Z`F}4}TY`-(A`*q*H=lSb-zJJX3{Bh28mhUy^y1t+5 z{XH7fVvpGcx>Mt`F(+?k2LmC?OwgKQ^RmXu&ljO`Q0Hg!K8qiN$ka?9F=*Ch_7JKH zgw_9of>uCKP%bl9;+1c0R3|9ZKuj5Sl!#`Zft}jD< z6XjwjPv}@D*^RKO#;iz<5nA2h5m^SoqqYe*)IKSIO6oTY;?~2Z)Wt9L2O4CXM6p_e zca)Fr@u%{{t|cYd>^rS*ua&w6p?8e7?z6rNeDBw$@n(* zZCm16oe@a>59V}10T69--1Wp}N^b0flE?3hY$S($J2Yhr+`ksN-Yzo9ns>h3*%032 z$2(^V7B-^`J3i2*!F&?0rwJM2;A1Bg!TR{~U&KC1CcRT)07Y z+gMiC8@vKda+^2$K7ApfY1WX0D$`i+lV9h50PW+q%Hm2jU~{kOjRqv~H^7RNa*9jf z|FRRcY;kNDX?<}#=SvXXiOcklyrvezH_vnGay zGP6TJ;}lCYGzQpP@1MiEaAY6}(bL4(+@;jKdU2SAvip*LjP{4yuFc+-6EV(;R`=e? zXL{_#?vtsDegCL}FP@m?U!PWdc&Fc}ZN0V3?LQxSPLv)vjKz0dC%>)kJZlPL@pjbEQdqNM6q0eXqYR6NtW8c;s$7o9NO< z#p3>JG8!G!bTm*AYqF~TB6ZrdPnPEK=aFC~omxhAm%~FP>YCG>j*~06=LItAoAWAG zDSt|QOYUh!afVKw(l=8&>(*j(`p9KHqWs09)bqyuNejpJMD86)ZT|{(7d&g-GjC+H zA)MP|(&>`a7f_CX#Nf0MpsH$LXrsL;O57(ivejt(Su+?!zP+97Uj8Un;pVG%2n)V{ z($dGM36XAMp{~MvdsD<4f`TiBniWW>sFE($+B_uS4WG&Ie_|8nq-uGFv@6I<6j|k8 zfP3Efuz8#P!2|DKHrawPRx&osq;GK5O|`wB;}D7Js`uoLJ}a#H{P3H2%8FNvHv!qX zkA93UXo-V?b8{wKHqST;L*eE;4Z~hsk{VuUBtsZ#D2*|9j#irolGs;y6>0;6#}$EY zxWVb8H;KVkO>BmQgoFw4Yj+#op-y>LP(rfFsQiA08POJl0slXvQ|NXXVMOQpT}XX> zf}k_*WG9Kg>{OFSR0s(%f>u*k?QVNQck8d?M`A&ZD~_X3U3W9k?d}E<0RfHOB~N_$ zWAzt+vw-Ot-sncDRTsH7npzT_+Wmsf&kMVw|9E&E?zgQmHEBnEbP|hUj7tY4)ftWs z8ka^N&><^NnyhW!nO}}7?H!tYSUsA{_1u?f1Emb}06>S_*wNvd8@amECn_Qg?>RAe zC_g5>M_*}8roS|t{nDeoy==D(;WA}gy4g|u(&t* z>3JWwSH6#Wanwo4nZ(#Q*}sGA{)^)I+F6}`s>Q$N68b90%e+(^!L*XB!{+jsXN0O| zJMY-2&b_4E+EwdRjn!T^o#0Nr{&r);)Of=_x2n)xmM4+zu5Q=*P>Xfv^MfGaZ@#%m z*ZRtm)x6c!v+XJ5?iub#r?y7`w*J;qYQguZn){tUZtoDmFV0)q$>H|AX&NCE=P(23 z&SHm(2znqir922%z2Tag(iXPTXltEXaKV_DE!Ic7MfpzL-e}9*mu-jc+G~}R^i5y7 zoLR!Lb+NU)yO0Sgx=mi@Z>iY`J-ERIJ#u@5>?YT!Ths{)SjvvtCR|Xq*a1b{Oy7AC zkNBtUS33c|@;Hshn{aZ~%BIkT?dZVLQ9km zLRP*MOr8gI9GyJo$q@x2FRs{UzL+0y7b3sD_&F1-cg z>BQc8-NmQ?@{X_h1n-byzUNh$tOb(rlk9qm9yDLl_u=k^!&E2b| zkoY;vpcLP0&ky8_2%Hw9Fw;_mv+SEw`Z6T%71jh2$Nrt~&nMNf(@hb?%{`_VLCp6o&%b4qTla zP+tq~{(*c_`OJl#L0edeofDQ0mfN5Ol#JDcY%{vRDp5lWdu(YOa1KlleV%^9p=|$L zJLeCP?zMSmYwgSzVjeU)*?5(D1(ph|WLYMlMSAw_4=$?Z=fJv#;_ENTmC}*tK*P2c zZD5aJDmWmNBdnPe3JYmPCb`ewy|~kda5T}0FXMb1ap{Og{jFpc=urlsYs~TztRFiB zqjwjpA0a{CV-Zaz-86GArba*Sn)F~7CIO=3B{ico`Zwggdgq9#*V{c`AVq)^)ggCI zw(RtapLR>J9-ca0_VjfrBrW(&)l=YQo!j3G=*H#e!EmexSM|*y=lM;5h>F4bB>=@1 zHA_RVe8gW|h5W34;Cr!3Lb6Ram7L+W^I(=Rgz?G*dXi;5@<;=5kPwo3?s9mqr;Lm$ zE%|lP9Y&<7>%`=D$sGEjR;cjC4{t1;@T2d?=PEl@&+28H)}9NUK1L1+hdLh!v-pd$ z2+{$5qd&_%cttk#!1FGtb+Pg!iC;C@-`%u%y(sY?4K0t}@z3Mo;v)akPT=3J=D#+j z`Po-Qe15&**29l5i09|@B^1c|i*6Pq4uZyQ*_lkol}z0n>ypAy{DK70nHaqo9!!hu z4(G_(6Ts?q1uP}`>9x><$&7)i7bK9Pa z}r zQx5TYVvXD_Kr4$sioa&zY9F7s9oG(qtqiCl(4a7=Ann1C>iZFs^j7Q)ZC`gbPl)hp z(ip06ju~G)j;ACaDAt0705d*X4S-~Fq-^&Z>6rpo5(vmb$|RU34ZC6No#ewqo?c{X zdbi4_MK^!8op-;H-p-Q?CYVFRW9+s736i3ia9F|=YAAc4EfMdd(g-4Z1xu}wr{BFf z3zB|@WFh8feur3tCXR{LOmf9`%4-0wrV|Uzm-=p{FsRpSwh(**lf9GhQidwOh7|m3 zOuw6X1PNAv%^GLflM9Y84nt+^G)MKZU{Z$OZRihA7;QWjR@l+N?@;YEoN9w@WRf+T zH#xwh$5EMd;bwKmh6<*cM+sj-JX|JU8EDY}u7nLmxTsmhe<*;VK_>Zs8j@O7l@uR#l?(VAsc8E8i9! zQHWWBWX5h(IXk+CFDvVxJX2L)+f7v%$CS#D8ncN+rH5D%v<%d*z{dx;A0C+NKW zS}Q8Tze=wm7*;(HDlFJNS5}gk2>9;B6wC+KC%0DZE4Z31JUOqbVt753=<$i%4np8; z?MFQtq95826&;ARkpc=PovOWulGdU(M0-vj5x6>ruHEhZLp}}DGleqcHZlI3+WO~! z0XbYr)LuZiQ|rXl?aOK!!>)TF00x=bX+)mJZkOxnp%kzm&Y>rwX+TGjGO|VCK4FQ#TVn~6%8n_O> z!V!Bvk$pTnW^93pOD@WYb1n^3m2zM|p!uxcAXT?AtTff~$i4II4y-9n*LCJ=APS zr3w&4K;xT0r7V`k%d=+|P`>|mQ>}yUl4y)q>JM5m<(pPzq?@Fa^s!+7r_{_b3 z|Z}Ej7EGQR1@DvP= zA(~jm_v)93#0!BTB1H6d-k0OiZSWR!T7$2-_$8{?UP+%P4C~&SJ6!7pv*c0uC?jW) zhqw#*=s!} Date: Sat, 1 Feb 2020 16:59:25 +0000 Subject: [PATCH 15/48] Fixes RUST-G loading on linux --- code/__HELPERS/_logging.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 8c07fe175b2..7a91c3bf9bc 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -1,5 +1,5 @@ //location of the rust-g library -#define RUST_G "rust_g" +#define RUST_G (world.system_type == UNIX ? "./librust_g.so" : "./rust_g.dll") // On Linux/Unix systems the line endings are LF, on windows it's CRLF, admins that don't use notepad++ // will get logs that are one big line if the system is Linux and they are using notepad. This solves it by adding CR to every line ending From bf88ce8e5530668edad59d6883a91ecd978c821d Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Mon, 3 Feb 2020 23:27:07 +0100 Subject: [PATCH 16/48] Fixes straightjackets to buckle you forever --- code/modules/mob/living/carbon/carbon.dm | 10 ++++++---- code/modules/mob/living/carbon/human/human.dm | 11 ++++------- code/modules/mob/update_status.dm | 5 ++++- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index af6bdb26af5..bc167910747 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -615,10 +615,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, return TRUE /mob/living/carbon/restrained() - if(handcuffed) + if(get_retraining_item()) return TRUE - return + return FALSE +/mob/living/carbon/get_retraining_item() + return handcuffed /mob/living/carbon/unEquip(obj/item/I, force) //THIS PROC DID NOT CALL ..() . = ..() //Sets the default return value to what the parent returns. @@ -773,8 +775,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/resist_buckle() spawn(0) resist_muzzle() - if(restrained()) - var/obj/item/I = handcuffed + var/obj/item/I + if((I = get_retraining_item())) // If there is nothing to restrain him then he is not restrained var/breakouttime = I.breakouttime var/displaytime = breakouttime / 10 changeNext_move(CLICK_CD_BREAKOUT) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index fd4c9f0116e..fef44d69e9d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -312,13 +312,10 @@ return 0 ..() -/mob/living/carbon/human/restrained() - if(handcuffed) - return 1 - if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) - return 1 - return 0 - +/mob/living/carbon/human/get_retraining_item() + . = ..() + if(!. && istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) + . = wear_suit /mob/living/carbon/human/var/temperature_resistance = T0C+75 diff --git a/code/modules/mob/update_status.dm b/code/modules/mob/update_status.dm index 29bcced144a..555486ebf10 100644 --- a/code/modules/mob/update_status.dm +++ b/code/modules/mob/update_status.dm @@ -48,7 +48,10 @@ /mob/proc/restrained(ignore_grab) // All are created free - return 0 + return FALSE + +/mob/proc/get_retraining_item() + return null // Procs that update other things about the mob From b143fb3797bb791781ca5cfe861b124812c58e55 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Thu, 6 Feb 2020 10:05:54 +0100 Subject: [PATCH 17/48] fixed typo --- code/modules/mob/living/carbon/carbon.dm | 6 +++--- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/update_status.dm | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index bc167910747..7347e8eb3e9 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -615,11 +615,11 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, return TRUE /mob/living/carbon/restrained() - if(get_retraining_item()) + if(get_restraining_item()) return TRUE return FALSE -/mob/living/carbon/get_retraining_item() +/mob/living/carbon/get_restraining_item() return handcuffed /mob/living/carbon/unEquip(obj/item/I, force) //THIS PROC DID NOT CALL ..() @@ -776,7 +776,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, spawn(0) resist_muzzle() var/obj/item/I - if((I = get_retraining_item())) // If there is nothing to restrain him then he is not restrained + if((I = get_restraining_item())) // If there is nothing to restrain him then he is not restrained var/breakouttime = I.breakouttime var/displaytime = breakouttime / 10 changeNext_move(CLICK_CD_BREAKOUT) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index fef44d69e9d..7060a139a60 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -312,7 +312,7 @@ return 0 ..() -/mob/living/carbon/human/get_retraining_item() +/mob/living/carbon/human/get_restraining_item() . = ..() if(!. && istype(wear_suit, /obj/item/clothing/suit/straight_jacket)) . = wear_suit diff --git a/code/modules/mob/update_status.dm b/code/modules/mob/update_status.dm index 555486ebf10..1708bcfb7a2 100644 --- a/code/modules/mob/update_status.dm +++ b/code/modules/mob/update_status.dm @@ -50,7 +50,7 @@ // All are created free return FALSE -/mob/proc/get_retraining_item() +/mob/proc/get_restraining_item() return null // Procs that update other things about the mob From ab9b2b117c036dee677a079a7ddf4a9ac6912558 Mon Sep 17 00:00:00 2001 From: DoctorDrugs <10556843+DoctorDrugs@users.noreply.github.com> Date: Fri, 7 Feb 2020 23:18:37 -0500 Subject: [PATCH 18/48] fixed shesi's jacket fluff item (#12959) moved the left facing sprite over a pixel to fix its look (requested to be fixed by shesi) --- icons/mob/suit.dmi | Bin 546993 -> 546993 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 9bcabb11e780e76f84af0d4d7ce297255c080c69..6c622704fc7912a1bc4f55c91c6e2e8e0216c292 100644 GIT binary patch delta 28316 zcmZU)1y~$S(>A&|Ve#Mz9s&&nZE6EH^7k$gUSJmmUu`$9F~&!@)%1Rm5OXII90mEzpoO|b2z@r(_*kt>$U#-6@~ zCU65L@K<@!w@IWMC-r1A{d2*a*f|lvo02CP4?570jx=kdgCdVV?Crn~_6ZuNFg6L7 z%jN^N#f2|@V==p&Q6NwS0%+>=zUMqk3W_l}tru+|m~bKvV9 zy!IgB(hRt2;JLAEGeW_x7HUAy{kz<+8(qrD{68od(m1Krz?XtjX6Sdq!W&tFD3V zHdf+?ns1xhY79X?F}_jF7nqxxWr2&36~|z^I?x1Q*EoOMtIsjf1ZHm&^9g>1ak$8i z%)}WYGl^y*0)(B7K7QiX#Dxmv`_$b?A8Twxvxdm~_=uxWD7G)p*^|_ACLMFf>~r3f z=4$Z>J5KN`-Jk2-*!ca)$7=1l3*C{V%snfgpvO#cCV^~vtAoH1 z|6AWHp(M4$j~~PGR1>}_MU&SrzkBy?)UmGRa%Am5u?C30fjG;g@iyd)mB#Vt&~xxV zCT$o$X5)W6xa-n7cPTut%k_RDQur%_1;2AbI92fp3E2{rKgA{pK~tG!#)7Jf+pffwwBZrM zi)_gQE;4|bk8Io7Y^Jjc?CQ^U=TXpX-myp1!eLR)Z*||sI;*`ITTb{L1dMbKg2+ag zC4b%!!FWG==6Y(@=Evyu?AaG&rTX)*pp!?Y2)@&7&0s-eOe*|s!qrGbbn_4<2a(<$ z5uMlZb?7D9t;$9;1^yPle7U<+E->*IUxi3e?+2jzO6WQOrxI!0c%yD}!*XiId+M8x z(QZChgFPyDtl(gw$9o#B zyLCJPoXg3f?ZiO)slqy`koT|@3Q)_AUewD{1>4FjmSv3H`QEPhEjTP*9vuAN(pZdC z@f+dXN&|#wlqv)xdwApdOhY3QmhIgmHSfs`Ex-8rrZf`93JAz=iC@N8bZsK`rno+bfeLfYrM*cZ_^}(>*=cmiTj{^1NzX2yBO=NPGUj0)3kT?E1GFrbF;Rj_-;v3!> zE<;OGrE!AUcTDpI`NyYswNr|IL>}?)S#pw`>W=Q8i3iKsb<_|s-mZN0X~CJV7`Kz& z7Kgc7_4#2?dw~=EXsv>1Gv0#=<)X#`~BbuP~JefDv0UMQ`s-$Cuz;t=WiUu10+c zr-AbW`gYHo8lndatB|`a@c`B=NFgxD?q}wmUH*vdQZwvBgiX2qxEhIW6K%Yyv4erK zPP1j%R>?61j{vM47%#a+LWJ(tNGZk`JtyK#S?5$a1jwCbb|A84uL_vInpsaAzy;I(Zfirpc~hNXdHEtZ8LP)n=-TkAPQM`7WM!ER z%csh3Aj9YcB})$>1r;Lt#+tvX9~d0`Q?|<=LjjjTd{X~FerW{2(yWT<1VK%U8Wv&p zvpVz32f*LOJiy}ilF|}O>~zlyzZ65>Ng=_1pua3}tmK=<6|mZc0nfZzU&~krq_-=h z#Q#_2J?h>d8d?o7iH#P=|DR;R2PD9=AhcRBvE4c4elzHB`8;1M zQ_`lHq~%A|sDNrmFqh7Je7!==SL|5=vv)MxBN_FjW3RO^135RZFgX7LVr23gwp^Nr znYH5fTfiJt-(A?k)ZGZ_VHbBWWgE(lqD^-L!iqG$j~=;Nfw5dbw!<;N&mqjMXYl`* znI1G-amR?A(l-ua0!8iK{C_3Buiq>)#=FR0wp z?tX(}ZWUtHmm6zxcSdvZKr=|#>Cg`$+xA%;230ebDQ<1R#LLZEKr$mwvzG`#bok}7q90yiAQ^tpAcYPI>hmWdCQ z4*iZySNe%cwn+Hs4;#J-9ek_(qgKg=Z3d8e=Z6vyti17HN9vmpvUT)sL(QrC)}X_I zNzG8fh}mZ#886g0{@Wi36f{vdMoNb9h+Or6H3pQMJl@-+1A8=cZBlSd>eK7W^JXq9 zTb4IulNuufIj@EIa1Xkc&Ok;tS*43Ho4Nma3-aiq|GQ9vnE=|bif+9vE)Sk_{Bs(a~{U1xlNh%Av0V;;IylG)#KrT;PE?REoJC%P&-OUu2cQ)Iovedvf5!^JC)Nv$;A9pB?glV z`9jPXa-)A+M&x#bEh~S>ojnCUQE}1TJw|@fE_=PYILmq}hqpxB>VlH(_@Yj~%9r%b zrB^uv;>mO(V6=)#9e0&N+%Zp(pRV5T+B)D62wH9QgnbFQiybbzmSDpn!xdKD=eYEC z|8O~SG#L(ITWO|X{?|%3R7U@Iq$L=X(!WE#MaLch0V9@!Z`85QtUyktz_vQmXC4QX?W)d*Tph%w20fpj&J|Eh5JNkAx1jckb)45=7>&F_ck{{@ zs~1X>{5Kw;%QI;ZbNjymeS#-tn}fXq0cdkFA)mP?xNO;z z0sm(j6#sYV|GF;#+Lz*AR4j|$;B6{tX%cj1*~^?B{9Nijar2$(aFiEsGw^;e-{o+R?)u&%jbN>`E=Vbhqmm!24;dw3%r(jPu>KJ$P!8gg- z?{8;fjW1FDfGe`0?;dU_h(~q?tIW+GGg|PB$=i(qYa0<=Etw>LuyWKZe9>d(%wSNT z&|qkT{s#^d_R2ZUun-$neWAA0&eHlK#CqGa2iTXr`Ua^nfwikS&QC%An(~W7qJE!R z>GGcQj_C4T?4oIj$HNZTY%KV8aArR>!{q)Q|1H!rZ(sju!S#ckSC|q2GdYWi_+oO< zbJKkZVYC~#9NofB7HSqg&Wxn(C_2Xw1-Ci*{XqjX=xCA^0#oRiIkZ8a6vXp~mZN<- zfS0m)K?m0q&+nZuC8d75ynQCj4TpFTssbuE*sTXG>ENdDPdz>32xY((Y7~QBd=Bw` zdR`wkQ87L0nkpmb1?Wbt6MZyt(91Q<&@jV$B9E?I(!!KVU^i=I2v~s9|5i1;&w;7B zgj*L}=hdr@o2>a2&cbh-N28TH4crLqRu29*K!3aSouA`;C5XO5`R9I*^To!|91WVOq3>P@(q$GB)JPo^c48s z*NzY}xD2|<>EZ~PqF`QU&Ee%_qf;-{sg1b z)j3t;A43VqC)4vqddSAmeKQVF3Q=SgML<^nPUhm`^+<|Up=xkT(Us^{N{O$J@3E>s zKNdIF{~g8OT15cwGTQp?)kod4_1!t1Tiu6!%nOm@B_j&N60&L^vWxtLvVGJaVz8mR zp83F_DaLuCl4Hvv?c=~m#>nDB)H~<9Hyh`{6s3Vzsi#f17vhkwZ{;!^TR!nz+ax^; z5l!v&zu}u6him4I`~2D&T_nhnYJR)P6YZ+t&f1aAGZi>io=apwDy;7_L9u zPBVFM`>zg8mKDjC_(~_p>1=ZFnQ3Ur%$7_xHgix{gML*g(km?h1KuJ>ijy@2*^lw^o*G{M5YqRGC5eYvz!E zm3^m$vFYD2RGg#iG1f-00f?{m4hbk#lQMm`uYsl|d;voe-+S za+C?*Gd=j|D+XpjzeQQC?Cc*n$J3EHFF|F%M+gdsP#ke-tQiWM37J|V#VzWl*Y|?# zoL-%*EmEU*i#R(I*`0gRJlfNB&#tpH-X3NQ1RH<}IB zjBVqt{T|l5cXEc+70Y)GUw338&Sqzm4|ZD1GhV6;WQzyC0fQC_F4z_f5{i14$B|`p zTC!+>I?;Pak)7(u=0SR zO{+pskM&jZ8IkRe*`CP_lxep>G4tb&_X=302gzs41s`;p-ohp|_1)?A2xpV3FTaT& zu)K+URT%kc_4=HXpPy7pN-8EHfe4fV0ha0yDiN8lP0R=52Id%X@~rwlos-0%Ew~~>HkRJ>C}AG!{5=(TuJ-`rbRfe(VrjL3iQfeZpEr82mj5&$`31xvKKpX3$>gU$Xkm z1D7@g4x7l86fVd+4WC`e2=8?p&Ocojej8$mDX9BN1hG`#64$miaX~9}bb9~-0o(n! zs(f%ardEtTBMMmjL2jbfN;PCY%ICgYZk;?m>hXHkU??}&V)JNZXs8+;Y->CT3zzi* z9W%6H%`+~DoLM^J?mFusPkZnZ+%MWc+8<*!fT}B9{xjbB zto09U-c!*JL<|NiDJ$du`0=C4K|{jpdDZZTZO#Y`x8RqE$XVExXK&~+Jl%-sx}hfE zvaD+yr?CjZoNC^p@r0@q>ywfk8@B8YH($`D8gwBo9>RRTUu8~XI1_(O^nBjUga5v~ z&;S7upp+{Zf3F>DFu`l206%i~l{$P_KX-lIB;W1+-*e&YzCPiFpZ-MjLW_#VVu53H;9c!E?m0MWY) zu>L>=?^T#TI~DRj*(mosPVy;tGMua1=bZr>oWSvDZ=BdSf*iay6>@CC6Y2&jvFiXU zRp?14+j_ogg~esH`-5tizz! z`#gN)y3pO8t5jvb8kC~(@G?3w$H`LS10AW&NB+`h{U=sxuCVX@2vUf6h4r5u_iyz8 zre3fJ_I6hX<#v9(GrO(wpjNXzvSz!=22F^%7-&jCERm+)q~9&fIsEc<@T8}xuVK0J z5m$p5Ld_2ULF)9!Ic;q&i}zI@FKaaNIVC6_Ts^047xvpkbi_E!P%aCim~87vK8^|x z>}~6TSyhU@x199evvqNem*3&;%6E7LB!wV&L#`cU<%z@aY%WhW%~DSV1f4v7c(%CO z*apZxzkH4s%9BPO$5{3CMrBI1Nk{Ak;pm5J3RaNf%9f9ma~hIbGn9!faN{%4{QYjA z&3v$|(?>Nd+^9g(KDD(c{Y3UAYifH+n;A`1W|93}KA{hZQ(yHdvNd=+fXZ3{kZXy6 zW=+{S6_0l#=bHVSK=Fu1Pr~|janJn#rduQ8Og1@&DO8X8)K^ScKMw$P%YqTfSc@_@ zwBy>0dATK)90iX@^1gO&^0t12QT+oHkK;G3UjP2YjRW$$7t{@E=Z8KhJ5anNSvC0U zdGzgBZ2XMZx%wlhe}YAq9#BsfBO~c^kaBo@emLK(k(_C9*f%OSMd>qcvY!Gsz>^3n zFV4ad`deg{G=g>eS0Nx}Wo1xRRI4+HT;DEFoiA|3DhG#+;B8qnBCc)u3S7^mAH3RW zY>o$^Wr!xZGdxdpWMN@}wJHrmowq9o&fHl;gfmkE%3vlHAqQxwkG*XhBH?%*;|o(1 zdgVH}xv$NR$QAKgWX18aHEpN#J0BRyvAr`PG@o2B6LIRm54xF>*m7$_Ka;fHdOS9A zO81dGoM`2=Njk#t;2Mgiw>Jzd5-6W<$ER0D%PE^D8WDL>2*sh| zw=}f-)qBy0JcB^vz@BKupY2C|lJ5+3t5Q()h!~#7@=+Y+Z)iA#L^J^4qr6EOy)znN zNAo=xKklBy)*+DVzTUIZ|HUZmKn9ZM()-drd1mZK;I^&0X>PI`R5@&cgBG97k9%jV z%NN8T>O~WupTE+2Evlwl&hvsngsF&vwP*EJQPp|$@fdLWi{AawCQn7SY%Eg1FlU4h zeexTSlULIqpk|WbV$K4xuJ%W02Ad$U6U8QAtEd+3un*CH=vfwgDbtTDxwY%Q!B+<_ za1@32TQA^~+u3=`i5)XFo4$SFxYfSBFIz+$aF_0j#!vRPS6fwE9BR(^0GuV-`nNr? z2QdT#&4v+O3=4SVBGCeNOqm>1vm8x(E0%V?KY3DBu5*Tn~ItvuUrE5NLw$*UgiH94RSa!saZ6 zt3lNIi9%<;$XswxTvIEey?W7><>WWiX87rV_oyQDzEZ*TFEmgxLcPKz|Cqngf`^C9 zViN=+BN0J;B3`Qy7uM1DZd!GMCWBTS=4EeJlwC>u4fjKcDmBfkx47z5->O1jKRsLf zd;n`SD1s+nYx7=WPD)t!#&!&!lDy`A%>$momF~>~8$f1aJjmV7SIunc23Z97Gu250ryjoJ{;{AzW>B9%PEcb#VTRfD%w zCUyfdgum|cEz!u%%9@_ZFEi=rPV4Zp*8}aF(3pJ$Kk~xyedU%*Px(Cw%KOw|&A!Ju zwnJ(Qt${>XxBM6IAyvp~phCT|ai8r`>=#MYR#I<8`6DzVhB3NQ&g56AT(Tgxukb+c zuGWJmDDN%Ypw?FQq|3E%|8f59mzk6cEiTaK1wG%snw_luma(&?OdX`~c6>M1;vKg6 zDHTj$SWYgTN0n(Pu0*CnJasG$g|NCe`$imaHB%gf8kPc4e_x6}_X<$k#EFS1iR+Fa zZ}hymPtFXvQ*IawN@Xn^4xoSpXGdh96l0V*o=n$)ndHWqB;0IP8oXic#S-mCYk1GJ zKw({-aK(o0QSQpMC6tWfd73Zl4CmWIh)19BXZt$g)EAc*YbwUD)X>$ur2&B?f=( zGUxATEpvXd+#vBr&^RnEyaA5HT<#%ntWmWM@ZS2&Vyax|%sg1?DpC?alJe8xmNXDU zDCYVfd?{l$XE*%a+Us*c-p4#|jx26VqHGyR#KuLPTj}3rP zXPBGa{NU8)9y}fCW(L-hMcK{w$NXxmw;>ECCv2roz2|Baekn#zDOOC^Ef=~uRa$H^ z)U}7lbFmOF*$m@FzRnWqh&qlYXAV>5P;hoG8~47n?M))JUe;(B^7El*>7SxSJoWD%YsotLo5XU&~N?Jh4Ar#p=cba^{{^9Js;Gkz|Wb; zUsF9({q(bugxycC=R+3WJ=2TXcFp*aZi8Bgd)1xKSGL36;(?xfJ-^(f0z6$pG%^{x z=>2Uy37)^~Z|P=>SXrwG*RMtj1;KZf%U)!?3lI?jL9vI+fGc8BMydqbQcUMB6CwrT z&_VSBETg0ZGu%z#KjwQIA*t^zGHtyBVq>cU_36>ALdIbwnnt<`lSi=$~;7%R3r+nLY{5~lP4umc$}V|0KIK!KbK3b6aiaOW)V`D+uR4H zq@+f_RotEgmcwE6NCmh*0=67?&l1Q_;dbUb~PeOdO+~3YR z?_=3s#g5${Z61=wU_~F9&rqVOUAVCq<#V7bSV^__f8nT8+1vIz5D)y1gH8eqbENiFZq`29OKJWtE$Ez!XHHlgU37(J(SQgYNr*(WA1h`9q7IM z_6piN%l2CK<8c>vKZDIo;{M(4^J8N>?Q?cABYybbarZBdC?hA%@j%~kW&eIqJunQ1 zmybkM9*x>rgukh0d6OVR7t}fF4wQx7d*95o2m9iisGb*0db!GmhKAN}2CXx+NtgE0VngcCmp1#_nCzDrX1nYf$!6kx-Dq!)=d2jX znw6p#U~V}cvPpGdfX^ViIV%Bt*7SD1rHY7&!(5i_q-mzth2Fx(ZidfR^^+8#EcWC) zR7MoS%}rFNeWS>gFaQM>9)ElD57j;9*GF=7&)?y!z{q0z^vEFwIVQx%+~9~b%`uXl zuRjy;c`cvhICE)Hg}atq_l3@|2r{2`ss0%a>G64FG4VthNs!Z5tXe&0{-|(~Mk5=^ z6@XeaD{ovFX)wJPc$bq- z0K@uK@RBO_>xMf*BPj&uTkn{!HM)nnaLZFBjjObb)yw-SCy0=pU7=XJ=3!JkBXo8g z0(Mw@NM5%mE-w31XLI8F{HWLF8tmIEZlS24>XqO!^|^>Z-{ZC6*6RW>9BMa_7nSs> z(<5^hj?B~7xnduI`ASP{v~I%nYSV6+K}FJYy+;GzVS@5(FV@p;cx7e;vKl#N1@CXy zs}8&ntabbZZ8=N7w3|O34fO9AnWslopkr}MSQSy|(Oh+owfP4-$bSOWSrnIBHj}dn z{8bYazkVWX`pFPx8eARpdwMh<%kNp|?i?7n7tl&h+LZ%LgGVf;F7Lp<63v`}(I|JD zfrnl@e+(#>A9noFoV`xMsP_29nS;#x)|9F5vEi%>L}5e^&6~2~nKaf%=cnoK`5Z<+ zFYoCWrBW&#W=t*eTeWrX?9G8qlrZnr3R zgQytGtIB=3IqxMQ@ZN3*BnhyUk3ZO{HVOrvsF~#tJk3|^NDp~!u|NBBmti!`tlU%e zD0dlp-uNkrETr(~7X@@BlV&OA`}IFBwi>MNeBOqBbCQ?GW2<7v-pcyX@^+ao&D)<# zUq1IT1x})A9(vkJ;y|lLsLi$L75GVb8nOf;Bn-?rrH-?Cf>Gf$*}Oz>&Zi%0QSdH+ z0t705v+tETF`@f_1!J1{C@6U#EI@o={_oldsRX5slAfK5DmLV|_QQaUc6WVTvmAyw zWi>@)PIlGbJK1<~_I_`5{R)SB-K^v11aQ&WfH}yGD*zvhI><;Bux*_o<&s}PV#bDe#?OPzR+d(BkH;ECwftO ze<@@OeF8p`y8KlT5*}qf-{BWFV-HvpJ@(r5jF&-5KMV1}t64`Hf2=)PH)3ahKlh4o zxHI0JsHMK|>!%@Dmb~j5x`(YIRMiNkl`dZl*uk7FOi2m;w;lgXPs3Uo7zdJqnjIe~ zI@J!eWg(k6u4c&w8}lkZ{Tr+%`u2S<;XdNg3$BM}d-JrAo2t~(T+r2YJ;}@+lD$5~`hIJ^3v0k}6mR-w) z*A^c~cq$$CcC9=9B)m8VULX_t%y|@ygGBox6nVY{!_PCWE`4UHgKl=OzhZ9y@nA-O zZskgK8Gojm_tgIU&p^IIIgb}TDgBF=scLGiJu_)7gmh6IwIglq-=u2f8E{aYoMVj^ zvV-wiT?faXoSVF4?ut~qlLm1WJ6`sW(c9K*a0?jLb?=5pYkeO9ZhJxPNpy#n8^QN| z`A()Va=)%bi8-lsKpuaXpix~q%#uADY&vx^BWyt}UGEz2lzPFUvb8FlK347R+2^FXj=jdiKV><8 z+)T+s-ELV8$UhVagv_!0NUn8efs}29{Q4Q4lyhTLQgI{mv5;I|7WShmiA=Gn>Y{qT znObw-^Uhsxq7_f3jWJXA*VQb8(I!GE52>HdaL4i?gy-3Rq8&PmD7&r^Pd8TEG@+vx zoi^-}-bliVg5+QvUD}x+iMmqWSxx zDGX$+733uSc3#Y;n8CCw9_lIn8;Pm>`PXFD_aQTsM7mJVyES@h+Cb?n<6_`Z0d~Rl zm-j{;E%fR}VpkY8vcBmi!C>BSFq*5RW{6^kyS>h?^N2ckAU_XF;2*Y~mmWp|-sh5f zyEPFBENJY$)p%yR{^oF&@++Ac^S(Rnm#bs_-f$M|!lB!PU~b%KuGtpBF}hm`4cl!haG@%P zMXDE>V~o){x|jRrB!c-SO6FRW(z59>74IIE8HO;Sn{kfOb_@m$t8{tV1-xG$@LLZ5 za%C^os)ILwNB%Btu)Ms7PHYL_`{{M8lNxf_wWFuJ-V>+XTwiEj;ty08=)vd-FjF!X z&!sX1_U5W(2|xHz8BJFzy`{t)ri6vJRC%MN`7gJCnOa+!zwak^#B)kY+?~VhcR&96 z3dR`Io$V#_bXv91zDR=ozHbwM_jrZUc4T2>GXY7C67JJN=%W;9i!H%q^Y!UCm7vX9TI-RyU5*{DD+Hia1Nk{R3DUQ%Lq)p-H z2xI(?VclrCuh8Wsa%H_b&jncnGlZg0K?h54K9D)~ZZRT-f}cJGuw)}Q zZ8hmL81sV@=tVEu_NE#CrxE58u7vJ()XDG>!0`QkyBn4(M4~e5z=|a<;xm0V6WX7m z?OqibZrBpW2K+i?K^YpJbmAWK5xQqs+~XAk@XmCKfDFDWS&6a{7&&UF{@hD;0`olU zp5GqYcj`?6<*;458$Ve%A6Dp$FUYqc&|PsQc1s-Zp}uKM`&TF-Cdg zeY@MtfteDxuVzYClfZEAMd|M$ErLCeWbpZY!&svyKSGk-?^bz^;VzKA283gMTAx$S zlK{>)WFxIJ(=QvK)!=I zClWd35yyIwN063pa0Kqs!R@rua2=@Xn5^c8rU zntJ){ZfAv={u;^VU!;7l3t=sdN3-xpGBcC%5w2-A)#64B4YLNa6@UKzn`KS)@y61=H?_Nb>~y7|6yR6Hpndk2*u3z$*h(B2HEsbFj9)88#S#^x-K1?*q^RJ5kQ!8j0|VUjlNB!qczO&tdfX6`T` ztypyw`6-bxse@-;j~$t!`H}@WI37_Gh0GHQJ%x^oj(owqJxe^r`TiXO{Eqg!D91Dz zFEa+ew~KtAUcrq6o3>pd&2}>q6i!#~dBK>#xV}UWY;JDhp)%3rpuT}2BG8A_M@zMK zr-Vj>aNEnEJ0V1K;)iMhG!#C+fz^IZxu>7ipxSP*aPUBK4%XSOUXOloaCsy10<&eb zu}z=zvI{wbUVI)Cq1f`+hyPIslBzO+DKh){JXbuc%wP924Q-Cl;<#)IL7OF&*a+qP zgQa*to#=dh+)SJe0s{$=?<7i;+DP!V0zX~t-qKx(;f&DXY1V#qta`-8(Q8?s$to9$gxoduzJ3U&Y(;@-Q6^V2!_=!AL zQ(5J^2oaC)=2GFBYJVNBI6;kfMd)k5m))e-In`ZhZXQI zzeFOud(UwvfZnw4=@@wf__pNwv1!>cpIfMn+&+@9KV6M0J>L7 zOkFc0+h3j+NJ@IyHDxlhuLwXb=1uUUC-FhXa`X2!488C{8`}$;1)HiiNaKZqI-D#|%1ECG6D=De4grv~f)zGvX6DX%=0kNgBv+CM2=7Vu`Jy6SgF&rNz$Y=z$%g$4Lz5rFrvgqfP`fU|#oBt!i&e6$AG72E3Oze022ZlKW;8piXj-D z%(%|B#i<5$IFZHh!mFWak}H@eW})hBvcyCmeTs+wobMD&P}edr#E-8O5&}< z6?L~p5EwRijawO?9b@(e6XXA?Xa()o_KW@#cjv}tWT;ZK6=oVd=D9cDh#Y5X5%-`8 zxjKpNovPgB{xylq#S{tjX@5=+*Hew_5h?|`%W{?acb8kd?~&!pH5!&FT<6H&e?`}9 zj$ihHirlL3A%gRpp|^!d>R6E*tFuW9rHSf?p0-1o>ce*Ji96)-%BA9Oy)Q{XR;Y(D zU+a06uFj$4IYX=?A(^qaRN+v@m?VnKw0} zam;qiGU=(P$9s@smbTUNE1&2r&MX!{bN{w}Qj5{NM}bg?ljZu{O1xjQAMhz$$@kI0 za)sb9l~Hpn@aHRiT?{U8}@AnRkoVaE-ld2zxCVCf_u z<4eD_ChRfhuT;DESFY=L-6VWTS~Qp)G6z2HrUEs#3DY+uI$iWQ;F?F&(Vpu@e5&+! zRJtoFK!d%WQ! zRknnw{v?#^La0vCU-ggG8_RGcV+Gslk1sNW-@kLv zB0}sxYV?)`je@JZyB<<+vi6yG)3j|Qh3pa%#@&laPd?6h)gZXDP;f`w1qG%eA+WUk z1|J80m_f5zesgj>q7ic2aanp|UqlHaEDH%04!OAuIdNT{A#b8f9ZVj4=lI(U2PE!1 zW2;@_r6wEDuXnJWfKzJ5mcBGI1Zu~|GtxOZluW)pab`;IB)t?&I=d&uEm2QfPXl{Npz35mNZ5Mn z`f_VMVYM_yKFHasFTKa&!!rKEXRTo$PSRI&4zarMQNh&xhyU0UXdC~GIW@SN0cst& zmQXvKs3#YqEyyM3AjC;gBGRw<#V4ejruS*~riGAWDs~@MHRD|_td9-~zu&Q@*r$#+ z`(}apLC($mE9`bGiQp>d zgIpi5c7V{;*%f+G_5nfJeuxatcte&pDS&fSVP_shQ&FgSDN&D`Sm*xGd?s ztuh_|Q_H`e5tD~CHA0n)IsZmFDhR_ z!RK-LM(NSkrw^IL93ygLMg846^4|P|0|%-#?Naz{v2j7+0X>v?mZWR`=(JIS_=!eU z&@YOZGqCv!I?+m`FED;AUpdbC(}GM{qAWE0Iw40R=x$7Ki#)Ny@S?LRBH7#cQ0%Ib zD!=!;V7C!l*swjQi#VoIt2^a|;y^|*Cg8*n1eMap&<;yNitwTGCF9hJ{4b94kGkze zauwF+^rzhGM!y6&$29$EOq(cu4YtjrGU&%mA?|oLBKNeo0bt;*X6P96)~AQ3*N-Tg2F0a4-Fmrjd^+k8M*tl@qe)dQS^SP+Oe#wF*ua z-Xvog33f_DfNJ2vdUQ@%8{yPB#}%Q}U$Uur522NMoIZ)q1l9|AzE)S?S#dzV6Dsy&HGCflmQOrF-&=S1J}>wklVAr#E{h*^ zx!t>1_2`$%`02+8b6JR%Iu0T%_}!N-H}K=7Q%c{c)~iLsqzCn;CVgBwQS9w{C)uYg zZ8br(m?nB9P?K_h_f%=@&pM80)_{GngF%s4OVE*#gRw?WAgm)priwz=%nv8?y6pp9 zM+XR`G{nl?=qAuh78TL5Z)L8Ij_NPYzBy>n|jj?+Aq z-9B6dFRh%&@5fwQRb69%xHw|jUsfIgU#4ol880Xoo{3eIUK&Z3lNnDf1x`J16lruC zB66_oFyY(nESw(<(1mBx9+LZA^BxP%HR&Nh^wC!NFQD&fMixTJ>F;l>2sfV{8V7v5k<*`FnkWx zzV}TVFywJOod~npvIZuy=p0?TPVw=Ns27f?ZStIR|vmZi<&2T^Hha{HWs}BFC zHI4@(|JY$I!QB6jP~1xRCfB#$qNWODFpviX!P}G_@a0wv`%8QAs`6Wu8R+4NU!+7Z zAh>(+L%GC3B4wiX9wo8tg^Dp74V%~@q0YFgF!qw){88HKsy-GQq)k$nV*X@~V#NuG zf{Vhy@awH#B32!KcTSA{I>sC=c06Bq^d5r0P2Ov8ONV~xnY2}MC3j^-gS8FG(#Qgs zPq&S2OjA)0Iq+;^{^2!83?0rtY}5s^)&Ce3F|ZQC|DGtkdl}o~t}#}n30XSh{brFJ zVt;>{hD%zYB`9d6OW$c-DHdt=)cXv^fn~;OuijkL;|PNBupy56_AjwDa?5qyQwWoi z#i6!Yjl4>`|drTEv(t$9bI3Tk7j%w%5oc+=jm^d0~xLK0edwT50;Vf zjZV$jF9bX9reQfo+n8~+FR<3%!$T4yE^sQ*2}x+lfiIS*e_=wMu9&L}=HTEME!0T& zs983+%p!oboi$0s25V8stEmy6Pk&Ix{xIQ4iu2&%J-y$aUL)A7+prrpWxZGX*2Bp{ z&{bgYmvl8n-_3{9(ez*i{w#Es{{qGc8<)K|VWah)7*5sau zZ21##I3#8$j3f!MtLIt%t#u>>VGq_0x;s*Tx$u88ZqUZ~NwJDm%0E~<-&ff9vcq79 zym}~Gj}Azb2o}8I5OE|VN{Y!b|2Dn@-~Dl+J#!%rL;Fh7oCB>cH(s;XqYhp%#3T>J z!oy==F|g_G#p?@gPUBE=EAGx98NAXq(-`2D5H83yOE$I)c-aowmLn80e9yE>vWt~8 z`3@Xh-l7^%kQ=yhqSl}4f>XqSKbQx+;PG0jn95t(#HAl6C<+{TAttb zK9;nn=mtz*EQU}jy1Cs}yDiIqS+5;$s-hc;eqJ3rtfBGih5948ri9PyJCK`KKD&{U zv%+t*ezwWLbun&qM;{J~824bF3x_~>N}6B2(||{49`7>LuDMnX5Q(I1Sb2bUv{}lt`@+PFmO<%)y{5ihF!V161yT`B-i6 z&cOB9={d2^!8DPatSC{j(ZJ+K%_j%?jo_n{=2$B0`=T!6&G{<(Jq*(B4CD_mF98sn z@>;YjHU_8^F;lzCL|30SGC=uXUJUa>T9`{)`wx0PO2Uoc%m+A+C95Nb?E;dF~^v`k6HI=}GI&CQJ#?_|qv+(k&Z z0#22H*FDC^*LVw00ttD%p%x6a!2TTb8l1TJ{pTH{h2+rK)4r1>H(^Pzbwpv3(jzC$ z6(6y3vjE4)sMY*zQjS=H?;Kn|7oJ(C`AfLF;E?a|wOj369^=@OK^7?Xq@2g z79@cL3-0c2!QI^k9c=#2?*4ne3VhVyYIc~*4rBdCv20GAn((ggpjsO zj@Bm-sJD0Q*;;Fa@gFEywM)Oz38W^7@RIcKIMrYM0Kn(Cf>NS?kN)z4%yNtdJIk73 zE9w6y6Qn1jBX_Qh-qGe$)+dU^+rOx%H2sLj7A3@LlS%eSdJj%NH{#uds?0 z;9M~ulG5p~3o7E$tR?%Ym+3I$NPb4u37oZ)~jD{(VaqrT^#Z zt6T4t9af3i36gNKfISe##t)x4bXy4zy zX=~Q5U8N+lo@8a|3(0O3hDsdQKl}Y<7e^RiBnuXmmBnNs=Y7KI5?&Q4FRj=Qve#(d2imMmt>mgK4u+B_yQE2_mRiBr{fFyK~``CB_rzCcpcKNS7-|5PnucAVAV2UD1gc`cH zW(;m!bFX0JZ$QNEC9d1*-r04PkIOZ}!XFLfHd~!kitDCw2w`+;!Jwms*5;%}B%i-5W;d!qs%9 zlphDfZ9D{N9qEtVOOrpbMxGEwJ4ugp4h~|2DFcRLFNMCc@qHEO|4c0YnkYssGJXCT zWGc$ePLGKM5(d!#4><5tCk%S2???bh2H1b+A&9Vkcvj|JbE84hDED-1 z2}bs(TTdUCcPt*l_Rmmtj<&-GqtUa|{sMQN0)7nlz>A!B=3rIc76Nll-{ifL%FPHY ze_9fb7>!NYGC56XA-lL031sZ}<8;Sj4IsQ(AqICRUgb``wtdJZyOXs{Xi9tGG;D*q zw|+52l=zy2dMzy&7+6RURMa4m&4a_OM8Vj(o2`xwHvjb|hF z>hfy8`<%P~(}vd@uU9|*lNbO{V*qOhHAb4fQ`TxAyr3*!>vM8i)xyBZ6u?h$Je~LG zMd5ab;1or1|L?jrC0ZW4P)M-fta@O(c!Lx6YF8FI7qwcPc zMN3q2l&wGi4U4FnoH4I9f3fmZlDB@0h-7s&3v_keXbaVB7MnBu()Vh|*6Jw?0>$pV zw)8i5woiX!uL6j9{_EAkea;i$<(Tu%ge=4M1ZFHMpC6jIAqJ-6D@&_ zgKDE6uGG+6UOiuA--F|Bn|eKB`coymM|#eL|9tSipH}~QdCY2gU*=Qz#r?{MT^$$Q z@=`x44FCUgd|~h~R#Q0tm8`FU!2qf+P4k!d3YJAnVVkctZQpxq7v!Cy#UZ8cuo_$CLQ7t(N4Z)8&U%NL^J|88>z zzpMosa&LMtw-dGU-cII!KU@|4G{-apR`e~a8?x`#=|FQ_FEcA^>#@{$jBo2R%}Ouj z+0;@uiVu!U_Y?T24o95B!uVIW04v;-qWRH|K+hZgtbFnWSBoAKI2S1c{OdgC=CvuW zZdWq&B*9bgqo+V(O^Z?DR=<*E4-m~=%aG3z5|8Hy3uoP%UP}H}WnvsQ<`(oC>gkd4 zfO`@gZipg3@)-{wORn4WPfR8y;Gx&{vX(JmD&g^Pe>_+EMov!tXAZE2@fA&B4TZ=M z9QTCuUn|AOZ@CCN)N{t4zAVC)aMD@KKWH%P{ZYDonEzYeX7&J)Oj*-+@OUvvJ*dpU3X}3~6cU<$qfwDj%|H zSY!{64<+W8yJQ`T$(hi*6e^$7*wxiff362g%q!={D$eXR6qR*ZaFjg%+|vTpxu}i*%7HQz@{C+Fm^|J4@y&Fc{lU zCvR0M+x8MilR6IDFJTT(vHAI=uzL@$QrNCAPTh#esjEX#kV~e%qN9F4H{tN;s3HVH zw*E89J33@WI4nQ#Ln%C``cFIr^2u#foefStdsExEDIB=cC}niZ=(}H;-lZo^S;OiR zu8nhmD@6aZ;0J&VAs{5&ykz`I1i#{Yn7lv>M8R!Ed^cyO-xxRJmLgL6_o(>wiUK~{ zudM)&*}sL+nJKf8HB;LWH?y8E&xDsK4bZ7z1L_q_^`aSU#%R8?Zp#(6t5H$UiXBz$ zi@xgFgknIfyj#A(;8V#bcq`KfNDu~Yu3viSgCTmjz~_-yCW|jZ+yjsT^jM?v;cL!S z8%O0f?wcI@mLvPzYNX%dCA*k}aoRq&FtoPFp+aWLTqTF=;%w;CqIrKzV0~_YX47tH z`+lBUggqZMvzwr^)1`ad@D>&csTPm;@h!Rg&gbRhiL}1sk{x{uD?@#mNqXou;xr_A zZrjNR4#*vs%kr95R=r|68;z1RE2z5XVQS?|*=){OZH}`kC7!<2Q&U3=XvcHbH!`AD zpeL-Mh^tv+T&IMUOgx0Fq2RAJwyGl!&g|viv|c|(Xp>hi>(U_fHx_A50=FXETGQa$ zscN(jTw}g#$4&;FaGv^YrquFHAM1sCS~)cmAY5w@pgWY1`0T{NZS76CL*WskouqO_ zGL;x6x2N+({q0-3bG(W25p-I(o~kMxYi&(UZf-8JWc59Jo-){NJ70wf0e5CV=9(@e z_K>}?86NCP>e4sxTFWzxZhahjR&Kt^I{T?9d%@w~ob+3=mA!ugF(|CX1eg&4KY>xi zMr13A-A7g=2ocV`q~53%B6YSU!-V4G@g;G|^_^T+_`#FRqSAxkK5ekZ?6680DTw#& zk%Wi>Tp50B+M(dny;chtHRt0drG&d8N)+MY<_2|c_fg*Vq}5GbOj z^FvVOZRuMQ7YZ2z65$l>#4e4ffH8aWy-f8h>to2>Gjm~NX^)}A>eIpvoRt&*5%(+p zJ0u7S7%mhk%fp4lWF>`lb)gDal`1y}tMeCi`ynZPA_?esew4)4 zza^F>m-l1Qs4YRk&NgZZzh`mKAZAR+3h=3lglJ%Ja9V(fHZyHI8}GUmI5&g)EX;BI zmOCATisE(Du)T;}gt4j*R&e3=*H#la4B)>Kh~_s2XK@OT6Vm)BB?=zPS|Tjdrr;+k zn3+kvkF)o_i(xfMdt+?UEalG(MS zp5h{q%B?aUXmS5}nF|ikUsguIR`4ZmS^ub0zji9H`SE1w6V75avi%iu!Ly>b0Rgby z0C69UcWxyZ#W$9ekd_HyOLB;q)tYi|=R+zr;R?T-+`1-XCgt%c5kJ4*fSd*Vd~_;t zV&Fa}XLn)AlPUXtObZK(cF+5Y`HxBHMRR3*8ARPN`rT*FbU%Lpd9@8`uW^ofs@=G? z_G&sDSKt%^`TlF~y|2OEkc7Q#sI#N>_3;w;{rp=*H8r1CR95ybU9ESAe{kN#NXd{<~C zOdR+XLPEa#blOk3xjH{_9Ue5B_%lA z={Us1#ITAq0*%zsiiFG+Yt8z|d4jb5>*?v~?>Zs?A3cQgAkd8A)$ExX1$KD1|Lv{k z)HMJfkz=zHeR9m)f&%$t`(484o`)b^0`g%V`s%3n#i_%V;#9PF@i~%g3)2%G{@3x*py(^}r}YpAR;~G~T*uWO28hTn}855t{w8(cfAqgd-H~bb}||-5e%Juio|w z`ZMkNP{7AmV=1-dVNQRbsL;eF3gU(og|*nyEjg*VJsn{78~XM4I4Mjj?o+ zmk-O(3OSPw@|exLHeYmw;A_6ym@N8C)ZdJSQ)e+JkkjINDfQ2via1`xgQoe`3?=4Z z&+TfE0i8R$SmmK!12|=41EfluhG6%dowMLrI^chfM-l&QHC;(9^l{CQ7XUIJEtWvw z;d{5)NQE(brj^O;r@6x)zwS>(#lV664~yRRuCHBF5;?I~f+Pf7yaM#f?zqnhvVer6^>QR;N|#G{(dDA$#%~l2O3K?PNkG$D^`F zChhs=b9nO6``x(C6PXulbcWb>M8HlqI%3W3S7e`6z)qUMjDVnpBq!jpy7aYz&q_7& z^)!Oim5%3|?}bH-*8zfw%KzhDTgHShl^TukxvK@xKIa9GoO?*EElQ$P!#-#;^Kg>e z5}-(pwTy}G&zM*>&RusfTQnXd+8K)Nx*N%C>j)Cj)ck&TyY{G1UaX)sT9eAbFh*CZ z_Bi(G4-}#NNcDJ_5>2^w^_^}+~+mVyFlq36#_daQyl%|afK8|FumAU=25`fcTo zBB=Ri4B?ayIFRo}53gQbVZULn=PxwYEx89y=0`i}>SB`O!<%xSz|^%A!RjsSmFjGD zL1C45{*!){`jleVa5W-k=1ySi;W7M`(V2ezQ#GnyGPO>K}yafDkHgt_K&XgVxSj|CzG}V2>zm zV0~|A&*bTMM}(FGxRDryYNyf@@{6hU_iwpNEj2CFMNKHW>2Owb-f-`klu>+NOB6R{ zZ}Hr@18DUc7MONXD*P+9b~ppI3)=NNWx|y-3f4@?*}r@!z;yte3dtu$B;c8l5stOT zLn=Ap@4Ve_lBD5mES6xEH?&pj??7|xcC+;QZ&c_a=daFr(ArOuyP{V}W8&?J3e`0^ ziJmiSYvL9u;kEuho(nse~N(N>tR@`iJ4A+#S3^&N{^5sp(iz!T3{9w zg3R^1y=k6c97sq)&uPUCzCnG83uoKC6tk1*E$97lV|{G&D*ZE7^J{XD76ymhgBUBa zdlJC-&aQ(Xqu-5w3AE1-r zkw5TJ$RyQi)$uYK(K(}u^AB;aGi*^ablY=hfP^T0pIKz%X@WD*u|ReE$?t_^MtYTD zoAKvq(mB#Ew5yv~gM;3h&oshsN0$ExkWIdB`7nZsOpK?0_#|Sl9fY+nn-tnVH8e0V zkWV)#Q3jLc5A2#%Up(pLo7CKa!?q?|{UJmoiaIh(=ejIyC+JdA`FGP?@1ETXu~RRd z0FJ+sDRH=APaqkJj59}QEe}c3TJKkUn7+avR9y4Z{`&Wybal~clsJ6?X=vFDcG*mL zT$~DRuURM^-49qpMFl(97n72bABL*FjWW^dq<3P_Wz)PYis28*d{%ck{lS)i0s$=pbbj=y{hYni#9 zB|P?1*!55`|FdEt?6`f*N9WuJ^Zn76-zLf>oF3_Ewok9I#l%|>*5+?Q1FM|BeBlT03LBpovR#sLTJkb0j2CPA&+QjwDtx5+@ z0Xpc`W3`c_lh3$*uFFS-tg>E34+` z4z@I(65zgnk8Ep!+I8?8vYI7Kf&O@f1j90Q9PMXH2}J?!e7&Nybi%)>WkKrjdy4VK z>n*MJuPUmquFb5b_u z27Xn~UZTAX3HgdSO3PcMYV&HuCqGqXmF%F(j907Atz>U^*Oz0nYvlV3cEPHcv^2Uc zn{4GQFvopnT&bD3kYKPJXlW3AM5H6?sHvH(G7&Oe#0?^?fR|3{b!9JQC!vynpRuaG z!!WQO%5d6&&AJ*O+(KNXrx`yF65LY{FVF@%Ph%*B>{y?kVcO%sx9)JxCdl5<_szj1 z@Ne%{&*dCrBQy8*1m3Nb9eSE=n2YsR76MO-P#_VEzwmDF3>0L82B%nO+FyROs{1gl zb#RGH7T>H;lRlB-#YSGoq|*}cK%w`gYFm+W#UO@aA;IN2=E{#k^`Lw6=Rb@8Gzm&y ziPW;7l)kv6N!*>jG>-PdJ=S*yDTnfO9<^<^a9-}4NIqV-XDM7ve;yZkEgsr@s|10& z_1Nr`H~m*Y+8N_x{RYEL!Sn16?yH)a165(+gsv`;>&8jU8>osJDal?TG#=ha<#Do5kk)9cSN>#4W1li5m3 zR^7>z!hsFKNR*G-bXg5<43-(sAfUm?Kh`sTo*Hz!a_)C*K50C~=lnJ41Q>Gu$l18S zR6Q4G)X+d{--~eqZFTc96)Z+*+ru3t0~;W`_E#*0vV8Dr*i_~;OKbVWrNmeX>Mj}# zAL7p-e=H{HJuYPPvp>_USXSqPhO1Tta&F>^3p*>T_+-#*+qZLz7}vD9DW+AqWk`L$ zMh~L$44P(R{lnij_Nm+egH$*i4(p?IeO0W+^bfM}MFo1-5|#x?Ls~yPuPUbdMNbIX zJ9Luz>0_PBdSo_=64ZV$tC2C5=1$PiI_RbrmP6x4Jtc=1A6rCl`iM`u{*$irY!{^dDGm$E)UwJFu@y5uHS+mST}p zgqQ=Mc;vE3LSGwQJeRld#DXa3vweS@z`-*nAM0wxo80eoD?^hu#U9FsySr_a00RBP z5=BZ}M|Uan-qJ(?J_WEpv+Cd=Q3D*JqELmpiFi6ei^CAzDbcFlKfLB7d!I1q!9m)#wGV*YR%ng)Z~$76N4_i?ozbg^_2(ZkVu7`4LS!k6l`R+@p|Gc=G^mEg7k`(bID1r* z7P=x-Kq$B*WMZ;EK6!+)DxnCSuM_6Mr*^3=tHLl>{+nRQj-<|AxRxf%l{&Wb^w2Ip zmS4+xoiOl)PNMIL$1xte9!tC(O+B92j9&`Ihopt`eFFSa4pG1b^DVbnu$()@k>R%f zJToQTE}^?I4JN1}6o0CM<9CJjb%x&#ehkvE1U!Znw5oV;S78MZ6G_S`s#6c+G>gu7 zw9G!Dsnx%A?kjDRFCDV}NvkQO zQ6XKtUuf0!#ert_2`kEUP}-`PlQ5-JYYRIG3%fE?0G62}Kp!$Wc_v4Z9lh5;u{TZE zn$8$3ce-Xs_4Uwmhd!P*KrqW5e&lIlM2f1qoj&Y$DWq?3h(k5(ZI-!fxg9dGfK3~D zNktYpQPKGt(_O7B&7=F%S_1@vwes&h0I>$W`32IR6rNsw7tVXUe-@?$F;B-IPWFx$ zDz!2I9y^NLyF0cIyOLsJ0#DIU^q^cXYUDBhJG9*FwRLIj#bs!0TMVdK z#Tb~a>&|(UHIWsk1?p`kPIV|saB^~j>QSWCj)ysekECSK{V&KCvya{;@sNaK)Dzc6 z&M4`m5s0HBb05Hyv96T9TnoqFcjC8@(6#6Talo@VlZMEq){X&P7T zN)B9PQ<7!Vz81xzH41yaL$=L^lA3YfI&Qg>rL-vAtqsq_WVn_Ij?SkRv(KcaF+u(Wm^)(wVkIFc5lZx(3rDJ}j2VJb~_3!oGq7S6z& zFMf_K?=J~87a}}S5^O=HL)^S4eO*d)l8tCpAN#vloC-C|2WOZ|*&)#Z_x&r-m$_LZ z)UJ#8Zg}FR*~?4Se-#{zrWq*RVN~AdG%(et-a+dmE-wD*n#cFM?S;88P%>-Hy}7f~ zX<3byiDA&8p9KVsTHHreM1_Tg{Xw9V$3KHT(d3C>P$72#in=9RTX+OGJMaMKrs|}V9CPJS243_o5Vhaq``k1iiFSC*H_$rt z#NCZM7~nSW^V5kUg0-vp#Lg>CH9MuooHHxePQ4alEx4Ts*Z)O)Y{5CCR;=N7Jfg_S z#bf--TUH?(*eai^wWIu>u#R-|@nD0>xMj7`PDQPYq{|O#ycGBdz_*sj@!!<=IJu!} zY8MT6*la?V7h8`PSN8~1?jfjxwxEkk{Stu;;ZJTJzP$F+-Aw%Y_MCdEfE(18q-}2R z+$C|YXF9+*PE;DA7be`bSzRbV-xTeaq^Ul6Ngf*N>fg(U(6Ul)M9DJqf%RZ)2yg|W z-mB&&tgZl!Qs0|Of^Jl|nZ~KJLy!C4)-iZ_ql)Sv-bj9+QA55p9gK2$*FSaME#uEK z589XZ#To*A z)sSeH$LeV@40jeIL*s}^6faNmMnxGQ5|z?-6D`Kk4t5a z@QBVfeE!dF_^(7nnzT#QK3anDfKLI8qdpy`mHjU78Ao4E+l*WRsauweE&p88a^rT(Pt#I(<+CF)7!UW)6-~QYkAT` zMjBuqTOl1+>9T;UpT;`_%^WT~R95=%-ArZ|ynT`XN+$vS|JX)PxxJclbE(%KtOd(> zPY339K;5xAMV#_&Qyw{CR-kEIAcOnZ?5w-4oZT{4<%VN3MRq^(urI^^-W%BHFd)_Y zT5C+#I@gbuKK!%)i9u+3crFbIIi!l&lGxAw7x@uLLa;2ZG}JxI)oTQcbO9Td>l=`a zRM)++**$B{Vhxu6KWQ#TPhF8F%t`sTykAcwMTWQ};*9qW{t552ny`SIj-amHFnK{qQIWzOrJkM*Ys@STk*n-0_!Z5?I!mz_|!f-;dKbmDuZ`8VAVc|S|>V-eU=^F%uQE4kFv}SZ>%Vh5?hh$`|-ezr(O7;b2oycZYX(d$olkMML zeACc*T55WK$tbWj73FHRIN*E)8?7tT z)z03cM2)GEV1ef7F5froi2bd*2O@9Tw=KLL-sUYF=9{`}kWqf{lO|^zfHfQ}udhBt zw_WOY(L3!@O1T8C8*DK^;tzBlde2Aj!f-(2v)LZwK{V1ayu{Jk1>CXFgVAoA-AdF_kr3GoU8>l4&apgg%| z=Bh`aS}n)}b%3vbfI_ZAjn|Q_Gl*DwjGw4j*V?;Y9T&)cqMi((9xR=p#`fijq_Ms+ zHj;`H1D4ZuoP|2sxF84hJx3&onQamp~Rk`z(=E;H>yzfMmhh5qCkq( zVCrLSmrzPrBV&R(Cuz3-P)uCk)>xracW2sPzBxB9(eB;LpA+`!=L$pZ38*>4#qwh? z9}S13Bz;dDi&~*}W+{w{k}_x1&gUq*Yc$*j*h5y>OMiO~$r&vo=6Q9GRg{z3du*Rg zlyiK^DYIWU$*Gt+ycm=2Gl>v2BWoOK9RVDJ73n3lI@&hrIbE40*c{kW%J7@9R>9G+ zl#6_d*JlC;Bo+`C6Z7;$l^^_n zr%K9|pm8JS-_A}#)Y-aG@M+IZD$Yb@s-#z1?ITSnTFEZ*L#5n|%{` zD~@IxO#?biap$Gi*|NRM^t04*E8T!0G9{?xqkf=(35x55Jmg9+0nsps>Xp4_OF-nJ zS%?V%cU^a96tAR4#tV0J%?%r4sR_=TP|2i^}e+|4;(jPaf zY|Ta0((qNz4X@nZ)%(SFx$HOT@$pC#&xz zUp=~qF1~;N-m%@g*68;DvE7?tiru=jy>PJt_Vx@2l8R=`&!bc=2ErBiM43vZ}U_p}xx4v~T zbApeak3wG>wN+NbJs)8aCea|ppj5rMFh&VXM zqra3mY-2vM_Lkto!NI|g@5`C^Nx_!>75HVU zF?dk+x4R3WUZ(!7YJ5u?#l&)!1b;pEK19#^AGYdamvtWvExG01rjVgILI+uR3#YsM zHG2bld}y6=#~)#0k4JM+yMY0SVS5k_y!O+lH>iJm4uKT@qZ&?7Xa&LJ<6k^*V+*vm zw}ypFo@Tei>7WcrTHkXMQ_2LjQ9Bo2+QoOF$^H zpSf?!`?F-zY0`ZfCqpX}Y>?S0uTqH~N1l!g>IE zFJI95_`U;Z=)B9;Vbo4^ zosG-RE8N0iY{6IezHU2s^7OtoQud~Koq&PU@O-mIszffkdT}O{7%lm&NsK9_11QL; z)q-f*UoIzG&|-g#hTX!?@ZT7ew%;dymPyN>*A$@Fue4=yI#WBKZwLg^j++^%ly2(* z<{!WM0Typ$wl6yU$!HoU9;n9iTrQxpQtkVS5yY)e?{M0Mvb3n~I)LAOFYhA&_hV`y3yWsN@I(cpDcJ``hyij#8BSq>nyChZ zF0O`|<6Xm1ltnDegIRkccbuTiezr0Jln2dk`hA?MhHuNWAYvC0!&yko`eEQaIE?p3 zoXexk73K1Lv%dso5~y|!*zQPw=MKDG5r&PbX(sejLf>DPy8|w?MWW5PIZ!C{O<8m_ z@eY}BXhnq}_)op?3GvD%W+B=()J6PZY_2<8m%pB4i0S^jA3l)4q2@yb$C$qC_lr+X z#*I;3d4Xctxb0zMD~ii$4kem1yvkFJ5z}Auy}vjLL(gUwChSJ{kQokkGs@IqcYq)yg?h0&!110 z_yW~FhRO8~`P-2!A!V>~$F|Yp-Wurwta`|*Q5O@Ud*=JgwdC)$pp2%|o@z|=nr-A5 zm~O!nPAfenvgJoRw~mh+=x_M;5w+C`4!#pQ--u_sbQ+rYzdU|U`Rtp;AA8jR5Q zfYzzJ!wo0oI{Qh`mw`LAuttcqtsrYpLG8As9N%mxXGgW5W>{{f_HJ!~LokqXgSm4<^V{J z?+bHe^1#}p+)X(r8yiNZlqV+00p$%fJnG_;kOEm9XuJ-jd;@rFNViYXnP4^&GGc&! zx&NYIpm8Lbg{Mi8oN+K3P7M$Bd0p0Tw+CiBj)Ke4?xO{#@S<@j-DbB0DK*ZIV1| zM;`ump<&&%0Xc*JI*{ZQUF+=2R~ck1F|;?GFF>tL?(*G}B=Uy)V?0iO^9~jD+~j1= znBy% z?XYu8Dk;1Yw6tY$x<`{*?zG1D9MDv`2`(r@COMk>x0RlFW0q%HbveG-{KnGB=T)+U z0!8k`rR7r?J%}#g?IR1w>}$1F9cB$&kmx&Rhxy6+3hDTekPx*X^&-M?)Gu9B5$c}_ z%0`g=?|a}sMoixHR=Rz(OMQmOyb<$_8XwJU*g^Rp?^inN>iBoop5MHDP^P1^VqX<) z{?W$%@{2F$oZEWDfld>O2s&$OV|Z~ENFP%$4uJ4UlJtx40+KL&u=qsaQKHF2Spql9 z9AUWONe$V8#3OBXVhZ40f&|-lEPkP*K(J+Xf;aLr&mW$n{kb^bYz&v+A*tK_#lJ}d zhZGtkP*cJh;sq^f-O#!Pnfg zFGI}$6yqK}(cy7LUMWM%Bnj(oYQTAyqg=kz&ItAQsYZ-RDYIKo>W9L|a8$vw6N5^9 zZanjrWuL_Ls%D4kN?Jn;z@+vB$K2ietWB-p%bmYk7}oF$&m>qg0$mWg?0w}R8(?;p z8UD{S80Y-g(Eq6cnsCt~lZ`lFMt%6j_Ol7o!n-EZ*Gm~}iGuL%nAhH)SbAgtn>j>2 zvqP;sdUOnv!ULtYbCL1ZTE=x^blOdFsMFXJ%y!+@r=-Mw%;DMDYYuV5$6>$E0GZz^ zw5++CA^c8q-{*^5ry&Zgpy#AwslRRLqH#B)CPuzJkpN`3cw7oY{-L|>H6JnV#snP` z{#xRq%+)n+Ejdrj0gqBl4!Cfi6z@4B(Y9C}J@ooSFGkP29SojK3J|EUXLl{|`okZl zvNw5kL5CI&jb3ZQ6)Sf-ImMgh&TUWGPt3XV)c&*TJ$Jkxuq8);xKr1F*13F;r+9jm z{F5V{?ona6ng&EHCLng>5gz1wScF6=W*;zQd7w)2!1*AvMFP50Kc7!3pkO5@jGI8d zLd>dx-(8DOf@%G+L6{j1lp6<>qi!1JesJHtkJu--RhUM# zdVybLaXwckSC@yHFkI>1i?3f5nPMa(?&I?|AuvWIN1#6L$aNQ-kQCheSoTqXeqDe* zYfI(GuBOwuB+I>a`B~x4Jc!Nbm$eP`?l<#gV0zTc7cYbkUMK1LS>zV|8aCbnK+HTO zOBe=NU@>Cc*6Uq&XZ!JEM!|f4^!Tv_DdgJW>`SAZUjC(KFKw0@{(No!6!N{9@v-)T8 z`q}sS;&SZZ*>)H2otOVT-hZ0q2NW~4{@>N%N)K5+G!f&8h_NTCH|e<%WFmlfgkZ)-Ph(cr@WbmWV9^`%*H=-B3f> zmf{nGZQ%F$zXM-;7Y^VazJ5z|_2uiu%Kl%T8?+ikzh|myvCa6kpG(;`LZ|VT8a@+k zslY8c<{|#<1s_|wr^Cm0VU3sDBDC&aJ~t}p-|BH7S&9EyT9jk~#rE>=#wVQ5s=_kf zHKz06zWwqLTAkM8d+Q+n@<=DK8XGi8KWRn}xH{(7x$Q3K0dI${F7QDn_HHvidp7p9 zr(`H!>UXC5l%V>#sga>AV7 zF@+bVgDah{!)a3b?taH1_jCp~V%BhY@r`Mlc0Eprei$36S$JkAB3yC{5dSjmaZNk5 zfG@DQ&+v$Z@ja>K0`JLM`S+B(2N?qMxj z=IT%&)@;V7zo6=Zd3p=))pGfm#x`QuI&ksipGIz5Y6k&I1UL(Aqd-*BCrV!{_YS_s`zU01Vj(YD4G4^d0Ec3&SCFBo7N8a_F{DEkA zcg0zNN#;THGfs7Gso)*`)(KXqT>`r?Cu~h={N3RTs6>Whwhx3xq$< z`yeAhr(X_l^;zn*kL&a9<~-I+7mHW#B#-K*yN=S3u4mK`nGsn z^b((#NG%li?C9@Lir(Sj$mt$D;MQ}u>a^j$i);VpLrUL4IuVMzZWu=9ryRFx?&(Wp z+-2^tAEfypc19$Gm`R#ps=_Q30^o&u!ppjrS>EIsRET>%j{$ZMlMvwNTBq==gzPXX zkUE03dhq;>2Yl@N0clzPVzJ+x?Ct)fcjOyuS8G|M*TsV-#6C~n%Z1}Yt?UU*kp7k| zq5kB`{*gCCt^{XX6P1nqBeRi0ogqa)7aVzfnLY9M+#c`H-8n$h5*@k#(7VsnRJu~+ zk^lXGKr$Cx;yKA^;)5y5-$tI@6DK{6AyEERjdlTeBYDkxGBnK20~eI+?&J(OYBBh;77hl1kchKt0{=DlJatu7 zTmiG@k3Y<0s{)Rcfx;b~bP82fW{Hm@Bf4*GZ8-!4NI|Yg%TITH!Oo!(0!NfG?kG+d zvm2`P7wb8ZNS}Jlt2v%u4pZgA1KADtI~okY?Ki%y*{U{TyG<6kb|)lp zO)4+hnPw8oK7BoC5p=JD&FD4mt=36<{0FBh$6M8pn3%1pngA;^^9V2XYMG>Rn%3-) z`82Po+aBTx@ua4?v!~S4ZI-wSFRgQgR=Rh1ug1suCX}j~Guu`1T0mRPm`F^mJ&y0` z-Yf-fC8JH+B7Jxl9s&fout7r+!228?3uLTk+jcP}3(k7#g^1659>7xUGzh1MOw|YBY zA>YwKOie@G`j$sECtDtuj4`6QM)aoHm)9%y5wi4Zxl!&1Dk@MHV)*g~aWdR1_$Vwg z<-v`$a4L4|&$f=wO$%ElTW{#ZrRTW80m#?%Nbd!IGQj_QH@xp{ckRi>QTqT^mG_RA zsKXd8MwXJt_B@dW^yXLe?c7%N$l-zCYvw4GF+brUtFSY-F&(H@*ug~iJ(S~t&VtJwb;Vo8jj!s%( zq^SB^s`DgBhEAY$)or6wyJJnzZJ zL>S&)#KuzsHq0m+eqokQ<-2E>G6-FtY_peYpYha1@sGbkp^D}ge$9XQ^f4+**#@xT z{#9MgRPLXnuk#jDn`Ei*H$Df+^V|Jif+Y-AQBmrprKR4%!Omn)*%7V-AwKJZOiDGt(|Sc6+Is)EjSce-dK*Wl6wI4SzV|prm>Gu%HQT$=-VL4@9Ol zLmw7+o1x+q7))u$Y+~CUP{GA94*^gs-;Fhw-1R0e&)B|spHB9-P_G`JY59d`hzJXp zxWm|w_+6Q^7p_uZ zD&L+_et)&Pd4r`Sa}P&S;_Bit8=VgEW6dHj5)K_rR)Rfg%Zx>mb^jCG_ncScpMSYq zJQA}wzecsyfdS=#NvFlNy>L8lk@%n;F#i9hwLr zU1${4dO!GXV|X-qO01jcnqwsHqO5+c4}t+!*WkBo?57Z4bdB0`}hr`;QWm>JuA7}M25 zs8eVT2=#FiYTyfF`I@->E2#caJ|=$A&3k?F<%6|4`pW>}rb%J$z8j2Zn_~D5>!{C? zQQS)>5a{E;lRX{g4x3@}+h+5}TcRH1a@nx^pBW*VL|^1iE)QFhLXKR{IZ_0&T2~_A zq^B+Nzz$;~UwK+jDn+2Kv@mh_Q>oG`iwA^%fP-p8boFTin$<0mR|UCXPV(HuM=9TR z^C)l!KF5f_v)Og;ZDG#>NP3({E{bCXTE5p{yT3IL8@%>nS$7tO?cfbWQk))Q2lFix z8ODoSD}po}g}MY7_zMK3L6@YUm58{us@1p67p^p)N~u0Q%j;g=9nF*QTPL1G9m@Iv zuuFFB2P{3mPc}v?U-O>&TeHet4ddaL^Q#4nt^XK185RMMY0-bDAmtSB*PAbxp@pCQOIZnt+iVt3n;L zeP{U=Hg0=#LCs2NGxujBC9F~y6wH7_clAud?KLAE0bk?X;RO68=&)vQpZQKK&{9E# zHZMoV?5qG78e2}&nc?!*DM#9fth7b*8$7sNe`f@aR)&zuX{>-oJ%q5|>XZ^N#Q~w=qbKvDdxv8|n z<&bGl(9DXt{B=EegQwC-qC86;S1e$-F+0Mv=TF&=qyr7`D{p4_fp&(%-vAet;n5_< z*5k)Sjm>G(XiN5&q3gA5ulR0b@Ui`p`?)V{NDriIgDV5tmd}zy(ZZv+OqaPNggBWf zzYZzb+GbX>1$cRhX`gPtBk6y+lwo){W)qg+I^^WsT#h@k)2iq|j(llC1PZ<&)}WN; zSpGHE-6jOgg$@#vC`uIK?i-ji`%r*T=)A?u!Q5e{EKe?OJb}5M7wIM8BHr4MFR488 zKYpa_A5PDfsqu&pQvtmsLU9jkhB|leWBarg}o1lMRx!GW(7>{rc^l%-!oZor=x#Lct7xD+G^@e z!fh!^vsFL49G#2QfS~)z4fI=7d?Rox8(qr4nd*K(?d#s<@=j)IU~BwBP)`p1N<;?RQV#Zpe6F0;Qm$|vlwO<14*)q7AGT4&A0NxKSVA)E25erdCeHciHn*uv^6;rJKWgi*gI(?&p!Hp(Y6 zxVSu-XT+`C0l)ch$NhkxdW$s-|7?slCiSS0wzkLx=(jlYilN>o_p9sR<`%~0t_R+e znsc8|XAD~dwxx@46dG3AF8BbuIyfZH$!6!h*QFK`Qik)B{sj9 zgLVZCFUCqmvY5gT%31wlNrSnf*M>fN;bCB4OjqtGHHdu4Bq({Alnn3<{gBBnLg^Hu z-bJ~)nyX6*TM+o@oNj;G-E~9@#HiGXl(aM>-t%^EFIn4;tj(gJ&J$YD2>+1c-{t#- z+qO0~n3b}i_)dBv{f=1RMa7?&u<5_kMpx`53UO$O*@@$QY)^DJS0*A>9epP>bhS8Z zvSIqp3-!)O>B149wTW3jv}8{cD&FkE1THGX4CoQhm({|%uY zYyO{%Jfp$sTFUh0ir?nA{plW@tP!0D4`KJz3tw{h1dYs;GeF`H$wiLLGD`aTUIHtv zip^s0B{XfQBH|c6z#)!L%Rb_pKs^YkdSYv*#IZU}zJsmZr$Hj4H48GXr##Ja7JOL% zl(sXxLBd~@9s@HZ()-U*PwYIMs3jex){d_<7W-&T7BRzPVqkYV2K|tNmGzEtx!ptt z6(D%m9ygXb9KDqift>dPN=QKstz($XaZKgVBOB!*9t!deULL9-o1Nd<*&lYD18JTR z=1g95R8Ld-bYBs=My;-(H%jlGwu{?S8+fh+;8?fo|8L`Q#!`7YGxX$ss4)DvMcP21 z>J}6%430GEc$_}T8n9EnRKj~|IGvMJ7CEsJi<9l@xeGWfMl26Spf_WxSHJ*qi?#(x zO~Xl$=r#r-&SxuO{uv82ZPeHn47ux0 zqeg3y=?u~K>04p3rMao0x9DW#%Ju7WF~r$%pE~ghk)w4^r#)9tmf*wVl%w@++GQ`@ zCH6;041{$m(3Q4~uD0v8wzhc!{boN`-RQppiO*j>$Fcm*J}_7K;*k*k4a9;1(Ywe? zQc18Bn2(`*^w5Y@_62D?$hU^^D?fH`-YCZ!NRoPNpvWrd)ZmfS(BEg=F^0kTV1Syz zgGYEXCSrWHJ#7pY7FU6N@H>b|Ee;vZEO^%X#X3FbwV~XN^}UDWOFLvj$um2Vs0A}u zz{BxTx7?0NprB>zmn2lj@l$!rzF#Kg(8ujl;7bX_x#L{(!1Vhd+eDw3wb1fOb5JX* zgamo5{Z#j%Td0utx^0`&Y}a>fWI^{f?`zFWL`=+-0E$<}9r6BtpbOiuIhb?b0vz-AaaOcU@IrNom43;6_p{YYwrQ6_meL8R$qghB$NRmWAZ#045UN zqz{5_2?V2=BK2`$pIiJdaDD8Pl@+ko` zX@yaJ6P&=YI&cupDziN4J1?5I#q9Wq)1H27uyUpsV}*7Gv5t=5riYObai|<1C=)43 z^`K2--DN`X@T{ZO$#|s5SYOek$>#+06mE}-i$1yE1!}F#C*bS`6L)K1!)&Em14Kw_ zzx8~th$9o*lf=(|9zHSu=IH!Ze8>u0O9}*ZS>4DT=U&(uE zkb3X9KSQu4(xY8Ly*$v!KzuPC=Xa$NW@(OZ!!(?ZB$Hko!B2c}7EkG?|8Wi7i$2{} ziv+n>k54AEP>>+m#u2RS&z(&V%=~E3yRVgn-%1V&MiqvORuD{I;44%&JsiIwLmb)P zK3N?&K#;=^Gop=^Z4Fjraubv#y3zFH4M%__v)-VR$P&|{U3#c^1VG{9Ae5?tf)!63 zs_$*{u;GEkqHBvoU)+=P{>VPf?p+~FP;PdYa>b)C^-ZvitOLGFO|$ARxcuwmOEp{h z*My5|F$_+(OOY%92!sYLEJ;0l_)uNqs)f~emAMf6%&{J_*Og80%-SDO9{V>I9TOaU zSFO-L)>D{m6olH4Z$=x?NGI{-p|s7liH@EVEYfaRhG!9~Jlq8}qs%x!EB|&{AxQrP zUF*9m81KVDDUB@CVM9dY7r0}O_%->hN=4SkfuX8$V|*Z}5;nb+NDQtm{z|B#CKa^5 z*{l1*`fbw>vL@@vmc7C2#1s?v!zhgo)tI)rP&d5CdO^L%F1zC!8Ll^;Uru+qZKi%- zak_Q%c!z|pc@~mng_=^4`Z_0;a~cD(;TeOPn!Z-TmJFipkq5W5UxGo{;n*u{ZAWxJ zGX_171tP$e*KfP9@$Gm|ku`7MKh^1}1U=vf4pPX|UNV)W2^QIPYr3eI%`upC(2WJJ zK733Y<%On_dh-TO0q!b4y@40H(8#0g_1nG{xmav%u;dt8IQih>tqjh%*Jr$^*MK6& z>uuIt+T&V!UhP=MC0TsFpc|$yPJ26g92b3{30%eLRtTy(nh>eW%CN>Ach8>CEYIE> zIJ_!6NQZqkHQbZJG5&Z!&4|xLQ@R@0bROL+P^v zKX9F_2Mb|dMm)`Vw}P9>_#{qpTCgu*%^CN*l_mYg7Oup79G80wrym?%BPe7mDzL!W|Om0xc|;}L5XaX(govDwJp{q{!2 zI}X-#)-W!LnmIgapH)js)@b@7^iF6fqa~d2T|O9;bR|{e^pfR5w~-l+upL^!1OYoP z(9?#>B?0q>!$P#FR2{7?TVW$PU00sOeU~Fn$|9*RwJz?GRMeNIi_$<#Hg83sJ|goO zQBFqeR+4E&Kf*}kV-_;#T>&-1Fd*%0dL;8YwO=-zq_Xz>X^(V`5ya|hCKFd zS-*(1jSno@T=24Y*{-e(IS5t*;@p$vG^VGkCj91B+T|c?E*BA%j+ge}xayz1z_k?f znS|{Y8cB6^0aW)gwzakO{{G$de&{%egN1#EXm)mt_o%*S6wr2QveKJHmTS%rDUd8W zBv`9SxBTF~M#HGg(Nd^Q{0z^0#>`nZ;Dy;DU&^QW7r#EfvP-V?--x9X-G1r_ug6gQa09U-Bs}drk72Cb zOh;J^G-melzsT*$S??}*eAK=+ko-*$>Hd1eRw0Bu?&^(@);YI(hUBy6kdU;%6M5xf zUyj^*ALczXrq5!D-Bwq--c|0iVm{wA>5!w5>P_ynKp+G+RSY1zUI)6z)5WmR+pCJS zh&K*%g?$Te*ZG+=(b=qhWI)tuhB&33=XQ=7T<-AvsJmyS$LMS$s21PX*LS*UOCQt< zy~?Ig_6X#bUSpTrfi(PuPRa4WgR|T&_r^&RgDL0;&s0^e{n%8tBZ;0f8HM344jYr1 z8&wm^a_e+m0eN6d+2WEnlH(AU?-Pq3Bx>H{3{l&Slm+pd^uNi;A7_;8XaBJkJ^g4t z{|QyKeq{2|1Sz-(^<)-EX4S(uJ{5Mr|5kjg_6JXYAbM+6=NrX&(7Bs^U|ONSBQoky zwbpchyMT8cRMs+;;t?h5998|#_d2uE*J2!Q&}6jr0ss$NB_t%j;A*&Kn#-I(CjY~N zwNYTDBF}}}5I!ewUd7r+B>_R%vz61WF@?NeJJt&g5e72dl2cs7mJ3#gAdv0Y{qUGMF}5|?Aw%>Qs^t(^ z&tu*oE*&NrIB@|1)n)UhWM{CD4csh06jSZ%hruiKhv^#ai^pgph9xr}9#;KXbMaJFtyJc*4NU($NX|`- z>@sfR{W{09WMdRc{>?z<{@JoM!1&nCoGn2ene&EbDe{SQ>Zb<_9Ag{WU03eh_u<~D zmw0%O`)>j+udi2zWv?j~uZ0^=?W4rNHJnFG(#o4_1ZZff#>oQLM)LgAKh;>7<*47w zEadb|duYh{rBCtuohJk&%px{5=E!ZA8kY!uYO-zo(q4a=$~xCcFa(bV(j zCvk4u!u0huSMD!6S^Fsh;UMzUmp6Ot!D`w{x!;y_Z&r^#cuM!Gi0) zznPdk5VN545;P1$cVN>8Wa$%F{#}eKgDo}CUe9iB%)#Pt4u(_)oMjK!hFkjf$R*i9 z<6CF#R&k1Zp~obIFP9LwXWPERMweW-)92D}^*q_+ZpBk8S+Qk$m5U4L=Fg<4={`L9 z?9v++Ebi-zGR?b;pr*s9Hj8|v^%yfi#k`$^)h2*-XB^|(sdVZS;E-$c4EJDs7IIX7 z7wfjU9&X1iDS8BydXPggTl>k%g%jo9sZO5}ea_4^dBeg}ITW0%U_+()YpJCAtYLN2 z8lM7v++Z3TI@Ek<{j}0aos(>KVP9Y98K`fT)$|6)g+S6mIJwQjhQwXlVUP+~| z(Jshse|2+(Ksf-X>u+~yqH<#SB;Vw`=euIk#XW{b|2T5ef6AZT$``#7cl1_4GxvyY z1E});I(1Z6Z(pAx8qk%-!Qm)aU%S{ezllUp+fLYpA{}k@&sw}v%&dPtv(inYKP;d0 z7Jt$Q(D!F!3?Jmn^KY8`c*z_~N?7lJ8}KLo^f?Rg!xdLDJc7_RaD$q`$3@Xr1 zR+=GGd!0d~YlsXVkn3!6K@M*rVmI|gAE=B6a2%mp1Ws(Gm3H2L=zAsO{8wf0+aXj) z`~g6=c(CgYQgGI02AR**eCiG~7B{qt5bvP*d?Y;r^|k#|V)ygqEs;KO{Fpr)Guro> z$;7CE7z<7pV=B*SIduWISQm%03ktHFF^G3A9K2E9T>6mG9jAuSkzYQ0Y<2kZSxM)o z6*c)-=;IeWe|{$mm=2D+37oSKOY75W7X#g z40}jUiJ})vW`E-1@`urBN9;r&e^~+|0#y`S#qux~p5mZQ&DIPfWGFLqvWM(5?*`kk zd3?|+E2Td{%u2um$u-PWzE8!kyH7dr&`)ye-!o@fJ`SjPYByFb?#zh{W4ES2kO98; z(#ZB#EVKo>eWQJL1<`<2q9+r8e?Jkp;i8(YROBIF9d@}rbxtgP@0f9Wk5ELLvgMVu z`m5k31g1J`b@}jv@Gct%7H9qN3cho;Qr0#xBY-nW9jNfIu z%{qj!Zf1Vvz!}*;*+IL1j(V5(9ANoF*X^ZUp~Bv_wA3`Pdx(!A$VNQ7&(2dL23p*{ zO17IU76GveUdsvc%RlNZsf`pW^9bb4oKMDHRx2yd?qNT6z}8KSuaComx!P& zo_iI=(o&E_%?0PTT6^5;Dmqy+ySTwYc6^!4Z<0y5f!Ra715-I}CsGCw8xeGxfQ#XY za|p9wP0tyxH^u!|=Yef$KK3Mv11eAAIA%_DYf`{9keV5jIaRx$x3=61r)q(LooErqa{9r>~jhrFJ}6c)h85&0KNX)>&z^Q@8>2$!7k@f^J*vJOv-8y6gP6FL;AsMtYHPbh9L3;iCx(haq1>P<72@n5a!-Rc@A_wz zM5Vj9*L|s2KgC;omod^IQZR;j#sTNjvDj7T;qbd%36J|(Y)hNB+a=RbkH?6X$20&J zOUJOoRGZHQ4K&CXXd1gk1Mcn|ULDNaEX>u-4^r#{T;j?qI6_$UU52lKv(@Az^kANS!$&wl9;WERGa7!pOb@^k5u>k!(?~mf0(SF zWqf)}X(p;tt|?bgQYJvW<92UwdAF*riRT^QJNk9YjuCWxQ#EV`BQ76-E&f!6)|Oc*AUBx25dh#u8q1DnD*kka??C*RZDC@EPh^btB(LStj1MC?9UZ>J zlN58wPzB){7+L73(OrEj6ca^rWF`7}8iiY$g~N93!{R{<0{vFzQ-gs1I_7g$0EY!X z@NF_tj%qEBslo9@p9VcSqPO4ohx?+4Nkusn&5P&!>=>YjAJ+s)^oeq^S8 z9?DbBzbmaz!1yTx6iiH?vftbQn5XMn%u5t(KE5x(W0P!6vLN%3zqI%(JCO$|`)8lF zzFH+e5A1F3oxHgRG9N2ovdMoD^>xKIKm{5^S96Z@Yb~aQ7}VTcRPj)Tz4KjPNAgkM zV9o($Z}6y<8!U&MjY-OCAekRukA_`sJC5<;Lm>iebYb}d4#^!$CFli2FcK=_x&_g? zbl`He$B*BcK6_VkvkCi8ix#6#ogF%Wc<>9sskS}*bri^DkuhWX5RpE`p`0J&80ard z_(T`wPE#$1AQJe-uV% zV{1m(jk^uwfASlkL2sqDpAe}yCo}ZRw0Me@i>im2H(*05)&cnm1Zc#?8~9anK#E&g zbG~3R9~RHi!r_?Ov0uxbfBTo8$d%@S6tsy5sg zwCH_Xk`Lgr1*hS2)M{)?NO3X|Jza24!$6grMV6<3ue^N4*8r2i3tltF2IDE-p2&>+ z_=F9=U$^Uz&NEFWi|!e#ND+rQV9GjJ=R8Z~rh|%xUeL&(Q^+6`?X^ePsH0L?g?#n< z39^DdDpmhWpREyra{4#r2n-77ZS<()@@rJkUqBXpT1VwcdHB!nTGz|P$2Cz7xCxL4 z_-wtjA&qEHfg||;WpBjzD_z;ARFr1pxVH_Qi3#;Zu`kJi*vcCMF*5+Q6-(aIe z1zoU0?gY8gpeDRCtJ7TUyWUu%!KiOpq{!JcxqGbz|2y46QcYYe;d@s?lp!y(1Ea|W zDS)r+6d~WY^SsJjWnNKR*7vB}TwW$W+XM$;0b`GSoc>kV?IgY4+|sol;d zaxl0v>+M+aYrBa9E=Tb3y_&;dAOX|p1M@+5#UfV#jycutt)K(z(W5`?EX>o;Ro

tNi$As4EZ`xAq$dpH9XIG< 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 S<0>KGOIbnVMS+~D|NjSaK)Is; From 20fe03384e86ab901c737c7bd6ab93fb68b14c53 Mon Sep 17 00:00:00 2001 From: datlo Date: Sat, 8 Feb 2020 19:56:33 +0100 Subject: [PATCH 19/48] Remove OOC enabling for vote on round in progress --- code/controllers/subsystem/vote.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 27d499254a1..13beb48727e 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -52,7 +52,6 @@ SUBSYSTEM_DEF(vote) voting.Cut() current_votes.Cut() - if(auto_muted && !config.ooc_allowed) auto_muted = 0 config.ooc_allowed = !( config.ooc_allowed ) to_chat(world, "The OOC channel has been automatically enabled due to vote end.") From ddaee65ca20e1a51151a787ff4c019785d809cb7 Mon Sep 17 00:00:00 2001 From: datlo Date: Sat, 8 Feb 2020 20:00:03 +0100 Subject: [PATCH 20/48] actually adds the check git pls --- code/controllers/subsystem/vote.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 13beb48727e..eca632b7b95 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -52,6 +52,7 @@ SUBSYSTEM_DEF(vote) voting.Cut() current_votes.Cut() + if(auto_muted && !config.ooc_allowed && !(config.auto_toggle_ooc_during_round && SSticker.current_state == GAME_STATE_PLAYING)) auto_muted = 0 config.ooc_allowed = !( config.ooc_allowed ) to_chat(world, "The OOC channel has been automatically enabled due to vote end.") From 9ad2c73d4b45d4a3388e8a849dff9e5a1a31072f Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 9 Feb 2020 15:03:17 +0100 Subject: [PATCH 21/48] Fixes bots not being trackable using the chat as AI --- code/modules/mob/living/simple_animal/bot/bot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 1fba341fd59..c9613043836 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -146,7 +146,7 @@ access_card.access += access_robotics set_custom_texts() Radio = new/obj/item/radio/headset/bot(src) - + Radio.follow_target = src add_language("Galactic Common", 1) add_language("Sol Common", 1) add_language("Tradeband", 1) From 17c15e82b9cf47b459b8b37e825bd702c6d204d3 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 9 Feb 2020 22:26:49 +0000 Subject: [PATCH 22/48] Test PR to see if CI is broke --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index eafdb5ffe91..d133d50f7ce 100644 --- a/README.md +++ b/README.md @@ -140,3 +140,4 @@ Creative Commons 3.0 BY-NC-SA license All other assets including icons and sound files are licensed under the Creative Commons 3.0 BY-SA license (https://creativecommons.org/licenses/by-sa/3.0/), unless otherwise indicated. + From 78a444b206dfb59c4fb6f9ae834bfe9362886a88 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 9 Feb 2020 22:44:00 +0000 Subject: [PATCH 23/48] Does this fix the CI --- nano/package-lock.json | 473 +++++++++++++++++++++++++++++++++++++++++ nano/package.json | 3 +- 2 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 nano/package-lock.json diff --git a/nano/package-lock.json b/nano/package-lock.json new file mode 100644 index 00000000000..0611a0662fc --- /dev/null +++ b/nano/package-lock.json @@ -0,0 +1,473 @@ +{ + "name": "nanoui", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "optional": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "optional": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "optional": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "less": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.0.tgz", + "integrity": "sha512-dAui5qzfxuWY7BIEt9/gy5EbDhwDb44rqaIUFYeu8wEE8huMZ/PzB+gNFONEG5DUPrOrOGcAjGeYVg6AFiA9KQ==", + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "optional": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "optional": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "optional": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "optional": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "optional": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "optional": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "optional": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } + } +} diff --git a/nano/package.json b/nano/package.json index 9bfa118075b..f42f42ccccc 100644 --- a/nano/package.json +++ b/nano/package.json @@ -6,7 +6,8 @@ "es5-shim": "^4.5.12", "font-awesome": "^4.7.0", "gulp-clean-css": "^3.10.0", - "js-url": "git+https://github.com/websanova/js-url.git" + "js-url": "git+https://github.com/websanova/js-url.git", + "less": "^3.11.0" }, "devDependencies": { "fs-extra": "^7.0.1", From cbabaa8b0f431807544e9a723017feb5ae410292 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 9 Feb 2020 22:51:14 +0000 Subject: [PATCH 24/48] Updates EVERYTHING --- nano/package-lock.json | 198 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 194 insertions(+), 4 deletions(-) diff --git a/nano/package-lock.json b/nano/package-lock.json index 0611a0662fc..9daa7ab3a4b 100644 --- a/nano/package-lock.json +++ b/nano/package-lock.json @@ -3,6 +3,10 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "@websanova/url": { + "version": "git+https://github.com/websanova/js-url.git#beead70d84e3b065697e68d443343a27b20c0d39", + "from": "git+https://github.com/websanova/js-url.git" + }, "ajv": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", @@ -15,6 +19,29 @@ "uri-js": "^4.2.2" } }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -35,6 +62,11 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -68,6 +100,14 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "~0.6.0" + } + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -84,8 +124,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "dashdash": { "version": "1.14.1", @@ -101,6 +140,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "domurl": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domurl/-/domurl-2.3.0.tgz", + "integrity": "sha512-KoPGBykwI0AnDjWuEz3SQECab4FbwvE/1CJk1qTBGiIdyquCFRLs0eldfl6ESrpSKd1GGjMnzS2g7+Xl12obqg==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -120,12 +164,26 @@ "prr": "~1.0.1" } }, + "es5-shim": { + "version": "4.5.13", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.13.tgz", + "integrity": "sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw==" + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "optional": true }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -143,6 +201,11 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "optional": true }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -175,6 +238,17 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "optional": true }, + "gulp-clean-css": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.10.0.tgz", + "integrity": "sha512-7Isf9Y690o/Q5MVjEylH1H7L8WeZ89woW7DnhD5unTintOdZb67KdOayRgp9trUFo+f9UyJtuatV42e/+kghPg==", + "requires": { + "clean-css": "4.2.1", + "plugin-error": "1.0.1", + "through2": "2.0.3", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -208,12 +282,43 @@ "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "optional": true }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -317,6 +422,22 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "optional": true }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -350,6 +471,27 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "optional": true }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -391,8 +533,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "sshpk": { "version": "1.16.1", @@ -411,6 +552,30 @@ "tweetnacl": "~0.14.0" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -452,6 +617,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -468,6 +638,26 @@ "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" } } } From 1d8b52716a40e5bd8d5e6ed8abfb987ed124fce4 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 9 Feb 2020 23:16:46 +0000 Subject: [PATCH 25/48] GOD I HATE NODE --- .travis.yml | 2 +- README.md | 1 - nano/package-lock.json | 5576 +++++++++++++++++++++++++++++++++++++++- nano/package.json | 12 +- 4 files changed, 5563 insertions(+), 28 deletions(-) diff --git a/.travis.yml b/.travis.yml index 146be925c77..5a731170a79 100644 --- a/.travis.yml +++ b/.travis.yml @@ -69,4 +69,4 @@ jobs: - npm install --loglevel=error before_script: script: - - gulp + - node node_modules/gulp/bin/gulp.js --require less-loader diff --git a/README.md b/README.md index d133d50f7ce..eafdb5ffe91 100644 --- a/README.md +++ b/README.md @@ -140,4 +140,3 @@ Creative Commons 3.0 BY-NC-SA license All other assets including icons and sound files are licensed under the Creative Commons 3.0 BY-SA license (https://creativecommons.org/licenses/by-sa/3.0/), unless otherwise indicated. - diff --git a/nano/package-lock.json b/nano/package-lock.json index 9daa7ab3a4b..e32e80ce187 100644 --- a/nano/package-lock.json +++ b/nano/package-lock.json @@ -3,15 +3,277 @@ "requires": true, "lockfileVersion": 1, "dependencies": { - "@websanova/url": { - "version": "git+https://github.com/websanova/js-url.git#beead70d84e3b065697e68d443343a27b20c0d39", - "from": "git+https://github.com/websanova/js-url.git" + "@gulp-sourcemaps/identity-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", + "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", + "dev": true, + "requires": { + "acorn": "^5.0.3", + "css": "^2.2.1", + "normalize-path": "^2.1.1", + "source-map": "^0.6.0", + "through2": "^2.0.3" + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "accord": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.29.0.tgz", + "integrity": "sha512-3OOR92FTc2p5/EcOzPcXp+Cbo+3C15nV9RXHlOUBCBpHhcB+0frbSNR9ehED/o7sTcyGVtqGJpguToEdlXhD0w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "glob": "^7.0.5", + "indx": "^0.2.3", + "lodash.clone": "^4.3.2", + "lodash.defaults": "^4.0.1", + "lodash.flatten": "^4.2.0", + "lodash.merge": "^4.4.0", + "lodash.partialright": "^4.1.4", + "lodash.pick": "^4.2.1", + "lodash.uniq": "^4.3.0", + "resolve": "^1.5.0", + "semver": "^5.3.0", + "uglify-js": "^2.8.22", + "when": "^3.7.8" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true }, "ajv": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "optional": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19,6 +281,38 @@ "uri-js": "^4.2.2" } }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", @@ -27,21 +321,195 @@ "ansi-wrap": "^0.1.0" } }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -57,6 +525,40 @@ "safer-buffer": "~2.1.0" } }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -67,12 +569,85 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "optional": true }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "8.6.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz", + "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==", + "dev": true, + "requires": { + "browserslist": "^3.2.8", + "caniuse-lite": "^1.0.30000864", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.23", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -85,6 +660,83 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "optional": true }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -94,12 +746,381 @@ "tweetnacl": "^0.14.3" } }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "binaryextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.2.0.tgz", + "integrity": "sha512-bHhs98rj/7i/RZpCSJ3uk55pLXOItjIrh2sRQZSM6OoktScX+LxJzvlU+FELp9j3TdcddTmmYArLSGptCTwjuw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001025", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz", + "integrity": "sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", @@ -108,11 +1129,119 @@ "source-map": "~0.6.0" } }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/color/-/color-0.10.1.tgz", + "integrity": "sha1-wEGI34KiCd3rzOzazT7DIPGTc58=", + "dev": true, + "requires": { + "color-convert": "^0.5.3", + "color-string": "^0.3.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -121,11 +1250,209 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -135,16 +1462,189 @@ "assert-plus": "^1.0.0" } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "dev": true, + "requires": { + "debug": "3.X", + "memoizee": "0.4.X", + "object-assign": "4.X" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, "domurl": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domurl/-/domurl-2.3.0.tgz", "integrity": "sha512-KoPGBykwI0AnDjWuEz3SQECab4FbwvE/1CJk1qTBGiIdyquCFRLs0eldfl6ESrpSKd1GGjMnzS2g7+Xl12obqg==" }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -155,25 +1655,257 @@ "safer-buffer": "^2.1.0" } }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.345", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz", + "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "optional": true, "requires": { "prr": "~1.0.1" } }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, "es5-shim": { "version": "4.5.13", "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.13.tgz", "integrity": "sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw==" }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -184,28 +1916,222 @@ "is-extendable": "^1.0.1" } }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "optional": true + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "optional": true }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "filter-gradient": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/filter-gradient/-/filter-gradient-1.0.1.tgz", + "integrity": "sha1-ikFRiyIoQ1H6ymNqb9sba5BMogc=", + "dev": true, + "requires": { + "color": "^0.10.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, "font-awesome": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -223,6 +2149,548 @@ "mime-types": "^2.1.12" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -232,11 +2700,147 @@ "assert-plus": "^1.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "optional": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "gulp-cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + } + } }, "gulp-clean-css": { "version": "3.10.0", @@ -249,6 +2853,165 @@ "vinyl-sourcemaps-apply": "0.2.1" } }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + } + }, + "gulp-less": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-4.0.1.tgz", + "integrity": "sha512-hmM2k0FfQp7Ptm3ZaqO2CkMX3hqpiIOn4OHtuSsCeFym63F7oWlEua5v6u1cIjVUKYsVIs9zPg9vbqTEb/udpA==", + "dev": true, + "requires": { + "accord": "^0.29.0", + "less": "2.6.x || ^3.7.1", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "replace-ext": "^1.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "gulp-order": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gulp-order/-/gulp-order-1.2.0.tgz", + "integrity": "sha512-RduLhxbEye1NT6fnvev3792VUsZA8F+5zRFczAgpOSELz587Fv1Nn7l4ZiaiQzFPV7aECh1WRc2dPWjjcxCa0g==", + "dev": true, + "requires": { + "minimatch": "~3.0.4", + "stable": "~0.1.8", + "through": "~2.3.8" + } + }, + "gulp-postcss": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-8.0.0.tgz", + "integrity": "sha512-Wtl6vH7a+8IS/fU5W9IbOpcaLqKxd5L1DUOzaPmlnCbX1CrG0aWdwVnC3Spn8th0m8D59YbysV5zPUe1n/GJYg==", + "dev": true, + "requires": { + "fancy-log": "^1.3.2", + "plugin-error": "^1.0.1", + "postcss": "^7.0.2", + "postcss-load-config": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "gulp-replace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz", + "integrity": "sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==", + "dev": true, + "requires": { + "istextorbinary": "2.2.1", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + } + }, + "gulp-sourcemaps": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", + "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", + "dev": true, + "requires": { + "@gulp-sourcemaps/identity-map": "1.X", + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "5.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "1.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom-string": "1.X", + "through2": "2.X" + } + }, + "gulp-uglify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", + "integrity": "sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "isobject": "^3.0.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -265,6 +3028,99 @@ "har-schema": "^2.0.0" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -276,17 +3132,191 @@ "sshpk": "^1.7.0" } }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "optional": true }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indx": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -295,6 +3325,52 @@ "is-plain-object": "^2.0.4" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -303,17 +3379,69 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -325,11 +3453,37 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "optional": true }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "dev": true, + "requires": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -339,8 +3493,13 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "optional": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -348,6 +3507,30 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "optional": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -360,6 +3543,60 @@ "verror": "1.10.0" } }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, "less": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/less/-/less-3.11.0.tgz", @@ -376,6 +3613,346 @@ "source-map": "~0.6.0" } }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "less-plugin-autoprefix": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/less-plugin-autoprefix/-/less-plugin-autoprefix-2.0.0.tgz", + "integrity": "sha512-UktaMtHAhCVTIQxjlceo1MiiQiUZws7gi3hfcpxkCLn1CJdVdlRGCb4n1/M64hniw2DLd7YzOl7ojshs1tWYcQ==", + "dev": true, + "requires": { + "autoprefixer": "^8.6.3", + "postcss": "^6.0.22" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, + "requires": { + "make-error": "^1.2.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -395,33 +3972,590 @@ "mime-db": "1.43.0" } }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, "requires": { "minimist": "0.0.8" } }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "optional": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onecolor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.1.0.tgz", + "integrity": "sha512-YZSypViXzu3ul5LMu/m6XjJ9ol8qAy9S2VjHl5E6UlhUH1KGKWabyEJifn0Jjpw23bYDzC2ucKMPGiH5kfwSGQ==", + "dev": true + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "optional": true }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, + "pleeease-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pleeease-filters/-/pleeease-filters-4.0.0.tgz", + "integrity": "sha1-ZjKy+wVkjSdY2GU4T7zteeHMrsc=", + "dev": true, + "requires": { + "onecolor": "^3.0.4", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", @@ -433,6 +4567,122 @@ "extend-shallow": "^3.0.2" } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", + "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-color-rgba-fallback": { + "version": "git+https://github.com/postcss/postcss-color-rgba-fallback.git#96cda7e1587175322dcbfee601e3f6eb110899f3", + "from": "git+https://github.com/postcss/postcss-color-rgba-fallback.git", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.2", + "rgb-hex": "^3.0.0" + } + }, + "postcss-filter-gradient": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-filter-gradient/-/postcss-filter-gradient-1.0.0.tgz", + "integrity": "sha1-68KOUX8yzjZVHxUwLqTXihZMyIY=", + "dev": true, + "requires": { + "filter-gradient": "^1.0.1", + "postcss": "^6.0.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-opacity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity/-/postcss-opacity-5.0.0.tgz", + "integrity": "sha512-n6LgHk5HWIsyEHgPqM2jwXrkh4SuH+cZOIWh4tUp4ug3P7FkzxiJuqrpEaBvNwH/dKs5PHjHL2vPeR+nLbs+Mw==", + "dev": true, + "requires": { + "postcss": "^6.0.7" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -447,11 +4697,15 @@ "asap": "~2.0.3" } }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "optional": true + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "psl": { "version": "1.7.0", @@ -459,11 +4713,42 @@ "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", "optional": true }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "optional": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.2", @@ -471,6 +4756,54 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "optional": true }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -492,6 +4825,98 @@ } } }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -520,21 +4945,389 @@ "uuid": "^3.3.2" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rgb-hex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-3.0.0.tgz", + "integrity": "sha512-8h7ZcwxCBDKvchSWbWngJuSCqJGQ6nDuLLg+QcRyQDbX9jMWt+PpPeXAhSla0GOooEomk3lCprUpGkMdsLjKyg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -552,6 +5345,97 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -567,6 +5451,113 @@ } } }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, + "style-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.6.4" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "terser": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", + "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "textextensions": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", + "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", @@ -576,6 +5567,102 @@ "xtend": "~4.0.1" } }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -594,6 +5681,16 @@ } } }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -608,15 +5705,203 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz", + "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==", + "dev": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "optional": true, "requires": { "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -628,6 +5913,31 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "optional": true }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -639,6 +5949,60 @@ "extsprintf": "^1.2.0" } }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + } + }, "vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", @@ -654,10 +6018,178 @@ } } }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.41.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", + "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } } } } diff --git a/nano/package.json b/nano/package.json index f42f42ccccc..6c81eede229 100644 --- a/nano/package.json +++ b/nano/package.json @@ -7,18 +7,22 @@ "font-awesome": "^4.7.0", "gulp-clean-css": "^3.10.0", "js-url": "git+https://github.com/websanova/js-url.git", - "less": "^3.11.0" + "less": "^3.11.0", + "less-loader": "^5.0.0", + "style-loader": "^1.1.3", + "tslib": "^1.10.0", + "webpack": "^4.41.5" }, "devDependencies": { "fs-extra": "^7.0.1", - "gulp": "^4.0.0", + "gulp": "^4.0.2", "gulp-concat": "^2.6.1", "gulp-less": "^4.0.1", "gulp-order": "^1.2.0", "gulp-postcss": "^8.0.0", "gulp-replace": "^1.0.0", - "gulp-sourcemaps": "^2.6.4", - "gulp-uglify": "^3.0.1", + "gulp-sourcemaps": "^2.6.5", + "gulp-uglify": "^3.0.2", "less-plugin-autoprefix": "^2.0.0", "merge-stream": "^1.0.1", "pleeease-filters": "^4.0.0", From c1ba51f32800c064c2eaff85f5f4b3e73315377d Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Mon, 10 Feb 2020 23:31:41 +0100 Subject: [PATCH 26/48] Makes AI able to click on turfs --- code/_onclick/ai.dm | 4 ++-- code/modules/mob/living/silicon/ai/ai.dm | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 8d58245eda5..7c2214e2287 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -42,8 +42,8 @@ if(control_disabled || stat) return - - var/turf/pixel_turf = get_turf_pixel(A) + + var/turf/pixel_turf = isturf(A) ? A : get_turf_pixel(A) if(isnull(pixel_turf)) return if(!can_see(A)) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 7822584ab98..adc1ace2fa8 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1200,7 +1200,8 @@ var/list/ai_verbs_default = list( if(isturf(loc)) //AI in core, check if on cameras //get_turf_pixel() is because APCs in maint aren't actually in view of the inner camera //apc_override is needed here because AIs use their own APC when depowered - return (cameranet && cameranet.checkTurfVis(get_turf_pixel(A))) || apc_override + var/turf/T = isturf(A) ? A : get_turf_pixel(A) + return (cameranet && cameranet.checkTurfVis(T)) || apc_override //AI is carded/shunted //view(src) returns nothing for carded/shunted AIs and they have x-ray vision so just use get_dist var/list/viewscale = getviewsize(client.view) From 2cb87fffa8f69655496fbd0cf1fb2f4148b32685 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Tue, 11 Feb 2020 17:10:25 +0100 Subject: [PATCH 27/48] Makes Veil extinguish plasmamen helmets --- code/modules/clothing/spacesuits/plasmamen.dm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 73b95c0d3f7..bd35abb19a6 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -62,14 +62,21 @@ actions_types = list(/datum/action/item_action/toggle_helmet_light) /obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) + toggle_light(user) + +/obj/item/clothing/head/helmet/space/plasmaman/proc/toggle_light(mob/user) on = !on icon_state = "[initial(icon_state)][on ? "-light":""]" item_state = icon_state - user.update_inv_head() //So the mob overlay updates + + var/mob/living/carbon/human/H = user + if(istype(H)) + H.update_inv_head() if(on) if(!up) - to_chat(user, "Your helmet's torch can't pass through your welding visor!") + if(istype(H)) + to_chat(user, "Your helmet's torch can't pass through your welding visor!") set_light(0) else set_light(brightness_on) @@ -80,6 +87,10 @@ var/datum/action/A=X A.UpdateButtonIcon() +/obj/item/clothing/head/helmet/space/plasmaman/extinguish_light() + if(on) + toggle_light() + /obj/item/clothing/head/helmet/space/plasmaman/security name = "security plasma envirosuit helmet" desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables." From 60d58d5b37f8740467855bdeae59c5475c67773d Mon Sep 17 00:00:00 2001 From: farie82 Date: Sat, 15 Feb 2020 02:22:10 +0100 Subject: [PATCH 28/48] Fixes 4 runtimes (#12974) * Fixes proc: /datum/money_account/proc/charge * Fixes necropolis_chests.dm,214 proc: /obj/item/rod_of_asclepius/attack_self * fixes: give.dm,25 proc: /mob/living/carbon/verb/give * Fixes: game.dm,495 proc: /proc/pollCandidates --- code/__HELPERS/game.dm | 5 ++++- code/modules/economy/ATM.dm | 2 +- code/modules/mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mob/living/carbon/give.dm | 7 ++++--- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 744b8b86a9a..0ab10447f8c 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -478,7 +478,10 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = FALSE, poll_tim G << 'sound/misc/notice2.ogg'//Alerting them to their consideration if(flashwindow) window_flash(G.client) - switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","No","Yes","Not This Round")) + var/ans = alert(G,Question,"Please answer in [poll_time/10] seconds!","No","Yes","Not This Round") + if(!G?.client) + return + switch(ans) if("Yes") to_chat(G, "Choice registered: Yes.") if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed. diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index eafd038977d..df542964163 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -71,7 +71,7 @@ log transactions playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1) for(var/obj/item/stack/spacecash/S in T) S.use(S.amount) - authenticated_account.charge(-cash_amount, null, "Credit deposit", terminal_id = machine_id, dest_name = "Terminal") + authenticated_account.charge(-cash_amount, null, "Credit deposit", machine_id, "Terminal") /obj/machinery/atm/proc/reconnect_database() for(var/obj/machinery/computer/account_database/DB in GLOB.machines) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index ffe7a062bbe..904a3462808 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -189,7 +189,7 @@ return var/failText = "The snake seems unsatisfied with your incomplete oath and returns to its previous place on the rod, returning to its dormant, wooden state. You must stand still while completing your oath!" to_chat(itemUser, "The wooden snake that was carved into the rod seems to suddenly come alive and begins to slither down your arm! The compulsion to help others grows abnormally strong...") - if(do_after(itemUser, 40, target = itemUser)) + if(do_after_once(itemUser, 40, target = itemUser)) itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:") else to_chat(itemUser, failText) diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index c0dba9b77e5..a53c4af4563 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -18,10 +18,11 @@ to_chat(usr, "That's not exactly something you can give.") return if(target.r_hand == null || target.l_hand == null) - switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No")) + var/ans = alert(target,"[usr] wants to give you \a [I]?",,"Yes","No") + if(!I || !target) + return + switch(ans) if("Yes") - if(!I) - return if(target.incapacitated() || usr.incapacitated()) return if(!Adjacent(target)) From 3f006d2701bb0e826b5caf1cc8d47d65ca5dd5d1 Mon Sep 17 00:00:00 2001 From: farie82 Date: Sat, 15 Feb 2020 02:22:49 +0100 Subject: [PATCH 29/48] Doomsday device fix (#12976) --- code/game/gamemodes/malfunction/Malf_Modules.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index eb54b52c225..70e0e3258eb 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -244,6 +244,7 @@ anchored = 1 density = 1 atom_say_verb = "blares" + speed_process = TRUE // Disgusting fix. Please remove once #12952 is merged var/timing = 0 var/default_timer = 4500 var/detonation_timer From df09966258b1887f97318f0f5befc32e1933b0a5 Mon Sep 17 00:00:00 2001 From: farie82 Date: Sat, 15 Feb 2020 05:54:01 +0100 Subject: [PATCH 30/48] Instant Summons spell now respects no_drop and teleports the holder of the nodrop item to the wizard now (#12961) * Instant recall spell now respects no_drop * Teleports the holder to the wizard instead now --- code/datums/spells/summonitem.dm | 58 +++++++++++++++----------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 8dbaf5afa77..aaef2229856 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -52,73 +52,71 @@ marked_item = null else //Getting previously marked item - var/obj/item_to_retrive = marked_item + var/obj/item_to_retrieve = marked_item var/infinite_recursion = 0 //I don't want to know how someone could put something inside itself but these are wizards so let's be safe - while(!isturf(item_to_retrive.loc) && infinite_recursion < 10) //if it's in something you get the whole thing. - if(ismob(item_to_retrive.loc)) //If its on someone, properly drop it - var/mob/M = item_to_retrive.loc + while(!isturf(item_to_retrieve.loc) && infinite_recursion < 10) //if it's in something you get the whole thing. + if(ismob(item_to_retrieve.loc)) //If its on someone, properly drop it + var/mob/M = item_to_retrieve.loc - if(issilicon(M)) //Items in silicons warp the whole silicon - M.loc.visible_message("[M] suddenly disappears!") - M.loc = target.loc + if(issilicon(M) || !M.unEquip(item_to_retrieve)) //Items in silicons warp the whole silicon + M.visible_message("[M] suddenly disappears!", "A force suddenly pulls you away!") + M.forceMove(target.loc) M.loc.visible_message("[M] suddenly appears!") - item_to_retrive = null + item_to_retrieve = null break - M.unEquip(item_to_retrive) - if(ishuman(M)) //Edge case housekeeping var/mob/living/carbon/human/C = M - /*if(C.internal_bodyparts_by_name && item_to_retrive in C.internal_bodyparts_by_name ) //This won't work, as we use organ datums instead of objects. --DZD - C.internal_bodyparts_by_name -= item_to_retrive + /*if(C.internal_bodyparts_by_name && item_to_retrieve in C.internal_bodyparts_by_name ) //This won't work, as we use organ datums instead of objects. --DZD + C.internal_bodyparts_by_name -= item_to_retrieve if(istype(marked_item, /obj/item/brain)) //If this code ever runs I will be happy var/obj/item/brain/B = new /obj/item/brain(target.loc) B.transfer_identity(C) C.death() add_attack_logs(target, C, "Magically debrained INTENT: [uppertext(target.a_intent)]")*/ - if(C.stomach_contents && item_to_retrive in C.stomach_contents) - C.stomach_contents -= item_to_retrive + if(C.stomach_contents && item_to_retrieve in C.stomach_contents) + C.stomach_contents -= item_to_retrieve for(var/X in C.bodyparts) var/obj/item/organ/external/part = X - if(item_to_retrive in part.embedded_objects) - part.embedded_objects -= item_to_retrive - to_chat(C, "The [item_to_retrive] that was embedded in your [part] has mysteriously vanished. How fortunate!") + if(item_to_retrieve in part.embedded_objects) + part.embedded_objects -= item_to_retrieve + to_chat(C, "The [item_to_retrieve] that was embedded in your [part] has mysteriously vanished. How fortunate!") if(!C.has_embedded_objects()) C.clear_alert("embeddedobject") break else - if(istype(item_to_retrive.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery - var/obj/machinery/portable_atmospherics/P = item_to_retrive.loc + if(istype(item_to_retrieve.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery + var/obj/machinery/portable_atmospherics/P = item_to_retrieve.loc P.disconnect() P.update_icon() - if(istype(item_to_retrive.loc, /obj/structure/disposalholder) || istype(item_to_retrive.loc, /obj/machinery/disposal))//fixes the breaking of disposals. No more bluespace connected disposal bins! + if(istype(item_to_retrieve.loc, /obj/structure/disposalholder) || istype(item_to_retrieve.loc, /obj/machinery/disposal))//fixes the breaking of disposals. No more bluespace connected disposal bins! break - item_to_retrive = item_to_retrive.loc + item_to_retrieve = item_to_retrieve.loc infinite_recursion += 1 - if(!item_to_retrive) + if(!item_to_retrieve) return - item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly disappears!") + item_to_retrieve.loc.visible_message("The [item_to_retrieve.name] suddenly disappears!") if(target.hand) //left active hand - if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) - if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) + if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_l_hand, 0, 1, 1)) + if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_r_hand, 0, 1, 1)) butterfingers = 1 else //right active hand - if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) - if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) + if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_r_hand, 0, 1, 1)) + if(!target.equip_to_slot_if_possible(item_to_retrieve, slot_l_hand, 0, 1, 1)) butterfingers = 1 if(butterfingers) - item_to_retrive.loc = target.loc - item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears!") + item_to_retrieve.loc = target.loc + item_to_retrieve.loc.visible_message("The [item_to_retrieve.name] suddenly appears!") playsound(get_turf(target),'sound/magic/summonitems_generic.ogg',50,1) else - item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [target]'s hand!") + item_to_retrieve.loc.visible_message("The [item_to_retrieve.name] suddenly appears in [target]'s hand!") playsound(get_turf(target),'sound/magic/summonitems_generic.ogg',50,1) if(message) From 5b1941e784220cb7752909e44002754342dcf91d Mon Sep 17 00:00:00 2001 From: farie82 Date: Sat, 15 Feb 2020 06:17:29 +0100 Subject: [PATCH 31/48] Fixes a few runtimes (#12893) * Some runtime fixes * fixes #12892 * Alternative fix. Better behaviour * qdel atmos thingy when loc is null * Eye colour init protection * Whoops. Forgotten / * Suggestions update * Fixed a runtime where IPCs losing their arms would cause a runtime in the hand * Fixes mobs being able to nuzzle a grill to dead and a runtime there * Added extra logging to the NPCpools --- code/ATMOSPHERICS/atmospherics.dm | 4 ++-- code/controllers/subsystem/idlenpcpool.dm | 1 + code/controllers/subsystem/npcpool.dm | 4 ++++ code/game/gamemodes/blob/overmind.dm | 5 +++-- code/game/gamemodes/changeling/powers/augmented_eyesight.dm | 4 ++-- code/game/objects/structures/grille.dm | 2 +- code/modules/flufftext/Hallucination.dm | 2 ++ code/modules/surgery/organs/augments_eyes.dm | 3 +-- code/modules/surgery/organs/eyes.dm | 2 +- code/modules/surgery/organs/organ_external.dm | 2 +- 10 files changed, 18 insertions(+), 11 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 0c1b0a35426..157b0312995 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -64,8 +64,8 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) // Icons/overlays/underlays /obj/machinery/atmospherics/update_icon() - var/turf/T = loc - if(level == 2 || !T.intact) + var/turf/T = get_turf(loc) + if(!T || level == 2 || !T.intact) plane = GAME_PLANE else plane = FLOOR_PLANE diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm index 2dad0abca0f..3757237243f 100644 --- a/code/controllers/subsystem/idlenpcpool.dm +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -29,6 +29,7 @@ SUBSYSTEM_DEF(idlenpcpool) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len if(!SA) + log_debug("idlenpcpool encountered an invalid entry, resumed: [resumed], SA [SA], type of SA [SA?.type], null [SA == null], qdelled [QDELETED(SA)], SA in AI_IDLE list: [SA in GLOB.simple_animals[AI_IDLE]]") GLOB.simple_animals[AI_IDLE] -= SA continue diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 0de306b12eb..f2e159404fd 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -21,6 +21,10 @@ SUBSYSTEM_DEF(npcpool) while(currentrun.len) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len + if(!SA) + log_debug("npcpool encountered an invalid entry, resumed: [resumed], SA [SA], type of SA [SA?.type], null [SA == null], qdelled [QDELETED(SA)], SA in AI_ON list: [SA in GLOB.simple_animals[AI_ON]]") + GLOB.simple_animals[AI_ON] -= SA + continue if(!SA.ckey && !SA.notransform) if(SA.stat != DEAD) diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 140ead3a947..74ed59d2469 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -48,13 +48,14 @@ update_health_hud() /mob/camera/blob/update_health_hud() - if(blob_core) + if(blob_core && hud_used) hud_used.blobhealthdisplay.maptext = "
[round(blob_core.obj_integrity)]
" /mob/camera/blob/proc/add_points(var/points) if(points != 0) blob_points = Clamp(blob_points + points, 0, max_blob_points) - hud_used.blobpwrdisplay.maptext = "
[round(src.blob_points)]
" + if(hud_used) + hud_used.blobpwrdisplay.maptext = "
[round(src.blob_points)]
" /mob/camera/blob/say(var/message) if(!message) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index b0b77a456d5..4663fef8b97 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -40,7 +40,7 @@ name = "protective membranes" desc = "These variable transparency organic membranes will protect you from welders and flashes and heal your eye damage." icon_state = "ling_eyeshield" - eye_colour = null + eye_colour = "#000000" implant_overlay = null slot = "eye_ling" status = 0 @@ -61,7 +61,7 @@ name = "heat receptors" desc = "These heat receptors dramatically increases eyes light sensing ability." icon_state = "ling_thermal" - eye_colour = null + eye_colour = "#000000" implant_overlay = null slot = "eye_ling" status = 0 diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index f3a4b8a241c..5244bcb32e1 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -69,7 +69,7 @@ /obj/structure/grille/attack_animal(mob/user) . = ..() - if(!shock(user, 70)) + if(. && !QDELETED(src) && !shock(user, 70)) take_damage(rand(5,10), BRUTE, "melee", 1) /obj/structure/grille/hulk_damage() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index ea12f0a82d3..ee28919fd67 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -147,6 +147,8 @@ Gunshots/explosions/opening doors/less rare audio (done) START_PROCESSING(SSobj, src) /obj/effect/hallucination/fake_flood/process() + if(!target) + qdel(src) if(next_expand <= world.time) radius++ if(radius > FAKE_FLOOD_MAX_RADIUS) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 463911861c2..80dceea5048 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -12,12 +12,11 @@ var/see_invisible = 0 var/lighting_alpha - var/eye_colour = "#000000" + var/eye_colour = "#000000" // Should never be null var/old_eye_colour = "#000000" var/flash_protect = 0 var/aug_message = "Your vision is augmented!" - /obj/item/organ/internal/cyberimp/eyes/insert(var/mob/living/carbon/M, var/special = 0) ..() var/mob/living/carbon/human/H = M diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index fba2df57e8a..2973573bc2c 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -5,7 +5,7 @@ organ_tag = "eyes" parent_organ = "head" slot = "eyes" - var/eye_colour = "#000000" + var/eye_colour = "#000000" // Should never be null var/list/colourmatrix = null var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white. var/list/replace_colours = LIST_GREYSCALE_REPLACE diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 1fde13e246e..305c08ff17e 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -404,7 +404,7 @@ Note that amputating the affected organ does in fact remove the infection from t fracture() /obj/item/organ/external/proc/check_for_internal_bleeding(damage) - if(NO_BLOOD in owner.dna.species.species_traits) + if(owner && NO_BLOOD in owner.dna.species.species_traits) return var/local_damage = brute_dam + damage if(damage > 15 && local_damage > 30 && prob(damage) && !is_robotic()) From 440a6f055f95dcc10b40ed4b86dfe5bdd9b02c6d Mon Sep 17 00:00:00 2001 From: AzuleUtama <44248086+AzuleUtama@users.noreply.github.com> Date: Sat, 15 Feb 2020 14:47:40 +0000 Subject: [PATCH 32/48] Antag objectives are now announced when a target cryos e --- code/game/machinery/cryopod.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index abf6dc725b3..473fc4eb5af 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -394,6 +394,7 @@ spawn(1) //This should ideally fire after the occupant is deleted. if(!O) return O.find_target() + O.owner.announce_objectives() if(!(O.target)) GLOB.all_objectives -= O O.owner.objectives -= O From fddff1049b970872dd539eb5b9ebc6a434b8e301 Mon Sep 17 00:00:00 2001 From: Citinited Date: Sat, 15 Feb 2020 20:31:08 +0000 Subject: [PATCH 33/48] [Testmerge ready] Ports tool behaviours; refactors all tools; adds functionality for self-filling reagent containers (#11700) * Adds support for self-filling reagent containers * Sets tool_behaviour on the default set of tools * Fixing merge conflicts * Refactors welder to use tool behaviour * The refactor: part I * The refactor: part II * Tool Refactor Part III: Revenge of the Maint * Tool Refactor Part IV: A New Hope * Tool Refactor Part V: The Oldcoder Strikes Back * Tool Refactor Part VI: Return of the Coder * VII * Holy shit, it compiles?! * Nannek I completed your TODO, you owe me ice cream * Tool helpers; telepad is compliant * Bugtest, Round 1: Fight Fuck refactoring disposals * Buggfixing, Round 2: Electric Boogaloo * Personal crafting uses tool behaviours now * Construction datums use new tool behaviours; better way of handling fueltank refuelling; more bugfixing * multitool_check_buffer change; removes some useless things in tool_helpers * proc name change * TRUE/FALSE changes * Bugfixing, Round 3: A Good Day To Bugfix Hard Fixes multiple issues raised by the testmerge * Minor style changes --- .../components/binary_devices/circulator.dm | 18 +- .../components/unary_devices/vent_pump.dm | 38 +- .../components/unary_devices/vent_scrubber.dm | 37 +- code/__DEFINES/tools.dm | 46 +++ code/__HELPERS/tool_helpers.dm | 51 +++ code/__HELPERS/unsorted.dm | 80 +--- code/_onclick/item_attack.dm | 14 +- .../helper_datums/construction_datum.dm | 73 ++-- code/datums/wires/alarm.dm | 3 +- code/datums/wires/wires.dm | 6 - code/game/atoms.dm | 41 ++ code/game/dna/dna_modifier.dm | 25 +- .../miniantags/abduction/abduction_gear.dm | 15 +- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 20 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 215 +++++----- code/game/machinery/Freezer.dm | 104 ++--- code/game/machinery/OpTable.dm | 15 +- code/game/machinery/PDApainter.dm | 24 +- code/game/machinery/Sleeper.dm | 54 +-- code/game/machinery/adv_med.dm | 46 +-- code/game/machinery/alarm.dm | 114 +++-- code/game/machinery/atmoalter/canister.dm | 46 +-- .../atmoalter/portable_atmospherics.dm | 40 +- code/game/machinery/autolathe.dm | 57 ++- code/game/machinery/camera/camera.dm | 56 ++- code/game/machinery/camera/camera_assembly.dm | 247 ++++++----- code/game/machinery/cell_charger.dm | 21 +- code/game/machinery/cloning.dm | 60 +-- code/game/machinery/computer/ai_core.dm | 348 ++++++++-------- .../game/machinery/computer/buildandrepair.dm | 34 +- code/game/machinery/computer/camera.dm | 36 +- code/game/machinery/computer/computer.dm | 12 +- code/game/machinery/computer/message.dm | 7 +- code/game/machinery/constructable_frame.dm | 50 +-- code/game/machinery/cryo.dm | 22 +- code/game/machinery/dance_machine.dm | 23 +- code/game/machinery/defib_mount.dm | 21 +- code/game/machinery/deployable.dm | 25 +- code/game/machinery/doors/airlock.dm | 390 +++++++++--------- code/game/machinery/doors/airlock_types.dm | 46 ++- code/game/machinery/doors/door.dm | 17 +- code/game/machinery/doors/firedoor.dm | 282 +++++++------ code/game/machinery/doors/windowdoor.dm | 132 +++--- code/game/machinery/doppler_array.dm | 23 +- code/game/machinery/firealarm.dm | 148 ++++--- code/game/machinery/flasher.dm | 46 +-- code/game/machinery/gameboard.dm | 12 +- code/game/machinery/hologram.dm | 21 +- code/game/machinery/igniter.dm | 28 +- code/game/machinery/lightswitch.dm | 31 +- code/game/machinery/machinery.dm | 60 +-- code/game/machinery/mass_driver.dm | 60 ++- code/game/machinery/newscaster.dm | 56 +-- code/game/machinery/pipe/construction.dm | 8 +- code/game/machinery/poolcontroller.dm | 21 +- code/game/machinery/portable_turret.dm | 69 ++-- code/game/machinery/quantum_pad.dm | 45 +- code/game/machinery/recharger.dm | 41 +- code/game/machinery/rechargestation.dm | 22 +- code/game/machinery/recycler.dm | 21 +- code/game/machinery/shieldgen.dm | 58 +-- code/game/machinery/snow_machine.dm | 28 +- code/game/machinery/spaceheater.dm | 22 +- code/game/machinery/suit_storage_unit.dm | 26 +- code/game/machinery/syndicatebeacon.dm | 38 +- code/game/machinery/syndicatebomb.dm | 164 +++++--- .../machinery/telecomms/traffic_control.dm | 10 +- code/game/machinery/teleporter.dm | 82 ++-- code/game/machinery/vending.dm | 59 ++- code/game/mecha/mech_bay.dm | 23 +- code/game/mecha/mech_fabricator.dm | 2 +- code/game/mecha/mecha.dm | 133 +++--- code/game/mecha/mecha_construction_paths.dm | 362 ++++++++-------- code/game/mecha/mecha_wreckage.dm | 69 ++-- .../game/objects/effects/decals/contraband.dm | 19 +- code/game/objects/effects/portals.dm | 10 +- code/game/objects/items.dm | 13 + code/game/objects/items/candle.dm | 25 +- .../game/objects/items/devices/instruments.dm | 6 +- code/game/objects/items/devices/powersink.dm | 36 +- .../objects/items/devices/radio/headset.dm | 59 +-- .../objects/items/devices/radio/intercom.dm | 146 +++---- .../game/objects/items/devices/radio/radio.dm | 77 ++-- code/game/objects/items/flag.dm | 25 +- code/game/objects/items/shooting_range.dm | 15 +- code/game/objects/items/stacks/rods.dm | 44 +- .../objects/items/stacks/sheets/mineral.dm | 6 +- code/game/objects/items/stacks/stack.dm | 2 +- .../items/stacks/tiles/tile_mineral.dm | 10 + .../objects/items/stacks/tiles/tile_types.dm | 78 ++-- code/game/objects/items/tools/crowbar.dm | 85 ++++ .../items/{devices => tools}/multitool.dm | 232 ++++++----- code/game/objects/items/tools/screwdriver.dm | 101 +++++ .../objects/items/tools/tool_behaviour.dm | 60 +++ code/game/objects/items/tools/welder.dm | 232 +++++++++++ code/game/objects/items/tools/wirecutters.dm | 95 +++++ code/game/objects/items/tools/wrench.dm | 105 +++++ code/game/objects/items/weapons/RCL.dm | 38 +- code/game/objects/items/weapons/cigs.dm | 12 +- .../objects/items/weapons/conversion_kit.dm | 21 + code/game/objects/items/weapons/fireworks.dm | 4 +- .../objects/items/weapons/flamethrower.dm | 53 +-- .../items/weapons/grenades/chem_grenade.dm | 22 +- .../objects/items/weapons/pneumaticCannon.dm | 3 +- code/game/objects/items/weapons/powerfist.dm | 35 +- code/game/objects/items/weapons/shards.dm | 33 +- .../items/weapons/storage/briefcase.dm | 32 +- code/game/objects/items/weapons/twohanded.dm | 20 +- code/game/objects/objs.dm | 32 ++ .../structures/crates_lockers/closets.dm | 57 ++- .../crates_lockers/closets/cardboardbox.dm | 5 +- .../crates_lockers/closets/fireaxe.dm | 5 +- .../crates_lockers/closets/statue.dm | 3 + .../structures/crates_lockers/crates.dm | 37 +- code/game/objects/structures/curtains.dm | 56 +-- code/game/objects/structures/depot.dm | 27 +- code/game/objects/structures/displaycase.dm | 69 ++-- code/game/objects/structures/door_assembly.dm | 235 ++++++----- code/game/objects/structures/dresser.dm | 54 +-- code/game/objects/structures/extinguisher.dm | 33 +- code/game/objects/structures/false_walls.dm | 12 +- code/game/objects/structures/girders.dm | 194 ++++----- code/game/objects/structures/grille.dm | 33 +- code/game/objects/structures/guillotine.dm | 79 ++-- code/game/objects/structures/mirror.dm | 25 +- code/game/objects/structures/musician.dm | 44 +- code/game/objects/structures/plasticflaps.dm | 68 ++- code/game/objects/structures/reflector.dm | 69 ++-- code/game/objects/structures/signs.dm | 29 +- code/game/objects/structures/statues.dm | 40 +- .../structures/stool_bed_chair_nest/bed.dm | 14 +- .../structures/stool_bed_chair_nest/chairs.dm | 13 +- code/game/objects/structures/table_frames.dm | 19 +- code/game/objects/structures/tables_racks.dm | 96 ++--- code/game/objects/structures/watercloset.dm | 302 +++++++------- .../objects/structures/windoor_assembly.dm | 293 +++++++------ code/game/objects/structures/window.dm | 138 ++++--- code/game/turfs/simulated/floor.dm | 24 +- code/game/turfs/simulated/floor/asteroid.dm | 3 + .../game/turfs/simulated/floor/fancy_floor.dm | 38 +- code/game/turfs/simulated/floor/lava.dm | 3 + .../game/turfs/simulated/floor/light_floor.dm | 31 +- code/game/turfs/simulated/floor/mineral.dm | 10 + code/game/turfs/simulated/floor/misc_floor.dm | 20 +- code/game/turfs/simulated/floor/plating.dm | 63 ++- code/game/turfs/simulated/walls.dm | 85 ++-- .../turfs/simulated/walls_indestructible.dm | 3 + code/game/turfs/simulated/walls_mineral.dm | 10 + code/game/turfs/simulated/walls_reinforced.dm | 328 ++++++--------- code/modules/arcade/arcade_base.dm | 2 +- code/modules/arcade/prize_counter.dm | 2 +- code/modules/assembly/assembly.dm | 16 +- code/modules/assembly/bomb.dm | 57 +-- code/modules/assembly/health.dm | 17 +- code/modules/assembly/holder.dm | 29 +- code/modules/clothing/gloves/miscellaneous.dm | 17 +- code/modules/clothing/masks/miscellaneous.dm | 20 +- code/modules/clothing/spacesuits/breaches.dm | 27 +- code/modules/clothing/spacesuits/hardsuit.dm | 62 +-- .../spacesuits/rig/modules/utility.dm | 16 +- code/modules/crafting/craft.dm | 16 +- code/modules/crafting/recipes.dm | 40 +- code/modules/crafting/tailoring.dm | 18 +- code/modules/fish/fishtank.dm | 47 +-- .../food_and_drinks/drinks/bottler/bottler.dm | 21 +- .../kitchen_machinery/cooker.dm | 20 +- .../kitchen_machinery/gibber.dm | 2 +- .../kitchen_machinery/kitchen_machine.dm | 2 +- .../kitchen_machinery/monkeyrecycler.dm | 2 +- .../kitchen_machinery/processor.dm | 2 +- .../kitchen_machinery/smartfridge.dm | 6 +- code/modules/hydroponics/beekeeping/beebox.dm | 9 +- code/modules/hydroponics/biogenerator.dm | 2 +- code/modules/hydroponics/gene_modder.dm | 2 +- code/modules/hydroponics/hydroponics.dm | 84 ++-- code/modules/hydroponics/seed_extractor.dm | 2 +- code/modules/library/lib_items.dm | 24 +- code/modules/logic/logic_base.dm | 2 +- .../mining/equipment/kinetic_crusher.dm | 23 +- code/modules/mining/machine_redemption.dm | 39 +- code/modules/mining/machine_vending.dm | 2 +- code/modules/mining/minebot.dm | 41 +- code/modules/mining/ores_coins.dm | 56 ++- code/modules/mob/living/carbon/brain/MMI.dm | 29 +- .../mob/living/carbon/human/human_defense.dm | 67 +++ code/modules/mob/living/living.dm | 7 + code/modules/mob/living/silicon/ai/ai.dm | 2 + .../modules/mob/living/silicon/decoy/decoy.dm | 3 + code/modules/mob/living/silicon/pai/pai.dm | 3 + .../modules/mob/living/silicon/robot/robot.dm | 196 ++++----- .../mob/living/silicon/robot/robot_modules.dm | 6 +- code/modules/mob/living/silicon/silicon.dm | 19 + .../mob/living/simple_animal/bot/bot.dm | 38 +- .../living/simple_animal/bot/construction.dm | 28 +- .../simple_animal/friendly/spiderbot.dm | 30 +- .../computers/item/computer.dm | 23 +- code/modules/paperwork/photocopier.dm | 8 +- code/modules/power/apc.dm | 233 ++++++----- code/modules/power/cable.dm | 44 +- code/modules/power/cell.dm | 2 +- code/modules/power/generator.dm | 57 +-- code/modules/power/gravitygenerator.dm | 19 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/singularity/emitter.dm | 64 ++- .../power/singularity/field_generator.dm | 50 +-- .../particle_accelerator.dm | 235 +++++------ code/modules/power/smes.dm | 2 +- code/modules/power/solar.dm | 18 +- code/modules/power/tesla/coil.dm | 69 ++-- code/modules/power/tracker.dm | 18 +- code/modules/power/turbine.dm | 16 +- code/modules/projectiles/gun.dm | 33 +- .../guns/energy/kinetic_accelerator.dm | 21 +- code/modules/reagents/chemistry/holder.dm | 6 +- .../chemistry/machinery/chem_dispenser.dm | 78 ++-- .../chemistry/machinery/chem_heater.dm | 26 +- .../chemistry/machinery/chem_master.dm | 51 ++- .../chemistry/machinery/reagentgrinder.dm | 36 +- code/modules/reagents/reagent_dispenser.dm | 67 +-- code/modules/recycling/conveyor2.dm | 59 +-- .../recycling/disposal-construction.dm | 7 +- code/modules/recycling/disposal.dm | 129 +++--- code/modules/recycling/sortingmachinery.dm | 20 +- code/modules/research/circuitprinter.dm | 2 +- code/modules/research/destructive_analyzer.dm | 2 +- code/modules/research/experimentor.dm | 4 +- code/modules/research/protolathe.dm | 2 +- code/modules/research/server.dm | 2 +- .../research/xenobiology/xenobio_camera.dm | 19 +- .../ruins/lavalandruin_code/dead_ratvar.dm | 34 +- code/modules/spacepods/construction.dm | 36 +- code/modules/spacepods/equipment.dm | 20 +- code/modules/spacepods/spacepod.dm | 187 ++++----- code/modules/surgery/organs/augments_arms.dm | 21 +- code/modules/surgery/rig_removal.dm | 9 +- code/modules/surgery/robotics.dm | 5 +- code/modules/telesci/telepad.dm | 70 ++-- paradise.dme | 12 +- 238 files changed, 6681 insertions(+), 5544 deletions(-) create mode 100644 code/__DEFINES/tools.dm create mode 100644 code/__HELPERS/tool_helpers.dm create mode 100644 code/game/objects/items/tools/crowbar.dm rename code/game/objects/items/{devices => tools}/multitool.dm (88%) create mode 100644 code/game/objects/items/tools/screwdriver.dm create mode 100644 code/game/objects/items/tools/tool_behaviour.dm create mode 100644 code/game/objects/items/tools/welder.dm create mode 100644 code/game/objects/items/tools/wirecutters.dm create mode 100644 code/game/objects/items/tools/wrench.dm create mode 100644 code/game/objects/items/weapons/conversion_kit.dm diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index e2dd952213a..5574f97ea66 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -98,16 +98,16 @@ else return "South" -/obj/machinery/atmospherics/binary/circulator/attackby(obj/item/W as obj, mob/user as mob, params) - if(ismultitool(W)) - if(side_inverted == 0) - side_inverted = 1 - else - side_inverted = 0 - to_chat(user, "You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side.") - desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side." +/obj/machinery/atmospherics/binary/circulator/multitool_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(!side_inverted) + side_inverted = TRUE else - return ..() + side_inverted = FALSE + to_chat(user, "You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side.") + desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side." /obj/machinery/atmospherics/binary/circulator/update_icon() ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 1b920002227..afdca1d19ce 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -344,27 +344,6 @@ playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE) /obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "Now welding the vent.") - if(do_after(user, 20 * WT.toolspeed, target = src)) - if(!src || !WT.isOn()) return - playsound(src.loc, WT.usesound, 50, 1) - if(!welded) - user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") - welded = 1 - update_icon() - else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") - welded = 0 - update_icon() - else - to_chat(user, "The welding tool needs to be on to start this task.") - return 1 - else - to_chat(user, "You need more welding fuel to complete this task.") - return 1 if(istype(W, /obj/item/screwdriver)) if(!welded) if(open) @@ -400,6 +379,23 @@ return ..() +/obj/machinery/atmospherics/unary/vent_pump/welder_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_WELD_MESSAGE + if(I.use_tool(src, user, 20, volume = I.tool_volume)) + if(!welded) + welded = TRUE + visible_message("[user] welds [src] shut!",\ + "You weld [src] shut!") + else + welded = FALSE + visible_message("[user] unwelds [src]!",\ + "You unweld [src]!") + update_icon() + + /obj/machinery/atmospherics/unary/vent_pump/attack_hand() if(!welded) if(open) diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 5fcf7817a30..d9aff36688b 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -393,27 +393,6 @@ playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE) /obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/W as obj, var/mob/user as mob, params) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "Now welding the scrubber.") - if(do_after(user, 20 * WT.toolspeed, target = src)) - if(!src || !WT.isOn()) return - playsound(get_turf(src), WT.usesound, 50, 1) - if(!welded) - user.visible_message("[user] welds the scrubber shut.", "You weld the vent scrubber.", "You hear welding.") - welded = 1 - update_icon() - else - user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") - welded = 0 - update_icon() - else - to_chat(user, "The welding tool needs to be on to start this task.") - return 1 - else - to_chat(user, "You need more welding fuel to complete this task.") - return 1 if(istype(W, /obj/item/multitool)) update_multitool_menu(user) return 1 @@ -423,3 +402,19 @@ return 1 return ..() + +/obj/machinery/atmospherics/unary/vent_scrubber/welder_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_WELD_MESSAGE + if(I.use_tool(src, user, 20, volume = I.tool_volume)) + if(!welded) + welded = TRUE + visible_message("[user] welds [src] shut!",\ + "You weld [src] shut!") + else + welded = FALSE + visible_message("[user] unwelds [src]!",\ + "You unweld [src]!") + update_icon() diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm new file mode 100644 index 00000000000..d0204e1d013 --- /dev/null +++ b/code/__DEFINES/tools.dm @@ -0,0 +1,46 @@ +#define TOOL_CROWBAR "crowbar" +#define TOOL_MULTITOOL "multitool" +#define TOOL_SCREWDRIVER "screwdriver" +#define TOOL_WIRECUTTER "wirecutter" +#define TOOL_WRENCH "wrench" +#define TOOL_WELDER "welder" + +#define MIN_TOOL_SOUND_DELAY 20 + +//Crowbar messages +#define CROWBAR_ATTEMPT_PRY_CIRCUIT_MESSAGE user.visible_message("[user] begins removing the circuit board from [src]...", "You begin removing the circuit board from [src]...", "You hear prying noises.") +#define CROWBAR_PRY_CIRCUIT_SUCCESS_MESSAGE user.visible_message("[user] pries out the circuit board from [src]!", "You pry out the circuit board from [src]!", "You hear prying noises.") + +//Screwdriver messages +#define SCREWDRIVER_SCREW_MESSAGE user.visible_message("[user] tightens the screws on [src]!", "You tighten the screws on [src]!", "You hear a screwdriver.") +#define SCREWDRIVER_UNSCREW_MESSAGE user.visible_message("[user] loosens the screws on [src]!", "You loosen the screws on [src]!", "You hear a screwdriver.") +#define SCREWDRIVER_OPEN_PANEL_MESSAGE user.visible_message("[user] opens the panel on [src]!", "You open the panel on [src]!", "You hear a screwdriver.") +#define SCREWDRIVER_CLOSE_PANEL_MESSAGE user.visible_message("[user] closes the panel on [src]!", "You close the panel on [src]!", "You hear a screwdriver.") + +//Wirecutter messages +#define WIRECUTTER_SNIP_MESSAGE user.visible_message("[user] cuts the wires from [src]!", "You cut the wires from [src]!", "You hear snipping.") +#define WIRECUTTER_ATTEMPT_DISMANTLE_MESSAGE user.visible_message("[user] begins cutting [src] apart... ", "You begin cutting [src] apart...", "You hear snipping.") +#define WIRECUTTER_DISMANTLE_SUCCESS_MESSAGE user.visible_message("[user] cuts [src] apart!", "You cut [src] apart!", "You hear snipping.") + +//Welder messages and other stuff +#define HEALPERWELD 15 +#define WELDER_ATTEMPT_WELD_MESSAGE user.visible_message("[user] begins welding [src]...", "You begin welding [src]...", "You hear welding.") +#define WELDER_WELD_SUCCESS_MESSAGE to_chat(user, "You finish welding [src]!") +#define WELDER_ATTEMPT_REPAIR_MESSAGE user.visible_message("[user] begins repairing the damage on [src]...", "You begin repairing [src]...", "You hear welding.") +#define WELDER_REPAIR_SUCCESS_MESSAGE to_chat(user, "You repair the damage on [src]!") +#define WELDER_ATTEMPT_SLICING_MESSAGE user.visible_message("[user] begins slicing through [src]...", "You begin slicing through [src]...", "You hear welding.") +#define WELDER_SLICING_SUCCESS_MESSAGE to_chat(user, "You slice clean through [src]!") +#define WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE user.visible_message("[user] begins slicing [src] free from [get_turf(src)]...", "You begin slicing [src] free from [get_turf(src)]...", "You hear welding.") +#define WELDER_FLOOR_SLICE_SUCCESS_MESSAGE to_chat(user, "You slice [src] clear of [get_turf(src)]!") +#define WELDER_ATTEMPT_FLOOR_WELD_MESSAGE user.visible_message("[user] begins welding [src] to [get_turf(src)]...", "You begin welding [src] to [get_turf(src)]...", "You hear welding.") +#define WELDER_FLOOR_WELD_SUCCESS_MESSAGE to_chat(user, "You weld [src] to [get_turf(src)]!") + +//Wrench messages +#define WRENCH_ANCHOR_MESSAGE user.visible_message("[user] tightens the bolts on [src]!", "You tighten the bolts on [src]!", "You hear ratcheting.") +#define WRENCH_UNANCHOR_MESSAGE user.visible_message("[user] loosens the bolts on [src]!", "You loosen the bolts on [src]!", "You hear ratcheting.") +#define WRENCH_UNANCHOR_WALL_MESSAGE user.visible_message("[user] unwrenches [src] from the wall!", "You unwrench [src] from the wall!", "You hear ratcheting.") +#define WRENCH_ANCHOR_TO_WALL_MESSAGE user.visible_message("[user] affixes [src] to the wall!", "You affix [src] to the wall!", "You hear ratcheting.") + +//Generic tool messages that don't correspond to any particular tool +#define TOOL_ATTEMPT_DISMANTLE_MESSAGE user.visible_message("[user] begins to disassemble [src] with [I]...", "You begin to disassemble [src] with [I]...", "You hear someone using some kind of tool.") +#define TOOL_DISMANTLE_SUCCESS_MESSAGE user.visible_message("[user] dismantles [src]!", "You dismantle [src]!", "You hear someone using some kind of tool.") diff --git a/code/__HELPERS/tool_helpers.dm b/code/__HELPERS/tool_helpers.dm new file mode 100644 index 00000000000..15c8e60591e --- /dev/null +++ b/code/__HELPERS/tool_helpers.dm @@ -0,0 +1,51 @@ +//Quick type checks for some tools + +/proc/iswrench(O) + if(istype(O, /obj/item/wrench)) + return TRUE + return FALSE + +/proc/iswelder(O) + if(istype(O, /obj/item/weldingtool)) + return TRUE + return FALSE + +/proc/iswirecutter(O) + if(istype(O, /obj/item/wirecutters)) + return TRUE + return FALSE + +/proc/isscrewdriver(O) + if(istype(O, /obj/item/screwdriver)) + return TRUE + return FALSE + +/proc/ismultitool(O) + if(istype(O, /obj/item/multitool)) + return TRUE + return FALSE + +/proc/iscrowbar(O) + if(istype(O, /obj/item/crowbar)) + return TRUE + return FALSE + +/proc/iscoil(O) + if(istype(O, /obj/item/stack/cable_coil)) + return TRUE + return FALSE + +/proc/ispowertool(O)//used to check if a tool can force powered doors + if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw)) + return TRUE + return FALSE + +/proc/is_surgery_tool(obj/item/W as obj) + return ( \ + istype(W, /obj/item/scalpel) || \ + istype(W, /obj/item/hemostat) || \ + istype(W, /obj/item/retractor) || \ + istype(W, /obj/item/cautery) || \ + istype(W, /obj/item/bonegel) || \ + istype(W, /obj/item/bonesetter) + ) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f1611b38fd9..afe9858badd 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1142,73 +1142,11 @@ var/list/can_embed_types = typecacheof(list( if(is_type_in_typecache(W, can_embed_types)) return 1 -//Quick type checks for some tools -var/global/list/common_tools = list( -/obj/item/stack/cable_coil, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/item/screwdriver, -/obj/item/wirecutters, -/obj/item/multitool, -/obj/item/crowbar) - -/proc/istool(O) - if(O && is_type_in_list(O, common_tools)) - return 1 - return 0 - -/proc/iswrench(O) - if(istype(O, /obj/item/wrench)) - return 1 - return 0 - -/proc/iswelder(O) - if(istype(O, /obj/item/weldingtool)) - return 1 - return 0 - -/proc/iscoil(O) - if(istype(O, /obj/item/stack/cable_coil)) - return 1 - return 0 - -/proc/iswirecutter(O) - if(istype(O, /obj/item/wirecutters)) - return 1 - return 0 - -/proc/isscrewdriver(O) - if(istype(O, /obj/item/screwdriver)) - return 1 - return 0 - -/proc/ismultitool(O) - if(istype(O, /obj/item/multitool)) - return 1 - return 0 - -/proc/iscrowbar(O) - if(istype(O, /obj/item/crowbar)) - return 1 - return 0 - -/proc/ispowertool(O)//used to check if a tool can force powered doors - if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw)) - return TRUE - return FALSE - -/proc/iswire(O) - if(istype(O, /obj/item/stack/cable_coil)) - return 1 - return 0 - /proc/is_hot(obj/item/W as obj) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/O = W - if(O.isOn()) - return 2500 - else - return 0 + if(W.tool_behaviour == TOOL_WELDER && W.tool_enabled) + return 2500 + else + return 0 if(istype(W, /obj/item/lighter)) var/obj/item/lighter/O = W if(O.lit) @@ -1260,16 +1198,6 @@ var/global/list/common_tools = list( return 1 return 0 -/proc/is_surgery_tool(obj/item/W as obj) - return ( \ - istype(W, /obj/item/scalpel) || \ - istype(W, /obj/item/hemostat) || \ - istype(W, /obj/item/retractor) || \ - istype(W, /obj/item/cautery) || \ - istype(W, /obj/item/bonegel) || \ - istype(W, /obj/item/bonesetter) - ) - /proc/reverse_direction(var/dir) switch(dir) if(NORTH) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 47b5f2ba337..bdd2da3c1e2 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,10 +1,17 @@ /obj/item/proc/melee_attack_chain(mob/user, atom/target, params) - if(pre_attackby(target, user, params)) + if(!tool_attack_chain(user, target) && pre_attackby(target, user, params)) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) var/resolved = target.attackby(src, user, params) if(!resolved && target && !QDELETED(src)) afterattack(target, user, 1, params) // 1: clicking something Adjacent +//Checks if the item can work as a tool, calling the appropriate tool behavior on the target +//Note that if tool_act returns TRUE, then the tool won't call attack_by. +/obj/item/proc/tool_attack_chain(mob/user, atom/target) + if(!tool_behaviour) + return FALSE + return target.tool_act(user, src, tool_behaviour) + // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT) @@ -51,11 +58,6 @@ else return 1 - if(isscrewdriver(src) && ismachine(M) && user.a_intent == INTENT_HELP) - if(!attempt_initiate_surgery(src, M, user)) - return 0 - else - return 1 if(is_sharp(src) && user.a_intent == INTENT_HELP) if(!attempt_initiate_surgery(src, M, user)) return 0 diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 8cc1bdc27d8..f73607a2a4e 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -1,5 +1,6 @@ #define FORWARD -1 #define BACKWARD 1 +#define CONSTRUCTION_TOOL_BEHAVIOURS list(TOOL_CROWBAR, TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WRENCH) /datum/construction var/list/steps @@ -38,30 +39,13 @@ /datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. var/list/L = steps[steps.len] - if(istype(used_atom, L["key"])) + if(do_tool_or_atom_check(used_atom, L["key"])) return steps.len return 0 + /datum/construction/proc/custom_action(step, used_atom, user) - if(istype(used_atom, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = used_atom - if(W.remove_fuel(0, user)) - playsound(holder, W.usesound, 50, 1) - else - return 0 - else if(istype(used_atom, /obj/item/wrench)) - var/obj/item/wrench/W = used_atom - playsound(holder, W.usesound, 50, 1) - - else if(istype(used_atom, /obj/item/screwdriver)) - var/obj/item/screwdriver/S = used_atom - playsound(holder, S.usesound, 50, 1) - - else if(istype(used_atom, /obj/item/wirecutters)) - var/obj/item/wirecutters/W = used_atom - playsound(holder, W.usesound, 50, 1) - - else if(istype(used_atom, /obj/item/stack/cable_coil)) + if(istype(used_atom, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = used_atom if(C.amount<4) to_chat(user, ("There's not enough cable to finish the task.")) @@ -76,18 +60,22 @@ return 0 else S.use(5) + else if(isitem(used_atom)) + var/obj/item/I = used_atom + if(I.tool_behaviour in CONSTRUCTION_TOOL_BEHAVIOURS) + if(!I.use_tool(holder, user, 0, volume = I.tool_volume)) + return 0 return 1 /datum/construction/proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one. for(var/i=1;i<=steps.len;i++) var/list/L = steps[i]; - if(istype(used_atom, L["key"])) - if(custom_action(i, used_atom, user)) - steps[i]=null;//stupid byond list from list removal... - listclearnulls(steps); - if(!steps.len) - spawn_result(user) - return 1 + if(do_tool_or_atom_check(used_atom, L["key"]) && custom_action(i, used_atom, user)) + steps[i]=null;//stupid byond list from list removal... + listclearnulls(steps); + if(!steps.len) + spawn_result(user) + return 1 return 0 @@ -116,15 +104,12 @@ if(!coil.use(amount)) to_chat(user, "You don't have enough cable! You need at least [amount] coils.") return 0 - // WELDER - if(istype(used_atom,/obj/item/weldingtool)) - var/obj/item/weldingtool/welder=used_atom - if(!welder.isOn()) - to_chat(user, "You tap the [src] with your unlit welder. [pick("Ding","Dong")].") - return 0 - if(!welder.remove_fuel(amount,user)) - to_chat(user, "You don't have enough fuel!") - return 0 + // TOOLS + if(isitem(used_atom)) + var/obj/item/I = used_atom + if(I.tool_behaviour in CONSTRUCTION_TOOL_BEHAVIOURS) + if(!I.use(amount)) + return 0 // STACKS if(istype(used_atom,/obj/item/stack)) var/obj/item/stack/stack=used_atom @@ -134,6 +119,14 @@ stack.use(amount) return 1 +/datum/construction/proc/do_tool_or_atom_check(used_atom, thing_to_check) //Checks if an atom is either a required thing; or if it's a required tool + if(istype(used_atom, thing_to_check)) + return TRUE + else if(isitem(used_atom)) + var/obj/item/I = used_atom + if(I.tool_behaviour == thing_to_check) + return TRUE + /datum/construction/reversible var/index @@ -152,9 +145,9 @@ /datum/construction/reversible/is_right_key(atom/used_atom) // returns index step var/list/L = steps[index] - if(istype(used_atom, L["key"])) + if(do_tool_or_atom_check(used_atom, L["key"])) return FORWARD //to the first step -> forward - else if(L["backkey"] && istype(used_atom, L["backkey"])) + else if(L["backkey"] && do_tool_or_atom_check(used_atom, L["backkey"])) return BACKWARD //to the last step -> backwards return 0 @@ -198,13 +191,13 @@ var/list/state = steps[index] if(state_next in state) var/list/step = state[state_next] - if(istype(used_atom, step["key"])) + if(do_tool_or_atom_check(used_atom, step["key"])) //if(L["consume"] && !try_consume(used_atom,L["consume"])) // return 0 return FORWARD //to the first step -> forward else if(state_prev in state) var/list/step = state[state_prev] - if(istype(used_atom, step["key"])) + if(do_tool_or_atom_check(used_atom, step["key"])) //if(L["consume"] && !try_consume(used_atom,L["consume"])) // return 0 return BACKWARD //to the first step -> forward diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index f412e96b5ee..daf8a0dcd48 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -54,8 +54,7 @@ var/const/AALARM_WIRE_AALARM = 16 // to_chat(world, "Power wire cut") if(AALARM_WIRE_AI_CONTROL) - if(A.aidisabled == !mended) - A.aidisabled = mended + A.aidisabled = !mended // to_chat(world, "AI Control Wire Cut") if(AALARM_WIRE_SYPHON) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 5220fd83a6d..a201617682d 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -5,12 +5,6 @@ #define MAX_FLAG 65535 -/proc/is_wire_tool(obj/item/I) - if(ismultitool(I)) - return TRUE - if(iswirecutter(I)) - return TRUE - var/list/same_wires = list() // 12 colours, if you're adding more than 12 wires then add more colours here var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink") diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8a19fb14d9c..cd7e1e45015 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -332,6 +332,47 @@ if(reagents) reagents.temperature_reagents(exposed_temperature) +/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) + switch(tool_type) + if(TOOL_CROWBAR) + return crowbar_act(user, I) + if(TOOL_MULTITOOL) + return multitool_act(user, I) + if(TOOL_SCREWDRIVER) + return screwdriver_act(user, I) + if(TOOL_WRENCH) + return wrench_act(user, I) + if(TOOL_WIRECUTTER) + return wirecutter_act(user, I) + if(TOOL_WELDER) + return welder_act(user, I) + + +// Tool-specific behavior procs. To be overridden in subtypes. +/atom/proc/crowbar_act(mob/living/user, obj/item/I) + return + +/atom/proc/multitool_act(mob/living/user, obj/item/I) + return + +//Check if the multitool has an item in its data buffer +/atom/proc/multitool_check_buffer(user, silent = FALSE) + if(!silent) + to_chat(user, "[src] has no data buffer!") + return FALSE + +/atom/proc/screwdriver_act(mob/living/user, obj/item/I) + return + +/atom/proc/wrench_act(mob/living/user, obj/item/I) + return + +/atom/proc/wirecutter_act(mob/living/user, obj/item/I) + return + +/atom/proc/welder_act(mob/living/user, obj/item/I) + return + /atom/proc/emag_act() return diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 32ab33fc983..de42b5b253f 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -205,21 +205,8 @@ user.stop_pulling() /obj/machinery/dna_scannernew/attackby(var/obj/item/item as obj, var/mob/user as mob, params) - if(istype(item, /obj/item/screwdriver)) - if(occupant) - to_chat(user, "The maintenance panel is locked.") - return - default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", item) - return if(exchange_parts(user, item)) return - - if(istype(item, /obj/item/crowbar)) - if(panel_open) - for(var/obj/I in contents) // in case there is something in the scanner - I.forceMove(src.loc) - default_deconstruction_crowbar(item) - return else if(istype(item, /obj/item/reagent_containers/glass)) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") @@ -255,6 +242,18 @@ return return ..() +/obj/machinery/dna_scannernew/crowbar_act(mob/user, obj/item/I) + if(default_deconstruction_crowbar(user, I)) + for(var/obj/thing in contents) // in case there is something in the scanner + thing.forceMove(src.loc) + +/obj/machinery/dna_scannernew/screwdriver_act(mob/user, obj/item/I) + if(occupant) + to_chat(user, "The maintenance panel is locked.") + return TRUE + if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I)) + return TRUE + /obj/machinery/dna_scannernew/relaymove(mob/user as mob) if(user.incapacitated()) return 0 //maybe they should be able to get out with cuffs, but whatever diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 962da01b74d..c27b230b3b2 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -587,10 +587,8 @@ Congratulations! You are now trained for invasive xenobiology research!"} ..() make_syndie() -/obj/item/radio/headset/abductor/attackby(obj/item/I, mob/user, params) - if(isscrewdriver(I)) - return // Stops humans from disassembling abductor headsets. - return ..() +/obj/item/radio/headset/abductor/screwdriver_act() + return// Stops humans from disassembling abductor headsets. /obj/item/scalpel/alien name = "alien scalpel" @@ -683,15 +681,6 @@ Congratulations! You are now trained for invasive xenobiology research!"} density = TRUE /obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params) - if(iswrench(I)) - to_chat(user, "You start disassembling [src]...") - playsound(loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) - playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) - for(var/i = 1, i <= framestackamount, i++) - new framestack(get_turf(src)) - qdel(src) - return if(istype(I, /obj/item/stack/sheet/mineral/abductor)) var/obj/item/stack/sheet/P = I if(P.get_amount() < 1) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 63905bc3390..e764f97a46a 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -41,15 +41,17 @@ return to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.") -/obj/effect/mob_spawn/swarmer/attackby(obj/item/I, mob/user, params) - if(isscrewdriver(I) && user.a_intent != INTENT_HARM) - user.visible_message("[usr.name] deactivates [src].", - "After some fiddling, you find a way to disable [src]'s power source.", - "You hear clicking.") - new /obj/item/deactivated_swarmer(get_turf(src)) - qdel(src) - else - return ..() +/obj/effect/mob_spawn/swarmer/screwdriver_act(mob/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + user.visible_message("[usr.name] deactivates [src].", + "After some fiddling, you find a way to disable [src]'s power source.", + "You hear clicking.") + new /obj/item/deactivated_swarmer(get_turf(src)) + qdel(src) ////The Mob itself//// diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 1c4956d096e..714ccbf1d5f 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -1,3 +1,10 @@ +#define NUKE_INTACT 0 +#define NUKE_COVER_OFF 1 +#define NUKE_COVER_OPEN 2 +#define NUKE_SEALANT_OPEN 3 +#define NUKE_UNWRENCHED 4 +#define NUKE_MOBILE 5 + var/bomb_set /obj/machinery/nuclearbomb @@ -17,7 +24,7 @@ var/bomb_set var/yes_code = 0 var/safety = 1 var/obj/item/disk/nuclear/auth = null - var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. + var/removal_stage = NUKE_INTACT var/lastentered var/is_syndicate = 0 use_power = NO_POWER_USE @@ -50,33 +57,6 @@ var/bomb_set return /obj/machinery/nuclearbomb/attackby(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/screwdriver)) - add_fingerprint(user) - if(auth) - if(panel_open == 0) - panel_open = 1 - overlays += image(icon, "npanel_open") - to_chat(user, "You unscrew the control panel of [src].") - playsound(src, O.usesound, 50, 1) - else - panel_open = 0 - overlays -= image(icon, "npanel_open") - to_chat(user, "You screw the control panel of [src] back on.") - playsound(src, O.usesound, 50, 1) - else - if(panel_open == 0) - to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") - if(panel_open == 1) - panel_open = 0 - overlays -= image(icon, "npanel_open") - to_chat(user, "You screw the control panel of [src] back on.") - playsound(src, O.usesound, 50, 1) - flick("nuclearbombc", src) - return - - if(panel_open && (istype(O, /obj/item/multitool) || istype(O, /obj/item/wirecutters))) - return attack_hand(user) - if(istype(O, /obj/item/disk/nuclear)) if(extended) if(!user.drop_item()) @@ -89,77 +69,107 @@ var/bomb_set else to_chat(user, "You need to deploy \the [src] first. Right click on the sprite, select 'Make Deployable' then click on \the [src] with an empty hand.") return - - if(anchored) - switch(removal_stage) - if(0) - if(istype(O,/obj/item/weldingtool)) - var/obj/item/weldingtool/WT = O - if(!WT.isOn()) return - if(WT.get_fuel() < 5) // uses up 5 fuel. - to_chat(user, "You need more fuel to complete this task.") - return - - user.visible_message("[user] starts cutting loose the anchoring bolt covers on [src].", "You start cutting loose the anchoring bolt covers with [O]...") - - if(do_after(user,40, target = src)) - if(!src || !user || !WT.remove_fuel(5, user)) return - user.visible_message("[user] cuts through the bolt covers on [src].", "You cut through the bolt cover.") - removal_stage = 1 - return - - if(1) - if(istype(O,/obj/item/crowbar)) - user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [O]...") - - if(do_after(user,15, target = src)) - if(!src || !user) return - user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.") - removal_stage = 2 - return - - if(2) - if(istype(O,/obj/item/weldingtool)) - - var/obj/item/weldingtool/WT = O - if(!WT.isOn()) return - if(WT.get_fuel() < 5) // uses up 5 fuel. - to_chat(user, "You need more fuel to complete this task.") - return - - user.visible_message("[user] starts cutting apart the anchoring system sealant on [src].", "You start cutting apart the anchoring system's sealant with [O]...") - - if(do_after(user,40, target = src)) - if(!src || !user || !WT.remove_fuel(5, user)) return - user.visible_message("[user] cuts apart the anchoring system sealant on [src].", "You cut apart the anchoring system's sealant.") - removal_stage = 3 - return - - if(3) - if(istype(O,/obj/item/wrench)) - - user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...") - - if(do_after(user,50, target = src)) - if(!src || !user) return - user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.") - removal_stage = 4 - return - - if(4) - if(istype(O,/obj/item/crowbar)) - - user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") - - if(do_after(user,80, target = src)) - if(!src || !user) return - user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!") - anchored = 0 - removal_stage = 5 - return - return return ..() +/obj/machinery/nuclearbomb/crowbar_act(mob/user, obj/item/I) + if(!anchored) + return + if(removal_stage != NUKE_UNWRENCHED && removal_stage != NUKE_COVER_OFF) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + if(removal_stage == NUKE_COVER_OFF) + user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [I]...") + if(!I.use_tool(src, user, 15, volume = I.tool_volume) || removal_stage != NUKE_COVER_OFF) + return + user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.") + removal_stage = NUKE_COVER_OPEN + else + user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") + if(!I.use_tool(src, user, 80, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED) + return + user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!") + anchored = FALSE + removal_stage = NUKE_MOBILE + +/obj/machinery/nuclearbomb/wrench_act(mob/user, obj/item/I) + if(!anchored) + return + if(removal_stage != NUKE_SEALANT_OPEN) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...") + if(!I.use_tool(src, user, 50, volume = I.tool_volume) || removal_stage != NUKE_SEALANT_OPEN) + return + user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.") + removal_stage = NUKE_UNWRENCHED + +/obj/machinery/nuclearbomb/multitool_act(mob/user, obj/item/I) + if(!panel_open) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + attack_hand(user) + +/obj/machinery/nuclearbomb/screwdriver_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(auth) + if(!panel_open) + panel_open = TRUE + overlays += image(icon, "npanel_open") + to_chat(user, "You unscrew the control panel of [src].") + else + panel_open = FALSE + overlays -= image(icon, "npanel_open") + to_chat(user, "You screw the control panel of [src] back on.") + else + if(!panel_open) + to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") + if(panel_open == TRUE) + panel_open = FALSE + overlays -= image(icon, "npanel_open") + to_chat(user, "You screw the control panel of [src] back on.") + flick("nuclearbombc", src) + +/obj/machinery/nuclearbomb/wirecutter_act(mob/user, obj/item/I) + if(!panel_open) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + attack_hand(user) + +/obj/machinery/nuclearbomb/welder_act(mob/user, obj/item/I) + . = TRUE + if(removal_stage != NUKE_INTACT && removal_stage != NUKE_COVER_OPEN) + return + if(!I.tool_use_check(user, 0)) + return + if(removal_stage == NUKE_INTACT) + visible_message("[user] starts cutting loose the anchoring bolt covers on [src].",\ + "You start cutting loose the anchoring bolt covers with [I]...",\ + "You hear welding.") + if(!I.use_tool(src, user, 40, 5, volume = I.tool_volume) || removal_stage != NUKE_INTACT) + return + visible_message("[user] cuts through the bolt covers on [src].",\ + "You cut through the bolt cover.") + removal_stage = NUKE_COVER_OFF + else if(removal_stage == NUKE_COVER_OPEN) + visible_message("[user] starts cutting apart the anchoring system sealant on [src].",\ + "You start cutting apart the anchoring system's sealant with [I]...",\ + "You hear welding.") + if(!I.use_tool(src, user, 40, 5, volume = I.tool_volume) || removal_stage != NUKE_COVER_OPEN) + return + visible_message("[user] cuts apart the anchoring system sealant on [src].",\ + "You cut apart the anchoring system's sealant.") + removal_stage = NUKE_SEALANT_OPEN + /obj/machinery/nuclearbomb/attack_ghost(mob/user as mob) if(extended) attack_hand(user) @@ -171,7 +181,7 @@ var/bomb_set else ui_interact(user) else if(deployable) - if(removal_stage < 5) + if(removal_stage != NUKE_MOBILE) anchored = 1 visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring!") else @@ -317,7 +327,7 @@ var/bomb_set timing = 0 bomb_set = 0 if(href_list["anchor"]) - if(removal_stage == 5) + if(removal_stage == NUKE_MOBILE) anchored = 0 visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") SSnanoui.update_uis(src) @@ -453,3 +463,10 @@ var/bomb_set else error("[src] was supposed to be destroyed, but we were unable to locate a blobstart landmark to spawn a new one.") return QDEL_HINT_LETMELIVE // Cancel destruction unless forced. + +#undef NUKE_INTACT +#undef NUKE_COVER_OFF +#undef NUKE_COVER_OPEN +#undef NUKE_SEALANT_OPEN +#undef NUKE_UNWRENCHED +#undef NUKE_MOBILE diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index 91afce20b4d..8f2625b8854 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -50,36 +50,39 @@ ..(dir,dir) /obj/machinery/atmospherics/unary/cold_sink/freezer/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "freezer-o", "freezer", I)) - on = 0 - update_icon() - return - if(exchange_parts(user, I)) return - - if(default_deconstruction_crowbar(I)) - return - - if(iswrench(I)) - if(!panel_open) - to_chat(user, "Open the maintenance panel first.") - return - var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) - var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices - dir = choices[selected] - playsound(src.loc, I.usesound, 50, 1) - var/node_connect = dir - initialize_directions = dir - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) - if(target.initialize_directions & get_dir(target,src)) - node = target - break - build_network() - update_icon() - return return ..() +/obj/machinery/atmospherics/unary/cold_sink/freezer/crowbar_act(mob/user, obj/item/I) + if(default_deconstruction_crowbar(user, I)) + return TRUE + +/obj/machinery/atmospherics/unary/cold_sink/freezer/screwdriver_act(mob/user, obj/item/I) + if(default_deconstruction_screwdriver(user, "freezer-o", "freezer", I)) + on = FALSE + update_icon() + return TRUE + +/obj/machinery/atmospherics/unary/cold_sink/freezer/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(!panel_open) + to_chat(user, "Open the maintenance panel first.") + return + var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices + dir = choices[selected] + var/node_connect = dir + initialize_directions = dir + for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) + if(target.initialize_directions & get_dir(target,src)) + node = target + break + build_network() + update_icon() + /obj/machinery/atmospherics/unary/cold_sink/freezer/update_icon() if(panel_open) icon_state = "freezer-o" @@ -217,35 +220,38 @@ current_heat_capacity = 1000 * ((H - 1) ** 2) /obj/machinery/atmospherics/unary/heat_reservoir/heater/attackby(obj/item/I, mob/user, params) + if(exchange_parts(user, I)) + return + return ..() + +/obj/machinery/atmospherics/unary/heat_reservoir/heater/crowbar_act(mob/user, obj/item/I) + if(default_deconstruction_crowbar(user, I)) + return TRUE + +/obj/machinery/atmospherics/unary/heat_reservoir/heater/screwdriver_act(mob/user, obj/item/I) if(default_deconstruction_screwdriver(user, "heater-o", "heater", I)) on = 0 update_icon() - return + return TRUE - if(exchange_parts(user, I)) +/obj/machinery/atmospherics/unary/heat_reservoir/heater/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return - - if(default_deconstruction_crowbar(I)) + if(!panel_open) + to_chat(user, "Open the maintenance panel first.") return - - if(iswrench(I)) - if(!panel_open) - to_chat(user, "Open the maintenance panel first.") - return - var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) - var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices - dir = choices[selected] - playsound(src.loc, I.usesound, 50, 1) - var/node_connect = dir - initialize_directions = dir - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) - if(target.initialize_directions & get_dir(target,src)) - node = target - break - build_network() - update_icon() - return - return ..() + var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) + var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices + dir = choices[selected] + var/node_connect = dir + initialize_directions = dir + for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) + if(target.initialize_directions & get_dir(target,src)) + node = target + break + build_network() + update_icon() /obj/machinery/atmospherics/unary/heat_reservoir/heater/update_icon() if(panel_open) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 2c6e60c3d52..8c93028649b 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -131,15 +131,18 @@ if(iscarbon(G.affecting)) take_victim(G.affecting, user) qdel(G) - if(iswrench(I)) - playsound(loc, I.usesound, 50, 1) - if(do_after(user, 20 * I.toolspeed, target = src)) - to_chat(user, "You deconstruct the table.") - new /obj/item/stack/sheet/plasteel(loc, 5) - qdel(src) else return ..() +/obj/machinery/optable/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_start_check(user, 0)) + return + if(I.use_tool(src, user, 20, volume = I.tool_volume)) + to_chat(user, "You deconstruct the table.") + new /obj/item/stack/sheet/plasteel(loc, 5) + qdel(src) + /obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) if(src.victim && get_turf(victim) == get_turf(src) && victim.lying) to_chat(usr, "The table is already occupied!") diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 817d56cb47a..83778a99c26 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -75,27 +75,15 @@ P.forceMove(src) P.add_fingerprint(user) update_icon() - else if(iswelder(I) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = I - if(stat & BROKEN) - if(WT.remove_fuel(0,user)) - user.visible_message("[user] is repairing [src].", \ - "You begin repairing [src]...", \ - "You hear welding.") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user,40*WT.toolspeed, 1, target = src)) - if(!WT.isOn() || !(stat & BROKEN)) - return - to_chat(user, "You repair [src].") - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - stat &= ~BROKEN - obj_integrity = max_integrity - update_icon() - else - to_chat(user, "[src] does not need repairs.") else return ..() +/obj/machinery/pdapainter/welder_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + default_welder_repair(user, I) + /obj/machinery/pdapainter/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) if(!(stat & BROKEN)) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index fbe594f2269..f1adf1a5f11 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -280,35 +280,9 @@ to_chat(user, "The sleeper has a beaker already.") return - if(isscrewdriver(I)) - if(occupant) - to_chat(user, "The maintenance panel is locked.") - return - default_deconstruction_screwdriver(user, "[base_icon]-o", "[base_icon]-open", I) - return - - if(iswrench(I)) - if(occupant) - to_chat(user, "The scanner is occupied.") - return - if(panel_open) - to_chat(user, "Close the maintenance panel first.") - return - if(dir == EAST) - orient = "LEFT" - setDir(WEST) - else - orient = "RIGHT" - setDir(EAST) - playsound(loc, I.usesound, 50, 1) - return - if(exchange_parts(user, I)) return - if(default_deconstruction_crowbar(I)) - return - if(istype(I, /obj/item/grab)) var/obj/item/grab/G = I if(panel_open) @@ -343,6 +317,34 @@ return ..() +/obj/machinery/sleeper/crowbar_act(mob/user, obj/item/I) + if(default_deconstruction_crowbar(user, I)) + return TRUE + +/obj/machinery/sleeper/screwdriver_act(mob/user, obj/item/I) + if(occupant) + to_chat(user, "The maintenance panel is locked.") + return TRUE + if(default_deconstruction_screwdriver(user, "[base_icon]-o", "[base_icon]-open", I)) + return TRUE + +/obj/machinery/sleeper/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(occupant) + to_chat(user, "The scanner is occupied.") + return + if(panel_open) + to_chat(user, "Close the maintenance panel first.") + return + if(dir == EAST) + orient = "LEFT" + setDir(WEST) + else + orient = "RIGHT" + setDir(EAST) + /obj/machinery/sleeper/ex_act(severity) if(filtering) toggle_filter() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 0863b65415a..edb12487a68 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -40,33 +40,9 @@ RefreshParts() /obj/machinery/bodyscanner/attackby(obj/item/I, mob/user) - if(isscrewdriver(I)) - if(occupant) - to_chat(user, "The maintenance panel is locked.") - return - default_deconstruction_screwdriver(user, "bodyscanner-o", "bodyscanner-open", I) - return - - if(iswrench(I)) - if(occupant) - to_chat(user, "The scanner is occupied.") - return - if(panel_open) - to_chat(user, "Close the maintenance panel first.") - return - if(dir == EAST) - setDir(WEST) - else - setDir(EAST) - playsound(loc, I.usesound, 50, 1) - return - if(exchange_parts(user, I)) return - if(default_deconstruction_crowbar(I)) - return - if(istype(I, /obj/item/grab)) var/obj/item/grab/TYPECAST_YOUR_SHIT = I if(panel_open) @@ -93,6 +69,28 @@ return ..() +/obj/machinery/bodyscanner/crowbar_act(mob/user, obj/item/I) + if(default_deconstruction_crowbar(user, I)) + return TRUE + +/obj/machinery/bodyscanner/screwdriver_act(mob/user, obj/item/I) + if(default_deconstruction_screwdriver(user, "bodyscanner-o", "bodyscanner-open", I)) + return TRUE + +/obj/machinery/bodyscanner/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(occupant) + to_chat(user, "The scanner is occupied.") + return + if(panel_open) + to_chat(user, "Close the maintenance panel first.") + return + if(dir == EAST) + setDir(WEST) + else + setDir(EAST) /obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/human/H, mob/user) if(!istype(H)) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index d13406eee99..5d286c0a367 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -62,6 +62,10 @@ #define MAX_TEMPERATURE 363.15 // 90C #define MIN_TEMPERATURE 233.15 // -40C +#define AIR_ALARM_FRAME 0 +#define AIR_ALARM_BUILDING 1 +#define AIR_ALARM_READY 2 + //all air alarms in area are connected via magic /area var/obj/machinery/alarm/master_air_alarm @@ -111,7 +115,7 @@ var/danger_level = ATMOS_ALARM_NONE var/alarmActivated = 0 // Manually activated (independent from danger level) - var/buildstage = 2 //2 is built, 1 is building, 0 is frame. + var/buildstage = AIR_ALARM_READY var/target_temperature = T20C var/regulating_temperature = 0 @@ -948,24 +952,6 @@ switch(buildstage) if(2) - if(isscrewdriver(I)) // Opening that Air Alarm up. - wiresexposed = !wiresexposed - to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") - update_icon() - return - - if(iswirecutter(I)) // cutting the wires out - if(wires.wires_status == 31) // all wires cut - var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil() - new_coil.amount = 5 - new_coil.forceMove(user.loc) - buildstage = 1 - update_icon() - return - - if(wiresexposed && ((ismultitool(I) || iswirecutter(I)))) - return attack_hand(user) - if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda))// trying to unlock the interface with an ID card if(stat & (NOPOWER|BROKEN)) to_chat(user, "It does nothing") @@ -980,7 +966,7 @@ return if(1) - if(istype(I, /obj/item/stack/cable_coil)) + if(iscoil(I)) var/obj/item/stack/cable_coil/coil = I if(coil.amount < 5) to_chat(user, "You need more cable for this!") @@ -996,19 +982,6 @@ update_icon() first_run() return - - else if(iscrowbar(I)) - to_chat(user, "You start prying out the circuit.") - playsound(get_turf(src), I.usesound, 50, 1) - if(do_after(user, 20 * I.toolspeed, target = src)) - if(buildstage != 1) - return - to_chat(user, "You pry out the circuit!") - var/obj/item/airalarm_electronics/circuit = new /obj/item/airalarm_electronics() - circuit.forceMove(user.loc) - buildstage = 0 - update_icon() - return if(0) if(istype(I, /obj/item/airalarm_electronics)) to_chat(user, "You insert the circuit!") @@ -1017,16 +990,70 @@ buildstage = 1 update_icon() return - - else if(iswrench(I)) - to_chat(user, "You remove the fire alarm assembly from the wall!") - new /obj/item/mounted/frame/alarm_frame(get_turf(user)) - playsound(get_turf(src), I.usesound, 50, 1) - qdel(src) - return - return ..() +/obj/machinery/alarm/crowbar_act(mob/user, obj/item/I) + if(buildstage != AIR_ALARM_BUILDING) + return + . = TRUE + if(!I.tool_start_check(user, 0)) + return + to_chat(user, "You start prying out the circuit.") + if(!I.use_tool(src, user, 20, volume = I.tool_volume)) + return + if(buildstage != AIR_ALARM_BUILDING) + return + to_chat(user, "You pry out the circuit!") + new /obj/item/airalarm_electronics(user.drop_location()) + buildstage = AIR_ALARM_FRAME + update_icon() + +/obj/machinery/alarm/multitool_act(mob/user, obj/item/I) + if(buildstage != AIR_ALARM_READY) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(wiresexposed) + attack_hand(user) + +/obj/machinery/alarm/screwdriver_act(mob/user, obj/item/I) + if(buildstage != AIR_ALARM_READY) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + wiresexposed = !wiresexposed + update_icon() + if(wiresexposed) + SCREWDRIVER_OPEN_PANEL_MESSAGE + else + SCREWDRIVER_CLOSE_PANEL_MESSAGE + +/obj/machinery/alarm/wirecutter_act(mob/user, obj/item/I) + if(buildstage != AIR_ALARM_READY) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(wires.wires_status == 31) // all wires cut + var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil(user.drop_location()) + new_coil.amount = 5 + buildstage = AIR_ALARM_BUILDING + update_icon() + if(wiresexposed) + wires.Interact(user) + +/obj/machinery/alarm/wrench_act(mob/user, obj/item/I) + if(buildstage != AIR_ALARM_FRAME) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + new /obj/item/mounted/frame/alarm_frame(get_turf(user)) + WRENCH_UNANCHOR_WALL_MESSAGE + qdel(src) + /obj/machinery/alarm/power_change() if(powered(power_channel)) stat &= ~NOPOWER @@ -1076,3 +1103,8 @@ Just an object used in constructing air alarms origin_tech = "engineering=2;programming=1" toolspeed = 1 usesound = 'sound/items/deconstruct.ogg' + + +#undef AIR_ALARM_FRAME +#undef AIR_ALARM_BUILDING +#undef AIR_ALARM_READY diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 3210e899876..230401b673b 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -78,7 +78,6 @@ var/datum/canister_icons/canister_icon_container = new() use_power = NO_POWER_USE interact_offline = 1 var/release_log = "" - var/busy = 0 var/update_flag = 0 /obj/machinery/portable_atmospherics/canister/New() @@ -264,22 +263,6 @@ update_flag return canister_break() -/obj/machinery/portable_atmospherics/canister/attackby(obj/item/I, mob/user, params) - if(user.a_intent != INTENT_HARM && iswelder(I)) - var/obj/item/weldingtool/WT = I - if(stat & BROKEN) - if(!WT.remove_fuel(0, user)) - return - playsound(loc, WT.usesound, 40, 1) - to_chat(user, "You begin cutting [src] apart...") - if(do_after(user, 30, target = src)) - deconstruct(TRUE) - else - to_chat(user, "You cannot slice [src] apart when it isn't broken.") - return TRUE - else - return ..() - /obj/machinery/portable_atmospherics/canister/proc/canister_break() disconnect() var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) @@ -610,21 +593,14 @@ update_flag src.update_icon() // Otherwise new canisters do not have their icon updated with the pressure light, likely want to add this to the canister class constructor, avoiding at current time to refrain from screwing up code for other canisters. --DZD return 1 -/obj/machinery/portable_atmospherics/canister/proc/weld(var/obj/item/weldingtool/WT, var/mob/user) - - if(busy) - return 0 - if(!WT.remove_fuel(0, user)) - return 0 - - // Do after stuff here - to_chat(user, "You start to slice away at \the [src]...") - playsound(src.loc, WT.usesound, 50, 1) - busy = 1 - if(do_after(user, 50 * WT.toolspeed, target = src)) - busy = 0 - if(!WT.isOn()) - return 0 - return 1 - busy = 0 - return 0 +/obj/machinery/portable_atmospherics/canister/welder_act(mob/user, obj/item/I) + if(!(stat & BROKEN)) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_SLICING_MESSAGE + if(I.use_tool(src, user, 50, volume = I.tool_volume)) + to_chat(user, "You salvage whats left of [src]!") + new /obj/item/stack/sheet/metal(drop_location(), 3) + qdel(src) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index b7c2dd152da..5008f4791ba 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -126,30 +126,32 @@ src.holding = T update_icon() return - else if(istype(W, /obj/item/wrench)) - if(connected_port) - disconnect() - to_chat(user, "You disconnect [name] from the port.") - update_icon() - return - else - var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc - if(possible_port) - if(connect(possible_port)) - to_chat(user, "You connect [name] to the port.") - update_icon() - return - else - to_chat(user, "[name] failed to connect to the port.") - return - else - to_chat(user, "Nothing happens.") - return if((istype(W, /obj/item/analyzer)) && get_dist(user, src) <= 1) atmosanalyzer_scan(air_contents, user) return return ..() +/obj/machinery/portable_atmospherics/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(connected_port) + disconnect() + to_chat(user, "You disconnect [name] from the port.") + update_icon() + else + var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc + if(possible_port) + if(connect(possible_port)) + to_chat(user, "You connect [src] to the port.") + update_icon() + return + else + to_chat(user, "[src] failed to connect to the port.") + return + else + to_chat(user, "Nothing happens.") + /obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user) if(I.force < 10 && !(stat & BROKEN)) take_damage(0) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index ae0611e69d4..52ee48f067b 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -174,21 +174,8 @@ if(busy) to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") return 1 - - if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)) - SSnanoui.update_uis(src) - return - if(exchange_parts(user, O)) return - - if(panel_open) - if(istype(O, /obj/item/crowbar)) - default_deconstruction_crowbar(O) - return 1 - else - attack_hand(user) - return 1 if(stat) return 1 @@ -215,6 +202,50 @@ return ..() +/obj/machinery/autolathe/crowbar_act(mob/user, obj/item/I) + if(!I.use_tool(src, user, 0, volume = 0)) + return + . = TRUE + if(busy) + to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") + return + if(panel_open) + default_deconstruction_crowbar(user, I) + I.play_tool_sound(user, I.tool_volume) + +/obj/machinery/autolathe/screwdriver_act(mob/user, obj/item/I) + if(!I.use_tool(src, user, 0, volume = 0)) + return + . = TRUE + if(busy) + to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") + return + if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", I)) + SSnanoui.update_uis(src) + I.play_tool_sound(user, I.tool_volume) + +/obj/machinery/autolathe/wirecutter_act(mob/user, obj/item/I) + if(!panel_open) + return + if(!I.use_tool(src, user, 0, volume = 0)) + return + . = TRUE + if(busy) + to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") + return + interact(user) + +/obj/machinery/autolathe/multitool_act(mob/user, obj/item/I) + if(!panel_open) + return + if(!I.use_tool(src, user, 0, volume = 0)) + return + . = TRUE + if(busy) + to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") + return + interact(user) + /obj/machinery/autolathe/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted) switch(id_inserted) if(MAT_METAL) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7e0508ba24f..bb09c247bca 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -127,27 +127,7 @@ var/msg = "You attach [I] into the assembly inner circuits." var/msg2 = "The camera already has that upgrade!" - // DECONSTRUCTION - if(isscrewdriver(I)) - panel_open = !panel_open - to_chat(user, "You screw the camera's panel [panel_open ? "open" : "closed"].") - playsound(loc, I.usesound, 50, 1) - - else if((iswirecutter(I) || ismultitool(I)) && panel_open) - wires.Interact(user) - - else if(iswelder(I) && panel_open && wires.CanDeconstruct()) - var/obj/item/weldingtool/WT = I - if(!WT.remove_fuel(0, user)) - return - to_chat(user, "You start to weld [src]...") - playsound(loc, WT.usesound, 50, 1) - if(do_after(user, 100 * WT.toolspeed, target = src)) - user.visible_message("[user] unwelds [src], leaving it as just a frame bolted to the wall.", - "You unweld [src], leaving it as just a frame bolted to the wall") - deconstruct(TRUE) - - else if(istype(I, /obj/item/analyzer) && panel_open) //XRay + if(istype(I, /obj/item/analyzer) && panel_open) //XRay if(!user.drop_item()) to_chat(user, "[I] is stuck to your hand!") return @@ -233,6 +213,40 @@ else return ..() + +/obj/machinery/camera/screwdriver_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + panel_open = !panel_open + to_chat(user, "You screw [src]'s panel [panel_open ? "open" : "closed"].") + +/obj/machinery/camera/wirecutter_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = 0)) + return + if(panel_open) + wires.Interact(user) + +/obj/machinery/camera/multitool_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = 0)) + return + if(panel_open) + wires.Interact(user) + +/obj/machinery/camera/welder_act(mob/user, obj/item/I) + if(!panel_open || !wires.CanDeconstruct()) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_WELD_MESSAGE + if(I.use_tool(src, user, 100, volume = I.tool_volume)) + visible_message("[user] unwelds [src], leaving it as just a frame bolted to the wall.", + "You unweld [src], leaving it as just a frame bolted to the wall") + deconstruct(TRUE) + /obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(stat & BROKEN) return damage_amount diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 34915f2d01b..bd795ab340b 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -3,6 +3,7 @@ #define ASSEMBLY_WELDED 2 // Welded in place #define ASSEMBLY_WIRED 3 // Wires attached (Upgradable now) #define ASSEMBLY_BUILT 4 // Fully built (incl panel closed) +#define HEY_IM_WORKING_HERE 666 //So nobody can mess with the camera while we're inputting settings /obj/item/camera_assembly name = "camera assembly" @@ -16,7 +17,6 @@ var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer) var/list/upgrades = list() var/state = ASSEMBLY_UNBUILT - var/busy = FALSE /obj/item/camera_assembly/Destroy() @@ -24,106 +24,18 @@ return ..() /obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params) - - switch(state) - if(ASSEMBLY_UNBUILT) - // State 0 - if(iswrench(I) && isturf(loc)) - playsound(loc, I.usesound, 50, 1) - to_chat(user, "You wrench the assembly into place.") - anchored = 1 - state = ASSEMBLY_WRENCHED - update_icon() - auto_turn() - return - - if(ASSEMBLY_WRENCHED) - // State 1 - if(iswelder(I)) - if(weld(I, user)) - to_chat(user, "You weld the assembly securely into place.") - anchored = TRUE - state = ASSEMBLY_WELDED - return - - else if(iswrench(I)) - playsound(loc, I.usesound, 50, 1) - to_chat(user, "You unattach the assembly from it's place.") - anchored = FALSE - update_icon() - state = ASSEMBLY_UNBUILT - return - - if(ASSEMBLY_WELDED) - if(iscoil(I)) - var/obj/item/stack/cable_coil/C = I - if(C.use(2)) - to_chat(user, "You add wires to the assembly.") - playsound(loc, I.usesound, 50, 1) - state = ASSEMBLY_WIRED - else - to_chat(user, "You need 2 coils of wire to wire the assembly.") - return - - else if(iswelder(I)) - if(weld(I, user)) - to_chat(user, "You unweld the assembly from it's place.") - state = ASSEMBLY_WRENCHED - anchored = TRUE - return - - - if(ASSEMBLY_WIRED) - if(isscrewdriver(I)) - playsound(loc, I.usesound, 50, 1) - - var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) - if(!input) - to_chat(usr, "No input found please hang up and try your call again.") - return - - var/list/tempnetwork = splittext(input, ",") - if(tempnetwork.len < 1) - to_chat(usr, "No network found please hang up and try your call again.") - return - - var/area/camera_area = get_area(src) - var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])" - input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag)) - - state = ASSEMBLY_BUILT - var/obj/machinery/camera/C = new(loc) - loc = C - C.assembly = src - - C.auto_turn() - - C.network = uniquelist(tempnetwork) - tempnetwork = difflist(C.network,GLOB.restricted_camera_networks) - if(!tempnetwork.len) // Camera isn't on any open network - remove its chunk from AI visibility. - cameranet.removeCamera(C) - - C.c_tag = input - - for(var/i = 5; i >= 0; i -= 1) - var/direct = input(user, "Direction?", "Assembling Camera", null) in list("LEAVE IT", "NORTH", "EAST", "SOUTH", "WEST" ) - if(direct != "LEAVE IT") - C.dir = text2dir(direct) - if(i != 0) - var/confirm = alert(user, "Is this what you want? Chances Remaining: [i]", "Confirmation", "Yes", "No") - if(confirm == "Yes") - break - return - - else if(iswirecutter(I)) - new/obj/item/stack/cable_coil(get_turf(src), 2) - playsound(loc, I.usesound, 50, 1) - to_chat(user, "You cut the wires from the circuits.") - state = ASSEMBLY_WELDED - return + if(state == ASSEMBLY_WELDED && iscoil(I)) + var/obj/item/stack/cable_coil/C = I + if(C.use(2)) + to_chat(user, "You add wires to the assembly.") + playsound(loc, I.usesound, 50, 1) + state = ASSEMBLY_WIRED + else + to_chat(user, "You need 2 coils of wire to wire the assembly.") + return // Upgrades! - if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already. + else if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already. if(!user.unEquip(I)) to_chat(user, "[I] is stuck!") return @@ -132,20 +44,117 @@ user.drop_item() I.loc = src return - - // Taking out upgrades - else if(iscrowbar(I) && upgrades.len) - var/obj/U = locate(/obj) in upgrades - if(U) - to_chat(user, "You unattach an upgrade from the assembly.") - playsound(loc, I.usesound, 50, 1) - U.loc = get_turf(src) - upgrades -= U - return - else return ..() +/obj/item/camera_assembly/crowbar_act(mob/user, obj/item/I) + if(!upgrades.len) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + var/obj/U = locate(/obj) in upgrades + if(U) + to_chat(user, "You unattach an upgrade from the assembly.") + playsound(loc, I.usesound, 50, 1) + U.loc = get_turf(src) + upgrades -= U + +/obj/item/camera_assembly/screwdriver_act(mob/user, obj/item/I) + if(state != ASSEMBLY_WIRED) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + state = HEY_IM_WORKING_HERE + var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) + if(!input) + state = ASSEMBLY_WIRED + to_chat(usr, "No input found please hang up and try your call again.") + return + + var/list/tempnetwork = splittext(input, ",") + if(tempnetwork.len < 1) + state = ASSEMBLY_WIRED + to_chat(usr, "No network found please hang up and try your call again.") + return + + var/area/camera_area = get_area(src) + var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])" + input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag)) + state = ASSEMBLY_BUILT + var/obj/machinery/camera/C = new(loc) + loc = C + C.assembly = src + + C.auto_turn() + + C.network = uniquelist(tempnetwork) + tempnetwork = difflist(C.network,GLOB.restricted_camera_networks) + if(!tempnetwork.len) // Camera isn't on any open network - remove its chunk from AI visibility. + cameranet.removeCamera(C) + + C.c_tag = input + + for(var/i = 5; i >= 0; i -= 1) + var/direct = input(user, "Direction?", "Assembling Camera", null) in list("LEAVE IT", "NORTH", "EAST", "SOUTH", "WEST" ) + if(direct != "LEAVE IT") + C.dir = text2dir(direct) + if(i != 0) + var/confirm = alert(user, "Is this what you want? Chances Remaining: [i]", "Confirmation", "Yes", "No") + if(confirm == "Yes") + break + + +/obj/item/camera_assembly/wirecutter_act(mob/user, obj/item/I) + if(state != ASSEMBLY_WIRED) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + new/obj/item/stack/cable_coil(get_turf(src), 2) + WIRECUTTER_SNIP_MESSAGE + state = ASSEMBLY_WELDED + return + +/obj/item/camera_assembly/wrench_act(mob/user, obj/item/I) + if(state != ASSEMBLY_UNBUILT && state != ASSEMBLY_WRENCHED) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(state == ASSEMBLY_UNBUILT && isturf(loc)) + WRENCH_ANCHOR_TO_WALL_MESSAGE + anchored = TRUE + state = ASSEMBLY_WRENCHED + update_icon() + auto_turn() + else if(state == ASSEMBLY_WRENCHED) + WRENCH_UNANCHOR_WALL_MESSAGE + anchored = FALSE + update_icon() + state = ASSEMBLY_UNBUILT + else + to_chat(user, "[src] can't fit here!") + +/obj/item/camera_assembly/welder_act(mob/user, obj/item/I) + if(state == ASSEMBLY_UNBUILT) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_WELD_MESSAGE + if(state == ASSEMBLY_WRENCHED) + if(!I.use_tool(src, user, 50, volume = I.tool_volume)) + return + to_chat(user, "You weld [src] into place.") + state = ASSEMBLY_WELDED + else if(state == ASSEMBLY_WELDED) + if(!I.use_tool(src, user, 50, volume = I.tool_volume)) + return + to_chat(user, "You unweld [src] from its place.") + state = ASSEMBLY_WRENCHED + /obj/item/camera_assembly/update_icon() if(anchored) icon_state = "camera1" @@ -156,23 +165,6 @@ if(!anchored) ..() -/obj/item/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user) - if(busy) - return FALSE - if(!WT.remove_fuel(0, user)) - return FALSE - - to_chat(user, "You start to weld the [src]...") - playsound(loc, WT.usesound, 50, 1) - busy = TRUE - if(do_after(user, 20 * WT.toolspeed, target = src)) - busy = FALSE - if(!WT.isOn()) - return FALSE - return TRUE - busy = FALSE - return FALSE - /obj/item/camera_assembly/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) new /obj/item/stack/sheet/metal(loc) @@ -184,3 +176,4 @@ #undef ASSEMBLY_WELDED #undef ASSEMBLY_WIRED #undef ASSEMBLY_BUILT +#undef HEY_IM_WORKING_HERE diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index e6c957c1779..fb87d91e3f0 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -68,17 +68,22 @@ user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") chargelevel = -1 updateicon() - else if(iswrench(I)) - if(charging) - to_chat(user, "Remove the cell first!") - return - - anchored = !anchored - to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground") - playsound(src.loc, I.usesound, 75, 1) else return ..() +/obj/machinery/cell_charger/wrench_act(mob/user, obj/item/I) + . = TRUE + if(charging) + to_chat(user, "Remove the cell first!") + return + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + anchored = !anchored + if(anchored) + WRENCH_ANCHOR_MESSAGE + else + WRENCH_UNANCHOR_MESSAGE + /obj/machinery/cell_charger/proc/removecell() charging.update_icon() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 83a12a6ff81..c2ec08c8115 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -363,16 +363,9 @@ //Let's unlock this early I guess. Might be too early, needs tweaking. /obj/machinery/clonepod/attackby(obj/item/I, mob/user, params) - if(!(occupant || mess)) - if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I)) - return - if(exchange_parts(user, I)) return - if(default_deconstruction_crowbar(I)) - return - if(I.GetID()) if(!check_access(I)) to_chat(user, "Access Denied.") @@ -392,29 +385,42 @@ to_chat(user, "[src] processes [I].") biomass += BIOMASS_MEAT_AMOUNT qdel(I) - else if(iswrench(I)) - if(occupant) - to_chat(user, "Can not do that while [src] is in use.") - else - if(anchored) - anchored = FALSE - connected.pods -= src - connected = null - else - anchored = TRUE - playsound(loc, I.usesound, 100, 1) - if(anchored) - user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.") - else - user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.") - else if(ismultitool(I)) - var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, "You load connection data from [src] to [M].") - return else return ..() +/obj/machinery/clonepod/crowbar_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_crowbar(user, I) + +/obj/machinery/clonepod/multitool_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(!I.multitool_check_buffer(user)) + return + var/obj/item/multitool/M = I + M.set_multitool_buffer(user, src) + +/obj/machinery/clonepod/screwdriver_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I) + +/obj/machinery/clonepod/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(occupant) + to_chat(user, "Can not do that while [src] is in use.") + return + if(anchored) + WRENCH_UNANCHOR_MESSAGE + anchored = FALSE + connected.pods -= src + connected = null + else + WRENCH_ANCHOR_MESSAGE + anchored = TRUE + /obj/machinery/clonepod/emag_act(user) if(isnull(occupant)) return diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index dfac3250d44..ddc7ef69660 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -17,197 +17,185 @@ return ..() /obj/structure/AIcore/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/wrench)) - return default_unfasten_wrench(user, P, 20) - if(!anchored) - if(iswelder(P)) - if(state != EMPTY_CORE) - to_chat(user, "The core must be empty to deconstruct it!") + switch(state) + if(EMPTY_CORE) + if(istype(P, /obj/item/circuitboard/aicore)) + if(!user.drop_item()) + return + playsound(loc, P.usesound, 50, 1) + to_chat(user, "You place the circuit board inside the frame.") + update_icon() + state = CIRCUIT_CORE + P.forceMove(src) + circuit = P return - var/obj/item/weldingtool/WT = P - if(!WT.isOn()) - to_chat(user, "The welder must be on for this task!") - return - playsound(loc, WT.usesound, 50, 1) - to_chat(user, "You start to deconstruct the frame...") - if(do_after(user, 20*P.toolspeed, target = src) && src && state == EMPTY_CORE && WT && WT.remove_fuel(0, user)) - to_chat(user, "You deconstruct the frame.") - deconstruct(TRUE) - return - else - switch(state) - if(EMPTY_CORE) - if(istype(P, /obj/item/circuitboard/aicore)) - if(!user.drop_item()) - return - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You place the circuit board inside the frame.") - update_icon() - state = CIRCUIT_CORE - P.forceMove(src) - circuit = P - return - if(CIRCUIT_CORE) - if(isscrewdriver(P)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You screw the circuit board into place.") - state = SCREWED_CORE - update_icon() - return - if(iscrowbar(P)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the circuit board.") - state = EMPTY_CORE - update_icon() - circuit.forceMove(loc) - circuit = null - return - if(SCREWED_CORE) - if(iswirecutter(P) && circuit) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You unfasten the circuit board.") - state = CIRCUIT_CORE - update_icon() - return - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = P - if(C.get_amount() >= 5) - playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start to add cables to the frame...") - if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use(5)) - to_chat(user, "You add cables to the frame.") - state = CABLED_CORE - update_icon() - else - to_chat(user, "You need five lengths of cable to wire the AI core!") - return - if(CABLED_CORE) - if(iswirecutter(P)) - if(brain) - to_chat(user, "Get that [brain.name] out of there first!") - else - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the cables.") - state = SCREWED_CORE + if(SCREWED_CORE) + if(istype(P, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = P + if(C.get_amount() >= 5) + playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) + to_chat(user, "You start to add cables to the frame...") + if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use(5)) + to_chat(user, "You add cables to the frame.") + state = CABLED_CORE update_icon() - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) - A.amount = 5 + else + to_chat(user, "You need five lengths of cable to wire the AI core!") + return + if(CABLED_CORE) + if(istype(P, /obj/item/stack/sheet/rglass)) + var/obj/item/stack/sheet/rglass/G = P + if(G.get_amount() >= 2) + playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) + to_chat(user, "You start to put in the glass panel...") + if(do_after(user, 20, target = src) && state == CABLED_CORE && G.use(2)) + to_chat(user, "You put in the glass panel.") + state = GLASS_CORE + update_icon() + else + to_chat(user, "You need two sheets of reinforced glass to insert them into the AI core!") + return + + if(istype(P, /obj/item/aiModule/purge)) + laws.clear_inherent_laws() + to_chat(usr, "Law module applied.") + return + + if(istype(P, /obj/item/aiModule/freeform)) + var/obj/item/aiModule/freeform/M = P + laws.add_inherent_law(M.newFreeFormLaw) + to_chat(usr, "Added a freeform law.") + return + + if(istype(P, /obj/item/aiModule)) + var/obj/item/aiModule/M = P + if(!M.laws) + to_chat(usr, "This AI module can not be applied directly to AI cores.") + return + laws = M.laws + + if(istype(P, /obj/item/mmi) && !brain) + var/obj/item/mmi/M = P + if(!M.brainmob) + to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.") + return + if(M.brainmob.stat == DEAD) + to_chat(user, "Sticking a dead [P] into the frame would sort of defeat the purpose.") return - if(istype(P, /obj/item/stack/sheet/rglass)) - var/obj/item/stack/sheet/rglass/G = P - if(G.get_amount() >= 2) - playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start to put in the glass panel...") - if(do_after(user, 20, target = src) && state == CABLED_CORE && G.use(2)) - to_chat(user, "You put in the glass panel.") - state = GLASS_CORE - update_icon() - else - to_chat(user, "You need two sheets of reinforced glass to insert them into the AI core!") + if(!M.brainmob.client) + to_chat(user, "Sticking an inactive [M.name] into the frame would sort of defeat the purpose.") return - if(istype(P, /obj/item/aiModule/purge)) - laws.clear_inherent_laws() - to_chat(usr, "Law module applied.") + if(jobban_isbanned(M.brainmob, "AI") || jobban_isbanned(M.brainmob, "nonhumandept")) + to_chat(user, "This [P] does not seem to fit.") return - if(istype(P, /obj/item/aiModule/freeform)) - var/obj/item/aiModule/freeform/M = P - laws.add_inherent_law(M.newFreeFormLaw) - to_chat(usr, "Added a freeform law.") + if(!M.brainmob.mind) + to_chat(user, "This [M.name] is mindless!") return - if(istype(P, /obj/item/aiModule)) - var/obj/item/aiModule/M = P - if(!M.laws) - to_chat(usr, "This AI module can not be applied directly to AI cores.") - return - laws = M.laws - - if(istype(P, /obj/item/mmi) && !brain) - var/obj/item/mmi/M = P - if(!M.brainmob) - to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.") - return - if(M.brainmob.stat == DEAD) - to_chat(user, "Sticking a dead [P] into the frame would sort of defeat the purpose.") - return - - if(!M.brainmob.client) - to_chat(user, "Sticking an inactive [M.name] into the frame would sort of defeat the purpose.") - return - - if(jobban_isbanned(M.brainmob, "AI") || jobban_isbanned(M.brainmob, "nonhumandept")) - to_chat(user, "This [P] does not seem to fit.") - return - - if(!M.brainmob.mind) - to_chat(user, "This [M.name] is mindless!") - return - - if(istype(P, /obj/item/mmi/syndie)) - to_chat(user, "This MMI does not seem to fit!") - return - - if(!user.drop_item()) - return - - M.forceMove(src) - brain = M - to_chat(user, "You add [M.name] to the frame.") - update_icon() + if(istype(P, /obj/item/mmi/syndie)) + to_chat(user, "This MMI does not seem to fit!") return - if(iscrowbar(P) && brain) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the brain.") - brain.forceMove(loc) - brain = null - update_icon() + if(!user.drop_item()) return - if(GLASS_CORE) - if(istype(P, /obj/item/crowbar)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the glass panel.") - state = CABLED_CORE - update_icon() - new /obj/item/stack/sheet/rglass(loc, 2) - return + M.forceMove(src) + brain = M + to_chat(user, "You add [M.name] to the frame.") + update_icon() + return - if(isscrewdriver(P)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You connect the monitor.") - if(!brain) - var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" - var/obj/structure/AIcore/deactivated/D = new(loc) - if(open_for_latejoin) - empty_playable_ai_cores += D - else - if(brain.brainmob.mind) - SSticker.mode.remove_cultist(brain.brainmob.mind, 1) - SSticker.mode.remove_revolutionary(brain.brainmob.mind, 1) - - var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain) - if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created - A.rename_self("AI", 1) - feedback_inc("cyborg_ais_created",1) - qdel(src) - - if(AI_READY_CORE) - if(istype(P, /obj/item/aicard)) - P.transfer_ai("INACTIVE", "AICARD", src, user) - return - - if(isscrewdriver(P)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You disconnect the monitor.") - state = GLASS_CORE - update_icon() - return + if(AI_READY_CORE) + if(istype(P, /obj/item/aicard)) + P.transfer_ai("INACTIVE", "AICARD", src, user) + return return ..() +/obj/structure/AIcore/crowbar_act(mob/living/user, obj/item/I) + if(state !=CIRCUIT_CORE || state != GLASS_CORE || !(state == CABLED_CORE && brain)) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + switch(state) + if(CIRCUIT_CORE) + to_chat(user, "You remove the circuit board.") + state = EMPTY_CORE + circuit.forceMove(loc) + circuit = null + return + if(GLASS_CORE) + to_chat(user, "You remove the glass panel.") + state = CABLED_CORE + new /obj/item/stack/sheet/rglass(loc, 2) + return + if(CABLED_CORE) + if(brain) + to_chat(user, "You remove the brain.") + brain.forceMove(loc) + brain = null + update_icon() + +/obj/structure/AIcore/screwdriver_act(mob/living/user, obj/item/I) + if(state in list(SCREWED_CORE, CIRCUIT_CORE, GLASS_CORE, AI_READY_CORE)) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + switch(state) + if(SCREWED_CORE) + to_chat(user, "You unfasten the circuit board.") + state = CIRCUIT_CORE + if(CIRCUIT_CORE) + to_chat(user, "You screw the circuit board into place.") + state = SCREWED_CORE + if(GLASS_CORE) + to_chat(user, "You connect the monitor.") + if(!brain) + var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" + var/obj/structure/AIcore/deactivated/D = new(loc) + if(open_for_latejoin) + empty_playable_ai_cores += D + else + if(brain.brainmob.mind) + SSticker.mode.remove_cultist(brain.brainmob.mind, 1) + SSticker.mode.remove_revolutionary(brain.brainmob.mind, 1) + + var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain) + if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created + A.rename_self("AI", 1) + feedback_inc("cyborg_ais_created",1) + qdel(src) + if(AI_READY_CORE) + to_chat(user, "You disconnect the monitor.") + state = GLASS_CORE + update_icon() + + +/obj/structure/AIcore/wirecutter_act(mob/living/user, obj/item/I) + if(state != CABLED_CORE) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(brain) + to_chat(user, "Get that [brain.name] out of there first!") + else + to_chat(user, "You remove the cables.") + state = SCREWED_CORE + update_icon() + var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) + A.amount = 5 + +/obj/structure/AIcore/wrench_act(mob/living/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + default_unfasten_wrench(user, I, 20) + /obj/structure/AIcore/update_icon() switch(state) if(EMPTY_CORE) @@ -237,6 +225,18 @@ new /obj/item/stack/sheet/plasteel(loc, 4) qdel(src) +/obj/structure/AIcore/welder_act(mob/user, obj/item/I) + if(!state) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_WELD_MESSAGE + if(I.use_tool(src, user, 20, volume = I.tool_volume)) + to_chat(user, "You deconstruct the frame.") + new /obj/item/stack/sheet/plasteel(drop_location(), 4) + qdel(src) + /obj/structure/AIcore/deactivated name = "inactive AI" icon_state = "ai-empty" diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 9e8bc08f9b2..6b0e167cbb6 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -454,17 +454,6 @@ anchored = 1 state = 1 return - if(istype(P, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = P - if(!WT.remove_fuel(0, user)) - to_chat(user, "The welding tool must be on to complete this task.") - return - playsound(loc, WT.usesound, 50, 1) - if(do_after(user, 20 * WT.toolspeed, target = src)) - if(!src || !WT.isOn()) return - to_chat(user, "You deconstruct the frame.") - deconstruct(TRUE) - return if(1) if(istype(P, /obj/item/wrench)) playsound(loc, P.usesound, 50, 1) @@ -573,6 +562,18 @@ return ..() +/obj/structure/computerframe/welder_act(mob/user, obj/item/I) + if(state) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_SLICING_MESSAGE + if(I.use_tool(src, user, 50, volume = I.tool_volume) && !state) + to_chat(user, "You deconstruct [src].") + deconstruct(TRUE) + + /obj/structure/computerframe/HONKputer name = "Bananium Computer-frame" @@ -588,17 +589,6 @@ to_chat(user, "You wrench the frame into place.") anchored = 1 state = 1 - if(istype(P, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = P - if(!WT.remove_fuel(0, user)) - to_chat(user, "The welding tool must be on to complete this task.") - return - playsound(loc, WT.usesound, 50, 1) - if(do_after(user, 20 * WT.toolspeed, target = src)) - if(!src || !WT.isOn()) return - to_chat(user, "You deconstruct the frame.") - deconstruct(TRUE) - return if(1) if(istype(P, /obj/item/wrench)) playsound(loc, P.usesound, 50, 1) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 45f390082a1..3462677d615 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -79,24 +79,24 @@ ui_interact(user) -/obj/machinery/computer/security/telescreen/attackby(obj/item/I, mob/user, params) - if(ismultitool(I)) - var/direction = input(user, "Which direction?", "Select direction!") as null|anything in list("North", "East", "South", "West", "Centre") - if(!direction || !Adjacent(user)) - return - pixel_x = 0 - pixel_y = 0 - switch(direction) - if("North") - pixel_y = 32 - if("East") - pixel_x = 32 - if("South") - pixel_y = -32 - if("West") - pixel_x = -32 - else - return ..() +/obj/machinery/computer/security/telescreen/multitool_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + var/direction = input(user, "Which direction?", "Select direction!") as null|anything in list("North", "East", "South", "West", "Centre") + if(!direction || !Adjacent(user)) + return + pixel_x = 0 + pixel_y = 0 + switch(direction) + if("North") + pixel_y = 32 + if("East") + pixel_x = 32 + if("South") + pixel_y = -32 + if("West") + pixel_x = -32 /obj/machinery/computer/security/emag_act(user as mob) if(!emagged) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 438c8f92246..aec41c80be3 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -133,10 +133,10 @@ if(istype(user, /mob/dead/observer)) return 0 return ..() -/obj/machinery/computer/attackby(obj/item/I, mob/user, params) - if(isscrewdriver(I) && circuit && !(flags & NODECONSTRUCT)) - playsound(loc, I.usesound, 50, TRUE) - if(do_after(user, 20 * I.toolspeed, target = src)) - deconstruct(TRUE, user) +/obj/machinery/computer/screwdriver_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_start_check(user, 0)) return - return ..() \ No newline at end of file + if(circuit && !(flags & NODECONSTRUCT)) + if(I.use_tool(src, user, 20, volume = I.tool_volume)) + deconstruct(TRUE, user) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index fef40c9f93a..55107809ce3 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -35,11 +35,8 @@ light_color = LIGHT_COLOR_DARKGREEN -/obj/machinery/computer/message_monitor/attackby(obj/item/O as obj, mob/living/user as mob, params) - if(!istype(user)) - return - if(isscrewdriver(O) && emag) - //Stops people from just unscrewing the monitor and putting it back to get the console working again. +/obj/machinery/computer/message_monitor/screwdriver_act(mob/user, obj/item/I) + if(emag) //Stops people from just unscrewing the monitor and putting it back to get the console working again. to_chat(user, "It is too hot to mess with!") return return ..() diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 36ad92714c6..b051ae34ca9 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -257,18 +257,20 @@ to destroy them and players will be able to make replacements. /obj/machinery/vending/modularpc = "Deluxe Silicate Selections", /obj/machinery/vending/crittercare = "CritterCare") -/obj/item/circuitboard/vendor/attackby(obj/item/I, mob/user, params) - if(isscrewdriver(I)) - var/static/list/display_vending_names_paths - if(!display_vending_names_paths) - display_vending_names_paths = list() - for(var/path in vending_names_paths) - display_vending_names_paths[vending_names_paths[path]] = path - var/choice = input(user, "Choose a new brand","Select an Item") as null|anything in display_vending_names_paths - set_type(display_vending_names_paths[choice]) - else - return ..() - +/obj/item/circuitboard/vendor/screwdriver_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + var/static/list/display_vending_names_paths + if(!display_vending_names_paths) + display_vending_names_paths = list() + for(var/path in vending_names_paths) + display_vending_names_paths[vending_names_paths[path]] = path + var/choice = input(user, "Choose a new brand","Select an Item") as null|anything in display_vending_names_paths + if(loc != user) + to_chat(user, "You need to keep [src] in your hands while doing that!") + return + set_type(display_vending_names_paths[choice]) /obj/item/circuitboard/vendor/proc/set_type(obj/machinery/vending/typepath) build_path = typepath @@ -583,20 +585,20 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1, /obj/item/stack/sheet/glass = 1) -/obj/item/circuitboard/chem_master/attackby(obj/item/I, mob/user, params) - if(isscrewdriver(I)) - var/new_name = "ChemMaster" - var/new_path = /obj/machinery/chem_master +/obj/item/circuitboard/chem_master/screwdriver_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + var/new_name = "ChemMaster" + var/new_path = /obj/machinery/chem_master - if(build_path == /obj/machinery/chem_master) - new_name = "CondiMaster" - new_path = /obj/machinery/chem_master/condimaster + if(build_path == /obj/machinery/chem_master) + new_name = "CondiMaster" + new_path = /obj/machinery/chem_master/condimaster - build_path = new_path - name = "circuit board ([new_name] 3000)" - to_chat(user, "You change the circuit board setting to \"[new_name]\".") - else - return ..() + build_path = new_path + name = "circuit board ([new_name] 3000)" + to_chat(user, "You change the circuit board setting to \"[new_name]\".") /obj/item/circuitboard/chem_master/condi_master name = "circuit board (CondiMaster 3000)" diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 3df7cc8c6ec..16e761d01c6 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -302,20 +302,9 @@ user.visible_message("[user] adds \a [B] to [src]!", "You add \a [B] to [src]!") return - - if(istype(G, /obj/item/screwdriver)) - if(occupant || on) - to_chat(user, "The maintenance panel is locked.") - return - default_deconstruction_screwdriver(user, "pod0-o", "pod0", G) - return - if(exchange_parts(user, G)) return - if(default_deconstruction_crowbar(G)) - return - if(istype(G, /obj/item/grab)) var/obj/item/grab/GG = G if(panel_open) @@ -332,6 +321,17 @@ return return ..() +/obj/machinery/atmospherics/unary/cryo_cell/crowbar_act(mob/user, obj/item/I) + if(default_deconstruction_crowbar(user, I)) + return + +/obj/machinery/atmospherics/unary/cryo_cell/screwdriver_act(mob/user, obj/item/I) + if(occupant || on) + to_chat(user, "The maintenance panel is locked.") + return TRUE + if(default_deconstruction_screwdriver(user, "pod0-o", "pod0", I)) + return TRUE + /obj/machinery/atmospherics/unary/cryo_cell/update_icon() handle_update_icon() diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 211f878231f..1fb2dfc422d 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -57,18 +57,19 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/machinery/disco/attackby(obj/item/O, mob/user, params) - if(!active) - if(iswrench(O)) - if(!anchored && !isinspace()) - to_chat(user,"You secure [src] to the floor.") - anchored = TRUE - else if(anchored) - to_chat(user,"You unsecure and disconnect [src].") - anchored = FALSE - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) +/obj/machinery/disco/wrench_act(mob/user, obj/item/I) + if(active) return - return ..() + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(!anchored && !isinspace()) + anchored = TRUE + WRENCH_ANCHOR_MESSAGE + else if(anchored) + anchored = FALSE + WRENCH_UNANCHOR_MESSAGE + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) /obj/machinery/disco/update_icon() if(active) diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm index 267ea5da392..ff9609a31bc 100644 --- a/code/game/machinery/defib_mount.dm +++ b/code/game/machinery/defib_mount.dm @@ -98,16 +98,6 @@ else if(defib && I == defib.paddles) user.drop_item() return - else if(iswrench(I)) - if(!defib) - user.visible_message("[user] unwrenches [src] from the wall!", \ - "You unwrench [src]!") - new /obj/item/mounted/frame/defib_mount(get_turf(user)) - playsound(get_turf(src), I.usesound, 50, 1) - qdel(src) - return - to_chat(user, "The [defib] is blocking access to the bolts!") - return var/obj/item/card/id = I.GetID() if(id) if(check_access(id) || security_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert! @@ -122,6 +112,17 @@ return return ..() +/obj/machinery/defibrillator_mount/wrench_act(mob/user, obj/item/I) + . = TRUE + if(defib) + to_chat(user, "The [defib] is blocking access to the bolts!") + return + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + WRENCH_UNANCHOR_WALL_MESSAGE + new /obj/item/mounted/frame/defib_mount(get_turf(user)) + qdel(src) + /obj/machinery/defibrillator_mount/AltClick(mob/living/carbon/user) if(!istype(user)) return diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 60d9953e980..f3f75f3c32c 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -29,17 +29,20 @@ if(stacktype) new stacktype(get_turf(src), drop_amount) -/obj/structure/barricade/attackby(obj/item/I, mob/user, params) - if(iswelder(I) && user.a_intent != INTENT_HARM && bar_material == METAL) - var/obj/item/weldingtool/WT = I - if(obj_integrity < max_integrity) - if(WT.remove_fuel(0, user)) - to_chat(user, "You begin repairing [src]...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40 * I.toolspeed, target = src)) - obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity) - else - return ..() +/obj/structure/barricade/welder_act(mob/user, obj/item/I) + if(obj_integrity >= max_integrity) + to_chat(user, "[src] does not need repairs.") + return + if(user.a_intent == INTENT_HARM) + return + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_REPAIR_MESSAGE + if(I.use_tool(src, user, 40, volume = I.tool_volume)) + WELDER_REPAIR_SUCCESS_MESSAGE + obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity) + update_icon() + return TRUE /obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff. if(locate(/obj/structure/barricade) in get_turf(mover)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 610bbb73b06..29e414ab658 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -37,6 +37,8 @@ #define AIRLOCK_INTEGRITY_MULTIPLIER 1.5 // How much reinforced doors health increases #define AIRLOCK_DAMAGE_DEFLECTION_N 21 // Normal airlock damage deflection #define AIRLOCK_DAMAGE_DEFLECTION_R 30 // Reinforced airlock damage deflection +#define AIRLOCK_WELD_ME "weld" + var/list/airlock_overlays = list() /obj/machinery/door/airlock @@ -823,14 +825,9 @@ About the new airlock wires panel: return 1 /obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) - if(shock_user(user, 75)) - return - add_fingerprint(user) - - if(headbutt_airlock(user))//See if the user headbutts the airlock + if(!headbutt_shock_check(user)) return - if(panel_open) switch(security_level) if(AIRLOCK_SECURITY_NONE) @@ -864,116 +861,7 @@ About the new airlock wires panel: damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_R update_icon() return - if(AIRLOCK_SECURITY_METAL) - if(iswelder(C)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) - return - to_chat(user, "You begin cutting the panel's shielding...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40 * WT.toolspeed, 1, target = src)) - if(!panel_open || !WT.isOn()) - return - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user] cuts through \the [src]'s shielding.", - "You cut through \the [src]'s shielding.", - "You hear welding.") - security_level = AIRLOCK_SECURITY_NONE - spawn_atom_to_turf(/obj/item/stack/sheet/metal, user.loc, 2) - update_icon() - return - if(AIRLOCK_SECURITY_PLASTEEL_I_S) - if(iscrowbar(C)) - var/obj/item/crowbar/W = C - to_chat(user, "You start removing the inner layer of shielding...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40 * W.toolspeed, 1, target = src)) - if(!panel_open) - return - if(security_level != AIRLOCK_SECURITY_PLASTEEL_I_S) - return - user.visible_message("[user] remove \the [src]'s shielding.", - "You remove \the [src]'s inner shielding.") - security_level = AIRLOCK_SECURITY_NONE - modify_max_integrity(normal_integrity) - damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N - spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1) - update_icon() - return - if(AIRLOCK_SECURITY_PLASTEEL_I) - if(iswelder(C)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) - return - to_chat(user, "You begin cutting the inner layer of shielding...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40 * WT.toolspeed, 1, target = src)) - if(!panel_open || !WT.isOn()) - return - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user] cuts through \the [src]'s shielding.", - "You cut through \the [src]'s shielding.", - "You hear welding.") - security_level = AIRLOCK_SECURITY_PLASTEEL_I_S - return - if(AIRLOCK_SECURITY_PLASTEEL_O_S) - if(iscrowbar(C)) - var/obj/item/crowbar/W = C - to_chat(user, "You start removing outer layer of shielding...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40 * W.toolspeed, 1, target = src)) - if(!panel_open) - return - if(security_level != AIRLOCK_SECURITY_PLASTEEL_O_S) - return - user.visible_message("[user] remove \the [src]'s shielding.", - "You remove \the [src]'s shielding.") - security_level = AIRLOCK_SECURITY_PLASTEEL_I - spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1) - return - if(AIRLOCK_SECURITY_PLASTEEL_O) - if(iswelder(C)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) - return - to_chat(user, "You begin cutting the outer layer of shielding...") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40 * WT.toolspeed, 1, target = src)) - if(!panel_open || !WT.isOn()) - return - playsound(loc, WT.usesound, 50, 1) - user.visible_message("[user] cuts through \the [src]'s shielding.", - "You cut through \the [src]'s shielding.", - "You hear welding.") - security_level = AIRLOCK_SECURITY_PLASTEEL_O_S - return - if(AIRLOCK_SECURITY_PLASTEEL) - if(iswirecutter(C)) - var/obj/item/wirecutters/W = C - if(arePowerSystemsOn() && shock(user, 60)) // Protective grille of wiring is electrified - return - to_chat(user, "You start cutting through the outer grille.") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 10 * W.toolspeed, 1, target = src)) - if(!panel_open) - return - user.visible_message("[user] cut through \the [src]'s outer grille.", - "You cut through \the [src]'s outer grille.") - security_level = AIRLOCK_SECURITY_PLASTEEL_O - return - if(isscrewdriver(C)) - panel_open = !panel_open - to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the airlock.") - playsound(loc, C.usesound, 50, 1) - update_icon() - else if(iswirecutter(C)) - if(note) - remove_airlock_note(user, TRUE) - else - return interact_with_panel(user) - else if(ismultitool(C)) - return interact_with_panel(user) else if(istype(C, /obj/item/assembly/signaler)) return interact_with_panel(user) else if(istype(C, /obj/item/pai_cable)) // -- TLE @@ -993,102 +881,221 @@ About the new airlock wires panel: else return ..() -/obj/machinery/door/airlock/try_to_weld(obj/item/weldingtool/W, mob/user) +/obj/machinery/door/airlock/screwdriver_act(mob/user, obj/item/I) + if(!headbutt_shock_check(user)) + return + if(user.a_intent == INTENT_HARM) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + panel_open = !panel_open + to_chat(user, "You [panel_open ? "open":"close"] [src]'s maintenance panel.") + update_icon() + +/obj/machinery/door/airlock/crowbar_act(mob/user, obj/item/I) + if(!headbutt_shock_check(user)) + return + if(user.a_intent == INTENT_HARM) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = 0)) + return + if(panel_open && security_level == AIRLOCK_SECURITY_PLASTEEL_I_S) + to_chat(user, "You start removing the inner layer of shielding...") + if(I.use_tool(src, user, 40, volume = I.tool_volume)) + if(!panel_open || security_level != AIRLOCK_SECURITY_PLASTEEL_I_S) + return + user.visible_message("[user] remove \the [src]'s shielding.", + "You remove \the [src]'s inner shielding.") + security_level = AIRLOCK_SECURITY_NONE + modify_max_integrity(normal_integrity) + damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N + spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1) + update_icon() + else if(panel_open && security_level == AIRLOCK_SECURITY_PLASTEEL_O_S) + to_chat(user, "You start removing outer layer of shielding...") + if(I.use_tool(src, user, 40, volume = I.tool_volume)) + if(!panel_open || security_level != AIRLOCK_SECURITY_PLASTEEL_O_S) + return + user.visible_message("[user] remove \the [src]'s shielding.", + "You remove \the [src]'s shielding.") + security_level = AIRLOCK_SECURITY_PLASTEEL_I + spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1) + else + try_to_crowbar(user, I) + +/obj/machinery/door/airlock/wirecutter_act(mob/user, obj/item/I) + if(!headbutt_shock_check(user)) + return + if(!panel_open || user.a_intent == INTENT_HARM) + return + . = TRUE + if(!I.tool_start_check(user, 0)) + return + if(security_level == AIRLOCK_SECURITY_PLASTEEL) + if(arePowerSystemsOn() && shock(user, 60)) // Protective grille of wiring is electrified + return + to_chat(user, "You start cutting through the outer grille.") + if(I.use_tool(src, user, 10, volume = I.tool_volume)) + if(!panel_open || security_level != AIRLOCK_SECURITY_PLASTEEL) + return + user.visible_message("[user] cut through \the [src]'s outer grille.", + "You cut through \the [src]'s outer grille.") + security_level = AIRLOCK_SECURITY_PLASTEEL_O + return + if(note) + remove_airlock_note(user, TRUE) + else + return interact_with_panel(user) + +/obj/machinery/door/airlock/multitool_act(mob/user, obj/item/I) + if(!headbutt_shock_check(user)) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + interact_with_panel(user) + +/obj/machinery/door/airlock/welder_act(mob/user, obj/item/I) //This is god awful but I don't care + if(!headbutt_shock_check(user)) + return + var/thing_to_do if(!operating && density) - if(user.a_intent != INTENT_HELP) - if(W.remove_fuel(0, user)) + thing_to_do = AIRLOCK_WELD_ME + else + thing_to_do = security_level + if(!thing_to_do) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + switch(thing_to_do) + if(AIRLOCK_WELD_ME) + if(user.a_intent != INTENT_HELP) user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \ - "You begin [welded ? "unwelding":"welding"] the airlock...", \ - "You hear welding.") - playsound(loc, W.usesound, 40, 1) - if(do_after(user, 40 * W.toolspeed, 1, target = src, extra_checks = CALLBACK(src, .proc/weld_checks, W, user))) - playsound(loc, 'sound/items/welder2.ogg', 50, 1) + "You begin [welded ? "unwelding":"welding"] the airlock...", \ + "You hear welding.") + + if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user))) + if(!density && !welded) + return welded = !welded user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \ - "You [welded ? "weld the airlock shut":"unweld the airlock"].") + "You [welded ? "weld the airlock shut":"unweld the airlock"].") update_icon() - else - if(obj_integrity < max_integrity) - if(W.remove_fuel(0, user)) - user.visible_message("[user] is welding the airlock.", \ - "You begin repairing the airlock...", \ - "You hear welding.") - playsound(loc, W.usesound, 40, 1) - if(do_after(user, 40 * W.toolspeed, 1, target = src, extra_checks = CALLBACK(src, .proc/weld_checks, W, user))) - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - obj_integrity = max_integrity - stat &= ~BROKEN - user.visible_message("[user.name] has repaired [src].", \ - "You finish repairing the airlock.") - update_icon() + else if(obj_integrity < max_integrity) + user.visible_message("[user] is welding the airlock.", \ + "You begin repairing the airlock...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user))) + obj_integrity = max_integrity + stat &= ~BROKEN + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the airlock.") + update_icon() else to_chat(user, "The airlock doesn't need repairing.") + if(AIRLOCK_SECURITY_METAL) + to_chat(user, "You begin cutting the panel's shielding...") + if(!I.use_tool(src, user, 40, volume = I.tool_volume)) + return + if(!panel_open) + return + visible_message("[user] cuts through \the [src]'s shielding.", + "You cut through \the [src]'s shielding.", + "You hear welding.") + security_level = AIRLOCK_SECURITY_NONE + spawn_atom_to_turf(/obj/item/stack/sheet/metal, user.loc, 2) + if(AIRLOCK_SECURITY_PLASTEEL_O) + to_chat(user, "You begin cutting the outer layer of shielding...") + if(!I.use_tool(src, user, 40, volume = I.tool_volume)) + return + if(!panel_open) + return + visible_message("[user] cuts through \the [src]'s shielding.", + "You cut through \the [src]'s shielding.", + "You hear welding.") + security_level = AIRLOCK_SECURITY_PLASTEEL_O_S + if(AIRLOCK_SECURITY_PLASTEEL_I) + to_chat(user, "You begin cutting the inner layer of shielding...") + if(!I.use_tool(src, user, 40, volume = I.tool_volume)) + return + if(!panel_open) + return + user.visible_message("[user] cuts through \the [src]'s shielding.", + "You cut through \the [src]'s shielding.", + "You hear welding.") + security_level = AIRLOCK_SECURITY_PLASTEEL_I_S + update_icon() -/obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user) - return !operating && density && user && W && W.isOn() && user.loc +/obj/machinery/door/airlock/proc/weld_checks(obj/item/I, mob/user) + return !operating && density && user && I && I.tool_use_check() && user.loc -/obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user) - var/beingcrowbarred = null - if(iscrowbar(I)) - beingcrowbarred = 1 - else - beingcrowbarred = 0 - if(beingcrowbarred && panel_open && ((emagged) || (density && welded && !operating && !arePowerSystemsOn() && !locked))) - playsound(loc, I.usesound, 100, 1) +/obj/machinery/door/airlock/proc/headbutt_shock_check(mob/user) + if(shock_user(user, 75)) + return + if(headbutt_airlock(user))//See if the user headbutts the airlock + return + return TRUE + +/obj/machinery/door/airlock/try_to_crowbar(mob/living/user, obj/item/I) //*scream + if(operating) + return + var/beingcrowbarred = FALSE + if(I.tool_behaviour == TOOL_CROWBAR && I.tool_use_check(user, 0)) + beingcrowbarred = TRUE + if(beingcrowbarred && panel_open && (emagged || (density && welded && !operating && !arePowerSystemsOn() && !locked))) user.visible_message("[user] removes the electronics from the airlock assembly.", \ "You start to remove electronics from the airlock assembly...") - if(do_after(user, 40 * I.toolspeed, target = src)) + if(I.use_tool(src, user, 40, volume = I.tool_volume)) deconstruct(TRUE, user) - return - else if(arePowerSystemsOn()) - to_chat(user, "The airlock's motors resist your efforts to force it!") - else if(locked) + return + if(welded) + to_chat(user, "[src] is welded shut!") + return + if(locked) to_chat(user, "The airlock's bolts prevent it from being forced!") - else if(!welded && !operating) - if(istype(I, /obj/item/twohanded/fireaxe)) //let's make this more specific - var/obj/item/twohanded/fireaxe/F = I - if(F.wielded) - spawn(0) - if(density) - open(1) - else - close(1) - else - to_chat(user, "You need to be wielding the fire axe to do that!") - else + return + if(istype(I, /obj/item/twohanded/fireaxe)) //let's make this more specific //FUCK YOU + var/obj/item/twohanded/fireaxe/F = I + if(F.wielded) spawn(0) if(density) open(1) else close(1) - - if(ispowertool(I)) //jaws of life and rescue claw - if(isElectrified()) - shock(user, 100)//it's like sticking a forck in a power socket + else + to_chat(user, "You need to be wielding the fire axe to do that!") return - - if(!density)//already open - return - - if(locked) - to_chat(user, "The bolts are down, it won't budge!") - return - - if(welded) - to_chat(user, "It's welded, it won't budge!") - return - - var/time_to_open = 5 - if(arePowerSystemsOn() && !prying_so_hard) - time_to_open = 50 - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, 1) //is it aliens or just the CE being a dick? - prying_so_hard = TRUE - var/result = do_after(user, time_to_open, target = src) - prying_so_hard = FALSE - if(result) + else if(!arePowerSystemsOn()) + spawn(0) + if(density) open(1) - if(density && !open(1)) - to_chat(user, "Despite your attempts, [src] refuses to open.") + else + close(1) + return + else if(!ispowertool(I)) + to_chat(user, "The airlock's motors resist your efforts to force it!") + return + if(isElectrified()) + shock(user, 100)//it's like sticking a forck in a power socket + return + + if(!density)//already open + return + + var/time_to_open = 5 + if(!prying_so_hard) + time_to_open = 50 + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, 1) //is it aliens or just the CE being a dick? + prying_so_hard = TRUE + var/result = do_after(user, time_to_open, target = src) + prying_so_hard = FALSE + if(result) + open(1) + if(density && !open(1)) + to_chat(user, "Despite your attempts, [src] refuses to open.") /obj/machinery/door/airlock/open(forced=0) if(operating || welded || locked || emagged) @@ -1391,3 +1398,4 @@ About the new airlock wires panel: #undef AIRLOCK_INTEGRITY_MULTIPLIER #undef AIRLOCK_DAMAGE_DEFLECTION_N #undef AIRLOCK_DAMAGE_DEFLECTION_R +#undef AIRLOCK_WELD_ME diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index b53a0139fb2..96e4ec8da1c 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -379,14 +379,20 @@ return add_fingerprint(user) - if((iswelder(C) && !operating && density)) - var/obj/item/weldingtool/W = C - if(W.remove_fuel(0,user)) - welded = !welded - update_icon() - return - else - return + +/obj/machinery/door/airlock/hatch/gamma/welder_act(mob/user, obj/item/I) + if(shock_user(user, 75)) + return + if(operating || !density) + return + . = TRUE + if(!I.use_tool(src, user, 0, amount = 0, volume = I.tool_volume)) + return + welded = !welded + visible_message("[user] [welded ? null : "un"]welds [src]!",\ + "You [welded ? null : "un"]weld [src]!",\ + "You hear welding.") + update_icon() /obj/machinery/door/airlock/maintenance_hatch name = "maintenance hatch" @@ -424,14 +430,22 @@ return add_fingerprint(user) - if((iswelder(C) && !operating && density)) - var/obj/item/weldingtool/W = C - if(W.remove_fuel(0,user)) - welded = !welded - update_icon() - return - else - return + + +/obj/machinery/door/airlock/highsecurity/red/welder_act(mob/user, obj/item/I) + if(shock_user(user, 75)) + return + if(operating || !density) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + welded = !welded + visible_message("[user] [welded ? null : "un"]welds [src]!",\ + "You [welded ? null : "un"]weld [src]!",\ + "You hear welding.") + update_icon() + ////////////////////////////////// /* diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d1144d7317d..e1a9e78f5b3 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -185,24 +185,27 @@ /obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) return get_dir(src, M) & unres_sides -/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) - return - /obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user) return /obj/machinery/door/attackby(obj/item/I, mob/user, params) - if(user.a_intent != INTENT_HARM && (iscrowbar(I) || istype(I, /obj/item/twohanded/fireaxe))) + if(user.a_intent != INTENT_HARM && istype(I, /obj/item/twohanded/fireaxe)) try_to_crowbar(I, user) return 1 - else if(iswelder(I)) - try_to_weld(I, user) - return 1 else if(!(I.flags & NOBLUDGEON) && user.a_intent != INTENT_HARM) try_to_activate_door(user) return 1 return ..() + +/obj/machinery/door/crowbar_act(mob/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + try_to_crowbar(I, user) + /obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() if(. && obj_integrity > 0) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d562c6b78ea..43dada83ca9 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -87,47 +87,60 @@ if(operating) return - - if(welded) - if(iswrench(C)) - if(boltslocked) - to_chat(user, "There are screws locking the bolts in place!") - return - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] starts undoing [src]'s bolts...", \ - "You start unfastening [src]'s floor bolts...") - if(!do_after(user, 50 * C.toolspeed, target = src)) - return - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] unfastens [src]'s bolts.", \ - "You undo [src]'s floor bolts.") - deconstruct(TRUE) - return - if(isscrewdriver(C)) - user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts.", \ - "You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.") - playsound(get_turf(src), C.usesound, 50, 1) - boltslocked = !boltslocked - return - return ..() /obj/machinery/door/firedoor/try_to_activate_door(mob/user) return -/obj/machinery/door/firedoor/try_to_weld(obj/item/weldingtool/W, mob/user) - if(W.remove_fuel(0, user)) - playsound(get_turf(src), W.usesound, 50, 1) - user.visible_message("[user] starts [welded ? "unwelding" : "welding"] [src].", "You start welding [src].") - if(do_after(user, 40 * W.toolspeed, 1, target=src)) - welded = !welded - to_chat(user, "[user] [welded ? "welds" : "unwelds"] [src].", "You [welded ? "weld" : "unweld"] [src].") - update_icon() +/obj/machinery/door/firedoor/screwdriver_act(mob/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return + if(operating || !welded) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts.", \ + "You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.") + boltslocked = !boltslocked + +/obj/machinery/door/firedoor/wrench_act(mob/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return + if(operating || !welded) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + if(boltslocked) + to_chat(user, "There are screws locking the bolts in place!") + return + user.visible_message("[user] starts undoing [src]'s bolts...", \ + "You start unfastening [src]'s floor bolts...") + if(!I.use_tool(src, user, 50, volume = I.tool_volume) || boltslocked) + return + user.visible_message("[user] unfastens [src]'s bolts.", \ + "You undo [src]'s floor bolts.") + deconstruct(TRUE) + +/obj/machinery/door/firedoor/welder_act(mob/user, obj/item/I) + if(!density) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_WELD_MESSAGE + if(!I.use_tool(src, user, 40, volume = I.tool_volume)) + return + if(!density) //In case someone opens it while it's getting welded + return + WELDER_WELD_SUCCESS_MESSAGE + welded = !welded + update_icon() /obj/machinery/door/firedoor/try_to_crowbar(obj/item/I, mob/user) if(welded || operating) return - if(density) open() else @@ -308,40 +321,6 @@ /obj/structure/firelock_frame/attackby(obj/item/C, mob/user) switch(constructionStep) if(CONSTRUCTION_PANEL_OPEN) - if(iscrowbar(C)) - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] starts prying something out from [src]...", \ - "You begin prying out the wire cover...") - if(!do_after(user, 50 * C.toolspeed, target = src)) - return - if(constructionStep != CONSTRUCTION_PANEL_OPEN) - return - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] pries out a metal plate from [src], exposing the wires.", \ - "You remove the cover plate from [src], exposing the wires.") - constructionStep = CONSTRUCTION_WIRES_EXPOSED - update_icon() - return - if(iswrench(C)) - if(locate(/obj/machinery/door/firedoor) in get_turf(src)) - to_chat(user, "There's already a firelock there.") - return - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] starts bolting down [src]...", \ - "You begin bolting [src]...") - if(!do_after(user, 30 * C.toolspeed, target = src)) - return - if(locate(/obj/machinery/door/firedoor) in get_turf(src)) - return - user.visible_message("[user] finishes the firelock.", \ - "You finish the firelock.") - playsound(get_turf(src), C.usesound, 50, 1) - if(reinforced) - new /obj/machinery/door/firedoor/heavy(get_turf(src)) - else - new /obj/machinery/door/firedoor(get_turf(src)) - qdel(src) - return if(istype(C, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/P = C if(reinforced) @@ -362,53 +341,7 @@ P.use(2) reinforced = 1 return - - if(CONSTRUCTION_WIRES_EXPOSED) - if(iswirecutter(C)) - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] starts cutting the wires from [src]...", \ - "You begin removing [src]'s wires...") - if(!do_after(user, 60 * C.toolspeed, target = src)) - return - if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) - return - user.visible_message("[user] removes the wires from [src].", \ - "You remove the wiring from [src], exposing the circuit board.") - var/obj/item/stack/cable_coil/B = new(get_turf(src)) - B.amount = 5 - constructionStep = CONSTRUCTION_GUTTED - update_icon() - return - if(iscrowbar(C)) - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] starts prying a metal plate into [src]...", \ - "You begin prying the cover plate back onto [src]...") - if(!do_after(user, 80 * C.toolspeed, target = src)) - return - if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) - return - playsound(get_turf(src), C.usesound, 50, 1) - user.visible_message("[user] pries the metal plate into [src].", \ - "You pry [src]'s cover plate into place, hiding the wires.") - constructionStep = CONSTRUCTION_PANEL_OPEN - update_icon() - return if(CONSTRUCTION_GUTTED) - if(iscrowbar(C)) - user.visible_message("[user] begins removing the circuit board from [src]...", \ - "You begin prying out the circuit board from [src]...") - playsound(get_turf(src), C.usesound, 50, 1) - if(!do_after(user, 50 * C.toolspeed, target = src)) - return - if(constructionStep != CONSTRUCTION_GUTTED) - return - user.visible_message("[user] removes [src]'s circuit board.", \ - "You remove the circuit board from [src].") - new /obj/item/firelock_electronics(get_turf(src)) - playsound(get_turf(src), C.usesound, 50, 1) - constructionStep = CONSTRUCTION_NOCIRCUIT - update_icon() - return if(iscoil(C)) var/obj/item/stack/cable_coil/B = C if(B.get_amount() < 5) @@ -427,26 +360,6 @@ constructionStep = CONSTRUCTION_WIRES_EXPOSED update_icon() return - if(CONSTRUCTION_NOCIRCUIT) - if(iswelder(C)) - var/obj/item/weldingtool/W = C - if(W.remove_fuel(1,user)) - playsound(get_turf(src), W.usesound, 50, 1) - user.visible_message("[user] begins cutting apart [src]'s frame...", \ - "You begin slicing [src] apart...") - if(!do_after(user, 40 * W.toolspeed, target = src)) - return - if(constructionStep != CONSTRUCTION_NOCIRCUIT) - return - user.visible_message("[user] cuts apart [src]!", \ - "You cut [src] into metal.") - playsound(get_turf(src), W.usesound, 50, 1) - var/turf/T = get_turf(src) - new /obj/item/stack/sheet/metal(T, 3) - if(reinforced) - new /obj/item/stack/sheet/plasteel(T, 2) - qdel(src) - return if(istype(C, /obj/item/firelock_electronics)) user.visible_message("[user] starts adding [C] to [src]...", \ "You begin adding a circuit board to [src]...") @@ -465,6 +378,109 @@ return return ..() +/obj/structure/firelock_frame/crowbar_act(mob/user, obj/item/I) + if(!(constructionStep in list(CONSTRUCTION_WIRES_EXPOSED, CONSTRUCTION_PANEL_OPEN, CONSTRUCTION_GUTTED))) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + if(constructionStep == CONSTRUCTION_WIRES_EXPOSED) + user.visible_message("[user] starts prying a metal plate into [src]...", \ + "You begin prying the cover plate back onto [src]...") + if(!I.use_tool(src, user, 50, volume = I.tool_volume)) + return + if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) + return + user.visible_message("[user] pries the metal plate into [src].", \ + "You pry [src]'s cover plate into place, hiding the wires.") + constructionStep = CONSTRUCTION_PANEL_OPEN + else if(constructionStep == CONSTRUCTION_PANEL_OPEN) + user.visible_message("[user] starts prying something out from [src]...", \ + "You begin prying out the wire cover...") + if(!I.use_tool(src, user, 50, volume = I.tool_volume)) + return + if(constructionStep != CONSTRUCTION_PANEL_OPEN) + return + user.visible_message("[user] pries out a metal plate from [src], exposing the wires.", \ + "You remove the cover plate from [src], exposing the wires.") + constructionStep = CONSTRUCTION_WIRES_EXPOSED + else if(constructionStep == CONSTRUCTION_GUTTED) + user.visible_message("[user] begins removing the circuit board from [src]...", \ + "You begin prying out the circuit board from [src]...") + if(!I.use_tool(src, user, 50, volume = I.tool_volume)) + return + if(constructionStep != CONSTRUCTION_GUTTED) + return + user.visible_message("[user] removes [src]'s circuit board.", \ + "You remove the circuit board from [src].") + new /obj/item/firelock_electronics(get_turf(src)) + constructionStep = CONSTRUCTION_NOCIRCUIT + update_icon() + +/obj/structure/firelock_frame/wirecutter_act(mob/user, obj/item/I) + if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) + return + . = TRUE + if(!I.tool_start_check(user, 0)) + return + + user.visible_message("[user] starts cutting the wires from [src]...", \ + "You begin removing [src]'s wires...") + if(!I.use_tool(src, user, 50, volume = I.tool_volume)) + return + if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) + return + user.visible_message("[user] removes the wires from [src].", \ + "You remove the wiring from [src], exposing the circuit board.") + var/obj/item/stack/cable_coil/B = new(get_turf(src)) + B.amount = 5 + constructionStep = CONSTRUCTION_GUTTED + update_icon() + +/obj/structure/firelock_frame/wrench_act(mob/user, obj/item/I) + if(constructionStep != CONSTRUCTION_PANEL_OPEN) + return + . = TRUE + if(locate(/obj/machinery/door/firedoor) in get_turf(src)) + to_chat(user, "There's already a firelock there.") + return + if(!I.tool_start_check(user, 0)) + return + user.visible_message("[user] starts bolting down [src]...", \ + "You begin bolting [src]...") + if(!I.use_tool(src, user, 50, volume = I.tool_volume)) + return + if(locate(/obj/machinery/door/firedoor) in get_turf(src)) + return + user.visible_message("[user] finishes the firelock.", \ + "You finish the firelock.") + if(reinforced) + new /obj/machinery/door/firedoor/heavy(get_turf(src)) + else + new /obj/machinery/door/firedoor(get_turf(src)) + qdel(src) + + + + + +/obj/structure/firelock_frame/welder_act(mob/user, obj/item/I) + if(constructionStep != CONSTRUCTION_NOCIRCUIT) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_SLICING_MESSAGE + if(!I.use_tool(src, user, 40, amount = 1, volume = I.tool_volume)) + return + if(constructionStep != CONSTRUCTION_NOCIRCUIT) + return + WELDER_SLICING_SUCCESS_MESSAGE + new /obj/item/stack/sheet/metal(drop_location(), 3) + if(reinforced) + new /obj/item/stack/sheet/plasteel(drop_location(), 2) + qdel(src) + /obj/structure/firelock_frame/heavy name = "heavy firelock frame" reinforced = 1 @@ -473,4 +489,4 @@ #undef CONSTRUCTION_PANEL_OPEN #undef CONSTRUCTION_WIRES_EXPOSED #undef CONSTRUCTION_GUTTED -#undef CONSTRUCTION_NOCIRCUIT \ No newline at end of file +#undef CONSTRUCTION_NOCIRCUIT diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index fe104ff794c..a69535e9fc9 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -231,69 +231,79 @@ return add_fingerprint(user) - - if(!(flags & NODECONSTRUCT)) - if(isscrewdriver(I)) - if(density || operating) - to_chat(user, "You need to open the door to access the maintenance panel!") - return - playsound(src.loc, I.usesound, 50, 1) - panel_open = !panel_open - to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the [src.name].") - return - - if(iscrowbar(I)) - if(panel_open && !density && !operating) - playsound(loc, I.usesound, 100, 1) - user.visible_message("[user] removes the electronics from the [name].", \ - "You start to remove electronics from the [name]...") - if(do_after(user, 40 * I.toolspeed, target = src)) - if(panel_open && !density && !operating && loc) - var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(loc) - switch(base_state) - if("left") - WA.facing = "l" - if("right") - WA.facing = "r" - if("leftsecure") - WA.facing = "l" - WA.secure = TRUE - if("rightsecure") - WA.facing = "r" - WA.secure = TRUE - WA.anchored = TRUE - WA.state= "02" - WA.setDir(dir) - WA.ini_dir = dir - WA.update_icon() - WA.created_name = name - - if(emagged) - to_chat(user, "You discard the damaged electronics.") - qdel(src) - return - - to_chat(user, "You remove the airlock electronics.") - - var/obj/item/airlock_electronics/ae - if(!electronics) - ae = new/obj/item/airlock_electronics(loc) - if(!req_access) - check_access() - if(req_access.len) - ae.conf_access = req_access - else if(req_one_access.len) - ae.conf_access = req_one_access - ae.one_access = 1 - else - ae = electronics - electronics = null - ae.forceMove(loc) - - qdel(src) - return return ..() +/obj/machinery/door/window/screwdriver_act(mob/user, obj/item/I) + if(flags & NODECONSTRUCT) + return + . = TRUE + if(density || operating) + to_chat(user, "You need to open the door to access the maintenance panel!") + return + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + panel_open = !panel_open + to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the [src.name].") + + +/obj/machinery/door/window/crowbar_act(mob/user, obj/item/I) + if(operating) + return + if(flags & NODECONSTRUCT) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + if(panel_open && !density && !operating) + user.visible_message("[user] removes the electronics from the [name].", \ + "You start to remove electronics from the [name]...") + if(I.use_tool(src, user, 40, volume = I.tool_volume)) + if(panel_open && !density && !operating && loc) + var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(loc) + switch(base_state) + if("left") + WA.facing = "l" + if("right") + WA.facing = "r" + if("leftsecure") + WA.facing = "l" + WA.secure = TRUE + if("rightsecure") + WA.facing = "r" + WA.secure = TRUE + WA.anchored = TRUE + WA.state= "02" + WA.setDir(dir) + WA.ini_dir = dir + WA.update_icon() + WA.created_name = name + + if(emagged) + to_chat(user, "You discard the damaged electronics.") + qdel(src) + return + + to_chat(user, "You remove the airlock electronics.") + + var/obj/item/airlock_electronics/ae + if(!electronics) + ae = new/obj/item/airlock_electronics(loc) + if(!req_access) + check_access() + if(req_access.len) + ae.conf_access = req_access + else if(req_one_access.len) + ae.conf_access = req_one_access + ae.one_access = 1 + else + ae = electronics + electronics = null + ae.forceMove(loc) + + qdel(src) + else + try_to_crowbar(I, user) + /obj/machinery/door/window/try_to_crowbar(obj/item/I, mob/user) if(!hasPower()) if(density) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index d4dc8f854ef..d0fe753a9de 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -41,17 +41,6 @@ var/list/doppler_arrays = list() return PROCESS_KILL /obj/machinery/doppler_array/attackby(obj/item/I, mob/user, params) - if(iswrench(I)) - if(!anchored && !isinspace()) - anchored = TRUE - power_change() - to_chat(user, "You fasten [src].") - else if(anchored) - anchored = FALSE - power_change() - to_chat(user, "You unfasten [src].") - playsound(loc, I.usesound, 50, 1) - return if(istype(I, /obj/item/disk/tech_disk)) var/obj/item/disk/tech_disk/disk = I disk.load_tech(toxins_tech) @@ -59,6 +48,18 @@ var/list/doppler_arrays = list() return return ..() +/obj/machinery/doppler_array/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(!anchored && !isinspace()) + anchored = TRUE + WRENCH_ANCHOR_MESSAGE + else if(anchored) + anchored = FALSE + WRENCH_UNANCHOR_MESSAGE + power_change() + /obj/machinery/doppler_array/attack_hand(mob/user) if(..()) return diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 255d8d3cce1..7ae268fca46 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -1,6 +1,11 @@ /* FIRE ALARM */ + +#define FIRE_ALARM_FRAME 0 +#define FIRE_ALARM_UNWIRED 1 +#define FIRE_ALARM_READY 2 + /obj/machinery/firealarm name = "fire alarm" desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." @@ -83,68 +88,94 @@ FIRE ALARM /obj/machinery/firealarm/attackby(obj/item/I, mob/user, params) add_fingerprint(user) - - if(isscrewdriver(I) && buildstage == 2) - wiresexposed = !wiresexposed - update_icon() - return - if(wiresexposed) - switch(buildstage) - if(2) - if(ismultitool(I)) - detecting = !detecting - if(detecting) - user.visible_message("[user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") - else - user.visible_message("[user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") - - else if(iswirecutter(I)) // cutting the wires out + if(buildstage == FIRE_ALARM_UNWIRED) + if(istype(I, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = I + if(!coil.use(5)) to_chat(user, "You cut the wires!") - playsound(loc, I.usesound, 50, 1) - var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil() - new_coil.amount = 5 - new_coil.forceMove(user.loc) - buildstage = 1 - update_icon() - if(1) - if(istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = I - if(!coil.use(5)) - to_chat(user, "You cut the wires!") - return - - buildstage = 2 - playsound(get_turf(src), I.usesound, 50, 1) - to_chat(user, "You wire [src]!") - update_icon() - - else if(iscrowbar(I)) - to_chat(user, "You pry out the circuit!") - playsound(get_turf(src), I.usesound, 50, 1) - if(do_after(user, 20 * I.toolspeed, target = src)) - if(buildstage != 1) - return - var/obj/item/firealarm_electronics/circuit = new /obj/item/firealarm_electronics() - circuit.forceMove(get_turf(src)) - buildstage = 0 - update_icon() - if(0) - if(istype(I, /obj/item/firealarm_electronics)) - to_chat(user, "You insert the circuit!") - qdel(I) - buildstage = 1 - update_icon() - - else if(iswrench(I)) - to_chat(user, "You remove the fire alarm assembly from the wall!") - new /obj/item/mounted/frame/firealarm(get_turf(user)) - playsound(get_turf(src), I.usesound, 50, 1) - qdel(src) + return + buildstage = FIRE_ALARM_READY + playsound(get_turf(src), I.usesound, 50, 1) + to_chat(user, "You wire [src]!") + update_icon() + if(buildstage == FIRE_ALARM_FRAME) + if(istype(I, /obj/item/firealarm_electronics)) + to_chat(user, "You insert the circuit!") + qdel(I) + buildstage = FIRE_ALARM_UNWIRED + update_icon() return return ..() +/obj/machinery/firealarm/crowbar_act(mob/user, obj/item/I) + if(buildstage != FIRE_ALARM_UNWIRED) + return + . = TRUE + if(!I.tool_use_check(user, 0)) + return + CROWBAR_ATTEMPT_PRY_CIRCUIT_MESSAGE + if(!I.use_tool(src, user, 20, volume = I.tool_volume) || buildstage != FIRE_ALARM_UNWIRED) + return + new /obj/item/firealarm_electronics(drop_location()) + buildstage = FIRE_ALARM_FRAME + update_icon() + CROWBAR_PRY_CIRCUIT_SUCCESS_MESSAGE + +/obj/machinery/firealarm/multitool_act(mob/user, obj/item/I) + if(buildstage != FIRE_ALARM_READY) + return + . = TRUE + if(!wiresexposed) + to_chat(user, "You need to expose the wires first!") + return + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + detecting = !detecting + if(detecting) + user.visible_message("[user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") + else + user.visible_message("[user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") + +/obj/machinery/firealarm/screwdriver_act(mob/user, obj/item/I) + if(buildstage != FIRE_ALARM_READY) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + wiresexposed = !wiresexposed + if(wiresexposed) + SCREWDRIVER_OPEN_PANEL_MESSAGE + else + SCREWDRIVER_CLOSE_PANEL_MESSAGE + update_icon() + +/obj/machinery/firealarm/wirecutter_act(mob/user, obj/item/I) + if(buildstage != FIRE_ALARM_READY) + return + . = TRUE + if(!wiresexposed) + to_chat(user, "You need to expose the wires first!") + return + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + WIRECUTTER_SNIP_MESSAGE + var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil(drop_location()) + new_coil.amount = 5 + buildstage = FIRE_ALARM_UNWIRED + + +/obj/machinery/firealarm/wrench_act(mob/user, obj/item/I) + if(buildstage != FIRE_ALARM_FRAME) + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + WRENCH_UNANCHOR_WALL_MESSAGE + new /obj/item/mounted/frame/firealarm(get_turf(user)) + qdel(src) + /obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() if(.) //damage received @@ -406,3 +437,8 @@ Just a object used in constructing fire alarms usr << browse(null, "window=partyalarm") return return + + +#undef FIRE_ALARM_FRAME +#undef FIRE_ALARM_UNWIRED +#undef FIRE_ALARM_READY diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 30069ff0310..1f42a6a78c4 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -40,18 +40,6 @@ icon_state = "[base_state]1-p" // sd_set_light(0) -//Don't want to render prison breaks impossible -/obj/machinery/flasher/attackby(obj/item/I, mob/user, params) - if(iswirecutter(I)) - add_fingerprint(user) - disable = !disable - if(disable) - user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb!") - if(!disable) - user.visible_message("[user] has connected [src]'s flashbulb!", "You connect [src]'s flashbulb!") - else - return ..() - //Let the AI trigger them directly. /obj/machinery/flasher/attack_ai(mob/user) if(anchored) @@ -100,20 +88,28 @@ if((M.m_intent != MOVE_INTENT_WALK) && (anchored)) flash() -/obj/machinery/flasher/portable/attackby(obj/item/I, mob/user, params) - if(iswrench(I)) - add_fingerprint(user) - anchored = !anchored +//Don't want to render prison breaks impossible +/obj/machinery/flasher/portable/wirecutter_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + disable = !disable + if(disable) + user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb!") + if(!disable) + user.visible_message("[user] has connected [src]'s flashbulb!", "You connect [src]'s flashbulb!") - if(!anchored) - user.show_message(text("[src] can now be moved.")) - overlays.Cut() - - else if(anchored) - user.show_message(text("[src] is now secured.")) - overlays += "[base_state]-s" - else - return ..() +/obj/machinery/flasher/portable/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + anchored = !anchored + if(anchored) + WRENCH_ANCHOR_MESSAGE + overlays.Cut() + else if(anchored) + WRENCH_UNANCHOR_MESSAGE + overlays += "[base_state]-s" // Flasher button /obj/machinery/flasher_button diff --git a/code/game/machinery/gameboard.dm b/code/game/machinery/gameboard.dm index 2df0496ae67..edc1d3499ec 100644 --- a/code/game/machinery/gameboard.dm +++ b/code/game/machinery/gameboard.dm @@ -93,10 +93,10 @@ if(href_list["close"]) close_game() -/obj/machinery/gameboard/attackby(obj/item/I, mob/user, params) - if(default_unfasten_wrench(user, I)) - return +/obj/machinery/gameboard/crowbar_act(mob/user, obj/item/I) + if(default_deconstruction_crowbar(user, I, ignore_panel = TRUE)) + return TRUE - if(default_deconstruction_crowbar(I, ignore_panel = TRUE)) - return - return ..() +/obj/machinery/gameboard/wrench_act(mob/user, obj/item/I) + if(default_unfasten_wrench(user, I)) + return TRUE diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 10708ff9c0e..a742f6b7109 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -100,19 +100,22 @@ var/list/holopads = list() holo_range = holograph_range /obj/machinery/hologram/holopad/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", I)) - return - if(exchange_parts(user, I)) return - - if(default_unfasten_wrench(user, I)) - return - - if(default_deconstruction_crowbar(I)) - return return ..() +/obj/machinery/hologram/holopad/screwdriver_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_screwdriver(user, "holopad_open", "holopad0", I) + + +/obj/machinery/hologram/holopad/wrench_act(mob/user, obj/item/I) + . = TRUE + default_unfasten_wrench(user, I) + +/obj/machinery/hologram/holopad/crowbar_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_crowbar(user, I) /obj/machinery/hologram/holopad/attack_hand(mob/living/carbon/human/user) if(..()) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 45056369662..e4bdb0d5478 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -78,21 +78,23 @@ /obj/machinery/sparker/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/detective_scanner)) return - if(isscrewdriver(I)) - add_fingerprint(user) - disable = !disable - if(disable) - user.visible_message("[user] has disabled [src]!", "You disable the connection to [src].") - icon_state = "[base_state]-d" - if(!disable) - user.visible_message("[user] has reconnected [src]!", "You fix the connection to [src].") - if(powered()) - icon_state = "[base_state]" - else - icon_state = "[base_state]-p" - return return ..() +/obj/machinery/sparker/screwdriver_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + disable = !disable + if(disable) + user.visible_message("[user] has disabled [src]!", "You disable the connection to [src].") + icon_state = "[base_state]-d" + if(!disable) + user.visible_message("[user] has reconnected [src]!", "You fix the connection to [src].") + if(powered()) + icon_state = "[base_state]" + else + icon_state = "[base_state]-p" + /obj/machinery/sparker/attack_ai() if(src.anchored) return src.spark() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 4d27ad6b5b5..13406ac4b0f 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -147,21 +147,26 @@ /obj/machinery/light_switch/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/detective_scanner)) return - - if(istype(W, /obj/item/multitool)) - update_multitool_menu(user) - return 1 - - if(istype(W, /obj/item/wrench)) - playsound(get_turf(src), W.usesound, 50, 1) - if(do_after(user, 30 * W.toolspeed, target = src)) - to_chat(user, "You detach \the [src] from the wall.") - new/obj/item/mounted/frame/light_switch(get_turf(src)) - qdel(src) - return 1 - return ..() +/obj/machinery/light_switch/multitool_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + update_multitool_menu(user) + +/obj/machinery/light_switch/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + user.visible_message("[user] starts unwrenching [src] from the wall...", "You are unwrenching [src] from the wall...", "You hear ratcheting.") + . = TRUE + if(!I.use_tool(src, user, 30, volume = I.tool_volume)) + return + WRENCH_UNANCHOR_WALL_MESSAGE + new/obj/item/mounted/frame/light_switch(get_turf(src)) + qdel(src) + /obj/machinery/light_switch/multitool_menu(var/mob/user, var/obj/item/multitool/P) return {"