diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/actions.ts b/resources/[ps]/ps-adminmenu/ui/src/store/actions.ts new file mode 100644 index 0000000..3f16c84 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/actions.ts @@ -0,0 +1,22 @@ +import { writable } from "svelte/store"; + +export const ALL_ACTIONS = writable(true); + +export const ACTION = writable(null); + +interface DROPDOWN_DATA { + label: string; + type: string; + option?: string; + data?: any[]; + event?: string; +} + +interface ACITONS_DATA { + id: string; + label: string; + type?: string; + event?: string; + perms: string[]; + dropdown?: DROPDOWN_DATA[]; +} \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/data.ts b/resources/[ps]/ps-adminmenu/ui/src/store/data.ts new file mode 100644 index 0000000..a4d8626 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/data.ts @@ -0,0 +1,8 @@ +import { writable } from "svelte/store"; + +export const VEHICLE_DATA = writable(null); +export const ITEM_DATA = writable(null); +export const JOB_DATA = writable(null); +export const GANG_DATA = writable(null); +export const LOCATION_DATA = writable(null); +export const PED_LIST = writable(null); \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/entityInfo.ts b/resources/[ps]/ps-adminmenu/ui/src/store/entityInfo.ts new file mode 100644 index 0000000..fb178af --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/entityInfo.ts @@ -0,0 +1,9 @@ +import { writable } from "svelte/store"; + +export const ENTITY_INFO = writable(null); + +interface ENTITY_INFO { + show: boolean; + name: string; + hash: string; +} \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/players.ts b/resources/[ps]/ps-adminmenu/ui/src/store/players.ts new file mode 100644 index 0000000..6b4696d --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/players.ts @@ -0,0 +1,32 @@ +import { writable } from "svelte/store"; + +export const PLAYER_DATA = writable(null); + +export const SELECTED_PLAYER = writable(null); + +export const PLAYER = writable(null); + +export const PLAYER_VEHICLES = writable(null); + +interface PLAYER_DATA { + id?: string; + name?: string; + cid?: string; + license?: string; + discord?: string; + steam?: string; + fivem?: string; + vehicles?: PLAYER_VEHICLES[]; +} + +interface PLAYER_VEHICLES { + id?: string; + cid?: string; + label?: string; + brand?: string; + model?: string; + plate?: string; + fuel?: string; + engine?: string; + body?: string; +} diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/reports.ts b/resources/[ps]/ps-adminmenu/ui/src/store/reports.ts new file mode 100644 index 0000000..74d31bf --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/reports.ts @@ -0,0 +1,11 @@ +import { writable } from "svelte/store"; + +export const REPORT = writable(null); +export const REPORTS = writable(null); + +interface REPORT_DATA { + message: string, + citizenid: string, + fullname: string, + time: number, +} \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/server.ts b/resources/[ps]/ps-adminmenu/ui/src/store/server.ts new file mode 100644 index 0000000..ee4d0a8 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/server.ts @@ -0,0 +1,29 @@ +import { writable } from "svelte/store"; + +export const RESOURCE = writable(null); +export const RESOURCES = writable(null); +export const COMMANDS = writable(null); + +export const SERVER = writable(null); + +interface RESOURCE_DATA { + name?: string; + author?: string; + version?: string; + description?: string; + resourceState?: string; +} + +interface SERVER_DATA { + TotalCash?: string; + TotalBank?: string; + TotalItems?: string; + CharacterCount?: string; + VehicleCount?: string; + BansCount?: string; + UniquePlayers?: string; +} + +interface COMMANDS_DATA { + name?: string; +} diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/staffchat.ts b/resources/[ps]/ps-adminmenu/ui/src/store/staffchat.ts new file mode 100644 index 0000000..a006fcd --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/staffchat.ts @@ -0,0 +1,11 @@ +import { writable } from 'svelte/store' + +interface ChatData { + message: string + citizenid: string + fullname: string + time: number +} + +export const Message = writable(null) +export const Messages = writable(null) diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/stores.ts b/resources/[ps]/ps-adminmenu/ui/src/store/stores.ts new file mode 100644 index 0000000..5061be7 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/stores.ts @@ -0,0 +1,12 @@ +import { writable } from "svelte/store"; + +export const VISIBILITY = writable(false); +export const BROWSER_MODE = writable(false); +export const RESOURCE_NAME = writable(""); + +export const DEV_MODE = writable(false); + +export const MENU_WIDE = writable(false); +export const ACTIVE_PAGE = writable("Actions"); + +export const searchActions = writable(''); \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/togglecoords.ts b/resources/[ps]/ps-adminmenu/ui/src/store/togglecoords.ts new file mode 100644 index 0000000..1374ef1 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/togglecoords.ts @@ -0,0 +1,11 @@ +import { writable } from "svelte/store"; + +export const TOGGLE_COORDS = writable(null); + +interface COORDS_DATA { + show: boolean; + x: string; + y: string; + z: string; + heading?: string; +} \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/store/vehicle_dev.ts b/resources/[ps]/ps-adminmenu/ui/src/store/vehicle_dev.ts new file mode 100644 index 0000000..67ebcf3 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/store/vehicle_dev.ts @@ -0,0 +1,15 @@ +import { writable } from "svelte/store"; + +export const VEHICLE_DEV = writable(null); + +interface VEHICLE_DATA { + show: boolean; + name: string; + model: string; + netID: string; + engine_health?: string; + body_health?: string; + plate?: string; + fuel?: string; + speed?: string; +} \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/typings/type.ts b/resources/[ps]/ps-adminmenu/ui/src/typings/type.ts new file mode 100644 index 0000000..e69de29 diff --git a/resources/[ps]/ps-adminmenu/ui/src/utils/ReceiveNUI.ts b/resources/[ps]/ps-adminmenu/ui/src/utils/ReceiveNUI.ts new file mode 100644 index 0000000..c9e1eda --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/utils/ReceiveNUI.ts @@ -0,0 +1,32 @@ +import { onMount, onDestroy } from "svelte"; + +interface NuiMessage { + action: string; + data: T; +} + +/** + * A function that manage events listeners for receiving data from the client scripts + * @param action The specific `action` that should be listened for. + * @param handler The callback function that will handle data relayed by this function + * + * @example + * useNuiEvent<{VISIBILITY: true, wasVisible: 'something'}>('setVisible', (data) => { + * // whatever logic you want + * }) + * + **/ + +export function ReceiveNUI( + action: string, + handler: (data: T) => void +) { + const eventListener = (event: MessageEvent>) => { + const { action: eventAction, data } = event.data; + + eventAction === action && handler(data); + }; + onMount(() => window.addEventListener("message", eventListener)); + onDestroy(() => window.removeEventListener("message", eventListener)); +} + diff --git a/resources/[ps]/ps-adminmenu/ui/src/utils/SendNUI.ts b/resources/[ps]/ps-adminmenu/ui/src/utils/SendNUI.ts new file mode 100644 index 0000000..35141eb --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/utils/SendNUI.ts @@ -0,0 +1,43 @@ +import { BROWSER_MODE, RESOURCE_NAME } from '@store/stores' + +let isBrowserMode: boolean = false; +BROWSER_MODE.subscribe((value: boolean) => { + isBrowserMode = value; +}); + +let debugResName: string = ""; +RESOURCE_NAME.subscribe((value: string) => { + debugResName = value; +}); + +/** +* @param eventName - The endpoint eventname to target +* @param data - Data you wish to send in the NUI Callback +* +* @return returnData - A promise for the data sent back by the NuiCallbacks CB argument +*/ + +export async function SendNUI( + eventName: string, + data: unknown = {}, + debugReturn?: T +): Promise { + if ((isBrowserMode == true && debugReturn) || (isBrowserMode == true)) { + return Promise.resolve(debugReturn || {} as T) + } + const options = { + method: "post", + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + body: JSON.stringify(data), + }; + + const resourceName = (window as any).GetParentResourceName + ? (window as any).GetParentResourceName() + : debugResName; + + + const resp: Response = await fetch(`https://${resourceName}/${eventName}`, options); + return await resp.json() +} diff --git a/resources/[ps]/ps-adminmenu/ui/src/utils/debugData.ts b/resources/[ps]/ps-adminmenu/ui/src/utils/debugData.ts new file mode 100644 index 0000000..01ee7e3 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/utils/debugData.ts @@ -0,0 +1,30 @@ +import {isEnvBrowser} from "./misc"; + +interface DebugEvent { + action: string; + data: T; +} + +/* + * Emulates dispatching an event using SendNuiMessage in the lua scripts. + * This is used when developing in browser + * + * @param events - The event you want to cover + * @param timer - How long until it should trigger (ms) +*/ +export const debugData =

(events: DebugEvent

[], timer = 0): void => { + if (isEnvBrowser()) { + for (const event of events) { + setTimeout(() => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + action: event.action, + data: event.data, + }, + }) + ); + }, timer); + } + } +}; \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/utils/misc.ts b/resources/[ps]/ps-adminmenu/ui/src/utils/misc.ts new file mode 100644 index 0000000..9b10ce4 --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/utils/misc.ts @@ -0,0 +1 @@ +export const isEnvBrowser = (): boolean => !(window as any).invokeNative; \ No newline at end of file diff --git a/resources/[ps]/ps-adminmenu/ui/src/utils/timeAgo.ts b/resources/[ps]/ps-adminmenu/ui/src/utils/timeAgo.ts new file mode 100644 index 0000000..1f10c1a --- /dev/null +++ b/resources/[ps]/ps-adminmenu/ui/src/utils/timeAgo.ts @@ -0,0 +1,79 @@ +const MONTH_NAMES = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', +] + +function getFormattedDate(date, prefomattedDate = false, hideYear = false) { + const day = date.getDate() + const month = MONTH_NAMES[date.getMonth()] + const year = date.getFullYear() + const hours = date.getHours() + let minutes = date.getMinutes() + + if (minutes < 10) { + minutes = `0${minutes}` + } + + if (prefomattedDate) { + return `${prefomattedDate} at ${hours}:${minutes}` + } + + if (hideYear) { + return `${day}. ${month} at ${hours}:${minutes}` + } + + return `${day}. ${month} ${year}. at ${hours}:${minutes}` +} + +export function timeAgo(dateParam) { + if (!dateParam) { + return 'Unknown' + } + + let date + try { + date = typeof dateParam === 'object' ? dateParam : new Date(dateParam) + } catch (e) { + return 'Invalid date' + } + + if (isNaN(date)) { + return 'Invalid date' + } + const DAY_IN_MS = 86400000 + const today = new Date() + const yesterday = new Date(today - DAY_IN_MS) + const seconds = Math.round((today - date) / 1000) + const minutes = Math.round(seconds / 60) + const isToday = today.toDateString() === date.toDateString() + const isYesterday = yesterday.toDateString() === date.toDateString() + const isThisYear = today.getFullYear() === date.getFullYear() + + if (seconds < 5) { + return 'Just Now' + } else if (seconds < 60) { + return `${seconds} Seconds ago` + } else if (seconds < 90) { + return 'A minute ago' + } else if (minutes < 60) { + return `${minutes} Minutes ago` + } else if (isToday) { + return getFormattedDate(date, 'Today') + } else if (isYesterday) { + return getFormattedDate(date, 'Yesterday') + } else if (isThisYear) { + return getFormattedDate(date, false, true) + } + + return getFormattedDate(date) +} \ No newline at end of file diff --git a/resources/[ps]/ps-buffs/README.md b/resources/[ps]/ps-buffs/README.md new file mode 100644 index 0000000..d04dd76 --- /dev/null +++ b/resources/[ps]/ps-buffs/README.md @@ -0,0 +1,86 @@ +# ps-buffs + +### Dependencies +*** +- PS-Hud: https://github.com/Project-Sloth/ps-hud +### General Information +*** +- Buffs are new effects that a player can get. Example: Stamina Buff makes a player run faster. + - They show up as a new icon + +- Enhancements are making statuses you already have better. Example: Health Buff heals a player periodically + - They show up as yellow on the status they are affecting. Example: Armor buffs makes the armor icon yellow + +- By default adding buffs to a player will just have the buff icon show + - You need to add logic to give the player buff effects (below you can see examples) + +- Avaliable buffs you can pick from are in the config file (shared/config.lua) + +### Add a buff to a player +```lua +-- Function signature - buffName: string, time: int (1 second = 1000) +exports['ps-buffs']:AddBuff(buffName, time) + +-- Example -- Adds a hacking buff for 15 seconds, which the player would see a hacking buff icon on their screen +exports['ps-buffs']:AddBuff("hacking", 15000) +``` + +### Check if player has a buff +```lua +-- Function signature - buffName: string +exports['ps-buffs']:HasBuff(buffName) + +-- Example -- Check if a player has the hacking buff and make it easier to hack something +if exports['ps-buffs']:HasBuff("hacking") then + -- give player more time or less complicated puzzle +end +``` + +### Buff Effects +*** + +- We currently have the following buff effects implemented that you can call: + - Stamina Buff - Makes a player run faster and generate a random partial amount of stamina + ```lua + -- Function signature - time: int (1 second = 1000), value: double (float) + exports['ps-buffs']:StaminaBuffEffect(time, value) + + -- Example -- Adds a stamina buff for 15 seconds and a player runs 1.4 faster. + exports['ps-buffs']:StaminaBuffEffect(15000, 1.4) + ``` + - Swimming Buff - Makes a player swim faster and generate a random partial amount of stamina + ```lua + -- Function signature - time: int (1 second = 1000), value: double (float) + exports['ps-buffs']:SwimmingBuffEffect(time, value) + + -- Example -- Adds a swimming buff for 20 seconds and a player swims 1.4 faster. + exports['ps-buffs']:SwimmingBuffEffect(20000, 1.4) + ``` + - Health Buff - Makes a player's health partially regenerate periodically + ```lua + -- Function signature - time: int (1 second = 1000), value: int + exports['ps-buffs']:AddHealthBuff(time, value) + + -- Example -- Adds a health buff for 10 seconds and a player periodically gains 10 health. + exports['ps-buffs']:AddHealthBuff(10000, 10) + ``` + - Armor Buff - Makes a player's armor partially regenerate periodically + ```lua + -- Function signature - time: int (1 second = 1000), value: int + exports['ps-buffs']:AddArmorBuff(time, value) + + -- Example -- Adds a armor buff for 30 seconds and a player periodically gains 10 armor. + exports['ps-buffs']:AddArmorBuff(30000, 10) + ``` + - Stress Buff - Makes a player's stress partially decrease periodically + ```lua + -- Function signature - time: int (1 second = 1000), value: int + exports['ps-buffs']:AddStressBuff(time, value) + + -- Example -- Removes stress for 30 seconds and removes 10 units every 5 seconds + exports['ps-buffs']:AddStressBuff(30000, 10) + ``` + +## Credits +- The majority of the lua code comes from [qb-enhancements](https://github.com/IdrisDose/qb-enhancements) by [IdrisDose](https://github.com/IdrisDose) +- Credits to my boys Silent, Snipe and fjamzoo for help with getting things in place for this to all be possible diff --git a/resources/[ps]/ps-buffs/client/main.lua b/resources/[ps]/ps-buffs/client/main.lua new file mode 100644 index 0000000..b0c572e --- /dev/null +++ b/resources/[ps]/ps-buffs/client/main.lua @@ -0,0 +1,217 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +local function GetBuffs() + -- If making multiple calls to GetBuffs we dont get a result of the 2nd call + -- The wait seems to fix the issue + Wait(500) + local p = promise.new() + QBCore.Functions.TriggerCallback('buffs:server:fetchBuffs', function(result) + p:resolve(result) + end) + return Citizen.Await(p) +end + +--- Method to fetch if player has buff with name and is not nil +--- @param buffName string - Name of the buff +--- @return bool +local function HasBuff(buffName) + local buffs = GetBuffs() + if buffs then + return buffs[buffName] ~= nil + end + return false +end exports('HasBuff', HasBuff) + +--- Method to fetch buff details if player has buff active +--- @param buffName string - Name of the buff +--- @return table +local function GetBuff(buffName) + local buffData = Config.Buffs[buffName] + -- Check if we were given a correct buff name + if buffData == nil then + return nil + end + + local buffs = GetBuffs() + local time = nil + + if buffs then + time = buffs[buffName] + end + + if time == nil then + time = 0 + end + + if buffData.type == 'buff' then + return { + time = time, + buffName = buffName, + iconName = buffData.iconName, + iconColor = buffData.iconColor, + progressColor = buffData.progressColor, + progressValue = (time * 100) / buffData.maxTime, + type = buffData.type, + } + else + return { + time = time, + iconColor = buffData.iconColor, + maxTime = buffData.maxTime, + type = buffData.type, + } + end +end exports('GetBuff', GetBuff) + +--- Method to fetch nui details of all buffs, used when a player that had buffs +--- logged out and back in to the server +--- @return table | nil +local function GetBuffNUIData() + local buffs = GetBuffs() + + if buffs == nil then + return nil + end + + local nuiData = {} + + for buffName, buffTime in pairs(buffs) do + local buffData = Config.Buffs[buffName] + + if buffData.type == 'buff' then + nuiData[buffName] = { + buffName = buffName, + display = true, + iconName = buffData.iconName, + iconColor = buffData.iconColor, + progressColor = buffData.progressColor, + progressValue = (buffTime * 100) / buffData.maxTime, + } + else + nuiData[buffName] = { + display = true, + enhancementName = buffName, + iconColor = buffData.iconColor + } + end + end + + return nuiData +end exports('GetBuffNUIData', GetBuffNUIData) + +--- Method to add buff to player +--- @param playerID string - Player identifier +--- @param buffName string - Name of the buff +--- @return bool - Success of removing the player buff +local function AddBuff(buffName, time) + local p = promise.new() + QBCore.Functions.TriggerCallback('buffs:server:addBuff', function(result) + p:resolve(result) + end, buffName, time) + return Citizen.Await(p) +end exports('AddBuff', AddBuff) + + + + +--- Custom Buffs, edit to your liking --- + +--- Method to add stamina buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of speed boost the player will recieve +local hasStaminaBuffActive = false +local function StaminaBuffEffect(time, value) + AddBuff("stamina", time) + if not hasStaminaBuffActive then + hasStaminaBuffActive = true + CreateThread(function() + SetRunSprintMultiplierForPlayer(PlayerId(), value) + while exports['ps-buffs']:HasBuff("stamina") do + Wait(500) + SetPlayerStamina(PlayerId(), GetPlayerStamina(PlayerId()) + math.random(1,10)) + end + SetRunSprintMultiplierForPlayer(PlayerId(), 1.0) + hasStaminaBuffActive = false + end) + end +end exports('StaminaBuffEffect', StaminaBuffEffect) + +--- Method to add swimming buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of swimming speed boost the player will recieve +local hasSwimmingBuffActive = false +local function SwimmingBuffEffect(time, value) + AddBuff("swimming", time) + if not hasSwimmingBuffActive then + hasSwimmingBuffActive = true + CreateThread(function() + SetSwimMultiplierForPlayer(PlayerId(), value) + while exports['ps-buffs']:HasBuff("swimming") do + Wait(500) + SetPlayerStamina(PlayerId(), GetPlayerStamina(PlayerId()) + math.random(1,10)) + end + SetSwimMultiplierForPlayer(PlayerId(), 1.0) + hasSwimmingBuffActive = false + end) + end +end exports('SwimmingBuffEffect', SwimmingBuffEffect) + +--- Method to add health buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of HP the player will gain over time + +local hasHealthBuffActive = false +local function AddHealthBuff(time, value) + AddBuff("super-health", time) + if not hasHealthBuffActive then + hasHealthBuffActive = true + CreateThread(function() + while HasBuff("super-health") do + Wait(5000) + if GetEntityHealth(PlayerPedId()) < 200 then + SetEntityHealth(PlayerPedId(), GetEntityHealth(PlayerPedId()) + value) + end + end + hasHealthBuffActive = false + end) + end +end exports('AddHealthBuff', AddHealthBuff) + +--- Method to add armor buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of Armor the player will gain over time + +local hasArmorBuffActive = false +local function AddArmorBuff(time, value) + AddBuff("super-armor", time) + if not hasArmorBuffActive then + hasArmorBuffActive = true + CreateThread(function() + while HasBuff("super-armor") do + Wait(5000) + if GetPedArmour(PlayerPedId()) < 100 then + SetPedArmour(PlayerPedId(), GetPedArmour(PlayerPedId()) + value) + end + end + hasArmorBuffActive = false + end) + end +end exports('AddArmorBuff', AddArmorBuff) + +--- Method to add stress buff to player +--- @param time - Time in ms the stress buff will be active +--- @param value - The amount of stress the player will lose every 5 seconds +local hasStressBuffActive = false +local function AddStressBuff(time, value) + AddBuff("super-stress", time) + if not hasStressBuffActive then + hasStressBuffActive = true + CreateThread(function() + while HasBuff("super-stress") do + Wait(5000) + TriggerServerEvent("hud:server:RelieveStress", value) + end + hasStressBuffActive = false + end) + end +end exports('AddStressBuff', AddStressBuff) diff --git a/resources/[ps]/ps-buffs/fxmanifest.lua b/resources/[ps]/ps-buffs/fxmanifest.lua new file mode 100644 index 0000000..941885e --- /dev/null +++ b/resources/[ps]/ps-buffs/fxmanifest.lua @@ -0,0 +1,26 @@ +fx_version 'cerulean' +game 'gta5' + +name "ps-buffs" +description "Buff tracker for qbcore" +author "Idris" +version "0.0.1" + +lua54 'yes' +use_fxv2_oal 'yes' + +shared_scripts { + 'shared/config.lua', +} + +client_scripts { + 'client/*.lua' +} + +server_scripts { + 'server/*.lua' +} + +dependencies { + 'qb-core' +} diff --git a/resources/[ps]/ps-buffs/server/main.lua b/resources/[ps]/ps-buffs/server/main.lua new file mode 100644 index 0000000..4f43783 --- /dev/null +++ b/resources/[ps]/ps-buffs/server/main.lua @@ -0,0 +1,194 @@ +local QBCore = exports['qb-core']:GetCoreObject() +local playerBuffs = {} +local next = next + +--- Adds a buff to player +--- @param citizenID string - Player identifier +--- @param buffName string - Name of the buff +--- @param time number | nil - Optional time to add or how long you want buff to be +--- @return bool +local function AddBuff(sourceID, citizenID, buffName, time) + local buffData = Config.Buffs[buffName] + -- Check if we were given a correct buff name + if buffData == nil then + return false + end + + -- If the player had no buffs at all then add them to the table + if not playerBuffs[citizenID] then + playerBuffs[citizenID] = {} + end + + local maxTime = buffData.maxTime + + -- If the player didnt already have the buff requested set it to time or maxTime + if not playerBuffs[citizenID][buffName] then + local buffTime = maxTime + if time then + buffTime = time + end + + playerBuffs[citizenID][buffName] = buffTime + + -- Since the player didnt already have this buff tell the front end to show it + if buffData.type == 'buff' then + -- Call client event to send nui to front end to start showing buff + TriggerClientEvent('hud:client:BuffEffect', sourceID, { + buffName = buffName, + display = true, + iconName = buffData.iconName, + iconColor = buffData.iconColor, + progressColor = buffData.progressColor, + progressValue = (buffTime * 100) / buffData.maxTime, + }) + else + -- Call client event to send nui to front end to start showing enhancement + TriggerClientEvent('hud:client:EnhancementEffect', sourceID, { + display = true, + enhancementName = buffName, + iconColor = buffData.iconColor + }) + end + + else + -- Since the player already had a buff increase the buff time, but not higher than max buff time + local newTime = playerBuffs[citizenID][buffName] + time + + if newTime > maxTime then + newTime = maxTime + end + + playerBuffs[citizenID][buffName] = newTime + end + + return true +end exports('AddBuff', AddBuff) + +--- Removes a buff from provided player +--- @param citizenID string - Player identifier +--- @param buffName string - Name of the buff +--- @return bool - Success of removing the player buff +local function Removebuff(citizenID, buffName) + local buffData = Config.Buffs[buffName] + if playerBuffs[citizenID] and playerBuffs[citizenID][buffName] then + + playerBuffs[citizenID][buffName] = nil + + local player = QBCore.Functions.GetPlayerByCitizenId(citizenID) + local sourceID = nil + + if player then + sourceID = player.PlayerData.source + end + + -- Check if player is online + if sourceID then + -- Send a nui call to front end to stop showing icon + if buffData.type == 'buff' then + -- Call client event to send nui to front end to stop showing buff + TriggerClientEvent('hud:client:BuffEffect', sourceID, { + display = false, + buffName = buffName, + }) + else + -- Call client event to send nui to front end to stop showing enhancement + TriggerClientEvent('hud:client:EnhancementEffect', sourceID, { + display = false, + enhancementName = buffName, + }) + end + end + + -- Check to see if that was the player's last buff + -- If so, then remove the player from the table to ensure we dont loop them + if next(playerBuffs[citizenID]) == nil then + playerBuffs[citizenID] = nil + end + + return true + end + + return false +end exports('RemoveBuff', RemoveBuff) + +--- Method to fetch if player has buff with name and is not nil +--- @param citizenID string - Player identifier +--- @param buffName string - Name of the buff +--- @return bool +local function HasBuff(citizenID, buffName) + if playerBuffs[citizenID] then + return playerBuffs[citizenID][buffName] ~= nil + end + + return false +end exports('HasBuff', HasBuff) + +QBCore.Functions.CreateCallback('buffs:server:fetchBuffs', function(source, cb) + local player = QBCore.Functions.GetPlayer(source) + local citizenID = player.PlayerData.citizenid + cb(playerBuffs[citizenID]) +end) + +QBCore.Functions.CreateCallback('buffs:server:addBuff', function(source, cb, buffName, time) + local player = QBCore.Functions.GetPlayer(source) + local citizenID = player.PlayerData.citizenid + cb(AddBuff(source, citizenID, buffName, time)) +end) + +CreateThread(function() + local function DecrementBuff(sourceID, citizenID, buffName, currentTime) + local buffData = Config.Buffs[buffName] + local updatedTime = currentTime - Config.TickTime + + -- Buff ran out of time we need to remove it from the player + if updatedTime <= 0 then + -- Only need to update buffs since they show progress on client + if buffData.type == 'buff' then + -- Check if player is online + if sourceID then + -- Call client event to send nui to front end, progress at 0 + TriggerClientEvent('hud:client:BuffEffect', sourceID, { + buffName = buffName, + progressValue = 0, + }) + end + end + Removebuff(citizenID, buffName) + else + playerBuffs[citizenID][buffName] = updatedTime + -- Only need to update buffs since they show progress on client + if buffData.type == 'buff' then + -- Check if player is online + if sourceID then + -- Call client event to send nui to front end + TriggerClientEvent('hud:client:BuffEffect', sourceID, { + buffName = buffName, + -- Progress value needs to be from 0 - 100 + progressValue = (updatedTime * 100) / buffData.maxTime, + }) + end + end + end + end + + -- Not proud but need to loop through all timers but decrement it + -- Loop is good as long as we only loop players that have buffs + -- We ensure that when removing any buff, we check to see if it was the player's last buff + -- Then we remove that player from our table to ensure we dont loop them + while true do + for citizenID, buffTable in pairs(playerBuffs) do + local player = QBCore.Functions.GetPlayerByCitizenId(citizenID) + local sourceID = nil + + if player then + sourceID = player.PlayerData.source + end + + for buffName, currentTime in pairs(buffTable) do + DecrementBuff(sourceID, citizenID, buffName, currentTime) + end + end + + Wait(Config.TickTime) + end +end) \ No newline at end of file diff --git a/resources/[ps]/ps-buffs/shared/config.lua b/resources/[ps]/ps-buffs/shared/config.lua new file mode 100644 index 0000000..81ab08f --- /dev/null +++ b/resources/[ps]/ps-buffs/shared/config.lua @@ -0,0 +1,86 @@ +Config = Config or {} + +-- How fast should the main loop over player buffs run and also how fast to send nui messages to the client +Config.TickTime = 6000 + +-- "biohazard" +-- "exclamation" +-- "locationarrow" + +-- "#FFD700" is gold +-- '#FDE829' is yellow + +Config.Buffs = { + -- Buff Section -- Do not change type, even if you know what you are doing + -- You are free to change the index names, but other scripts that relie on this config might need it + ['hacking'] = { + iconColor = "#ffffff", + iconName = 'database', + maxTime = 3600000, + progressColor = "#FFD700", + type = 'buff' + }, + ['intelligence'] = { + iconColor = "#ffffff", + iconName = 'lightbulb', + maxTime = 3600000, + progressColor = "#FFD700", + type = 'buff' + }, + ['luck'] = { + iconColor = "#ffffff", + iconName = 'dollarsign', + maxTime = 3600000, + progressColor = "#FFD700", + type = 'buff' + }, + ['stamina'] = { + iconColor = "#ffffff", + iconName = 'wind', + maxTime = 3600000, + progressColor = "#FFD700", + type = 'buff' + }, + ['strength'] = { + iconColor = "#ffffff", + iconName = 'dumbbell', + maxTime = 3600000, + progressColor = "#FFD700", + type = 'buff' + }, + ['swimming'] = { + iconColor = "#ffffff", + iconName = 'swimmer', + maxTime = 3600000, + progressColor = "#FFD700", + type = 'buff' + }, + + -- Enhancement Section -- Do not change type, even if you know what you are doing + -- Do not change the index names (super names) as they are used in the front end to determine which icon to change color + ['super-hunger'] = { + maxTime = 3600000, + iconColor = '#FDE829', + type = 'enhancement', + }, + ['super-thirst'] = { + maxTime = 3600000, + iconColor = '#FDE829', + type = 'enhancement', + }, + ['super-health'] = { + maxTime = 3600000, + iconColor = '#FDE829', + type = 'enhancement', + }, + ['super-armor'] = { + maxTime = 3600000, + iconColor = '#FDE829', + type = 'enhancement', + }, + ['super-stress'] = { + maxTime = 3600000, + iconColor = '#FDE829', + type = 'enhancement', + } +} diff --git a/resources/[ps]/ps-buffs/snippets b/resources/[ps]/ps-buffs/snippets new file mode 100644 index 0000000..55e70ea --- /dev/null +++ b/resources/[ps]/ps-buffs/snippets @@ -0,0 +1,202 @@ +CREDITS: SNIPE OP GAMING AND FJAMZOO + +--SOME SNIPPETS TO GO INTO PS-BUFFS/CLIENT LUA------------------------------------------------------------------------------------------------------------------------------------------------------------------ + + + + + +HEALTH AND ARMOR---- +--- Method to add health buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of HP the player will gain over time + +local hasHealthBuffActive = false +local function AddHealthBuff(time, value) + AddBuff("super-health", time) + if not hasHealthBuffActive then + hasHealthBuffActive = true + CreateThread(function() + while HasBuff("super-health") do + Wait(5000) + if GetEntityHealth(PlayerPedId()) < 200 then + SetEntityHealth(PlayerPedId(), GetEntityHealth(PlayerPedId()) + value) + end + end + hasHealthBuffActive = false + end) + end +end exports('AddHealthBuff', AddHealthBuff) + +--- Method to add armor buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of Armor the player will gain over time + +local hasArmorBuffActive = false +local function AddArmorBuff(time, value) + AddBuff("super-armor", time) + if not hasArmorBuffActive then + hasArmorBuffActive = true + CreateThread(function() + while HasBuff("super-armor") do + Wait(5000) + if GetPedArmour(PlayerPedId()) < 100 then + SetPedArmour(PlayerPedId(), GetPedArmour(PlayerPedId()) + value) + end + end + hasArmorBuffActive = false + end) + end +end exports('AddArmorBuff', AddArmorBuff) + +RegisterCommand("stambuff", function() + AddHealthBuff(50000, math.random(1,5)) + Wait(1000) + AddArmorBuff(50000, math.random(1,5)) +end) + + +exports["ps-buffs"]:AddHealthBuff(time in ms, buff amoount) +exports["ps-buffs"]:AddArmorBuff(time in ms, buff amoount) + + + + + + + + STAMINA BUFF-- +--- Method to add stamina buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of speed boost the player will recieve +local hasStaminaBuffActive = false +local function StaminaBuffEffect(time, value) + AddBuff("stamina", time) + if not hasStaminaBuffActive then + hasStaminaBuffActive = true + CreateThread(function() + SetRunSprintMultiplierForPlayer(PlayerId(), value) + while exports['ps-buffs']:HasBuff("stamina") do + Wait(500) + SetPlayerStamina(PlayerId(), GetPlayerStamina(PlayerId()) + math.random(1,10)) + end + SetRunSprintMultiplierForPlayer(PlayerId(), 1.0) + hasStaminaBuffActive = false + end) + end +end exports('StaminaBuffEffect', StaminaBuffEffect) + + +exports["ps-buffs"]:StaminaBuffEffect(time in ms, buff amoount) + + +Stamina buff with values like time and buff amount + + + + + + + SWIMMING BUFF + +--- Method to add swimming buff to player +--- @param time - Time in ms the health buff will be active +--- @param value - The amount of swimming speed boost the player will recieve +local hasSwimmingBuffActive = false +local function SwimmingBuffEffect(time, value) + AddBuff("swimming", time) + if not hasSwimmingBuffActive then + hasSwimmingBuffActive = true + CreateThread(function() + SetSwimMultiplierForPlayer(PlayerId(), value) + while exports['ps-buffs']:HasBuff("swimming") do + Wait(500) + SetPlayerStamina(PlayerId(), GetPlayerStamina(PlayerId()) + math.random(1,10)) + end + SetSwimMultiplierForPlayer(PlayerId(), 1.0) + hasSwimmingBuffActive = false + end) + end +end exports('SwimmingBuffEffect', SwimmingBuffEffect) + + +exports["ps-buffs"]:SwimmingBuffEffect(time in ms, buff ammount) + + + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +Hunger and Thirst Buff!! +Notes. You need to replace the following snippets in core. Do not ADD + +If you add this block of code instead of replacing, you will get error In server console with hungerRate is nil or thirstRate is nil! + +--------------qb-core/client/loops.lua--------------------------------------------------------------------------- +CreateThread(function() + while true do + local sleep = 0 + if LocalPlayer.state.isLoggedIn then + sleep = (1000 * 60) * QBCore.Config.UpdateInterval + local hungerRate = 0 + local thirstRate = 0 + if exports["ps-buffs"]:HasBuff("super-hunger") then hungerRate = QBCore.Config.Player.HungerRate/2 else hungerRate = QBCore.Config.Player.HungerRate end + if exports["ps-buffs"]:HasBuff("super-thirst") then thirstRate = QBCore.Config.Player.ThirstRate/2 else thirstRate = QBCore.Config.Player.ThirstRate end + TriggerServerEvent('QBCore:UpdatePlayer', hungerRate, thirstRate) + end + Wait(sleep) + end +end) +-- +-- +-- +-- +-- +-- +-- + +qb-core/server/events.lua - Replace the event with this new event-------------------------------------------------------- +RegisterNetEvent('QBCore:UpdatePlayer', function(hungerRate, thirstRate) + print('Updating Player', hungerRate, thirstRate) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if not Player then return end + local newHunger = Player.PlayerData.metadata['hunger'] - hungerRate + local newThirst = Player.PlayerData.metadata['thirst'] - thirstRate + if newHunger <= 0 then + newHunger = 0 + end + if newThirst <= 0 then + newThirst = 0 + end + Player.Functions.SetMetaData('thirst', newThirst) + Player.Functions.SetMetaData('hunger', newHunger) + TriggerClientEvent('hud:client:UpdateNeeds', src, newHunger, newThirst) + Player.Functions.Save() +end) + +-- +-- +-- +-- +-- +-- +-- + + + + +Replace this in qb-core/client/events.lua--------------------------------------------------------------------------------------------- +RegisterNetEvent('QBCore:Player:UpdatePlayerData', function() + local hungerRate = 0 + local thirstRate = 0 + if exports["ps-buffs"]:HasBuff("super-hunger") then hungerRate = QBCore.Config.Player.HungerRate/2 else hungerRate = QBCore.Config.Player.HungerRate end + if exports["ps-buffs"]:HasBuff("super-thirst") then thirstRate = QBCore.Config.Player.ThirstRate/2 else thirstRate = QBCore.Config.Player.ThirstRate end + TriggerServerEvent('QBCore:UpdatePlayer', hungerRate, thirstRate) +end) + +-- +-- +-- +-- +-- +-- +-- diff --git a/resources/[ps]/ps-dispatch/LICENSE b/resources/[ps]/ps-dispatch/LICENSE new file mode 100644 index 0000000..e7ae97e --- /dev/null +++ b/resources/[ps]/ps-dispatch/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Wild Development + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/resources/[ps]/ps-dispatch/README.md b/resources/[ps]/ps-dispatch/README.md new file mode 100644 index 0000000..30bb182 --- /dev/null +++ b/resources/[ps]/ps-dispatch/README.md @@ -0,0 +1,13 @@ +# ps-dispatch +[Discord Server](https://discord.gg/wilddevelopment) +## Wild Development Presents +Shot Fire +![image1](https://cdn.discordapp.com/attachments/967509707340263515/1047809862115020820/image.png) +İn Vehicle +![image2](https://cdn.discordapp.com/attachments/967509707340263515/1047809934445772820/image.png) +Officer Down Preview İn PD Job +![image3](https://cdn.discordapp.com/attachments/967509707340263515/1047810088989110312/image.png) +Officer Down Preview İn EMS Job +![image4](https://cdn.discordapp.com/attachments/967509707340263515/1047810170786431056/image.png) + + diff --git a/resources/[ps]/ps-dispatch/client/cl_commands.lua b/resources/[ps]/ps-dispatch/client/cl_commands.lua new file mode 100644 index 0000000..b176404 --- /dev/null +++ b/resources/[ps]/ps-dispatch/client/cl_commands.lua @@ -0,0 +1,239 @@ + +local playAnim = false +local phoneProp = 0 +local phoneModel = Config.PhoneModel + + +-- Item checks to return whether or not the client has a phone or not +local function HasPhone() + return QBCore.Functions.HasItem("phone") +end + + +-- Loads the animdict so we can execute it on the ped +local function loadAnimDict(dict) + RequestAnimDict(dict) + + while not HasAnimDictLoaded(dict) do + Wait(0) + end +end + +local function DeletePhone() + if phoneProp ~= 0 then + DeleteObject(phoneProp) + phoneProp = 0 + end +end + +local function NewPropWhoDis() + DeletePhone() + RequestModel(phoneModel) + while not HasModelLoaded(phoneModel) do + Wait(1) + end + phoneProp = CreateObject(phoneModel, 1.0, 1.0, 1.0, 1, 1, 0) + + local bone = GetPedBoneIndex(PlayerPedId(), 28422) + if phoneModel == Config.PhoneModel then + AttachEntityToEntity(phoneProp, PlayerPedId(), bone, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1) + else + AttachEntityToEntity(phoneProp, PlayerPedId(), bone, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1) + end +end + +-- Does the actual animation of the animation when calling 911 +local function PhoneCallAnim() + loadAnimDict("cellphone@") + local ped = PlayerPedId() + CreateThread(function() + NewPropWhoDis() + playAnim = true + while playAnim do + if not IsEntityPlayingAnim(ped, "cellphone@", 'cellphone_text_to_call', 3) then + TaskPlayAnim(ped, "cellphone@", 'cellphone_text_to_call', 3.0, 3.0, -1, 50, 0, false, false, false) + end + Wait(100) + end + end) +end + + +-- Regular 911 call that goes straight to the Police +RegisterCommand('114', function(source, args, rawCommand) + local msg = rawCommand:sub(5) + if string.len(msg) > 0 then + if not exports['qb-policejob']:IsHandcuffed() then + if HasPhone() then + PhoneCallAnim() + Wait(math.random(3,8) * 1000) + playAnim = false + local plyData = QBCore.Functions.GetPlayerData() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "114call", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "114", + firstStreet = locationInfo, + priority = 2, -- priority + name = plyData.charinfo.firstname:sub(1,1):upper()..plyData.charinfo.firstname:sub(2).. " ".. plyData.charinfo.lastname:sub(1,1):upper()..plyData.charinfo.lastname:sub(2), + number = plyData.charinfo.phone, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = "Ingående opkald", -- message + information = msg, + job = {"police", "ambulance"} -- jobs that will get the alerts + }) + Wait(1000) + DeletePhone() + StopEntityAnim(PlayerPedId(), 'cellphone_text_to_call', "cellphone@", 3) + else + QBCore.Functions.Notify("Du kan ikke ringe uden en telefon!", "error", 4500) + end + else + QBCore.Functions.Notify("Du kan ikke ringe når du er i håndjern..", "error", 4500) + end + else + QBCore.Functions.Notify('Angiv en årsag efter 114', "success") + end +end, false) + +RegisterCommand('114a', function(source, args, rawCommand) + local msg = rawCommand:sub(5) + if string.len(msg) > 0 then + if not exports['qb-policejob']:IsHandcuffed() then + if HasPhone() then + PhoneCallAnim() + Wait(math.random(3,8) * 1000) + playAnim = false + local plyData = QBCore.Functions.GetPlayerData() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "114call", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "114", + firstStreet = locationInfo, + priority = 2, -- priority + name = "Anonym", + number = "Skjult Nummer", + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = "Ingående anonymt opkald", -- message + information = msg, + job = {"police", "ambulance"} -- jobs that will get the alerts + }) + Wait(1000) + DeletePhone() + StopEntityAnim(PlayerPedId(), 'cellphone_text_to_call', "cellphone@", 3) + else + QBCore.Functions.Notify("Du kan ikke ringe uden en telefon!", "error", 4500) + end + else + QBCore.Functions.Notify("Du kan ikke ringe når du er i håndjern..", "error", 4500) + end + else + QBCore.Functions.Notify('Angiv en årsag efter 114', "success") + end +end, false) + +-- Regular 311 call that goes straight to the Police +RegisterCommand('112', function(source, args, rawCommand) + local msg = rawCommand:sub(5) + if string.len(msg) > 0 then + if not exports['qb-policejob']:IsHandcuffed() then + if HasPhone() then + PhoneCallAnim() + Wait(math.random(3,8) * 1000) + playAnim = false + local plyData = QBCore.Functions.GetPlayerData() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "112call", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "112", + firstStreet = locationInfo, + priority = 2, -- priority + name = plyData.charinfo.firstname:sub(1,1):upper()..plyData.charinfo.firstname:sub(2).. " ".. plyData.charinfo.lastname:sub(1,1):upper()..plyData.charinfo.lastname:sub(2), + number = plyData.charinfo.phone, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = "Ingående opkald", -- message + information = msg, + job = {"police", "ambulance"} -- jobs that will get the alerts + }) + Wait(1000) + DeletePhone() + StopEntityAnim(PlayerPedId(), 'cellphone_text_to_call', "cellphone@", 3) + else + QBCore.Functions.Notify("Du kan ikke ringe uden en telefon!", "error", 4500) + end + else + QBCore.Functions.Notify("Du kan ikke ringe når du er i håndjern..", "error", 4500) + end + else + QBCore.Functions.Notify('Angiv en årsag efter 112', "success") + end +end, false) + +-- Regular 311 call that goes straight to the Police +RegisterCommand('112a', function(source, args, rawCommand) + local msg = rawCommand:sub(5) + if string.len(msg) > 0 then + if not exports['qb-policejob']:IsHandcuffed() then + if HasPhone() then + PhoneCallAnim() + Wait(math.random(3,8) * 1000) + playAnim = false + local plyData = QBCore.Functions.GetPlayerData() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "112call", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "112", + firstStreet = locationInfo, + priority = 2, -- priority + name = "Anonym", + number = "Skjult Nummer", + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = "Ingående anonymt opkald", -- message + information = msg, + job = {"police", "ambulance"} -- jobs that will get the alerts + }) + Wait(1000) + DeletePhone() + StopEntityAnim(PlayerPedId(), 'cellphone_text_to_call', "cellphone@", 3) + else + QBCore.Functions.Notify("Du kan ikke ringe uden en telefon!", "error", 4500) + end + else + QBCore.Functions.Notify("Du kan ikke ringe når du er i håndjern..", "error", 4500) + end + else + QBCore.Functions.Notify('Angiv en årsag efter 112a', "success") + end +end, false) + + +Citizen.CreateThread(function() + TriggerEvent('chat:addSuggestion', '/114', 'Send en besked til politiet.', {{ name="besked", help="Besked til politiet."}}) + TriggerEvent('chat:addSuggestion', '/114a', 'Send en anonym besked til politiet.', {{ name="besked", help="Anonym besked til politiet."}}) + TriggerEvent('chat:addSuggestion', '/112', 'Send en besked til EMS.', {{ name="besked", help="Besked til EMS."}}) + TriggerEvent('chat:addSuggestion', '/112a', 'Send en anonym besked til EMS.', {{ name="besked", help="Anonym besked til EMS."}}) +end) diff --git a/resources/[ps]/ps-dispatch/client/cl_events.lua b/resources/[ps]/ps-dispatch/client/cl_events.lua new file mode 100644 index 0000000..d4f2dfb --- /dev/null +++ b/resources/[ps]/ps-dispatch/client/cl_events.lua @@ -0,0 +1,773 @@ +local WeaponTable = { + [584646201] = "CLASS 2: AP-Pistol", + [453432689] = "CLASS 1: Pistol", + [3219281620] = "CLASS 1: Pistol MK2", + [1593441988] = "CLASS 1: Combat Pistol", + [-1716589765] = "CLASS 1: Heavy Pistol", + [-1076751822] = "CLASS 1: SNS-Pistol", + [-771403250] = "CLASS 2: Desert Eagle", + [137902532] = "CLASS 2: Vintage Pistol", + [-598887786] = "CLASS 2: Marksman Pistol", + [-1045183535] = "CLASS 2: Revolver", + [911657153] = "Taser", + [324215364] = "CLASS 2: Micro-SMG", + [-619010992] = "CLASS 2: Machine-Pistol", + [736523883] = "CLASS 2: SMG", + [2024373456] = "CLASS 2: SMG MK2", + [-270015777] = "CLASS 2: Assault SMG", + [171789620] = "CLASS 2: Combat PDW", + [-1660422300] = "CLASS 4: Combat MG", + [3686625920] = "CLASS 4: Combat MG MK2", + [1627465347] = "CLASS 4: Gusenberg", + [-1121678507] = "CLASS 2: Mini SMG", + [-1074790547] = "CLASS 3: Assaultrifle", + [961495388] = "CLASS 3: Assaultrifle MK2", + [-2084633992] = "CLASS 3: Carbinerifle", + [4208062921] = "CLASS 3: Carbinerifle MK2", + [3520460075] = "CLASS 3: Carbinerifle MK2", + [-1357824103] = "CLASS 3: Advancedrifle", + [-1063057011] = "CLASS 3: Specialcarbine", + [2132975508] = "CLASS 3: Bulluprifle", + [1649403952] = "CLASS 3: Compactrifle", + [100416529] = "CLASS 4: Sniperrifle", + [205991906] = "CLASS 4: Heavy Sniper", + [177293209] = "CLASS 4: Heavy Sniper MK2", + [-952879014] = "CLASS 4: Marksmanrifle", + [487013001] = "CLASS 2: Pumpshotgun", + [2017895192] = "CLASS 2: Sawnoff Shotgun", + [-1654528753] = "CLASS 3: Bullupshotgun", + [-494615257] = "CLASS 3: Assaultshotgun", + [-1466123874] = "CLASS 3: Musket", + [984333226] = "CLASS 3: Heavyshotgun", + [-275439685] = "CLASS 2: Doublebarrel Shotgun", + [317205821] = "CLASS 2: Autoshotgun", + [-1568386805] = "CLASS 5: GRENADE LAUNCHER", + [-1312131151] = "CLASS 5: RPG", + [125959754] = "CLASS 5: Compactlauncher", +} +local function VehicleTheft(vehicle) + local vehdata = vehicleData(vehicle) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local heading = getCardinalDirectionFromHeading() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "vehicletheft", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-35", + firstStreet = locationInfo, + model = vehdata.name, -- vehicle name + plate = vehdata.plate, -- vehicle plate + priority = 2, + firstColor = vehdata.colour, -- vehicle color + heading = heading, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('vehicletheft'), + job = { "police" } + }) +end + +exports('VehicleTheft', VehicleTheft) + +local function VehicleShooting(vehdata) + local Player = QBCore.Functions.GetPlayerData() + if Player.job.name == "police" or Player.job.name == "ambulance" then + if Player.job.onduty then + return + end + end + + local vehicle = QBCore.Functions.GetClosestVehicle() + local vehdata = vehicleData(vehicle) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local heading = getCardinalDirectionFromHeading() + local gender = GetPedGender() + local doorCount = 0 + + local PlayerPed = PlayerPedId() + local CurrentWeapon = GetSelectedPedWeapon(PlayerPed) + local weapon = WeaponTable[CurrentWeapon] or "UKENDT" + if GetEntityBoneIndexByName(vehicle, 'door_pside_f') ~= -1 then doorCount = doorCount + 1 end + if GetEntityBoneIndexByName(vehicle, 'door_pside_r') ~= -1 then doorCount = doorCount + 1 end + if GetEntityBoneIndexByName(vehicle, 'door_dside_f') ~= -1 then doorCount = doorCount + 1 end + if GetEntityBoneIndexByName(vehicle, 'door_dside_r') ~= -1 then doorCount = doorCount + 1 end + if doorCount == 2 then doorCount = "To-dørs" elseif doorCount == 3 then doorCount = "Tre-dørs" elseif doorCount == 4 then doorCount = "Fire-dørs" else doorCount = "UKENDT" end + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "vehicleshots", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-60", + firstStreet = locationInfo, + model = vehdata.name, + plate = vehdata.plate, + gender = gender, + weapon = weapon, + doorCount = doorCount, + priority = 2, + firstColor = vehdata.colour, + heading = heading, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('vehicleshots'), + job = { "police" } + }) +end + +exports('VehicleShooting', VehicleShooting) + +-- Meter Robbery +local function MeterRobbery(camId) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "meterrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + camId = camId, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('meterrobbery'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('MeterRobbery', MeterRobbery) + +-- ATM Robbery +local function ATMRobbery(camId) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "atmrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + camId = camId, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('atmrobbery'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('ATMRobbery', ATMRobbery) + +local function Shooting() + local Player = QBCore.Functions.GetPlayerData() + if Player.job.name == "police" or Player.job.name == "ambulance" then + if Player.job.onduty then + return + end + end + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + local PlayerPed = PlayerPedId() + local CurrentWeapon = GetSelectedPedWeapon(PlayerPed) + local weapon = WeaponTable[CurrentWeapon] or "UNKNOWN" + + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "shooting", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-11", + firstStreet = locationInfo, + gender = gender, + weapon = weapon, + model = nil, + plate = nil, + priority = 2, + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('shooting'), + job = { "police" } + }) + +end + +exports('Shooting', Shooting) + +local function SpeedingVehicle(vehdata) + local Player = QBCore.Functions.GetPlayerData() + if Player.job.name == "police" or Player.job.name == "ambulance" then + if Player.job.onduty then + return + end + end + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local heading = getCardinalDirectionFromHeading() + + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "speeding", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-11", + firstStreet = locationInfo, + model = vehdata.name, + plate = vehdata.plate, + priority = 2, + firstColor = vehdata.colour, + heading = heading, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('speeding'), + job = { "police" } + }) +end + +exports('SpeedingVehicle', SpeedingVehicle) + +local function Fight() + local Player = QBCore.Functions.GetPlayerData() + if Player.job.name == "police" or Player.job.name == "ambulance" then + if Player.job.onduty then + return + end + end + + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "fight", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-10", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('melee'), + job = { "police" } + }) +end + +exports('Fight', Fight) + +local function InjuriedPerson() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "civdown", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-69", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('persondown'), -- message + job = { "ambulance" } -- jobs that will get the alerts + }) +end + +exports('InjuriedPerson', InjuriedPerson) + +local function DeceasedPerson() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "civdead", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-69", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = "Civil afgik ved døden", -- message + job = { "ambulance" } -- jobs that will get the alerts + }) +end + +exports('DeceasedPerson', DeceasedPerson) + +local function StoreRobbery(camId) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "storerobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + camId = camId, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('storerobbery'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('StoreRobbery', StoreRobbery) + +local function FleecaBankRobbery(camId) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "bankrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + camId = camId, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('fleecabank'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('FleecaBankRobbery', FleecaBankRobbery) + +local function PaletoBankRobbery(camId) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "paletobankrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + camId = camId, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('paletobank'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('PaletoBankRobbery', PaletoBankRobbery) + +local function PacificBankRobbery(camId) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "pacificbankrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + camId = camId, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('pacificbank'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('PacificBankRobbery', PacificBankRobbery) + +local function PrisonBreak() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "prisonbreak", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('prisonbreak'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('PrisonBreak', PrisonBreak) + +local function VangelicoRobbery(camId) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + PlaySound(-1, "Lose_1st", "GTAO_FM_Events_Soundset", 0, 0, 1) + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "vangelicorobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + camId = camId, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('vangelico'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('VangelicoRobbery', VangelicoRobbery) + +local function HouseRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "houserobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('houserobbery'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('HouseRobbery', HouseRobbery) + +local function YachtHeist() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "yachtheist", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-65", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('yachtheist'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('YachtHeist', YachtHeist) + +local function DrugSale() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "suspicioushandoff", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-13", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('drugsell'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('DrugSale', DrugSale) + + +-- for rcore_gangs, haven't tested server side exports so made this instead. Remove if you do not need :) +RegisterNetEvent('ps-dispatch:client:drugsale', function() + DrugSale() +end) + +local function CarJacking(vehicle) + local vehdata = vehicleData(vehicle) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local heading = getCardinalDirectionFromHeading() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "carjack", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-35", + firstStreet = locationInfo, + model = vehdata.name, -- vehicle name + plate = vehdata.plate, -- vehicle plate + priority = 2, + firstColor = vehdata.colour, -- vehicle color + heading = heading, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('carjacking'), + job = { "police" } + }) +end + +exports('CarJacking', CarJacking) + +local function OfficerDown() + local plyData = QBCore.Functions.GetPlayerData() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local callsign = QBCore.Functions.GetPlayerData().metadata["callsign"] + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "officerdown", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-99", + firstStreet = locationInfo, + name = "BETJENT - " .. plyData.charinfo.firstname:sub(1, 1):upper() .. plyData.charinfo.firstname:sub(2) .. " " .. plyData.charinfo.lastname:sub(1, 1):upper() .. plyData.charinfo.lastname:sub(2), + model = nil, + plate = nil, + callsign = callsign, + priority = 1, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('officerdown'), -- message + job = { "ambulance", "police" } -- jobs that will get the alerts + }) +end + +exports('OfficerDown', OfficerDown) + +RegisterNetEvent("ps-dispatch:client:officerdown", function () + OfficerDown() +end) + +local function EmsDown() + local plyData = QBCore.Functions.GetPlayerData() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local callsign = QBCore.Functions.GetPlayerData().metadata["callsign"] + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "emsdown", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-99", + firstStreet = locationInfo, + name = "EMS - " .. plyData.charinfo.firstname:sub(1, 1):upper() .. plyData.charinfo.firstname:sub(2) .. " " .. plyData.charinfo.lastname:sub(1, 1):upper() .. plyData.charinfo.lastname:sub(2), + model = nil, + plate = nil, + callsign = callsign, + priority = 1, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('emsdown'), -- message + job = { "ambulance", "police" } -- jobs that will get the alerts + }) +end + +exports('EmsDown', EmsDown) + +RegisterNetEvent("ps-dispatch:client:emsdown", function () + EmsDown() +end) + +local function Explosion() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "explosion", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-80", + firstStreet = locationInfo, + gender = nil, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = "Eksplosion meldt", -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('Explosion', Explosion) + +local function SuspiciousActivity() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify", { + dispatchcodename = "susactivity", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-66", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('susactivity'), -- message + job = { "police" } -- jobs that will get the alerts + }) +end + +exports('SuspiciousActivity', SuspiciousActivity) + +local function CustomAlert(data) + + local coords = data.coords or vec3(0.0, 0.0, 0.0) + local gender = GetPedGender() + if not data.gender then gender = nil end + local job = { "police" } + if data.job then job = data.job end + + + local locationInfo = getStreetandZone(coords) + TriggerServerEvent("dispatch:server:notify", { + dispatchCode = data.dispatchCode or "INGEN", + firstStreet = locationInfo, + gender = gender, + model = data.model or nil, + plate = data.plate or nil, + priority = data.priority or 2, -- priority + firstColor = data.firstColor or nil, + camId = data.camId or nil, + callsign = data.callsign or nil, + name = data.name or nil, + doorCount = data.doorCount or nil, + heading = data.heading or nil, + automaticGunfire = data.automaticGunfire or false, + origin = { + x = coords.x, + y = coords.y, + z = coords.z + }, + dispatchMessage = data.message or "", + job = job, + alert = { + displayCode = data.dispatchCode or "INGEN", + description = data.description or "", + radius = data.radius or 0, + recipientList = job, + blipSprite = data.sprite or 1, + blipColour = data.color or 1, + blipScale = data.scale or 0.5, + blipLength = data.length or 2, + sound = data.sound or "Lose_1st", + sound2 = data.sound2 or "GTAO_FM_Events_Soundset", + offset = data.offset or "false", + blipflash = data.flash or "false" + } + }) +end +exports('CustomAlert', CustomAlert) \ No newline at end of file diff --git a/resources/[ps]/ps-dispatch/client/cl_extraalerts.lua b/resources/[ps]/ps-dispatch/client/cl_extraalerts.lua new file mode 100644 index 0000000..0eda915 --- /dev/null +++ b/resources/[ps]/ps-dispatch/client/cl_extraalerts.lua @@ -0,0 +1,224 @@ +--------------------------- +----rainmad scripts-------- +--------------------------- + +local function ArtGalleryRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "artgalleryrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('artgalleryrobbery'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('ArtGalleryRobbery', ArtGalleryRobbery) + +local function HumaneRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "humanelabsrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('humanerobbery'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('HumaneRobbery', HumaneRobbery) + +local function TrainRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "trainrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('trainrobbery'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('TrainRobbery', TrainRobbery) + +local function VanRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "vanrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('vanrobbery'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('VanRobbery', VanRobbery) + +local function UndergroundRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "undergroundrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('underground'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('UndergroundRobbery', UndergroundRobbery) + +local function DrugBoatRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "drugboatrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('drugboatrobbery'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('DrugBoatRobbery', DrugBoatRobbery) + +local function UnionRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "unionrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-90", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('unionrobbery'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('UnionRobbery', UnionRobbery) + +local function CarBoosting(vehicle) + local vehdata = vehicleData(vehicle) + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "carboosting", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-50", + firstStreet = locationInfo, + gender = gender, + model = vehdata.name, + plate = vehdata.plate, + priority = 2, + firstColor = vehdata.colour, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = _U('carboosting'), -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('CarBoosting', CarBoosting) + +--------------------------- +---- ps-signrobbery ------- +--------------------------- + +local function SignRobbery() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + local gender = GetPedGender() + TriggerServerEvent("dispatch:server:notify",{ + dispatchcodename = "signrobbery", -- has to match the codes in sv_dispatchcodes.lua so that it generates the right blip + dispatchCode = "10-35", + firstStreet = locationInfo, + gender = gender, + model = nil, + plate = nil, + priority = 2, -- priority + firstColor = nil, + automaticGunfire = false, + origin = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + dispatchMessage = 'Skiltetyveri begået', -- message + job = {"police"} -- jobs that will get the alerts + }) +end exports('SignRobbery', SignRobbery) \ No newline at end of file diff --git a/resources/[ps]/ps-dispatch/client/cl_loops.lua b/resources/[ps]/ps-dispatch/client/cl_loops.lua new file mode 100644 index 0000000..263e6f8 --- /dev/null +++ b/resources/[ps]/ps-dispatch/client/cl_loops.lua @@ -0,0 +1,57 @@ +CreateThread(function() + local vehicleWhitelist = {[0]=true,[1]=true,[2]=true,[3]=true,[4]=true,[5]=true,[6]=true,[7]=true,[8]=true,[9]=true,[10]=true,[11]=true,[12]=true,[17]=true,[19]=true,[20]=true} + local sleep = 100 + while true do + playerPed = PlayerPedId() + if (not isPlayerWhitelisted or Config.Debug) then + for k, v in pairs(Config.Timer) do + if v > 0 then Config.Timer[k] = v - 1 end + end + if GetVehiclePedIsUsing(playerPed) ~= 0 then + local vehicle = GetVehiclePedIsUsing(playerPed, true) + if vehicleWhitelist[GetVehicleClass(vehicle)] then + local driver = GetPedInVehicleSeat(vehicle, -1) + if Config.Timer['Shooting'] == 0 and not BlacklistedWeapon(playerPed) and not IsPedCurrentWeaponSilenced(playerPed) and IsPedArmed(playerPed, 4) then + sleep = 10 + if IsPedShooting(playerPed) then + local vehicle = vehicleData(vehicle) + exports['ps-dispatch']:VehicleShooting(vehicle) + Config.Timer['Shooting'] = Config.Shooting.Success + else + Config.Timer['Shooting'] = Config.Shooting.Fail + end + elseif Config.Timer['Speeding'] == 0 and playerPed == driver then + sleep = 100 + if (GetEntitySpeed(vehicle) * 3.6) >= (120 + (math.random(30,60))) then + Wait(400) + if IsPedInAnyVehicle(playerPed, true) and ((GetEntitySpeed(vehicle) * 3.6) >= 90) then + local vehicle = vehicleData(vehicle) + exports['ps-dispatch']:SpeedingVehicle(vehicle) + Config.Timer['Speeding'] = Config.Speeding.Success + end + else + Config.Timer['Speeding'] = Config.Speeding.Fail + end + else + sleep = 100 + end + end + else + if Config.Timer['Shooting'] == 0 and not IsPedCurrentWeaponSilenced(playerPed) and IsPedArmed(playerPed, 4) then + sleep = 50 + if IsPedShooting(playerPed) and not BlacklistedWeapon(playerPed) then + exports['ps-dispatch']:Shooting() + Config.Timer['Shooting'] = Config.Shooting.Success + else + Config.Timer['Shooting'] = Config.Shooting.Fail + end + elseif Config.Timer['Melee'] == 0 and IsPedInMeleeCombat(playerPed) and HasPedBeenDamagedByWeapon(GetMeleeTargetForPed(playerPed), 0, 1) then + sleep = 50 + exports['ps-dispatch']:Fight() + Config.Timer['Melee'] = Config.Melee.Success + else sleep = 100 end + end + end + Wait(sleep) + end +end) \ No newline at end of file diff --git a/resources/[ps]/ps-dispatch/client/cl_main.lua b/resources/[ps]/ps-dispatch/client/cl_main.lua new file mode 100644 index 0000000..139b27c --- /dev/null +++ b/resources/[ps]/ps-dispatch/client/cl_main.lua @@ -0,0 +1,333 @@ +PlayerData = {} +PlayerJob = {} +isLoggedIn = true +QBCore = exports['qb-core']:GetCoreObject() +local blips = {} + +-- core related + +AddEventHandler('onResourceStart', function(resourceName) + if GetCurrentResourceName() == resourceName then + isLoggedIn = true + PlayerData = QBCore.Functions.GetPlayerData() + PlayerJob = QBCore.Functions.GetPlayerData().job + end +end) + +RegisterNetEvent("QBCore:Client:OnPlayerLoaded", function() + isLoggedIn = true + PlayerData = QBCore.Functions.GetPlayerData() + PlayerJob = QBCore.Functions.GetPlayerData().job +end) + +RegisterNetEvent('QBCore:Client:OnPlayerUnload', function() + PlayerData = {} + isLoggedIn = false + currentCallSign = "" + -- currentVehicle, inVehicle, currentlyArmed, currentWeapon = nil, false, false, `WEAPON_UNARMED` + -- removeHuntingZones() +end) + +RegisterNetEvent("QBCore:Client:OnJobUpdate", function(JobInfo) + PlayerData = QBCore.Functions.GetPlayerData() + PlayerJob = JobInfo +end) + +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +function _U(entry) + return Locales[Config.Locale][entry] +end + +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +function getSpeed() return speedlimit end +function getStreet() return currentStreetName end +function getStreetandZone(coords) + local zone = GetLabelText(GetNameOfZone(coords.x, coords.y, coords.z)) + local currentStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z) + currentStreetName = GetStreetNameFromHashKey(currentStreetHash) + playerStreetsLocation = currentStreetName .. ", " .. zone + return playerStreetsLocation +end + +function refreshPlayerWhitelisted() + if not PlayerData then return false end + if not PlayerData.job then return false end + if Config.Debug then return true end + for k,v in ipairs({'police'}) do + if v == PlayerData.job.name then + return true + end + end + return false +end + +function BlacklistedWeapon(playerPed) + for i = 1, #Config.WeaponBlacklist do + local weaponHash = GetHashKey(Config.WeaponBlacklist[i]) + if GetSelectedPedWeapon(playerPed) == weaponHash then + return true -- Is a blacklisted weapon + end + end + return false -- Is not a blacklisted weapon +end + +function GetAllPeds() + local getPeds = {} + local findHandle, foundPed = FindFirstPed() + local continueFind = (foundPed and true or false) + local count = 0 + while continueFind do + local pedCoords = GetEntityCoords(foundPed) + if GetPedType(foundPed) ~= 28 and not IsEntityDead(foundPed) and not IsPedAPlayer(foundPed) and #(playerCoords - pedCoords) < 80.0 then + getPeds[#getPeds + 1] = foundPed + count = count + 1 + end + continueFind, foundPed = FindNextPed(findHandle) + end + EndFindPed(findHandle) + return count +end + +function zoneChance(type, zoneMod, street) + if Config.DebugChance then return true end + if not street then street = currentStreetName end + playerCoords = GetEntityCoords(PlayerPedId()) + local zone, sendit = GetLabelText(GetNameOfZone(playerCoords.x, playerCoords.y, playerCoords.z)), false + if not nearbyPeds then + nearbyPeds = GetAllPeds() + elseif nearbyPeds < 1 then if Config.Debug then print(('^1[%s] Nobody is nearby to send a report^7'):format(type)) end + return false + end + if zoneMod == nil then zoneMod = 1 end + zoneMod = (math.ceil(zoneMod+0.5)) + local hour = GetClockHours() + if hour >= 21 or hour <= 4 then + zoneMod = zoneMod * 1.6 + zoneMod = math.ceil(zoneMod+0.5) + end + zoneMod = zoneMod / (nearbyPeds / 3) + zoneMod = (math.ceil(zoneMod+0.5)) + local sum = math.random(1, zoneMod) + local chance = string.format('%.2f',(1 / zoneMod) * 100)..'%' + + if sum > 1 then + if Config.Debug then print(('^1[%s] %s (%s) - %s nearby peds^7'):format(type, zone, chance, nearbyPeds)) end + sendit = false + else + if Config.Debug then print(('^2[%s] %s (%s) - %s nearby peds^7'):format(type, zone, chance, nearbyPeds)) end + sendit = true + end + print(('^1[%s] %s (%s) - %s nearby peds^7'):format(type, zone, chance, nearbyPeds)) + return sendit +end + +function vehicleData(vehicle) + local vData = {} + local vehicleClass = GetVehicleClass(vehicle) + local vClass = {[0] = _U('compact'), [1] = _U('sedan'), [2] = _U('suv'), [3] = _U('coupe'), [4] = _U('muscle'), [5] = _U('sports_classic'), [6] = _U('sports'), [7] = _U('super'), [8] = _U('motorcycle'), [9] = _U('offroad'), [10] = _U('industrial'), [11] = _U('utility'), [12] = _U('van'), [17] = _U('service'), [19] = _U('military'), [20] = _U('truck')} + local vehClass = vClass[vehicleClass] + local vehicleName = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))) + local vehicleColour1, vehicleColour2 = GetVehicleColours(vehicle) + if vehicleColour1 then + if Config.Colours[tostring(vehicleColour2)] and Config.Colours[tostring(vehicleColour1)] then + vehicleColour = Config.Colours[tostring(vehicleColour2)] .. " on " .. Config.Colours[tostring(vehicleColour1)] + elseif Config.Colours[tostring(vehicleColour1)] then + vehicleColour = Config.Colours[tostring(vehicleColour1)] + elseif Config.Colours[tostring(vehicleColour2)] then + vehicleColour = Config.Colours[tostring(vehicleColour2)] + else + vehicleColour = "Ukendt" + end + end + local plate = GetVehicleNumberPlateText(vehicle) + local doorCount = 0 + if GetEntityBoneIndexByName(vehicle, 'door_pside_f') ~= -1 then doorCount = doorCount + 1 end + if GetEntityBoneIndexByName(vehicle, 'door_pside_r') ~= -1 then doorCount = doorCount + 1 end + if GetEntityBoneIndexByName(vehicle, 'door_dside_f') ~= -1 then doorCount = doorCount + 1 end + if GetEntityBoneIndexByName(vehicle, 'door_dside_r') ~= -1 then doorCount = doorCount + 1 end + if doorCount == 2 then doorCount = _U('two_door') elseif doorCount == 3 then doorCount = _U('three_door') elseif doorCount == 4 then doorCount = _U('four_door') else doorCount = '' end + vData.class, vData.name, vData.colour, vData.doors, vData.plate, vData.id = vehClass, vehicleName, vehicleColour, doorCount, plate, NetworkGetNetworkIdFromEntity(vehicle) + return vData +end + +function GetPedGender() + local gender = "Mand" + if QBCore.Functions.GetPlayerData().charinfo.gender == 1 then gender = "Kvinde" end + return gender +end + +function getCardinalDirectionFromHeading() + local heading = GetEntityHeading(PlayerPedId()) + if heading >= 315 or heading < 45 then return "Nordgående" + elseif heading >= 45 and heading < 135 then return "Vestgående" + elseif heading >=135 and heading < 225 then return "Sydgående" + elseif heading >= 225 and heading < 315 then return "Østgående" end +end + +function IsPoliceJob(job) + for k, v in pairs(Config.PoliceJob) do + if job == v then + return true + end + end + return false +end + +local function IsValidJob(jobList) + for k, v in pairs(jobList) do + if v == PlayerJob.name then + return true + end + end + return false +end + +local function CheckOnDuty() + if Config.OnDutyOnly then + return PlayerJob.onduty + end + return true +end + +-- Dispatch Itself + +local disableNotis, disableNotifSounds = false, false + +RegisterNetEvent('dispatch:manageNotifs', function(sentSetting) + local wantedSetting = tostring(sentSetting) + if wantedSetting == "on" then + disableNotis = false + disableNotifSounds = false + QBCore.Functions.Notify("Dispatch slået til", "success") + elseif wantedSetting == "off" then + disableNotis = true + disableNotifSounds = true + QBCore.Functions.Notify("Dispatch slået fra", "success") + elseif wantedSetting == "mute" then + disableNotis = false + disableNotifSounds = true + QBCore.Functions.Notify("Dispatch muted", "success") + else + QBCore.Functions.Notify('Vælg venligt "on", "off" eller "mute", for dispatch notifikationer.', "success") + + end +end) + +RegisterNetEvent('dispatch:clNotify', function(sNotificationData, sNotificationId, sender) + if sNotificationData ~= nil and isLoggedIn then + if IsValidJob(sNotificationData['job']) and CheckOnDuty() then + if not disableNotis then + if sNotificationData.origin ~= nil then + SendNUIMessage({ + update = "newCall", + callID = sNotificationId, + data = sNotificationData, + timer = 5000, + isPolice = IsPoliceJob(PlayerJob.name) + }) + end + end + end + end +end) + +RegisterNetEvent("ps-dispatch:client:AddCallBlip", function(coords, data, blipId) + if IsValidJob(data.recipientList) and CheckOnDuty() then + PlaySound(-1, data.sound, data.sound2, 0, 0, 1) + TriggerServerEvent("InteractSound_SV:PlayOnSource", data.sound, 0.25) -- For Custom Sounds + CreateThread(function() + local alpha = 255 + local blip = nil + local radius = nil + local radiusAlpha = 128 + local sprite, colour, scale = 161, 84, 0.5 + local randomoffset = math.random(1,100) + if data.blipSprite then sprite = data.blipSprite end + if data.blipColour then colour = data.blipColour end + if data.blipScale then scale = data.blipScale end + if data.radius then radius = data.radius end + if data.offset == "true" then + if randomoffset <= 25 then + radius = AddBlipForRadius(coords.x + math.random(Config.MinOffset, Config.MaxOffset), coords.y + math.random(Config.MinOffset, Config.MaxOffset), coords.z, data.radius) + blip = AddBlipForCoord(coords.x + math.random(Config.MinOffset, Config.MaxOffset), coords.y + math.random(Config.MinOffset, Config.MaxOffset), coords.z) + blips[blipId] = blip + elseif randomoffset >= 26 and randomoffset <= 50 then + radius = AddBlipForRadius(coords.x - math.random(Config.MinOffset, Config.MaxOffset), coords.y + math.random(Config.MinOffset, Config.MaxOffset), coords.z, data.radius) + blip = AddBlipForCoord(coords.x - math.random(Config.MinOffset, Config.MaxOffset), coords.y + math.random(Config.MinOffset, Config.MaxOffset), coords.z) + blips[blipId] = blip + elseif randomoffset >= 51 and randomoffset <= 74 then + radius = AddBlipForRadius(coords.x - math.random(Config.MinOffset, Config.MaxOffset), coords.y - math.random(Config.MinOffset, Config.MaxOffset), coords.z, data.radius) + blip = AddBlipForCoord(coords.x - math.random(Config.MinOffset, Config.MaxOffset), coords.y - math.random(Config.MinOffset, Config.MaxOffset), coords.z) + blips[blipId] = blip + elseif randomoffset >= 75 and randomoffset <= 100 then + radius = AddBlipForRadius(coords.x + math.random(Config.MinOffset, Config.MaxOffset), coords.y - math.random(Config.MinOffset, Config.MaxOffset), coords.z, data.radius) + blip = AddBlipForCoord(coords.x + math.random(Config.MinOffset, Config.MaxOffset), coords.y - math.random(Config.MinOffset, Config.MaxOffset), coords.z) + blips[blipId] = blip + end + elseif data.offset == "false" then + radius = AddBlipForRadius(coords.x, coords.y, coords.z, data.radius) + blip = AddBlipForCoord(coords.x, coords.y, coords.z) + blips[blipId] = blip + end + if data.blipflash == "true" then + SetBlipFlashes(blip, true) + elseif data.blipflash == "false" then + SetBlipFlashes(blip, false) + end + SetBlipSprite(blip, sprite) + SetBlipHighDetail(blip, true) + SetBlipScale(blip, scale) + SetBlipColour(blip, colour) + SetBlipAlpha(blip, alpha) + SetBlipAsShortRange(blip, false) + SetBlipCategory(blip, 2) + SetBlipColour(radius, colour) + SetBlipAlpha(radius, radiusAlpha) + BeginTextCommandSetBlipName('STRING') + AddTextComponentString(data.displayCode..' - '..data.description) + EndTextCommandSetBlipName(blip) + while radiusAlpha ~= 0 do + Wait(data.blipLength * 1000) + radiusAlpha = radiusAlpha - 1 + SetBlipAlpha(radius, radiusAlpha) + if radiusAlpha == 0 then + RemoveBlip(radius) + RemoveBlip(blip) + return + end + end + end) + end +end) + +RegisterNetEvent('dispatch:getCallResponse', function(message) + SendNUIMessage({ + update = "newCall", + callID = math.random(1000, 9999), + data = { + dispatchCode = 'RSP', + priority = 1, + dispatchMessage = "Opkald svar", + information = message + }, + timer = 10000, + isPolice = true + }) +end) + +RegisterNetEvent("ps-dispatch:client:Explosion", function(data) + exports["ps-dispatch"]:Explosion() +end) + +RegisterNetEvent("ps-dispatch:client:removeCallBlip", function(blipId) + RemoveBlip(blips[blipId]) +end) + +RegisterNetEvent("ps-dispatch:client:clearAllBlips", function() + for k, v in pairs(blips) do + RemoveBlip(v) + end + QBCore.Functions.Notify('Alle dispatch-blips er fjernet', "success") +end) \ No newline at end of file diff --git a/resources/[ps]/ps-dispatch/config.lua b/resources/[ps]/ps-dispatch/config.lua new file mode 100644 index 0000000..87bbb23 --- /dev/null +++ b/resources/[ps]/ps-dispatch/config.lua @@ -0,0 +1,244 @@ +Config = {} + +Config.Enable = {} +Config.Timer = {} + +Config.PoliceJob = { "police" } + +-- Enable if you only want to send alerts to onDuty officers +Config.OnDutyOnly = true + +Config.PoliceAndAmbulance = { "police", "ambulance" } +Config.PhoneModel = 'prop_npc_phone_02' + +-- sets report chance to 100% +Config.DebugChance = true + +-- Explosion Alert Types (Gas Pumps by default) +-- Ex. Config.ExplosionTypes = {1, 2, 3, 4, 5} +Config.ExplosionTypes = {9} + +-- enable default alerts +Config.Enable.Speeding = true +Config.Enable.Shooting = true +Config.Enable.Autotheft = true +Config.Enable.Melee = true +Config.Enable.PlayerDowned = true +--------------------------------------------------------------- +Config.Locale = 'da' + +-- enable alerts when cops break the law and print to console +Config.Debug = false + +-- changes the min and max offset for the radius +Config.MinOffset = 1 +Config.MaxOffset = 120 +--------------------------------------------------------------- + +Citizen.CreateThread(function() + -- if not GetPlayerPed(-1) then return end + -- while not firstname do + -- Citizen.Wait(10) + -- end + + -- if notLoaded then + for k, v in pairs(Config.Enable) do + if Config.Enable[k] ~= false then + Config[k] = {} + Config.Timer[k] = 0 -- Default to 0 seconds + Config[k].Success = 300 -- Default to 30 seconds + Config[k].Fail = 20 -- Default to 2 seconds + end + end + -- If you want to set specific timers, do it here + if Config.Shooting then + Config.Shooting.Success = 100 -- 10 seconds + Config.Shooting.Fail = 0 -- 0 seconds + end + + -- notLoaded = nil + -- end + + Config.WeaponBlacklist = { + 'WEAPON_GRENADE', + 'WEAPON_BZGAS', + 'WEAPON_MOLOTOV', + 'WEAPON_STICKYBOMB', + 'WEAPON_PROXMINE', + 'WEAPON_SNOWBALL', + 'WEAPON_PIPEBOMB', + 'WEAPON_BALL', + 'WEAPON_SMOKEGRENADE', + 'WEAPON_FLARE', + 'WEAPON_PETROLCAN', + 'WEAPON_FIREEXTINGUISHER', + 'WEAPON_HAZARDCAN', + 'WEAPON_RAYCARBINE', + 'WEAPON_STUNGUN' + } + + Config.Colours = { + ['0'] = "Metallic Black", + ['1'] = "Metallic Graphite Black", + ['2'] = "Metallic Black Steel", + ['3'] = "Metallic Dark Silver", + ['4'] = "Metallic Silver", + ['5'] = "Metallic Blue Silver", + ['6'] = "Metallic Steel Gray", + ['7'] = "Metallic Shadow Silver", + ['8'] = "Metallic Stone Silver", + ['9'] = "Metallic Midnight Silver", + ['10'] = "Metallic Gun Metal", + ['11'] = "Metallic Anthracite Grey", + ['12'] = "Matte Black", + ['13'] = "Matte Gray", + ['14'] = "Matte Light Grey", + ['15'] = "Util Black", + ['16'] = "Util Black Poly", + ['17'] = "Util Dark silver", + ['18'] = "Util Silver", + ['19'] = "Util Gun Metal", + ['20'] = "Util Shadow Silver", + ['21'] = "Worn Black", + ['22'] = "Worn Graphite", + ['23'] = "Worn Silver Grey", + ['24'] = "Worn Silver", + ['25'] = "Worn Blue Silver", + ['26'] = "Worn Shadow Silver", + ['27'] = "Metallic Red", + ['28'] = "Metallic Torino Red", + ['29'] = "Metallic Formula Red", + ['30'] = "Metallic Blaze Red", + ['31'] = "Metallic Graceful Red", + ['32'] = "Metallic Garnet Red", + ['33'] = "Metallic Desert Red", + ['34'] = "Metallic Cabernet Red", + ['35'] = "Metallic Candy Red", + ['36'] = "Metallic Sunrise Orange", + ['37'] = "Metallic Classic Gold", + ['38'] = "Metallic Orange", + ['39'] = "Matte Red", + ['40'] = "Matte Dark Red", + ['41'] = "Matte Orange", + ['42'] = "Matte Yellow", + ['43'] = "Util Red", + ['44'] = "Util Bright Red", + ['45'] = "Util Garnet Red", + ['46'] = "Worn Red", + ['47'] = "Worn Golden Red", + ['48'] = "Worn Dark Red", + ['49'] = "Metallic Dark Green", + ['50'] = "Metallic Racing Green", + ['51'] = "Metallic Sea Green", + ['52'] = "Metallic Olive Green", + ['53'] = "Metallic Green", + ['54'] = "Metallic Gasoline Blue Green", + ['55'] = "Matte Lime Green", + ['56'] = "Util Dark Green", + ['57'] = "Util Green", + ['58'] = "Worn Dark Green", + ['59'] = "Worn Green", + ['60'] = "Worn Sea Wash", + ['61'] = "Metallic Midnight Blue", + ['62'] = "Metallic Dark Blue", + ['63'] = "Metallic Saxony Blue", + ['64'] = "Metallic Blue", + ['65'] = "Metallic Mariner Blue", + ['66'] = "Metallic Harbor Blue", + ['67'] = "Metallic Diamond Blue", + ['68'] = "Metallic Surf Blue", + ['69'] = "Metallic Nautical Blue", + ['70'] = "Metallic Bright Blue", + ['71'] = "Metallic Purple Blue", + ['72'] = "Metallic Spinnaker Blue", + ['73'] = "Metallic Ultra Blue", + ['74'] = "Metallic Bright Blue", + ['75'] = "Util Dark Blue", + ['76'] = "Util Midnight Blue", + ['77'] = "Util Blue", + ['78'] = "Util Sea Foam Blue", + ['79'] = "Uil Lightning blue", + ['80'] = "Util Maui Blue Poly", + ['81'] = "Util Bright Blue", + ['82'] = "Matte Dark Blue", + ['83'] = "Matte Blue", + ['84'] = "Matte Midnight Blue", + ['85'] = "Worn Dark blue", + ['86'] = "Worn Blue", + ['87'] = "Worn Light blue", + ['88'] = "Metallic Taxi Yellow", + ['89'] = "Metallic Race Yellow", + ['90'] = "Metallic Bronze", + ['91'] = "Metallic Yellow Bird", + ['92'] = "Metallic Lime", + ['93'] = "Metallic Champagne", + ['94'] = "Metallic Pueblo Beige", + ['95'] = "Metallic Dark Ivory", + ['96'] = "Metallic Choco Brown", + ['97'] = "Metallic Golden Brown", + ['98'] = "Metallic Light Brown", + ['99'] = "Metallic Straw Beige", + ['100'] = "Metallic Moss Brown", + ['101'] = "Metallic Biston Brown", + ['102'] = "Metallic Beechwood", + ['103'] = "Metallic Dark Beechwood", + ['104'] = "Metallic Choco Orange", + ['105'] = "Metallic Beach Sand", + ['106'] = "Metallic Sun Bleeched Sand", + ['107'] = "Metallic Cream", + ['108'] = "Util Brown", + ['109'] = "Util Medium Brown", + ['110'] = "Util Light Brown", + ['111'] = "Metallic White", + ['112'] = "Metallic Frost White", + ['113'] = "Worn Honey Beige", + ['114'] = "Worn Brown", + ['115'] = "Worn Dark Brown", + ['116'] = "Worn straw beige", + ['117'] = "Brushed Steel", + ['118'] = "Brushed Black Steel", + ['119'] = "Brushed Aluminium", + ['120'] = "Chrome", + ['121'] = "Worn Off White", + ['122'] = "Util Off White", + ['123'] = "Worn Orange", + ['124'] = "Worn Light Orange", + ['125'] = "Metallic Securicor Green", + ['126'] = "Worn Taxi Yellow", + ['127'] = "Police Car Blue", + ['128'] = "Matte Green", + ['129'] = "Matte Brown", + ['130'] = "Worn Orange", + ['131'] = "Matte White", + ['132'] = "Worn White", + ['133'] = "Worn Olive Army Green", + ['134'] = "Pure White", + ['135'] = "Hot Pink", + ['136'] = "Salmon pink", + ['137'] = "Metallic Vermillion Pink", + ['138'] = "Orange", + ['139'] = "Green", + ['140'] = "Blue", + ['141'] = "Mettalic Black Blue", + ['142'] = "Metallic Black Purple", + ['143'] = "Metallic Black Red", + ['144'] = "hunter green", + ['145'] = "Metallic Purple", + ['146'] = "Metallic Dark Blue", + ['147'] = "Black", + ['148'] = "Matte Purple", + ['149'] = "Matte Dark Purple", + ['150'] = "Metallic Lava Red", + ['151'] = "Matte Forest Green", + ['152'] = "Matte Olive Drab", + ['153'] = "Matte Desert Brown", + ['154'] = "Matte Desert Tan", + ['155'] = "Matte Foilage Green", + ['156'] = "Default Alloy Color", + ['157'] = "Epsilon Blue", + ['158'] = "Pure Gold", + ['159'] = "Brushed Gold", + ['160'] = "MP100" + } + +end) diff --git a/resources/[ps]/ps-dispatch/fxmanifest.lua b/resources/[ps]/ps-dispatch/fxmanifest.lua new file mode 100644 index 0000000..f76444a --- /dev/null +++ b/resources/[ps]/ps-dispatch/fxmanifest.lua @@ -0,0 +1,30 @@ +fx_version 'cerulean' +game 'gta5' + +version '0.0' +description 'https://github.com/Project-Sloth/ps-dispatch' + +shared_scripts { + 'config.lua', + 'locales/locales.lua', +} + +client_scripts{ + 'client/cl_main.lua', + 'client/cl_events.lua', + 'client/cl_extraalerts.lua', + 'client/cl_commands.lua', + 'client/cl_loops.lua', +} +server_script { + 'server/sv_dispatchcodes.lua', + 'server/sv_main.lua' +} + +ui_page 'ui/index.html' + +files { + 'ui/index.html', + 'ui/app.js', + 'ui/style.css', +} diff --git a/resources/[ps]/ps-dispatch/locales/locales.lua b/resources/[ps]/ps-dispatch/locales/locales.lua new file mode 100644 index 0000000..ee309f0 --- /dev/null +++ b/resources/[ps]/ps-dispatch/locales/locales.lua @@ -0,0 +1,63 @@ +Locales = { + ['da'] = { + ['unknown_caller'] = "Opkalder Ukendt", + ['caller_unknown'] = "Ukendt", + ['caller_local'] = "Lokal Borger", + ['call_from'] = "Opkald fra ", + ['two_door'] = "To-dørs ", + ['three_door'] = "Tre-dørs ", + ['four_door'] = "Fire-dørs ", + ['compact'] = "Compact", + ['sedan'] = "Sedan", + ['suv'] = "SUV", + ['coupe'] = "Coupe", + ['muscle'] = "Muskelbil", + ['sports_classic'] = "Klasikker", + ['sports'] = "Sportsbil", + ['super'] = "Superbil", + ['motorcycle'] = "Motorcykel", + ['offroad'] = "Off-road", + ['industrial'] = "Industriel", + ['utility'] = "Utility køretøj", + ['van'] = "Van", + ['service'] = "Service køretøj", + ['military'] = "Militær køretøj", + ['truck'] = "Lastbil", + + -- Meter Robbery + ['meterrobbery'] = "Meter Robbery", + -- ATM Robbery + ['atmrobbery'] = "Hæveautomat røveri", + + -- DISPATCH MESSAGES + ['vehicleshots'] = "Skud affyret fra køretøj", + ['melee'] = "Slås kamp i gang", + ['shooting'] = "Skyderi i gang", + ['driveby'] = "Drive-by skyderi", + ['speeding'] = "Uansvarlig kørsel", + ['autotheft'] = "Tyveri af et køretøj", + ['officerdown'] = "KOLLEGA SKADET", + ['persondown'] = "Personen er såret", + ['storerobbery'] = "Røveri i butik", + ['fleecabank'] = "Fleeca Bank røveri", + ['paletobank'] = "Paleto Bank røveri", + ['pacificbank'] = "Pacific Bank røveri", + ['prisonbreak'] = "Fangeflugt i gang", + ['vangelico'] = "Vangelico røveri", + ['houserobbery'] = "Hus røveri", + ['drugsell'] = "Mistænkelig handel", + ['carjacking'] = "Biltyveri", + ['vehicletheft'] = "Køretøjstyveri", + ['emsdown'] = "EMS nede", + ['artgalleryrobbery'] = "Kunstgalleri røveri", + ['humanerobbery'] = "Humane Labs røveri", + ['trainrobbery'] = "Tog røveri", + ['vanrobbery'] = "Sikkerheds Van røveri", + ['underground'] = "Bunker røveri", + ['drugboatrobbery'] = "Mistænkelig båd", + ['unionrobbery'] = "Union Depository røveri", + ['carboosting'] = "Bil Boosting i gang", + ['yachtheist'] = "Yacht Røveri i gang", + ['susactivity'] = "Mistænkelig aktivitet", + } +} diff --git a/resources/[ps]/ps-dispatch/server/sv_dispatchcodes.lua b/resources/[ps]/ps-dispatch/server/sv_dispatchcodes.lua new file mode 100644 index 0000000..6a1e916 --- /dev/null +++ b/resources/[ps]/ps-dispatch/server/sv_dispatchcodes.lua @@ -0,0 +1,90 @@ + +--[[ + ["vehicleshots"] -> dispatchcodename that you pass with the event of AlertGunShot + displayCode -> Code to be displayed on the blip message + description -> Description of the blip message + radius -> to draw a circle with radius around blip ( the number need to have a .0 behind it, for example 150.0 or 75.0 ) + -> if u want to have the radius without the blip just make the blipScale = 0 + -> if u want to have the radius centered, disable the offset + recipientList -> list of job names that can see the blip + blipSprite -> blip sprite + blipColour -> blip colour + blipScale -> blip scale + blipLength -> time in seconds at which the blip will fade down, lower the time, faster it will fade. Cannot be 0 + offset -> enable or disable the offset for the radius ( radius on 0 and offset on true does nothing ) + blipflash -> enable or disable the flashing blip +]]-- + +dispatchCodes = { + + ["vehicleshots"] = {displayCode = '10-13', description = "Skud affyret fra køretøj", radius = 0, recipientList = {'police'}, blipSprite = 119, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["shooting"] = {displayCode = '10-13', description ="Skud affyret", radius = 0, recipientList = {'police'}, blipSprite = 110, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["speeding"] = {displayCode = '10-13', description = "Overtrædelse af fartgrænse", radius = 0, recipientList = {'police'}, blipSprite = 326, blipColour = 84, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["fight"] = {displayCode = '10-10', description = "Igangværende slåskamp", radius = 0, recipientList = {'police'}, blipSprite = 685, blipColour = 69, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["civdown"] = {displayCode = '10-69', description = "Civil nede", radius = 0, recipientList = {'ambulance'}, blipSprite = 126, blipColour = 3, blipScale = 1.5, blipLength = 2, sound = "dispatch", offset = "false", blipflash = "false"}, + + ["civdead"] = {displayCode = '10-69', description = "Civil afgået ved døden", radius = 0, recipientList = {'ambulance'}, blipSprite = 126, blipColour = 3, blipScale = 1.5, blipLength = 2, sound = "dispatch", offset = "false", blipflash = "false"}, + + ["114call"] = {displayCode = '114', description = "114 opkald", radius = 0, recipientList = {'police', 'ambulance'}, blipSprite = 480, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["112call"] = {displayCode = '112', description = "112 opkald", radius = 0, recipientList = {'police', 'ambulance'}, blipSprite = 480, blipColour = 3, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["officerdown"] = {displayCode = '10-99', description = "BETJENT NEDE", radius = 15.0, recipientList = {'police', 'ambulance'}, blipSprite = 526, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "panicbutton", offset = "false", blipflash = "true"}, + + ["emsdown"] = {displayCode = '10-99', description = "EMS NEDE", radius = 15.0, recipientList = {'police', 'ambulance'}, blipSprite = 526, blipColour = 3, blipScale = 1.5, blipLength = 2, sound = "panicbutton", offset = "false", blipflash = "true"}, + + ["storerobbery"] = {displayCode = '10-90', description = "Butiksrøveri igang", radius = 0, recipientList = {'police'}, blipSprite = 52, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["bankrobbery"] = {displayCode = '10-90', description = "Fleeca Bank røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 500, blipColour = 2, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["paletobankrobbery"] = {displayCode = '10-90', description = "Paleto Bank røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 500, blipColour = 12, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["pacificbankrobbery"] = {displayCode = '10-90', description = "Pacific Bank røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 500, blipColour = 5, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["prisonbreak"] = {displayCode = '10-90', description = "Fængselsflugt igang", radius = 0, recipientList = {'police'}, blipSprite = 189, blipColour = 59, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["vangelicorobbery"] = {displayCode = '10-90', description = "Vangelico røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 434, blipColour = 5, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["houserobbery"] = {displayCode = '10-90', description = "House røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 40, blipColour = 5, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["suspicioushandoff"] = {displayCode = '10-60', description = "Mistænkelig levering", radius = 120.0, recipientList = {'police'}, blipSprite = 469, blipColour = 52, blipScale = 0, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "true", blipflash = "false"}, + + ["yachtheist"] = {displayCode = '10-65', description = "Yacht Heist igang", radius = 0, recipientList = {'police'}, blipSprite = 455, blipColour = 60, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["vehicletheft"] = {displayCode = '10-35', description = "Car Theft igang", radius = 0, recipientList = {'police'}, blipSprite = 595, blipColour = 60, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["signrobbery"] = {displayCode = '10-35', description = "Skiltetyveri", radius = 0, recipientList = {'police'}, blipSprite = 358, blipColour = 60, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["susactivity"] = {displayCode = '10-66', description = "Mistænkelig aktivitet", radius = 0, recipientList = {'police'}, blipSprite = 66, blipColour = 37, blipScale = 0.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + -- Meter Robbery + ["meterrobbery"] = {displayCode = '10-90', description = "Parkeringsmeter røveri igang", radius = 0, recipientList = {'LEO', 'police'}, blipSprite = 500, clipColour = 1, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "FTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + -- ATM Robbery + ["atmrobbery"] = {displayCode = '10-90', description = "ATM røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 500, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + + -- Rainmad Heists + + ["artgalleryrobbery"] = {displayCode = '10-90', description = "Kunstgalleri røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 269, blipColour = 59, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["humanelabsrobbery"] = {displayCode = '10-90', description = "Humane Labs røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 499, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["trainrobbery"] = {displayCode = '10-90', description = "Togrøveri igang", radius = 0, recipientList = {'police'}, blipSprite = 667, blipColour = 78, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["vanrobbery"] = {displayCode = '10-90', description = "Pengetransport røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 67, blipColour = 59, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["undergroundrobbery"] = {displayCode = '10-90', description = "Undergrundstunnel røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 486, blipColour = 59, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["drugboatrobbery"] = {displayCode = '10-31', description = "Mistænkelig aktivitet på båd", radius = 0, recipientList = {'police'}, blipSprite = 427, blipColour = 26, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["unionrobbery"] = {displayCode = '10-90', description = "Union Depository røveri igang", radius = 0, recipientList = {'police'}, blipSprite = 500, blipColour = 60, blipScale = 1.5, blipLength = 2, sound = "robberysound", offset = "false", blipflash = "false"}, + + ["carboosting"] = {displayCode = '10-50', description = "Carboosting igang", radius = 0, recipientList = {'police'}, blipSprite = 595, blipColour = 60, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["carjack"] = {displayCode = '10-35', description = "Biltyveri igang", radius = 0, recipientList = {'police'}, blipSprite = 595, blipColour = 60, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, + + ["explosion"] = {displayCode = '10-80', description = "Eksplosion meldt", radius = 0, recipientList = {'police'}, blipSprite = 436, blipColour = 1, blipScale = 1.5, blipLength = 2, sound = "Lose_1st", sound2 = "GTAO_FM_Events_Soundset", offset = "false", blipflash = "false"}, +} \ No newline at end of file diff --git a/resources/[ps]/ps-dispatch/server/sv_main.lua b/resources/[ps]/ps-dispatch/server/sv_main.lua new file mode 100644 index 0000000..63d65fa --- /dev/null +++ b/resources/[ps]/ps-dispatch/server/sv_main.lua @@ -0,0 +1,133 @@ +local QBCore = exports['qb-core']:GetCoreObject() +local calls = {} + +function _U(entry) + return Locales[Config.Locale][entry] +end + +local function IsPoliceJob(job) + for k, v in pairs(Config.PoliceJob) do + if job == v then + return true + end + end + return false +end + +local function IsDispatchJob(job) + for k, v in pairs(Config.PoliceAndAmbulance) do + if job == v then + return true + end + end + return false +end + +RegisterServerEvent("dispatch:server:notify", function(data) + local newId = #calls + 1 + calls[newId] = data + calls[newId]['source'] = source + calls[newId]['callId'] = newId + calls[newId]['units'] = {} + calls[newId]['responses'] = {} + calls[newId]['time'] = os.time() * 1000 + + TriggerClientEvent('dispatch:clNotify', -1, data, newId, source) + if not data.alert then + TriggerClientEvent("ps-dispatch:client:AddCallBlip", -1, data.origin, dispatchCodes[data.dispatchcodename], newId) + else + TriggerClientEvent("ps-dispatch:client:AddCallBlip", -1, data.origin, data.alert, newId) + end +end) + +function GetDispatchCalls() return calls end +exports('GetDispatchCalls', GetDispatchCalls) -- + +-- this is mdt call +AddEventHandler("dispatch:addUnit", function(callid, player, cb) + if calls[callid] then + if #calls[callid]['units'] > 0 then + for i=1, #calls[callid]['units'] do + if calls[callid]['units'][i]['cid'] == player.cid then + cb(#calls[callid]['units']) + return + end + end + end + + if IsPoliceJob(player.job.name) then + calls[callid]['units'][#calls[callid]['units']+1] = { cid = player.cid, fullname = player.fullname, job = 'Police', callsign = player.callsign } + elseif player.job.name == 'ambulance' then + calls[callid]['units'][#calls[callid]['units']+1] = { cid = player.cid, fullname = player.fullname, job = 'EMS', callsign = player.callsign } + end + cb(#calls[callid]['units']) + end +end) + +AddEventHandler("dispatch:sendCallResponse", function(player, callid, message, time, cb) + local Player = QBCore.Functions.GetPlayer(player) + local name = Player.PlayerData.charinfo.firstname.. " " ..Player.PlayerData.charinfo.lastname + if calls[callid] then + calls[callid]['responses'][#calls[callid]['responses']+1] = { + name = name, + message = message, + time = time + } + local player = calls[callid]['source'] + if GetPlayerPing(player) > 0 then + TriggerClientEvent('dispatch:getCallResponse', player, message) + end + cb(true) + else + cb(false) + end +end) + +-- this is mdt call +AddEventHandler("dispatch:removeUnit", function(callid, player, cb) + if calls[callid] then + if #calls[callid]['units'] > 0 then + for i=1, #calls[callid]['units'] do + if calls[callid]['units'][i]['cid'] == player.cid then + calls[callid]['units'][i] = nil + end + end + end + cb(#calls[callid]['units']) + end +end) + + +RegisterCommand('togglealerts', function(source, args, user) + local source = source + local Player = QBCore.Functions.GetPlayer(source) + local job = Player.PlayerData.job + if IsPoliceJob(job.name) or job.name == 'ambulance' then + TriggerClientEvent('dispatch:manageNotifs', source, args[1]) + end +end, false) + +-- Explosion Handler +local ExplosionCooldown = false +AddEventHandler('explosionEvent', function(source, info) + if ExplosionCooldown then return end + + for i = 1, (#Config.ExplosionTypes) do + if info.explosionType == Config.ExplosionTypes[i] then + TriggerClientEvent("ps-dispatch:client:Explosion", source) + ExplosionCooldown = true + SetTimeout(1500, function() + ExplosionCooldown = false + end) + end + end +end) + +QBCore.Commands.Add("cdb", "Fjern alle dispatch-blips", {}, false, function(source, args) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local job = Player.PlayerData.job.name + if IsDispatchJob(job) then + TriggerClientEvent('ps-dispatch:client:clearAllBlips', src) + end +end) diff --git a/resources/[ps]/ps-dispatch/sounds/dispatch.ogg b/resources/[ps]/ps-dispatch/sounds/dispatch.ogg new file mode 100644 index 0000000..784fbb2 Binary files /dev/null and b/resources/[ps]/ps-dispatch/sounds/dispatch.ogg differ diff --git a/resources/[ps]/ps-dispatch/sounds/panicbutton.ogg b/resources/[ps]/ps-dispatch/sounds/panicbutton.ogg new file mode 100644 index 0000000..807fd34 Binary files /dev/null and b/resources/[ps]/ps-dispatch/sounds/panicbutton.ogg differ diff --git a/resources/[ps]/ps-dispatch/sounds/robberysound.ogg b/resources/[ps]/ps-dispatch/sounds/robberysound.ogg new file mode 100644 index 0000000..8f1ebc0 Binary files /dev/null and b/resources/[ps]/ps-dispatch/sounds/robberysound.ogg differ diff --git a/resources/[ps]/ps-dispatch/ui/app.js b/resources/[ps]/ps-dispatch/ui/app.js new file mode 100644 index 0000000..327d7c2 --- /dev/null +++ b/resources/[ps]/ps-dispatch/ui/app.js @@ -0,0 +1,165 @@ + +$(document).ready(() => { + window.addEventListener('message', function (event) { + let data = event.data; + if (data.update == "newCall") { + addNewCall(data.callID, data.timer, data.data, data.isPolice); + }; + }); +}); + +const MONTH_NAMES = [ + 'Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', + 'Juli', 'August', 'September', 'Oktober', 'November', 'December' +]; + +function getFormattedDate(date, prefomattedDate = false, hideYear = false) { + const day = date.getDate(); + const month = MONTH_NAMES[date.getMonth()]; + const year = date.getFullYear(); + const hours = date.getHours(); + let minutes = date.getMinutes(); + + if (minutes < 10) { + minutes = `0${minutes}`; + } + + if (prefomattedDate) { + return `${prefomattedDate} kl. ${hours}:${minutes}`; + } + + if (hideYear) { + return `${day}. ${month} kl. ${hours}:${minutes}`; + } + + return `${day}. ${month} ${year}. kl. ${hours}:${minutes}`; +} + +function timeAgo(dateParam) { + if (!dateParam) { + return null; + } + + const date = typeof dateParam === 'object' ? dateParam : new Date(dateParam); + const DAY_IN_MS = 86400000; + const today = new Date(); + const yesterday = new Date(today - DAY_IN_MS); + const seconds = Math.round((today - date) / 1000); + const minutes = Math.round(seconds / 60); + const isToday = today.toDateString() === date.toDateString(); + const isYesterday = yesterday.toDateString() === date.toDateString(); + const isThisYear = today.getFullYear() === date.getFullYear(); + + if (seconds < 5) { + return 'Lige nu'; + } else if (seconds < 60) { + return `${seconds} sekunder siden`; + } else if (seconds < 90) { + return 'Omkring et minut siden'; + } else if (minutes < 60) { + return `${minutes} minutter siden`; + } else if (isToday) { + return getFormattedDate(date, 'I dag'); + } else if (isYesterday) { + return getFormattedDate(date, 'I går'); + } else if (isThisYear) { + return getFormattedDate(date, false, true); + } + + return getFormattedDate(date); +} + +function addNewCall(callID, timer, info, isPolice) { + const prio = info['priority'] + let DispatchItem; + if (info['isDead']){ + DispatchItem = `

#${callID}
${info.dispatchCode}
${info.dispatchMessage}
` + } + else{ + DispatchItem = `
#${callID}
${info.dispatchCode}
${info.dispatchMessage}
` + } + + + // Above we are defining a default dispatch item and then we will append the data we have been sent. + + if (info['time']) { + DispatchItem += `
${timeAgo(info['time'])}
` + } + + + + if (info['firstStreet']) { + DispatchItem += `
${info['plate']}
` + } else if (info['plate']) { + DispatchItem += `
${info['number']}
` + } else if (info['number']) { + DispatchItem += `
{ + $(`.${callID}`).addClass("animate__backOutRight"); + setTimeout(() => { + $(`.${callID}`).remove(); + }, 1000); + }, timer || 4500); +}; diff --git a/resources/[ps]/ps-dispatch/ui/index.html b/resources/[ps]/ps-dispatch/ui/index.html new file mode 100644 index 0000000..e18b3d5 --- /dev/null +++ b/resources/[ps]/ps-dispatch/ui/index.html @@ -0,0 +1,24 @@ + + + + + + + + QB Dispatch + + + + + + + + + +
+
+
+
+ + + \ No newline at end of file diff --git a/resources/[ps]/ps-dispatch/ui/style.css b/resources/[ps]/ps-dispatch/ui/style.css new file mode 100644 index 0000000..8b419b6 --- /dev/null +++ b/resources/[ps]/ps-dispatch/ui/style.css @@ -0,0 +1,198 @@ +@import url('https://api.hawk.quest/fonts/SF-Pro-Rounded-Regular.woff2'); +body { + font-family: 'SF Pro Rounded Regular'; + overflow: hidden; + /* display: none; */ + text-shadow: 1px 1px 1px rgb(0 0 0 / 32%); +} + +::-webkit-scrollbar { + width: 0px; +} + +.dispatch-container { + width: 100%; + height: 100%; + position: absolute; + display: flex; +} + +.dispatch-holder { + width: 48vh; + height: 50vh; + margin: auto; + margin-top: 21.75vh; + margin-right: 3vh; + display: flex; + flex-direction: column; + overflow-y: scroll; +} + +.dispatch-item { + /* -webkit-text-stroke: 0.1mm black; */ + /* background-image: url('https://web.archive.org/web/20231211222955/https://cdn.discordapp.com/attachments/1021510724754878484/1043206485620043777/imageedit_6_2893157692.png'); */ + background-size: 28px; + background-repeat: no-repeat; + /* background-position-x: right; + background-position-y: top; */ + background-position: right 2% bottom 87%; + /* border-radius: 5px; */ + margin: auto; + margin-top: 5vh; + margin-right: 1vh; + margin-bottom: .5vh; + background-color: #1401019c; + border-right: .75vh solid rgba(217, 249, 255, 0.671); + min-width: 45.5vh; + width: fit-content; + height: fit-content; + border-radius: 1.1vh; +} + +.dispatch-item-true { + background-color: #00030594; +} + +.dispatch-item-false { + background-color: rgba(119, 20, 20, 0.911); + border-right: .75vh solid rgb(255, 0, 0); +} + +.dispatch-item-officer { + background-color: rgb(97, 3, 11); +} + +.top-info-holder { + scale: 0.5px; + width: 95%; + height: fit-content; + margin: unset; + margin-top: .75vh; + margin-left: .75vh; + align-items: center; + display: flex; + flex-direction: row; + color: white; + font-size: 1vh; + white-space: nowrap; +} + +.call-id { + background-color: #93f167; + padding: .35vh; + padding-bottom: 0.4vh; + padding-left: 1vh; + padding-right: 1vh; + margin-top: auto; + margin-bottom: auto; + margin-left: 0vh; + margin-right: 0.4vh; + border-radius: 1vh; + text-align: center; + color: black; +} + +.call-code { + background-color: #000b0e; + padding: .35vh; + padding-bottom: 0.4vh; + padding-left: 1vh; + padding-right: 1vh; + margin-top: auto; + margin-bottom: auto; + margin-left: 0vh; + margin-right: 0.5vh; + border-radius: 1vh; + text-align: center; +} + +.call-name { + margin-top: auto; + margin-bottom: auto; + margin-left: 0vh; + margin-right: auto; + border-radius: 1vh; + text-align: left; + font-size: 1.4vh; + overflow: hidden; + text-overflow: ellipsis; + text-transform: uppercase; +} + +.bottom-info-holder { + -webkit-text-stroke: 0.01mm black; + width: 95%; + height: fit-content; + margin: auto; + margin-top: .75vh; + margin-bottom: .6vh; + align-items: center; + display: flex; + flex-direction: column; + color: white; + font-size: 1.2vh; + font-weight: bold; + white-space: nowrap; + text-align: left; +} + +.call-bottom-info { + margin: auto; + margin-left: 0vh; + margin-bottom: .5vh; + text-align: left; + overflow: wrap; + white-space: normal; +} + +.line { + background-color: rgb(0, 4, 7); + height: 0.05vh; + width: 100%; + margin-top: 0.1vh; + margin-bottom: 0.1vh +} + +.call-bottom-information { + margin-top: 0.5vh; +} + +.fas { + margin-right: .5vh; +} + +.fab { + margin-right: .5vh; +} + +.far { + margin-right: .5vh; +} + +.fab { + margin-right: .5vh; +} + +.priority-1 { + background: linear-gradient(270deg, #b70000, #00020a); + background-size: 400% 400%; + animation: gradient 3s ease infinite; + background-color: #000b0e00; +} + +.priority-2 { + background-color: #ff2e2e; + color: black; +} + +@keyframes gradient { + 0% { + background-position: 0% 50% + } + 50% { + background-position: 100% 50% + } + 100% { + background-position: 0% 50% + } +} \ No newline at end of file diff --git a/resources/[ps]/ps-dispatch/ui/style.rar b/resources/[ps]/ps-dispatch/ui/style.rar new file mode 100644 index 0000000..714c60e Binary files /dev/null and b/resources/[ps]/ps-dispatch/ui/style.rar differ diff --git a/resources/[ps]/ps-housing/.gitattributes b/resources/[ps]/ps-housing/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/resources/[ps]/ps-housing/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/resources/[ps]/ps-housing/.github/ISSUE_TEMPLATE/bug_report.md b/resources/[ps]/ps-housing/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..891c617 --- /dev/null +++ b/resources/[ps]/ps-housing/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/resources/[ps]/ps-housing/.gitignore b/resources/[ps]/ps-housing/.gitignore new file mode 100644 index 0000000..9bea433 --- /dev/null +++ b/resources/[ps]/ps-housing/.gitignore @@ -0,0 +1,2 @@ + +.DS_Store diff --git a/resources/[ps]/ps-housing/LICENSE b/resources/[ps]/ps-housing/LICENSE new file mode 100644 index 0000000..0b012b2 --- /dev/null +++ b/resources/[ps]/ps-housing/LICENSE @@ -0,0 +1,458 @@ +Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) +https://creativecommons.org/licenses/by-nc-sa/4.0/ + +This is a human-readable summary of (and not a substitute for) the license. Disclaimer. + +You are free to: + +Share — copy and redistribute the material in any medium or format +Adapt — remix, transform, and build upon the material + +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: +Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. + +NonCommercial — You may not use the material for commercial purposes. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +Notices: +You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/resources/[ps]/ps-housing/README.md b/resources/[ps]/ps-housing/README.md new file mode 100644 index 0000000..bebff89 --- /dev/null +++ b/resources/[ps]/ps-housing/README.md @@ -0,0 +1,344 @@ +# ps-housing + +ps-housing is a resource that opens up a world of creative possibilities for housing. Its user-friendly interface lets you decorate any location to your heart's content. The best part? Not only is it completely free, but it's also reliable and functional, unlike many other housing systems available. Dive in and start transforming spaces with ps-housing today! + +ps-housing owes its existence to the exceptional coding expertise of [Xirvin#0985](https://github.com/ImXirvin). His application of top-tier coding practices has been instrumental in creating this script. We at Project Sloth are thrilled that he has joined our team and utilized our platform to deliver this incredible, much-anticipated resource. Our sincere appreciation goes out to [Xirvin#0985](https://github.com/ImXirvin) for his outstanding contribution! + +# Preview [ps-housing](https://github.com/Project-Sloth/ps-housing) +![image](https://github.com/Project-Sloth/ps-housing/assets/82112471/07b7f8c6-38ea-4f8c-95b6-9bd6bafbbd09) +![image](https://github.com/Project-Sloth/ps-housing/assets/82112471/163ae847-5a44-48cb-89f5-e0c1e7b59383) +![image](https://github.com/Project-Sloth/ps-housing/assets/82112471/655d9bb6-6c6d-4676-b4e0-f4368f3325a9) +![image](https://github.com/Project-Sloth/ps-housing/assets/82112471/fc632975-c2f6-41fb-89cd-a984679f1a41) + +# Preview [ps-realtor](https://github.com/Project-Sloth/ps-realtor) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/24e4018a-cb97-42b0-81df-3b0236c7e2dc) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/4d8ece54-ace1-4ffc-b8fb-90274bc94e72) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/188d259c-4c0f-4c91-905c-bf9b826cc518) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/9e033984-45f2-449d-ba6c-bb8742ac08bd) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/0dd078b8-a941-4316-b9e1-26c696023139) + +# Usage +- Players can decorate their houses and apartments with a full selection of furniture and decorations (included a wide variety of custom housing props) +- Provides support for housing and apartments and is a full replacement for qb-apartments and qb-housing + - When a player first spawns after enabling ps-housing, they will have to choose an apartment. Once they spawn in the stashitems from their previous qb-apartment will be migrated to their new apartment stash. +- Allows players to purchase and list houses for sale through `ps-realtor` and the realtor job +- Houses come with personal garages +- Houses and apartments come with personal wardrobes and stashes +- Players can share keys to their houses and apartments with other players + +## Creating a new property for sale +Players must have the realtor job to create new properties. Additionally if the realtor has a high enough grade level, they can also help players move to new apartments. +All properties must be manually configured for sale by the realtor job, giving you full control over all aspects of properties, and bringing another avenue of roleplay to your server. + +- Pick the location where you want to create a new property +- Use `/housing` to open the housing menu +- Click on create new property +- Fill out the details of the property (name, price, description, which shell to use, etc) +- Choose the door location (this is where the person will enter the house) + - Ensure that you place it up against a wall, since players will use target to enter the house +- Choose the garage location + - This point is used both for storing vehicles, as well as the location where the vehicle will spawn when taken out of the garage +- Realtors can edit the details of the property by clicking on the property in the housing menu +- Players can see the properties for sale through the /housing menu as well + +## Furnish and decorate a property +Once inside the property, the player can furnish and decorate the property to their liking. They can also invite other players to their property, and give them access to the property. Open the furniture store by pressing `Z`. + +This will open a furniture store complete with all of the props. Select an item from the catalog and place it into the property. You can use the placement gizmo to position the item to your liking as well as use the UI tools for fine tune control over the placement. Once you are happy with the positioning, make sure you press `Add to Cart` before moving on. Continue to add as many items as you want to your cart. Once you are done, go to the `Checkout` and purchase the items. + +> Note: The place on ground button sometimes does not work properly depending on where the native detects the ground to be. + +## Dynamic Doors + +Dynamic Doors will turn placed doors into actual working doors, Instead of them being static. (See videos below) + +### Preview + +https://github.com/complexza/ps-housing/assets/74205343/72cfc135-2f78-42b3-a540-45f02567b6d7 + +https://github.com/complexza/ps-housing/assets/74205343/0ff26e7f-1341-45fc-8fc6-d65421dec0b2 + +### Setup +- You will need to set the `Config.DynamicDoors = true` +- You will have to add this convar into your server.cfg `setr game_enableDynamicDoorCreation "true"` + +> Note: The convar has to be in your server.cfg in order for the doors to be dynamic! + +### Shell Support +* [K4MB1](https://github.com/Project-Sloth/ps-housing/wiki/K4MB1-Shells-Support-&-Offsets) + +# Important + +* Players need to place their [stash](https://github.com/Project-Sloth/ps-housing/blob/7efd2009050b9a20969877cf69b284352a9309bf/shared/config.lua#LL426C96-L426C96) and [wardrobe](https://github.com/Project-Sloth/ps-housing/blob/7efd2009050b9a20969877cf69b284352a9309bf/shared/config.lua#L427) or else they wont have one. Check [Config](https://github.com/Project-Sloth/ps-housing/blob/7efd2009050b9a20969877cf69b284352a9309bf/shared/config.lua#L422) for more information. + +* This entire README is meant for compatibility with default QBCore scripts. If you have different scripts, you'll need to adjust them for compatibility yourself. Refrain from asking us how to circumvent paid scripts that can't be adjusted for ps-housing support. Instead, request their support for ps-housing - this script is fully open source for that reason. Any inquiries related to this be ignored. + +# Installation +## PAY ATTENTION TO EACH STEP. DO NOT SKIP ANY. + +1. Find the following events in `qb-multicharacter` and change in server/main.lua event to: + +`qb-multicharacter > server > main.lua` +```lua +RegisterNetEvent('qb-multicharacter:server:loadUserData', function(cData) + local src = source + if QBCore.Player.Login(src, cData.citizenid) then + repeat + Wait(10) + until hasDonePreloading[src] + print('^2[qb-core]^7 '..GetPlayerName(src)..' (Citizen ID: '..cData.citizenid..') has succesfully loaded!') + QBCore.Commands.Refresh(src) + TriggerClientEvent('ps-housing:client:setupSpawnUI', src, cData) + TriggerEvent("qb-log:server:CreateLog", "joinleave", "Loaded", "green", "**".. GetPlayerName(src) .. "** (<@"..(QBCore.Functions.GetIdentifier(src, 'discord'):gsub("discord:", "") or "unknown").."> | ||" ..(QBCore.Functions.GetIdentifier(src, 'ip') or 'undefined') .. "|| | " ..(QBCore.Functions.GetIdentifier(src, 'license') or 'undefined') .." | " ..cData.citizenid.." | "..src..") loaded..") + end +end) +``` + +`qb-multicharacter > server > main.lua` +```lua +RegisterNetEvent('qb-multicharacter:server:createCharacter', function(data) + local src = source + local newData = {} + newData.cid = data.cid + newData.charinfo = data + if QBCore.Player.Login(src, false, newData) then + repeat + Wait(10) + until hasDonePreloading[src] + print('^2[qb-core]^7 '..GetPlayerName(src)..' has succesfully loaded!') + QBCore.Commands.Refresh(src) + TriggerClientEvent("qb-multicharacter:client:closeNUI", src) + newData.citizenid = QBCore.Functions.GetPlayer(src).PlayerData.citizenid + TriggerClientEvent('ps-housing:client:setupSpawnUI', src, newData) + GiveStarterItems(src) + end +end) +``` +2. Find the following events in `qb-spawn` and change in client/client.lua event to: + +`qb-spawn > client.lua > line 51 > 'qb-spawn:client:setupSpawns' event` +```lua +RegisterNetEvent('qb-spawn:client:setupSpawns', function(cData, new, apps) + if not new then + QBCore.Functions.TriggerCallback('qb-spawn:server:getOwnedHouses', function(houses) + local myHouses = {} + if houses ~= nil then + for i = 1, (#houses), 1 do + local house = houses[i] + + myHouses[#myHouses+1] = { + house = house, + label = (house.apartment or house.street) .. " " .. house.property_id, + } + end + end + + Wait(500) + SendNUIMessage({ + action = "setupLocations", + locations = QB.Spawns, + houses = myHouses, + isNew = new + }) + end, cData.citizenid) + elseif new then + SendNUIMessage({ + action = "setupAppartements", + locations = apps, + isNew = new + }) + end +end) +``` + +`qb-spawn > client.lua > line 134 > 'chooseAppa' NUI Callback` +```lua +RegisterNUICallback('chooseAppa', function(data, cb) + local ped = PlayerPedId() + local appaYeet = data.appType + SetDisplay(false) + DoScreenFadeOut(500) + Wait(100) + FreezeEntityPosition(ped, false) + RenderScriptCams(false, true, 0, true, true) + SetCamActive(cam, false) + DestroyCam(cam, true) + SetCamActive(cam2, false) + DestroyCam(cam2, true) + SetEntityVisible(ped, true) + Wait(500) + TriggerServerEvent('QBCore:Server:OnPlayerLoaded') + TriggerEvent('QBCore:Client:OnPlayerLoaded') + Wait(100) + TriggerServerEvent("ps-housing:server:createNewApartment", appaYeet) + cb('ok') +end) +``` + +`qb-spawn > client > client.lua > line 169 'spawnplayer' NUI Callback` +```lua +RegisterNUICallback('spawnplayer', function(data, cb) + local location = tostring(data.spawnloc) + local type = tostring(data.typeLoc) + local ped = PlayerPedId() + local PlayerData = QBCore.Functions.GetPlayerData() + local insideMeta = PlayerData.metadata["inside"] + if type == "current" then + PreSpawnPlayer() + QBCore.Functions.GetPlayerData(function(pd) + ped = PlayerPedId() + SetEntityCoords(ped, pd.position.x, pd.position.y, pd.position.z) + SetEntityHeading(ped, pd.position.a) + FreezeEntityPosition(ped, false) + end) + TriggerServerEvent('QBCore:Server:OnPlayerLoaded') + TriggerEvent('QBCore:Client:OnPlayerLoaded') + if insideMeta.property_id ~= nil then + local property_id = insideMeta.property_id + TriggerServerEvent('ps-housing:server:enterProperty', tostring(property_id)) + end + PostSpawnPlayer() + elseif type == "house" then + PreSpawnPlayer() + TriggerServerEvent('QBCore:Server:OnPlayerLoaded') + TriggerEvent('QBCore:Client:OnPlayerLoaded') + local property_id = data.spawnloc.property_id + TriggerServerEvent('ps-housing:server:enterProperty', tostring(property_id)) + PostSpawnPlayer() + elseif type == "normal" then + local pos = QB.Spawns[location].coords + PreSpawnPlayer() + SetEntityCoords(ped, pos.x, pos.y, pos.z) + TriggerServerEvent('QBCore:Server:OnPlayerLoaded') + TriggerEvent('QBCore:Client:OnPlayerLoaded') + TriggerServerEvent('ps-housing:server:resetMetaData') + SetEntityCoords(ped, pos.x, pos.y, pos.z) + SetEntityHeading(ped, pos.w) + PostSpawnPlayer() + end + cb('ok') +end) +``` + +`qb-spawn > server.lua > line 3` +```lua +QBCore.Functions.CreateCallback('qb-spawn:server:getOwnedHouses', function(_, cb, cid) + if cid ~= nil then + local houses = MySQL.query.await('SELECT * FROM properties WHERE owner_citizenid = ?', {cid}) + if houses[1] ~= nil then + cb(houses) + else + cb({}) + end + else + cb({}) + end +end) +``` + +3. Find the following events in `qb-garages` and change: +`qb-garages > server > main.lua > around line 120` on event `qb-garage:server:checkOwnership` + +Replace +```lua +local hasHouseKey = exports['qb-houses']:hasKey(result[1].license, result[1].citizenid, house) +``` +With +```lua +local hasHouseKey = exports['ps-housing']:IsOwner(src, house) +``` + +`qb-garages > client > main.lua > around line 451` under event `qb-garages:client:addHouseGarage` +```lua +RegisterNetEvent('qb-garages:client:removeHouseGarage', function(house) + Config.HouseGarages[house] = nil +end) +``` + +4. Run the `properties.sql` file, but be cautious. If a table named `properties` already exists in your database, this operation will drop it, resulting in the loss of all its data. + +5. Delete default [qb-apartments](https://github.com/qbcore-framework/qb-apartments) + +6. Delete default [qb-houses](https://github.com/qbcore-framework/qb-houses) + +7. Delete `qb-apartments/config.lua` references in `qb-spawn`, `qb-multicharacter` and `qb-phone` fxmanifest.lua (and any other scripts that may reference it). + +8. Ensure ps-realtor above ps-housing. + +9. In your server.cfg, add `ensure ox_lib` above all other resources + +10. Install the dependencies below. + +## Migrating houses and apartments from qb-houses and qb-apartments + +1. From a client run the `migratehouses` command to automatically convert all houses from qb-houses. It will print a message to the console once complete. + **The `migratehouses` command MUST be run from a client in order to retrieve street and region data for each house** + +2. From a client or server console run the `migrateapartments` command to automatically convert all apartments from qb-apartments. It will print a message to the console once complete. + +## Resolving the "Foreign key constraint is incorrectly formed" Issue + +If you come across an error such as `Foreign key constraint is incorrectly formed` while importing the `properties.sql` into your database, follow these steps to fix it. + +1. Open your database in HeidiSQL. +2. Right-click on your database name and select "Edit." +3. Locate the database collation setting take a note of it. +4. You will need to format the `properties.sql` file to match your database collation. + +If your database collation is set to `utf8mb4_general_ci`, modify the last line of the `properties.sql` file using VSCode or in HeidiSQL's query tab to the following: + +```sql +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +``` +This adjustment ensures that `properties.sql` file's character set and collation match that of your database, effectively resolving the issue. + +## Item Limits System + +1. Choose an item you want to limit under `Config.Furniture` in under `shared/config.lua` +2. Add `["max"] = 3` or the number of your choice to the item (see example below) +```lua +{ ["object"] = "v_res_r_figcat", ["price"] = 300, ["max"] = 2, ["label"] = "Fig Cat" }, +``` + +## Logs System Setup + +1. Go to `qb-smallresources/server/logs.lua` and add this: +```lua + ['pshousing'] = 'yourdiscordwebhookhere', +``` +2. Create a webhook for the channel you want the logs to show up in. +3. Replace the placeholder with your webhook link. + +> This system only supports qb-core for now. + +## Add new Shells + +1. Copy the files from the shell into the `ps-housing/stream` folder. +2. Add the new shell into the Config.Shells in `ps-housing/shared/config.lua`. + +# Dependency +1. [ps-realtor](https://github.com/Project-Sloth/ps-realtor) +2. [five-freecam](https://github.com/Deltanic/fivem-freecam) +3. [ox_lib](https://github.com/overextended/ox_lib/releases) - Use the latest release. If you do not use the latest release, MAKE SURE TO BUILD THE UI. Find their docs [here](https://overextended.dev/ox_lib#building-the-ui) on how to build the UI. +4. [ox_target](https://github.com/overextended/ox_target) or [qb-target](https://github.com/qbcore-framework/qb-target) - Change in [Config](https://github.com/Project-Sloth/ps-housing/blob/3c0f197b6d639f13235598393c84aac8d23d5f7a/shared/config.lua#L8), default is qb-target. + +## For reference your server.cfg should be ensured like below: +* We highly recommend making a folder named [ps-housing] and add `ps-realtor`, `fivem-freecam`, `ox_lib`, `ps-core`, `ps-housing` inside the folder. + +``` +ensure ox_lib +ensure ps-housing +ensure ps-realtor +ensure fivem-freecam +``` + +# Notes +- If a player is in their apartment/house and an admin does a "Bring to me" function, they will not see the player nor will the player see anyone else. This is because the player is still in their own unique routing bucket. **Workaround**: To fix this, the player must go back into their apartment and leave on their own. + - Likewise, if an admin tries to "Go to" or "Spectate" a player that is in their apartment/house, the admin will not be able to see the apartment or player because it is in a different routing bucket. +# Credits +* [Xirvin](https://github.com/ImXirvin) +* [BackSH00TER](https://github.com/backsh00ter) +* [Byte Labs Project](https://github.com/Byte-Labs-Project) +* [Project Sloth Team](https://discord.gg/projectsloth) +* [K4MB1](https://www.k4mb1maps.com/) +* [Candrex](https://github.com/CandrexDev) \ No newline at end of file diff --git a/resources/[ps]/ps-housing/client/apartment.lua b/resources/[ps]/ps-housing/client/apartment.lua new file mode 100644 index 0000000..1c42a64 --- /dev/null +++ b/resources/[ps]/ps-housing/client/apartment.lua @@ -0,0 +1,171 @@ +-- TBH I should have learnt how lua inheritance worked instead of making a new class but oh well. Maybe next time + +Apartment = { + apartmentData = {}, + apartments = {}, + + entranceTarget = nil, + blip = nil, +} +Apartment.__index = Apartment + +function Apartment:new(apartmentData) + local self = setmetatable({}, Apartment) + self.apartmentData = apartmentData + self.apartments = {} + + self:RegisterPropertyEntrance() + self:CreateBlip() + return self +end + +function Apartment:RegisterPropertyEntrance() + local door = self.apartmentData.door + local targetName = string.format("%s_apartment",self.apartmentData.label) + + -- not sure why but referencing self directy runs it when registering the zones + local function enterApartment() + self:EnterApartment() + end + + local function seeAll() + self:GetMenuForAll() + end + + local function seeAllToRaid() + self:GetMenuForAllToRaid() + end + + local size = vector3(door.length, door.width, 3.0) + local heading = door.h + + Framework[Config.Target].AddApartmentEntrance(door, size, heading, self.apartmentData.label, enterApartment, seeAll, seeAllToRaid, targetName) +end + +function Apartment:EnterApartment() + for propertyId, _ in pairs(self.apartments) do + local property = PropertiesTable[propertyId] + if property.owner then + TriggerServerEvent('ps-housing:server:enterProperty', propertyId) + return + end + end + + Framework[Config.Notify].Notify("Du har ingen lejlighed her.", "error") +end + +function Apartment:GetMenuForAll() + if next(self.apartments) == nil then + Framework[Config.Notify].Notify("Der er ingen lejligheder her.", "error") + return + end + + local id = "apartments-" .. self.apartmentData.label + local menu = { + id = id, + title = "Lejligheder", + options = {} + } + + for propertyId, _ in pairs(self.apartments) do + table.insert(menu.options,{ + title = self.apartmentData.label .. " " .. propertyId, + onSelect = function() + TriggerServerEvent('ps-housing:server:enterProperty', propertyId) + end, + }) + end + + lib.registerContext(menu) + lib.showContext(id) +end + +function Apartment:GetMenuForAllToRaid() + if next(self.apartments) == nil then + Framework[Config.Notify].Notify("Der er ingen lejligheder her.", "error") + return + end + + local id = "apartments-" .. self.apartmentData.label + local menu = { + id = id, + title = "Lejligheder til ransagning", + options = {} + } + + for propertyId, _ in pairs(self.apartments) do + table.insert(menu.options,{ + title = "Ransag " .. self.apartmentData.label .. " " .. propertyId, + onSelect = function() + TriggerServerEvent("ps-housing:server:raidProperty", propertyId) + end, + }) + end + + lib.registerContext(menu) + lib.showContext(id) +end + +function Apartment:CreateBlip(hasProperty) + self:DeleteBlip() + + local door = self.apartmentData.door + local blip = AddBlipForCoord(door.x, door.y, door.z) + + SetBlipSprite(blip, 475) + SetBlipScale(blip, 0.8) + + if hasProperty then + SetBlipColour(blip, 2) + else + SetBlipColour(blip, 4) + end + + SetBlipAsShortRange(blip, true) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(self.apartmentData.label) + EndTextCommandSetBlipName(blip) + self.blip = blip +end + +function Apartment:DeleteBlip() + if not self.blip then return end + RemoveBlip(self.blip) + self.blip = nil +end + +function Apartment:AddProperty(propertyId) + self.apartments[propertyId] = true + + local property = Property.Get(propertyId) + + if property ~= nil and property.owner then + self:CreateBlip(true) + end +end + +function Apartment:RemoveProperty(propertyId) + if not self:HasProperty(propertyId) then return end + self.apartments[propertyId] = nil + + local property = Property.Get(propertyId) + if property.owner then + self:CreateBlip(false) + end +end + +function Apartment:HasProperty(propertyId) + return self.apartments[propertyId] ~= nil +end + +function Apartment:RemoveApartment() + local targetName = string.format("%s_apartment",self.apartmentData.label) + Framework[Config.Target].RemoveTargetZone(targetName) + + self:DeleteBlip() + self = {} +end + +function Apartment.Get(apartmentName) + return ApartmentsTable[apartmentName] +end diff --git a/resources/[ps]/ps-housing/client/cl_property.lua b/resources/[ps]/ps-housing/client/cl_property.lua new file mode 100644 index 0000000..ffe4c2d --- /dev/null +++ b/resources/[ps]/ps-housing/client/cl_property.lua @@ -0,0 +1,741 @@ +Property = { + property_id = nil, + propertyData = nil, + + shell = nil, + shellData = nil, + inProperty = false, + shellObj = nil, + + has_access = false, + owner = false, + + storageTarget = nil, + clothingTarget = nil, + furnitureObjs = {}, + + garageZone = nil, + doorbellPool = {}, + + entranceTarget = nil, -- needed for ox target + exitTarget = nil, -- needed for ox target + + blip = nil, +} +Property.__index = Property + +function Property:new(propertyData) + local self = setmetatable({}, Property) + self.property_id = tostring(propertyData.property_id) + + -- Remove furnitures from property data for memory purposes + propertyData.furnitures = {} + self.propertyData = propertyData + + local citizenid = PlayerData.citizenid + + self.owner = propertyData.owner == citizenid + self.has_access = lib.table.contains(self.propertyData.has_access, citizenid) + + if propertyData.apartment then + local aptName = propertyData.apartment + local apartment = ApartmentsTable[aptName] + + if not apartment and Config.Apartments[aptName] then + ApartmentsTable[aptName] = Apartment:new(Config.Apartments[aptName]) + apartment = ApartmentsTable[aptName] + elseif not apartment then + Debug(aptName .. " not found in Config") + return + end + + apartment:AddProperty(self.property_id) + else + self:RegisterPropertyEntrance() + self:RegisterGarageZone() + end + + return self +end + +function Property:GetDoorCoords() + local coords = nil + + local dataApartment = self.propertyData.apartment + if dataApartment then + local apartment = dataApartment + coords = Config.Apartments[apartment].door + else + coords = self.propertyData.door_data + end + + return coords +end + +function Property:CreateShell() + local coords = self:GetDoorCoords() + + coords = vec3(coords.x, coords.y, coords.z - 25.0) + self.shell = Shell:CreatePropertyShell(self.propertyData.shell, coords) + + self.shellObj = self.shell.entity + + local doorOffset = self.shellData.doorOffset + local offset = GetOffsetFromEntityInWorldCoords(self.shellObj, doorOffset.x, doorOffset.y, doorOffset.z) + self:RegisterDoorZone(offset) + + SetEntityCoordsNoOffset(cache.ped, offset.x, offset.y, offset.z, false, false, true) + SetEntityHeading(cache.ped, self.shellData.doorOffset.h) +end + +function Property:RegisterDoorZone(offset) + local function leave() + self:LeaveShell() + end + + local function checkDoor() + self:OpenDoorbellMenu() + end + + local coords = offset + local size = vector3(1.0, self.shellData.doorOffset.width, 3.0) + local heading = self.shellData.doorOffset.h + + self.exitTarget = Framework[Config.Target].AddDoorZoneInside(coords, size, heading, leave, checkDoor) +end + +function Property:RegisterPropertyEntrance() + local door = self.propertyData.door_data + local size = vector3(door.length, door.width, 2.5) + local heading = door.h + --Can be anon functions but I like to keep them named its more readable + local function enter() + TriggerServerEvent("ps-housing:server:enterProperty", self.property_id) + end + + local function raid() + TriggerServerEvent("ps-housing:server:raidProperty", self.property_id) + end + + local function showcase() + TriggerServerEvent("ps-housing:server:showcaseProperty", self.property_id) + end + + local function showData() + local data = lib.callback.await("ps-housing:cb:getPropertyInfo", source, self.property_id) + if not data then return end + + local content = "**Ejer:** " .. data.owner .. " \n" .. "**Beskrivelse:** " .. data.description .. " \n" .. "**Gade:** " .. data.street .. " \n" .. "**Region:** " .. data.region .. " \n" .. "**Interiør:** " .. data.shell .. " \n" .. "**Til salg:** " .. (data.for_sale and "Ja" or "Nej") + + if data.for_sale then + content = content .. " \n" .. "**Pris:** " .. data.price.. ",-" + end + + lib.alertDialog({ + header = data.street .. " " .. data.property_id, + content = content, + centered = true, + }) + end + + local targetName = string.format("%s_%s", self.propertyData.street, self.property_id) + + self.entranceTarget = Framework[Config.Target].AddEntrance(door, size, heading, self.property_id, enter, raid, showcase, showData, targetName) + + if self.owner or self.has_access then + self:CreateBlip() + end +end + +function Property:UnregisterPropertyEntrance() + if not self.entranceTarget then return end + + Framework[Config.Target].RemoveTargetZone(self.entranceTarget) + self.entranceTarget = nil +end + +function Property:RegisterGarageZone() + if not next(self.propertyData.garage_data) then return end + + if not (self.has_access or self.owner) or not self.owner then + return + end + + local garageData = self.propertyData.garage_data + local garageName = string.format("property-%s-garage", self.property_id) + + local data = { + takeVehicle = { + x = garageData.x, + y = garageData.y, + z = garageData.z, + w = garageData.h + }, + type = "house", + label = self.propertyData.street .. self.property_id .. " Garage", + } + + TriggerEvent("qb-garages:client:addHouseGarage", self.property_id, data) + + self.garageZone = lib.zones.box({ + coords = vec3(garageData.x, garageData.y, garageData.z), + size = vector3(garageData.length + 5.0, garageData.width + 5.0, 3.5), + rotation = garageData.h, + debug = Config.DebugMode, + onEnter = function() + TriggerEvent('qb-garages:client:setHouseGarage', self.property_id, true) + end, + }) +end + +function Property:UnregisterGarageZone() + if not self.garageZone then return end + + TriggerEvent("qb-garages:client:removeHouseGarage", self.property_id) + + self.garageZone:remove() + self.garageZone = nil +end + +function Property:EnterShell() + DoScreenFadeOut(250) + TriggerServerEvent("InteractSound_SV:PlayOnSource", "houses_door_open", 0.25) + Wait(250) + + self.inProperty = true + + self.shellData = Config.Shells[self.propertyData.shell] + self:CreateShell() + + self:LoadFurnitures() + + self:GiveMenus() + + Wait(250) + DoScreenFadeIn(250) +end + +function Property:LeaveShell() + if not self.inProperty then return end + + DoScreenFadeOut(250) + TriggerServerEvent("InteractSound_SV:PlayOnSource", "houses_door_open", 0.25) + Wait(250) + + local coords = self:GetDoorCoords() + SetEntityCoordsNoOffset(cache.ped, coords.x, coords.y, coords.z, false, false, true) + + TriggerServerEvent("ps-housing:server:leaveProperty", self.property_id) + + self:UnloadFurnitures() + self.propertyData.furnitures = {} + + self.shell:DespawnShell() + self.shell = nil + if self.exitTarget then + Framework[Config.Target].RemoveTargetZone(self.exitTarget) + self.exitTarget = nil + end + + self:RemoveBlip() + + self:RemoveMenus() + + self.doorbellPool = {} + + self.inProperty = false + Wait(250) + DoScreenFadeIn(250) +end + +function Property:GiveMenus() + if not self.inProperty then return end + + local accessAndConfig = self.has_access and Config.AccessCanEditFurniture + + if self.owner or accessAndConfig then + Framework[Config.Radial].AddRadialOption( + "furniture_menu", + "Indretning", + "house-user", + function() + Modeler:OpenMenu(self.property_id) + end, + "ps-housing:client:openFurnitureMenu", + { propertyId = self.property_id } + ) + end + + if self.owner then + Framework[Config.Radial].AddRadialOption( + "access_menu", + "Ejendomsadgang", + "key", + function() + self:ManageAccessMenu() + end, + "ps-housing:client:openManagePropertyAccessMenu", + { propertyId = self.property_id } + ) + end +end + +function Property:RemoveMenus() + if not self.inProperty then return end + + Framework[Config.Radial].RemoveRadialOption("furniture_menu") + + if self.owner then + Framework[Config.Radial].RemoveRadialOption("access_menu") + end +end + +function Property:ManageAccessMenu() + if not self.inProperty then return end + + if not self.owner then + Framework[Config.Notify].Notify("Kun ejeren kan gøre dette.", "error") + return + end + + --Fuck qb-menu + local id = "property-" .. self.property_id .. "-access" + local menu = { + id = id, + title = "Administrer adgang", + options = {}, + } + + menu.options[#menu.options + 1] = { + title = "Giv Adgang", + onSelect = function() + self:GiveAccessMenu() + end, + } + + menu.options[#menu.options + 1] = { + title = "Fjern Adgang", + onSelect = function() + self:RevokeAccessMenu() + end, + } + + lib.registerContext(menu) + lib.showContext(id) +end + +function Property:GiveAccessMenu() + if not self.inProperty then return end + + if not self.owner then + return + end + + local id = "property-" .. self.property_id .. "-access-give" + local menu = { + id = id, + title = "Giv Adgang", + options = {}, + } + + local players = lib.callback.await("ps-housing:cb:getPlayersInProperty", source, self.property_id) or {} + + if #players > 0 then + for i = 1, #players do + local v = players[i] + menu.options[#menu.options + 1] = { + title = v.name, + description = "Giv Adgang", + onSelect = function() + TriggerServerEvent("ps-housing:server:addAccess", self.property_id, v.src) + end, + } + end + + lib.registerContext(menu) + lib.showContext(id) + else + Framework[Config.Notify].Notify("Der er ingen i boligen", "error") + end +end + +function Property:RevokeAccessMenu() + if not self.owner then + return + end + + local id = "property-" .. self.property_id .. "-access-already" + local alreadyAccessMenu = { + id = id, + title = "Revoke Access", + options = {}, + } + + local playersWithAccess = lib.callback.await("ps-housing:cb:getPlayersWithAccess", source, self.property_id) or {} + + -- only stores names and citizenids in a table so if their offline you can still remove them + if #playersWithAccess > 0 then + for i = 1, #playersWithAccess do + local v = playersWithAccess[i] + alreadyAccessMenu.options[#alreadyAccessMenu.options + 1] = { + title = v.name, + description = "Fjern Adgang", + onSelect = function() + TriggerServerEvent("ps-housing:server:removeAccess", self.property_id, v.citizenid) + end, + } + end + + lib.registerContext(alreadyAccessMenu) + lib.showContext(id) + else + Framework[Config.Notify].Notify("Ingen har adgang til denne ejendom", "error") + end +end + +function Property:OpenDoorbellMenu() + if not self.inProperty then return end + + if not next(self.doorbellPool) then + Framework[Config.Notify].Notify("Der er ingen ved døren", "error") + return + end + + local id = string.format("property-%s-doorbell", self.property_id) + local menu = { + id = id, + title = "Gæster ved døren", + options = {}, + } + + for k, v in pairs(self.doorbellPool) do + menu.options[#menu.options + 1] = { + title = v.name, + onSelect = function() + TriggerServerEvent( + "ps-housing:server:doorbellAnswer", + { targetSrc = v.src, property_id = self.property_id } + ) + end, + } + end + + lib.registerContext(menu) + lib.showContext(id) +end + +function Property:LoadFurniture(furniture) + local coords = GetOffsetFromEntityInWorldCoords(self.shellObj, furniture.position.x, furniture.position.y, furniture.position.z) + local hash = furniture.object + + lib.requestModel(hash) + local entity = CreateObjectNoOffset(hash, coords.x, coords.y, coords.z, false, true, false) + SetModelAsNoLongerNeeded(hash) + SetEntityRotation(entity, furniture.rotation.x, furniture.rotation.y, furniture.rotation.z, 2, true) + + if furniture.type == 'door' and Config.DynamicDoors then + Debug("Object: "..furniture.label.." wont be frozen") + else + FreezeEntityPosition(entity, true) + end + + if furniture.type and Config.FurnitureTypes[furniture.type] then + Config.FurnitureTypes[furniture.type](entity, self.property_id, self.propertyData.shell) + end + + self.furnitureObjs[#self.furnitureObjs + 1] = { + entity = entity, + id = furniture.id, + label = furniture.label, + object = furniture.object, + position = { + x = coords.x, + y = coords.y, + z = coords.z, + }, + rotation = furniture.rotation, + type = furniture.type, + } +end + +function Property:LoadFurnitures() + self.propertyData.furnitures = lib.callback.await('ps-housing:cb:getFurnitures', source, self.property_id) or {} + + for i = 1, #self.propertyData.furnitures do + local furniture = self.propertyData.furnitures[i] + self:LoadFurniture(furniture) + end +end + +function Property:UnloadFurniture(furniture, index) + local entity = furniture?.entity + if not entity then + for i = 1, #self.furnitureObjs do + if self.furnitureObjs[i]?.id and furniture?.id and self.furnitureObjs[i].id == furniture.id then + entity = self.furnitureObjs[i]?.entity + break + end + end + end + + if self.clothingTarget == entity or self.storageTarget == entity then + Framework[Config.Target].RemoveTargetEntity(entity) + + if self.clothingTarget == entity then + self.clothingTarget = nil + elseif self.storageTarget == entity then + self.storageTarget = nil + end + end + + if index and self.furnitureObjs?[index] then + table.remove(self.furnitureObjs, index) + else + for i = 1, #self.furnitureObjs do + if self.furnitureObjs[i]?.id and furniture?.id and self.furnitureObjs[i].id == furniture.id then + table.remove(self.furnitureObjs, i) + break + end + end + end + + DeleteObject(entity) +end + +function Property:UnloadFurnitures() + for i = 1, #self.furnitureObjs do + local furniture = self.furnitureObjs[i] + self:UnloadFurniture(furniture, i) + end + self.furnitureObjs = {} +end + +function Property:CreateBlip() + local door_data = self.propertyData.door_data + local blip = AddBlipForCoord(door_data.x, door_data.y, door_data.z) + if self.propertyData.garage_data.x ~= nil then + SetBlipSprite(blip, 492) + else + SetBlipSprite(blip, 40) + end + SetBlipScale(blip, 0.8) + SetBlipColour(blip, 2) + SetBlipAsShortRange(blip, true) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(self.propertyData.street .. " " .. self.property_id) + EndTextCommandSetBlipName(blip) + self.blip = blip +end + +function Property:RemoveBlip() + if not self.blip then return end + RemoveBlip(self.blip) + self.blip = nil +end + +function Property:RemoveProperty() + local targetName = string.format("%s_%s", self.propertyData.street, self.property_id) + + Framework[Config.Target].RemoveTargetZone(targetName) + + self:RemoveBlip() + + self:LeaveShell() + + --@@ comeback to this + -- Think it works now + if self.propertyData.apartment then + ApartmentsTable[self.propertyData.apartment]:RemoveProperty() + end + + self = nil +end + +local function findFurnitureDifference(new, old) + local added = {} + local removed = {} + + for i = 1, #new do + local found = false + for j = 1, #old do + if new[i].id == old[j].id then + found = true + break + end + end + if not found then + added[#added + 1] = new[i] + end + end + + for i = 1, #old do + local found = false + for j = 1, #new do + if old[i].id == new[j].id then + found = true + break + end + end + if not found then + removed[#removed + 1] = old[i] + end + end + + return added, removed +end + +-- I think this whole furniture sync is a bit shit, but I cbf thinking +function Property:UpdateFurnitures(newFurnitures) + if not self.inProperty then return end + + local oldFurnitures = self.propertyData.furnitures + local added, removed = findFurnitureDifference(newFurnitures, oldFurnitures) + + for i = 1, #added do + local furniture = added[i] + self:LoadFurniture(furniture) + end + + for i = 1, #removed do + local furniture = removed[i] + self:UnloadFurniture(furniture) + end + + self.propertyData.furnitures = newFurnitures + + Modeler:UpdateFurnitures() +end + +function Property:UpdateDescription(newDescription) + self.propertyData.description = newDescription +end + +function Property:UpdatePrice(newPrice) + self.propertyData.price = newPrice +end + +function Property:UpdateForSale(forSale) + self.propertyData.for_sale = forSale +end + +function Property:UpdateShell(newShell) + self:LeaveShell() + self.propertyData.shell = newShell + + if self.inProperty then + self:EnterShell() + end +end + +function Property:UpdateOwner(newOwner) + self.propertyData.owner = newOwner + + local citizenid = PlayerData.citizenid + + self.owner = newOwner == citizenid + + self:UnregisterGarageZone() + self:RegisterGarageZone() + + self:CreateBlip() + + if not self.inProperty then return end + + self:RemoveMenus() + self:GiveMenus() +end + +function Property:UpdateImgs(newImgs) + self.propertyData.imgs = newImgs +end + +function Property:UpdateDoor(newDoor, newStreet, newRegion) + self.propertyData.door_data = newDoor + self.propertyData.street = newStreet + self.propertyData.region = newRegion + + self:UnregisterPropertyEntrance() + self:RegisterPropertyEntrance() +end + +function Property:UpdateHas_access(newHas_access) + local citizenid = PlayerData.citizenid + self.propertyData.has_access = newHas_access + self.has_access = lib.table.contains(newHas_access, citizenid) + + if not self.inProperty then return end + + self:RemoveMenus() + self:GiveMenus() +end + +function Property:UpdateGarage(newGarage) + self.propertyData.garage_data = newGarage + + self:UnregisterGarageZone() + self:RegisterGarageZone() +end + +function Property:UpdateApartment(newApartment) + self:LeaveShell() + + local oldAptName = self.propertyData.apartment + local oldApt = ApartmentsTable[oldAptName] + if oldApt then + oldApt:RemoveProperty(self.property_id) + end + + self.propertyData.apartment = newApartment + + local newApt = ApartmentsTable[newApartment] + + if newApt then + newApt:AddProperty(self.property_id) + end + + TriggerEvent("ps-housing:client:updateApartment", oldAptName, newApartment) +end + +function Property.Get(property_id) + return PropertiesTable[tostring(property_id)] +end + +RegisterNetEvent("ps-housing:client:enterProperty", function(property_id) + local property = Property.Get(property_id) + + if property ~= nil then + property:EnterShell() + end +end) + +RegisterNetEvent("ps-housing:client:updateDoorbellPool", function(property_id, data) + local property = Property.Get(property_id) + property.doorbellPool = data +end) + +RegisterNetEvent("ps-housing:client:updateFurniture", function(property_id, furnitures) + local property = Property.Get(property_id) + if not property then return end + property:UpdateFurnitures(furnitures) +end) + +RegisterNetEvent("ps-housing:client:updateProperty", function(type, property_id, data) + local property = Property.Get(property_id) + + if not property then return end + + property[type](property, data) + + TriggerEvent("ps-housing:client:updatedProperty", property_id) +end) + +RegisterNetEvent("ps-housing:client:openFurnitureMenu", function(data) + Modeler:OpenMenu(data.options.propertyId) +end) + +RegisterNetEvent("ps-housing:client:openManagePropertyAccessMenu", function(data) + local property = Property.Get(data.options.propertyId) + if not property then return end + + property:ManageAccessMenu() +end) diff --git a/resources/[ps]/ps-housing/client/client.lua b/resources/[ps]/ps-housing/client/client.lua new file mode 100644 index 0000000..a10cd00 --- /dev/null +++ b/resources/[ps]/ps-housing/client/client.lua @@ -0,0 +1,157 @@ +QBCore = exports['qb-core']:GetCoreObject() +PlayerData = {} + +local function createProperty(property) + PropertiesTable[property.property_id] = Property:new(property) +end +RegisterNetEvent('ps-housing:client:addProperty', createProperty) + +RegisterNetEvent('ps-housing:client:removeProperty', function (property_id) + local property = Property.Get(property_id) + + if property then + property:RemoveProperty() + end + + PropertiesTable[property_id] = nil +end) + +function InitialiseProperties(properties) + Debug("Initialising properties") + PlayerData = QBCore.Functions.GetPlayerData() + + for k, v in pairs(Config.Apartments) do + ApartmentsTable[k] = Apartment:new(v) + end + + if not properties then + properties = lib.callback.await('ps-housing:server:requestProperties') + end + + for k, v in pairs(properties) do + createProperty(v.propertyData) + end + + TriggerEvent("ps-housing:client:initialisedProperties") + + Debug("Initialised properties") +end +AddEventHandler("QBCore:Client:OnPlayerLoaded", InitialiseProperties) +RegisterNetEvent('ps-housing:client:initialiseProperties', InitialiseProperties) + +AddEventHandler("onResourceStart", function(resourceName) -- Used for when the resource is restarted while in game + if (GetCurrentResourceName() == resourceName) then + InitialiseProperties() + end +end) + +RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job) + PlayerData.job = job +end) + +RegisterNetEvent('ps-housing:client:setupSpawnUI', function(cData) + DoScreenFadeOut(1000) + local result = lib.callback.await('ps-housing:cb:GetOwnedApartment', source, cData.citizenid) + if result then + TriggerEvent('qb-spawn:client:setupSpawns', cData, false, nil) + TriggerEvent('qb-spawn:client:openUI', true) + -- TriggerEvent("apartments:client:SetHomeBlip", result.type) + else + if Config.StartingApartment then + TriggerEvent('qb-spawn:client:setupSpawns', cData, true, Config.Apartments) + TriggerEvent('qb-spawn:client:openUI', true) + else + TriggerEvent('qb-spawn:client:setupSpawns', cData, false, nil) + TriggerEvent('qb-spawn:client:openUI', true) + end + end +end) + +AddEventHandler("onResourceStop", function(resourceName) + if (GetCurrentResourceName() == resourceName) then + if Modeler.IsMenuActive then + Modeler:CloseMenu() + end + + for k, v in pairs(PropertiesTable) do + v:RemoveProperty() + end + + for k, v in pairs(ApartmentsTable) do + v:RemoveApartment() + end + end +end) + +exports('GetProperties', function() + return PropertiesTable +end) + +exports('GetProperty', function(property_id) + return Property.Get(property_id) +end) + +exports('GetApartments', function() + return ApartmentsTable +end) + +exports('GetApartment', function(apartment) + return Apartment.Get(apartment) +end) + +exports('GetShells', function() + return Config.Shells +end) + + +lib.callback.register('ps-housing:cb:confirmPurchase', function(amount, street, id) + return lib.alertDialog({ + header = 'Bekræft Køb', + content = 'Er du sikker på at du vil købe '..street..' ' .. id .. ' for ' .. amount .. ' kr?', + centered = true, + cancel = true, + labels = { + confirm = "Køb", + cancel = "Annuller" + } + }) +end) + +lib.callback.register('ps-housing:cb:confirmRaid', function(street, id) + return lib.alertDialog({ + header = 'Ransag', + content = 'Vil du ransage '..street..' ' .. id .. '?', + centered = true, + cancel = true, + labels = { + confirm = "Ransag", + cancel = "Annuller" + } + }) +end) + +lib.callback.register('ps-housing:cb:ringDoorbell', function() + return lib.alertDialog({ + header = 'Ring på dørklokken', + content = 'Du har ingen nøgle her til, vil du ringe på dørklokken??', + centered = true, + cancel = true, + labels = { + confirm = "Ring", + cancel = "Annuller" + } + }) +end) + +lib.callback.register('ps-housing:cb:showcase', function() + return lib.alertDialog({ + header = 'Vis Ejendom', + content = 'Vil du have vist ejendommen?', + centered = true, + cancel = true, + labels = { + confirm = "Ja", + cancel = "Annuller" + } + }) +end) diff --git a/resources/[ps]/ps-housing/client/migrate.lua b/resources/[ps]/ps-housing/client/migrate.lua new file mode 100644 index 0000000..d9f8ba0 --- /dev/null +++ b/resources/[ps]/ps-housing/client/migrate.lua @@ -0,0 +1,6 @@ +lib.callback.register('ps-housing:client:getclientdata', function(data) + return { + street = GetStreetNameFromHashKey(GetStreetNameAtCoord(data.coords.x, data.coords.y, data.coords.z)), + region = GetLabelText(GetNameOfZone(data.coords.x, data.coords.y, data.coords.z)) + } +end) diff --git a/resources/[ps]/ps-housing/client/modeler.lua b/resources/[ps]/ps-housing/client/modeler.lua new file mode 100644 index 0000000..d2c8c56 --- /dev/null +++ b/resources/[ps]/ps-housing/client/modeler.lua @@ -0,0 +1,646 @@ +local Freecam = exports['fivem-freecam'] + +local function CamThread() + CreateThread(function() + local IsDisabledControlJustPressed = IsDisabledControlJustPressed + local DisableControlAction = DisableControlAction + while Modeler.IsFreecamMode do + if IsDisabledControlJustPressed(0, 26) then -- C + Modeler.IsFreecamMode = false + Modeler:FreecamMode(false) + break + end + DisableControlAction(0, 199, true) -- P + DisableControlAction(0, 200, true) -- ESC + Wait(0) + end + end) +end + +local function isInside(coords) + local extent = Modeler.shellMinMax + + local isX = coords.x >= extent.min.x and coords.x <= extent.max.x + local isY = coords.y >= extent.min.y and coords.y <= extent.max.y + local isZ = coords.z >= extent.min.z and coords.z <= extent.max.z + if isX and isY and isZ then + return true + end + + return false + +end + +local function getMinMax(shellPos, shellMin, shellMax) + local min = vector3(shellPos.x + shellMin.x, shellPos.y + shellMin.y, shellPos.z + shellMin.z) + local max = vector3(shellPos.x + shellMax.x, shellPos.y + shellMax.y, shellPos.z + shellMax.z) + + return {min = min, max = max} +end + + +AddEventHandler('freecam:onTick', function() + if not Modeler.IsFreecamMode then return end + + local update = true + local lookAt = Freecam:GetTarget(5.0) + local camPos = Freecam:GetPosition() + + -- see if camPos is the same as the last one + if Modeler.CurrentCameraPosition and Modeler.CurrentCameraLookAt then + local posX = Modeler.CurrentCameraPosition.x == camPos.x + local posY = Modeler.CurrentCameraPosition.y == camPos.y + local posZ = Modeler.CurrentCameraPosition.z == camPos.z + + local lookAtX = Modeler.CurrentCameraLookAt.x == lookAt.x + local lookAtY = Modeler.CurrentCameraLookAt.y == lookAt.y + local lookAtZ = Modeler.CurrentCameraLookAt.z == lookAt.z + + if posX and posY and posZ and lookAtX and lookAtY and lookAtZ then + return + end + end + + if not isInside(camPos) then + Freecam:SetPosition(Modeler.CurrentCameraPosition.x, Modeler.CurrentCameraPosition.y, Modeler.CurrentCameraPosition.z) + update = false + end + + if update then + Modeler.CurrentCameraLookAt = lookAt + Modeler.CurrentCameraPosition = camPos + end + + SendNUIMessage({ + action = "updateCamera", + data = { + cameraPosition = Modeler.CurrentCameraPosition, + cameraLookAt = Modeler.CurrentCameraLookAt, + } + }) +end) + + + + +-- WHERE THE ACTUAL CLASS STARTS + +Modeler = { + IsMenuActive = false, + IsFreecamMode = false, + + property_id = nil, + + shellPos = nil, + shellMinMax = nil, + + CurrentObject = nil, + CurrentCameraPosition = nil, + CurrentCameraLookAt = nil, + CurrentObjectAlpha = 200, + + Cart = {}, + + -- Hover stuff + IsHovering = false, + HoverObject = nil, + HoverDistance = 5.0, + + OpenMenu = function(self, property_id) + + + local property = Property.Get(property_id) + + if not property then return end + if not property.owner and not property.has_access then return end + if property.has_access and not Config.AccessCanEditFurniture then return end + + self.shellPos = GetEntityCoords(property.shellObj) + local min, max = GetModelDimensions(property.shellData.hash) + + self.shellMinMax = getMinMax(self.shellPos, min, max) + + self.property_id = property_id + self.IsMenuActive = true + + self:UpdateFurnitures() + + SendNUIMessage({ + action = "setVisible", + data = true + }) + + SendNUIMessage({ + action = "setFurnituresData", + data = Config.Furnitures + }) + + -- Owned furniture is set by the Property class + SetNuiFocus(true, true) + self:FreecamActive(true) + self:FreecamMode(false) + end, + + CloseMenu = function(self) + self.IsMenuActive = false + self:ClearCart() + + SendNUIMessage({ + action = "setOwnedItems", + data = {}, + }) + + SendNUIMessage({ + action = "setVisible", + data = false + }) + + SetNuiFocus(false, false) + + self:HoverOut() + self:StopPlacement() + self:FreecamActive(false) + + Wait(500) + + self.CurrentCameraPosition = nil + self.CurrentCameraLookAt = nil + self.CurrentObject = nil + self.property_id = nil + end, + + FreecamActive = function(self, bool) + if bool then + Freecam:SetActive(true) + Freecam:SetKeyboardSetting('BASE_MOVE_MULTIPLIER', 0.1) + Freecam:SetKeyboardSetting('FAST_MOVE_MULTIPLIER', 2) + Freecam:SetKeyboardSetting('SLOW_MOVE_MULTIPLIER', 2) + Freecam:SetFov(45.0) + self.IsFreecamMode = true + else + Freecam:SetActive(false) + --reset to default + Freecam:SetKeyboardSetting('BASE_MOVE_MULTIPLIER', 5) + Freecam:SetKeyboardSetting('FAST_MOVE_MULTIPLIER', 10) + Freecam:SetKeyboardSetting('SLOW_MOVE_MULTIPLIER', 10) + self.IsFreecamMode = false + end + end, + + FreecamMode = function(self, bool) + if bool then --not in UI + self.IsFreecamMode = true + CamThread() + Freecam:SetFrozen(false) + SetNuiFocus(false, false) + else -- in UI + self.IsFreecamMode = false + Freecam:SetFrozen(true) + SetNuiFocus(true, true) + SendNUIMessage({ + action = "freecamMode", + data = false + }) + end + end, + + StartPlacement = function(self, data) + self:HoverOut() -- stops the hover effect on the previous object because sometimes mouseleave doesnt work + local object = data.object + local curObject + local objectRot + local objectPos + + Modeler.CurrentCameraLookAt = Freecam:GetTarget(5.0) + Modeler.CurrentCameraPosition = Freecam:GetPosition() + + if data.entity then --if the object is already spawned + curObject = data.entity + objectPos = GetEntityCoords(curObject) + objectRot = GetEntityRotation(curObject) + else + self:StopPlacement() + lib.requestModel(object) + + curObject = CreateObject(GetHashKey(object), 0.0, 0.0, 0.0, false, true, false) + SetEntityCoords(curObject, self.CurrentCameraLookAt.x, self.CurrentCameraLookAt.y, self.CurrentCameraLookAt.z) + + objectRot = GetEntityRotation(curObject) + objectPos = self.CurrentCameraLookAt + end + + FreezeEntityPosition(curObject, true) + SetEntityCollision(curObject, false, false) + SetEntityAlpha(curObject, self.CurrentObjectAlpha, false) + SetEntityDrawOutline(curObject, true) + SetEntityDrawOutlineColor(255, 255, 255, 255) + SetEntityDrawOutlineShader(0) + + SendNUIMessage({ + action = "setObjectAlpha", + data = self.CurrentObjectAlpha + }) + + SendNUIMessage({ + action = "setupModel", + data = { + objectPosition = objectPos, + objectRotation = objectRot, + cameraPosition = self.CurrentCameraPosition, + cameraLookAt = self.CurrentCameraLookAt, + entity = data.entity, + } + }) + + SetNuiFocus(true, true) + self.CurrentObject = curObject + end, + + MoveObject = function (self, data) + local coords = vec3(data.x + 0.0, data.y + 0.0, data.z + 0.0) + if not isInside(coords) then + return + end + + SetEntityCoords(self.CurrentObject, coords) + -- get the current offset of this object in relation to the + end, + + RotateObject = function (self, data) + SetEntityRotation(self.CurrentObject, data.x + 0.0, data.y + 0.0, data.z + 0.0) + end, + + StopPlacement = function (self) + if self.CurrentObject == nil then return end + + local canDelete = true + for k, v in pairs(self.Cart) do + if k == self.CurrentObject then + canDelete = false + break + end + end + -- furnitureObjs + -- see if its an owned object + local property = PropertiesTable[self.property_id] + local ownedfurnitures = property.furnitureObjs + for i = 1, #ownedfurnitures do + if ownedfurnitures[i].entity == self.CurrentObject then + self:UpdateFurniture(ownedfurnitures[i]) + canDelete = false + break + end + end + + if canDelete then + DeleteEntity(self.CurrentObject) + end + + SetEntityDrawOutline(self.CurrentObject, false) + SetEntityAlpha(self.CurrentObject, 255, false) + self.CurrentObject = nil + end, + + UpdateFurnitures = function(self) + + if not self.IsMenuActive then + return + end + + if not self.property_id then return end + + local property = Property.Get(self.property_id) + + if not property then return end + if not property.owner and not property.has_access then return end + if property.has_access and not Config.AccessCanEditFurniture then return end + + + SendNUIMessage({ + action = "setOwnedItems", + data = property.furnitureObjs, + }) + end, + + -- can be better + -- everytime "Stop Placement" is pressed on an owned object, it will update the furniture + -- maybe should do it all at once when the user leaves the menu???? + UpdateFurniture = function (self, item) + local newPos = GetEntityCoords(item.entity) + local newRot = GetEntityRotation(item.entity) + + local offsetPos = { + x = math.floor((newPos.x - self.shellPos.x) * 10000) / 10000, + y = math.floor((newPos.y - self.shellPos.y) * 10000) / 10000, + z = math.floor((newPos.z - self.shellPos.z) * 10000) / 10000, + } + + local newFurniture = { + id = item.id, + label = item.label, + object = item.object, + position = offsetPos, + rotation = newRot, + type = item.type, + } + + TriggerServerEvent("ps-housing:server:updateFurniture", self.property_id, newFurniture) + end, + + SetObjectAlpha = function (self, data) + self.CurrentObjectAlpha = data.alpha + SetEntityAlpha(self.CurrentObject, self.CurrentObjectAlpha, false) + end, + + PlaceOnGround = function (self) + local x, y, z = table.unpack(GetEntityCoords(self.CurrentObject)) + local ground, z = GetGroundZFor_3dCoord(x, y, z, 0) + SetEntityCoords(self.CurrentObject, x, y, z) + + return {x = x, y = y, z = z} + end, + + SelectCartItem = function (self, data) + self:StopPlacement() + + if data ~= nil then + self:StartPlacement(data) + end + end, + + AddToCart = function (self, data) + local item = { + label = data.label, + object = data.object, + price = data.price, + entity = self.CurrentObject, + position = GetEntityCoords(self.CurrentObject), + rotation = GetEntityRotation(self.CurrentObject), + type = data.type, + } + + self.Cart[self.CurrentObject] = item + + SendNUIMessage({ + action = "addToCart", + data = item + }) + + self:StopPlacement() + self.CurrentObject = nil + end, + + RemoveFromCart = function (self, data) + local item = data + + if item ~= nil then + DeleteEntity(item.entity) + + SendNUIMessage({ + action = "removeFromCart", + data = item + }) + + self.Cart[data.entity] = nil + end + end, + + UpdateCartItem = function (self, data) + local item = self.Cart[data.entity] + + if item ~= nil then + item = data + end + end, + + ClearCart = function (self) + for _, v in pairs(self.Cart) do + DeleteEntity(v.entity) + end + + self.Cart = {} + SendNUIMessage({ + action = "clearCart" + }) + end, + + BuyCart = function (self) + local items = {} + local totalPrice = 0 + + -- If the cart is empty, return notify + if not next(self.Cart) then + Framework[Config.Notify].Notify("Din kurv er tom", "error") + return + end + + -- seperate loop to get total price so it doesnt have to do all that math for no reason + for _, v in pairs(self.Cart) do + totalPrice = totalPrice + v.price + end + + PlayerData = QBCore.Functions.GetPlayerData() + if PlayerData.money.cash < totalPrice and PlayerData.money.bank < totalPrice then + Framework[Config.Notify].Notify("Du har ikke nok penge!", "error") + return + end + + for _, v in pairs(self.Cart) do + + local offsetPos = { + x = math.floor((v.position.x - self.shellPos.x) * 10000) / 10000, + y = math.floor((v.position.y - self.shellPos.y) * 10000) / 10000, + z = math.floor((v.position.z - self.shellPos.z) * 10000) / 10000, + } + + local id = tostring(math.random(100000, 999999)..self.property_id) + + items[#items + 1] = { + id = id, + object = v.object, + label = v.label, + position = offsetPos, + rotation = v.rotation, + type = v.type, + } + end + + TriggerServerEvent("ps-housing:server:buyFurniture", self.property_id, items, totalPrice) + + self:ClearCart() + end, + + SetHoverDistance = function (self, data) + self.HoverDistance = data + 0.0 + end, + + HoverIn = function (self, data) + if self.HoverObject then + local tries = 0 + while DoesEntityExist(self.HoverObject) do + SetEntityAsMissionEntity(self.HoverObject, true, true) + DeleteEntity(self.HoverObject) + Wait(50) + tries = tries + 1 + if tries > 25 then + break + end + end + + self.HoverObject = nil + end + + local object = data.object and joaat(data.object) or nil + if object == nil then return end + lib.requestModel(object) + if self.HoverObject then return end + self.HoverObject = CreateObject(object, 0.0, 0.0, 0.0, false, false, false) + Modeler.CurrentCameraLookAt = Freecam:GetTarget(self.HoverDistance) + local camRot = Freecam:GetRotation() + + SetEntityCoords(self.HoverObject, self.CurrentCameraLookAt.x, self.CurrentCameraLookAt.y, self.CurrentCameraLookAt.z) + FreezeEntityPosition(self.HoverObject, true) + SetEntityCollision(self.HoverObject, false, false) + SetEntityRotation(self.HoverObject, 0.0, 0.0, camRot.z) + + self.IsHovering = true + while self.IsHovering do + local rot = GetEntityRotation(self.HoverObject) + SetEntityRotation(self.HoverObject, rot.x, rot.y, rot.z + 0.1) + Wait(0) + end + end, + + HoverOut = function (self) + if self.HoverObject == nil then return end + if self.HoverObject and self.HoverObject ~= 0 then + local tries = 0 + while DoesEntityExist(self.HoverObject) do + SetEntityAsMissionEntity(self.HoverObject, true, true) + DeleteEntity(self.HoverObject) + Wait(50) + tries = tries + 1 + if tries > 25 then + break + end + end + self.HoverObject = nil + end + self.IsHovering = false + end, + + SelectOwnedItem = function (self, data) + self:StopPlacement() + if data ~= nil then + self:StartPlacement(data) + end + end, + + RemoveOwnedItem = function (self, data) + local item = data + + if item ~= nil then + SendNUIMessage({ + action = "removeOwnedItem", + data = item + }) + + TriggerServerEvent("ps-housing:server:removeFurniture", self.property_id, item.id) + end + end, +} + +RegisterNUICallback("previewFurniture", function(data, cb) + Modeler:StartPlacement(data) + cb("ok") +end) + +RegisterNUICallback("moveObject", function(data, cb) + Modeler:MoveObject(data) + cb("ok") +end) + +RegisterNUICallback("rotateObject", function(data, cb) + Modeler:RotateObject(data) + cb("ok") +end) + +RegisterNUICallback("stopPlacement", function(data, cb) + Modeler:StopPlacement() + cb("ok") +end) + +RegisterNUICallback("setObjectAlpha", function(data, cb) + Modeler:SetObjectAlpha(data) + cb("ok") +end) + +RegisterNUICallback("hideUI", function(data, cb) + Modeler:CloseMenu() + cb("ok") +end) + +RegisterNUICallback("freecamMode", function(data, cb) + Modeler:FreecamMode(data) + cb("ok") +end) + +RegisterNUICallback("placeOnGround", function(data, cb) + local coords = Modeler:PlaceOnGround() + cb(coords) +end) + +RegisterNUICallback("selectCartItem", function(data, cb) + Modeler:SelectCartItem(data) + cb("ok") +end) + +RegisterNUICallback("addToCart", function(data, cb) + Modeler:AddToCart(data) + cb("ok") +end) + +RegisterNUICallback("removeCartItem", function(data, cb) + Modeler:RemoveFromCart(data) + cb("ok") +end) + +RegisterNUICallback("updateCartItem", function(data, cb) + Modeler:UpdateCartItem(data) + cb("ok") +end) + +RegisterNUICallback("buyCartItems", function(data, cb) + Modeler:BuyCart() + cb("ok") +end) + +RegisterNUICallback("hoverIn", function(data, cb) + Modeler:HoverIn(data) + cb("ok") +end) + +RegisterNUICallback("hoverOut", function(data, cb) + Modeler:HoverOut() + cb("ok") +end) + +RegisterNUICallback("setHoverDistance", function(data, cb) + Modeler:SetHoverDistance(data) + cb("ok") +end) + +RegisterNUICallback("selectOwnedItem", function(data, cb) + Modeler:SelectOwnedItem(data) + cb("ok") +end) + +RegisterNUICallback("removeOwnedItem", function(data, cb) + Modeler:RemoveOwnedItem(data) + cb("ok") +end) + +RegisterNUICallback("showNotification", function(data, cb) + Framework[Config.Notify].Notify(data.message, data.type) + cb("ok") +end) diff --git a/resources/[ps]/ps-housing/client/shell.lua b/resources/[ps]/ps-housing/client/shell.lua new file mode 100644 index 0000000..3c80c20 --- /dev/null +++ b/resources/[ps]/ps-housing/client/shell.lua @@ -0,0 +1,129 @@ +Shells = {} + + +Shell = { + entity = nil, + hash = nil, + position = nil, + rotation = nil, + shellData = nil, + oldCoord = nil, + + exitTarget = nil, +} +Shell.__index = Shell + + +function Shell:SpawnShell(shellHash, position, rotation) + lib.requestModel(shellHash) + + local entity = CreateObjectNoOffset(shellHash, position.x, position.y, position.z, false, false, false) + FreezeEntityPosition(entity, true) + + SetEntityRotation(entity, rotation, 2, true) + + SetModelAsNoLongerNeeded(shellHash) + + return entity +end + +function Shell:DespawnShell() + if DoesEntityExist(self.entity) then + DeleteEntity(self.entity) + end + + if self.exitTarget then + Framework[Config.Target].RemoveTargetZone(self.exitTarget) + end + self = nil +end + + +function Shell:CreatePropertyShell(shellName, position, rotation) + local self = setmetatable({}, Shell) + + self.shellData = Config.Shells[shellName] + self.hash = self.shellData.hash + self.position = position + self.rotation = rotation or vector3(0.0, 0.0, 0.0) + + self.entity = self:SpawnShell(self.hash, self.position, self.rotation) + + + return self +end + + +-- example of how to use +-- exports["ps-housing"]:CreateTempShell("Modern Hotel", GetEntityCoords(PlayerPedId()), GetEntityRotation(PlayerPedId()), function() +-- Framework[Config.Notify].Notify("You left the shell", "error") +-- local coords = GetEntityCoords(PlayerPedId()) +-- SetEntityCoordsNoOffset(PlayerPedId(), coords.x, coords.y, coords.z + 50.0, false, false, true) +-- end) +-- this is used as a constructor for third party scripts +function Shell:CreateTempShell(shellName, position, rotation, leaveCb) + local self = setmetatable({}, Shell) + self.shellData = Config.Shells[shellName] + self.hash = self.shellData.hash + self.position = position + self.rotation = rotation + + + DoScreenFadeOut(250) + Wait(250) + + self.oldCoord = GetEntityCoords(PlayerPedId()) + + self.entity = self:SpawnShell(self.hash, self.position, self.rotation) + + + local doorOffset = self.shellData.doorOffset + local offset = GetOffsetFromEntityInWorldCoords(self.entity, doorOffset.x, doorOffset.y, doorOffset.z) + + SetEntityCoordsNoOffset(cache.ped, offset.x, offset.y, offset.z, false, false, true) + SetEntityHeading(cache.ped, self.shellData.doorOffset.h) + + local coords = offset + local size = vector3(1.0, self.shellData.doorOffset.width, 3.0) + local heading = self.shellData.doorOffset.h + + local function leave() + DoScreenFadeOut(250) + Wait(250) + + SetEntityCoordsNoOffset(PlayerPedId(), self.oldCoord.x, self.oldCoord.y, self.oldCoord.z, false, false, true) + + if leaveCb then + leaveCb() + end + + self:DespawnShell() + + Wait(250) + DoScreenFadeIn(250) + end + + + self.exitTarget = Framework[Config.Target].AddDoorZoneInsideTempShell(coords, size, heading, leave) + + Wait(250) + DoScreenFadeIn(250) + + Shells[self.entity] = self + + return self.entity +end + +exports('CreateTempShell', function(shellName, position, rotation, leaveCb) + return Shell:CreateTempShell(shellName, position, rotation, leaveCb) +end) + +exports("GetShellData", function (shellName) + return Config.Shells[shellName] +end) + +exports("DespawnTempShell", function (shellEntity) + if Shells[shellEntity] then + Shells[shellEntity]:DespawnShell() + end +end) diff --git a/resources/[ps]/ps-housing/docs/pull_request_template.md b/resources/[ps]/ps-housing/docs/pull_request_template.md new file mode 100644 index 0000000..15670b1 --- /dev/null +++ b/resources/[ps]/ps-housing/docs/pull_request_template.md @@ -0,0 +1,15 @@ +# Overview +*Provide a brief overview of the purpose of this pull request* + +# Details +*Provide details on the change you are making, why they are necessary, and any information that will help with understanding.* + +# UI Changes / Functionality +*Include a before and after screenshot/recording if applicable. Short recordings showing that your changes work are helpful, but optional.* + +# Testing Steps +*Provide a list of repro steps on how to test that your changes are valid.* + +- [ ] Did you test the changes you made? +- [ ] Did you test core functionality of the script to ensure your changes do not regress other areas? +- [ ] Did you test your changes in multiplayer to ensure it works correctly on all clients? diff --git a/resources/[ps]/ps-housing/fxmanifest.lua b/resources/[ps]/ps-housing/fxmanifest.lua new file mode 100644 index 0000000..28bb477 --- /dev/null +++ b/resources/[ps]/ps-housing/fxmanifest.lua @@ -0,0 +1,47 @@ +fx_version 'cerulean' + +game "gta5" + +author "Xirvin#0985 and Project Sloth" +version '1.1.3' + +repository 'Project-Sloth/ps-housing' + +lua54 'yes' + +ui_page 'html/index.html' + +dependency 'fivem-freecam' + +shared_script { + '@ox_lib/init.lua', + "shared/config.lua", + "shared/framework.lua", + } + +client_script { + 'client/shell.lua', + 'client/apartment.lua', + 'client/cl_property.lua', + 'client/client.lua', + 'client/modeler.lua', + 'client/migrate.lua' +} + +server_script { + '@oxmysql/lib/MySQL.lua', + "server/sv_property.lua", + "server/server.lua", + "server/migrate.lua" + } + +files { + 'html/**', + 'stream/starter_shells_k4mb1.ytyp' +} + +this_is_a_map 'yes' +data_file 'DLC_ITYP_REQUEST' 'starter_shells_k4mb1.ytyp' + +file 'stream/**.ytyp' +data_file 'DLC_ITYP_REQUEST' 'stream/**.ytyp' diff --git a/resources/[ps]/ps-housing/html/index.css b/resources/[ps]/ps-housing/html/index.css new file mode 100644 index 0000000..3bfd4f8 --- /dev/null +++ b/resources/[ps]/ps-housing/html/index.css @@ -0,0 +1 @@ +div.svelte-11k92at{position:absolute;left:0;top:0}main.svelte-1fnr7mh{position:absolute;left:0;top:0;z-index:100;-webkit-user-select:none;-moz-user-select:none;user-select:none;box-sizing:border-box;padding:0;margin:0;height:100vh;width:100vw}.selected.svelte-vkl3yg{transform-origin:bottom;transform:scale(1.1);background-color:var(--color-primary);margin-right:.5rem;margin-left:.5rem}.categories.svelte-vkl3yg::-webkit-scrollbar{display:none}canvas.svelte-o3oskp{display:block}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::-webkit-backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.right-0{right:0px}.-top-\[65rem\]{top:-65rem}.top-0{top:0px}.left-0{left:0px}.left-1\/2{left:50%}.-bottom-\[24rem\]{bottom:-24rem}.bottom-\[3rem\]{bottom:3rem}.-top-\[5rem\]{top:-5rem}.top-\[4rem\]{top:4rem}.left-\[1\.5rem\]{left:1.5rem}.-left-\[30rem\]{left:-30rem}.-right-\[4rem\]{right:-4rem}.top-1\/2{top:50%}.right-\[1rem\]{right:1rem}.z-\[100\]{z-index:100}.z-\[1\]{z-index:1}.z-\[0\]{z-index:0}.z-\[1000\]{z-index:1000}.m-1{margin:.25rem}.ml-10{margin-left:2.5rem}.ml-2{margin-left:.5rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.aspect-square{aspect-ratio:1 / 1}.h-\[60rem\]{height:60rem}.h-\[73\%\]{height:73%}.h-\[4rem\]{height:4rem}.h-full{height:100%}.h-\[5rem\]{height:5rem}.h-\[4\.5rem\]{height:4.5rem}.h-fit{height:-webkit-fit-content;height:-moz-fit-content;height:fit-content}.h-\[24rem\]{height:24rem}.h-screen{height:100vh}.h-\[fit\]{height:fit}.h-\[3rem\]{height:3rem}.min-h-\[8rem\]{min-height:8rem}.w-\[40rem\]{width:40rem}.w-full{width:100%}.w-\[4rem\]{width:4rem}.w-\[20\%\]{width:20%}.w-\[79\%\]{width:79%}.w-fit{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.w-\[5rem\]{width:5rem}.w-\[4\.5rem\]{width:4.5rem}.w-\[30rem\]{width:30rem}.w-screen{width:100vw}.w-\[50rem\]{width:50rem}.w-\[97\%\]{width:97%}.w-\[8rem\]{width:8rem}.min-w-\[10rem\]{min-width:10rem}.max-w-full{max-width:100%}.origin-top{transform-origin:top}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.grid-flow-col-dense{grid-auto-flow:column dense}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-\[1rem\]{gap:1rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-\[2rem\]{gap:2rem}.gap-\[1vw\]{gap:1vw}.gap-\[2vw\]{gap:2vw}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-y-hidden{overflow-y:hidden}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.whitespace-nowrap{white-space:nowrap}.border-\[0\.3rem\]{border-width:.3rem}.bg-neutral-700{--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity))}.bg-\[color\:var\(--color-primary\)\]{background-color:var(--color-primary)}.bg-\[color\:var\(--color-secondary\)\]{background-color:var(--color-secondary)}.bg-\[color\:var\(--color-tertiary\)\]{background-color:var(--color-tertiary)}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.bg-opacity-50{--tw-bg-opacity: .5}.p-12{padding:3rem}.p-\[2rem\]{padding:2rem}.p-\[1vw\]{padding:1vw}.p-4,.p-\[1rem\]{padding:1rem}.p-\[0\.5rem\],.p-2{padding:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[1rem\]{padding-left:1rem;padding-right:1rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-\[2rem\]{padding-left:2rem;padding-right:2rem}.py-\[0\.5rem\]{padding-top:.5rem;padding-bottom:.5rem}.px-\[0\.1rem\]{padding-left:.1rem;padding-right:.1rem}.px-4{padding-left:1rem;padding-right:1rem}.text-center{text-align:center}.text-start{text-align:start}.text-\[2rem\]{font-size:2rem}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[1\.6rem\]{font-size:1.6rem}.text-\[1\.2rem\]{font-size:1.2rem}.text-\[2\.5rem\]{font-size:2.5rem}.font-medium{font-weight:500}.font-bold{font-weight:700}.font-semibold{font-weight:600}.text-\[color\:var\(--color-accent\)\]{color:var(--color-accent)}.text-\[color\:var\(--color-text\)\]{color:var(--color-text)}.text-\[white\],.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}*{margin:0;padding:0;font-family:Satoshi,sans-serif;color:#fff}*:focus{outline:none}:root{font-size:62.5%;--color-primary: #131313;--color-secondary: #1f2528;--color-tertiary: #26343a;--color-accent: #00889E}html,body{height:100vh;width:100vw;font-size:1.6rem;overflow:hidden}::-webkit-scrollbar{width:0px;height:0px}.scroll-style-horizontal::-webkit-scrollbar{height:.5rem;width:100%}.scroll-style-vertical::-webkit-scrollbar{width:.5rem;height:100%}.scroll-style::-webkit-scrollbar-track{background:whtie}.scroll-style::-webkit-scrollbar-thumb{background:var(--color-accent);border-radius:1rem}input#slider[type=range]{height:1rem;-webkit-appearance:none;width:100%}input#slider[type=range]::-webkit-slider-runnable-track{width:100%;height:2rem;cursor:pointer;background:var(--color-secondary)}input#slider[type=range]::-webkit-slider-thumb{height:2rem;width:2rem;background:white;cursor:pointer;-webkit-appearance:none}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)} diff --git a/resources/[ps]/ps-housing/html/index.html b/resources/[ps]/ps-housing/html/index.html new file mode 100644 index 0000000..1de30be --- /dev/null +++ b/resources/[ps]/ps-housing/html/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + ps-housing + + + + +
+ + + diff --git a/resources/[ps]/ps-housing/html/index.js b/resources/[ps]/ps-housing/html/index.js new file mode 100644 index 0000000..16e2cfc --- /dev/null +++ b/resources/[ps]/ps-housing/html/index.js @@ -0,0 +1,3441 @@ +const ou=function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function t(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerpolicy&&(s.referrerPolicy=i.referrerpolicy),i.crossorigin==="use-credentials"?s.credentials="include":i.crossorigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=t(i);fetch(i.href,s)}};ou();function St(){}function ho(r,e){for(const t in e)r[t]=e[t];return r}function rc(r){return r()}function Vo(){return Object.create(null)}function kt(r){r.forEach(rc)}function gs(r){return typeof r=="function"}function ft(r,e){return r!=r?e==e:r!==e||r&&typeof r=="object"||typeof r=="function"}function au(r){return Object.keys(r).length===0}function Co(r,...e){if(r==null)return St;const t=r.subscribe(...e);return t.unsubscribe?()=>t.unsubscribe():t}function Po(r){let e;return Co(r,t=>e=t)(),e}function Ee(r,e,t){r.$$.on_destroy.push(Co(e,t))}function xn(r,e,t,n){if(r){const i=sc(r,e,t,n);return r[0](i)}}function sc(r,e,t,n){return r[1]&&n?ho(t.ctx.slice(),r[1](n(e))):t.ctx}function Mn(r,e,t,n){if(r[2]&&n){const i=r[2](n(t));if(e.dirty===void 0)return i;if(typeof i=="object"){const s=[],o=Math.max(e.dirty.length,i.length);for(let a=0;a32){const e=[],t=r.ctx.length/32;for(let n=0;nr.removeEventListener(e,t,n)}function V(r,e,t){t==null?r.removeAttribute(e):r.getAttribute(e)!==t&&r.setAttribute(e,t)}function cs(r){return r===""?null:+r}function cu(r){return Array.from(r.childNodes)}function At(r,e){e=""+e,r.data!==e&&(r.data=e)}function Tn(r,e){r.value=e==null?"":e}function jo(r,e,t,n){t===null?r.style.removeProperty(e):r.style.setProperty(e,t,n?"important":"")}function ps(r,e,t){r.classList[t?"add":"remove"](e)}function uu(r,e,{bubbles:t=!1,cancelable:n=!1}={}){const i=document.createEvent("CustomEvent");return i.initCustomEvent(r,t,n,e),i}let Pr;function wr(r){Pr=r}function sr(){if(!Pr)throw new Error("Function called outside component initialization");return Pr}function or(r){sr().$$.on_mount.push(r)}function ut(r){sr().$$.on_destroy.push(r)}function _s(){const r=sr();return(e,t,{cancelable:n=!1}={})=>{const i=r.$$.callbacks[e];if(i){const s=uu(e,t,{cancelable:n});return i.slice().forEach(o=>{o.call(r,s)}),!s.defaultPrevented}return!0}}function pn(r,e){return sr().$$.context.set(r,e),e}function In(r){return sr().$$.context.get(r)}function $i(r,e){const t=r.$$.callbacks[e.type];t&&t.slice().forEach(n=>n.call(this,e))}const Hi=[],Vn=[];let Yi=[];const po=[],ac=Promise.resolve();let mo=!1;function lc(){mo||(mo=!0,ac.then(cc))}function Lr(){return lc(),ac}function go(r){Yi.push(r)}function vs(r){po.push(r)}const Is=new Set;let wi=0;function cc(){if(wi!==0)return;const r=Pr;do{try{for(;wir.indexOf(n)===-1?e.push(n):t.push(n)),t.forEach(n=>n()),Yi=e}const us=new Set;let vi;function Wn(){vi={r:0,c:[],p:vi}}function jn(){vi.r||kt(vi.c),vi=vi.p}function _e(r,e){r&&r.i&&(us.delete(r),r.i(e))}function Se(r,e,t,n){if(r&&r.o){if(us.has(r))return;us.add(r),vi.c.push(()=>{us.delete(r),n&&(t&&r.d(1),n())}),r.o(e)}else n&&n()}function xs(r,e,t){const n=r.$$.props[e];n!==void 0&&(r.$$.bound[n]=t,t(r.$$.ctx[n]))}function nt(r){r&&r.c()}function $e(r,e,t,n){const{fragment:i,after_update:s}=r.$$;i&&i.m(e,t),n||go(()=>{const o=r.$$.on_mount.map(rc).filter(gs);r.$$.on_destroy?r.$$.on_destroy.push(...o):kt(o),r.$$.on_mount=[]}),s.forEach(go)}function et(r,e){const t=r.$$;t.fragment!==null&&(hu(t.after_update),kt(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function du(r,e){r.$$.dirty[0]===-1&&(Hi.push(r),lc(),r.$$.dirty.fill(0)),r.$$.dirty[e/31|0]|=1<{const _=p.length?p[0]:h;return c.ctx&&i(c.ctx[f],c.ctx[f]=_)&&(!c.skip_bound&&c.bound[f]&&c.bound[f](_),u&&du(r,f)),h}):[],c.update(),u=!0,kt(c.before_update),c.fragment=n?n(c.ctx):!1,e.target){if(e.hydrate){const f=cu(e.target);c.fragment&&c.fragment.l(f),f.forEach(Ne)}else c.fragment&&c.fragment.c();e.intro&&_e(r.$$.fragment),$e(r,e.target,e.anchor,e.customElement),cc()}wr(l)}class gt{$destroy(){et(this,1),this.$destroy=St}$on(e,t){if(!gs(t))return St;const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(t),()=>{const i=n.indexOf(t);i!==-1&&n.splice(i,1)}}$set(e){this.$$set&&!au(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function an(r,e){const t=n=>{const{action:i,data:s}=n.data;i===r&&e(s)};or(()=>window.addEventListener("message",t)),ut(()=>window.removeEventListener("message",t))}const Ei=[];function uc(r,e){return{subscribe:Ye(r,e).subscribe}}function Ye(r,e=St){let t;const n=new Set;function i(a){if(ft(r,a)&&(r=a,t)){const l=!Ei.length;for(const c of n)c[1](),Ei.push(c,r);if(l){for(let c=0;c{n.delete(c),n.size===0&&t&&(t(),t=null)}}return{set:i,update:s,subscribe:o}}function pu(r,e,t){const n=!Array.isArray(r),i=n?[r]:r,s=e.length<2;return uc(t,o=>{let a=!1;const l=[];let c=0,u=St;const f=()=>{if(c)return;u();const p=e(n?l[0]:l,o);s?o(p):u=gs(p)?p:St},h=i.map((p,_)=>Co(p,v=>{l[_]=v,c&=~(1<<_),a&&f()},()=>{c|=1<<_}));return a=!0,f(),function(){kt(h),u(),a=!1}})}const ji=Ye(!1),Ms=Ye(!1),_o=Ye(""),ms=Ye(null),$n=Ye(null),vn=Ye(null),zt=Ye(!1),Er=Ye(!1),Tr=Ye(!1),Zi=Ye([]),Cn=Ye([]);let fc=!1;Ms.subscribe(r=>{fc=r});let hc="";_o.subscribe(r=>{hc=r});async function st(r,e={},t){if(fc==!0&&t)return Promise.resolve(t||{});const n={method:"post",headers:{"Content-Type":"application/json; charset=UTF-8"},body:JSON.stringify(e)},i=window.GetParentResourceName?window.GetParentResourceName():hc;return await(await fetch(`https://${i}/${r}`,n)).json()}function Vi(r){return{x:r.x,y:r.z,z:-r.y}}function fs(r){return{x:r.x,y:-r.z,z:r.y}}/** + * @license + * Copyright 2010-2023 Three.js Authors + * SPDX-License-Identifier: MIT + */const Lo="151",mu=0,Xo=1,gu=2,dc=1,pc=2,xr=3,ti=0,Jt=1,Pn=2,ei=0,Qi=1,qo=2,Yo=3,Zo=4,_u=5,Wi=100,vu=101,xu=102,Qo=103,Ko=104,Mu=200,bu=201,Su=202,yu=203,mc=204,gc=205,wu=206,Eu=207,Tu=208,Au=209,Cu=210,Pu=0,Lu=1,Ru=2,vo=3,Du=4,Iu=5,Uu=6,Nu=7,_c=0,Ou=1,Fu=2,Rn=0,zu=1,ku=2,Bu=3,vc=4,Gu=5,xc=300,er=301,tr=302,xo=303,Mo=304,bs=306,bo=1e3,mn=1001,So=1002,Wt=1003,Jo=1004,Us=1005,ln=1006,Hu=1007,Rr=1008,Si=1009,Vu=1010,Wu=1011,Mc=1012,ju=1013,xi=1014,Mi=1015,Dr=1016,Xu=1017,qu=1018,Ki=1020,Yu=1021,gn=1023,Zu=1024,Qu=1025,bi=1026,nr=1027,Ku=1028,Ju=1029,$u=1030,ef=1031,tf=1033,Ns=33776,Os=33777,Fs=33778,zs=33779,$o=35840,ea=35841,ta=35842,na=35843,nf=36196,ia=37492,ra=37496,sa=37808,oa=37809,aa=37810,la=37811,ca=37812,ua=37813,fa=37814,ha=37815,da=37816,pa=37817,ma=37818,ga=37819,_a=37820,va=37821,ks=36492,rf=36283,xa=36284,Ma=36285,ba=36286,ni=3e3,at=3001,sf=3200,of=3201,bc=0,af=1,En="srgb",Ir="srgb-linear",Sc="display-p3",Bs=7680,lf=519,Sa=35044,ya="300 es",yo=1035;class ar{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){if(this._listeners===void 0)return!1;const n=this._listeners;return n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){if(this._listeners===void 0)return;const i=this._listeners[e];if(i!==void 0){const s=i.indexOf(t);s!==-1&&i.splice(s,1)}}dispatchEvent(e){if(this._listeners===void 0)return;const n=this._listeners[e.type];if(n!==void 0){e.target=this;const i=n.slice(0);for(let s=0,o=i.length;s>8&255]+Nt[r>>16&255]+Nt[r>>24&255]+"-"+Nt[e&255]+Nt[e>>8&255]+"-"+Nt[e>>16&15|64]+Nt[e>>24&255]+"-"+Nt[t&63|128]+Nt[t>>8&255]+"-"+Nt[t>>16&255]+Nt[t>>24&255]+Nt[n&255]+Nt[n>>8&255]+Nt[n>>16&255]+Nt[n>>24&255]).toLowerCase()}function Xt(r,e,t){return Math.max(e,Math.min(t,r))}function Ro(r,e){return(r%e+e)%e}function cf(r,e,t,n,i){return n+(r-e)*(i-n)/(t-e)}function uf(r,e,t){return r!==e?(t-r)/(e-r):0}function Cr(r,e,t){return(1-t)*r+t*e}function ff(r,e,t,n){return Cr(r,e,1-Math.exp(-t*n))}function hf(r,e=1){return e-Math.abs(Ro(r,e*2)-e)}function df(r,e,t){return r<=e?0:r>=t?1:(r=(r-e)/(t-e),r*r*(3-2*r))}function pf(r,e,t){return r<=e?0:r>=t?1:(r=(r-e)/(t-e),r*r*r*(r*(r*6-15)+10))}function mf(r,e){return r+Math.floor(Math.random()*(e-r+1))}function gf(r,e){return r+Math.random()*(e-r)}function _f(r){return r*(.5-Math.random())}function vf(r){r!==void 0&&(wa=r);let e=wa+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function xf(r){return r*Ar}function Mf(r){return r*Ur}function wo(r){return(r&r-1)===0&&r!==0}function bf(r){return Math.pow(2,Math.ceil(Math.log(r)/Math.LN2))}function yc(r){return Math.pow(2,Math.floor(Math.log(r)/Math.LN2))}function Sf(r,e,t,n,i){const s=Math.cos,o=Math.sin,a=s(t/2),l=o(t/2),c=s((e+n)/2),u=o((e+n)/2),f=s((e-n)/2),h=o((e-n)/2),p=s((n-e)/2),_=o((n-e)/2);switch(i){case"XYX":r.set(a*u,l*f,l*h,a*c);break;case"YZY":r.set(l*h,a*u,l*f,a*c);break;case"ZXZ":r.set(l*f,l*h,a*u,a*c);break;case"XZX":r.set(a*u,l*_,l*p,a*c);break;case"YXY":r.set(l*p,a*u,l*_,a*c);break;case"ZYZ":r.set(l*_,l*p,a*u,a*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function Mr(r,e){switch(e.constructor){case Float32Array:return r;case Uint16Array:return r/65535;case Uint8Array:return r/255;case Int16Array:return Math.max(r/32767,-1);case Int8Array:return Math.max(r/127,-1);default:throw new Error("Invalid component type.")}}function Zt(r,e){switch(e.constructor){case Float32Array:return r;case Uint16Array:return Math.round(r*65535);case Uint8Array:return Math.round(r*255);case Int16Array:return Math.round(r*32767);case Int8Array:return Math.round(r*127);default:throw new Error("Invalid component type.")}}const Kt={DEG2RAD:Ar,RAD2DEG:Ur,generateUUID:lr,clamp:Xt,euclideanModulo:Ro,mapLinear:cf,inverseLerp:uf,lerp:Cr,damp:ff,pingpong:hf,smoothstep:df,smootherstep:pf,randInt:mf,randFloat:gf,randFloatSpread:_f,seededRandom:vf,degToRad:xf,radToDeg:Mf,isPowerOfTwo:wo,ceilPowerOfTwo:bf,floorPowerOfTwo:yc,setQuaternionFromProperEuler:Sf,normalize:Zt,denormalize:Mr};class Qe{constructor(e=0,t=0){Qe.prototype.isVector2=!0,this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(Xt(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const n=Math.cos(t),i=Math.sin(t),s=this.x-e.x,o=this.y-e.y;return this.x=s*n-o*i+e.x,this.y=s*i+o*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class We{constructor(){We.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1]}set(e,t,n,i,s,o,a,l,c){const u=this.elements;return u[0]=e,u[1]=i,u[2]=a,u[3]=t,u[4]=s,u[5]=l,u[6]=n,u[7]=o,u[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,s=this.elements,o=n[0],a=n[3],l=n[6],c=n[1],u=n[4],f=n[7],h=n[2],p=n[5],_=n[8],v=i[0],m=i[3],d=i[6],g=i[1],x=i[4],M=i[7],y=i[2],w=i[5],C=i[8];return s[0]=o*v+a*g+l*y,s[3]=o*m+a*x+l*w,s[6]=o*d+a*M+l*C,s[1]=c*v+u*g+f*y,s[4]=c*m+u*x+f*w,s[7]=c*d+u*M+f*C,s[2]=h*v+p*g+_*y,s[5]=h*m+p*x+_*w,s[8]=h*d+p*M+_*C,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[1],i=e[2],s=e[3],o=e[4],a=e[5],l=e[6],c=e[7],u=e[8];return t*o*u-t*a*c-n*s*u+n*a*l+i*s*c-i*o*l}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],s=e[3],o=e[4],a=e[5],l=e[6],c=e[7],u=e[8],f=u*o-a*c,h=a*l-u*s,p=c*s-o*l,_=t*f+n*h+i*p;if(_===0)return this.set(0,0,0,0,0,0,0,0,0);const v=1/_;return e[0]=f*v,e[1]=(i*c-u*n)*v,e[2]=(a*n-i*o)*v,e[3]=h*v,e[4]=(u*t-i*l)*v,e[5]=(i*s-a*t)*v,e[6]=p*v,e[7]=(n*l-c*t)*v,e[8]=(o*t-n*s)*v,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,s,o,a){const l=Math.cos(s),c=Math.sin(s);return this.set(n*l,n*c,-n*(l*o+c*a)+o+e,-i*c,i*l,-i*(-c*o+l*a)+a+t,0,0,1),this}scale(e,t){return this.premultiply(Gs.makeScale(e,t)),this}rotate(e){return this.premultiply(Gs.makeRotation(-e)),this}translate(e,t){return this.premultiply(Gs.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<9;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}}const Gs=new We;function wc(r){for(let e=r.length-1;e>=0;--e)if(r[e]>=65535)return!0;return!1}function Nr(r){return document.createElementNS("http://www.w3.org/1999/xhtml",r)}function Ji(r){return r<.04045?r*.0773993808:Math.pow(r*.9478672986+.0521327014,2.4)}function Hs(r){return r<.0031308?r*12.92:1.055*Math.pow(r,.41666)-.055}const yf=new We().fromArray([.8224621,.0331941,.0170827,.177538,.9668058,.0723974,-1e-7,1e-7,.9105199]),wf=new We().fromArray([1.2249401,-.0420569,-.0196376,-.2249404,1.0420571,-.0786361,1e-7,0,1.0982735]);function Ef(r){return r.convertSRGBToLinear().applyMatrix3(wf)}function Tf(r){return r.applyMatrix3(yf).convertLinearToSRGB()}const Af={[Ir]:r=>r,[En]:r=>r.convertSRGBToLinear(),[Sc]:Ef},Cf={[Ir]:r=>r,[En]:r=>r.convertLinearToSRGB(),[Sc]:Tf},tn={enabled:!1,get legacyMode(){return console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),!this.enabled},set legacyMode(r){console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),this.enabled=!r},get workingColorSpace(){return Ir},set workingColorSpace(r){console.warn("THREE.ColorManagement: .workingColorSpace is readonly.")},convert:function(r,e,t){if(this.enabled===!1||e===t||!e||!t)return r;const n=Af[e],i=Cf[t];if(n===void 0||i===void 0)throw new Error(`Unsupported color space conversion, "${e}" to "${t}".`);return i(n(r))},fromWorkingColorSpace:function(r,e){return this.convert(r,this.workingColorSpace,e)},toWorkingColorSpace:function(r,e){return this.convert(r,e,this.workingColorSpace)}};let Ti;class Ec{static getDataURL(e){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement=="undefined")return e.src;let t;if(e instanceof HTMLCanvasElement)t=e;else{Ti===void 0&&(Ti=Nr("canvas")),Ti.width=e.width,Ti.height=e.height;const n=Ti.getContext("2d");e instanceof ImageData?n.putImageData(e,0,0):n.drawImage(e,0,0,e.width,e.height),t=Ti}return t.width>2048||t.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),t.toDataURL("image/jpeg",.6)):t.toDataURL("image/png")}static sRGBToLinear(e){if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement||typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap){const t=Nr("canvas");t.width=e.width,t.height=e.height;const n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const i=n.getImageData(0,0,e.width,e.height),s=i.data;for(let o=0;o0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==xc)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case bo:e.x=e.x-Math.floor(e.x);break;case mn:e.x=e.x<0?0:1;break;case So:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case bo:e.y=e.y-Math.floor(e.y);break;case mn:e.y=e.y<0?0:1;break;case So:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}}$t.DEFAULT_IMAGE=null;$t.DEFAULT_MAPPING=xc;$t.DEFAULT_ANISOTROPY=1;class Ut{constructor(e=0,t=0,n=0,i=1){Ut.prototype.isVector4=!0,this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,s=this.w,o=e.elements;return this.x=o[0]*t+o[4]*n+o[8]*i+o[12]*s,this.y=o[1]*t+o[5]*n+o[9]*i+o[13]*s,this.z=o[2]*t+o[6]*n+o[10]*i+o[14]*s,this.w=o[3]*t+o[7]*n+o[11]*i+o[15]*s,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,s;const l=e.elements,c=l[0],u=l[4],f=l[8],h=l[1],p=l[5],_=l[9],v=l[2],m=l[6],d=l[10];if(Math.abs(u-h)<.01&&Math.abs(f-v)<.01&&Math.abs(_-m)<.01){if(Math.abs(u+h)<.1&&Math.abs(f+v)<.1&&Math.abs(_+m)<.1&&Math.abs(c+p+d-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const x=(c+1)/2,M=(p+1)/2,y=(d+1)/2,w=(u+h)/4,C=(f+v)/4,T=(_+m)/4;return x>M&&x>y?x<.01?(n=0,i=.707106781,s=.707106781):(n=Math.sqrt(x),i=w/n,s=C/n):M>y?M<.01?(n=.707106781,i=0,s=.707106781):(i=Math.sqrt(M),n=w/i,s=T/i):y<.01?(n=.707106781,i=.707106781,s=0):(s=Math.sqrt(y),n=C/s,i=T/s),this.set(n,i,s,t),this}let g=Math.sqrt((m-_)*(m-_)+(f-v)*(f-v)+(h-u)*(h-u));return Math.abs(g)<.001&&(g=1),this.x=(m-_)/g,this.y=(f-v)/g,this.z=(h-u)/g,this.w=Math.acos((c+p+d-1)/2),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this.w=Math.max(e,Math.min(t,this.w)),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class ii extends ar{constructor(e=1,t=1,n={}){super(),this.isWebGLRenderTarget=!0,this.width=e,this.height=t,this.depth=1,this.scissor=new Ut(0,0,e,t),this.scissorTest=!1,this.viewport=new Ut(0,0,e,t);const i={width:e,height:t,depth:1};this.texture=new $t(i,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.isRenderTargetTexture=!0,this.texture.flipY=!1,this.texture.generateMipmaps=n.generateMipmaps!==void 0?n.generateMipmaps:!1,this.texture.internalFormat=n.internalFormat!==void 0?n.internalFormat:null,this.texture.minFilter=n.minFilter!==void 0?n.minFilter:ln,this.depthBuffer=n.depthBuffer!==void 0?n.depthBuffer:!0,this.stencilBuffer=n.stencilBuffer!==void 0?n.stencilBuffer:!1,this.depthTexture=n.depthTexture!==void 0?n.depthTexture:null,this.samples=n.samples!==void 0?n.samples:0}setSize(e,t,n=1){(this.width!==e||this.height!==t||this.depth!==n)&&(this.width=e,this.height=t,this.depth=n,this.texture.image.width=e,this.texture.image.height=t,this.texture.image.depth=n,this.dispose()),this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.texture.isRenderTargetTexture=!0;const t=Object.assign({},e.texture.image);return this.texture.source=new Tc(t),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,e.depthTexture!==null&&(this.depthTexture=e.depthTexture.clone()),this.samples=e.samples,this}dispose(){this.dispatchEvent({type:"dispose"})}}class Ac extends $t{constructor(e=null,t=1,n=1,i=1){super(null),this.isDataArrayTexture=!0,this.image={data:e,width:t,height:n,depth:i},this.magFilter=Wt,this.minFilter=Wt,this.wrapR=mn,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Lf extends $t{constructor(e=null,t=1,n=1,i=1){super(null),this.isData3DTexture=!0,this.image={data:e,width:t,height:n,depth:i},this.magFilter=Wt,this.minFilter=Wt,this.wrapR=mn,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class jt{constructor(e=0,t=0,n=0,i=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=i}static slerpFlat(e,t,n,i,s,o,a){let l=n[i+0],c=n[i+1],u=n[i+2],f=n[i+3];const h=s[o+0],p=s[o+1],_=s[o+2],v=s[o+3];if(a===0){e[t+0]=l,e[t+1]=c,e[t+2]=u,e[t+3]=f;return}if(a===1){e[t+0]=h,e[t+1]=p,e[t+2]=_,e[t+3]=v;return}if(f!==v||l!==h||c!==p||u!==_){let m=1-a;const d=l*h+c*p+u*_+f*v,g=d>=0?1:-1,x=1-d*d;if(x>Number.EPSILON){const y=Math.sqrt(x),w=Math.atan2(y,d*g);m=Math.sin(m*w)/y,a=Math.sin(a*w)/y}const M=a*g;if(l=l*m+h*M,c=c*m+p*M,u=u*m+_*M,f=f*m+v*M,m===1-a){const y=1/Math.sqrt(l*l+c*c+u*u+f*f);l*=y,c*=y,u*=y,f*=y}}e[t]=l,e[t+1]=c,e[t+2]=u,e[t+3]=f}static multiplyQuaternionsFlat(e,t,n,i,s,o){const a=n[i],l=n[i+1],c=n[i+2],u=n[i+3],f=s[o],h=s[o+1],p=s[o+2],_=s[o+3];return e[t]=a*_+u*f+l*p-c*h,e[t+1]=l*_+u*h+c*f-a*p,e[t+2]=c*_+u*p+a*h-l*f,e[t+3]=u*_-a*f-l*h-c*p,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t){const n=e._x,i=e._y,s=e._z,o=e._order,a=Math.cos,l=Math.sin,c=a(n/2),u=a(i/2),f=a(s/2),h=l(n/2),p=l(i/2),_=l(s/2);switch(o){case"XYZ":this._x=h*u*f+c*p*_,this._y=c*p*f-h*u*_,this._z=c*u*_+h*p*f,this._w=c*u*f-h*p*_;break;case"YXZ":this._x=h*u*f+c*p*_,this._y=c*p*f-h*u*_,this._z=c*u*_-h*p*f,this._w=c*u*f+h*p*_;break;case"ZXY":this._x=h*u*f-c*p*_,this._y=c*p*f+h*u*_,this._z=c*u*_+h*p*f,this._w=c*u*f-h*p*_;break;case"ZYX":this._x=h*u*f-c*p*_,this._y=c*p*f+h*u*_,this._z=c*u*_-h*p*f,this._w=c*u*f+h*p*_;break;case"YZX":this._x=h*u*f+c*p*_,this._y=c*p*f+h*u*_,this._z=c*u*_-h*p*f,this._w=c*u*f-h*p*_;break;case"XZY":this._x=h*u*f-c*p*_,this._y=c*p*f-h*u*_,this._z=c*u*_+h*p*f,this._w=c*u*f+h*p*_;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+o)}return t!==!1&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,n=t[0],i=t[4],s=t[8],o=t[1],a=t[5],l=t[9],c=t[2],u=t[6],f=t[10],h=n+a+f;if(h>0){const p=.5/Math.sqrt(h+1);this._w=.25/p,this._x=(u-l)*p,this._y=(s-c)*p,this._z=(o-i)*p}else if(n>a&&n>f){const p=2*Math.sqrt(1+n-a-f);this._w=(u-l)/p,this._x=.25*p,this._y=(i+o)/p,this._z=(s+c)/p}else if(a>f){const p=2*Math.sqrt(1+a-n-f);this._w=(s-c)/p,this._x=(i+o)/p,this._y=.25*p,this._z=(l+u)/p}else{const p=2*Math.sqrt(1+f-n-a);this._w=(o-i)/p,this._x=(s+c)/p,this._y=(l+u)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return nMath.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Xt(this.dot(e),-1,1)))}rotateTowards(e,t){const n=this.angleTo(e);if(n===0)return this;const i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const n=e._x,i=e._y,s=e._z,o=e._w,a=t._x,l=t._y,c=t._z,u=t._w;return this._x=n*u+o*a+i*c-s*l,this._y=i*u+o*l+s*a-n*c,this._z=s*u+o*c+n*l-i*a,this._w=o*u-n*a-i*l-s*c,this._onChangeCallback(),this}slerp(e,t){if(t===0)return this;if(t===1)return this.copy(e);const n=this._x,i=this._y,s=this._z,o=this._w;let a=o*e._w+n*e._x+i*e._y+s*e._z;if(a<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,a=-a):this.copy(e),a>=1)return this._w=o,this._x=n,this._y=i,this._z=s,this;const l=1-a*a;if(l<=Number.EPSILON){const p=1-t;return this._w=p*o+t*this._w,this._x=p*n+t*this._x,this._y=p*i+t*this._y,this._z=p*s+t*this._z,this.normalize(),this._onChangeCallback(),this}const c=Math.sqrt(l),u=Math.atan2(c,a),f=Math.sin((1-t)*u)/c,h=Math.sin(t*u)/c;return this._w=o*f+this._w*h,this._x=n*f+this._x*h,this._y=i*f+this._y*h,this._z=s*f+this._z*h,this._onChangeCallback(),this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){const e=Math.random(),t=Math.sqrt(1-e),n=Math.sqrt(e),i=2*Math.PI*Math.random(),s=2*Math.PI*Math.random();return this.set(t*Math.cos(i),n*Math.sin(s),n*Math.cos(s),t*Math.sin(i))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class I{constructor(e=0,t=0,n=0){I.prototype.isVector3=!0,this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(Ea.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(Ea.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,n=this.y,i=this.z,s=e.elements;return this.x=s[0]*t+s[3]*n+s[6]*i,this.y=s[1]*t+s[4]*n+s[7]*i,this.z=s[2]*t+s[5]*n+s[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,s=e.elements,o=1/(s[3]*t+s[7]*n+s[11]*i+s[15]);return this.x=(s[0]*t+s[4]*n+s[8]*i+s[12])*o,this.y=(s[1]*t+s[5]*n+s[9]*i+s[13])*o,this.z=(s[2]*t+s[6]*n+s[10]*i+s[14])*o,this}applyQuaternion(e){const t=this.x,n=this.y,i=this.z,s=e.x,o=e.y,a=e.z,l=e.w,c=l*t+o*i-a*n,u=l*n+a*t-s*i,f=l*i+s*n-o*t,h=-s*t-o*n-a*i;return this.x=c*l+h*-s+u*-a-f*-o,this.y=u*l+h*-o+f*-s-c*-a,this.z=f*l+h*-a+c*-o-u*-s,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,n=this.y,i=this.z,s=e.elements;return this.x=s[0]*t+s[4]*n+s[8]*i,this.y=s[1]*t+s[5]*n+s[9]*i,this.z=s[2]*t+s[6]*n+s[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const n=e.x,i=e.y,s=e.z,o=t.x,a=t.y,l=t.z;return this.x=i*l-s*a,this.y=s*o-n*l,this.z=n*a-i*o,this}projectOnVector(e){const t=e.lengthSq();if(t===0)return this.set(0,0,0);const n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return Ws.copy(this).projectOnVector(e),this.sub(Ws)}reflect(e){return this.sub(Ws.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(Xt(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){const i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=(Math.random()-.5)*2,t=Math.random()*Math.PI*2,n=Math.sqrt(1-e**2);return this.x=n*Math.cos(t),this.y=n*Math.sin(t),this.z=e,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Ws=new I,Ea=new jt;class Or{constructor(e=new I(1/0,1/0,1/0),t=new I(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){this.makeEmpty();for(let t=0,n=e.length;tthis.max.x||e.ythis.max.y||e.zthis.max.z)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return!(e.max.xthis.max.x||e.max.ythis.max.y||e.max.zthis.max.z)}intersectsSphere(e){return this.clampPoint(e.center,zn),zn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(dr),zr.subVectors(this.max,dr),Ci.subVectors(e.a,dr),Pi.subVectors(e.b,dr),Li.subVectors(e.c,dr),qn.subVectors(Pi,Ci),Yn.subVectors(Li,Pi),ci.subVectors(Ci,Li);let t=[0,-qn.z,qn.y,0,-Yn.z,Yn.y,0,-ci.z,ci.y,qn.z,0,-qn.x,Yn.z,0,-Yn.x,ci.z,0,-ci.x,-qn.y,qn.x,0,-Yn.y,Yn.x,0,-ci.y,ci.x,0];return!js(t,Ci,Pi,Li,zr)||(t=[1,0,0,0,1,0,0,0,1],!js(t,Ci,Pi,Li,zr))?!1:(kr.crossVectors(qn,Yn),t=[kr.x,kr.y,kr.z],js(t,Ci,Pi,Li,zr))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,zn).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(zn).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(Fn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),Fn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),Fn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),Fn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),Fn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),Fn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),Fn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),Fn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(Fn),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}const Fn=[new I,new I,new I,new I,new I,new I,new I,new I],zn=new I,Ai=new Or,Ci=new I,Pi=new I,Li=new I,qn=new I,Yn=new I,ci=new I,dr=new I,zr=new I,kr=new I,ui=new I;function js(r,e,t,n,i){for(let s=0,o=r.length-3;s<=o;s+=3){ui.fromArray(r,s);const a=i.x*Math.abs(ui.x)+i.y*Math.abs(ui.y)+i.z*Math.abs(ui.z),l=e.dot(ui),c=t.dot(ui),u=n.dot(ui);if(Math.max(-Math.max(l,c,u),Math.min(l,c,u))>a)return!1}return!0}const Rf=new Or,pr=new I,Xs=new I;class Ss{constructor(e=new I,t=-1){this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const n=this.center;t!==void 0?n.copy(t):Rf.setFromPoints(e).getCenter(n);let i=0;for(let s=0,o=e.length;sthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;pr.subVectors(e,this.center);const t=pr.lengthSq();if(t>this.radius*this.radius){const n=Math.sqrt(t),i=(n-this.radius)*.5;this.center.addScaledVector(pr,i/n),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Xs.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(pr.copy(e.center).add(Xs)),this.expandByPoint(pr.copy(e.center).sub(Xs))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}}const kn=new I,qs=new I,Br=new I,Zn=new I,Ys=new I,Gr=new I,Zs=new I;class Do{constructor(e=new I,t=new I(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,kn)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=kn.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(kn.copy(this.origin).addScaledVector(this.direction,t),kn.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){qs.copy(e).add(t).multiplyScalar(.5),Br.copy(t).sub(e).normalize(),Zn.copy(this.origin).sub(qs);const s=e.distanceTo(t)*.5,o=-this.direction.dot(Br),a=Zn.dot(this.direction),l=-Zn.dot(Br),c=Zn.lengthSq(),u=Math.abs(1-o*o);let f,h,p,_;if(u>0)if(f=o*l-a,h=o*a-l,_=s*u,f>=0)if(h>=-_)if(h<=_){const v=1/u;f*=v,h*=v,p=f*(f+o*h+2*a)+h*(o*f+h+2*l)+c}else h=s,f=Math.max(0,-(o*h+a)),p=-f*f+h*(h+2*l)+c;else h=-s,f=Math.max(0,-(o*h+a)),p=-f*f+h*(h+2*l)+c;else h<=-_?(f=Math.max(0,-(-o*s+a)),h=f>0?-s:Math.min(Math.max(-s,-l),s),p=-f*f+h*(h+2*l)+c):h<=_?(f=0,h=Math.min(Math.max(-s,-l),s),p=h*(h+2*l)+c):(f=Math.max(0,-(o*s+a)),h=f>0?s:Math.min(Math.max(-s,-l),s),p=-f*f+h*(h+2*l)+c);else h=o>0?-s:s,f=Math.max(0,-(o*h+a)),p=-f*f+h*(h+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,f),i&&i.copy(qs).addScaledVector(Br,h),p}intersectSphere(e,t){kn.subVectors(e.center,this.origin);const n=kn.dot(this.direction),i=kn.dot(kn)-n*n,s=e.radius*e.radius;if(i>s)return null;const o=Math.sqrt(s-i),a=n-o,l=n+o;return l<0?null:a<0?this.at(l,t):this.at(a,t)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){const n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,s,o,a,l;const c=1/this.direction.x,u=1/this.direction.y,f=1/this.direction.z,h=this.origin;return c>=0?(n=(e.min.x-h.x)*c,i=(e.max.x-h.x)*c):(n=(e.max.x-h.x)*c,i=(e.min.x-h.x)*c),u>=0?(s=(e.min.y-h.y)*u,o=(e.max.y-h.y)*u):(s=(e.max.y-h.y)*u,o=(e.min.y-h.y)*u),n>o||s>i||((s>n||isNaN(n))&&(n=s),(o=0?(a=(e.min.z-h.z)*f,l=(e.max.z-h.z)*f):(a=(e.max.z-h.z)*f,l=(e.min.z-h.z)*f),n>l||a>i)||((a>n||n!==n)&&(n=a),(l=0?n:i,t)}intersectsBox(e){return this.intersectBox(e,kn)!==null}intersectTriangle(e,t,n,i,s){Ys.subVectors(t,e),Gr.subVectors(n,e),Zs.crossVectors(Ys,Gr);let o=this.direction.dot(Zs),a;if(o>0){if(i)return null;a=1}else if(o<0)a=-1,o=-o;else return null;Zn.subVectors(this.origin,e);const l=a*this.direction.dot(Gr.crossVectors(Zn,Gr));if(l<0)return null;const c=a*this.direction.dot(Ys.cross(Zn));if(c<0||l+c>o)return null;const u=-a*Zn.dot(Zs);return u<0?null:this.at(u/o,s)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class vt{constructor(){vt.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}set(e,t,n,i,s,o,a,l,c,u,f,h,p,_,v,m){const d=this.elements;return d[0]=e,d[4]=t,d[8]=n,d[12]=i,d[1]=s,d[5]=o,d[9]=a,d[13]=l,d[2]=c,d[6]=u,d[10]=f,d[14]=h,d[3]=p,d[7]=_,d[11]=v,d[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new vt().fromArray(this.elements)}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){const t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,n=e.elements,i=1/Ri.setFromMatrixColumn(e,0).length(),s=1/Ri.setFromMatrixColumn(e,1).length(),o=1/Ri.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*s,t[5]=n[5]*s,t[6]=n[6]*s,t[7]=0,t[8]=n[8]*o,t[9]=n[9]*o,t[10]=n[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,n=e.x,i=e.y,s=e.z,o=Math.cos(n),a=Math.sin(n),l=Math.cos(i),c=Math.sin(i),u=Math.cos(s),f=Math.sin(s);if(e.order==="XYZ"){const h=o*u,p=o*f,_=a*u,v=a*f;t[0]=l*u,t[4]=-l*f,t[8]=c,t[1]=p+_*c,t[5]=h-v*c,t[9]=-a*l,t[2]=v-h*c,t[6]=_+p*c,t[10]=o*l}else if(e.order==="YXZ"){const h=l*u,p=l*f,_=c*u,v=c*f;t[0]=h+v*a,t[4]=_*a-p,t[8]=o*c,t[1]=o*f,t[5]=o*u,t[9]=-a,t[2]=p*a-_,t[6]=v+h*a,t[10]=o*l}else if(e.order==="ZXY"){const h=l*u,p=l*f,_=c*u,v=c*f;t[0]=h-v*a,t[4]=-o*f,t[8]=_+p*a,t[1]=p+_*a,t[5]=o*u,t[9]=v-h*a,t[2]=-o*c,t[6]=a,t[10]=o*l}else if(e.order==="ZYX"){const h=o*u,p=o*f,_=a*u,v=a*f;t[0]=l*u,t[4]=_*c-p,t[8]=h*c+v,t[1]=l*f,t[5]=v*c+h,t[9]=p*c-_,t[2]=-c,t[6]=a*l,t[10]=o*l}else if(e.order==="YZX"){const h=o*l,p=o*c,_=a*l,v=a*c;t[0]=l*u,t[4]=v-h*f,t[8]=_*f+p,t[1]=f,t[5]=o*u,t[9]=-a*u,t[2]=-c*u,t[6]=p*f+_,t[10]=h-v*f}else if(e.order==="XZY"){const h=o*l,p=o*c,_=a*l,v=a*c;t[0]=l*u,t[4]=-f,t[8]=c*u,t[1]=h*f+v,t[5]=o*u,t[9]=p*f-_,t[2]=_*f-p,t[6]=a*u,t[10]=v*f+h}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Df,e,If)}lookAt(e,t,n){const i=this.elements;return nn.subVectors(e,t),nn.lengthSq()===0&&(nn.z=1),nn.normalize(),Qn.crossVectors(n,nn),Qn.lengthSq()===0&&(Math.abs(n.z)===1?nn.x+=1e-4:nn.z+=1e-4,nn.normalize(),Qn.crossVectors(n,nn)),Qn.normalize(),Hr.crossVectors(nn,Qn),i[0]=Qn.x,i[4]=Hr.x,i[8]=nn.x,i[1]=Qn.y,i[5]=Hr.y,i[9]=nn.y,i[2]=Qn.z,i[6]=Hr.z,i[10]=nn.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,s=this.elements,o=n[0],a=n[4],l=n[8],c=n[12],u=n[1],f=n[5],h=n[9],p=n[13],_=n[2],v=n[6],m=n[10],d=n[14],g=n[3],x=n[7],M=n[11],y=n[15],w=i[0],C=i[4],T=i[8],b=i[12],S=i[1],F=i[5],k=i[9],L=i[13],O=i[2],B=i[6],J=i[10],R=i[14],H=i[3],Q=i[7],K=i[11],ve=i[15];return s[0]=o*w+a*S+l*O+c*H,s[4]=o*C+a*F+l*B+c*Q,s[8]=o*T+a*k+l*J+c*K,s[12]=o*b+a*L+l*R+c*ve,s[1]=u*w+f*S+h*O+p*H,s[5]=u*C+f*F+h*B+p*Q,s[9]=u*T+f*k+h*J+p*K,s[13]=u*b+f*L+h*R+p*ve,s[2]=_*w+v*S+m*O+d*H,s[6]=_*C+v*F+m*B+d*Q,s[10]=_*T+v*k+m*J+d*K,s[14]=_*b+v*L+m*R+d*ve,s[3]=g*w+x*S+M*O+y*H,s[7]=g*C+x*F+M*B+y*Q,s[11]=g*T+x*k+M*J+y*K,s[15]=g*b+x*L+M*R+y*ve,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[4],i=e[8],s=e[12],o=e[1],a=e[5],l=e[9],c=e[13],u=e[2],f=e[6],h=e[10],p=e[14],_=e[3],v=e[7],m=e[11],d=e[15];return _*(+s*l*f-i*c*f-s*a*h+n*c*h+i*a*p-n*l*p)+v*(+t*l*p-t*c*h+s*o*h-i*o*p+i*c*u-s*l*u)+m*(+t*c*f-t*a*p-s*o*f+n*o*p+s*a*u-n*c*u)+d*(-i*a*u-t*l*f+t*a*h+i*o*f-n*o*h+n*l*u)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],s=e[3],o=e[4],a=e[5],l=e[6],c=e[7],u=e[8],f=e[9],h=e[10],p=e[11],_=e[12],v=e[13],m=e[14],d=e[15],g=f*m*c-v*h*c+v*l*p-a*m*p-f*l*d+a*h*d,x=_*h*c-u*m*c-_*l*p+o*m*p+u*l*d-o*h*d,M=u*v*c-_*f*c+_*a*p-o*v*p-u*a*d+o*f*d,y=_*f*l-u*v*l-_*a*h+o*v*h+u*a*m-o*f*m,w=t*g+n*x+i*M+s*y;if(w===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const C=1/w;return e[0]=g*C,e[1]=(v*h*s-f*m*s-v*i*p+n*m*p+f*i*d-n*h*d)*C,e[2]=(a*m*s-v*l*s+v*i*c-n*m*c-a*i*d+n*l*d)*C,e[3]=(f*l*s-a*h*s-f*i*c+n*h*c+a*i*p-n*l*p)*C,e[4]=x*C,e[5]=(u*m*s-_*h*s+_*i*p-t*m*p-u*i*d+t*h*d)*C,e[6]=(_*l*s-o*m*s-_*i*c+t*m*c+o*i*d-t*l*d)*C,e[7]=(o*h*s-u*l*s+u*i*c-t*h*c-o*i*p+t*l*p)*C,e[8]=M*C,e[9]=(_*f*s-u*v*s-_*n*p+t*v*p+u*n*d-t*f*d)*C,e[10]=(o*v*s-_*a*s+_*n*c-t*v*c-o*n*d+t*a*d)*C,e[11]=(u*a*s-o*f*s-u*n*c+t*f*c+o*n*p-t*a*p)*C,e[12]=y*C,e[13]=(u*v*i-_*f*i+_*n*h-t*v*h-u*n*m+t*f*m)*C,e[14]=(_*a*i-o*v*i-_*n*l+t*v*l+o*n*m-t*a*m)*C,e[15]=(o*f*i-u*a*i+u*n*l-t*f*l-o*n*h+t*a*h)*C,this}scale(e){const t=this.elements,n=e.x,i=e.y,s=e.z;return t[0]*=n,t[4]*=i,t[8]*=s,t[1]*=n,t[5]*=i,t[9]*=s,t[2]*=n,t[6]*=i,t[10]*=s,t[3]*=n,t[7]*=i,t[11]*=s,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))}makeTranslation(e,t,n){return this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const n=Math.cos(t),i=Math.sin(t),s=1-n,o=e.x,a=e.y,l=e.z,c=s*o,u=s*a;return this.set(c*o+n,c*a-i*l,c*l+i*a,0,c*a+i*l,u*a+n,u*l-i*o,0,c*l-i*a,u*l+i*o,s*l*l+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,i,s,o){return this.set(1,n,s,0,e,1,o,0,t,i,1,0,0,0,0,1),this}compose(e,t,n){const i=this.elements,s=t._x,o=t._y,a=t._z,l=t._w,c=s+s,u=o+o,f=a+a,h=s*c,p=s*u,_=s*f,v=o*u,m=o*f,d=a*f,g=l*c,x=l*u,M=l*f,y=n.x,w=n.y,C=n.z;return i[0]=(1-(v+d))*y,i[1]=(p+M)*y,i[2]=(_-x)*y,i[3]=0,i[4]=(p-M)*w,i[5]=(1-(h+d))*w,i[6]=(m+g)*w,i[7]=0,i[8]=(_+x)*C,i[9]=(m-g)*C,i[10]=(1-(h+v))*C,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,t,n){const i=this.elements;let s=Ri.set(i[0],i[1],i[2]).length();const o=Ri.set(i[4],i[5],i[6]).length(),a=Ri.set(i[8],i[9],i[10]).length();this.determinant()<0&&(s=-s),e.x=i[12],e.y=i[13],e.z=i[14],un.copy(this);const c=1/s,u=1/o,f=1/a;return un.elements[0]*=c,un.elements[1]*=c,un.elements[2]*=c,un.elements[4]*=u,un.elements[5]*=u,un.elements[6]*=u,un.elements[8]*=f,un.elements[9]*=f,un.elements[10]*=f,t.setFromRotationMatrix(un),n.x=s,n.y=o,n.z=a,this}makePerspective(e,t,n,i,s,o){const a=this.elements,l=2*s/(t-e),c=2*s/(n-i),u=(t+e)/(t-e),f=(n+i)/(n-i),h=-(o+s)/(o-s),p=-2*o*s/(o-s);return a[0]=l,a[4]=0,a[8]=u,a[12]=0,a[1]=0,a[5]=c,a[9]=f,a[13]=0,a[2]=0,a[6]=0,a[10]=h,a[14]=p,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(e,t,n,i,s,o){const a=this.elements,l=1/(t-e),c=1/(n-i),u=1/(o-s),f=(t+e)*l,h=(n+i)*c,p=(o+s)*u;return a[0]=2*l,a[4]=0,a[8]=0,a[12]=-f,a[1]=0,a[5]=2*c,a[9]=0,a[13]=-h,a[2]=0,a[6]=0,a[10]=-2*u,a[14]=-p,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<16;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}}const Ri=new I,un=new vt,Df=new I(0,0,0),If=new I(1,1,1),Qn=new I,Hr=new I,nn=new I,Ta=new vt,Aa=new jt;class yi{constructor(e=0,t=0,n=0,i=yi.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=n,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,i=this._order){return this._x=e,this._y=t,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){const i=e.elements,s=i[0],o=i[4],a=i[8],l=i[1],c=i[5],u=i[9],f=i[2],h=i[6],p=i[10];switch(t){case"XYZ":this._y=Math.asin(Xt(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-u,p),this._z=Math.atan2(-o,s)):(this._x=Math.atan2(h,c),this._z=0);break;case"YXZ":this._x=Math.asin(-Xt(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(a,p),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-f,s),this._z=0);break;case"ZXY":this._x=Math.asin(Xt(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(-f,p),this._z=Math.atan2(-o,c)):(this._y=0,this._z=Math.atan2(l,s));break;case"ZYX":this._y=Math.asin(-Xt(f,-1,1)),Math.abs(f)<.9999999?(this._x=Math.atan2(h,p),this._z=Math.atan2(l,s)):(this._x=0,this._z=Math.atan2(-o,c));break;case"YZX":this._z=Math.asin(Xt(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-u,c),this._y=Math.atan2(-f,s)):(this._x=0,this._y=Math.atan2(a,p));break;case"XZY":this._z=Math.asin(-Xt(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(h,c),this._y=Math.atan2(a,s)):(this._x=Math.atan2(-u,p),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,n===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return Ta.makeRotationFromQuaternion(e),this.setFromRotationMatrix(Ta,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return Aa.setFromEuler(this),this.setFromQuaternion(Aa,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}yi.DEFAULT_ORDER="XYZ";class Io{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let t=0;t1){for(let n=0;n0&&(n=n.concat(o))}return n}getWorldPosition(e){return this.updateWorldMatrix(!0,!1),e.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(mr,e,Nf),e}getWorldScale(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(mr,Of,e),e}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(t[8],t[9],t[10]).normalize()}raycast(){}traverse(e){e(this);const t=this.children;for(let n=0,i=t.length;n0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON()));function s(a,l){return a[l.uuid]===void 0&&(a[l.uuid]=l.toJSON(e)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=s(e.geometries,this.geometry);const a=this.geometry.parameters;if(a!==void 0&&a.shapes!==void 0){const l=a.shapes;if(Array.isArray(l))for(let c=0,u=l.length;c0){i.children=[];for(let a=0;a0){i.animations=[];for(let a=0;a0&&(n.geometries=a),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),u.length>0&&(n.images=u),f.length>0&&(n.shapes=f),h.length>0&&(n.skeletons=h),p.length>0&&(n.animations=p),_.length>0&&(n.nodes=_)}return n.object=i,n;function o(a){const l=[];for(const c in a){const u=a[c];delete u.metadata,l.push(u)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let n=0;n0?i.multiplyScalar(1/Math.sqrt(s)):i.set(0,0,0)}static getBarycoord(e,t,n,i,s){fn.subVectors(i,t),Gn.subVectors(n,t),Qs.subVectors(e,t);const o=fn.dot(fn),a=fn.dot(Gn),l=fn.dot(Qs),c=Gn.dot(Gn),u=Gn.dot(Qs),f=o*c-a*a;if(f===0)return s.set(-2,-1,-1);const h=1/f,p=(c*l-a*u)*h,_=(o*u-a*l)*h;return s.set(1-p-_,_,p)}static containsPoint(e,t,n,i){return this.getBarycoord(e,t,n,i,Hn),Hn.x>=0&&Hn.y>=0&&Hn.x+Hn.y<=1}static getUV(e,t,n,i,s,o,a,l){return Wr===!1&&(console.warn("THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation()."),Wr=!0),this.getInterpolation(e,t,n,i,s,o,a,l)}static getInterpolation(e,t,n,i,s,o,a,l){return this.getBarycoord(e,t,n,i,Hn),l.setScalar(0),l.addScaledVector(s,Hn.x),l.addScaledVector(o,Hn.y),l.addScaledVector(a,Hn.z),l}static isFrontFacing(e,t,n,i){return fn.subVectors(n,t),Gn.subVectors(e,t),fn.cross(Gn).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return fn.subVectors(this.c,this.b),Gn.subVectors(this.a,this.b),fn.cross(Gn).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return dn.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return dn.getBarycoord(e,this.a,this.b,this.c,t)}getUV(e,t,n,i,s){return Wr===!1&&(console.warn("THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation()."),Wr=!0),dn.getInterpolation(e,this.a,this.b,this.c,t,n,i,s)}getInterpolation(e,t,n,i,s){return dn.getInterpolation(e,this.a,this.b,this.c,t,n,i,s)}containsPoint(e){return dn.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return dn.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const n=this.a,i=this.b,s=this.c;let o,a;Ii.subVectors(i,n),Ui.subVectors(s,n),Ks.subVectors(e,n);const l=Ii.dot(Ks),c=Ui.dot(Ks);if(l<=0&&c<=0)return t.copy(n);Js.subVectors(e,i);const u=Ii.dot(Js),f=Ui.dot(Js);if(u>=0&&f<=u)return t.copy(i);const h=l*f-u*c;if(h<=0&&l>=0&&u<=0)return o=l/(l-u),t.copy(n).addScaledVector(Ii,o);$s.subVectors(e,s);const p=Ii.dot($s),_=Ui.dot($s);if(_>=0&&p<=_)return t.copy(s);const v=p*c-l*_;if(v<=0&&c>=0&&_<=0)return a=c/(c-_),t.copy(n).addScaledVector(Ui,a);const m=u*_-p*f;if(m<=0&&f-u>=0&&p-_>=0)return Ia.subVectors(s,i),a=(f-u)/(f-u+(p-_)),t.copy(i).addScaledVector(Ia,a);const d=1/(m+v+h);return o=v*d,a=h*d,t.copy(n).addScaledVector(Ii,o).addScaledVector(Ui,a)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}let zf=0;class cr extends ar{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:zf++}),this.uuid=lr(),this.name="",this.type="Material",this.blending=Qi,this.side=ti,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=mc,this.blendDst=gc,this.blendEquation=Wi,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=vo,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=lf,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Bs,this.stencilZFail=Bs,this.stencilZPass=Bs,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const t in e){const n=e[t];if(n===void 0){console.warn(`THREE.Material: parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){console.warn(`THREE.Material: '${t}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";t&&(e={textures:{},images:{}});const n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Qi&&(n.blending=this.blending),this.side!==ti&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaToCoverage===!0&&(n.alphaToCoverage=this.alphaToCoverage),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=this.premultipliedAlpha),this.forceSinglePass===!0&&(n.forceSinglePass=this.forceSinglePass),this.wireframe===!0&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=this.flatShading),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function i(s){const o=[];for(const a in s){const l=s[a];delete l.metadata,o.push(l)}return o}if(t){const s=i(e.textures),o=i(e.images);s.length>0&&(n.textures=s),o.length>0&&(n.images=o)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let n=null;if(t!==null){const i=t.length;n=new Array(i);for(let s=0;s!==i;++s)n[s]=t[s].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}const Cc={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},hn={h:0,s:0,l:0},jr={h:0,s:0,l:0};function eo(r,e,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?r+(e-r)*6*t:t<1/2?e:t<2/3?r+(e-r)*6*(2/3-t):r}class Je{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,t===void 0&&n===void 0?this.set(e):this.setRGB(e,t,n)}set(e){return e&&e.isColor?this.copy(e):typeof e=="number"?this.setHex(e):typeof e=="string"&&this.setStyle(e),this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=En){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,tn.toWorkingColorSpace(this,t),this}setRGB(e,t,n,i=tn.workingColorSpace){return this.r=e,this.g=t,this.b=n,tn.toWorkingColorSpace(this,i),this}setHSL(e,t,n,i=tn.workingColorSpace){if(e=Ro(e,1),t=Xt(t,0,1),n=Xt(n,0,1),t===0)this.r=this.g=this.b=n;else{const s=n<=.5?n*(1+t):n+t-n*t,o=2*n-s;this.r=eo(o,s,e+1/3),this.g=eo(o,s,e),this.b=eo(o,s,e-1/3)}return tn.toWorkingColorSpace(this,i),this}setStyle(e,t=En){function n(s){s!==void 0&&parseFloat(s)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let s;const o=i[1],a=i[2];switch(o){case"rgb":case"rgba":if(s=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(s[1],10))/255,this.g=Math.min(255,parseInt(s[2],10))/255,this.b=Math.min(255,parseInt(s[3],10))/255,tn.toWorkingColorSpace(this,t),n(s[4]),this;if(s=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(s[1],10))/100,this.g=Math.min(100,parseInt(s[2],10))/100,this.b=Math.min(100,parseInt(s[3],10))/100,tn.toWorkingColorSpace(this,t),n(s[4]),this;break;case"hsl":case"hsla":if(s=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a)){const l=parseFloat(s[1])/360,c=parseFloat(s[2])/100,u=parseFloat(s[3])/100;return n(s[4]),this.setHSL(l,c,u,t)}break;default:console.warn("THREE.Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const s=i[1],o=s.length;if(o===3)return this.setRGB(parseInt(s.charAt(0),16)/15,parseInt(s.charAt(1),16)/15,parseInt(s.charAt(2),16)/15,t);if(o===6)return this.setHex(parseInt(s,16),t);console.warn("THREE.Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=En){const n=Cc[e.toLowerCase()];return n!==void 0?this.setHex(n,t):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Ji(e.r),this.g=Ji(e.g),this.b=Ji(e.b),this}copyLinearToSRGB(e){return this.r=Hs(e.r),this.g=Hs(e.g),this.b=Hs(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=En){return tn.fromWorkingColorSpace(Ot.copy(this),e),Xt(Ot.r*255,0,255)<<16^Xt(Ot.g*255,0,255)<<8^Xt(Ot.b*255,0,255)<<0}getHexString(e=En){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=tn.workingColorSpace){tn.fromWorkingColorSpace(Ot.copy(this),t);const n=Ot.r,i=Ot.g,s=Ot.b,o=Math.max(n,i,s),a=Math.min(n,i,s);let l,c;const u=(a+o)/2;if(a===o)l=0,c=0;else{const f=o-a;switch(c=u<=.5?f/(o+a):f/(2-o-a),o){case n:l=(i-s)/f+(i0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(e[c]=l[c]);return e}e.data={attributes:{}};const t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const n=this.attributes;for(const l in n){const c=n[l];e.data.attributes[l]=c.toJSON(e.data)}const i={};let s=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],u=[];for(let f=0,h=c.length;f0&&(i[l]=u,s=!0)}s&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const o=this.groups;o.length>0&&(e.data.groups=JSON.parse(JSON.stringify(o)));const a=this.boundingSphere;return a!==null&&(e.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const n=e.index;n!==null&&this.setIndex(n.clone(t));const i=e.attributes;for(const c in i){const u=i[c];this.setAttribute(c,u.clone(t))}const s=e.morphAttributes;for(const c in s){const u=[],f=s[c];for(let h=0,p=f.length;h0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,o=i.length;s(e.far-e.near)**2))||(Ua.copy(s).invert(),yn.copy(e.ray).applyMatrix4(Ua),n.boundingBox!==null&&yn.intersectsBox(n.boundingBox)===!1))return;let o;const a=n.index,l=n.attributes.position,c=n.attributes.uv,u=n.attributes.uv2,f=n.attributes.normal,h=n.groups,p=n.drawRange;if(a!==null)if(Array.isArray(i))for(let _=0,v=h.length;_t.far?null:{distance:c,point:$r.clone(),object:r}}function es(r,e,t,n,i,s,o,a,l,c){r.getVertexPosition(a,Oi),r.getVertexPosition(l,Fi),r.getVertexPosition(c,zi);const u=Bf(r,e,t,n,Oi,Fi,zi,Jr);if(u){i&&(Zr.fromBufferAttribute(i,a),Qr.fromBufferAttribute(i,l),Kr.fromBufferAttribute(i,c),u.uv=dn.getInterpolation(Jr,Oi,Fi,zi,Zr,Qr,Kr,new Qe)),s&&(Zr.fromBufferAttribute(s,a),Qr.fromBufferAttribute(s,l),Kr.fromBufferAttribute(s,c),u.uv2=dn.getInterpolation(Jr,Oi,Fi,zi,Zr,Qr,Kr,new Qe)),o&&(Oa.fromBufferAttribute(o,a),Fa.fromBufferAttribute(o,l),za.fromBufferAttribute(o,c),u.normal=dn.getInterpolation(Jr,Oi,Fi,zi,Oa,Fa,za,new I),u.normal.dot(n.direction)>0&&u.normal.multiplyScalar(-1));const f={a,b:l,c,normal:new I,materialIndex:0};dn.getNormal(Oi,Fi,zi,f.normal),u.face=f}return u}class bt extends qt{constructor(e=1,t=1,n=1,i=1,s=1,o=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:s,depthSegments:o};const a=this;i=Math.floor(i),s=Math.floor(s),o=Math.floor(o);const l=[],c=[],u=[],f=[];let h=0,p=0;_("z","y","x",-1,-1,n,t,e,o,s,0),_("z","y","x",1,-1,n,t,-e,o,s,1),_("x","z","y",1,1,e,n,t,i,o,2),_("x","z","y",1,-1,e,n,-t,i,o,3),_("x","y","z",1,-1,e,t,n,i,s,4),_("x","y","z",-1,-1,e,t,-n,i,s,5),this.setIndex(l),this.setAttribute("position",new pt(c,3)),this.setAttribute("normal",new pt(u,3)),this.setAttribute("uv",new pt(f,2));function _(v,m,d,g,x,M,y,w,C,T,b){const S=M/C,F=y/T,k=M/2,L=y/2,O=w/2,B=C+1,J=T+1;let R=0,H=0;const Q=new I;for(let K=0;K0?1:-1,u.push(Q.x,Q.y,Q.z),f.push(se/C),f.push(1-K/T),R+=1}}for(let K=0;K0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader;const n={};for(const i in this.extensions)this.extensions[i]===!0&&(n[i]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}}class Ic extends Et{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new vt,this.projectionMatrix=new vt,this.projectionMatrixInverse=new vt}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(-t[8],-t[9],-t[10]).normalize()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}class sn extends Ic{constructor(e=50,t=1,n=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=Ur*2*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(Ar*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return Ur*2*Math.atan(Math.tan(Ar*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(e,t,n,i,s,o){this.aspect=e/t,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=s,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(Ar*.5*this.fov)/this.zoom,n=2*t,i=this.aspect*n,s=-.5*i;const o=this.view;if(this.view!==null&&this.view.enabled){const l=o.fullWidth,c=o.fullHeight;s+=o.offsetX*i/l,t-=o.offsetY*n/c,i*=o.width/l,n*=o.height/c}const a=this.filmOffset;a!==0&&(s+=e*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(s,s+i,t,t-n,e,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,this.view!==null&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}const ki=-90,Bi=1;class Wf extends Et{constructor(e,t,n){super(),this.type="CubeCamera",this.renderTarget=n;const i=new sn(ki,Bi,e,t);i.layers=this.layers,i.up.set(0,1,0),i.lookAt(1,0,0),this.add(i);const s=new sn(ki,Bi,e,t);s.layers=this.layers,s.up.set(0,1,0),s.lookAt(-1,0,0),this.add(s);const o=new sn(ki,Bi,e,t);o.layers=this.layers,o.up.set(0,0,-1),o.lookAt(0,1,0),this.add(o);const a=new sn(ki,Bi,e,t);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(0,-1,0),this.add(a);const l=new sn(ki,Bi,e,t);l.layers=this.layers,l.up.set(0,1,0),l.lookAt(0,0,1),this.add(l);const c=new sn(ki,Bi,e,t);c.layers=this.layers,c.up.set(0,1,0),c.lookAt(0,0,-1),this.add(c)}update(e,t){this.parent===null&&this.updateMatrixWorld();const n=this.renderTarget,[i,s,o,a,l,c]=this.children,u=e.getRenderTarget(),f=e.toneMapping,h=e.xr.enabled;e.toneMapping=Rn,e.xr.enabled=!1;const p=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,e.setRenderTarget(n,0),e.render(t,i),e.setRenderTarget(n,1),e.render(t,s),e.setRenderTarget(n,2),e.render(t,o),e.setRenderTarget(n,3),e.render(t,a),e.setRenderTarget(n,4),e.render(t,l),n.texture.generateMipmaps=p,e.setRenderTarget(n,5),e.render(t,c),e.setRenderTarget(u),e.toneMapping=f,e.xr.enabled=h,n.texture.needsPMREMUpdate=!0}}class Uc extends $t{constructor(e,t,n,i,s,o,a,l,c,u){e=e!==void 0?e:[],t=t!==void 0?t:er,super(e,t,n,i,s,o,a,l,c,u),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class jf extends ii{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new Uc(i,t.mapping,t.wrapS,t.wrapT,t.magFilter,t.minFilter,t.format,t.type,t.anisotropy,t.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=t.generateMipmaps!==void 0?t.generateMipmaps:!1,this.texture.minFilter=t.minFilter!==void 0?t.minFilter:ln}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.encoding=t.encoding,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` + + varying vec3 vWorldDirection; + + vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + + } + + void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + } + `,fragmentShader:` + + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); + + } + `},i=new bt(5,5,5),s=new Xn({name:"CubemapFromEquirect",uniforms:ir(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:Jt,blending:ei});s.uniforms.tEquirect.value=t;const o=new pe(i,s),a=t.minFilter;return t.minFilter===Rr&&(t.minFilter=ln),new Wf(1,10,this).update(e,o),t.minFilter=a,o.geometry.dispose(),o.material.dispose(),this}clear(e,t,n,i){const s=e.getRenderTarget();for(let o=0;o<6;o++)e.setRenderTarget(this,o),e.clear(t,n,i);e.setRenderTarget(s)}}const io=new I,Xf=new I,qf=new We;class di{constructor(e=new I(1,0,0),t=0){this.isPlane=!0,this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,n,i){return this.normal.set(e,t,n),this.constant=i,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,n){const i=io.subVectors(n,t).cross(Xf.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(i,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,t){const n=e.delta(io),i=this.normal.dot(n);if(i===0)return this.distanceToPoint(e.start)===0?t.copy(e.start):null;const s=-(e.start.dot(this.normal)+this.constant)/i;return s<0||s>1?null:t.copy(e.start).addScaledVector(n,s)}intersectsLine(e){const t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const n=t||qf.getNormalMatrix(e),i=this.coplanarPoint(io).applyMatrix4(e),s=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(s),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const fi=new Ss,ts=new I;class Uo{constructor(e=new di,t=new di,n=new di,i=new di,s=new di,o=new di){this.planes=[e,t,n,i,s,o]}set(e,t,n,i,s,o){const a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(n),a[3].copy(i),a[4].copy(s),a[5].copy(o),this}copy(e){const t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e){const t=this.planes,n=e.elements,i=n[0],s=n[1],o=n[2],a=n[3],l=n[4],c=n[5],u=n[6],f=n[7],h=n[8],p=n[9],_=n[10],v=n[11],m=n[12],d=n[13],g=n[14],x=n[15];return t[0].setComponents(a-i,f-l,v-h,x-m).normalize(),t[1].setComponents(a+i,f+l,v+h,x+m).normalize(),t[2].setComponents(a+s,f+c,v+p,x+d).normalize(),t[3].setComponents(a-s,f-c,v-p,x-d).normalize(),t[4].setComponents(a-o,f-u,v-_,x-g).normalize(),t[5].setComponents(a+o,f+u,v+_,x+g).normalize(),this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),fi.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),fi.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(fi)}intersectsSprite(e){return fi.center.set(0,0,0),fi.radius=.7071067811865476,fi.applyMatrix4(e.matrixWorld),this.intersectsSphere(fi)}intersectsSphere(e){const t=this.planes,n=e.center,i=-e.radius;for(let s=0;s<6;s++)if(t[s].distanceToPoint(n)0?e.max.x:e.min.x,ts.y=i.normal.y>0?e.max.y:e.min.y,ts.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(ts)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}function Nc(){let r=null,e=!1,t=null,n=null;function i(s,o){t(s,o),n=r.requestAnimationFrame(i)}return{start:function(){e!==!0&&t!==null&&(n=r.requestAnimationFrame(i),e=!0)},stop:function(){r.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(s){t=s},setContext:function(s){r=s}}}function Yf(r,e){const t=e.isWebGL2,n=new WeakMap;function i(c,u){const f=c.array,h=c.usage,p=r.createBuffer();r.bindBuffer(u,p),r.bufferData(u,f,h),c.onUploadCallback();let _;if(f instanceof Float32Array)_=5126;else if(f instanceof Uint16Array)if(c.isFloat16BufferAttribute)if(t)_=5131;else throw new Error("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.");else _=5123;else if(f instanceof Int16Array)_=5122;else if(f instanceof Uint32Array)_=5125;else if(f instanceof Int32Array)_=5124;else if(f instanceof Int8Array)_=5120;else if(f instanceof Uint8Array)_=5121;else if(f instanceof Uint8ClampedArray)_=5121;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+f);return{buffer:p,type:_,bytesPerElement:f.BYTES_PER_ELEMENT,version:c.version}}function s(c,u,f){const h=u.array,p=u.updateRange;r.bindBuffer(f,c),p.count===-1?r.bufferSubData(f,0,h):(t?r.bufferSubData(f,p.offset*h.BYTES_PER_ELEMENT,h,p.offset,p.count):r.bufferSubData(f,p.offset*h.BYTES_PER_ELEMENT,h.subarray(p.offset,p.offset+p.count)),p.count=-1),u.onUploadCallback()}function o(c){return c.isInterleavedBufferAttribute&&(c=c.data),n.get(c)}function a(c){c.isInterleavedBufferAttribute&&(c=c.data);const u=n.get(c);u&&(r.deleteBuffer(u.buffer),n.delete(c))}function l(c,u){if(c.isGLBufferAttribute){const h=n.get(c);(!h||h.version 0 + vec4 plane; + #pragma unroll_loop_start + for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { + plane = clippingPlanes[ i ]; + if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard; + } + #pragma unroll_loop_end + #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES + bool clipped = true; + #pragma unroll_loop_start + for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) { + plane = clippingPlanes[ i ]; + clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped; + } + #pragma unroll_loop_end + if ( clipped ) discard; + #endif +#endif`,ah=`#if NUM_CLIPPING_PLANES > 0 + varying vec3 vClipPosition; + uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; +#endif`,lh=`#if NUM_CLIPPING_PLANES > 0 + varying vec3 vClipPosition; +#endif`,ch=`#if NUM_CLIPPING_PLANES > 0 + vClipPosition = - mvPosition.xyz; +#endif`,uh=`#if defined( USE_COLOR_ALPHA ) + diffuseColor *= vColor; +#elif defined( USE_COLOR ) + diffuseColor.rgb *= vColor; +#endif`,fh=`#if defined( USE_COLOR_ALPHA ) + varying vec4 vColor; +#elif defined( USE_COLOR ) + varying vec3 vColor; +#endif`,hh=`#if defined( USE_COLOR_ALPHA ) + varying vec4 vColor; +#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) + varying vec3 vColor; +#endif`,dh=`#if defined( USE_COLOR_ALPHA ) + vColor = vec4( 1.0 ); +#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) + vColor = vec3( 1.0 ); +#endif +#ifdef USE_COLOR + vColor *= color; +#endif +#ifdef USE_INSTANCING_COLOR + vColor.xyz *= instanceColor.xyz; +#endif`,ph=`#define PI 3.141592653589793 +#define PI2 6.283185307179586 +#define PI_HALF 1.5707963267948966 +#define RECIPROCAL_PI 0.3183098861837907 +#define RECIPROCAL_PI2 0.15915494309189535 +#define EPSILON 1e-6 +#ifndef saturate +#define saturate( a ) clamp( a, 0.0, 1.0 ) +#endif +#define whiteComplement( a ) ( 1.0 - saturate( a ) ) +float pow2( const in float x ) { return x*x; } +vec3 pow2( const in vec3 x ) { return x*x; } +float pow3( const in float x ) { return x*x*x; } +float pow4( const in float x ) { float x2 = x*x; return x2*x2; } +float max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); } +float average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); } +highp float rand( const in vec2 uv ) { + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract( sin( sn ) * c ); +} +#ifdef HIGH_PRECISION + float precisionSafeLength( vec3 v ) { return length( v ); } +#else + float precisionSafeLength( vec3 v ) { + float maxComponent = max3( abs( v ) ); + return length( v / maxComponent ) * maxComponent; + } +#endif +struct IncidentLight { + vec3 color; + vec3 direction; + bool visible; +}; +struct ReflectedLight { + vec3 directDiffuse; + vec3 directSpecular; + vec3 indirectDiffuse; + vec3 indirectSpecular; +}; +struct GeometricContext { + vec3 position; + vec3 normal; + vec3 viewDir; +#ifdef USE_CLEARCOAT + vec3 clearcoatNormal; +#endif +}; +vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); +} +vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) { + return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); +} +mat3 transposeMat3( const in mat3 m ) { + mat3 tmp; + tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x ); + tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y ); + tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z ); + return tmp; +} +float luminance( const in vec3 rgb ) { + const vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 ); + return dot( weights, rgb ); +} +bool isPerspectiveMatrix( mat4 m ) { + return m[ 2 ][ 3 ] == - 1.0; +} +vec2 equirectUv( in vec3 dir ) { + float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5; + float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + return vec2( u, v ); +} +vec3 BRDF_Lambert( const in vec3 diffuseColor ) { + return RECIPROCAL_PI * diffuseColor; +} +vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { + float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); + return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); +} +float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { + float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); + return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); +} // validated`,mh=`#ifdef ENVMAP_TYPE_CUBE_UV + #define cubeUV_minMipLevel 4.0 + #define cubeUV_minTileSize 16.0 + float getFace( vec3 direction ) { + vec3 absDirection = abs( direction ); + float face = - 1.0; + if ( absDirection.x > absDirection.z ) { + if ( absDirection.x > absDirection.y ) + face = direction.x > 0.0 ? 0.0 : 3.0; + else + face = direction.y > 0.0 ? 1.0 : 4.0; + } else { + if ( absDirection.z > absDirection.y ) + face = direction.z > 0.0 ? 2.0 : 5.0; + else + face = direction.y > 0.0 ? 1.0 : 4.0; + } + return face; + } + vec2 getUV( vec3 direction, float face ) { + vec2 uv; + if ( face == 0.0 ) { + uv = vec2( direction.z, direction.y ) / abs( direction.x ); + } else if ( face == 1.0 ) { + uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); + } else if ( face == 2.0 ) { + uv = vec2( - direction.x, direction.y ) / abs( direction.z ); + } else if ( face == 3.0 ) { + uv = vec2( - direction.z, direction.y ) / abs( direction.x ); + } else if ( face == 4.0 ) { + uv = vec2( - direction.x, direction.z ) / abs( direction.y ); + } else { + uv = vec2( direction.x, direction.y ) / abs( direction.z ); + } + return 0.5 * ( uv + 1.0 ); + } + vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) { + float face = getFace( direction ); + float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 ); + mipInt = max( mipInt, cubeUV_minMipLevel ); + float faceSize = exp2( mipInt ); + highp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0; + if ( face > 2.0 ) { + uv.y += faceSize; + face -= 3.0; + } + uv.x += face * faceSize; + uv.x += filterInt * 3.0 * cubeUV_minTileSize; + uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize ); + uv.x *= CUBEUV_TEXEL_WIDTH; + uv.y *= CUBEUV_TEXEL_HEIGHT; + #ifdef texture2DGradEXT + return texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb; + #else + return texture2D( envMap, uv ).rgb; + #endif + } + #define cubeUV_r0 1.0 + #define cubeUV_v0 0.339 + #define cubeUV_m0 - 2.0 + #define cubeUV_r1 0.8 + #define cubeUV_v1 0.276 + #define cubeUV_m1 - 1.0 + #define cubeUV_r4 0.4 + #define cubeUV_v4 0.046 + #define cubeUV_m4 2.0 + #define cubeUV_r5 0.305 + #define cubeUV_v5 0.016 + #define cubeUV_m5 3.0 + #define cubeUV_r6 0.21 + #define cubeUV_v6 0.0038 + #define cubeUV_m6 4.0 + float roughnessToMip( float roughness ) { + float mip = 0.0; + if ( roughness >= cubeUV_r1 ) { + mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0; + } else if ( roughness >= cubeUV_r4 ) { + mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1; + } else if ( roughness >= cubeUV_r5 ) { + mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4; + } else if ( roughness >= cubeUV_r6 ) { + mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5; + } else { + mip = - 2.0 * log2( 1.16 * roughness ); } + return mip; + } + vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) { + float mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP ); + float mipF = fract( mip ); + float mipInt = floor( mip ); + vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt ); + if ( mipF == 0.0 ) { + return vec4( color0, 1.0 ); + } else { + vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 ); + return vec4( mix( color0, color1, mipF ), 1.0 ); + } + } +#endif`,gh=`vec3 transformedNormal = objectNormal; +#ifdef USE_INSTANCING + mat3 m = mat3( instanceMatrix ); + transformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) ); + transformedNormal = m * transformedNormal; +#endif +transformedNormal = normalMatrix * transformedNormal; +#ifdef FLIP_SIDED + transformedNormal = - transformedNormal; +#endif +#ifdef USE_TANGENT + vec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz; + #ifdef FLIP_SIDED + transformedTangent = - transformedTangent; + #endif +#endif`,_h=`#ifdef USE_DISPLACEMENTMAP + uniform sampler2D displacementMap; + uniform float displacementScale; + uniform float displacementBias; +#endif`,vh=`#ifdef USE_DISPLACEMENTMAP + transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); +#endif`,xh=`#ifdef USE_EMISSIVEMAP + vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); + totalEmissiveRadiance *= emissiveColor.rgb; +#endif`,Mh=`#ifdef USE_EMISSIVEMAP + uniform sampler2D emissiveMap; +#endif`,bh="gl_FragColor = linearToOutputTexel( gl_FragColor );",Sh=`vec4 LinearToLinear( in vec4 value ) { + return value; +} +vec4 LinearTosRGB( in vec4 value ) { + return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); +}`,yh=`#ifdef USE_ENVMAP + #ifdef ENV_WORLDPOS + vec3 cameraToFrag; + if ( isOrthographic ) { + cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); + } else { + cameraToFrag = normalize( vWorldPosition - cameraPosition ); + } + vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); + #ifdef ENVMAP_MODE_REFLECTION + vec3 reflectVec = reflect( cameraToFrag, worldNormal ); + #else + vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio ); + #endif + #else + vec3 reflectVec = vReflect; + #endif + #ifdef ENVMAP_TYPE_CUBE + vec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) ); + #else + vec4 envColor = vec4( 0.0 ); + #endif + #ifdef ENVMAP_BLENDING_MULTIPLY + outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity ); + #elif defined( ENVMAP_BLENDING_MIX ) + outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); + #elif defined( ENVMAP_BLENDING_ADD ) + outgoingLight += envColor.xyz * specularStrength * reflectivity; + #endif +#endif`,wh=`#ifdef USE_ENVMAP + uniform float envMapIntensity; + uniform float flipEnvMap; + #ifdef ENVMAP_TYPE_CUBE + uniform samplerCube envMap; + #else + uniform sampler2D envMap; + #endif + +#endif`,Eh=`#ifdef USE_ENVMAP + uniform float reflectivity; + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) + #define ENV_WORLDPOS + #endif + #ifdef ENV_WORLDPOS + varying vec3 vWorldPosition; + uniform float refractionRatio; + #else + varying vec3 vReflect; + #endif +#endif`,Th=`#ifdef USE_ENVMAP + #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) + #define ENV_WORLDPOS + #endif + #ifdef ENV_WORLDPOS + + varying vec3 vWorldPosition; + #else + varying vec3 vReflect; + uniform float refractionRatio; + #endif +#endif`,Ah=`#ifdef USE_ENVMAP + #ifdef ENV_WORLDPOS + vWorldPosition = worldPosition.xyz; + #else + vec3 cameraToVertex; + if ( isOrthographic ) { + cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) ); + } else { + cameraToVertex = normalize( worldPosition.xyz - cameraPosition ); + } + vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); + #ifdef ENVMAP_MODE_REFLECTION + vReflect = reflect( cameraToVertex, worldNormal ); + #else + vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); + #endif + #endif +#endif`,Ch=`#ifdef USE_FOG + vFogDepth = - mvPosition.z; +#endif`,Ph=`#ifdef USE_FOG + varying float vFogDepth; +#endif`,Lh=`#ifdef USE_FOG + #ifdef FOG_EXP2 + float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); + #else + float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); + #endif + gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); +#endif`,Rh=`#ifdef USE_FOG + uniform vec3 fogColor; + varying float vFogDepth; + #ifdef FOG_EXP2 + uniform float fogDensity; + #else + uniform float fogNear; + uniform float fogFar; + #endif +#endif`,Dh=`#ifdef USE_GRADIENTMAP + uniform sampler2D gradientMap; +#endif +vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { + float dotNL = dot( normal, lightDirection ); + vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 ); + #ifdef USE_GRADIENTMAP + return vec3( texture2D( gradientMap, coord ).r ); + #else + vec2 fw = fwidth( coord ) * 0.5; + return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); + #endif +}`,Ih=`#ifdef USE_LIGHTMAP + vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); + vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; + reflectedLight.indirectDiffuse += lightMapIrradiance; +#endif`,Uh=`#ifdef USE_LIGHTMAP + uniform sampler2D lightMap; + uniform float lightMapIntensity; +#endif`,Nh=`LambertMaterial material; +material.diffuseColor = diffuseColor.rgb; +material.specularStrength = specularStrength;`,Oh=`varying vec3 vViewPosition; +struct LambertMaterial { + vec3 diffuseColor; + float specularStrength; +}; +void RE_Direct_Lambert( const in IncidentLight directLight, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) { + float dotNL = saturate( dot( geometry.normal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) { + reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +#define RE_Direct RE_Direct_Lambert +#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,Fh=`uniform bool receiveShadow; +uniform vec3 ambientLightColor; +uniform vec3 lightProbe[ 9 ]; +vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) { + float x = normal.x, y = normal.y, z = normal.z; + vec3 result = shCoefficients[ 0 ] * 0.886227; + result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y; + result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z; + result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x; + result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y; + result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z; + result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 ); + result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z; + result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y ); + return result; +} +vec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) { + vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); + vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe ); + return irradiance; +} +vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) { + vec3 irradiance = ambientLightColor; + return irradiance; +} +float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) { + #if defined ( LEGACY_LIGHTS ) + if ( cutoffDistance > 0.0 && decayExponent > 0.0 ) { + return pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent ); + } + return 1.0; + #else + float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 ); + if ( cutoffDistance > 0.0 ) { + distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) ); + } + return distanceFalloff; + #endif +} +float getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) { + return smoothstep( coneCosine, penumbraCosine, angleCosine ); +} +#if NUM_DIR_LIGHTS > 0 + struct DirectionalLight { + vec3 direction; + vec3 color; + }; + uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ]; + void getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) { + light.color = directionalLight.color; + light.direction = directionalLight.direction; + light.visible = true; + } +#endif +#if NUM_POINT_LIGHTS > 0 + struct PointLight { + vec3 position; + vec3 color; + float distance; + float decay; + }; + uniform PointLight pointLights[ NUM_POINT_LIGHTS ]; + void getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) { + vec3 lVector = pointLight.position - geometry.position; + light.direction = normalize( lVector ); + float lightDistance = length( lVector ); + light.color = pointLight.color; + light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay ); + light.visible = ( light.color != vec3( 0.0 ) ); + } +#endif +#if NUM_SPOT_LIGHTS > 0 + struct SpotLight { + vec3 position; + vec3 direction; + vec3 color; + float distance; + float decay; + float coneCos; + float penumbraCos; + }; + uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ]; + void getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) { + vec3 lVector = spotLight.position - geometry.position; + light.direction = normalize( lVector ); + float angleCos = dot( light.direction, spotLight.direction ); + float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos ); + if ( spotAttenuation > 0.0 ) { + float lightDistance = length( lVector ); + light.color = spotLight.color * spotAttenuation; + light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay ); + light.visible = ( light.color != vec3( 0.0 ) ); + } else { + light.color = vec3( 0.0 ); + light.visible = false; + } + } +#endif +#if NUM_RECT_AREA_LIGHTS > 0 + struct RectAreaLight { + vec3 color; + vec3 position; + vec3 halfWidth; + vec3 halfHeight; + }; + uniform sampler2D ltc_1; uniform sampler2D ltc_2; + uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ]; +#endif +#if NUM_HEMI_LIGHTS > 0 + struct HemisphereLight { + vec3 direction; + vec3 skyColor; + vec3 groundColor; + }; + uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ]; + vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) { + float dotNL = dot( normal, hemiLight.direction ); + float hemiDiffuseWeight = 0.5 * dotNL + 0.5; + vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); + return irradiance; + } +#endif`,zh=`#if defined( USE_ENVMAP ) + vec3 getIBLIrradiance( const in vec3 normal ) { + #if defined( ENVMAP_TYPE_CUBE_UV ) + vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); + vec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 ); + return PI * envMapColor.rgb * envMapIntensity; + #else + return vec3( 0.0 ); + #endif + } + vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) { + #if defined( ENVMAP_TYPE_CUBE_UV ) + vec3 reflectVec = reflect( - viewDir, normal ); + reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) ); + reflectVec = inverseTransformDirection( reflectVec, viewMatrix ); + vec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness ); + return envMapColor.rgb * envMapIntensity; + #else + return vec3( 0.0 ); + #endif + } +#endif`,kh=`ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`,Bh=`varying vec3 vViewPosition; +struct ToonMaterial { + vec3 diffuseColor; +}; +void RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) { + vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color; + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) { + reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +#define RE_Direct RE_Direct_Toon +#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,Gh=`BlinnPhongMaterial material; +material.diffuseColor = diffuseColor.rgb; +material.specularColor = specular; +material.specularShininess = shininess; +material.specularStrength = specularStrength;`,Hh=`varying vec3 vViewPosition; +struct BlinnPhongMaterial { + vec3 diffuseColor; + vec3 specularColor; + float specularShininess; + float specularStrength; +}; +void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { + float dotNL = saturate( dot( geometry.normal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); + reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength; +} +void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) { + reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +#define RE_Direct RE_Direct_BlinnPhong +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,Vh=`PhysicalMaterial material; +material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); +vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) ); +float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); +material.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness; +material.roughness = min( material.roughness, 1.0 ); +#ifdef IOR + material.ior = ior; + #ifdef USE_SPECULAR + float specularIntensityFactor = specularIntensity; + vec3 specularColorFactor = specularColor; + #ifdef USE_SPECULAR_COLORMAP + specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb; + #endif + #ifdef USE_SPECULAR_INTENSITYMAP + specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a; + #endif + material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor ); + #else + float specularIntensityFactor = 1.0; + vec3 specularColorFactor = vec3( 1.0 ); + material.specularF90 = 1.0; + #endif + material.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor ); +#else + material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor ); + material.specularF90 = 1.0; +#endif +#ifdef USE_CLEARCOAT + material.clearcoat = clearcoat; + material.clearcoatRoughness = clearcoatRoughness; + material.clearcoatF0 = vec3( 0.04 ); + material.clearcoatF90 = 1.0; + #ifdef USE_CLEARCOATMAP + material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x; + #endif + #ifdef USE_CLEARCOAT_ROUGHNESSMAP + material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y; + #endif + material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 ); + material.clearcoatRoughness += geometryRoughness; + material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 ); +#endif +#ifdef USE_IRIDESCENCE + material.iridescence = iridescence; + material.iridescenceIOR = iridescenceIOR; + #ifdef USE_IRIDESCENCEMAP + material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r; + #endif + #ifdef USE_IRIDESCENCE_THICKNESSMAP + material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum; + #else + material.iridescenceThickness = iridescenceThicknessMaximum; + #endif +#endif +#ifdef USE_SHEEN + material.sheenColor = sheenColor; + #ifdef USE_SHEEN_COLORMAP + material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb; + #endif + material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 ); + #ifdef USE_SHEEN_ROUGHNESSMAP + material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a; + #endif +#endif`,Wh=`struct PhysicalMaterial { + vec3 diffuseColor; + float roughness; + vec3 specularColor; + float specularF90; + #ifdef USE_CLEARCOAT + float clearcoat; + float clearcoatRoughness; + vec3 clearcoatF0; + float clearcoatF90; + #endif + #ifdef USE_IRIDESCENCE + float iridescence; + float iridescenceIOR; + float iridescenceThickness; + vec3 iridescenceFresnel; + vec3 iridescenceF0; + #endif + #ifdef USE_SHEEN + vec3 sheenColor; + float sheenRoughness; + #endif + #ifdef IOR + float ior; + #endif + #ifdef USE_TRANSMISSION + float transmission; + float transmissionAlpha; + float thickness; + float attenuationDistance; + vec3 attenuationColor; + #endif +}; +vec3 clearcoatSpecular = vec3( 0.0 ); +vec3 sheenSpecular = vec3( 0.0 ); +vec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) { + float x = clamp( 1.0 - dotVH, 0.0, 1.0 ); + float x2 = x * x; + float x5 = clamp( x * x2 * x2, 0.0, 0.9999 ); + return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 ); +} +float V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) { + float a2 = pow2( alpha ); + float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) ); + float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) ); + return 0.5 / max( gv + gl, EPSILON ); +} +float D_GGX( const in float alpha, const in float dotNH ) { + float a2 = pow2( alpha ); + float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; + return RECIPROCAL_PI * a2 / pow2( denom ); +} +#ifdef USE_CLEARCOAT + vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) { + vec3 f0 = material.clearcoatF0; + float f90 = material.clearcoatF90; + float roughness = material.clearcoatRoughness; + float alpha = pow2( roughness ); + vec3 halfDir = normalize( lightDir + viewDir ); + float dotNL = saturate( dot( normal, lightDir ) ); + float dotNV = saturate( dot( normal, viewDir ) ); + float dotNH = saturate( dot( normal, halfDir ) ); + float dotVH = saturate( dot( viewDir, halfDir ) ); + vec3 F = F_Schlick( f0, f90, dotVH ); + float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); + float D = D_GGX( alpha, dotNH ); + return F * ( V * D ); + } +#endif +vec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) { + vec3 f0 = material.specularColor; + float f90 = material.specularF90; + float roughness = material.roughness; + float alpha = pow2( roughness ); + vec3 halfDir = normalize( lightDir + viewDir ); + float dotNL = saturate( dot( normal, lightDir ) ); + float dotNV = saturate( dot( normal, viewDir ) ); + float dotNH = saturate( dot( normal, halfDir ) ); + float dotVH = saturate( dot( viewDir, halfDir ) ); + vec3 F = F_Schlick( f0, f90, dotVH ); + #ifdef USE_IRIDESCENCE + F = mix( F, material.iridescenceFresnel, material.iridescence ); + #endif + float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV ); + float D = D_GGX( alpha, dotNH ); + return F * ( V * D ); +} +vec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) { + const float LUT_SIZE = 64.0; + const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE; + const float LUT_BIAS = 0.5 / LUT_SIZE; + float dotNV = saturate( dot( N, V ) ); + vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) ); + uv = uv * LUT_SCALE + LUT_BIAS; + return uv; +} +float LTC_ClippedSphereFormFactor( const in vec3 f ) { + float l = length( f ); + return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 ); +} +vec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) { + float x = dot( v1, v2 ); + float y = abs( x ); + float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y; + float b = 3.4175940 + ( 4.1616724 + y ) * y; + float v = a / b; + float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v; + return cross( v1, v2 ) * theta_sintheta; +} +vec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) { + vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ]; + vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ]; + vec3 lightNormal = cross( v1, v2 ); + if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 ); + vec3 T1, T2; + T1 = normalize( V - N * dot( V, N ) ); + T2 = - cross( N, T1 ); + mat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) ); + vec3 coords[ 4 ]; + coords[ 0 ] = mat * ( rectCoords[ 0 ] - P ); + coords[ 1 ] = mat * ( rectCoords[ 1 ] - P ); + coords[ 2 ] = mat * ( rectCoords[ 2 ] - P ); + coords[ 3 ] = mat * ( rectCoords[ 3 ] - P ); + coords[ 0 ] = normalize( coords[ 0 ] ); + coords[ 1 ] = normalize( coords[ 1 ] ); + coords[ 2 ] = normalize( coords[ 2 ] ); + coords[ 3 ] = normalize( coords[ 3 ] ); + vec3 vectorFormFactor = vec3( 0.0 ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] ); + vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] ); + float result = LTC_ClippedSphereFormFactor( vectorFormFactor ); + return vec3( result ); +} +#if defined( USE_SHEEN ) +float D_Charlie( float roughness, float dotNH ) { + float alpha = pow2( roughness ); + float invAlpha = 1.0 / alpha; + float cos2h = dotNH * dotNH; + float sin2h = max( 1.0 - cos2h, 0.0078125 ); + return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI ); +} +float V_Neubelt( float dotNV, float dotNL ) { + return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) ); +} +vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) { + vec3 halfDir = normalize( lightDir + viewDir ); + float dotNL = saturate( dot( normal, lightDir ) ); + float dotNV = saturate( dot( normal, viewDir ) ); + float dotNH = saturate( dot( normal, halfDir ) ); + float D = D_Charlie( sheenRoughness, dotNH ); + float V = V_Neubelt( dotNV, dotNL ); + return sheenColor * ( D * V ); +} +#endif +float IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) { + float dotNV = saturate( dot( normal, viewDir ) ); + float r2 = roughness * roughness; + float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; + float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; + float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); + return saturate( DG * RECIPROCAL_PI ); +} +vec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) { + float dotNV = saturate( dot( normal, viewDir ) ); + const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 ); + const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 ); + vec4 r = roughness * c0 + c1; + float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y; + vec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw; + return fab; +} +vec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) { + vec2 fab = DFGApprox( normal, viewDir, roughness ); + return specularColor * fab.x + specularF90 * fab.y; +} +#ifdef USE_IRIDESCENCE +void computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) { +#else +void computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) { +#endif + vec2 fab = DFGApprox( normal, viewDir, roughness ); + #ifdef USE_IRIDESCENCE + vec3 Fr = mix( specularColor, iridescenceF0, iridescence ); + #else + vec3 Fr = specularColor; + #endif + vec3 FssEss = Fr * fab.x + specularF90 * fab.y; + float Ess = fab.x + fab.y; + float Ems = 1.0 - Ess; + vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg ); + singleScatter += FssEss; + multiScatter += Fms * Ems; +} +#if NUM_RECT_AREA_LIGHTS > 0 + void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + vec3 normal = geometry.normal; + vec3 viewDir = geometry.viewDir; + vec3 position = geometry.position; + vec3 lightPos = rectAreaLight.position; + vec3 halfWidth = rectAreaLight.halfWidth; + vec3 halfHeight = rectAreaLight.halfHeight; + vec3 lightColor = rectAreaLight.color; + float roughness = material.roughness; + vec3 rectCoords[ 4 ]; + rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight; + rectCoords[ 2 ] = lightPos - halfWidth + halfHeight; + rectCoords[ 3 ] = lightPos + halfWidth + halfHeight; + vec2 uv = LTC_Uv( normal, viewDir, roughness ); + vec4 t1 = texture2D( ltc_1, uv ); + vec4 t2 = texture2D( ltc_2, uv ); + mat3 mInv = mat3( + vec3( t1.x, 0, t1.y ), + vec3( 0, 1, 0 ), + vec3( t1.z, 0, t1.w ) + ); + vec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y ); + reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords ); + reflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords ); + } +#endif +void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + float dotNL = saturate( dot( geometry.normal, directLight.direction ) ); + vec3 irradiance = dotNL * directLight.color; + #ifdef USE_CLEARCOAT + float dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) ); + vec3 ccIrradiance = dotNLcc * directLight.color; + clearcoatSpecular += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material ); + #endif + #ifdef USE_SHEEN + sheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness ); + #endif + reflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material ); + reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) { + reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); +} +void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) { + #ifdef USE_CLEARCOAT + clearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness ); + #endif + #ifdef USE_SHEEN + sheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness ); + #endif + vec3 singleScattering = vec3( 0.0 ); + vec3 multiScattering = vec3( 0.0 ); + vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI; + #ifdef USE_IRIDESCENCE + computeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering ); + #else + computeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering ); + #endif + vec3 totalScattering = singleScattering + multiScattering; + vec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) ); + reflectedLight.indirectSpecular += radiance * singleScattering; + reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance; + reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance; +} +#define RE_Direct RE_Direct_Physical +#define RE_Direct_RectArea RE_Direct_RectArea_Physical +#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical +#define RE_IndirectSpecular RE_IndirectSpecular_Physical +float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { + return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); +}`,jh=` +GeometricContext geometry; +geometry.position = - vViewPosition; +geometry.normal = normal; +geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); +#ifdef USE_CLEARCOAT + geometry.clearcoatNormal = clearcoatNormal; +#endif +#ifdef USE_IRIDESCENCE + float dotNVi = saturate( dot( normal, geometry.viewDir ) ); + if ( material.iridescenceThickness == 0.0 ) { + material.iridescence = 0.0; + } else { + material.iridescence = saturate( material.iridescence ); + } + if ( material.iridescence > 0.0 ) { + material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor ); + material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi ); + } +#endif +IncidentLight directLight; +#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct ) + PointLight pointLight; + #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0 + PointLightShadow pointLightShadow; + #endif + #pragma unroll_loop_start + for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) { + pointLight = pointLights[ i ]; + getPointLightInfo( pointLight, geometry, directLight ); + #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) + pointLightShadow = pointLightShadows[ i ]; + directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0; + #endif + RE_Direct( directLight, geometry, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct ) + SpotLight spotLight; + vec4 spotColor; + vec3 spotLightCoord; + bool inSpotLightMap; + #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0 + SpotLightShadow spotLightShadow; + #endif + #pragma unroll_loop_start + for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) { + spotLight = spotLights[ i ]; + getSpotLightInfo( spotLight, geometry, directLight ); + #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) + #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX + #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) + #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS + #else + #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS ) + #endif + #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS ) + spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w; + inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) ); + spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy ); + directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color; + #endif + #undef SPOT_LIGHT_MAP_INDEX + #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) + spotLightShadow = spotLightShadows[ i ]; + directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; + #endif + RE_Direct( directLight, geometry, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) + DirectionalLight directionalLight; + #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0 + DirectionalLightShadow directionalLightShadow; + #endif + #pragma unroll_loop_start + for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) { + directionalLight = directionalLights[ i ]; + getDirectionalLightInfo( directionalLight, geometry, directLight ); + #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) + directionalLightShadow = directionalLightShadows[ i ]; + directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + #endif + RE_Direct( directLight, geometry, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea ) + RectAreaLight rectAreaLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) { + rectAreaLight = rectAreaLights[ i ]; + RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight ); + } + #pragma unroll_loop_end +#endif +#if defined( RE_IndirectDiffuse ) + vec3 iblIrradiance = vec3( 0.0 ); + vec3 irradiance = getAmbientLightIrradiance( ambientLightColor ); + irradiance += getLightProbeIrradiance( lightProbe, geometry.normal ); + #if ( NUM_HEMI_LIGHTS > 0 ) + #pragma unroll_loop_start + for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) { + irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal ); + } + #pragma unroll_loop_end + #endif +#endif +#if defined( RE_IndirectSpecular ) + vec3 radiance = vec3( 0.0 ); + vec3 clearcoatRadiance = vec3( 0.0 ); +#endif`,Xh=`#if defined( RE_IndirectDiffuse ) + #ifdef USE_LIGHTMAP + vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); + vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; + irradiance += lightMapIrradiance; + #endif + #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV ) + iblIrradiance += getIBLIrradiance( geometry.normal ); + #endif +#endif +#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular ) + radiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness ); + #ifdef USE_CLEARCOAT + clearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness ); + #endif +#endif`,qh=`#if defined( RE_IndirectDiffuse ) + RE_IndirectDiffuse( irradiance, geometry, material, reflectedLight ); +#endif +#if defined( RE_IndirectSpecular ) + RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight ); +#endif`,Yh=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) + gl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; +#endif`,Zh=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) + uniform float logDepthBufFC; + varying float vFragDepth; + varying float vIsPerspective; +#endif`,Qh=`#ifdef USE_LOGDEPTHBUF + #ifdef USE_LOGDEPTHBUF_EXT + varying float vFragDepth; + varying float vIsPerspective; + #else + uniform float logDepthBufFC; + #endif +#endif`,Kh=`#ifdef USE_LOGDEPTHBUF + #ifdef USE_LOGDEPTHBUF_EXT + vFragDepth = 1.0 + gl_Position.w; + vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); + #else + if ( isPerspectiveMatrix( projectionMatrix ) ) { + gl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0; + gl_Position.z *= gl_Position.w; + } + #endif +#endif`,Jh=`#ifdef USE_MAP + vec4 sampledDiffuseColor = texture2D( map, vMapUv ); + #ifdef DECODE_VIDEO_TEXTURE + sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w ); + #endif + diffuseColor *= sampledDiffuseColor; +#endif`,$h=`#ifdef USE_MAP + uniform sampler2D map; +#endif`,ed=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) + #if defined( USE_POINTS_UV ) + vec2 uv = vUv; + #else + vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy; + #endif +#endif +#ifdef USE_MAP + diffuseColor *= texture2D( map, uv ); +#endif +#ifdef USE_ALPHAMAP + diffuseColor.a *= texture2D( alphaMap, uv ).g; +#endif`,td=`#if defined( USE_POINTS_UV ) + varying vec2 vUv; +#else + #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) + uniform mat3 uvTransform; + #endif +#endif +#ifdef USE_MAP + uniform sampler2D map; +#endif +#ifdef USE_ALPHAMAP + uniform sampler2D alphaMap; +#endif`,nd=`float metalnessFactor = metalness; +#ifdef USE_METALNESSMAP + vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); + metalnessFactor *= texelMetalness.b; +#endif`,id=`#ifdef USE_METALNESSMAP + uniform sampler2D metalnessMap; +#endif`,rd=`#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE ) + vColor *= morphTargetBaseInfluence; + for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { + #if defined( USE_COLOR_ALPHA ) + if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ]; + #elif defined( USE_COLOR ) + if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; + #endif + } +#endif`,sd=`#ifdef USE_MORPHNORMALS + objectNormal *= morphTargetBaseInfluence; + #ifdef MORPHTARGETS_TEXTURE + for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { + if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; + } + #else + objectNormal += morphNormal0 * morphTargetInfluences[ 0 ]; + objectNormal += morphNormal1 * morphTargetInfluences[ 1 ]; + objectNormal += morphNormal2 * morphTargetInfluences[ 2 ]; + objectNormal += morphNormal3 * morphTargetInfluences[ 3 ]; + #endif +#endif`,od=`#ifdef USE_MORPHTARGETS + uniform float morphTargetBaseInfluence; + #ifdef MORPHTARGETS_TEXTURE + uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; + uniform sampler2DArray morphTargetsTexture; + uniform ivec2 morphTargetsTextureSize; + vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) { + int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset; + int y = texelIndex / morphTargetsTextureSize.x; + int x = texelIndex - y * morphTargetsTextureSize.x; + ivec3 morphUV = ivec3( x, y, morphTargetIndex ); + return texelFetch( morphTargetsTexture, morphUV, 0 ); + } + #else + #ifndef USE_MORPHNORMALS + uniform float morphTargetInfluences[ 8 ]; + #else + uniform float morphTargetInfluences[ 4 ]; + #endif + #endif +#endif`,ad=`#ifdef USE_MORPHTARGETS + transformed *= morphTargetBaseInfluence; + #ifdef MORPHTARGETS_TEXTURE + for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { + if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; + } + #else + transformed += morphTarget0 * morphTargetInfluences[ 0 ]; + transformed += morphTarget1 * morphTargetInfluences[ 1 ]; + transformed += morphTarget2 * morphTargetInfluences[ 2 ]; + transformed += morphTarget3 * morphTargetInfluences[ 3 ]; + #ifndef USE_MORPHNORMALS + transformed += morphTarget4 * morphTargetInfluences[ 4 ]; + transformed += morphTarget5 * morphTargetInfluences[ 5 ]; + transformed += morphTarget6 * morphTargetInfluences[ 6 ]; + transformed += morphTarget7 * morphTargetInfluences[ 7 ]; + #endif + #endif +#endif`,ld=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#ifdef FLAT_SHADED + vec3 fdx = dFdx( vViewPosition ); + vec3 fdy = dFdy( vViewPosition ); + vec3 normal = normalize( cross( fdx, fdy ) ); +#else + vec3 normal = normalize( vNormal ); + #ifdef DOUBLE_SIDED + normal *= faceDirection; + #endif +#endif +#ifdef USE_NORMALMAP_TANGENTSPACE + #ifdef USE_TANGENT + mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); + #else + mat3 tbn = getTangentFrame( - vViewPosition, normal, vNormalMapUv ); + #endif + #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) + tbn[0] *= faceDirection; + tbn[1] *= faceDirection; + #endif +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + #ifdef USE_TANGENT + mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal ); + #else + mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv ); + #endif + #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED ) + tbn2[0] *= faceDirection; + tbn2[1] *= faceDirection; + #endif +#endif +vec3 geometryNormal = normal;`,cd=`#ifdef USE_NORMALMAP_OBJECTSPACE + normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; + #ifdef FLIP_SIDED + normal = - normal; + #endif + #ifdef DOUBLE_SIDED + normal = normal * faceDirection; + #endif + normal = normalize( normalMatrix * normal ); +#elif defined( USE_NORMALMAP_TANGENTSPACE ) + vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; + mapN.xy *= normalScale; + normal = normalize( tbn * mapN ); +#elif defined( USE_BUMPMAP ) + normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); +#endif`,ud=`#ifndef FLAT_SHADED + varying vec3 vNormal; + #ifdef USE_TANGENT + varying vec3 vTangent; + varying vec3 vBitangent; + #endif +#endif`,fd=`#ifndef FLAT_SHADED + varying vec3 vNormal; + #ifdef USE_TANGENT + varying vec3 vTangent; + varying vec3 vBitangent; + #endif +#endif`,hd=`#ifndef FLAT_SHADED + vNormal = normalize( transformedNormal ); + #ifdef USE_TANGENT + vTangent = normalize( transformedTangent ); + vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); + #endif +#endif`,dd=`#ifdef USE_NORMALMAP + uniform sampler2D normalMap; + uniform vec2 normalScale; +#endif +#ifdef USE_NORMALMAP_OBJECTSPACE + uniform mat3 normalMatrix; +#endif +#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) ) + mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) { + vec3 q0 = dFdx( eye_pos.xyz ); + vec3 q1 = dFdy( eye_pos.xyz ); + vec2 st0 = dFdx( uv.st ); + vec2 st1 = dFdy( uv.st ); + vec3 N = surf_norm; + vec3 q1perp = cross( q1, N ); + vec3 q0perp = cross( N, q0 ); + vec3 T = q1perp * st0.x + q0perp * st1.x; + vec3 B = q1perp * st0.y + q0perp * st1.y; + float det = max( dot( T, T ), dot( B, B ) ); + float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); + return mat3( T * scale, B * scale, N ); + } +#endif`,pd=`#ifdef USE_CLEARCOAT + vec3 clearcoatNormal = geometryNormal; +#endif`,md=`#ifdef USE_CLEARCOAT_NORMALMAP + vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; + clearcoatMapN.xy *= clearcoatNormalScale; + clearcoatNormal = normalize( tbn2 * clearcoatMapN ); +#endif`,gd=`#ifdef USE_CLEARCOATMAP + uniform sampler2D clearcoatMap; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + uniform sampler2D clearcoatNormalMap; + uniform vec2 clearcoatNormalScale; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + uniform sampler2D clearcoatRoughnessMap; +#endif`,_d=`#ifdef USE_IRIDESCENCEMAP + uniform sampler2D iridescenceMap; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + uniform sampler2D iridescenceThicknessMap; +#endif`,vd=`#ifdef OPAQUE +diffuseColor.a = 1.0; +#endif +#ifdef USE_TRANSMISSION +diffuseColor.a *= material.transmissionAlpha + 0.1; +#endif +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,xd=`vec3 packNormalToRGB( const in vec3 normal ) { + return normalize( normal ) * 0.5 + 0.5; +} +vec3 unpackRGBToNormal( const in vec3 rgb ) { + return 2.0 * rgb.xyz - 1.0; +} +const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.; +const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. ); +const vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. ); +const float ShiftRight8 = 1. / 256.; +vec4 packDepthToRGBA( const in float v ) { + vec4 r = vec4( fract( v * PackFactors ), v ); + r.yzw -= r.xyz * ShiftRight8; return r * PackUpscale; +} +float unpackRGBAToDepth( const in vec4 v ) { + return dot( v, UnpackFactors ); +} +vec2 packDepthToRG( in highp float v ) { + return packDepthToRGBA( v ).yx; +} +float unpackRGToDepth( const in highp vec2 v ) { + return unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) ); +} +vec4 pack2HalfToRGBA( vec2 v ) { + vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) ); + return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w ); +} +vec2 unpackRGBATo2Half( vec4 v ) { + return vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) ); +} +float viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) { + return ( viewZ + near ) / ( near - far ); +} +float orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) { + return depth * ( near - far ) - near; +} +float viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) { + return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ ); +} +float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { + return ( near * far ) / ( ( far - near ) * depth - far ); +}`,Md=`#ifdef PREMULTIPLIED_ALPHA + gl_FragColor.rgb *= gl_FragColor.a; +#endif`,bd=`vec4 mvPosition = vec4( transformed, 1.0 ); +#ifdef USE_INSTANCING + mvPosition = instanceMatrix * mvPosition; +#endif +mvPosition = modelViewMatrix * mvPosition; +gl_Position = projectionMatrix * mvPosition;`,Sd=`#ifdef DITHERING + gl_FragColor.rgb = dithering( gl_FragColor.rgb ); +#endif`,yd=`#ifdef DITHERING + vec3 dithering( vec3 color ) { + float grid_position = rand( gl_FragCoord.xy ); + vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); + dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); + return color + dither_shift_RGB; + } +#endif`,wd=`float roughnessFactor = roughness; +#ifdef USE_ROUGHNESSMAP + vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); + roughnessFactor *= texelRoughness.g; +#endif`,Ed=`#ifdef USE_ROUGHNESSMAP + uniform sampler2D roughnessMap; +#endif`,Td=`#if NUM_SPOT_LIGHT_COORDS > 0 + varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; +#endif +#if NUM_SPOT_LIGHT_MAPS > 0 + uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ]; +#endif +#ifdef USE_SHADOWMAP + #if NUM_DIR_LIGHT_SHADOWS > 0 + uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ]; + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; + struct DirectionalLightShadow { + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; + #endif + #if NUM_SPOT_LIGHT_SHADOWS > 0 + uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ]; + struct SpotLightShadow { + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + uniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ]; + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; + struct PointLightShadow { + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + float shadowCameraNear; + float shadowCameraFar; + }; + uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; + #endif + float texture2DCompare( sampler2D depths, vec2 uv, float compare ) { + return step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) ); + } + vec2 texture2DDistribution( sampler2D shadow, vec2 uv ) { + return unpackRGBATo2Half( texture2D( shadow, uv ) ); + } + float VSMShadow (sampler2D shadow, vec2 uv, float compare ){ + float occlusion = 1.0; + vec2 distribution = texture2DDistribution( shadow, uv ); + float hard_shadow = step( compare , distribution.x ); + if (hard_shadow != 1.0 ) { + float distance = compare - distribution.x ; + float variance = max( 0.00000, distribution.y * distribution.y ); + float softness_probability = variance / (variance + distance * distance ); softness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 ); occlusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 ); + } + return occlusion; + } + float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) { + float shadow = 1.0; + shadowCoord.xyz /= shadowCoord.w; + shadowCoord.z += shadowBias; + bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0; + bool frustumTest = inFrustum && shadowCoord.z <= 1.0; + if ( frustumTest ) { + #if defined( SHADOWMAP_TYPE_PCF ) + vec2 texelSize = vec2( 1.0 ) / shadowMapSize; + float dx0 = - texelSize.x * shadowRadius; + float dy0 = - texelSize.y * shadowRadius; + float dx1 = + texelSize.x * shadowRadius; + float dy1 = + texelSize.y * shadowRadius; + float dx2 = dx0 / 2.0; + float dy2 = dy0 / 2.0; + float dx3 = dx1 / 2.0; + float dy3 = dy1 / 2.0; + shadow = ( + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) + + texture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z ) + ) * ( 1.0 / 17.0 ); + #elif defined( SHADOWMAP_TYPE_PCF_SOFT ) + vec2 texelSize = vec2( 1.0 ) / shadowMapSize; + float dx = texelSize.x; + float dy = texelSize.y; + vec2 uv = shadowCoord.xy; + vec2 f = fract( uv * shadowMapSize + 0.5 ); + uv -= f * texelSize; + shadow = ( + texture2DCompare( shadowMap, uv, shadowCoord.z ) + + texture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) + + texture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) + + texture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) + + mix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), + texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ), + f.x ) + + mix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), + texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ), + f.x ) + + mix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), + texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ), + f.y ) + + mix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), + texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ), + f.y ) + + mix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), + texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ), + f.x ), + mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), + texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ), + f.x ), + f.y ) + ) * ( 1.0 / 9.0 ); + #elif defined( SHADOWMAP_TYPE_VSM ) + shadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z ); + #else + shadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ); + #endif + } + return shadow; + } + vec2 cubeToUV( vec3 v, float texelSizeY ) { + vec3 absV = abs( v ); + float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) ); + absV *= scaleToCube; + v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY ); + vec2 planar = v.xy; + float almostATexel = 1.5 * texelSizeY; + float almostOne = 1.0 - almostATexel; + if ( absV.z >= almostOne ) { + if ( v.z > 0.0 ) + planar.x = 4.0 - v.x; + } else if ( absV.x >= almostOne ) { + float signX = sign( v.x ); + planar.x = v.z * signX + 2.0 * signX; + } else if ( absV.y >= almostOne ) { + float signY = sign( v.y ); + planar.x = v.x + 2.0 * signY + 2.0; + planar.y = v.z * signY - 2.0; + } + return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 ); + } + float getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) { + vec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) ); + vec3 lightToPosition = shadowCoord.xyz; + float dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear ); dp += shadowBias; + vec3 bd3D = normalize( lightToPosition ); + #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM ) + vec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y; + return ( + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) + + texture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp ) + ) * ( 1.0 / 9.0 ); + #else + return texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ); + #endif + } +#endif`,Ad=`#if NUM_SPOT_LIGHT_COORDS > 0 + uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; + varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; +#endif +#ifdef USE_SHADOWMAP + #if NUM_DIR_LIGHT_SHADOWS > 0 + uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ]; + varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; + struct DirectionalLightShadow { + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ]; + #endif + #if NUM_SPOT_LIGHT_SHADOWS > 0 + struct SpotLightShadow { + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + }; + uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ]; + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ]; + varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ]; + struct PointLightShadow { + float shadowBias; + float shadowNormalBias; + float shadowRadius; + vec2 shadowMapSize; + float shadowCameraNear; + float shadowCameraFar; + }; + uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; + #endif +#endif`,Cd=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) + vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); + vec4 shadowWorldPosition; +#endif +#if defined( USE_SHADOWMAP ) + #if NUM_DIR_LIGHT_SHADOWS > 0 + #pragma unroll_loop_start + for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { + shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 ); + vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition; + } + #pragma unroll_loop_end + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + #pragma unroll_loop_start + for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { + shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 ); + vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition; + } + #pragma unroll_loop_end + #endif +#endif +#if NUM_SPOT_LIGHT_COORDS > 0 + #pragma unroll_loop_start + for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) { + shadowWorldPosition = worldPosition; + #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) + shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias; + #endif + vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; + } + #pragma unroll_loop_end +#endif`,Pd=`float getShadowMask() { + float shadow = 1.0; + #ifdef USE_SHADOWMAP + #if NUM_DIR_LIGHT_SHADOWS > 0 + DirectionalLightShadow directionalLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) { + directionalLight = directionalLightShadows[ i ]; + shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0; + } + #pragma unroll_loop_end + #endif + #if NUM_SPOT_LIGHT_SHADOWS > 0 + SpotLightShadow spotLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) { + spotLight = spotLightShadows[ i ]; + shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0; + } + #pragma unroll_loop_end + #endif + #if NUM_POINT_LIGHT_SHADOWS > 0 + PointLightShadow pointLight; + #pragma unroll_loop_start + for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) { + pointLight = pointLightShadows[ i ]; + shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0; + } + #pragma unroll_loop_end + #endif + #endif + return shadow; +}`,Ld=`#ifdef USE_SKINNING + mat4 boneMatX = getBoneMatrix( skinIndex.x ); + mat4 boneMatY = getBoneMatrix( skinIndex.y ); + mat4 boneMatZ = getBoneMatrix( skinIndex.z ); + mat4 boneMatW = getBoneMatrix( skinIndex.w ); +#endif`,Rd=`#ifdef USE_SKINNING + uniform mat4 bindMatrix; + uniform mat4 bindMatrixInverse; + uniform highp sampler2D boneTexture; + uniform int boneTextureSize; + mat4 getBoneMatrix( const in float i ) { + float j = i * 4.0; + float x = mod( j, float( boneTextureSize ) ); + float y = floor( j / float( boneTextureSize ) ); + float dx = 1.0 / float( boneTextureSize ); + float dy = 1.0 / float( boneTextureSize ); + y = dy * ( y + 0.5 ); + vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) ); + vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) ); + vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) ); + vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) ); + mat4 bone = mat4( v1, v2, v3, v4 ); + return bone; + } +#endif`,Dd=`#ifdef USE_SKINNING + vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); + vec4 skinned = vec4( 0.0 ); + skinned += boneMatX * skinVertex * skinWeight.x; + skinned += boneMatY * skinVertex * skinWeight.y; + skinned += boneMatZ * skinVertex * skinWeight.z; + skinned += boneMatW * skinVertex * skinWeight.w; + transformed = ( bindMatrixInverse * skinned ).xyz; +#endif`,Id=`#ifdef USE_SKINNING + mat4 skinMatrix = mat4( 0.0 ); + skinMatrix += skinWeight.x * boneMatX; + skinMatrix += skinWeight.y * boneMatY; + skinMatrix += skinWeight.z * boneMatZ; + skinMatrix += skinWeight.w * boneMatW; + skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix; + objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz; + #ifdef USE_TANGENT + objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; + #endif +#endif`,Ud=`float specularStrength; +#ifdef USE_SPECULARMAP + vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); + specularStrength = texelSpecular.r; +#else + specularStrength = 1.0; +#endif`,Nd=`#ifdef USE_SPECULARMAP + uniform sampler2D specularMap; +#endif`,Od=`#if defined( TONE_MAPPING ) + gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); +#endif`,Fd=`#ifndef saturate +#define saturate( a ) clamp( a, 0.0, 1.0 ) +#endif +uniform float toneMappingExposure; +vec3 LinearToneMapping( vec3 color ) { + return toneMappingExposure * color; +} +vec3 ReinhardToneMapping( vec3 color ) { + color *= toneMappingExposure; + return saturate( color / ( vec3( 1.0 ) + color ) ); +} +vec3 OptimizedCineonToneMapping( vec3 color ) { + color *= toneMappingExposure; + color = max( vec3( 0.0 ), color - 0.004 ); + return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) ); +} +vec3 RRTAndODTFit( vec3 v ) { + vec3 a = v * ( v + 0.0245786 ) - 0.000090537; + vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081; + return a / b; +} +vec3 ACESFilmicToneMapping( vec3 color ) { + const mat3 ACESInputMat = mat3( + vec3( 0.59719, 0.07600, 0.02840 ), vec3( 0.35458, 0.90834, 0.13383 ), + vec3( 0.04823, 0.01566, 0.83777 ) + ); + const mat3 ACESOutputMat = mat3( + vec3( 1.60475, -0.10208, -0.00327 ), vec3( -0.53108, 1.10813, -0.07276 ), + vec3( -0.07367, -0.00605, 1.07602 ) + ); + color *= toneMappingExposure / 0.6; + color = ACESInputMat * color; + color = RRTAndODTFit( color ); + color = ACESOutputMat * color; + return saturate( color ); +} +vec3 CustomToneMapping( vec3 color ) { return color; }`,zd=`#ifdef USE_TRANSMISSION + material.transmission = transmission; + material.transmissionAlpha = 1.0; + material.thickness = thickness; + material.attenuationDistance = attenuationDistance; + material.attenuationColor = attenuationColor; + #ifdef USE_TRANSMISSIONMAP + material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r; + #endif + #ifdef USE_THICKNESSMAP + material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g; + #endif + vec3 pos = vWorldPosition; + vec3 v = normalize( cameraPosition - pos ); + vec3 n = inverseTransformDirection( normal, viewMatrix ); + vec4 transmission = getIBLVolumeRefraction( + n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness, + material.attenuationColor, material.attenuationDistance ); + material.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission ); + totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); +#endif`,kd=`#ifdef USE_TRANSMISSION + uniform float transmission; + uniform float thickness; + uniform float attenuationDistance; + uniform vec3 attenuationColor; + #ifdef USE_TRANSMISSIONMAP + uniform sampler2D transmissionMap; + #endif + #ifdef USE_THICKNESSMAP + uniform sampler2D thicknessMap; + #endif + uniform vec2 transmissionSamplerSize; + uniform sampler2D transmissionSamplerMap; + uniform mat4 modelMatrix; + uniform mat4 projectionMatrix; + varying vec3 vWorldPosition; + float w0( float a ) { + return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 ); + } + float w1( float a ) { + return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 ); + } + float w2( float a ){ + return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 ); + } + float w3( float a ) { + return ( 1.0 / 6.0 ) * ( a * a * a ); + } + float g0( float a ) { + return w0( a ) + w1( a ); + } + float g1( float a ) { + return w2( a ) + w3( a ); + } + float h0( float a ) { + return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) ); + } + float h1( float a ) { + return 1.0 + w3( a ) / ( w2( a ) + w3( a ) ); + } + vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, vec2 fullSize, float lod ) { + uv = uv * texelSize.zw + 0.5; + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + float g0x = g0( fuv.x ); + float g1x = g1( fuv.x ); + float h0x = h0( fuv.x ); + float h1x = h1( fuv.x ); + float h0y = h0( fuv.y ); + float h1y = h1( fuv.y ); + vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; + vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; + vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; + vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; + + vec2 lodFudge = pow( 1.95, lod ) / fullSize; + return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) + + g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) ); + } + vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) { + vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) ); + vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) ); + vec2 fLodSizeInv = 1.0 / fLodSize; + vec2 cLodSizeInv = 1.0 / cLodSize; + vec2 fullSize = vec2( textureSize( sampler, 0 ) ); + vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), fullSize, floor( lod ) ); + vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), fullSize, ceil( lod ) ); + return mix( fSample, cSample, fract( lod ) ); + } + vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) { + vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior ); + vec3 modelScale; + modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) ); + modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) ); + modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) ); + return normalize( refractionVector ) * thickness * modelScale; + } + float applyIorToRoughness( const in float roughness, const in float ior ) { + return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 ); + } + vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) { + float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior ); + return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod ); + } + vec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) { + if ( isinf( attenuationDistance ) ) { + return radiance; + } else { + vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance; + vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); return transmittance * radiance; + } + } + vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor, + const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix, + const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness, + const in vec3 attenuationColor, const in float attenuationDistance ) { + vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix ); + vec3 refractedRayExit = position + transmissionRay; + vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); + vec2 refractionCoords = ndcPos.xy / ndcPos.w; + refractionCoords += 1.0; + refractionCoords /= 2.0; + vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior ); + vec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance ); + vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); + return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a ); + } +#endif`,Bd=`#ifdef USE_UV + varying vec2 vUv; +#endif +#ifdef USE_MAP + varying vec2 vMapUv; +#endif +#ifdef USE_ALPHAMAP + varying vec2 vAlphaMapUv; +#endif +#ifdef USE_LIGHTMAP + varying vec2 vLightMapUv; +#endif +#ifdef USE_AOMAP + varying vec2 vAoMapUv; +#endif +#ifdef USE_BUMPMAP + varying vec2 vBumpMapUv; +#endif +#ifdef USE_NORMALMAP + varying vec2 vNormalMapUv; +#endif +#ifdef USE_EMISSIVEMAP + varying vec2 vEmissiveMapUv; +#endif +#ifdef USE_METALNESSMAP + varying vec2 vMetalnessMapUv; +#endif +#ifdef USE_ROUGHNESSMAP + varying vec2 vRoughnessMapUv; +#endif +#ifdef USE_CLEARCOATMAP + varying vec2 vClearcoatMapUv; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + varying vec2 vClearcoatNormalMapUv; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + varying vec2 vClearcoatRoughnessMapUv; +#endif +#ifdef USE_IRIDESCENCEMAP + varying vec2 vIridescenceMapUv; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + varying vec2 vIridescenceThicknessMapUv; +#endif +#ifdef USE_SHEEN_COLORMAP + varying vec2 vSheenColorMapUv; +#endif +#ifdef USE_SHEEN_ROUGHNESSMAP + varying vec2 vSheenRoughnessMapUv; +#endif +#ifdef USE_SPECULARMAP + varying vec2 vSpecularMapUv; +#endif +#ifdef USE_SPECULAR_COLORMAP + varying vec2 vSpecularColorMapUv; +#endif +#ifdef USE_SPECULAR_INTENSITYMAP + varying vec2 vSpecularIntensityMapUv; +#endif +#ifdef USE_TRANSMISSIONMAP + uniform mat3 transmissionMapTransform; + varying vec2 vTransmissionMapUv; +#endif +#ifdef USE_THICKNESSMAP + uniform mat3 thicknessMapTransform; + varying vec2 vThicknessMapUv; +#endif`,Gd=`#ifdef USE_UV + varying vec2 vUv; +#endif +#ifdef USE_UV2 + attribute vec2 uv2; +#endif +#ifdef USE_MAP + uniform mat3 mapTransform; + varying vec2 vMapUv; +#endif +#ifdef USE_ALPHAMAP + uniform mat3 alphaMapTransform; + varying vec2 vAlphaMapUv; +#endif +#ifdef USE_LIGHTMAP + uniform mat3 lightMapTransform; + varying vec2 vLightMapUv; +#endif +#ifdef USE_AOMAP + uniform mat3 aoMapTransform; + varying vec2 vAoMapUv; +#endif +#ifdef USE_BUMPMAP + uniform mat3 bumpMapTransform; + varying vec2 vBumpMapUv; +#endif +#ifdef USE_NORMALMAP + uniform mat3 normalMapTransform; + varying vec2 vNormalMapUv; +#endif +#ifdef USE_DISPLACEMENTMAP + uniform mat3 displacementMapTransform; + varying vec2 vDisplacementMapUv; +#endif +#ifdef USE_EMISSIVEMAP + uniform mat3 emissiveMapTransform; + varying vec2 vEmissiveMapUv; +#endif +#ifdef USE_METALNESSMAP + uniform mat3 metalnessMapTransform; + varying vec2 vMetalnessMapUv; +#endif +#ifdef USE_ROUGHNESSMAP + uniform mat3 roughnessMapTransform; + varying vec2 vRoughnessMapUv; +#endif +#ifdef USE_CLEARCOATMAP + uniform mat3 clearcoatMapTransform; + varying vec2 vClearcoatMapUv; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + uniform mat3 clearcoatNormalMapTransform; + varying vec2 vClearcoatNormalMapUv; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + uniform mat3 clearcoatRoughnessMapTransform; + varying vec2 vClearcoatRoughnessMapUv; +#endif +#ifdef USE_SHEEN_COLORMAP + uniform mat3 sheenColorMapTransform; + varying vec2 vSheenColorMapUv; +#endif +#ifdef USE_SHEEN_ROUGHNESSMAP + uniform mat3 sheenRoughnessMapTransform; + varying vec2 vSheenRoughnessMapUv; +#endif +#ifdef USE_IRIDESCENCEMAP + uniform mat3 iridescenceMapTransform; + varying vec2 vIridescenceMapUv; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + uniform mat3 iridescenceThicknessMapTransform; + varying vec2 vIridescenceThicknessMapUv; +#endif +#ifdef USE_SPECULARMAP + uniform mat3 specularMapTransform; + varying vec2 vSpecularMapUv; +#endif +#ifdef USE_SPECULAR_COLORMAP + uniform mat3 specularColorMapTransform; + varying vec2 vSpecularColorMapUv; +#endif +#ifdef USE_SPECULAR_INTENSITYMAP + uniform mat3 specularIntensityMapTransform; + varying vec2 vSpecularIntensityMapUv; +#endif +#ifdef USE_TRANSMISSIONMAP + uniform mat3 transmissionMapTransform; + varying vec2 vTransmissionMapUv; +#endif +#ifdef USE_THICKNESSMAP + uniform mat3 thicknessMapTransform; + varying vec2 vThicknessMapUv; +#endif`,Hd=`#ifdef USE_UV + vUv = vec3( uv, 1 ).xy; +#endif +#ifdef USE_MAP + vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy; +#endif +#ifdef USE_ALPHAMAP + vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_LIGHTMAP + vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_AOMAP + vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_BUMPMAP + vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_NORMALMAP + vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_DISPLACEMENTMAP + vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_EMISSIVEMAP + vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_METALNESSMAP + vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_ROUGHNESSMAP + vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_CLEARCOATMAP + vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_CLEARCOAT_NORMALMAP + vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_CLEARCOAT_ROUGHNESSMAP + vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_IRIDESCENCEMAP + vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_IRIDESCENCE_THICKNESSMAP + vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SHEEN_COLORMAP + vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SHEEN_ROUGHNESSMAP + vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SPECULARMAP + vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SPECULAR_COLORMAP + vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_SPECULAR_INTENSITYMAP + vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_TRANSMISSIONMAP + vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy; +#endif +#ifdef USE_THICKNESSMAP + vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; +#endif`,Vd=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 + vec4 worldPosition = vec4( transformed, 1.0 ); + #ifdef USE_INSTANCING + worldPosition = instanceMatrix * worldPosition; + #endif + worldPosition = modelMatrix * worldPosition; +#endif`;const Wd=`varying vec2 vUv; +uniform mat3 uvTransform; +void main() { + vUv = ( uvTransform * vec3( uv, 1 ) ).xy; + gl_Position = vec4( position.xy, 1.0, 1.0 ); +}`,jd=`uniform sampler2D t2D; +uniform float backgroundIntensity; +varying vec2 vUv; +void main() { + vec4 texColor = texture2D( t2D, vUv ); + #ifdef DECODE_VIDEO_TEXTURE + texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w ); + #endif + texColor.rgb *= backgroundIntensity; + gl_FragColor = texColor; + #include + #include +}`,Xd=`varying vec3 vWorldDirection; +#include +void main() { + vWorldDirection = transformDirection( position, modelMatrix ); + #include + #include + gl_Position.z = gl_Position.w; +}`,qd=`#ifdef ENVMAP_TYPE_CUBE + uniform samplerCube envMap; +#elif defined( ENVMAP_TYPE_CUBE_UV ) + uniform sampler2D envMap; +#endif +uniform float flipEnvMap; +uniform float backgroundBlurriness; +uniform float backgroundIntensity; +varying vec3 vWorldDirection; +#include +void main() { + #ifdef ENVMAP_TYPE_CUBE + vec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) ); + #elif defined( ENVMAP_TYPE_CUBE_UV ) + vec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness ); + #else + vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + #endif + texColor.rgb *= backgroundIntensity; + gl_FragColor = texColor; + #include + #include +}`,Yd=`varying vec3 vWorldDirection; +#include +void main() { + vWorldDirection = transformDirection( position, modelMatrix ); + #include + #include + gl_Position.z = gl_Position.w; +}`,Zd=`uniform samplerCube tCube; +uniform float tFlip; +uniform float opacity; +varying vec3 vWorldDirection; +void main() { + vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) ); + gl_FragColor = texColor; + gl_FragColor.a *= opacity; + #include + #include +}`,Qd=`#include +#include +#include +#include +#include +#include +#include +varying vec2 vHighPrecisionZW; +void main() { + #include + #include + #ifdef USE_DISPLACEMENTMAP + #include + #include + #include + #endif + #include + #include + #include + #include + #include + #include + #include + vHighPrecisionZW = gl_Position.zw; +}`,Kd=`#if DEPTH_PACKING == 3200 + uniform float opacity; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +varying vec2 vHighPrecisionZW; +void main() { + #include + vec4 diffuseColor = vec4( 1.0 ); + #if DEPTH_PACKING == 3200 + diffuseColor.a = opacity; + #endif + #include + #include + #include + #include + float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5; + #if DEPTH_PACKING == 3200 + gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity ); + #elif DEPTH_PACKING == 3201 + gl_FragColor = packDepthToRGBA( fragCoordZ ); + #endif +}`,Jd=`#define DISTANCE +varying vec3 vWorldPosition; +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #ifdef USE_DISPLACEMENTMAP + #include + #include + #include + #endif + #include + #include + #include + #include + #include + #include + #include + vWorldPosition = worldPosition.xyz; +}`,$d=`#define DISTANCE +uniform vec3 referencePosition; +uniform float nearDistance; +uniform float farDistance; +varying vec3 vWorldPosition; +#include +#include +#include +#include +#include +#include +#include +void main () { + #include + vec4 diffuseColor = vec4( 1.0 ); + #include + #include + #include + float dist = length( vWorldPosition - referencePosition ); + dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); + dist = saturate( dist ); + gl_FragColor = packDepthToRGBA( dist ); +}`,ep=`varying vec3 vWorldDirection; +#include +void main() { + vWorldDirection = transformDirection( position, modelMatrix ); + #include + #include +}`,tp=`uniform sampler2D tEquirect; +varying vec3 vWorldDirection; +#include +void main() { + vec3 direction = normalize( vWorldDirection ); + vec2 sampleUV = equirectUv( direction ); + gl_FragColor = texture2D( tEquirect, sampleUV ); + #include + #include +}`,np=`uniform float scale; +attribute float lineDistance; +varying float vLineDistance; +#include +#include +#include +#include +#include +#include +#include +void main() { + vLineDistance = scale * lineDistance; + #include + #include + #include + #include + #include + #include + #include + #include + #include +}`,ip=`uniform vec3 diffuse; +uniform float opacity; +uniform float dashSize; +uniform float totalSize; +varying float vLineDistance; +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + if ( mod( vLineDistance, totalSize ) > dashSize ) { + discard; + } + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + outgoingLight = diffuseColor.rgb; + #include + #include + #include + #include + #include +}`,rp=`#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING ) + #include + #include + #include + #include + #include + #endif + #include + #include + #include + #include + #include + #include + #include + #include + #include +}`,sp=`uniform vec3 diffuse; +uniform float opacity; +#ifndef FLAT_SHADED + varying vec3 vNormal; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + #include + #include + #include + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + #ifdef USE_LIGHTMAP + vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); + reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI; + #else + reflectedLight.indirectDiffuse += vec3( 1.0 ); + #endif + #include + reflectedLight.indirectDiffuse *= diffuseColor.rgb; + vec3 outgoingLight = reflectedLight.indirectDiffuse; + #include + #include + #include + #include + #include + #include + #include +}`,op=`#define LAMBERT +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include + #include +}`,ap=`#define LAMBERT +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; + #include + #include + #include + #include + #include + #include + #include +}`,lp=`#define MATCAP +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; +}`,cp=`#define MATCAP +uniform vec3 diffuse; +uniform float opacity; +uniform sampler2D matcap; +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + #include + #include + #include + #include + vec3 viewDir = normalize( vViewPosition ); + vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) ); + vec3 y = cross( viewDir, x ); + vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; + #ifdef USE_MATCAP + vec4 matcapColor = texture2D( matcap, uv ); + #else + vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 ); + #endif + vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb; + #include + #include + #include + #include + #include + #include +}`,up=`#define NORMAL +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) + varying vec3 vViewPosition; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) + vViewPosition = - mvPosition.xyz; +#endif +}`,fp=`#define NORMAL +uniform float opacity; +#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) + varying vec3 vViewPosition; +#endif +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + gl_FragColor = vec4( packNormalToRGB( normal ), opacity ); + #ifdef OPAQUE + gl_FragColor.a = 1.0; + #endif +}`,hp=`#define PHONG +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include + #include +}`,dp=`#define PHONG +uniform vec3 diffuse; +uniform vec3 emissive; +uniform vec3 specular; +uniform float shininess; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; + #include + #include + #include + #include + #include + #include + #include +}`,pp=`#define STANDARD +varying vec3 vViewPosition; +#ifdef USE_TRANSMISSION + varying vec3 vWorldPosition; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include +#ifdef USE_TRANSMISSION + vWorldPosition = worldPosition.xyz; +#endif +}`,mp=`#define STANDARD +#ifdef PHYSICAL + #define IOR + #define USE_SPECULAR +#endif +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float roughness; +uniform float metalness; +uniform float opacity; +#ifdef IOR + uniform float ior; +#endif +#ifdef USE_SPECULAR + uniform float specularIntensity; + uniform vec3 specularColor; + #ifdef USE_SPECULAR_COLORMAP + uniform sampler2D specularColorMap; + #endif + #ifdef USE_SPECULAR_INTENSITYMAP + uniform sampler2D specularIntensityMap; + #endif +#endif +#ifdef USE_CLEARCOAT + uniform float clearcoat; + uniform float clearcoatRoughness; +#endif +#ifdef USE_IRIDESCENCE + uniform float iridescence; + uniform float iridescenceIOR; + uniform float iridescenceThicknessMinimum; + uniform float iridescenceThicknessMaximum; +#endif +#ifdef USE_SHEEN + uniform vec3 sheenColor; + uniform float sheenRoughness; + #ifdef USE_SHEEN_COLORMAP + uniform sampler2D sheenColorMap; + #endif + #ifdef USE_SHEEN_ROUGHNESSMAP + uniform sampler2D sheenRoughnessMap; + #endif +#endif +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; + vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular; + #include + vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance; + #ifdef USE_SHEEN + float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor ); + outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular; + #endif + #ifdef USE_CLEARCOAT + float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) ); + vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc ); + outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat; + #endif + #include + #include + #include + #include + #include + #include +}`,gp=`#define TOON +varying vec3 vViewPosition; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vViewPosition = - mvPosition.xyz; + #include + #include + #include +}`,_p=`#define TOON +uniform vec3 diffuse; +uniform vec3 emissive; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec4 diffuseColor = vec4( diffuse, opacity ); + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + vec3 totalEmissiveRadiance = emissive; + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance; + #include + #include + #include + #include + #include + #include +}`,vp=`uniform float size; +uniform float scale; +#include +#include +#include +#include +#include +#include +#ifdef USE_POINTS_UV + varying vec2 vUv; + uniform mat3 uvTransform; +#endif +void main() { + #ifdef USE_POINTS_UV + vUv = ( uvTransform * vec3( uv, 1 ) ).xy; + #endif + #include + #include + #include + #include + #include + gl_PointSize = size; + #ifdef USE_SIZEATTENUATION + bool isPerspective = isPerspectiveMatrix( projectionMatrix ); + if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z ); + #endif + #include + #include + #include + #include +}`,xp=`uniform vec3 diffuse; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + #include + outgoingLight = diffuseColor.rgb; + #include + #include + #include + #include + #include +}`,Mp=`#include +#include +#include +#include +#include +#include +void main() { + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +}`,bp=`uniform vec3 color; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) ); + #include + #include + #include +}`,Sp=`uniform float rotation; +uniform vec2 center; +#include +#include +#include +#include +#include +void main() { + #include + vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 ); + vec2 scale; + scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) ); + scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) ); + #ifndef USE_SIZEATTENUATION + bool isPerspective = isPerspectiveMatrix( projectionMatrix ); + if ( isPerspective ) scale *= - mvPosition.z; + #endif + vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale; + vec2 rotatedPosition; + rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y; + rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y; + mvPosition.xy += rotatedPosition; + gl_Position = projectionMatrix * mvPosition; + #include + #include + #include +}`,yp=`uniform vec3 diffuse; +uniform float opacity; +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec3 outgoingLight = vec3( 0.0 ); + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + #include + outgoingLight = diffuseColor.rgb; + #include + #include + #include + #include +}`,ke={alphamap_fragment:Zf,alphamap_pars_fragment:Qf,alphatest_fragment:Kf,alphatest_pars_fragment:Jf,aomap_fragment:$f,aomap_pars_fragment:eh,begin_vertex:th,beginnormal_vertex:nh,bsdfs:ih,iridescence_fragment:rh,bumpmap_pars_fragment:sh,clipping_planes_fragment:oh,clipping_planes_pars_fragment:ah,clipping_planes_pars_vertex:lh,clipping_planes_vertex:ch,color_fragment:uh,color_pars_fragment:fh,color_pars_vertex:hh,color_vertex:dh,common:ph,cube_uv_reflection_fragment:mh,defaultnormal_vertex:gh,displacementmap_pars_vertex:_h,displacementmap_vertex:vh,emissivemap_fragment:xh,emissivemap_pars_fragment:Mh,encodings_fragment:bh,encodings_pars_fragment:Sh,envmap_fragment:yh,envmap_common_pars_fragment:wh,envmap_pars_fragment:Eh,envmap_pars_vertex:Th,envmap_physical_pars_fragment:zh,envmap_vertex:Ah,fog_vertex:Ch,fog_pars_vertex:Ph,fog_fragment:Lh,fog_pars_fragment:Rh,gradientmap_pars_fragment:Dh,lightmap_fragment:Ih,lightmap_pars_fragment:Uh,lights_lambert_fragment:Nh,lights_lambert_pars_fragment:Oh,lights_pars_begin:Fh,lights_toon_fragment:kh,lights_toon_pars_fragment:Bh,lights_phong_fragment:Gh,lights_phong_pars_fragment:Hh,lights_physical_fragment:Vh,lights_physical_pars_fragment:Wh,lights_fragment_begin:jh,lights_fragment_maps:Xh,lights_fragment_end:qh,logdepthbuf_fragment:Yh,logdepthbuf_pars_fragment:Zh,logdepthbuf_pars_vertex:Qh,logdepthbuf_vertex:Kh,map_fragment:Jh,map_pars_fragment:$h,map_particle_fragment:ed,map_particle_pars_fragment:td,metalnessmap_fragment:nd,metalnessmap_pars_fragment:id,morphcolor_vertex:rd,morphnormal_vertex:sd,morphtarget_pars_vertex:od,morphtarget_vertex:ad,normal_fragment_begin:ld,normal_fragment_maps:cd,normal_pars_fragment:ud,normal_pars_vertex:fd,normal_vertex:hd,normalmap_pars_fragment:dd,clearcoat_normal_fragment_begin:pd,clearcoat_normal_fragment_maps:md,clearcoat_pars_fragment:gd,iridescence_pars_fragment:_d,output_fragment:vd,packing:xd,premultiplied_alpha_fragment:Md,project_vertex:bd,dithering_fragment:Sd,dithering_pars_fragment:yd,roughnessmap_fragment:wd,roughnessmap_pars_fragment:Ed,shadowmap_pars_fragment:Td,shadowmap_pars_vertex:Ad,shadowmap_vertex:Cd,shadowmask_pars_fragment:Pd,skinbase_vertex:Ld,skinning_pars_vertex:Rd,skinning_vertex:Dd,skinnormal_vertex:Id,specularmap_fragment:Ud,specularmap_pars_fragment:Nd,tonemapping_fragment:Od,tonemapping_pars_fragment:Fd,transmission_fragment:zd,transmission_pars_fragment:kd,uv_pars_fragment:Bd,uv_pars_vertex:Gd,uv_vertex:Hd,worldpos_vertex:Vd,background_vert:Wd,background_frag:jd,backgroundCube_vert:Xd,backgroundCube_frag:qd,cube_vert:Yd,cube_frag:Zd,depth_vert:Qd,depth_frag:Kd,distanceRGBA_vert:Jd,distanceRGBA_frag:$d,equirect_vert:ep,equirect_frag:tp,linedashed_vert:np,linedashed_frag:ip,meshbasic_vert:rp,meshbasic_frag:sp,meshlambert_vert:op,meshlambert_frag:ap,meshmatcap_vert:lp,meshmatcap_frag:cp,meshnormal_vert:up,meshnormal_frag:fp,meshphong_vert:hp,meshphong_frag:dp,meshphysical_vert:pp,meshphysical_frag:mp,meshtoon_vert:gp,meshtoon_frag:_p,points_vert:vp,points_frag:xp,shadow_vert:Mp,shadow_frag:bp,sprite_vert:Sp,sprite_frag:yp},ue={common:{diffuse:{value:new Je(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new We},alphaMap:{value:null},alphaMapTransform:{value:new We},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new We}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new We}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new We}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new We},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new We},normalScale:{value:new Qe(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new We},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new We}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new We}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new We}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Je(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Je(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new We}},sprite:{diffuse:{value:new Je(16777215)},opacity:{value:1},center:{value:new Qe(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new We},alphaMap:{value:null},alphaTest:{value:0}}},An={basic:{uniforms:Vt([ue.common,ue.specularmap,ue.envmap,ue.aomap,ue.lightmap,ue.fog]),vertexShader:ke.meshbasic_vert,fragmentShader:ke.meshbasic_frag},lambert:{uniforms:Vt([ue.common,ue.specularmap,ue.envmap,ue.aomap,ue.lightmap,ue.emissivemap,ue.bumpmap,ue.normalmap,ue.displacementmap,ue.fog,ue.lights,{emissive:{value:new Je(0)}}]),vertexShader:ke.meshlambert_vert,fragmentShader:ke.meshlambert_frag},phong:{uniforms:Vt([ue.common,ue.specularmap,ue.envmap,ue.aomap,ue.lightmap,ue.emissivemap,ue.bumpmap,ue.normalmap,ue.displacementmap,ue.fog,ue.lights,{emissive:{value:new Je(0)},specular:{value:new Je(1118481)},shininess:{value:30}}]),vertexShader:ke.meshphong_vert,fragmentShader:ke.meshphong_frag},standard:{uniforms:Vt([ue.common,ue.envmap,ue.aomap,ue.lightmap,ue.emissivemap,ue.bumpmap,ue.normalmap,ue.displacementmap,ue.roughnessmap,ue.metalnessmap,ue.fog,ue.lights,{emissive:{value:new Je(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:ke.meshphysical_vert,fragmentShader:ke.meshphysical_frag},toon:{uniforms:Vt([ue.common,ue.aomap,ue.lightmap,ue.emissivemap,ue.bumpmap,ue.normalmap,ue.displacementmap,ue.gradientmap,ue.fog,ue.lights,{emissive:{value:new Je(0)}}]),vertexShader:ke.meshtoon_vert,fragmentShader:ke.meshtoon_frag},matcap:{uniforms:Vt([ue.common,ue.bumpmap,ue.normalmap,ue.displacementmap,ue.fog,{matcap:{value:null}}]),vertexShader:ke.meshmatcap_vert,fragmentShader:ke.meshmatcap_frag},points:{uniforms:Vt([ue.points,ue.fog]),vertexShader:ke.points_vert,fragmentShader:ke.points_frag},dashed:{uniforms:Vt([ue.common,ue.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:ke.linedashed_vert,fragmentShader:ke.linedashed_frag},depth:{uniforms:Vt([ue.common,ue.displacementmap]),vertexShader:ke.depth_vert,fragmentShader:ke.depth_frag},normal:{uniforms:Vt([ue.common,ue.bumpmap,ue.normalmap,ue.displacementmap,{opacity:{value:1}}]),vertexShader:ke.meshnormal_vert,fragmentShader:ke.meshnormal_frag},sprite:{uniforms:Vt([ue.sprite,ue.fog]),vertexShader:ke.sprite_vert,fragmentShader:ke.sprite_frag},background:{uniforms:{uvTransform:{value:new We},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:ke.background_vert,fragmentShader:ke.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:ke.backgroundCube_vert,fragmentShader:ke.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:ke.cube_vert,fragmentShader:ke.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:ke.equirect_vert,fragmentShader:ke.equirect_frag},distanceRGBA:{uniforms:Vt([ue.common,ue.displacementmap,{referencePosition:{value:new I},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:ke.distanceRGBA_vert,fragmentShader:ke.distanceRGBA_frag},shadow:{uniforms:Vt([ue.lights,ue.fog,{color:{value:new Je(0)},opacity:{value:1}}]),vertexShader:ke.shadow_vert,fragmentShader:ke.shadow_frag}};An.physical={uniforms:Vt([An.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new We},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new We},clearcoatNormalScale:{value:new Qe(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new We},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new We},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new We},sheen:{value:0},sheenColor:{value:new Je(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new We},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new We},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new We},transmissionSamplerSize:{value:new Qe},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new We},attenuationDistance:{value:0},attenuationColor:{value:new Je(0)},specularColor:{value:new Je(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new We},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new We}}]),vertexShader:ke.meshphysical_vert,fragmentShader:ke.meshphysical_frag};const ns={r:0,b:0,g:0};function wp(r,e,t,n,i,s,o){const a=new Je(0);let l=s===!0?0:1,c,u,f=null,h=0,p=null;function _(m,d){let g=!1,x=d.isScene===!0?d.background:null;x&&x.isTexture&&(x=(d.backgroundBlurriness>0?t:e).get(x));const M=r.xr,y=M.getSession&&M.getSession();y&&y.environmentBlendMode==="additive"&&(x=null),x===null?v(a,l):x&&x.isColor&&(v(x,1),g=!0),(r.autoClear||g)&&r.clear(r.autoClearColor,r.autoClearDepth,r.autoClearStencil),x&&(x.isCubeTexture||x.mapping===bs)?(u===void 0&&(u=new pe(new bt(1,1,1),new Xn({name:"BackgroundCubeMaterial",uniforms:ir(An.backgroundCube.uniforms),vertexShader:An.backgroundCube.vertexShader,fragmentShader:An.backgroundCube.fragmentShader,side:Jt,depthTest:!1,depthWrite:!1,fog:!1})),u.geometry.deleteAttribute("normal"),u.geometry.deleteAttribute("uv"),u.onBeforeRender=function(w,C,T){this.matrixWorld.copyPosition(T.matrixWorld)},Object.defineProperty(u.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(u)),u.material.uniforms.envMap.value=x,u.material.uniforms.flipEnvMap.value=x.isCubeTexture&&x.isRenderTargetTexture===!1?-1:1,u.material.uniforms.backgroundBlurriness.value=d.backgroundBlurriness,u.material.uniforms.backgroundIntensity.value=d.backgroundIntensity,u.material.toneMapped=x.encoding!==at,(f!==x||h!==x.version||p!==r.toneMapping)&&(u.material.needsUpdate=!0,f=x,h=x.version,p=r.toneMapping),u.layers.enableAll(),m.unshift(u,u.geometry,u.material,0,0,null)):x&&x.isTexture&&(c===void 0&&(c=new pe(new ws(2,2),new Xn({name:"BackgroundMaterial",uniforms:ir(An.background.uniforms),vertexShader:An.background.vertexShader,fragmentShader:An.background.fragmentShader,side:ti,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(c)),c.material.uniforms.t2D.value=x,c.material.uniforms.backgroundIntensity.value=d.backgroundIntensity,c.material.toneMapped=x.encoding!==at,x.matrixAutoUpdate===!0&&x.updateMatrix(),c.material.uniforms.uvTransform.value.copy(x.matrix),(f!==x||h!==x.version||p!==r.toneMapping)&&(c.material.needsUpdate=!0,f=x,h=x.version,p=r.toneMapping),c.layers.enableAll(),m.unshift(c,c.geometry,c.material,0,0,null))}function v(m,d){m.getRGB(ns,Rc(r)),n.buffers.color.setClear(ns.r,ns.g,ns.b,d,o)}return{getClearColor:function(){return a},setClearColor:function(m,d=1){a.set(m),l=d,v(a,l)},getClearAlpha:function(){return l},setClearAlpha:function(m){l=m,v(a,l)},render:_}}function Ep(r,e,t,n){const i=r.getParameter(34921),s=n.isWebGL2?null:e.get("OES_vertex_array_object"),o=n.isWebGL2||s!==null,a={},l=m(null);let c=l,u=!1;function f(O,B,J,R,H){let Q=!1;if(o){const K=v(R,J,B);c!==K&&(c=K,p(c.object)),Q=d(O,R,J,H),Q&&g(O,R,J,H)}else{const K=B.wireframe===!0;(c.geometry!==R.id||c.program!==J.id||c.wireframe!==K)&&(c.geometry=R.id,c.program=J.id,c.wireframe=K,Q=!0)}H!==null&&t.update(H,34963),(Q||u)&&(u=!1,T(O,B,J,R),H!==null&&r.bindBuffer(34963,t.get(H).buffer))}function h(){return n.isWebGL2?r.createVertexArray():s.createVertexArrayOES()}function p(O){return n.isWebGL2?r.bindVertexArray(O):s.bindVertexArrayOES(O)}function _(O){return n.isWebGL2?r.deleteVertexArray(O):s.deleteVertexArrayOES(O)}function v(O,B,J){const R=J.wireframe===!0;let H=a[O.id];H===void 0&&(H={},a[O.id]=H);let Q=H[B.id];Q===void 0&&(Q={},H[B.id]=Q);let K=Q[R];return K===void 0&&(K=m(h()),Q[R]=K),K}function m(O){const B=[],J=[],R=[];for(let H=0;H=0){const te=H[se];let ee=Q[se];if(ee===void 0&&(se==="instanceMatrix"&&O.instanceMatrix&&(ee=O.instanceMatrix),se==="instanceColor"&&O.instanceColor&&(ee=O.instanceColor)),te===void 0||te.attribute!==ee||ee&&te.data!==ee.data)return!0;K++}return c.attributesNum!==K||c.index!==R}function g(O,B,J,R){const H={},Q=B.attributes;let K=0;const ve=J.getAttributes();for(const se in ve)if(ve[se].location>=0){let te=Q[se];te===void 0&&(se==="instanceMatrix"&&O.instanceMatrix&&(te=O.instanceMatrix),se==="instanceColor"&&O.instanceColor&&(te=O.instanceColor));const ee={};ee.attribute=te,te&&te.data&&(ee.data=te.data),H[se]=ee,K++}c.attributes=H,c.attributesNum=K,c.index=R}function x(){const O=c.newAttributes;for(let B=0,J=O.length;B=0){let j=H[ve];if(j===void 0&&(ve==="instanceMatrix"&&O.instanceMatrix&&(j=O.instanceMatrix),ve==="instanceColor"&&O.instanceColor&&(j=O.instanceColor)),j!==void 0){const te=j.normalized,ee=j.itemSize,ce=t.get(j);if(ce===void 0)continue;const N=ce.buffer,Re=ce.type,Ce=ce.bytesPerElement;if(j.isInterleavedBufferAttribute){const oe=j.data,Te=oe.stride,je=j.offset;if(oe.isInstancedInterleavedBuffer){for(let ye=0;ye0&&r.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";C="mediump"}return C==="mediump"&&r.getShaderPrecisionFormat(35633,36337).precision>0&&r.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const o=typeof WebGL2RenderingContext!="undefined"&&r.constructor.name==="WebGL2RenderingContext";let a=t.precision!==void 0?t.precision:"highp";const l=s(a);l!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",l,"instead."),a=l);const c=o||e.has("WEBGL_draw_buffers"),u=t.logarithmicDepthBuffer===!0,f=r.getParameter(34930),h=r.getParameter(35660),p=r.getParameter(3379),_=r.getParameter(34076),v=r.getParameter(34921),m=r.getParameter(36347),d=r.getParameter(36348),g=r.getParameter(36349),x=h>0,M=o||e.has("OES_texture_float"),y=x&&M,w=o?r.getParameter(36183):0;return{isWebGL2:o,drawBuffers:c,getMaxAnisotropy:i,getMaxPrecision:s,precision:a,logarithmicDepthBuffer:u,maxTextures:f,maxVertexTextures:h,maxTextureSize:p,maxCubemapSize:_,maxAttributes:v,maxVertexUniforms:m,maxVaryings:d,maxFragmentUniforms:g,vertexTextures:x,floatFragmentTextures:M,floatVertexTextures:y,maxSamples:w}}function Cp(r){const e=this;let t=null,n=0,i=!1,s=!1;const o=new di,a=new We,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(f,h){const p=f.length!==0||h||n!==0||i;return i=h,n=f.length,p},this.beginShadows=function(){s=!0,u(null)},this.endShadows=function(){s=!1},this.setGlobalState=function(f,h){t=u(f,h,0)},this.setState=function(f,h,p){const _=f.clippingPlanes,v=f.clipIntersection,m=f.clipShadows,d=r.get(f);if(!i||_===null||_.length===0||s&&!m)s?u(null):c();else{const g=s?0:n,x=g*4;let M=d.clippingState||null;l.value=M,M=u(_,h,x,p);for(let y=0;y!==x;++y)M[y]=t[y];d.clippingState=M,this.numIntersection=v?this.numPlanes:0,this.numPlanes+=g}};function c(){l.value!==t&&(l.value=t,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function u(f,h,p,_){const v=f!==null?f.length:0;let m=null;if(v!==0){if(m=l.value,_!==!0||m===null){const d=p+v*4,g=h.matrixWorldInverse;a.getNormalMatrix(g),(m===null||m.length0){const c=new jf(l.height/2);return c.fromEquirectangularTexture(r,o),e.set(o,c),o.addEventListener("dispose",i),t(c.texture,o.mapping)}else return null}}return o}function i(o){const a=o.target;a.removeEventListener("dispose",i);const l=e.get(a);l!==void 0&&(e.delete(a),l.dispose())}function s(){e=new WeakMap}return{get:n,dispose:s}}class Oc extends Ic{constructor(e=-1,t=1,n=1,i=-1,s=.1,o=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=t,this.top=n,this.bottom=i,this.near=s,this.far=o,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=e.view===null?null:Object.assign({},e.view),this}setViewOffset(e,t,n,i,s,o){this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=s,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let s=n-e,o=n+e,a=i+t,l=i-t;if(this.view!==null&&this.view.enabled){const c=(this.right-this.left)/this.view.fullWidth/this.zoom,u=(this.top-this.bottom)/this.view.fullHeight/this.zoom;s+=c*this.view.offsetX,o=s+c*this.view.width,a-=u*this.view.offsetY,l=a-u*this.view.height}this.projectionMatrix.makeOrthographic(s,o,a,l,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.zoom=this.zoom,t.object.left=this.left,t.object.right=this.right,t.object.top=this.top,t.object.bottom=this.bottom,t.object.near=this.near,t.object.far=this.far,this.view!==null&&(t.object.view=Object.assign({},this.view)),t}}const Xi=4,ka=[.125,.215,.35,.446,.526,.582],gi=20,ro=new Oc,Ba=new Je;let so=null;const pi=(1+Math.sqrt(5))/2,Gi=1/pi,Ga=[new I(1,1,1),new I(-1,1,1),new I(1,1,-1),new I(-1,1,-1),new I(0,pi,Gi),new I(0,pi,-Gi),new I(Gi,0,pi),new I(-Gi,0,pi),new I(pi,Gi,0),new I(-pi,Gi,0)];class Ha{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,i=100){so=this._renderer.getRenderTarget(),this._setSize(256);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,s),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=ja(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=Wa(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?x:0,x,x),u.setRenderTarget(i),v&&u.render(_,a),u.render(e,a)}_.geometry.dispose(),_.material.dispose(),u.toneMapping=h,u.autoClear=f,e.background=m}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===er||e.mapping===tr;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=ja()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=Wa());const s=i?this._cubemapMaterial:this._equirectMaterial,o=new pe(this._lodPlanes[0],s),a=s.uniforms;a.envMap.value=e;const l=this._cubeSize;is(t,0,0,3*l,2*l),n.setRenderTarget(t),n.render(o,ro)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;for(let i=1;igi&&console.warn(`sigmaRadians, ${s}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${gi}`);const d=[];let g=0;for(let C=0;Cx-Xi?i-x+Xi:0),w=4*(this._cubeSize-M);is(t,y,w,3*M,2*M),l.setRenderTarget(t),l.render(f,ro)}}function Lp(r){const e=[],t=[],n=[];let i=r;const s=r-Xi+1+ka.length;for(let o=0;or-Xi?l=ka[o-r+Xi-1]:o===0&&(l=0),n.push(l);const c=1/(a-2),u=-c,f=1+c,h=[u,u,f,u,f,f,u,u,f,f,u,f],p=6,_=6,v=3,m=2,d=1,g=new Float32Array(v*_*p),x=new Float32Array(m*_*p),M=new Float32Array(d*_*p);for(let w=0;w2?0:-1,b=[C,T,0,C+2/3,T,0,C+2/3,T+1,0,C,T,0,C+2/3,T+1,0,C,T+1,0];g.set(b,v*_*w),x.set(h,m*_*w);const S=[w,w,w,w,w,w];M.set(S,d*_*w)}const y=new qt;y.setAttribute("position",new Dn(g,v)),y.setAttribute("uv",new Dn(x,m)),y.setAttribute("faceIndex",new Dn(M,d)),e.push(y),i>Xi&&i--}return{lodPlanes:e,sizeLods:t,sigmas:n}}function Va(r,e,t){const n=new ii(r,e,t);return n.texture.mapping=bs,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function is(r,e,t,n,i){r.viewport.set(e,t,n,i),r.scissor.set(e,t,n,i)}function Rp(r,e,t){const n=new Float32Array(gi),i=new I(0,1,0);return new Xn({name:"SphericalGaussianBlur",defines:{n:gi,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${r}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:No(),fragmentShader:` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform float mipInt; + uniform vec3 poleAxis; + + #define ENVMAP_TYPE_CUBE_UV + #include + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return bilinearCubeUV( envMap, sampleDirection, mipInt ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + + } + `,blending:ei,depthTest:!1,depthWrite:!1})}function Wa(){return new Xn({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:No(),fragmentShader:` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + + #include + + void main() { + + vec3 outputDirection = normalize( vOutputDirection ); + vec2 uv = equirectUv( outputDirection ); + + gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); + + } + `,blending:ei,depthTest:!1,depthWrite:!1})}function ja(){return new Xn({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:No(),fragmentShader:` + + precision mediump float; + precision mediump int; + + uniform float flipEnvMap; + + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + + void main() { + + gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); + + } + `,blending:ei,depthTest:!1,depthWrite:!1})}function No(){return` + + precision mediump float; + precision mediump int; + + attribute float faceIndex; + + varying vec3 vOutputDirection; + + // RH coordinate system; PMREM face-indexing convention + vec3 getDirection( vec2 uv, float face ) { + + uv = 2.0 * uv - 1.0; + + vec3 direction = vec3( uv, 1.0 ); + + if ( face == 0.0 ) { + + direction = direction.zyx; // ( 1, v, u ) pos x + + } else if ( face == 1.0 ) { + + direction = direction.xzy; + direction.xz *= -1.0; // ( -u, 1, -v ) pos y + + } else if ( face == 2.0 ) { + + direction.x *= -1.0; // ( -u, v, 1 ) pos z + + } else if ( face == 3.0 ) { + + direction = direction.zyx; + direction.xz *= -1.0; // ( -1, v, -u ) neg x + + } else if ( face == 4.0 ) { + + direction = direction.xzy; + direction.xy *= -1.0; // ( -u, -1, v ) neg y + + } else if ( face == 5.0 ) { + + direction.z *= -1.0; // ( u, v, -1 ) neg z + + } + + return direction; + + } + + void main() { + + vOutputDirection = getDirection( uv, faceIndex ); + gl_Position = vec4( position, 1.0 ); + + } + `}function Dp(r){let e=new WeakMap,t=null;function n(a){if(a&&a.isTexture){const l=a.mapping,c=l===xo||l===Mo,u=l===er||l===tr;if(c||u)if(a.isRenderTargetTexture&&a.needsPMREMUpdate===!0){a.needsPMREMUpdate=!1;let f=e.get(a);return t===null&&(t=new Ha(r)),f=c?t.fromEquirectangular(a,f):t.fromCubemap(a,f),e.set(a,f),f.texture}else{if(e.has(a))return e.get(a).texture;{const f=a.image;if(c&&f&&f.height>0||u&&f&&i(f)){t===null&&(t=new Ha(r));const h=c?t.fromEquirectangular(a):t.fromCubemap(a);return e.set(a,h),a.addEventListener("dispose",s),h.texture}else return null}}}return a}function i(a){let l=0;const c=6;for(let u=0;ue.maxTextureSize&&(F=Math.ceil(S/e.maxTextureSize),S=e.maxTextureSize);const k=new Float32Array(S*F*4*v),L=new Ac(k,S,F,v);L.type=Mi,L.needsUpdate=!0;const O=b*4;for(let J=0;J0)return r;const i=e*t;let s=Xa[i];if(s===void 0&&(s=new Float32Array(i),Xa[i]=s),e!==0){n.toArray(s,0);for(let o=1,a=0;o!==e;++o)a+=t,r[o].toArray(s,a)}return s}function Ct(r,e){if(r.length!==e.length)return!1;for(let t=0,n=r.length;t":" "} ${a}: ${t[o]}`)}return n.join(` +`)}function Im(r){switch(r){case ni:return["Linear","( value )"];case at:return["sRGB","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",r),["Linear","( value )"]}}function $a(r,e,t){const n=r.getShaderParameter(e,35713),i=r.getShaderInfoLog(e).trim();if(n&&i==="")return"";const s=/ERROR: 0:(\d+)/.exec(i);if(s){const o=parseInt(s[1]);return t.toUpperCase()+` + +`+i+` + +`+Dm(r.getShaderSource(e),o)}else return i}function Um(r,e){const t=Im(e);return"vec4 "+r+"( vec4 value ) { return LinearTo"+t[0]+t[1]+"; }"}function Nm(r,e){let t;switch(e){case zu:t="Linear";break;case ku:t="Reinhard";break;case Bu:t="OptimizedCineon";break;case vc:t="ACESFilmic";break;case Gu:t="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),t="Linear"}return"vec3 "+r+"( vec3 color ) { return "+t+"ToneMapping( color ); }"}function Om(r){return[r.extensionDerivatives||!!r.envMapCubeUVHeight||r.bumpMap||r.normalMapTangentSpace||r.clearcoatNormalMap||r.flatShading||r.shaderID==="physical"?"#extension GL_OES_standard_derivatives : enable":"",(r.extensionFragDepth||r.logarithmicDepthBuffer)&&r.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",r.extensionDrawBuffers&&r.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(r.extensionShaderTextureLOD||r.envMap||r.transmission)&&r.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(br).join(` +`)}function Fm(r){const e=[];for(const t in r){const n=r[t];n!==!1&&e.push("#define "+t+" "+n)}return e.join(` +`)}function zm(r,e){const t={},n=r.getProgramParameter(e,35721);for(let i=0;i/gm;function Eo(r){return r.replace(km,Bm)}function Bm(r,e){const t=ke[e];if(t===void 0)throw new Error("Can not resolve #include <"+e+">");return Eo(t)}const Gm=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function nl(r){return r.replace(Gm,Hm)}function Hm(r,e,t,n){let i="";for(let s=parseInt(e);s0&&(m+=` +`),d=[p,_].filter(br).join(` +`),d.length>0&&(d+=` +`)):(m=[il(t),"#define SHADER_NAME "+t.shaderName,_,t.instancing?"#define USE_INSTANCING":"",t.instancingColor?"#define USE_INSTANCING_COLOR":"",t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.map?"#define USE_MAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+u:"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.displacementMap?"#define USE_DISPLACEMENTMAP":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.mapUv?"#define MAP_UV "+t.mapUv:"",t.alphaMapUv?"#define ALPHAMAP_UV "+t.alphaMapUv:"",t.lightMapUv?"#define LIGHTMAP_UV "+t.lightMapUv:"",t.aoMapUv?"#define AOMAP_UV "+t.aoMapUv:"",t.emissiveMapUv?"#define EMISSIVEMAP_UV "+t.emissiveMapUv:"",t.bumpMapUv?"#define BUMPMAP_UV "+t.bumpMapUv:"",t.normalMapUv?"#define NORMALMAP_UV "+t.normalMapUv:"",t.displacementMapUv?"#define DISPLACEMENTMAP_UV "+t.displacementMapUv:"",t.metalnessMapUv?"#define METALNESSMAP_UV "+t.metalnessMapUv:"",t.roughnessMapUv?"#define ROUGHNESSMAP_UV "+t.roughnessMapUv:"",t.clearcoatMapUv?"#define CLEARCOATMAP_UV "+t.clearcoatMapUv:"",t.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+t.clearcoatNormalMapUv:"",t.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+t.clearcoatRoughnessMapUv:"",t.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+t.iridescenceMapUv:"",t.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+t.iridescenceThicknessMapUv:"",t.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+t.sheenColorMapUv:"",t.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+t.sheenRoughnessMapUv:"",t.specularMapUv?"#define SPECULARMAP_UV "+t.specularMapUv:"",t.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+t.specularColorMapUv:"",t.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+t.specularIntensityMapUv:"",t.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+t.transmissionMapUv:"",t.thicknessMapUv?"#define THICKNESSMAP_UV "+t.thicknessMapUv:"",t.vertexTangents?"#define USE_TANGENT":"",t.vertexColors?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUvs2?"#define USE_UV2":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.flatShading?"#define FLAT_SHADED":"",t.skinning?"#define USE_SKINNING":"",t.morphTargets?"#define USE_MORPHTARGETS":"",t.morphNormals&&t.flatShading===!1?"#define USE_MORPHNORMALS":"",t.morphColors&&t.isWebGL2?"#define USE_MORPHCOLORS":"",t.morphTargetsCount>0&&t.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",t.morphTargetsCount>0&&t.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+t.morphTextureStride:"",t.morphTargetsCount>0&&t.isWebGL2?"#define MORPHTARGETS_COUNT "+t.morphTargetsCount:"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.sizeAttenuation?"#define USE_SIZEATTENUATION":"",t.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",t.logarithmicDepthBuffer&&t.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )"," attribute vec3 morphTarget0;"," attribute vec3 morphTarget1;"," attribute vec3 morphTarget2;"," attribute vec3 morphTarget3;"," #ifdef USE_MORPHNORMALS"," attribute vec3 morphNormal0;"," attribute vec3 morphNormal1;"," attribute vec3 morphNormal2;"," attribute vec3 morphNormal3;"," #else"," attribute vec3 morphTarget4;"," attribute vec3 morphTarget5;"," attribute vec3 morphTarget6;"," attribute vec3 morphTarget7;"," #endif","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` +`].filter(br).join(` +`),d=[p,il(t),"#define SHADER_NAME "+t.shaderName,_,t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.map?"#define USE_MAP":"",t.matcap?"#define USE_MATCAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+c:"",t.envMap?"#define "+u:"",t.envMap?"#define "+f:"",h?"#define CUBEUV_TEXEL_WIDTH "+h.texelWidth:"",h?"#define CUBEUV_TEXEL_HEIGHT "+h.texelHeight:"",h?"#define CUBEUV_MAX_MIP "+h.maxMip+".0":"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.clearcoat?"#define USE_CLEARCOAT":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.iridescence?"#define USE_IRIDESCENCE":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaTest?"#define USE_ALPHATEST":"",t.sheen?"#define USE_SHEEN":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",t.vertexTangents?"#define USE_TANGENT":"",t.vertexColors||t.instancingColor?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUvs2?"#define USE_UV2":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.gradientMap?"#define USE_GRADIENTMAP":"",t.flatShading?"#define FLAT_SHADED":"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",t.useLegacyLights?"#define LEGACY_LIGHTS":"",t.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",t.logarithmicDepthBuffer&&t.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",t.toneMapping!==Rn?"#define TONE_MAPPING":"",t.toneMapping!==Rn?ke.tonemapping_pars_fragment:"",t.toneMapping!==Rn?Nm("toneMapping",t.toneMapping):"",t.dithering?"#define DITHERING":"",t.opaque?"#define OPAQUE":"",ke.encodings_pars_fragment,Um("linearToOutputTexel",t.outputEncoding),t.useDepthPacking?"#define DEPTH_PACKING "+t.depthPacking:"",` +`].filter(br).join(` +`)),o=Eo(o),o=el(o,t),o=tl(o,t),a=Eo(a),a=el(a,t),a=tl(a,t),o=nl(o),a=nl(a),t.isWebGL2&&t.isRawShaderMaterial!==!0&&(g=`#version 300 es +`,m=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join(` +`)+` +`+m,d=["#define varying in",t.glslVersion===ya?"":"layout(location = 0) out highp vec4 pc_fragColor;",t.glslVersion===ya?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` +`)+` +`+d);const x=g+m+o,M=g+d+a,y=Ja(i,35633,x),w=Ja(i,35632,M);if(i.attachShader(v,y),i.attachShader(v,w),t.index0AttributeName!==void 0?i.bindAttribLocation(v,0,t.index0AttributeName):t.morphTargets===!0&&i.bindAttribLocation(v,0,"position"),i.linkProgram(v),r.debug.checkShaderErrors){const b=i.getProgramInfoLog(v).trim(),S=i.getShaderInfoLog(y).trim(),F=i.getShaderInfoLog(w).trim();let k=!0,L=!0;if(i.getProgramParameter(v,35714)===!1)if(k=!1,typeof r.debug.onShaderError=="function")r.debug.onShaderError(i,v,y,w);else{const O=$a(i,y,"vertex"),B=$a(i,w,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(v,35715)+` + +Program Info Log: `+b+` +`+O+` +`+B)}else b!==""?console.warn("THREE.WebGLProgram: Program Info Log:",b):(S===""||F==="")&&(L=!1);L&&(this.diagnostics={runnable:k,programLog:b,vertexShader:{log:S,prefix:m},fragmentShader:{log:F,prefix:d}})}i.deleteShader(y),i.deleteShader(w);let C;this.getUniforms=function(){return C===void 0&&(C=new hs(i,v)),C};let T;return this.getAttributes=function(){return T===void 0&&(T=zm(i,v)),T},this.destroy=function(){n.releaseStatesOfProgram(this),i.deleteProgram(v),this.program=void 0},this.name=t.shaderName,this.id=Rm++,this.cacheKey=e,this.usedTimes=1,this.program=v,this.vertexShader=y,this.fragmentShader=w,this}let Zm=0;class Qm{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const t=e.vertexShader,n=e.fragmentShader,i=this._getShaderStage(t),s=this._getShaderStage(n),o=this._getShaderCacheForMaterial(e);return o.has(i)===!1&&(o.add(i),i.usedTimes++),o.has(s)===!1&&(o.add(s),s.usedTimes++),this}remove(e){const t=this.materialCache.get(e);for(const n of t)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const t=this.materialCache;let n=t.get(e);return n===void 0&&(n=new Set,t.set(e,n)),n}_getShaderStage(e){const t=this.shaderCache;let n=t.get(e);return n===void 0&&(n=new Km(e),t.set(e,n)),n}}class Km{constructor(e){this.id=Zm++,this.code=e,this.usedTimes=0}}function Jm(r,e,t,n,i,s,o){const a=new Io,l=new Qm,c=[],u=i.isWebGL2,f=i.logarithmicDepthBuffer,h=i.vertexTextures;let p=i.precision;const _={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function v(b){return b===1?"uv2":"uv"}function m(b,S,F,k,L){const O=k.fog,B=L.geometry,J=b.isMeshStandardMaterial?k.environment:null,R=(b.isMeshStandardMaterial?t:e).get(b.envMap||J),H=!!R&&R.mapping===bs?R.image.height:null,Q=_[b.type];b.precision!==null&&(p=i.getMaxPrecision(b.precision),p!==b.precision&&console.warn("THREE.WebGLProgram.getParameters:",b.precision,"not supported, using",p,"instead."));const K=B.morphAttributes.position||B.morphAttributes.normal||B.morphAttributes.color,ve=K!==void 0?K.length:0;let se=0;B.morphAttributes.position!==void 0&&(se=1),B.morphAttributes.normal!==void 0&&(se=2),B.morphAttributes.color!==void 0&&(se=3);let j,te,ee,ce;if(Q){const he=An[Q];j=he.vertexShader,te=he.fragmentShader}else j=b.vertexShader,te=b.fragmentShader,l.update(b),ee=l.getVertexShaderID(b),ce=l.getFragmentShaderID(b);const N=r.getRenderTarget(),Re=L.isInstancedMesh===!0,Ce=!!b.map,oe=!!b.matcap,Te=!!R,je=!!b.aoMap,ye=!!b.lightMap,Ue=!!b.bumpMap,lt=!!b.normalMap,xt=!!b.displacementMap,Mt=!!b.emissiveMap,_t=!!b.metalnessMap,Xe=!!b.roughnessMap,ot=b.clearcoat>0,It=b.iridescence>0,P=b.sheen>0,E=b.transmission>0,Y=ot&&!!b.clearcoatMap,ne=ot&&!!b.clearcoatNormalMap,re=ot&&!!b.clearcoatRoughnessMap,fe=It&&!!b.iridescenceMap,Pe=It&&!!b.iridescenceThicknessMap,de=P&&!!b.sheenColorMap,$=P&&!!b.sheenRoughnessMap,xe=!!b.specularMap,we=!!b.specularColorMap,Ae=!!b.specularIntensityMap,ge=E&&!!b.transmissionMap,Me=E&&!!b.thicknessMap,Fe=!!b.gradientMap,Ze=!!b.alphaMap,ct=b.alphaTest>0,U=!!b.extensions,W=!!B.attributes.uv2;return{isWebGL2:u,shaderID:Q,shaderName:b.type,vertexShader:j,fragmentShader:te,defines:b.defines,customVertexShaderID:ee,customFragmentShaderID:ce,isRawShaderMaterial:b.isRawShaderMaterial===!0,glslVersion:b.glslVersion,precision:p,instancing:Re,instancingColor:Re&&L.instanceColor!==null,supportsVertexTextures:h,outputEncoding:N===null?r.outputEncoding:N.isXRRenderTarget===!0?N.texture.encoding:ni,map:Ce,matcap:oe,envMap:Te,envMapMode:Te&&R.mapping,envMapCubeUVHeight:H,aoMap:je,lightMap:ye,bumpMap:Ue,normalMap:lt,displacementMap:h&&xt,emissiveMap:Mt,normalMapObjectSpace:lt&&b.normalMapType===af,normalMapTangentSpace:lt&&b.normalMapType===bc,decodeVideoTexture:Ce&&b.map.isVideoTexture===!0&&b.map.encoding===at,metalnessMap:_t,roughnessMap:Xe,clearcoat:ot,clearcoatMap:Y,clearcoatNormalMap:ne,clearcoatRoughnessMap:re,iridescence:It,iridescenceMap:fe,iridescenceThicknessMap:Pe,sheen:P,sheenColorMap:de,sheenRoughnessMap:$,specularMap:xe,specularColorMap:we,specularIntensityMap:Ae,transmission:E,transmissionMap:ge,thicknessMap:Me,gradientMap:Fe,opaque:b.transparent===!1&&b.blending===Qi,alphaMap:Ze,alphaTest:ct,combine:b.combine,mapUv:Ce&&v(b.map.channel),aoMapUv:je&&v(b.aoMap.channel),lightMapUv:ye&&v(b.lightMap.channel),bumpMapUv:Ue&&v(b.bumpMap.channel),normalMapUv:lt&&v(b.normalMap.channel),displacementMapUv:xt&&v(b.displacementMap.channel),emissiveMapUv:Mt&&v(b.emissiveMap.channel),metalnessMapUv:_t&&v(b.metalnessMap.channel),roughnessMapUv:Xe&&v(b.roughnessMap.channel),clearcoatMapUv:Y&&v(b.clearcoatMap.channel),clearcoatNormalMapUv:ne&&v(b.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:re&&v(b.clearcoatRoughnessMap.channel),iridescenceMapUv:fe&&v(b.iridescenceMap.channel),iridescenceThicknessMapUv:Pe&&v(b.iridescenceThicknessMap.channel),sheenColorMapUv:de&&v(b.sheenColorMap.channel),sheenRoughnessMapUv:$&&v(b.sheenRoughnessMap.channel),specularMapUv:xe&&v(b.specularMap.channel),specularColorMapUv:we&&v(b.specularColorMap.channel),specularIntensityMapUv:Ae&&v(b.specularIntensityMap.channel),transmissionMapUv:ge&&v(b.transmissionMap.channel),thicknessMapUv:Me&&v(b.thicknessMap.channel),alphaMapUv:Ze&&v(b.alphaMap.channel),vertexTangents:lt&&!!B.attributes.tangent,vertexColors:b.vertexColors,vertexAlphas:b.vertexColors===!0&&!!B.attributes.color&&B.attributes.color.itemSize===4,vertexUvs2:W,pointsUvs:L.isPoints===!0&&!!B.attributes.uv&&(Ce||Ze),fog:!!O,useFog:b.fog===!0,fogExp2:O&&O.isFogExp2,flatShading:b.flatShading===!0,sizeAttenuation:b.sizeAttenuation===!0,logarithmicDepthBuffer:f,skinning:L.isSkinnedMesh===!0,morphTargets:B.morphAttributes.position!==void 0,morphNormals:B.morphAttributes.normal!==void 0,morphColors:B.morphAttributes.color!==void 0,morphTargetsCount:ve,morphTextureStride:se,numDirLights:S.directional.length,numPointLights:S.point.length,numSpotLights:S.spot.length,numSpotLightMaps:S.spotLightMap.length,numRectAreaLights:S.rectArea.length,numHemiLights:S.hemi.length,numDirLightShadows:S.directionalShadowMap.length,numPointLightShadows:S.pointShadowMap.length,numSpotLightShadows:S.spotShadowMap.length,numSpotLightShadowsWithMaps:S.numSpotLightShadowsWithMaps,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:b.dithering,shadowMapEnabled:r.shadowMap.enabled&&F.length>0,shadowMapType:r.shadowMap.type,toneMapping:b.toneMapped?r.toneMapping:Rn,useLegacyLights:r.useLegacyLights,premultipliedAlpha:b.premultipliedAlpha,doubleSided:b.side===Pn,flipSided:b.side===Jt,useDepthPacking:b.depthPacking>=0,depthPacking:b.depthPacking||0,index0AttributeName:b.index0AttributeName,extensionDerivatives:U&&b.extensions.derivatives===!0,extensionFragDepth:U&&b.extensions.fragDepth===!0,extensionDrawBuffers:U&&b.extensions.drawBuffers===!0,extensionShaderTextureLOD:U&&b.extensions.shaderTextureLOD===!0,rendererExtensionFragDepth:u||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:u||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:u||n.has("EXT_shader_texture_lod"),customProgramCacheKey:b.customProgramCacheKey()}}function d(b){const S=[];if(b.shaderID?S.push(b.shaderID):(S.push(b.customVertexShaderID),S.push(b.customFragmentShaderID)),b.defines!==void 0)for(const F in b.defines)S.push(F),S.push(b.defines[F]);return b.isRawShaderMaterial===!1&&(g(S,b),x(S,b),S.push(r.outputEncoding)),S.push(b.customProgramCacheKey),S.join()}function g(b,S){b.push(S.precision),b.push(S.outputEncoding),b.push(S.envMapMode),b.push(S.envMapCubeUVHeight),b.push(S.mapUv),b.push(S.alphaMapUv),b.push(S.lightMapUv),b.push(S.aoMapUv),b.push(S.bumpMapUv),b.push(S.normalMapUv),b.push(S.displacementMapUv),b.push(S.emissiveMapUv),b.push(S.metalnessMapUv),b.push(S.roughnessMapUv),b.push(S.clearcoatMapUv),b.push(S.clearcoatNormalMapUv),b.push(S.clearcoatRoughnessMapUv),b.push(S.iridescenceMapUv),b.push(S.iridescenceThicknessMapUv),b.push(S.sheenColorMapUv),b.push(S.sheenRoughnessMapUv),b.push(S.specularMapUv),b.push(S.specularColorMapUv),b.push(S.specularIntensityMapUv),b.push(S.transmissionMapUv),b.push(S.thicknessMapUv),b.push(S.combine),b.push(S.fogExp2),b.push(S.sizeAttenuation),b.push(S.morphTargetsCount),b.push(S.morphAttributeCount),b.push(S.numDirLights),b.push(S.numPointLights),b.push(S.numSpotLights),b.push(S.numSpotLightMaps),b.push(S.numHemiLights),b.push(S.numRectAreaLights),b.push(S.numDirLightShadows),b.push(S.numPointLightShadows),b.push(S.numSpotLightShadows),b.push(S.numSpotLightShadowsWithMaps),b.push(S.shadowMapType),b.push(S.toneMapping),b.push(S.numClippingPlanes),b.push(S.numClipIntersection),b.push(S.depthPacking)}function x(b,S){a.disableAll(),S.isWebGL2&&a.enable(0),S.supportsVertexTextures&&a.enable(1),S.instancing&&a.enable(2),S.instancingColor&&a.enable(3),S.matcap&&a.enable(4),S.envMap&&a.enable(5),S.normalMapObjectSpace&&a.enable(6),S.normalMapTangentSpace&&a.enable(7),S.clearcoat&&a.enable(8),S.iridescence&&a.enable(9),S.alphaTest&&a.enable(10),S.vertexColors&&a.enable(11),S.vertexAlphas&&a.enable(12),S.vertexUvs2&&a.enable(13),S.vertexTangents&&a.enable(14),b.push(a.mask),a.disableAll(),S.fog&&a.enable(0),S.useFog&&a.enable(1),S.flatShading&&a.enable(2),S.logarithmicDepthBuffer&&a.enable(3),S.skinning&&a.enable(4),S.morphTargets&&a.enable(5),S.morphNormals&&a.enable(6),S.morphColors&&a.enable(7),S.premultipliedAlpha&&a.enable(8),S.shadowMapEnabled&&a.enable(9),S.useLegacyLights&&a.enable(10),S.doubleSided&&a.enable(11),S.flipSided&&a.enable(12),S.useDepthPacking&&a.enable(13),S.dithering&&a.enable(14),S.transmission&&a.enable(15),S.sheen&&a.enable(16),S.decodeVideoTexture&&a.enable(17),S.opaque&&a.enable(18),S.pointsUvs&&a.enable(19),b.push(a.mask)}function M(b){const S=_[b.type];let F;if(S){const k=An[S];F=Dc.clone(k.uniforms)}else F=b.uniforms;return F}function y(b,S){let F;for(let k=0,L=c.length;k0?n.push(d):p.transparent===!0?i.push(d):t.push(d)}function l(f,h,p,_,v,m){const d=o(f,h,p,_,v,m);p.transmission>0?n.unshift(d):p.transparent===!0?i.unshift(d):t.unshift(d)}function c(f,h){t.length>1&&t.sort(f||eg),n.length>1&&n.sort(h||rl),i.length>1&&i.sort(h||rl)}function u(){for(let f=e,h=r.length;f=s.length?(o=new sl,s.push(o)):o=s[i],o}function t(){r=new WeakMap}return{get:e,dispose:t}}function ng(){const r={};return{get:function(e){if(r[e.id]!==void 0)return r[e.id];let t;switch(e.type){case"DirectionalLight":t={direction:new I,color:new Je};break;case"SpotLight":t={position:new I,direction:new I,color:new Je,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":t={position:new I,color:new Je,distance:0,decay:0};break;case"HemisphereLight":t={direction:new I,skyColor:new Je,groundColor:new Je};break;case"RectAreaLight":t={color:new Je,position:new I,halfWidth:new I,halfHeight:new I};break}return r[e.id]=t,t}}}function ig(){const r={};return{get:function(e){if(r[e.id]!==void 0)return r[e.id];let t;switch(e.type){case"DirectionalLight":t={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Qe};break;case"SpotLight":t={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Qe};break;case"PointLight":t={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Qe,shadowCameraNear:1,shadowCameraFar:1e3};break}return r[e.id]=t,t}}}let rg=0;function sg(r,e){return(e.castShadow?2:0)-(r.castShadow?2:0)+(e.map?1:0)-(r.map?1:0)}function og(r,e){const t=new ng,n=ig(),i={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0};for(let u=0;u<9;u++)i.probe.push(new I);const s=new I,o=new vt,a=new vt;function l(u,f){let h=0,p=0,_=0;for(let F=0;F<9;F++)i.probe[F].set(0,0,0);let v=0,m=0,d=0,g=0,x=0,M=0,y=0,w=0,C=0,T=0;u.sort(sg);const b=f===!0?Math.PI:1;for(let F=0,k=u.length;F0&&(e.isWebGL2||r.has("OES_texture_float_linear")===!0?(i.rectAreaLTC1=ue.LTC_FLOAT_1,i.rectAreaLTC2=ue.LTC_FLOAT_2):r.has("OES_texture_half_float_linear")===!0?(i.rectAreaLTC1=ue.LTC_HALF_1,i.rectAreaLTC2=ue.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),i.ambient[0]=h,i.ambient[1]=p,i.ambient[2]=_;const S=i.hash;(S.directionalLength!==v||S.pointLength!==m||S.spotLength!==d||S.rectAreaLength!==g||S.hemiLength!==x||S.numDirectionalShadows!==M||S.numPointShadows!==y||S.numSpotShadows!==w||S.numSpotMaps!==C)&&(i.directional.length=v,i.spot.length=d,i.rectArea.length=g,i.point.length=m,i.hemi.length=x,i.directionalShadow.length=M,i.directionalShadowMap.length=M,i.pointShadow.length=y,i.pointShadowMap.length=y,i.spotShadow.length=w,i.spotShadowMap.length=w,i.directionalShadowMatrix.length=M,i.pointShadowMatrix.length=y,i.spotLightMatrix.length=w+C-T,i.spotLightMap.length=C,i.numSpotLightShadowsWithMaps=T,S.directionalLength=v,S.pointLength=m,S.spotLength=d,S.rectAreaLength=g,S.hemiLength=x,S.numDirectionalShadows=M,S.numPointShadows=y,S.numSpotShadows=w,S.numSpotMaps=C,i.version=rg++)}function c(u,f){let h=0,p=0,_=0,v=0,m=0;const d=f.matrixWorldInverse;for(let g=0,x=u.length;g=a.length?(l=new ol(r,e),a.push(l)):l=a[o],l}function i(){t=new WeakMap}return{get:n,dispose:i}}class lg extends cr{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=sf,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class cg extends cr{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}const ug=`void main() { + gl_Position = vec4( position, 1.0 ); +}`,fg=`uniform sampler2D shadow_pass; +uniform vec2 resolution; +uniform float radius; +#include +void main() { + const float samples = float( VSM_SAMPLES ); + float mean = 0.0; + float squared_mean = 0.0; + float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 ); + float uvStart = samples <= 1.0 ? 0.0 : - 1.0; + for ( float i = 0.0; i < samples; i ++ ) { + float uvOffset = uvStart + i * uvStride; + #ifdef HORIZONTAL_PASS + vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) ); + mean += distribution.x; + squared_mean += distribution.y * distribution.y + distribution.x * distribution.x; + #else + float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) ); + mean += depth; + squared_mean += depth * depth; + #endif + } + mean = mean / samples; + squared_mean = squared_mean / samples; + float std_dev = sqrt( squared_mean - mean * mean ); + gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); +}`;function hg(r,e,t){let n=new Uo;const i=new Qe,s=new Qe,o=new Ut,a=new lg({depthPacking:of}),l=new cg,c={},u=t.maxTextureSize,f={[ti]:Jt,[Jt]:ti,[Pn]:Pn},h=new Xn({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Qe},radius:{value:4}},vertexShader:ug,fragmentShader:fg}),p=h.clone();p.defines.HORIZONTAL_PASS=1;const _=new qt;_.setAttribute("position",new Dn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new pe(_,h),m=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=dc,this.render=function(M,y,w){if(m.enabled===!1||m.autoUpdate===!1&&m.needsUpdate===!1||M.length===0)return;const C=r.getRenderTarget(),T=r.getActiveCubeFace(),b=r.getActiveMipmapLevel(),S=r.state;S.setBlending(ei),S.buffers.color.setClear(1,1,1,1),S.buffers.depth.setTest(!0),S.setScissorTest(!1);for(let F=0,k=M.length;Fu||i.y>u)&&(i.x>u&&(s.x=Math.floor(u/B.x),i.x=s.x*B.x,O.mapSize.x=s.x),i.y>u&&(s.y=Math.floor(u/B.y),i.y=s.y*B.y,O.mapSize.y=s.y)),O.map===null){const R=this.type!==xr?{minFilter:Wt,magFilter:Wt}:{};O.map=new ii(i.x,i.y,R),O.map.texture.name=L.name+".shadowMap",O.camera.updateProjectionMatrix()}r.setRenderTarget(O.map),r.clear();const J=O.getViewportCount();for(let R=0;R0||y.map&&y.alphaTest>0){const S=T.uuid,F=y.uuid;let k=c[S];k===void 0&&(k={},c[S]=k);let L=k[F];L===void 0&&(L=T.clone(),k[F]=L),T=L}if(T.visible=y.visible,T.wireframe=y.wireframe,C===xr?T.side=y.shadowSide!==null?y.shadowSide:y.side:T.side=y.shadowSide!==null?y.shadowSide:f[y.side],T.alphaMap=y.alphaMap,T.alphaTest=y.alphaTest,T.map=y.map,T.clipShadows=y.clipShadows,T.clippingPlanes=y.clippingPlanes,T.clipIntersection=y.clipIntersection,T.displacementMap=y.displacementMap,T.displacementScale=y.displacementScale,T.displacementBias=y.displacementBias,T.wireframeLinewidth=y.wireframeLinewidth,T.linewidth=y.linewidth,w.isPointLight===!0&&T.isMeshDistanceMaterial===!0){const S=r.properties.get(T);S.light=w}return T}function x(M,y,w,C,T){if(M.visible===!1)return;if(M.layers.test(y.layers)&&(M.isMesh||M.isLine||M.isPoints)&&(M.castShadow||M.receiveShadow&&T===xr)&&(!M.frustumCulled||n.intersectsObject(M))){M.modelViewMatrix.multiplyMatrices(w.matrixWorldInverse,M.matrixWorld);const F=e.update(M),k=M.material;if(Array.isArray(k)){const L=F.groups;for(let O=0,B=L.length;O=1):H.indexOf("OpenGL ES")!==-1&&(R=parseFloat(/^OpenGL ES (\d)/.exec(H)[1]),J=R>=2);let Q=null,K={};const ve=r.getParameter(3088),se=r.getParameter(2978),j=new Ut().fromArray(ve),te=new Ut().fromArray(se);function ee(U,W,ie){const he=new Uint8Array(4),be=r.createTexture();r.bindTexture(U,be),r.texParameteri(U,10241,9728),r.texParameteri(U,10240,9728);for(let Ke=0;Kene||P.height>ne)&&(re=ne/Math.max(P.width,P.height)),re<1||E===!0)if(typeof HTMLImageElement!="undefined"&&P instanceof HTMLImageElement||typeof HTMLCanvasElement!="undefined"&&P instanceof HTMLCanvasElement||typeof ImageBitmap!="undefined"&&P instanceof ImageBitmap){const fe=E?yc:Math.floor,Pe=fe(re*P.width),de=fe(re*P.height);v===void 0&&(v=g(Pe,de));const $=Y?g(Pe,de):v;return $.width=Pe,$.height=de,$.getContext("2d").drawImage(P,0,0,Pe,de),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+P.width+"x"+P.height+") to ("+Pe+"x"+de+")."),$}else return"data"in P&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+P.width+"x"+P.height+")."),P;return P}function M(P){return wo(P.width)&&wo(P.height)}function y(P){return a?!1:P.wrapS!==mn||P.wrapT!==mn||P.minFilter!==Wt&&P.minFilter!==ln}function w(P,E){return P.generateMipmaps&&E&&P.minFilter!==Wt&&P.minFilter!==ln}function C(P){r.generateMipmap(P)}function T(P,E,Y,ne,re=!1){if(a===!1)return E;if(P!==null){if(r[P]!==void 0)return r[P];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+P+"'")}let fe=E;return E===6403&&(Y===5126&&(fe=33326),Y===5131&&(fe=33325),Y===5121&&(fe=33321)),E===33319&&(Y===5126&&(fe=33328),Y===5131&&(fe=33327),Y===5121&&(fe=33323)),E===6408&&(Y===5126&&(fe=34836),Y===5131&&(fe=34842),Y===5121&&(fe=ne===at&&re===!1?35907:32856),Y===32819&&(fe=32854),Y===32820&&(fe=32855)),(fe===33325||fe===33326||fe===33327||fe===33328||fe===34842||fe===34836)&&e.get("EXT_color_buffer_float"),fe}function b(P,E,Y){return w(P,Y)===!0||P.isFramebufferTexture&&P.minFilter!==Wt&&P.minFilter!==ln?Math.log2(Math.max(E.width,E.height))+1:P.mipmaps!==void 0&&P.mipmaps.length>0?P.mipmaps.length:P.isCompressedTexture&&Array.isArray(P.image)?E.mipmaps.length:1}function S(P){return P===Wt||P===Jo||P===Us?9728:9729}function F(P){const E=P.target;E.removeEventListener("dispose",F),L(E),E.isVideoTexture&&_.delete(E)}function k(P){const E=P.target;E.removeEventListener("dispose",k),B(E)}function L(P){const E=n.get(P);if(E.__webglInit===void 0)return;const Y=P.source,ne=m.get(Y);if(ne){const re=ne[E.__cacheKey];re.usedTimes--,re.usedTimes===0&&O(P),Object.keys(ne).length===0&&m.delete(Y)}n.remove(P)}function O(P){const E=n.get(P);r.deleteTexture(E.__webglTexture);const Y=P.source,ne=m.get(Y);delete ne[E.__cacheKey],o.memory.textures--}function B(P){const E=P.texture,Y=n.get(P),ne=n.get(E);if(ne.__webglTexture!==void 0&&(r.deleteTexture(ne.__webglTexture),o.memory.textures--),P.depthTexture&&P.depthTexture.dispose(),P.isWebGLCubeRenderTarget)for(let re=0;re<6;re++)r.deleteFramebuffer(Y.__webglFramebuffer[re]),Y.__webglDepthbuffer&&r.deleteRenderbuffer(Y.__webglDepthbuffer[re]);else{if(r.deleteFramebuffer(Y.__webglFramebuffer),Y.__webglDepthbuffer&&r.deleteRenderbuffer(Y.__webglDepthbuffer),Y.__webglMultisampledFramebuffer&&r.deleteFramebuffer(Y.__webglMultisampledFramebuffer),Y.__webglColorRenderbuffer)for(let re=0;re=l&&console.warn("THREE.WebGLTextures: Trying to use "+P+" texture units while this GPU supports only "+l),J+=1,P}function Q(P){const E=[];return E.push(P.wrapS),E.push(P.wrapT),E.push(P.wrapR||0),E.push(P.magFilter),E.push(P.minFilter),E.push(P.anisotropy),E.push(P.internalFormat),E.push(P.format),E.push(P.type),E.push(P.generateMipmaps),E.push(P.premultiplyAlpha),E.push(P.flipY),E.push(P.unpackAlignment),E.push(P.encoding),E.join()}function K(P,E){const Y=n.get(P);if(P.isVideoTexture&&ot(P),P.isRenderTargetTexture===!1&&P.version>0&&Y.__version!==P.version){const ne=P.image;if(ne===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(ne.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Re(Y,P,E);return}}t.bindTexture(3553,Y.__webglTexture,33984+E)}function ve(P,E){const Y=n.get(P);if(P.version>0&&Y.__version!==P.version){Re(Y,P,E);return}t.bindTexture(35866,Y.__webglTexture,33984+E)}function se(P,E){const Y=n.get(P);if(P.version>0&&Y.__version!==P.version){Re(Y,P,E);return}t.bindTexture(32879,Y.__webglTexture,33984+E)}function j(P,E){const Y=n.get(P);if(P.version>0&&Y.__version!==P.version){Ce(Y,P,E);return}t.bindTexture(34067,Y.__webglTexture,33984+E)}const te={[bo]:10497,[mn]:33071,[So]:33648},ee={[Wt]:9728,[Jo]:9984,[Us]:9986,[ln]:9729,[Hu]:9985,[Rr]:9987};function ce(P,E,Y){if(Y?(r.texParameteri(P,10242,te[E.wrapS]),r.texParameteri(P,10243,te[E.wrapT]),(P===32879||P===35866)&&r.texParameteri(P,32882,te[E.wrapR]),r.texParameteri(P,10240,ee[E.magFilter]),r.texParameteri(P,10241,ee[E.minFilter])):(r.texParameteri(P,10242,33071),r.texParameteri(P,10243,33071),(P===32879||P===35866)&&r.texParameteri(P,32882,33071),(E.wrapS!==mn||E.wrapT!==mn)&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),r.texParameteri(P,10240,S(E.magFilter)),r.texParameteri(P,10241,S(E.minFilter)),E.minFilter!==Wt&&E.minFilter!==ln&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),e.has("EXT_texture_filter_anisotropic")===!0){const ne=e.get("EXT_texture_filter_anisotropic");if(E.magFilter===Wt||E.minFilter!==Us&&E.minFilter!==Rr||E.type===Mi&&e.has("OES_texture_float_linear")===!1||a===!1&&E.type===Dr&&e.has("OES_texture_half_float_linear")===!1)return;(E.anisotropy>1||n.get(E).__currentAnisotropy)&&(r.texParameterf(P,ne.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(E.anisotropy,i.getMaxAnisotropy())),n.get(E).__currentAnisotropy=E.anisotropy)}}function N(P,E){let Y=!1;P.__webglInit===void 0&&(P.__webglInit=!0,E.addEventListener("dispose",F));const ne=E.source;let re=m.get(ne);re===void 0&&(re={},m.set(ne,re));const fe=Q(E);if(fe!==P.__cacheKey){re[fe]===void 0&&(re[fe]={texture:r.createTexture(),usedTimes:0},o.memory.textures++,Y=!0),re[fe].usedTimes++;const Pe=re[P.__cacheKey];Pe!==void 0&&(re[P.__cacheKey].usedTimes--,Pe.usedTimes===0&&O(E)),P.__cacheKey=fe,P.__webglTexture=re[fe].texture}return Y}function Re(P,E,Y){let ne=3553;(E.isDataArrayTexture||E.isCompressedArrayTexture)&&(ne=35866),E.isData3DTexture&&(ne=32879);const re=N(P,E),fe=E.source;t.bindTexture(ne,P.__webglTexture,33984+Y);const Pe=n.get(fe);if(fe.version!==Pe.__version||re===!0){t.activeTexture(33984+Y),r.pixelStorei(37440,E.flipY),r.pixelStorei(37441,E.premultiplyAlpha),r.pixelStorei(3317,E.unpackAlignment),r.pixelStorei(37443,0);const de=y(E)&&M(E.image)===!1;let $=x(E.image,de,!1,u);$=It(E,$);const xe=M($)||a,we=s.convert(E.format,E.encoding);let Ae=s.convert(E.type),ge=T(E.internalFormat,we,Ae,E.encoding,E.isVideoTexture);ce(ne,E,xe);let Me;const Fe=E.mipmaps,Ze=a&&E.isVideoTexture!==!0,ct=Pe.__version===void 0||re===!0,U=b(E,$,xe);if(E.isDepthTexture)ge=6402,a?E.type===Mi?ge=36012:E.type===xi?ge=33190:E.type===Ki?ge=35056:ge=33189:E.type===Mi&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),E.format===bi&&ge===6402&&E.type!==Mc&&E.type!==xi&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),E.type=xi,Ae=s.convert(E.type)),E.format===nr&&ge===6402&&(ge=34041,E.type!==Ki&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),E.type=Ki,Ae=s.convert(E.type))),ct&&(Ze?t.texStorage2D(3553,1,ge,$.width,$.height):t.texImage2D(3553,0,ge,$.width,$.height,0,we,Ae,null));else if(E.isDataTexture)if(Fe.length>0&&xe){Ze&&ct&&t.texStorage2D(3553,U,ge,Fe[0].width,Fe[0].height);for(let W=0,ie=Fe.length;W>=1,ie>>=1}}else if(Fe.length>0&&xe){Ze&&ct&&t.texStorage2D(3553,U,ge,Fe[0].width,Fe[0].height);for(let W=0,ie=Fe.length;W0&&ct++,t.texStorage2D(34067,ct,Me,$[0].width,$[0].height));for(let W=0;W<6;W++)if(de){Fe?t.texSubImage2D(34069+W,0,0,0,$[W].width,$[W].height,Ae,ge,$[W].data):t.texImage2D(34069+W,0,Me,$[W].width,$[W].height,0,Ae,ge,$[W].data);for(let ie=0;ie=34069&&re<=34074)&&r.framebufferTexture2D(36160,ne,re,n.get(Y).__webglTexture,0),t.bindFramebuffer(36160,null)}function Te(P,E,Y){if(r.bindRenderbuffer(36161,P),E.depthBuffer&&!E.stencilBuffer){let ne=33189;if(Y||Xe(E)){const re=E.depthTexture;re&&re.isDepthTexture&&(re.type===Mi?ne=36012:re.type===xi&&(ne=33190));const fe=_t(E);Xe(E)?h.renderbufferStorageMultisampleEXT(36161,fe,ne,E.width,E.height):r.renderbufferStorageMultisample(36161,fe,ne,E.width,E.height)}else r.renderbufferStorage(36161,ne,E.width,E.height);r.framebufferRenderbuffer(36160,36096,36161,P)}else if(E.depthBuffer&&E.stencilBuffer){const ne=_t(E);Y&&Xe(E)===!1?r.renderbufferStorageMultisample(36161,ne,35056,E.width,E.height):Xe(E)?h.renderbufferStorageMultisampleEXT(36161,ne,35056,E.width,E.height):r.renderbufferStorage(36161,34041,E.width,E.height),r.framebufferRenderbuffer(36160,33306,36161,P)}else{const ne=E.isWebGLMultipleRenderTargets===!0?E.texture:[E.texture];for(let re=0;re0&&Xe(P)===!1){const de=fe?E:[E];Y.__webglMultisampledFramebuffer=r.createFramebuffer(),Y.__webglColorRenderbuffer=[],t.bindFramebuffer(36160,Y.__webglMultisampledFramebuffer);for(let $=0;$0&&Xe(P)===!1){const E=P.isWebGLMultipleRenderTargets?P.texture:[P.texture],Y=P.width,ne=P.height;let re=16384;const fe=[],Pe=P.stencilBuffer?33306:36096,de=n.get(P),$=P.isWebGLMultipleRenderTargets===!0;if($)for(let xe=0;xe0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&E.__useRenderToTexture!==!1}function ot(P){const E=o.render.frame;_.get(P)!==E&&(_.set(P,E),P.update())}function It(P,E){const Y=P.encoding,ne=P.format,re=P.type;return P.isCompressedTexture===!0||P.isVideoTexture===!0||P.format===yo||Y!==ni&&(Y===at?a===!1?e.has("EXT_sRGB")===!0&&ne===gn?(P.format=yo,P.minFilter=ln,P.generateMipmaps=!1):E=Ec.sRGBToLinear(E):(ne!==gn||re!==Si)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",Y)),E}this.allocateTextureUnit=H,this.resetTextureUnits=R,this.setTexture2D=K,this.setTexture2DArray=ve,this.setTexture3D=se,this.setTextureCube=j,this.rebindTextures=Ue,this.setupRenderTarget=lt,this.updateRenderTargetMipmap=xt,this.updateMultisampleRenderTarget=Mt,this.setupDepthRenderbuffer=ye,this.setupFrameBufferTexture=oe,this.useMultisampledRTT=Xe}function mg(r,e,t){const n=t.isWebGL2;function i(s,o=null){let a;if(s===Si)return 5121;if(s===Xu)return 32819;if(s===qu)return 32820;if(s===Vu)return 5120;if(s===Wu)return 5122;if(s===Mc)return 5123;if(s===ju)return 5124;if(s===xi)return 5125;if(s===Mi)return 5126;if(s===Dr)return n?5131:(a=e.get("OES_texture_half_float"),a!==null?a.HALF_FLOAT_OES:null);if(s===Yu)return 6406;if(s===gn)return 6408;if(s===Zu)return 6409;if(s===Qu)return 6410;if(s===bi)return 6402;if(s===nr)return 34041;if(s===yo)return a=e.get("EXT_sRGB"),a!==null?a.SRGB_ALPHA_EXT:null;if(s===Ku)return 6403;if(s===Ju)return 36244;if(s===$u)return 33319;if(s===ef)return 33320;if(s===tf)return 36249;if(s===Ns||s===Os||s===Fs||s===zs)if(o===at)if(a=e.get("WEBGL_compressed_texture_s3tc_srgb"),a!==null){if(s===Ns)return a.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(s===Os)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(s===Fs)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(s===zs)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(a=e.get("WEBGL_compressed_texture_s3tc"),a!==null){if(s===Ns)return a.COMPRESSED_RGB_S3TC_DXT1_EXT;if(s===Os)return a.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(s===Fs)return a.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(s===zs)return a.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(s===$o||s===ea||s===ta||s===na)if(a=e.get("WEBGL_compressed_texture_pvrtc"),a!==null){if(s===$o)return a.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(s===ea)return a.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(s===ta)return a.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(s===na)return a.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(s===nf)return a=e.get("WEBGL_compressed_texture_etc1"),a!==null?a.COMPRESSED_RGB_ETC1_WEBGL:null;if(s===ia||s===ra)if(a=e.get("WEBGL_compressed_texture_etc"),a!==null){if(s===ia)return o===at?a.COMPRESSED_SRGB8_ETC2:a.COMPRESSED_RGB8_ETC2;if(s===ra)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:a.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(s===sa||s===oa||s===aa||s===la||s===ca||s===ua||s===fa||s===ha||s===da||s===pa||s===ma||s===ga||s===_a||s===va)if(a=e.get("WEBGL_compressed_texture_astc"),a!==null){if(s===sa)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:a.COMPRESSED_RGBA_ASTC_4x4_KHR;if(s===oa)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:a.COMPRESSED_RGBA_ASTC_5x4_KHR;if(s===aa)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:a.COMPRESSED_RGBA_ASTC_5x5_KHR;if(s===la)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:a.COMPRESSED_RGBA_ASTC_6x5_KHR;if(s===ca)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:a.COMPRESSED_RGBA_ASTC_6x6_KHR;if(s===ua)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:a.COMPRESSED_RGBA_ASTC_8x5_KHR;if(s===fa)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:a.COMPRESSED_RGBA_ASTC_8x6_KHR;if(s===ha)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:a.COMPRESSED_RGBA_ASTC_8x8_KHR;if(s===da)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:a.COMPRESSED_RGBA_ASTC_10x5_KHR;if(s===pa)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:a.COMPRESSED_RGBA_ASTC_10x6_KHR;if(s===ma)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:a.COMPRESSED_RGBA_ASTC_10x8_KHR;if(s===ga)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:a.COMPRESSED_RGBA_ASTC_10x10_KHR;if(s===_a)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:a.COMPRESSED_RGBA_ASTC_12x10_KHR;if(s===va)return o===at?a.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:a.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(s===ks)if(a=e.get("EXT_texture_compression_bptc"),a!==null){if(s===ks)return o===at?a.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:a.COMPRESSED_RGBA_BPTC_UNORM_EXT}else return null;if(s===rf||s===xa||s===Ma||s===ba)if(a=e.get("EXT_texture_compression_rgtc"),a!==null){if(s===ks)return a.COMPRESSED_RED_RGTC1_EXT;if(s===xa)return a.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(s===Ma)return a.COMPRESSED_RED_GREEN_RGTC2_EXT;if(s===ba)return a.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return s===Ki?n?34042:(a=e.get("WEBGL_depth_texture"),a!==null?a.UNSIGNED_INT_24_8_WEBGL:null):r[s]!==void 0?r[s]:null}return{convert:i}}class gg extends sn{constructor(e=[]){super(),this.isArrayCamera=!0,this.cameras=e}}class rs extends Et{constructor(){super(),this.isGroup=!0,this.type="Group"}}const _g={type:"move"};class ao{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new rs,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new rs,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new I,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new I),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new rs,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new I,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new I),this._grip}dispatchEvent(e){return this._targetRay!==null&&this._targetRay.dispatchEvent(e),this._grip!==null&&this._grip.dispatchEvent(e),this._hand!==null&&this._hand.dispatchEvent(e),this}connect(e){if(e&&e.hand){const t=this._hand;if(t)for(const n of e.hand.values())this._getHandJoint(t,n)}return this.dispatchEvent({type:"connected",data:e}),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(e,t,n){let i=null,s=null,o=null;const a=this._targetRay,l=this._grip,c=this._hand;if(e&&t.session.visibilityState!=="visible-blurred"){if(c&&e.hand){o=!0;for(const v of e.hand.values()){const m=t.getJointPose(v,n),d=this._getHandJoint(c,v);m!==null&&(d.matrix.fromArray(m.transform.matrix),d.matrix.decompose(d.position,d.rotation,d.scale),d.jointRadius=m.radius),d.visible=m!==null}const u=c.joints["index-finger-tip"],f=c.joints["thumb-tip"],h=u.position.distanceTo(f.position),p=.02,_=.005;c.inputState.pinching&&h>p+_?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&h<=p-_&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(s=t.getPose(e.gripSpace,n),s!==null&&(l.matrix.fromArray(s.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),s.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(s.linearVelocity)):l.hasLinearVelocity=!1,s.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(s.angularVelocity)):l.hasAngularVelocity=!1));a!==null&&(i=t.getPose(e.targetRaySpace,n),i===null&&s!==null&&(i=s),i!==null&&(a.matrix.fromArray(i.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),i.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(i.linearVelocity)):a.hasLinearVelocity=!1,i.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(i.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(_g)))}return a!==null&&(a.visible=i!==null),l!==null&&(l.visible=s!==null),c!==null&&(c.visible=o!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){const n=new rs;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}}class vg extends $t{constructor(e,t,n,i,s,o,a,l,c,u){if(u=u!==void 0?u:bi,u!==bi&&u!==nr)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");n===void 0&&u===bi&&(n=xi),n===void 0&&u===nr&&(n=Ki),super(null,i,s,o,a,l,u,n,c),this.isDepthTexture=!0,this.image={width:e,height:t},this.magFilter=a!==void 0?a:Wt,this.minFilter=l!==void 0?l:Wt,this.flipY=!1,this.generateMipmaps=!1}}class xg extends ar{constructor(e,t){super();const n=this;let i=null,s=1,o=null,a="local-floor",l=1,c=null,u=null,f=null,h=null,p=null,_=null;const v=t.getContextAttributes();let m=null,d=null;const g=[],x=[],M=new Set,y=new Map,w=new sn;w.layers.enable(1),w.viewport=new Ut;const C=new sn;C.layers.enable(2),C.viewport=new Ut;const T=[w,C],b=new gg;b.layers.enable(1),b.layers.enable(2);let S=null,F=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(j){let te=g[j];return te===void 0&&(te=new ao,g[j]=te),te.getTargetRaySpace()},this.getControllerGrip=function(j){let te=g[j];return te===void 0&&(te=new ao,g[j]=te),te.getGripSpace()},this.getHand=function(j){let te=g[j];return te===void 0&&(te=new ao,g[j]=te),te.getHandSpace()};function k(j){const te=x.indexOf(j.inputSource);if(te===-1)return;const ee=g[te];ee!==void 0&&ee.dispatchEvent({type:j.type,data:j.inputSource})}function L(){i.removeEventListener("select",k),i.removeEventListener("selectstart",k),i.removeEventListener("selectend",k),i.removeEventListener("squeeze",k),i.removeEventListener("squeezestart",k),i.removeEventListener("squeezeend",k),i.removeEventListener("end",L),i.removeEventListener("inputsourceschange",O);for(let j=0;j=0&&(x[ce]=null,g[ce].disconnect(ee))}for(let te=0;te=x.length){x.push(ee),ce=Re;break}else if(x[Re]===null){x[Re]=ee,ce=Re;break}if(ce===-1)break}const N=g[ce];N&&N.connect(ee)}}const B=new I,J=new I;function R(j,te,ee){B.setFromMatrixPosition(te.matrixWorld),J.setFromMatrixPosition(ee.matrixWorld);const ce=B.distanceTo(J),N=te.projectionMatrix.elements,Re=ee.projectionMatrix.elements,Ce=N[14]/(N[10]-1),oe=N[14]/(N[10]+1),Te=(N[9]+1)/N[5],je=(N[9]-1)/N[5],ye=(N[8]-1)/N[0],Ue=(Re[8]+1)/Re[0],lt=Ce*ye,xt=Ce*Ue,Mt=ce/(-ye+Ue),_t=Mt*-ye;te.matrixWorld.decompose(j.position,j.quaternion,j.scale),j.translateX(_t),j.translateZ(Mt),j.matrixWorld.compose(j.position,j.quaternion,j.scale),j.matrixWorldInverse.copy(j.matrixWorld).invert();const Xe=Ce+Mt,ot=oe+Mt,It=lt-_t,P=xt+(ce-_t),E=Te*oe/ot*Xe,Y=je*oe/ot*Xe;j.projectionMatrix.makePerspective(It,P,E,Y,Xe,ot),j.projectionMatrixInverse.copy(j.projectionMatrix).invert()}function H(j,te){te===null?j.matrixWorld.copy(j.matrix):j.matrixWorld.multiplyMatrices(te.matrixWorld,j.matrix),j.matrixWorldInverse.copy(j.matrixWorld).invert()}this.updateCamera=function(j){if(i===null)return;b.near=C.near=w.near=j.near,b.far=C.far=w.far=j.far,(S!==b.near||F!==b.far)&&(i.updateRenderState({depthNear:b.near,depthFar:b.far}),S=b.near,F=b.far);const te=j.parent,ee=b.cameras;H(b,te);for(let ce=0;ceN&&(y.set(ce,ce.lastChangedTime),n.dispatchEvent({type:"planechanged",data:ce}))}}_=null}const se=new Nc;se.setAnimationLoop(ve),this.setAnimationLoop=function(j){K=j},this.dispose=function(){}}}function Mg(r,e){function t(m,d){m.matrixAutoUpdate===!0&&m.updateMatrix(),d.value.copy(m.matrix)}function n(m,d){d.color.getRGB(m.fogColor.value,Rc(r)),d.isFog?(m.fogNear.value=d.near,m.fogFar.value=d.far):d.isFogExp2&&(m.fogDensity.value=d.density)}function i(m,d,g,x,M){d.isMeshBasicMaterial||d.isMeshLambertMaterial?s(m,d):d.isMeshToonMaterial?(s(m,d),f(m,d)):d.isMeshPhongMaterial?(s(m,d),u(m,d)):d.isMeshStandardMaterial?(s(m,d),h(m,d),d.isMeshPhysicalMaterial&&p(m,d,M)):d.isMeshMatcapMaterial?(s(m,d),_(m,d)):d.isMeshDepthMaterial?s(m,d):d.isMeshDistanceMaterial?(s(m,d),v(m,d)):d.isMeshNormalMaterial?s(m,d):d.isLineBasicMaterial?(o(m,d),d.isLineDashedMaterial&&a(m,d)):d.isPointsMaterial?l(m,d,g,x):d.isSpriteMaterial?c(m,d):d.isShadowMaterial?(m.color.value.copy(d.color),m.opacity.value=d.opacity):d.isShaderMaterial&&(d.uniformsNeedUpdate=!1)}function s(m,d){m.opacity.value=d.opacity,d.color&&m.diffuse.value.copy(d.color),d.emissive&&m.emissive.value.copy(d.emissive).multiplyScalar(d.emissiveIntensity),d.map&&(m.map.value=d.map,t(d.map,m.mapTransform)),d.alphaMap&&(m.alphaMap.value=d.alphaMap,t(d.alphaMap,m.alphaMapTransform)),d.bumpMap&&(m.bumpMap.value=d.bumpMap,t(d.bumpMap,m.bumpMapTransform),m.bumpScale.value=d.bumpScale,d.side===Jt&&(m.bumpScale.value*=-1)),d.normalMap&&(m.normalMap.value=d.normalMap,t(d.normalMap,m.normalMapTransform),m.normalScale.value.copy(d.normalScale),d.side===Jt&&m.normalScale.value.negate()),d.displacementMap&&(m.displacementMap.value=d.displacementMap,t(d.displacementMap,m.displacementMapTransform),m.displacementScale.value=d.displacementScale,m.displacementBias.value=d.displacementBias),d.emissiveMap&&(m.emissiveMap.value=d.emissiveMap,t(d.emissiveMap,m.emissiveMapTransform)),d.specularMap&&(m.specularMap.value=d.specularMap,t(d.specularMap,m.specularMapTransform)),d.alphaTest>0&&(m.alphaTest.value=d.alphaTest);const g=e.get(d).envMap;if(g&&(m.envMap.value=g,m.flipEnvMap.value=g.isCubeTexture&&g.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=d.reflectivity,m.ior.value=d.ior,m.refractionRatio.value=d.refractionRatio),d.lightMap){m.lightMap.value=d.lightMap;const x=r.useLegacyLights===!0?Math.PI:1;m.lightMapIntensity.value=d.lightMapIntensity*x,t(d.lightMap,m.lightMapTransform)}d.aoMap&&(m.aoMap.value=d.aoMap,m.aoMapIntensity.value=d.aoMapIntensity,t(d.aoMap,m.aoMapTransform))}function o(m,d){m.diffuse.value.copy(d.color),m.opacity.value=d.opacity,d.map&&(m.map.value=d.map,t(d.map,m.mapTransform))}function a(m,d){m.dashSize.value=d.dashSize,m.totalSize.value=d.dashSize+d.gapSize,m.scale.value=d.scale}function l(m,d,g,x){m.diffuse.value.copy(d.color),m.opacity.value=d.opacity,m.size.value=d.size*g,m.scale.value=x*.5,d.map&&(m.map.value=d.map,t(d.map,m.uvTransform)),d.alphaMap&&(m.alphaMap.value=d.alphaMap),d.alphaTest>0&&(m.alphaTest.value=d.alphaTest)}function c(m,d){m.diffuse.value.copy(d.color),m.opacity.value=d.opacity,m.rotation.value=d.rotation,d.map&&(m.map.value=d.map,t(d.map,m.mapTransform)),d.alphaMap&&(m.alphaMap.value=d.alphaMap),d.alphaTest>0&&(m.alphaTest.value=d.alphaTest)}function u(m,d){m.specular.value.copy(d.specular),m.shininess.value=Math.max(d.shininess,1e-4)}function f(m,d){d.gradientMap&&(m.gradientMap.value=d.gradientMap)}function h(m,d){m.metalness.value=d.metalness,d.metalnessMap&&(m.metalnessMap.value=d.metalnessMap,t(d.metalnessMap,m.metalnessMapTransform)),m.roughness.value=d.roughness,d.roughnessMap&&(m.roughnessMap.value=d.roughnessMap,t(d.roughnessMap,m.roughnessMapTransform)),e.get(d).envMap&&(m.envMapIntensity.value=d.envMapIntensity)}function p(m,d,g){m.ior.value=d.ior,d.sheen>0&&(m.sheenColor.value.copy(d.sheenColor).multiplyScalar(d.sheen),m.sheenRoughness.value=d.sheenRoughness,d.sheenColorMap&&(m.sheenColorMap.value=d.sheenColorMap,t(d.sheenColorMap,m.sheenColorMapTransform)),d.sheenRoughnessMap&&(m.sheenRoughnessMap.value=d.sheenRoughnessMap,t(d.sheenRoughnessMap,m.sheenRoughnessMapTransform))),d.clearcoat>0&&(m.clearcoat.value=d.clearcoat,m.clearcoatRoughness.value=d.clearcoatRoughness,d.clearcoatMap&&(m.clearcoatMap.value=d.clearcoatMap,t(d.clearcoatMap,m.clearcoatMapTransform)),d.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=d.clearcoatRoughnessMap,t(d.clearcoatRoughnessMap,m.clearcoatRoughnessMapTransform)),d.clearcoatNormalMap&&(m.clearcoatNormalMap.value=d.clearcoatNormalMap,t(d.clearcoatNormalMap,m.clearcoatNormalMapTransform),m.clearcoatNormalScale.value.copy(d.clearcoatNormalScale),d.side===Jt&&m.clearcoatNormalScale.value.negate())),d.iridescence>0&&(m.iridescence.value=d.iridescence,m.iridescenceIOR.value=d.iridescenceIOR,m.iridescenceThicknessMinimum.value=d.iridescenceThicknessRange[0],m.iridescenceThicknessMaximum.value=d.iridescenceThicknessRange[1],d.iridescenceMap&&(m.iridescenceMap.value=d.iridescenceMap,t(d.iridescenceMap,m.iridescenceMapTransform)),d.iridescenceThicknessMap&&(m.iridescenceThicknessMap.value=d.iridescenceThicknessMap,t(d.iridescenceThicknessMap,m.iridescenceThicknessMapTransform))),d.transmission>0&&(m.transmission.value=d.transmission,m.transmissionSamplerMap.value=g.texture,m.transmissionSamplerSize.value.set(g.width,g.height),d.transmissionMap&&(m.transmissionMap.value=d.transmissionMap,t(d.transmissionMap,m.transmissionMapTransform)),m.thickness.value=d.thickness,d.thicknessMap&&(m.thicknessMap.value=d.thicknessMap,t(d.thicknessMap,m.thicknessMapTransform)),m.attenuationDistance.value=d.attenuationDistance,m.attenuationColor.value.copy(d.attenuationColor)),m.specularIntensity.value=d.specularIntensity,m.specularColor.value.copy(d.specularColor),d.specularColorMap&&(m.specularColorMap.value=d.specularColorMap,t(d.specularColorMap,m.specularColorMapTransform)),d.specularIntensityMap&&(m.specularIntensityMap.value=d.specularIntensityMap,t(d.specularIntensityMap,m.specularIntensityMapTransform))}function _(m,d){d.matcap&&(m.matcap.value=d.matcap)}function v(m,d){const g=e.get(d).light;m.referencePosition.value.setFromMatrixPosition(g.matrixWorld),m.nearDistance.value=g.shadow.camera.near,m.farDistance.value=g.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:i}}function bg(r,e,t,n){let i={},s={},o=[];const a=t.isWebGL2?r.getParameter(35375):0;function l(g,x){const M=x.program;n.uniformBlockBinding(g,M)}function c(g,x){let M=i[g.id];M===void 0&&(_(g),M=u(g),i[g.id]=M,g.addEventListener("dispose",m));const y=x.program;n.updateUBOMapping(g,y);const w=e.render.frame;s[g.id]!==w&&(h(g),s[g.id]=w)}function u(g){const x=f();g.__bindingPointIndex=x;const M=r.createBuffer(),y=g.__size,w=g.usage;return r.bindBuffer(35345,M),r.bufferData(35345,y,w),r.bindBuffer(35345,null),r.bindBufferBase(35345,x,M),M}function f(){for(let g=0;g0){w=M%y;const k=y-w;w!==0&&k-S.boundary<0&&(M+=y-w,b.__offset=M)}M+=S.storage}return w=M%y,w>0&&(M+=y-w),g.__size=M,g.__cache={},this}function v(g){const x={boundary:0,storage:0};return typeof g=="number"?(x.boundary=4,x.storage=4):g.isVector2?(x.boundary=8,x.storage=8):g.isVector3||g.isColor?(x.boundary=16,x.storage=12):g.isVector4?(x.boundary=16,x.storage=16):g.isMatrix3?(x.boundary=48,x.storage=48):g.isMatrix4?(x.boundary=64,x.storage=64):g.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",g),x}function m(g){const x=g.target;x.removeEventListener("dispose",m);const M=o.indexOf(x.__bindingPointIndex);o.splice(M,1),r.deleteBuffer(i[x.id]),delete i[x.id],delete s[x.id]}function d(){for(const g in i)r.deleteBuffer(i[g]);o=[],i={},s={}}return{bind:l,update:c,dispose:d}}function Sg(){const r=Nr("canvas");return r.style.display="block",r}class Gc{constructor(e={}){const{canvas:t=Sg(),context:n=null,depth:i=!0,stencil:s=!0,alpha:o=!1,antialias:a=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:u="default",failIfMajorPerformanceCaveat:f=!1}=e;this.isWebGLRenderer=!0;let h;n!==null?h=n.getContextAttributes().alpha:h=o;let p=null,_=null;const v=[],m=[];this.domElement=t,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.outputEncoding=ni,this.useLegacyLights=!0,this.toneMapping=Rn,this.toneMappingExposure=1;const d=this;let g=!1,x=0,M=0,y=null,w=-1,C=null;const T=new Ut,b=new Ut;let S=null,F=t.width,k=t.height,L=1,O=null,B=null;const J=new Ut(0,0,F,k),R=new Ut(0,0,F,k);let H=!1;const Q=new Uo;let K=!1,ve=!1,se=null;const j=new vt,te=new I,ee={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function ce(){return y===null?L:1}let N=n;function Re(A,z){for(let Z=0;Z0?_=m[m.length-1]:_=null,v.pop(),v.length>0?p=v[v.length-1]:p=null};function Tt(A,z,Z,G){if(A.visible===!1)return;if(A.layers.test(z.layers)){if(A.isGroup)Z=A.renderOrder;else if(A.isLOD)A.autoUpdate===!0&&A.update(z);else if(A.isLight)_.pushLight(A),A.castShadow&&_.pushShadow(A);else if(A.isSprite){if(!A.frustumCulled||Q.intersectsSprite(A)){G&&te.setFromMatrixPosition(A.matrixWorld).applyMatrix4(j);const me=Xe.update(A),De=A.material;De.visible&&p.push(A,me,De,Z,te.z,null)}}else if((A.isMesh||A.isLine||A.isPoints)&&(A.isSkinnedMesh&&A.skeleton.frame!==je.render.frame&&(A.skeleton.update(),A.skeleton.frame=je.render.frame),!A.frustumCulled||Q.intersectsObject(A))){G&&te.setFromMatrixPosition(A.matrixWorld).applyMatrix4(j);const me=Xe.update(A),De=A.material;if(Array.isArray(De)){const ze=me.groups;for(let Be=0,Ge=ze.length;Be0&&ht(X,ae,z,Z),G&&Te.viewport(T.copy(G)),X.length>0&&Lt(X,z,Z),ae.length>0&&Lt(ae,z,Z),me.length>0&&Lt(me,z,Z),Te.buffers.depth.setTest(!0),Te.buffers.depth.setMask(!0),Te.buffers.color.setMask(!0),Te.setPolygonOffset(!1)}function ht(A,z,Z,G){if(se===null){const De=oe.isWebGL2;se=new ii(1024,1024,{generateMipmaps:!0,type:Ce.has("EXT_color_buffer_half_float")?Dr:Si,minFilter:Rr,samples:De&&a===!0?4:0})}const X=d.getRenderTarget();d.setRenderTarget(se),d.clear();const ae=d.toneMapping;d.toneMapping=Rn,Lt(A,Z,G),Ue.updateMultisampleRenderTarget(se),Ue.updateRenderTargetMipmap(se);let me=!1;for(let De=0,ze=z.length;De0&&Ue.useMultisampledRTT(A)===!1?X=ye.get(A).__webglMultisampledFramebuffer:X=Ge,T.copy(A.viewport),b.copy(A.scissor),S=A.scissorTest}else T.copy(J).multiplyScalar(L).floor(),b.copy(R).multiplyScalar(L).floor(),S=H;if(Te.bindFramebuffer(36160,X)&&oe.drawBuffers&&G&&Te.drawBuffers(A,X),Te.viewport(T),Te.scissor(b),Te.setScissorTest(S),ae){const ze=ye.get(A.texture);N.framebufferTexture2D(36160,36064,34069+z,ze.__webglTexture,Z)}else if(me){const ze=ye.get(A.texture),Be=z||0;N.framebufferTextureLayer(36160,36064,ze.__webglTexture,Z||0,Be)}w=-1},this.readRenderTargetPixels=function(A,z,Z,G,X,ae,me){if(!(A&&A.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let De=ye.get(A).__webglFramebuffer;if(A.isWebGLCubeRenderTarget&&me!==void 0&&(De=De[me]),De){Te.bindFramebuffer(36160,De);try{const ze=A.texture,Be=ze.format,Ge=ze.type;if(Be!==gn&&$.convert(Be)!==N.getParameter(35739)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}const Ve=Ge===Dr&&(Ce.has("EXT_color_buffer_half_float")||oe.isWebGL2&&Ce.has("EXT_color_buffer_float"));if(Ge!==Si&&$.convert(Ge)!==N.getParameter(35738)&&!(Ge===Mi&&(oe.isWebGL2||Ce.has("OES_texture_float")||Ce.has("WEBGL_color_buffer_float")))&&!Ve){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}z>=0&&z<=A.width-G&&Z>=0&&Z<=A.height-X&&N.readPixels(z,Z,G,X,$.convert(Be),$.convert(Ge),ae)}finally{const ze=y!==null?ye.get(y).__webglFramebuffer:null;Te.bindFramebuffer(36160,ze)}}},this.copyFramebufferToTexture=function(A,z,Z=0){const G=Math.pow(2,-Z),X=Math.floor(z.image.width*G),ae=Math.floor(z.image.height*G);Ue.setTexture2D(z,0),N.copyTexSubImage2D(3553,Z,0,0,A.x,A.y,X,ae),Te.unbindTexture()},this.copyTextureToTexture=function(A,z,Z,G=0){const X=z.image.width,ae=z.image.height,me=$.convert(Z.format),De=$.convert(Z.type);Ue.setTexture2D(Z,0),N.pixelStorei(37440,Z.flipY),N.pixelStorei(37441,Z.premultiplyAlpha),N.pixelStorei(3317,Z.unpackAlignment),z.isDataTexture?N.texSubImage2D(3553,G,A.x,A.y,X,ae,me,De,z.image.data):z.isCompressedTexture?N.compressedTexSubImage2D(3553,G,A.x,A.y,z.mipmaps[0].width,z.mipmaps[0].height,me,z.mipmaps[0].data):N.texSubImage2D(3553,G,A.x,A.y,me,De,z.image),G===0&&Z.generateMipmaps&&N.generateMipmap(3553),Te.unbindTexture()},this.copyTextureToTexture3D=function(A,z,Z,G,X=0){if(d.isWebGL1Renderer){console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");return}const ae=A.max.x-A.min.x+1,me=A.max.y-A.min.y+1,De=A.max.z-A.min.z+1,ze=$.convert(G.format),Be=$.convert(G.type);let Ge;if(G.isData3DTexture)Ue.setTexture3D(G,0),Ge=32879;else if(G.isDataArrayTexture)Ue.setTexture2DArray(G,0),Ge=35866;else{console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");return}N.pixelStorei(37440,G.flipY),N.pixelStorei(37441,G.premultiplyAlpha),N.pixelStorei(3317,G.unpackAlignment);const Ve=N.getParameter(3314),tt=N.getParameter(32878),Gt=N.getParameter(3316),cn=N.getParameter(3315),oi=N.getParameter(32877),yt=Z.isCompressedTexture?Z.mipmaps[0]:Z.image;N.pixelStorei(3314,yt.width),N.pixelStorei(32878,yt.height),N.pixelStorei(3316,A.min.x),N.pixelStorei(3315,A.min.y),N.pixelStorei(32877,A.min.z),Z.isDataTexture||Z.isData3DTexture?N.texSubImage3D(Ge,X,z.x,z.y,z.z,ae,me,De,ze,Be,yt.data):Z.isCompressedArrayTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),N.compressedTexSubImage3D(Ge,X,z.x,z.y,z.z,ae,me,De,ze,yt.data)):N.texSubImage3D(Ge,X,z.x,z.y,z.z,ae,me,De,ze,Be,yt),N.pixelStorei(3314,Ve),N.pixelStorei(32878,tt),N.pixelStorei(3316,Gt),N.pixelStorei(3315,cn),N.pixelStorei(32877,oi),X===0&&G.generateMipmaps&&N.generateMipmap(Ge),Te.unbindTexture()},this.initTexture=function(A){A.isCubeTexture?Ue.setTextureCube(A,0):A.isData3DTexture?Ue.setTexture3D(A,0):A.isDataArrayTexture||A.isCompressedArrayTexture?Ue.setTexture2DArray(A,0):Ue.setTexture2D(A,0),Te.unbindTexture()},this.resetState=function(){x=0,M=0,y=null,Te.reset(),xe.reset()},typeof __THREE_DEVTOOLS__!="undefined"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get physicallyCorrectLights(){return console.warn("THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),!this.useLegacyLights}set physicallyCorrectLights(e){console.warn("THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),this.useLegacyLights=!e}}class yg extends Gc{}yg.prototype.isWebGL1Renderer=!0;class wg extends Et{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__!="undefined"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t}get autoUpdate(){return console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate}set autoUpdate(e){console.warn("THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144."),this.matrixWorldAutoUpdate=e}}class Hc extends cr{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Je(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const al=new I,ll=new I,cl=new vt,lo=new Do,ss=new Ss;class Kn extends Et{constructor(e=new qt,t=new Hc){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[0];for(let i=1,s=t.count;il)continue;h.applyMatrix4(this.matrixWorld);const T=e.ray.origin.distanceTo(h);Te.far||t.push({distance:T,point:f.clone().applyMatrix4(this.matrixWorld),index:x,face:null,faceIndex:null,object:this})}}else{const d=Math.max(0,o.start),g=Math.min(m.count,o.start+o.count);for(let x=d,M=g-1;xl)continue;h.applyMatrix4(this.matrixWorld);const w=e.ray.origin.distanceTo(h);we.far||t.push({distance:w,point:f.clone().applyMatrix4(this.matrixWorld),index:x,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){const t=this.geometry.morphAttributes,n=Object.keys(t);if(n.length>0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,o=i.length;s0&&x(!0),t>0&&x(!1)),this.setIndex(u),this.setAttribute("position",new pt(f,3)),this.setAttribute("normal",new pt(h,3)),this.setAttribute("uv",new pt(p,2));function g(){const M=new I,y=new I;let w=0;const C=(t-e)/n;for(let T=0;T<=s;T++){const b=[],S=T/s,F=S*(t-e)+e;for(let k=0;k<=i;k++){const L=k/i,O=L*l+a,B=Math.sin(O),J=Math.cos(O);y.x=F*B,y.y=-S*n+m,y.z=F*J,f.push(y.x,y.y,y.z),M.set(B,C,J).normalize(),h.push(M.x,M.y,M.z),p.push(L,1-S),b.push(_++)}v.push(b)}for(let T=0;T.9&&C<.1&&(x<.2&&(o[g+0]+=1),M<.2&&(o[g+2]+=1),y<.2&&(o[g+4]+=1))}}function h(g){s.push(g.x,g.y,g.z)}function p(g,x){const M=g*3;x.x=e[M+0],x.y=e[M+1],x.z=e[M+2]}function _(){const g=new I,x=new I,M=new I,y=new I,w=new Qe,C=new Qe,T=new Qe;for(let b=0,S=0;b0)&&p.push(x,M,w),(d!==n-1||l{const r={show:Ye(!1),cameraPosition:Ye({x:0,y:0,z:1}),cameraLookAt:Ye({x:0,y:0,z:10}),objectPosition:Ye({x:0,y:0,z:10}),objectEuler:Ye(new yi(0,0,0,"ZXY")),entity:Ye(0)};return{...r,...{setupModel(t){r.cameraPosition.set(Vi(t.cameraPosition)),r.cameraLookAt.set(Vi(t.cameraLookAt)),r.objectPosition.set(Vi(t.objectPosition)),r.objectEuler.set(new yi(Kt.degToRad(t.objectRotation.x),Kt.degToRad(t.objectRotation.z),Kt.degToRad(t.objectRotation.y),"YZX")),r.show.set(!0),r.entity.set(t.entity)},updateCamera(t){r.cameraPosition.set(Vi(t.cameraPosition)),r.cameraLookAt.set(Vi(t.cameraLookAt))},updateCameraPosition(t){r.cameraPosition.set(t.cameraPosition)},updateCameraLookAt(t){r.cameraLookAt.set(t.cameraLookAt)},sendMovementUpdate(t){st("moveObject",t)},sendRotationUpdate(t){const n=fs(t);st("rotateObject",{x:Kt.radToDeg(n.x).toFixed(2),y:Kt.radToDeg(n.y).toFixed(2),z:Kt.radToDeg(n.z).toFixed(2)})}}}};var _n=Cg();function Pg(r){let e,t,n,i;const s=r[1].default,o=xn(s,r,r[0],null);return{c(){e=q("div"),o&&o.c(),V(e,"class","absolute")},m(a,l){Oe(a,e,l),o&&o.m(e,null),t=!0,n||(i=oc(Lg.call(null,e,{to:"body"})),n=!0)},p(a,[l]){o&&o.p&&(!t||l&1)&&bn(o,s,a,a[0],t?Mn(s,a[0],l,null):Sn(a[0]),null)},i(a){t||(_e(o,a),t=!0)},o(a){Se(o,a),t=!1},d(a){a&&Ne(e),o&&o.d(a),n=!1,i()}}}function Lg(r,{to:e}){const t=document.querySelector(e);return t&&t.appendChild(r),{}}function Rg(r,e,t){let{$$slots:n={},$$scope:i}=e;return r.$$set=s=>{"$$scope"in s&&t(0,i=s.$$scope)},[i,n]}class qc extends gt{constructor(e){super(),mt(this,e,Rg,Pg,ft,{})}}function pl(r){let e,t;const n=r[2].default,i=xn(n,r,r[5],null);return{c(){e=q("main"),i&&i.c(),V(e,"class","svelte-1fnr7mh")},m(s,o){Oe(s,e,o),i&&i.m(e,null),t=!0},p(s,o){i&&i.p&&(!t||o&32)&&bn(i,n,s,s[5],t?Mn(n,s[5],o,null):Sn(s[5]),null)},i(s){t||(_e(i,s),t=!0)},o(s){Se(i,s),t=!1},d(s){s&&Ne(e),i&&i.d(s)}}}function ml(r){let e,t;return e=new qc({props:{$$slots:{default:[Dg]},$$scope:{ctx:r}}}),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,i){const s={};i&34&&(s.$$scope={dirty:i,ctx:n}),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function Dg(r){let e,t,n,i,s,o,a,l,c,u;return{c(){e=q("div"),t=q("div"),n=q("p"),n.textContent="Er du sikker på at du vil stoppe? Du har ting i din indkøbskurv",i=le(),s=q("div"),o=q("button"),o.textContent="Nej",a=le(),l=q("button"),l.textContent="Ja",V(n,"class","text-[color:var(--color-text)] text-[2rem] font-bold text-start"),V(o,"class","bg-[color:var(--color-tertiary)] text-[color:var(--color-text)] text-[2rem] px-[1rem] py-[0.5rem] w-full hover:cursor-pointer"),V(l,"class","bg-[color:var(--color-tertiary)] text-[color:var(--color-text)] text-[2rem] px-[1rem] py-[0.5rem] w-full hover:cursor-pointer"),V(s,"class","flex flex-row justify-between w-full gap-[2vw]"),V(t,"class","bg-[color:var(--color-secondary)] absolute w-[50rem] h-[fit] p-[1vw] flex flex-col gap-[1vw] justify-center items-center"),V(e,"class","z-[100] bg-black bg-opacity-50 w-screen h-screen absolute top-0 left-0 grid place-items-center")},m(f,h){Oe(f,e,h),D(e,t),D(t,n),D(t,i),D(t,s),D(s,o),D(s,a),D(s,l),c||(u=[Le(o,"click",r[3]),Le(l,"click",r[4])],c=!0)},p:St,d(f){f&&Ne(e),c=!1,kt(u)}}}function Ig(r){let e,t,n,i=r[0]&&pl(r),s=r[1]&&r[0]&&ml(r);return{c(){i&&i.c(),e=le(),s&&s.c(),t=ri()},m(o,a){i&&i.m(o,a),Oe(o,e,a),s&&s.m(o,a),Oe(o,t,a),n=!0},p(o,[a]){o[0]?i?(i.p(o,a),a&1&&_e(i,1)):(i=pl(o),i.c(),_e(i,1),i.m(e.parentNode,e)):i&&(Wn(),Se(i,1,1,()=>{i=null}),jn()),o[1]&&o[0]?s?(s.p(o,a),a&3&&_e(s,1)):(s=ml(o),s.c(),_e(s,1),s.m(t.parentNode,t)):s&&(Wn(),Se(s,1,1,()=>{s=null}),jn())},i(o){n||(_e(i),_e(s),n=!0)},o(o){Se(i),Se(s),n=!1},d(o){i&&i.d(o),o&&Ne(e),s&&s.d(o),o&&Ne(t)}}}function Ug(r,e,t){let n,i;Ee(r,Cn,f=>t(6,n=f)),Ee(r,zt,f=>t(7,i=f));let{$$slots:s={},$$scope:o}=e,a;ji.subscribe(f=>{t(0,a=f)}),an("setVisible",f=>{ji.set(f),f&&Ie(zt,i=!1,i)});let l=!1;or(()=>{const f=h=>{a&&["Escape"].includes(h.code)&&(n.length>0?t(1,l=!0):(st("hoverOut"),st("hideUI"),t(1,l=!1),ji.set(!1),_n.show.set(!1),vn.set(null)))};return window.addEventListener("keydown",f),()=>window.removeEventListener("keydown",f)});const c=()=>{t(1,l=!1)},u=()=>{st("hideUI"),t(1,l=!1),ji.set(!1),_n.show.set(!1)};return r.$$set=f=>{"$$scope"in f&&t(5,o=f.$$scope)},[a,l,s,c,u,o]}class Ng extends gt{constructor(e){super(),mt(this,e,Ug,Ig,ft,{})}}const Og=()=>!window.invokeNative,Ao=(r,e=0)=>{if(Og())for(const t of r)setTimeout(()=>{window.dispatchEvent(new MessageEvent("message",{data:{action:t.action,data:t.data}}))},e)};function gl(r,e,t){const n=r.slice();return n[6]=e[t],n}function _l(r,e,t){const n=r.slice();return n[9]=e[t],n}function vl(r){let e,t=r[1],n=[];for(let i=0;i{t(0,n=!n)},c=>{if(c.custom==!0){c.customFunction();return}Ao([{action:c.action,data:c.data}])}]}class kg extends gt{constructor(e){super(),mt(this,e,zg,Fg,ft,{})}}function bl(r,e,t){const n=r.slice();return n[15]=e[t],n[17]=t,n}function Sl(r){let e,t,n,i=r[15].label+"",s,o,a,l,c,u,f,h=r[15].price+",-",p,_,v,m,d,g;function x(){return r[8](r[15])}function M(){return r[10](r[15])}return{c(){e=q("button"),t=q("div"),n=q("p"),s=rt(i),o=le(),a=q("div"),l=q("p"),l.textContent="Pris:",c=le(),u=q("p"),p=rt(h),f=rt(""),_=le(),v=q("div"),v.innerHTML='',m=le(),V(n,"class","text-[color:var(--color-text)] text-[2rem] font-bold text-start"),V(l,"class","text-[color:var(--color-text)] text-[1.2rem]"),V(u,"class","text-[color:var(--color-accent)] ml-2 font-bold text-[1.2rem]"),V(a,"class","flex"),V(t,"class","w-full h-full flex flex-col justify-center items-start ml-10"),V(v,"class","bg-[color:var(--color-tertiary)] aspect-square h-full grid place-items-center justify-center items-center"),V(e,"class","h-full w-[30rem] bg-[color:var(--color-secondary)] flex flex-row items-center hover:cursor-pointer")},m(y,w){Oe(y,e,w),D(e,t),D(t,n),D(n,s),D(t,o),D(t,a),D(a,l),D(a,c),D(a,u),D(u,f),D(u,p),D(e,_),D(e,v),D(e,m),d||(g=[Le(v,"mouseenter",x),Le(v,"mouseleave",r[9]),Le(e,"click",M),Le(e,"mouseleave",r[11])],d=!0)},p(y,w){r=y,w&8&&i!==(i=r[15].label+"")&&At(s,i),w&8&&h!==(h=r[15].price+",-")&&At(p,h)},d(y){y&&Ne(e),d=!1,kt(g)}}}function yl(r){let e,t;return e=new qc({props:{$$slots:{default:[Bg]},$$scope:{ctx:r}}}),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,i){const s={};i&262246&&(s.$$scope={dirty:i,ctx:n}),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function Bg(r){let e,t,n,i,s,o,a,l,c,u;return{c(){e=q("div"),t=q("div"),n=q("p"),n.textContent=`Er du sikker på, at du vil stoppe\r + med at plcere dette objekt?`,i=le(),s=q("div"),o=q("button"),o.textContent="Nej",a=le(),l=q("button"),l.textContent="Ja",V(n,"class","text-[color:var(--color-text)] text-[2rem] font-bold text-start"),V(o,"class","bg-[color:var(--color-tertiary)] text-[color:var(--color-text)] text-[2rem] px-[1rem] py-[0.5rem] w-full hover:cursor-pointer"),V(l,"class","bg-[color:var(--color-tertiary)] text-[color:var(--color-text)] text-[2rem] px-[1rem] py-[0.5rem] w-full hover:cursor-pointer"),V(s,"class","flex flex-row justify-between w-full gap-[2vw]"),V(t,"class","bg-[color:var(--color-secondary)] absolute w-[50rem] h-[fit] p-[1vw] flex flex-col gap-[1vw] justify-center items-center"),V(e,"class","z-[100] bg-black bg-opacity-50 w-screen h-screen absolute top-0 left-0 grid place-items-center")},m(f,h){Oe(f,e,h),D(e,t),D(t,n),D(t,i),D(t,s),D(s,o),D(s,a),D(s,l),c||(u=[Le(o,"click",r[13]),Le(l,"click",r[14])],c=!0)},p:St,d(f){f&&Ne(e),c=!1,kt(u)}}}function Gg(r){let e,t,n,i,s,o,a,l=r[3].items,c=[];for(let f=0;f{u=null}),jn())},i(f){s||(_e(u),s=!0)},o(f){Se(u),s=!1},d(f){f&&Ne(e),rr(c,f),r[12](null),f&&Ne(n),u&&u.d(f),f&&Ne(i),o=!1,a()}}}function Hg(r,e,t){let n,i,s,o;Ee(r,$n,g=>t(3,n=g)),Ee(r,Zi,g=>t(4,i=g)),Ee(r,vn,g=>t(5,s=g)),Ee(r,zt,g=>t(6,o=g));let a;function l(g){g=window.event||g;var x=Math.max(-1,Math.min(1,g.wheelDelta||-g.detail));t(0,a.scrollLeft-=x*50,a),g.preventDefault()}let c=!1,u=null;const f=g=>{st("hoverIn",g)},h=()=>{st("hoverOut")},p=g=>{if(st("hoverOut"),g.type){const x=i.filter(y=>y.type===g.type);let M=g.max;if(x.length>=M){st("showNotification",{type:"error",message:`You can only have ${M} of this item!`});return}}s!=null?(t(1,c=!0),t(2,u=g)):(st("previewFurniture",g),Ie(vn,s=g,s),Ie(zt,o=!0,o))},_=()=>{st("hoverOut")};function v(g){Vn[g?"unshift":"push"](()=>{a=g,t(0,a)})}return[a,c,u,n,i,s,o,l,f,h,p,_,v,()=>{t(1,c=!1),t(2,u=null)},()=>{st("previewFurniture",u),Ie(vn,s=u,s),Ie(zt,o=!0,o),t(1,c=!1),t(2,u=null)}]}class Vg extends gt{constructor(e){super(),mt(this,e,Hg,Gg,ft,{})}}function Wg(r,e,t){let n,i,s,o,a,l;Ee(r,Zi,u=>t(0,n=u)),Ee(r,Cn,u=>t(1,i=u)),Ee(r,vn,u=>t(2,s=u)),Ee(r,zt,u=>t(3,o=u)),Ee(r,ms,u=>t(4,a=u)),Ee(r,ji,u=>t(5,l=u)),Ao([{action:"setVisible",data:!0}]),Ao([{action:"setBrowserMode",data:!0}]);function c(u){u.key==="="&&Ie(ji,l=!0,l)}return an("setBrowserMode",u=>{Ms.set(u),console.log("browser mode enabled"),u?window.addEventListener("keydown",c):window.removeEventListener("keydown",c)}),an("setupModel",u=>{_n.show.set(!0),_n.setupModel(u)}),an("updateCamera",u=>{_n.updateCamera(u)}),an("setFurnituresData",u=>{ms.set(u),$n.set(a[0])}),an("addToCart",u=>{Ie(Cn,i=[...i,u],i),_n.show.set(!1),Ie(zt,o=!1,o)}),an("removeFromCart",u=>{Ie(Cn,i=i.filter(f=>f.entity!=u.entity),i),Ie(Cn,i=[...i],i),Ie(vn,s=null,s),_n.show.set(!1)}),an("clearCart",()=>{Ie(Cn,i=[],i)}),an("setOwnedItems",u=>{Ie(Zi,n=u,n)}),an("removeOwnedItem",u=>{let f=n.filter(h=>h.id!=u.id);Ie(Zi,n=[...f],n)}),[]}class jg extends gt{constructor(e){super(),mt(this,e,Wg,null,ft,{})}}function wl(r,e,t){const n=r.slice();return n[20]=e[t],n[22]=t,n}function El(r){let e,t,n;return{c(){e=q("input"),e.autofocus=!0,V(e,"class","min-w-[10rem] h-[4.5rem] px-[1rem] text-[1.6rem] bg-[color:var(--color-tertiary)]"),V(e,"type","text"),V(e,"placeholder","Søg")},m(i,s){Oe(i,e,s),Tn(e,r[1]),e.focus(),t||(n=Le(e,"input",r[13]),t=!0)},p(i,s){s&2&&e.value!==i[1]&&Tn(e,i[1])},d(i){i&&Ne(e),t=!1,n()}}}function Tl(r){let e,t=r[20].category+"",n,i,s;function o(){return r[15](r[22])}return{c(){e=q("button"),n=rt(t),V(e,"class","whitespace-nowrap w-fit px-10 h-[4.5rem] text-[1.6rem] bg-[color:var(--color-secondary)] grid place-items-center transition-all duration-200 ease-in-out svelte-vkl3yg"),ps(e,"selected",r[0]===r[22])},m(a,l){Oe(a,e,l),D(e,n),i||(s=Le(e,"click",o),i=!0)},p(a,l){r=a,l&4&&t!==(t=r[20].category+"")&&At(n,t),l&1&&ps(e,"selected",r[0]===r[22])},d(a){a&&Ne(e),i=!1,s()}}}function Xg(r){let e,t,n,i,s,o,a,l,c,u,f,h,p,_,v,m=r[9].length+"",d,g,x,M,y,w,C=r[10].length+"",T,b,S,F,k,L,O,B=r[4]&&El(r),J=r[2],R=[];for(let H=0;H',i=le(),B&&B.c(),o=le(),a=q("div"),l=q("button"),l.textContent="Alle objekter",c=le();for(let H=0;Ht(2,n=C)),Ee(r,$n,C=>t(5,i=C)),Ee(r,zt,C=>t(6,s=C)),Ee(r,Er,C=>t(7,o=C)),Ee(r,Tr,C=>t(8,a=C)),Ee(r,Zi,C=>t(9,l=C)),Ee(r,Cn,C=>t(10,c=C));let u=-1,f;function h(C){C=window.event||C;var T=Math.max(-1,Math.min(1,C.wheelDelta||-C.detail));t(3,f.scrollLeft-=T*50,f),C.preventDefault()}let p=!1,_="";const v=()=>{t(4,p=!p),s&&Ie(zt,s=!1,s)};function m(){_=this.value,t(1,_)}const d=()=>{t(0,u=-1);const C=n.flatMap(T=>T.items);Ie($n,i={category:"Alle objekter",items:C},i),s&&Ie(zt,s=!1,s)},g=C=>{t(0,u=C),Ie($n,i=n[C],i),s&&Ie(zt,s=!1,s)};function x(C){Vn[C?"unshift":"push"](()=>{f=C,t(3,f)})}const M=()=>{Ie(Er,o=!1,o),Ie(Tr,a=!a,a)},y=()=>{Ie(Tr,a=!1,a),Ie(Er,o=!o,o)},w=()=>{Ie(zt,s=!s,s)};return r.$$.update=()=>{if(r.$$.dirty&7)if(_.length>0){let C=null;u==-1?C=n.flatMap(b=>b.items):C=n[u].items;const T=C.filter(b=>b.label.toLowerCase().includes(_.toLowerCase()));Ie($n,i={category:"Søge resultat",items:T},i)}else if(u===-1){const C=n.flatMap(T=>T.items);Ie($n,i={category:"Alle objekter",items:C},i)}else Ie($n,i=n[u],i)},[u,_,n,f,p,i,s,o,a,l,c,h,v,m,d,g,x,M,y,w]}class Yg extends gt{constructor(e){super(),mt(this,e,qg,Xg,ft,{})}}function Al(r,e,t){const n=r.slice();return n[7]=e[t],n[9]=t,n}function Cl(r){let e,t,n,i,s,o,a,l,c,u,f,h=r[1].reduce(Ll,0)+",-",p,_,v,m,d,g,x,M,y=r[1],w=[];for(let C=0;CDIN INDKØBS KURV

",n=le(),i=q("div");for(let C=0;C',d=le(),g=q("button"),g.innerHTML="

Køb

",V(t,"class","font-medium"),V(i,"class","flex flex-col gap-2 overflow-scroll h-[73%] scroll-style scroll-style-vertical"),V(a,"class","text-[1.6rem] w-full h-full flex items-center justify-between"),V(m,"class","bg-[color:var(--color-secondary)] mt-2 font-medium h-full w-[20%] py-14 gap-4 whitespace-nowrap flex flex-row items-center justify-center px-8 text-center"),V(g,"class","bg-[color:var(--color-accent)] text-[2rem] mt-2 font-medium h-full w-[79%] py-14 gap-4 whitespace-nowrap flex flex-row items-center justify-center px-8 text-center"),V(v,"class","flex w-full h-full justify-between"),V(o,"class","flex flex-col gap-2 items-center justify-center h-[5rem] mt-10"),V(e,"class","w-[40rem] h-[60rem] bg-[color:var(--color-primary)] absolute right-0 -top-[65rem] flex flex-col gap-[1rem] p-12")},m(C,T){Oe(C,e,T),D(e,t),D(e,n),D(e,i);for(let b=0;b',m=le(),V(n,"class","text-[2rem]"),V(u,"class","text-[color:var(--color-accent)] font-bold ml-2"),V(a,"class","flex text-[1.5rem]"),V(t,"class","flex flex-col gap-2 w-full text-start ml-10"),V(v,"class","bg-[color:var(--color-tertiary)] text-[2rem] py-4 h-full text-center aspect-square"),V(e,"class","flex flex-row gap-2 w-full min-h-[8rem] justify-between bg-[color:var(--color-secondary)] items-center")},m(y,w){Oe(y,e,w),D(e,t),D(t,n),D(n,s),D(t,o),D(t,a),D(a,l),D(a,c),D(a,u),D(u,f),D(u,p),D(e,_),D(e,v),D(e,m),d||(g=[Le(v,"click",x),Le(e,"click",M)],d=!0)},p(y,w){r=y,w&2&&i!==(i=r[7].label+"")&&At(s,i),w&2&&h!==(h=r[7].price+",-")&&At(p,h)},d(y){y&&Ne(e),d=!1,kt(g)}}}function Zg(r){let e,t=r[0]&&Cl(r);return{c(){t&&t.c(),e=ri()},m(n,i){t&&t.m(n,i),Oe(n,e,i)},p(n,[i]){n[0]?t?t.p(n,i):(t=Cl(n),t.c(),t.m(e.parentNode,e)):t&&(t.d(1),t=null)},i:St,o:St,d(n){t&&t.d(n),n&&Ne(e)}}}const Ll=(r,e)=>r+e.price;function Qg(r,e,t){let n,i,s;return Ee(r,Er,u=>t(0,n=u)),Ee(r,Cn,u=>t(1,i=u)),Ee(r,vn,u=>t(2,s=u)),[n,i,s,u=>{st("removeCartItem",u)},u=>{st("selectCartItem",u)},()=>Ie(Er,n=!1,n),()=>{Ie(vn,s=null,s),st("buyCartItems")}]}class Kg extends gt{constructor(e){super(),mt(this,e,Qg,Zg,ft,{})}}function Rl(r,e,t){const n=r.slice();return n[5]=e[t],n[7]=t,n}function Dl(r){let e,t,n,i,s,o,a,l,c,u=r[1],f=[];for(let h=0;h',o=le(),a=q("div");for(let h=0;h',n=le(),i=q("div"),s=q("h1"),a=rt(o),l=le(),c=q("button"),c.innerHTML='',u=le(),V(t,"class","bg-[color:var(--color-tertiary)] text-[2rem] w-[4rem] h-[4rem] text-center aspect-square"),V(s,"class","text-[2rem]"),V(i,"class","flex flex-col gap-2 w-full"),V(c,"class","bg-[color:var(--color-tertiary)] text-[2rem] py-4 h-full text-center aspect-square"),V(e,"class","flex flex-row gap-2 w-full justify-between bg-[color:var(--color-secondary)] p-4 items-center")},m(v,m){Oe(v,e,m),D(e,t),D(e,n),D(e,i),D(i,s),D(s,a),D(e,l),D(e,c),D(e,u),f||(h=[Le(t,"click",p),Le(c,"click",_)],f=!0)},p(v,m){r=v,m&2&&o!==(o=r[5].label+"")&&At(a,o)},d(v){v&&Ne(e),f=!1,kt(h)}}}function Jg(r){let e,t=r[0]&&Dl(r);return{c(){t&&t.c(),e=ri()},m(n,i){t&&t.m(n,i),Oe(n,e,i)},p(n,[i]){n[0]?t?t.p(n,i):(t=Dl(n),t.c(),t.m(e.parentNode,e)):t&&(t.d(1),t=null)},i:St,o:St,d(n){t&&t.d(n),n&&Ne(e)}}}function $g(r,e,t){let n,i;return Ee(r,Tr,l=>t(0,n=l)),Ee(r,Zi,l=>t(1,i=l)),[n,i,()=>Ie(Tr,n=!1,n),l=>{st("selectOwnedItem",l)},l=>{st("removeOwnedItem",l)}]}class e_ extends gt{constructor(e){super(),mt(this,e,$g,Jg,ft,{})}}function t_(r){let e,t,n,i,s,o,a,l,c,u,f,h,p,_,v,m,d,g,x=r[1].toFixed(1)+"",M,y,w,C,T,b,S;return t=new Yg({}),i=new Vg({}),o=new Kg({}),l=new e_({}),{c(){e=q("div"),nt(t.$$.fragment),n=le(),nt(i.$$.fragment),s=le(),nt(o.$$.fragment),a=le(),nt(l.$$.fragment),c=le(),u=q("div"),f=q("i"),h=le(),p=q("p"),p.textContent="C",_=le(),v=q("div"),m=q("i"),d=le(),g=q("p"),M=rt(x),y=le(),w=q("input"),V(f,"class","fa-solid fa-video text-[white]"),V(p,"class","font-semibold"),jo(u,"border-color",r[0]?"white":"var(--color-tertiary)"),V(u,"class","absolute -top-[5rem] text-[2rem] right-0 w-[8rem] border-[0.3rem] h-[4rem] bg-[color:var(--color-primary)] flex flex-row gap-[1rem] items-center justify-center"),V(m,"class","fa-solid fa-eye text-[white]"),V(g,"class","font-semibold text-center w-[4rem]"),V(w,"id","slider"),V(w,"type","range"),V(w,"min","1.0"),V(w,"max","12.5"),V(w,"step","0.5"),V(w,"class","w-full"),V(v,"class","flex flex-row gap-[1rem] items-center absolute left-0 -top-[5rem] w-[30rem] h-fit p-4 bg-[color:var(--color-primary)]"),V(e,"class",C="w-[97%] h-fit flex flex-col absolute left-1/2 overflow-visible -translate-x-1/2 "+(r[2]?"-bottom-[24rem]":"bottom-[3rem]")+" z-[1] transition-all")},m(F,k){Oe(F,e,k),$e(t,e,null),D(e,n),$e(i,e,null),D(e,s),$e(o,e,null),D(e,a),$e(l,e,null),D(e,c),D(e,u),D(u,f),D(u,h),D(u,p),D(e,_),D(e,v),D(v,m),D(v,d),D(v,g),D(g,M),D(v,y),D(v,w),Tn(w,r[1]),T=!0,b||(S=[Le(w,"change",r[3]),Le(w,"input",r[3]),Le(w,"change",r[4])],b=!0)},p(F,[k]){(!T||k&1)&&jo(u,"border-color",F[0]?"white":"var(--color-tertiary)"),(!T||k&2)&&x!==(x=F[1].toFixed(1)+"")&&At(M,x),k&2&&Tn(w,F[1]),(!T||k&4&&C!==(C="w-[97%] h-fit flex flex-col absolute left-1/2 overflow-visible -translate-x-1/2 "+(F[2]?"-bottom-[24rem]":"bottom-[3rem]")+" z-[1] transition-all"))&&V(e,"class",C)},i(F){T||(_e(t.$$.fragment,F),_e(i.$$.fragment,F),_e(o.$$.fragment,F),_e(l.$$.fragment,F),T=!0)},o(F){Se(t.$$.fragment,F),Se(i.$$.fragment,F),Se(o.$$.fragment,F),Se(l.$$.fragment,F),T=!1},d(F){F&&Ne(e),et(t),et(i),et(o),et(l),b=!1,kt(S)}}}function n_(r,e,t){let n;Ee(r,zt,c=>t(2,n=c));let i=!1,s=5;function o(c){c.target instanceof HTMLInputElement||c.target instanceof HTMLTextAreaElement||c.key==="c"&&(st("freecamMode",!0),Ie(zt,n=!0,n),t(0,i=!0))}an("freecamMode",c=>{c==!1&&(Ie(zt,n=!1,n),t(0,i=!1))}),or(()=>{window.addEventListener("keypress",o),st("freecamMode",!1),st("setHoverDistance",s),Ie(zt,n=!1,n),t(0,i=!1)});function a(){s=cs(this.value),t(1,s)}return[i,s,n,a,()=>{st("setHoverDistance",s)}]}class i_ extends gt{constructor(e){super(),mt(this,e,n_,t_,ft,{})}}const r_={uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:` + + varying vec2 vUv; + + void main() { + + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + + }`,fragmentShader:` + + uniform float opacity; + + uniform sampler2D tDiffuse; + + varying vec2 vUv; + + void main() { + + gl_FragColor = texture2D( tDiffuse, vUv ); + gl_FragColor.a *= opacity; + + + }`};class Ts{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}const s_=new Oc(-1,1,1,-1,0,1),zo=new qt;zo.setAttribute("position",new pt([-1,3,0,-1,-1,0,3,-1,0],3));zo.setAttribute("uv",new pt([0,2,0,0,2,0],2));class o_{constructor(e){this._mesh=new pe(zo,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,s_)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class a_ extends Ts{constructor(e,t){super(),this.textureID=t!==void 0?t:"tDiffuse",e instanceof Xn?(this.uniforms=e.uniforms,this.material=e):e&&(this.uniforms=Dc.clone(e.uniforms),this.material=new Xn({defines:Object.assign({},e.defines),uniforms:this.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader})),this.fsQuad=new o_(this.material)}render(e,t,n){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=n.texture),this.fsQuad.material=this.material,this.renderToScreen?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this.fsQuad.render(e))}dispose(){this.material.dispose(),this.fsQuad.dispose()}}class Ul extends Ts{constructor(e,t){super(),this.scene=e,this.camera=t,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(e,t,n){const i=e.getContext(),s=e.state;s.buffers.color.setMask(!1),s.buffers.depth.setMask(!1),s.buffers.color.setLocked(!0),s.buffers.depth.setLocked(!0);let o,a;this.inverse?(o=0,a=1):(o=1,a=0),s.buffers.stencil.setTest(!0),s.buffers.stencil.setOp(i.REPLACE,i.REPLACE,i.REPLACE),s.buffers.stencil.setFunc(i.ALWAYS,o,4294967295),s.buffers.stencil.setClear(a),s.buffers.stencil.setLocked(!0),e.setRenderTarget(n),this.clear&&e.clear(),e.render(this.scene,this.camera),e.setRenderTarget(t),this.clear&&e.clear(),e.render(this.scene,this.camera),s.buffers.color.setLocked(!1),s.buffers.depth.setLocked(!1),s.buffers.stencil.setLocked(!1),s.buffers.stencil.setFunc(i.EQUAL,1,4294967295),s.buffers.stencil.setOp(i.KEEP,i.KEEP,i.KEEP),s.buffers.stencil.setLocked(!0)}}class l_ extends Ts{constructor(){super(),this.needsSwap=!1}render(e){e.state.buffers.stencil.setLocked(!1),e.state.buffers.stencil.setTest(!1)}}class c_{constructor(e,t){if(this.renderer=e,t===void 0){const n=e.getSize(new Qe);this._pixelRatio=e.getPixelRatio(),this._width=n.width,this._height=n.height,t=new ii(this._width*this._pixelRatio,this._height*this._pixelRatio),t.texture.name="EffectComposer.rt1"}else this._pixelRatio=1,this._width=t.width,this._height=t.height;this.renderTarget1=t,this.renderTarget2=t.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new a_(r_),this.clock=new jc}swapBuffers(){const e=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=e}addPass(e){this.passes.push(e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(e,t){this.passes.splice(t,0,e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(e){const t=this.passes.indexOf(e);t!==-1&&this.passes.splice(t,1)}isLastEnabledPass(e){for(let t=e+1;t{r.renderer=new Gc({powerPreference:"high-performance",canvas:e,antialias:!0,alpha:!0,...t}),r.composer=new c_(r.renderer),r.composer.addPass(new Yc(r.scene,Po(r.camera)))},Nl=(r,e,t)=>{!r.renderer||(e?r.renderer.outputEncoding=ni:r.renderer.outputEncoding=at,t?r.renderer.toneMapping=Rn:r.renderer.toneMapping=vc)},Ol=(r,e,t)=>{var n,i,s,o,a,l,c,u;!r.renderer||!r.composer||((i=(n=r.renderer).setSize)==null||i.call(n,e.width,e.height),(o=(s=r.renderer).setPixelRatio)==null||o.call(s,t),(l=(a=r.composer).setSize)==null||l.call(a,e.width,e.height),(u=(c=r.composer).setPixelRatio)==null||u.call(c,t))},Fl=(r,e,t)=>{!r.renderer||(r.renderer.shadowMap.enabled=e,r.renderer.shadowMap.type=t)},Ln=r=>r.userData,f_=(r,e)=>{r.pointer.update(t=>r.renderer?t.set(e.offsetX/r.renderer.domElement.clientWidth*2-1,-(e.offsetY/r.renderer.domElement.clientHeight)*2+1):t)},Zc=(r,e,t,n)=>(r.raycaster.setFromCamera(e,t),r.raycaster.intersectObjects(n,!1)),h_=(r,e)=>r.object.uuid!==e.object.uuid||r.instanceId!==e.instanceId,d_=(r,e,t)=>{let n;const i=r.camera.subscribe(c=>n=c);ut(i);let s;const o=r.pointer.subscribe(c=>s=c);ut(o);let a;const l=c=>{var h,p;c.preventDefault();const u=c.type;r.pointerOverCanvas.set(!0),t.pointerInvalidated=!0,f_(r,c);const f=p_(e,s,n);if(u==="pointerdown"&&(a=f?{object:f.object,instanceId:f.instanceId}:null),u==="click"){if(!m_(f,a)){a=null;return}a=null}!f||(p=(h=Ln(f.object)).eventDispatcher)==null||p.call(h,u,{...f,event:c})};return{onClick:l,onContextMenu:l,onPointerUp:l,onPointerDown:l,onPointerMove:l}};function p_(r,e,t){if(r.interactiveObjects.size===0||r.raycastableObjects.size===0)return null;const n=Zc(r,e,t,Array.from(r.raycastableObjects));return n.length===0||!r.interactiveObjects.has(n[0].object)?null:n[0]}function m_(r,e){return!r||!e?!1:r.object.uuid===e.object.uuid&&r.instanceId===e.instanceId}const g_=(r,e)=>{let t;const n=r.pointerOverCanvas.subscribe(c=>t=c);ut(n);let i;const s=r.camera.subscribe(c=>i=c);ut(s);let o;const a=r.pointer.subscribe(c=>o=c);return ut(a),{raycast:()=>{var f,h,p,_,v,m,d,g;if(e.interactiveObjects.size===0||e.raycastableObjects.size===0)return;const c=t?Zc(e,o,i,Array.from(e.raycastableObjects)):[],u=c.length&&e.interactiveObjects.has(c[0].object)?c[0]:null;u?e.lastIntersection?e.lastIntersection&&h_(e.lastIntersection,u)&&((m=(v=Ln(e.lastIntersection.object)).eventDispatcher)==null||m.call(v,"pointerleave",e.lastIntersection),(g=(d=Ln(u.object)).eventDispatcher)==null||g.call(d,"pointerenter",u)):(_=(p=Ln(u.object)).eventDispatcher)==null||_.call(p,"pointerenter",u):e.lastIntersection&&((h=(f=Ln(e.lastIntersection.object)).eventDispatcher)==null||h.call(f,"pointerleave",e.lastIntersection)),e.lastIntersection=u}}},As=typeof window!="undefined",__=r=>{if(!As)return;let e;const t=()=>{r(),e=requestAnimationFrame(t)};t(),ut(()=>{!e||cancelAnimationFrame(e)})},v_=(r,e)=>{if(e.frameHandlers.size===0)return;if(e.debugFrameloop){let i=0;e.frameHandlers.forEach(s=>{s.debugFrameloopMessage?e.invalidations[s.debugFrameloopMessage]=s.debugFrameloopMessage in e.invalidations?e.invalidations[s.debugFrameloopMessage]+1:1:++i}),i>0&&(e.invalidations.onFrame=e.frameHandlers.size)}const t=Array.from(e.frameHandlers).reduce((i,s)=>s.order?!0:i,!1),n=r.clock.getDelta();t?Array.from(e.frameHandlers).sort((i,s)=>{var o,a;return((o=i.order)!=null?o:0)>((a=s.order)!=null?a:0)?1:-1}).forEach(i=>i.fn(r,n)):e.frameHandlers.forEach(i=>i.fn(r,n))},x_=r=>{!r.debugFrameloop||(r.frame+=1,console.log(`frame: ${r.frame}${Object.keys(r.invalidations).length>0?", requested by \u21B4":""}`),Object.keys(r.invalidations).length>0&&console.table(r.invalidations),r.invalidations={})},M_=(r,e,t,n)=>{let i=Po(r.camera);const s=r.camera.subscribe(a=>i=a);ut(s);const{raycast:o}=g_(r,e);__(()=>{n.dispose();const a=t.frameloop==="always"||t.frameloop==="demand"&&(t.frameInvalidated||t.frameHandlers.size>0)||t.frameloop==="never"&&t.advance;(a||t.pointerInvalidated)&&(o(),t.pointerInvalidated=!1),a&&(!i||!r.composer||!r.renderer||(v_(r,t),r.composer.passes.length>1?r.composer.render():r.renderer.render(r.scene,i),x_(t),t.frameInvalidated=!1,t.advance=!1))})},b_=()=>{const r=new sn(75,0,.1,1e3);return Ln(r).threlteDefaultCamera=!0,r.position.z=5,r.lookAt(0,0,0),r},S_=r=>{const e=r.size.subscribe(t=>{Ln(Po(r.camera)).threlteDefaultCamera&&r.camera.update(n=>{const i=n;return i.aspect=t.width/t.height,i.updateProjectionMatrix(),r.invalidate("Default camera: aspect ratio changed"),i})});ut(e)},y_=(r,e,t,n,i,s,o)=>{const a={audioListeners:new Map,addAudioListener:(d,g)=>{if(g=g!=null?g:"default",a.audioListeners.has(g)){console.warn(`An AudioListener with the id "${g}" has already been added, aborting.`);return}a.audioListeners.set(g,d)},removeAudioListener:d=>{if(d=d!=null?d:"default",!a.audioListeners.has(d)){console.warn(`No AudioListener with the id "${d}" found, aborting.`);return}a.audioListeners.delete(d)},getAudioListener:d=>{if(d=d!=null?d:"default",!a.audioListeners.has(d)){console.warn(`No AudioListener with the id "${d}" found, aborting.`);return}return a.audioListeners.get(d)}},l={debugFrameloop:s,frameloop:o,frame:0,frameInvalidated:!0,pointerInvalidated:!0,invalidations:{},frameHandlers:new Set,advance:!1},c={size:pu([n,i],([d,g])=>d||g),pointer:Ye(new Qe),pointerOverCanvas:Ye(!1),clock:new jc,camera:Ye(b_()),scene:new wg,renderer:void 0,composer:void 0,invalidate:d=>{l.frameInvalidated=!0,l.debugFrameloop&&d&&(l.invalidations[d]=l.invalidations[d]?l.invalidations[d]+1:1)},advance:()=>{l.advance=!0}},u={flat:Ye(e),linear:Ye(r),dpr:Ye(t),setCamera:d=>{c.camera.set(d),c.composer&&(c.composer.passes.forEach(g=>{g instanceof Yc&&(g.camera=d)}),c.invalidate("Canvas: setting camera"))},raycastableObjects:new Set,interactiveObjects:new Set,raycaster:new Xc,lastIntersection:null,addRaycastableObject:d=>{u.raycastableObjects.add(d)},removeRaycastableObject:d=>{u.raycastableObjects.delete(d)},addInteractiveObject:d=>{u.interactiveObjects.add(d)},removeInteractiveObject:d=>{u.interactiveObjects.delete(d)},addPass:d=>{!c.composer||(c.composer.addPass(d),c.invalidate("Canvas: adding pass"))},removePass:d=>{!c.composer||(c.composer.removePass(d),c.invalidate("Canvas: removing pass"))}},f={dispose:async(d=!1)=>{await Lr(),!(!f.shouldDispose&&!d)&&(f.disposableObjects.forEach((g,x)=>{var M;(g===0||d)&&((M=x==null?void 0:x.dispose)==null||M.call(x),f.disposableObjects.delete(x))}),f.shouldDispose=!1)},collectDisposableObjects:(d,g)=>{const x=g!=null?g:[];return d&&((d==null?void 0:d.dispose)&&typeof d.dispose=="function"&&d.type!=="Scene"&&x.push(d),Object.entries(d).forEach(([M,y])=>{if(M==="parent"||M==="children"||typeof y!="object")return;const w=y;w!=null&&w.dispose&&f.collectDisposableObjects(w,x)})),x},addDisposableObjects:d=>{d.forEach(g=>{const x=f.disposableObjects.get(g);x?f.disposableObjects.set(g,x+1):f.disposableObjects.set(g,1)})},removeDisposableObjects:d=>{d.length!==0&&(d.forEach(g=>{const x=f.disposableObjects.get(g);x&&x>0&&f.disposableObjects.set(g,x-1)}),f.shouldDispose=!0)},disposableObjects:new Map,shouldDispose:!1};return pn("threlte",c),pn("threlte-root",u),pn("threlte-render-context",l),pn("threlte-audio-context",a),pn("threlte-disposal-context",f),{ctx:c,rootCtx:u,renderCtx:l,audioCtx:a,disposalCtx:f,getCtx:()=>c,getRootCtx:()=>u,getRenderCtx:()=>l,getAudioCtx:()=>a,getDisposalCtx:()=>f}};function Cs(r,e){const t=Ye(r);let n=r;const i=t.subscribe(a=>n=a);return ut(i),{...t,set:a=>{if((a==null?void 0:a.uuid)===(n==null?void 0:n.uuid))return;const l=n;t.set(a),e==null||e(a,l)},update:a=>{const l=a(n);if((l==null?void 0:l.uuid)===(n==null?void 0:n.uuid))return;const c=n;t.set(l),e==null||e(l,c)}}}const Un=()=>In("threlte");function w_(r){let e;const t=r[8].default,n=xn(t,r,r[7],null);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,[s]){n&&n.p&&(!e||s&128)&&bn(n,t,i,i[7],e?Mn(t,i[7],s,null):Sn(i[7]),null)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}const E_=()=>({onChildMount:In("threlte-hierarchical-object-on-mount"),onChildDestroy:In("threlte-hierarchical-object-on-destroy")}),Qc=()=>In("threlte-hierarchical-parent-context");function T_(r,e,t){var d;let n,{$$slots:i={},$$scope:s}=e,{object:o=void 0}=e,{children:a=[]}=e,{onChildMount:l=void 0}=e;const c=g=>{a.push(g),t(1,a),l==null||l(g)};let{onChildDestroy:u=void 0}=e;const f=g=>{const x=a.findIndex(M=>M.uuid===g.uuid);x!==-1&&a.splice(x,1),t(1,a),u==null||u(g)},{invalidate:h}=Un(),p=Qc();Ee(r,p,g=>t(6,n=g));let{parent:_=n}=e;const v=E_();o&&((d=v.onChildMount)==null||d.call(v,o),h("HierarchicalObject: object added"));const m=Cs(o,(g,x)=>{var M,y;x&&((M=v.onChildDestroy)==null||M.call(v,x),h("HierarchicalObject: object added")),g&&((y=v.onChildMount)==null||y.call(v,g),h("HierarchicalObject: object removed"))});return ut(()=>{var g;o&&((g=v.onChildDestroy)==null||g.call(v,o),h("HierarchicalObject: object removed"))}),pn("threlte-hierarchical-object-on-mount",c),pn("threlte-hierarchical-object-on-destroy",f),pn("threlte-hierarchical-parent-context",m),r.$$set=g=>{"object"in g&&t(3,o=g.object),"children"in g&&t(1,a=g.children),"onChildMount"in g&&t(4,l=g.onChildMount),"onChildDestroy"in g&&t(5,u=g.onChildDestroy),"parent"in g&&t(2,_=g.parent),"$$scope"in g&&t(7,s=g.$$scope)},r.$$.update=()=>{r.$$.dirty&64&&t(2,_=n),r.$$.dirty&8&&m.set(o)},[p,a,_,o,l,u,n,s,i]}class A_ extends gt{constructor(e){super(),mt(this,e,T_,w_,ft,{object:3,children:1,onChildMount:4,onChildDestroy:5,parent:2})}}function C_(r){let e;const t=r[1].default,n=xn(t,r,r[4],null);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,s){n&&n.p&&(!e||s&16)&&bn(n,t,i,i[4],e?Mn(t,i[4],s,null):Sn(i[4]),null)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}function P_(r){let e,t;return e=new A_({props:{object:r[0],onChildMount:r[2],onChildDestroy:r[3],$$slots:{default:[C_]},$$scope:{ctx:r}}}),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,[i]){const s={};i&1&&(s.object=n[0]),i&1&&(s.onChildMount=n[2]),i&1&&(s.onChildDestroy=n[3]),i&16&&(s.$$scope={dirty:i,ctx:n}),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function L_(r,e,t){let{$$slots:n={},$$scope:i}=e,{object:s}=e;const o=l=>s.add(l),a=l=>s.remove(l);return r.$$set=l=>{"object"in l&&t(0,s=l.object),"$$scope"in l&&t(4,i=l.$$scope)},[s,n,o,a,i]}class ko extends gt{constructor(e){super(),mt(this,e,L_,P_,ft,{object:0})}}const R_=()=>{const r=Ye({width:0,height:0});let e={width:0,height:0};const t=r.subscribe(o=>e=o);ut(t);let n;const i=()=>{const o=e;if(!n||!n.parentElement)return;const{clientWidth:a,clientHeight:l}=n.parentElement;(a!==o.width||l!==o.height)&&r.set({width:a,height:l})},s=o=>{n=o,i(),window.addEventListener("resize",i)};return As?(ut(()=>{window.removeEventListener("resize",i)}),{parentSizeAction:s,parentSize:r}):{parentSize:r,parentSizeAction:s}};function zl(r){let e,t;return e=new ko({props:{object:r[0].scene,$$slots:{default:[D_]},$$scope:{ctx:r}}}),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,i){const s={};i[1]&4&&(s.$$scope={dirty:i,ctx:n}),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function D_(r){let e;const t=r[29].default,n=xn(t,r,r[33],null);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,s){n&&n.p&&(!e||s[1]&4)&&bn(n,t,i,i[33],e?Mn(t,i[33],s,null):Sn(i[33]),null)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}function I_(r){let e,t,n,i,s=r[2]&&zl(r);return{c(){e=q("canvas"),s&&s.c(),V(e,"class","svelte-o3oskp")},m(o,a){Oe(o,e,a),s&&s.m(e,null),r[30](e),t=!0,n||(i=[oc(r[3].call(null,e)),Le(e,"click",r[9]),Le(e,"contextmenu",r[10]),Le(e,"pointerup",r[13]),Le(e,"pointerdown",r[11]),Le(e,"pointermove",r[12]),Le(e,"pointerenter",r[31]),Le(e,"pointerleave",r[32])],n=!0)},p(o,a){o[2]?s?(s.p(o,a),a[0]&4&&_e(s,1)):(s=zl(o),s.c(),_e(s,1),s.m(e,null)):s&&(Wn(),Se(s,1,1,()=>{s=null}),jn())},i(o){t||(_e(s),t=!0)},o(o){Se(s),t=!1},d(o){o&&Ne(e),s&&s.d(),r[30](null),n=!1,kt(i)}}}const kl=new Set;function U_(r,e,t){let n,i,s,o,{$$slots:a={},$$scope:l}=e,{dpr:c=As?window.devicePixelRatio:1}=e,{flat:u=!1}=e,{linear:f=!1}=e,{frameloop:h="demand"}=e,{debugFrameloop:p=!1}=e,{shadows:_=!0}=e,{shadowMapType:v=pc}=e,{size:m=void 0}=e,{rendererParameters:d=void 0}=e,g,x=!1;const M=Ye(m),{parentSize:y,parentSizeAction:w}=R_(),C=y_(f,u,c,M,y,p,h),{getCtx:T,renderCtx:b,disposalCtx:S}=C,{ctx:F,rootCtx:k,audioCtx:L}=C;S_(F),kl.add(F.invalidate),ut(()=>{kl.delete(F.invalidate)});const{size:O,scene:B}=F;Ee(r,O,N=>t(26,i=N));const{flat:J,linear:R,dpr:H}=k;Ee(r,J,N=>t(27,s=N)),Ee(r,R,N=>t(28,o=N)),Ee(r,H,N=>t(25,n=N)),pn("threlte-parent",Ye(B)),or(()=>{!g||(u_(F,g,d),Nl(F,o,s),Ol(F,i,n),Fl(F,_,v),t(2,x=!0))}),M_(F,k,b,S);const{onClick:Q,onContextMenu:K,onPointerDown:ve,onPointerMove:se,onPointerUp:j}=d_(F,k,b);ut(()=>{S.dispose(!0)});function te(N){Vn[N?"unshift":"push"](()=>{g=N,t(1,g)})}const ee=()=>T().pointerOverCanvas.set(!0),ce=()=>T().pointerOverCanvas.set(!1);return r.$$set=N=>{"dpr"in N&&t(14,c=N.dpr),"flat"in N&&t(15,u=N.flat),"linear"in N&&t(16,f=N.linear),"frameloop"in N&&t(17,h=N.frameloop),"debugFrameloop"in N&&t(18,p=N.debugFrameloop),"shadows"in N&&t(19,_=N.shadows),"shadowMapType"in N&&t(20,v=N.shadowMapType),"size"in N&&t(21,m=N.size),"rendererParameters"in N&&t(22,d=N.rendererParameters),"$$scope"in N&&t(33,l=N.$$scope)},r.$$.update=()=>{r.$$.dirty[0]&2097152&&M.set(m),r.$$.dirty[0]&65536&&Ie(R,o=f,o),r.$$.dirty[0]&32768&&Ie(J,s=u,s),r.$$.dirty[0]&16384&&Ie(H,n=c,n),r.$$.dirty[0]&402653184&&Nl(T(),o,s),r.$$.dirty[0]&100663296&&Ol(T(),i,n),r.$$.dirty[0]&1572864&&Fl(T(),_,v)},[F,g,x,w,T,O,J,R,H,Q,K,ve,se,j,c,u,f,h,p,_,v,m,d,k,L,n,i,s,o,a,te,ee,ce,l]}class N_ extends gt{constructor(e){super(),mt(this,e,U_,I_,ft,{dpr:14,flat:15,linear:16,frameloop:17,debugFrameloop:18,shadows:19,shadowMapType:20,size:21,rendererParameters:22,ctx:0,rootCtx:23,audioCtx:24},null,[-1,-1])}get ctx(){return this.$$.ctx[0]}get rootCtx(){return this.$$.ctx[23]}get audioCtx(){return this.$$.ctx[24]}}const Kc=()=>In("threlte-root"),O_=()=>In("threlte-disposal-context");function F_(r){let e;const t=r[9].default,n=xn(t,r,r[8],null);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,[s]){n&&n.p&&(!e||s&256)&&bn(n,t,i,i[8],e?Mn(t,i[8],s,null):Sn(i[8]),null)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}const Bl="threlte-disposable-object-context";function z_(r,e,t){var m;let n,i,{$$slots:s={},$$scope:o}=e;const{collectDisposableObjects:a,addDisposableObjects:l,removeDisposableObjects:c}=O_();let{object:u=void 0}=e,f=u,{dispose:h=void 0}=e;const p=In(Bl);Ee(r,p,d=>t(7,i=d));const _=Ye((m=h!=null?h:i)!=null?m:!0);Ee(r,_,d=>t(6,n=d)),pn(Bl,_);let v=n?a(u):[];return l(v),ut(()=>{c(v)}),r.$$set=d=>{"object"in d&&t(2,u=d.object),"dispose"in d&&t(3,h=d.dispose),"$$scope"in d&&t(8,o=d.$$scope)},r.$$.update=()=>{var d;r.$$.dirty&136&&_.set((d=h!=null?h:i)!=null?d:!0),r.$$.dirty&116&&u!==f&&(c(v),t(5,v=n?a(u):[]),l(v),t(4,f=u))},[p,_,u,h,f,v,n,i,o,s]}class Bo extends gt{constructor(e){super(),mt(this,e,z_,F_,ft,{object:2,dispose:3})}}function k_(r,e,t){let n,i,{object:s}=e;const o=Cs(s);Ee(r,o,c=>t(4,i=c));const a=In("threlte-layers");Ee(r,a,c=>t(3,n=c));const{invalidate:l}=Un();return r.$$set=c=>{"object"in c&&t(2,s=c.object)},r.$$.update=()=>{if(r.$$.dirty&4&&o.set(s),r.$$.dirty&24){if(n==="all")i.layers.enableAll();else if(n==="none")i.layers.disableAll();else if(Array.isArray(n))for(let c=0;c<32;c+=1){const u=c;n.includes(u)?i.layers.enable(c):i.layers.disable(c)}else n!==void 0&&i.layers.set(n);l("LayerableObject")}},[o,a,s,n,i]}class Jc extends gt{constructor(e){super(),mt(this,e,k_,null,ft,{object:2})}}const $c=(r,e)=>{var a;if(!As)return{start:()=>{},stop:()=>{},started:uc(!1)};const t=In("threlte-render-context"),n={fn:r,order:e==null?void 0:e.order,debugFrameloopMessage:e==null?void 0:e.debugFrameloopMessage},i=Ye(!1),s=()=>{t.frameHandlers.delete(n),i.set(!1)},o=()=>{t.frameHandlers.add(n),i.set(!0)};return((a=e==null?void 0:e.autostart)==null||a)&&o(),ut(()=>{s()}),{start:o,stop:s,started:{subscribe:i.subscribe}}},eu=()=>{const r=Ye(!1);return(async()=>{await Lr(),r.set(!0)})(),r};function B_(r,e,t){let n,i,{object:s}=e,{position:o=void 0}=e,{scale:a=void 0}=e,{rotation:l=void 0}=e,{lookAt:c=void 0}=e;const u=new I,f=_s(),{invalidate:h}=Un(),p=eu();Ee(r,p,x=>t(8,i=x));const _=async()=>{i||await Lr(),f("transform")},v=async()=>{h("TransformableObject: transformed"),await _()};Ln(s).onTransform=v;const{start:m,stop:d}=$c(async()=>{c&&!l&&c instanceof Et&&(c.getWorldPosition(u),s.lookAt(u),await _())},{autostart:!1,debugFrameloopMessage:"TransformableObject: tracking object"}),g=Cs(s);return Ee(r,g,x=>t(7,n=x)),r.$$set=x=>{"object"in x&&t(2,s=x.object),"position"in x&&t(3,o=x.position),"scale"in x&&t(4,a=x.scale),"rotation"in x&&t(5,l=x.rotation),"lookAt"in x&&t(6,c=x.lookAt)},r.$$.update=()=>{var x,M,y,w,C,T,b,S,F,k,L,O,B;r.$$.dirty&4&&g.set(s),r.$$.dirty&232&&(o&&(n.position.set((x=o.x)!=null?x:0,(M=o.y)!=null?M:0,(y=o.z)!=null?y:0),v()),c&&!l&&(c instanceof Et?m():(d(),n.lookAt((w=c.x)!=null?w:0,(C=c.y)!=null?C:0,(T=c.z)!=null?T:0),v())),c||d()),r.$$.dirty&144&&a&&(typeof a=="number"?n.scale.set(a,a,a):n.scale.set((b=a.x)!=null?b:1,(S=a.y)!=null?S:1,(F=a.z)!=null?F:1),v()),r.$$.dirty&160&&l&&(n.rotation.set((k=l.x)!=null?k:0,(L=l.y)!=null?L:0,(O=l.z)!=null?O:0,(B=l.order)!=null?B:"XYZ"),v())},[p,g,s,o,a,l,c,n]}class G_ extends gt{constructor(e){super(),mt(this,e,B_,null,ft,{object:2,position:3,scale:4,rotation:5,lookAt:6})}}function H_(r,e,t){let n,i,s,{object:o}=e,{viewportAware:a=!1}=e;const l=_s(),{camera:c,invalidate:u}=Un();Ee(r,c,w=>t(8,s=w));const f=new Uo,h=new vt,p=w=>w.type==="Mesh",_=new I,v=()=>s?(h.multiplyMatrices(s.projectionMatrix,s.matrixWorldInverse),f.setFromProjectionMatrix(h),p(o)?f.intersectsObject(o):(o.getWorldPosition(_),f.containsPoint(_))):!0,m=eu();Ee(r,m,w=>t(7,i=w));let{inViewport:d=v()}=e;const g=async w=>{w?(i||await Lr(),l("viewportenter",o)):(i||await Lr(),l("viewportleave",o))},{start:x,stop:M,started:y}=$c(()=>{const w=v();d===void 0?(t(3,d=v()),g(d)):w!==d&&(g(w),t(3,d=w))},{autostart:a,debugFrameloopMessage:"ViewportAwareObject: tracking viewport visibility"});return Ee(r,y,w=>t(6,n=w)),u("ViewportAwareObject"),r.$$set=w=>{"object"in w&&t(4,o=w.object),"viewportAware"in w&&t(5,a=w.viewportAware),"inViewport"in w&&t(3,d=w.inViewport)},r.$$.update=()=>{r.$$.dirty&96&&(a&&!n?x():!a&&n&&M())},[c,m,y,d,o,a,n]}class V_ extends gt{constructor(e){super(),mt(this,e,H_,null,ft,{object:4,viewportAware:5,inViewport:3})}}function W_(r){let e;const t=r[14].default,n=xn(t,r,r[18],null);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,s){n&&n.p&&(!e||s&262144)&&bn(n,t,i,i[18],e?Mn(t,i[18],s,null):Sn(i[18]),null)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}function j_(r){let e,t;return e=new ko({props:{object:r[1],$$slots:{default:[W_]},$$scope:{ctx:r}}}),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,i){const s={};i&2&&(s.object=n[1]),i&262144&&(s.$$scope={dirty:i,ctx:n}),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function X_(r){let e,t,n,i,s,o,a,l,c;e=new Jc({props:{object:r[1]}}),n=new G_({props:{object:r[1],position:r[2],rotation:r[4],scale:r[3],lookAt:r[5]}}),s=new Bo({props:{object:r[1],dispose:r[7],$$slots:{default:[j_]},$$scope:{ctx:r}}});function u(h){r[15](h)}let f={object:r[1],viewportAware:r[6]};return r[0]!==void 0&&(f.inViewport=r[0]),a=new V_({props:f}),Vn.push(()=>xs(a,"inViewport",u)),a.$on("viewportenter",r[16]),a.$on("viewportleave",r[17]),{c(){nt(e.$$.fragment),t=le(),nt(n.$$.fragment),i=le(),nt(s.$$.fragment),o=le(),nt(a.$$.fragment)},m(h,p){$e(e,h,p),Oe(h,t,p),$e(n,h,p),Oe(h,i,p),$e(s,h,p),Oe(h,o,p),$e(a,h,p),c=!0},p(h,[p]){const _={};p&2&&(_.object=h[1]),e.$set(_);const v={};p&2&&(v.object=h[1]),p&4&&(v.position=h[2]),p&16&&(v.rotation=h[4]),p&8&&(v.scale=h[3]),p&32&&(v.lookAt=h[5]),n.$set(v);const m={};p&2&&(m.object=h[1]),p&128&&(m.dispose=h[7]),p&262146&&(m.$$scope={dirty:p,ctx:h}),s.$set(m);const d={};p&2&&(d.object=h[1]),p&64&&(d.viewportAware=h[6]),!l&&p&1&&(l=!0,d.inViewport=h[0],vs(()=>l=!1)),a.$set(d)},i(h){c||(_e(e.$$.fragment,h),_e(n.$$.fragment,h),_e(s.$$.fragment,h),_e(a.$$.fragment,h),c=!0)},o(h){Se(e.$$.fragment,h),Se(n.$$.fragment,h),Se(s.$$.fragment,h),Se(a.$$.fragment,h),c=!1},d(h){et(e,h),h&&Ne(t),et(n,h),h&&Ne(i),et(s,h),h&&Ne(o),et(a,h)}}}function q_(r,e,t){let{$$slots:n={},$$scope:i}=e,{object:s}=e,{position:o=void 0}=e,{scale:a=void 0}=e,{rotation:l=void 0}=e,{lookAt:c=void 0}=e,{viewportAware:u=!1}=e,{inViewport:f=!1}=e,{castShadow:h=void 0}=e,{receiveShadow:p=void 0}=e,{frustumCulled:_=void 0}=e,{renderOrder:v=void 0}=e,{visible:m=void 0}=e,{dispose:d=void 0}=e,{userData:g=void 0}=e;const{invalidate:x}=Un(),M=()=>s;function y(T){f=T,t(0,f)}function w(T){$i.call(this,r,T)}function C(T){$i.call(this,r,T)}return r.$$set=T=>{"object"in T&&t(1,s=T.object),"position"in T&&t(2,o=T.position),"scale"in T&&t(3,a=T.scale),"rotation"in T&&t(4,l=T.rotation),"lookAt"in T&&t(5,c=T.lookAt),"viewportAware"in T&&t(6,u=T.viewportAware),"inViewport"in T&&t(0,f=T.inViewport),"castShadow"in T&&t(8,h=T.castShadow),"receiveShadow"in T&&t(9,p=T.receiveShadow),"frustumCulled"in T&&t(10,_=T.frustumCulled),"renderOrder"in T&&t(11,v=T.renderOrder),"visible"in T&&t(12,m=T.visible),"dispose"in T&&t(7,d=T.dispose),"userData"in T&&t(13,g=T.userData),"$$scope"in T&&t(18,i=T.$$scope)},r.$$.update=()=>{r.$$.dirty&16128&&(m!==void 0&&(M().visible=m),h!==void 0&&(M().castShadow=h),p!==void 0&&(M().receiveShadow=p),_!==void 0&&(M().frustumCulled=_),v!==void 0&&(M().renderOrder=v),g!==void 0&&(M().userData={...M().userData,...g}),x("Object3DInstance: props changed"))},[f,s,o,a,l,c,u,d,h,p,_,v,m,g,n,y,w,C,i]}class Y_ extends gt{constructor(e){super(),mt(this,e,q_,X_,ft,{object:1,position:2,scale:3,rotation:4,lookAt:5,viewportAware:6,inViewport:0,castShadow:8,receiveShadow:9,frustumCulled:10,renderOrder:11,visible:12,dispose:7,userData:13})}}function Z_(r){let e;const t=r[17].default,n=xn(t,r,r[21],null);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,s){n&&n.p&&(!e||s&2097152)&&bn(n,t,i,i[21],e?Mn(t,i[21],s,null):Sn(i[21]),null)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}function Q_(r){let e,t,n;function i(o){r[18](o)}let s={object:r[1],lookAt:r[5],castShadow:r[7],receiveShadow:r[8],frustumCulled:r[9],renderOrder:r[10],position:r[2],scale:r[3],rotation:r[4],viewportAware:r[6],visible:r[11],userData:r[12],dispose:r[13],$$slots:{default:[Z_]},$$scope:{ctx:r}};return r[0]!==void 0&&(s.inViewport=r[0]),e=new Y_({props:s}),Vn.push(()=>xs(e,"inViewport",i)),e.$on("viewportenter",r[19]),e.$on("viewportleave",r[20]),{c(){nt(e.$$.fragment)},m(o,a){$e(e,o,a),n=!0},p(o,[a]){const l={};a&2&&(l.object=o[1]),a&32&&(l.lookAt=o[5]),a&128&&(l.castShadow=o[7]),a&256&&(l.receiveShadow=o[8]),a&512&&(l.frustumCulled=o[9]),a&1024&&(l.renderOrder=o[10]),a&4&&(l.position=o[2]),a&8&&(l.scale=o[3]),a&16&&(l.rotation=o[4]),a&64&&(l.viewportAware=o[6]),a&2048&&(l.visible=o[11]),a&4096&&(l.userData=o[12]),a&8192&&(l.dispose=o[13]),a&2097152&&(l.$$scope={dirty:a,ctx:o}),!t&&a&1&&(t=!0,l.inViewport=o[0],vs(()=>t=!1)),e.$set(l)},i(o){n||(_e(e.$$.fragment,o),n=!0)},o(o){Se(e.$$.fragment,o),n=!1},d(o){et(e,o)}}}function K_(r,e,t){let n,{$$slots:i={},$$scope:s}=e,{camera:o}=e,{position:a=void 0}=e,{scale:l=void 0}=e,{rotation:c=void 0}=e,{lookAt:u=void 0}=e,{viewportAware:f=!1}=e,{inViewport:h=!1}=e,{castShadow:p=void 0}=e,{receiveShadow:_=void 0}=e,{frustumCulled:v=void 0}=e,{renderOrder:m=void 0}=e,{visible:d=void 0}=e,{userData:g=void 0}=e,{dispose:x=void 0}=e,{useCamera:M=!1}=e;const y=Cs(o);Ee(r,y,S=>t(16,n=S));const{setCamera:w}=Kc();function C(S){h=S,t(0,h)}function T(S){$i.call(this,r,S)}function b(S){$i.call(this,r,S)}return r.$$set=S=>{"camera"in S&&t(1,o=S.camera),"position"in S&&t(2,a=S.position),"scale"in S&&t(3,l=S.scale),"rotation"in S&&t(4,c=S.rotation),"lookAt"in S&&t(5,u=S.lookAt),"viewportAware"in S&&t(6,f=S.viewportAware),"inViewport"in S&&t(0,h=S.inViewport),"castShadow"in S&&t(7,p=S.castShadow),"receiveShadow"in S&&t(8,_=S.receiveShadow),"frustumCulled"in S&&t(9,v=S.frustumCulled),"renderOrder"in S&&t(10,m=S.renderOrder),"visible"in S&&t(11,d=S.visible),"userData"in S&&t(12,g=S.userData),"dispose"in S&&t(13,x=S.dispose),"useCamera"in S&&t(15,M=S.useCamera),"$$scope"in S&&t(21,s=S.$$scope)},r.$$.update=()=>{r.$$.dirty&2&&y.set(o),r.$$.dirty&98304&&M&&w(n)},[h,o,a,l,c,u,f,p,_,v,m,d,g,x,y,M,n,i,C,T,b,s]}class J_ extends gt{constructor(e){super(),mt(this,e,K_,Q_,ft,{camera:1,position:2,scale:3,rotation:4,lookAt:5,viewportAware:6,inViewport:0,castShadow:7,receiveShadow:8,frustumCulled:9,renderOrder:10,visible:11,userData:12,dispose:13,useCamera:15})}}function $_(r){let e;const t=r[20].default,n=xn(t,r,r[24],null);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,s){n&&n.p&&(!e||s&16777216)&&bn(n,t,i,i[24],e?Mn(t,i[24],s,null):Sn(i[24]),null)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}function e0(r){let e,t,n;function i(o){r[21](o)}let s={camera:r[0],position:r[2],scale:r[3],rotation:r[4],castShadow:r[6],receiveShadow:r[7],frustumCulled:r[8],renderOrder:r[9],visible:r[10],userData:r[11],dispose:r[12],viewportAware:r[13],lookAt:r[5],useCamera:r[14],$$slots:{default:[$_]},$$scope:{ctx:r}};return r[1]!==void 0&&(s.inViewport=r[1]),e=new J_({props:s}),Vn.push(()=>xs(e,"inViewport",i)),e.$on("viewportenter",r[22]),e.$on("viewportleave",r[23]),{c(){nt(e.$$.fragment)},m(o,a){$e(e,o,a),n=!0},p(o,[a]){const l={};a&1&&(l.camera=o[0]),a&4&&(l.position=o[2]),a&8&&(l.scale=o[3]),a&16&&(l.rotation=o[4]),a&64&&(l.castShadow=o[6]),a&128&&(l.receiveShadow=o[7]),a&256&&(l.frustumCulled=o[8]),a&512&&(l.renderOrder=o[9]),a&1024&&(l.visible=o[10]),a&2048&&(l.userData=o[11]),a&4096&&(l.dispose=o[12]),a&8192&&(l.viewportAware=o[13]),a&32&&(l.lookAt=o[5]),a&16384&&(l.useCamera=o[14]),a&16777216&&(l.$$scope={dirty:a,ctx:o}),!t&&a&2&&(t=!0,l.inViewport=o[1],vs(()=>t=!1)),e.$set(l)},i(o){n||(_e(e.$$.fragment,o),n=!0)},o(o){Se(e.$$.fragment,o),n=!1},d(o){et(e,o)}}}function t0(r,e,t){let n,{$$slots:i={},$$scope:s}=e,{position:o=void 0}=e,{scale:a=void 0}=e,{rotation:l=void 0}=e,{lookAt:c=void 0}=e,{castShadow:u=void 0}=e,{receiveShadow:f=void 0}=e,{frustumCulled:h=void 0}=e,{renderOrder:p=void 0}=e,{visible:_=void 0}=e,{userData:v=void 0}=e,{dispose:m=void 0}=e,{viewportAware:d=!1}=e,{inViewport:g=!1}=e,{useCamera:x=!0}=e,{near:M=void 0}=e,{far:y=void 0}=e,{fov:w=void 0}=e;const{size:C,invalidate:T}=Un();Ee(r,C,L=>t(19,n=L));const b=new sn(w,n.width/n.height,M,y);function S(L){g=L,t(1,g)}function F(L){$i.call(this,r,L)}function k(L){$i.call(this,r,L)}return r.$$set=L=>{"position"in L&&t(2,o=L.position),"scale"in L&&t(3,a=L.scale),"rotation"in L&&t(4,l=L.rotation),"lookAt"in L&&t(5,c=L.lookAt),"castShadow"in L&&t(6,u=L.castShadow),"receiveShadow"in L&&t(7,f=L.receiveShadow),"frustumCulled"in L&&t(8,h=L.frustumCulled),"renderOrder"in L&&t(9,p=L.renderOrder),"visible"in L&&t(10,_=L.visible),"userData"in L&&t(11,v=L.userData),"dispose"in L&&t(12,m=L.dispose),"viewportAware"in L&&t(13,d=L.viewportAware),"inViewport"in L&&t(1,g=L.inViewport),"useCamera"in L&&t(14,x=L.useCamera),"near"in L&&t(16,M=L.near),"far"in L&&t(17,y=L.far),"fov"in L&&t(18,w=L.fov),"$$scope"in L&&t(24,s=L.$$scope)},r.$$.update=()=>{r.$$.dirty&524289&&(t(0,b.aspect=n.width/n.height,b),b.updateProjectionMatrix(),T("PerspectiveCamera: aspect changed")),r.$$.dirty&458753&&(M!==void 0&&t(0,b.near=M,b),y!==void 0&&t(0,b.far=y,b),w!==void 0&&t(0,b.fov=w,b),b.updateProjectionMatrix(),T("PerspectiveCamera: props changed"))},[b,g,o,a,l,c,u,f,h,p,_,v,m,d,x,C,M,y,w,n,i,S,F,k,s]}class n0 extends gt{constructor(e){super(),mt(this,e,t0,e0,ft,{position:2,scale:3,rotation:4,lookAt:5,castShadow:6,receiveShadow:7,frustumCulled:8,renderOrder:9,visible:10,userData:11,dispose:12,viewportAware:13,inViewport:1,useCamera:14,near:16,far:17,fov:18,camera:0})}get camera(){return this.$$.ctx[0]}}const Gl=[],i0=(r,e)=>{const t=Gl.find(i=>i instanceof r);if(t)return t;const n=e();return Gl.push(n),n},hi=new Xc,Qt=new I,Jn=new I,dt=new jt,Hl={X:new I(1,0,0),Y:new I(0,1,0),Z:new I(0,0,1)},co={type:"change"},Vl={type:"mouseDown"},Wl={type:"mouseUp",mode:null},jl={type:"objectChange"};class r0 extends Et{constructor(e,t){super(),t===void 0&&(console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.'),t=document),this.isTransformControls=!0,this.visible=!1,this.domElement=t,this.domElement.style.touchAction="none";const n=new u0;this._gizmo=n,this.add(n);const i=new f0;this._plane=i,this.add(i);const s=this;function o(g,x){let M=x;Object.defineProperty(s,g,{get:function(){return M!==void 0?M:x},set:function(y){M!==y&&(M=y,i[g]=y,n[g]=y,s.dispatchEvent({type:g+"-changed",value:y}),s.dispatchEvent(co))}}),s[g]=x,i[g]=x,n[g]=x}o("camera",e),o("object",void 0),o("enabled",!0),o("axis",null),o("mode","translate"),o("translationSnap",null),o("rotationSnap",null),o("scaleSnap",null),o("space","world"),o("size",1),o("dragging",!1),o("showX",!0),o("showY",!0),o("showZ",!0);const a=new I,l=new I,c=new jt,u=new jt,f=new I,h=new jt,p=new I,_=new I,v=new I,m=0,d=new I;o("worldPosition",a),o("worldPositionStart",l),o("worldQuaternion",c),o("worldQuaternionStart",u),o("cameraPosition",f),o("cameraQuaternion",h),o("pointStart",p),o("pointEnd",_),o("rotationAxis",v),o("rotationAngle",m),o("eye",d),this._offset=new I,this._startNorm=new I,this._endNorm=new I,this._cameraScale=new I,this._parentPosition=new I,this._parentQuaternion=new jt,this._parentQuaternionInv=new jt,this._parentScale=new I,this._worldScaleStart=new I,this._worldQuaternionInv=new jt,this._worldScale=new I,this._positionStart=new I,this._quaternionStart=new jt,this._scaleStart=new I,this._getPointer=s0.bind(this),this._onPointerDown=a0.bind(this),this._onPointerHover=o0.bind(this),this._onPointerMove=l0.bind(this),this._onPointerUp=c0.bind(this),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp)}updateMatrixWorld(){this.object!==void 0&&(this.object.updateMatrixWorld(),this.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):this.object.parent.matrixWorld.decompose(this._parentPosition,this._parentQuaternion,this._parentScale),this.object.matrixWorld.decompose(this.worldPosition,this.worldQuaternion,this._worldScale),this._parentQuaternionInv.copy(this._parentQuaternion).invert(),this._worldQuaternionInv.copy(this.worldQuaternion).invert()),this.camera.updateMatrixWorld(),this.camera.matrixWorld.decompose(this.cameraPosition,this.cameraQuaternion,this._cameraScale),this.camera.isOrthographicCamera?this.camera.getWorldDirection(this.eye).negate():this.eye.copy(this.cameraPosition).sub(this.worldPosition).normalize(),super.updateMatrixWorld(this)}pointerHover(e){if(this.object===void 0||this.dragging===!0)return;hi.setFromCamera(e,this.camera);const t=uo(this._gizmo.picker[this.mode],hi);t?this.axis=t.object.name:this.axis=null}pointerDown(e){if(!(this.object===void 0||this.dragging===!0||e.button!==0)&&this.axis!==null){hi.setFromCamera(e,this.camera);const t=uo(this._plane,hi,!0);t&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(t.point).sub(this.worldPositionStart)),this.dragging=!0,Vl.mode=this.mode,this.dispatchEvent(Vl)}}pointerMove(e){const t=this.axis,n=this.mode,i=this.object;let s=this.space;if(n==="scale"?s="local":(t==="E"||t==="XYZE"||t==="XYZ")&&(s="world"),i===void 0||t===null||this.dragging===!1||e.button!==-1)return;hi.setFromCamera(e,this.camera);const o=uo(this._plane,hi,!0);if(!!o){if(this.pointEnd.copy(o.point).sub(this.worldPositionStart),n==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),s==="local"&&t!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),t.indexOf("X")===-1&&(this._offset.x=0),t.indexOf("Y")===-1&&(this._offset.y=0),t.indexOf("Z")===-1&&(this._offset.z=0),s==="local"&&t!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(s==="local"&&(i.position.applyQuaternion(dt.copy(this._quaternionStart).invert()),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),s==="world"&&(i.parent&&i.position.add(Qt.setFromMatrixPosition(i.parent.matrixWorld)),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(Qt.setFromMatrixPosition(i.parent.matrixWorld))));else if(n==="scale"){if(t.search("XYZ")!==-1){let a=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(a*=-1),Jn.set(a,a,a)}else Qt.copy(this.pointStart),Jn.copy(this.pointEnd),Qt.applyQuaternion(this._worldQuaternionInv),Jn.applyQuaternion(this._worldQuaternionInv),Jn.divide(Qt),t.search("X")===-1&&(Jn.x=1),t.search("Y")===-1&&(Jn.y=1),t.search("Z")===-1&&(Jn.z=1);i.scale.copy(this._scaleStart).multiply(Jn),this.scaleSnap&&(t.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(n==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const a=20/this.worldPosition.distanceTo(Qt.setFromMatrixPosition(this.camera.matrixWorld));t==="E"?(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1):t==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(Qt.copy(this.rotationAxis).cross(this.eye))*a):(t==="X"||t==="Y"||t==="Z")&&(this.rotationAxis.copy(Hl[t]),Qt.copy(Hl[t]),s==="local"&&Qt.applyQuaternion(this.worldQuaternion),this.rotationAngle=this._offset.dot(Qt.cross(this.eye).normalize())*a),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),s==="local"&&t!=="E"&&t!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(dt.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(dt.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(co),this.dispatchEvent(jl)}}pointerUp(e){e.button===0&&(this.dragging&&this.axis!==null&&(Wl.mode=this.mode,this.dispatchEvent(Wl)),this.dragging=!1,this.axis=null)}dispose(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerHover),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}attach(e){return this.object=e,this.visible=!0,this}detach(){return this.object=void 0,this.visible=!1,this.axis=null,this}reset(){!this.enabled||this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(co),this.dispatchEvent(jl),this.pointStart.copy(this.pointEnd))}getRaycaster(){return hi}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}}function s0(r){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:r.button};{const e=this.domElement.getBoundingClientRect();return{x:(r.clientX-e.left)/e.width*2-1,y:-(r.clientY-e.top)/e.height*2+1,button:r.button}}}function o0(r){if(!!this.enabled)switch(r.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(r));break}}function a0(r){!this.enabled||(document.pointerLockElement||this.domElement.setPointerCapture(r.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(r)),this.pointerDown(this._getPointer(r)))}function l0(r){!this.enabled||this.pointerMove(this._getPointer(r))}function c0(r){!this.enabled||(this.domElement.releasePointerCapture(r.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(r)))}function uo(r,e,t){const n=e.intersectObject(r,!0);for(let i=0;i.9&&(o.visible=!1)),this.axis==="Y"&&(dt.setFromEuler(os.set(0,0,Math.PI/2)),o.quaternion.copy(n).multiply(dt),Math.abs(it.copy(mi).applyQuaternion(n).dot(this.eye))>.9&&(o.visible=!1)),this.axis==="Z"&&(dt.setFromEuler(os.set(0,Math.PI/2,0)),o.quaternion.copy(n).multiply(dt),Math.abs(it.copy(yr).applyQuaternion(n).dot(this.eye))>.9&&(o.visible=!1)),this.axis==="XYZE"&&(dt.setFromEuler(os.set(0,Math.PI/2,0)),it.copy(this.rotationAxis),o.quaternion.setFromRotationMatrix(ql.lookAt(Xl,it,mi)),o.quaternion.multiply(dt),o.visible=this.dragging),this.axis==="E"&&(o.visible=!1)):o.name==="START"?(o.position.copy(this.worldPositionStart),o.visible=this.dragging):o.name==="END"?(o.position.copy(this.worldPosition),o.visible=this.dragging):o.name==="DELTA"?(o.position.copy(this.worldPositionStart),o.quaternion.copy(this.worldQuaternionStart),Qt.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),Qt.applyQuaternion(this.worldQuaternionStart.clone().invert()),o.scale.copy(Qt),o.visible=this.dragging):(o.quaternion.copy(n),this.dragging?o.position.copy(this.worldPositionStart):o.position.copy(this.worldPosition),this.axis&&(o.visible=this.axis.search(o.name)!==-1));continue}o.quaternion.copy(n),this.mode==="translate"||this.mode==="scale"?(o.name==="X"&&Math.abs(it.copy(Sr).applyQuaternion(n).dot(this.eye))>.99&&(o.scale.set(1e-10,1e-10,1e-10),o.visible=!1),o.name==="Y"&&Math.abs(it.copy(mi).applyQuaternion(n).dot(this.eye))>.99&&(o.scale.set(1e-10,1e-10,1e-10),o.visible=!1),o.name==="Z"&&Math.abs(it.copy(yr).applyQuaternion(n).dot(this.eye))>.99&&(o.scale.set(1e-10,1e-10,1e-10),o.visible=!1),o.name==="XY"&&Math.abs(it.copy(yr).applyQuaternion(n).dot(this.eye))<.2&&(o.scale.set(1e-10,1e-10,1e-10),o.visible=!1),o.name==="YZ"&&Math.abs(it.copy(Sr).applyQuaternion(n).dot(this.eye))<.2&&(o.scale.set(1e-10,1e-10,1e-10),o.visible=!1),o.name==="XZ"&&Math.abs(it.copy(mi).applyQuaternion(n).dot(this.eye))<.2&&(o.scale.set(1e-10,1e-10,1e-10),o.visible=!1)):this.mode==="rotate"&&(as.copy(n),it.copy(this.eye).applyQuaternion(dt.copy(n).invert()),o.name.search("E")!==-1&&o.quaternion.setFromRotationMatrix(ql.lookAt(this.eye,Xl,mi)),o.name==="X"&&(dt.setFromAxisAngle(Sr,Math.atan2(-it.y,it.z)),dt.multiplyQuaternions(as,dt),o.quaternion.copy(dt)),o.name==="Y"&&(dt.setFromAxisAngle(mi,Math.atan2(it.x,it.z)),dt.multiplyQuaternions(as,dt),o.quaternion.copy(dt)),o.name==="Z"&&(dt.setFromAxisAngle(yr,Math.atan2(it.y,it.x)),dt.multiplyQuaternions(as,dt),o.quaternion.copy(dt))),o.visible=o.visible&&(o.name.indexOf("X")===-1||this.showX),o.visible=o.visible&&(o.name.indexOf("Y")===-1||this.showY),o.visible=o.visible&&(o.name.indexOf("Z")===-1||this.showZ),o.visible=o.visible&&(o.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),o.material._color=o.material._color||o.material.color.clone(),o.material._opacity=o.material._opacity||o.material.opacity,o.material.color.copy(o.material._color),o.material.opacity=o.material._opacity,this.enabled&&this.axis&&(o.name===this.axis||this.axis.split("").some(function(l){return o.name===l}))&&(o.material.color.setHex(16776960),o.material.opacity=1)}super.updateMatrixWorld(e)}}class f0 extends pe{constructor(){super(new ws(1e5,1e5,2,2),new ys({visible:!1,wireframe:!0,side:Pn,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(e){let t=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(t="local"),ls.copy(Sr).applyQuaternion(t==="local"?this.worldQuaternion:ds),_r.copy(mi).applyQuaternion(t==="local"?this.worldQuaternion:ds),vr.copy(yr).applyQuaternion(t==="local"?this.worldQuaternion:ds),it.copy(_r),this.mode){case"translate":case"scale":switch(this.axis){case"X":it.copy(this.eye).cross(ls),wn.copy(ls).cross(it);break;case"Y":it.copy(this.eye).cross(_r),wn.copy(_r).cross(it);break;case"Z":it.copy(this.eye).cross(vr),wn.copy(vr).cross(it);break;case"XY":wn.copy(vr);break;case"YZ":wn.copy(ls);break;case"XZ":it.copy(vr),wn.copy(_r);break;case"XYZ":case"E":wn.set(0,0,0);break}break;case"rotate":default:wn.set(0,0,0)}wn.length()===0?this.quaternion.copy(this.cameraQuaternion):(Yl.lookAt(Qt.set(0,0,0),wn,it),this.quaternion.setFromRotationMatrix(Yl)),super.updateMatrixWorld(e)}}function h0(r){let e,t,n,i;return e=new Bo({props:{dispose:r[0],object:r[1]}}),n=new Jc({props:{object:r[1]}}),{c(){nt(e.$$.fragment),t=le(),nt(n.$$.fragment)},m(s,o){$e(e,s,o),Oe(s,t,o),$e(n,s,o),i=!0},p(s,[o]){const a={};o&1&&(a.dispose=s[0]),o&2&&(a.object=s[1]),e.$set(a);const l={};o&2&&(l.object=s[1]),n.$set(l)},i(s){i||(_e(e.$$.fragment,s),_e(n.$$.fragment,s),i=!0)},o(s){Se(e.$$.fragment,s),Se(n.$$.fragment,s),i=!1},d(s){et(e,s),s&&Ne(t),et(n,s)}}}function d0(r,e,t){let n,i,{autoPauseOrbitControls:s=!0}=e,{mode:o=void 0}=e,{axis:a=null}=e,{dragging:l=!1}=e,{enabled:c=void 0}=e,{translationSnap:u=void 0}=e,{scaleSnap:f=void 0}=e,{rotationSnap:h=void 0}=e,{showX:p=void 0}=e,{showY:_=void 0}=e,{showZ:v=void 0}=e,{size:m=void 0}=e,{space:d=void 0}=e,{dispose:g=void 0}=e;const{camera:x,renderer:M,invalidate:y,scene:w}=Un();Ee(r,x,R=>t(20,i=R));const C=Qc();if(Ee(r,C,R=>t(19,n=R)),!n)throw new Error("TransformControls: parent not defined. Is this component a child of ?");const T=_s(),b=()=>{if(!!i)return Ln(i).orbitControls};let S;const F=()=>{if(S!==void 0){const R=b();R&&(R.enabled=S),S=void 0}};ut(F);const k={change:R=>{var H,Q;n&&((Q=(H=Ln(n)).onTransform)==null||Q.call(H)),y("TransformControls: change event"),T("change",R)},"camera-changed":R=>T("camera-changed",R),"object-changed":R=>T("object-changed",R),"enabled-changed":R=>T("enabled-changed",R),"axis-changed":R=>{t(4,a=R.value),T("axis-changed",R)},"mode-changed":R=>T("mode-changed",R),"translationSnap-changed":R=>T("translationSnap-changed",R),"rotationSnap-changed":R=>T("rotationSnap-changed",R),"scaleSnap-changed":R=>T("scaleSnap-changed",R),"space-changed":R=>T("space-changed",R),"size-changed":R=>T("size-changed",R),"dragging-changed":R=>{t(5,l=R.value);e:if(s){const H=b();if(!H)break e;const Q=!R.value;if(H.enabled===Q)break e;R.value&&(S=H.enabled),H.enabled=Q}T("dragging-changed",R)},"showX-changed":R=>T("showX-changed",R),"showY-changed":R=>T("showY-changed",R),"showZ-changed":R=>T("showZ-changed",R),"worldPosition-changed":R=>T("worldPosition-changed",R),"worldPositionStart-changed":R=>T("worldPositionStart-changed",R),"worldQuaternion-changed":R=>T("worldQuaternion-changed",R),"worldQuaternionStart-changed":R=>T("worldQuaternionStart-changed",R),"cameraPosition-changed":R=>T("cameraPosition-changed",R),"cameraQuaternion-changed":R=>T("cameraQuaternion-changed",R),"pointStart-changed":R=>T("pointStart-changed",R),"pointEnd-changed":R=>T("pointEnd-changed",R),"rotationAxis-changed":R=>T("rotationAxis-changed",R),"rotationAngle-changed":R=>T("rotationAngle-changed",R),"eye-changed":R=>T("eye-changed",R),mouseDown:()=>T("mouseDown"),mouseUp:()=>T("mouseUp"),objectChange:()=>T("objectChange")};if(!M)throw new Error("TransformControls: renderer is undefined, is this component a child of ?");const L=new r0(i,M.domElement),O=()=>L.reset();L.attach(n);const B=()=>{Object.entries(k).forEach(([R,H])=>{L.addEventListener(R,H)})},J=()=>{Object.entries(k).forEach(([R,H])=>{L.removeEventListener(R,H)})};return B(),w.add(L),ut(()=>{L.detach(),w.remove(L),J()}),r.$$set=R=>{"autoPauseOrbitControls"in R&&t(6,s=R.autoPauseOrbitControls),"mode"in R&&t(7,o=R.mode),"axis"in R&&t(4,a=R.axis),"dragging"in R&&t(5,l=R.dragging),"enabled"in R&&t(8,c=R.enabled),"translationSnap"in R&&t(9,u=R.translationSnap),"scaleSnap"in R&&t(10,f=R.scaleSnap),"rotationSnap"in R&&t(11,h=R.rotationSnap),"showX"in R&&t(12,p=R.showX),"showY"in R&&t(13,_=R.showY),"showZ"in R&&t(14,v=R.showZ),"size"in R&&t(15,m=R.size),"space"in R&&t(16,d=R.space),"dispose"in R&&t(0,g=R.dispose)},r.$$.update=()=>{r.$$.dirty&64&&(s||F()),r.$$.dirty&256&&c!==void 0&&t(1,L.enabled=c,L),r.$$.dirty&4096&&p!==void 0&&t(1,L.showX=p,L),r.$$.dirty&8192&&_!==void 0&&t(1,L.showY=_,L),r.$$.dirty&16384&&v!==void 0&&t(1,L.showZ=v,L),r.$$.dirty&130&&o!==void 0&&L.setMode(o),r.$$.dirty&514&&u!==void 0&&L.setTranslationSnap(u),r.$$.dirty&1026&&f!==void 0&&L.setScaleSnap(f),r.$$.dirty&2050&&h!==void 0&&L.setRotationSnap(h),r.$$.dirty&32770&&m!==void 0&&L.setSize(m),r.$$.dirty&65538&&d!==void 0&&L.setSpace(d)},[g,L,x,C,a,l,s,o,c,u,f,h,p,_,v,m,d,O]}class p0 extends gt{constructor(e){super(),mt(this,e,d0,h0,ft,{autoPauseOrbitControls:6,mode:7,axis:4,dragging:5,enabled:8,translationSnap:9,scaleSnap:10,rotationSnap:11,showX:12,showY:13,showZ:14,size:15,space:16,dispose:0,reset:17})}get reset(){return this.$$.ctx[17]}}const tu=new Et;tu.scale.set(0,0,0);tu.matrix;new vt().fromArray(new Array(16).fill(0));new Je(16777215);const nu=(r,e)=>{if(e.includes(".")){const t=e.split("."),n=t.pop();for(let i=0;i{const{invalidate:r}=Un();let e=!1,t=fo,n,i,s;const o=(l,c,u)=>{if(a(),!u){const f=l;((f==null?void 0:f.isMaterial)||!1)&&(u="material"),((f==null?void 0:f.isBufferGeometry)||(f==null?void 0:f.isGeometry)||!1)&&(u="geometry")}if(!!u){if(typeof u=="function")n=u(c,l);else{const{target:f,key:h}=nu(c,u);t=f[h],f[h]=l,i=f,s=h}e=!0,r()}},a=()=>{!e||(n?(n(),n=void 0):i&&s&&t!==fo&&(i[s]=t,t=fo,i=void 0,s=void 0),e=!1,r())};return ut(()=>{a()}),{update:o}},g0=r=>r&&r.isCamera,iu=r=>r&&r.isOrthographicCamera,ru=r=>r&&r.isPerspectiveCamera,_0=r=>ru(r)||iu(r),v0=()=>{const{invalidate:r,size:e}=Un(),{setCamera:t}=Kc();let n,i;ut(()=>{i==null||i()});const s=l=>{!n||(iu(n)?(n.left=l.width/-2,n.right=l.width/2,n.top=l.height/2,n.bottom=l.height/-2,n.updateProjectionMatrix(),n.updateMatrixWorld(),r()):ru(n)&&(n.aspect=l.width/l.height,n.updateProjectionMatrix(),n.updateMatrixWorld(),r()))};return{update:(l,c)=>{if(i==null||i(),c||!_0(l)){n=void 0;return}n=l,i=e.subscribe(s)},makeDefaultCamera:(l,c)=>{!g0(l)||!c||(t(l),r())}}},Zl=r=>!!(r!=null&&r.addEventListener),x0=()=>{const r=_s(),e=sr(),t=h=>{h!=null&&h.type&&r(h.type,h)},n=(h,p)=>{Zl(h)&&p.forEach(_=>{h.removeEventListener(_,t)})},i=(h,p)=>{Zl(h)&&p.forEach(_=>{h.addEventListener(_,t)})};let s=[],o;const a=Ye([]),l=a.subscribe(h=>{n(o,s),i(o,h),s=h});ut(l);const c=Ye(),u=c.subscribe(h=>{n(o,s),i(h,s),o=h});return ut(u),ut(()=>{n(o,s)}),or(()=>{a.set(Object.keys(e.$$.callbacks))}),{updateRef:h=>{c.set(h)}}},M0=["$$scope","$$slots","type","args","attach","instance"],b0=["fov","aspect","near","far","left","right","top","bottom","zoom"],S0=r=>typeof r=="string"||typeof r=="number"||typeof r=="boolean"||typeof r=="undefined"||r===null,y0=()=>{const{invalidate:r}=Un(),e=new Map,t=(i,s,o,a)=>{var u,f;if(S0(o)){const h=e.get(s);if(h&&h.instance===i&&h.value===o)return;e.set(s,{instance:i,value:o})}const{key:l,target:c}=nu(i,s);if(!Array.isArray(o)&&typeof o=="number"&&typeof((u=c[l])==null?void 0:u.setScalar)=="function")c[l].setScalar(o);else if(typeof((f=c[l])==null?void 0:f.set)=="function")Array.isArray(o)?c[l].set(...o):c[l].set(o);else{if(c[l]=o,a.manualCamera)return;b0.includes(l)&&(c.isPerspectiveCamera||c.isOrthographicCamera)&&c.updateProjectionMatrix()}};return{updateProps:(i,s,o)=>{for(const a in s)M0.includes(a)||t(i,a,s[a],o),r()}}},w0=r=>({ref:r&1}),Ql=r=>({ref:r[0]}),E0=r=>({ref:r&1}),Kl=r=>({ref:r[0]});function Jl(r){let e,t;return e=new Bo({props:{object:r[0],dispose:r[1]}}),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,i){const s={};i&1&&(s.object=n[0]),i&2&&(s.dispose=n[1]),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function T0(r){let e;const t=r[12].default,n=xn(t,r,r[13],Ql);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,s){n&&n.p&&(!e||s&8193)&&bn(n,t,i,i[13],e?Mn(t,i[13],s,w0):Sn(i[13]),Ql)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}function A0(r){let e,t;return e=new ko({props:{object:r[0],$$slots:{default:[C0]},$$scope:{ctx:r}}}),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,i){const s={};i&1&&(s.object=n[0]),i&8193&&(s.$$scope={dirty:i,ctx:n}),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function C0(r){let e;const t=r[12].default,n=xn(t,r,r[13],Kl);return{c(){n&&n.c()},m(i,s){n&&n.m(i,s),e=!0},p(i,s){n&&n.p&&(!e||s&8193)&&bn(n,t,i,i[13],e?Mn(t,i[13],s,E0):Sn(i[13]),Kl)},i(i){e||(_e(n,i),e=!0)},o(i){Se(n,i),e=!1},d(i){n&&n.d(i)}}}function P0(r){let e=r[4](r[0]),t,n,i,s,o,a,l=e&&Jl(r);const c=[A0,T0],u=[];function f(h,p){return p&1&&(n=null),n==null&&(n=!!h[3](h[0])),n?0:1}return i=f(r,-1),s=u[i]=c[i](r),{c(){l&&l.c(),t=le(),s.c(),o=ri()},m(h,p){l&&l.m(h,p),Oe(h,t,p),u[i].m(h,p),Oe(h,o,p),a=!0},p(h,[p]){p&1&&(e=h[4](h[0])),e?l?(l.p(h,p),p&1&&_e(l,1)):(l=Jl(h),l.c(),_e(l,1),l.m(t.parentNode,t)):l&&(Wn(),Se(l,1,1,()=>{l=null}),jn());let _=i;i=f(h,p),i===_?u[i].p(h,p):(Wn(),Se(u[_],1,1,()=>{u[_]=null}),jn(),s=u[i],s?s.p(h,p):(s=u[i]=c[i](h),s.c()),_e(s,1),s.m(o.parentNode,o))},i(h){a||(_e(l),_e(s),a=!0)},o(h){Se(l),Se(s),a=!1},d(h){l&&l.d(h),h&&Ne(t),u[i].d(h),h&&Ne(o)}}}function L0(r,e,t){const n=["type","args","attach","manual","makeDefault","dispose","ref"];let i=Wo(e,n),s,{$$slots:o={},$$scope:a}=e,{type:l}=e,{args:c=void 0}=e,{attach:u=void 0}=e,{manual:f=void 0}=e,{makeDefault:h=void 0}=e,{dispose:p=void 0}=e;const _=In("threlte-hierarchical-parent-context");Ee(r,_,S=>t(11,s=S));const v=S=>typeof S=="function"&&/^\s*class\s+/.test(S.toString()),m=S=>Array.isArray(S);let{ref:d=v(l)&&m(c)?new l(...c):v(l)?new l:l}=e,g=!1;const x=Ye(d);pn("threlte-hierarchical-parent-context",x);const M=y0(),y=v0(),w=m0(),C=x0(),T=S=>!!S.isObject3D,b=S=>S.dispose!==void 0;return r.$$set=S=>{e=ho(ho({},e),lu(S)),t(21,i=Wo(e,n)),"type"in S&&t(5,l=S.type),"args"in S&&t(6,c=S.args),"attach"in S&&t(7,u=S.attach),"manual"in S&&t(8,f=S.manual),"makeDefault"in S&&t(9,h=S.makeDefault),"dispose"in S&&t(1,p=S.dispose),"ref"in S&&t(0,d=S.ref),"$$scope"in S&&t(13,a=S.$$scope)},r.$$.update=()=>{r.$$.dirty&1120&&(g?t(0,d=v(l)&&m(c)?new l(...c):v(l)?new l:l):t(10,g=!0)),r.$$.dirty&1&&x.set(d),M.updateProps(d,i,{manualCamera:f}),r.$$.dirty&257&&y.update(d,f),r.$$.dirty&513&&y.makeDefaultCamera(d,h),r.$$.dirty&2177&&w.update(d,s,u),r.$$.dirty&1&&C.updateRef(d)},[d,p,_,T,b,l,c,u,f,h,g,s,o,a]}class R0 extends gt{constructor(e){super(),mt(this,e,L0,P0,ft,{type:5,args:6,attach:7,manual:8,makeDefault:9,dispose:1,ref:0})}}function D0(r){return console.error("The component can only be used in conjunction with the custom preprocessor."),[]}class $l extends gt{constructor(e){super(),mt(this,e,D0,null,ft,{})}}new Proxy($l,{get(r,e){return r[e]||$l}});i0(fl,()=>new fl(Vc));function ec(r){let e,t,n,i,s,o=r[4]=="translate"?"roter":"ryk",a,l,c,u,f,h,p,_,v,m,d,g,x,M,y,w=r[2].x.toFixed(2)+"",C,T,b,S,F,k,L=-r[2].z.toFixed(2)+"",O,B,J,R,H,Q,K=r[2].y.toFixed(2)+"",ve,se,j,te,ee,ce,N,Re,Ce,oe,Te,je,ye,Ue,lt,xt,Mt,_t,Xe=Kt.radToDeg(r[3].x).toFixed(2)+"",ot,It,P,E,Y,ne,re=Kt.radToDeg(r[3].y).toFixed(2)+"",fe,Pe,de,$,xe,we,Ae=Kt.radToDeg(r[3].z).toFixed(2)+"",ge,Me,Fe,Ze,ct,U,W,ie,he,be,Ke,He,Tt,Yt,ht,Lt,Bt,Nn,si,Fr,fr,On,A,z,Z,G,X=r[12]==null&&tc(r);return On=new N_({props:{$$slots:{default:[U0]},$$scope:{ctx:r}}}),{c(){e=q("div"),t=q("div"),n=q("div"),i=q("button"),s=rt("Skift til "),a=rt(o),l=le(),c=q("div"),u=q("button"),u.textContent="Nulstil rotering",f=le(),h=q("button"),h.textContent="Nulstil position",p=le(),_=q("div"),v=q("p"),v.textContent="Placerings Snap",m=le(),d=q("div"),g=q("div"),x=q("p"),x.textContent="x",M=le(),y=q("p"),C=rt(w),T=le(),b=q("div"),S=q("p"),S.textContent="y",F=le(),k=q("p"),O=rt(L),B=le(),J=q("div"),R=q("p"),R.textContent="z",H=le(),Q=q("p"),ve=rt(K),se=le(),j=q("div"),te=q("div"),ee=rt(r[5]),ce=le(),N=q("input"),Re=le(),Ce=q("button"),Ce.textContent="Placer på gulv",oe=le(),Te=q("div"),je=q("p"),je.textContent="Rotations Snap",ye=le(),Ue=q("div"),lt=q("div"),xt=q("p"),xt.textContent="x",Mt=le(),_t=q("p"),ot=rt(Xe),It=le(),P=q("div"),E=q("p"),E.textContent="y",Y=le(),ne=q("p"),fe=rt(re),Pe=le(),de=q("div"),$=q("p"),$.textContent="z",xe=le(),we=q("p"),ge=rt(Ae),Me=le(),Fe=q("div"),Ze=q("div"),ct=rt(r[6]),U=le(),W=q("input"),ie=le(),he=q("p"),he.textContent="Objekt Alpha",be=le(),Ke=q("div"),He=q("input"),Tt=le(),Yt=q("button"),Yt.textContent="Stop placering",ht=le(),Lt=q("button"),Bt=q("i"),Fr=le(),X&&X.c(),fr=le(),nt(On.$$.fragment),V(i,"class","bg-[color:var(--color-secondary)] text-white p-[1rem] w-full"),V(u,"class","bg-[color:var(--color-secondary)] text-white p-[0.5rem] w-full whitespace-nowrap"),V(h,"class","bg-[color:var(--color-secondary)] text-white p-[1rem] w-full"),V(c,"class","flex flex-row gap-[1rem]"),V(v,"class","h-fit"),V(g,"class","bg-[color:var(--color-secondary)] relative flex flex-col w-[8rem] px-[0.1rem]"),V(b,"class","bg-[color:var(--color-secondary)] relative flex flex-col w-[8rem] px-[0.1rem]"),V(J,"class","bg-[color:var(--color-secondary)] relative flex flex-col w-[8rem] px-[0.1rem]"),V(d,"class","flex flex-row gap-[1rem] text-center"),V(_,"class","flex flex-col items-center"),V(te,"class","w-[5rem] h-[3rem] items-center flex justify-center bg-[color:var(--color-secondary)]"),V(N,"id","slider"),V(N,"type","range"),V(N,"min","0.01"),V(N,"max","1"),V(N,"step","0.01"),V(N,"class","w-full"),V(j,"class","flex flex-row gap-[1rem] items-center"),V(Ce,"class","bg-[color:var(--color-secondary)] text-white p-[1rem] w-full"),V(je,"class","h-fit"),V(lt,"class","bg-[color:var(--color-secondary)] relative flex flex-col w-[8rem] px-[0.1rem]"),V(P,"class","bg-[color:var(--color-secondary)] relative flex flex-col w-[8rem] px-[0.1rem]"),V(de,"class","bg-[color:var(--color-secondary)] relative flex flex-col w-[8rem] px-[0.1rem]"),V(Ue,"class","flex flex-row gap-[1rem] text-center"),V(Te,"class","flex flex-col items-center "),V(Ze,"class","w-[5rem] h-[3rem] items-center flex justify-center bg-[color:var(--color-secondary)]"),V(W,"id","slider"),V(W,"type","range"),V(W,"min","1"),V(W,"max","90"),V(W,"step","1"),V(W,"class","w-full"),V(Fe,"class","flex flex-row gap-[1rem] items-center"),V(he,"class",""),V(He,"id","slider"),V(He,"type","range"),V(He,"min","1"),V(He,"max","255"),V(He,"step","10"),V(He,"class","w-full"),V(Ke,"class","flex flex-row gap-[1rem] items-center"),V(Yt,"class","bg-[color:var(--color-secondary)] text-white p-[1rem] w-full"),V(n,"class","flex flex-col gap-[1rem] p-[2rem]"),V(Bt,"class",Nn="fas text-[2rem] fa-chevron-"+(r[7]?"left":"right")),V(Lt,"class","h-full absolute -right-[4rem] w-[4rem] grid place-items-center bg-[color:var(--color-secondary)]"),V(t,"class",si="w-fit text-[1.5rem] bg-[color:var(--color-primary)] top-[4rem] origin-top absolute "+(r[7]?"left-[1.5rem]":"-left-[30rem]")+" flex flex-row gap-[1rem] items-center justify-between"),V(e,"class",A="modeler z-[0] absolute h-screen w-screen "+(r[9]?"bg-gray-800":""))},m(ae,me){Oe(ae,e,me),D(e,t),D(t,n),D(n,i),D(i,s),D(i,a),D(n,l),D(n,c),D(c,u),D(c,f),D(c,h),D(n,p),D(n,_),D(_,v),D(_,m),D(_,d),D(d,g),D(g,x),D(g,M),D(g,y),D(y,C),D(d,T),D(d,b),D(b,S),D(b,F),D(b,k),D(k,O),D(d,B),D(d,J),D(J,R),D(J,H),D(J,Q),D(Q,ve),D(n,se),D(n,j),D(j,te),D(te,ee),D(j,ce),D(j,N),Tn(N,r[5]),D(n,Re),D(n,Ce),D(n,oe),D(n,Te),D(Te,je),D(Te,ye),D(Te,Ue),D(Ue,lt),D(lt,xt),D(lt,Mt),D(lt,_t),D(_t,ot),D(Ue,It),D(Ue,P),D(P,E),D(P,Y),D(P,ne),D(ne,fe),D(Ue,Pe),D(Ue,de),D(de,$),D(de,xe),D(de,we),D(we,ge),D(n,Me),D(n,Fe),D(Fe,Ze),D(Ze,ct),D(Fe,U),D(Fe,W),Tn(W,r[6]),D(n,ie),D(n,he),D(n,be),D(n,Ke),D(Ke,He),Tn(He,r[1]),D(n,Tt),D(n,Yt),D(t,ht),D(t,Lt),D(Lt,Bt),D(e,Fr),X&&X.m(e,null),D(e,fr),$e(On,e,null),z=!0,Z||(G=[Le(i,"click",r[22]),Le(u,"click",r[23]),Le(h,"click",r[24]),Le(N,"change",r[25]),Le(N,"input",r[25]),Le(Ce,"click",r[26]),Le(W,"change",r[27]),Le(W,"input",r[27]),Le(He,"change",r[28]),Le(He,"input",r[28]),Le(Yt,"click",r[29]),Le(Lt,"click",r[30])],Z=!0)},p(ae,me){(!z||me[0]&16)&&o!==(o=ae[4]=="translate"?"roter":"ryk")&&At(a,o),(!z||me[0]&4)&&w!==(w=ae[2].x.toFixed(2)+"")&&At(C,w),(!z||me[0]&4)&&L!==(L=-ae[2].z.toFixed(2)+"")&&At(O,L),(!z||me[0]&4)&&K!==(K=ae[2].y.toFixed(2)+"")&&At(ve,K),(!z||me[0]&32)&&At(ee,ae[5]),me[0]&32&&Tn(N,ae[5]),(!z||me[0]&8)&&Xe!==(Xe=Kt.radToDeg(ae[3].x).toFixed(2)+"")&&At(ot,Xe),(!z||me[0]&8)&&re!==(re=Kt.radToDeg(ae[3].y).toFixed(2)+"")&&At(fe,re),(!z||me[0]&8)&&Ae!==(Ae=Kt.radToDeg(ae[3].z).toFixed(2)+"")&&At(ge,Ae),(!z||me[0]&64)&&At(ct,ae[6]),me[0]&64&&Tn(W,ae[6]),me[0]&2&&Tn(He,ae[1]),(!z||me[0]&128&&Nn!==(Nn="fas text-[2rem] fa-chevron-"+(ae[7]?"left":"right")))&&V(Bt,"class",Nn),(!z||me[0]&128&&si!==(si="w-fit text-[1.5rem] bg-[color:var(--color-primary)] top-[4rem] origin-top absolute "+(ae[7]?"left-[1.5rem]":"-left-[30rem]")+" flex flex-row gap-[1rem] items-center justify-between"))&&V(t,"class",si),ae[12]==null?X?X.p(ae,me):(X=tc(ae),X.c(),X.m(e,fr)):X&&(X.d(1),X=null);const De={};me[0]&29821|me[1]&128&&(De.$$scope={dirty:me,ctx:ae}),On.$set(De),(!z||me[0]&512&&A!==(A="modeler z-[0] absolute h-screen w-screen "+(ae[9]?"bg-gray-800":"")))&&V(e,"class",A)},i(ae){z||(_e(On.$$.fragment,ae),z=!0)},o(ae){Se(On.$$.fragment,ae),z=!1},d(ae){ae&&Ne(e),X&&X.d(),et(On),Z=!1,kt(G)}}}function tc(r){let e,t,n;return{c(){e=q("button"),e.innerHTML=` +

Tilføj

`,V(e,"class","absolute text-[2rem] hover:brightness-110 top-1/2 -translate-y-1/2 right-[1rem] w-fit gap-[1rem] px-8 py-4 h-fit bg-[color:var(--color-secondary)] flex flex-row items-center justify-between")},m(i,s){Oe(i,e,s),t||(n=Le(e,"click",r[31]),t=!0)},p:St,d(i){i&&Ne(e),t=!1,n()}}}function I0(r){let e,t;return e=new p0({props:{mode:r[4],translationSnap:r[5],rotationSnap:Kt.degToRad(r[6]),size:.5,space:"local"}}),e.$on("objectChange",r[32]),e.$on("dragging-changed",r[33]),{c(){nt(e.$$.fragment)},m(n,i){$e(e,n,i),t=!0},p(n,i){const s={};i[0]&16&&(s.mode=n[4]),i[0]&32&&(s.translationSnap=n[5]),i[0]&64&&(s.rotationSnap=Kt.degToRad(n[6])),e.$set(s)},i(n){t||(_e(e.$$.fragment,n),t=!0)},o(n){Se(e.$$.fragment,n),t=!1},d(n){et(e,n)}}}function U0(r){let e,t,n,i,s;e=new n0({props:{position:r[14],lookAt:r[10],fov:45}});function o(l){r[34](l)}let a={type:pe,"position.x":r[2].x,"position.y":r[2].y,"position.z":r[2].z,quaternion:5,geometry:new bt(0,0,0),material:new Eg,"rotation.x":r[3].x,"rotation.y":r[3].y,"rotation.z":r[3].z,$$slots:{default:[I0]},$$scope:{ctx:r}};return r[0]!==void 0&&(a.ref=r[0]),n=new R0({props:a}),Vn.push(()=>xs(n,"ref",o)),{c(){nt(e.$$.fragment),t=le(),nt(n.$$.fragment)},m(l,c){$e(e,l,c),Oe(l,t,c),$e(n,l,c),s=!0},p(l,c){const u={};c[0]&16384&&(u.position=l[14]),c[0]&1024&&(u.lookAt=l[10]),e.$set(u);const f={};c[0]&4&&(f["position.x"]=l[2].x),c[0]&4&&(f["position.y"]=l[2].y),c[0]&4&&(f["position.z"]=l[2].z),c[0]&8&&(f["rotation.x"]=l[3].x),c[0]&8&&(f["rotation.y"]=l[3].y),c[0]&8&&(f["rotation.z"]=l[3].z),c[0]&12412|c[1]&128&&(f.$$scope={dirty:c,ctx:l}),!i&&c[0]&1&&(i=!0,f.ref=l[0],vs(()=>i=!1)),n.$set(f)},i(l){s||(_e(e.$$.fragment,l),_e(n.$$.fragment,l),s=!0)},o(l){Se(e.$$.fragment,l),Se(n.$$.fragment,l),s=!1},d(l){et(e,l),l&&Ne(t),et(n,l)}}}function N0(r){let e,t,n=r[8]&&ec(r);return{c(){n&&n.c(),e=ri()},m(i,s){n&&n.m(i,s),Oe(i,e,s),t=!0},p(i,s){i[8]?n?(n.p(i,s),s[0]&256&&_e(n,1)):(n=ec(i),n.c(),_e(n,1),n.m(e.parentNode,e)):n&&(Wn(),Se(n,1,1,()=>{n=null}),jn())},i(i){t||(_e(n),t=!0)},o(i){Se(n),t=!1},d(i){n&&n.d(i),i&&Ne(e)}}}function O0(r,e,t){let n,i,s,o,a,l,c,u,f;Ee(r,Ms,ee=>t(9,o=ee)),Ee(r,vn,ee=>t(11,l=ee)),Ee(r,Cn,ee=>t(13,u=ee));const{show:h,cameraPosition:p,cameraLookAt:_,objectPosition:v,objectEuler:m,entity:d}=_n;Ee(r,h,ee=>t(8,s=ee)),Ee(r,p,ee=>t(14,f=ee)),Ee(r,_,ee=>t(10,a=ee)),Ee(r,v,ee=>t(2,n=ee)),Ee(r,m,ee=>t(3,i=ee)),Ee(r,d,ee=>t(12,c=ee));let g,x="translate",M=.01,y=1,w=!1,C=200;an("setObjectAlpha",ee=>{t(1,C=ee)});function T(ee){ee.button==2&&(x=="translate"?t(4,x="rotate"):t(4,x="translate"))}or(()=>{document.addEventListener("contextmenu",T)}),ut(()=>{document.removeEventListener("contextmenu",T)});function b(ee){return ee.x!=n.x||ee.y!=n.y||ee.z!=n.z}function S(ee){return ee.x!=i.x||ee.y!=i.y||ee.z!=i.z}function F(){g&&(b(g.position)&&(Ie(v,n.x=g.position.x,n),Ie(v,n.y=g.position.y,n),Ie(v,n.z=g.position.z,n),_n.sendMovementUpdate(fs(n))),S(g.rotation)&&(Ie(m,i.x=g.rotation.x,i),Ie(m,i.y=g.rotation.y,i),Ie(m,i.z=g.rotation.z,i),_n.sendRotationUpdate(i)))}const k=()=>{x=="translate"?t(4,x="rotate"):t(4,x="translate")},L=()=>{g.rotation.set(0,0,0,i.order),F()},O=()=>{g.position.set(a.x,a.y,a.z),F()};function B(){M=cs(this.value),t(5,M)}const J=()=>{st("placeOnGround").then(ee=>{const ce=Vi(ee);g.position.set(ce.x,ce.y,ce.z),F()})};function R(){y=cs(this.value),t(6,y)}function H(){C=cs(this.value),t(1,C)}const Q=()=>{st("stopPlacement"),_n.show.set(!1),Ie(vn,l=null,l)},K=()=>{t(7,w=!w)},ve=()=>{if(l.max){const ee=u.filter(N=>N.object===l.object);let ce=l.max;if(ee.length>=ce){st("showNotification",{type:"error",message:`Du kan kun have ${ce} af denne ting!`});return}}st("addToCart",l),Ie(vn,l=null,l)},se=ee=>{F()},j=ee=>{if(!ee.detail.value&&c!=null){const N=u.find(oe=>oe.entity===c);if(N===void 0)return;const Re=fs(n);N.position=Re;const Ce=fs(i);N.rotation=Ce,Ie(Cn,u=[...u],u),st("updateCartItem",N)}};function te(ee){g=ee,t(0,g)}return r.$$.update=()=>{r.$$.dirty[0]&2&&st("setObjectAlpha",{alpha:C}),r.$$.dirty[0]&13&&g&&(g.rotation.set(i.x,i.y,i.z,i.order),g.position.set(n.x,n.y,n.z))},[g,C,n,i,x,M,y,w,s,o,a,l,c,u,f,h,p,_,v,m,d,F,k,L,O,B,J,R,H,Q,K,ve,se,j,te]}class F0 extends gt{constructor(e){super(),mt(this,e,O0,N0,ft,{},null,[-1,-1])}}function nc(r){let e,t,n,i;return e=new i_({}),n=new F0({}),{c(){nt(e.$$.fragment),t=le(),nt(n.$$.fragment)},m(s,o){$e(e,s,o),Oe(s,t,o),$e(n,s,o),i=!0},i(s){i||(_e(e.$$.fragment,s),_e(n.$$.fragment,s),i=!0)},o(s){Se(e.$$.fragment,s),Se(n.$$.fragment,s),i=!1},d(s){et(e,s),s&&Ne(t),et(n,s)}}}function z0(r){let e,t,n=r[0]&&nc();return{c(){n&&n.c(),e=ri()},m(i,s){n&&n.m(i,s),Oe(i,e,s),t=!0},p(i,s){i[0]?n?s&1&&_e(n,1):(n=nc(),n.c(),_e(n,1),n.m(e.parentNode,e)):n&&(Wn(),Se(n,1,1,()=>{n=null}),jn())},i(i){t||(_e(n),t=!0)},o(i){Se(n),t=!1},d(i){n&&n.d(i),i&&Ne(e)}}}function ic(r){let e,t,n,i;return e=new kg({}),{c(){nt(e.$$.fragment),t=le(),n=q("body"),V(n,"class","bg-neutral-700")},m(s,o){$e(e,s,o),Oe(s,t,o),Oe(s,n,o),i=!0},i(s){i||(_e(e.$$.fragment,s),i=!0)},o(s){Se(e.$$.fragment,s),i=!1},d(s){et(e,s),s&&Ne(t),s&&Ne(n)}}}function k0(r){let e,t,n,i,s,o;e=new Ng({props:{$$slots:{default:[z0]},$$scope:{ctx:r}}}),n=new jg({});let a=r[1]&&ic();return{c(){nt(e.$$.fragment),t=le(),nt(n.$$.fragment),i=le(),a&&a.c(),s=ri()},m(l,c){$e(e,l,c),Oe(l,t,c),$e(n,l,c),Oe(l,i,c),a&&a.m(l,c),Oe(l,s,c),o=!0},p(l,[c]){const u={};c&17&&(u.$$scope={dirty:c,ctx:l}),e.$set(u),l[1]?a?c&2&&_e(a,1):(a=ic(),a.c(),_e(a,1),a.m(s.parentNode,s)):a&&(Wn(),Se(a,1,1,()=>{a=null}),jn())},i(l){o||(_e(e.$$.fragment,l),_e(n.$$.fragment,l),_e(a),o=!0)},o(l){Se(e.$$.fragment,l),Se(n.$$.fragment,l),Se(a),o=!1},d(l){et(e,l),l&&Ne(t),et(n,l),l&&Ne(i),a&&a.d(l),l&&Ne(s)}}}function B0(r,e,t){let n,i,s;return Ee(r,_o,o=>t(2,n=o)),Ee(r,ms,o=>t(0,i=o)),Ee(r,Ms,o=>t(1,s=o)),Ie(_o,n="ps-housing",n),[i,s]}class G0 extends gt{constructor(e){super(),mt(this,e,B0,k0,ft,{})}}new G0({target:document.getElementById("app")}); diff --git a/resources/[ps]/ps-housing/properties.sql b/resources/[ps]/ps-housing/properties.sql new file mode 100644 index 0000000..72ae4b8 --- /dev/null +++ b/resources/[ps]/ps-housing/properties.sql @@ -0,0 +1,21 @@ +DROP table IF EXISTS `properties`; + +CREATE TABLE IF NOT EXISTS `properties` ( + `property_id` int(11) NOT NULL AUTO_INCREMENT, + `owner_citizenid` varchar(50) NULL, + `street` VARCHAR(100) NULL, + `region` VARCHAR(100) NULL, + `description` LONGTEXT NULL, + `has_access` JSON NULL DEFAULT (JSON_ARRAY()), -- [citizenid1, citizenid2, ...] + `extra_imgs` JSON NULL DEFAULT (JSON_ARRAY()), + `furnitures` JSON NULL DEFAULT (JSON_ARRAY()), + `for_sale` boolean NOT NULL DEFAULT 1, + `price` int(11) NOT NULL DEFAULT 0, + `shell` varchar(50) NOT NULL, + `apartment` varchar(50) NULL DEFAULT NULL, -- if NULL then it's a house + `door_data` JSON NULL DEFAULT NULL, -- {"x": 0.0, "y": 0.0, "z": 0.0, "h": 0.0, "length": 0.0, "width": 0.0} + `garage_data` JSON NULL DEFAULT NULL, -- {"x": 0.0, "y": 0.0, "z": 0.0} -- NULL if no garage + PRIMARY KEY (`property_id`), + CONSTRAINT `FK_owner_citizenid` FOREIGN KEY (`owner_citizenid`) REFERENCES `players` (`citizenid`) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT `UQ_owner_apartment` UNIQUE (`owner_citizenid`, `apartment`) -- A character can only own one apartment +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; diff --git a/resources/[ps]/ps-housing/server/migrate.lua b/resources/[ps]/ps-housing/server/migrate.lua new file mode 100644 index 0000000..ae64f07 --- /dev/null +++ b/resources/[ps]/ps-housing/server/migrate.lua @@ -0,0 +1,25 @@ +local AptNames = { + ['apartment1'] = "South Rockford Drive", + ["apartment2"] = "Morningwood Blvd", + ["apartment3"] = "Integrity Way", + ["apartment4"] = "Tinsel Towers", + ["apartment5"] = "Fantastic Plaza", +} + +local Shells = { + [1] = `shell_v16low`, + [2] = `shell_v16mid`, + [3] = `shell_trevor`, + [4] = `shell_trailer`, + [5] = `shell_lester`, + [6] = `shell_ranch`, + [7] = `container_shell`, + [8] = `furnitured_midapart`, + [9] = `modernhotel_shell`, + [10] = `shell_frankaunt`, + [11] = `shell_garagem`, + [12] = `shell_michael`, + [13] = `shell_office1`, + [14] = `shell_store1`, + [15] = `shell_warehouse1` +} diff --git a/resources/[ps]/ps-housing/server/server.lua b/resources/[ps]/ps-housing/server/server.lua new file mode 100644 index 0000000..f9349ec --- /dev/null +++ b/resources/[ps]/ps-housing/server/server.lua @@ -0,0 +1,268 @@ +QBCore = exports['qb-core']:GetCoreObject() +-- PSCore = exports['ps-core']:GetCoreObject() + +local dbloaded = false +MySQL.ready(function() + MySQL.query('SELECT * FROM properties', {}, function(result) + if not result then return end + if result.id then -- If only one result + result = {result} + end + for _, v in pairs(result) do + local id = tostring(v.property_id) + local propertyData = { + property_id = tostring(id), + owner = v.owner_citizenid, + street = v.street, + region = v.region, + description = v.description, + has_access = json.decode(v.has_access), + extra_imgs = json.decode(v.extra_imgs), + furnitures = json.decode(v.furnitures), + for_sale = v.for_sale, + price = v.price, + shell = v.shell, + apartment = v.apartment, + door_data = json.decode(v.door_data), + garage_data = json.decode(v.garage_data), + } + PropertiesTable[id] = Property:new(propertyData) + end + + dbloaded = true + end) +end) + +lib.callback.register("ps-housing:server:requestProperties", function(source) + while not dbloaded do + Wait(100) + end + + return PropertiesTable +end) + +AddEventHandler("ps-housing:server:registerProperty", function (propertyData) -- triggered by realtor job + local propertyData = propertyData + + propertyData.owner = propertyData.owner or nil + propertyData.has_access = propertyData.has_access or {} + propertyData.extra_imgs = propertyData.extra_imgs or {} + propertyData.furnitures = propertyData.furnitures or {} + propertyData.door_data = propertyData.door_data or {} + propertyData.garage_data = propertyData.garage_data or {} + + local cols = "(owner_citizenid, street, region, description, has_access, extra_imgs, furnitures, for_sale, price, shell, apartment, door_data, garage_data)" + local vals = "(@owner_citizenid, @street, @region, @description, @has_access, @extra_imgs, @furnitures, @for_sale, @price, @shell, @apartment, @door_data, @garage_data)" + + local id = MySQL.insert.await("INSERT INTO properties " .. cols .. " VALUES " .. vals , { + ["@owner_citizenid"] = propertyData.owner or nil, + ["@street"] = propertyData.street, + ["@region"] = propertyData.region, + ["@description"] = propertyData.description, + ["@has_access"] = json.encode(propertyData.has_access), + ["@extra_imgs"] = json.encode(propertyData.extra_imgs), + ["@furnitures"] = json.encode(propertyData.furnitures), + ["@for_sale"] = propertyData.for_sale ~= nil and propertyData.for_sale or 1, + ["@price"] = propertyData.price or 0, + ["@shell"] = propertyData.shell, + ["@apartment"] = propertyData.apartment, + ["@door_data"] = json.encode(propertyData.door_data), + ["@garage_data"] = json.encode(propertyData.garage_data), + }) + id = tostring(id) + propertyData.property_id = id + PropertiesTable[id] = Property:new(propertyData) + + TriggerClientEvent("ps-housing:client:addProperty", -1, propertyData) + + if propertyData.apartment then + local player = QBCore.Functions.GetPlayerByCitizenId(propertyData.owner) + local src = player.PlayerData.source + + local property = Property.Get(id) + property:PlayerEnter(src) + + Wait(1000) + + local query = "SELECT skin FROM playerskins WHERE citizenid = ?" + local result = MySQL.Sync.fetchAll(query, {propertyData.owner}) + + if result and result[1] then + Debug("Player: " .. propertyData.owner .. " skin already exists!") + else + TriggerClientEvent("hp_charcreator:openCreator", src) + -- TriggerClientEvent("qb-clothes:client:CreateFirstCharacter", src) + Debug("Player: " .. propertyData.owner .. " is creating a new character!") + end + + Framework[Config.Notify].Notify(src, "Open radial menu for furniture menu and place down your stash and clothing locker.", "info") + + -- This will create the stash for the apartment and migrate the items from the old apartment stash if applicable + TriggerEvent("ps-housing:server:createApartmentStash", propertyData.owner, id) + end +end) + +lib.callback.register("ps-housing:cb:GetOwnedApartment", function(source, cid) + Debug("ps-housing:cb:GetOwnedApartment", source, cid) + if cid ~= nil then + local result = MySQL.query.await('SELECT * FROM properties WHERE owner_citizenid = ? AND apartment IS NOT NULL AND apartment <> ""', { cid }) + if result[1] ~= nil then + return result[1] + end + return nil + else + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local result = MySQL.query.await('SELECT * FROM properties WHERE owner_citizenid = ? AND apartment IS NOT NULL AND apartment <> ""', { Player.PlayerData.citizenid }) + if result[1] ~= nil then + return result[1] + end + return nil + end +end) + +AddEventHandler("ps-housing:server:updateProperty", function(type, property_id, data) + local property = Property.Get(property_id) + if not property then return end + + property[type](property, data) +end) + +AddEventHandler("onResourceStart", function(resourceName) -- Used for when the resource is restarted while in game + if (GetCurrentResourceName() == resourceName) then + while not dbloaded do + Wait(100) + end + TriggerClientEvent('ps-housing:client:initialiseProperties', -1, PropertiesTable) + end +end) + +RegisterNetEvent("ps-housing:server:createNewApartment", function(aptLabel) + local src = source + if not Config.StartingApartment then return end + local citizenid = GetCitizenid(src) + local PlayerData = GetPlayerData(src) + + local apartment = Config.Apartments[aptLabel] + if not apartment then return end + + local propertyData = { + owner = citizenid, + description = string.format("Dette er %s's lejlighed ved %s", PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname, apartment.label), + for_sale = 0, + shell = apartment.shell, + apartment = apartment.label, + } + + Debug("Creating new apartment for " .. GetPlayerName(src) .. " in " .. apartment.label) + + Framework[Config.Logs].SendLog("Creating new apartment for " .. GetPlayerName(src) .. " in " .. apartment.label) + + TriggerEvent("ps-housing:server:registerProperty", propertyData) +end) + +-- Creates apartment stash +-- If player has an existing apartment from qb-apartments, it will transfer the items over to the new apartment stash +RegisterNetEvent("ps-housing:server:createApartmentStash", function(citizenId, propertyId) + local stashId = string.format("property_%s", propertyId) + + -- Check for existing apartment and corresponding stash + local result = MySQL.query.await('SELECT items, stash FROM stashitems WHERE stash IN (SELECT name FROM apartments WHERE citizenid = ?)', { citizenId }) + + local items = {} + if result[1] ~= nil then + items = json.decode(result[1].items) + + -- Delete the old apartment stash as it is no longer needed + MySQL.Async.execute('DELETE FROM stashitems WHERE stash = ?', { result[1].stash }) + end + + -- This will create the stash for the apartment (without requiring player to have first opened and placed item in it) + TriggerEvent('ps-inventory:server:SaveStashItems', stashId, items) +end) + +RegisterNetEvent('qb-apartments:returnBucket', function() + local src = source + SetPlayerRoutingBucket(src, 0) +end) + +AddEventHandler("ps-housing:server:addTenantToApartment", function (data) + local apartment = data.apartment + local targetSrc = tonumber(data.targetSrc) + local realtorSrc = data.realtorSrc + local targetCitizenid = GetCitizenid(targetSrc, realtorSrc) + + -- id of current apartment so we can change it + local property_id = nil + + for _, v in pairs(PropertiesTable) do + local propertyData = v.propertyData + if propertyData.owner == targetCitizenid then + if propertyData.apartment == apartment then + Framework[Config.Notify].Notify(targetSrc, "Du er allerede i lejligheden", "error") + Framework[Config.Notify].Notify(targetSrc, "Denne person er allerede i lejligheden", "error") + + return + elseif #propertyData.apartment > 1 then + property_id = propertyData.property_id + break + end + end + end + + local property = Property.Get(property_id) + if not property then return end + + property:UpdateApartment(data) + + local citizenid = GetCitizenid(targetSrc, realtorSrc) + local targetToAdd = QBCore.Functions.GetPlayerByCitizenId(citizenid) + local targetPlayer = targetToAdd.PlayerData + + Framework[Config.Notify].Notify(targetSrc, "Din lejlighed er nu på "..apartment, "success") + Framework[Config.Notify].Notify(realtorSrc, "Du har tilføjet ".. targetPlayer.charinfo.firstname .. " " .. targetPlayer.charinfo.lastname .. " til lejligheden "..apartment, "success") +end) + +exports('IsOwner', function(src, property_id) + local property = Property.Get(property_id) + if not property then return false end + + local citizenid = GetCitizenid(src, src) + return property:CheckForAccess(citizenid) +end) + +function GetCitizenid(targetSrc, callerSrc) + local Player = QBCore.Functions.GetPlayer(tonumber(targetSrc)) + if not Player then + Framework[Config.Notify].Notify(callerSrc, "Person ikke fundet.", "error") + return + end + local PlayerData = Player.PlayerData + local citizenid = PlayerData.citizenid + return citizenid +end + +function GetCharName(src) + local Player = QBCore.Functions.GetPlayer(tonumber(src)) + if not Player then return end + local PlayerData = Player.PlayerData + return PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname +end + +function GetPlayerData(src) + local Player = QBCore.Functions.GetPlayer(tonumber(src)) + if not Player then return end + local PlayerData = Player.PlayerData + return PlayerData +end + +function GetPlayer(src) + local Player = QBCore.Functions.GetPlayer(tonumber(src)) + if not Player then return end + return Player +end + +-- if PSCore then +-- PSCore.Functions.CheckForUpdates() +-- PSCore.Functions.CheckResourceName() +-- end diff --git a/resources/[ps]/ps-housing/server/sv_property.lua b/resources/[ps]/ps-housing/server/sv_property.lua new file mode 100644 index 0000000..e5be3b4 --- /dev/null +++ b/resources/[ps]/ps-housing/server/sv_property.lua @@ -0,0 +1,855 @@ +Property = { + property_id = nil, + propertyData = nil, + playersInside = {}, -- src + playersDoorbell = {}, -- src + + raiding = false, +} +Property.__index = Property + +function Property:new(propertyData) + local self = setmetatable({}, Property) + + self.property_id = tostring(propertyData.property_id) + self.propertyData = propertyData + + local stashName = string.format("property_%s", propertyData.property_id) + local stashConfig = Config.Shells[propertyData.shell].stash + + Framework[Config.Inventory].RegisterInventory(stashName, propertyData.street or propertyData.apartment or stashName, stashConfig) + + return self +end + +function Property:PlayerEnter(src) + local _src = tostring(src) + self.playersInside[_src] = true + + TriggerClientEvent('qb-weathersync:client:DisableSync', src) + TriggerClientEvent('ps-housing:client:enterProperty', src, self.property_id) + + if next(self.playersDoorbell) then + TriggerClientEvent("ps-housing:client:updateDoorbellPool", src, self.property_id, self.playersDoorbell) + if self.playersDoorbell[_src] then + self.playersDoorbell[_src] = nil + end + end + + local citizenid = GetCitizenid(src) + + if self:CheckForAccess(citizenid) then + local Player = QBCore.Functions.GetPlayer(src) + local insideMeta = Player.PlayerData.metadata["inside"] + + insideMeta.property_id = self.property_id + Player.Functions.SetMetaData("inside", insideMeta) + end + + local bucket = tonumber(self.property_id) -- because the property_id is a string + SetPlayerRoutingBucket(src, bucket) +end + +function Property:PlayerLeave(src) + local _src = tostring(src) + self.playersInside[_src] = nil + + TriggerClientEvent('qb-weathersync:client:EnableSync', src) + + local citizenid = GetCitizenid(src) + + if self:CheckForAccess(citizenid) then + local Player = QBCore.Functions.GetPlayer(src) + local insideMeta = Player.PlayerData.metadata["inside"] + + insideMeta.property_id = nil + Player.Functions.SetMetaData("inside", insideMeta) + end + + SetPlayerRoutingBucket(src, 0) +end + +function Property:CheckForAccess(citizenid) + if self.propertyData.owner == citizenid then return true end + return lib.table.contains(self.propertyData.has_access, citizenid) +end + +function Property:AddToDoorbellPoolTemp(src) + local _src = tostring(src) + + local name = GetCharName(src) + + self.playersDoorbell[_src] = { + src = src, + name = name + } + + for src, _ in pairs(self.playersInside) do + local targetSrc = tonumber(src) + + Framework[Config.Notify].Notify(targetSrc, "Der er gæster ved døren.", "info") + TriggerClientEvent("ps-housing:client:updateDoorbellPool", targetSrc, self.property_id, self.playersDoorbell) + end + + Framework[Config.Notify].Notify(src, "Du har ringet på dørklokken...", "info") + + SetTimeout(10000, function() + if self.playersDoorbell[_src] then + self.playersDoorbell[_src] = nil + Framework[Config.Notify].Notify(src, "Ingen åbnede døren.", "error") + end + + for src, _ in pairs(self.playersInside) do + local targetSrc = tonumber(src) + + TriggerClientEvent("ps-housing:client:updateDoorbellPool", targetSrc, self.property_id, self.playersDoorbell) + end + end) +end + +function Property:RemoveFromDoorbellPool(src) + local _src = tostring(src) + + if self.playersDoorbell[_src] then + self.playersDoorbell[_src] = nil + end + + for src, _ in pairs(self.playersInside) do + local targetSrc = tonumber(src) + + TriggerClientEvent("ps-housing:client:updateDoorbellPool", targetSrc, self.property_id, self.playersDoorbell) + end +end + +function Property:StartRaid() + self.raiding = true + + for src, _ in pairs(self.playersInside) do + local targetSrc = tonumber(src) + Framework[Config.Notify].Notify(targetSrc, "Denne ejendom bliver ransaget.", "error") + end + + SetTimeout(Config.RaidTimer * 60000, function() + self.raiding = false + end) +end + +function Property:UpdateFurnitures(furnitures) + self.propertyData.furnitures = furnitures + + MySQL.update("UPDATE properties SET furnitures = @furnitures WHERE property_id = @property_id", { + ["@furnitures"] = json.encode(furnitures), + ["@property_id"] = self.property_id + }) + + for src, _ in pairs(self.playersInside) do + local targetSrc = tonumber(src) + TriggerClientEvent("ps-housing:client:updateFurniture", targetSrc, self.property_id, furnitures) + end +end + +function Property:UpdateDescription(data) + local description = data.description + local realtorSrc = data.realtorSrc + + if self.propertyData.description == description then return end + + self.propertyData.description = description + + MySQL.update("UPDATE properties SET description = @description WHERE property_id = @property_id", { + ["@description"] = description, + ["@property_id"] = self.property_id + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateDescription", self.property_id, description) + + Framework[Config.Logs].SendLog("**Changed Description** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc)) + + Debug("Changed Description of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + +function Property:UpdatePrice(data) + local price = data.price + local realtorSrc = data.realtorSrc + + if self.propertyData.price == price then return end + + self.propertyData.price = price + + MySQL.update("UPDATE properties SET price = @price WHERE property_id = @property_id", { + ["@price"] = price, + ["@property_id"] = self.property_id + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdatePrice", self.property_id, price) + + Framework[Config.Logs].SendLog("**Changed Price** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc)) + + Debug("Changed Price of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + +function Property:UpdateForSale(data) + local forsale = data.forsale + local realtorSrc = data.realtorSrc + + self.propertyData.for_sale = forsale + + MySQL.update("UPDATE properties SET for_sale = @for_sale WHERE property_id = @property_id", { + ["@for_sale"] = forsale and 1 or 0, + ["@property_id"] = self.property_id + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateForSale", self.property_id, forsale) + + Framework[Config.Logs].SendLog("**Changed For Sale** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc)) + + Debug("Changed For Sale of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + +function Property:UpdateShell(data) + local shell = data.shell + local realtorSrc = data.realtorSrc + + if self.propertyData.shell == shell then return end + + self.propertyData.shell = shell + + MySQL.update("UPDATE properties SET shell = @shell WHERE property_id = @property_id", { + ["@shell"] = shell, + ["@property_id"] = self.property_id + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateShell", self.property_id, shell) + + Framework[Config.Logs].SendLog("**Changed Shell** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc)) + + Debug("Changed Shell of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + +function Property:UpdateOwner(data) + local targetSrc = data.targetSrc + local realtorSrc = data.realtorSrc + + if not realtorSrc then Debug("No Realtor Src found") return end + if not targetSrc then Debug("No Target Src found") return end + + local previousOwner = self.propertyData.owner + + local targetPlayer = QBCore.Functions.GetPlayer(tonumber(targetSrc)) + + local PlayerData = targetPlayer.PlayerData + local bank = PlayerData.money.bank + local citizenid = PlayerData.citizenid + + if self.propertyData.owner == citizenid then + Framework[Config.Notify].Notify(targetSrc, "Du ejer allerede denne ejendom", "error") + Framework[Config.Notify].Notify(realtorSrc, "Kunden ejer allerede denne ejendom", "error") + return + end + + --add callback + local targetAllow = lib.callback.await("ps-housing:cb:confirmPurchase", targetSrc, self.propertyData.price, self.propertyData.street, self.propertyData.property_id) + + if targetAllow ~= "confirm" then + Framework[Config.Notify].Notify(targetSrc, "Du bekræftede ikke købet", "info") + Framework[Config.Notify].Notify(realtorSrc, "Kunden bekræftede ikke købet", "error") + return + end + + if bank < self.propertyData.price then + Framework[Config.Notify].Notify(targetSrc, "Du har ikke nok penge i banken", "error") + Framework[Config.Notify].Notify(realtorSrc, "Kunden har ikke nok penge i banken", "error") + return + end + + targetPlayer.Functions.RemoveMoney('bank', self.propertyData.price, "Købte ejendom: " .. self.propertyData.street .. " " .. self.property_id) + + local prevPlayer = QBCore.Functions.GetPlayerByCitizenId(previousOwner) + local realtor = QBCore.Functions.GetPlayer(tonumber(realtorSrc)) + local realtorGradeLevel = realtor.PlayerData.job.grade.level + + local commission = math.floor(self.propertyData.price * Config.Commissions[realtorGradeLevel]) + + local totalAfterCommission = self.propertyData.price - commission + + if prevPlayer ~= nil then + Framework[Config.Notify].Notify(prevPlayer.PlayerData.source, "Ejendom solgt: " .. self.propertyData.street .. " " .. self.property_id, "success") + prevPlayer.Functions.AddMoney('bank', totalAfterCommission, "Solgte ejendom: " .. self.propertyData.street .. " " .. self.property_id) + elseif previousOwner then + MySQL.Async.execute('UPDATE `players` SET `bank` = `bank` + @price WHERE `citizenid` = @citizenid', { + ['@citizenid'] = previousOwner, + ['@price'] = totalAfterCommission + }) + end + + realtor.Functions.AddMoney('bank', commission, "Kommission fra ejendom: " .. self.propertyData.street .. " " .. self.property_id) + + self.propertyData.owner = citizenid + + MySQL.update("UPDATE properties SET owner_citizenid = @owner_citizenid, for_sale = @for_sale WHERE property_id = @property_id", { + ["@owner_citizenid"] = citizenid, + ["@for_sale"] = 0, + ["@property_id"] = self.property_id + }) + + self.propertyData.furnitures = {} -- to be fetched on enter + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateOwner", self.property_id, citizenid) + + Framework[Config.Logs].SendLog("**House Bought** by: **"..PlayerData.charinfo.firstname.." "..PlayerData.charinfo.lastname.."** for $"..self.propertyData.price.." from **"..realtor.PlayerData.charinfo.firstname.." "..realtor.PlayerData.charinfo.lastname.."** !") + + Framework[Config.Notify].Notify(targetSrc, "Du har købt ejendommen for "..self.propertyData.price..",-", "success") + Framework[Config.Notify].Notify(realtorSrc, "Kunden har købt ejendommen for "..self.propertyData.price..",-", "success") +end + +function Property:UpdateImgs(data) + local imgs = data.imgs + local realtorSrc = data.realtorSrc + + self.propertyData.imgs = imgs + + MySQL.update("UPDATE properties SET extra_imgs = @extra_imgs WHERE property_id = @property_id", { + ["@extra_imgs"] = json.encode(imgs), + ["@property_id"] = self.property_id + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateImgs", self.property_id, imgs) + + Framework[Config.Logs].SendLog("**Changed Images** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc)) + + Debug("Changed Imgs of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + + +function Property:UpdateDoor(data) + local door = data.door + + if not door then return end + local realtorSrc = data.realtorSrc + + local newDoor = { + x = math.floor(door.x * 10000) / 10000, + y = math.floor(door.y * 10000) / 10000, + z = math.floor(door.z * 10000) / 10000, + h = math.floor(door.h * 10000) / 10000, + length = door.length or 1.5, + width = door.width or 2.2, + locked = door.locked or false, + } + + self.propertyData.door_data = newDoor + + self.propertyData.street = data.street + self.propertyData.region = data.region + + + MySQL.update("UPDATE properties SET door_data = @door, street = @street, region = @region WHERE property_id = @property_id", { + ["@door"] = json.encode(newDoor), + ["@property_id"] = self.property_id, + ["@street"] = data.street, + ["@region"] = data.region + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateDoor", self.property_id, newDoor, data.street, data.region) + + Framework[Config.Logs].SendLog("**Changed Door** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc)) + + Debug("Changed Door of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + +function Property:UpdateHas_access(data) + local has_access = data or {} + + self.propertyData.has_access = has_access + + MySQL.update("UPDATE properties SET has_access = @has_access WHERE property_id = @property_id", { + ["@has_access"] = json.encode(has_access), --Array of cids + ["@property_id"] = self.property_id + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateHas_access", self.property_id, has_access) + + Debug("Changed Has Access of property with id: " .. self.property_id) +end + +function Property:UpdateGarage(data) + local garage = data.garage + local realtorSrc = data.realtorSrc + + local newData = {} + + if data ~= nil then + newData = { + x = math.floor(garage.x * 10000) / 10000, + y = math.floor(garage.y * 10000) / 10000, + z = math.floor(garage.z * 10000) / 10000, + h = math.floor(garage.h * 10000) / 10000, + length = garage.length or 3.0, + width = garage.width or 5.0, + } + end + + self.propertyData.garage_data = newData + + MySQL.update("UPDATE properties SET garage_data = @garageCoords WHERE property_id = @property_id", { + ["@garageCoords"] = json.encode(newData), + ["@property_id"] = self.property_id + }) + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateGarage", self.property_id, garage) + + Framework[Config.Logs].SendLog("**Changed Garage** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc)) + + Debug("Changed Garage of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + +function Property:UpdateApartment(data) + local apartment = data.apartment + local realtorSrc = data.realtorSrc + local targetSrc = data.targetSrc + + self.propertyData.apartment = apartment + + MySQL.update("UPDATE properties SET apartment = @apartment WHERE property_id = @property_id", { + ["@apartment"] = apartment, + ["@property_id"] = self.property_id + }) + + Framework[Config.Notify].Notify(realtorSrc, "Ændrede lejligheden for ejendommen med ID: " .. self.property_id .." til ".. apartment, "success") + + Framework[Config.Notify].Notify(targetSrc, "Ændrede lejlighed til " .. apartment, "success") + + Framework[Config.Logs].SendLog("**Changed Apartment** with id: " .. self.property_id .. " by: **" .. GetPlayerName(realtorSrc) .. "** for **" .. GetPlayerName(targetSrc) .."**") + + TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateApartment", self.property_id, apartment) + + Debug("Changed Apartment of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc)) +end + +function Property:DeleteProperty(data) + local realtorSrc = data.realtorSrc + local propertyid = self.property_id + local realtorName = GetPlayerName(realtorSrc) + + MySQL.Async.execute("DELETE FROM properties WHERE property_id = @property_id", { + ["@property_id"] = propertyid + }, function (rowsChanged) + if rowsChanged > 0 then + Debug("Deleted property with id: " .. propertyid, "by: " .. realtorName) + end + end) + + TriggerClientEvent("ps-housing:client:removeProperty", -1, propertyid) + + Framework[Config.Notify].Notify(realtorSrc, "Ejendommen med id: " .. propertyid .." blev fjernet.", "info") + + Framework[Config.Logs].SendLog("**Property Deleted** with id: " .. propertyid .. " by: " .. realtorName) + + PropertiesTable[propertyid] = nil + self = nil + + Debug("Deleted property with id: " .. propertyid, "by: " .. realtorName) +end + +function Property.Get(property_id) + return PropertiesTable[tostring(property_id)] +end + +RegisterNetEvent('ps-housing:server:enterProperty', function (property_id) + local src = source + Debug("Player is trying to enter property", property_id) + + local property = Property.Get(property_id) + + if not property then + Debug("Properties returned", json.encode(PropertiesTable, {indent = true})) + return + end + + local citizenid = GetCitizenid(src) + + if property:CheckForAccess(citizenid) then + Debug("Player has access to property") + property:PlayerEnter(src) + Debug("Player entered property") + return + end + + local ringDoorbellConfirmation = lib.callback.await('ps-housing:cb:ringDoorbell', src) + if ringDoorbellConfirmation == "confirm" then + property:AddToDoorbellPoolTemp(src) + Debug("Ringing doorbell") + return + end +end) + +RegisterNetEvent("ps-housing:server:showcaseProperty", function(property_id) + local src = source + + local property = Property.Get(property_id) + + if not property then + Debug("Properties returned", json.encode(PropertiesTable, {indent = true})) + return + end + + + local PlayerData = GetPlayerData(src) + local job = PlayerData.job + local jobName = job.name + local onDuty = job.onduty + + if jobName == Config.RealtorJobName and onDuty then + local showcase = lib.callback.await('ps-housing:cb:showcase', src) + if showcase == "confirm" then + property:PlayerEnter(src) + return + end + end +end) + +RegisterNetEvent('ps-housing:server:raidProperty', function(property_id) + local src = source + Debug("Player is trying to raid property", property_id) + + local property = Property.Get(property_id) + + if not property then + Debug("Properties returned", json.encode(PropertiesTable, {indent = true})) + return + end + + local Player = QBCore.Functions.GetPlayer(src) + if not Player then return end + local PlayerData = Player.PlayerData + local job = PlayerData.job + local jobName = job.name + local gradeAllowed = tonumber(job.grade.level) >= Config.MinGradeToRaid + local onDuty = job.onduty + local raidItem = Config.RaidItem + + -- Check if the police officer has the "stormram" item + local hasStormRam = (Config.Inventory == "ox" and exports.ox_inventory:Search(src, "count", raidItem) > 0) or Player.Functions.GetItemByName(raidItem) + + local isAllowedToRaid = PoliceJobs[jobName] and onDuty and gradeAllowed + if isAllowedToRaid then + if hasStormRam then + if not property.raiding then + local confirmRaid = lib.callback.await('ps-housing:cb:confirmRaid', src, (property.propertyData.street or property.propertyData.apartment) .. " " .. property.property_id, property_id) + if confirmRaid == "confirm" then + property:StartRaid(src) + property:PlayerEnter(src) + Framework[Config.Notify].Notify(src, "Ransagning startet", "success") + + if Config.ConsumeRaidItem then + -- Remove the "stormram" item from the officer's inventory + if Config.Inventory == 'ox' then + exports.ox_inventory:RemoveItem(src, raidItem, 1) + else + Player.Functions.RemoveItem(raidItem, 1) + TriggerClientEvent("inventory:client:ItemBox", src, QBCore.Shared.Items[raidItem], "remove") + TriggerEvent("inventory:server:RemoveItem", src, raidItem, 1) + end + end + end + else + Framework[Config.Notify].Notify(src, "Ransagning igang", "success") + property:PlayerEnter(src) + end + else + Framework[Config.Notify].Notify(src, "Du skal bruge en rambuk for at starte en ransagning", "error") + end + else + if not PoliceJobs[jobName] then + Framework[Config.Notify].Notify(src, "Kun politiet kan starte ransagninger", "error") + elseif not onDuty then + Framework[Config.Notify].Notify(src, "Du skal være på arbejde for at kunne starte en ransagning", "error") + elseif not gradeAllowed then + Framework[Config.Notify].Notify(src, "Du har ikke høj nok stilling, til at kunne starte en ransagnings", "error") + end + end +end) + + + +lib.callback.register('ps-housing:cb:getFurnitures', function(source, property_id) + local property = Property.Get(property_id) + if not property then return end + return property.propertyData.furnitures or {} +end) + + +lib.callback.register('ps-housing:cb:getPlayersInProperty', function(source, property_id) + + local property = Property.Get(property_id) + if not property then return end + + local players = {} + + for src, _ in pairs(property.playersInside) do + local targetSrc = tonumber(src) + if targetSrc ~= source then + local name = GetCharName(targetSrc) + + players[#players + 1] = { + src = targetSrc, + name = name + } + end + end + + return players or {} +end) + +RegisterNetEvent('ps-housing:server:leaveProperty', function (property_id) + local src = source + local property = Property.Get(property_id) + + if not property then return end + + property:PlayerLeave(src) +end) + +-- When player presses doorbell, owner can let them in and this is what is triggered +RegisterNetEvent("ps-housing:server:doorbellAnswer", function (data) + local src = source + local targetSrc = data.targetSrc + + local property = Property.Get(data.property_id) + if not property then return end + + if not property.playersInside[tostring(src)] then return end + property:RemoveFromDoorbellPool(targetSrc) + + property:PlayerEnter(targetSrc) +end) + +--@@ NEED TO REDO THIS DOG SHIT +-- I think its not bad anymore but if u got a better idea lmk +RegisterNetEvent("ps-housing:server:buyFurniture", function(property_id, items, price) + local src = source + + local citizenid = GetCitizenid(src) + local PlayerData = GetPlayerData(src) + local Player = GetPlayer(src) + -- ik ik, i cbf rn. if your reading this and its still shit, tell me + + local property = Property.Get(property_id) + if not property then return end + + if not property:CheckForAccess(citizenid) then return end + + local price = tonumber(price) + + if price > PlayerData.money.bank and price > PlayerData.money.cash then + Framework[Config.Notify].Notify(src, "Du har ikke råd!", "error") + return + end + + if price <= PlayerData.money.cash then + Player.Functions.RemoveMoney('cash', price, "Købte møbler") + else + Player.Functions.RemoveMoney('bank', price, "Købte møbler") + end + + local numFurnitures = #property.propertyData.furnitures + + for i = 1, #items do + numFurnitures = numFurnitures + 1 + property.propertyData.furnitures[numFurnitures] = items[i] + end + + property:UpdateFurnitures(property.propertyData.furnitures) + + Framework[Config.Notify].Notify(src, "Du købte møbler for " .. price..",-", "success") + + Framework[Config.Logs].SendLog("**Player ".. GetPlayerName(src) .. "** bought furniture for **$" .. price .. "**") + + Debug("Player bought furniture for $" .. price, "by: " .. GetPlayerName(src)) +end) + +RegisterNetEvent("ps-housing:server:removeFurniture", function(property_id, itemid) + local src = source + + local property = Property.Get(property_id) + if not property then return end + + local citizenid = GetCitizenid(src) + if not property:CheckForAccess(citizenid) then return end + + local currentFurnitures = property.propertyData.furnitures + + for k, v in pairs(currentFurnitures) do + if v.id == itemid then + table.remove(currentFurnitures, k) + break + end + end + + property:UpdateFurnitures(currentFurnitures) +end) + +-- @@ VERY BAD +-- I think its not bad anymore but if u got a better idea lmk +RegisterNetEvent("ps-housing:server:updateFurniture", function(property_id, item) + local src = source + + local property = Property.Get(property_id) + if not property then return end + + local citizenid = GetCitizenid(src) + if not property:CheckForAccess(citizenid) then return end + + local currentFurnitures = property.propertyData.furnitures + + for k, v in pairs(currentFurnitures) do + if v.id == item.id then + currentFurnitures[k] = item + Debug("Updated furniture", json.encode(item)) + break + end + end + + property:UpdateFurnitures(currentFurnitures) +end) + +RegisterNetEvent("ps-housing:server:addAccess", function(property_id, srcToAdd) + local src = source + + local citizenid = GetCitizenid(src) + local property = Property.Get(property_id) + if not property then return end + + if not property.propertyData.owner == citizenid then + -- hacker ban or something + Framework[Config.Notify].Notify(src, "Du ejer ikke ejendommen!", "error") + return + end + + local has_access = property.propertyData.has_access + + local targetCitizenid = GetCitizenid(srcToAdd) + local targetPlayer = GetPlayerData(srcToAdd) + + if not property:CheckForAccess(targetCitizenid) then + has_access[#has_access+1] = targetCitizenid + property:UpdateHas_access(has_access) + + Framework[Config.Notify].Notify(src, "Du gav adgang til " .. targetPlayer.charinfo.firstname .. " " .. targetPlayer.charinfo.lastname, "success") + Framework[Config.Notify].Notify(srcToAdd, "Du fik adgang til ejendommen!", "success") + else + Framework[Config.Notify].Notify(src, "Personen har allerede adgang til ejendommen!", "error") + end +end) + +RegisterNetEvent("ps-housing:server:removeAccess", function(property_id, citizenidToRemove) + local src = source + + local citizenid = GetCitizenid(src) + local property = Property.Get(property_id) + if not property then return end + + if not property.propertyData.owner == citizenid then + -- hacker ban or something + Framework[Config.Notify].Notify(src, "Du er ikke ejer af ejendommen!", "error") + return + end + + local has_access = property.propertyData.has_access + local citizenidToRemove = citizenidToRemove + + if property:CheckForAccess(citizenidToRemove) then + for i = 1, #has_access do + if has_access[i] == citizenidToRemove then + table.remove(has_access, i) + break + end + end + + property:UpdateHas_access(has_access) + + local playerToAdd = QBCore.Functions.GetPlayerByCitizenId(citizenidToRemove) or QBCore.Functions.GetOfflinePlayerByCitizenId(citizenidToRemove) + local removePlayerData = playerToAdd.PlayerData + local srcToRemove = removePlayerData.source + + Framework[Config.Notify].Notify(src, "Du fjernede adgangen for " .. removePlayerData.charinfo.firstname .. " " .. removePlayerData.charinfo.lastname, "success") + + if srcToRemove then + Framework[Config.Notify].Notify(srcToRemove, "Du mistede adgangen til " .. (property.propertyData.street or property.propertyData.apartment) .. " " .. property.property_id, "error") + end + else + Framework[Config.Notify].Notify(src, "Denne person har ikke adgang til ejendommen!", "error") + end +end) + +lib.callback.register("ps-housing:cb:getPlayersWithAccess", function (source, property_id) + local src = source + local citizenidSrc = GetCitizenid(src) + local property = Property.Get(property_id) + + if not property then return end + if property.propertyData.owner ~= citizenidSrc then return end + + local withAccess = {} + local has_access = property.propertyData.has_access + + for i = 1, #has_access do + local citizenid = has_access[i] + local Player = QBCore.Functions.GetPlayerByCitizenId(citizenid) or QBCore.Functions.GetOfflinePlayerByCitizenId(citizenid) + if Player then + withAccess[#withAccess + 1] = { + citizenid = citizenid, + name = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname + } + end + end + + return withAccess +end) + +lib.callback.register('ps-housing:cb:getPropertyInfo', function (source, property_id) + local src = source + local property = Property.Get(property_id) + + if not property then return end + + + local PlayerData = GetPlayerData(src) + local job = PlayerData.job + local jobName = job.name + local onDuty = job.onduty + + if not jobName == Config.RealtorJobName and not onDuty then return end + + local data = {} + + local ownerPlayer, ownerName + + local ownerCid = property.propertyData.owner + if ownerCid then + ownerPlayer = QBCore.Functions.GetPlayerByCitizenId(ownerCid) or QBCore.Functions.GetOfflinePlayerByCitizenId(ownerCid) + ownerName = ownerPlayer.PlayerData.charinfo.firstname .. " " .. ownerPlayer.PlayerData.charinfo.lastname + else + ownerName = "Ingen ejer" + end + + data.owner = ownerName + data.street = property.propertyData.street + data.region = property.propertyData.region + data.description = property.propertyData.description + data.for_sale = property.propertyData.for_sale + data.price = property.propertyData.price + data.shell = property.propertyData.shell + data.property_id = property.property_id + + return data +end) + +RegisterNetEvent('ps-housing:server:resetMetaData', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local insideMeta = Player.PlayerData.metadata["inside"] + + insideMeta.property_id = nil + Player.Functions.SetMetaData("inside", insideMeta) +end) diff --git a/resources/[ps]/ps-housing/shared/config.lua b/resources/[ps]/ps-housing/shared/config.lua new file mode 100644 index 0000000..20a6b54 --- /dev/null +++ b/resources/[ps]/ps-housing/shared/config.lua @@ -0,0 +1,1553 @@ +PropertiesTable = {} +ApartmentsTable = {} + +exports('GetProperties', function() return PropertiesTable end) +exports('GetApartments', function() return ApartmentsTable end) + +Config = {} + +-- If you're not utilizing ox_lib, it's time to question your approach. +Config.Target = "qb" -- "ox" or "qb" +Config.Notify = "qb" -- "ox" or "qb" +Config.Radial = "qb" -- "ox" or "qb" +Config.Inventory = "qb" -- "ox" or "qb" +Config.Logs = "qb" -- "qb" + +-- Anyone provided with keys to a property has the ability to modify its furnishings. +Config.AccessCanEditFurniture = true + +-- Draw the poly for the property +Config.DebugMode = false + +function Debug(...) + if Config.DebugMode then + print(...) + end +end + +-- Log System +Config.EnableLogs = true + +-- Enables Dynamic Doors +Config.DynamicDoors = true + +Config.PoliceJobNames = { -- add multiple police jobs that are allowed to raid properties! + "police", + -- "police2", + -- "police3", +} + +Config.MinGradeToRaid = 3 -- Minimum grade to raid a property + +Config.RaidTimer = 5 -- 5 minutes + +Config.RaidItem = "police_stormram" -- The item required to raid a property + +-- If you are using ox_inventory, it is encouraged to use the consume property within data/items.lua and keeping this config option false +Config.ConsumeRaidItem = false -- Whether or not to consume the raid item upon successful entry. + +Config.RealtorJobName = "realestate" -- Set your Real Estate job here + +-- Realtor Commisions based on job grade, the rest goes to the owner, if any. +Config.Commissions = { + [0] = 0.05, -- 5% commision for each sale + [1] = 0.10, + [2] = 0.15, + [3] = 0.20, + [4] = 0.25, +} + +-- Set this value to false if you don't want to assign a starting apartment. +Config.StartingApartment = true + +Config.Apartments = { + ["Integrity Way"] = { + label = "Integrity Way", + door = { x = 269.73, y = -640.75, z = 42.02, h = 249.07, length = 1, width = 2 }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Integrity%20Way/Udenfor.jpg", + label = "Udenfor", + }, + }, + shell = "Apartment Furnished", + }, + + ["South Rockford Drive"] = { + label = "South Rockford Drive", + door = { x = -667.02, y = -1105.24, z = 14.63, h = 242.32, length = 1, width = 2 }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/South%20Rockford%20Drive/Udenfor.jpg", + label = "Udenfor", + }, + }, + shell = "Apartment Furnished", + }, + ['Morningwood Blvd'] = { + label = 'Morningwood Blvd', + door = { x = -1288.52, y = -430.51, z = 35.15, h = 124.81, length = 1, width = 2 }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Morningwood%20Blvd/Udenfor.jpg", + label = "Udenfor", + }, + }, + shell = "Apartment Furnished", + }, + ['Tinsel Towers'] = { + label = 'Tinsel Towers', + door = { x = -619.29, y = 37.69, z = 43.59, h = 181.03, length = 1, width = 2 }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Tinsel%20Towers/Udenfor.webp", + label = "Udenfor", + }, + }, + shell = "Apartment Furnished", + }, + ['Fantastic Plaza'] = { + label = 'Fantastic Plaza', + door = { x = 291.517, y = -1078.674, z = 29.405, h = 270.75, length = 1, width = 2 }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Fantastic%20Plaza/Udenfor.jpg", + label = "Udenfor", + }, + }, + shell = "Apartment Furnished", + } +} + +-- Shells provided by K4MB1 https://www.k4mb1maps.com/ +Config.Shells = { + ["Standard Motel"] = { + label = "Standard Motel", + hash = `standardmotel_shell`, + doorOffset = { x = -0.5, y = -2.3, z = 0.0, h = 90.0, width = 1.5 }, + stash = { + maxweight = 100000, + slots = 12, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Standard%20Motel/Motel.webp", + label = "Motel", + }, + } + }, + ["Modern Hotel"] = { + label = "Moderne Hotel", + hash = `modernhotel_shell`, + doorOffset = { x = 4.98, y = 4.35, z = 0.0, h = 179.79, width = 2.0 }, + stash = { + maxweight = 150000, + slots = 20, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Moderne%20Hotel/Vinkel1.webp", + label = "Vinkel 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Moderne%20Hotel/Vinkel2.webp", + label = "Vinkel 2", + }, + } + }, + ["Apartment Furnished"] = { + label = "Møbleret lejlighed", + hash = `furnitured_midapart`, + doorOffset = { x = 1.44, y = -10.25, z = 0.0, h = 0.0, width = 1.5 }, + stash = { + maxweight = 200000, + slots = 25, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Mobleret%20lejlighed/Badevaerelse.webp", + label = "Badeværelse", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Mobleret%20lejlighed/Sovevaerelse.webp", + label = "Soveværelse", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Mobleret%20lejlighed/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Mobleret%20lejlighed/KAD.webp", + label = "Køkken og spisestue", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Mobleret%20lejlighed/LVR1.webp", + label = "Stue vinkel 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Mobleret%20lejlighed/LVR2.webp", + label = "Stue vinkel 2", + }, + }, + }, + ["Apartment Unfurnished"] = { + label = "Umøbleret lejlighed", + hash = `shell_v16mid`, + doorOffset = { x = 1.34, y = -14.36, z = -0.5, h = 354.08, width = 1.5 }, + stash = { + maxweight = 200000, + slots = 25, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed/Badevaerelse.webp", + label = "Badeværelse", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed/Sovevaerelse.webp", + label = "Soveværelse", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed/Kokken.webp", + label = "Køkken", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed/Stue.webp", + label = "Stue", + }, + }, + }, + ["Apartment 2 Unfurnished"] = { + label = "2. umøbleret lejlighed", + hash = `shell_v16low`, + doorOffset = { x = 4.69, y = -6.5, z = -1.0, h = 358.50, width = 1.5 }, + stash = { + maxweight = 200000, + slots = 25, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed%202/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed%202/Kokken.webp", + label = "Køkken", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Umobleret%20Lejlighed%202/Stue.webp", + label = "Stue", + }, + }, + }, + ["Garage"] = { + label = "Garage", + hash = `shell_garagem`, + doorOffset = { x = 14.0, y = 1.7, z = -0.76, h = 88.49, width = 2.0 }, + stash = { + maxweight = 500000, + slots = 50, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Garage/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Garage/Garage.webp", + label = "Garage", + }, + }, + }, + ["Office"] = { + label = "Kontor", + hash = `shell_office1`, + doorOffset = { x = 1.2, y = 4.90, z = -0.73, h = 180.0, width = 2.0 }, + stash = { + maxweight = 250000, + slots = 30, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Kontor/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Kontor/Kontor.webp", + label = "Kontor", + }, + }, + }, + ["Store"] = { + label = "Butik", + hash = `shell_store1`, + doorOffset = { x = -2.69, y = -4.56, z = -0.62, h = 1.91, width = 2.0 }, + stash = { + maxweight = 500000, + slots = 50, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Butik/Rum1.webp", + label = "Rum 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Butik/Rum2.webp", + label = "Rum 2", + }, + }, + }, + ["Warehouse"] = { + label = "Varehus", + hash = `shell_warehouse1`, + doorOffset = { x = -8.96, y = 0.11, z = -0.95, h = 270.64, width = 2.0 }, + stash = { + maxweight = 1000000, + slots = 100, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Varehus/V1.webp", + label = "Vinkel 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Varehus/V2.webp", + label = "Vinkel 2", + }, + }, + }, + ["Container"] = { + label = "Container", + hash = `container_shell`, + doorOffset = { x = 0.05, y = -5.7, z = -0.22, h = 1.7, width = 2.2 }, + stash = { + maxweight = 500000, + slots = 100, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Container/Container.webp", + label = "Container", + }, + }, + }, + ["2 Floor House"] = { + label = "2. Etagers hus", + hash = `shell_michael`, + doorOffset = { x = -9.6, y = 5.63, z = -4.07, h = 268.55, width = 2.0 }, + stash = { + maxweight = 300000, + slots = 50, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Badevaerelse.webp", + label = "Badeværelse", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/2etage.webp", + label = "2. etage", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Kokken.webp", + label = "Køkken", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Stue.webp", + label = "Stue", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Rum1.webp", + label = "Rum 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Rum2.webp", + label = "Rum 2", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Rum3.webp", + label = "Rum 3", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Michael/Rum3skab.webp", + label = "Rum 3 skab", + }, + }, + }, + ["House 1"] = { + label = "Hus 1", + hash = `shell_frankaunt`, + doorOffset = { x = -0.34, y = -5.97, z = -0.57, h = 357.23, width = 2.0 }, + stash = { + maxweight = 200000, + slots = 50, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Franklin/Badevaerelse.webp", + label = "Badeværelse", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Franklin/Spisestue.webp", + label = "Spisestue", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Franklin/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Franklin/Kokken.webp", + label = "Køkken", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Franklin/Stue.webp", + label = "Stue", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Franklin/Rum1.webp", + label = "Rum 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Franklin/Rum2.webp", + label = "Rum 2", + }, + }, + }, + ["House 2"] = { + label = "Hus 2", + hash = `shell_ranch`, + doorOffset = { x = -1.23, y = -5.54, z = -1.1, h = 272.21, width = 2.0 }, + stash = { + maxweight = 500000, + slots = 50, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Ranch/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Ranch/Gang.webp", + label = "Gang", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Ranch/Kokken.webp", + label = "Køkken", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Ranch/Stue.webp", + label = "Stue", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Ranch/Rum.webp", + label = "Rum", + }, + }, + }, + ["House 3"] = { + label = "Hus 3", + hash = `shell_lester`, + doorOffset = { x = -1.61, y = -6.02, z = -0.37, h = 357.7, width = 2.0 }, + stash = { + maxweight = 15000, + slots = 20, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Lester/V1.jpg", + label = "Vinkel 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Lester/V2.jpg", + label = "Vinkel 2", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Lester/Entre.jpg", + label = "Entré", + }, + }, + }, + ["House 4"] = { + label = "Hus 4", + hash = `shell_trevor`, + doorOffset = { x = 0.2, y = -3.82, z = -0.41, h = 358.4, width = 2.0 }, + stash = { + maxweight = 10000, + slots = 12, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trevor/Badevaerelse.webp", + label = "Badeværelse", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trevor/Entre.webp", + label = "Entré", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trevor/Kokken.webp", + label = "Køkken", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trevor/Stue.webp", + label = "Stue", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trevor/Rum1.webp", + label = "Rum 1", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trevor/Rum2.webp", + label = "Rum 2", + }, + }, + }, + ["Trailer"] = { + label = "Trailer", + hash = `shell_trailer`, + doorOffset = { x = -1.27, y = -2.08, z = -0.48, h = 358.84, width = 2.0 }, + stash = { + maxweight = 10000, + slots = 12, + }, + imgs = { + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trailer/Entrekokken.webp", + label = "Entré og køkken", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trailer/Stue.webp", + label = "Stue", + }, + { + url = "https://git.thnght.pro/Hyperion/Public/raw/branch/main/billeder/housing/Trailer/Rum1.webp", + label = "Rum", + }, + }, + }, +} + + +Config.FurnitureTypes = { + ["storage"] = function(entity, property_id, shell, furniture, count) + local stash = string.format("property_%s", property_id) -- if you changed this you will fuck things up + + Framework[Config.Target].AddTargetEntity(entity, "Opbevaring", "fas fa-box-open", function() + local stashConfig = Config.Shells[shell].stash + Framework[Config.Inventory].OpenInventory(stash, stashConfig) + end) + + local property = Property.Get(property_id) + property.storageTarget = entity + end, + + ["clothing"] = function(entity, property_id, shell, furniture, count) + Framework[Config.Target].AddTargetEntity(entity, "Tøj", "fas fa-shirt", function() + local heading = GetEntityHeading(cache.ped) + SetEntityHeading(cache.ped, heading - 180.0) + TriggerEvent("qb-clothing:client:openOutfitMenu") + end) + + local property = Property.Get(property_id) + property.clothingTarget = entity + end +} + +Config.Furnitures = { + { + category = "Nødvendigheder", + items = { + { ["object"] = "v_res_tre_storagebox", ["price"] = 0, ["label"] = "Opbevaring", ["type"] = "storage", ["max"] = 1 }, + { ["object"] = "v_res_tre_wardrobe", ["price"] = 0, ["label"] = "Tøjskab", ["type"] = "clothing", ["max"] = 1 }, + } + }, + + { + category = "Sofaer", + items = { + { ["object"] = "miss_rub_couch_01", ["price"] = 300, ["label"] = "Gammel sofe" }, + { ["object"] = "prop_fib_3b_bench", ["price"] = 700, ["label"] = "Trepersoners sofa" }, + { ["object"] = "prop_ld_farm_chair01", ["price"] = 250, ["label"] = "Gammel stol" }, + { ["object"] = "prop_ld_farm_couch01", ["price"] = 300, ["label"] = "Gammel træsæde sofa" }, + { ["object"] = "prop_ld_farm_couch02", ["price"] = 300, ["label"] = "Gammel stribet sofa" }, + { ["object"] = "v_res_d_armchair", ["price"] = 300, ["label"] = "Gammel 1 sæde sofa Gul" }, + { ["object"] = "v_res_fh_sofa", ["price"] = 3700, ["label"] = "Hjørnesofa" }, + { ["object"] = "v_res_mp_sofa", ["price"] = 3700, ["label"] = "Hjørnesofa 2" }, + { ["object"] = "v_res_d_sofa", ["price"] = 700, ["label"] = "Sofa 1" }, + { ["object"] = "v_res_j_sofa", ["price"] = 700, ["label"] = "Sofa 2" }, + { ["object"] = "v_res_mp_stripchair", ["price"] = 700, ["label"] = "Sofa 3" }, + { ["object"] = "v_res_m_h_sofa_sml", ["price"] = 700, ["label"] = "Sofa 4" }, + { ["object"] = "v_res_r_sofa", ["price"] = 700, ["label"] = "Sofa 5" }, + { ["object"] = "v_res_tre_sofa", ["price"] = 700, ["label"] = "Sofa 6" }, + { ["object"] = "v_res_tre_sofa_mess_a", ["price"] = 700, ["label"] = "Sofa 7" }, + { ["object"] = "v_res_tre_sofa_mess_b", ["price"] = 700, ["label"] = "Sofa 8" }, + { ["object"] = "v_res_tre_sofa_mess_c", ["price"] = 700, ["label"] = "Sofa 9" }, + { ["object"] = "v_res_tt_sofa", ["price"] = 700, ["label"] = "Sofa 10" }, + { ["object"] = "prop_rub_couch02", ["price"] = 700, ["label"] = "Sofa 11" }, + { ["object"] = "v_ilev_m_sofa", ["price"] = 2000, ["label"] = "Hvid Sofa" }, + { ["object"] = "v_med_p_sofa", ["price"] = 1000, ["label"] = "Læder Sofa Brun" }, + { ["object"] = "v_club_officesofa", ["price"] = 500, ["label"] = "Fattigmands Sofa Rød" }, + { ["object"] = "bkr_prop_clubhouse_sofa_01a", ["price"] = 1000, ["label"] = "Sort Sofa" }, + { ["object"] = "apa_mp_h_stn_sofacorn_01", ["price"] = 5000, ["label"] = "Hjørnesofa 3" }, + { ["object"] = "prop_couch_lg_02", ["price"] = 1000, ["label"] = "Sofa Træ" }, + { ["object"] = "apa_mp_h_stn_sofacorn_10", ["price"] = 5000, ["label"] = "Hjørnesofa 4" }, + { ["object"] = "apa_mp_h_yacht_sofa_02", ["price"] = 1000, ["label"] = "Brun Sofa" }, + { ["object"] = "apa_mp_h_yacht_sofa_01", ["price"] = 5000, ["label"] = "Hvid Lang Sofa" }, + { ["object"] = "prop_couch_01", ["price"] = 1000, ["label"] = "Sofapuder" }, + { ["object"] = "prop_couch_03", ["price"] = 1000, ["label"] = "Sofa Gul" }, + { ["object"] = "prop_couch_04", ["price"] = 1000, ["label"] = "Lædersofapuder" }, + { ["object"] = "prop_couch_lg_05", ["price"] = 500, ["label"] = "Sofa cordfløjel" }, + { ["object"] = "prop_couch_lg_06", ["price"] = 1000, ["label"] = "Lædersofa brun 2" }, + { ["object"] = "prop_couch_lg_07", ["price"] = 1000, ["label"] = "Sofapuder 2" }, + { ["object"] = "prop_couch_lg_08", ["price"] = 1000, ["label"] = "Lædersofa brun 3" }, + { ["object"] = "prop_couch_sm1_07", ["price"] = 500, ["label"] = "Lædersofa hjørne" }, + { ["object"] = "prop_couch_sm2_07", ["price"] = 500, ["label"] = "Lædersofa lige" }, + { ["object"] = "prop_couch_sm_06", ["price"] = 500, ["label"] = "Lædersofa lille" }, + { ["object"] = "apa_mp_h_stn_sofa2seat_02", ["price"] = 1000, ["label"] = "Kærlighedssæde" }, + { ["object"] = "apa_mp_h_stn_sofacorn_05", ["price"] = 5000, ["label"] = "Hjørnesofa 5" }, + { ["object"] = "apa_mp_h_stn_sofacorn_06", ["price"] = 5000, ["label"] = "Hjørnesofa 6" }, + { ["object"] = "apa_mp_h_stn_sofacorn_07", ["price"] = 5000, ["label"] = "Hjørnesofa 7" }, + { ["object"] = "apa_mp_h_stn_sofacorn_08", ["price"] = 5000, ["label"] = "Hjørnesofa 8" }, + { ["object"] = "apa_mp_h_stn_sofacorn_09", ["price"] = 5000, ["label"] = "Hjørnesofa 9" }, + { ["object"] = "ex_mp_h_off_sofa_003", ["price"] = 1000, ["label"] = "Sofa blåt stof" }, + { ["object"] = "ex_mp_h_off_sofa_01", ["price"] = 1000, ["label"] = "Sofa hvid læder" }, + { ["object"] = "ex_mp_h_off_sofa_02", ["price"] = 1000, ["label"] = "Sofa sort læder" }, + { ["object"] = "hei_heist_stn_sofa2seat_03", ["price"] = 1000, ["label"] = "Moderne sofa" }, + { ["object"] = "hei_heist_stn_sofa2seat_06", ["price"] = 1000, ["label"] = "Brun sofa" }, + { ["object"] = "hei_heist_stn_sofa3seat_01", ["price"] = 1000, ["label"] = "Chaiselongue" }, + { ["object"] = "hei_heist_stn_sofa3seat_02", ["price"] = 1000, ["label"] = "Moderne sofa 2" }, + { ["object"] = "hei_heist_stn_sofa3seat_06", ["price"] = 1000, ["label"] = "Moderne sofa 3" }, + { ["object"] = "imp_prop_impexp_sofabed_01a", ["price"] = 1000, ["label"] = "Sovesofa" }, + { ["object"] = "prop_t_sofa_02", ["price"] = 1000, ["label"] = "Sovesofa 2" }, + } + }, + + { + category = "Stole", + items = { + { ["object"] = "v_res_d_highchair", ["price"] = 700, ["label"] = "Høj stol" }, + { ["object"] = "apa_mp_h_stn_chairstrip_03", ["price"] = 500, ["label"] = "Stol 4" }, + { ["object"] = "v_res_fa_chair01", ["price"] = 700, ["label"] = "Stol" }, + { ["object"] = "v_res_fa_chair02", ["price"] = 700, ["label"] = "Stol 2" }, + { ["object"] = "v_res_fh_barcchair", ["price"] = 700, ["label"] = "Høj stol 2" }, + { ["object"] = "v_res_fh_dineeamesa", ["price"] = 700, ["label"] = "Køkkenstol 1" }, + { ["object"] = "v_res_fh_dineeamesb", ["price"] = 700, ["label"] = "Køkkenstol 2" }, + { ["object"] = "v_res_fh_dineeamesc", ["price"] = 700, ["label"] = "Køkkenstol 3" }, + { ["object"] = "v_res_fh_easychair", ["price"] = 700, ["label"] = "Stol 3" }, + { ["object"] = "v_res_fh_kitnstool", ["price"] = 700, ["label"] = "Stol 4" }, + { ["object"] = "v_res_fh_singleseat", ["price"] = 700, ["label"] = "Høj stol 3" }, + { ["object"] = "v_res_jarmchair", ["price"] = 700, ["label"] = "Lænestol" }, + { ["object"] = "v_res_j_dinechair", ["price"] = 700, ["label"] = "Køkkenstol 4" }, + { ["object"] = "v_res_j_stool", ["price"] = 700, ["label"] = "Stol 5" }, + { ["object"] = "v_res_mbchair", ["price"] = 700, ["label"] = "MB Stol" }, + { ["object"] = "v_res_m_armchair", ["price"] = 700, ["label"] = "Lænestol 2" }, + { ["object"] = "v_res_m_dinechair", ["price"] = 700, ["label"] = "Køkkenstol 5" }, + { ["object"] = "v_res_study_chair", ["price"] = 700, ["label"] = "Studie Stol" }, + { ["object"] = "v_res_trev_framechair", ["price"] = 700, ["label"] = "Stolramme" }, + { ["object"] = "v_res_tre_chair", ["price"] = 700, ["label"] = "Stol 5" }, + { ["object"] = "v_res_tre_officechair", ["price"] = 700, ["label"] = "Kontorstol" }, + { ["object"] = "v_res_tre_stool", ["price"] = 700, ["label"] = "Stol 6" }, + { ["object"] = "v_res_tre_stool_leather", ["price"] = 700, ["label"] = "Læderstol" }, + { ["object"] = "v_res_tre_stool_scuz", ["price"] = 700, ["label"] = "Stol Scuz" }, + { ["object"] = "v_med_p_deskchair", ["price"] = 700, ["label"] = "Skrivebordsstol" }, + { ["object"] = "v_med_p_easychair", ["price"] = 700, ["label"] = "Lænestol" }, + { ["object"] = "v_med_whickerchair1", ["price"] = 700, ["label"] = "Ratanchair" }, + { ["object"] = "prop_direct_chair_01", ["price"] = 700, ["label"] = "Direkte Stol" }, + { ["object"] = "prop_direct_chair_02", ["price"] = 700, ["label"] = "Direkte Stol 2" }, + { ["object"] = "prop_yacht_lounger", ["price"] = 700, ["label"] = "Yacht Stol 1" }, + { ["object"] = "prop_yacht_seat_01", ["price"] = 700, ["label"] = "Yacht Stol 2" }, + { ["object"] = "prop_yacht_seat_02", ["price"] = 700, ["label"] = "Yacht Stol 3" }, + { ["object"] = "prop_yacht_seat_03", ["price"] = 700, ["label"] = "Yacht Stol 4" }, + { ["object"] = "v_ret_chair_white", ["price"] = 100, ["label"] = "Hvid Stol" }, + { ["object"] = "v_ret_chair", ["price"] = 100, ["label"] = "Stol 7" }, + { ["object"] = "v_ret_ta_stool", ["price"] = 100, ["label"] = "TA Stol" }, + { ["object"] = "prop_cs_office_chair", ["price"] = 100, ["label"] = "Kontorstol 2" }, + { ["object"] = "apa_mp_h_yacht_armchair_01", ["price"] = 1000, ["label"] = "Hvid lænestol" }, + { ["object"] = "v_club_barchair", ["price"] = 300, ["label"] = "Stol 8" }, + { ["object"] = "prop_off_chair_04", ["price"] = 300, ["label"] = "Skrivebordsstol 2" }, + { ["object"] = "v_club_stagechair", ["price"] = 500, ["label"] = "Roze Fauteuil" }, + { ["object"] = "v_club_officechair", ["price"] = 500, ["label"] = "Skrivebordsstol 3" }, + { ["object"] = "prop_armchair_01", ["price"] = 500, ["label"] = "Sidde stol" }, + { ["object"] = "prop_bar_stool_01", ["price"] = 300, ["label"] = "Barstol" }, + { ["object"] = "apa_mp_h_yacht_stool_01", ["price"] = 300, ["label"] = "Hvid puf" }, + { ["object"] = "apa_mp_h_stn_chairarm_12", ["price"] = 500, ["label"] = "Stol 3" }, + { ["object"] = "apa_mp_h_stn_chairstool_12", ["price"] = 300, ["label"] = "Fodstøtte" }, + { ["object"] = "prop_chair_03", ["price"] = 100, ["label"] = "Træstol" }, + { ["object"] = "prop_couch_sm_05", ["price"] = 500, ["label"] = "Fløjlsstol" }, + { ["object"] = "prop_couch_sm_07", ["price"] = 300, ["label"] = "Hvid armstol 2" }, + { ["object"] = "prop_couch_sm_02", ["price"] = 300, ["label"] = "Orange armstol" }, + { ["object"] = "apa_mp_h_stn_sofa_daybed_01", ["price"] = 500, ["label"] = "Lounge stol" }, + { ["object"] = "apa_mp_h_stn_sofa_daybed_02", ["price"] = 500, ["label"] = "Lounge stol 2" }, + { ["object"] = "apa_mp_h_din_chair_04", ["price"] = 500, ["label"] = "Moderne stol" }, + { ["object"] = "apa_mp_h_din_chair_08", ["price"] = 500, ["label"] = "Moderne stol 2" }, + { ["object"] = "apa_mp_h_din_chair_09", ["price"] = 500, ["label"] = "Moderne stol 3" }, + { ["object"] = "apa_mp_h_din_chair_12", ["price"] = 500, ["label"] = "Moderne stol 4" }, + { ["object"] = "apa_mp_h_din_stool_04", ["price"] = 500, ["label"] = "Moderne stol 5" }, + { ["object"] = "apa_mp_h_stn_chairarm_01", ["price"] = 500, ["label"] = "Moderne stol 6" }, + { ["object"] = "apa_mp_h_stn_chairarm_02", ["price"] = 500, ["label"] = "Moderne stol 7" }, + { ["object"] = "apa_mp_h_stn_chairarm_03", ["price"] = 500, ["label"] = "Moderne stol 8" }, + { ["object"] = "apa_mp_h_stn_chairarm_09", ["price"] = 500, ["label"] = "Moderne stol 9" }, + { ["object"] = "apa_mp_h_stn_chairarm_11", ["price"] = 500, ["label"] = "Moderne stol 10" }, + { ["object"] = "apa_mp_h_stn_chairarm_13", ["price"] = 500, ["label"] = "Moderne stol 11" }, + { ["object"] = "apa_mp_h_stn_chairarm_24", ["price"] = 500, ["label"] = "Moderne stol 12" }, + { ["object"] = "apa_mp_h_stn_chairarm_25", ["price"] = 500, ["label"] = "Moderne stol 13" }, + { ["object"] = "apa_mp_h_stn_chairarm_26", ["price"] = 500, ["label"] = "Moderne stol 14" }, + { ["object"] = "apa_mp_h_stn_chairstrip_04", ["price"] = 500, ["label"] = "Moderne stol 15" }, + { ["object"] = "apa_mp_h_stn_chairstrip_05", ["price"] = 500, ["label"] = "Moderne stol 16" }, + { ["object"] = "apa_mp_h_stn_chairstrip_08", ["price"] = 500, ["label"] = "Moderne stol 17" }, + { ["object"] = "apa_mp_h_stn_foot_stool_01", ["price"] = 500, ["label"] = "Puf" }, + { ["object"] = "apa_mp_h_stn_foot_stool_02", ["price"] = 500, ["label"] = "Puf 2" }, + { ["object"] = "apa_mp_h_yacht_barstool_01", ["price"] = 500, ["label"] = "Barstol 2" }, + { ["object"] = "ba_prop_int_glam_stool", ["price"] = 500, ["label"] = "Barstol 3" }, + { ["object"] = "ba_prop_battle_club_chair_01", ["price"] = 500, ["label"] = "Kontorstol" }, + { ["object"] = "ba_prop_battle_club_chair_02", ["price"] = 500, ["label"] = "Kontorstol 2" }, + { ["object"] = "ba_prop_battle_club_chair_03", ["price"] = 500, ["label"] = "Kontorstol 3" }, + { ["object"] = "ba_prop_battle_control_seat", ["price"] = 500, ["label"] = "Gamingstol" }, + } + }, + + { + category = "Opbevaring", + items = { + { ["object"] = "v_res_cabinet", ["price"] = 2500, ["label"] = "Stort skab" }, + { ["object"] = "v_res_d_dressingtable", ["price"] = 2500, ["label"] = "Toiletbord" }, + { ["object"] = "v_res_d_sideunit", ["price"] = 2500, ["label"] = "Sideenhed" }, + { ["object"] = "v_res_fh_sidebrddine", ["price"] = 2500, ["label"] = "Sideenhed" }, + { ["object"] = "v_res_fh_sidebrdlngb", ["price"] = 2500, ["label"] = "Sideenhed" }, + { ["object"] = "v_res_mbbedtable", ["price"] = 2500, ["label"] = "Sengeenhed" }, + { ["object"] = "v_res_j_tvstand", ["price"] = 2500, ["label"] = "Tv-enhed" }, + { ["object"] = "v_res_mbdresser", ["price"] = 2500, ["label"] = "Kommodeenhed" }, + { ["object"] = "v_res_mbottoman", ["price"] = 2500, ["label"] = "Pufenhed" }, + { ["object"] = "v_res_mconsolemod", ["price"] = 2500, ["label"] = "Konsolenhed" }, + { ["object"] = "v_res_mcupboard", ["price"] = 2500, ["label"] = "Skabenhed" }, + { ["object"] = "v_res_mdchest", ["price"] = 2500, ["label"] = "Kisteenhed" }, + { ["object"] = "v_res_msoncabinet", ["price"] = 2500, ["label"] = "Skab med skuffer" }, + { ["object"] = "v_res_m_armoire", ["price"] = 2500, ["label"] = "Garderobeenhed" }, + { ["object"] = "v_res_m_sidetable", ["price"] = 2500, ["label"] = "Sideenhed" }, + { ["object"] = "v_res_son_desk", ["price"] = 2500, ["label"] = "Skrivebordsenhed" }, + { ["object"] = "v_res_tre_bedsidetable", ["price"] = 2500, ["label"] = "Sideenhed" }, + { ["object"] = "v_res_tre_bedsidetableb", ["price"] = 2500, ["label"] = "Sideenhed 2" }, + { ["object"] = "v_res_tre_smallbookshelf", ["price"] = 2500, ["label"] = "Bogreol" }, + { ["object"] = "v_res_tre_storageunit", ["price"] = 2500, ["label"] = "Opbevaringsenhed" }, + { ["object"] = "v_res_tre_wardrobe", ["price"] = 2500, ["label"] = "Garderobeenhed" }, + { ["object"] = "v_res_tre_wdunitscuz", ["price"] = 2500, ["label"] = "Træenhed" }, + { ["object"] = "prop_devin_box_closed", ["price"] = 100, ["label"] = "Sækkestol 1" }, + { ["object"] = "prop_mil_crate_01", ["price"] = 100, ["label"] = "Militær kasse 1" }, + { ["object"] = "prop_mil_crate_02", ["price"] = 100, ["label"] = "Militær kasse 2" }, + { ["object"] = "prop_ld_int_safe_01", ["price"] = 1100, ["label"] = "Sikkerhedsboks" }, + { ["object"] = "prop_toolchest_05", ["price"] = 5000, ["label"] = "Værktøjsbænk" }, + { ["object"] = "v_corp_filecablow", ["price"] = 500, ["label"] = "Arkivskab lavt" }, + { ["object"] = "v_corp_filecabtall", ["price"] = 500, ["label"] = "Arkivskab højt" }, + { ["object"] = "apa_mp_h_str_shelffloorm_02", ["price"] = 500, ["label"] = "Stort moderne skab" }, + { ["object"] = "v_ilev_frnkwarddr1", ["price"] = 500, ["label"] = "Skab Franklin" }, + { ["object"] = "prop_coathook_01", ["price"] = 100, ["label"] = "Frakkestativ" }, + { ["object"] = "v_corp_lowcabdark01", ["price"] = 500, ["label"] = "Arkivskab lavt sort" }, + { ["object"] = "v_corp_tallcabdark01", ["price"] = 500, ["label"] = "Arkivskab højt sort" }, + { ["object"] = "v_corp_cabshelves01", ["price"] = 1000, ["label"] = "Arkivskab sort" }, + { ["object"] = "v_corp_offshelf", ["price"] = 1000, ["label"] = "Arkivskab stort" }, + { ["object"] = "v_61_lng_mesh_unitc", ["price"] = 500, ["label"] = "Bogskab hvidt" }, + { ["object"] = "ba_wardrobe", ["price"] = 500, ["label"] = "Garderobeskab" }, + { ["object"] = "apa_mp_h_str_sideboardl_06", ["price"] = 750, ["label"] = "Skab moderne" }, + { ["object"] = "apa_mp_h_str_sideboardl_09", ["price"] = 750, ["label"] = "Skab moderne 2" }, + { ["object"] = "apa_mp_h_str_shelfwallm_01", ["price"] = 750, ["label"] = "Bogskab 2" }, + { ["object"] = "apa_mp_h_str_sideboardl_11", ["price"] = 750, ["label"] = "Skab moderne 3" }, + { ["object"] = "imp_prop_impexp_parts_rack_03a", ["price"] = 750, ["label"] = "Bilreservedele" }, + { ["object"] = "imp_prop_impexp_parts_rack_04a", ["price"] = 750, ["label"] = "Bilreservedele 2" }, + { ["object"] = "imp_prop_impexp_parts_rack_05a", ["price"] = 750, ["label"] = "Bilreservedele 3" }, + { ["object"] = "apa_mp_h_bed_chestdrawer_02", ["price"] = 750, ["label"] = "Skuffeskab" }, + { ["object"] = "hei_heist_bed_chestdrawer_04", ["price"] = 750, ["label"] = "Skuffeskab 2" }, + { ["object"] = "prop_rub_cabinet", ["price"] = 50, ["label"] = "Rustet arkivskab" }, + { ["object"] = "prop_tv_cabinet_03", ["price"] = 750, ["label"] = "TV lille skab" }, + { ["object"] = "prop_tv_cabinet_04", ["price"] = 750, ["label"] = "TV lille skab 2" }, + { ["object"] = "prop_tv_cabinet_05", ["price"] = 750, ["label"] = "TV lille skab 3" }, + { ["object"] = "apa_mp_h_str_shelffreel_01", ["price"] = 750, ["label"] = "IKEA skab" }, + { ["object"] = "apa_mp_h_str_sideboardl_13", ["price"] = 750, ["label"] = "Skab moderne 4" }, + { ["object"] = "apa_mp_h_str_sideboardl_14", ["price"] = 750, ["label"] = "Skab moderne 5" }, + { ["object"] = "apa_mp_h_str_sideboardm_02", ["price"] = 750, ["label"] = "Skab moderne 6" }, + { ["object"] = "bkr_prop_biker_garage_locker_01", ["price"] = 750, ["label"] = "Biker Skab" }, + { ["object"] = "gr_prop_gr_bench_04b", ["price"] = 750, ["label"] = "Biker Bænk" }, + } + }, + + { + category = "Elektronik", + items = { + { ["object"] = "prop_trailr_fridge", ["price"] = 300, ["label"] = "Gammel Køleskab" }, + { ["object"] = "v_res_fh_speaker", ["price"] = 300, ["label"] = "Højttaler" }, + { ["object"] = "v_res_fh_speakerdock", ["price"] = 300, ["label"] = "Højttaler Dock" }, + { ["object"] = "v_res_fh_bedsideclock", ["price"] = 300, ["label"] = "Natbord Ur" }, + { ["object"] = "v_res_fa_phone", ["price"] = 300, ["label"] = "Telefon" }, + { ["object"] = "v_res_fh_towerfan", ["price"] = 300, ["label"] = "Tårnventilator" }, + { ["object"] = "v_res_fa_fan", ["price"] = 300, ["label"] = "Ventilator" }, + { ["object"] = "v_res_lest_bigscreen", ["price"] = 300, ["label"] = "Storskærm" }, + { ["object"] = "v_res_lest_monitor", ["price"] = 300, ["label"] = "Skærm" }, + { ["object"] = "v_res_tre_mixer", ["price"] = 300, ["label"] = "Mixer" }, + { ["object"] = "prop_cs_cctv", ["price"] = 100, ["label"] = "Overvågningskamera" }, + { ["object"] = "prop_ld_lap_top", ["price"] = 100, ["label"] = "Bærbar computer" }, + { ["object"] = "prop_ld_monitor_01", ["price"] = 100, ["label"] = "Monitor" }, + { ["object"] = "prop_speaker_05", ["price"] = 500, ["label"] = "Monteret højttaler" }, + { ["object"] = "prop_tv_flat_03b", ["price"] = 1000, ["label"] = "Lille fladskærm" }, + { ["object"] = "prop_laptop_01a", ["price"] = 750, ["label"] = "Åben bærbar computer" }, + { ["object"] = "prop_tv_flat_michael", ["price"] = 3000, ["label"] = "Fladskærm hængende" }, + { ["object"] = "prop_dyn_pc", ["price"] = 1000, ["label"] = "PC" }, + { ["object"] = "prop_keyboard_01b", ["price"] = 100, ["label"] = "Tastatur" }, + { ["object"] = "prop_mouse_01b", ["price"] = 100, ["label"] = "Computermus" }, + { ["object"] = "v_ret_gc_phone", ["price"] = 100, ["label"] = "Kontor telefon" }, + { ["object"] = "prop_tv_flat_01", ["price"] = 5000, ["label"] = "Stor fladskærm" }, + { ["object"] = "prop_arcade_01", ["price"] = 5000, ["label"] = "Arkade" }, + { ["object"] = "prop_console_01", ["price"] = 250, ["label"] = "Spillekonsol" }, + { ["object"] = "v_res_tre_dvdplayer", ["price"] = 250, ["label"] = "DVD-afspiller" }, + { ["object"] = "prop_speaker_08", ["price"] = 500, ["label"] = "Træ højttaler" }, + { ["object"] = "prop_cctv_mon_02", ["price"] = 300, ["label"] = "CCTV skærm" }, + { ["object"] = "prop_tv_flat_02", ["price"] = 2500, ["label"] = "Fladskærms TV Stående" }, + { ["object"] = "prop_cctv_cam_01a", ["price"] = 300, ["label"] = "CCTV 2" }, + { ["object"] = "prop_dest_cctv_02", ["price"] = 300, ["label"] = "CCTV skærm 2" }, + { ["object"] = "prop_cctv_cam_07a", ["price"] = 300, ["label"] = "CCTV 3" }, + { ["object"] = "apa_mp_h_str_avunits_04", ["price"] = 5500, ["label"] = "Fladskærms møbel" }, + { ["object"] = "apa_mp_h_str_avunits_01", ["price"] = 5500, ["label"] = "Fladskærms møbel 2" }, + { ["object"] = "v_club_vu_deckcase", ["price"] = 1000, ["label"] = "DJ udstyr" }, + { ["object"] = "v_corp_servercln", ["price"] = 1000, ["label"] = "Server skab" }, + { ["object"] = "apa_mp_h_str_avunitl_01_b", ["price"] = 5500, ["label"] = "Fladskærms møbel 3" }, + { ["object"] = "apa_mp_h_str_avunitl_04", ["price"] = 5500, ["label"] = "Fladskærms møbel 4" }, + { ["object"] = "apa_mp_h_str_avunitm_01", ["price"] = 5500, ["label"] = "Fladskærms møbel 5" }, + { ["object"] = "apa_mp_h_str_avunitm_03", ["price"] = 5500, ["label"] = "Fladskærms møbel 6" }, + { ["object"] = "apa_mp_h_str_avunits_04", ["price"] = 5500, ["label"] = "Fladskærms møbel 7" }, + { ["object"] = "v_res_printer", ["price"] = 300, ["label"] = "Printer" }, + { ["object"] = "apa_mp_h_acc_phone_01", ["price"] = 100, ["label"] = "Gammeldags telefon" }, + { ["object"] = "v_res_mousemat", ["price"] = 300, ["label"] = "Musemåtte" }, + { ["object"] = "v_res_pcheadset", ["price"] = 300, ["label"] = "Headset" }, + { ["object"] = "v_res_pcspeaker", ["price"] = 300, ["label"] = "PC højttaler" }, + { ["object"] = "ba_prop_battle_club_speaker_small", ["price"] = 500, ["label"] = "Lille højttaler" }, + { ["object"] = "ba_prop_battle_club_speaker_med", ["price"] = 750, ["label"] = "Højttaler" }, + { ["object"] = "ba_prop_battle_club_speaker_large", ["price"] = 1000, ["label"] = "Stor højttaler" }, + { ["object"] = "v_res_pcspeaker", ["price"] = 300, ["label"] = "PC højttaler" }, + { ["object"] = "v_res_pcwoofer", ["price"] = 300, ["label"] = "PC subwoofer" }, + { ["object"] = "prop_controller_01", ["price"] = 300, ["label"] = "Controller" }, + { ["object"] = "prop_cs_remote_01", ["price"] = 300, ["label"] = "Fjernbetjening" }, + { ["object"] = "prop_portable_hifi_01", ["price"] = 300, ["label"] = "Radio" }, + { ["object"] = "prop_dj_deck_02", ["price"] = 300, ["label"] = "DJ bord" }, + { ["object"] = "prop_speaker_01", ["price"] = 300, ["label"] = "Højttaler" }, + } + }, + + { + category = "Senge", + items = { + { ["object"] = "v_res_d_bed", ["price"] = 700, ["label"] = "Seng 1" }, + { ["object"] = "v_res_lestersbed", ["price"] = 700, ["label"] = "Seng 2" }, + { ["object"] = "v_res_mbbed", ["price"] = 700, ["label"] = "MB Seng" }, + { ["object"] = "v_res_mdbed", ["price"] = 700, ["label"] = "MD Seng" }, + { ["object"] = "v_res_msonbed", ["price"] = 700, ["label"] = "Seng 3" }, + { ["object"] = "v_res_tre_bed1", ["price"] = 700, ["label"] = "Seng 4" }, + { ["object"] = "v_res_tre_bed2", ["price"] = 700, ["label"] = "T Seng" }, + { ["object"] = "v_res_tt_bed", ["price"] = 700, ["label"] = "TT Seng" }, + { ["object"] = "apa_mp_h_bed_with_table_02", ["price"] = 5000, ["label"] = "Luksus seng" }, + { ["object"] = "apa_mp_h_bed_wide_05", ["price"] = 5000, ["label"] = "Rød seng" }, + { ["object"] = "apa_mp_h_bed_double_08", ["price"] = 3000, ["label"] = "Firkantet seng" }, + { ["object"] = "apa_mp_h_bed_double_09", ["price"] = 3000, ["label"] = "Moderne seng" }, + { ["object"] = "apa_mp_h_yacht_bed_01", ["price"] = 5000, ["label"] = "California king" }, + { ["object"] = "apa_mp_h_yacht_bed_02", ["price"] = 5000, ["label"] = "California king 2" }, + { ["object"] = "bkr_prop_biker_campbed_01", ["price"] = 100, ["label"] = "Lejr seng" }, + { ["object"] = "ex_prop_exec_bed_01", ["price"] = 700, ["label"] = "Lille seng" }, + { ["object"] = "gr_prop_bunker_bed_01", ["price"] = 700, ["label"] = "Lille seng 2" }, + { ["object"] = "p_mbbed_s", ["price"] = 700, ["label"] = "Seng 5" }, + } + }, + + { + category = "Belysning", + items = { + { ["object"] = "v_corp_cd_desklamp", ["price"] = 100, ["label"] = "Skrivebordslampe Corp" }, + { ["object"] = "v_res_desklamp", ["price"] = 100, ["label"] = "Skrivebordslampe" }, + { ["object"] = "v_res_d_lampa", ["price"] = 100, ["label"] = "Lampe AA" }, + { ["object"] = "v_res_fa_lamp1on", ["price"] = 100, ["label"] = "Lampe 1" }, + { ["object"] = "v_res_fh_floorlamp", ["price"] = 100, ["label"] = "Standerlampe" }, + { ["object"] = "v_res_fh_lampa_on", ["price"] = 100, ["label"] = "Lampe 2" }, + { ["object"] = "v_res_j_tablelamp1", ["price"] = 100, ["label"] = "Bordlampe" }, + { ["object"] = "v_res_j_tablelamp2", ["price"] = 100, ["label"] = "Bordlampe 2" }, + { ["object"] = "v_res_mdbedlamp", ["price"] = 100, ["label"] = "Sengelampe" }, + { ["object"] = "v_res_mplanttongue", ["price"] = 100, ["label"] = "Plante Tungelampe" }, + { ["object"] = "v_res_mtblelampmod", ["price"] = 100, ["label"] = "Bordlampe 3" }, + { ["object"] = "v_res_m_lampstand", ["price"] = 100, ["label"] = "Lampestander" }, + { ["object"] = "v_res_m_lampstand2", ["price"] = 100, ["label"] = "Lampestander 2" }, + { ["object"] = "v_res_m_lamptbl", ["price"] = 100, ["label"] = "Bordlampe 4" }, + { ["object"] = "v_res_tre_lightfan", ["price"] = 100, ["label"] = "Lysvifte" }, + { ["object"] = "v_res_tre_talllamp", ["price"] = 100, ["label"] = "Høj Lampe" }, + { ["object"] = "v_ret_fh_walllighton", ["price"] = 100, ["label"] = "Væglampe" }, + { ["object"] = "v_ret_gc_lamp", ["price"] = 100, ["label"] = "GC Lampe" }, + { ["object"] = "prop_dummy_light", ["price"] = 100, ["label"] = "Flimrende Lys" }, + { ["object"] = "prop_ld_cont_light_01", ["price"] = 100, ["label"] = "Side Væglampe" }, + { ["object"] = "prop_wall_light_07a", ["price"] = 100, ["label"] = "Lygtepæl" }, + { ["object"] = "prop_wall_light_01a", ["price"] = 100, ["label"] = "Billig Lampe" }, + { ["object"] = "v_serv_tu_light2_", ["price"] = 100, ["label"] = "Industriel Lys" }, + { ["object"] = "v_serv_tu_light3_", ["price"] = 100, ["label"] = "Industriel Lys 2" }, + { ["object"] = "ba_prop_battle_lights_ceiling_l_a", ["price"] = 300, ["label"] = "Hængende Lampe" }, + { ["object"] = "v_med_p_floorlamp", ["price"] = 300, ["label"] = "Stor Lampe" }, + { ["object"] = "v_club_vu_lamp", ["price"] = 100, ["label"] = "Lille Lampe" }, + { ["object"] = "ba_prop_battle_lights_wall_l_a", ["price"] = 100, ["label"] = "Væglampe" }, + { ["object"] = "ba_prop_battle_lights_ceiling_l_c", ["price"] = 300, ["label"] = "Hængende Lampe 2" }, + { ["object"] = "ba_prop_battle_lights_ceiling_l_b", ["price"] = 300, ["label"] = "Kronelysekrone 2" }, + { ["object"] = "ba_prop_battle_lights_wall_l_c", ["price"] = 100, ["label"] = "Væglampe 2" }, + { ["object"] = "ba_prop_battle_lights_wall_l_b", ["price"] = 100, ["label"] = "Væglampe 3" }, + { ["object"] = "hei_heist_lit_lightpendant_02", ["price"] = 300, ["label"] = "Hængende Lampe 3" }, + { ["object"] = "prop_oldlight_01b", ["price"] = 100, ["label"] = "Væglampe 4" }, + { ["object"] = "apa_mp_h_lit_floorlampnight_07", ["price"] = 100, ["label"] = "Blå lampe" }, + { ["object"] = "apa_mp_h_ceiling_light_01", ["price"] = 100, ["label"] = "Erhvervslampe" }, + { ["object"] = "apa_mp_h_ceiling_light_01_day", ["price"] = 100, ["label"] = "Erhvervslampe 2" }, + { ["object"] = "apa_mp_h_ceiling_light_02", ["price"] = 100, ["label"] = "Loftslampe" }, + { ["object"] = "apa_mp_h_ceiling_light_02_day", ["price"] = 100, ["label"] = "Loftslampe 2" }, + { ["object"] = "ba_prop_battle_lights_ceiling_l_d", ["price"] = 100, ["label"] = "Erhvervslampe 3" }, + { ["object"] = "ba_prop_battle_lights_ceiling_l_f", ["price"] = 100, ["label"] = "Loftslampe 3" }, + { ["object"] = "ba_prop_battle_lights_ceiling_l_e", ["price"] = 100, ["label"] = "Loftslampe 4" }, + { ["object"] = "apa_mp_h_floorlamp_a", ["price"] = 100, ["label"] = "Standerlampe" }, + { ["object"] = "apa_mp_h_floorlamp_b", ["price"] = 100, ["label"] = "Standerlampe 2" }, + { ["object"] = "apa_mp_h_floorlamp_c", ["price"] = 100, ["label"] = "Standerlampe 3" }, + { ["object"] = "apa_mp_h_floor_lamp_int_08", ["price"] = 100, ["label"] = "Standerlampe 4" }, + { ["object"] = "apa_mp_h_lampbulb_multiple_a", ["price"] = 100, ["label"] = "Loftslampe 5" }, + { ["object"] = "apa_mp_h_lit_floorlamp_02", ["price"] = 100, ["label"] = "Standerlampe 5" }, + { ["object"] = "apa_mp_h_lit_floorlampnight_14", ["price"] = 100, ["label"] = "Standerlampe 6" }, + { ["object"] = "apa_mp_h_lit_floorlamp_03", ["price"] = 100, ["label"] = "Standerlampe 7" }, + { ["object"] = "apa_mp_h_lit_floorlamp_06", ["price"] = 100, ["label"] = "Standerlampe 8" }, + { ["object"] = "apa_mp_h_lit_floorlamp_10", ["price"] = 100, ["label"] = "Standerlampe 9" }, + { ["object"] = "apa_mp_h_lit_floorlamp_13", ["price"] = 100, ["label"] = "Standerlampe 10" }, + { ["object"] = "apa_mp_h_lit_floorlamp_17", ["price"] = 100, ["label"] = "Standerlampe 11" }, + { ["object"] = "apa_mp_h_lit_lamptablenight_16", ["price"] = 100, ["label"] = "Natlampe" }, + { ["object"] = "apa_mp_h_lit_lamptablenight_24", ["price"] = 100, ["label"] = "Natlampe 2" }, + { ["object"] = "apa_mp_h_lit_lamptable_005", ["price"] = 100, ["label"] = "Natlampe 3" }, + { ["object"] = "apa_mp_h_lit_lamptable_04", ["price"] = 100, ["label"] = "Natlampe 4" }, + { ["object"] = "apa_mp_h_lit_lamptable_09", ["price"] = 100, ["label"] = "Natlampe 5" }, + { ["object"] = "apa_mp_h_lit_lamptable_14", ["price"] = 100, ["label"] = "Natlampe 6" }, + { ["object"] = "apa_mp_h_lit_lamptable_17", ["price"] = 100, ["label"] = "Natlampe 7" }, + { ["object"] = "apa_mp_h_yacht_table_lamp_01", ["price"] = 100, ["label"] = "Natlampe 8" }, + }, + }, + + { + category = "Borde", + items = { + { ["object"] = "v_res_d_coffeetable", ["price"] = 500, ["label"] = "Kaffebord 1" }, + { ["object"] = "v_res_d_roundtable", ["price"] = 500, ["label"] = "Rundt Bord" }, + { ["object"] = "v_res_d_smallsidetable", ["price"] = 500, ["label"] = "Lille Sidebord" }, + { ["object"] = "v_res_fh_coftablea", ["price"] = 500, ["label"] = "Bord A" }, + { ["object"] = "v_res_fh_coftableb", ["price"] = 500, ["label"] = "Bord B" }, + { ["object"] = "v_res_fh_coftbldisp", ["price"] = 500, ["label"] = "Bord C" }, + { ["object"] = "v_res_fh_diningtable", ["price"] = 500, ["label"] = "Spisebord" }, + { ["object"] = "v_res_j_coffeetable", ["price"] = 500, ["label"] = "Kaffebord 2" }, + { ["object"] = "v_res_j_lowtable", ["price"] = 500, ["label"] = "Lavt Bord" }, + { ["object"] = "v_res_mdbedtable", ["price"] = 500, ["label"] = "Sengebord" }, + { ["object"] = "v_res_mddesk", ["price"] = 500, ["label"] = "Skrivebord" }, + { ["object"] = "v_res_msidetblemod", ["price"] = 500, ["label"] = "Sidebord" }, + { ["object"] = "v_res_m_console", ["price"] = 500, ["label"] = "Konsolbord" }, + { ["object"] = "v_res_m_dinetble_replace", ["price"] = 500, ["label"] = "Spisebord 2" }, + { ["object"] = "v_res_m_h_console", ["price"] = 500, ["label"] = "Konsolbord H" }, + { ["object"] = "v_res_m_stool", ["price"] = 500, ["label"] = "Bord" }, + { ["object"] = "v_res_tre_sideboard", ["price"] = 500, ["label"] = "Sidebord" }, + { ["object"] = "v_res_tre_table2", ["price"] = 500, ["label"] = "Bord 2" }, + { ["object"] = "v_res_tre_tvstand", ["price"] = 500, ["label"] = "Tv Bord" }, + { ["object"] = "v_res_tre_tvstand_tall", ["price"] = 500, ["label"] = "Tv Bord Høj" }, + { ["object"] = "v_med_p_coffeetable", ["price"] = 500, ["label"] = "Med Kaffebord" }, + { ["object"] = "v_med_p_desk", ["price"] = 500, ["label"] = "Med Skrivebord" }, + { ["object"] = "prop_yacht_table_01", ["price"] = 100, ["label"] = "Yacht Bord 1" }, + { ["object"] = "prop_yacht_table_02", ["price"] = 100, ["label"] = "Yacht Bord 2" }, + { ["object"] = "prop_yacht_table_03", ["price"] = 100, ["label"] = "Yacht Bord 3" }, + { ["object"] = "v_ret_csr_table", ["price"] = 100, ["label"] = "CSR Bord" }, + { ["object"] = "v_res_mconsoletrad", ["price"] = 250, ["label"] = "Højt Sidebord" }, + { ["object"] = "v_ilev_liconftable_sml", ["price"] = 500, ["label"] = "Kontor bord" }, + { ["object"] = "v_ret_tablesml", ["price"] = 350, ["label"] = "Sidebord Marillaux" }, + { ["object"] = "apa_mp_h_yacht_coffee_table_02", ["price"] = 500, ["label"] = "Kaffebord Brun" }, + { ["object"] = "apa_mp_h_yacht_side_table_01", ["price"] = 300, ["label"] = "Sidebord Brun" }, + { ["object"] = "apa_mp_h_yacht_side_table_02", ["price"] = 300, ["label"] = "Rundt Sidebord" }, + { ["object"] = "apa_mp_h_tab_sidelrg_04", ["price"] = 300, ["label"] = "Rundt Sidebord 2" }, + { ["object"] = "v_club_vu_table", ["price"] = 300, ["label"] = "Coveret Bord" }, + { ["object"] = "apa_mp_h_tab_sidelrg_07", ["price"] = 500, ["label"] = "Kaffebord Glas" }, + { ["object"] = "bkr_prop_weed_table_01b", ["price"] = 100, ["label"] = "Klapbord" }, + { ["object"] = "ba_prop_int_trad_table", ["price"] = 300, ["label"] = "Ståbord" }, + { ["object"] = "apa_mp_h_str_sideboards_02", ["price"] = 750, ["label"] = "Sidebord Glas" }, + { ["object"] = "apa_mp_h_yacht_coffee_table_01", ["price"] = 750, ["label"] = "Kaffebord Moderne" }, + { ["object"] = "apa_mp_h_din_table_04", ["price"] = 1000, ["label"] = "Spisebord Glas" }, + { ["object"] = "xm_prop_base_staff_desk_01", ["price"] = 5000, ["label"] = "Skrivebord + Setup" }, + { ["object"] = "apa_mp_h_tab_coffee_07", ["price"] = 1000, ["label"] = "Trekantet Sidebord" }, + { ["object"] = "apa_mp_h_tab_coffee_08", ["price"] = 1000, ["label"] = "Hvidt Sidebord" }, + { ["object"] = "apa_mp_h_tab_sidelrg_01", ["price"] = 1000, ["label"] = "Glas Sidebord" }, + { ["object"] = "apa_mp_h_tab_sidelrg_02", ["price"] = 1000, ["label"] = "Glas Sidebord 2" }, + { ["object"] = "apa_mp_h_tab_sidesml_01", ["price"] = 1000, ["label"] = "Foldebord" }, +{ ["object"] = "ba_prop_int_edgy_table_01", ["price"] = 500, ["label"] = "Marmorbord" }, +{ ["object"] = "ba_prop_int_edgy_table_02", ["price"] = 500, ["label"] = "Højt Marmorbord" }, +{ ["object"] = "apa_mp_h_tab_sidelrg_01", ["price"] = 1000, ["label"] = "Glas Sidebord" }, +{ ["object"] = "xm_prop_lab_desk_01", ["price"] = 1000, ["label"] = "Laboratoriebord" }, + } + }, + + { + category = "Badeværelse", + items = { + { ["object"] = "prop_ld_toilet_01", ["price"] = 100, ["label"] = "Toilet 1" }, + { ["object"] = "prop_toilet_01", ["price"] = 100, ["label"] = "Toilet 2" }, + { ["object"] = "prop_toilet_02", ["price"] = 100, ["label"] = "Toilet 3" }, + { ["object"] = "prop_sink_02", ["price"] = 100, ["label"] = "Håndvask 1" }, + { ["object"] = "prop_sink_04", ["price"] = 100, ["label"] = "Håndvask 2" }, + { ["object"] = "prop_sink_05", ["price"] = 100, ["label"] = "Håndvask 3" }, + { ["object"] = "prop_sink_06", ["price"] = 100, ["label"] = "Håndvask 4" }, + { ["object"] = "prop_soap_disp_01", ["price"] = 100, ["label"] = "Håndsæbe" }, + { ["object"] = "prop_shower_rack_01", ["price"] = 100, ["label"] = "Bruseholder" }, + { ["object"] = "prop_handdry_01", ["price"] = 100, ["label"] = "Håndtører 1" }, + { ["object"] = "prop_handdry_02", ["price"] = 100, ["label"] = "Håndtører 2" }, + { ["object"] = "prop_towel_rail_01", ["price"] = 100, ["label"] = "Håndklædestang 1" }, + { ["object"] = "prop_towel_rail_02", ["price"] = 100, ["label"] = "Håndklædestang 2" }, + { ["object"] = "prop_towel_01", ["price"] = 100, ["label"] = "Håndlæde 1" }, + { ["object"] = "v_res_mbtowel", ["price"] = 100, ["label"] = "Håndlæde 2" }, + { ["object"] = "v_res_mbtowelfld", ["price"] = 100, ["label"] = "Håndlæde 3" }, + { ["object"] = "v_res_mbath", ["price"] = 100, ["label"] = "Bad" }, + { ["object"] = "v_res_mbsink", ["price"] = 100, ["label"] = "Håndvask" }, + { ["object"] = "v_ilev_mm_faucet", ["price"] = 100, ["label"] = "Vandhane" }, + { ["object"] = "v_res_tre_washbasket", ["price"] = 250, ["label"] = "Vasketøjskurv" }, + { ["object"] = "prop_toilet_soap_02", ["price"] = 100, ["label"] = "Sæbe" }, + { ["object"] = "prop_bar_sink_01", ["price"] = 100, ["label"] = "Håndvask" }, + { ["object"] = "apa_mp_h_bathtub_01", ["price"] = 1000, ["label"] = "Bad" }, + { ["object"] = "prop_toilet_brush_01", ["price"] = 1000, ["label"] = "Børste" }, + { ["object"] = "prop_toilet_roll_01", ["price"] = 1000, ["label"] = "Toiletrulle" }, + { ["object"] = "prop_toilet_roll_02", ["price"] = 1000, ["label"] = "Toiletrulle 2" }, + { ["object"] = "prop_toilet_shamp_01", ["price"] = 1000, ["label"] = "Shampoo" }, + { ["object"] = "prop_toilet_shamp_02", ["price"] = 1000, ["label"] = "Shampoo 2" }, + } + }, + + { + category = "Vægdekorationer", + items = { + { ["object"] = "apa_p_h_acc_artwalll_02", ["price"] = 1000, ["label"] = "Maleri" }, + { ["object"] = "v_ind_cs_toolboard", ["price"] = 500, ["label"] = "Værktøj" }, + { ["object"] = "apa_mp_stilts_bed_art", ["price"] = 300, ["label"] = "3D art" }, + { ["object"] = "ex_office_swag_paintings03", ["price"] = 1000, ["label"] = "Malerier" }, + { ["object"] = "ex_mp_h_acc_artwallm_03", ["price"] = 750, ["label"] = "Abstrakt maleri" }, + { ["object"] = "ex_p_h_acc_artwallm_04", ["price"] = 750, ["label"] = "Abstrakt maleri 2" }, + { ["object"] = "ex_p_h_acc_artwalll_01", ["price"] = 1250, ["label"] = "Abstrakt maleri, stort" }, + { ["object"] = "apa_p_h_acc_artwalll_03", ["price"] = 750, ["label"] = "Abstrakt maleri 3" }, + { ["object"] = "ex_mp_h_acc_artwallm_02", ["price"] = 750, ["label"] = "Abstrakt maleri 4" }, + { ["object"] = "ex_p_h_acc_artwallm_03", ["price"] = 750, ["label"] = "Abstrakt maleri 5" }, + { ["object"] = "apa_mp_stilts_a_study_pics", ["price"] = 500, ["label"] = "Maleri" }, + { ["object"] = "apa_mp_h_acc_artwallm_02", ["price"] = 750, ["label"] = "Abstrakt maleri 6" }, + { ["object"] = "apa_mp_h_acc_artwalll_02", ["price"] = 750, ["label"] = "Abstrakt maleri 7" }, + { ["object"] = "apa_mp_h_acc_artwallm_04", ["price"] = 750, ["label"] = "Abstrakt maleri 8" }, + { ["object"] = "prop_dart_bd_cab_01", ["price"] = 250, ["label"] = "Dartskive" }, + { ["object"] = "prop_dart_bd_01", ["price"] = 250, ["label"] = "Dartskive 2" }, + { ["object"] = "hei_heist_acc_artwalll_01", ["price"] = 250, ["label"] = "Væg dekor 1" }, + { ["object"] = "hei_heist_acc_artgolddisc_01", ["price"] = 250, ["label"] = "Væg dekor 2" }, + { ["object"] = "hei_heist_acc_artgolddisc_02", ["price"] = 250, ["label"] = "Væg dekor 3" }, + { ["object"] = "hei_heist_acc_artgolddisc_03", ["price"] = 250, ["label"] = "Væg dekor 4" }, + { ["object"] = "hei_heist_acc_artgolddisc_04", ["price"] = 250, ["label"] = "Væg dekor 5" }, + { ["object"] = "v_ilev_ra_doorsafe", ["price"] = 250, ["label"] = "Luxury dekor" }, + } + }, + + { + category = "Køkken", + items = { + { ["object"] = "prop_washer_01", ["price"] = 150, ["label"] = "Vaskemaskine 1" }, + { ["object"] = "prop_washer_02", ["price"] = 150, ["label"] = "Vaskemaskine 2" }, + { ["object"] = "prop_washer_03", ["price"] = 150, ["label"] = "Vaskemaskine 3" }, + { ["object"] = "prop_washing_basket_01", ["price"] = 150, ["label"] = "Vaskekurv" }, + { ["object"] = "v_res_fridgemoda", ["price"] = 150, ["label"] = "Køleskab 1" }, + { ["object"] = "v_res_fridgemodsml", ["price"] = 150, ["label"] = "Køleskab 2" }, + { ["object"] = "prop_fridge_01", ["price"] = 150, ["label"] = "Køleskab 3" }, + { ["object"] = "prop_fridge_03", ["price"] = 150, ["label"] = "Køleskab 4" }, + { ["object"] = "prop_cooker_03", ["price"] = 150, ["label"] = "Ovn-sæt" }, + { ["object"] = "prop_micro_01", ["price"] = 150, ["label"] = "Mikroovn 1" }, + { ["object"] = "prop_micro_02", ["price"] = 150, ["label"] = "Mikroovn 2" }, + { ["object"] = "prop_wok", ["price"] = 150, ["label"] = "Wok" }, + { ["object"] = "v_res_cakedome", ["price"] = 150, ["label"] = "Kagetallerken" }, + { ["object"] = "v_res_fa_chopbrd", ["price"] = 150, ["label"] = "Skærebrædt" }, + { ["object"] = "v_res_mutensils", ["price"] = 150, ["label"] = "Køkkenredskaber" }, + { ["object"] = "v_res_pestle", ["price"] = 150, ["label"] = "Morter og støder" }, + { ["object"] = "v_ret_ta_paproll", ["price"] = 150, ["label"] = "Papirrulle 1" }, + { ["object"] = "v_ret_ta_paproll2", ["price"] = 150, ["label"] = "Papirrulle 2" }, + { ["object"] = "v_ret_fh_pot01", ["price"] = 150, ["label"] = "Gryde 1" }, + { ["object"] = "v_ret_fh_pot02", ["price"] = 150, ["label"] = "Gryde 2" }, + { ["object"] = "v_ret_fh_pot05", ["price"] = 150, ["label"] = "Gryde 3" }, + { ["object"] = "prop_pot_03", ["price"] = 150, ["label"] = "Gryde 4" }, + { ["object"] = "prop_pot_04", ["price"] = 150, ["label"] = "Gryde 5" }, + { ["object"] = "prop_pot_05", ["price"] = 150, ["label"] = "Gryde 6" }, + { ["object"] = "prop_pot_06", ["price"] = 150, ["label"] = "Gryde 7" }, + { ["object"] = "prop_pot_rack", ["price"] = 150, ["label"] = "Gryderol" }, + { ["object"] = "prop_kitch_juicer", ["price"] = 150, ["label"] = "Frugtpresser" }, + { ["object"] = "v_res_ovenhobmod", ["price"] = 1000, ["label"] = "Ovn" }, + { ["object"] = "v_res_mkniferack", ["price"] = 100, ["label"] = "Knive" }, + { ["object"] = "v_res_mchopboard", ["price"] = 100, ["label"] = "Skærebrdt" }, + { ["object"] = "prop_cs_kitchen_cab_l", ["price"] = 750, ["label"] = "Køkkenskab, bred" }, + { ["object"] = "prop_cs_kitchen_cab_r", ["price"] = 500, ["label"] = "Køkkenskab, smal" }, + { ["object"] = "v_res_tre_fridge", ["price"] = 500, ["label"] = "Køleskab" }, + { ["object"] = "apa_mp_h_acc_coffeemachine_01", ["price"] = 500, ["label"] = "Kaffemaskine" }, + { ["object"] = "p_new_j_counter_02", ["price"] = 500, ["label"] = "Bord" }, + { ["object"] = "prop_bar_pump_09", ["price"] = 500, ["label"] = "Pumpe 1" }, + { ["object"] = "prop_bar_pump_01", ["price"] = 500, ["label"] = "Pumpe 2" }, + { ["object"] = "prop_chip_fryer", ["price"] = 500, ["label"] = "Frituregryder" }, + { ["object"] = "prop_cleaver", ["price"] = 500, ["label"] = "Kniv" }, + { ["object"] = "prop_coffee_mac_02", ["price"] = 500, ["label"] = "Kaffemaskine 2" }, + { ["object"] = "prop_coffee_mac_01", ["price"] = 500, ["label"] = "Kaffemaskine 3" }, + { ["object"] = "prop_cs_fork", ["price"] = 500, ["label"] = "Gaffel" }, + { ["object"] = "prop_cs_sink_filler", ["price"] = 500, ["label"] = "Opvask" }, + { ["object"] = "prop_toaster_01", ["price"] = 500, ["label"] = "Toaster" }, + { ["object"] = "prop_cs_plate_01", ["price"] = 500, ["label"] = "Tallerken" }, + { ["object"] = "prop_foodprocess_01", ["price"] = 500, ["label"] = "Foodprocessor" }, + { ["object"] = "prop_food_sugarjar", ["price"] = 500, ["label"] = "Sukkerskål" }, + { ["object"] = "prop_juice_dispenser", ["price"] = 500, ["label"] = "Dispenser" }, + { ["object"] = "prop_knife_stand", ["price"] = 500, ["label"] = "Knivholder" }, + { ["object"] = "prop_knife", ["price"] = 500, ["label"] = "Kniv 2" }, + { ["object"] = "prop_micro_04", ["price"] = 500, ["label"] = "Mikroovn 4" }, + { ["object"] = "v_ret_fh_plate3", ["price"] = 500, ["label"] = "Tallerken 5" }, + { ["object"] = "v_ilev_tt_plate01", ["price"] = 500, ["label"] = "Tallerken 6" }, + { ["object"] = "v_res_fa_grater", ["price"] = 500, ["label"] = "Rivejern" }, + { ["object"] = "v_res_tt_pizzaplate", ["price"] = 500, ["label"] = "Pizza-tallerken" }, + { ["object"] = "v_ret_247_ketchup2", ["price"] = 500, ["label"] = "Ketchup" }, + } + }, + + { + category = "Planter", + items = { + { ["object"] = "prop_fib_plant_01", ["price"] = 150, ["label"] = "Fib plante" }, + { ["object"] = "v_corp_bombplant", ["price"] = 170, ["label"] = "Plante" }, + { ["object"] = "v_res_mflowers", ["price"] = 170, ["label"] = "Blomstervase" }, + { ["object"] = "v_res_mvasechinese", ["price"] = 170, ["label"] = "Kinesisk plante" }, + { ["object"] = "v_res_m_bananaplant", ["price"] = 170, ["label"] = "Bananplante" }, + { ["object"] = "v_res_m_palmplant1", ["price"] = 170, ["label"] = "Palmeplante 2" }, + { ["object"] = "v_res_m_palmstairs", ["price"] = 170, ["label"] = "Palmeplante 1" }, + { ["object"] = "v_res_rubberplant", ["price"] = 170, ["label"] = "Gummiplante" }, + { ["object"] = "v_res_tre_tree", ["price"] = 170, ["label"] = "Træplante" }, + { ["object"] = "v_ret_flowers", ["price"] = 100, ["label"] = "Blomster" }, + { ["object"] = "v_ret_j_flowerdisp", ["price"] = 100, ["label"] = "Blomster 1" }, + { ["object"] = "v_ret_j_flowerdisp_white", ["price"] = 100, ["label"] = "Blomster 2" }, + { ["object"] = "v_res_m_vasefresh", ["price"] = 300, ["label"] = "Blomstervase" }, + { ["object"] = "v_res_exoticvase", ["price"] = 300, ["label"] = "Vase med eksotiske blomster" }, + { ["object"] = "v_res_rosevase", ["price"] = 300, ["label"] = "Vase med roser" }, + { ["object"] = "v_res_rosevasedead", ["price"] = 300, ["label"] = "Vase med roder 2" }, + { ["object"] = "prop_pot_plant_6a", ["price"] = 300, ["label"] = "Hængeplante" }, + { ["object"] = "prop_pot_plant_02a", ["price"] = 300, ["label"] = "Blomsterkrukke" }, + { ["object"] = "apa_mp_h_acc_plant_palm_01", ["price"] = 300, ["label"] = "Palmeplante 3" }, + { ["object"] = "prop_plant_interior_05a", ["price"] = 300, ["label"] = "Blomsterkasse" }, + { ["object"] = "prop_plant_int_01a", ["price"] = 300, ["label"] = "Plante" }, + { ["object"] = "prop_plant_int_01b", ["price"] = 300, ["label"] = "Plante 2" }, + { ["object"] = "prop_plant_int_02a", ["price"] = 300, ["label"] = "Plante 3" }, + { ["object"] = "prop_plant_int_02b", ["price"] = 300, ["label"] = "Plante 4" }, + { ["object"] = "prop_plant_int_03a", ["price"] = 300, ["label"] = "Plante 5" }, + { ["object"] = "prop_plant_int_03b", ["price"] = 300, ["label"] = "Plante 6" }, + { ["object"] = "prop_plant_int_03c", ["price"] = 300, ["label"] = "Plante 7" }, + { ["object"] = "prop_plant_int_04a", ["price"] = 300, ["label"] = "Plante 8" }, + { ["object"] = "prop_plant_int_04c", ["price"] = 300, ["label"] = "Plante 9" }, + { ["object"] = "v_med_p_planter", ["price"] = 170, ["label"] = "Plante 10" }, + { ["object"] = "v_res_tre_plant", ["price"] = 170, ["label"] = "Plante 11" }, + { ["object"] = "v_res_m_urn", ["price"] = 170, ["label"] = "Plante 12" }, + { ["object"] = "prop_plant_int_05b", ["price"] = 300, ["label"] = "Blomsterkasse 2" }, + { ["object"] = "prop_pot_plant_01a", ["price"] = 300, ["label"] = "Grydeteplante 2" }, + { ["object"] = "prop_pot_plant_01b", ["price"] = 300, ["label"] = "Grydeteplante 3" }, + { ["object"] = "prop_pot_plant_01c", ["price"] = 300, ["label"] = "Grydeteplante 4" }, + { ["object"] = "prop_pot_plant_01d", ["price"] = 300, ["label"] = "Grydeteplante 5" }, + { ["object"] = "prop_pot_plant_01e", ["price"] = 300, ["label"] = "Grydeteplante 6" }, + { ["object"] = "prop_pot_plant_03b", ["price"] = 300, ["label"] = "Grydeteplante 7" }, + { ["object"] = "prop_pot_plant_05a", ["price"] = 300, ["label"] = "Grydeteplante 8" }, + { ["object"] = "prop_pot_plant_05b", ["price"] = 300, ["label"] = "Grydeteplante 9" }, + { ["object"] = "p_int_jewel_plant_01", ["price"] = 300, ["label"] = "Grydeteplante 10" }, + { ["object"] = "p_int_jewel_plant_02", ["price"] = 300, ["label"] = "Grydeteplante 11" }, + { ["object"] = "apa_mp_h_acc_vase_flowers_01", ["price"] = 300, ["label"] = "Grydeteplante 12" }, + { ["object"] = "apa_mp_h_acc_vase_flowers_02", ["price"] = 300, ["label"] = "Grydeteplante 13" }, + { ["object"] = "apa_mp_h_acc_vase_flowers_03", ["price"] = 300, ["label"] = "Grydeteplante 14" }, + { ["object"] = "apa_mp_h_acc_vase_flowers_04", ["price"] = 300, ["label"] = "Grydeteplante 15" }, + } + }, + + { + category = "Figurer mm.", + items = { + { ["object"] = "v_res_r_figcat", ["price"] = 300, ["label"] = "Katte-figur" }, + { ["object"] = "v_res_r_figclown", ["price"] = 300, ["label"] = "Klovne-figur" }, + { ["object"] = "v_res_r_figauth2", ["price"] = 300, ["label"] = "Certifikat" }, + { ["object"] = "v_res_r_figfemale", ["price"] = 300, ["label"] = "Kvinde-figur" }, + { ["object"] = "v_res_r_figflamenco", ["price"] = 300, ["label"] = "Flamingo-figur" }, + { ["object"] = "v_res_r_figgirl", ["price"] = 300, ["label"] = "Pige-figur" }, + { ["object"] = "v_res_r_figgirlclown", ["price"] = 300, ["label"] = "Pige klovne-figur" }, + { ["object"] = "v_res_r_figoblisk", ["price"] = 300, ["label"] = "Oblisk-figur" }, + { ["object"] = "v_res_r_figpillar", ["price"] = 300, ["label"] = "Pille-figur" }, + { ["object"] = "v_res_r_teapot", ["price"] = 300, ["label"] = "Tekande" }, + { ["object"] = "v_res_sculpt_dec", ["price"] = 300, ["label"] = "Skulptur 1" }, + { ["object"] = "v_res_sculpt_decd", ["price"] = 300, ["label"] = "Skulptur 2" }, + { ["object"] = "v_res_sculpt_dece", ["price"] = 300, ["label"] = "Skulptur 3" }, + { ["object"] = "v_res_sculpt_decf", ["price"] = 300, ["label"] = "Skulptur 4" }, + { ["object"] = "v_res_skateboard", ["price"] = 300, ["label"] = "Skateboard" }, + { ["object"] = "v_res_sketchpad", ["price"] = 300, ["label"] = "Skitseblok" }, + { ["object"] = "v_res_tissues", ["price"] = 300, ["label"] = "Papir" }, + { ["object"] = "v_res_tre_basketmess", ["price"] = 300, ["label"] = "Kurv" }, + { ["object"] = "v_res_tre_bin", ["price"] = 300, ["label"] = "Skraldespand" }, + { ["object"] = "v_res_tre_cushiona", ["price"] = 300, ["label"] = "Pude 1" }, + { ["object"] = "v_res_tre_cushionb", ["price"] = 300, ["label"] = "Pude 2" }, + { ["object"] = "v_res_tre_cushionc", ["price"] = 300, ["label"] = "Pude 3" }, + { ["object"] = "v_res_tre_cushiond", ["price"] = 300, ["label"] = "Pude 4" }, + { ["object"] = "v_res_tre_cushnscuzb", ["price"] = 300, ["label"] = "Pude 5" }, + { ["object"] = "v_res_tre_cushnscuzd", ["price"] = 300, ["label"] = "Pude 6" }, + { ["object"] = "v_res_tre_fruitbowl", ["price"] = 300, ["label"] = "Frugtskål" }, + { ["object"] = "v_med_p_sideboard", ["price"] = 300, ["label"] = "Sideboard" }, + { ["object"] = "prop_idol_01", ["price"] = 100, ["label"] = "Figur" }, + { ["object"] = "v_res_r_fighorsestnd", ["price"] = 300, ["label"] = "Figur sort hest" }, + { ["object"] = "v_res_r_fighorse", ["price"] = 300, ["label"] = "Figur stor hest" }, + { ["object"] = "v_res_r_figdancer", ["price"] = 300, ["label"] = "Figur danser" }, + { ["object"] = "v_res_fa_idol02", ["price"] = 300, ["label"] = "Elefant Figur" }, + { ["object"] = "v_res_m_statue", ["price"] = 300, ["label"] = "Skulptur" }, + { ["object"] = "v_20_ornaeagle", ["price"] = 300, ["label"] = "Figur ørn" }, + { ["object"] = "v_med_p_vaseround", ["price"] = 300, ["label"] = "Vase rund" }, + { ["object"] = "ex_mp_h_acc_vase_05", ["price"] = 300, ["label"] = "Vase Violet" }, + { ["object"] = "apa_mp_h_acc_dec_head_01", ["price"] = 300, ["label"] = "Kunstværk" }, + { ["object"] = "apa_mp_h_acc_dec_sculpt_02", ["price"] = 300, ["label"] = "Kunstværk 2" }, + { ["object"] = "ex_mp_h_acc_dec_plate_02", ["price"] = 300, ["label"] = "Kunstværk 3" }, + { ["object"] = "apa_mp_h_acc_bowl_ceramic_01", ["price"] = 300, ["label"] = "Skål" }, + { ["object"] = "apa_mp_h_acc_dec_plate_01", ["price"] = 300, ["label"] = "Skala 2" }, + { ["object"] = "apa_mp_h_acc_vase_01", ["price"] = 300, ["label"] = "Vase sort og hvid" }, + { ["object"] = "apa_mp_h_acc_vase_02", ["price"] = 300, ["label"] = "Vase rød" }, + { ["object"] = "apa_mp_h_acc_vase_05", ["price"] = 300, ["label"] = "Vase" }, + { ["object"] = "apa_mp_h_acc_vase_06", ["price"] = 300, ["label"] = "Vase sort og hvid" }, + } + }, + + { + category = "Døre", -- All from Base Game. + items = { + { ["object"] = "v_ilev_fa_frontdoor", ["price"] = 300, ["type"] = "door", ["label"] = "Hvid dør" }, + { ["object"] = "v_ilev_247_offdorr", ["price"] = 300, ["type"] = "door", ["label"] = "24/7 trædør" }, + { ["object"] = "v_ilev_arm_secdoor", ["price"] = 300, ["type"] = "door", ["label"] = "Sikkerhedsdør" }, + { ["object"] = "v_ilev_bank4door01", ["price"] = 300, ["type"] = "door", ["label"] = "Bank glasdør" }, + { ["object"] = "v_ilev_bk_gate", ["price"] = 300, ["type"] = "door", ["label"] = "Metallåge" }, + { ["object"] = "v_ilev_cbankcountdoor01", ["price"] = 300, ["type"] = "door", ["label"] = "Bank kontordor" }, + { ["object"] = "v_ilev_cd_door", ["price"] = 300, ["type"] = "door", ["label"] = "Trædør med glas" }, + { ["object"] = "v_ilev_cm_door1", ["price"] = 300, ["type"] = "door", ["label"] = "Lyseblådør" }, + { ["object"] = "v_ilev_dev_door", ["price"] = 300, ["type"] = "door", ["label"] = "Sort hoveddør" }, + { ["object"] = "v_ilev_door_orangesolid", ["price"] = 300, ["type"] = "door", ["label"] = "Orange dør" }, + { ["object"] = "v_ilev_fa_backdoor", ["price"] = 300, ["type"] = "door", ["label"] = "Beskidt glasdør" }, + { ["object"] = "v_ilev_gangsafedoor", ["price"] = 300, ["type"] = "door", ["label"] = "Pengeskabsdør" }, + { ["object"] = "v_ilev_gc_door02", ["price"] = 300, ["type"] = "door", ["label"] = "Kontordør" }, + { ["object"] = "v_ilev_janitor_frontdoor", ["price"] = 300, ["type"] = "door", ["label"] = "Hvid meshdør" }, + { ["object"] = "v_ilev_rc_door1", ["price"] = 300, ["type"] = "door", ["label"] = "Gul branddør" }, + { ["object"] = "v_ilev_roc_door2", ["price"] = 300, ["type"] = "door", ["label"] = "Rød dør" }, + { ["object"] = "v_ilev_sol_off_door01", ["price"] = 300, ["type"] = "door", ["label"] = "Trædør" }, + { ["object"] = "v_ilev_stad_fdoor", ["price"] = 300, ["type"] = "door", ["label"] = "Glasdør med skinner" }, + { ["object"] = "v_ilev_tort_door", ["price"] = 300, ["type"] = "door", ["label"] = "Dør med fareskilt" }, + { ["object"] = "v_ilev_trevtraildr", ["price"] = 300, ["type"] = "door", ["label"] = "Trailer dør" }, + { ["object"] = "prop_cs_fridge_door", ["price"] = 300, ["type"] = "door", ["label"] = "Køleskabsdør" }, + { ["object"] = "prop_artgallery_dl", ["price"] = 300, ["type"] = "door", ["label"] = "Hvid kunstgalleridørdør" }, + { ["object"] = "prop_bh1_09_mp_l", ["price"] = 300, ["type"] = "door", ["label"] = "Weazel Plaza dør" }, + { ["object"] = "prop_bh1_48_backdoor_l", ["price"] = 300, ["type"] = "door", ["label"] = "Sort glasdør" }, + { ["object"] = "prop_casino_door_01r", ["price"] = 300, ["type"] = "door", ["label"] = "Casino glasdør" }, + { ["object"] = "prop_cs4_11_door", ["price"] = 300, ["type"] = "door", ["label"] = "Hvid dør med lille vindue" }, + { ["object"] = "prop_cs6_03_door_r", ["price"] = 300, ["type"] = "door", ["label"] = "Antik trædør" }, + { ["object"] = "prop_grumandoor_r", ["price"] = 300, ["type"] = "door", ["label"] = "Guld-slange dør" }, + { ["object"] = "prop_motel_door_09", ["price"] = 300, ["type"] = "door", ["label"] = "Motel dør" }, + { ["object"] = "prop_fnclink_03gate5", ["price"] = 300, ["type"] = "door", ["label"] = "Hegn" }, + } + }, + + { + category = "Vægge", + items = { + { ["object"] = "ps_wall_aqua", ["price"] = 1000, ["label"] = "Aqua væg" }, + { ["object"] = "ps_wall_black", ["price"] = 1000, ["label"] = "Sort væg" }, + { ["object"] = "ps_wall_green", ["price"] = 1000, ["label"] = "Grøn væg" }, + { ["object"] = "ps_wall_grey", ["price"] = 1000, ["label"] = "Grå væg" }, + { ["object"] = "ps_wall_purple", ["price"] = 1000, ["label"] = "Lilla væg" }, + { ["object"] = "ps_wall_red", ["price"] = 1000, ["label"] = "Rød væg" }, + { ["object"] = "ps_wall_white", ["price"] = 1000, ["label"] = "Hvid væg" }, + { ["object"] = "ps_wall_yellow", ["price"] = 1000, ["label"] = "Gul væg" }, + { ["object"] = "ps_wall_wall", ["price"] = 1000, ["label"] = "Murstensvæg" }, + } + }, + + { + category = "Misc", + items = { + { ["object"] = "v_corp_facebeanbag", ["price"] = 100, ["label"] = "Beanbag" }, + { ["object"] = "v_res_cherubvase", ["price"] = 2500, ["label"] = "Hvis vase" }, + { ["object"] = "v_res_d_paddedwall", ["price"] = 300, ["label"] = "Polstret væg" }, + { ["object"] = "v_res_d_ramskull", ["price"] = 300, ["label"] = "Gedekranie" }, + { ["object"] = "v_res_d_whips", ["price"] = 300, ["label"] = "Piske" }, + { ["object"] = "v_res_fashmag1", ["price"] = 300, ["label"] = "Lukket magasin" }, + { ["object"] = "v_res_fashmagopen", ["price"] = 300, ["label"] = "Åbent magasin" }, + { ["object"] = "v_res_fa_magtidy", ["price"] = 300, ["label"] = "Organiseret magainser" }, + { ["object"] = "v_res_fa_yogamat002", ["price"] = 300, ["label"] = "Yogamåtte 1" }, + { ["object"] = "v_res_fa_yogamat1", ["price"] = 300, ["label"] = "Yogamåtte 2" }, + { ["object"] = "v_res_fh_aftershavebox", ["price"] = 300, ["label"] = "Aftershave" }, + { ["object"] = "v_res_fh_flowersa", ["price"] = 300, ["label"] = "Blomster" }, + { ["object"] = "v_res_fh_fruitbowl", ["price"] = 300, ["label"] = "Frugtskål" }, + { ["object"] = "v_res_fh_laundrybasket", ["price"] = 300, ["label"] = "Vasketøjskurv" }, + { ["object"] = "v_res_fh_pouf", ["price"] = 300, ["label"] = "Puf" }, + { ["object"] = "v_res_fh_sculptmod", ["price"] = 300, ["label"] = "Skulptur" }, + { ["object"] = "v_res_j_magrack", ["price"] = 300, ["label"] = "Magasinholder" }, + { ["object"] = "v_res_jewelbox", ["price"] = 300, ["label"] = "Juvelæske" }, + { ["object"] = "v_res_mbbin", ["price"] = 300, ["label"] = "Beholder" }, + { ["object"] = "v_res_mbowlornate", ["price"] = 300, ["label"] = "Udsmykket skål" }, + { ["object"] = "v_res_mbronzvase", ["price"] = 300, ["label"] = "Bronze Vase" }, + { ["object"] = "v_res_mchalkbrd", ["price"] = 300, ["label"] = "Kridtavle" }, + { ["object"] = "v_res_mddresser", ["price"] = 300, ["label"] = "Kommode" }, + { ["object"] = "v_res_mplinth", ["price"] = 300, ["label"] = "Sokkel" }, + { ["object"] = "v_res_mp_ashtrayb", ["price"] = 300, ["label"] = "Askebæger" }, + { ["object"] = "v_res_m_candle", ["price"] = 300, ["label"] = "Stearinlys" }, + { ["object"] = "v_res_m_candlelrg", ["price"] = 300, ["label"] = "Stearinlys, store" }, + { ["object"] = "v_res_m_kscales", ["price"] = 300, ["label"] = "Vægt" }, + { ["object"] = "v_res_tt_bedpillow", ["price"] = 300, ["label"] = "Hovedpude" }, + { ["object"] = "v_med_cor_whiteboard", ["price"] = 300, ["label"] = "Whiteboard" }, + { ["object"] = "prop_ashtray_01", ["price"] = 100, ["label"] = "Sort askebæger" }, + { ["object"] = "v_ret_fh_ashtray", ["price"] = 100, ["label"] = "Sten askebæger" }, + { ["object"] = "v_24_wdr_mesh_rugs", ["price"] = 500, ["label"] = "Tæppe" }, + { ["object"] = "apa_mp_h_acc_rugwooll_04", ["price"] = 500, ["label"] = "Tæppe 2" }, + { ["object"] = "ex_mp_h_acc_rugwoolm_04", ["price"] = 500, ["label"] = "Tæppe 3" }, + { ["object"] = "apa_mp_h_acc_rugwoolm_03", ["price"] = 500, ["label"] = "Tæppe 4" }, + { ["object"] = "apa_mp_h_acc_rugwooll_03", ["price"] = 500, ["label"] = "Tæppe 5" }, + { ["object"] = "apa_mp_h_acc_rugwoolm_04", ["price"] = 500, ["label"] = "Tæppe 6" }, + { ["object"] = "v_club_rack", ["price"] = 500, ["label"] = "Tøjstativ" }, + { ["object"] = "prop_a4_pile_01", ["price"] = 100, ["label"] = "A4 bunke" }, + { ["object"] = "prop_amb_40oz_03", ["price"] = 100, ["label"] = "Øl i pose" }, + { ["object"] = "prop_amb_beer_bottle", ["price"] = 100, ["label"] = "Øl" }, + { ["object"] = "prop_aviators_01", ["price"] = 100, ["label"] = "Aviators" }, + { ["object"] = "prop_barry_table_detail", ["price"] = 100, ["label"] = "Papirbunke" }, + { ["object"] = "prop_beer_box_01", ["price"] = 100, ["label"] = "Øl" }, + { ["object"] = "prop_binoc_01", ["price"] = 100, ["label"] = "Kikkert" }, + { ["object"] = "prop_blox_spray", ["price"] = 100, ["label"] = "Blox Spray" }, + { ["object"] = "prop_bongos_01", ["price"] = 100, ["label"] = "Bongotrommer" }, + { ["object"] = "prop_bong_01", ["price"] = 100, ["label"] = "Bong" }, + { ["object"] = "prop_boombox_01", ["price"] = 100, ["label"] = "Boombox" }, + { ["object"] = "prop_bowl_crisps", ["price"] = 100, ["label"] = "Chipsskål" }, + { ["object"] = "prop_candy_pqs", ["price"] = 100, ["label"] = "Slik" }, + { ["object"] = "prop_carrier_bag_01", ["price"] = 100, ["label"] = "Bærepose" }, + { ["object"] = "prop_ceramic_jug_01", ["price"] = 100, ["label"] = "Keramisk kande" }, + { ["object"] = "prop_cigar_pack_01", ["price"] = 100, ["label"] = "Cigar pakke 1" }, + { ["object"] = "prop_cigar_pack_02", ["price"] = 100, ["label"] = "Cigar pakke 2" }, + { ["object"] = "prop_cs_beer_box", ["price"] = 100, ["label"] = "Øl-kasse" }, + { ["object"] = "prop_cs_binder_01", ["price"] = 100, ["label"] = "Ringbind" }, + { ["object"] = "prop_cs_bs_cup", ["price"] = 100, ["label"] = "Kop" }, + { ["object"] = "prop_cs_cashenvelope", ["price"] = 100, ["label"] = "Kuvert" }, + { ["object"] = "prop_cs_champ_flute", ["price"] = 100, ["label"] = "Fløjte" }, + { ["object"] = "prop_cs_duffel_01", ["price"] = 100, ["label"] = "Sportstaske" }, + { ["object"] = "prop_cs_dvd", ["price"] = 50, ["label"] = "DVD" }, + { ["object"] = "prop_cs_dvd_case", ["price"] = 50, ["label"] = "DVD etui" }, + { ["object"] = "prop_cs_film_reel_01", ["price"] = 100, ["label"] = "Filmrulle" }, + { ["object"] = "prop_cs_ilev_blind_01", ["price"] = 100, ["label"] = "Persienner" }, + { ["object"] = "p_ld_bs_bag_01", ["price"] = 100, ["label"] = "Taske" }, + { ["object"] = "prop_cs_ironing_board", ["price"] = 100, ["label"] = "Strygebræt" }, + { ["object"] = "prop_cs_katana_01", ["price"] = 100, ["label"] = "Katana" }, + { ["object"] = "prop_cs_kettle_01", ["price"] = 100, ["label"] = "El-kedel" }, + { ["object"] = "prop_cs_lester_crate", ["price"] = 100, ["label"] = "Kasse" }, + { ["object"] = "prop_cs_petrol_can", ["price"] = 100, ["label"] = "Benzindunk" }, + { ["object"] = "prop_cs_sack_01", ["price"] = 100, ["label"] = "Sæk" }, + { ["object"] = "prop_cs_script_bottle_01", ["price"] = 100, ["label"] = "Chesty hostesaft" }, + { ["object"] = "prop_cs_script_bottle", ["price"] = 100, ["label"] = "Willie's medcin" }, + { ["object"] = "prop_cs_street_binbag_01", ["price"] = 100, ["label"] = "Skraldepose" }, + { ["object"] = "prop_cs_whiskey_bottle", ["price"] = 100, ["label"] = "Whiskey flaske" }, + { ["object"] = "prop_sh_bong_01", ["price"] = 100, ["label"] = "Bong" }, + { ["object"] = "prop_peanut_bowl_01", ["price"] = 100, ["label"] = "Peanuts" }, + { ["object"] = "prop_tumbler_01", ["price"] = 100, ["label"] = "Mixerglas" }, + { ["object"] = "prop_weed_bottle", ["price"] = 100, ["label"] = "Weedbeholder" }, + { ["object"] = "p_cs_lighter_01", ["price"] = 100, ["label"] = "Lighter" }, + { ["object"] = "p_cs_papers_01", ["price"] = 100, ["label"] = "Rullepapir" }, + { ["object"] = "v_res_d_dildo_a", ["price"] = 100, ["label"] = "Din søsters dildo" }, + { ["object"] = "v_res_d_dildo_b", ["price"] = 100, ["label"] = "Lilla dildo" }, + { ["object"] = "v_res_d_dildo_c", ["price"] = 100, ["label"] = "Hvid dildo" }, + { ["object"] = "v_res_d_dildo_d", ["price"] = 100, ["label"] = "Guld dildo" }, + { ["object"] = "v_res_d_dildo_e", ["price"] = 100, ["label"] = "Grå dildo" }, + { ["object"] = "v_res_d_dildo_f", ["price"] = 100, ["label"] = "Din mors dildo" }, + { ["object"] = "prop_champ_cool", ["price"] = 100, ["label"] = "Champagnespand" }, + { ["object"] = "prop_champ_01b", ["price"] = 100, ["label"] = "Champagneflaske" }, + { ["object"] = "prop_champ_flute", ["price"] = 100, ["label"] = "Champagneglas" }, + { ["object"] = "ba_prop_club_champset", ["price"] = 300, ["label"] = "Champagnesæt" }, + { ["object"] = "v_res_fa_candle01", ["price"] = 100, ["label"] = "Stearinlys, blå" }, + { ["object"] = "v_res_fa_candle02", ["price"] = 100, ["label"] = "Stearinlys, rød" }, + { ["object"] = "v_res_fa_candle03", ["price"] = 100, ["label"] = "Stearinlys, sort" }, + { ["object"] = "v_res_fa_candle04", ["price"] = 100, ["label"] = "Stearinlys, små" }, + { ["object"] = "v_med_bottles2", ["price"] = 100, ["label"] = "Kemikalier" }, + { ["object"] = "v_res_desktidy", ["price"] = 100, ["label"] = "Kontorting" }, + { ["object"] = "v_med_p_notebook", ["price"] = 100, ["label"] = "Noter" }, + { ["object"] = "bkr_prop_weed_dry_01a", ["price"] = 100, ["label"] = "Bjerg af weed" }, + { ["object"] = "ba_prop_battle_trophy_battler", ["price"] = 100, ["label"] = "Trofæ" }, + { ["object"] = "ba_prop_battle_trophy_no1", ["price"] = 100, ["label"] = "Trofø" }, + { ["object"] = "prop_golf_bag_01c", ["price"] = 100, ["label"] = "Golftaske" }, + { ["object"] = "hei_heist_kit_bin_01", ["price"] = 100, ["label"] = "Skraldespan" }, + { ["object"] = "prop_wooden_barrel", ["price"] = 100, ["label"] = "Øltønde" }, + { ["object"] = "bkr_prop_bkr_cash_scatter_01", ["price"] = 100, ["label"] = "Spredte penge" }, + { ["object"] = "bkr_prop_bkr_cash_roll_01", ["price"] = 100, ["label"] = "Pengerulle" }, + { ["object"] = "bkr_prop_bkr_cashpile_01", ["price"] = 50000, ["label"] = "Pengebunke 1" }, + { ["object"] = "bkr_prop_bkr_cashpile_02", ["price"] = 50000, ["label"] = "Pengebunke 2" }, + { ["object"] = "bkr_prop_bkr_cashpile_03", ["price"] = 50000, ["label"] = "Pengebunke 3" }, + { ["object"] = "bkr_prop_bkr_cashpile_04", ["price"] = 50000, ["label"] = "Pengebunke 4" }, + { ["object"] = "bkr_prop_bkr_cashpile_05", ["price"] = 50000, ["label"] = "Pengebunke 5" }, + { ["object"] = "bkr_prop_bkr_cashpile_06", ["price"] = 50000, ["label"] = "Pengebunke 6" }, + { ["object"] = "bkr_prop_bkr_cashpile_07", ["price"] = 50000, ["label"] = "Pengebunke 7" }, + { ["object"] = "bkr_prop_weed_bigbag_open_01a", ["price"] = 100, ["label"] = "Weed pose åben" }, + { ["object"] = "bkr_prop_weed_bigbag_02a", ["price"] = 100, ["label"] = "Weed pose 2" }, + { ["object"] = "bkr_prop_weed_bigbag_03a", ["price"] = 100, ["label"] = "Weed pose 3" }, + { ["object"] = "bkr_prop_weed_scales_01a", ["price"] = 100, ["label"] = "Vægte" }, + { ["object"] = "bkr_prop_weed_smallbag_01a", ["price"] = 100, ["label"] = "Lille pose" }, + { ["object"] = "prop_gold_bar", ["price"] = 100, ["label"] = "Guldbar" }, + { ["object"] = "beerrow_world", ["price"] = 100, ["label"] = "Øl flasker" }, + { ["object"] = "beerrow_local", ["price"] = 100, ["label"] = "Øl flaser 2" }, + { ["object"] = "p_cs_bbbat_01", ["price"] = 100, ["label"] = "Bat" }, + { ["object"] = "p_cs_cuffs_02_s", ["price"] = 100, ["label"] = "Håndjern" }, + { ["object"] = "p_cs_joint_02", ["price"] = 100, ["label"] = "Joint" }, + { ["object"] = "p_ing_coffeecup_01", ["price"] = 100, ["label"] = "Kaffekop" }, + { ["object"] = "p_tumbler_cs2_s", ["price"] = 100, ["label"] = "Alkoholmix" }, + { ["object"] = "prop_turkey_leg_01", ["price"] = 100, ["label"] = "Kyllingelår" }, + { ["object"] = "prop_amb_donut", ["price"] = 100, ["label"] = "Donut" }, + { ["object"] = "prop_donut_02", ["price"] = 100, ["label"] = "Donut 2" }, + { ["object"] = "prop_bar_shots", ["price"] = 100, ["label"] = "Bar shots" }, + { ["object"] = "prop_bar_stirrers", ["price"] = 100, ["label"] = "Bar blandepinde" }, + { ["object"] = "prop_beer_amopen", ["price"] = 100, ["label"] = "Øl, AM, åben" }, + { ["object"] = "prop_beer_blr", ["price"] = 100, ["label"] = "Øl, Blarneys" }, + { ["object"] = "prop_beer_logger", ["price"] = 100, ["label"] = "Øl, Logger" }, + { ["object"] = "prop_beer_stzopen", ["price"] = 100, ["label"] = "Øl, stronzo, åben" }, + { ["object"] = "prop_bikerset", ["price"] = 100, ["label"] = "Alkoholsæt" }, + { ["object"] = "prop_bottle_brandy", ["price"] = 100, ["label"] = "Brandy flaske" }, + { ["object"] = "prop_tequila_bottle", ["price"] = 100, ["label"] = "Tequila flaske" }, + { ["object"] = "prop_tequila", ["price"] = 100, ["label"] = "Tequila glas" }, + { ["object"] = "prop_bottle_cognac", ["price"] = 100, ["label"] = "Cognac flaske" }, + { ["object"] = "prop_bottle_macbeth", ["price"] = 100, ["label"] = "Macbeth flaske" }, + { ["object"] = "prop_brandy_glass", ["price"] = 100, ["label"] = "Vinglas" }, + { ["object"] = "prop_mug_01", ["price"] = 100, ["label"] = "Krus 1" }, + { ["object"] = "prop_mug_02", ["price"] = 100, ["label"] = "Krus 2" }, + { ["object"] = "prop_mug_03", ["price"] = 100, ["label"] = "Krus 3" }, + { ["object"] = "prop_optic_vodka", ["price"] = 100, ["label"] = "Vodka" }, + { ["object"] = "prop_optic_jd", ["price"] = 100, ["label"] = "JD Whiskey" }, + { ["object"] = "prop_pint_glass_01", ["price"] = 100, ["label"] = "Ølkrus" }, + { ["object"] = "prop_pizza_box_03", ["price"] = 100, ["label"] = "Pizzakasse" }, + { ["object"] = "prop_sandwich_01", ["price"] = 100, ["label"] = "Sandwich" }, + { ["object"] = "prop_cava", ["price"] = 100, ["label"] = "Cava" }, + { ["object"] = "prop_drink_redwine", ["price"] = 100, ["label"] = "Rødvin" }, + { ["object"] = "vodkarow", ["price"] = 100, ["label"] = "Vodka Row" }, + { ["object"] = "prop_cherenkov_02", ["price"] = 100, ["label"] = "Cherenkov" }, + { ["object"] = "prop_cherenkov_03", ["price"] = 100, ["label"] = "Cherenkov 2" }, + { ["object"] = "prop_cocktail_glass", ["price"] = 100, ["label"] = "Cocktail glas" }, + { ["object"] = "prop_cs_bottle_opener", ["price"] = 100, ["label"] = "Oplukker" }, + { ["object"] = "prop_food_bs_chips", ["price"] = 100, ["label"] = "Chips" }, + { ["object"] = "prop_cs_burger_01", ["price"] = 100, ["label"] = "Burger" }, + { ["object"] = "prop_cs_hand_radio", ["price"] = 100, ["label"] = "Radio" }, + { ["object"] = "prop_cs_hotdog_01", ["price"] = 100, ["label"] = "Hotdog" }, + { ["object"] = "prop_cs_milk_01", ["price"] = 100, ["label"] = "Mæælk" }, + { ["object"] = "prop_cs_panties", ["price"] = 100, ["label"] = "Trusser" }, + { ["object"] = "prop_cs_steak", ["price"] = 100, ["label"] = "Kød" }, + { ["object"] = "v_ret_fh_wickbskt", ["price"] = 100, ["label"] = "Vasketøjskurv" }, + { ["object"] = "v_ret_gc_bag01", ["price"] = 100, ["label"] = "Sportstaske 1" }, + { ["object"] = "v_ret_gc_bag02", ["price"] = 100, ["label"] = "Sportstaske 2" }, + { ["object"] = "v_ret_gc_bin", ["price"] = 100, ["label"] = "Skraldespan" }, + { ["object"] = "v_ret_gc_cashreg", ["price"] = 100, ["label"] = "Cash Register" }, + { ["object"] = "v_ret_gc_chair01", ["price"] = 100, ["label"] = "Barstol" }, + { ["object"] = "v_ret_gc_chair02", ["price"] = 100, ["label"] = "Plastikstol" }, + { ["object"] = "v_ret_gc_chair03", ["price"] = 100, ["label"] = "Kontorstol" }, + { ["object"] = "v_ret_gc_clock", ["price"] = 100, ["label"] = "Ur" }, + { ["object"] = "v_ret_hd_prod1_", ["price"] = 100, ["label"] = "Håndcreme" }, + { ["object"] = "v_ret_hd_prod2_", ["price"] = 100, ["label"] = "Kropsvask" }, + { ["object"] = "v_ret_hd_prod3_", ["price"] = 100, ["label"] = "Creme" }, + { ["object"] = "v_ret_hd_prod4_", ["price"] = 100, ["label"] = "Håndsæbe" }, + { ["object"] = "v_ret_hd_prod5_", ["price"] = 100, ["label"] = "Shampoo" }, + { ["object"] = "v_ret_hd_prod6_", ["price"] = 100, ["label"] = "Servietter" }, + { ["object"] = "v_ret_hd_unit1_", ["price"] = 100, ["label"] = "Kommode" }, + { ["object"] = "v_ret_hd_unit2_", ["price"] = 100, ["label"] = "Bord" }, + { ["object"] = "v_ret_ml_fridge02", ["price"] = 100, ["label"] = "Køleskab" }, + { ["object"] = "v_ret_ps_bag_01", ["price"] = 100, ["label"] = "Taske 1" }, + { ["object"] = "v_ret_ps_bag_02", ["price"] = 100, ["label"] = "Taske 2" }, + { ["object"] = "v_ret_ta_book1", ["price"] = 100, ["label"] = "Bog 1" }, + { ["object"] = "v_ret_ta_book2", ["price"] = 100, ["label"] = "Bog 2" }, + { ["object"] = "v_ret_ta_book3", ["price"] = 100, ["label"] = "Bog 3" }, + { ["object"] = "v_ret_ta_book4", ["price"] = 100, ["label"] = "Bog 4" }, + { ["object"] = "v_ret_ta_camera", ["price"] = 100, ["label"] = "Kamera" }, + { ["object"] = "v_ret_ta_firstaid", ["price"] = 100, ["label"] = "Førstehjælp" }, + { ["object"] = "v_ret_ta_hero", ["price"] = 100, ["label"] = "Helte-figur" }, + { ["object"] = "v_ret_ta_mag1", ["price"] = 100, ["label"] = "Magasiner 1" }, + { ["object"] = "v_ret_ta_mag2", ["price"] = 100, ["label"] = "Magasiner 2" }, + { ["object"] = "v_ret_ta_skull", ["price"] = 100, ["label"] = "Kranie" }, + { ["object"] = "prop_acc_guitar_01", ["price"] = 100, ["label"] = "Guitar" }, + { ["object"] = "prop_amb_handbag_01", ["price"] = 100, ["label"] = "Håndtaske" }, + { ["object"] = "prop_attache_case_01", ["price"] = 100, ["label"] = "Kuffert" }, + { ["object"] = "prop_big_bag_01", ["price"] = 100, ["label"] = "Stor pose" }, + { ["object"] = "prop_bonesaw", ["price"] = 100, ["label"] = "Knoglesav" }, + { ["object"] = "prop_cs_fertilizer", ["price"] = 100, ["label"] = "Gødning" }, + { ["object"] = "prop_cs_shopping_bag", ["price"] = 100, ["label"] = "Indkøbspose" }, + { ["object"] = "prop_cs_vial_01", ["price"] = 100, ["label"] = "Drikkedunk" }, + { ["object"] = "prop_defilied_ragdoll_01", ["price"] = 100, ["label"] = "Dukke" }, + { ["object"] = "v_res_fa_book03", ["price"] = 100, ["label"] = "Bog: Kamasutra" }, + { ["object"] = "prop_weight_rack_02", ["price"] = 500, ["label"] = "Håndvægte" }, + { ["object"] = "prop_weight_bench_02", ["price"] = 500, ["label"] = "Bænkpresse" }, + { ["object"] = "prop_tool_broom", ["price"] = 100, ["label"] = "Kost" }, + { ["object"] = "prop_fire_exting_2a", ["price"] = 100, ["label"] = "Brandslukker" }, + { ["object"] = "v_res_vacuum", ["price"] = 100, ["label"] = "Støvsuger" }, + { ["object"] = "v_ret_gc_fan", ["price"] = 100, ["label"] = "Blæser" }, + { ["object"] = "prop_paint_stepl01b", ["price"] = 100, ["label"] = "Stige" }, + { ["object"] = "bkr_prop_weed_bucket_01b", ["price"] = 100, ["label"] = "Gødning" }, + { ["object"] = "v_club_vusnaketank", ["price"] = 500, ["label"] = "Terrarium" }, + { ["object"] = "prop_pooltable_02", ["price"] = 1500, ["label"] = "Poolbord" }, + { ["object"] = "prop_pool_rack_02", ["price"] = 100, ["label"] = "Poolkøer" }, + { ["object"] = "v_club_vu_deckcase", ["price"] = 1000, ["label"] = "DJ sæt" }, + { ["object"] = "v_corp_servercln", ["price"] = 1000, ["label"] = "Serverskab" }, + { ["object"] = "prop_dummy_01", ["price"] = 100, ["label"] = "Dukke" }, + { ["object"] = "prop_egg_clock_01", ["price"] = 100, ["label"] = "Æggeur" }, + { ["object"] = "prop_el_guitar_01", ["price"] = 100, ["label"] = "E Guitar 1" }, + { ["object"] = "prop_el_guitar_02", ["price"] = 100, ["label"] = "E Guitar 2" }, + { ["object"] = "prop_el_guitar_03", ["price"] = 100, ["label"] = "E Guitar 2" }, + { ["object"] = "prop_feed_sack_01", ["price"] = 100, ["label"] = "Fodersæl" }, + { ["object"] = "prop_floor_duster_01", ["price"] = 100, ["label"] = "Gulvmoppe" }, + { ["object"] = "prop_fruit_basket", ["price"] = 100, ["label"] = "Frugtkurv" }, + { ["object"] = "prop_f_duster_02", ["price"] = 100, ["label"] = "Moppe" }, + { ["object"] = "prop_grapes_02", ["price"] = 100, ["label"] = "Druer" }, + { ["object"] = "prop_hotel_clock_01", ["price"] = 100, ["label"] = "Hotel ur" }, + { ["object"] = "prop_idol_case_01", ["price"] = 100, ["label"] = "Idol Case" }, + { ["object"] = "prop_jewel_02a", ["price"] = 100, ["label"] = "Juveler" }, + { ["object"] = "prop_jewel_02b", ["price"] = 100, ["label"] = "Juveler" }, + { ["object"] = "prop_jewel_02c", ["price"] = 100, ["label"] = "Juveler" }, + { ["object"] = "prop_jewel_03a", ["price"] = 100, ["label"] = "Juveler" }, + { ["object"] = "prop_jewel_03b", ["price"] = 100, ["label"] = "Juveler" }, + { ["object"] = "prop_jewel_04a", ["price"] = 100, ["label"] = "Juveler" }, + { ["object"] = "prop_jewel_04b", ["price"] = 100, ["label"] = "Juveler" }, + { ["object"] = "prop_j_disptray_01", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_j_disptray_01b", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_j_disptray_02", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_j_disptray_03", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_j_disptray_04", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_j_disptray_04b", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_j_disptray_05", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_j_disptray_05b", ["price"] = 100, ["label"] = "Displaybakke" }, + { ["object"] = "prop_ld_greenscreen_01", ["price"] = 100, ["label"] = "Greenscreen" }, + { ["object"] = "prop_ld_handbag", ["price"] = 100, ["label"] = "Håndtaske" }, + { ["object"] = "prop_ld_jerrycan_01", ["price"] = 100, ["label"] = "Brændstofdunk" }, + { ["object"] = "prop_ld_keypad_01", ["price"] = 100, ["label"] = "Keypad 1" }, + { ["object"] = "prop_ld_keypad_01b", ["price"] = 100, ["label"] = "Keypad 2" }, + { ["object"] = "prop_ld_suitcase_01", ["price"] = 100, ["label"] = "Kuffert 1" }, + { ["object"] = "prop_ld_suitcase_02", ["price"] = 100, ["label"] = "Kuffert 2" }, + { ["object"] = "hei_p_attache_case_shut", ["price"] = 100, ["label"] = "Kuffert 3"}, + { ["object"] = "prop_mr_rasberryclean", ["price"] = 100, ["label"] = "Bamse" }, + { ["object"] = "prop_paper_bag_01", ["price"] = 100, ["label"] = "Papirsposer" }, + { ["object"] = "prop_shopping_bags01", ["price"] = 100, ["label"] = "Indkøbsposer" }, + { ["object"] = "prop_shopping_bags02", ["price"] = 100, ["label"] = "Indkøbsposer 2" }, + { ["object"] = "prop_yoga_mat_01", ["price"] = 100, ["label"] = "Yogamåtte 1" }, + { ["object"] = "prop_yoga_mat_02", ["price"] = 100, ["label"] = "Yogamåtte 2" }, + { ["object"] = "prop_yoga_mat_03", ["price"] = 100, ["label"] = "Yogamåtte 3" }, + { ["object"] = "p_ld_sax", ["price"] = 100, ["label"] = "Saxofon" }, + { ["object"] = "p_ld_soc_ball_01", ["price"] = 100, ["label"] = "Fodbold" }, + { ["object"] = "p_watch_01", ["price"] = 100, ["label"] = "Ur 1" }, + { ["object"] = "p_watch_02", ["price"] = 100, ["label"] = "Ur 2" }, + { ["object"] = "p_watch_03", ["price"] = 100, ["label"] = "Ur 3" }, + { ["object"] = "p_watch_04", ["price"] = 100, ["label"] = "Ur 4" }, + { ["object"] = "p_watch_05", ["price"] = 100, ["label"] = "Ur 5" }, + { ["object"] = "p_watch_06", ["price"] = 100, ["label"] = "Ur 6" }, + { ["object"] = "apa_mp_h_acc_candles_01", ["price"] = 100, ["label"] = "Stearinlys" }, + { ["object"] = "apa_mp_h_acc_candles_02", ["price"] = 100, ["label"] = "Stearinlys 2" }, + { ["object"] = "apa_mp_h_acc_candles_04", ["price"] = 100, ["label"] = "Stearinlys 3" }, + { ["object"] = "apa_mp_h_acc_candles_06", ["price"] = 100, ["label"] = "Stearinlys 1" }, + { ["object"] = "apa_mp_h_acc_fruitbowl_02", ["price"] = 100, ["label"] = "Frugtskål" }, + { ["object"] = "apa_mp_h_acc_tray_01", ["price"] = 100, ["label"] = "Vaser" }, + { ["object"] = "prop_bskball_01", ["price"] = 100, ["label"] = "Basketball" }, + { ["object"] = "prop_cs_wrench", ["price"] = 100, ["label"] = "Skruenøgle" }, + { ["object"] = "prop_cs_bowie_knife", ["price"] = 100, ["label"] = "Bowie kniv" }, + { ["object"] = "prop_w_me_hatchet", ["price"] = 100, ["label"] = "Økse" }, + } + } + +} diff --git a/resources/[ps]/ps-housing/shared/framework.lua b/resources/[ps]/ps-housing/shared/framework.lua new file mode 100644 index 0000000..42531aa --- /dev/null +++ b/resources/[ps]/ps-housing/shared/framework.lua @@ -0,0 +1,481 @@ +Framework = {} + +PoliceJobs = {} + +-- Convert config table to usable keys +for i = 1, #Config.PoliceJobNames do + PoliceJobs[Config.PoliceJobNames[i]] = true +end + +if IsDuplicityVersion() then + Framework.ox = {} + Framework.qb = {} + + function Framework.ox.Notify(src, message, type) + type = type == "inform" and "info" or type + TriggerClientEvent("ox_lib:notify", src, {title="Property", description=message, type=type}) + end + + function Framework.qb.Notify(src, message, type) + type = type == "info" and "primary" or type + TriggerClientEvent('QBCore:Notify', src, message, type) + end + + function Framework.ox.RegisterInventory(stash, label, stashConfig) + exports.ox_inventory:RegisterStash(stash, label, stashConfig.slots, stashConfig.maxweight, nil) + end + + function Framework.qb.RegisterInventory(stash, label, stashConfig) + -- Used for ox_inventory compat + end + + function Framework.qb.SendLog(message) + if Config.EnableLogs then + TriggerEvent('qb-log:server:CreateLog', 'pshousing', 'Housing System', 'blue', message) + end + end + + function Framework.ox.SendLog(message) + -- noop + end + + return +end + +local function hasApartment(apts) + for propertyId, _ in pairs(apts) do + local property = PropertiesTable[propertyId] + if property.owner then + return true + end + end + + return false +end + +Framework.qb = { + + Notify = function(message, type) + type = type == "info" and "primary" or type + TriggerEvent('QBCore:Notify', message, type) + end, + + AddEntrance = function(coords, size, heading, propertyId, enter, raid, showcase, showData, targetName) + local property_id = propertyId + exports["qb-target"]:AddBoxZone( + targetName, + vector3(coords.x, coords.y, coords.z), + size.x, + size.y, + { + name = targetName, + heading = heading, + debugPoly = Config.DebugMode, + minZ = coords.z - 1.5, + maxZ = coords.z + 2.0, + }, + { + options = { + { + label = "Gå indenfor", + icon = "fas fa-door-open", + action = enter, + canInteract = function() + local property = Property.Get(property_id) + return property.has_access or property.owner + end, + }, + { + label = "Fremvis ejendom", + icon = "fas fa-eye", + action = showcase, + canInteract = function() + local job = PlayerData.job + local jobName = job.name + local onDuty = job.onduty + return jobName == Config.RealtorJobName and onDuty + end, + }, + { + label = "Ejendoms info", + icon = "fas fa-circle-info", + action = showData, + canInteract = function() + local job = PlayerData.job + local jobName = job.name + local onDuty = job.onduty + return jobName == Config.RealtorJobName and onDuty + end, + }, + { + label = "Ring Doorbell", + icon = "fas fa-bell", + action = enter, + canInteract = function() + local property = Property.Get(property_id) + return not property.has_access and not property.owner + end, + }, + { + label = "Ring på døren", + icon = "fas fa-building-shield", + action = raid, + canInteract = function() + local job = PlayerData.job + local jobName = job.name + local gradeAllowed = tonumber(job.grade.level) >= Config.MinGradeToRaid + local onDuty = job.onduty + + return PoliceJobs[jobName] and gradeAllowed and onDuty + end, + }, + }, + } + ) + + return targetName + end, + + AddApartmentEntrance = function(coords, size, heading, apartment, enter, seeAll, seeAllToRaid, targetName) + exports['qb-target']:AddBoxZone(targetName, vector3(coords.x, coords.y, coords.z), size.x, size.y, { + name = targetName, + heading = heading, + debugPoly = Config.DebugMode, + minZ = coords.z - 1.0, + maxZ = coords.z + 2.0, + }, { + options = { + { + label = "Gå indenfor", + action = enter, + icon = "fas fa-door-open", + canInteract = function() + local apartments = ApartmentsTable[apartment].apartments + return hasApartment(apartments) + end, + }, + { + label = "Se alle lejligheder", + icon = "fas fa-circle-info", + action = seeAll, + }, + { + label = "Ransag lejlighed", + action = seeAllToRaid, + icon = "fas fa-building-shield", + canInteract = function() + local job = PlayerData.job + local jobName = job.name + local gradeAllowed = tonumber(job.grade.level) >= Config.MinGradeToRaid + local onDuty = job.onduty + + return PoliceJobs[jobName] and gradeAllowed and onDuty + end, + }, + } + }) + end, + + AddDoorZoneInside = function(coords, size, heading, leave, checkDoor) + exports["qb-target"]:AddBoxZone( + "shellExit", + vector3(coords.x, coords.y, coords.z), + size.x, + size.y, + { + name = "shellExit", + heading = heading, + debugPoly = Config.DebugMode, + minZ = coords.z - 2.0, + maxZ = coords.z + 1.0, + }, + { + options = { + { + label = "Forlad ejendom", + action = leave, + icon = "fas fa-right-from-bracket", + }, + { + label = "Tjek døren", + action = checkDoor, + icon = "fas fa-bell", + }, + }, + } + ) + + return "shellExit" + end, + + AddDoorZoneInsideTempShell = function(coords, size, heading, leave) + exports["qb-target"]:AddBoxZone( + "shellExit", + vector3(coords.x, coords.y, coords.z), + size.x, + size.y, + { + name = "shellExit", + heading = heading, + debugPoly = Config.DebugMode, + minZ = coords.z - 2.0, + maxZ = coords.z + 1.0, + }, + { + options = { + { + label = "Forlad", + action = leave, + icon = "fas fa-right-from-bracket", + }, + }, + } + ) + + return "shellExit" + end, + + RemoveTargetZone = function(targetName) + exports["qb-target"]:RemoveZone(targetName) + end, + + AddRadialOption = function(id, label, icon, _, event, options) + exports['qb-radialmenu']:AddOption({ + id = id, + title = label, + icon = icon, + type = 'client', + event = event, + shouldClose = true, + options = options + }, id) + end, + + RemoveRadialOption = function(id) + exports['qb-radialmenu']:RemoveOption(id) + end, + + AddTargetEntity = function (entity, label, icon, action) + exports["qb-target"]:AddTargetEntity(entity, { + options = { + { + label = label, + icon = icon, + action = action, + }, + }, + }) + end, + + RemoveTargetEntity = function (entity) + exports["qb-target"]:RemoveTargetEntity(entity) + end, + + OpenInventory = function (stash, stashConfig) + TriggerServerEvent("inventory:server:OpenInventory", "stash", stash, stashConfig) + TriggerEvent("inventory:client:SetCurrentStash", stash) + end, +} + +Framework.ox = { + Notify = function(message, type) + type = type == "inform" and "info" or type + + lib.notify({ + title = 'Ejendom', + description = message, + type = type + }) + end, + + AddEntrance = function (coords, size, heading, propertyId, enter, raid, showcase, showData, _) + local property_id = propertyId + + local handler = exports.ox_target:addBoxZone({ + coords = vector3(coords.x, coords.y, coords.z), + size = vector3(size.y, size.x, size.z), + rotation = heading, + debug = Config.DebugMode, + options = { + { + label = "Gå indenfor", + icon = "fas fa-door-open", + onSelect = enter, + canInteract = function() + local property = Property.Get(property_id) + return property.has_access or property.owner + end, + }, + { + label = "Fremvis ejendom", + icon = "fas fa-eye", + onSelect = showcase, + canInteract = function() + -- local property = Property.Get(property_id) + -- if property.propertyData.owner ~= nil then return false end -- if its owned, it cannot be showcased + + local job = PlayerData.job + local jobName = job.name + + return jobName == Config.RealtorJobName + end, + }, + { + label = "Ejendoms info", + icon = "fas fa-circle-info", + onSelect = showData, + canInteract = function() + local job = PlayerData.job + local jobName = job.name + local onDuty = job.onduty + return jobName == Config.RealtorJobName and onDuty + end, + }, + { + label = "Ring på døren", + icon = "fas fa-bell", + onSelect = enter, + canInteract = function() + local property = Property.Get(property_id) + return not property.has_access and not property.owner + end, + }, + { + label = "Ransag lejlighed", + icon = "fas fa-building-shield", + onSelect = raid, + canInteract = function() + local job = PlayerData.job + local jobName = job.name + local gradeAllowed = tonumber(job.grade.level) >= Config.MinGradeToRaid + local onDuty = job.onduty + + return PoliceJobs[jobName] and onDuty and gradeAllowed + end, + }, + }, + }) + + return handler + end, + + AddApartmentEntrance = function (coords, size, heading, apartment, enter, seeAll, seeAllToRaid, _) + local handler = exports.ox_target:addBoxZone({ + coords = vector3(coords.x, coords.y, coords.z), + size = vector3(size.y, size.x, size.z), + rotation = heading, + debug = Config.DebugMode, + options = { + { + label = "Gå indenfor", + onSelect = enter, + icon = "fas fa-door-open", + canInteract = function() + local apartments = ApartmentsTable[apartment].apartments + return hasApartment(apartments) + end, + }, + { + label = "Se alle lejligheder", + onSelect = seeAll, + icon = "fas fa-circle-info", + }, + { + label = "Ransag lejlighed", + onSelect = seeAllToRaid, + icon = "fas fa-building-shield", + canInteract = function() + local job = PlayerData.job + local jobName = job.name + local gradeAllowed = tonumber(job.grade.level) >= Config.MinGradeToRaid + local onDuty = job.onduty + + return PoliceJobs[jobName] and onDuty and gradeAllowed + end, + }, + }, + }) + + return handler + end, + + AddDoorZoneInside = function (coords, size, heading, leave, checkDoor) + local handler = exports.ox_target:addBoxZone({ + coords = vector3(coords.x, coords.y, coords.z), --z = 3.0 + size = vector3(size.y, size.x, size.z), + rotation = heading, + debug = Config.DebugMode, + options = { + { + name = "leave", + label = "Forlad ejendom", + onSelect = leave, + icon = "fas fa-right-from-bracket", + }, + { + name = "doorbell", + label = "Tjek døren", + onSelect = checkDoor, + icon = "fas fa-bell", + }, + }, + }) + + return handler + end, + + AddDoorZoneInsideTempShell = function (coords, size, heading, leave) + local handler = exports.ox_target:addBoxZone({ + coords = vector3(coords.x, coords.y, coords.z), --z = 3.0 + size = vector3(size.y, size.x, size.z), + rotation = heading, + debug = Config.DebugMode, + options = { + { + name = "leave", + label = "Forlad", + onSelect = leave, + icon = "fas fa-right-from-bracket", + }, + }, + }) + print("made") + return handler + end, + + RemoveTargetZone = function (handler) + exports.ox_target:removeZone(handler) + end, + + AddRadialOption = function(id, label, icon, fn) + lib.addRadialItem({ + id = id, + icon = icon, + label = label, + onSelect = fn, + }) + end, + + RemoveRadialOption = function(id) + lib.removeRadialItem(id) + end, + + AddTargetEntity = function (entity, label, icon, action) + exports.ox_target:addLocalEntity(entity, { + { + name = label, + label = label, + icon = icon, + onSelect = action, + }, + }) + end, + + RemoveTargetEntity = function (entity) + exports.ox_target:removeLocalEntity(entity) + end, + + OpenInventory = function (stash, stashConfig) + exports.ox_inventory:openInventory('stash', stash) + end, +} diff --git a/resources/[ps]/ps-housing/stream/_manifest.ymf b/resources/[ps]/ps-housing/stream/_manifest.ymf new file mode 100644 index 0000000..0f84dc6 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/_manifest.ymf differ diff --git a/resources/[ps]/ps-housing/stream/container_shell.ydr b/resources/[ps]/ps-housing/stream/container_shell.ydr new file mode 100644 index 0000000..2fa7c2b Binary files /dev/null and b/resources/[ps]/ps-housing/stream/container_shell.ydr differ diff --git a/resources/[ps]/ps-housing/stream/frankaunttextures.ytd b/resources/[ps]/ps-housing/stream/frankaunttextures.ytd new file mode 100644 index 0000000..9baa9e1 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/frankaunttextures.ytd differ diff --git a/resources/[ps]/ps-housing/stream/furnitured_midapart.ydr b/resources/[ps]/ps-housing/stream/furnitured_midapart.ydr new file mode 100644 index 0000000..6921663 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/furnitured_midapart.ydr differ diff --git a/resources/[ps]/ps-housing/stream/lesters_txd.ytd b/resources/[ps]/ps-housing/stream/lesters_txd.ytd new file mode 100644 index 0000000..49345d7 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/lesters_txd.ytd differ diff --git a/resources/[ps]/ps-housing/stream/modernhotel_shell.ydr b/resources/[ps]/ps-housing/stream/modernhotel_shell.ydr new file mode 100644 index 0000000..7cb8638 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/modernhotel_shell.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_aqua.ydr b/resources/[ps]/ps-housing/stream/ps_wall_aqua.ydr new file mode 100644 index 0000000..6abb71d Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_aqua.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_aqua.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_aqua.ytyp new file mode 100644 index 0000000..cd74287 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_aqua.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_black.ydr b/resources/[ps]/ps-housing/stream/ps_wall_black.ydr new file mode 100644 index 0000000..6764eb5 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_black.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_black.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_black.ytyp new file mode 100644 index 0000000..03028c1 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_black.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_green.ydr b/resources/[ps]/ps-housing/stream/ps_wall_green.ydr new file mode 100644 index 0000000..de32de4 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_green.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_green.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_green.ytyp new file mode 100644 index 0000000..995018b Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_green.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_grey.ydr b/resources/[ps]/ps-housing/stream/ps_wall_grey.ydr new file mode 100644 index 0000000..73aa475 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_grey.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_grey.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_grey.ytyp new file mode 100644 index 0000000..fe05995 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_grey.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_purple.ydr b/resources/[ps]/ps-housing/stream/ps_wall_purple.ydr new file mode 100644 index 0000000..d1b53e4 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_purple.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_purple.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_purple.ytyp new file mode 100644 index 0000000..0e6f737 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_purple.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_red.ydr b/resources/[ps]/ps-housing/stream/ps_wall_red.ydr new file mode 100644 index 0000000..5055680 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_red.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_red.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_red.ytyp new file mode 100644 index 0000000..bce3a4f Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_red.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_wall.ydr b/resources/[ps]/ps-housing/stream/ps_wall_wall.ydr new file mode 100644 index 0000000..bde1d85 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_wall.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_wall.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_wall.ytyp new file mode 100644 index 0000000..8525b5c Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_wall.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_white.ydr b/resources/[ps]/ps-housing/stream/ps_wall_white.ydr new file mode 100644 index 0000000..08386c0 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_white.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_white.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_white.ytyp new file mode 100644 index 0000000..7a0cc53 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_white.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_yellow.ydr b/resources/[ps]/ps-housing/stream/ps_wall_yellow.ydr new file mode 100644 index 0000000..511e14c Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_yellow.ydr differ diff --git a/resources/[ps]/ps-housing/stream/ps_wall_yellow.ytyp b/resources/[ps]/ps-housing/stream/ps_wall_yellow.ytyp new file mode 100644 index 0000000..f606b3b Binary files /dev/null and b/resources/[ps]/ps-housing/stream/ps_wall_yellow.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/shell_frankaunt.ydr b/resources/[ps]/ps-housing/stream/shell_frankaunt.ydr new file mode 100644 index 0000000..b436a77 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_frankaunt.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_garagem.ydr b/resources/[ps]/ps-housing/stream/shell_garagem.ydr new file mode 100644 index 0000000..144bcfd Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_garagem.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_lester.ydr b/resources/[ps]/ps-housing/stream/shell_lester.ydr new file mode 100644 index 0000000..e49ab68 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_lester.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_michael.ydr b/resources/[ps]/ps-housing/stream/shell_michael.ydr new file mode 100644 index 0000000..de77eab Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_michael.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_office1.ydr b/resources/[ps]/ps-housing/stream/shell_office1.ydr new file mode 100644 index 0000000..13ad1a2 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_office1.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_office1_txd.ytd b/resources/[ps]/ps-housing/stream/shell_office1_txd.ytd new file mode 100644 index 0000000..2be9f5b Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_office1_txd.ytd differ diff --git a/resources/[ps]/ps-housing/stream/shell_ranch.ydr b/resources/[ps]/ps-housing/stream/shell_ranch.ydr new file mode 100644 index 0000000..b2c281a Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_ranch.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_store1.ydr b/resources/[ps]/ps-housing/stream/shell_store1.ydr new file mode 100644 index 0000000..ad753de Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_store1.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_trailer.ydr b/resources/[ps]/ps-housing/stream/shell_trailer.ydr new file mode 100644 index 0000000..73a173e Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_trailer.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_trevor.ydr b/resources/[ps]/ps-housing/stream/shell_trevor.ydr new file mode 100644 index 0000000..cf6bd72 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_trevor.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_v16low.ydr b/resources/[ps]/ps-housing/stream/shell_v16low.ydr new file mode 100644 index 0000000..c99f77f Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_v16low.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_v16mid.ydr b/resources/[ps]/ps-housing/stream/shell_v16mid.ydr new file mode 100644 index 0000000..33562ac Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_v16mid.ydr differ diff --git a/resources/[ps]/ps-housing/stream/shell_warehouse1.ydr b/resources/[ps]/ps-housing/stream/shell_warehouse1.ydr new file mode 100644 index 0000000..aae2346 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/shell_warehouse1.ydr differ diff --git a/resources/[ps]/ps-housing/stream/standardmotel_shell.ydr b/resources/[ps]/ps-housing/stream/standardmotel_shell.ydr new file mode 100644 index 0000000..df6fe66 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/standardmotel_shell.ydr differ diff --git a/resources/[ps]/ps-housing/stream/starter_shells_k4mb1.ytyp b/resources/[ps]/ps-housing/stream/starter_shells_k4mb1.ytyp new file mode 100644 index 0000000..a4bba2f Binary files /dev/null and b/resources/[ps]/ps-housing/stream/starter_shells_k4mb1.ytyp differ diff --git a/resources/[ps]/ps-housing/stream/starter_shells_k4mb1maps.ymap b/resources/[ps]/ps-housing/stream/starter_shells_k4mb1maps.ymap new file mode 100644 index 0000000..514bcb0 Binary files /dev/null and b/resources/[ps]/ps-housing/stream/starter_shells_k4mb1maps.ymap differ diff --git a/resources/[ps]/ps-housing/ui/.gitignore b/resources/[ps]/ps-housing/ui/.gitignore new file mode 100644 index 0000000..ea65588 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/.gitignore @@ -0,0 +1,4 @@ +/node_modules/ + + +.DS_Store diff --git a/resources/[ps]/ps-housing/ui/.prettierrc b/resources/[ps]/ps-housing/ui/.prettierrc new file mode 100644 index 0000000..6582e97 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/.prettierrc @@ -0,0 +1,6 @@ +{ + "tabWidth": 4, + "useTabs": true, + "semi": false, + "singleQuote": true +} diff --git a/resources/[ps]/ps-housing/ui/README.md b/resources/[ps]/ps-housing/ui/README.md new file mode 100644 index 0000000..22f360f --- /dev/null +++ b/resources/[ps]/ps-housing/ui/README.md @@ -0,0 +1,44 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + `vite dev` and `vite build` wouldn't work in a SvelteKit environment, for example. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/resources/[ps]/ps-housing/ui/index.html b/resources/[ps]/ps-housing/ui/index.html new file mode 100644 index 0000000..4a1fb32 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/index.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + ps-housing + + +
+ + + diff --git a/resources/[ps]/ps-housing/ui/package-lock.json b/resources/[ps]/ps-housing/ui/package-lock.json new file mode 100644 index 0000000..5a6e455 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/package-lock.json @@ -0,0 +1,3253 @@ +{ + "name": "would_you_rather", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "would_you_rather", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "1.0.0-next.49", + "@threlte/core": "^5.0.9", + "@threlte/preprocess": "^0.0.2", + "@tsconfig/svelte": "^3.0.0", + "@types/three": "^0.150.1", + "autoprefixer": "^10.4.7", + "magic-string": "^0.30.0", + "postcss": "^8.4.14", + "svelte": "^3.48.0", + "svelte-check": "^2.7.2", + "svelte-preprocess": "^4.10.7", + "svelte-sequential-preprocessor": "^1.0.0", + "tailwindcss": "^3.1.2", + "three": "^0.151.3", + "tslib": "^2.4.0", + "typescript": "^4.7.3", + "vite": "^2.9.12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "1.0.0-next.49", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", + "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", + "kleur": "^4.1.4", + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" + }, + "engines": { + "node": "^14.13.1 || >= 16" + }, + "peerDependencies": { + "diff-match-patch": "^1.0.5", + "svelte": "^3.44.0", + "vite": "^2.9.0" + }, + "peerDependenciesMeta": { + "diff-match-patch": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@threlte/core": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@threlte/core/-/core-5.0.9.tgz", + "integrity": "sha512-3u8SGLD/fzOh0sEf1MDa0FVpp7oLqdEUR8nvGEkWZvGDwKUlhe0XxSmXNzvAYwCSnNLsYYfwiAWy8wBrVkoRlg==", + "dev": true + }, + "node_modules/@threlte/preprocess": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@threlte/preprocess/-/preprocess-0.0.2.tgz", + "integrity": "sha512-Eb3u3nAEBSFpadQvCdeZKy0xE4kgnlmxeTxnzTsmvUJt5ZEadbMg1+/LXn0oAYgFO72YQ62CJ7WI4hmoQSpOeA==", + "dev": true + }, + "node_modules/@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.2.tgz", + "integrity": "sha512-KcfkBq9H4PI6Vpu5B/KoPeuVDAbmi+2mDBqGPGUgoL7yXQtcWGu2vJWmmRkneWK3Rh0nIAX192Aa87AqKHYChQ==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==", + "dev": true + }, + "node_modules/@types/three": { + "version": "0.150.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.150.1.tgz", + "integrity": "sha512-ZXS1M3brsfAAbTeeUEt0defPi98yWQuEyPBnvjEYY1dCEYfJnFaww0mYgRpJ9JVfmtwRxqISpVcv/g/0lMl1DQ==", + "dev": true, + "dependencies": { + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.6.9", + "lil-gui": "~0.17.0" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.1.tgz", + "integrity": "sha512-xlFXPfgJR5vIuDefhaHuUM9uUgvPaXB6GKdXy2gdEh8gBWQZ2ul24AJz3foUd8NNKlSTQuWYJpCb1/pL81m1KQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.51.tgz", + "integrity": "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.51", + "esbuild-android-arm64": "0.14.51", + "esbuild-darwin-64": "0.14.51", + "esbuild-darwin-arm64": "0.14.51", + "esbuild-freebsd-64": "0.14.51", + "esbuild-freebsd-arm64": "0.14.51", + "esbuild-linux-32": "0.14.51", + "esbuild-linux-64": "0.14.51", + "esbuild-linux-arm": "0.14.51", + "esbuild-linux-arm64": "0.14.51", + "esbuild-linux-mips64le": "0.14.51", + "esbuild-linux-ppc64le": "0.14.51", + "esbuild-linux-riscv64": "0.14.51", + "esbuild-linux-s390x": "0.14.51", + "esbuild-netbsd-64": "0.14.51", + "esbuild-openbsd-64": "0.14.51", + "esbuild-sunos-64": "0.14.51", + "esbuild-windows-32": "0.14.51", + "esbuild-windows-64": "0.14.51", + "esbuild-windows-arm64": "0.14.51" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz", + "integrity": "sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz", + "integrity": "sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz", + "integrity": "sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz", + "integrity": "sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz", + "integrity": "sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz", + "integrity": "sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz", + "integrity": "sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz", + "integrity": "sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz", + "integrity": "sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz", + "integrity": "sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz", + "integrity": "sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz", + "integrity": "sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz", + "integrity": "sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz", + "integrity": "sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz", + "integrity": "sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz", + "integrity": "sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz", + "integrity": "sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz", + "integrity": "sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz", + "integrity": "sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz", + "integrity": "sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lil-gui": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz", + "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==", + "dev": true + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "2.77.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", + "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + }, + "bin": { + "sorcery": "bin/index.js" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.58.0.tgz", + "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.0.tgz", + "integrity": "sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.24.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": ">=3.19.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 9.11.2" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/svelte-sequential-preprocessor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svelte-sequential-preprocessor/-/svelte-sequential-preprocessor-1.0.0.tgz", + "integrity": "sha512-V27TbHy4HzknJEIRSTzf1Yns+l06w3WWc/56BeZk6XZjBjxUniUtyQWNhQLhKRhllq06VqaaeYpTzqpwncSC5Q==", + "dev": true, + "dependencies": { + "svelte": "^3.55.1", + "tslib": "~2.5.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tailwindcss": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz", + "integrity": "sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/three": { + "version": "0.151.3", + "resolved": "https://registry.npmjs.org/three/-/three-0.151.3.tgz", + "integrity": "sha512-+vbuqxFy8kzLeO5MgpBHUvP/EAiecaDwDuOPPDe6SbrZr96kccF0ktLngXc7xA7bzyd3N0t2f6mw3Z9y6JCojQ==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.14.tgz", + "integrity": "sha512-P/UCjSpSMcE54r4mPak55hWAZPlyfS369svib/gpmz8/01L822lMPOJ/RYW6tLCe1RPvMvOsJ17erf55bKp4Hw==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@sveltejs/vite-plugin-svelte": { + "version": "1.0.0-next.49", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", + "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", + "kleur": "^4.1.4", + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" + }, + "dependencies": { + "magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "@threlte/core": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@threlte/core/-/core-5.0.9.tgz", + "integrity": "sha512-3u8SGLD/fzOh0sEf1MDa0FVpp7oLqdEUR8nvGEkWZvGDwKUlhe0XxSmXNzvAYwCSnNLsYYfwiAWy8wBrVkoRlg==", + "dev": true + }, + "@threlte/preprocess": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@threlte/preprocess/-/preprocess-0.0.2.tgz", + "integrity": "sha512-Eb3u3nAEBSFpadQvCdeZKy0xE4kgnlmxeTxnzTsmvUJt5ZEadbMg1+/LXn0oAYgFO72YQ62CJ7WI4hmoQSpOeA==", + "dev": true + }, + "@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "@types/node": { + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.2.tgz", + "integrity": "sha512-KcfkBq9H4PI6Vpu5B/KoPeuVDAbmi+2mDBqGPGUgoL7yXQtcWGu2vJWmmRkneWK3Rh0nIAX192Aa87AqKHYChQ==", + "dev": true + }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==", + "dev": true + }, + "@types/three": { + "version": "0.150.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.150.1.tgz", + "integrity": "sha512-ZXS1M3brsfAAbTeeUEt0defPi98yWQuEyPBnvjEYY1dCEYfJnFaww0mYgRpJ9JVfmtwRxqISpVcv/g/0lMl1DQ==", + "dev": true, + "requires": { + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.6.9", + "lil-gui": "~0.17.0" + } + }, + "@types/webxr": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.1.tgz", + "integrity": "sha512-xlFXPfgJR5vIuDefhaHuUM9uUgvPaXB6GKdXy2gdEh8gBWQZ2ul24AJz3foUd8NNKlSTQuWYJpCb1/pL81m1KQ==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", + "dev": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "esbuild": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.51.tgz", + "integrity": "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==", + "dev": true, + "requires": { + "esbuild-android-64": "0.14.51", + "esbuild-android-arm64": "0.14.51", + "esbuild-darwin-64": "0.14.51", + "esbuild-darwin-arm64": "0.14.51", + "esbuild-freebsd-64": "0.14.51", + "esbuild-freebsd-arm64": "0.14.51", + "esbuild-linux-32": "0.14.51", + "esbuild-linux-64": "0.14.51", + "esbuild-linux-arm": "0.14.51", + "esbuild-linux-arm64": "0.14.51", + "esbuild-linux-mips64le": "0.14.51", + "esbuild-linux-ppc64le": "0.14.51", + "esbuild-linux-riscv64": "0.14.51", + "esbuild-linux-s390x": "0.14.51", + "esbuild-netbsd-64": "0.14.51", + "esbuild-openbsd-64": "0.14.51", + "esbuild-sunos-64": "0.14.51", + "esbuild-windows-32": "0.14.51", + "esbuild-windows-64": "0.14.51", + "esbuild-windows-arm64": "0.14.51" + } + }, + "esbuild-android-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz", + "integrity": "sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz", + "integrity": "sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz", + "integrity": "sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz", + "integrity": "sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz", + "integrity": "sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz", + "integrity": "sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz", + "integrity": "sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz", + "integrity": "sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz", + "integrity": "sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz", + "integrity": "sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz", + "integrity": "sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz", + "integrity": "sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz", + "integrity": "sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz", + "integrity": "sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz", + "integrity": "sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz", + "integrity": "sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz", + "integrity": "sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz", + "integrity": "sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz", + "integrity": "sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz", + "integrity": "sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": 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 + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "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==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, + "lil-gui": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz", + "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==", + "dev": true + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true + }, + "magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, + "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 + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.77.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", + "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svelte": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.58.0.tgz", + "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", + "dev": true + }, + "svelte-check": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.0.tgz", + "integrity": "sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + } + }, + "svelte-hmr": { + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", + "dev": true, + "requires": {} + }, + "svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "requires": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "svelte-sequential-preprocessor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svelte-sequential-preprocessor/-/svelte-sequential-preprocessor-1.0.0.tgz", + "integrity": "sha512-V27TbHy4HzknJEIRSTzf1Yns+l06w3WWc/56BeZk6XZjBjxUniUtyQWNhQLhKRhllq06VqaaeYpTzqpwncSC5Q==", + "dev": true, + "requires": { + "svelte": "^3.55.1", + "tslib": "~2.5.0" + } + }, + "tailwindcss": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz", + "integrity": "sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg==", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.14", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "three": { + "version": "0.151.3", + "resolved": "https://registry.npmjs.org/three/-/three-0.151.3.tgz", + "integrity": "sha512-+vbuqxFy8kzLeO5MgpBHUvP/EAiecaDwDuOPPDe6SbrZr96kccF0ktLngXc7xA7bzyd3N0t2f6mw3Z9y6JCojQ==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vite": { + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.14.tgz", + "integrity": "sha512-P/UCjSpSMcE54r4mPak55hWAZPlyfS369svib/gpmz8/01L822lMPOJ/RYW6tLCe1RPvMvOsJ17erf55bKp4Hw==", + "dev": true, + "requires": { + "esbuild": "^0.14.27", + "fsevents": "~2.3.2", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } +} diff --git a/resources/[ps]/ps-housing/ui/package.json b/resources/[ps]/ps-housing/ui/package.json new file mode 100644 index 0000000..3a79411 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/package.json @@ -0,0 +1,30 @@ +{ + "name": "would_you_rather", + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "1.0.0-next.49", + "@threlte/core": "^5.0.9", + "@threlte/preprocess": "^0.0.2", + "@tsconfig/svelte": "^3.0.0", + "@types/three": "^0.150.1", + "autoprefixer": "^10.4.7", + "magic-string": "^0.30.0", + "postcss": "^8.4.14", + "svelte": "^3.48.0", + "svelte-check": "^2.7.2", + "svelte-preprocess": "^4.10.7", + "svelte-sequential-preprocessor": "^1.0.0", + "tailwindcss": "^3.1.2", + "three": "^0.151.3", + "tslib": "^2.4.0", + "typescript": "^4.7.3", + "vite": "^2.9.12" + } +} diff --git a/resources/[ps]/ps-housing/ui/pnpm-lock.yaml b/resources/[ps]/ps-housing/ui/pnpm-lock.yaml new file mode 100644 index 0000000..7b11f97 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/pnpm-lock.yaml @@ -0,0 +1,1143 @@ +lockfileVersion: 5.4 + +specifiers: + '@fortawesome/fontawesome-free': ^6.1.1 + '@sveltejs/vite-plugin-svelte': 1.0.0-next.49 + '@tsconfig/svelte': ^3.0.0 + autoprefixer: ^10.4.7 + postcss: ^8.4.14 + svelte: ^3.48.0 + svelte-check: ^2.7.2 + svelte-preprocess: ^4.10.7 + tailwindcss: ^3.1.2 + tslib: ^2.4.0 + typescript: ^4.7.3 + vite: ^2.9.12 + +dependencies: + '@fortawesome/fontawesome-free': 6.1.1 + +devDependencies: + '@sveltejs/vite-plugin-svelte': 1.0.0-next.49_svelte@3.48.0+vite@2.9.12 + '@tsconfig/svelte': 3.0.0 + autoprefixer: 10.4.7_postcss@8.4.14 + postcss: 8.4.14 + svelte: 3.48.0 + svelte-check: 2.7.2_s3dopqgs4h45owyu2kxaf6kyfu + svelte-preprocess: 4.10.7_ul755q3dxsprj73ozc64nxdp4y + tailwindcss: 3.1.3 + tslib: 2.4.0 + typescript: 4.7.3 + vite: 2.9.12 + +packages: + + /@fortawesome/fontawesome-free/6.1.1: + resolution: {integrity: sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg==} + engines: {node: '>=6'} + requiresBuild: true + dev: false + + /@jridgewell/resolve-uri/3.0.7: + resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.13: + resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} + dev: true + + /@jridgewell/trace-mapping/0.3.13: + resolution: {integrity: sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==} + dependencies: + '@jridgewell/resolve-uri': 3.0.7 + '@jridgewell/sourcemap-codec': 1.4.13 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@rollup/pluginutils/4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@sveltejs/vite-plugin-svelte/1.0.0-next.49_svelte@3.48.0+vite@2.9.12: + resolution: {integrity: sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==} + engines: {node: ^14.13.1 || >= 16} + peerDependencies: + diff-match-patch: ^1.0.5 + svelte: ^3.44.0 + vite: ^2.9.0 + peerDependenciesMeta: + diff-match-patch: + optional: true + dependencies: + '@rollup/pluginutils': 4.2.1 + debug: 4.3.4 + deepmerge: 4.2.2 + kleur: 4.1.4 + magic-string: 0.26.2 + svelte: 3.48.0 + svelte-hmr: 0.14.12_svelte@3.48.0 + vite: 2.9.12 + transitivePeerDependencies: + - supports-color + dev: true + + /@tsconfig/svelte/3.0.0: + resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==} + dev: true + + /@types/node/17.0.42: + resolution: {integrity: sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ==} + dev: true + + /@types/pug/2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /@types/sass/1.43.1: + resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} + dependencies: + '@types/node': 17.0.42 + dev: true + + /acorn-node/1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + dev: true + + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /autoprefixer/10.4.7_postcss@8.4.14: + resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.20.4 + caniuse-lite: 1.0.30001352 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.20.4: + resolution: {integrity: sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001352 + electron-to-chromium: 1.4.154 + escalade: 3.1.1 + node-releases: 2.0.5 + picocolors: 1.0.0 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite/1.0.30001352: + resolution: {integrity: sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==} + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /defined/1.0.0: + resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detective/5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + acorn-node: 1.8.2 + defined: 1.0.0 + minimist: 1.2.6 + dev: true + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /electron-to-chromium/1.4.154: + resolution: {integrity: sha512-GbV9djOkrnj6xmW+YYVVEI3VCQnJ0pnSTu7TW2JyjKd5cakoiSaG5R4RbEtfaD92GsY10DzbU3GYRe+IOA9kqA==} + dev: true + + /es6-promise/3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + + /esbuild-android-64/0.14.43: + resolution: {integrity: sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.14.43: + resolution: {integrity: sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.14.43: + resolution: {integrity: sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.14.43: + resolution: {integrity: sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.14.43: + resolution: {integrity: sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.14.43: + resolution: {integrity: sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.14.43: + resolution: {integrity: sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.14.43: + resolution: {integrity: sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.14.43: + resolution: {integrity: sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.14.43: + resolution: {integrity: sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.14.43: + resolution: {integrity: sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.14.43: + resolution: {integrity: sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.14.43: + resolution: {integrity: sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.14.43: + resolution: {integrity: sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.14.43: + resolution: {integrity: sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.14.43: + resolution: {integrity: sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.14.43: + resolution: {integrity: sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.14.43: + resolution: {integrity: sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.14.43: + resolution: {integrity: sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.14.43: + resolution: {integrity: sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.14.43: + resolution: {integrity: sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.43 + esbuild-android-arm64: 0.14.43 + esbuild-darwin-64: 0.14.43 + esbuild-darwin-arm64: 0.14.43 + esbuild-freebsd-64: 0.14.43 + esbuild-freebsd-arm64: 0.14.43 + esbuild-linux-32: 0.14.43 + esbuild-linux-64: 0.14.43 + esbuild-linux-arm: 0.14.43 + esbuild-linux-arm64: 0.14.43 + esbuild-linux-mips64le: 0.14.43 + esbuild-linux-ppc64le: 0.14.43 + esbuild-linux-riscv64: 0.14.43 + esbuild-linux-s390x: 0.14.43 + esbuild-netbsd-64: 0.14.43 + esbuild-openbsd-64: 0.14.43 + esbuild-sunos-64: 0.14.43 + esbuild-windows-32: 0.14.43 + esbuild-windows-64: 0.14.43 + esbuild-windows-arm64: 0.14.43 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /fast-glob/3.2.11: + resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /kleur/4.1.4: + resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + engines: {node: '>=6'} + dev: true + + /lilconfig/2.0.5: + resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + engines: {node: '>=10'} + dev: true + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string/0.26.2: + resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases/2.0.5: + resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash/3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-import/14.1.0_postcss@8.4.14: + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.0 + dev: true + + /postcss-js/4.0.0_postcss@8.4.14: + resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.3.3 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.14 + dev: true + + /postcss-load-config/3.1.4_postcss@8.4.14: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.0.5 + postcss: 8.4.14 + yaml: 1.10.2 + dev: true + + /postcss-nested/5.0.6_postcss@8.4.14: + resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-selector-parser/6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /read-cache/1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve/1.22.0: + resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup/2.75.6: + resolution: {integrity: sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /sander/0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /sorcery/0.10.0: + resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} + hasBin: true + dependencies: + buffer-crc32: 0.2.13 + minimist: 1.2.6 + sander: 0.5.1 + sourcemap-codec: 1.4.8 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-check/2.7.2_s3dopqgs4h45owyu2kxaf6kyfu: + resolution: {integrity: sha512-TuVX4YtXHbRM8sVuK5Jk+mKWdm3f0d6hvAC6qCTp8yUszGZewpEBCo2V5fRWZCiz+0J4OCiDHOS+DFMxv39rJA==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.13 + chokidar: 3.5.3 + fast-glob: 3.2.11 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 3.48.0 + svelte-preprocess: 4.10.7_ul755q3dxsprj73ozc64nxdp4y + typescript: 4.7.3 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr/0.14.12_svelte@3.48.0: + resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.48.0 + dev: true + + /svelte-preprocess/4.10.7_ul755q3dxsprj73ozc64nxdp4y: + resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} + engines: {node: '>= 9.11.2'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + '@types/sass': 1.43.1 + detect-indent: 6.1.0 + magic-string: 0.25.9 + postcss: 8.4.14 + sorcery: 0.10.0 + strip-indent: 3.0.0 + svelte: 3.48.0 + typescript: 4.7.3 + dev: true + + /svelte/3.48.0: + resolution: {integrity: sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==} + engines: {node: '>= 8'} + dev: true + + /tailwindcss/3.1.3: + resolution: {integrity: sha512-PRJNYdSIthrb8hjmAyymEyEN8Yo61TMXpzyFUpxULeeyRn3Y3gpvuw6FlRTKrJvK7thSGKRnhT36VovVx4WeMA==} + engines: {node: '>=12.13.0'} + hasBin: true + dependencies: + arg: 5.0.2 + chokidar: 3.5.3 + color-name: 1.1.4 + detective: 5.2.1 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.11 + glob-parent: 6.0.2 + is-glob: 4.0.3 + lilconfig: 2.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.14 + postcss-import: 14.1.0_postcss@8.4.14 + postcss-js: 4.0.0_postcss@8.4.14 + postcss-load-config: 3.1.4_postcss@8.4.14 + postcss-nested: 5.0.6_postcss@8.4.14 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.0 + transitivePeerDependencies: + - ts-node + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: true + + /typescript/4.7.3: + resolution: {integrity: sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /vite/2.9.12: + resolution: {integrity: sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==} + engines: {node: '>=12.2.0'} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + dependencies: + esbuild: 0.14.43 + postcss: 8.4.14 + resolve: 1.22.0 + rollup: 2.75.6 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true diff --git a/resources/[ps]/ps-housing/ui/postcss.config.js b/resources/[ps]/ps-housing/ui/postcss.config.js new file mode 100644 index 0000000..d175d1e --- /dev/null +++ b/resources/[ps]/ps-housing/ui/postcss.config.js @@ -0,0 +1,7 @@ +import tailwind from 'tailwindcss'; +import autoprefixer from 'autoprefixer'; +import tailwindConfig from './tailwind.config.cjs'; + +export default { + plugins: [tailwind(tailwindConfig), autoprefixer], +} diff --git a/resources/[ps]/ps-housing/ui/src/App.svelte b/resources/[ps]/ps-housing/ui/src/App.svelte new file mode 100644 index 0000000..06a035e --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/App.svelte @@ -0,0 +1,33 @@ + + + + {#if $FURNITURES} + + + {/if} + + + +{#if $browserMode} + + +{/if} diff --git a/resources/[ps]/ps-housing/ui/src/Tailwind.css b/resources/[ps]/ps-housing/ui/src/Tailwind.css new file mode 100644 index 0000000..4507869 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/Tailwind.css @@ -0,0 +1,74 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +* { + margin: 0; + padding: 0; + font-family: 'Satoshi', sans-serif; + color: #fff; +} + +*:focus { + outline: none; +} + +:root { + font-size: 62.5%; + --color-primary: #131313; + --color-secondary: #1f2528; + --color-tertiary: #26343a; + --color-accent: #00889E; +} + +html, body { +height: 100vh; +width: 100vw; +font-size: 1.6rem; +overflow: hidden; +} + +::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +.scroll-style-horizontal::-webkit-scrollbar { + height: 0.5rem; + width: 100%; +} + +.scroll-style-vertical::-webkit-scrollbar { + width: 0.5rem; + height: 100%; +} + +.scroll-style::-webkit-scrollbar-track { + background: whtie; +} + +.scroll-style::-webkit-scrollbar-thumb { + background: var(--color-accent); + border-radius: 1rem; +} + +input#slider[type='range'] { + height: 1rem; + -webkit-appearance: none; + width: 100%; +} + +input#slider[type='range']::-webkit-slider-runnable-track { + width: 100%; + height: 2rem; + cursor: pointer; + background: var(--color-secondary); +} + +input#slider[type='range']::-webkit-slider-thumb { + height: 2rem; + width: 2rem; + background: white; + cursor: pointer; + -webkit-appearance: none; +} \ No newline at end of file diff --git a/resources/[ps]/ps-housing/ui/src/components/Cart.svelte b/resources/[ps]/ps-housing/ui/src/components/Cart.svelte new file mode 100644 index 0000000..29417da --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/components/Cart.svelte @@ -0,0 +1,78 @@ + + +{#if $IS_CART_OPEN} +
+
+

YOUR SHOPPING CART

+
+
+ {#each $CART as item, i} + + + {/each} +
+
+
+

+ SUBTOTAL: +

+

+ ${$CART.reduce((acc, item) => acc + item.price, 0)} +

+
+
+ + +
+
+
+{/if} diff --git a/resources/[ps]/ps-housing/ui/src/components/Header.svelte b/resources/[ps]/ps-housing/ui/src/components/Header.svelte new file mode 100644 index 0000000..4bab4fb --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/components/Header.svelte @@ -0,0 +1,153 @@ + + +
+ + + {#if showSearch} + + {/if} + + +
+ + {#each $FURNITURES as category, i} + + {/each} +
+ +
+ + + +
+
+ + diff --git a/resources/[ps]/ps-housing/ui/src/components/ItemList.svelte b/resources/[ps]/ps-housing/ui/src/components/ItemList.svelte new file mode 100644 index 0000000..6586ff2 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/components/ItemList.svelte @@ -0,0 +1,151 @@ + + +
+
+ + {#each $SHOWFURNITURES.items as furniture, i} + + {/each} +
+
+ +{#if showModal} + +
+
+

+ Are you sure you want to stop placing this current + furniture? +

+
+ + +
+
+
+
+{/if} diff --git a/resources/[ps]/ps-housing/ui/src/components/Menu.svelte b/resources/[ps]/ps-housing/ui/src/components/Menu.svelte new file mode 100644 index 0000000..7a040fa --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/components/Menu.svelte @@ -0,0 +1,73 @@ + + + + + +
+
+ + + +
+ +

C

+
+
+ +

{hoverDistance.toFixed(1)}

+ { + SendNUI("setHoverDistance", hoverDistance) + }} + class="w-full" + /> +
+ +
\ No newline at end of file diff --git a/resources/[ps]/ps-housing/ui/src/components/Modeler.svelte b/resources/[ps]/ps-housing/ui/src/components/Modeler.svelte new file mode 100644 index 0000000..2146ac4 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/components/Modeler.svelte @@ -0,0 +1,338 @@ + + +{#if $show} +
+ +
+
+ +
+ + +
+
+

Translation Snap

+
+ +

x

{$objectPosition.x.toFixed(2)}

+

y

{-$objectPosition.z.toFixed(2)}

+

z

{$objectPosition.y.toFixed(2)}

+
+
+
+
+ {translationSnap} +
+ +
+ +
+

Rotation Snap

+
+

x

{MathUtils.radToDeg($objectEuler.x).toFixed(2)}

+

y

{MathUtils.radToDeg($objectEuler.y).toFixed(2)}

+

z

{MathUtils.radToDeg($objectEuler.z).toFixed(2)}

+
+
+
+
+ {rotationSnapDegrees} +
+ +
+

Object Alpha

+
+ +
+ +
+ +
+ + + {#if $entity == null} + + {/if} + + + + + + + { + getMeshLocation() + }} + on:dragging-changed={(event) => { + const isDragging = event.detail.value + if (!isDragging) { + if ($entity != null) { + const item = $CART.find((item) => item.entity === $entity) + if (item === undefined) return + const gtaPos = convertToGTACordSystem($objectPosition); + item.position = gtaPos + const gtaRot = convertToGTACordSystem($objectEuler); + item.rotation = gtaRot + $CART = [...$CART] + SendNUI('updateCartItem', item) + } + } + }} + {translationSnap} + rotationSnap={MathUtils.degToRad(rotationSnapDegrees)} + size={0.5} + space="local" + /> + + +
+{/if} diff --git a/resources/[ps]/ps-housing/ui/src/components/OwnedItems.svelte b/resources/[ps]/ps-housing/ui/src/components/OwnedItems.svelte new file mode 100644 index 0000000..dc46115 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/components/OwnedItems.svelte @@ -0,0 +1,56 @@ + + + + + +{#if $IS_OWNEDITEMS_OPEN} +
+
+

+ Owned Items +

+ +
+
+ {#each $OWNEDITEMS as item, i} +
+ +
+

{item.label}

+
+ +
+ {/each} +
+
+{/if} diff --git a/resources/[ps]/ps-housing/ui/src/components/Portal.svelte b/resources/[ps]/ps-housing/ui/src/components/Portal.svelte new file mode 100644 index 0000000..39033ee --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/components/Portal.svelte @@ -0,0 +1,11 @@ + + +
+ +
diff --git a/resources/[ps]/ps-housing/ui/src/customTypes/type.ts b/resources/[ps]/ps-housing/ui/src/customTypes/type.ts new file mode 100644 index 0000000..0e0573f --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/customTypes/type.ts @@ -0,0 +1,20 @@ +export interface position { + x: number; + y: number; + z: number; +} + +export interface quaternion { + x: number; + y: number; + z: number; + w: number; +} + +export function convertToThreeCordSystem(pos: position): position { + return { x: pos.x, y: pos.z, z: -pos.y }; +} + +export function convertToGTACordSystem(pos: position): position { + return {x: pos.x, y: -pos.z, z: pos.y }; +} diff --git a/resources/[ps]/ps-housing/ui/src/main.ts b/resources/[ps]/ps-housing/ui/src/main.ts new file mode 100644 index 0000000..44c8f92 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/main.ts @@ -0,0 +1,8 @@ +import App from './App.svelte' +import './Tailwind.css' + +const app = new App({ + target: document.getElementById('app') + }) + +export default app diff --git a/resources/[ps]/ps-housing/ui/src/providers/AlwaysListener.svelte b/resources/[ps]/ps-housing/ui/src/providers/AlwaysListener.svelte new file mode 100644 index 0000000..bdb1b73 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/providers/AlwaysListener.svelte @@ -0,0 +1,97 @@ + diff --git a/resources/[ps]/ps-housing/ui/src/providers/BackdropFix.svelte b/resources/[ps]/ps-housing/ui/src/providers/BackdropFix.svelte new file mode 100644 index 0000000..57dd0c6 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/providers/BackdropFix.svelte @@ -0,0 +1,192 @@ + + +
+ +
+ + \ No newline at end of file diff --git a/resources/[ps]/ps-housing/ui/src/providers/DebugBrowser.svelte b/resources/[ps]/ps-housing/ui/src/providers/DebugBrowser.svelte new file mode 100644 index 0000000..61a7240 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/providers/DebugBrowser.svelte @@ -0,0 +1,123 @@ + + + +
+ + {#if show} +
+ {#each options as option} +
+

{option.component}

+ {#each option.actions as action} + + {/each} +
+ {/each} +
+ {/if} +
\ No newline at end of file diff --git a/resources/[ps]/ps-housing/ui/src/providers/VisibilityProvider.svelte b/resources/[ps]/ps-housing/ui/src/providers/VisibilityProvider.svelte new file mode 100644 index 0000000..7646045 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/providers/VisibilityProvider.svelte @@ -0,0 +1,104 @@ + + +{#if isVisible} +
+ +
+ +{/if} + +{#if showModal && isVisible} + +
+
+

+ Are you sure you want to exit? You have items in your cart. +

+
+ + +
+
+
+ +
+ +{/if} + + + diff --git a/resources/[ps]/ps-housing/ui/src/store/ModelStore.ts b/resources/[ps]/ps-housing/ui/src/store/ModelStore.ts new file mode 100644 index 0000000..5e6abfd --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/store/ModelStore.ts @@ -0,0 +1,103 @@ +import { writable } from "svelte/store"; +import type { Writable } from 'svelte/store'; +import { SendNUI } from "@utils/SendNUI"; +import type { position, quaternion } from '@customTypes/type'; +import { convertToThreeCordSystem, convertToGTACordSystem } from '@customTypes/type'; +import { type Quaternion, Euler } from "three"; +import { Quaternion as Quan, MathUtils } from 'three' + +interface modelState { + show: Writable; + cameraLookAt: Writable; + cameraPosition: Writable; + objectPosition: Writable; + objectEuler: Writable; + entity: Writable; +} + +interface setupModelMessage { + objectPosition: position; + objectRotation: position; + cameraPosition: position; + cameraLookAt: position; + entity: number; +} + +interface updateCameraPositionMessage { + cameraPosition: position; +} + +interface updateCameraLookAtMessage { + cameraLookAt: position; +} + +interface updateCameraMessage extends updateCameraPositionMessage, updateCameraLookAtMessage { + objectPosition: position; +} + +function directionalVector(startPos: position, endPos: position): position { + return { + x: endPos.x - startPos.x, + y: endPos.y - startPos.y, + z: endPos.z - startPos.z, + } +} + +const store = () => { + const ModelStore: modelState = { + show: writable(false), + cameraPosition: writable({ x: 0, y: 0, z: 1 }), + cameraLookAt: writable({ x: 0, y: 0, z: 10 }), + objectPosition: writable({ x: 0, y: 0, z: 10 }), + objectEuler: writable(new Euler(0, 0, 0, "ZXY")), + entity: writable(0), + } + + const methods = { + setupModel(data: setupModelMessage) { + ModelStore.cameraPosition.set(convertToThreeCordSystem(data.cameraPosition)); + ModelStore.cameraLookAt.set(convertToThreeCordSystem(data.cameraLookAt)); + ModelStore.objectPosition.set(convertToThreeCordSystem(data.objectPosition)); + ModelStore.objectEuler.set(new Euler( + MathUtils.degToRad(data.objectRotation.x), + MathUtils.degToRad(data.objectRotation.z), + MathUtils.degToRad(data.objectRotation.y), + 'YZX')) + ModelStore.show.set(true); + ModelStore.entity.set(data.entity); + }, + updateCamera(data: updateCameraMessage) { + ModelStore.cameraPosition.set(convertToThreeCordSystem(data.cameraPosition)); + ModelStore.cameraLookAt.set(convertToThreeCordSystem(data.cameraLookAt)); + // ModelStore.objectPosition.set(convertToThreeCordSystem(data.objectPosition)); + // ModelStore.objectQuaternion.set(new Quan( + // data.objectQuaternion.x, data.objectQuaternion.y, data.objectQuaternion.z, data.objectQuaternion.w)); + }, + updateCameraPosition(data: updateCameraPositionMessage) { + // console.log("Update Camera Position in store:", data.cameraPosition); + ModelStore.cameraPosition.set(data.cameraPosition); + }, + updateCameraLookAt(data: updateCameraLookAtMessage) { + ModelStore.cameraLookAt.set(data.cameraLookAt); + }, + sendMovementUpdate(pos: position) { + SendNUI("moveObject", pos); + }, + sendRotationUpdate(euler: position) { + const gtaCoords = convertToGTACordSystem(euler); + SendNUI("rotateObject", { + x: MathUtils.radToDeg(gtaCoords.x).toFixed(2), + y: MathUtils.radToDeg(gtaCoords.y).toFixed(2), //for some reason the z axis is inverted + z: MathUtils.radToDeg(gtaCoords.z).toFixed(2), + }); + } + + } + + return { + ...ModelStore, + ...methods + } +} + +export default store(); \ No newline at end of file diff --git a/resources/[ps]/ps-housing/ui/src/store/stores.ts b/resources/[ps]/ps-housing/ui/src/store/stores.ts new file mode 100644 index 0000000..f6616fa --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/store/stores.ts @@ -0,0 +1,48 @@ +import type { position } from "@customTypes/type"; +import { writable } from "svelte/store"; + +export const visibility = writable(false); +export const browserMode = writable(false); +export const resName = writable(""); + +interface IFurniture { + label: string; + object: string; + price: number; + type?: string; + max?: number; +} + +interface IOwnedFurniture extends IFurniture { + id: string; +} + +interface IFurnitures { + category: string + items: IFurniture[]; +} + + + + +export const FURNITURES = writable(null); + +export const SHOWFURNITURES = writable(null); + +export const CURRENTFURNITURE = writable(null); + +export const IS_MENU_MINIMIZED = writable(false); + +export const IS_CART_OPEN = writable(false); + +export const IS_OWNEDITEMS_OPEN = writable(false); + +export const OWNEDITEMS = writable([]); + +interface ICartItem extends IFurniture { + entity: number; + position: position + rotation: position +} + +export const CART = writable([]); diff --git a/resources/[ps]/ps-housing/ui/src/utils/ReceiveNUI.ts b/resources/[ps]/ps-housing/ui/src/utils/ReceiveNUI.ts new file mode 100644 index 0000000..7bd3467 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/utils/ReceiveNUI.ts @@ -0,0 +1,32 @@ +import { onMount, onDestroy } from "svelte"; + +interface NuiMessage { + action: string; + data: T; +} + +/** + * A function that manage events listeners for receiving data from the client scripts + * @param action The specific `action` that should be listened for. + * @param handler The callback function that will handle data relayed by this function + * + * @example + * useNuiEvent<{visibility: true, wasVisible: 'something'}>('setVisible', (data) => { + * // whatever logic you want + * }) + * + **/ + +export function ReceiveNUI( + action: string, + handler: (data: T) => void +) { + const eventListener = (event: MessageEvent>) => { + const { action: eventAction, data } = event.data; + + eventAction === action && handler(data); + }; + onMount(() => window.addEventListener("message", eventListener)); + onDestroy(() => window.removeEventListener("message", eventListener)); +} + diff --git a/resources/[ps]/ps-housing/ui/src/utils/SendNUI.ts b/resources/[ps]/ps-housing/ui/src/utils/SendNUI.ts new file mode 100644 index 0000000..1cd562c --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/utils/SendNUI.ts @@ -0,0 +1,43 @@ +import { browserMode, resName } from '@store/stores' + +let isBrowserMode: boolean = false; +browserMode.subscribe((value: boolean) => { + isBrowserMode = value; +}); + +let debugResName: string = ""; +resName.subscribe((value: string) => { + debugResName = value; +}); + +/** +* @param eventName - The endpoint eventname to target +* @param data - Data you wish to send in the NUI Callback +* +* @return returnData - A promise for the data sent back by the NuiCallbacks CB argument +*/ + +export async function SendNUI( + eventName: string, + data: unknown = {}, + debugReturn?: T +): Promise { + if (isBrowserMode == true && debugReturn) { + return Promise.resolve(debugReturn || {} as T) + } + const options = { + method: "post", + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + body: JSON.stringify(data), + }; + + const resourceName = (window as any).GetParentResourceName + ? (window as any).GetParentResourceName() + : debugResName; + + + const resp: Response = await fetch(`https://${resourceName}/${eventName}`, options); + return await resp.json() +} diff --git a/resources/[ps]/ps-housing/ui/src/utils/debugData.ts b/resources/[ps]/ps-housing/ui/src/utils/debugData.ts new file mode 100644 index 0000000..3c4f083 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/utils/debugData.ts @@ -0,0 +1,30 @@ +import {isEnvBrowser} from "./misc"; + +interface DebugEvent { + action: string; + data: T; +} + +/** + * Emulates dispatching an event using SendNuiMessage in the lua scripts. + * This is used when developing in browser + * + * @param events - The event you want to cover + * @param timer - How long until it should trigger (ms) + */ +export const debugData =

(events: DebugEvent

[], timer = 0): void => { + if (isEnvBrowser()) { + for (const event of events) { + setTimeout(() => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + action: event.action, + data: event.data, + }, + }) + ); + }, timer); + } + } +}; \ No newline at end of file diff --git a/resources/[ps]/ps-housing/ui/src/utils/misc.ts b/resources/[ps]/ps-housing/ui/src/utils/misc.ts new file mode 100644 index 0000000..9b10ce4 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/utils/misc.ts @@ -0,0 +1 @@ +export const isEnvBrowser = (): boolean => !(window as any).invokeNative; \ No newline at end of file diff --git a/resources/[ps]/ps-housing/ui/src/vite-env.d.ts b/resources/[ps]/ps-housing/ui/src/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/resources/[ps]/ps-housing/ui/svelte.config.js b/resources/[ps]/ps-housing/ui/svelte.config.js new file mode 100644 index 0000000..85416d5 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/svelte.config.js @@ -0,0 +1,9 @@ +import sveltePreprocess from 'svelte-preprocess' +import seqPreprocessor from 'svelte-sequential-preprocessor' +import { preprocessThrelte } from '@threlte/preprocess' + +export default { + // Consult https://github.com/sveltejs/svelte-preprocess + // for more information about preprocessors + preprocess: seqPreprocessor([sveltePreprocess(), preprocessThrelte()]) +} diff --git a/resources/[ps]/ps-housing/ui/tailwind.config.cjs b/resources/[ps]/ps-housing/ui/tailwind.config.cjs new file mode 100644 index 0000000..63b5ba9 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/tailwind.config.cjs @@ -0,0 +1,11 @@ +module.exports = { + darkmode: true, + content: [ + "./index.html", + "./src/**/*.{svelte,js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/resources/[ps]/ps-housing/ui/tsconfig.json b/resources/[ps]/ps-housing/ui/tsconfig.json new file mode 100644 index 0000000..33bb4d7 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "resolveJsonModule": true, + "baseUrl": ".", + "paths": { + "@assets/*": ["src/assets/*"], + "@components/*": ["src/components/*"], + "@providers/*": ["src/providers/*"], + "@store/*": ["src/store/*"], + "@utils/*": ["src/utils/*"], + "@customTypes/*": ["src/customTypes/*"], + }, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true + }, + "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/resources/[ps]/ps-housing/ui/tsconfig.node.json b/resources/[ps]/ps-housing/ui/tsconfig.node.json new file mode 100644 index 0000000..e993792 --- /dev/null +++ b/resources/[ps]/ps-housing/ui/tsconfig.node.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "composite": true, + "module": "esnext", + "moduleResolution": "node" + }, + "include": ["vite.config.ts"] +} diff --git a/resources/[ps]/ps-housing/ui/vite.config.js b/resources/[ps]/ps-housing/ui/vite.config.js new file mode 100644 index 0000000..a2088dd --- /dev/null +++ b/resources/[ps]/ps-housing/ui/vite.config.js @@ -0,0 +1,38 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' +import postcss from './postcss.config.js'; +import { resolve } from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + css: { + postcss, + }, + plugins: [svelte({ + /* plugin options */ + })], + base: './', // fivem nui needs to have local dir reference + resolve: { + alias: { + "@assets": resolve("./src/assets"), + "@components": resolve("./src/components"), + "@providers": resolve("./src/providers"), + "@store": resolve("./src/store"), + "@utils": resolve("./src/utils"), + "@customTypes": resolve("./src/customTypes"), + }, + }, + build: { + emptyOutDir: true, + outDir: '../html', + assetsDir: './', + rollupOptions: { + output: { + // By not having hashes in the name, you don't have to update the manifest, yay! + entryFileNames: `[name].js`, + chunkFileNames: `[name].js`, + assetFileNames: `[name].[ext]` + } + } + }, +}) diff --git a/resources/[ps]/ps-mdt/LICENSE b/resources/[ps]/ps-mdt/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/resources/[ps]/ps-mdt/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/resources/[ps]/ps-mdt/README.md b/resources/[ps]/ps-mdt/README.md new file mode 100644 index 0000000..21df664 --- /dev/null +++ b/resources/[ps]/ps-mdt/README.md @@ -0,0 +1,291 @@ +# Project Sloth MDT + +For all support questions, ask in our [Discord](https://www.discord.gg/projectsloth) support chat. Do not create issues if you need help. Issues are for bug reporting and new features only. + +## Dependencies + +- [QBCore](https://github.com/qbcore-framework/qb-core) +- [ps-dispatch](https://github.com/Project-Sloth/ps-dispatch) +- [oxmysql](https://github.com/overextended/oxmysql) +- [qb-apartments](https://github.com/qbcore-framework/qb-apartments) | [Config](https://github.com/Project-Sloth/ps-mdt/blob/0ce2ab88d2ca7b0a49abfb3f7f8939d0769c7b73/shared/config.lua#L3) available to enable or disable. +- [qb-communityservice](https://github.com/Zepherlah/qb-community-service) - If you're planning on sending to community service. + +# Installation +* Download ZIP +* Drag and drop resource into your server files, make sure to remove -main in the folder name +* Run the attached SQL script (mdt.sql) + +# Weapon Info Export + +Adds server export for inserting weaponinfo records, that can be used elsewhere in your server, such as weapon purchase, to add information to the mdt. Below is the syntax for this, all arguments are strings. + +``` +exports['ps-mdt']:CreateWeaponInfo(serial, imageurl, notes, owner, weapClass, weapModel) +``` +![image](https://user-images.githubusercontent.com/82112471/226144189-0cf7a87c-d9bc-4d1f-a9fb-6f14f92cb68b.png) + +## Self Register Weapons +* Your citizens can self-register weapons found on their inventory. Event to trigger is below if you're using qb-target. There's also a command available named `registerweapon` but you'll need to uncomment if you want to use it. +``` +ps-mdt:client:selfregister +``` + +https://user-images.githubusercontent.com/82112471/226150422-0c4776f0-0927-4b07-a272-972dd1c20077.mp4 + +# Automatic Mugshot Pictures +![image](https://user-images.githubusercontent.com/82112471/226207146-086c5508-7e6f-4345-a157-3ec2fd588138.png) + +## Setup for Automatic Mugshot +* Set Config.UseCQCMugshot to true, It is true by default. (Line 5 in Config.lua) +```lua +Config.UseCQCMugshot = true +``` +* Choose what photos you want by changing this: (Line 8 in Config.lua) +```lua +-- Front, Back Side. Use 4 for both sides, we recommend leaving at 1 for default. +Config.MugPhotos = 1 +``` +* Create a Discord Webhook and add it [here](https://github.com/Project-Sloth/ps-mdt/blob/c10ea056705dd7b04894716266cd387b00109aff/server/main.lua#L16C26-L16C26) +```lua +-- Images for mug shots will be uploaded here. Add a Discord webhook. +local MugShotWebhook = '' +``` +# Fine & Citation via item + +* Add the item to your shared.lua > items.lua +``` + ['mdtcitation'] = {['name'] = 'mdtcitation', ['label'] = 'Citation', ['weight'] = 1000, ['type'] = 'item', ['image'] = 'citation.png', ['unique'] = true, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Citation from a police officer!'}, +``` +* Add the below code to your inventory > app.js. Should be somewhere around markedbills, see below for reference. +``` + } else if (itemData.name == "mdtcitation") { + $(".item-info-title").html("

" + itemData.label + "

"); + $(".item-info-description").html( + '

Citizen ID: ' + itemData.info.citizenId + '

' + + '

Fine: ' + itemData.info.fine + '

' + + '

Citation Date: ' + itemData.info.date + '

' + + '

Incident ID: ' + itemData.info.incidentId + '

' + + '

Involved Officer: ' + itemData.info.officer + '

' + ); +``` +* Reference for proper placement. + +![image](https://user-images.githubusercontent.com/82112471/234807680-c943fac6-0da7-42f4-b815-d85769fe3779.png) + +# Clock In/Out & Leaderboard +* Triggers when officers Toggle Duty from inside the mdt. +* Create a Discord Webhook and add it here [here](https://github.com/Project-Sloth/ps-mdt/blob/c10ea056705dd7b04894716266cd387b00109aff/server/main.lua#L20) +``` +local ClockinWebhook = '' +``` +![image](https://user-images.githubusercontent.com/82112471/228130546-6366ed1e-f5a8-428c-8680-0c384d2cff52.png) +![image](https://user-images.githubusercontent.com/82112471/228330602-1a914461-5d61-4e12-80d4-154c8da3dee1.png) + + +# Jailing & Community Service +* If you're getting kicked for attempted exploit abuse when jailing. Located the follow event below on qb-policejob > server > main.lua + +```lua +police:server:JailPlayer +``` + +* Then comment out around line [779](https://github.com/qbcore-framework/qb-policejob/blob/937499495aa73538710737c14bd1b26d233dd599/server/main.lua#L779) as seen below + +```lua +-- if #(playerCoords - targetCoords) > 2.5 then return DropPlayer(src, "Attempted exploit abuse") end +``` + +# Inventory Edit | Automatic Add Weapons with images +* [lj-inventory](https://github.com/loljoshie/lj-inventory) will come already with the changes needed for this to work. +* [qb-inventory](https://github.com/qbcore-framework/qb-inventory) follow instructions below. + +1. Edit the following event +``` +RegisterNetEvent('inventory:server:SetInventoryData', function(fromInventory, toInventory, fromSlot, toSlot, fromAmount, toAmount) +``` +``` + elseif QBCore.Shared.SplitStr(shopType, "_")[1] == "Itemshop" then + if Player.Functions.RemoveMoney("cash", price, "itemshop-bought-item") then + if QBCore.Shared.SplitStr(itemData.name, "_")[1] == "weapon" then + itemData.info.serie = tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4)) + itemData.info.quality = 100 + end + local serial = itemData.info.serie + local imageurl = ("https://cfx-nui-qb-inventory/html/images/%s.png"):format(itemData.name) + local notes = "Purchased at Ammunation" + local owner = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname + local weapClass = 1 + local weapModel = QBCore.Shared.Items[itemData.name].label + AddItem(src, itemData.name, fromAmount, toSlot, itemData.info) + TriggerClientEvent('qb-shops:client:UpdateShop', src, QBCore.Shared.SplitStr(shopType, "_")[2], itemData, fromAmount) + QBCore.Functions.Notify(src, itemInfo["label"] .. " bought!", "success") + exports['ps-mdt']:CreateWeaponInfo(serial, imageurl, notes, owner, weapClass, weapModel) + TriggerEvent("qb-log:server:CreateLog", "shops", "Shop item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price) + elseif bankBalance >= price then + Player.Functions.RemoveMoney("bank", price, "itemshop-bought-item") + if QBCore.Shared.SplitStr(itemData.name, "_")[1] == "weapon" then + itemData.info.serie = tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4)) + itemData.info.quality = 100 + end + local serial = itemData.info.serie + local imageurl = ("https://cfx-nui-qb-inventory/html/images/%s.png"):format(itemData.name) + local notes = "Purchased at Ammunation" + local owner = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname + local weapClass = 1 + local weapModel = QBCore.Shared.Items[itemData.name].label + AddItem(src, itemData.name, fromAmount, toSlot, itemData.info) + TriggerClientEvent('qb-shops:client:UpdateShop', src, QBCore.Shared.SplitStr(shopType, "_")[2], itemData, fromAmount) + QBCore.Functions.Notify(src, itemInfo["label"] .. " bought!", "success") + exports['ps-mdt']:CreateWeaponInfo(serial, imageurl, notes, owner, weapClass, weapModel) + TriggerEvent("qb-log:server:CreateLog", "shops", "Shop item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price) + else + QBCore.Functions.Notify(src, "You don't have enough cash..", "error") + end +```` + +# Wolfknight Plate Reader & Radar Compatibility + +Support for Wolfknight Radar & Plate Reader +https://github.com/WolfKnight98/wk_wars2x + +Plate reader automatically locks and alerts Police if: + +* Vehicle owner is Wanted +* Vehicle owner has no drivers licence +* Vehicle has a BOLO + +**IMPORTANT:** + +* Ensure you set "CONFIG.use_sonorancad = true" in wk_wars2x/config.lua + +This reduces the plate reader events to player's vehicles and doesn't query the database for hundreds of NPC vehicles + +### Video Demonstration +https://youtu.be/w9PAVc3ER_c + +![image](https://i.imgur.com/KZPMHQX.png) +![image](https://i.imgur.com/OIIrAcb.png) +![image](https://i.imgur.com/6maboG3.png) +![image](https://i.imgur.com/DkhQxDq.png) + +### Traffic Stop Radialmenu Alert + +* When initiating a traffic stop allows you to notify your fellow officers of your location and provide details about the current location and stopped vehicle through the radial menu. + + +1. Add the following code right above `function READER:Main()` on `cl_plate_reader.lua` + +``` +local Vehicle = nil +local function GetFrontPlate() + local data = { + locked = READER.vars.cams["front"].locked, + plate = READER.vars.cams["front"].plate, + veh = Vehicle, + } + return data +end exports("GetFrontPlate", GetFrontPlate) +``` + +2. Add the following into `cl_plate_reader.lua` after `local veh = UTIL:GetVehicleInDirection( PLY.veh, start, offset )` on the function `function READER:Main()` +``` + if i == 1 then + Vehicle = veh + end +``` + +* Should look like this after completing the above steps. +![image](https://i.imgur.com/ryefT3n.png) + +3. Add **ps-mdt:client:trafficStop** into the Radialmenu + +* Preview. + +![image](https://user-images.githubusercontent.com/82112471/230744641-72480046-966f-4145-a4a3-ad7fd329870c.png) + +# Roster and SOPs Setup + +* You need a Google Document / Sheet link that is viewable. + +Paste the link you got in the config here: +``` +-- Google Docs Link +Config.sopLink = { + ['police'] = '', + ['ambulance'] = '', + ['bcso'] = '', + ['doj'] = '', + ['sast'] = '', + ['sasp'] = '', + ['doc'] = '', + ['lssd'] = '', + ['sapr'] = '', +} + +-- Google Docs Link +Config.RosterLink = { + ['police'] = '', + ['ambulance'] = '', + ['bcso'] = '', + ['doj'] = '', + ['sast'] = '', + ['sasp'] = '', + ['doc'] = '', + ['lssd'] = '', + ['sapr'] = '', +} +``` + +# Preview +![image](https://user-images.githubusercontent.com/82112471/217596976-5147fefa-24e2-4b98-b167-4e151b8a9a8c.png) +![image](https://user-images.githubusercontent.com/82112471/217597024-2c1493fc-4439-4b56-abbd-f9149e987b9e.png) +![image](https://user-images.githubusercontent.com/82112471/217597103-c271720a-4c1b-4a13-8e17-a27727cb0e95.png) +![image](https://user-images.githubusercontent.com/82112471/217597192-f9a63728-d2d0-4dfe-bd8b-373df1f9e969.png) +![image](https://user-images.githubusercontent.com/82112471/217597248-85d2d074-7fcd-4a54-ac57-8d1103047bc0.png) +![image](https://user-images.githubusercontent.com/82112471/217597338-aefcaed1-db9e-4b17-be45-3e0a66416b63.png) +![image](https://user-images.githubusercontent.com/82112471/217597379-d936fb8e-e33a-4817-8997-16447158afb8.png) +![image](https://user-images.githubusercontent.com/82112471/217597433-cd24bd41-a515-4fac-a896-807494501c39.png) + +# Multi Departments +* LSPD +![image](https://i.imgur.com/2HmsTa3.png) +* BCSO +![image](https://i.imgur.com/9WVU0Kz.png) +* SASP +![image](https://i.imgur.com/6tLNVkb.png) +* SAST +![image](https://i.imgur.com/G5b2vGU.png) +* SAPR +![image](https://i.imgur.com/cu1ZsfW.png) +* LSSD +![image](https://i.imgur.com/IsqZddu.png) +* DOC +![image](https://i.imgur.com/lFi4jDH.png) + +# FAQ +- **How do I add charges to a criminal in an Incident?** - After finding and adding the criminal citizen to the incident, right-click in the space under the criminal's name and select "Add Charge". + +![](https://i.imgur.com/WVEDLnJ.png) + +- **My dispatch calls are not being populated?** - You have not started the dispatch resource before the mdt or renamed the dispatch resource name and not made the necessary changes in mdt to reflect that. + +# Reskins +The below repos are direct forks of ps-mdt and have been edited to fit certain countries/look. + +* [US](https://github.com/OK1ez/ps-mdt/tree/main) Different layout and different colors. +* [UK](https://github.com/Harraa/ps-mdt) + +# Credits +* Originally Echo RP MDT released by [Flawws#999](https://github.com/FlawwsX/erp_mdt) +* [CQC-Scripting](https://github.com/CQC-Scripting) for their [cqc-mugshot](https://github.com/CQC-Scripting/cqc-mugshot) +* [JoeSzymkowicz](https://github.com/JoeSzymkowicz) +* [MonkeyWhisper](https://github.com/MonkeyWhisper) +* [Snipe](https://github.com/pushkart2) +* [BackSH00TER](https://github.com/BackSH00TER) +* [nggcasey](https://github.com/nggcasey) +* [OK1ez](https://github.com/OK1ez) +* [Crayons0814](https://github.com/Crayons0814) +* [LeSiiN](https://github.com/LeSiiN) +* [ImXirvin](https://github.com/ImXirvin) +* [lenzh](https://github.com/lenzh) +* Everyone else that we may have missed, thank you! diff --git a/resources/[ps]/ps-mdt/client/cl_impound.lua b/resources/[ps]/ps-mdt/client/cl_impound.lua new file mode 100644 index 0000000..11c2d49 --- /dev/null +++ b/resources/[ps]/ps-mdt/client/cl_impound.lua @@ -0,0 +1,75 @@ +local currentGarage = 1 + +local function doCarDamage(currentVehicle, veh) + local smash = false + local damageOutside = false + local damageOutside2 = false + local engine = veh.engine + 0.0 + local body = veh.body + 0.0 + + if engine < 200.0 then engine = 200.0 end + if engine > 1000.0 then engine = 950.0 end + if body < 150.0 then body = 150.0 end + if body < 950.0 then smash = true end + if body < 920.0 then damageOutside = true end + if body < 920.0 then damageOutside2 = true end + + Citizen.Wait(100) + SetVehicleEngineHealth(currentVehicle, engine) + + if smash then + SmashVehicleWindow(currentVehicle, 0) + SmashVehicleWindow(currentVehicle, 1) + SmashVehicleWindow(currentVehicle, 2) + SmashVehicleWindow(currentVehicle, 3) + SmashVehicleWindow(currentVehicle, 4) + end + + if damageOutside then + SetVehicleDoorBroken(currentVehicle, 1, true) + SetVehicleDoorBroken(currentVehicle, 6, true) + SetVehicleDoorBroken(currentVehicle, 4, true) + end + + if damageOutside2 then + SetVehicleTyreBurst(currentVehicle, 1, false, 990.0) + SetVehicleTyreBurst(currentVehicle, 2, false, 990.0) + SetVehicleTyreBurst(currentVehicle, 3, false, 990.0) + SetVehicleTyreBurst(currentVehicle, 4, false, 990.0) + end + + if body < 1000 then + SetVehicleBodyHealth(currentVehicle, 985.1) + end +end + +local function TakeOutImpound(vehicle) + local coords = Config.ImpoundLocations[currentGarage] + if coords then + QBCore.Functions.SpawnVehicle(vehicle.vehicle, function(veh) + QBCore.Functions.TriggerCallback('qb-garage:server:GetVehicleProperties', function(properties) + QBCore.Functions.SetVehicleProperties(veh, properties) + SetVehicleNumberPlateText(veh, vehicle.plate) + SetEntityHeading(veh, coords.w) + exports[Config.Fuel]:SetFuel(veh, vehicle.fuel) + doCarDamage(veh, vehicle) + TriggerServerEvent('police:server:TakeOutImpound',vehicle.plate) + TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(veh)) + SetVehicleEngineOn(veh, true, true) + end, vehicle.plate) + end, coords, true) + end +end + +RegisterNetEvent('ps-mdt:client:TakeOutImpound', function(data) + local pos = GetEntityCoords(PlayerPedId()) + currentGarage = data.currentSelection + local takeDist = Config.ImpoundLocations[data.currentSelection] + takeDist = vector3(takeDist.x, takeDist.y, takeDist.z) + if #(pos - takeDist) <= 15.0 then + local vehicle = data.vehicle + TakeOutImpound(data) + else + QBCore.Functions.Notify("Du er for langt væk fra impound-pladsen!") + end +end) \ No newline at end of file diff --git a/resources/[ps]/ps-mdt/client/cl_mugshot.lua b/resources/[ps]/ps-mdt/client/cl_mugshot.lua new file mode 100644 index 0000000..a9db201 --- /dev/null +++ b/resources/[ps]/ps-mdt/client/cl_mugshot.lua @@ -0,0 +1,222 @@ +QBCore = exports['qb-core']:GetCoreObject() +local PlayerData = {} +local mugshotInProgress, createdCamera, MugshotArray, playerData = false, 0, {}, nil +local handle, board, board_scaleform, overlay, ped, pedcoords, x, y, z, r, suspectheading, suspectx, suspecty, suspectz, board_pos, suspectPrisonX, suspectPrisonY, suspectPrisonZ +local MugShots = {} + +-- Mugshot location ( Position is the default QBCore Prison Interior ) + x = 483.8424 + y = -996.7827 + z = 25.4674 + r = {x = 0.0, y = 0.0, z = 92.23} + --vector4(483.8424, -996.7827, 25.4674, 180.522), + suspectheading = 0.3623 + suspectx = 484.0458 + suspecty = -999.5985 + suspectz = 25.4674 + suspectPrisonX = 1827.63 + suspectPrisonY = 2581.7 + suspectPrisonZ = 44.89 + +-- Mugshot functions + +local function TakeMugShot() + QBCore.Functions.TriggerCallback('ps-mdt:server:MugShotWebhook', function(MugShotWebhook) + exports['screenshot-basic']:requestScreenshotUpload(MugShotWebhook, 'files[]', {encoding = 'png'}, function(data) + local resp = json.decode(data) + table.insert(MugshotArray, resp.attachments[1].url) + end) + end) +end + +local function PhotoProcess(ped) + local rotation = suspectheading + for photo = 1, Config.MugPhotos, 1 do + Wait(1500) + TakeMugShot() + PlaySoundFromCoord(-1, "SHUTTER_FLASH", x, y, z, "CAMERA_FLASH_SOUNDSET", true, 5, 0) + Wait(1500) + rotation = rotation - 90.0 + SetEntityHeading(ped, rotation) + end +end + +local function MugShotCamera() + if createdCamera ~= 0 then + DestroyCam(createdCamera, 0) + createdCamera = 0 + end + local cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", 1) + SetCamCoord(cam, x, y, z) + SetCamRot(cam, r.x, r.y, r.z, 2) + RenderScriptCams(1, 0, 0, 1, 1) + Wait(250) + createdCamera = cam + CreateThread(function() + FreezeEntityPosition(ped, true) + SetPauseMenuActive(false) + while mugshotInProgress do + DisableAllControlActions(0) + EnableControlAction(0, 249, true) + EnableControlAction(0, 46, true) + Wait(1) + end + end) +end + +local function CreateNamedRenderTargetForModel(name, model) + local handle = 0 + if not IsNamedRendertargetRegistered(name) then + RegisterNamedRendertarget(name, 0) + end + if not IsNamedRendertargetLinked(model) then + LinkNamedRendertarget(model) + end + if IsNamedRendertargetRegistered(name) then + handle = GetNamedRendertargetRenderId(name) + end + return handle +end + +local function LoadScaleform (scaleform) + local handle = RequestScaleformMovie(scaleform) + if handle ~= 0 then + while not HasScaleformMovieLoaded(handle) do + Wait(0) + end + end + return handle +end + +local function CallScaleformMethod (scaleform, method, ...) + local t + local args = { ... } + BeginScaleformMovieMethod(scaleform, method) + for k, v in ipairs(args) do + t = type(v) + if t == 'string' then + PushScaleformMovieMethodParameterString(v) + elseif t == 'number' then + if string.match(tostring(v), "%.") then + PushScaleformMovieFunctionParameterFloat(v) + else + PushScaleformMovieFunctionParameterInt(v) + end + elseif t == 'boolean' then + PushScaleformMovieMethodParameterBool(v) + end + end + EndScaleformMovieMethod() +end + +local function PrepBoard() + CreateThread(function() + board_scaleform = LoadScaleform("mugshot_board_01") + handle = CreateNamedRenderTargetForModel("ID_Text", `prop_police_id_text`) + while handle do + HideHudAndRadarThisFrame() + SetTextRenderId(handle) + Set_2dLayer(4) + SetScriptGfxDrawBehindPausemenu(1) + DrawScaleformMovie(board_scaleform, 0.405, 0.37, 0.81, 0.74, 255, 255, 255, 255, 0) + SetScriptGfxDrawBehindPausemenu(0) + SetTextRenderId(GetDefaultScriptRendertargetRenderId()) + SetScriptGfxDrawBehindPausemenu(1) + SetScriptGfxDrawBehindPausemenu(0) + Wait(0) + end + end) +end + +local function MakeBoard() + title = "Bolingbroke Fængsel" + center = playerData.charinfo.firstname.. " ".. playerData.charinfo.lastname + footer = playerData.citizenid + header = playerData.charinfo.birthdate + CallScaleformMethod(board_scaleform, 'SET_BOARD', title, center, footer, header, 0, 1337, 116) +end + +local function PlayerBoard() + RequestModel(`prop_police_id_board`) + RequestModel(`prop_police_id_text`) + while not HasModelLoaded(`prop_police_id_board`) or not HasModelLoaded(`prop_police_id_text`) do + Wait(1) + end + board = CreateObject(`prop_police_id_board`, pedcoords, true, true, false) + overlay = CreateObject(`prop_police_id_text`, pedcoords, true, true, false) + AttachEntityToEntity(overlay, board, -1, 4103, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false, false, false, false, 2, true) + SetModelAsNoLongerNeeded(`prop_police_id_board`) + SetModelAsNoLongerNeeded(`prop_police_id_text`) + SetCurrentPedWeapon(ped, `weapon_unarmed`, 1) + ClearPedWetness(ped) + ClearPedBloodDamage(ped) + AttachEntityToEntity(board, ped, GetPedBoneIndex(ped, 28422), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 2, 1) +end + +local function DestoryCamera() + DestroyCam(createdCamera, 0) + RenderScriptCams(0, 0, 1, 1, 1) + SetFocusEntity(GetPlayerPed(ped)) + ClearPedTasksImmediately(ped) + FreezeEntityPosition(ped, false) + DeleteObject(overlay) + DeleteObject(board) + handle = nil + createdCamera = 0 +end + +RegisterNetEvent('cqc-mugshot:client:trigger', function() + ped = PlayerPedId() + pedcoords = GetEntityCoords(ped) + CreateThread(function() + playerData = QBCore.Functions.GetPlayerData() + MugshotArray, mugshotInProgress = {}, true + local citizenid = playerData.citizenid + local animDict = 'mp_character_creation@lineup@male_a' + QBCore.Functions.RequestAnimDict(animDict) + PrepBoard() + Wait(250) + MakeBoard() + MugShotCamera() + SetEntityCoords(ped, suspectx, suspecty, suspectz) + SetEntityHeading(ped, suspectheading) + PlayerBoard() + TaskPlayAnim(ped, animDict, "loop_raised", 8.0, 8.0, -1, 49, 0, false, false, false) + PhotoProcess(ped) + if createdCamera ~= 0 then + DestoryCamera() + SetEntityHeading(ped, suspectheading) + ClearPedSecondaryTask(GetPlayerPed(ped)) + end + TriggerServerEvent('psmdt-mugshot:server:MDTupload', playerData.citizenid, MugshotArray) + mugshotInProgress = false + + Wait(5000) + SetEntityCoords(ped, suspectPrisonX, suspectPrisonY, suspectPrisonZ) + end) +end) + +RegisterNUICallback("sendToJail", function(data, cb) + QBCore.Functions.TriggerCallback('ps-mdt:server:MugShotWebhook', function(MugShotWebhook) + if MugShotWebhook ~= '' then + local citizenId, sentence = data.citizenId, data.sentence + + -- Gets the player id from the citizenId + local p = promise.new() + QBCore.Functions.TriggerCallback('mdt:server:GetPlayerSourceId', function(result) + p:resolve(result) + end, citizenId) + + local targetSourceId = Citizen.Await(p) + + if sentence > 0 then + if Config.UseCQCMugshot then + TriggerServerEvent('cqc-mugshot:server:triggerSuspect', targetSourceId) + end + Citizen.Wait(5000) + -- Uses qb-policejob JailPlayer event + TriggerServerEvent("police:server:JailPlayer", targetSourceId, sentence) + end + end + end) +end) diff --git a/resources/[ps]/ps-mdt/client/main.lua b/resources/[ps]/ps-mdt/client/main.lua new file mode 100644 index 0000000..6522673 --- /dev/null +++ b/resources/[ps]/ps-mdt/client/main.lua @@ -0,0 +1,1137 @@ +QBCore = exports['qb-core']:GetCoreObject() +local PlayerData = {} +local CurrentCops = 0 +local isOpen = false +local callSign = "" +local tabletObj = nil +local tabletDict = "amb@code_human_in_bus_passenger_idles@female@tablet@base" +local tabletAnim = "base" +local tabletProp = `prop_cs_tablet` +local tabletBone = 60309 +local tabletOffset = vector3(0.03, 0.002, -0.0) +local tabletRot = vector3(10.0, 160.0, 0.0) +local coolDown = false +local lastVeh = nil +local lastPlate = nil + +CreateThread(function() + if GetResourceState('ps-dispatch') == 'started' then + TriggerServerEvent("ps-mdt:dispatchStatus", true) + end +end) + + +-- Events from qbcore +RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() + PlayerData = QBCore.Functions.GetPlayerData() + callSign = PlayerData.metadata.callsign +end) + +RegisterNetEvent('QBCore:Client:OnPlayerUnload', function() + TriggerServerEvent("ps-mdt:server:OnPlayerUnload") + PlayerData = {} +end) + +RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo) + PlayerData.job = JobInfo +end) + +RegisterNetEvent('QBCore:Client:OnGangUpdate', function(GangInfo) + PlayerData.gang = GangInfo +end) + +RegisterNetEvent("QBCore:Client:SetDuty", function(job, state) + if AllowedJob(job) then + TriggerServerEvent("ps-mdt:server:ToggleDuty") + TriggerServerEvent("ps-mdt:server:ClockSystem") + TriggerServerEvent('QBCore:ToggleDuty') + if PlayerData.job.name == "police" or PlayerData.job.type == "leo" then + TriggerServerEvent("police:server:UpdateCurrentCops") + end + if (PlayerData.job.name == "ambulance" or PlayerData.job.type == "ems") and job then + TriggerServerEvent('hospital:server:AddDoctor', 'ambulance') + elseif (PlayerData.job.name == "ambulance" or PlayerData.job.type == "ems") and not job then + TriggerServerEvent('hospital:server:RemoveDoctor', 'ambulance') + end + TriggerServerEvent("police:server:UpdateBlips") + end +end) + +RegisterNetEvent('police:SetCopCount', function(amount) + CurrentCops = amount +end) + +RegisterNetEvent('QBCore:Player:SetPlayerData', function(val) + PlayerData = val +end) + +AddEventHandler('onResourceStart', function(resourceName) + if GetCurrentResourceName() ~= resourceName then return end + Wait(150) + PlayerData = QBCore.Functions.GetPlayerData() + callSign = PlayerData.metadata.callsign +end) + +AddEventHandler('onResourceStop', function(resourceName) + if (GetCurrentResourceName() ~= resourceName) then return end + ClearPedSecondaryTask(PlayerPedId()) + SetEntityAsMissionEntity(tabletObj) + DetachEntity(tabletObj, true, false) + DeleteObject(tabletObj) +end) + +--==================================================================================== +------------------------------------------ +-- Functions -- +------------------------------------------ +--====================================================================================\ + +RegisterKeyMapping('mdt', 'Åben MDT', 'keyboard', 'k') + +RegisterCommand('mdt', function() + local plyPed = PlayerPedId() + PlayerData = QBCore.Functions.GetPlayerData() + if not PlayerData.metadata["isdead"] and not PlayerData.metadata["inlaststand"] and not PlayerData.metadata["ishandcuffed"] and not IsPauseMenuActive() then + if GetJobType(PlayerData.job.name) ~= nil then + TriggerServerEvent('mdt:server:openMDT') + TriggerServerEvent('mdt:requestOfficerData') + end + else + QBCore.Functions.Notify("Can't do that!", "error") + end +end, false) + +Citizen.CreateThread(function() + TriggerEvent('chat:addSuggestion', '/mdt', 'Åben MDT', {}) +end) + +local function doAnimation() + if not isOpen then return end + -- Animation + RequestAnimDict(tabletDict) + while not HasAnimDictLoaded(tabletDict) do Citizen.Wait(100) end + -- Model + RequestModel(tabletProp) + while not HasModelLoaded(tabletProp) do Citizen.Wait(100) end + + local plyPed = PlayerPedId() + tabletObj = CreateObject(tabletProp, 0.0, 0.0, 0.0, true, true, false) + local tabletBoneIndex = GetPedBoneIndex(plyPed, tabletBone) + + AttachEntityToEntity(tabletObj, plyPed, tabletBoneIndex, tabletOffset.x, tabletOffset.y, tabletOffset.z, tabletRot.x, tabletRot.y, tabletRot.z, true, false, false, false, 2, true) + SetModelAsNoLongerNeeded(tabletProp) + + CreateThread(function() + while isOpen do + Wait(0) + if not IsEntityPlayingAnim(plyPed, tabletDict, tabletAnim, 3) then + TaskPlayAnim(plyPed, tabletDict, tabletAnim, 3.0, 3.0, -1, 49, 0, 0, 0, 0) + end + end + + + ClearPedSecondaryTask(plyPed) + Citizen.Wait(250) + DetachEntity(tabletObj, true, false) + DeleteEntity(tabletObj) + end) +end + + +local function CurrentDuty(duty) + if duty == 1 then + return "10-41" + end + return "10-42" +end + +local function EnableGUI(enable) + SetNuiFocus(enable, enable) + SendNUIMessage({ type = "show", enable = enable, job = PlayerData.job.name, rosterLink = Config.RosterLink[PlayerData.job.name], sopLink = Config.sopLink[PlayerData.job.name] }) + isOpen = enable + doAnimation() +end + +local function RefreshGUI() + SetNuiFocus(false, false) + SendNUIMessage({ type = "show", enable = false, job = PlayerData.job.name, rosterLink = Config.RosterLink[PlayerData.job.name], sopLink = Config.sopLink[PlayerData.job.name] }) + isOpen = false +end + +--// Non local function so above EHs can utilise +function AllowedJob(job) + for key, _ in pairs(Config.AllowedJobs) do + if key == job then + return true + end + end + --// Return false if current job is not in allowed list + return false +end + + +--==================================================================================== +------------------------------------------ +-- MAIN PAGE -- +------------------------------------------ +--==================================================================================== + + +RegisterCommand("restartmdt", function(source, args, rawCommand) + RefreshGUI() +end, false) + +RegisterNUICallback("deleteBulletin", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:deleteBulletin', id, data.title) + cb(true) +end) + +RegisterNUICallback("newBulletin", function(data, cb) + local title = data.title + local info = data.info + local time = data.time + TriggerServerEvent('mdt:server:NewBulletin', title, info, time) + cb(true) +end) + +RegisterNUICallback('escape', function(data, cb) + EnableGUI(false) + cb(true) +end) + +RegisterNetEvent('mdt:client:dashboardbulletin', function(sentData) + SendNUIMessage({ type = "bulletin", data = sentData }) +end) + +RegisterNetEvent('mdt:client:dashboardWarrants', function() + QBCore.Functions.TriggerCallback("mdt:server:getWarrants", function(data) + if data then + SendNUIMessage({ type = "warrants", data = data }) + end + end) + -- SendNUIMessage({ type = "warrants",}) +end) + +RegisterNUICallback("getAllDashboardData", function(data, cb) + TriggerEvent("mdt:client:dashboardWarrants") + cb(true) +end) + + +RegisterNetEvent('mdt:client:dashboardReports', function(sentData) + SendNUIMessage({ type = "reports", data = sentData }) +end) + +RegisterNetEvent('mdt:client:dashboardCalls', function(sentData) + SendNUIMessage({ type = "calls", data = sentData }) +end) + +RegisterNetEvent('mdt:client:newBulletin', function(ignoreId, sentData, job) + if ignoreId == GetPlayerServerId(PlayerId()) then return end; + if AllowedJob(PlayerData.job.name) then + SendNUIMessage({ type = "newBulletin", data = sentData }) + end +end) + +RegisterNetEvent('mdt:client:deleteBulletin', function(ignoreId, sentData, job) + if ignoreId == GetPlayerServerId(PlayerId()) then return end; + if AllowedJob(PlayerData.job.name) then + SendNUIMessage({ type = "deleteBulletin", data = sentData }) + end +end) + +RegisterNetEvent('mdt:client:open', function(bulletin, activeUnits, calls, cid) + EnableGUI(true) + local x, y, z = table.unpack(GetEntityCoords(PlayerPedId())) + + local currentStreetHash, intersectStreetHash = GetStreetNameAtCoord(x, y, z) + local currentStreetName = GetStreetNameFromHashKey(currentStreetHash) + local intersectStreetName = GetStreetNameFromHashKey(intersectStreetHash) + local zone = tostring(GetNameOfZone(x, y, z)) + local area = GetLabelText(zone) + local playerStreetsLocation = area + + if not zone then zone = "UKENDT" end; + + if intersectStreetName ~= nil and intersectStreetName ~= "" then playerStreetsLocation = currentStreetName .. ", " .. intersectStreetName .. ", " .. area + elseif currentStreetName ~= nil and currentStreetName ~= "" then playerStreetsLocation = currentStreetName .. ", " .. area + else playerStreetsLocation = area end + + -- local grade = PlayerData.job.grade.name + + SendNUIMessage({ type = "data", activeUnits = activeUnits, citizenid = cid, ondutyonly = Config.OnlyShowOnDuty, name = "Welcome, " ..PlayerData.job.grade.name..' '..PlayerData.charinfo.lastname:sub(1,1):upper()..PlayerData.charinfo.lastname:sub(2), location = playerStreetsLocation, fullname = PlayerData.charinfo.firstname..' '..PlayerData.charinfo.lastname, bulletin = bulletin }) + SendNUIMessage({ type = "calls", data = calls }) + TriggerEvent("mdt:client:dashboardWarrants") +end) + +RegisterNetEvent('mdt:client:exitMDT', function() + EnableGUI(false) +end) + +--==================================================================================== +------------------------------------------ +-- PROFILE PAGE -- +------------------------------------------ +--==================================================================================== + +RegisterNUICallback("searchProfiles", function(data, cb) + local p = promise.new() + + QBCore.Functions.TriggerCallback('mdt:server:SearchProfile', function(result) + p:resolve(result) + end, data.name) + + local data = Citizen.Await(p) + + cb(data) +end) + + +RegisterNetEvent('mdt:client:searchProfile', function(sentData, isLimited) + SendNUIMessage({ action = "updateFingerprintData" }) +end) + +RegisterNUICallback("saveProfile", function(data, cb) + local profilepic = data.pfp + local information = data.description + local cid = data.id + local fName = data.fName + local sName = data.sName + local tags = data.tags + local gallery = data.gallery + local licenses = data.licenses + local fingerprint = data.fingerprint + TriggerServerEvent("mdt:server:saveProfile", profilepic, information, cid, fName, sName, tags, gallery, licenses, fingerprint) + cb(true) +end) + + +RegisterNUICallback("getProfileData", function(data, cb) + local id = data.id + local p = nil + local getProfileDataPromise = function(data) + if p then return end + p = promise.new() + QBCore.Functions.TriggerCallback('mdt:server:GetProfileData', function(result) + p:resolve(result) + end, data) + return Citizen.Await(p) + end + local pP = nil + local result = getProfileDataPromise(id) + local vehicles = result.vehicles + local licenses = result.licences + + for i=1,#vehicles do + local vehicle=result.vehicles[i] + local vehData = QBCore.Shared.Vehicles[vehicle['vehicle']] + + if vehData == nil then + print("Vehicle not found for profile:", vehicle['vehicle']) -- Do not remove print, is a guide for a nil error. + print("Make sure the profile you're trying to load has all cars added to the core under vehicles.lua.") -- Do not remove print, is a guide for a nil error. + else + result.vehicles[i]['model'] = vehData["name"] + end + end + p = nil + + result['fingerprint'] = result['searchFingerprint'] + return cb(result) +end) + +RegisterNUICallback("newTag", function(data, cb) + if data.id ~= "" and data.tag ~= "" then + TriggerServerEvent('mdt:server:newTag', data.id, data.tag) + end + cb(true) +end) + +RegisterNUICallback("removeProfileTag", function(data, cb) + local cid = data.cid + local tagtext = data.text + TriggerServerEvent('mdt:server:removeProfileTag', cid, tagtext) + cb(true) +end) + +RegisterNUICallback("updateLicence", function(data, cb) + local type = data.type + local status = data.status + local cid = data.cid + TriggerServerEvent('mdt:server:updateLicense', cid, type, status) + cb(true) +end) + +--==================================================================================== +------------------------------------------ +-- INCIDENTS PAGE -- +------------------------------------------ +--==================================================================================== + +RegisterNUICallback("searchIncidents", function(data, cb) + local incident = data.incident + TriggerServerEvent('mdt:server:searchIncidents', incident) + cb(true) +end) + +RegisterNUICallback("getIncidentData", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:getIncidentData', id) + cb(true) +end) + +RegisterNUICallback("incidentSearchPerson", function(data, cb) + local name = data.name + TriggerServerEvent('mdt:server:incidentSearchPerson', name ) + cb(true) +end) + +-- Handle sending a fine to a player +-- Uses the QB-Core bill command to send a fine to a player +-- If you use a different fine system, you will need to change this +RegisterNUICallback("sendFine", function(data, cb) + local citizenId, fine, incidentId = data.citizenId, data.fine, data.incidentId + + -- Gets the player id from the citizenId + local p = promise.new() + QBCore.Functions.TriggerCallback('mdt:server:GetPlayerSourceId', function(result) + p:resolve(result) + end, citizenId) + + local targetSourceId = Citizen.Await(p) + + if fine > 0 then + if Config.BillVariation then + -- Uses QB-Core removeMoney Functions + TriggerServerEvent("mdt:server:removeMoney", citizenId, fine, incidentId) + else + -- Uses QB-Core /bill command + ExecuteCommand(('bill %s %s'):format(targetSourceId, fine)) + TriggerServerEvent("mdt:server:giveCitationItem", citizenId, fine, incidentId) + end + end +end) + +-- Handle sending the player to community service +-- If you use a different community service system, you will need to change this +RegisterNUICallback("sendToCommunityService", function(data, cb) + local citizenId, sentence = data.citizenId, data.sentence + + -- Gets the player id from the citizenId + local p = promise.new() + QBCore.Functions.TriggerCallback('mdt:server:GetPlayerSourceId', function(result) + p:resolve(result) + end, citizenId) + + local targetSourceId = Citizen.Await(p) + + if sentence > 0 then + TriggerServerEvent("qb-communityservice:server:StartCommunityService", targetSourceId, sentence) + end +end) + +RegisterNetEvent('mdt:client:getProfileData', function(sentData, isLimited) + if not isLimited then + local vehicles = sentData['vehicles'] + for i=1, #vehicles do + sentData['vehicles'][i]['plate'] = string.upper(sentData['vehicles'][i]['plate']) + local tempModel = vehicles[i]['model'] + if tempModel and tempModel ~= "Unknown" then + local vehData = QBCore.Shared.Vehicles[tempModel] + sentData['vehicles'][i]['model'] = vehData["brand"] .. ' ' .. vehData["name"] + end + end + end + SendNUIMessage({ type = "profileData", data = sentData, isLimited = isLimited }) +end) + +RegisterNetEvent('mdt:client:getIncidents', function(sentData) + SendNUIMessage({ type = "incidents", data = sentData }) +end) + +RegisterNetEvent('mdt:client:getIncidentData', function(sentData, sentConvictions) + SendNUIMessage({ type = "incidentData", data = sentData, convictions = sentConvictions }) +end) + +RegisterNetEvent('mdt:client:incidentSearchPerson', function(sentData) + SendNUIMessage({ type = "incidentSearchPerson", data = sentData }) +end) + + +RegisterNUICallback('SetHouseLocation', function(data, cb) + local coords = {} + for word in data.coord[1]:gmatch('[^,%s]+') do + coords[#coords+1] = tonumber(word) + end + SetNewWaypoint(coords[1], coords[2]) + QBCore.Functions.Notify('GPS sat!', 'success') +end) + +--==================================================================================== +------------------------------------------ +-- Dispatch Calls Page -- +------------------------------------------ +--==================================================================================== + +RegisterNUICallback("searchCalls", function(data, cb) + local searchCall = data.searchCall + TriggerServerEvent('mdt:server:searchCalls', searchCall) + cb(true) +end) + +RegisterNetEvent('mdt:client:getCalls', function(calls, callid) + SendNUIMessage({ type = "calls", data = calls }) +end) + +--==================================================================================== +------------------------------------------ +-- BOLO PAGE -- +------------------------------------------ +--==================================================================================== + +RegisterNUICallback("searchBolos", function(data, cb) + local searchVal = data.searchVal + TriggerServerEvent('mdt:server:searchBolos', searchVal) + cb(true) +end) + +RegisterNUICallback("getAllBolos", function(data, cb) + TriggerServerEvent('mdt:server:getAllBolos') + cb(true) +end) + +RegisterNUICallback("getAllIncidents", function(data, cb) + TriggerServerEvent('mdt:server:getAllIncidents') + cb(true) +end) + +RegisterNUICallback("getBoloData", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:getBoloData', id) + cb(true) +end) + +RegisterNUICallback("newBolo", function(data, cb) + local existing = data.existing + local id = data.id + local title = data.title + local plate = data.plate + local owner = data.owner + local individual = data.individual + local detail = data.detail + local tags = data.tags + local gallery = data.gallery + local officers = data.officers + local time = data.time + TriggerServerEvent('mdt:server:newBolo', existing, id, title, plate, owner, individual, detail, tags, gallery, officers, time) + cb(true) +end) + +RegisterNUICallback("deleteWeapons", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:deleteWeapons', id) + cb(true) +end) + +RegisterNUICallback("deleteReports", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:deleteReports', id) + cb(true) +end) + +RegisterNUICallback("deleteIncidents", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:deleteIncidents', id) + cb(true) +end) + +RegisterNUICallback("deleteBolo", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:deleteBolo', id) + cb(true) +end) + +RegisterNUICallback("deleteICU", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:deleteICU', id) + cb(true) +end) + +RegisterNetEvent('mdt:client:getBolos', function(sentData) + SendNUIMessage({ type = "bolos", data = sentData }) +end) + +RegisterNetEvent('mdt:client:getAllIncidents', function(sentData) + SendNUIMessage({ type = "incidents", data = sentData }) +end) + +RegisterNetEvent('mdt:client:getAllBolos', function(sentData) + SendNUIMessage({ type = "bolos", data = sentData }) +end) + +RegisterNetEvent('mdt:client:getBoloData', function(sentData) + SendNUIMessage({ type = "boloData", data = sentData }) +end) + +RegisterNetEvent('mdt:client:boloComplete', function(sentData) + SendNUIMessage({ type = "boloComplete", data = sentData }) +end) + +--==================================================================================== +------------------------------------------ +-- REPORTS PAGE -- +------------------------------------------ +--==================================================================================== + +RegisterNUICallback("getAllReports", function(data, cb) + TriggerServerEvent('mdt:server:getAllReports') + cb(true) +end) + +RegisterNUICallback("getReportData", function(data, cb) + local id = data.id + TriggerServerEvent('mdt:server:getReportData', id) + cb(true) +end) + +RegisterNUICallback("searchReports", function(data, cb) + local name = data.name + TriggerServerEvent('mdt:server:searchReports', name) + cb(true) +end) + +RegisterNUICallback("newReport", function(data, cb) + local existing = data.existing + local id = data.id + local title = data.title + local reporttype = data.type + local details = data.details + local tags = data.tags + local gallery = data.gallery + local officers = data.officers + local civilians = data.civilians + local time = data.time + + TriggerServerEvent('mdt:server:newReport', existing, id, title, reporttype, details, tags, gallery, officers, civilians, time) + cb(true) +end) + +RegisterNetEvent('mdt:client:getAllReports', function(sentData) + SendNUIMessage({ type = "reports", data = sentData }) +end) + +RegisterNetEvent('mdt:client:getReportData', function(sentData) + SendNUIMessage({ type = "reportData", data = sentData }) +end) + +RegisterNetEvent('mdt:client:reportComplete', function(sentData) + SendNUIMessage({ type = "reportComplete", data = sentData }) +end) + +--==================================================================================== +------------------------------------------ +-- DMV PAGE -- +------------------------------------------ +--==================================================================================== +RegisterNUICallback("searchVehicles", function(data, cb) + + local p = promise.new() + + QBCore.Functions.TriggerCallback('mdt:server:SearchVehicles', function(result) + p:resolve(result) + end, data.name) + + local result = Citizen.Await(p) + for i=1, #result do + local vehicle = result[i] + local mods = json.decode(result[i].mods) + result[i]['plate'] = string.upper(result[i]['plate']) + result[i]['color'] = Config.ColorInformation[mods['color1']] + result[i]['colorName'] = Config.ColorNames[mods['color1']] + local vehData = QBCore.Shared.Vehicles[vehicle['vehicle']] + result[i]['model'] = vehData["brand"] .. ' ' .. vehData["name"] + end + cb(result) + +end) + +RegisterNUICallback("getVehicleData", function(data, cb) + local plate = data.plate + TriggerServerEvent('mdt:server:getVehicleData', plate) + cb(true) +end) + +RegisterNUICallback("saveVehicleInfo", function(data, cb) + local dbid = data.dbid + local plate = data.plate + local imageurl = data.imageurl + local notes = data.notes + local stolen = data.stolen + local code5 = data.code5 + local impound = data.impound + local points = data.points + local JobType = GetJobType(PlayerData.job.name) + if JobType == 'police' and impound.impoundChanged == true then + if impound.impoundActive then + local found = 0 + local plate = string.upper(string.gsub(data['plate'], "^%s*(.-)%s*$", "%1")) + local vehicles = GetGamePool('CVehicle') + + for k,v in pairs(vehicles) do + local plt = string.upper(string.gsub(GetVehicleNumberPlateText(v), "^%s*(.-)%s*$", "%1")) + if plt == plate then + local dist = #(GetEntityCoords(PlayerPedId()) - GetEntityCoords(v)) + if dist < 5.0 then + found = VehToNet(v) + SendNUIMessage({ type = "greenImpound" }) + TriggerServerEvent('mdt:server:saveVehicleInfo', dbid, plate, imageurl, notes, stolen, code5, impound, points) + end + break + end + end + + if found == 0 then + QBCore.Functions.Notify('Køretøj ikke fundet!', 'error') + SendNUIMessage({ type = "redImpound" }) + end + else + local ped = PlayerPedId() + local playerPos = GetEntityCoords(ped) + for k, v in pairs(Config.ImpoundLocations) do + if (#(playerPos - vector3(v.x, v.y, v.z)) < 20.0) then + impound.CurrentSelection = k + TriggerServerEvent('mdt:server:saveVehicleInfo', dbid, plate, imageurl, notes, stolen, code5, impound, points) + break + end + end + end + else + TriggerServerEvent('mdt:server:saveVehicleInfo', dbid, plate, imageurl, notes, stolen, code5, impound, points) + end + cb(true) +end) + +--==================================================================================== +------------------------------------------ +-- Weapons PAGE -- +------------------------------------------ +--==================================================================================== +RegisterNUICallback("searchWeapons", function(data, cb) + local p = promise.new() + + QBCore.Functions.TriggerCallback('mdt:server:SearchWeapons', function(result) + p:resolve(result) + end, data.name) + + local result = Citizen.Await(p) + cb(result) +end) + +RegisterNUICallback("saveWeaponInfo", function(data, cb) + local serial = data.serial + local notes = data.notes + local imageurl = data.imageurl + local owner = data.owner + local weapClass = data.weapClass + local weapModel = data.weapModel + local JobType = GetJobType(PlayerData.job.name) + if JobType == 'police' then + TriggerServerEvent('mdt:server:saveWeaponInfo', serial, imageurl, notes, owner, weapClass, weapModel) + end + cb(true) +end) + +RegisterNUICallback("getWeaponData", function(data, cb) + local serial = data.serial + TriggerServerEvent('mdt:server:getWeaponData', serial) + cb(true) +end) + +RegisterNetEvent('mdt:client:getWeaponData', function(sentData) + if sentData and sentData[1] then + local results = sentData[1] + SendNUIMessage({ type = "getWeaponData", data = results }) + end +end) + +RegisterNUICallback("getAllLogs", function(data, cb) + TriggerServerEvent('mdt:server:getAllLogs') + cb(true) +end) + +RegisterNUICallback("getPenalCode", function(data, cb) + TriggerServerEvent('mdt:server:getPenalCode') + cb(true) +end) + +RegisterNUICallback("toggleDuty", function(data, cb) + TriggerServerEvent('QBCore:ToggleDuty') + TriggerServerEvent('ps-mdt:server:ClockSystem') + cb(true) +end) + +RegisterNUICallback("setCallsign", function(data, cb) + TriggerServerEvent('mdt:server:setCallsign', data.cid, data.newcallsign) + cb(true) +end) + +RegisterNUICallback("setRadio", function(data, cb) + TriggerServerEvent('mdt:server:setRadio', data.cid, data.newradio) + cb(true) +end) + +RegisterNUICallback("saveIncident", function(data, cb) + TriggerServerEvent('mdt:server:saveIncident', data.ID, data.title, data.information, data.tags, data.officers, data.civilians, data.evidence, data.associated, data.time) + cb(true) +end) + +RegisterNUICallback("removeIncidentCriminal", function(data, cb) + TriggerServerEvent('mdt:server:removeIncidentCriminal', data.cid, data.incidentId) + cb(true) +end) + +RegisterNetEvent('mdt:client:getVehicleData', function(sentData) + if sentData and sentData[1] then + local vehicle = sentData[1] + local vehData = json.decode(vehicle['vehicle']) + vehicle['color'] = Config.ColorInformation[vehicle['color1']] + vehicle['colorName'] = Config.ColorNames[vehicle['color1']] + local vehData = QBCore.Shared.Vehicles[vehicle.vehicle] + vehicle.model = vehData["brand"] .. ' ' .. vehData["name"] + vehicle['class'] = Config.ClassList[GetVehicleClassFromName(vehicle['vehicle'])] + vehicle['vehicle'] = nil + SendNUIMessage({ type = "getVehicleData", data = vehicle }) + end +end) + +RegisterNetEvent('mdt:client:updateVehicleDbId', function(sentData) + SendNUIMessage({ type = "updateVehicleDbId", data = tonumber(sentData) }) +end) + +RegisterNetEvent('mdt:client:updateWeaponDbId', function(sentData) + SendNUIMessage({ type = "updateWeaponDbId", data = tonumber(sentData) }) +end) + +RegisterNetEvent('mdt:client:getAllLogs', function(sentData) + SendNUIMessage({ type = "getAllLogs", data = sentData }) +end) + +RegisterNetEvent('mdt:client:getPenalCode', function(titles, penalcode) + SendNUIMessage({ type = "getPenalCode", titles = titles, penalcode = penalcode }) +end) + +RegisterNetEvent('mdt:client:setRadio', function(radio) + if type(tonumber(radio)) == "number" then + exports["pma-voice"]:setVoiceProperty("radioEnabled", true) + exports["pma-voice"]:setRadioChannel(tonumber(radio)) + QBCore.Functions.Notify("Du har sat din radiofrekvens til "..radio..".", "success") + else + QBCore.Functions.Notify("Ugyldig kanal, indtast et nummer", "error") + end +end) + +RegisterNetEvent('mdt:client:sig100', function(radio, type) + local job = PlayerData.job.name + local duty = PlayerData.job.onduty + if AllowedJob(job) and duty == 1 then + if type == true then + exports['erp_notifications']:PersistentAlert("START", "signall100-"..radio, "inform", "Radio "..radio.." er på signal 100!") + end + end + if not type then + exports['erp_notifications']:PersistentAlert("END", "signall100-"..radio) + end +end) + +RegisterNetEvent('mdt:client:updateCallsign', function(callsign) + callSign = tostring(callsign) +end) + +RegisterNetEvent('mdt:client:updateIncidentDbId', function(sentData) + SendNUIMessage({ type = "updateIncidentDbId", data = tonumber(sentData) }) +end) + + +--==================================================================================== +------------------------------------------ +-- DISPATCH PAGE -- +------------------------------------------ +--==================================================================================== + +RegisterNetEvent('dispatch:clNotify', function(sNotificationData, sNotificationId) + if LocalPlayer.state.isLoggedIn then + sNotificationData.playerJob = PlayerData.job.name + SendNUIMessage({ type = "call", data = sNotificationData }) + end +end) + +RegisterNUICallback("setWaypoint", function(data, cb) + TriggerServerEvent('mdt:server:setWaypoint', data.callid) + cb(true) +end) + +RegisterNUICallback("callDetach", function(data, cb) + TriggerServerEvent('mdt:server:callDetach', data.callid) + cb(true) +end) + +RegisterNUICallback("removeCallBlip", function(data, cb) + TriggerEvent('ps-dispatch:client:removeCallBlip', data.callid) + cb(true) +end) + +RegisterNUICallback("callAttach", function(data, cb) + TriggerServerEvent('mdt:server:callAttach', data.callid) + cb(true) +end) + +RegisterNUICallback("attachedUnits", function(data, cb) + TriggerServerEvent('mdt:server:attachedUnits', data.callid) + cb(true) +end) + +RegisterNUICallback("callDispatchDetach", function(data, cb) + TriggerServerEvent('mdt:server:callDispatchDetach', data.callid, data.cid) + cb(true) +end) + +RegisterNUICallback("setDispatchWaypoint", function(data, cb) + TriggerServerEvent('mdt:server:setDispatchWaypoint', data.callid, data.cid) + cb(true) +end) + +RegisterNUICallback("callDragAttach", function(data, cb) + TriggerServerEvent('mdt:server:callDragAttach', data.callid, data.cid) + cb(true) +end) + +RegisterNUICallback("setWaypointU", function(data, cb) + TriggerServerEvent('mdt:server:setWaypoint:unit', data.cid) + cb(true) +end) + +RegisterNUICallback("dispatchMessage", function(data, cb) + TriggerServerEvent('mdt:server:sendMessage', data.message, data.time) + cb(true) +end) + +RegisterNUICallback("refreshDispatchMsgs", function(data, cb) + TriggerServerEvent('mdt:server:refreshDispatchMsgs') + cb(true) +end) + +RegisterNUICallback("dispatchNotif", function(data, cb) + local info = data['data'] + local mentioned = false + if callSign ~= "" then if string.find(string.lower(info['message']),string.lower(string.gsub(callSign,'-','%%-'))) then mentioned = true end end + if mentioned then + + -- Send notification to phone?? + TriggerEvent('erp_phone:sendNotification', {img = info['profilepic'], title = "Dispatch (Mention)", content = info['message'], time = 7500, customPic = true }) + + PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false) + PlaySoundFrontend(-1, "Event_Start_Text", "GTAO_FM_Events_Soundset", 0) + else + TriggerEvent('erp_phone:sendNotification', {img = info['profilepic'], title = "Dispatch ("..info['name']..")", content = info['message'], time = 5000, customPic = true }) + end + cb(true) +end) + +RegisterNUICallback("getCallResponses", function(data, cb) + TriggerServerEvent('mdt:server:getCallResponses', data.callid) + cb(true) +end) + +RegisterNUICallback("sendCallResponse", function(data, cb) + TriggerServerEvent('mdt:server:sendCallResponse', data.message, data.time, data.callid) + cb(true) +end) + +RegisterNUICallback("removeImpound", function(data, cb) + local ped = PlayerPedId() + local playerPos = GetEntityCoords(ped) + for k, v in pairs(Config.ImpoundLocations) do + if (#(playerPos - vector3(v.x, v.y, v.z)) < 20.0) then + TriggerServerEvent('mdt:server:removeImpound', data['plate'], k) + break + end + end + cb('ok') +end) + +RegisterNUICallback("statusImpound", function(data, cb) + TriggerServerEvent('mdt:server:statusImpound', data['plate']) + cb('ok') +end) + +RegisterNUICallback('openCamera', function(data) + local camId = tonumber(data.cam) + TriggerEvent('police:client:ActiveCamera', camId) +end) + +RegisterNetEvent('mdt:client:attachedUnits', function(sentData, callid) + SendNUIMessage({ type = "attachedUnits", data = sentData, callid = callid }) +end) + +RegisterNetEvent('mdt:client:setWaypoint', function(callInformation) + SetNewWaypoint(callInformation['origin']['x'], callInformation['origin']['y']) +end) + +RegisterNetEvent('mdt:client:callDetach', function(callid, sentData) + local job = PlayerData.job.name + if AllowedJob(job) then + SendNUIMessage({ type = "callDetach", callid = callid, data = tonumber(sentData) }) + end +end) +RegisterNetEvent('mdt:client:callAttach', function(callid, sentData) + local job = PlayerData.job.name + if AllowedJob(job) then + SendNUIMessage({ type = "callAttach", callid = callid, data = tonumber(sentData) }) + end +end) + +RegisterNetEvent('mdt:client:setWaypoint:unit', function(sentData) + SetNewWaypoint(sentData.x, sentData.y) +end) + +RegisterNetEvent('mdt:client:dashboardMessage', function(sentData) + local job = PlayerData.job.name + if AllowedJob(job) then + SendNUIMessage({ type = "dispatchmessage", data = sentData }) + end +end) + +RegisterNetEvent('mdt:client:dashboardMessages', function(sentData) + SendNUIMessage({ type = "dispatchmessages", data = sentData }) +end) + +RegisterNetEvent('mdt:client:getCallResponses', function(sentData, sentCallId) + SendNUIMessage({ type = "getCallResponses", data = sentData, callid = sentCallId }) +end) + +RegisterNetEvent('mdt:client:sendCallResponse', function(message, time, callid, name) + SendNUIMessage({ type = "sendCallResponse", message = message, time = time, callid = callid, name = name }) +end) + +RegisterNetEvent('mdt:client:statusImpound', function(data, plate) + SendNUIMessage({ type = "statusImpound", data = data, plate = plate }) +end) + +function GetPlayerWeaponInfos(cb) + QBCore.Functions.TriggerCallback('getWeaponInfo', function(weaponInfos) + cb(weaponInfos) + end) +end + +--3rd Eye Trigger Event +RegisterNetEvent('ps-mdt:client:selfregister') +AddEventHandler('ps-mdt:client:selfregister', function() + GetPlayerWeaponInfos(function(weaponInfos) + if weaponInfos and #weaponInfos > 0 then + for _, weaponInfo in ipairs(weaponInfos) do + TriggerServerEvent('mdt:server:registerweapon', weaponInfo.serialnumber, weaponInfo.weaponurl, weaponInfo.notes, weaponInfo.owner, weaponInfo.weapClass, weaponInfo.weaponmodel) + TriggerEvent('QBCore:Notify', "Våben " .. weaponInfo.weaponmodel .. " blev tilføjet til databasen.") + --print("Weapon added to database") + end + else + -- print("No weapons found") + end + end) +end) + +-- Uncomment if you want to use this instead. + +--[[ RegisterCommand('registerweapon', function(source) + GetPlayerWeaponInfos(function(weaponInfos) + if weaponInfos and #weaponInfos > 0 then + for _, weaponInfo in ipairs(weaponInfos) do + TriggerServerEvent('mdt:server:registerweapon', weaponInfo.serialnumber, weaponInfo.weaponurl, weaponInfo.notes, weaponInfo.owner, weaponInfo.weapClass, weaponInfo.weaponmodel) + TriggerEvent('QBCore:Notify', "Weapon " .. weaponInfo.weaponmodel .. " has been added to police database.") + --print("Weapon added to database") + end + else + --print("No weapons found") + end + end) +end, false) ]] + +--==================================================================================== +------------------------------------------ +-- STAFF LOGS PAGE -- +------------------------------------------ +--==================================================================================== + +RegisterNetEvent("mdt:receiveOfficerData") +AddEventHandler("mdt:receiveOfficerData", function(officerData) + SendNUIMessage({ + action = "updateOfficerData", + data = officerData + }) +end) + +--==================================================================================== +------------------------------------------ +-- TRAFFIC STOP STUFF -- +------------------------------------------ +--==================================================================================== + +local function vehicleData(vehicle) + local vData = { + name = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))), + } + return vData +end + +function getStreetandZone(coords) + local zone = GetLabelText(GetNameOfZone(coords.x, coords.y, coords.z)) + local currentStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z) + currentStreetName = GetStreetNameFromHashKey(currentStreetHash) + playerStreetsLocation = currentStreetName .. ", " .. zone + return playerStreetsLocation +end + +if Config.UseWolfknightRadar == true then + RegisterNetEvent("ps-mdt:client:trafficStop") + AddEventHandler("ps-mdt:client:trafficStop", function() + local plyData = QBCore.Functions.GetPlayerData() + local currentPos = GetEntityCoords(PlayerPedId()) + local locationInfo = getStreetandZone(currentPos) + if not IsPedInAnyPoliceVehicle(PlayerPedId()) then + QBCore.Functions.Notify("Er ikke i et politi-køretøj!", "error") + return + end + local data, vData, vehicle = exports["wk_wars2x"]:GetFrontPlate(), {} + if not coolDown then + if data.veh ~= nil and data.veh ~= 0 then + lastVeh = data.veh + lastPlate = data.plate + vehicle = vehicleData(data.veh) + exports["ps-dispatch"]:CustomAlert({ + coords = { + x = currentPos.x, + y = currentPos.y, + z = currentPos.z + }, + message = "Trafikstop", + dispatchCode = "10-11", + description = "Trafikstop på "..vehicle.name..", "..data.plate..".", + firstStreet = locationInfo, + model = vehicle.name, + plate = lastPlate, + name = plyData.job.grade.name.. ", " ..plyData.charinfo.firstname:sub(1, 1):upper() .. plyData.charinfo.firstname:sub(2) .. " " .. plyData.charinfo.lastname:sub(1, 1):upper() .. plyData.charinfo.lastname:sub(2), + radius = 0, + sprite = 60, + color = 3, + scale = 1.0, + length = 3, + }) + end + coolDown = true + SetTimeout(15000, function() + coolDown = false + end) + else + QBCore.Functions.Notify("Nedkøling på trafikstop", "error") + end + end) +end \ No newline at end of file diff --git a/resources/[ps]/ps-mdt/fxmanifest.lua b/resources/[ps]/ps-mdt/fxmanifest.lua new file mode 100644 index 0000000..b4333b6 --- /dev/null +++ b/resources/[ps]/ps-mdt/fxmanifest.lua @@ -0,0 +1,32 @@ +fx_version 'cerulean' +game 'gta5' + +author 'Flawws, Flakey, Idris and the Project Sloth team' +description 'EchoRP MDT Rewrite for QBCore' +version '2.5.3' + +lua54 'yes' + +shared_script 'shared/config.lua' + +server_scripts { + '@oxmysql/lib/MySQL.lua', + 'server/utils.lua', + 'server/dbm.lua', + 'server/main.lua' +} +client_scripts{ + 'client/main.lua', + 'client/cl_impound.lua', + 'client/cl_mugshot.lua' +} + +ui_page 'ui/dashboard.html' + +files { + 'ui/img/*.png', + 'ui/img/*.webp', + 'ui/dashboard.html', + 'ui/app.js', + 'ui/style.css', +} diff --git a/resources/[ps]/ps-mdt/mdt.sql b/resources/[ps]/ps-mdt/mdt.sql new file mode 100644 index 0000000..1e8224f --- /dev/null +++ b/resources/[ps]/ps-mdt/mdt.sql @@ -0,0 +1,136 @@ +CREATE TABLE IF NOT EXISTS `mdt_data` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cid` VARCHAR(20) DEFAULT NULL, + `information` MEDIUMTEXT DEFAULT NULL, + `tags` TEXT NOT NULL, + `gallery` TEXT NOT NULL, + `jobtype` VARCHAR(25) DEFAULT 'police', + `pfp` TEXT DEFAULT NULL, + `fingerprint` VARCHAR(50) DEFAULT NULL, + PRIMARY KEY (`cid`), + KEY `id` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_bulletin` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` TEXT NOT NULL, + `desc` TEXT NOT NULL, + `author` varchar(50) NOT NULL, + `time` varchar(20) NOT NULL, + `jobtype` VARCHAR(25) DEFAULT 'police', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_reports` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author` varchar(50) DEFAULT NULL, + `title` varchar(255) DEFAULT NULL, + `type` varchar(50) DEFAULT NULL, + `details` text DEFAULT NULL, + `tags` text DEFAULT NULL, + `officersinvolved` text DEFAULT NULL, + `civsinvolved` text DEFAULT NULL, + `gallery` text DEFAULT NULL, + `time` varchar(20) DEFAULT NULL, + `jobtype` varchar(25) DEFAULT 'police', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_bolos` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author` varchar(50) DEFAULT NULL, + `title` varchar(50) DEFAULT NULL, + `plate` varchar(50) DEFAULT NULL, + `owner` varchar(50) DEFAULT NULL, + `individual` varchar(50) DEFAULT NULL, + `detail` text DEFAULT NULL, + `tags` text DEFAULT NULL, + `gallery` text DEFAULT NULL, + `officersinvolved` text DEFAULT NULL, + `time` varchar(20) DEFAULT NULL, + `jobtype` varchar(25) NOT NULL DEFAULT 'police', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_convictions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cid` varchar(50) DEFAULT NULL, + `linkedincident` int(11) NOT NULL DEFAULT 0, + `warrant` varchar(50) DEFAULT NULL, + `guilty` varchar(50) DEFAULT NULL, + `processed` varchar(50) DEFAULT NULL, + `associated` varchar(50) DEFAULT '0', + `charges` text DEFAULT NULL, + `fine` int(11) DEFAULT 0, + `sentence` int(11) DEFAULT 0, + `recfine` int(11) DEFAULT 0, + `recsentence` int(11) DEFAULT 0, + `time` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_incidents` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author` varchar(50) NOT NULL DEFAULT '', + `title` varchar(50) NOT NULL DEFAULT '0', + `details` text NOT NULL, + `tags` text NOT NULL, + `officersinvolved` text NOT NULL, + `civsinvolved` text NOT NULL, + `evidence` text NOT NULL, + `time` varchar(20) DEFAULT NULL, + `jobtype` varchar(25) NOT NULL DEFAULT 'police', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_logs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `text` text NOT NULL, + `time` varchar(20) DEFAULT NULL, + `jobtype` varchar(25) DEFAULT 'police', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_vehicleinfo` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `plate` varchar(50) DEFAULT NULL, + `information` text NOT NULL DEFAULT '', + `stolen` tinyint(1) NOT NULL DEFAULT 0, + `code5` tinyint(1) NOT NULL DEFAULT 0, + `image` text NOT NULL DEFAULT '', + `points` int(11) DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_weaponinfo` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `serial` varchar(50) DEFAULT NULL, + `owner` varchar(50) DEFAULT NULL, + `information` text NOT NULL DEFAULT '', + `weapClass` varchar(50) DEFAULT NULL, + `weapModel` varchar(50) DEFAULT NULL, + `image` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `serial` (`serial`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_impound` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `vehicleid` int(11) NOT NULL, + `linkedreport` int(11) NOT NULL, + `fee` int(11) DEFAULT NULL, + `time` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `mdt_clocking` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `user_id` varchar(50) NOT NULL DEFAULT '', + `firstname` varchar(255) NOT NULL DEFAULT '', + `lastname` varchar(255) NOT NULL DEFAULT '', + `clock_in_time` varchar(255) NOT NULL DEFAULT '', + `clock_out_time` varchar(50) DEFAULT NULL, + `total_time` int(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`user_id`) USING BTREE, + KEY `id` (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; \ No newline at end of file diff --git a/resources/[ps]/ps-mdt/server/dbm.lua b/resources/[ps]/ps-mdt/server/dbm.lua new file mode 100644 index 0000000..2e60377 --- /dev/null +++ b/resources/[ps]/ps-mdt/server/dbm.lua @@ -0,0 +1,163 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +-- Get CitizenIDs from Player License +function GetCitizenID(license) + local result = MySQL.query.await("SELECT citizenid FROM players WHERE license = ?", {license,}) + if result ~= nil then + return result + else + -- print("Cannot find a CitizenID for License: "..license) + return nil + end +end + +-- (Start) Opening the MDT and sending data +function AddLog(text) + return MySQL.insert.await('INSERT INTO `mdt_logs` (`text`, `time`) VALUES (?,?)', {text, os.time() * 1000}) +end + +function GetNameFromId(cid) + local result = MySQL.scalar.await('SELECT charinfo FROM players WHERE citizenid = @citizenid', { ['@citizenid'] = cid }) + if result ~= nil then + local charinfo = json.decode(result) + local fullname = charinfo['firstname']..' '..charinfo['lastname'] + return fullname + else + --print('Player does not exist') + return nil + end +end + +function GetPersonInformation(cid, jobtype) + local result = MySQL.query.await('SELECT information, tags, gallery, pfp, fingerprint FROM mdt_data WHERE cid = ? and jobtype = ?', { cid, jobtype}) + return result[1] +end + +function GetIncidentName(id) + local result = MySQL.query.await('SELECT title FROM `mdt_incidents` WHERE id = :id LIMIT 1', { id = id }) + return result[1] +end + +function GetConvictions(cids) + return MySQL.query.await('SELECT * FROM `mdt_convictions` WHERE `cid` IN(?)', { cids }) +end + +function GetLicenseInfo(cid) + local result = MySQL.query.await('SELECT * FROM `licenses` WHERE `cid` = ?', { cid }) + return result +end + +function CreateUser(cid, tableName) + AddLog("En bruger blev oprettet med Borger ID: "..cid) + return MySQL.insert.await("INSERT INTO `"..tableName.."` (cid) VALUES (:cid)", { cid = cid }) +end + +function GetPlayerVehicles(cid, cb) + return MySQL.query.await('SELECT id, plate, vehicle FROM player_vehicles WHERE citizenid=:cid', { cid = cid }) +end + +function GetBulletins(JobType) + return MySQL.query.await('SELECT * FROM `mdt_bulletin` WHERE `jobtype` = ? LIMIT 10', { JobType }) +end + +function GetPlayerProperties(cid, cb) + local result = MySQL.query.await('SELECT * FROM properties WHERE owner_citizenid = ?', {cid}) + return result +end + +function GetPlayerDataById(id) + local Player = QBCore.Functions.GetPlayerByCitizenId(id) + if Player ~= nil then + local response = {citizenid = Player.PlayerData.citizenid, charinfo = Player.PlayerData.charinfo, metadata = Player.PlayerData.metadata, job = Player.PlayerData.job} + return response + else + return MySQL.single.await('SELECT citizenid, charinfo, job, metadata FROM players WHERE citizenid = ? LIMIT 1', { id }) + end +end + +function GetBoloStatus(plate) + local result = MySQL.scalar.await('SELECT id FROM `mdt_bolos` WHERE LOWER(`plate`)=:plate', { plate = string.lower(plate)}) + return result +end + +function GetOwnerName(cid) + local result = MySQL.scalar.await('SELECT charinfo FROM `players` WHERE LOWER(`citizenid`) = ? LIMIT 1', {cid}) + return result +end + +function GetVehicleInformation(plate, cb) + local result = MySQL.query.await('SELECT id, information FROM `mdt_vehicleinfo` WHERE plate=:plate', { plate = plate}) + cb(result) +end + +function GetPlayerApartment(cid, cb) + local result = MySQL.query.await('SELECT property_id, street, region, apartment FROM properties where owner_citizenid = ?', {cid}) + return result +end + +function GetPlayerLicenses(identifier) + local response = false + local Player = QBCore.Functions.GetPlayerByCitizenId(identifier) + if Player ~= nil then + return Player.PlayerData.metadata.licences + else + local result = MySQL.scalar.await('SELECT metadata FROM players WHERE citizenid = @identifier', {['@identifier'] = identifier}) + if result ~= nil then + local metadata = json.decode(result) + if metadata["licences"] ~= nil and metadata["licences"] then + return metadata["licences"] + else + return { + ['driver'] = false, + ['business'] = false, + ['weapon'] = false, + ['pilot'] = false + } + end + end + end +end + +function ManageLicense(identifier, type, status) + local Player = QBCore.Functions.GetPlayerByCitizenId(identifier) + local licenseStatus = nil + if status == "give" then licenseStatus = true elseif status == "revoke" then licenseStatus = false end + if Player ~= nil then + local licences = Player.PlayerData.metadata["licences"] + local newLicenses = {} + for k, v in pairs(licences) do + local status = v + if k == type then + status = licenseStatus + end + newLicenses[k] = status + end + Player.Functions.SetMetaData("licences", newLicenses) + else + local licenseType = '$.licences.'..type + local result = MySQL.query.await('UPDATE `players` SET `metadata` = JSON_REPLACE(`metadata`, ?, ?) WHERE `citizenid` = ?', {licenseType, licenseStatus, identifier}) --seems to not work on older MYSQL versions, think about alternative + end +end + +function UpdateAllLicenses(identifier, incomingLicenses) + local Player = QBCore.Functions.GetPlayerByCitizenId(identifier) + if Player ~= nil then + Player.Functions.SetMetaData("licences", incomingLicenses) + + else + local result = MySQL.scalar.await('SELECT metadata FROM players WHERE citizenid = @identifier', {['@identifier'] = identifier}) + result = json.decode(result) + + result.licences = result.licences or { + ['driver'] = true, + ['business'] = false, + ['weapon'] = false, + ['pilot'] = false + } + + for k, _ in pairs(incomingLicenses) do + result.licences[k] = incomingLicenses[k] + end + MySQL.query.await('UPDATE `players` SET `metadata` = @metadata WHERE citizenid = @citizenid', {['@metadata'] = json.encode(result), ['@citizenid'] = identifier}) + end +end \ No newline at end of file diff --git a/resources/[ps]/ps-mdt/server/main.lua b/resources/[ps]/ps-mdt/server/main.lua new file mode 100644 index 0000000..3692283 --- /dev/null +++ b/resources/[ps]/ps-mdt/server/main.lua @@ -0,0 +1,1937 @@ +local QBCore = exports['qb-core']:GetCoreObject() +local incidents = {} +local convictions = {} +local bolos = {} +local MugShots = {} +local activeUnits = {} +local impound = {} +local dispatchMessages = {} +local isDispatchRunning = false +local antiSpam = false + + +-------------------------------- +-- SET YOUR WEHBOOKS IN HERE +-- Images for mug shots will be uploaded here. Add a Discord webhook. +local MugShotWebhook = 'https://discord.com/api/webhooks/1188025948134707321/6SzjGTwogoKuDXnkfpMhc7162ms3TZnM1BlcDlP3Hzw9WCiPo6-ITGYBSdvs-R65q-aT' + +-- Clock-in notifications for duty. Add a Discord webhook. +-- Command /mdtleaderboard, will display top players per clock-in hours. +local ClockinWebhook = 'https://discord.com/api/webhooks/1188025868879134801/TTugGxevAZhB__oYosPEWv-FalL2WeKYUI9je8shU5Xx85EyeJUAmVQKcmOZh8UT_46Z' +-------------------------------- + +QBCore.Functions.CreateCallback('ps-mdt:server:MugShotWebhook', function(source, cb) + if MugShotWebhook == '' then + print("\27[31mA webhook is missing in: MugShotWebhook (server > main.lua > line 16)\27[0m") + else + cb(MugShotWebhook) + end +end) + +local function GetActiveData(cid) + local player = type(cid) == "string" and cid or tostring(cid) + if player then + return activeUnits[player] and true or false + end + return false +end + +local function IsPoliceOrEms(job) + for k, v in pairs(Config.PoliceJobs) do + if job == k then + return true + end + end + + for k, v in pairs(Config.AmbulanceJobs) do + if job == k then + return true + end + end + return false +end + + + +function getTopOfficers(callback) + local result = {} + local query = 'SELECT * FROM mdt_clocking ORDER BY total_time DESC LIMIT 25' + MySQL.Async.fetchAll(query, {}, function(officers) + for k, officer in ipairs(officers) do + table.insert(result, { + rank = k, + name = officer.firstname .. " " .. officer.lastname, + callsign = officer.user_id, + totalTime = format_time(officer.total_time) + }) + end + callback(result) + end) +end + +RegisterServerEvent("mdt:requestOfficerData") +AddEventHandler("mdt:requestOfficerData", function() + local src = source + getTopOfficers(function(officerData) + TriggerClientEvent("mdt:receiveOfficerData", src, officerData) + end) +end) + +function sendToDiscord(color, name, message, footer) + if ClockinWebhook == '' then + print("\27[31mA webhook is missing in: ClockinWebhook (server > main.lua > line 20)\27[0m") + else + local embed = { + { + color = color, + title = "**".. name .."**", + description = message, + footer = { + text = footer, + }, + } + } + + PerformHttpRequest(ClockinWebhook, function(err, text, headers) end, 'POST', json.encode({username = name, embeds = embed}), { ['Content-Type'] = 'application/json' }) + end +end + +function format_time(time) + local days = math.floor(time / 86400) + time = time % 86400 + local hours = math.floor(time / 3600) + time = time % 3600 + local minutes = math.floor(time / 60) + local seconds = time % 60 + + local formattedTime = "" + if days > 0 then + formattedTime = string.format("%d day%s ", days, days == 1 and "" or "s") + end + if hours > 0 then + formattedTime = formattedTime .. string.format("%d hour%s ", hours, hours == 1 and "" or "s") + end + if minutes > 0 then + formattedTime = formattedTime .. string.format("%d minute%s ", minutes, minutes == 1 and "" or "s") + end + if seconds > 0 then + formattedTime = formattedTime .. string.format("%d second%s", seconds, seconds == 1 and "" or "s") + end + return formattedTime +end + +function GetPlayerPropertiesByCitizenId(citizenid) + local properties = {} + + local result = MySQL.Sync.fetchAll("SELECT * FROM properties WHERE owner_citizenid = @citizenid", { + ['@citizenid'] = citizenid + }) + + if result and #result > 0 then + for i = 1, #result do + table.insert(properties, result[i]) + end + end + + return properties +end + +RegisterServerEvent("ps-mdt:dispatchStatus", function(bool) + isDispatchRunning = bool +end) + +if Config.UseWolfknightRadar == true then + RegisterNetEvent("wk:onPlateScanned") + AddEventHandler("wk:onPlateScanned", function(cam, plate, index) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local PlayerData = GetPlayerData(src) + local vehicleOwner = GetVehicleOwner(plate) + local bolo, title, boloId = GetBoloStatus(plate) + local warrant, owner, incidentId = GetWarrantStatus(plate) + local driversLicense = PlayerData.metadata['licences'].driver + + if bolo == true then + TriggerClientEvent('QBCore:Notify', src, 'BOLO ID: '..boloId..' | Titel: '..title..' | Registreret ejer: '..vehicleOwner..' | Nummerplade: '..plate, 'error', Config.WolfknightNotifyTime) + end + if warrant == true then + TriggerClientEvent('QBCore:Notify', src, 'EFTERLYST - HÆNDELSES-ID: '..incidentId..' | Registreret ejer: '..owner..' | Nummerplade: '..plate, 'error', Config.WolfknightNotifyTime) + end + + if Config.PlateScanForDriversLicense and driversLicense == false and vehicleOwner then + TriggerClientEvent('QBCore:Notify', src, 'INTET KØREKORT | Registreret ejer: '..vehicleOwner..' | Nummerplade: '..plate, 'error', Config.WolfknightNotifyTime) + end + + if bolo or warrant or (Config.PlateScanForDriversLicense and not driversLicense) then + TriggerClientEvent("wk:togglePlateLock", src, cam, true, 1) + end + end) +end + +AddEventHandler('onResourceStart', function(resourceName) + if GetCurrentResourceName() ~= resourceName then return end + Wait(3000) + if MugShotWebhook == '' then + print("\27[31mA webhook is missing in: MugShotWebhook (server > main.lua > line 16)\27[0m") + end + if ClockinWebhook == '' then + print("\27[31mA webhook is missing in: ClockinWebhook (server > main.lua > line 20)\27[0m") + end +end) + +RegisterNetEvent("ps-mdt:server:OnPlayerUnload", function() + --// Delete player from the MDT on logout + local src = source + local player = QBCore.Functions.GetPlayer(src) + if GetActiveData(player.PlayerData.citizenid) then + activeUnits[player.PlayerData.citizenid] = nil + end +end) + +AddEventHandler('playerDropped', function(reason) + local src = source + local PlayerData = GetPlayerData(src) + if PlayerData == nil then return end -- Player not loaded in correctly and dropped early + + local time = os.date("%Y-%m-%d %H:%M:%S") + local job = PlayerData.job.name + local firstName = PlayerData.charinfo.firstname:sub(1,1):upper()..PlayerData.charinfo.firstname:sub(2) + local lastName = PlayerData.charinfo.lastname:sub(1,1):upper()..PlayerData.charinfo.lastname:sub(2) + + -- Auto clock out if the player is off duty + if IsPoliceOrEms(job) and PlayerData.job.onduty then + MySQL.query.await('UPDATE mdt_clocking SET clock_out_time = NOW(), total_time = TIMESTAMPDIFF(SECOND, clock_in_time, NOW()) WHERE user_id = @user_id ORDER BY id DESC LIMIT 1', { + ['@user_id'] = PlayerData.citizenid + }) + + local result = MySQL.scalar.await('SELECT total_time FROM mdt_clocking WHERE user_id = @user_id', { + ['@user_id'] = PlayerData.citizenid + }) + if result then + local time_formatted = format_time(tonumber(result)) + sendToDiscord(16711680, "MDT klokkede ud", 'Spiller: **' .. firstName .. " ".. lastName .. '**\n\nJob: **' .. PlayerData.job.name .. '**\n\nRank: **' .. PlayerData.job.grade.name .. '**\n\nStatus: **Gået hjem**\n Total tid:' .. time_formatted, "ps-mdt | Lavet af Project Sloth") + end + end + + -- Delete player from the MDT on logout + if PlayerData ~= nil then + if GetActiveData(PlayerData.citizenid) then + activeUnits[PlayerData.citizenid] = nil + end + else + local license = QBCore.Functions.GetIdentifier(src, "license") + local citizenids = GetCitizenID(license) + + for _, v in pairs(citizenids) do + if GetActiveData(v.citizenid) then + activeUnits[v.citizenid] = nil + end + end + end +end) + +RegisterNetEvent("ps-mdt:server:ToggleDuty", function() + local src = source + local player = QBCore.Functions.GetPlayer(src) + if not player.PlayerData.job.onduty then + --// Remove from MDT + if GetActiveData(player.PlayerData.citizenid) then + activeUnits[player.PlayerData.citizenid] = nil + end + end +end) + +QBCore.Commands.Add("mdtleaderboard", "Vis MDT leaderboard", {}, false, function(source, args) + local PlayerData = GetPlayerData(source) + local job = PlayerData.job.name + + if not IsPoliceOrEms(job) then + TriggerClientEvent('QBCore:Notify', source, "Du har ikke tilladelse til denne command", 'error') + return + end + + local result = MySQL.Sync.fetchAll('SELECT firstname, lastname, total_time FROM mdt_clocking ORDER BY total_time DESC') + + local leaderboard_message = '**MDT Leaderboard**\n\n' + + for i, record in ipairs(result) do + local firstName = record.firstname:sub(1,1):upper()..record.firstname:sub(2) + local lastName = record.lastname:sub(1,1):upper()..record.lastname:sub(2) + local total_time = format_time(record.total_time) + + leaderboard_message = leaderboard_message .. i .. '. **' .. firstName .. ' ' .. lastName .. '** - ' .. total_time .. '\n' + end + + sendToDiscord(16753920, "MDT Leaderboard", leaderboard_message, "ps-mdt | Lavet af Project Sloth") + TriggerClientEvent('QBCore:Notify', source, "MDT leaderboard blev sendt til Discord!", 'success') +end) + +RegisterNetEvent("ps-mdt:server:ClockSystem", function() + local src = source + local PlayerData = GetPlayerData(src) + local time = os.date("%Y-%m-%d %H:%M:%S") + local firstName = PlayerData.charinfo.firstname:sub(1,1):upper()..PlayerData.charinfo.firstname:sub(2) + local lastName = PlayerData.charinfo.lastname:sub(1,1):upper()..PlayerData.charinfo.lastname:sub(2) + if PlayerData.job.onduty then + + TriggerClientEvent('QBCore:Notify', source, "Du gik på arbejde", 'success') + MySQL.Async.insert('INSERT INTO mdt_clocking (user_id, firstname, lastname, clock_in_time) VALUES (:user_id, :firstname, :lastname, :clock_in_time) ON DUPLICATE KEY UPDATE user_id = :user_id, firstname = :firstname, lastname = :lastname, clock_in_time = :clock_in_time', { + user_id = PlayerData.citizenid, + firstname = firstName, + lastname = lastName, + clock_in_time = time + }, function() + end) + sendToDiscord(65280, "MDT Klokkede ind", 'Spiller: **' .. firstName .. " ".. lastName .. '**\n\nJob: **' .. PlayerData.job.name .. '**\n\nRank: **' .. PlayerData.job.grade.name .. '**\n\nStatus: **På arbejde**', "ps-mdt | Lavet af Project Sloth") + else + TriggerClientEvent('QBCore:Notify', source, "Du klokkede ud", 'success') + MySQL.query.await('UPDATE mdt_clocking SET clock_out_time = NOW(), total_time = TIMESTAMPDIFF(SECOND, clock_in_time, NOW()) WHERE user_id = @user_id ORDER BY id DESC LIMIT 1', { + ['@user_id'] = PlayerData.citizenid + }) + + local result = MySQL.scalar.await('SELECT total_time FROM mdt_clocking WHERE user_id = @user_id', { + ['@user_id'] = PlayerData.citizenid + }) + local time_formatted = format_time(tonumber(result)) + + sendToDiscord(16711680, "MDT Klokkede ud", 'Spillet: **' .. firstName .. " ".. lastName .. '**\n\nJob: **' .. PlayerData.job.name .. '**\n\nRank: **' .. PlayerData.job.grade.name .. '**\n\nStatus: **Gået hjem**\n Total tid:' .. time_formatted, "ps-mdt | Lavet af Project Sloth") + end +end) + +RegisterNetEvent('mdt:server:openMDT', function() + local src = source + local PlayerData = GetPlayerData(src) + if not PermCheck(src, PlayerData) then return end + local Radio = Player(src).state.radioChannel or 0 + + activeUnits[PlayerData.citizenid] = { + cid = PlayerData.citizenid, + callSign = PlayerData.metadata['callsign'], + firstName = PlayerData.charinfo.firstname:sub(1,1):upper()..PlayerData.charinfo.firstname:sub(2), + lastName = PlayerData.charinfo.lastname:sub(1,1):upper()..PlayerData.charinfo.lastname:sub(2), + radio = Radio, + unitType = PlayerData.job.name, + duty = PlayerData.job.onduty + } + + local JobType = GetJobType(PlayerData.job.name) + local bulletin = GetBulletins(JobType) + local calls = exports['ps-dispatch']:GetDispatchCalls() + TriggerClientEvent('mdt:client:open', src, bulletin, activeUnits, calls, PlayerData.citizenid) +end) + +QBCore.Functions.CreateCallback('mdt:server:SearchProfile', function(source, cb, sentData) + if not sentData then return cb({}) end + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType ~= nil then + local people = MySQL.query.await("SELECT p.citizenid, p.charinfo, md.pfp, md.fingerprint FROM players p LEFT JOIN mdt_data md on p.citizenid = md.cid WHERE LOWER(CONCAT(JSON_VALUE(p.charinfo, '$.firstname'), ' ', JSON_VALUE(p.charinfo, '$.lastname'))) LIKE :query OR LOWER(`charinfo`) LIKE :query OR LOWER(`citizenid`) LIKE :query OR LOWER(md.fingerprint) LIKE :query AND jobtype = :jobtype LIMIT 20", { query = string.lower('%'..sentData..'%'), jobtype = JobType }) + local citizenIds = {} + local citizenIdIndexMap = {} + if not next(people) then cb({}) return end + + for index, data in pairs(people) do + people[index]['warrant'] = false + people[index]['convictions'] = 0 + people[index]['licences'] = GetPlayerLicenses(data.citizenid) + people[index]['pp'] = ProfPic(data.gender, data.pfp) + if data.fingerprint and data.fingerprint ~= "" then + people[index]['fingerprint'] = data.fingerprint + else + people[index]['fingerprint'] = "" + end + citizenIds[#citizenIds+1] = data.citizenid + citizenIdIndexMap[data.citizenid] = index + end + + local convictions = GetConvictions(citizenIds) + + if next(convictions) then + for _, conv in pairs(convictions) do + if conv.warrant == "1" then people[citizenIdIndexMap[conv.cid]].warrant = true end + + local charges = json.decode(conv.charges) + people[citizenIdIndexMap[conv.cid]].convictions = people[citizenIdIndexMap[conv.cid]].convictions + #charges + end + end + TriggerClientEvent('mdt:client:searchProfile', src, people, false) + + return cb(people) + end + end + + return cb({}) +end) + +QBCore.Functions.CreateCallback("mdt:server:getWarrants", function(source, cb) + local WarrantData = {} + local data = MySQL.query.await("SELECT * FROM mdt_convictions", {}) + for _, value in pairs(data) do + if value.warrant == "1" then + WarrantData[#WarrantData+1] = { + cid = value.cid, + linkedincident = value.linkedincident, + name = GetNameFromId(value.cid), + time = value.time + } + end + end + cb(WarrantData) +end) + +QBCore.Functions.CreateCallback('mdt:server:OpenDashboard', function(source, cb) + local PlayerData = GetPlayerData(source) + if not PermCheck(source, PlayerData) then return end + local JobType = GetJobType(PlayerData.job.name) + local bulletin = GetBulletins(JobType) + cb(bulletin) +end) + +RegisterNetEvent('mdt:server:NewBulletin', function(title, info, time) + local src = source + local PlayerData = GetPlayerData(src) + if not PermCheck(src, PlayerData) then return end + local JobType = GetJobType(PlayerData.job.name) + local playerName = GetNameFromPlayerData(PlayerData) + local newBulletin = MySQL.insert.await('INSERT INTO `mdt_bulletin` (`title`, `desc`, `author`, `time`, `jobtype`) VALUES (:title, :desc, :author, :time, :jt)', { + title = title, + desc = info, + author = playerName, + time = tostring(time), + jt = JobType + }) + + AddLog(("En ny note blev tilføjet af %s med titlen: %s!"):format(playerName, title)) + TriggerClientEvent('mdt:client:newBulletin', -1, src, {id = newBulletin, title = title, info = info, time = time, author = PlayerData.CitizenId}, JobType) +end) + +RegisterNetEvent('mdt:server:deleteBulletin', function(id, title) + if not id then return false end + local src = source + local PlayerData = GetPlayerData(src) + if not PermCheck(src, PlayerData) then return end + local JobType = GetJobType(PlayerData.job.name) + + MySQL.query.await('DELETE FROM `mdt_bulletin` where id = ?', {id}) + AddLog("Note med titel: "..title.." blev slettet af " .. GetNameFromPlayerData(PlayerData) .. ".") +end) + +QBCore.Functions.CreateCallback('mdt:server:GetProfileData', function(source, cb, sentId) + if not sentId then return cb({}) end + + local src = source + local PlayerData = GetPlayerData(src) + if not PermCheck(src, PlayerData) then return cb({}) end + local JobType = GetJobType(PlayerData.job.name) + local target = GetPlayerDataById(sentId) + local JobName = PlayerData.job.name + + if not target or not next(target) then return cb({}) end + + if type(target.job) == 'string' then target.job = json.decode(target.job) end + if type(target.charinfo) == 'string' then target.charinfo = json.decode(target.charinfo) end + if type(target.metadata) == 'string' then target.metadata = json.decode(target.metadata) end + + local licencesdata = target.metadata['licences'] or { + ['driver'] = false, + ['business'] = false, + ['weapon'] = false, + ['pilot'] = false + } + + local job, grade = UnpackJob(target.job) + + local apartmentData = GetPlayerApartment(target.citizenid) + --property_id, street, region, apartment + + if Config.UsingPsHousing and not Config.UsingDefaultQBApartments then + local propertyData = GetPlayerPropertiesByCitizenId(target.citizenid) + + if propertyData and next(propertyData) then + if propertyData[1] then + apartmentData = propertyData[1].apartment .. ' #' .. propertyData[1].property_id + else + TriggerClientEvent("QBCore:Notify", src, 'Borgeren har ikke en ejendom.', 'error') + -- print('The citizen does not have a property. Set Config.UsingPsHousing to false.') + end + else + TriggerClientEvent("QBCore:Notify", src, 'Borgeren har ikke en ejendom.', 'error') + -- print('The citizen does not have a property. Set Config.UsingPsHousing to false.') + end + elseif Config.UsingDefaultQBApartments then + apartmentData = GetPlayerApartment(target.citizenid) + if apartmentData then + if apartmentData[1] then + apartmentData = apartmentData[1].street .. ' (' ..apartmentData[1].property_id..')' + else + TriggerClientEvent("QBCore:Notify", src, 'Borgeren har ikke en lejlighed.', 'error') + -- print('Borgeren har ikke en lejlighed. Set Config.UsingDefaultQBApartments to false.') + end + else + TriggerClientEvent("QBCore:Notify", src, 'Borgeren har ikke en lejlighed.', 'error') + -- print('Borgeren har ikke en lejlighed. Set Config.UsingDefaultQBApartments to false.') + end + end + + local person = { + cid = target.citizenid, + firstname = target.charinfo.firstname, + lastname = target.charinfo.lastname, + job = job.label, + grade = grade.name, + apartment = apartmentData, + pp = ProfPic(target.charinfo.gender), + licences = licencesdata, + dob = target.charinfo.birthdate, + fingerprint = target.metadata.fingerprint, + phone = target.charinfo.phone, + mdtinfo = '', + tags = {}, + vehicles = {}, + properties = {}, + gallery = {}, + isLimited = false + } + + if Config.PoliceJobs[JobName] or Config.DojJobs[JobName] then + local convictions = GetConvictions({person.cid}) + local incidents = {} + person.convictions2 = {} + local convCount = 1 + if next(convictions) then + for _, conv in pairs(convictions) do + if conv.warrant == "1" then person.warrant = true end + + -- Get the incident details + local id = conv.linkedincident + local incident = GetIncidentName(id) + + if incident then + incidents[#incidents + 1] = { + id = id, + title = incident.title, + time = conv.time + } + end + + local charges = json.decode(conv.charges) + for _, charge in pairs(charges) do + person.convictions2[convCount] = charge + convCount = convCount + 1 + end + end + end + + person.incidents = incidents + + local hash = {} + person.convictions = {} + + for _,v in ipairs(person.convictions2) do + if (not hash[v]) then + person.convictions[#person.convictions+1] = v + hash[v] = true + end + end + + local vehicles = GetPlayerVehicles(person.cid) + + if vehicles then + person.vehicles = vehicles + end + local Coords = {} + local Houses = {} + local properties= GetPlayerProperties(person.cid) + for k, v in pairs(properties) do + Coords[#Coords+1] = { + coords = json.decode(v["door_data"]), + } + end + + for index = 1, #Coords, 1 do + local x = Coords[index]["coords"]["x"] or 0 + local y = Coords[index]["coords"]["y"] or 0 + local z = Coords[index]["coords"]["z"] or 0 + + local label + if properties[index]["street"] then + label = tostring(properties[index]["street"]) + else + label = tostring(properties[index]["apartment"]) + end + + Houses[#Houses+1] = { + label = label .. " " .. tostring(properties[index]["property_id"]), + coords = tostring(x .. "," .. y .. "," .. z), + } + end + person.properties = Houses + end + + local mdtData = GetPersonInformation(sentId, JobType) + if mdtData then + person.mdtinfo = mdtData.information + person.profilepic = mdtData.pfp + person.tags = json.decode(mdtData.tags) + person.gallery = json.decode(mdtData.gallery) + person.fingerprint = mdtData.fingerprint + end + + return cb(person) +end) + +RegisterNetEvent("mdt:server:saveProfile", function(pfp, information, cid, fName, sName, tags, gallery, licenses, fingerprint) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + UpdateAllLicenses(cid, licenses) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'doj' then JobType = 'police' end + + MySQL.Async.insert('INSERT INTO mdt_data (cid, information, pfp, jobtype, tags, gallery, fingerprint) VALUES (:cid, :information, :pfp, :jobtype, :tags, :gallery, :fingerprint) ON DUPLICATE KEY UPDATE cid = :cid, information = :information, pfp = :pfp, jobtype = :jobtype, tags = :tags, gallery = :gallery, fingerprint = :fingerprint', { + cid = cid, + information = information, + pfp = pfp, + jobtype = JobType, + tags = json.encode(tags), + gallery = json.encode(gallery), + fingerprint = fingerprint, + }, function() + end) + end +end) + + +-- Mugshotd +RegisterNetEvent('cqc-mugshot:server:triggerSuspect', function(suspect) + TriggerClientEvent('cqc-mugshot:client:trigger', suspect, suspect) +end) + +RegisterNetEvent('psmdt-mugshot:server:MDTupload', function(citizenid, MugShotURLs) + MugShots[citizenid] = MugShotURLs + local cid = citizenid + MySQL.Async.insert('INSERT INTO mdt_data (cid, pfp, gallery, tags) VALUES (:cid, :pfp, :gallery, :tags) ON DUPLICATE KEY UPDATE cid = :cid, pfp = :pfp, tags = :tags, gallery = :gallery', { + cid = cid, + pfp = MugShotURLs[1], + tags = json.encode(tags), + gallery = json.encode(MugShotURLs), + }) +end) + +RegisterNetEvent("mdt:server:updateLicense", function(cid, type, status) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + if GetJobType(Player.PlayerData.job.name) == 'police' then + ManageLicense(cid, type, status) + end + end +end) + +-- Incidents + +RegisterNetEvent('mdt:server:getAllIncidents', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local matches = MySQL.query.await("SELECT * FROM `mdt_incidents` ORDER BY `id` DESC LIMIT 30", {}) + + TriggerClientEvent('mdt:client:getAllIncidents', src, matches) + end + end +end) + +RegisterNetEvent('mdt:server:searchIncidents', function(query) + if query then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local matches = MySQL.query.await("SELECT * FROM `mdt_incidents` WHERE `id` LIKE :query OR LOWER(`title`) LIKE :query OR LOWER(`author`) LIKE :query OR LOWER(`details`) LIKE :query OR LOWER(`tags`) LIKE :query OR LOWER(`officersinvolved`) LIKE :query OR LOWER(`civsinvolved`) LIKE :query OR LOWER(`author`) LIKE :query ORDER BY `id` DESC LIMIT 50", { + query = string.lower('%'..query..'%') -- % wildcard, needed to search for all alike results + }) + + TriggerClientEvent('mdt:client:getIncidents', src, matches) + end + end + end +end) + +RegisterNetEvent('mdt:server:getIncidentData', function(sentId) + if sentId then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local matches = MySQL.query.await("SELECT * FROM `mdt_incidents` WHERE `id` = :id", { + id = sentId + }) + local data = matches[1] + data['tags'] = json.decode(data['tags']) + data['officersinvolved'] = json.decode(data['officersinvolved']) + data['civsinvolved'] = json.decode(data['civsinvolved']) + data['evidence'] = json.decode(data['evidence']) + + + local convictions = MySQL.query.await("SELECT * FROM `mdt_convictions` WHERE `linkedincident` = :id", { + id = sentId + }) + if convictions ~= nil then + for i=1, #convictions do + local res = GetNameFromId(convictions[i]['cid']) + if res ~= nil then + convictions[i]['name'] = res + else + convictions[i]['name'] = "Ukendt" + end + convictions[i]['charges'] = json.decode(convictions[i]['charges']) + end + end + TriggerClientEvent('mdt:client:getIncidentData', src, data, convictions) + end + end + end +end) + +RegisterNetEvent('mdt:server:getAllBolos', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + local matches = MySQL.query.await("SELECT * FROM `mdt_bolos` WHERE jobtype = :jobtype", {jobtype = JobType}) + TriggerClientEvent('mdt:client:getAllBolos', src, matches) + end +end) + +RegisterNetEvent('mdt:server:searchBolos', function(sentSearch) + if sentSearch then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + local matches = MySQL.query.await("SELECT * FROM `mdt_bolos` WHERE `id` LIKE :query OR LOWER(`title`) LIKE :query OR `plate` LIKE :query OR LOWER(`owner`) LIKE :query OR LOWER(`individual`) LIKE :query OR LOWER(`detail`) LIKE :query OR LOWER(`officersinvolved`) LIKE :query OR LOWER(`tags`) LIKE :query OR LOWER(`author`) LIKE :query AND jobtype = :jobtype", { + query = string.lower('%'..sentSearch..'%'), -- % wildcard, needed to search for all alike results + jobtype = JobType + }) + TriggerClientEvent('mdt:client:getBolos', src, matches) + end + end +end) + +RegisterNetEvent('mdt:server:getBoloData', function(sentId) + if sentId then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + local matches = MySQL.query.await("SELECT * FROM `mdt_bolos` WHERE `id` = :id AND jobtype = :jobtype LIMIT 1", { + id = sentId, + jobtype = JobType + }) + + local data = matches[1] + data['tags'] = json.decode(data['tags']) + data['officersinvolved'] = json.decode(data['officersinvolved']) + data['gallery'] = json.decode(data['gallery']) + TriggerClientEvent('mdt:client:getBoloData', src, data) + end + end +end) + +RegisterNetEvent('mdt:server:newBolo', function(existing, id, title, plate, owner, individual, detail, tags, gallery, officersinvolved, time) + if id then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + + local function InsertBolo() + MySQL.insert('INSERT INTO `mdt_bolos` (`title`, `author`, `plate`, `owner`, `individual`, `detail`, `tags`, `gallery`, `officersinvolved`, `time`, `jobtype`) VALUES (:title, :author, :plate, :owner, :individual, :detail, :tags, :gallery, :officersinvolved, :time, :jobtype)', { + title = title, + author = fullname, + plate = plate, + owner = owner, + individual = individual, + detail = detail, + tags = json.encode(tags), + gallery = json.encode(gallery), + officersinvolved = json.encode(officersinvolved), + time = tostring(time), + jobtype = JobType + }, function(r) + if r then + TriggerClientEvent('mdt:client:boloComplete', src, r) + TriggerEvent('mdt:server:AddLog', "En efterlysning blev oprettet på "..fullname.." med titel ("..title..") og ID ("..id..")") + end + end) + end + + local function UpdateBolo() + MySQL.update("UPDATE mdt_bolos SET `title`=:title, plate=:plate, owner=:owner, individual=:individual, detail=:detail, tags=:tags, gallery=:gallery, officersinvolved=:officersinvolved WHERE `id`=:id AND jobtype = :jobtype LIMIT 1", { + title = title, + plate = plate, + owner = owner, + individual = individual, + detail = detail, + tags = json.encode(tags), + gallery = json.encode(gallery), + officersinvolved = json.encode(officersinvolved), + id = id, + jobtype = JobType + }, function(r) + if r then + TriggerClientEvent('mdt:client:boloComplete', src, id) + TriggerEvent('mdt:server:AddLog', "En efterlysning blev opdateret på "..fullname.." med titel ("..title..") og ID ("..id..")") + end + end) + end + + if existing then + UpdateBolo() + elseif not existing then + InsertBolo() + end + end + end +end) + +RegisterNetEvent('mdt:server:deleteWeapons', function(id) + if id then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Config.RemoveWeaponsPerms[Player.PlayerData.job.name] then + if Config.RemoveWeaponsPerms[Player.PlayerData.job.name][Player.PlayerData.job.grade.level] then + local fullName = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + MySQL.update("DELETE FROM `mdt_weaponinfo` WHERE id=:id", { id = id }) + TriggerEvent('mdt:server:AddLog', "Våbeninformation blev slettet af "..fullName.." med ID ("..id..")") + else + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + TriggerClientEvent("QBCore:Notify", src, 'Du har ikke tilladelse til dette!', 'error') + TriggerEvent('mdt:server:AddLog', fullname.." prøvede at slette våbeninformation med ID ("..id..")") + end + end + end +end) + +RegisterNetEvent('mdt:server:deleteReports', function(id) + if id then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Config.RemoveReportPerms[Player.PlayerData.job.name] then + if Config.RemoveReportPerms[Player.PlayerData.job.name][Player.PlayerData.job.grade.level] then + local fullName = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + MySQL.update("DELETE FROM `mdt_reports` WHERE id=:id", { id = id }) + TriggerEvent('mdt:server:AddLog', "A Report was deleted by "..fullName.." med ID ("..id..")") + else + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + TriggerClientEvent("QBCore:Notify", src, 'Du har ikke tilladelse til dette!', 'error') + TriggerEvent('mdt:server:AddLog', fullname.." prøvede at slette en rapport med ID ("..id..")") + end + end + end +end) + +RegisterNetEvent('mdt:server:deleteIncidents', function(id) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Config.RemoveIncidentPerms[Player.PlayerData.job.name] then + if Config.RemoveIncidentPerms[Player.PlayerData.job.name][Player.PlayerData.job.grade.level] then + local fullName = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + MySQL.update("DELETE FROM `mdt_convictions` WHERE `linkedincident` = :id", {id = id}) + MySQL.update("UPDATE `mdt_convictions` SET `warrant` = '0' WHERE `linkedincident` = :id", {id = id}) -- Delete any outstanding warrants from incidents + MySQL.update("DELETE FROM `mdt_incidents` WHERE id=:id", { id = id }, function(rowsChanged) + if rowsChanged > 0 then + TriggerEvent('mdt:server:AddLog', "En hændelse blev slettet af "..fullName.." med ID ("..id..")") + end + end) + else + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + TriggerClientEvent("QBCore:Notify", src, 'Du har ikke tilladelse til dette!', 'error') + TriggerEvent('mdt:server:AddLog', fullname.." prøvede at slette en hændelse med ID ("..id..")") + end + end +end) + +RegisterNetEvent('mdt:server:deleteBolo', function(id) + if id then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' then + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + MySQL.update("DELETE FROM `mdt_bolos` WHERE id=:id", { id = id, jobtype = JobType }) + TriggerEvent('mdt:server:AddLog', "En efterlysning blev slette af "..fullname.." med ID ("..id..")") + end + end +end) + +RegisterNetEvent('mdt:server:deleteICU', function(id) + if id then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'ambulance' then + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + MySQL.update("DELETE FROM `mdt_bolos` WHERE id=:id", { id = id, jobtype = JobType }) + TriggerEvent('mdt:server:AddLog', "Et ICU-checkin blev slettet af "..fullname.." med ID ("..id..")") + end + end +end) + +RegisterNetEvent('mdt:server:incidentSearchPerson', function(query) + if query then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' or JobType == 'ambulance' then + local function ProfPic(gender, profilepic) + if profilepic then return profilepic end; + if gender == "f" then return "img/female.png" end; + return "img/male.png" + end + + local firstname, lastname = query:match("^(%S+)%s*(%S*)$") + firstname = firstname or query + lastname = lastname or query + + local result = MySQL.query.await("SELECT p.citizenid, p.charinfo, p.metadata, md.pfp from players p LEFT JOIN mdt_data md on p.citizenid = md.cid WHERE (LOWER(JSON_UNQUOTE(JSON_EXTRACT(`charinfo`, '$.firstname'))) LIKE :firstname AND LOWER(JSON_UNQUOTE(JSON_EXTRACT(`charinfo`, '$.lastname'))) LIKE :lastname) OR LOWER(`citizenid`) LIKE :citizenid AND `jobtype` = :jobtype LIMIT 30", { + firstname = string.lower('%' .. firstname .. '%'), + lastname = string.lower('%' .. lastname .. '%'), + citizenid = string.lower('%' .. query .. '%'), + jobtype = JobType + }) + + local data = {} + for i=1, #result do + local charinfo = json.decode(result[i].charinfo) + local metadata = json.decode(result[i].metadata) + data[i] = { + id = result[i].citizenid, + firstname = charinfo.firstname, + lastname = charinfo.lastname, + profilepic = ProfPic(charinfo.gender, result[i].pfp), + callsign = metadata.callsign + } + end + TriggerClientEvent('mdt:client:incidentSearchPerson', src, data) + end + end + end +end) + +RegisterNetEvent('mdt:server:getAllReports', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' or JobType == 'ambulance' then + if JobType == 'doj' then JobType = 'police' end + local matches = MySQL.query.await("SELECT * FROM `mdt_reports` WHERE jobtype = :jobtype ORDER BY `id` DESC LIMIT 30", { + jobtype = JobType + }) + TriggerClientEvent('mdt:client:getAllReports', src, matches) + end + end +end) + +RegisterNetEvent('mdt:server:getReportData', function(sentId) + if sentId then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' or JobType == 'ambulance' then + if JobType == 'doj' then JobType = 'police' end + local matches = MySQL.query.await("SELECT * FROM `mdt_reports` WHERE `id` = :id AND `jobtype` = :jobtype LIMIT 1", { + id = sentId, + jobtype = JobType + }) + local data = matches[1] + data['tags'] = json.decode(data['tags']) + data['officersinvolved'] = json.decode(data['officersinvolved']) + data['civsinvolved'] = json.decode(data['civsinvolved']) + data['gallery'] = json.decode(data['gallery']) + TriggerClientEvent('mdt:client:getReportData', src, data) + end + end + end +end) + +RegisterNetEvent('mdt:server:searchReports', function(sentSearch) + if sentSearch then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' or JobType == 'ambulance' then + if JobType == 'doj' then JobType = 'police' end + local matches = MySQL.query.await("SELECT * FROM `mdt_reports` WHERE `id` LIKE :query OR LOWER(`author`) LIKE :query OR LOWER(`title`) LIKE :query OR LOWER(`type`) LIKE :query OR LOWER(`details`) LIKE :query OR LOWER(`tags`) LIKE :query AND `jobtype` = :jobtype ORDER BY `id` DESC LIMIT 50", { + query = string.lower('%'..sentSearch..'%'), -- % wildcard, needed to search for all alike results + jobtype = JobType + }) + + TriggerClientEvent('mdt:client:getAllReports', src, matches) + end + end + end +end) + +RegisterNetEvent('mdt:server:newReport', function(existing, id, title, reporttype, details, tags, gallery, officers, civilians, time) + if id then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType ~= nil then + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + local function InsertReport() + MySQL.insert('INSERT INTO `mdt_reports` (`title`, `author`, `type`, `details`, `tags`, `gallery`, `officersinvolved`, `civsinvolved`, `time`, `jobtype`) VALUES (:title, :author, :type, :details, :tags, :gallery, :officersinvolved, :civsinvolved, :time, :jobtype)', { + title = title, + author = fullname, + type = reporttype, + details = details, + tags = json.encode(tags), + gallery = json.encode(gallery), + officersinvolved = json.encode(officers), + civsinvolved = json.encode(civilians), + time = tostring(time), + jobtype = JobType, + }, function(r) + if r then + TriggerClientEvent('mdt:client:reportComplete', src, r) + TriggerEvent('mdt:server:AddLog', "En ny rapport blevet skrevet af "..fullname.." med titel ("..title..") og ID ("..id..")") + end + end) + end + + local function UpdateReport() + MySQL.update("UPDATE `mdt_reports` SET `title` = :title, type = :type, details = :details, tags = :tags, gallery = :gallery, officersinvolved = :officersinvolved, civsinvolved = :civsinvolved, jobtype = :jobtype WHERE `id` = :id LIMIT 1", { + title = title, + type = reporttype, + details = details, + tags = json.encode(tags), + gallery = json.encode(gallery), + officersinvolved = json.encode(officers), + civsinvolved = json.encode(civilians), + jobtype = JobType, + id = id, + }, function(affectedRows) + if affectedRows > 0 then + TriggerClientEvent('mdt:client:reportComplete', src, id) + TriggerEvent('mdt:server:AddLog', "En rapport blev opdateret af "..fullname.." med titel ("..title..") og ID ("..id..")") + end + end) + end + + if existing then + UpdateReport() + elseif not existing then + InsertReport() + end + end + end + end +end) + +QBCore.Functions.CreateCallback('mdt:server:SearchVehicles', function(source, cb, sentData) + if not sentData then return cb({}) end + local src = source + local PlayerData = GetPlayerData(src) + if not PermCheck(source, PlayerData) then return cb({}) end + + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local vehicles = MySQL.query.await("SELECT pv.id, pv.citizenid, pv.plate, pv.vehicle, pv.mods, pv.state, p.charinfo FROM `player_vehicles` pv LEFT JOIN players p ON pv.citizenid = p.citizenid WHERE LOWER(`plate`) LIKE :query OR LOWER(`vehicle`) LIKE :query LIMIT 25", { + query = string.lower('%'..sentData..'%') + }) + + if not next(vehicles) then cb({}) return end + + for _, value in ipairs(vehicles) do + if value.state == 0 then + value.state = "Ude" + elseif value.state == 1 then + value.state = "Parkeret" + elseif value.state == 2 then + value.state = "Beslaglagt" + end + + value.bolo = false + local boloResult = GetBoloStatus(value.plate) + if boloResult then + value.bolo = true + end + + value.code = false + value.stolen = false + value.image = "img/not-found.webp" + local info = GetVehicleInformation(value.plate) + if info then + value.code = info['code5'] + value.stolen = info['stolen'] + value.image = info['image'] + end + + local ownerResult = json.decode(value.charinfo) + + value.owner = ownerResult['firstname'] .. " " .. ownerResult['lastname'] + end + return cb(vehicles) + end + + return cb({}) + end + +end) + +RegisterNetEvent('mdt:server:getVehicleData', function(plate) + if plate then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local vehicle = MySQL.query.await("select pv.*, p.charinfo from player_vehicles pv LEFT JOIN players p ON pv.citizenid = p.citizenid where pv.plate = :plate LIMIT 1", { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1")}) + if vehicle and vehicle[1] then + vehicle[1]['impound'] = false + if vehicle[1].state == 2 then + vehicle[1]['impound'] = true + end + + vehicle[1]['bolo'] = GetBoloStatus(vehicle[1]['plate']) + vehicle[1]['information'] = "" + + vehicle[1]['name'] = "Ukendt person" + + local ownerResult = json.decode(vehicle[1].charinfo) + vehicle[1]['name'] = ownerResult['firstname'] .. " " .. ownerResult['lastname'] + + local color1 = json.decode(vehicle[1].mods) + vehicle[1]['color1'] = color1['color1'] + + vehicle[1]['dbid'] = 0 + + local info = GetVehicleInformation(vehicle[1]['plate']) + if info then + vehicle[1]['information'] = info['information'] + vehicle[1]['dbid'] = info['id'] + vehicle[1]['points'] = info['points'] + vehicle[1]['image'] = info['image'] + vehicle[1]['code'] = info['code5'] + vehicle[1]['stolen'] = info['stolen'] + end + + if vehicle[1]['image'] == nil then vehicle[1]['image'] = "img/not-found.webp" end + end + + TriggerClientEvent('mdt:client:getVehicleData', src, vehicle) + end + end + end +end) + +RegisterNetEvent('mdt:server:saveVehicleInfo', function(dbid, plate, imageurl, notes, stolen, code5, impoundInfo, points) + if plate then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + if GetJobType(Player.PlayerData.job.name) == 'police' then + if dbid == nil then dbid = 0 end; + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + TriggerEvent('mdt:server:AddLog', "Køretøjet med nummerpladen ("..plate..") fik et nyt billede ("..imageurl.."), opdateret af "..fullname) + if tonumber(dbid) == 0 then + MySQL.insert('INSERT INTO `mdt_vehicleinfo` (`plate`, `information`, `image`, `code5`, `stolen`, `points`) VALUES (:plate, :information, :image, :code5, :stolen, :points)', { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1"), information = notes, image = imageurl, code5 = code5, stolen = stolen, points = tonumber(points) }, function(infoResult) + if infoResult then + TriggerClientEvent('mdt:client:updateVehicleDbId', src, infoResult) + TriggerEvent('mdt:server:AddLog', "Køretøjet med nummerpladen ("..plate..") blev tilføjet til databasen af "..fullname) + end + end) + elseif tonumber(dbid) > 0 then + MySQL.update("UPDATE mdt_vehicleinfo SET `information`= :information, `image`= :image, `code5`= :code5, `stolen`= :stolen, `points`= :points WHERE `plate`= :plate LIMIT 1", { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1"), information = notes, image = imageurl, code5 = code5, stolen = stolen, points = tonumber(points) }) + end + + if impoundInfo.impoundChanged then + local vehicle = MySQL.single.await("SELECT p.id, p.plate, i.vehicleid AS impoundid FROM `player_vehicles` p LEFT JOIN `mdt_impound` i ON i.vehicleid = p.id WHERE plate=:plate", { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1") }) + if impoundInfo.impoundActive then + local plate, linkedreport, fee, time = impoundInfo['plate'], impoundInfo['linkedreport'], impoundInfo['fee'], impoundInfo['time'] + if (plate and linkedreport and fee and time) then + if vehicle.impoundid == nil then + -- This section is copy pasted from request impound and needs some attention. + -- sentVehicle doesnt exist. + -- data is defined twice + -- INSERT INTO will not work if it exists already (which it will) + local data = vehicle + MySQL.insert('INSERT INTO `mdt_impound` (`vehicleid`, `linkedreport`, `fee`, `time`) VALUES (:vehicleid, :linkedreport, :fee, :time)', { + vehicleid = data['id'], + linkedreport = linkedreport, + fee = fee, + time = os.time() + (time * 60) + }, function(res) + + local data = { + vehicleid = data['id'], + plate = plate, + beingcollected = 0, + vehicle = sentVehicle, + officer = Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname, + number = Player.PlayerData.charinfo.phone, + time = os.time() * 1000, + src = src, + } + local vehicle = NetworkGetEntityFromNetworkId(sentVehicle) + FreezeEntityPosition(vehicle, true) + impound[#impound+1] = data + + TriggerClientEvent("police:client:ImpoundVehicle", src, true, fee) + end) + -- Read above comment + end + end + else + if vehicle.impoundid ~= nil then + local data = vehicle + local result = MySQL.single.await("SELECT id, vehicle, fuel, engine, body FROM `player_vehicles` WHERE plate=:plate LIMIT 1", { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1")}) + if result then + local data = result + MySQL.update("DELETE FROM `mdt_impound` WHERE vehicleid=:vehicleid", { vehicleid = data['id'] }) + + result.currentSelection = impoundInfo.CurrentSelection + result.plate = plate + TriggerClientEvent('ps-mdt:client:TakeOutImpound', src, result) + end + + end + end + end + end + end + end +end) + +RegisterNetEvent('mdt:server:searchCalls', function(calls) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' then + local calls = exports['ps-dispatch']:GetDispatchCalls() + TriggerClientEvent('mdt:client:getCalls', src, calls) + + end +end) + +QBCore.Functions.CreateCallback('mdt:server:SearchWeapons', function(source, cb, sentData) + if not sentData then return cb({}) end + local PlayerData = GetPlayerData(source) + if not PermCheck(source, PlayerData) then return cb({}) end + + local Player = QBCore.Functions.GetPlayer(source) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local matches = MySQL.query.await('SELECT * FROM mdt_weaponinfo WHERE LOWER(`serial`) LIKE :query OR LOWER(`weapModel`) LIKE :query OR LOWER(`owner`) LIKE :query LIMIT 25', { + query = string.lower('%'..sentData..'%') + }) + cb(matches) + end + end +end) + +RegisterNetEvent('mdt:server:saveWeaponInfo', function(serial, imageurl, notes, owner, weapClass, weapModel) + if serial then + local PlayerData = GetPlayerData(source) + if not PermCheck(source, PlayerData) then return cb({}) end + + local Player = QBCore.Functions.GetPlayer(source) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + if imageurl == nil then imageurl = 'img/not-found.webp' end + --AddLog event? + local result = false + result = MySQL.Async.insert('INSERT INTO mdt_weaponinfo (serial, owner, information, weapClass, weapModel, image) VALUES (:serial, :owner, :notes, :weapClass, :weapModel, :imageurl) ON DUPLICATE KEY UPDATE owner = :owner, information = :notes, weapClass = :weapClass, weapModel = :weapModel, image = :imageurl', { + ['serial'] = serial, + ['owner'] = owner, + ['notes'] = notes, + ['weapClass'] = weapClass, + ['weapModel'] = weapModel, + ['imageurl'] = imageurl, + }) + + if result then + TriggerEvent('mdt:server:AddLog', "Våben med serienummer ("..serial..") blev tilføjet til databasen af "..fullname) + else + TriggerEvent('mdt:server:AddLog', "Våben med serienummer ("..serial..") blev forsøgt tilføjet af "..fullname.." men der opstod en fejl") + end + end + end + end +end) + +function CreateWeaponInfo(serial, imageurl, notes, owner, weapClass, weapModel) + + local results = MySQL.query.await('SELECT * FROM mdt_weaponinfo WHERE serial = ?', { serial }) + if results[1] then + return + end + + if serial == nil then return end + if imageurl == nil then imageurl = 'img/not-found.webp' end + + MySQL.Async.insert('INSERT INTO mdt_weaponinfo (serial, owner, information, weapClass, weapModel, image) VALUES (:serial, :owner, :notes, :weapClass, :weapModel, :imageurl) ON DUPLICATE KEY UPDATE owner = :owner, information = :notes, weapClass = :weapClass, weapModel = :weapModel, image = :imageurl', { + ['serial'] = serial, + ['owner'] = owner, + ['notes'] = notes, + ['weapClass'] = weapClass, + ['weapModel'] = weapModel, + ['imageurl'] = imageurl, + }) +end + +exports('CreateWeaponInfo', CreateWeaponInfo) + +RegisterNetEvent('mdt:server:getWeaponData', function(serial) + if serial then + local Player = QBCore.Functions.GetPlayer(source) + if Player then + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'doj' then + local results = MySQL.query.await('SELECT * FROM mdt_weaponinfo WHERE serial = ?', { serial }) + TriggerClientEvent('mdt:client:getWeaponData', Player.PlayerData.source, results) + end + end + end +end) + +RegisterNetEvent('mdt:server:getAllLogs', function() + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + if Config.LogPerms[Player.PlayerData.job.name] then + if Config.LogPerms[Player.PlayerData.job.name][Player.PlayerData.job.grade.level] then + + local JobType = GetJobType(Player.PlayerData.job.name) + local infoResult = MySQL.query.await('SELECT * FROM mdt_logs WHERE `jobtype` = :jobtype ORDER BY `id` DESC LIMIT 250', {jobtype = JobType}) + + TriggerLatentClientEvent('mdt:client:getAllLogs', src, 30000, infoResult) + end + end + end +end) + +-- Penal Code + +local function IsCidFelon(sentCid, cb) + if sentCid then + local convictions = MySQL.query.await('SELECT charges FROM mdt_convictions WHERE cid=:cid', { cid = sentCid }) + local Charges = {} + for i=1, #convictions do + local currCharges = json.decode(convictions[i]['charges']) + for x=1, #currCharges do + Charges[#Charges+1] = currCharges[x] + end + end + local PenalCode = Config.PenalCode + for i=1, #Charges do + for p=1, #PenalCode do + for x=1, #PenalCode[p] do + if PenalCode[p][x]['title'] == Charges[i] then + if PenalCode[p][x]['class'] == 'Felony' then + cb(true) + return + end + break + end + end + end + end + cb(false) + end +end + +exports('IsCidFelon', IsCidFelon) -- exports['erp_mdt']:IsCidFelon() + +RegisterCommand("isfelon", function(source, args, rawCommand) + IsCidFelon(1998, function(res) + end) +end, false) + +RegisterNetEvent('mdt:server:getPenalCode', function() + local src = source + TriggerClientEvent('mdt:client:getPenalCode', src, Config.PenalCodeTitles, Config.PenalCode) +end) + +RegisterNetEvent('mdt:server:setCallsign', function(cid, newcallsign) + local Player = QBCore.Functions.GetPlayerByCitizenId(cid) + Player.Functions.SetMetaData("callsign", newcallsign) +end) + +RegisterNetEvent('mdt:server:saveIncident', function(id, title, information, tags, officers, civilians, evidence, associated, time) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + if GetJobType(Player.PlayerData.job.name) == 'police' then + if id == 0 then + local fullname = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + MySQL.insert('INSERT INTO `mdt_incidents` (`author`, `title`, `details`, `tags`, `officersinvolved`, `civsinvolved`, `evidence`, `time`, `jobtype`) VALUES (:author, :title, :details, :tags, :officersinvolved, :civsinvolved, :evidence, :time, :jobtype)', + { + author = fullname, + title = title, + details = information, + tags = json.encode(tags), + officersinvolved = json.encode(officers), + civsinvolved = json.encode(civilians), + evidence = json.encode(evidence), + time = time, + jobtype = 'police', + }, function(infoResult) + if infoResult then + for i=1, #associated do + MySQL.insert('INSERT INTO `mdt_convictions` (`cid`, `linkedincident`, `warrant`, `guilty`, `processed`, `associated`, `charges`, `fine`, `sentence`, `recfine`, `recsentence`, `time`) VALUES (:cid, :linkedincident, :warrant, :guilty, :processed, :associated, :charges, :fine, :sentence, :recfine, :recsentence, :time)', { + cid = associated[i]['Cid'], + linkedincident = infoResult, + warrant = associated[i]['Warrant'], + guilty = associated[i]['Guilty'], + processed = associated[i]['Processed'], + associated = associated[i]['Isassociated'], + charges = json.encode(associated[i]['Charges']), + fine = tonumber(associated[i]['Fine']), + sentence = tonumber(associated[i]['Sentence']), + recfine = tonumber(associated[i]['recfine']), + recsentence = tonumber(associated[i]['recsentence']), + time = time + }) + end + TriggerClientEvent('mdt:client:updateIncidentDbId', src, infoResult) + --TriggerEvent('mdt:server:AddLog', "Køretøjet med nummerpladen ("..plate..") was added to the vehicle information database by "..player['fullname']) + end + end) + elseif id > 0 then + MySQL.update("UPDATE mdt_incidents SET title=:title, details=:details, civsinvolved=:civsinvolved, tags=:tags, officersinvolved=:officersinvolved, evidence=:evidence WHERE id=:id", { + title = title, + details = information, + tags = json.encode(tags), + officersinvolved = json.encode(officers), + civsinvolved = json.encode(civilians), + evidence = json.encode(evidence), + id = id + }) + for i=1, #associated do + TriggerEvent('mdt:server:handleExistingConvictions', associated[i], id, time) + end + end + end + end +end) + +RegisterNetEvent('mdt:server:handleExistingConvictions', function(data, incidentId, time) + MySQL.query('SELECT * FROM mdt_convictions WHERE cid=:cid AND linkedincident=:linkedincident', { + cid = data['Cid'], + linkedincident = incidentId + }, function(convictionRes) + if convictionRes and convictionRes[1] and convictionRes[1]['id'] then + MySQL.update('UPDATE mdt_convictions SET cid=:cid, linkedincident=:linkedincident, warrant=:warrant, guilty=:guilty, processed=:processed, associated=:associated, charges=:charges, fine=:fine, sentence=:sentence, recfine=:recfine, recsentence=:recsentence WHERE cid=:cid AND linkedincident=:linkedincident', { + cid = data['Cid'], + linkedincident = incidentId, + warrant = data['Warrant'], + guilty = data['Guilty'], + processed = data['Processed'], + associated = data['Isassociated'], + charges = json.encode(data['Charges']), + fine = tonumber(data['Fine']), + sentence = tonumber(data['Sentence']), + recfine = tonumber(data['recfine']), + recsentence = tonumber(data['recsentence']), + }) + else + MySQL.insert('INSERT INTO `mdt_convictions` (`cid`, `linkedincident`, `warrant`, `guilty`, `processed`, `associated`, `charges`, `fine`, `sentence`, `recfine`, `recsentence`, `time`) VALUES (:cid, :linkedincident, :warrant, :guilty, :processed, :associated, :charges, :fine, :sentence, :recfine, :recsentence, :time)', { + cid = data['Cid'], + linkedincident = incidentId, + warrant = data['Warrant'], + guilty = data['Guilty'], + processed = data['Processed'], + associated = data['Isassociated'], + charges = json.encode(data['Charges']), + fine = tonumber(data['Fine']), + sentence = tonumber(data['Sentence']), + recfine = tonumber(data['recfine']), + recsentence = tonumber(data['recsentence']), + time = time + }) + end + end) +end) + +RegisterNetEvent('mdt:server:removeIncidentCriminal', function(cid, incident) + MySQL.update('DELETE FROM mdt_convictions WHERE cid=:cid AND linkedincident=:linkedincident', { + cid = cid, + linkedincident = incident + }) +end) + +-- Dispatch + +RegisterNetEvent('mdt:server:setWaypoint', function(callid) + local src = source + local Player = QBCore.Functions.GetPlayer(source) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + if callid then + if isDispatchRunning then + local calls = exports['ps-dispatch']:GetDispatchCalls() + TriggerClientEvent('mdt:client:setWaypoint', src, calls[callid]) + end + end + end +end) + +RegisterNetEvent('mdt:server:callDetach', function(callid) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local playerdata = { + fullname = Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname, + job = Player.PlayerData.job, + cid = Player.PlayerData.citizenid, + callsign = Player.PlayerData.metadata.callsign + } + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + if callid then + TriggerEvent('dispatch:removeUnit', callid, playerdata, function(newNum) + TriggerClientEvent('mdt:client:callDetach', -1, callid, newNum) + end) + end + end +end) + +RegisterNetEvent('mdt:server:callAttach', function(callid) + local src = source + local plyState = Player(source).state + local Radio = plyState.radioChannel or 0 + local Player = QBCore.Functions.GetPlayer(src) + local playerdata = { + fullname = Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname, + job = Player.PlayerData.job, + cid = Player.PlayerData.citizenid, + callsign = Player.PlayerData.metadata.callsign, + radio = Radio + } + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + if callid then + TriggerEvent('dispatch:addUnit', callid, playerdata, function(newNum) + TriggerClientEvent('mdt:client:callAttach', -1, callid, newNum) + end) + end + end + +end) + +RegisterNetEvent('mdt:server:attachedUnits', function(callid) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + if callid then + if isDispatchRunning then + local calls = exports['ps-dispatch']:GetDispatchCalls() + TriggerClientEvent('mdt:client:attachedUnits', src, calls[callid]['units'], callid) + end + end + end +end) + +RegisterNetEvent('mdt:server:callDispatchDetach', function(callid, cid) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local playerdata = { + fullname = Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname, + job = Player.PlayerData.job, + cid = Player.PlayerData.citizenid, + callsign = Player.PlayerData.metadata.callsign + } + local callid = tonumber(callid) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + if callid then + TriggerEvent('dispatch:removeUnit', callid, playerdata, function(newNum) + TriggerClientEvent('mdt:client:callDetach', -1, callid, newNum) + end) + end + end +end) + +RegisterNetEvent('mdt:server:setDispatchWaypoint', function(callid, cid) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local callid = tonumber(callid) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + if callid then + if isDispatchRunning then + local calls = exports['ps-dispatch']:GetDispatchCalls() + TriggerClientEvent('mdt:client:setWaypoint', src, calls[callid]) + end + end + end + +end) + +RegisterNetEvent('mdt:server:callDragAttach', function(callid, cid) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local playerdata = { + name = Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname, + job = Player.PlayerData.job.name, + cid = Player.PlayerData.citizenid, + callsign = Player.PlayerData.metadata.callsign + } + local callid = tonumber(callid) + local JobType = GetJobType(Player.PlayerData.job.name) + if JobType == 'police' or JobType == 'ambulance' then + if callid then + TriggerEvent('dispatch:addUnit', callid, playerdata, function(newNum) + TriggerClientEvent('mdt:client:callAttach', -1, callid, newNum) + end) + end + end +end) + +RegisterNetEvent('mdt:server:setWaypoint:unit', function(cid) + local src = source + local Player = QBCore.Functions.GetPlayerByCitizenId(cid) + local PlayerCoords = GetEntityCoords(GetPlayerPed(Player.PlayerData.source)) + TriggerClientEvent("mdt:client:setWaypoint:unit", src, PlayerCoords) +end) + +-- Dispatch chat + +RegisterNetEvent('mdt:server:sendMessage', function(message, time) + if message and time then + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + MySQL.scalar("SELECT pfp FROM `mdt_data` WHERE cid=:id LIMIT 1", { + id = Player.PlayerData.citizenid -- % wildcard, needed to search for all alike results + }, function(data) + if data == "" then data = nil end + local ProfilePicture = ProfPic(Player.PlayerData.charinfo.gender, data) + local callsign = Player.PlayerData.metadata.callsign or "000" + local Item = { + profilepic = ProfilePicture, + callsign = Player.PlayerData.metadata.callsign, + cid = Player.PlayerData.citizenid, + name = '('..callsign..') '..Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname, + message = message, + time = time, + job = Player.PlayerData.job.name + } + dispatchMessages[#dispatchMessages+1] = Item + TriggerClientEvent('mdt:client:dashboardMessage', -1, Item) + end) + end + end +end) + +RegisterNetEvent('mdt:server:refreshDispatchMsgs', function() + local src = source + local PlayerData = GetPlayerData(src) + if IsJobAllowedToMDT(PlayerData.job.name) then + TriggerClientEvent('mdt:client:dashboardMessages', src, dispatchMessages) + end +end) + +RegisterNetEvent('mdt:server:getCallResponses', function(callid) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if IsPoliceOrEms(Player.PlayerData.job.name) then + if isDispatchRunning then + local calls = exports['ps-dispatch']:GetDispatchCalls() + TriggerClientEvent('mdt:client:getCallResponses', src, calls[callid]['responses'], callid) + end + end +end) + +RegisterNetEvent('mdt:server:sendCallResponse', function(message, time, callid) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local name = Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname + if IsPoliceOrEms(Player.PlayerData.job.name) then + TriggerEvent('dispatch:sendCallResponse', src, callid, message, time, function(isGood) + if isGood then + TriggerClientEvent('mdt:client:sendCallResponse', -1, message, time, callid, name) + end + end) + end +end) + +RegisterNetEvent('mdt:server:setRadio', function(cid, newRadio) + local src = source + local targetPlayer = QBCore.Functions.GetPlayerByCitizenId(cid) + local targetSource = targetPlayer.PlayerData.source + local targetName = targetPlayer.PlayerData.charinfo.firstname .. ' ' .. targetPlayer.PlayerData.charinfo.lastname + + local radio = targetPlayer.Functions.GetItemByName("radio") + if radio ~= nil then + TriggerClientEvent('mdt:client:setRadio', targetSource, newRadio) + else + TriggerClientEvent("QBCore:Notify", src, targetName..' har ikke en radio!', 'error') + end +end) + +local function isRequestVehicle(vehId) + local found = false + for i=1, #impound do + if impound[i]['vehicle'] == vehId then + found = true + impound[i] = nil + break + end + end + return found +end +exports('isRequestVehicle', isRequestVehicle) + +RegisterNetEvent('mdt:server:impoundVehicle', function(sentInfo, sentVehicle) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + if GetJobType(Player.PlayerData.job.name) == 'police' then + if sentInfo and type(sentInfo) == 'table' then + local plate, linkedreport, fee, time = sentInfo['plate'], sentInfo['linkedreport'], sentInfo['fee'], sentInfo['time'] + if (plate and linkedreport and fee and time) then + local vehicle = MySQL.query.await("SELECT id, plate FROM `player_vehicles` WHERE plate=:plate LIMIT 1", { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1") }) + if vehicle and vehicle[1] then + local data = vehicle[1] + MySQL.insert('INSERT INTO `mdt_impound` (`vehicleid`, `linkedreport`, `fee`, `time`) VALUES (:vehicleid, :linkedreport, :fee, :time)', { + vehicleid = data['id'], + linkedreport = linkedreport, + fee = fee, + time = os.time() + (time * 60) + }, function(res) + local data = { + vehicleid = data['id'], + plate = plate, + beingcollected = 0, + vehicle = sentVehicle, + officer = Player.PlayerData.charinfo.firstname.. " "..Player.PlayerData.charinfo.lastname, + number = Player.PlayerData.charinfo.phone, + time = os.time() * 1000, + src = src, + } + local vehicle = NetworkGetEntityFromNetworkId(sentVehicle) + FreezeEntityPosition(vehicle, true) + impound[#impound+1] = data + + TriggerClientEvent("police:client:ImpoundVehicle", src, true, fee) + end) + end + end + end + end + end +end) + +RegisterNetEvent('mdt:server:getImpoundVehicles', function() + TriggerClientEvent('mdt:client:getImpoundVehicles', source, impound) +end) + +RegisterNetEvent('mdt:server:removeImpound', function(plate, currentSelection) + -- print("Removing impound", plate, currentSelection) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + if GetJobType(Player.PlayerData.job.name) == 'police' then + local result = MySQL.single.await("SELECT id, vehicle FROM `player_vehicles` WHERE plate=:plate LIMIT 1", { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1")}) + if result and result[1] then + local data = result[1] + MySQL.update("DELETE FROM `mdt_impound` WHERE vehicleid=:vehicleid", { vehicleid = data['id'] }) + TriggerClientEvent('police:client:TakeOutImpound', src, currentSelection) + end + end + end +end) + +RegisterNetEvent('mdt:server:statusImpound', function(plate) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player then + if GetJobType(Player.PlayerData.job.name) == 'police' then + local vehicle = MySQL.query.await("SELECT id, plate FROM `player_vehicles` WHERE plate=:plate LIMIT 1", { plate = string.gsub(plate, "^%s*(.-)%s*$", "%1")}) + if vehicle and vehicle[1] then + local data = vehicle[1] + local impoundinfo = MySQL.query.await("SELECT * FROM `mdt_impound` WHERE vehicleid=:vehicleid LIMIT 1", { vehicleid = data['id'] }) + if impoundinfo and impoundinfo[1] then + TriggerClientEvent('mdt:client:statusImpound', src, impoundinfo[1], plate) + end + end + end + end +end) + +RegisterServerEvent("mdt:server:AddLog", function(text) + AddLog(text) +end) + +function GetBoloStatus(plate) + + local result = MySQL.query.await("SELECT * FROM mdt_bolos where plate = @plate", {['@plate'] = plate}) + if result and result[1] then + local title = result[1]['title'] + local boloId = result[1]['id'] + return true, title, boloId + end + + return false +end + +function GetWarrantStatus(plate) + local result = MySQL.query.await("SELECT p.plate, p.citizenid, m.id FROM player_vehicles p INNER JOIN mdt_convictions m ON p.citizenid = m.cid WHERE m.warrant =1 AND p.plate =?", {plate}) + if result and result[1] then + local citizenid = result[1]['citizenid'] + local Player = QBCore.Functions.GetPlayerByCitizenId(citizenid) + local owner = Player.PlayerData.charinfo.firstname.." "..Player.PlayerData.charinfo.lastname + local incidentId = result[1]['id'] + return true, owner, incidentId + end + return false +end + +function GetVehicleInformation(plate) + local result = MySQL.query.await('SELECT * FROM mdt_vehicleinfo WHERE plate = @plate', {['@plate'] = plate}) + if result[1] then + return result[1] + else + return false + end +end + +function GetVehicleOwner(plate) + + local result = MySQL.query.await('SELECT plate, citizenid, id FROM player_vehicles WHERE plate = @plate', {['@plate'] = plate}) + if result and result[1] then + local citizenid = result[1]['citizenid'] + local Player = QBCore.Functions.GetPlayerByCitizenId(citizenid) + local owner = Player.PlayerData.charinfo.firstname.." "..Player.PlayerData.charinfo.lastname + return owner + end +end + +-- Returns the source for the given citizenId +QBCore.Functions.CreateCallback('mdt:server:GetPlayerSourceId', function(source, cb, targetCitizenId) + local targetPlayer = QBCore.Functions.GetPlayerByCitizenId(targetCitizenId) + if targetPlayer == nil then + TriggerClientEvent('QBCore:Notify', source, "Borgeren sover eller er forsvundet", "error") + return + end + local targetSource = targetPlayer.PlayerData.source + + cb(targetSource) +end) + +QBCore.Functions.CreateCallback('getWeaponInfo', function(source, cb) + local Player = QBCore.Functions.GetPlayer(source) + local weaponInfos = {} + if Config.InventoryForWeaponsImages == "ox_inventory" then + local inv = exports.ox_inventory:GetInventoryItems(source) + for _, item in pairs(inv) do + if string.find(item.name, "WEAPON_") then + local invImage = ("https://cfx-nui-ox_inventory/web/images/%s.png"):format(item.name) + if invImage then + weaponInfo = { + serialnumber = item.metadata.serial, + owner = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname, + weaponmodel = QBCore.Shared.Items[string.lower(item.name)].label, + weaponurl = invImage, + notes = "Selvregistreret", + weapClass = "Klasse 1", + } + break + end + end + end + else -- qb/lj + for _, item in pairs(Player.PlayerData.items) do + if item.type == "weapon" then + local invImage = ("https://cfx-nui-%s/html/images/%s"):format(Config.InventoryForWeaponsImages, item.image) + if invImage then + local weaponInfo = { + serialnumber = item.info.serie, + owner = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname, + weaponmodel = QBCore.Shared.Items[item.name].label, + weaponurl = invImage, + notes = "Selvregistreret", + weapClass = "Klasse 1", + } + table.insert(weaponInfos, weaponInfo) + end + end + end + end + cb(weaponInfos) +end) + +RegisterNetEvent('mdt:server:registerweapon', function(serial, imageurl, notes, owner, weapClass, weapModel) + exports['ps-mdt']:CreateWeaponInfo(serial, imageurl, notes, owner, weapClass, weapModel) +end) + +local function giveCitationItem(src, citizenId, fine, incidentId) + local Player = QBCore.Functions.GetPlayerByCitizenId(citizenId) + local PlayerName = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname + local Officer = QBCore.Functions.GetPlayer(src) + local OfficerFullName = '(' .. Officer.PlayerData.metadata.callsign .. ') ' .. Officer.PlayerData.charinfo.firstname .. ' ' .. Officer.PlayerData.charinfo.lastname + + local date = os.date("%Y-%m-%d %H:%M") + local info = { + citizenId = citizenId, + fine = "$"..fine, + date = date, + incidentId = "#"..incidentId, + officer = OfficerFullName, + } + Player.Functions.AddItem('mdtcitation', 1, false, info) + TriggerClientEvent('QBCore:Notify', src, PlayerName.." (" ..citizenId.. ") modtog en bøde!") + if Config.QBManagementUse then + exports['qb-management']:AddMoney(Officer.PlayerData.job.name, fine) + end + TriggerClientEvent('inventory:client:ItemBox', Player.PlayerData.source, QBCore.Shared.Items['mdtcitation'], "add") + TriggerEvent('mdt:server:AddLog', "En bøde blev udskrevet af "..OfficerFullName.." og sendt til "..PlayerName..". Bøden lyder på ".. fine ..",-. (ID: "..incidentId.. ")") +end + +-- Removes money from the players bank and gives them a citation item +RegisterNetEvent('mdt:server:removeMoney', function(citizenId, fine, incidentId) + local src = source + local Player = QBCore.Functions.GetPlayerByCitizenId(citizenId) + + if not antiSpam then + if Player.Functions.RemoveMoney('bank', fine, 'Bøde: '..fine..",-") then + TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, fine..",- blev fjernet fra din bank-konto!") + giveCitationItem(src, citizenId, fine, incidentId) + else + TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, "Der gik noget galt.") + end + antiSpam = true + SetTimeout(60000, function() + antiSpam = false + end) + else + TriggerClientEvent('QBCore:Notify', src, "Vent før du udskriver en ny bøde!") + end +end) + +-- Gives the player a citation item +RegisterNetEvent('mdt:server:giveCitationItem', function(citizenId, fine, incidentId) + local src = source + giveCitationItem(src, citizenId, fine, incidentId) +end) \ No newline at end of file diff --git a/resources/[ps]/ps-mdt/server/utils.lua b/resources/[ps]/ps-mdt/server/utils.lua new file mode 100644 index 0000000..467dec9 --- /dev/null +++ b/resources/[ps]/ps-mdt/server/utils.lua @@ -0,0 +1,52 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +function GetPlayerData(source) + local Player = QBCore.Functions.GetPlayer(source) + if Player == nil then return end -- Player not loaded in correctly + return Player.PlayerData +end + +function UnpackJob(data) + local job = { + name = data.name, + label = data.label + } + local grade = { + name = data.grade.name, + } + + return job, grade +end + +function PermCheck(src, PlayerData) + local result = true + + if not Config.AllowedJobs[PlayerData.job.name] then + print(("UserId: %s(%d) tried to access the mdt even though they are not authorised (server direct)"):format(GetPlayerName(src), src)) + result = false + end + + return result +end + +function ProfPic(gender, profilepic) + if profilepic then return profilepic end; + if gender == "f" then return "img/female.png" end; + return "img/male.png" +end + +function IsJobAllowedToMDT(job) + if Config.PoliceJobs[job] then + return true + elseif Config.AmbulanceJobs[job] then + return true + elseif Config.DojJobs[job] then + return true + else + return false + end +end + +function GetNameFromPlayerData(PlayerData) + return ('%s %s'):format(PlayerData.charinfo.firstname, PlayerData.charinfo.lastname) +end diff --git a/resources/[ps]/ps-mdt/shared/config.lua b/resources/[ps]/ps-mdt/shared/config.lua new file mode 100644 index 0000000..e1f867a --- /dev/null +++ b/resources/[ps]/ps-mdt/shared/config.lua @@ -0,0 +1,842 @@ +Config = Config or {} + +Config.UsingPsHousing = true +Config.UsingDefaultQBApartments = true +Config.OnlyShowOnDuty = true +Config.UseCQCMugshot = true + +-- Front, Back Side. Use 4 for both sides, we recommend leaving at 1 for default. +Config.MugPhotos = 1 + +-- If set to true = Fine gets automatically removed from bank automatically charging the player. +-- If set to false = The fine gets sent as an Invoice to their phone and it us to the player to pay for it, can remain unpaid and ignored. +Config.BillVariation = true + +-- If set to false (default) = The fine amount is just being removed from the player's bank account +-- If set to true = The fine amount is beeing added to the society account after being removed from the player's bank account +Config.QBManagementUse = true + +-- Set up your inventory to automatically retrieve images when a weapon is registered at a weapon shop or self-registered. +-- If you're utilizing lj-inventory's latest version from GitHub, no further modifications are necessary. +-- However, if you're using a different inventory system, please refer to the "Inventory Edit | Automatic Add Weapons with images" section in ps-mdt's README. +Config.InventoryForWeaponsImages = "ps-inventory" + +-- "LegacyFuel", "lj-fuel", "ps-fuel" +Config.Fuel = "qb-fuel" + +-- Google Docs Link +Config.sopLink = { + ['police'] = '', + ['ambulance'] = '', + ['bcso'] = '', + ['doj'] = '', + ['sast'] = '', + ['sasp'] = '', + ['doc'] = '', + ['lssd'] = '', + ['sapr'] = '', +} + +-- Google Docs Link +Config.RosterLink = { + ['police'] = 'https://docs.google.com/document/d/1eqThy2tgIzBwhWeDqObo2rmP4EmW-gA8V4He7ox64vA/edit?usp=sharing', + ['ambulance'] = '', + ['bcso'] = '', + ['doj'] = '', + ['sast'] = '', + ['sasp'] = '', + ['doc'] = '', + ['lssd'] = '', + ['sapr'] = '', +} + +Config.PoliceJobs = { + ['police'] = true, + ['lspd'] = true, + ['bcso'] = true, + ['sast'] = true, + ['sasp'] = true, + ['doc'] = true, + ['lssd'] = true, + ['sapr'] = true, + ['pa'] = true +} + +Config.AmbulanceJobs = { + ['ambulance'] = true, + ['doctor'] = true +} + +Config.DojJobs = { + ['lawyer'] = true, + ['judge'] = true +} + +-- This is a workaround solution because the qb-menu present in qb-policejob fills in an impound location and sends it to the event. +-- If the impound locations are modified in qb-policejob, the changes must also be implemented here to ensure consistency. + +Config.ImpoundLocations = { + [1] = vector4(436.68, -1007.42, 27.32, 180.0), + [2] = vector4(-436.14, 5982.63, 31.34, 136.0), +} + +-- Support for Wraith ARS 2X. + +Config.UseWolfknightRadar = true +Config.WolfknightNotifyTime = 5000 -- How long the notification displays for in milliseconds (30000 = 30 seconds) +Config.PlateScanForDriversLicense = true -- If true, plate scanner will check if the owner of the scanned vehicle has a drivers license + +-- IMPORTANT: To avoid making excessive database queries, modify this config to true 'CONFIG.use_sonorancad = true' setting in the configuration file located at 'wk_wars2x/config.lua'. +-- Enabling this setting will limit plate checks to only those vehicles that have been used by a player. + +Config.LogPerms = { + ['ambulance'] = { + [4] = true, + }, + ['police'] = { + [4] = true, + [5] = true, + [6] = true, + [7] = true, + [8] = true, + [9] = true, + [10] = true, + [11] = true, + [12] = true, + [13] = true, + [14] = true, + [15] = true, + [16] = true, + [17] = true, + [18] = true, + }, + ['bcso'] = { + [4] = true, + }, + ['sast'] = { + [4] = true, + }, + ['sasp'] = { + [4] = true, + }, + ['sapr'] = { + [4] = true, + }, + ['doc'] = { + [4] = true, + }, + ['lssd'] = { + [4] = true, + }, +} + +Config.RemoveIncidentPerms = { + ['ambulance'] = { + [4] = true, + }, + ['police'] = { + [4] = true, + [5] = true, + [6] = true, + [7] = true, + [8] = true, + [9] = true, + [10] = true, + [11] = true, + [12] = true, + [13] = true, + [14] = true, + [15] = true, + [16] = true, + [17] = true, + [18] = true, + }, + ['bcso'] = { + [4] = true, + }, + ['sast'] = { + [4] = true, + }, + ['sasp'] = { + [4] = true, + }, + ['sapr'] = { + [4] = true, + }, + ['doc'] = { + [4] = true, + }, + ['lssd'] = { + [4] = true, + }, +} + +Config.RemoveReportPerms = { + ['ambulance'] = { + [4] = true, + }, + ['police'] = { + [4] = true, + [5] = true, + [6] = true, + [7] = true, + [8] = true, + [9] = true, + [10] = true, + [11] = true, + [12] = true, + [13] = true, + [14] = true, + [15] = true, + [16] = true, + [17] = true, + [18] = true, + }, + ['bcso'] = { + [4] = true, + }, + ['sast'] = { + [4] = true, + }, + ['sasp'] = { + [4] = true, + }, + ['sapr'] = { + [4] = true, + }, + ['doc'] = { + [4] = true, + }, + ['lssd'] = { + [4] = true, + }, +} + +Config.RemoveWeaponsPerms = { + ['ambulance'] = { + [4] = true, + }, + ['police'] = { + [5] = true, + [6] = true, + [7] = true, + [8] = true, + [9] = true, + [10] = true, + [11] = true, + [12] = true, + [13] = true, + [14] = true, + [15] = true, + [16] = true, + [17] = true, + [18] = true, + }, + ['bcso'] = { + [4] = true, + }, + ['sast'] = { + [4] = true, + }, + ['sasp'] = { + [4] = true, + }, + ['sapr'] = { + [4] = true, + }, + ['doc'] = { + [4] = true, + }, + ['lssd'] = { + [4] = true, + }, +} + +Config.PenalCodeTitles = { + [1] = 'OVERTRÆDELSER MOD PERSONER', + [2] = 'OVERTRÆDELSER MED TYVERI', + [3] = 'OVERTRÆDELSER DER INDEHOLDER SVIG', + [4] = 'OVERTRÆDELSER MED SKADE PÅ EJENDOM', + [5] = 'OVERTRÆDELSER MOD OFFENTLIG FORVALTNING', + [6] = 'OVERTRÆDELSER MOD OFFENTLIG ORDEN', + [7] = 'OVERTRÆDELSER MOD SUNDHED OG MORALER', + [8] = 'OVERTRÆDELSER MOD OFFENTLIG SIKKERHED', + [9] = 'OVERTRÆDELSER DER INVOLVERER DRIFT AF ET KØRETØJ', + [10] = 'OVERTRÆDELSER DER INVOLVERER VILDLIVETS VELBEFINDEN', +} + +Config.PenalCode = { + [1] = { + [1] = {title = 'Simple Assault', class = 'Misdemeanor', id = 'P.C. 1001', months = 7, fine = 500, color = 'green', description = 'When a person intentionally or knowingly causes physical contact with another (without a weapon)'}, + [2] = {title = 'Assault', class = 'Misdemeanor', id = 'P.C. 1002', months = 15, fine = 850, color = 'orange', description = 'If a person intentionally or knowingly causes injury to another (without a weapon)'}, + [3] = {title = 'Aggravated Assault', class = 'Felony', id = 'P.C. 1003', months = 20, fine = 1250, color = 'orange', description = 'When a person unintentionally, and recklessly causes bodily injury to another as a result of a confrontation AND causes bodily injury'}, + [4] = {title = 'Assault with a Deadly Weapon', class = 'Felony', id = 'P.C. 1004', months = 30, fine = 3750, color = 'red', description = 'When a person intentionally, knowingly, or recklessly causes bodily injury to another person AND either causes serious bodily injury or uses or exhibits a deadly weapon'}, + [5] = {title = 'Involuntary Manslaughter', class = 'Felony', id = 'P.C. 1005', months = 60, fine = 7500, color = 'red', description = 'When a person unintentionally and recklessly causes the death of another'}, + [6] = {title = 'Vehicular Manslaughter', class = 'Felony', id = 'P.C. 1006', months = 75, fine = 7500, color = 'red', description = 'When a person unintentionally and recklessly causes the death of anther with a vehicle'}, + [7] = {title = 'Attempted Murder of a Civilian', class = 'Felony', id = 'P.C. 1007', months = 50, fine = 7500, color = 'red', description = 'When a non-government person intentionally attacks another with the intent to kill'}, + [8] = {title = 'Second Degree Murder', class = 'Felony', id = 'P.C. 1008', months = 100, fine = 15000, color = 'red', description = 'Any intentional killing that is not premeditated or planned. A situation in which the killer intends only to inflict serious bodily harm.'}, + [9] = {title = 'Accessory to Second Degree Murder', class = 'Felony', id = 'P.C. 1009', months = 50, fine = 5000, color = 'red', description = 'Being present and or participating in the act of parent charge'}, + [10] = {title = 'First Degree Murder', class = 'Felony', id = 'P.C. 1010', months = 0, fine = 0, color = 'red', description = 'Any intentional killing that is willful and premeditated with malice.'}, + [11] = {title = 'Accessory to First Degree Murder', class = 'Felony', id = 'P.C. 1011', months = 0, fine = 0, color = 'red', description = 'Being present and or participating in the act of parent charge'}, + [12] = {title = 'Murder of a Public Servant or Peace Officer', class = 'Felony', id = 'P.C. 1012', months = 0, fine = 0, color = 'red', description = 'Any intentional killing that is done to a government employee'}, + [13] = {title = 'Attempted Murder of a Public Servant or Peace Officer', class = 'Felony', id = 'P.C. 1013', months = 65, fine = 10000, color = 'red', description = 'Any attacks that are done to a government employee with the intent to cause death'}, + [14] = {title = 'Accessory to the Murder of a Public Servant or Peace Officer', class = 'Felony', id = 'P.C. 1014', months = 0, fine = 0, color = 'red', description = 'Being present and or participating in the act of parent charge'}, + [15] = {title = 'Unlawful Imprisonment', class = 'Misdemeanor', id = 'P.C. 1015', months = 10, fine = 600, color = 'green', description = 'The act of taking another against their will and holding them for an extended period of time'}, + [16] = {title = 'Kidnapping', class = 'Felony', id = 'P.C. 1016', months = 15, fine = 900, color = 'orange', description = 'The act of taking another against their will for a short period of time'}, + [17] = {title = 'Accessory to Kidnapping', class = 'Felony', id = 'P.C. 1017', months = 7, fine = 450, color = 'orange', description = 'Being present and or participating in the act of parent charge'}, + [18] = {title = 'Attempted Kidnapping', class = 'Felony', id = 'P.C. 1018', months = 10, fine = 450, color = 'orange', description = 'The act of trying to take someone against their will'}, + [19] = {title = 'Hostage Taking', class = 'Felony', id = 'P.C. 1019', months = 20, fine = 1200, color = 'orange', description = 'The act of taking another against their will for personal gain'}, + [20] = {title = 'Accessory to Hostage Taking', class = 'Felony', id = 'P.C. 1020', months = 10, fine = 600, color = 'orange', description = 'Being present and or participating in the act of parent charge'}, + [21] = {title = 'Unlawful Imprisonment of a Public Servant or Peace Officer.', class = 'Felony', id = 'P.C. 1021', months = 25, fine = 4000, color = 'orange', description = 'The act of taking a government employee against their will for an extended period of time'}, + [22] = {title = 'Criminal Threats', class = 'Misdemeanor', id = 'P.C. 1022', months = 5, fine = 500, color = 'orange', description = 'The act of stating the intent to commit a crime against another'}, + [23] = {title = 'Reckless Endangerment', class = 'Misdemeanor', id = 'P.C. 1023', months = 10, fine = 1000, color = 'orange', description = 'The act of disregarding safety of another which may place another in danger of death or bodily injury'}, + [24] = {title = 'Gang Related Shooting', class = 'Felony', id = 'P.C. 1024', months = 30, fine = 2500, color = 'red', description = 'The act in which a firearm is discharged in relation to gang activity'}, + [25] = {title = 'Cannibalism', class = 'Felony', id = 'P.C. 1025', months = 0, fine = 0, color = 'red', description = 'The act in which a persons consumes the flesh of another willingly'}, + [26] = {title = 'Torture', class = 'Felony', id = 'P.C. 1026', months = 40, fine = 4500, color = 'red', description = 'The act of causing harm to another to extract informaion and or for self enjoyment'}, + }, + [2] = { + [1] = {title = 'Petty Theft', class = 'Infraction', id = 'P.C. 2001', months = 0, fine = 250, color = 'green', description = 'The theft of property below $50 amount'}, + [2] = {title = 'Grand Theft', class = 'Misdemeanor', id = 'P.C. 2002', months = 10, fine = 600, color = 'green', description = 'Theft of property above $700'}, + [3] = {title = 'Grand Theft Auto A', class = 'Felony', id = 'P.C. 2003', months = 15, fine = 900, color = 'green', description = 'The act of stealing a vehicle that belongs to someone else without permission'}, + [4] = {title = 'Grand Theft Auto B', class = 'Felony', id = 'P.C. 2004', months = 35, fine = 3500, color = 'green', description = 'The act of stealing a vehicle that belongs to someone else without permission while armed'}, + [5] = {title = 'Carjacking', class = 'Felony', id = 'P.C. 2005', months = 30, fine = 2000, color = 'orange', description = 'The act of someone forcefully taking a vehicle from its occupants'}, + [6] = {title = 'Burglary', class = 'Misdemeanor', id = 'P.C. 2006', months = 10, fine = 500, color = 'green', description = 'The act of entering into a building illegally with intent to commit a crime, especially theft.'}, + [7] = {title = 'Robbery', class = 'Felony', id = 'P.C. 2007', months = 25, fine = 2000, color = 'green', description = 'The action of taking property unlawfully from a person or place by force or threat of force.'}, + [8] = {title = 'Accessory to Robbery', class = 'Felony', id = 'P.C. 2008', months = 12, fine = 1000, color = 'green', description = 'Being present and or participating in the act of parent charge'}, + [9] = {title = 'Attempted Robbery', class = 'Felony', id = 'P.C. 2009', months = 20, fine = 1000, color = 'green', description = 'The action of attempting property unlawfully from a person or place by force or threat of force.'}, + [10] = {title = 'Armed Robbery', class = 'Felony', id = 'P.C. 2010', months = 30, fine = 3000, color = 'orange', description = 'The action of taking property unlawfully from a person or place by force or threat of force while armed.'}, + [11] = {title = 'Accessory to Armed Robbery', class = 'Felony', id = 'P.C. 2011', months = 15, fine = 1500, color = 'orange', description = 'Being present and or participating in the act of parent charge'}, + [12] = {title = 'Attempted Armed Robbery', class = 'Felony', id = 'P.C. 2012', months = 25, fine = 1500, color = 'orange', description = 'The action of attempting property unlawfully from a person or place by force or threat of force while armed.'}, + [13] = {title = 'Grand Larceny', class = 'Felony', id = 'P.C. 2013', months = 45, fine = 7500, color = 'orange', description = 'Theft of personal property having a value above a legally specified amount.'}, + [14] = {title = 'Leaving Without Paying', class = 'Infraction', id = 'P.C. 2014', months = 0, fine = 500, color = 'green', description = 'The act of leaving an establishment without paying for provided service'}, + [15] = {title = 'Possession of Nonlegal Currency', class = 'Misdemeanor', id = 'P.C. 2015', months = 10, fine = 750, color = 'green', description = 'Being in possession of stolen currency'}, + [16] = {title = 'Possession of Government-Issued Items', class = 'Misdemeanor', id = 'P.C. 2016', months = 15, fine = 1000, color = 'green', description = 'Being in possession of Items only acquireable by government employees'}, + [17] = {title = 'Possession of Items Used in the Commission of a Crime', class = 'Misdemeanor', id = 'P.C. 2017', months = 10, fine = 500, color = 'green', description = 'Being in possession of Items that were previously used to commit crimes'}, + [18] = {title = 'Sale of Items Used in the Commission of a Crime', class = 'Felony', id = 'P.C. 2018', months = 15, fine = 1000, color = 'orange', description = 'The act of selling items that were previously used to commit crimes'}, + [19] = {title = 'Theft of an Aircraft', class = 'Felony', id = 'P.C. 2019', months = 20, fine = 1000, color = 'green', description = 'The act of stealing an aircraft'}, + }, + [3] = { + [1] = {title = 'Impersonating', class = 'Misdemeanor', id = 'P.C. 3001', months = 15, fine = 1250, color = 'green', description = 'The action of falsely identifying as another person to deceive'}, + [2] = {title = 'Impersonating a Peace Officer or Public Servant', class = 'Felony', id = 'P.C. 3002', months = 25, fine = 2750, color = 'green', description = 'The action of falsely identifying as a government employee to deceive'}, + [3] = {title = 'Impersonating a Judge', class = 'Felony', id = 'P.C. 3003', months = 0, fine = 0, color = 'green', description = 'The action of falsely identifying as a Judge to deceive'}, + [4] = {title = 'Possession of Stolen Identification', class = 'Misdemeanor', id = 'P.C. 3004', months = 10, fine = 750, color = 'green', description = 'To have another persons Identification without consent'}, + [5] = {title = 'Possession of Stolen Government Identification', class = 'Misdemeanor', id = 'P.C. 3005', months = 20, fine = 2000, color = 'green', description = 'To have the identification of a government employee without consent'}, + [6] = {title = 'Extortion', class = 'Felony', id = 'P.C. 3006', months = 20, fine = 900, color = 'orange', description = 'To threaten or cause harm to a person or property for financial gain'}, + [7] = {title = 'Fraud', class = 'Misdemeanor', id = 'P.C. 3007', months = 10, fine = 450, color = 'green', description = 'To deceive another for financial gain'}, + [8] = {title = 'Forgery', class = 'Misdemeanor', id = 'P.C. 3008', months = 15, fine = 750, color = 'green', description = 'To falsify legal documentation for personal gain'}, + [9] = {title = 'Money Laundering', class = 'Felony', id = 'P.C. 3009', months = 0, fine = 0, color = 'red', description = 'The processing stolen money for legal currency'}, + }, + [4] = { + [1] = {title = 'Trespassing', class = 'Misdemeanor', id = 'P.C. 4001', months = 10, fine = 450, color = 'green', description = 'For a person to be within the bounds of a location of which they are not legally allowed'}, + [2] = {title = 'Felony Trespassing', class = 'Felony', id = 'P.C. 4002', months = 15, fine = 1500, color = 'green', description = 'For a person to have repeatedly entered the bounds of a location of which they are knowingly not legally allowed'}, + [3] = {title = 'Arson', class = 'Felony', id = 'P.C. 4003', months = 15, fine = 1500, color = 'orange', description = 'The use if fire and accelerants to will and maliciously destroy, harm or cause death to a person or property'}, + [4] = {title = 'Vandalism', class = 'Infraction', id = 'P.C. 4004', months = 0, fine = 300, color = 'green', description = 'The willful destruction of property'}, + [5] = {title = 'Vandalism of Government Property', class = 'Felony', id = 'P.C. 4005', months = 20, fine = 1500, color = 'green', description = 'The willful destruction of government property'}, + [6] = {title = 'Littering', class = 'Infraction', id = 'P.C. 4006', months = 0, fine = 200, color = 'green', description = 'The willful discard of refuse into to open and not in designated bin'}, + }, + [5] = { + [1] = {title = 'Bribery of a Government Official', class = 'Felony', id = 'P.C. 5001', months = 20, fine = 3500, color = 'green', description = 'the use of money, favors and or property to gain favor with a government official'}, + [2] = {title = 'Anti-Mask Law', class = 'Infraction', id = 'P.C. 5002', months = 0, fine = 750, color = 'green', description = 'Wearing a mask in a prohibited zone'}, + [3] = {title = 'Possession of Contraband in a Government Facility', class = 'Felony', id = 'P.C. 5003', months = 25, fine = 1000, color = 'green', description = 'Being in possession of items that are illegal while within a government building'}, + [4] = {title = 'Criminal Possession of Stolen Property', class = 'Misdemeanor', id = 'P.C. 5004', months = 10, fine = 500, color = 'green', description = 'Being in possession of items stolen knowingly or not'}, + [5] = {title = 'Escaping', class = 'Felony', id = 'P.C. 5005', months = 10, fine = 450, color = 'green', description = 'The action of willful and knowingly leaving custody while legally being arrest, detained or in jail'}, + [6] = {title = 'Jailbreak', class = 'Felony', id = 'P.C. 5006', months = 30, fine = 2500, color = 'orange', description = 'The action of leaving state custody from a state or county detention facility'}, + [7] = {title = 'Accessory to Jailbreak', class = 'Felony', id = 'P.C. 5007', months = 25, fine = 2000, color = 'orange', description = 'Being present and or participating in the act of parent charge'}, + [8] = {title = 'Attempted Jailbreak', class = 'Felony', id = 'P.C. 5008', months = 20, fine = 1500, color = 'orange', description = 'The willful and intentional attempted escape from a state or county detention facility'}, + [9] = {title = 'Perjury', class = 'Felony', id = 'P.C. 5009', months = 0, fine = 0, color = 'green', description = 'The action of stating falsities while legally bound to speak the truth'}, + [10] = {title = 'Violation of a Restraining Order', class = 'Felony', id = 'P.C. 5010', months = 20, fine = 2250, color = 'green', description = 'The willful and knowing infringement upon court ordered protective documentation'}, + [11] = {title = 'Embezzlement', class = 'Felony', id = 'P.C. 5011', months = 45, fine = 10000, color = 'green', description = 'The willful and knowingly movement of funds from non personal bank accounts to personal bank accounts for personal gain'}, + [12] = {title = 'Unlawful Practice', class = 'Felony', id = 'P.C. 5012', months = 15, fine = 1500, color = 'orange', description = 'The action of performing a service without proper legal licensing and approval'}, + [13] = {title = 'Misuse of Emergency Systems', class = 'Infraction', id = 'P.C. 5013', months = 0, fine = 600, color = 'orange', description = 'Use of government emergency equipment for its non-intended purpose'}, + [14] = {title = 'Conspiracy', class = 'Misdemeanor', id = 'P.C. 5014', months = 10, fine = 450, color = 'green', description = 'The act of planning a crime but not yet commiting the crime'}, + [15] = {title = 'Violating a Court Order', class = 'Misdemeanor', id = 'P.C. 5015', months = 0, fine = 0, color = 'orange', description = 'The infringement of court ordered documentation'}, + [16] = {title = 'Failure to Appear', class = 'Misdemeanor', id = 'P.C. 5016', months = 0, fine = 0, color = 'orange', description = 'When someone who is legally bound to appear in court does not do so'}, + [17] = {title = 'Contempt of Court', class = 'Felony', id = 'P.C. 5017', months = 0, fine = 0, color = 'orange', description = 'The disruption of court proceedings in a courtroom while it is in session (judicial decision)'}, + [18] = {title = 'Resisting Arrest', class = 'Misdemeanor', id = 'P.C. 5018', months = 5, fine = 300, color = 'orange', description = 'The act of not allowing peace officers to take you into custody willingly'}, + }, + [6] = { + [1] = {title = 'Disobeying a Peace Officer', class = 'infraction', id = 'P.C. 6001', months = 0, fine = 750, color = 'green', description = 'The willful disregard of a lawful order'}, + [2] = {title = 'Disorderly Conduct', class = 'Infraction', id = 'P.C. 6002', months = 0, fine = 250, color = 'green', description = 'Acting in a manner that creates a hazardous or physically offensive condition by any act which serves no legitimate purpose of the actor. '}, + [3] = {title = 'Disturbing the Peace', class = 'infraction', id = 'P.C. 6003', months = 0, fine = 350, color = 'green', description = 'Action in a manner that causes unrest and disrupts public order'}, + [4] = {title = 'False Reporting', class = 'Misdemeanor', id = 'P.C. 6004', months = 10, fine = 750, color = 'green', description = 'The act of reporting a crime that did not happen'}, + [5] = {title = 'Harassment', class = 'Misdemeanor', id = 'P.C. 6005', months = 10, fine = 500, color = 'orange', description = 'The repeated disruption or verbal attacks of another person'}, + [6] = {title = 'Misdemeanor Obstruction of Justice', class = 'Misdemeanor', id = 'P.C. 6006', months = 10, fine = 500, color = 'green', description = 'Acting in a way that hinders the process of Justice or lawful investigations'}, + [7] = {title = 'Felony Obstruction of Justice', class = 'Felony', id = 'P.C. 6007', months = 15, fine = 900, color = 'green', description = 'Acting in a way that hinders the process of Justice or lawful investigations while using violence'}, + [8] = {title = 'Inciting a Riot', class = 'Felony', id = 'P.C. 6008', months = 25, fine = 1000, color = 'orange', description = 'Causing civil unrest in a manner to incite a group to cause harm to people or property'}, + [9] = {title = 'Loitering on Government Properties', class = 'Infraction', id = 'P.C. 6009', months = 0, fine = 500, color = 'green', description = 'When someone is present in a government proper for an extended period of time'}, + [10] = {title = 'Tampering', class = 'Misdemeanor', id = 'P.C. 6010', months = 10, fine = 500, color = 'green', description = 'When someone willfully, knowingly and indirectly interfering with key points of a lawful investigation'}, + [11] = {title = 'Vehicle Tampering', class = 'Misdemeanor', id = 'P.C. 6011', months = 15, fine = 750, color = 'green', description = 'The willful and knowing interference the normal function of a vehicle'}, + [12] = {title = 'Evidence Tampering', class = 'Felony', id = 'P.C. 6012', months = 20, fine = 1000, color = 'green', description = 'The willful and knowing interference with evidence from a lawful investigation'}, + [13] = {title = 'Witness Tampering', class = 'Felony', id = 'P.C. 6013', months = 0, fine = 0, color = 'green', description = 'The willful and knowing coaching or coercing of a witness in a lawful investigation'}, + [14] = {title = 'Failure to Provide Identification', class = 'Misdemeanor', id = 'P.C. 6014', months = 15, fine = 1500, color = 'green', description = 'The act of not presenting identification when lawfully required to do so'}, + [15] = {title = 'Vigilantism', class = 'Felony', id = 'P.C. 6015', months = 30, fine = 1500, color = 'orange', description = 'The act of engaging in enforcing the law with legal authority to do so'}, + [16] = {title = 'Unlawful Assembly', class = 'Misdemeanor', id = 'P.C. 6016', months = 10, fine = 750, color = 'orange', description = 'when a large group gathers in a location that requires prior approval to do so'}, + [17] = {title = 'Government Corruption', class = 'Felony', id = 'P.C. 6017', months = 0, fine = 0, color = 'red', description = 'The act of using political position and power for self gain'}, + [18] = {title = 'Stalking', class = 'Felony', id = 'P.C. 6018', months = 40, fine = 1500, color = 'orange', description = 'When one person monitors another without their consent'}, + [19] = {title = 'Aiding and Abetting', class = 'Misdemeanor', id = 'P.C. 6019', months = 15, fine = 450, color = 'orange', description = 'To assist someone in committing or to encourage someone to commit a crime'}, + [20] = {title = 'Harboring a Fugitive', class = 'Misdemeanor', id = 'P.C. 6020', months = 10, fine = 1000, color = 'green', description = 'When someone willingly hides another who is wanted by the authorities'}, + }, + [7] = { + [1] = {title = 'Misdemeanor Possession of Marijuana', class = 'Misdemeanor', id = 'P.C. 7001', months = 5, fine = 250, color = 'green', description = 'The possession of a quantity of marijuana in the amount of less the 4 blunts'}, + [2] = {title = 'Felony manufacturing of Marijuana', class = 'Felony', id = 'P.C. 7002', months = 15, fine = 1000, color = 'red', description = 'The possession of a quantity of marijuana that is from manufacturing'}, + [3] = {title = 'Cultivation of Marijuana A', class = 'Misdemeanor', id = 'P.C. 7003', months = 10, fine = 750, color = 'green', description = 'The possession of 4 or less marijuana plants'}, + [4] = {title = 'Cultivation of Marijuana B', class = 'Felony', id = 'P.C. 7004', months = 30, fine = 1500, color = 'orange', description = 'The possession of 5 or more marijuana plants'}, + [5] = {title = 'Possession of Marijuana with Intent to Distribute', class = 'Felony', id = 'P.C. 7005', months = 30, fine = 3000, color = 'orange', description = 'The possession of a quantity of Marijuana for distribution'}, + [6] = {title = 'Misdemeanor Possession of Cocaine', class = 'Misdemeanor', id = 'P.C. 7006', months = 7, fine = 500, color = 'green', description = 'The possession of cocaine in a small quantity usually for personal use'}, + [7] = {title = 'Felony manufacturing Possession of Cocaine', class = 'Felony', id = 'P.C. 7007', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of cocaine that is from manufacturing'}, + [8] = {title = 'Possession of Cocaine with Intent to Distribute', class = 'Felony', id = 'P.C. 7008', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of Cocaine for distribution'}, + [9] = {title = 'Misdemeanor Possession of Methamphetamine', class = 'Misdemeanor', id = 'P.C. 7009', months = 7, fine = 500, color = 'green', description = 'The possession of methamphetamine in a small quantity usually for personal use'}, + [10] = {title = 'Felony manufacturing Possession of Methamphetamine', class = 'Felony', id = 'P.C. 7010', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of methamphetamine that is from manufacturing'}, + [11] = {title = 'Possession of Methamphetamine with Intent to Distribute', class = 'Felony', id = 'P.C. 7011', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of Methamphetamine for distribution'}, + [12] = {title = 'Misdemeanor Possession of Oxy / Vicodin', class = 'Misdemeanor', id = 'P.C. 7012', months = 7, fine = 500, color = 'green', description = 'The possession of oxy / vicodin in a small quantity usually for personal use without prescription'}, + [13] = {title = 'Felony manufacturing Possession of Oxy / Vicodin', class = 'Felony', id = 'P.C. 7013', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of oxy / vicodin that is from manufacturing'}, + [14] = {title = 'Felony Possession of Oxy / Vicodin with Intent to Distribute', class = 'Felony', id = 'P.C. 7014', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of oxy / vicodin for distribution'}, + [15] = {title = 'Misdemeanor Possession of Ecstasy', class = 'Misdemeanor', id = 'P.C. 7015', months = 7, fine = 500, color = 'green', description = 'The possession of ecstasy in a small quantity usually for personal use'}, + [16] = {title = 'Felony manufacturing Possession of Ecstasy', class = 'Felony', id = 'P.C. 7016', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of ecstasy that is from manufacturing'}, + [17] = {title = 'Possession of Ecstasy with Intent to Distribute', class = 'Felony', id = 'P.C. 7017', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of ecstasy for distribution'}, + [18] = {title = 'Misdemeanor Possession of Opium', class = 'Misdemeanor', id = 'P.C. 7018', months = 7, fine = 500, color = 'green', description = 'The possession of opium in a small quantity usually for personal use'}, + [19] = {title = 'Felony manufacturing Possession of Opium', class = 'Felony', id = 'P.C. 7019', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of opium that is from manufacturing'}, + [20] = {title = 'Possession of Opium with Intent to Distribute', class = 'Felony', id = 'P.C. 7020', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of Opium for distribution'}, + [21] = {title = 'Misdemeanor Possession of Adderall', class = 'Misdemeanor', id = 'P.C. 7021', months = 7, fine = 500, color = 'green', description = 'The possession of adderall in a small quantity usually for personal use without prescription'}, + [22] = {title = 'Felony manufacturing Possession of Adderall', class = 'Felony', id = 'P.C. 7022', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of adderall that is from manufacturing'}, + [23] = {title = 'Possession of Adderall with Intent to Distribute', class = 'Felony', id = 'P.C. 7023', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of Adderall for distribution'}, + [24] = {title = 'Misdemeanor Possession of Xanax', class = 'Misdemeanor', id = 'P.C. 7024', months = 7, fine = 500, color = 'green', description = 'The possession of xanax in a small quantity usually for personal use without prescription'}, + [25] = {title = 'Felony manufacturing Possession of Xanax', class = 'Felony', id = 'P.C. 7025', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of xanax that is from manufacturing'}, + [26] = {title = 'Possession of Xanax with Intent to Distribute', class = 'Felony', id = 'P.C. 7026', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of Xanax for distribution'}, + [27] = {title = 'Misdemeanor Possession of Shrooms', class = 'Misdemeanor', id = 'P.C. 7027', months = 7, fine = 500, color = 'green', description = 'The possession of shrooms in a small quantity usually for personal use'}, + [28] = {title = 'Felony manufacturing Possession of Shrooms', class = 'Felony', id = 'P.C. 7028', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of shrooms that is from manufacturing'}, + [29] = {title = 'Possession of Shrooms with Intent to Distribute', class = 'Felony', id = 'P.C. 7029', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of Shrooms for distribution'}, + [30] = {title = 'Misdemeanor Possession of Lean', class = 'Misdemeanor', id = 'P.C. 7030', months = 7, fine = 500, color = 'green', description = 'The possession of lean in a small quantity usually for personal use'}, + [31] = {title = 'Felony manufacturing Possession of Lean', class = 'Felony', id = 'P.C. 7031', months = 25, fine = 1500, color = 'red', description = 'The possession of a quantity of lean that is from manufacturing'}, + [32] = {title = 'Possession of Lean with Intent to Distribute', class = 'Felony', id = 'P.C. 7032', months = 35, fine = 4500, color = 'orange', description = 'The possession of a quantity of lean for distribution'}, + [33] = {title = 'Sale of a controlled substance', class = 'Misdemeanor', id = 'P.C. 7033', months = 10, fine = 1000, color = 'green', description = 'The sale of a substance that is controlled by law'}, + [34] = {title = 'Drug Trafficking', class = 'Felony', id = 'P.C. 7034', months = 0, fine = 0, color = 'red', description = 'The large scale movement of illegal drugs'}, + [35] = {title = 'Desecration of a Human Corpse', class = 'Felony', id = 'P.C. 7035', months = 20, fine = 1500, color = 'orange', description = 'When someone harms, disturbs or destroys the remains of another person'}, + [36] = {title = 'Public Intoxication', class = 'Infraction', id = 'P.C. 7036', months = 0, fine = 500, color = 'green', description = 'When someone is intoxicated above legal limit in public'}, + [37] = {title = 'Public Indecency', class = 'Misdemeanor', id = 'P.C. 7037', months = 10, fine = 750, color = 'green', description = 'The act of someone exposing themself in a way that infringes in public morals'}, + }, + [8] = { + [1] = {title = 'Criminal Possession of Weapon Class A', class = 'Felony', id = 'P.C. 8001', months = 10, fine = 500, color = 'green', description = 'Possession of a Class A firearm without licensing'}, + [2] = {title = 'Criminal Possession of Weapon Class B', class = 'Felony', id = 'P.C. 8002', months = 15, fine = 1000, color = 'green', description = 'Possession of a Class B firearm without licensing'}, + [3] = {title = 'Criminal Possession of Weapon Class C', class = 'Felony', id = 'P.C. 8003', months = 30, fine = 3500, color = 'green', description = 'Possession of a Class C firearm without licensing'}, + [4] = {title = 'Criminal Possession of Weapon Class D', class = 'Felony', id = 'P.C. 8004', months = 25, fine = 1500, color = 'green', description = 'Possession of a Class D firearm without licensing'}, + [5] = {title = 'Criminal Sale of Weapon Class A', class = 'Felony', id = 'P.C. 8005', months = 15, fine = 1000, color = 'orange', description = 'The act of selling a Class A firearm without licensing'}, + [6] = {title = 'Criminal Sale of Weapon Class B', class = 'Felony', id = 'P.C. 8006', months = 20, fine = 2000, color = 'orange', description = 'The act of selling a Class B firearm without licensing'}, + [7] = {title = 'Criminal Sale of Weapon Class C', class = 'Felony', id = 'P.C. 8007', months = 35, fine = 7000, color = 'orange', description = 'The act of selling a Class C firearm without licensing'}, + [8] = {title = 'Criminal Sale of Weapon Class D', class = 'Felony', id = 'P.C. 8008', months = 30, fine = 3000, color = 'orange', description = 'The act of selling a Class D firearm without licensing'}, + [9] = {title = 'Criminal Use of Weapon', class = 'Misdemeanor', id = 'P.C. 8009', months = 10, fine = 450, color = 'orange', description = 'Use of a weapon while in commission of a crime'}, + [10] = {title = 'Possession of Illegal Firearm Modifications', class = 'Misdemeanor', id = 'P.C. 8010', months = 10, fine = 300, color = 'green', description = 'Being in possession of firearm modifications unlawfully'}, + [11] = {title = 'Weapon Trafficking', class = 'Felony', id = 'P.C. 8011', months = 0, fine = 0, color = 'red', description = 'The transportation of a large amount of weapons for one point to another'}, + [12] = {title = 'Brandishing a Weapon', class = 'Misdemeanor', id = 'P.C. 8012', months = 15, fine = 500, color = 'orange', description = 'The act of making a firearm purposely visible'}, + [13] = {title = 'Insurrection', class = 'Felony', id = 'P.C. 8013', months = 0, fine = 0, color = 'red', description = 'Attempting to overthrow the government with violence'}, + [14] = {title = 'Flying into Restricted Airspace', class = 'Felony', id = 'P.C. 8014', months = 20, fine = 1500, color = 'green', description = 'Piloting and aircraft into airspace that is governmentally controlled'}, + [15] = {title = 'Jaywalking', class = 'Infraction', id = 'P.C. 8015', months = 0, fine = 150, color = 'green', description = 'crossing a roadway in a manner that is hazardous to motor vehicles'}, + [16] = {title = 'Criminal Use of Explosives', class = 'Felony', id = 'P.C. 8016', months = 30, fine = 2500, color = 'orange', description = 'Use of explosives to committing a crime'}, + }, + [9] = { + [1] = {title = 'Driving While Intoxicated', class = 'Misdemeanor', id = 'P.C. 9001', months = 5, fine = 300, color = 'green', description = 'Operating a motor vehicle while impaired by alcohol'}, + [2] = {title = 'Evading', class = 'Misdemeanor', id = 'P.C. 9002', months = 5, fine = 400, color = 'green', description = 'Hiding or running from lawful detainment'}, + [3] = {title = 'Reckless Evading', class = 'Felony', id = 'P.C. 9003', months = 10, fine = 800, color = 'orange', description = 'Recklessly disregarding safety and Hiding or running from lawful detainment while '}, + [4] = {title = 'Failure to Yield to Emergency Vehicle', class = 'Infraction', id = 'P.C. 9004', months = 0, fine = 600, color = 'green', description = 'Not giving way to emergency vehicles'}, + [5] = {title = 'Failure to Obey Traffic Control Device', class = 'Infraction', id = 'P.C. 9005', months = 0, fine = 150, color = 'green', description = 'Not following the safety devices of the roadway'}, + [6] = {title = 'Nonfunctional Vehicle', class = 'Infraction', id = 'P.C. 9006', months = 0, fine = 75, color = 'green', description = 'Having a vehicle that is no longer functional in the roadway'}, + [7] = {title = 'Negligent Driving', class = 'Infraction', id = 'P.C. 9007', months = 0, fine = 300, color = 'green', description = 'Driving in a manner as to unknowingly disregard safety'}, + [8] = {title = 'Reckless Driving', class = 'Misdemeanor', id = 'P.C. 9008', months = 10, fine = 750, color = 'orange', description = 'Driving in a manner as to knowingly disregard safety'}, + [9] = {title = 'Third Degree Speeding', class = 'Infraction', id = 'P.C. 9009', months = 0, fine = 225, color = 'green', description = 'Speeding 15 over the limit'}, + [10] = {title = 'Second Degree Speeding', class = 'Infraction', id = 'P.C. 9010', months = 0, fine = 450, color = 'green', description = 'Speeding 35 over the limit'}, + [11] = {title = 'First Degree Speeding', class = 'Infraction', id = 'P.C. 9011', months = 0, fine = 750, color = 'green', description = 'Speeding 50 over the limit'}, + [12] = {title = 'Unlicensed Operation of Vehicle', class = 'Infraction', id = 'P.C. 9012', months = 0, fine = 500, color = 'green', description = 'The operation of a motor vehicle without proper licensing'}, + [13] = {title = 'Illegal U-Turn', class = 'Infraction', id = 'P.C. 9013', months = 0, fine = 75, color = 'green', description = 'Performing a u-turn where it is prohibited'}, + [14] = {title = 'Illegal Passing', class = 'Infraction', id = 'P.C. 9014', months = 0, fine = 300, color = 'green', description = 'Passing other motor vehicles in a prohibited manner'}, + [15] = {title = 'Failure to Maintain Lane', class = 'Infraction', id = 'P.C. 9015', months = 0, fine = 300, color = 'green', description = 'Not staying in the correct lane with a motor vehicle'}, + [16] = {title = 'Illegal Turn', class = 'Infraction', id = 'P.C. 9016', months = 0, fine = 150, color = 'green', description = 'Performing a turn where it is prohibited'}, + [17] = {title = 'Failure to Stop', class = 'Infraction', id = 'P.C. 9017', months = 0, fine = 600, color = 'green', description = 'Not stopping for a lawful stop or traffic device'}, + [18] = {title = 'Unauthorized Parking', class = 'Infraction', id = 'P.C. 9018', months = 0, fine = 300, color = 'green', description = 'Parking a vehicle in a location that requires approval with any'}, + [19] = {title = 'Hit and Run', class = 'Misdemeanor', id = 'P.C. 9019', months = 10, fine = 500, color = 'green', description = 'Striking another person or vehicle and fleeing the location'}, + [20] = {title = 'Driving without Headlights or Signals', class = 'Infraction', id = 'P.C. 9020', months = 0, fine = 300, color = 'green', description = 'Operating a vehicle with no functional lights'}, + [21] = {title = 'Street Racing', class = 'Felony', id = 'P.C. 9021', months = 15, fine = 1500, color = 'green', description = 'Operating motorvehicles in a contest'}, + [22] = {title = 'Piloting without Proper Licensing', class = 'Felony', id = 'P.C. 9022', months = 20, fine = 1500, color = 'orange', description = 'Failure to be in possession of valid licensing when operating an aircraft'}, + [23] = {title = 'Unlawful Use of a Motor Vehicle', class = 'Misdemeanor', id = 'P.C. 9023', months = 10, fine = 750, color = 'green', description = 'The use of a motor vehicle without a lawful reason'}, + }, + [10] = { + [1] = {title = 'Hunting in Restricted Areas', class = 'Infraction', id = 'P.C. 10001', months = 0, fine = 450, color = 'green', description = 'Harvesting game in areas where it is prohibited to do so'}, + [2] = {title = 'Unlicensed Hunting', class = 'Infraction', id = 'P.C. 10002', months = 0, fine = 450, color = 'green', description = 'Harvesting game without proper licensing'}, + [3] = {title = 'Animal Cruelty', class = 'Misdemeanor', id = 'P.C. 10003', months = 10, fine = 450, color = 'green', description = 'The act of abusing an animal knowingly or not'}, + [4] = {title = 'Hunting with a Non-Hunting Weapon', class = 'Misdemeanor', id = 'P.C. 10004', months = 10, fine = 750, color = 'green', description = 'To use a weapon not lawfully stated or manufactured to be used for the harvesting of wild game'}, + [5] = {title = 'Hunting outside of hunting hours', class = 'Infraction', id = 'P.C. 10005', months = 0, fine = 750, color = 'green', description = 'Harvesting animals outside of specified time to do so'}, + [6] = {title = 'Overhunting', class = 'Misdemeanor', id = 'P.C. 10006', months = 10, fine = 1000, color = 'green', description = 'Taking more than legally specified amount of game'}, + [7] = {title = 'Poaching', class = 'Felony', id = 'P.C. 10007', months = 20, fine = 1250, color = 'red', description = 'Harvesting an animal that is listed as legally non-harvestable'}, + } +} + +Config.AllowedJobs = {} +for index, value in pairs(Config.PoliceJobs) do + Config.AllowedJobs[index] = value +end +for index, value in pairs(Config.AmbulanceJobs) do + Config.AllowedJobs[index] = value +end +for index, value in pairs(Config.DojJobs) do + Config.AllowedJobs[index] = value +end + +Config.ColorNames = { + [0] = "Metallic Black", + [1] = "Metallic Graphite Black", + [2] = "Metallic Black Steel", + [3] = "Metallic Dark Silver", + [4] = "Metallic Silver", + [5] = "Metallic Blue Silver", + [6] = "Metallic Steel Gray", + [7] = "Metallic Shadow Silver", + [8] = "Metallic Stone Silver", + [9] = "Metallic Midnight Silver", + [10] = "Metallic Gun Metal", + [11] = "Metallic Anthracite Grey", + [12] = "Matte Black", + [13] = "Matte Gray", + [14] = "Matte Light Grey", + [15] = "Util Black", + [16] = "Util Black Poly", + [17] = "Util Dark silver", + [18] = "Util Silver", + [19] = "Util Gun Metal", + [20] = "Util Shadow Silver", + [21] = "Worn Black", + [22] = "Worn Graphite", + [23] = "Worn Silver Grey", + [24] = "Worn Silver", + [25] = "Worn Blue Silver", + [26] = "Worn Shadow Silver", + [27] = "Metallic Red", + [28] = "Metallic Torino Red", + [29] = "Metallic Formula Red", + [30] = "Metallic Blaze Red", + [31] = "Metallic Graceful Red", + [32] = "Metallic Garnet Red", + [33] = "Metallic Desert Red", + [34] = "Metallic Cabernet Red", + [35] = "Metallic Candy Red", + [36] = "Metallic Sunrise Orange", + [37] = "Metallic Classic Gold", + [38] = "Metallic Orange", + [39] = "Matte Red", + [40] = "Matte Dark Red", + [41] = "Matte Orange", + [42] = "Matte Yellow", + [43] = "Util Red", + [44] = "Util Bright Red", + [45] = "Util Garnet Red", + [46] = "Worn Red", + [47] = "Worn Golden Red", + [48] = "Worn Dark Red", + [49] = "Metallic Dark Green", + [50] = "Metallic Racing Green", + [51] = "Metallic Sea Green", + [52] = "Metallic Olive Green", + [53] = "Metallic Green", + [54] = "Metallic Gasoline Blue Green", + [55] = "Matte Lime Green", + [56] = "Util Dark Green", + [57] = "Util Green", + [58] = "Worn Dark Green", + [59] = "Worn Green", + [60] = "Worn Sea Wash", + [61] = "Metallic Midnight Blue", + [62] = "Metallic Dark Blue", + [63] = "Metallic Saxony Blue", + [64] = "Metallic Blue", + [65] = "Metallic Mariner Blue", + [66] = "Metallic Harbor Blue", + [67] = "Metallic Diamond Blue", + [68] = "Metallic Surf Blue", + [69] = "Metallic Nautical Blue", + [70] = "Metallic Bright Blue", + [71] = "Metallic Purple Blue", + [72] = "Metallic Spinnaker Blue", + [73] = "Metallic Ultra Blue", + [74] = "Metallic Bright Blue", + [75] = "Util Dark Blue", + [76] = "Util Midnight Blue", + [77] = "Util Blue", + [78] = "Util Sea Foam Blue", + [79] = "Uil Lightning blue", + [80] = "Util Maui Blue Poly", + [81] = "Util Bright Blue", + [82] = "Matte Dark Blue", + [83] = "Matte Blue", + [84] = "Matte Midnight Blue", + [85] = "Worn Dark blue", + [86] = "Worn Blue", + [87] = "Worn Light blue", + [88] = "Metallic Taxi Yellow", + [89] = "Metallic Race Yellow", + [90] = "Metallic Bronze", + [91] = "Metallic Yellow Bird", + [92] = "Metallic Lime", + [93] = "Metallic Champagne", + [94] = "Metallic Pueblo Beige", + [95] = "Metallic Dark Ivory", + [96] = "Metallic Choco Brown", + [97] = "Metallic Golden Brown", + [98] = "Metallic Light Brown", + [99] = "Metallic Straw Beige", + [100] = "Metallic Moss Brown", + [101] = "Metallic Biston Brown", + [102] = "Metallic Beechwood", + [103] = "Metallic Dark Beechwood", + [104] = "Metallic Choco Orange", + [105] = "Metallic Beach Sand", + [106] = "Metallic Sun Bleeched Sand", + [107] = "Metallic Cream", + [108] = "Util Brown", + [109] = "Util Medium Brown", + [110] = "Util Light Brown", + [111] = "Metallic White", + [112] = "Metallic Frost White", + [113] = "Worn Honey Beige", + [114] = "Worn Brown", + [115] = "Worn Dark Brown", + [116] = "Worn straw beige", + [117] = "Brushed Steel", + [118] = "Brushed Black steel", + [119] = "Brushed Aluminium", + [120] = "Chrome", + [121] = "Worn Off White", + [122] = "Util Off White", + [123] = "Worn Orange", + [124] = "Worn Light Orange", + [125] = "Metallic Securicor Green", + [126] = "Worn Taxi Yellow", + [127] = "police car blue", + [128] = "Matte Green", + [129] = "Matte Brown", + [130] = "Worn Orange", + [131] = "Matte White", + [132] = "Worn White", + [133] = "Worn Olive Army Green", + [134] = "Pure White", + [135] = "Hot Pink", + [136] = "Salmon pink", + [137] = "Metallic Vermillion Pink", + [138] = "Orange", + [139] = "Green", + [140] = "Blue", + [141] = "Mettalic Black Blue", + [142] = "Metallic Black Purple", + [143] = "Metallic Black Red", + [144] = "Hunter Green", + [145] = "Metallic Purple", + [146] = "Metaillic V Dark Blue", + [147] = "MODSHOP BLACK1", + [148] = "Matte Purple", + [149] = "Matte Dark Purple", + [150] = "Metallic Lava Red", + [151] = "Matte Forest Green", + [152] = "Matte Olive Drab", + [153] = "Matte Desert Brown", + [154] = "Matte Desert Tan", + [155] = "Matte Foilage Green", + [156] = "DEFAULT ALLOY COLOR", + [157] = "Epsilon Blue", + [158] = "Unknown", +} + +Config.ColorInformation = { + [0] = "black", + [1] = "black", + [2] = "black", + [3] = "darksilver", + [4] = "silver", + [5] = "bluesilver", + [6] = "silver", + [7] = "darksilver", + [8] = "silver", + [9] = "bluesilver", + [10] = "darksilver", + [11] = "darksilver", + [12] = "matteblack", + [13] = "gray", + [14] = "lightgray", + [15] = "black", + [16] = "black", + [17] = "darksilver", + [18] = "silver", + [19] = "utilgunmetal", + [20] = "silver", + [21] = "black", + [22] = "black", + [23] = "darksilver", + [24] = "silver", + [25] = "bluesilver", + [26] = "darksilver", + [27] = "red", + [28] = "torinored", + [29] = "formulared", + [30] = "blazered", + [31] = "gracefulred", + [32] = "garnetred", + [33] = "desertred", + [34] = "cabernetred", + [35] = "candyred", + [36] = "orange", + [37] = "gold", + [38] = "orange", + [39] = "red", + [40] = "mattedarkred", + [41] = "orange", + [42] = "matteyellow", + [43] = "red", + [44] = "brightred", + [45] = "garnetred", + [46] = "red", + [47] = "red", + [48] = "darkred", + [49] = "darkgreen", + [50] = "racingreen", + [51] = "seagreen", + [52] = "olivegreen", + [53] = "green", + [54] = "gasolinebluegreen", + [55] = "mattelimegreen", + [56] = "darkgreen", + [57] = "green", + [58] = "darkgreen", + [59] = "green", + [60] = "seawash", + [61] = "midnightblue", + [62] = "darkblue", + [63] = "saxonyblue", + [64] = "blue", + [65] = "blue", + [66] = "blue", + [67] = "diamondblue", + [68] = "blue", + [69] = "blue", + [70] = "brightblue", + [71] = "purpleblue", + [72] = "blue", + [73] = "ultrablue", + [74] = "brightblue", + [75] = "darkblue", + [76] = "midnightblue", + [77] = "blue", + [78] = "blue", + [79] = "lightningblue", + [80] = "blue", + [81] = "brightblue", + [82] = "mattedarkblue", + [83] = "matteblue", + [84] = "matteblue", + [85] = "darkblue", + [86] = "blue", + [87] = "lightningblue", + [88] = "yellow", + [89] = "yellow", + [90] = "bronze", + [91] = "yellow", + [92] = "lime", + [93] = "champagne", + [94] = "beige", + [95] = "darkivory", + [96] = "brown", + [97] = "brown", + [98] = "lightbrown", + [99] = "beige", + [100] = "brown", + [101] = "brown", + [102] = "beechwood", + [103] = "beechwood", + [104] = "chocoorange", + [105] = "yellow", + [106] = "yellow", + [107] = "cream", + [108] = "brown", + [109] = "brown", + [110] = "brown", + [111] = "white", + [112] = "white", + [113] = "beige", + [114] = "brown", + [115] = "brown", + [116] = "beige", + [117] = "steel", + [118] = "blacksteel", + [119] = "aluminium", + [120] = "chrome", + [121] = "wornwhite", + [122] = "offwhite", + [123] = "orange", + [124] = "lightorange", + [125] = "green", + [126] = "yellow", + [127] = "blue", + [128] = "green", + [129] = "brown", + [130] = "orange", + [131] = "white", + [132] = "white", + [133] = "darkgreen", + [134] = "white", + [135] = "pink", + [136] = "pink", + [137] = "pink", + [138] = "orange", + [139] = "green", + [140] = "blue", + [141] = "blackblue", + [142] = "blackpurple", + [143] = "blackred", + [144] = "darkgreen", + [145] = "purple", + [146] = "darkblue", + [147] = "black", + [148] = "purple", + [149] = "darkpurple", + [150] = "red", + [151] = "darkgreen", + [152] = "olivedrab", + [153] = "brown", + [154] = "tan", + [155] = "green", + [156] = "silver", + [157] = "blue", + [158] = "black", +} + +Config.ClassList = { + [0] = "Compact", + [1] = "Sedan", + [2] = "SUV", + [3] = "Coupe", + [4] = "Muscle", + [5] = "Sport Classic", + [6] = "Sport", + [7] = "Super", + [8] = "Motorbike", + [9] = "Off-Road", + [10] = "Industrial", + [11] = "Utility", + [12] = "Van", + [13] = "Bike", + [14] = "Boat", + [15] = "Helicopter", + [16] = "Plane", + [17] = "Service", + [18] = "Emergency", + [19] = "Military", + [20] = "Commercial", + [21] = "Train" +} + +function GetJobType(job) + if Config.PoliceJobs[job] then + return 'police' + elseif Config.AmbulanceJobs[job] then + return 'ambulance' + elseif Config.DojJobs[job] then + return 'doj' + else + return nil + end +end diff --git a/resources/[ps]/ps-mdt/ui/app.js b/resources/[ps]/ps-mdt/ui/app.js new file mode 100644 index 0000000..3acc7aa --- /dev/null +++ b/resources/[ps]/ps-mdt/ui/app.js @@ -0,0 +1,5868 @@ +let canSearchForProfiles = true; +let canSaveProfile = true; +let canRefreshBolo = true; +let canRefreshReports = true; +let canRefreshIncidents = true; +let canSearchForWeapons = true; +let canInputTag = true; +let canInputBoloTag = true; +let canInputBoloOfficerTag = true; +let canSearchReports = true; +let canCreateBulletin = 0; +let mouse_is_inside = false; +let currentTab = ".dashboard-page-container"; +let MyName = ""; +let canInputReportTag = true; +let canInputReportOfficerTag = true; +let canInputReportCivilianTag = true; +let canSearchForVehicles = true; +let canSearchForReports = true; +let canSaveVehicle = true; +let canSaveWeapon = true; +var LastName = ""; +var DispatchNum = 0; +var playerJob = ""; +let rosterLink = ""; +let sopLink = ""; + +//Set this to false if you don't want to show the send to community service button on the incidents page +const canSendToCommunityService = false + +let impoundChanged = false; + +// TEMP CONFIG OF JOBS +const PoliceJobs = { + ['police']: true, + ['lspd']: true, + ['bcso']: true, + ['sast']: true, + ['sasp']: true, + ['sapr']: true, + ['doc']: true, + ['lssd']: true, +} + +const AmbulanceJobs = { + ['ambulance']: true, +} + +const DojJobs = { + ['lawyer']: true, + ['judge']: true +} + +const MONTH_NAMES = [ + "Januar", + "Februar", + "Marts", + "April", + "Maj", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "December" +]; + +function getFormattedDate(date, prefomattedDate = false, hideYear = false) { + const day = date.getDate(); + const month = MONTH_NAMES[date.getMonth()]; + const year = date.getFullYear(); + const hours = date.getHours(); + let minutes = date.getMinutes(); + + if (minutes < 10) { + minutes = `0${minutes}`; + } + + if (prefomattedDate) { + return `${prefomattedDate} kl. ${hours}:${minutes}`; + } + + if (hideYear) { + return `${day}. ${month} kl. ${hours}:${minutes}`; + } + + return `${day}. ${month} ${year}. kl. ${hours}:${minutes}`; +} + +var quotes = [ + 'Project Sloth On Top!', + 'A Discord rewrite fixes everything...', + 'Does anyone even read these?', + 'The best way to predict your future is to create it.', + 'Believe you can and you\'re halfway there.', + 'In three words I can sum up everything I\'ve learned about life: it goes on.', + 'The only way to do great work is to love what you do.', + 'Success is not final, failure is not fatal: it is the courage to continue that counts.', + 'Life is 10% what happens to us and 90% how we react to it.', + 'The only true wisdom is in knowing you know nothing.', + 'If you want to live a happy life, tie it to a goal, not to people or things.', + 'Happiness is not something ready-made. It comes from your own actions.', + 'The greatest glory in living lies not in never falling, but in rising every time we fall.', + 'The only thing necessary for the triumph of evil is for good men to do nothing.', + 'It does not matter how slowly you go as long as you do not stop.', + 'The best time to plant a tree was 20 years ago. The second best time is now.', + 'Believe in yourself and all that you are. Know that there is something inside you that is greater than any obstacle.', + 'Don\'t watch the clock; do what it does. Keep going.', + 'You miss 100% of the shots you don\'t take.', + 'You can\'t go back and change the beginning, but you can start where you are and change the ending.', + 'It\'s not the years in your life that count. It\'s the life in your years.', + 'The greatest glory in living lies not in never falling, but in rising every time we fall.', + 'The two most important days in your life are the day you are born and the day you find out why.', + 'Success is not how high you have climbed, but how you make a positive difference to the world.', +] + +function randomizeQuote() { + return randomQuote = quotes[Math.floor(Math.random() * quotes.length)]; +} + +function timeAgo(dateParam) { + if (!dateParam) { + return null; + } + + const date = + typeof dateParam === "object" ? dateParam : new Date(dateParam); + const DAY_IN_MS = 86400000; + const today = new Date(); + const yesterday = new Date(today - DAY_IN_MS); + const seconds = Math.round((today - date) / 1000); + const minutes = Math.round(seconds / 60); + const isToday = today.toDateString() === date.toDateString(); + const isYesterday = yesterday.toDateString() === date.toDateString(); + const isThisYear = today.getFullYear() === date.getFullYear(); + + if (seconds < 5) { + return "Lige nu"; + } else if (seconds < 60) { + return `${seconds} sekunder siden`; + } else if (seconds < 90) { + return "Omkring et minut siden"; + } else if (minutes < 60) { + return `${minutes} minutter siden`; + } else if (isToday) { + return getFormattedDate(date, "I dag"); + } else if (isYesterday) { + return getFormattedDate(date, "I går"); + } else if (isThisYear) { + return getFormattedDate(date, false, true); + } + + return getFormattedDate(date); +} + +function closeContainer(selector) { + if ( + $(selector).css("display") != "none" + ) { + shouldClose = false; + $(selector).fadeOut(50); + $(".close-all").css("filter", "none"); + } +} + +$(document).ready(() => { + $(".header").hover( + function () { + $(".close-all").css("opacity", "0.5"); + }, + function () { + $(".close-all").css("opacity", "1"); + } + ); + $(".incidents-charges-title-container").hover( + function () { + $(".incidents-charges-table-container").css("opacity", "0.1"); + $(".close-all").css("filter", "none"); + }, + function () { + $(".close-all").css("filter", "brightness(30%)"); + $(".incidents-charges-table-container").css("opacity", "1"); + } + ); + $(".nav-item").click(function () { + if ($(this).hasClass("active-nav") == false) { + fidgetSpinner($(this).data("page")); + currentTab = $(this).data("page"); + } + }); + + $(".profile-items").on("click", ".profile-item", async function () { + let id = $(this).data("id"); + let profileFingerprint = $(this).data("fingerprint"); + + if (profileFingerprint && profileFingerprint !== "") { + $(".manage-profile-fingerprint-input").val(profileFingerprint); + } else { + $(".manage-profile-fingerprint-input").val(""); + } + + let result = await $.post( + `https://${GetParentResourceName()}/getProfileData`, + JSON.stringify({ + id: id, + }) + ); + + if (!canInputTag) { + if ($(".tags-add-btn").hasClass("fa-minus")) { + $(".tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + $(".tag-input").remove(); + canInputTag = true; + } + + if ($(".gallery-upload-input").css("display") == "block") { + $(".gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".gallery-upload-input").css("display", "none"); + }, 250); + } + + if ($(".gallery-add-btn").hasClass("fa-minus")) { + $(".gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + + const { vehicles, tags, gallery, convictions, incidents, properties, fingerprint } = result; + + $(".manage-profile-editing-title").html(`Du redigerer ${result["firstname"]} ${result["lastname"]}`); + $(".manage-profile-citizenid-input").val(result['cid']); + $(".manage-profile-name-input-1").val(result["firstname"]); + $(".manage-profile-name-input-2").val(result["lastname"]); + $(".manage-profile-dob-input").val(result["dob"]); + $(".manage-profile-phonenumber-input").val(result["phone"]); + $(".manage-profile-job-input").val(`${result.job}, ${result.grade}`); + $(".manage-profile-apartment-input").val(`${result.apartment}`); + $(".manage-profile-url-input").val(result["profilepic"] ?? ""); + $(".manage-profile-info").val(result["mdtinfo"]); + $(".manage-profile-info").removeAttr("disabled"); + $(".manage-profile-pic").attr("src", result["profilepic"] ?? "img/male.png"); + $(".manage-profile-active-warrant").css("display", "none") + if (result["warrant"]) { + $(".manage-profile-active-warrant").css("display", "block"); + } + + $(".licenses-holder").empty(); + $(".tags-holder").empty(); + $(".vehs-holder").empty(); + $(".gallery-inner-container").empty(); + $(".convictions-holder").empty(); + $(".profile-incidents-holder").empty(); + + let licencesHTML = '
Ingen tilladelser
'; + let tagsHTML = '
Ingen tags
'; + let convHTML = '
Ren straffeattest
'; + let incidentsHTML = '
Ingen hændelser
'; + let vehHTML = '
Ingen køretøjer
'; + let galleryHTML = '
Ingen billeder
'; + let propertyHTML = '
Ingen ejendomme
'; + + // convert key value pair object of licenses to array + let licenses = Object.entries(result.licences); + + if (licenses.length == 0 || licenses.length == undefined) { + var licenseTypes = ['business', 'pilot', 'weapon', 'driver']; + licenses = Object.entries(licenseTypes.reduce((licenseType, licenseValue) => (licenseType[licenseValue] = false, licenseType), {})); + } + + if (licenses.length > 0 && (PoliceJobs[playerJob] !== undefined || DojJobs[playerJob] !== undefined)) { + licencesHTML = ''; + for (const [lic, hasLic] of licenses) { + let tagColour = hasLic == true ? "green-tag" : "red-tag"; + licencesHTML += `${titleCase(lic)}`; + } + + if (vehicles && vehicles.length > 0) { + vehHTML = ''; + vehicles.forEach(value => { + vehHTML += `
${value.plate} - ${value.model}
` + }) + } + + if (convictions && convictions.length > 0) { + convHTML = ''; + convictions.forEach(value => { + convHTML += `
${value}
`; + }) + } + + if (incidents && incidents.length > 0) { + incidentsHTML=''; + // Sort incidents so most recent appear first + const sortedIncidents = incidents.sort((a,b) => b.time - a.time); + sortedIncidents.forEach(value => { + incidentsHTML += `
+
+
${value.id}
+
+ ${value.title} +
${getFormattedDate(new Date(Number(value.time)))}
+
+
+
` + }) + } + + if (properties && properties.length > 0) { + propertyHTML = ''; + properties.forEach(value => { + propertyHTML += `
${value.label}
`; + }) + } + } + + if (tags && tags.length > 0) { + tagsHTML = ''; + tags.forEach((tag) => { + tagsHTML += `
${tag}
`; + }) + } + + if (gallery && gallery.length > 0) { + galleryHTML = ''; + gallery.forEach(value => { + galleryHTML += ``; + }) + } + + if (result.isLimited) { + $(".manage-profile-vehs-container").fadeOut(250); + $(".manage-profile-houses-container").fadeOut(250); + $(".manage-profile-houses-container").fadeOut(250); + } else { + $(".manage-profile-vehs-container").fadeIn(250); + $(".manage-profile-houses-container").fadeIn(250); + $(".manage-profile-houses-container").fadeIn(250); + } + + $(".licenses-holder").html(licencesHTML); + $(".tags-holder").html(tagsHTML); + $(".convictions-holder").html(convHTML); + $(".profile-incidents-holder").html(incidentsHTML); + $(".vehs-holder").html(vehHTML); + $(".gallery-inner-container").html(galleryHTML); + $(".houses-holder").html(propertyHTML); + }); + + $(".bulletin-add-btn").click(function () { + if (canCreateBulletin == 0) { + $(this).removeClass("fa-plus").addClass("fa-minus"); + let BulletinId = Number($(".bulletin-item").first().data("id")) + 1; + if (Number.isNaN(BulletinId)) { + BulletinId = 1; + } + canCreateBulletin = BulletinId; + $(".bulletin-items-continer") + .prepend(`
+ + +
+
${MyName} - Lige nu
+
+
`); + } else { + $(this).removeClass("fa-minus").addClass("fa-plus"); + $(".bulletin-items-continer") + .find("[data-id='" + canCreateBulletin + "']") + .remove(); + canCreateBulletin = 0; + } + }); + //
ID: ${canCreateBulletin}
+ $(".bulletin-items-continer").on("keydown", ".bulletin-item", function (e) { + if (e.keyCode === 13) { + $(".bulletin-add-btn").removeClass("fa-minus").addClass("fa-plus"); + let id = $(this).find(".bulletin-id").text(); + let date = $(this).find(".bulletin-date").text(); + let title = $(this).find(".bulletin-item-title").text(); + let info = $(this).find(".bulletin-item-info").text(); + let time = new Date(); + $.post( + `https://${GetParentResourceName()}/newBulletin`, + JSON.stringify({ + title: title, + info: info, + time: time.getTime(), + }) + ); + $(".bulletin-items-continer") + .find("[data-id='" + canCreateBulletin + "']") + .remove(); + $(".bulletin-items-continer") + .prepend(`
+
${title}
+
${info}
+
+ +
${MyName} - ${timeAgo( + Number(time.getTime()) + )}
+
+
`); + canCreateBulletin = 0; + } + }); + $(".bulletin-items-continer").on( + "contextmenu", + ".bulletin-item", + function (e) { + let args = [ + { + className: "remove-bulletin", + icon: "fas fa-times", + text: "Remove Item", + info: $(this).data("id"), + status: $(this).data("title"), + }, + ]; + openContextMenu(e, args); + } + ); + $(".contextmenu").on("click", ".remove-bulletin", function () { + let id = $(this).data("info"); + let title = $(this).data("status") + $(".bulletin-items-continer") + .find("[data-id='" + id + "']") + .remove(); + $.post( + `https://${GetParentResourceName()}/deleteBulletin`, + JSON.stringify({ + id: id, + title: title + }) + ); + if (canCreateBulletin == id) { + canCreateBulletin = 0; + } + if ($(".bulletin-add-btn").hasClass("fa-minus")) { + $(".bulletin-add-btn").removeClass("fa-minus").addClass("fa-plus"); + } + }); + + $(".associated-incidents-tags-add-btn").on("click", "", function () { + document.addEventListener("mouseup", onMouseDownIncidents); + const source = "associated-incidents-tags"; + $(".incidents-person-search-holder").attr("data-source", source); + $(".incidents-person-search-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + }); + + $(".convictions-title").on("click", "", function () { + if ($(".manage-profile-citizenid-input").val()) { + document.addEventListener("mouseup", onMouseDownIncidents); + const source = "convictions-title"; + $(".convictions-holder").attr("data-source", source); + $(".convictions-known-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + } else { + $(this).effect("shake", { times: 2, distance: 2 }, 500); + } + }); + + $(".profile-incidents-title").on("click", "", function () { + if ($(".manage-profile-citizenid-input").val()) { + document.addEventListener("mouseup", onMouseDownIncidents); + const source = "profile-incidents-title"; + $(".profile-incidents-holder").attr("data-source", source); + $(".incidents-known-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + } else { + $(this).effect("shake", { times: 2, distance: 2 }, 500); + } + }); + + $(".gallery-add-btn").click(function () { + if ($(".manage-profile-citizenid-input").val()) { + if ($(".gallery-upload-input").css("display") == "none") { + $(".gallery-upload-input").slideDown(250); + $(".gallery-upload-input").css("display", "block"); + $(this).removeClass("fa-plus").addClass("fa-minus"); + } else { + $(".gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".gallery-upload-input").css("display", "none"); + }, 250); + $(this).removeClass("fa-minus").addClass("fa-plus"); + } + } else { + $(this).effect("shake", { times: 2, distance: 2 }, 500); + } + }); + $("#gallery-upload-input").keydown(function (e) { + if (e.keyCode === 13) { + let URL = $("#gallery-upload-input").val(); + let cid = $(".manage-profile-citizenid-input").val(); + if (URL !== "") { + let randomNum = Math.ceil(Math.random() * 10).toString(); + $(".gallery-inner-container").prepend( + `` + ); + $("#gallery-upload-input").val(""); + $(".gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".gallery-upload-input").css("display", "none"); + }, 250); + $(".gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + } + }); + $(".manage-profile-save").click(function () { + if (canSaveProfile == true) { + canSaveProfile = false; + $(".manage-profile-save").empty(); + $(".manage-profile-save").prepend( + `` + ); + setTimeout(() => { + $(".manage-profile-save").empty(); + $(".manage-profile-save").html("Gem"); + canSaveProfile = true; + }, 750); + + setTimeout(() => { + let tags = new Array(); + let gallery = new Array(); + let licenses = {}; + + $(".tags-holder") + .find("span.tag-input, div.tag") + .each(function () { + if ($(this).text() != "" && $(this).text() != "Ingen tags") { + tags.push($(this).text()); + } + }); + + $(".gallery-inner-container") + .find("img") + .each(function () { + if ($(this).attr("src") != "") { + gallery.push($(this).attr("src")); + } + }); + + let pfp = $(".manage-profile-pic").attr("src"); + let newpfp = $(".manage-profile-url-input").val(); + if (newpfp.includes("base64")) { + newpfp = "img/not-found.webp"; + } else { + pfp = newpfp; + } + let description = $(".manage-profile-info").val(); + let id = $(".manage-profile-citizenid-input").val(); + + $(".licenses-holder") + .find("span") + .each(function(){ + let type = $(this).data("type") + if ($(this).attr('class').includes('green-tag')){ + licenses[type] = true; + } + else{ + licenses[type] = false; + } + }) + + const fName = $(".manage-profile-name-input-1").val(); + const sName = $(".manage-profile-name-input-2").val(); + + $.post( + `https://${GetParentResourceName()}/saveProfile`, + JSON.stringify({ + pfp: pfp, + description: description, + id: id, + fName: fName, + sName: sName, + tags: tags, + gallery: gallery, + licenses: licenses, + fingerprint: $(".manage-profile-fingerprint-input").val() + }) + ); + $(".manage-profile-pic").attr("src", newpfp); + }, 250); + } + }); + $(".manage-incidents-title-holder").on( + "click", + ".manage-incidents-save", + function () { + if (canSaveProfile == true) { + canSaveProfile = false; + $(".manage-incidents-save").empty(); + $(".manage-incidents-save").prepend( + `` + ); + setTimeout(() => { + $(".manage-incidents-save").empty(); + $(".manage-incidents-save").prepend( + `` + ); + canSaveProfile = true; + }, 750); + + // Title, information, tags, officers involved, civs involved, evidence + const title = $("#manage-incidents-title-input").val(); + const information = $(".manage-incidents-reports-content").val(); + const dbid = $(".manage-incidents-editing-title").data("id"); + + let tags = new Array(); + let officers = new Array(); + let civilians = new Array(); + let evidence = new Array(); + + $(".manage-incidents-tags-holder") + .find("div") + .each(function () { + if ($(this).text() != "") { + tags.push($(this).text()); + } + }); + + $(".manage-incidents-officers-holder") + .find("div") + .each(function () { + if ($(this).text() != "") { + officers.push($(this).text()); + } + }); + + $(".manage-incidents-civilians-holder") + .find("div") + .each(function () { + if ($(this).text() != "") { + civilians.push($(this).text()); + } + }); + + $(".manage-incidents-evidence-holder") + .find("img") + .each(function () { + if ($(this).attr("src") != "") { + evidence.push($(this).attr("src")); + } + }); + + let time = new Date(); + + let associated = new Array(); + + $(".associated-incidents-user-container").each(function ( + index + ) { + var cid = $(this).data("id"); + var guilty = false; + var warrant = false; + var processed = false; + var isassociated = false; + var charges = new Array(); + + $(".associated-incidents-user-tags-holder") + .children("div") + .each(function (index) { + if ($(this).data("id") == cid) { + if ($(this).hasClass("green-tag")) { + if ($(this).text() == "Skyldig") { + guilty = true; + } + if ($(this).text() == "Efterlysning") { + warrant = true; + } + if ($(this).text() == "Behandlet") { + processed = true; + } + if ($(this).text() == "Associeret") { + isassociated = true; + } + } + } + }); + + $(".associated-incidents-user-holder") + .children("div") + .each(function (index) { + if ( + ( $(".associated-incidents-user-holder") + .children() + .eq(index) + .data("id") == cid ) + ) { + charges.push( + $(".associated-incidents-user-holder") + .children() + .eq(index) + .html() + ); + } + }); + + associated.push({ + Cid: $(this).data("id"), + Warrant: warrant, + Guilty: guilty, + Processed: processed, + Isassociated: isassociated, + Charges: charges, + Fine: $(".fine-amount") + .filter("[data-id='" + $(this).data("id") + "']") + .val(), + Sentence: $(".sentence-amount") + .filter("[data-id='" + $(this).data("id") + "']") + .val(), + recfine: $(".fine-recommended-amount") + .filter("[data-id='" + $(this).data("id") + "']") + .val(), + recsentence: $(".sentence-recommended-amount") + .filter("[data-id='" + $(this).data("id") + "']") + .val(), + }); + }); + + $.post( + `https://${GetParentResourceName()}/saveIncident`, + JSON.stringify({ + ID: dbid, + title: title, + information: information, + tags: tags, + officers: officers, + civilians: civilians, + evidence: evidence, + associated: associated, + time: time.getTime(), + }) + ); + + setTimeout(() => { + if (canRefreshIncidents == true) { + canRefreshIncidents = false; + $(".incidents-search-refresh").empty(); + $(".incidents-search-refresh").prepend( + `` + ); + setTimeout(() => { + $(".incidents-search-refresh").empty(); + $(".incidents-search-refresh").html("Genindlæs"); + canRefreshIncidents = true; + $.post( + `https://${GetParentResourceName()}/getAllIncidents`, + JSON.stringify({}) + ); + }, 1500); + } + }, 1000); + } + } + ); + $(".manage-incidents-title-holder").on( + "click", + ".manage-incidents-create", + function () { + let template = ` +
+

📝 Resumé:

+

[Skriv resumé her]

+

 

+

🧍 Gidsel: [Navn]

+

 

+

🗄️ Bevis-lokation: Stash # | Skuffe #

+

 

+

🔪 Våben/genstande konfiskeret:

+

· [Skriv liste her]

+

 

+

-----

+

💸 Bøde:

+

 

+

⌚ Straf:

+

-----

+
+ `; + $("#manage-incidents-title-input").val( + "Navn - Sigtelse - " + $(".date").html() + ); + $(".manage-incidents-reports-content").trumbowyg({ + changeActiveDropdownIcon: true, + imageWidthModalEdit: true, + btns: [ + ['foreColor', 'backColor','fontfamily','fontsize','indent', 'outdent'], + ['strong', 'em',], ['insertImage'], + ['viewHTML'], + ['undo', 'redo'], + ['formatting'], + ['superscript', 'subscript'], + ['link'], + ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'], + ['horizontalRule'] + ], + }); + $(".manage-incidents-reports-content").trumbowyg('html', template); + + $(".manage-incidents-tags-holder").empty(); + $(".manage-incidents-officers-holder").empty(); + $(".manage-incidents-civilians-holder").empty(); + $(".manage-incidents-evidence-holder").empty(); + $(".manage-incidents-title-holder").empty(); + $(".manage-incidents-title-holder").prepend( + ` +
Administrer hændelser
+
+
+ ` + ); + $(".manage-incidents-title").css("width", "66%"); + $(".manage-incidents-create").css("margin-right", "0px"); + + $(".incidents-ghost-holder").html(""); + $(".associated-incidents-tags-holder").html(""); + + $(".manage-incidents-editing-title").html( + "You are currently creating a new Incident" + ); + $(".manage-incidents-editing-title").data("id", 0); + + $(".manage-incidents-tags-add-btn").css("pointer-events", "auto"); + $(".manage-incidents-reports-content").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-officers-add-btn").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-civilians-add-btn").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-evidence-add-btn").css( + "pointer-events", + "auto" + ); + $(".associated-incidents-tags-add-btn").css( + "pointer-events", + "auto" + ); + + } + ); + $(".tags-add-btn").click(function () { + if ($(".manage-profile-citizenid-input").val()) { + if (canInputTag) { + $(this).removeClass("fa-plus").addClass("fa-minus"); + $(".tags-holder").prepend( + `` + ); + canInputTag = false; + } else if (!canInputTag) { + $(this).removeClass("fa-minus").addClass("fa-plus"); + $(".tag-input").remove(); + canInputTag = true; + } + } else { + $(this).effect("shake", { times: 2, distance: 2 }, 500); + } + }); + + $(".tags-holder").on("keydown", ".tag-input", function (e) { + if (e.keyCode === 13) { + addTag($(".tag-input").text()); + if ($(".tags-add-btn").hasClass("fa-minus")) { + $(".tags-add-btn").removeClass("fa-minus").addClass("fa-plus"); + } + $(".tag-input").remove(); + } + }); + $(".contextmenu").on("click", ".search-vehicle", function () { + let plate = $(this).data("info"); + fidgetSpinner(".dmv-page-container"); + currentTab = ".dmv-page-container"; + setTimeout(() => { + $(".dmv-search-input").slideDown(250); + $(".dmv-search-input").css("display", "block"); + setTimeout(() => { + $("#dmv-search-input:text").val(plate.toString()); + setTimeout(() => { + var e = jQuery.Event("keydown"); + e.which = 13; // # Some key code value + e.keyCode = 13 + $("#dmv-search-input").trigger(e); + }, 250); + }, 250); + }, 250); + }); + $(".vehs-holder").on("contextmenu", ".veh-tag", function (e) { + let args = [ + { + className: "search-vehicle", + icon: "fas fa-car", + text: "Search Vehicle", + info: $(this).data("plate"), + status: "", + }, + ]; + openContextMenu(e, args); + }); + + $(".contextmenu").on("click", ".make-waypoint", function () { + let coord = $(this).data("info").split("===") + setTimeout(() => { + $.post( + `https://${GetParentResourceName()}/SetHouseLocation`, + JSON.stringify({ + coord: coord, + }) + ); + }, 250); + }); + $(".houses-holder").on("contextmenu", ".white-tag", function (e) { + let args = [ + { + className: "make-waypoint", + icon: "fas fa-map-pin", + text: "Sæt GPS", + info: $(this).data("location"), + status: "", + }, + ]; + openContextMenu(e, args); + }); + $(".gallery-inner-container").on("click", ".gallery-img", function () { + if ($(this).css("filter") == "none") { + $(this).css("filter", "blur(5px)"); + } else { + $(this).css("filter", "none"); + } + }); + $(".contextmenu").on("click", ".expand-image", function () { + expandImage($(this).data("info")); + }); + $(".contextmenu").on("click", ".remove-image", function () { + removeImage($(this).data("info")); + }); + $(".contextmenu").on("click", ".copy-image-link", function () { + copyImageSource($(this).data("info")); + }); + $(".contextmenu").on("click", ".remove-image-incident", function () { + $(".manage-incidents-evidence-holder img") + .filter("[src='" + $(this).data("info") + "']") + .remove(); + }); + $(".gallery-inner-container").on( + "contextmenu", + ".gallery-img", + function (e) { + let args = [ + { + className: "remove-image", + icon: "fas fa-times", + text: "Fjern billede", + info: $(this).attr("src"), + status: "", + }, + { + className: "expand-image", + icon: "fas fa-expand", + text: "Udvid billede", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + { + className: "copy-image-link", + icon: "fa-regular fa-copy", + text: "Kopier link", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + ]; + openContextMenu(e, args); + } + ); + + $(".licenses-holder").on("contextmenu", ".license-tag", function (e) { + const status = $(this).data("type"); + let type = $(this).html(); + + if (type == "Theory") { + info = "theory"; + } else if (type == "Car") { + info = "drive"; + } else if (type == "Bike") { + info = "drive_bike"; + } else if (type == "Truck") { + info = "drive_truck"; + } else if (type == "Hunting") { + info = "hunting"; + } else if (type == "Pilot") { + info = "pilot"; + } else if (type == "Weapon") { + info = "weapon"; + } else { + info = type; + } + + if ($(this).hasClass("green-tag")) { + openContextMenu(e, [ + { + className: "revoke-licence", + icon: "fas fa-times", + text: "Annuller licens", + info: info, + status: status, + }, + ]); + } else if ($(this).hasClass("red-tag")) { + openContextMenu(e, [ + { + className: "give-licence", + icon: "fas fa-check", + text: "Giv licens", + info: info, + status: status, + }, + ]); + } + }); + + $(".contextmenu").on("click", ".revoke-licence", function () { + // $.post( + // `https://${GetParentResourceName()}/updateLicence`, + // JSON.stringify({ + // cid: $(".manage-profile-citizenid-input").val(), + // type: $(this).data("status"), + // status: "revoke", + // }) + // ); + + const Elem = $(this).data("status"); + $(".license-tag") + .filter(`[data-type="${Elem}"]`) + .removeClass("green-tag") + .addClass("red-tag"); + + onMouseDown(); + }); + + $(".contextmenu").on("click", ".give-licence", function () { + // $.post( + // `https://${GetParentResourceName()}/updateLicence`, + // JSON.stringify({ + // cid: $(".manage-profile-citizenid-input").val(), + // type: $(this).data("status"), + // status: "give", + // }) + // ); + + const Elem = $(this).data("status"); + $(".license-tag") + .filter(`[data-type="${Elem}"]`) + .removeClass("red-tag") + .addClass("green-tag"); + + onMouseDown(); + }); + + $(".profile-title").click(function () { + if (canSearchForProfiles == true) { + if ($(".profile-search-input").css("display") == "none") { + $(".profile-search-input").slideDown(250); + $(".profile-search-input").css("display", "block"); + } else { + $(".profile-search-input").slideUp(250); + setTimeout(() => { + $(".profile-search-input").css("display", "none"); + }, 250); + } + } + }); + + $("#profile-search-input").keydown(async function (e) { + if (e.keyCode === 13 && canSearchForProfiles == true) { + let name = $("#profile-search-input").val(); + if (name != "") { + canSearchForProfiles = false; + $(".profile-items").empty(); + $(".profile-items").prepend( + `
` + ); + + let result = await $.post( + `https://${GetParentResourceName()}/searchProfiles`, + JSON.stringify({ + name: name, + }) + ); + + searchProfilesResults(result); + } + } + }); + + $(".incidents-title").click(function () { + if (canSearchForProfiles == true) { + if ($(".incidents-search-input").css("display") == "none") { + $(".incidents-search-input").slideDown(250); + $(".incidents-search-input").css("display", "block"); + } else { + $(".incidents-search-input").slideUp(250); + setTimeout(() => { + $(".incidents-search-input").css("display", "none"); + }, 250); + } + } + }); + + $("#incidents-search-input").keydown(function (e) { + if (e.keyCode === 13 && canSearchForProfiles == true) { + let incident = $("#incidents-search-input").val(); + if (incident !== "") { + canSearchForProfiles = false; + $.post( + `https://${GetParentResourceName()}/searchIncidents`, + JSON.stringify({ + incident: incident, + }) + ); + $(".incidents-items").empty(); + $(".incidents-items").prepend( + `
` + ); + } + } + }); + + $("#dispatchmsg").keydown(function (e) { + const keyCode = e.which || e.keyCode; + if (keyCode === 13 && !e.shiftKey) { + e.preventDefault(); + const time = new Date(); + $.post( + `https://${GetParentResourceName()}/dispatchMessage`, + JSON.stringify({ + message: $(this).val(), + time: time.getTime(), + }) + ); + $(this).val(""); + } + }); + + $(".incidents-items").on("click", ".incidents-item", function () { + const id = $(this).data("id"); + $.post( + `https://${GetParentResourceName()}/getIncidentData`, + JSON.stringify({ + id: id, + }) + ); + }); + $(".manage-incidents-civilians-holder").on("click", ".tag", async function () { + const name = $(this).text(); + fidgetSpinner(".profile-page-container"); + currentTab = ".profile-page-container"; + $(".profile-search-input").slideDown(250); + $(".profile-search-input").css("display", "block"); + $("#profile-search-input:text").val(name); + canSearchForProfiles = false; + let result = await $.post( + `https://${GetParentResourceName()}/searchProfiles`, + JSON.stringify({ + name: name, + }) + ); + + searchProfilesResults(result); + } + ); + document.onkeyup = function (data) { + if (data.which == 27) { + let shouldClose = true; + + if ($(".respond-calls-container").css("display") == "block") { + shouldClose = false; + $(".respond-calls-container").fadeOut(500); + setTimeout(() => { + $(".close-all").css("filter", "none"); + }, 250); + } + + if ($(".gallery-image-enlarged").css("display") == "block") { + shouldClose = false; + $(".gallery-image-enlarged").fadeOut(150); + $(".gallery-image-enlarged").css("display", "none"); + $(".close-all").css("filter", "none"); + } + + if ($(".incidents-image-enlarged").css("display") == "block") { + shouldClose = false; + $(".incidents-image-enlarged").fadeOut(150); + $(".incidents-image-enlarged").css("display", "none"); + } + + closeContainer(".incidents-person-search-container"); + closeContainer(".convictions-known-container"); + closeContainer(".incidents-known-container"); + + if ($(".incidents-charges-table").css("display") != "none") { + shouldClose = false; + $(".incidents-charges-table").slideUp(500); + $(".incidents-charges-table").fadeOut(500); + setTimeout(() => { + $(".close-all").css("filter", "none"); + }, 550); + } + + if ($(".dispatch-attached-units").css("display") != "none") { + shouldClose = false; + $(".dispatch-attached-units").slideUp(500); + $(".dispatch-attached-units").fadeOut(500); + setTimeout(() => { + $(".close-all").css("filter", "none"); + }, 550); + } + + if ($(".impound-form").css("display") != "none") { + shouldClose = false; + $(".impound-form").slideUp(250); + $(".impound-form").fadeOut(250); + setTimeout(() => { + $(".close-all").css("filter", "none"); + }, 550); + } + + if (shouldClose == true) { + $.post(`https://${GetParentResourceName()}/escape`, JSON.stringify({})); + } + } + }; + $(".manage-incidents-tags-add-btn").click(function () { + if ($(".tag-incident-input")[0]) { + $(this).removeClass("fa-minus").addClass("fa-plus"); + $(".tag-incident-input").remove(); + } else { + $(this).removeClass("fa-plus").addClass("fa-minus"); + $(".manage-incidents-tags-holder").prepend( + `` + ); + } + }); + + $(".incidents-person-search-name-input").on("keydown", "", function (e) { + if (e.keyCode === 13) { + let name = $(".incidents-person-search-name-input").val(); + $.post( + `https://${GetParentResourceName()}/incidentSearchPerson`, + JSON.stringify({ + name: name, + }) + ); + } + }); + $(".manage-incidents-tags-holder").on( + "keydown", + ".tag-incident-input", + function (e) { + if (e.keyCode === 13) { + $(".manage-incidents-tags-holder").prepend( + `
${$( + ".tag-incident-input" + ).text()}
` + ); + // Have it save instantly if it's an existing report. + if ($(".manage-incidents-tags-add-btn").hasClass("fa-minus")) { + $(".manage-incidents-tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + $(".tag-incident-input").remove(); + } + } + ); + + $(".manage-incidents-officers-add-btn").click(function () { + const source = "incidents-officers"; + document.addEventListener("mouseup", onMouseDownIncidents); + $(".incidents-person-search-holder").attr("data-source", source); + $(".incidents-person-search-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + }); + + $(".manage-incidents-civilians-add-btn").click(function () { + const source = "incidents-civilians"; + document.addEventListener("mouseup", onMouseDownIncidents); + $(".incidents-person-search-holder").attr("data-source", source); + $(".incidents-person-search-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + }); + + $(".manage-incidents-evidence-add-btn").click(function () { + if ($(".incidents-upload-input").css("display") == "none") { + $(".incidents-upload-input").slideDown(250); + $(".incidents-upload-input").css("display", "block"); + $(this).removeClass("fa-plus").addClass("fa-minus"); + } else { + $(".incidents-upload-input").slideUp(250); + setTimeout(() => { + $(".incidents-upload-input").css("display", "none"); + }, 250); + $(this).removeClass("fa-minus").addClass("fa-plus"); + } + }); + + $("#incidents-upload-input").keydown(function (e) { + if (e.keyCode === 13) { + let URL = $("#incidents-upload-input").val(); + let cid = $(".manage-profile-citizenid-input").val(); + if (URL !== "") { + let randomNum = Math.ceil(Math.random() * 10).toString(); + $(".manage-incidents-evidence-holder").prepend( + `` + ); + $("#incidents-upload-input").val(""); + $(".incidents-upload-input").slideUp(250); + setTimeout(() => { + $(".incidents-upload-input").css("display", "none"); + }, 250); + $(".manage-incidents-evidence-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + } + }); + + $(".manage-incidents-evidence-holder").on( + "click", + ".incidents-img", + function () { + if ($(this).css("filter") == "none") { + $(this).css("filter", "blur(5px)"); + } else { + $(this).css("filter", "none"); + } + } + ); + + $(".manage-bolos-title-holder").on( + "click", + ".manage-bolos-new", + function () { + var template = ""; + if ($(".badge-logo").attr("src") == "img/ems_badge.webp") { + template = ` +
+

📝 Rum #: [ # ]

+

Rapport ID: [ Rapport ID ]

+


+

🧍 Indlæggelses tidspunkt: [ Dato og tidspunkt ] 

+

Operation: [Ja/Nej]

+

Skader/lidelser:

+

· [Indtast liste over skader her]

+

 

+

-----

+

Yderligere tilstede:

+

· [ Liste over eventuelt andet personale tilstede ]

+

🧑‍🤝‍🧑 Yderligere nød-kontakter:

+

· [ Navn og telefonnummer ]

+

Noter:

+

· [ Indtast eventuelle noter her ]

+

-----

+
+ `; + } + $(".manage-bolos-editing-title").html( + "Du opretter en efterlysning" + ); + $(".manage-bolos-input-title").val(""); + $(".manage-bolos-input-plate").val(""); + $(".manage-bolos-input-owner").val(""); + $(".manage-bolos-input-individual").val(""); + $(".manage-bolos-reports-content").trumbowyg({ + changeActiveDropdownIcon: true, + imageWidthModalEdit: true, + btns: [ + ['foreColor', 'backColor','fontfamily','fontsize','indent', 'outdent'], + ['strong', 'em',], ['insertImage'], + ['viewHTML'], + ['undo', 'redo'], + ['formatting'], + ['superscript', 'subscript'], + ['link'], + ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'], + ['horizontalRule'] + ], + }); + $(".manage-bolos-reports-content").trumbowyg('html', template); + $(".manage-bolos-tags-holder").empty(); + $(".bolo-gallery-inner-container").empty(); + $(".manage-officers-tags-holder").empty(); + + if ($(".manage-bolos-tags-add-btn").hasClass("fa-minus")) { + $(".manage-bolos-tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + if ($(".bolo-gallery-add-btn").hasClass("fa-minus")) { + $(".bolo-gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + + if ($(".bolo-gallery-upload-input").css("display") == "block") { + $(".bolo-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".bolo-gallery-upload-input").css("display", "none"); + }, 250); + } + + canInputTag = true; + canInputBoloTag = true; + canInputBoloOfficerTag = true; + + $(".tag-bolo-input").remove(); + canInputBoloTag = true; + + //} + } + ); + + $(".manage-bolos-title-holder").on( + "click", + ".manage-bolos-save", + function () { + let existing = !( + $(".manage-bolos-editing-title").html() == + "Du opretter en efterlysning" + ); + let id = $(".manage-bolos-editing-title").data("id"); + let title = $("#bolotitle").val(); + let plate = $("#boloplate").val(); + let owner = $("#boloowner").val(); + let individual = $("#boloindividual").val(); + let detail = $("#bolodetail").val(); + + let tags = new Array(); + let gallery = new Array(); + let officers = new Array(); + + $(".manage-bolos-tags-holder").each(function (index) { + if ($(this).text() != "") { + tags.push($(this).text()); + } + }); + + $(".bolo-gallery-inner-container") + .find("img") + .each(function () { + if ($(this).attr("src") != "") { + gallery.push($(this).attr("src")); + } + }); + + $(".manage-officers-tags-holder") + .find("div") + .each(function () { + if ($(this).text() != "") { + officers.push($(this).text()); + } + }); + + let time = new Date(); + + $.post( + `https://${GetParentResourceName()}/newBolo`, + JSON.stringify({ + existing: existing, + id: id, + title: title, + plate: plate, + owner: owner, + individual: individual, + detail: detail, + tags: tags, + gallery: gallery, + officers: officers, + time: time.getTime(), + }) + ); + } + ); + + $(".manage-incidents-evidence-holder").on( + "contextmenu", + ".incidents-img", + function (e) { + let args = [ + { + className: "remove-image-incident", + icon: "fas fa-times", + text: "Fjern billede", + info: $(this).attr("src"), + status: "", + }, + { + className: "expand-image", + icon: "fas fa-expand", + text: "Udvid billede", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + { + className: "copy-image-link", + icon: "fa-regular fa-copy", + text: "Kopier link", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + ]; + openContextMenu(e, args); + } + ); + + $(".bolos-search-title").click(function () { + if (canSearchForProfiles == true) { + if ($(".bolos-search-input").css("display") == "none") { + $(".bolos-search-input").slideDown(250); + $(".bolos-search-input").css("display", "block"); + } else { + $(".bolos-search-input").slideUp(250); + setTimeout(() => { + $(".bolos-search-input").css("display", "none"); + }, 250); + } + } + }); + + $("#bolos-search-input").keydown(function (e) { + if (e.keyCode === 13 && canSearchForProfiles == true) { + let searchVal = $("#bolos-search-input").val(); + if (searchVal !== "") { + canSearchForProfiles = false; + $.post( + `https://${GetParentResourceName()}/searchBolos`, + JSON.stringify({ + searchVal: searchVal, + }) + ); + $(".bolos-items").empty(); + $(".bolos-items").prepend(`
`); + } + } + }); + + $(".bolos-search-refresh").click(function () { + if (canRefreshBolo == true) { + canRefreshBolo = false; + $(".bolos-search-refresh").empty(); + $(".bolos-search-refresh").prepend( + `` + ); + setTimeout(() => { + $(".bolos-search-refresh").empty(); + $(".bolos-search-refresh").html("Genindlæs"); + canRefreshBolo = true; + $.post(`https://${GetParentResourceName()}/getAllBolos`, JSON.stringify({})); + }, 1500); + } + }); + + $(".manage-bolos-tags-add-btn").click(function () { + if (canInputBoloTag) { + $(this).removeClass("fa-plus").addClass("fa-minus"); + $(".manage-bolos-tags-holder").prepend( + `` + ); + canInputBoloTag = false; + } else if (!canInputBoloTag) { + $(this).removeClass("fa-minus").addClass("fa-plus"); + $(".tag-bolo-input").remove(); + canInputBoloTag = true; + } + }); + + $(".manage-bolos-tags-holder").on( + "keydown", + ".tag-bolo-input", + function (e) { + if (e.keyCode === 13) { + $(".manage-bolos-tags-holder").prepend( + `
${$(".tag-bolo-input").text()}
` + ); + // Have it save instantly if it's an existing report. + if ($(".manage-bolos-tags-add-btn").hasClass("fa-minus")) { + $(".manage-bolos-tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + $(".tag-bolo-input").remove(); + canInputBoloTag = true; + } + } + ); + + $(".bolo-gallery-add-btn").click(function () { + //if ($(".manage-profile-citizenid-input").val()) { + if ($(".bolo-gallery-upload-input").css("display") == "none") { + $(".bolo-gallery-upload-input").slideDown(250); + $(".bolo-gallery-upload-input").css("display", "block"); + $(this).removeClass("fa-plus").addClass("fa-minus"); + } else { + $(".bolo-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".bolo-gallery-upload-input").css("display", "none"); + }, 250); + $(this).removeClass("fa-minus").addClass("fa-plus"); + } + //} else { + // $(this).effect("shake", { times: 2, distance: 2 }, 500) + // } + }); + + $("#bolo-gallery-upload-input").keydown(function (e) { + if (e.keyCode === 13) { + let URL = $("#bolo-gallery-upload-input").val(); + let cid = $(".manage-profile-citizenid-input").val(); + if (URL !== "") { + let randomNum = Math.ceil(Math.random() * 10).toString(); + $(".bolo-gallery-inner-container").prepend( + `` + ); + $("#bolo-gallery-upload-input").val(""); + $(".bolo-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".bolo-gallery-upload-input").css("display", "none"); + }, 250); + $(".bolo-gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + } + }); + + $(".bolos-items").on("click", ".bolo-item", function () { + if ($(".manage-bolos-tags-add-btn").hasClass("fa-minus")) { + $(".manage-bolos-tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + if ($(".bolo-gallery-add-btn").hasClass("fa-minus")) { + $(".bolo-gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + + if ($(".bolo-gallery-upload-input").css("display") == "block") { + $(".bolo-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".bolo-gallery-upload-input").css("display", "none"); + }, 250); + } + + canInputTag = true; + canInputBoloTag = true; + canInputBoloOfficerTag = true; + let id = $(this).data("id"); + $.post( + `https://${GetParentResourceName()}/getBoloData`, + JSON.stringify({ + id: id, + }) + ); + }); + + $(".contextmenu").on("click", ".bolo-delete", function () { + if ($(this).data("info") != 0) { + if ($(".badge-logo").attr("src") == "img/ems_badge.webp") { + $(".bolos-items") + .find("[data-id='" + $(this).data("info") + "']") + .remove(); + $.post( + `https://${GetParentResourceName()}/deleteICU`, + JSON.stringify({ + id: $(this).data("info"), + }) + ); + } + $(".bolos-items") + .find("[data-id='" + $(this).data("info") + "']") + .remove(); + $.post( + `https://${GetParentResourceName()}/deleteBolo`, + JSON.stringify({ + id: $(this).data("info"), + }) + ); + } + }); + + $(".bolos-items").on("contextmenu", ".bolo-item", function (e) { + var args = ""; + args = [ + { + className: "bolo-delete", + icon: "fas fa-times", + text: "Slet efterlysning", + info: $(this).data("id"), + status: "", + }, + ]; + if ($(".badge-logo").attr("src") == "img/ems_badge.webp") { + args = [ + { + className: "bolo-delete", + icon: "fas fa-times", + text: "Slet check-in", + info: $(this).data("id"), + status: "", + }, + ]; + } + openContextMenu(e, args); + }); + $(".incidents-ghost-holder").on( + "contextmenu", + ".associated-incidents-user-holder", + function (e) { + let args = [ + { + className: "add-charge", + icon: "fas fa-check", + text: "Administrer sigtelser", + info: $(this).data("name"), + status: "", + }, + ]; + openContextMenu(e, args); + } + ); + $(".contextmenu").on("click", ".add-charge", function () { + let stupidasscid = $(this).data("info"); + $(".incidents-charges-table").slideDown(500); + $(".incidents-charges-table").fadeIn(500); + $("#current-charges-holder").data("cid", $(this).data("info")); + $("#current-charges-holder").html(""); + $(".associated-incidents-user-holder") + .children("div") + .each(function (index) { + if ( + $(".associated-incidents-user-holder") + .children() + .eq(index) + .data("id") == stupidasscid + ) { + const randomNum = Math.ceil( + Math.random() * 1000 + ).toString(); + $("#current-charges-holder").prepend( + `
${$( + ".associated-incidents-user-holder" + ) + .children() + .eq(index) + .html()}
` + ); + } + }); + setTimeout(() => { + $(".close-all").css("filter", "brightness(30%)"); + }, 250); + $.post(`https://${GetParentResourceName()}/getPenalCode`, JSON.stringify({})); + }); + + var shiftPressed = false; + $(document).keydown(function (event) { + shiftPressed = event.keyCode == 16; + }); + $(document).keyup(function (event) { + if (event.keyCode == 16) { + shiftPressed = false; + } + }); + + $(".offenses-main-container").on("mousedown",".offense-item",function (e) { + const cid = $("#current-charges-holder").data("cid"); + const newItem = $(this).find(".offense-item-offense").html(); + const Fine = +$(this).data("fine"); + const Sentence = +$(this).data("sentence"); + if (e.which == 1) { + let randomNum = Math.ceil(Math.random() * 1000).toString(); + $(`[data-name="${cid}"]`).prepend(`
${$(this).find(".offense-item-offense").html()}
`); + $("#current-charges-holder").prepend(`
${$(this).find(".offense-item-offense").html()}
`); + + const CurrRfine = $(".fine-recommended-amount").filter(`[data-id="${cid}"]`).val(); + const NewFine = +CurrRfine + +Fine; + $(".fine-recommended-amount").filter(`[data-id="${cid}"]`).val(NewFine); + + const CurrRsentence = $(".sentence-recommended-amount").filter(`[data-id="${cid}"]`).val(); + const NewSentence = +CurrRsentence + +Sentence; + $(".sentence-recommended-amount").filter(`[data-id="${cid}"]`).val(NewSentence); + + } else if (e.which == 3) { + $(".associated-incidents-user-holder").children("div").each(function (index) { + if ($(".associated-incidents-user-holder").children().eq(index).data("id") == cid) { + if ($(".associated-incidents-user-holder").children().eq(index).html() == newItem) { + const linkedId = $(".associated-incidents-user-holder").children().eq(index).data("link"); + //$(".current-charges-tag").filter(`[data-link="${linkedId}"]`).remove() + $(".white-tag").filter(`[data-link="${linkedId}"]`).remove(); + + var stop = false; + + $("#current-charges-holder").children("div").each(function (index) { + if (stop == false) { + if ($("#current-charges-holder").children().eq(index).html() == newItem) { + const linkedId = $("#current-charges-holder").children().eq(index).data("link"); + $(".current-charges-tag").filter(`[data-link="${linkedId}"]`).remove(); + stop = true; + } + } + }); + + const CurrRfine = $(".fine-recommended-amount").filter(`[data-id="${cid}"]`).val(); + const NewFine = +CurrRfine - Fine; + $(".fine-recommended-amount").filter(`[data-id="${cid}"]`).val(NewFine); + + const CurrRsentence = $(".sentence-recommended-amount").filter(`[data-id="${cid}"]`).val(); + const NewSentence = +CurrRsentence - +Sentence; + $(".sentence-recommended-amount").filter(`[data-id="${cid}"]`).val(NewSentence); + return false; + } + } + }); + } + } + ); + + var timeout; + $(".offenses-main-container").on("mouseenter",".offense-item",function (e) { + var descr = $(this).data("descr") + timeout = setTimeout(function() { + let args = [ + { + className: "incidents-remove-tag", + text: "Fjern tag", + info: descr, + status: "", + }, + ]; + openChargesContextMenu(e, args); + }, 500); + }); + + $(".offenses-main-container").on("mouseleave",".offense-item",function (e) { + clearTimeout(timeout) + hideChargesMenu(); + }); + + $(".bolo-gallery-inner-container").on("click", ".bolo-img", function () { + if ($(this).css("filter") == "none") { + $(this).css("filter", "blur(5px)"); + } else { + $(this).css("filter", "none"); + } + }); + $(".contextmenu").on("click", ".bolo-remove-image", function () { + $(".bolo-gallery-inner-container img") + .filter("[src='" + $(this).data("info") + "']") + .remove(); + }); + $(".bolo-gallery-inner-container").on( + "contextmenu", + ".bolo-img", + function (e) { + let args = [ + { + className: "bolo-remove-image", + icon: "fas fa-times", + text: "Fjern billede", + info: $(this).attr("src"), + status: "", + }, + { + className: "expand-image", + icon: "fas fa-expand", + text: "Udvid billede", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + { + className: "copy-image-link", + icon: "fa-regular fa-copy", + text: "Kopier link", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + ]; + openContextMenu(e, args); + } + ); + + $(".officers-add-btn").click(function () { + document.addEventListener("mouseup", onMouseDownIncidents); + const source = "bolos-officers"; + $(".incidents-person-search-holder").attr("data-source", source); + $(".incidents-person-search-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + }); + + $(".incidents-ghost-holder").on( + "click", + ".associated-incidents-user-tag", + function () { + if ($(this).hasClass("red-tag")) { + $(this).removeClass("red-tag"); + $(this).addClass("green-tag"); + if ($(this).text() == "Associated") { + $(".associated-incidents-user-holder") + .filter(`[data-name="${$(this).data("id")}"]`) + .css("display", "none"); + $(".associated-incidents-fine-input") + .filter(`[data-id="${$(this).data("id")}"]`) + .css("display", "none"); + $(".manage-incidents-title-tag") + .filter(`[data-id="${$(this).data("id")}"]`) + .css("display", "none"); + $(".associated-incidents-sentence-input") + .filter(`[data-id="${$(this).data("id")}"]`) + .css("display", "none"); + $(".associated-incidents-controls") + .filter(`[data-id="${$(this).data("id")}"]`) + .css("display", "none"); + } + } else { + $(this).removeClass("green-tag"); + $(this).addClass("red-tag"); + if ($(this).text() == "Associated") { + $(".associated-incidents-user-holder") + .filter(`[data-name="${$(this).data("id")}"]`) + .fadeIn(100); + $(".associated-incidents-fine-input") + .filter(`[data-id="${$(this).data("id")}"]`) + .fadeIn(100); + $(".manage-incidents-title-tag") + .filter(`[data-id="${$(this).data("id")}"]`) + .fadeIn(100); + $(".associated-incidents-sentence-input") + .filter(`[data-id="${$(this).data("id")}"]`) + .fadeIn(100); + $(".associated-incidents-controls") + .filter(`[data-id="${$(this).data("id")}"]`) + .fadeIn(100); + } + } + } + ); + + $('.incidents-ghost-holder').on('click', '#jail-button', function() { + // Get the current sentence and recommended sentence values + const citizenId = $(this).data("id"); + const sentence = $(".sentence-amount").filter(`[data-id=${citizenId}]`).val(); + const recommendSentence = $(".sentence-recommended-amount").filter(`[data-id=${citizenId}]`).val(); + sendToJail(citizenId, sentence, recommendSentence); + }); + + $('.incidents-ghost-holder').on('click', '#fine-button', function() { + // Get the current fine and recommended fine values + const citizenId = $(this).data("id"); + const fine = $(".fine-amount").filter(`[data-id=${citizenId}]`).val(); + const recommendFine = $(".fine-recommended-amount").filter(`[data-id=${citizenId}]`).val(); + const incidentId = $(".manage-incidents-editing-title").data("id"); + sendFine(citizenId, fine, recommendFine, incidentId); + }); + + $('.incidents-ghost-holder').on('click', '#community-service-button', function() { + // Get the current sentence and recommended sentence values + const citizenId = $(this).data("id"); + const sentence = $(".sentence-amount").filter(`[data-id=${citizenId}]`).val(); + const recommendSentence = $(".sentence-recommended-amount").filter(`[data-id=${citizenId}]`).val(); + sendToCommunityService(citizenId, sentence, recommendSentence); + }); + + $(".contextmenu").on( + "click", + ".associated-incidents-remove-tag", + function () { + $( + `.associated-incidents-tag:contains(${$(this).data("info")})` + ).remove(); + $( + `.associated-incidents-user-title:contains(${$(this).data( + "info" + )})` + ) + .parent() + .remove(); + const incidentId = $(".manage-incidents-editing-title").data("id"); + if (incidentId != 0) { + $.post( + `https://${GetParentResourceName()}/removeIncidentCriminal`, + JSON.stringify({ + cid: $(this).data("status"), + incidentId: incidentId, + }) + ); + } + } + ); + $(".associated-incidents-tags-holder").on( + "contextmenu", + ".associated-incidents-tag", + function (e) { + let args = [ + { + className: "associated-incidents-remove-tag", + icon: "fas fa-times", + text: "Fjern tag", + info: $(this).html(), + status: $(this).data("id"), + }, + ]; + openContextMenu(e, args); + } + ); + + // On click of the search item, it populates the results in the correct area that the search component was triggered from + $(".incidents-person-search-holder").on( + "click", + ".incidents-person-search-item", + function () { + $(".incidents-person-search-container").fadeOut(250); + $(".close-all").css("filter", "none"); + + // This is the source element where we triggered the search component to open from + // It is the area where we want the results to populate when we click on a search result + const sourceElement = $(".incidents-person-search-holder").data("source"); + + // Populate the tags for the given section that corresponds to the sourceElement + if (sourceElement === "incidents-civilians") { + $(".manage-incidents-civilians-holder").append( + `
${$(this).data("name")}
` + ); + } else if (sourceElement === "incidents-officers") { + $(".manage-incidents-officers-holder").append( + `
(${$(this).data("callsign")}) ${$(this).data("name")}
` + ); + } else if (sourceElement === "reports-civilians") { + $(".reports-civilians-tags-holder").append( + `
${$(this).data("name")}
` + ); + } else if (sourceElement === "reports-officers") { + $(".reports-officers-tags-holder").append( + `
(${$(this).data("callsign")}) ${$(this).data("name")}
` + ); + } else if (sourceElement === "bolos-officers") { + $(".manage-officers-tags-holder").append( + `
(${$(this).data("callsign")}) ${$(this).data("name")}
` + ); + } else if(sourceElement === "associated-incidents-tags") { + $(".associated-incidents-tags-holder").prepend( + `
${$(this).data("name")}
` + ); + + // This section handles populating the fields when you add a new associated user to the incident + $(".incidents-ghost-holder").prepend( + ` +
+
${$(this).data("info")}
+
+
Kendelser
+
Skyldig
+
Behandlet
+
Indblandede
+
+
Højreklik fornede for at tilføje/ændre sigtelser
+
+
Anbefalet bøde
+
+
Anbefalet dom
+
+
Bøde
+
+
Straf
+
+
+
Fængsel
+
Bøde
+ ${canSendToCommunityService ? `
Community Service
` : ''} +
+
+ ` + ); + } + + // Clear the search results and source + $(".incidents-person-search-holder").removeData("source"); // Without using this line, we end up reading stale data from the data-source attribute rather than the data-source from the field we clicked on + $(".incidents-person-search-holder").empty(); // Clear the search results + $('.incidents-person-search-name-input').val(''); // Reset the search input field + } + ); + + $(".contextmenu").on("click", ".incidents-remove-tag", function () { + $(`.tag:contains(${$(this).data("info")})`).remove(); + }); + + $(".manage-incidents-tags-holder").on("contextmenu", ".tag", function (e) { + let args = [ + { + className: "incidents-remove-tag", + icon: "fas fa-times", + text: "Fjern tag", + info: $(this).html(), + status: "", + }, + ]; + openContextMenu(e, args); + }); + + $(".contextmenu").on("click", ".remove-tag", function () { + $( + `.tag:contains(${$(this).data("info")})` + ).remove(); + }); + + // Setup the remove tag context menu for each holder section + const holdersSelectors = [".manage-incidents-civilians-holder", ".manage-incidents-officers-holder", ".reports-civilians-tags-holder", ".reports-officers-tags-holder", ".manage-officers-tags-holder"]; + holdersSelectors.forEach(holder => { + $(holder).on( + "contextmenu", + ".tag", + function (e) { + let args = [ + { + className: "remove-tag", + icon: "fas fa-times", + text: "Fjern tag", + info: $(this).html(), + status: "", + }, + ]; + openContextMenu(e, args); + }); + }); + + $(".incidents-search-refresh").click(function () { + if (canRefreshIncidents == true) { + canRefreshIncidents = false; + $(".incidents-search-refresh").empty(); + $(".incidents-search-refresh").prepend( + `` + ); + setTimeout(() => { + $(".incidents-search-refresh").empty(); + $(".incidents-search-refresh").html("Genindlæs"); + canRefreshIncidents = true; + $.post(`https://${GetParentResourceName()}/getAllIncidents`, JSON.stringify({})); + }, 1500); + } + }); + + $(".contextmenu").on("click", ".incidents-remove-normal-tag", function () { + $(`.tag:contains(${$(this).data("info")})`).remove(); + let cid = $(".manage-profile-citizenid-input").val(); + if (cid) { + $.post( + `https://${GetParentResourceName()}/removeProfileTag`, + JSON.stringify({ + cid: cid, + text: $(this).data("info"), + }) + ); + } + }); + $(".tags-holder").on("contextmenu", ".tag", function (e) { + let args = [ + { + className: "incidents-remove-normal-tag", + icon: "fas fa-times", + text: "Fjern tag", + info: $(this).html(), + status: "", + }, + ]; + openContextMenu(e, args); + }); + + $(".reports-search-title").click(function () { + if (canSearchReports == true) { + if ($(".reports-search-input").css("display") == "none") { + $(".reports-search-input").slideDown(250); + $(".reports-search-input").css("display", "block"); + } else { + $(".reports-search-input").slideUp(250); + setTimeout(() => { + $(".reports-search-input").css("display", "none"); + }, 250); + } + } + }); + $(".incidents-person-search-container").hover( + function () { + mouse_is_inside = true; + }, + function () { + mouse_is_inside = false; + } + ); + + $(".convictions-known-container").hover( + function () { + mouse_is_inside = true; + }, + function () { + mouse_is_inside = false; + } + ); + + $(".incidents-known-container").hover( + function () { + mouse_is_inside = true; + }, + function () { + mouse_is_inside = false; + } + ); + + $(".reports-search-refresh").click(function () { + if (canRefreshReports == true) { + canRefreshReports = false; + $(".reports-search-refresh").empty(); + $(".reports-search-refresh").prepend( + `` + ); + setTimeout(() => { + $(".reports-search-refresh").empty(); + $(".reports-search-refresh").html("Genindlæs"); + canRefreshReports = true; + $.post(`https://${GetParentResourceName()}/getAllReports`, JSON.stringify({})); + }, 1500); + } + }); + + $(".dispatch-comms-refresh").click(function () { + $(".dispatch-comms-refresh").empty(); + $(".dispatch-comms-refresh").prepend( + `` + ); + setTimeout(() => { + $(".dispatch-comms-refresh").empty(); + $(".dispatch-comms-refresh").html("Genindlæs"); + canRefreshReports = true; + $.post(`https://${GetParentResourceName()}/refreshDispatchMsgs`, JSON.stringify({})); + }, 1500); + }); + + $(".reports-items").on("click", ".reports-item", function () { + if (currentTab != ".reports-page-container") { + fidgetSpinner(".reports-page-container"); + currentTab = ".reports-page-container"; + } + + if ($(".manage-reports-tags-add-btn").hasClass("fa-minus")) { + $(".manage-reports-tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + if ($(".reports-gallery-add-btn").hasClass("fa-minus")) { + $(".reports-gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + + if ($(".reports-gallery-upload-input").css("display") == "block") { + $(".reports-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".reports-gallery-upload-input").css("display", "none"); + }, 250); + } + + canInputTag = true; + canInputReportTag = true; + canInputReportOfficerTag = true; + let id = $(this).data("id"); + $.post( + `https://${GetParentResourceName()}/getReportData`, + JSON.stringify({ + id: id, + }) + ); + }); + + $(".manage-reports-tags-add-btn").click(function () { + if (canInputReportTag) { + $(this).removeClass("fa-plus").addClass("fa-minus"); + $(".manage-reports-tags-holder").prepend( + `` + ); + canInputReportTag = false; + } else if (!canInputReportTag) { + $(this).removeClass("fa-minus").addClass("fa-plus"); + $(".tag-reports-input").remove(); + canInputReportTag = true; + } + }); + + $(".manage-reports-tags-holder").on( + "keydown", + ".tag-reports-input", + function (e) { + if (e.keyCode === 13) { + $(".manage-reports-tags-holder").prepend( + `
${$(".tag-reports-input").text()}
` + ); + // Have it save instantly if it's an existing report. + if ($(".manage-reports-tags-add-btn").hasClass("fa-minus")) { + $(".manage-reports-tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + $(".tag-reports-input").remove(); + canInputReportTag = true; + } + } + ); + + $(".reports-gallery-add-btn").click(function () { + //if ($(".manage-profile-citizenid-input").val()) { + if ($(".reports-gallery-upload-input").css("display") == "none") { + $(".reports-gallery-upload-input").slideDown(250); + $(".reports-gallery-upload-input").css("display", "block"); + $(this).removeClass("fa-plus").addClass("fa-minus"); + } else { + $(".reports-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".reports-gallery-upload-input").css("display", "none"); + }, 250); + $(this).removeClass("fa-minus").addClass("fa-plus"); + } + //} else { + // $(this).effect("shake", { times: 2, distance: 2 }, 500) + // } + }); + + $("#reports-gallery-upload-input").keydown(function (e) { + if (e.keyCode === 13) { + let URL = $("#reports-gallery-upload-input").val(); + let cid = $(".manage-profile-citizenid-input").val(); + if (URL !== "") { + let randomNum = Math.ceil(Math.random() * 10).toString(); + $(".reports-gallery-inner-container").prepend( + `` + ); + $("#reports-gallery-upload-input").val(""); + $(".reports-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".reports-gallery-upload-input").css("display", "none"); + }, 250); + $(".reports-gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + } + }); + + $(".reports-gallery-inner-container").on( + "click", + ".reports-img", + function () { + if ($(this).css("filter") == "none") { + $(this).css("filter", "blur(5px)"); + } else { + $(this).css("filter", "none"); + } + } + ); + $(".contextmenu").on("click", ".reports-remove-image", function () { + $(".reports-gallery-inner-container img") + .filter("[src='" + $(this).data("info") + "']") + .remove(); + }); + + $(".reports-gallery-inner-container").on( + "contextmenu", + ".reports-img", + function (e) { + let args = [ + { + className: "reports-remove-image", + icon: "fas fa-times", + text: "Fjern billede", + info: $(this).attr("src"), + status: "", + }, + { + className: "expand-image", + icon: "fas fa-expand", + text: "Udvid billede", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + { + className: "copy-image-link", + icon: "fa-regular fa-copy", + text: "Kopier link", + info: $(this).attr("src"), + status: $(this).css("filter"), + }, + ]; + openContextMenu(e, args); + } + ); + + $(".reports-officers-add-btn").click(function () { + const source = "reports-officers"; + document.addEventListener("mouseup", onMouseDownIncidents); + $(".incidents-person-search-holder").attr("data-source", source); + $(".incidents-person-search-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + }); + + $(".reports-civilians-add-btn").click(function () { + document.addEventListener("mouseup", onMouseDownIncidents); + const source = "reports-civilians"; + $(".incidents-person-search-holder").attr("data-source", source); + $(".incidents-person-search-container").fadeIn(250); // makes the container visible + $(".close-all").css("filter", "brightness(15%)"); + }); + + $(".manage-reports-title-holder").on( + "click", + ".manage-reports-new", + function () { + let template = ""; + if ($(".badge-logo").attr("src") == "img/ems_badge.webp") { + template = ` +
+

Sendt på intensiv?: [Ja/Nej]

+

Hændelsesrapport:

+

· [ Kort opsumering af hvad der er sket på stedet. Noter gerne ting der stod ud, samt hvilken behandling der er givet til patienten ]

+

Liste over skader:

+

· [ Skriv skader her ]

+

Lægerapport:

+

· [ Fuld rapport over hvad der skete under behandling, komplikationer eller andre fund. Hvem var tilstede, hvad lavede de. Skriv patientens tilstand ved lukning af rapport. ]

+

-----

+

Tilstede:

+

· [ Personer tilstede ]

+

Medicin anvendt:

+

· [ Skriv alt medicin-brug her, også medicin udskrevet til patienten senere ]

+

-----

+
+

Noter:

+

[ Skriv noter her ]

+
+`;} + $(".manage-reports-editing-title").html( + "Du skriver en ny rapport" + ); + $(".manage-reports-input-title").val(""); + $(".manage-reports-input-type").val(""); + $(".manage-reports-reports-content").trumbowyg({ + changeActiveDropdownIcon: true, + imageWidthModalEdit: true, + btns: [ + ['foreColor', 'backColor','fontfamily','fontsize','indent', 'outdent'], + ['strong', 'em',], ['insertImage'], + ['viewHTML'], + ['undo', 'redo'], + ['formatting'], + ['superscript', 'subscript'], + ['link'], + ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'], + ['horizontalRule'] + ], + }); + $(".manage-reports-reports-content").trumbowyg('html', template); + $(".manage-reports-tags-holder").empty(); + $(".reports-gallery-inner-container").empty(); + $(".reports-officers-tags-holder").empty(); + $(".reports-civilians-tags-holder").empty(); + + if ($(".manage-reports-tags-add-btn").hasClass("fa-minus")) { + $(".manage-reports-tags-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + if ($(".reports-gallery-add-btn").hasClass("fa-minus")) { + $(".reports-gallery-add-btn") + .removeClass("fa-minus") + .addClass("fa-plus"); + } + + if ($(".reports-gallery-upload-input").css("display") == "block") { + $(".reports-gallery-upload-input").slideUp(250); + setTimeout(() => { + $(".reports-gallery-upload-input").css("display", "none"); + }, 250); + } + + canInputTag = true; + canInputReportTag = true; + canInputReportOfficerTag = true; + + $(".tag-reports-input").remove(); + canInputReportTag = true; + + //} + } + ); + + $("#reports-search-input").keydown(function (e) { + if (e.keyCode === 13 && canSearchForReports == true) { + let name = $(this).val(); + if (name !== "") { + canSearchForReports = false; + $.post( + `https://${GetParentResourceName()}/searchReports`, + JSON.stringify({ + name: name, + }) + ); + $(".reports-items").empty(); + $(".reports-items").prepend( + `
` + ); + } + } + }); + + $(".manage-reports-title-holder").on( + "click", + ".manage-reports-save", + function () { + let existing = !( + $(".manage-reports-editing-title").html() == + "Du skriver en ny rapport" + ); + let id = $(".manage-reports-editing-title").data("id"); + let title = $("#reporttitle").val(); + let type = $("#reporttype").val(); + let details = $("#reportdetail").val(); + let tags = new Array(); + let gallery = new Array(); + let officers = new Array(); + let civilians = new Array(); + + $(".manage-reports-tags-holder") + .find("div") + .each(function () { + if ($(this).text() != "") { + tags.push($(this).text()); + } + }); + + $(".reports-gallery-inner-container") + .find("img") + .each(function () { + if ($(this).attr("src") != "") { + gallery.push($(this).attr("src")); + } + }); + + $(".reports-officers-tags-holder") + .find("div") + .each(function () { + if ($(this).text() != "") { + officers.push($(this).text()); + } + }); + + $(".reports-civilians-tags-holder") + .find("div") + .each(function () { + if ($(this).text() != "") { + civilians.push($(this).text()); + } + }); + + let time = new Date(); + + $.post( + `https://${GetParentResourceName()}/newReport`, + JSON.stringify({ + existing: existing, + id: id, + title: title, + type: type, + details: details, + tags: tags, + gallery: gallery, + officers: officers, + civilians: civilians, + time: time.getTime(), + }) + ); + } + ); + + $(".dmv-search-title").click(function () { + if (canSearchForVehicles == true) { + if ($(".dmv-search-input").css("display") == "none") { + $(".dmv-search-input").slideDown(250); + $(".dmv-search-input").css("display", "block"); + } else { + $(".dmv-search-input").slideUp(250); + setTimeout(() => { + $(".dmv-search-input").css("display", "none"); + }, 250); + } + } + }); + + $("#dmv-search-input").keydown(async function (e) { + if (e.keyCode === 13 && canSearchForVehicles == true) { + let name = $("#dmv-search-input").val(); + if (name !== "") { + canSearchForVehicles = false; + $(".dmv-items").empty(); + $(".dmv-items").prepend(`
`); + + let result = await $.post( + `https://${GetParentResourceName()}/searchVehicles`, + JSON.stringify({ + name: name, + }) + ); + if (result.length === 0) { + $(".dmv-items").html( + ` +
+ +
+
+
Intet køretøj matcher beskrivelsen
+
+
+
+
+
+ ` + ); + canSearchForVehicles = true; + return true; + } + $(".dmv-items").empty(); + + let vehicleHTML = ""; + + result.forEach((value) => { + let paint = value.color; + let impound = "red-tag"; + let bolo = "red-tag"; + let codefive = "red-tag"; + let stolen = "red-tag"; + + if (value.state == 'Impounded') { + impound = "green-tag"; + } + + if (value.bolo) { + bolo = "green-tag"; + } + + if (value.code) { + codefive = "green-tag"; + } + + if (value.stolen) { + stolen = "green-tag"; + } + + vehicleHTML += ` +
+ +
+
+
${value.model}
+
+
${value.colorName}
+
Beslaglagt
+
Efterlysning
+
Stjålet
+
Kode 5
+
+
+
+
Nummerplade: ${value.plate} · Ejer: ${value.owner}
+
+
+
+ `; + }); + + $(".dmv-items").html(vehicleHTML); + + canSearchForVehicles = true; + + } + } + }); + + $(".dmv-items").on("click", ".dmv-item", function () { + $.post( + `https://${GetParentResourceName()}/getVehicleData`, + JSON.stringify({ + plate: $(this).data("plate"), + }) + ); + }); + + $(".vehicle-information-title-holder").on( + "click", + ".vehicle-information-save", + function () { + if (canSaveVehicle) { + canSaveVehicle = false; + $(".vehicle-information-save").empty(); + $(".vehicle-information-save").prepend( + `` + ); + setTimeout(() => { + $(".vehicle-information-save").empty(); + $(".vehicle-information-save").html("Gem"); + canSaveVehicle = true; + }, 750); + setTimeout(() => { + let dbid = $(".vehicle-information-title-holder").data("dbid"); + let plate = $(".vehicle-info-plate-input").val(); + let notes = $(".vehicle-info-content").val(); + let points = $("#vehiclePointsSlider").val(); + + let imageurl = $(".vehicle-info-image").attr("src"); + let newImageurl = $(".vehicle-info-imageurl-input").val(); + if (newImageurl.includes("base64")) { + imageurl = "img/not-found.webp"; + } else { + imageurl = newImageurl; + } + + let code5 = false; + let code5tag = $(".vehicle-tags").find(".code5-tag"); + if (code5tag.hasClass("green-tag")) { + code5 = true + } + + let stolen = false; + let stolentag = $(".vehicle-tags").find(".stolen-tag"); + if (stolentag.hasClass("green-tag")) { + stolen = true + } + + let impoundInfo = {} + impoundInfo.impoundActive = $(".vehicle-tags").find(".impound-tag").hasClass("green-tag") + impoundInfo.impoundChanged = impoundChanged + if (impoundChanged === true) { + if (impoundInfo.impoundActive === true) { + impoundInfo.plate = $(".impound-plate").val(); + impoundInfo.linkedreport = $(".impound-linkedreport").val(); + impoundInfo.fee = $(".impound-fee").val(); + impoundInfo.time = $(".impound-time").val(); + } + } + + $.post( + `https://${GetParentResourceName()}/saveVehicleInfo`, + JSON.stringify({ + dbid: dbid, + plate: plate, + imageurl: imageurl, + notes: notes, + stolen: stolen, + code5: code5, + impound: impoundInfo, + points: points, + }) + ); + + impoundChanged = false; + $(".vehicle-info-image").attr("src", newImageurl); + }, 250); + } + } + ); + + $(".contextmenu").on("click", ".mark-code-5", function () { + let tag = $(".vehicle-tags").find(".code5-tag"); + if (tag.hasClass("red-tag")) { + tag.removeClass("red-tag").addClass("green-tag"); + } + }); + + $(".contextmenu").on("click", ".remove-code-5", function () { + let tag = $(".vehicle-tags").find(".code5-tag"); + if (tag.hasClass("green-tag")) { + tag.removeClass("green-tag").addClass("red-tag"); + } + }); + + $(".vehicle-tags").on("contextmenu", ".code5-tag", function (e) { + let plate = $(".vehicle-info-plate-input").val(); + if (plate) { + let args = []; + if ($(this).hasClass("red-tag")) { + args = [ + { + className: "mark-code-5", + icon: "fas fa-check", + text: "Marker som kode 5", + info: plate, + status: "", + }, + ]; + } else { + args = [ + { + className: "remove-code-5", + icon: "fas fa-times", + text: "Fjern kode 5 status", + info: plate, + status: "", + }, + ]; + } + + openContextMenu(e, args); + } + }); + + $(".contextmenu").on("click", ".mark-stolen", function () { + let tag = $(".vehicle-tags").find(".stolen-tag"); + if (tag.hasClass("red-tag")) { + tag.removeClass("red-tag").addClass("green-tag"); + } + }); + + $(".contextmenu").on("click", ".remove-stolen", function () { + let tag = $(".vehicle-tags").find(".stolen-tag"); + if (tag.hasClass("green-tag")) { + tag.removeClass("green-tag").addClass("red-tag"); + } + }); + + $(".vehicle-tags").on("contextmenu", ".stolen-tag", function (e) { + let plate = $(".vehicle-info-plate-input").val(); + if (plate) { + let args = []; + if ($(this).hasClass("red-tag")) { + args = [ + { + className: "mark-stolen", + icon: "fas fa-check", + text: "Marker som stjålet", + info: plate, + status: "", + }, + ]; + } else { + args = [ + { + className: "remove-stolen", + icon: "fas fa-times", + text: "Fjern stjålet status", + info: plate, + status: "", + }, + ]; + } + + openContextMenu(e, args); + } + }); + + $(".contextmenu").on("click", ".impound-vehicle", function () { + const plate = $(this).data("info"); + $(".impound-linkedreport").val("").removeAttr("disabled"); + $(".impound-fee").val("").removeAttr("disabled"); + $(".impound-time").val("").removeAttr("disabled"); + $(".impound-fee").css("color", "white"); + $(".impound-cancel").html("Annuller"); + $(".impound-submit").fadeIn(250); + $(".impound-form").slideDown(250); + $(".impound-form").fadeIn(250); + $(".impound-form").data("plate", plate); + $(".impound-plate").val(plate); + }); + + $(".impound-submit").click(function () { + const plate = $(".impound-plate").val(); + const linkedreport = $(".impound-linkedreport").val(); + const fee = $(".impound-fee").val(); + const time = $(".impound-time").val(); + + if (!plate || plate === "") { + $(".impound-form").css("border", "1px solid rgb(184, 3, 3)"); + setTimeout(() => { + $(".impound-form").css( + "border", + "1px solid rgb(168, 168, 168)" + ); + }, 500); + return; + } + + if (!linkedreport || linkedreport === "") { + $(".impound-form").css("border", "1px solid rgb(184, 3, 3)"); + setTimeout(() => { + $(".impound-form").css( + "border", + "1px solid rgb(168, 168, 168)" + ); + }, 500); + return; + } + + if (!fee || fee === "") { + $(".impound-form").css("border", "1px solid rgb(184, 3, 3)"); + setTimeout(() => { + $(".impound-form").css( + "border", + "1px solid rgb(168, 168, 168)" + ); + }, 500); + return; + } + + if (!time || time === "") { + $(".impound-form").css("border", "1px solid rgb(184, 3, 3)"); + setTimeout(() => { + $(".impound-form").css( + "border", + "1px solid rgb(168, 168, 168)" + ); + }, 500); + return; + } + + /* $.post( + `https://${GetParentResourceName()}/impoundVehicle`, + JSON.stringify({ + plate: plate, + linkedreport: linkedreport, + fee: fee, + time: time, + }) + ); */ + + //$(".impound-plate").val(""); + //$(".impound-linkedreport").val(""); + //$(".impound-fee").val(""); + //$(".impound-time").val(""); + //$(".impound-fee").css("color", "white"); + + $(".vehicle-tags").find(".impound-tag").addClass("green-tag").removeClass("red-tag"); + + $(".impound-form").slideUp(250); + $(".impound-form").fadeOut(250); + impoundChanged = true; + }); + + $(".impound-cancel").click(function () { + $(".impound-form").slideUp(250); + $(".impound-form").fadeOut(250); + + $(".impound-plate").val(""); + $(".impound-linkedreport").val(""); + $(".impound-fee").val(""); + $(".impound-time").val(""); + $(".impound-fee").css("color", "white"); + }); + + $(".contextmenu").on("click", ".remove-impound", function () { + const plate = $(this).data("info"); + /* $.post( + `https://${GetParentResourceName()}/removeImpound`, + JSON.stringify({ + plate: plate, + }) + ); */ + $(".impound-plate").val(""); + $(".impound-linkedreport").val(""); + $(".impound-fee").val(""); + $(".impound-time").val(""); + impoundChanged = true; + + $(".vehicle-tags") + .find(".impound-tag") + .addClass("red-tag") + .removeClass("green-tag"); + }); + + $(".contextmenu").on("click", ".status-impound", function () { + const plate = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/statusImpound`, + JSON.stringify({ + plate: plate, + }) + ); + }); + + $(".vehicle-tags").on("contextmenu", ".impound-tag", function (e) { + let plate = $(".vehicle-info-plate-input").val(); + if (plate) { + let args = []; + if ($(this).hasClass("red-tag")) { + args = [ + { + className: "impound-vehicle", + icon: "fas fa-check", + text: "Beslaglæg", + info: plate, + status: "", + }, + ]; + } else { + args = [ + { + className: "remove-impound", + icon: "fas fa-times", + text: "Giv tilbage", + info: plate, + status: "", + }, + { + className: "status-impound", + icon: "fas fa-info-circle", + text: "Vis status", + info: plate, + status: "", + }, + ]; + } + openContextMenu(e, args); + } + }); + + + $(".calls-search-title").click(function () { + if (canSearchForProfiles == true) { + if ($(".calls-search-input").css("display") == "none") { + $(".calls-search-input").slideDown(250); + $(".calls-search-input").css("display", "block"); + } else { + $(".calls-search-input").slideUp(250); + setTimeout(() => { + $(".calls-search-input").css("display", "none"); + }, 250); + } + } + }); + + $("#calls-search-input").keydown(function (e) { + if (e.keyCode === 13) { + let searchCall = $("#calls-search-input").val(); + if (searchCall !== "") { + $.post( + `https://${GetParentResourceName()}/searchCalls`, + JSON.stringify({ + searchCall: searchCall, + }) + ); + $(".calls-items").empty(); + $(".calls-items").prepend(`
`); + } + } + }); + + $(".weapons-search-title").click(function () { + if (canSearchForWeapons == true) { + if ($(".weapons-search-input").css("display") == "none") { + $(".weapons-search-input").slideDown(250); + $(".weapons-search-input").css("display", "block"); + } else { + $(".weapons-search-input").slideUp(250); + setTimeout(() => { + $(".weapons-search-input").css("display", "none"); + }, 250); + } + } + }); + + $("#weapons-search-input").keydown(async function (e) { + if (e.keyCode === 13 && canSearchForWeapons == true) { + let name = $("#weapons-search-input").val(); + if (name !== "") { + canSearchForWeapons = false; + $(".weapons-items").empty(); + $(".weapons-items").prepend(`
`); + + let result = await $.post( + `https://${GetParentResourceName()}/searchWeapons`, + JSON.stringify({ + name: name, + }) + ); + if (result.length === 0) { + $(".weapons-items").html( + ` +
+ +
+
+
Intet våben matcher beskrivelsen
+
+
+
+
+
+ ` + ); + canSearchForWeapons = true; + return true; + } + $(".weapons-items").empty(); + + let weaponHTML = ""; + + result.forEach((value) => { + weaponHTML += ` +
+ +
+
+
${value.weapModel} - Klasse ${value.weapClass}
+ +
+
+
Serienumer: ${value.serial} · Ejer: ${value.owner} · ID: ${value.id}
+
+
+
+ `; + }); + + $(".weapons-items").html(weaponHTML); + + canSearchForWeapons = true; + } + } + }); + + $(".weapon-information-title-holder").on("click", ".weapon-information-new", function () { + $(".weapon-information-title-holder").data("dbid", 0); + $(".weapon-info-serial-input").val(""); + $(".weapon-info-owner-input").val(""); + $(".weapon-info-class-input").val(""); + $(".weapon-info-model-input").val(""); + $(".weapon-info-imageurl-input").val("img/not-found.webp"); + + canSaveWeapon = true; + } +); + + $(".weapon-information-title-holder").on("click", ".weapon-information-save", function () { + if (canSaveProfile == true) { + canSaveProfile = false; + $(".manage-profile-save").empty(); + $(".manage-profile-save").prepend( + `` + ); + setTimeout(() => { + $(".manage-profile-save").empty(); + $(".manage-profile-save").html("Gem"); + canSaveProfile = true; + }, 750); + + setTimeout(() => { + let serial = $(".weapon-info-serial-input").val(); + let notes = $(".weapon-info-content").val(); + let owner = $(".weapon-info-owner-input").val(); + let weapClass = $(".weapon-info-class-input").val(); + let weapModel = $(".weapon-info-model-input").val(); + + let imageurl = $(".weapon-info-image").attr("src"); + let newImageurl = $(".weapon-info-imageurl-input").val(); + if (newImageurl.includes("base64")) { + imageurl = "img/not-found.webp"; + } else { + imageurl = newImageurl; + } + + $.post( + `https://${GetParentResourceName()}/saveWeaponInfo`, + JSON.stringify({ + serial: serial, + imageurl: imageurl, + notes: notes, + owner: owner, + weapClass: weapClass, + weapModel: weapModel, + }) + ); + + $(".weapon-info-image").attr("src", newImageurl); + }, 250); + } + } +); + + $(".weapons-items").on("click", ".weapons-item", function () { + $.post( + `https://${GetParentResourceName()}/getWeaponData`, + JSON.stringify({ + serial: $(this).data("serial"), + }) + ); + }); + + $(".contextmenu").on("click", ".view-profile", async function () { + const cid = $(this).data("info"); + fidgetSpinner(".profile-page-container"); + currentTab = ".profile-page-container"; + $(".profile-search-input").slideDown(250); + $(".profile-search-input").css("display", "block"); + $("#profile-search-input:text").val(cid.toString()); + canSearchForProfiles = false; + let result = await $.post( + `https://${GetParentResourceName()}/searchProfiles`, + JSON.stringify({ + name: cid, + }) + ); + + searchProfilesResults(result); + }); + + $(".contextmenu").on("click", ".view-incident2", function () { + const incidentId = $(this).data("info"); + fidgetSpinner(".incidents-page-container"); + currentTab = ".incidents-page-container"; + $(".close-all").css("filter", "none"); + $(".incidents-known-container").fadeOut(250); + setTimeout(() => { + $(".incidents-search-input").slideDown(250); + $(".incidents-search-input").css("display", "block"); + setTimeout(() => { + $("#incidents-search-input:text").val(incidentId.toString()); + canSearchForProfiles = false; + $.post( + `https://${GetParentResourceName()}/searchIncidents`, + JSON.stringify({ + incident: incidentId.toString(), + }) + ); + $(".incidents-items").empty(); + $(".incidents-items").prepend( + `
` + ); + setTimeout(() => { + $.post( + `https://${GetParentResourceName()}/getIncidentData`, + JSON.stringify({ + id: incidentId.toString(), + }) + ); + }, 250); + }, 250); + }, 250); + }); + $(".profile-incidents-holder").on("contextmenu", ".white-tag", function (e) { + const args = [ + { + className: "view-incident2", + icon: "fas fa-search", + text: `Se hændelse #${$(this).data("id")}`, + info: $(this).data("id"), + status: "", + }, + ]; + openContextMenu(e, args); + }); + + $(".contextmenu").on("click", ".view-incident", function () { + const incidentId = $(this).data("info"); + fidgetSpinner(".incidents-page-container"); + currentTab = ".incidents-page-container"; + setTimeout(() => { + $(".incidents-search-input").slideDown(250); + $(".incidents-search-input").css("display", "block"); + setTimeout(() => { + $(".close-all").css("filter", "none"); + $("#incidents-search-input:text").val(incidentId.toString()); + canSearchForProfiles = false; + $.post( + `https://${GetParentResourceName()}/searchIncidents`, + JSON.stringify({ + incident: incidentId.toString(), + }) + ); + $(".incidents-items").empty(); + $(".incidents-items").prepend( + `
` + ); + setTimeout(() => { + $.post( + `https://${GetParentResourceName()}/getIncidentData`, + JSON.stringify({ + id: incidentId.toString(), + }) + ); + }, 250); + }, 250); + }, 250); + }); + $(".warrants-items").on("contextmenu", ".warrants-item", function (e) { + //let information = $(this).html() + //if (information) { + args = [ + { + className: "view-profile", + icon: "far fa-eye", + text: "Se profil", + info: $(this).data("cid"), + status: "", + }, + { + className: "view-incident", + icon: "fas fa-search", + text: `Se hændelse #${$(this).data("id")}`, + info: $(this).data("id"), + status: "", + }, + ]; + openContextMenu(e, args); + //} + }); + + $(".contextmenu").on("click", ".toggle-duty", function () { + let info = $(this).data("info"); + let currentStatus = $(`[data-id="${info}"]`) + .find(".unit-status") + .html(); + if (currentStatus == "10-8") { + $(`[data-id="${info}"]`).find(".unit-status").html("10-7"); + $(`[data-id="${info}"]`) + .find(".unit-status") + .removeClass("green-status") + .addClass("yellow-status"); + $.post( + `https://${GetParentResourceName()}/toggleDuty`, + JSON.stringify({ + cid: info, + status: 0, + }) + ); + } else if (currentStatus == "10-7") { + $(`[data-id="${info}"]`).find(".unit-status").html("10-8"); + $(`[data-id="${info}"]`) + .find(".unit-status") + .removeClass("yellow-status") + .addClass("green-status"); + $.post( + `https://${GetParentResourceName()}/toggleDuty`, + JSON.stringify({ + cid: info, + status: 1, + }) + ); + } + }); + + $(".contextmenu").on("click", ".set-callsign", function () { + let info = $(this).data("info"); + $(".callsign-container").fadeIn(0); + $(".callsign-inner-container").slideDown(500); + $(".callsign-inner-container").fadeIn(500); + $(".callsign-container").data("id", info); + }); + + $(".contextmenu").on("click", ".set-radio", function () { + let info = $(this).data("info"); + $(".radio-container").fadeIn(0); + $(".radio-inner-container").slideDown(500); + $(".radio-inner-container").fadeIn(500); + $(".radio-container").data("id", info); + }); + + $(".contextmenu").on("click", ".set-waypoint", function () { + let info = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/setWaypointU`, + JSON.stringify({ + cid: info, + }) + ); + }); + + $(".active-unit-list").on("contextmenu", ".active-unit-item", function (e) { + let cid = $(this).data("id"); + if (cid) { + args = [ + { + className: "toggle-duty", + icon: "fas fa-thumbtack", + text: "Gå hjem/på arbejde", + info: cid, + status: "", + }, + { + className: "set-callsign", + icon: "far fa-id-badge", + text: "Sæt kaldetegn", + info: cid, + status: "", + }, + { + className: "set-radio", + icon: "fas fa-broadcast-tower", + text: "Sæt radiokanal", + info: cid, + status: "", + }, + { + className: "set-waypoint", + icon: "fas fa-map-marker-alt", + text: "Sæt GPS", + info: cid, + status: "", + }, + ]; + openContextMenu(e, args); + } + }); + + $(".contextmenu").on("click", ".Set-Waypoint", function () { + const callId = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/setWaypoint`, + JSON.stringify({ + callid: callId, + }) + ); + }); + + $(".contextmenu").on("click", ".call-attach", function () { + const callId = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/callAttach`, + JSON.stringify({ + callid: callId, + }) + ); + }); + + $(".contextmenu").on("click", ".call-detach", function () { + const callId = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/callDetach`, + JSON.stringify({ + callid: callId, + }) + ); + }); + + $(".contextmenu").on("click", ".remove-blip", function () { + const callId = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/removeCallBlip`, + JSON.stringify({ + callid: callId, + }) + ); + }); + + $(".contextmenu").on("click", ".attached-units", function () { + const callId = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/attachedUnits`, + JSON.stringify({ + callid: callId, + }) + ); + }); + + $("#respondcalls").keydown(function (e) { + const keyCode = e.which || e.keyCode; + if (keyCode === 13 && !e.shiftKey) { + const callid = $(".respond-calls-container").data("id"); + e.preventDefault(); + const time = new Date(); + $.post( + `https://${GetParentResourceName()}/sendCallResponse`, + JSON.stringify({ + message: $(this).val(), + time: time.getTime(), + callid: callid, + }) + ); + $(this).val(""); + } + }); + + $(".contextmenu").on("click", ".respond-call", function () { + const callId = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/getCallResponses`, + JSON.stringify({ + callid: callId, + }) + ); + /**$(".respond-calls").fadeIn(0) + $(".respond-calls-container").fadeIn(250) + $(".close-all").css("filter", "brightness(15%)"); + $("#respondcalls").val("")*/ + }); + + $('#vehiclePointsSlider').change(function(){ + var currentValue = $('#vehiclePointsSliderValue'); + currentValue.html(this.value); + }); + + + $(".active-calls-list").on( + "contextmenu", + ".active-calls-item", + function (e) { + const callId = $(this).data("id"); + const canRespond = $(this).data("canrespond"); + if (callId) { + if (canRespond == true) { + args = [ + { + className: "respond-call", + icon: "fas fa-reply", + text: "Svar på opkald", + info: callId, + status: "", + }, + { + className: "attached-units", + icon: "fas fa-link", + text: "Tilknyttede enheder", + info: callId, + status: "", + }, + { + className: "call-detach", + icon: "fas fa-sign-out-alt", + text: "Svar", + info: callId, + status: "", + }, + { + className: "call-attach", + icon: "fas fa-sign-in-alt", + text: "Respond", + info: callId, + status: "", + }, + { + className: "Set-Waypoint", + icon: "fas fa-map-marker-alt", + text: "Sæt GPS", + info: callId, + status: "", + }, + { + className: "remove-blip", + icon: "fa-solid fa-circle-minus", + text: "Fjern GPS", + info: callId, + status: "", + }, + ]; + } else if (canRespond == false) { + args = [ + { + className: "attached-units", + icon: "fas fa-link", + text: "Tilknyttede enheder", + info: callId, + status: "", + }, + { + className: "call-detach", + icon: "fas fa-sign-out-alt", + text: "Forlad", + info: callId, + status: "", + }, + { + className: "call-attach", + icon: "fas fa-sign-in-alt", + text: "Svar", + info: callId, + status: "", + }, + { + className: "Set-Waypoint", + icon: "fas fa-map-marker-alt", + text: "Sæt GPS", + info: callId, + status: "", + }, + { + className: "remove-blip", + icon: "fa-solid fa-circle-minus", + text: "Fjern GPS", + info: callId, + status: "", + }, + ]; + } + + openContextMenu(e, args); + } + } + ); + + $(".contextmenu").on("click", ".call-dispatch-detach", function () { + const cid = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/callDispatchDetach`, + JSON.stringify({ + callid: $(".dispatch-attached-units-container").attr("id"), + cid: cid, + }) + ); + $(".dispatch-attached-unit-item").filter(`[data-id="${cid}"]`).remove(); + }); + + $(".contextmenu").on("click", ".Set-Dispatch-Waypoint", function () { + const cid = $(this).data("info"); + $.post( + `https://${GetParentResourceName()}/setDispatchWaypoint`, + JSON.stringify({ + callid: $(".dispatch-attached-units-container").attr("id"), + cid: cid, + }) + ); + }); + + $(".dispatch-attached-units-holder").on( + "contextmenu", + ".dispatch-attached-unit-item", + function (e) { + const cid = $(this).data("id"); + if (cid) { + args = [ + { + className: "set-waypoint", + icon: "fas fa-map-marker-alt", + text: "Sæt GPS", + info: cid, + status: "", + }, + ]; + openContextMenu(e, args); + } + } + ); + + $(".contextmenu").on("click", ".dispatch-reply", function () { + const callsign = $(this).data("info"); + const currVal = $(".dispatch-input").val(); + if (currVal === "") { + $(".dispatch-input").val(callsign + " "); + } else { + $(".dispatch-input").val(currVal + " " + callsign + " "); + } + $(".dispatch-input").focus(); + }); + + $(".dispatch-items").on( + "contextmenu", + ".dispatch-item-message", + function (e) { + const Callsign = $(this).data("author"); + + var mySubString = Callsign.substring( + Callsign.indexOf("(") + 1, + Callsign.lastIndexOf(")") + ); + + args = [ + { + className: "dispatch-reply", + icon: "fas fa-reply", + text: "Svar", + info: mySubString, + status: "", + }, + ]; + openContextMenu(e, args); + } + ); + + $(".callsign-buttons").on("click", ".callsign-cancel", function () { + $(".callsign-inner-container").slideUp(500); + $(".callsign-inner-container").fadeOut(500); + setTimeout(() => { + $(".callsign-container").slideUp(500); + $(".callsign-container").fadeOut(500); + $(".callsign-input").val(""); + }, 500); + }); + + $(".callsign-buttons").on("click", ".callsign-submit", function () { + const callsign = $(".callsign-input").val(); + if (callsign.length > 2) { + let editingcallsign = $(".callsign-container").data("id"); + let name = $(`[data-id="${editingcallsign}"]`) + .find(".unit-name") + .html() + .replace(/\s*(?:\[[^\]]*\]|\([^)]*\))\s*/g, ""); + let newunitname = `(${callsign}) ${name}`; + $(`[data-id="${editingcallsign}"]`) + .find(".unit-name") + .html(newunitname); + $.post( + `https://${GetParentResourceName()}/setCallsign`, + JSON.stringify({ + cid: editingcallsign, + newcallsign: callsign, + }) + ); + + $(".callsign-inner-container").slideUp(500); + $(".callsign-inner-container").fadeOut(500); + setTimeout(() => { + $(".callsign-container").slideUp(500); + $(".callsign-container").fadeOut(500); + $(".callsign-input").val(""); + }, 500); + } + }); + + $(".radio-buttons").on("click", ".radio-cancel", function () { + $(".radio-inner-container").slideUp(500); + $(".radio-inner-container").fadeOut(500); + setTimeout(() => { + $(".radio-container").slideUp(500); + $(".radio-container").fadeOut(500); + $(".radio-input").val(""); + }, 500); + }); + + $(".radio-buttons").on("click", ".radio-submit", function () { + const radio = $(".radio-input").val(); + if (radio.length > 0) { + let editingradio = $(".radio-container").data("id"); + let newunitname = `${radio}`; + $(`[data-id="${editingradio}"]`) + .find(".unit-radio") + .html(newunitname); + $.post( + `https://${GetParentResourceName()}/setRadio`, + JSON.stringify({ + cid: editingradio, + newradio: radio, + }) + ); + + $(".radio-inner-container").slideUp(500); + $(".radio-inner-container").fadeOut(500); + setTimeout(() => { + $(".radio-container").slideUp(500); + $(".radio-container").fadeOut(500); + $(".radio-input").val(""); + }, 500); + } + }); + + $(".cams-items").click(function () { + var camId = this.id; + $.post( + `https://${GetParentResourceName()}/openCamera`, + JSON.stringify({ + cam: camId, + }) + ); + $.post(`https://${GetParentResourceName()}/escape`, JSON.stringify({})); + }) + + var draggedElement = 0; + var dragging = false; + + $(".active-unit-list").on("click", ".active-unit-item", function (e) { + if (dragging) { + $("#draggedItem").css("opacity", 0.0); + document.getElementById("draggedItem").innerHTML = ""; + dragging = false; + } else { + dragging = true; + draggedElement = $(this).data("id"); + let draggedItemHtml = $(this).html(); + document.getElementById("draggedItem").innerHTML = draggedItemHtml; + document.getElementById("draggedItem").style.left = "cursorX-50"; + document.getElementById("draggedItem").style.top = "cursorY-50"; + document.getElementById("draggedItem").style.opacity = "0.5"; + } + }); + + document.onmousemove = handleMouseMove; + + function handleMouseMove(event) { + let dot, eventDoc, doc, body, pageX, pageY; + event = event || window.event; // IE-ism + if (event.pageX == null && event.clientX != null) { + eventDoc = (event.target && event.target.ownerDocument) || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = + event.clientX + + ((doc && doc.scrollLeft) || (body && body.scrollLeft) || 0) - + ((doc && doc.clientLeft) || (body && body.clientLeft) || 0); + event.pageY = + event.clientY + + ((doc && doc.scrollTop) || (body && body.scrollTop) || 0) - + ((doc && doc.clientTop) || (body && body.clientTop) || 0); + } + + if (dragging) { + cursorX = event.pageX; + cursorY = event.pageY; + document.getElementById("draggedItem").style.left = + "" + cursorX - 50 + "px"; + document.getElementById("draggedItem").style.top = + "" + cursorY - 50 + "px"; + } + } + + $(".active-calls-list").on("click", ".active-calls-item", function (e) { + const callId = $(this).data("id"); + $("#draggedItem").css("opacity", 0.0); + document.getElementById("draggedItem").innerHTML = ""; + dragging = false; + if (callId && draggedElement) { + $.post( + `https://${GetParentResourceName()}/callDragAttach`, + JSON.stringify({ + callid: callId, + cid: draggedElement, + }) + ); + draggedElement = 0; + } + }); + const customThemes = { + lspd: { + color1: "#1E3955", + color2: "#213f5f", + color3: "#2C537B", + color4: "#23405E", + color5: "#152638", + color6: "#121f2c", + color7: "rgb(28, 54, 82)", + color8: "#2554cc", + color9: "#6E707C", + color10: "#8F741B", + image: "img/LSPD.webp", + name: "LOS SANTOS POLITI", + }, + bcso: { + color1: "#333333", + color2: "#57471a", + color3: "#614f1d", + color4: "#594b27", + color5: "#4d3f17", + color6: "#433714", + color7: "#57471a", + color8: "#2554cc", + color9: "#6E707C", + color10: "#8F741B", + image: "img/BCSO.webp", + name: "BLAINE COUNTY SHERIFF KONTOR", + }, + sasp: { + color1: "#423f39", + color2: "#8f7c3f", + color3: "#16537e", + color4: "#8f7c3f", + color5: "#0f3a58", + color6: "#121f2c", + color7: "#0f3a58", + color8: "#2554cc", + color9: "#9c9485", + color10: "#8F741B", + image: "img/sasp_badge.webp", + name: "SAN ANDREAS STATSPOLITI", + }, + sast: { + color1: "#2c2c2c", + color2: "#232323", + color3: "#16537e", + color4: "#1c1c1c", + color5: "#232323", + color6: "#121f2c", + color7: "#232323", + color8: "#2554cc", + color9: "#bcbcbc", + color10: "#8F741B", + image: "img/sast_badge.webp", + name: "SAN ANDREAS STATSPOLITI", + }, + sapr: { + color1: "#3b4c3a", + color2: "#57471a", + color3: "#614f1d", + color4: "#594b27", + color5: "#4d3f17", + color6: "#433714", + color7: "#57471a", + olor8: "#2554cc", + color9: "#6E707C", + color10: "#8F741B", + image: "img/sapr.webp", + name: "SAN ANDREAS PARKBESKYTTELSE", + }, + lssd: { + color1: "#3b4c3a", + color2: "#8f7c3f", + color3: "#8f7c3f", + color4: "#806f38", + color5: "#4d3f17", + color6: "#f1c232", + color7: "#57471a", + color8: "#2554cc", + color9: "#6E707C", + color10: "#8F741B", + image: "img/LSSD.webp", + name: "LOS SANTOS SHERIFF AFDELING", + }, + doc: { + color1: "#191919", + color2: "#323232", + color3: "#000000", + color4: "#666666", + color5: "#46474f", + color6: "#191919", + color7: "#666666", + color8: "#2554cc", + color9: "#6E707C", + color10: "#8F741B", + image: "img/BBSP.webp", + name: "AFDELING FOR KORREKTIONER", + }, + ambulance: { + color1: "#5F2121", + color2: "#7B2C2C", + color3: "#4A1C1C", + color4: "#5E2323", + color5: "#381515", + color6: "#2C1212", + color7: "#521C1C", + color8: "#CC2525", + color9: "#8A8D91", + color10: "#444444", + image: "img/ems_badge.webp", + name: "PILLBOX HILL LÆGECENTER", + }, + doj: { + color1: "#553a1e", + color2: "#5f4321", + color3: "#7b552c", + color4: "#5e4123", + color5: "#382815", + color6: "#2c2312", + color7: "rgb(82, 60, 28)", + color8: "#cc9225", + color9: "#6E707C", + color10: "#8F741B", + image: "img/court.webp", + name: "STATEN", + }, + } + function applyCustomTheme(theme) { + document.documentElement.style.setProperty( + "--color-1", /* Panels */ + theme.color1 + ); + document.documentElement.style.setProperty( + "--color-2", /* Clock */ + theme.color2 + ); + document.documentElement.style.setProperty( + "--color-3", /* Outlines and hover */ + theme.color3 + ); + document.documentElement.style.setProperty( + "--color-4", /* Button Base */ + theme.color4 + ); + document.documentElement.style.setProperty( + "--color-5", + theme.color5 + ); + document.documentElement.style.setProperty( + "--color-6", + theme.color6 + ); + document.documentElement.style.setProperty( + "--color-7", + theme.color7 + ); + document.documentElement.style.setProperty( + "--color-8", + theme.color8 + ); + document.documentElement.style.setProperty( + "--color-9", + theme.color9 + ); + document.documentElement.style.setProperty( + "--color-10", + theme.color10 + ); + $(".badge-logo").attr("src", theme.image ); + $(".header-title").html(theme.name); + } + function JobColors(sentJob) { + if (sentJob) { + if (PoliceJobs[sentJob] !== undefined) { + if (sentJob == "police") { + applyCustomTheme(customThemes.lspd) + } else if (sentJob == "bcso"){ + applyCustomTheme(customThemes.bcso) + } else if (sentJob == "sasp") { + applyCustomTheme(customThemes.sasp) + } else if (sentJob == "sast") { + applyCustomTheme(customThemes.sast) + + } else if (sentJob == "sapr") { + applyCustomTheme(customThemes.sapr) + } else if (sentJob == "lssd") { + applyCustomTheme(customThemes.lssd) + } else if (sentJob == "doc") { + applyCustomTheme(customThemes.doc) + } + $(".bolo-nav-item").html("Efterlysninger"); + $(".bolos-search-title").html("Efterlysninger"); + $("#bolos-search-input").attr("placeholder", "Søg efterlysning..."); + $(".manage-bolos-title").html("Håndter efterlysning"); + $(".manage-bolos-editing-title").html( + "Du er ved at oprette en ny efterlysning" + ); + $(".boloplate-title").html("Nummerplade"); + $(".boloowner-title").html("Ejer"); + $(".boloindividual-title").html("Individ"); + $("#boloplate").attr("placeholder", "Nummerplade..."); + $("#bolodetail").attr( + "placeholder", + "Bolo detail goes here..." + ); + $("#boloowner").attr( + "placeholder", + "Ejer af køretøj..." + ); + $("#boloindividual").attr( + "placeholder", + "Nedskriv individ her..." + ); + $("#home-warrants-container").fadeIn(0); + $("#home-reports-container").fadeOut(0); + //$(".quote-span").html("TUCKER MALD, BEST MALD"); + $(".incidents-nav-item").show(); + $(".bolo-nav-item").show(); + $(".dmv-nav-item").show(); + $(".weapons-nav-item").show() + $(".cams-nav-item").show(); + $(".map-nav-item").show(); + $(".dispatch-title-ofsomesort").html("Alarmcentral"); + $(".dispatch-comms-container").fadeIn(0); + $(".manage-profile-name-input-1").attr("readonly", true); + $(".manage-profile-name-input-2").attr("readonly", true); + $("#reports-officers-involved-tag-title").html( + "Betjente involveret" + ); + $("#bolos-officers-involved-tag-title").html( + "Betjente involveret" + ); + $(".roster-iframe").attr("src", rosterLink); + $(".sop-iframe").attr("src", sopLink); + + $(".manage-profile-save").css("display", "block"); + $(".manage-profile-editing-title").css("display", "block"); + $(".manage-incidents-create").css("display", "block"); + $(".manage-incidents-save").css("display", "block"); + $(".manage-incidents-editing-title").css("display", "block"); + $(".manage-reports-new").css("display", "block"); + $(".manage-reports-save").css("display", "block"); + $(".manage-reports-editing-title").css("display", "block"); + $(".vehicle-information-save").css("display", "block"); + $(".vehicle-information-title").css("margin-right", "0px").css("width", "81%"); + $(".manage-incidents-title ").css("margin-right", "0px") + $(".manage-reports-title").css("margin-right", "0px").css("width", "66%"); + } else if (AmbulanceJobs[sentJob] !== undefined) { + $(".weapons-nav-item").hide() + $("#home-warrants-container").fadeOut(0); + $("#home-reports-container").fadeIn(0); + if (sentJob == "ambulance") { + applyCustomTheme(customThemes.ambulance) + } + //$(".quote-span").html("The simplest explanation is almost always somebody screwed up."); + $(".bolo-nav-item").html("Intensiv"); + $(".bolos-search-title").html("Intensiv Check-ins"); + $("#bolos-search-input").attr( + "placeholder", + "Søg check-ins..." + ); + $(".manage-bolos-title").html("Administrer intensiv check-in"); + $(".manage-bolos-editing-title").html( + "Du oprettet ny intensiv check-in" + ); + $(".boloplate-title").html("Estimeret restitutionstid"); + $(".boloowner-title").html("Nødkontakt"); + $(".boloindividual-title").html("Patient"); + $("#boloplate").attr( + "placeholder", + "Estimeret restitutionstid..." + ); + $("#bolodetail").attr( + "placeholder", + "Detaljer for intensiv..." + ); + $("#boloowner").attr( + "placeholder", + "Nødkontakt..." + ); + $("#boloindividual").attr( + "placeholder", + "Patient navn og CPR" + ); + $(".incidents-nav-item").hide(); + $(".dmv-nav-item").hide(); + $(".cams-nav-item").hide(); + $("#reports-officers-involved-tag-title").html( + "EMS involveret" + ); + $("#bolos-officers-involved-tag-title").html( + "EMS involveret" + ); + $(".dispatch-title-ofsomesort").html("Alarmcentral"); + $(".dispatch-comms-container").fadeIn(0); + $(".manage-profile-name-input-1").attr("readonly", true); + $(".manage-profile-name-input-2").attr("readonly", true); + $(".roster-iframe").attr("src", rosterLink); + $(".sop-iframe").attr("src", sopLink); + + $(".manage-profile-save").css("display", "block"); + $(".manage-profile-editing-title").css("display", "block"); + $(".manage-incidents-create").css("display", "block"); + $(".manage-incidents-save").css("display", "block"); + $(".manage-incidents-editing-title").css("display", "block"); + $(".manage-reports-new").css("display", "block"); + $(".manage-reports-save").css("display", "block"); + $(".manage-reports-editing-title").css("display", "block"); + $(".vehicle-information-save").css("display", "block"); + $(".vehicle-information-title").css("margin-right", "0px").css("width", "81%"); + $(".manage-incidents-title ").css("margin-right", "0px") + $(".manage-reports-title").css("margin-right", "0px").css("width", "66%"); + } else if (DojJobs[sentJob] !== undefined) { + applyCustomTheme(customThemes.doj) + //$(".quote-span").html("Actually useless."); + //$(".dmv-nav-item").hide(); + $(".weapons-nav-item").show() + $(".bolo-nav-item").hide(); + $(".dispatch-title-ofsomesort").html("Beskedtavle"); + $(".dispatch-comms-container").fadeOut(0); + $(".manage-profile-name-input-1").attr("readonly", false); + $(".manage-profile-name-input-2").attr("readonly", false); + $("#home-warrants-container").css("height", "98%"); + $(".roster-iframe").attr("src", rosterLink); + $(".sop-iframe").attr("src", sopLink); + + $(".manage-profile-save").css("display", "none"); + $(".manage-profile-editing-title").css("display", "none"); + $(".manage-incidents-create").css("display", "none"); + $(".manage-incidents-title").css("margin-right", "auto"); + $(".manage-incidents-title").css("width", "95%"); + $(".manage-incidents-save").css("display", "none"); + $(".manage-incidents-editing-title").css("display", "none"); + $(".manage-reports-new").css("display", "none"); + $(".manage-reports-save").css("display", "none"); + $(".manage-reports-editing-title").css("display", "none"); + $(".vehicle-information-save").css("display", "none"); + $(".vehicle-information-title").css("margin-right", "auto").css("width", "95%"); + $(".manage-incidents-title ").css("margin-right", "auto") + $(".manage-reports-title").css("margin-right", "auto").css("width", "95%"); + } + } + } +{/*
ID: ${value.id}
*/} +window.addEventListener("message", function (event) { + let eventData = event.data; + $(".dispatch-msg-notif").fadeIn(500); + if (eventData.type == "show") { + if (eventData.enable == true) { + rosterLink = eventData.rosterLink; + sopLink = eventData.sopLink; + playerJob = eventData.job; + JobColors(playerJob); + $(".quote-span").html(randomizeQuote()); + if (PoliceJobs[playerJob] !== undefined || DojJobs[playerJob] !== undefined) { + $(".manage-profile-licenses-container").removeClass("display_hidden"); + $(".manage-profile-vehs-container").removeClass("display_hidden"); + $(".manage-profile-houses-container").removeClass("display_hidden"); + } + + $("body").fadeIn(0); + $(".close-all").css("filter", "none"); + $(".close-all").fadeOut(0); + if (!currentTab) { + currentTab = ".dashboard-page-container"; + } + $(currentTab).slideDown(250); + timeShit(); + } else { + $(".callsign-inner-container").fadeOut(0); + $(".callsign-container").fadeOut(0); + $(".radio-inner-container").fadeOut(0); + $(".radio-container").fadeOut(0); + $(".incidents-person-search-container").fadeOut(0); + $(".dispatch-attached-units").fadeOut(0); + $(".respond-calls").fadeOut(0); + $(".respond-calls-container").fadeOut(0); + $("body").slideUp(250); + $(".close-all").slideUp(250); + } + } else if (eventData.type == "data") { + $(".name-shit").html(eventData.name); + $(".header-location").html(" " + eventData.location); + MyName = eventData.fullname; + + $(".bulletin-items-continer").empty(); + $.each(eventData.bulletin, function (index, value) { + $( + ".bulletin-items-continer" + ).prepend(`
+
${value.title}
+
${value.desc}
+
+
${value.author + } - ${timeAgo(Number(value.time))}
+
+
`); + }); + + let policeCount = 0; + let saspCount = 0; + let bcsoCount = 0; + let emsCount = 0; + let dojCount = 0; + /* let fireCount = 0; */ + + let activeUnits = eventData.activeUnits; + let cid = eventData.citizenid; + let onDutyOnly = eventData.ondutyonly; + $(".active-unit-list").html(' '); + let unitListHTML = ''; + + activeUnits = Object.values(activeUnits) + activeUnits.forEach((unit) => { + if (onDutyOnly && unit.duty == 0 && unit.cid != cid) { + return + } + let status = unit.duty == 1 ? "10-8" : '10-7'; + let statusColor = unit.duty == 1 ? "green-status" : 'yellow-status'; + let radioBack = unit.sig100 ? "#7b2c2c" : "var(--color-3)"; + let radio = unit.radio ? unit.radio : "0"; + let callSign = unit.callSign ? unit.callSign : "000"; + let activeInfoJob = `
UKENDT
`; + if (PoliceJobs[unit.unitType] !== undefined) { + if (unit.unitType == "police") { policeCount++; + activeInfoJob = `
POLITIET
`; + } else if(unit.unitType == "bcso") { bcsoCount++; + activeInfoJob = `
BCSO
`; + } else if(unit.unitType == "lssd") { bcsoCount++; + activeInfoJob = `
LSSD
`; + } else if(unit.unitType == "sasp") { saspCount++; + activeInfoJob = `
SASP
`; + } else if(unit.unitType == "sast") { saspCount++; + activeInfoJob = `
SAST
`; + } else if(unit.unitType == "sapr") { saspCount++; + activeInfoJob = `
SAPR
`; + } else if(unit.unitType == "judge") { dojCount++; + activeInfoJob = `
DOJ
`; + } else if(unit.unitType == "doc") { dojCount++; + activeInfoJob = `
DOC
`; + } + } else if (AmbulanceJobs[unit.unitType] !== undefined) { + activeInfoJob = `
Ambulance
` + emsCount++; + } else if (DojJobs[unit.unitType] !== undefined) { + activeInfoJob = `
Statsarbejder
` + dojCount++; + } + + unitListHTML += ` +
+
${status}
+ ${activeInfoJob} +
(${callSign}) ${unit.firstName} ${unit.lastName}
+
${radio}
+
+ `; + }); + + $(".active-unit-list").html(unitListHTML) + + + $("#police-count").html(policeCount); + $("#sasp-count").html(saspCount); + $("#bcso-count").html(bcsoCount); + $("#ems-count").html(emsCount); + $("#doj-count").html(dojCount); + + } else if (eventData.type == "newBulletin") { + const value = eventData.data; + $(".bulletin-items-continer") + .prepend(`
+
${value.title}
+
${value.info}
+
+
ID: ${value.id}
+
${value.author} - ${timeAgo( + Number(value.time) + )}
+
+
`); + } else if (eventData.type == "deleteBulletin") { + $(".bulletin-items-continer") + .find("[data-id='" + eventData.data + "']") + .remove(); + } else if (eventData.type == "warrants") { + $(".warrants-items").empty(); + $.each(eventData.data, function (index, value) { + $('.warrants-items').prepend(`
+
+
${value.name}
+
+
+
Incident ID: ${value.linkedincident}
+
+
`) + }) + } else if (eventData.type == "dispatchmessages") { + const table = eventData.data; + LastName = ""; + DispatchNum = 0; + $(".dispatch-items").empty(); + $.each(table, function (index, value) { + DispatchNum = DispatchNum + 1; + if (LastName == value.name) { + $(".dispatch-items").append(` +
+
${value.message}
+
+ `); + } else { + if (DispatchNum == 1) { + $(".dispatch-items") + .append(`
+ +
+
${value.name + } ${timeAgo( + Number(value.time) + )}
+
${value.message}
+
+
`); + } else { + $(".dispatch-items") + .append(`
+ +
+
${value.name + } ${timeAgo( + Number(value.time) + )}
+
${value.message}
+
+
`); + } + } + LastName = value.name; + $(".dispatch-items").scrollTop( + $(".dispatch-items")[0].scrollHeight + ); + }); + $(".dispatch-items").scrollTop( + $(".dispatch-items")[0].scrollHeight + ); + } else if (eventData.type == "dispatchmessage") { + const value = eventData.data; + DispatchNum = DispatchNum + 1; + const BodyDisplay = $("body").css("display"); + if (BodyDisplay == "block") { + if (LastName == value.name) { + $(".dispatch-items").append(` +
+
${value.message}
+
+ `); + } else { + if (DispatchNum == 1) { + $(".dispatch-items") + .append(`
+ +
+
${value.name + } ${timeAgo( + Number(value.time) + )}
+
${value.message}
+
+
`); + } else { + $(".dispatch-items") + .append(`
+ +
+
${value.name + } ${timeAgo( + Number(value.time) + )}
+
${value.message}
+
+
`); + } + } + LastName = value.name; + } else if (BodyDisplay == "none") { + $.post( + `https://${GetParentResourceName()}/dispatchNotif`, + JSON.stringify({ + data: value, + }) + ); + } + $(".dispatch-items").scrollTop( + $(".dispatch-items")[0].scrollHeight + ); + } else if (eventData.type == "call") { + const value = eventData.data; + DispatchMAP(value); + if (value && value.job.includes(playerJob)) { + const prio = value["priority"]; + let DispatchItem = `
#${value.callId}
${value.dispatchCode}
${value.dispatchMessage}
${value.units.length}
`; + + if ( + value.dispatchCode == "114" || + value.dispatchCode == "112" + ) { + DispatchItem = `
#${value.callId}
${value.dispatchCode}
${value.dispatchMessage}
${value.units.length}
`; + } + + if (value["time"]) { + DispatchItem += `
${timeAgo( + value.time + )}
`; + } + + if (value["firstStreet"]) { + DispatchItem += `
${value.firstStreet}
`; + } + + if (value['camId']) { + DispatchItem += `
${value.camId}
`; + } + + if (value["callsign"]) { + DispatchItem += `
${value.callsign}
`; + } + + if (value["doorCount"]) { + DispatchItem += `
${value.doorCount}
`; + } + + if (value["speed"]) { + DispatchItem += `
${value.speed}
`; + } + + if (value["weapon"]) { + DispatchItem += `
${value.weapon}
`; + } + + if (value["heading"]) { + DispatchItem += `
${value.heading}
`; + } + + if (value["gender"]) { + let gender = "Mand"; + if (value["gender"] == 0 || value["gender"] == 2) { + gender = "Kvinde"; + } + DispatchItem += `
${gender}
`; + } + + if (value["model"] && value["plate"]) { + DispatchItem += `
${value["model"]}${value["plate"]}
`; + } else if (value["plate"]) { + DispatchItem += `
${value["plate"]}
`; + } else if (value["model"]) { + DispatchItem += `
${value["model"]}
`; + } + + if (value["firstColor"]) { + DispatchItem += `
${value["firstColor"]}
`; + } + + if (value["automaticGunfire"] == true) { + DispatchItem += `
Rifelskydning
`; + } + + if (value["name"] && value["number"]) { + DispatchItem += `
${value["name"]}${value["number"]}
`; + } else if (value["number"]) { + DispatchItem += `
${value["number"]}
`; + } else if (value["name"]) { + DispatchItem += `
${value["name"]}
`; + } + + if (value["information"]) { + DispatchItem += `
${value["information"]}
`; + } + + DispatchItem += `
`; + $(".active-calls-list").prepend( + $(DispatchItem).hide().fadeIn("slow") + ); + } + } else if (eventData.type == "attachedUnits") { + const table = eventData.data; + if (table) { + $(".dispatch-attached-units").fadeIn(0); + $(".dispatch-attached-units-container").fadeIn(250); + $(".close-all").css("filter", "brightness(15%)"); + $(".dispatch-attached-units-holder").empty(); + $.each(table, function (index, value) { + $(".dispatch-attached-units-holder").prepend( + `
+
${value.job}
+
(${value.callsign}) ${value.fullname}
+
${value.channel}
+
`); + }); + setTimeout(() => { + $(".dispatch-attached-units-container").attr( + "id", + eventData.callid + ); + }, 1000); + } + } else if (eventData.type == "sendCallResponse") { + if ($(".respond-calls-container").data("id") == eventData.callid) { + $(".respond-calls-responses").prepend( + `
${eventData["name"] + } responded "${eventData["message"]}" - ${timeAgo( + Number(eventData.time) + )}.
` + ); + } + } else if (eventData.type == "getCallResponses") { + const table = eventData.data; + $(".respond-calls").fadeIn(0); + $(".respond-calls-container").fadeIn(250); + $(".close-all").css("filter", "brightness(15%)"); + $("#respondcalls").val(""); + $(".respond-calls-responses").empty(); + setTimeout(() => { + $(".respond-calls-container").data("id", eventData.callid); + }, 1000); + $.each(table, function (index, value) { + $(".respond-calls-responses").prepend( + `
${value["name"] + } responded "${value["message"]}" - ${timeAgo( + Number(value.time) + )}.
` + ); + }); + } else if (eventData.type == "calls") { + const table = eventData.data; + $(".active-calls-list").empty(); + $.each(table, function (index, value) { + if (value && value.job.includes(playerJob)) { + const prio = value["priority"]; + let DispatchItem = `
#${value.callId}
${value.dispatchCode}
${value.dispatchMessage}
${value.units.length}
`; + + if ( + value.dispatchCode == "114" || + value.dispatchCode == "112" + ) { + DispatchItem = `
#${value.callId}
${value.dispatchCode}
${value.dispatchMessage}
${value.units.length}
`; + } + + if (value["time"]) { + DispatchItem += `
${timeAgo( + value.time + )}
`; + } + + if (value["firstStreet"]) { + DispatchItem += `
${value.firstStreet}
`; + } + + if (value['camId']) { + DispatchItem += `
${value.camId}
`; + } + + if (value["heading"]) { + DispatchItem += `
${value.heading}
`; + } + + if (value["weapon"]) { + DispatchItem += `
${value.weapon}
`; + } + + if (value["gender"]) { + let gender = "Mand"; + if (value["gender"] == 0 || value["gender"] == 2) { + gender = "Kvinde"; + } + DispatchItem += `
${gender}
`; + } + + if (value["model"] && value["plate"]) { + DispatchItem += `
${value["model"]}${value["plate"]}
`; + } else if (value["plate"]) { + DispatchItem += `
${value["plate"]}
`; + } else if (value["model"]) { + DispatchItem += `
${value["model"]}
`; + } + + if (value["firstColor"]) { + DispatchItem += `
${value["firstColor"]}
`; + } + + if (value["automaticGunfire"] == true) { + DispatchItem += `
Rifelskydning
`; + } + + if (value["name"] && value["number"]) { + DispatchItem += `
${value["name"]}${value["number"]}
`; + } else if (value["number"]) { + DispatchItem += `
${value["number"]}
`; + } else if (value["name"]) { + DispatchItem += `
${value["name"]}
`; + } + + if (value["information"]) { + DispatchItem += `
${value["information"]}
`; + } + + DispatchItem += `
`; + $(".active-calls-list").prepend( + $(DispatchItem).hide().fadeIn("slow") + ); + } + }); + } else if (eventData.type == "incidents") { + let table = eventData.data; + canSearchForProfiles = true; + $(".incidents-items").empty(); + $.each(table, function (index, value) { + $(".incidents-items").append( + `
+
+
${value.title}
+
Hændelsesrapport
+
+
+
ID: ${value.id}
+
${value.author + } - ${timeAgo(Number(value.time))}
+
+
` + ); + }); + $(".contextmenu").on("click", ".incidents-delete", function () { + $(".incidents-items") + .find(`[data-id="${$(this).data("info")}"]`) + .remove(); + $.post( + `https://${GetParentResourceName()}/deleteIncidents`, + JSON.stringify({ + id: $(this).data("info"), + }) + ); + }); + + $(".incidents-items").on("contextmenu", ".incidents-item", function (e) { + var args = ""; + args = [ + { + className: "incidents-delete", + icon: "fas fa-times", + text: "Slet hændelse", + info: $(this).data("id"), + status: "", + }, + ]; + openContextMenu(e, args); + }); + } else if (eventData.type == "getPenalCode") { + const titles = eventData.titles; + const penalcode = eventData.penalcode; + $(".offenses-main-container").empty(); + $.each(titles, function (index, value) { + $(".offenses-main-container").append( + `
+
${value}
+
+
+
+ ` + ); + }); + $.each(penalcode, function (index, value) { + $.each(value, function (i, v) { + $(`#penal-${index}`).append(` +
+
+
${v.title}
+
${v.class}
+
+
+
${v.id}
+
${v.months} Months - $${v.fine}
+
+ `); + }); + }); + } else if (eventData.type == "incidentData") { + let table = eventData.data; + + $(".incidents-ghost-holder").html(""); + $(".associated-incidents-tags-holder").html(""); + + $(".manage-incidents-editing-title").html( + "You are currently editing incident " + table["id"] + ); + $(".manage-incidents-editing-title").data( + "id", + Number(table["id"]) + ); + + $(".manage-incidents-tags-add-btn").css("pointer-events", "auto"); + $(".manage-incidents-reports-content").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-officers-add-btn").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-civilians-add-btn").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-evidence-add-btn").css( + "pointer-events", + "auto" + ); + $(".associated-incidents-tags-add-btn").css( + "pointer-events", + "auto" + ); + + + $("#manage-incidents-title-input").val(table["title"]); + $(".manage-incidents-reports-content").trumbowyg({ + changeActiveDropdownIcon: true, + imageWidthModalEdit: true, + btns: [ + ['foreColor', 'backColor','fontfamily','fontsize','indent', 'outdent'], + ['strong', 'em',], ['insertImage'], + ['viewHTML'], + ['undo', 'redo'], + ['formatting'], + ['superscript', 'subscript'], + ['link'], + ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'], + ['horizontalRule'] + ], + }); + $(".manage-incidents-reports-content").trumbowyg('html', table["details"]); + + $(".manage-incidents-tags-holder").empty(); + $.each(table["tags"], function (index, value) { + $(".manage-incidents-tags-holder").append( + `
${value}
` + ); + }); + + $(".manage-incidents-officers-holder").empty(); + $.each(table["officersinvolved"], function (index, value) { + $(".manage-incidents-officers-holder").append( + `
${value}
` + ); + }); + + $(".manage-incidents-civilians-holder").empty(); + $.each(table["civsinvolved"], function (index, value) { + $(".manage-incidents-civilians-holder").append( + `
${value}
` + ); + }); + + $(".manage-incidents-evidence-holder").empty(); + $.each(table["evidence"], function (index, value) { + $(".manage-incidents-evidence-holder").append( + `` + ); + }); + + $(".manage-incidents-title-holder").empty(); + if (PoliceJobs[playerJob] !== undefined || AmbulanceJobs[playerJob] !== undefined) { + $(".manage-incidents-title-holder").prepend( + ` +
Administrer hændelse
+
+
+ ` + ); + $(".manage-incidents-title").css("width", "66%"); + $(".manage-incidents-create").css("margin-right", "0px"); + } else if (DojJobs[playerJob] !== undefined) { + $(".manage-incidents-title-holder").prepend( + ` +
Administrer hændelse
+ ` + ); + $(".manage-incidents-title").css("width", "95%"); + } + + let associateddata = eventData.convictions; + $.each(associateddata, function (index, value) { + $(".associated-incidents-tags-holder").prepend( + `
${value.name}
` + ); + + var warrantTag = "red-tag"; + var guiltyTag = "red-tag"; + var processedTag = "red-tag"; + var associatedTag = "red-tag"; + + if (value.warrant == 1) { + warrantTag = "green-tag"; + } + if (value.guilty == 1) { + guiltyTag = "green-tag"; + } + if (value.processed == 1) { + processedTag = "green-tag"; + } + if (value.associated == 1) { + associatedTag = "green-tag"; + } + + const cid = value.cid; + + // If the associated field is not checked, then populate the recommended fine and sentence fields + const associatedIncidentsContainer = (value.associated != 1) && ` +
+
Anbefalet bøde
+
+
Anbefalet straf
+
+
Bøde
+
+
Straf
+
+
+
Fængsel
+
Bøde
+ ${canSendToCommunityService ? `
Community Service
` : ''} +
+ `; + + $(".incidents-ghost-holder").prepend( + `
+
${value.name} (#${cid})
+
+
Kendelser
+
Skyldig
+
Behandlet
+
Involverede
+
+
Højreklik fornede for at tilføje/ændre sigtelser
+ ${associatedIncidentsContainer} +
` + ); + + $(".fine-amount") + .filter("[data-id='" + value.cid + "']") + .val(value.fine); + + $(".sentence-amount") + .filter("[data-id='" + value.cid + "']") + .val(value.sentence); + + $(".fine-recommended-amount") + .filter("[data-id='" + value.cid + "']") + .val(value.recfine); + + $(".sentence-recommended-amount") + .filter("[data-id='" + value.cid + "']") + .val(value.recsentence); + + const charges = value["charges"]; + for (var i = 0; i < charges.length; i++) { + const randomNum = Math.ceil( + Math.random() * 1000 + ).toString(); + $(`[data-name="${cid}"]`).prepend( + `
${charges[i]}
` + ); + } + }); + } else if (eventData.type == "incidentSearchPerson") { + let table = eventData.data; + $(".incidents-person-search-holder").empty(); + $.each(table, function (index, value) { + let name = value.firstname + " " + value.lastname; + $(".incidents-person-search-holder").prepend( + ` +
+ +
+
Borger ID
+
${value.id}
+
Navn
+
${name}
+
+
+ ` + ); + }); + } else if (eventData.type == "boloData") { + let table = eventData.data; + $(".manage-bolos-editing-title").html( + "Du redigerer efterlyning " + table["id"] + ); + + if ($(".badge-logo").attr("src") == "img/ems_badge.webp") { + $(".manage-bolos-editing-title").html( + "Du redigerer intensiv checkin " + table["id"] + ); + } + + $(".manage-bolos-editing-title").data("id", Number(table["id"])); + + $(".manage-bolos-input-title").val(table["title"]); + $(".manage-bolos-input-plate").val(table["plate"]); + $(".manage-bolos-input-owner").val(table["owner"]); + $(".manage-bolos-input-individual").val(table["individual"]); + + $(".manage-bolos-reports-content").trumbowyg({ + changeActiveDropdownIcon: true, + imageWidthModalEdit: true, + btns: [ + ['foreColor', 'backColor','fontfamily','fontsize','indent', 'outdent'], + ['strong', 'em',], ['insertImage'], + ['viewHTML'], + ['undo', 'redo'], + ['formatting'], + ['superscript', 'subscript'], + ['link'], + ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'], + ['horizontalRule'] + ], + }); + $(".manage-bolos-reports-content").trumbowyg('html', table["detail"]); + + $(".manage-bolos-tags-holder").empty(); + $.each(table["tags"], function (index, value) { + $(".manage-bolos-tags-holder").prepend( + `
${value}
` + ); + }); + + $(".bolo-gallery-inner-container").empty(); + $.each(table["gallery"], function (index, value) { + let randomNum = Math.ceil(Math.random() * 10).toString(); + $(".bolo-gallery-inner-container").prepend( + `` + ); + }); + + $(".manage-officers-tags-holder").empty(); + $.each(table["officersinvolved"], function (index, value) { + $(".manage-officers-tags-holder").prepend( + `
${value}
` + ); + }); + } else if (eventData.type == "bolos") { + let table = eventData.data; + var reportName = "Generel efterlysning"; + canSearchForProfiles = true; + $(".bolos-items").empty(); + if ($(".badge-logo").attr("src") == "img/ems_badge.webp") { + reportName = "Intensiv check-in"; + } + $.each(table, function (index, value) { + $(".bolos-items").prepend( + `
+
+
${value.title}
+
${reportName}
+
+
+
ID: ${value.id}
+
${value.author + } - ${timeAgo(Number(value.time))}
+
+
` + ); + }); + } else if (eventData.type == "boloComplete") { + let id = eventData.data; + if (canRefreshBolo == true) { + canRefreshBolo = false; + $(".bolos-search-refresh").empty(); + $(".bolos-search-refresh").prepend( + `` + ); + setTimeout(() => { + $(".bolos-search-refresh").empty(); + $(".bolos-search-refresh").html("Genindlæs"); + canRefreshBolo = true; + $.post(`https://${GetParentResourceName()}/getAllBolos`, JSON.stringify({})); + }, 1500); + } + $(".manage-bolos-editing-title").html( + "Du redigerer efterlysning " + id + ); + $(".manage-bolos-editing-title").data("id", Number(id)); + } else if (eventData.type == "reportComplete") { + let id = eventData.data; + if (canRefreshReports == true) { + canRefreshReports = false; + $(".reports-search-refresh").empty(); + $(".reports-search-refresh").prepend( + `` + ); + setTimeout(() => { + $(".reports-search-refresh").empty(); + $(".reports-search-refresh").html("Genindlæs"); + canRefreshReports = true; + $.post(`https://${GetParentResourceName()}/getAllReports`, JSON.stringify({})); + }, 1500); + } + $(".manage-reports-editing-title").html( + "Du redigerer rapport " + id + ); + $(".manage-reports-editing-title").data("id", Number(id)); + } else if (eventData.type == "reports") { + let table = eventData.data; + canSearchForReports = true; + $(".reports-items").empty(); + $.each(table, function (index, value) { + $(".reports-items").append( + `
+
+
${value.title}
+
${value.type + } Report
+
+
+
ID: ${value.id}
+
${value.author + } - ${timeAgo(Number(value.time))}
+
+
` + ); + }); + $(".contextmenu").on("click", ".reports-delete", function () { + $(".reports-items") + .find(`[data-id="${$(this).data("info")}"]`) + .remove(); + $.post( + `https://${GetParentResourceName()}/deleteReports`, + JSON.stringify({ + id: $(this).data("info"), + }) + ); + }); + + $(".reports-items").on("contextmenu", ".reports-item", function (e) { + var args = ""; + args = [ + { + className: "reports-delete", + icon: "fas fa-times", + text: "Slet rapport", + info: $(this).data("id"), + status: "", + }, + ]; + openContextMenu(e, args); + }); + } else if (eventData.type == "reportData") { + let table = eventData.data; + + $(".manage-reports-editing-title").html( + "You are currently editing report " + table["id"] + ); + + $(".manage-reports-editing-title").data("id", Number(table["id"])); + + $(".manage-reports-input-title").val(table["title"]); + $(".manage-reports-input-type").val(table["type"]); + $(".manage-reports-reports-content").trumbowyg({ + changeActiveDropdownIcon: true, + imageWidthModalEdit: true, + btns: [ + ['foreColor', 'backColor','fontfamily','fontsize','indent', 'outdent'], + ['strong', 'em',], ['insertImage'], + ['viewHTML'], + ['undo', 'redo'], + ['formatting'], + ['superscript', 'subscript'], + ['link'], + ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'], + ['horizontalRule'] + ], + }); + $(".manage-reports-reports-content").trumbowyg('html', table["details"]); + + $(".manage-reports-tags-holder").empty(); + $.each(table["tags"], function (index, value) { + $(".manage-reports-tags-holder").append( + `
${value}
` + ); + }); + + $(".reports-gallery-inner-container").empty(); + $.each(table["gallery"], function (index, value) { + let randomNum = Math.ceil(Math.random() * 10).toString(); + $(".reports-gallery-inner-container").append( + `` + ); + }); + + $(".reports-officers-tags-holder").empty(); + $.each(table["officersinvolved"], function (index, value) { + $(".reports-officers-tags-holder").append( + `
${value}
` + ); + }); + + $(".reports-civilians-tags-holder").empty(); + $.each(table["civsinvolved"], function (index, value) { + $(".reports-civilians-tags-holder").append( + `
${value}
` + ); + }); + + } else if (eventData.type == "searchedVehicles") { + + } else if (eventData.type == "getVehicleData") { + impoundChanged = false; + let table = eventData.data; + + $(".vehicle-information-title-holder").data( + "dbid", + Number(table["dbid"]) + ); + + $(".vehicle-info-plate-input").val(table["plate"]); + $(".vehicle-info-owner-input").val(table["name"]); + $(".vehicle-info-class-input").val(table["class"]); + $(".vehicle-info-model-input").val(table["model"]); + $(".vehicle-info-imageurl-input").val(table["image"]); + let vehiclePoints = table["points"] != null ? table["points"] : 0; + $("#vehiclePointsSlider").val(vehiclePoints); + $("#vehiclePointsSliderValue").html(vehiclePoints); + + $(".vehicle-info-content").val(table["information"]); + + $(".vehicle-tags").empty(); + $(".vehicle-info-image").attr("src", table["image"]); + $(".vehicle-tags").prepend( + `
${table.colorName}
` + ); + + let impound = "red-tag"; + let bolo = "red-tag"; + let codefive = "red-tag"; + let stolen = "red-tag"; + + if (table.impound) { + impound = "green-tag"; + } + + if (table.bolo) { + bolo = "green-tag"; + } + + if (table.code) { + codefive = "green-tag"; + } + + if (table.stolen) { + stolen = "green-tag"; + } + + $(".vehicle-tags").append(`
Beslaglæg
`); + $(".vehicle-tags").append(`
Efterlys
`); + $(".vehicle-tags").append(`
Kode 5
`); + $(".vehicle-tags").append(`
Stjålet
`); + $(".vehicle-info-imageurl-input").val(table["image"]); + } else if (eventData.type == "getWeaponData") { + impoundChanged = false; + let table = eventData.data; + + $(".weapon-information-title-holder").data( "dbid", table["id"] ); + + $(".weapon-info-serial-input").val(table["serial"]); + $(".weapon-info-owner-input").val(table["owner"]); + $(".weapon-info-class-input").val(table["weapClass"]); + $(".weapon-info-model-input").val(table["weapModel"]); + $(".weapon-info-imageurl-input").val(table["image"]); + + $(".weapon-info-content").val(table["information"]); + + $(".weapon-info-image").attr("src", table["image"]); + + $(".weapon-info-imageurl-input").val(table["image"]); + $(".contextmenu").on("click", ".weapons-delete", function () { + $(".weapons-items") + .find(`[data-id="${$(this).data("info")}"]`) + .remove(); + $.post( + `https://${GetParentResourceName()}/deleteWeapons`, + JSON.stringify({ + id: $(this).data("info"), + }) + ); + }); + + $(".weapons-items").on("contextmenu", ".weapons-item", function (e) { + var args = ""; + args = [ + { + className: "weapons-delete", + icon: "fas fa-times", + text: "Slet våbeninformation", + info: $(this).data("id"), + status: "", + }, + ]; + openContextMenu(e, args); + }); + } else if (eventData.type == "updateVehicleDbId") { + $(".vehicle-information-title-holder").data("dbid", Number(eventData.data)); + } else if (eventData.type == "updateIncidentDbId") { + $(".manage-incidents-editing-title").data("id", Number(eventData.data)); + + $(".manage-incidents-tags-add-btn").css("pointer-events", "auto"); + $(".manage-incidents-reports-content").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-officers-add-btn").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-civilians-add-btn").css( + "pointer-events", + "auto" + ); + $(".manage-incidents-evidence-add-btn").css( + "pointer-events", + "auto" + ); + $(".associated-incidents-tags-add-btn").css( + "pointer-events", + "auto" + ); + + } else if (eventData.type == "callDetach") { + $(".active-calls-item") + .filter("[data-id='" + eventData.callid + "']") + .children() + .children() + .find(".call-radio") + .html(eventData.data); + } else if (eventData.type == "callAttach") { + $(".active-calls-item") + .filter("[data-id='" + eventData.callid + "']") + .children() + .children() + .find(".call-radio") + .html(eventData.data); + } else if (eventData.type == "getAllLogs") { + let table = eventData.data; + $(".stafflogs-box").empty(); + $.each(table, function (index, value) { + $(".stafflogs-box").append( + `

► ${value.text + } (${timeAgo( + Number(value.time) + )})

` + ); + }); + } else if (eventData.type == "statusImpound") { + const table = eventData.data; + const plate = eventData.plate; + const linkedreport = table["linkedreport"]; + const fee = table["fee"]; + const time = table["time"] * 1000; + + let localDate = new Date(time); + const impoundDate = localDate.toLocaleDateString("en-US", { + timeZone: "UTC", + }); + const impoundTime = localDate.toLocaleTimeString("en-US", { + timeZone: "UTC", + }); + + $(".impound-plate").val(plate).attr("disabled", "disabled"); + $(".impound-linkedreport") + .val(linkedreport) + .attr("disabled", "disabled"); + $(".impound-fee") + .val("$" + fee) + .attr("disabled", "disabled"); + + if (table.paid === 1) { + $(".impound-fee").css("color", "green"); + } else { + $(".impound-fee").css("color", "red"); + } + + $(".impound-time") + .val(impoundDate + " - " + impoundTime) + .attr("disabled", "disabled"); + $(".impound-cancel").html("Close"); + $(".impound-submit").fadeOut(250); + $(".impound-form").slideDown(250); + $(".impound-form").fadeIn(250); + } else if (eventData.type == "greenImpound") { + $(".vehicle-tags") + .find(".impound-tag") + .addClass("green-tag") + .removeClass("red-tag"); + } else if (eventData.type == "redImpound") { + $(".vehicle-tags") + .find(".impound-tag") + .removeClass("green-tag") + .addClass("red-tag"); + } + }); +}); + +function fidgetSpinner(page) { + $(".close-all").fadeOut(0); + $(".container-load").fadeIn(0); + if (page == ".dashboard-page-container"){ + $.post(`https://${GetParentResourceName()}/getAllDashboardData`, JSON.stringify({})); + } + if (page == ".bolos-page-container") { + $.post(`https://${GetParentResourceName()}/getAllBolos`, JSON.stringify({})); + } + if (page == ".reports-page-container") { + $.post(`https://${GetParentResourceName()}/getAllReports`, JSON.stringify({})); + } + if (page == ".stafflogs-page-container") { + $.post(`https://${GetParentResourceName()}/getAllLogs`, JSON.stringify({})); + } + if (page == ".incidents-page-container") { + $.post(`https://${GetParentResourceName()}/getAllIncidents`, JSON.stringify({})); + } + setTimeout(() => { + $(".container-load").fadeOut(0); + $(page).fadeIn(0); + }, 1250); +} + +function timeShit() { + let localDate = new Date(); + const myTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone + date = localDate.toLocaleDateString("en-US", { + timeZone: myTimeZone, + }); + time = localDate.toLocaleTimeString("en-US", { + timeZone: myTimeZone, + }); + $(".date").html(date); + $(".time").html(time); +} + +setInterval(timeShit, 1000); + +function addTag(tagInput) { + $(".tags-holder").prepend(`
${tagInput}
`); + + $.post( + `https://${GetParentResourceName()}/newTag`, + JSON.stringify({ + id: $(".manage-profile-citizenid-input").val(), + tag: tagInput, + }) + ); +} + +// Use the customSentence if defined, otherwise use the recommendedSentence +// This uses the assumption that customSentence will be 0 if not defined +function sendToJail(citizenId, customSentence, recommendedSentence) { + const sentence = Number(customSentence) || Number(recommendedSentence); + + $.post(`https://${GetParentResourceName()}/sendToJail`, JSON.stringify({ + citizenId, + sentence, + })); +} + +// Use the customSentence if defined, otherwise use the recommendedSentence +// This uses the assumption that customSentence will be 0 if not defined +function sendToCommunityService(citizenId, customSentence, recommendedSentence) { + const sentence = Number(customSentence) || Number(recommendedSentence); + + $.post(`https://${GetParentResourceName()}/sendToCommunityService`, JSON.stringify({ + citizenId, + sentence, + })); +} + +// Use the customFine if defined, otherwise use the recommendedFine +// This uses the assumption that customFine will be 0 if not defined +function sendFine(citizenId, customFine, recommendedFine, incidentId) { + const fine = Number(customFine) || Number(recommendedFine); + + $.post(`https://${GetParentResourceName()}/sendFine`, JSON.stringify({ + citizenId, + fine, + incidentId, + })); +} +// Context menu + +var menu = document.querySelector(".contextmenu"); + +function showMenu(x, y) { + $(".contextmenu").css("left", x + "px"); + $(".contextmenu").css("top", y + "px"); + $(".contextmenu").addClass("contextmenu-show"); +} + +function showChargesMenu(x, y) { + $(".ccontextmenu").css("left", x + "px"); + $(".ccontextmenu").css("top", y + "px"); + $(".ccontextmenu").addClass("ccontextmenu-show"); +} + +function hideMenu() { + $(".contextmenu").removeClass("contextmenu-show"); +} + +function hideChargesMenu() { + $(".ccontextmenu").removeClass("ccontextmenu-show"); +} + +function onMouseDown(e) { + hideMenu(); + hideChargesMenu(); + document.removeEventListener("mouseup", onMouseDown); +} + +function openContextMenu(e, args) { + e.preventDefault(); + showMenu(e.pageX, e.pageY); + $(".contextmenu").empty(); + $.each(args, function (index, value) { + if (value.status !== "blur(5px)") { + $(".contextmenu").prepend( + ` +
  • + + + ${value.text} + +
  • + ` + ); + } + }); + document.addEventListener("mouseup", onMouseDown); +} + +function openChargesContextMenu(e, args) { + e.preventDefault(); + showChargesMenu(e.pageX, e.pageY); + $(".ccontextmenu").empty(); + $.each(args, function (index, value) { + if (value.status !== "blur(5px)") { + $(".ccontextmenu").prepend( + ` +
  • + ${value.info} +
  • + ` + ); + } + }); + document.addEventListener("mouseup", onMouseDown); +} + +function expandImage(url) { + $(".close-all").css("filter", "brightness(35%)"); + $(".gallery-image-enlarged").fadeIn(150); + $(".gallery-image-enlarged").css("display", "block"); + $(".gallery-image-enlarged").attr("src", url); +} + +function copyImageSource(url) { + const el = document.createElement('textarea'); + el.value = url; + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); +} + +function removeImage(url) { + let cid = $(".manage-profile-citizenid-input").val(); + $(".gallery-inner-container img") + .filter("[src='" + url + "']") + .remove(); +} + +function hideIncidentsMenu() { + if ( + $(".incidents-person-search-container").css("display") != "none" && + !mouse_is_inside + ) { + $(".incidents-person-search-container").fadeOut(250); + $(".close-all").css("filter", "none"); + } + if ( + $(".convictions-known-container").css("display") != "none" && + !mouse_is_inside + ) { + $(".convictions-known-container").fadeOut(0); + $(".close-all").css("filter", "none"); + } + if ( + $(".incidents-known-container").css("display") != "none" && + !mouse_is_inside + ) { + $(".incidents-known-container").fadeOut(0); + $(".close-all").css("filter", "none"); + } +} + +function onMouseDownIncidents(e) { + hideIncidentsMenu(); + document.removeEventListener("mouseup", onMouseDownIncidents); +} + +function titleCase(str) { + return str + .split(' ') + .map((word) => word[0].toUpperCase() + word.slice(1).toLowerCase()) + .join(' '); +} + +function searchProfilesResults(result) { + canSearchForProfiles = true; + $(".profile-items").empty(); + + if (result.length < 1) { + $(".profile-items").html( + ` +
    + +
    +
    +
    Ingen personer fundet
    +
    +
    +
    +
    +
    + ` + ); + return true; + } + + let profileHTML = ""; + + result.forEach((value) => { + let charinfo = value.charinfo; + let metadata = value.metadata; + + if (typeof value.charinfo == "string") { + charinfo = JSON.parse(charinfo); + } + + if (typeof value.metadata == "string") { + metadata = JSON.parse(metadata); + } + + if (!metadata) { + metadata = {}; + } + + if (!metadata.licences) { + metadata.licences = {}; + } + + let name = charinfo.firstname + " " + charinfo.lastname; + let warrant = "red-tag"; + let convictions = "red-tag"; + + let licences = ""; + let licArr = Object.entries(metadata.licences); + + if (licArr.length == 0 || licArr.length == undefined) { + var licenseTypes = ['business', 'pilot', 'weapon', 'driver']; + licArr = Object.entries(licenseTypes.reduce((licenseType, licenseValue) => (licenseType[licenseValue] = false, licenseType), {})); + } + + if (licArr.length > 0 && (PoliceJobs[playerJob] !== undefined || DojJobs[playerJob] !== undefined)) { + for (const [lic, hasLic] of licArr) { + let tagColour = + hasLic == true ? "green-tag" : "red-tag"; + licences += `${titleCase(lic)}`; + } + } + + if (value.warrant == true) { + warrant = "green-tag"; + } + + if (value.convictions < 5) { + convictions = "green-tag"; + } else if ( + value.convictions > 4 && + value.convictions < 15 + ) { + convictions = "orange-tag"; + } + + if (value.pp == '') { + value.pp = 'img/not-found.webp' + } + + profileHTML += ` +
    + +
    +
    +
    ${name}
    +
    + ${licences} +
    +
    + ${value.warrant ? "Aktiv" : "Ingen"} efterlysning + ${value.convictions} Convictions +
    +
    +
    +
    Borger ID: ${value.citizenid}
      +
    +
    +
    +`; + }); + + $(".profile-items").html(profileHTML); +} + +window.addEventListener("message", (event) => { + if (event.data.action === "updateOfficerData") { + updateOfficerData(event.data.data); + } else if (event.data.action === "updateFingerprintData") { + const { fingerprint } = event.data; + if (fingerprint && fingerprint !== "") { + $(".manage-profile-fingerprint-input").val(fingerprint); + } else { + $(".manage-profile-fingerprint-input").val(""); + } + } +}); + +function updateOfficerData(officerData) { + const leaderboardBox = document.querySelector('.leaderboard-box'); + leaderboardBox.innerHTML = ''; + + const positions = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th', '21th', '22th', '23th', '24th', '25th']; + + officerData.forEach((officer, index) => { + const position = positions[index]; + const officerDiv = document.createElement('div'); + officerDiv.className = 'leaderboard-box-test'; + officerDiv.style.fontSize = '1.3vh'; + officerDiv.style.fontWeight = 'lighter'; + officerDiv.style.color = index < 3 ? 'white' : 'grey'; + + officerDiv.innerHTML = `► ${position}: ${officer.name} (${officer.callsign})${officer.totalTime}`; + leaderboardBox.appendChild(officerDiv); + }); +} + + +window.addEventListener("load", function () { + document + .getElementById("offenses-search") + .addEventListener("keyup", function () { + var search = this.value.toLowerCase(); + if (search.length > 1) { + $.each($(".offense-item"), function (i, d) { + const Name = $(this) + .find(".offense-item-offense") + .html() + .toLowerCase(); + const Number = $(this) + .find(".offense-item-id") + .html() + .toLowerCase(); + if (Name.includes(search)) { + $(this).show(); + } else if (Number.includes(search)) { + $(this).show(); + } else { + $(this).hide(); + } + }); + } else { + $.each($(".offense-item"), function (i, d) { + $(this).show(); + }); + } + }); +}); + + + // Dispatch Map // +customcrs = L.extend({}, L.CRS.Simple, { + projection: L.Projection.LonLat, + scale: function(zoom) { + + return Math.pow(2, zoom); + }, + zoom: function(sc) { + + return Math.log(sc) / 0.6931471805599453; + }, + distance: function(pos1, pos2) { + var x_difference = pos2.lng - pos1.lng; + var y_difference = pos2.lat - pos1.lat; + return Math.sqrt(x_difference * x_difference + y_difference * y_difference); + }, + transformation: new L.Transformation(0.02072, 117.3, -0.0205, 172.8), + infinite: false +}); + +var map = L.map("map-item", { +crs: customcrs, +minZoom: 3, +maxZoom: 5, +zoom: 5, + +noWrap: true, +continuousWorld: false, +preferCanvas: true, + +center: [0, -1024], +maxBoundsViscosity: 1.0 +}); + +var customImageUrl = 'https://i.imgur.com/EdOZjzF.jpg'; + +var sw = map.unproject([0, 1024], 3 - 1); +var ne = map.unproject([1024, 0], 3 - 1); +var mapbounds = new L.LatLngBounds(sw, ne); +map.setView([-300, -1500], 4); +map.setMaxBounds(mapbounds); + + +map.attributionControl.setPrefix(false) + +L.imageOverlay(customImageUrl, mapbounds).addTo(map); + +map.on('dragend', function() { + if (!mapbounds.contains(map.getCenter())) { + map.panTo(mapbounds.getCenter(), { animate: false }); + } +}); + +var Dispatches = {}; +var DispatchPing = L.divIcon({ + html: '', + iconSize: [20, 20], + className: 'map-icon map-icon-ping', + offset: [-10, 0] +}); +var mapMarkers = L.layerGroup(); + +function DispatchMAP(DISPATCH) { + var MIN = Math.round(Math.round((new Date() - new Date(DISPATCH.time)) / 1000) / 60); + if (MIN > 10) return; + + var COORDS_X = DISPATCH.origin.x + var COORDS_Y = DISPATCH.origin.y + var CODE = DISPATCH.callId + + Dispatches[CODE] = L.marker([COORDS_Y, COORDS_X], { icon: DispatchPing }); + Dispatches[CODE].addTo(map); + + // Automatic deletion after a period of 20 minutes, equivalent to 1200000 milliseconds. + setTimeout(function() { + map.removeLayer(Dispatches[CODE]); + }, 1200000); + + Dispatches[CODE].bindTooltip(`
    ${DISPATCH.dispatchMessage}
    #${DISPATCH.callId}
    `, + { + direction: 'top', + permanent: false, + offset: [0, -10], + opacity: 1, + interactive: true, + className: 'map-tooltip' + }); + + Dispatches[CODE].addTo(mapMarkers); + + Dispatches[CODE].on('click', function() { + const callId = CODE + $.post( + `https://${GetParentResourceName()}/setWaypoint`, + JSON.stringify({ + callid: callId, + }) + ); + }); + + Dispatches[CODE].on('contextmenu', function() { + map.removeLayer(Dispatches[CODE]); + }); + +} + +function ClearMap() { +$(".leaflet-popup-pane").empty(); +$(".leaflet-marker-pane").empty(); +} + +$(".map-clear").on('click', function() { + $(".map-clear").empty(); + $(".map-clear").prepend( + `` + ); + setTimeout(() => { + $(".map-clear").empty(); + $(".map-clear").html("Fjern"); + ClearMap(); + }, 1500); +}); diff --git a/resources/[ps]/ps-mdt/ui/dashboard.html b/resources/[ps]/ps-mdt/ui/dashboard.html new file mode 100644 index 0000000..6e52c8d --- /dev/null +++ b/resources/[ps]/ps-mdt/ui/dashboard.html @@ -0,0 +1,1068 @@ + + + + + + + + Project Sloth MDT + + + + + + + + + + + + + + + + + + + + + +
      +
        +
        +
        + + + +
        +
        +
        Tilknyttede enheder
        +
        +
        +
        +
        + + + + + +
        +
        +
        Domme
        +
        +
        +
        +
        + +
        +
        +
        Kendte hændelser
        +
        +
        +
        +
        + +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser.... +
        +
        +
        +
        +
        +
        + +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        +
        +
        Udsendelser
        +
        Opdater
        +
        +
        + +
        + +
        +
        Arrestordre
        +
        + +
        +
        +
        + +
        +
        +
        Dagens citat
        +
        All lives matter... Med undtagelse af Amerikanere.
        +
        +
        +
        +
        Opslagstavle
        +
        +
        +
        +
        +
        +
        +
        Udsendelse
        +
        +
        Aktive enheder
        +
        0
        +
        0
        +
        0
        +
        0
        +
        0
        + +
        +
        +
        +
        Seneste opkald
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        Profiler
        +
        +
        +
        +
        +
        +
        Administrer profiler
        +
        +
        Du redigerer lige nu ...
        +
        Gem
        +
        +
        AKTIV ARRESTORDRE
        +
        + +
        +
        Borger ID
        +
        +
        +
        Fornavn
        +
        +
        +
        Efternavn
        +
        +
        +
        Fødselsdate
        +
        +
        +
        Fingeraftryk
        +
        +
        +
        Telefonnummer
        +
        +
        +
        Beskæftigelse
        +
        +
        +
        Ejendom
        +
        +
        +
        Billede
        +
        +
        +
        +
        + +
        +
        +
        +
        Tilladelser
        +
        +
        +
        +
        Køretøjer
        +
        +
        +
        +
        +
        Tags
        +
        +
        +
        +
        +
        +
        Ejendomme
        +
        +
        + +
        Vis domme
        +
        Vis hændelser
        +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        +
        Hændelser
        +
        Opdater
        +
        +
        +
        +
        Højreklik for at slette hændelser.
        +
        +
        +
        +
        +
        +
        Administrer hændelser
        +
        +
        + +
        +
        Du opretter en ny hændelse
        +
        Titel
        +
        + +
        +
        +
        Tags
        +
        +
        +
        +
        +
        +
        +
        +
        Beviser
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        Involverede
        +
        +
        +
        Betjente involveret
        +
        +
        +
        + +
        +
        +
        +
        +
        Borgere involveret
        +
        +
        +
        + +
        +
        +
        +
        +
        Kriminelle involveret
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        + +
        +
        Rapporter
        +
        Opdater
        +
        +
        +
        Højreklik forneden for at slette rapport.
        +
        +
        +
        +
        +
        +
        Administrer rapport
        +
        Ny
        +
        Gem
        +
        +
        Du er ved at skrive ny rapport
        +
        Titel
        +
        + + +
        + +
        Type
        +
        + + +
        + +
        +
        +
        +
        Tags
        +
        +
        +
        +
        +
        +
        +
        Betjente involveret
        +
        +
        +
        +
        +
        +
        +
        Borgere involveret
        +
        +
        +
        +
        + +
        + +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        + +
        +
        Bolos
        +
        Opdater
        +
        +
        +
        +
        +
        +
        +
        +
        Manage Bolo
        +
        New
        +
        Save
        +
        +
        You are currently creating a new BOLO
        +
        Title
        +
        + + +
        + +
        Plate
        +
        + +
        Owner
        +
        + +
        Individual
        +
        + + +
        + +
        +
        +
        +
        Tags
        +
        +
        +
        +
        +
        +
        +
        Betjente involveret
        +
        +
        +
        +
        + +
        + +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        + +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        + +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        Motorregister
        +
        +
        + +
        +
        +
        +
        +
        Køretøjs informationer
        +
        Gem
        +
        +
        + +
        +
        Nummerplade
        +
        +
        +
        Ejer
        +
        +
        +
        Klasse
        +
        +
        +
        Mærke/Model
        +
        +
        +
        Billede URL
        +
        +
        +
        Køretøjs point: 0
        +
        +
        +
        +
        +
        Kendt information
        +
        +
        +
        Farve
        +
        Beslaglagt
        +
        Efterlyst
        +
        Kode 5
        +
        Stjålet
        +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        Våbenregister
        +
        +
        + +
        +
        +
        +
        +
        Våben information
        +
        Ny
        +
        Gem
        +
        +
        + +
        +
        Serienummer
        +
        +
        +
        Registreret til
        +
        +
        +
        Model
        +
        +
        +
        Klasse
        +
        +
        +
        Billede URL
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        Logs
        +
        +
        +
        +
        Betjent-aktivitet
        +
        +
        +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        + +
        Pacific Bank CAM 1
        +
        Pacific Bank CAM 2
        +
        Pacific Bank CAM 3
        +
        Limited Ltd Grove St.
        +
        Rob's Liqour Prosperity St.
        +
        Rob's Liqour San Andreas Ave.
        +
        Limited Ltd Ginger St.
        +
        24/7 Supermarkt Innocence Blvd.
        +
        Rob's Liqour El Rancho Blvd.
        +
        Limited Ltd West Mirror Drive
        +
        24/7 Supermarkt Clinton Ave
        +
        Limited Ltd Banham Canyon Dr
        +
        Rob's Liqour Great Ocean Hwy
        +
        24/7 Supermarkt Ineseno Road
        +
        24/7 Supermarkt Barbareno Rd.
        +
        24/7 Supermarkt Route 68
        +
        Rob's Liqour Route 68
        +
        24/7 Supermarkt Senora Fwy CAM 1
        +
        24/7 Supermarkt Alhambra Dr.
        +
        24/7 Supermarkt Senora Fwy CAM 2
        +
        Fleeca Bank Hawick Ave CAM 1
        +
        Fleeca Bank Hawick Ave CAM 2
        +
        Fleeca Bank Legion Square
        +
        Fleeca Bank Del Perro Blvd
        +
        Fleeca Bank Great Ocean Hwy
        +
        Paleto Bank
        +
        Del Vecchio
        Liquor Paleto Bay
        +
        Don's Country Store Paleto Bay CAM 1
        +
        Don's Country Store Paleto Bay CAM 2
        +
        Don's Country Store Paleto Bay CAM 3
        +
        Vangelico Jewelery CAM 1
        +
        Vangelico Jewelery CAM 2
        +
        Vangelico Jewelery CAM 3
        +
        Vangelico Jewelery CAM 4
        +
        +
        +
        +
        +
        +
        + +
        +
        HYPERION RIGSPOLITI
        +
        Mobil Data Terminal
        +
        +
        +
        Indlæser...
        +
        00:00
        +
        +
        +
        Velkommen, indlæser... +
        +
        +
        +
        +
        + +
        +
        Alarmopkald
        +
        +
        +
        +
        + +
        +
        +
        +
        + +
        +
        +
        Alarmopkalds-map
        +
        Fjern blips
        +
        +
        +
        +
        +
        + + + + + diff --git a/resources/[ps]/ps-mdt/ui/img/247Back.webp b/resources/[ps]/ps-mdt/ui/img/247Back.webp new file mode 100644 index 0000000..851e8e0 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/247Back.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/247SmallBack.webp b/resources/[ps]/ps-mdt/ui/img/247SmallBack.webp new file mode 100644 index 0000000..9c504cd Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/247SmallBack.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/247SmallFront.webp b/resources/[ps]/ps-mdt/ui/img/247SmallFront.webp new file mode 100644 index 0000000..5fab0b2 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/247SmallFront.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/9Xn6xXK.webp b/resources/[ps]/ps-mdt/ui/img/9Xn6xXK.webp new file mode 100644 index 0000000..98d160f Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/9Xn6xXK.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/BBSP.webp b/resources/[ps]/ps-mdt/ui/img/BBSP.webp new file mode 100644 index 0000000..c17bcee Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/BBSP.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/BCSO.webp b/resources/[ps]/ps-mdt/ui/img/BCSO.webp new file mode 100644 index 0000000..d3cecdf Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/BCSO.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/LSPD.webp b/resources/[ps]/ps-mdt/ui/img/LSPD.webp new file mode 100644 index 0000000..84e59b2 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/LSPD.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/LSSD.webp b/resources/[ps]/ps-mdt/ui/img/LSSD.webp new file mode 100644 index 0000000..bff0868 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/LSSD.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/citation.png b/resources/[ps]/ps-mdt/ui/img/citation.png new file mode 100644 index 0000000..2e45307 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/citation.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/court.png b/resources/[ps]/ps-mdt/ui/img/court.png new file mode 100644 index 0000000..91243ea Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/court.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/court.webp b/resources/[ps]/ps-mdt/ui/img/court.webp new file mode 100644 index 0000000..a10ec58 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/court.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/ems_badge.png b/resources/[ps]/ps-mdt/ui/img/ems_badge.png new file mode 100644 index 0000000..67a2780 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/ems_badge.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/ems_badge.webp b/resources/[ps]/ps-mdt/ui/img/ems_badge.webp new file mode 100644 index 0000000..4bbff1c Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/ems_badge.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/ems_badge_zonah.png b/resources/[ps]/ps-mdt/ui/img/ems_badge_zonah.png new file mode 100644 index 0000000..9245457 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/ems_badge_zonah.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/ems_badge_zonah.webp b/resources/[ps]/ps-mdt/ui/img/ems_badge_zonah.webp new file mode 100644 index 0000000..664f3a3 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/ems_badge_zonah.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/female.png b/resources/[ps]/ps-mdt/ui/img/female.png new file mode 100644 index 0000000..2159343 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/female.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/fleeca.webp b/resources/[ps]/ps-mdt/ui/img/fleeca.webp new file mode 100644 index 0000000..98bb275 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/fleeca.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/h7S5f9J.webp b/resources/[ps]/ps-mdt/ui/img/h7S5f9J.webp new file mode 100644 index 0000000..0e8f65b Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/h7S5f9J.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/liquor.webp b/resources/[ps]/ps-mdt/ui/img/liquor.webp new file mode 100644 index 0000000..bae4358 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/liquor.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/male.png b/resources/[ps]/ps-mdt/ui/img/male.png new file mode 100644 index 0000000..d66d894 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/male.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/not-found.webp b/resources/[ps]/ps-mdt/ui/img/not-found.webp new file mode 100644 index 0000000..cbcc585 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/not-found.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/pacific1.webp b/resources/[ps]/ps-mdt/ui/img/pacific1.webp new file mode 100644 index 0000000..c407612 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/pacific1.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/pacific2.webp b/resources/[ps]/ps-mdt/ui/img/pacific2.webp new file mode 100644 index 0000000..c77ce9c Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/pacific2.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/pacific3.webp b/resources/[ps]/ps-mdt/ui/img/pacific3.webp new file mode 100644 index 0000000..ddf5bb6 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/pacific3.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/paleto.webp b/resources/[ps]/ps-mdt/ui/img/paleto.webp new file mode 100644 index 0000000..9430fb1 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/paleto.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/profile_pic.png b/resources/[ps]/ps-mdt/ui/img/profile_pic.png new file mode 100644 index 0000000..c3d55ce Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/profile_pic.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/sapr.webp b/resources/[ps]/ps-mdt/ui/img/sapr.webp new file mode 100644 index 0000000..b257b5c Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/sapr.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/sasp_badge.png b/resources/[ps]/ps-mdt/ui/img/sasp_badge.png new file mode 100644 index 0000000..b7f0e2d Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/sasp_badge.png differ diff --git a/resources/[ps]/ps-mdt/ui/img/sasp_badge.webp b/resources/[ps]/ps-mdt/ui/img/sasp_badge.webp new file mode 100644 index 0000000..59f74b2 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/sasp_badge.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/sast_badge.webp b/resources/[ps]/ps-mdt/ui/img/sast_badge.webp new file mode 100644 index 0000000..382b968 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/sast_badge.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/val1.webp b/resources/[ps]/ps-mdt/ui/img/val1.webp new file mode 100644 index 0000000..e8cc7b3 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/val1.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/val2.webp b/resources/[ps]/ps-mdt/ui/img/val2.webp new file mode 100644 index 0000000..1d4e0e5 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/val2.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/val3.webp b/resources/[ps]/ps-mdt/ui/img/val3.webp new file mode 100644 index 0000000..182f36c Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/val3.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/val4.webp b/resources/[ps]/ps-mdt/ui/img/val4.webp new file mode 100644 index 0000000..a566548 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/val4.webp differ diff --git a/resources/[ps]/ps-mdt/ui/img/warrant_pfp.png b/resources/[ps]/ps-mdt/ui/img/warrant_pfp.png new file mode 100644 index 0000000..f288870 Binary files /dev/null and b/resources/[ps]/ps-mdt/ui/img/warrant_pfp.png differ diff --git a/resources/[ps]/ps-mdt/ui/style.css b/resources/[ps]/ps-mdt/ui/style.css new file mode 100644 index 0000000..6017dce --- /dev/null +++ b/resources/[ps]/ps-mdt/ui/style.css @@ -0,0 +1,6750 @@ +@import url('https://fonts.googleapis.com/css?family=Montserrat'); + +:root { + --color-1: #1E3955; + --color-2: #213F5F; + --color-3: #2C537B; + --color-4: #23405E; + --color-5: #152638; + --color-6: #121f2c; + --color-7: rgb(28, 54, 82); + --color-8: #2554cc; + --color-9: #6E707C; + --color-10: #8f741b; +} + +body { + font-family: 'Montserrat', sans-serif; + overflow: hidden; + display: none; +} + +textarea { + font-family: 'Montserrat', sans-serif; +} + +::-webkit-scrollbar { + width: 0px; +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.dashboard-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.badge-logo { + margin-left: 1vh; + width: 12vh; + height: 12vh; +} + +.profile-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.incidents-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.bolos-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.reports-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.penalcode-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.sop-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.dmv-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.weapons-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.stafflogs-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; + overflow: auto +} + +.container-load { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.header { + height: 4vh; + background-color: var(--color-1); + border: 5px solid #393B39; + border-top-right-radius: 50px; + border-bottom-right-radius: 50px; + width: 96.5%; + position: absolute; + top: 4vh; + display: flex; + align-items: center; + user-select: none; +} + +.header-left { + display: flex; + flex-direction: column; + text-align: left; + margin-left: 10px; + margin-right: 0px; +} + +.header-middle { + background-color: var(--color-2); + border-radius: 15px; + border: 5px solid #393B39; + width: fit-content; + height: 3.5vh; + padding: 8px; + padding-left: 20px; + padding-right: 20px; + display: flex; + flex-direction: column; + text-align: center; + align-items: normal; + color: white; + margin: auto; + margin-top: -10px; + font-size: 15px; +} + +.header-right { + display: flex; + flex-direction: column; + text-align: right; + margin: auto; + margin-right: 35px; + margin-left: 0px; +} + +.main-container { + border-top: 5px solid var(--color-3); + width: 100%; + height: 86%; + position: absolute; + display: flex; + bottom: 0; +} + +.nav-menu { + background-color: var(--color-1); + border-right: 5px solid var(--color-3); + min-width: 22.5vh; + height: 100%; + display: flex; + flex-direction: column; + user-select: none; + border-bottom-left-radius: 15px; +} + +.nav-item { + background-color: var(--color-4); + margin-top: 10px; + padding: 10px; + color: white; + font-size: 18px; + font-weight: bolder; +} + +.nav-item:hover { + background-color: var(--color-3); +} + +.active-nav { + background-color: var(--color-3); +} + +.warrants-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; +} + +.warrants-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.fa-search { + font-size: 15px; + font-weight: normal; +} + +.warrants-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 95%; + height: 55vh; +} + +.warrants-item { + background-color: var(--color-5); + width: 100%; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; +} + +.warrants-item:hover { + background-color: var(--color-3); +} + +.warrant-image { + width: 9vh; + height: 9vh; + margin-left: 5px; + margin-top: auto; + margin-bottom: auto; +} + +.warrant-title { + font-size: 16px; + font-weight: lighter; + color: white; + margin-top: 5px; +} + +.warrant-item-info { + color: #cccccc; + font-size: 12px; +} + +.warrant-bottom-info { + display: flex; + margin-top: 1vh; + margin-bottom: 0.75vh; + width: 100%; +} + +.warrant-id { + color: white; + font-size: 12px; +} + +.warrant-expiry-date { + color: white; + font-size: 12px; + margin: auto; + margin-right: 10px; +} + +.quotes-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + width: 50vh; + height: 75px; + margin-top: 10px; + margin-left: 10px; + display: flex; + align-items: center; + user-select: none; +} + +.quote-title { + font-size: 14px; + background-color: var(--color-4); + padding: 5px; + margin: 10px 0px 10px 10px; + text-align: center; + color: white; + font-weight: bolder; + width: 85px; + /* height: 30px; */ + text-shadow: black 1px 1px; +} + +.quote { + margin-right: 10px; + margin-left: 10px; + /* margin-bottom: 25px; */ + width: 100%; + background-color: var(--color-5); + height: 30px; + padding: 10px; + text-align: center; + display: flex; + font-style: italic; +} + +.quote-span { + margin: auto; + color: white; + font-size: 16px; +} + +.bulletin-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 100%; + width: 50vh; + margin-top: 10px; + margin-bottom: 10px; + margin-left: 10px; + user-select: none; + overflow: hidden; +} + +.bulletin-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-right: 0px; + margin-bottom: 0px; + width: 83.5%; + align-items: center; + user-select: none; +} + +.bulletin-items-continer { + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + overflow: auto; + height: 100%; + display: flex; + flex-direction: column; +} + +.bulletin-item { + background-color: var(--color-5); + width: 45vh; + /* min-height: 7.7vh; */ + /* height: 7.7vh; */ + padding: 10px; + display: flex; + flex-direction: column; + margin-bottom: 10px; +} + +.bulletin-item:hover { + background-color: var(--color-3); +} + +.bulletin-item-title { + color: white; + margin-left: 5px; + font-size: 20px; + text-align: left; +} + +span.bulletin-item-title { + outline: none; + border: none; +} + +span.bulletin-item-title[contenteditable]:empty::before { + content: 'Enter Title'; +} + +.bulletin-item-info { + color: #cccccc; + font-size: 15px; + margin-left: 5px; + margin-top: 10px; + text-align: left; + padding-bottom: 0.8vh; + overflow-wrap: break-word; +} + +span.bulletin-item-info { + outline: none; + border: none; +} + +span.bulletin-item-info[contenteditable]:empty::before { + content: 'Enter Bulletin Information'; +} + +.bulletin-bottom-info { + display: flex; + margin-left: 5px; + margin-bottom: 0px; + color: white; + font-size: 12px; + height: 100%; +} + +.bulletin-date { + margin: auto; + margin-right: 5px; + margin-bottom: 0px; +} + +.bulletin-id { + margin: auto; + margin-left: 0px; + margin-bottom: 0px; +} + +.dispatch-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 81.1vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + margin-right: 15px; +} + +.dispatch-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.active-unit-title { + background-color: var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 2px; + margin-left: 10px; + margin-left: 13px; + width: 57.5%; + align-items: center; + user-select: none; +} + +.active-unit-count { + background-color: var(--color-3); + color: white; + font-weight: bolder; + font-size: 14px; + padding-top: 6px; + padding-bottom: 6px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 3px; + margin-left: 3px; + width: 8%; + align-items: center; + user-select: none; + border-radius: 5px; +} + +.calls-title { + background-color: var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 2px; + margin-left: 10px; + margin-left: 13px; + width: 95%; + align-items: center; + user-select: none; +} + +#police-count { + background-color: #093095; +} + +#bcso-count { +background-color: #cc7e25;; +} + +#sasp-count { +background-color: #2589cc; +} + +#ems-count { + background-color: #950909; +} + +#doj-count { + background-color: #525252; +} + +#doc-count { + background-color: #7b25cc; +} + +#pa-count { + background-color: #008080; +} + +.active-unit-list { + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + overflow: auto; + height: 35vh; + display: flex; + flex-direction: column; + width: 95%; +} + +.active-unit-item { + padding-top: 7.5px; + padding-bottom: 7.5px; + padding-right: 10px; + padding-left: 10px; + /* height: 3vh; */ + background-color: var(--color-5); + display: flex; + align-items: center; + margin-bottom: 5px; +} + +#draggedItem { + position: absolute; + z-index: 80; + -webkit-transition: opacity 0.2s ease; + -moz-transition: opacity 0.2s ease; + -ms-transition: opacity 0.2s ease; + transition: opacity 0.2s ease; + opacity: 0; + pointer-events: none; + + padding: 10px; + height: 3vh; + background-color: var(--color-5); + display: flex; + align-items: center; + margin-bottom: 5px; + width: 45vh; +} + +.unit-status { + width: fit-content; + padding: 5px; + padding-left: 15px; + padding-right: 15px; + color: white; + font-size: 12px; + font-weight: bolder; + margin: auto; + margin-left: 5px; + margin-right: 0px; + background-color: #0B9509; + border-radius: 10px; +} + +.green-status { + background-color: #099517; +} + +.yellow-status { + background-color: #958F09; +} + +.unit-job { + width: fit-content; + padding: 5px; + padding-left: 15px; + padding-right: 15px; + color: white; + font-size: 12px; + font-weight: bolder; + margin: auto; + margin-left: 5px; + margin-right: 0px; + background-color: #093095; + border-radius: 10px; +} + +.unit-police { + background-color: #093095; +} + +.unit-ems { + background-color: #950909; +} + +.unit-doc { + background-color: #7b25cc; +} + +.unit-pa { + background-color: #008080; +} + +.unit-name { + margin: auto; + margin-left: 10px; + margin-right: 0px; + font-size: 12px; + font-weight: bolder; + color: white; +} + +.unit-radio { + margin: auto; + margin-right: 5px; + font-size: 12px; + font-weight: bolder; + color: white; + background-color: var(--color-3); + padding: 5px; + padding-left: 12.5px; + padding-right: 12.5px; + border-radius: 5px; +} + +.active-calls-list { + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + overflow: auto; + height: 100%; + display: flex; + flex-direction: column; + width: 95%; +} + +.active-calls-item { + height: fit-content; + background-color: var(--color-5); + display: flex; + align-items: center; + margin-bottom: 5px; +} + +.active-call-inner-container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +.red-call { + background-color: #381515; +} + +.call-item-top { + height: 50%; + width: 100%; + display: flex; + align-items: center; + margin: auto; + margin-top: .5vh; +} + +.call-number { + background-color: #950909; + color: white; + font-size: 15px; + font-weight: bolder; + padding: 2.5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 10px; + width: fit-content; + margin: auto; + margin-left: .75vh; + margin-right: 0; +} + +.call-code { + background-color: #097C95; + color: white; + font-size: 15px; + font-weight: bolder; + padding: 2.5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 10px; + width: fit-content; + margin: auto; + margin-left: 5px; + margin-right: 0; +} + +.call-title { + color: white; + font-size: 20px; + font-weight: bolder; + padding: 2.5px; + padding-left: 0px; + padding-right: 0px; + border-radius: 10px; + width: fit-content; + margin: auto; + margin-left: 5px; + margin-right: 0; +} + +.call-radio { + margin: auto; + margin-left: auto; + margin-right: .5vh; + font-size: 15px; + font-weight: bolder; + color: white; + background-color: var(--color-3); + padding: 5px; + padding-left: 12.5px; + padding-right: 12.5px; + border-radius: 5px; +} + +.call-item-bottom { + height: fit-content; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + margin: auto; + margin-top: 0vh; + margin-left: .75vh; + padding-bottom: .75vh; +} + +.call-bottom-info { + color: white; + font-size: 15px; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + margin-left: 0.3vh; + overflow:wrap; + white-space:normal; +} + +.dispatch-line { + background-color: rgba(128, 128, 128, 0.1); + height: 0.05vh; + width: 100%; + margin-top: 0.1vh; + margin-bottom: 0.1vh +} + +.call-bottom-info > .far { + margin-right: .1vh; +} + +.call-bottom-information { + margin-top: 0.5vh; +} + +.call-victim { + color: white; + font-size: 15px; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + margin-left: 0px; +} + +a { + text-decoration: none; +} + +.profile-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; +} + + + +.profile-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.profile-title:hover { + background-color: var(--color-3); +} + +.profile-search-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#profile-search-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#profile-search-input::placeholder { + color: white; +} + +.profile-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 95%; + height: 100%; + margin-bottom: 15px; +} + +.profile-item { + background-color: var(--color-5); + width: 100%; + height: 12vh; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; + +} + +.profile-item:hover { + background-color: var(--color-3); +} + +.profile-image { + width: 10vh; + height: 10vh; + margin-left: 10px; + margin-top: auto; + margin-bottom: auto; + object-fit: cover; +} + +.profile-item-title { + font-size: 16px; + font-weight: lighter; + color: white; + padding-top: 2px; +} + +.profile-tags { + display: flex; + overflow-x: auto; + width: 100%; + margin-top: 10px; + margin-bottom: 5px; +} + +.profile-criminal-tags { + display: flex; + overflow-x: auto; + width: 100%; + margin-top: 5px; + margin-bottom: 5px; +} + +.profile-tag { + margin: auto; + margin-left: 0px; + margin-right: 6px; + padding: 4px; + padding-left: 7px; + padding-right: 7px; + border-radius: 10px; + color: white; + font-size: 12px; + font-weight: bolder; + background-color: #956E09; +} + +.profile-bottom-info { + display: flex; + margin: auto; + width: 100%; +} + +.profile-id { + color: white; + font-size: 13px; +} + +.manage-profile-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; +} + +.manage-profile-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.manage-profile-editing-title { + background-color: var(--color-3); + color: white; + font-size: 15px; + font-weight: lighter; + padding-top: 10px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + width: 80%; + align-items: center; + user-select: none; + display: block; +} + +.manage-profile-save { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 10px; + padding-bottom: 10px; + background-color: #1b8f25; + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.manage-profile-save:hover { + background-color: #1caa28; +} + +.manage-profile-info-container { + display: flex; + flex-direction: row; + width: 95%; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; +} + +.manage-profile-pic { + width: 45%; + object-fit: cover; +} + +.manage-profile-info-inner-container { + display: flex; + flex-direction: column; + width: 55%; +} + +.manage-profile-citizenid { + color: white; + margin-left: 10px; + font-size: 14px; + user-select: none; +} + +.manage-profile-citizenid-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +.manage-cid-pic { + color: white; + font-size: 16px; + margin-left: 10px +} + +.line { + background-color: var(--color-3); + height: 2px; + margin-left: 10px; + margin-bottom: 10px; +} + +.manage-profile-name { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.manage-profile-name-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +.manage-profile-dob { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.manage-profile-dob-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +.manage-profile-fingerprint { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.manage-profile-fingerprint-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +.manage-profile-phonenumber { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.manage-profile-phonenumber-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +.manage-profile-job { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.manage-profile-job-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +.manage-profile-url { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.manage-profile-url-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 21.75vh; +} + +.manage-profile-info { + width: 92.5%; + margin: auto; + margin-top: 10px; + margin-bottom: 15px; + border: none; + outline: none; + height: 100%; + resize: none; + background-color: var(--color-5); + color: white; + font-size: 16px; + padding: 10px; +} + +.manage-profile-active-warrant { + display: none; + margin: auto; + padding: 8px; + color: red; + font-weight: bold; + font-size: 20px; +} + +.manage-profile-right-container { + display: flex; + flex-direction: column; + height: 97.9%; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + margin-right: 15px; +} + +.manage-profile-licenses-container { + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + height: 20%; +} + +.license-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.licenses-holder { + overflow: auto; + margin: auto; + margin-top: 5px; + width: 95%; + user-select: none; +} + +.license-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: rgb(255, 255, 255); + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; +} + +.manage-profile-tags-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + height: 20%; + border: 2px solid var(--color-3); + margin-top: 5px; + min-height: 100px; + max-height: 200px; + overflow: scroll; +} + +.tags-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 5px; + margin-right: 0px; + margin-bottom: 0px; + width: 84%; + align-items: center; + user-select: none; +} + +.tags-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 5px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.tags-add-btn:hover { + background-color: var(--color-3); +} + +.tags-holder { + overflow: auto; + margin: auto; + margin-top: 5px; + width: 95%; + user-select: none; +} + +.tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-bottom: 5px; + margin-left: 0px; + margin-right: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; +} + +span.tag-input[contenteditable]:empty::before { + content: 'Input Tag'; +} + +.tag-input { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-top: 5px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + outline: none; + border: none; +} + +.manage-profile-vehs-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + height: 20%; + border: 2px solid var(--color-3); + margin-top: 5px; + max-height: 150px; + overflow: scroll; +} + +.vehs-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.vehs-holder { + overflow: auto; + margin: auto; + margin-top: 5px; + width: 95%; + user-select: none; +} + +.veh-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-top: 5px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; +} + +.manage-profile-houses-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + height: 20%; + border: 2px solid var(--color-3); + margin-top: 5px; + max-height: 150px; + overflow: scroll; +} + +.houses-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.houses-holder { + overflow: auto; + margin: auto; + margin-top: 5px; + width: 95%; + user-select: none; +} + +.houses-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-top: 5px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: bolder; + background-color: white; + user-select: none; +} + +.manage-profile-gallery-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + margin-top: 5px; + height: 20%; + overflow: scroll; +} + +.gallery-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 5px; + margin-right: 0px; + margin-bottom: 0px; + width: 84%; + align-items: center; + user-select: none; +} + +.gallery-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 5px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.gallery-add-btn:hover { + background-color: var(--color-3); +} + +.gallery-inner-container { + overflow: auto; + white-space: nowrap; + margin: auto; + margin-top: 5px; + width: 95%; + user-select: none; +} + +.gallery-img { + width: 10vh; + filter: blur(5px); + object-fit: cover; +} + +.convictions-known, .incidents-known { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +.convictions-known-container, .incidents-known-container { + background-color: var(--color-5); + width: 95vh; + height: 45vh; + margin: auto; + margin-top: 10px; + display: flex; + flex-direction: column; + z-index: 9998; + display: none; +} + +.convictions-known-title, .incidents-known-title { + background-color: var(--color-4); + color: white; + font-size: 20px; + font-weight: bolder; + text-align: center; + padding-top: 15px; + padding-bottom: 15px; + width: 95%; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + user-select: none; +} + +.convictions-title { + background-color: var(--color-1); + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + width: 100%; + align-items: center; + user-select: none; +} + +.convictions-title:hover { + background-color: var(--color-3); +} + +.convictions-holder { + overflow: scroll; + max-height: 87%; + margin: auto; + margin-top: 5px; + width: 95%; + user-select: none; +} + +.profile-incidents-title { + background-color: var(--color-1); + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + width: 100%; + align-items: center; + user-select: none; +} + +.profile-incidents-title:hover { + background-color: var(--color-3); +} + +.profile-incidents-holder { + overflow: scroll; + max-height: 87%; + margin: auto; + margin-top: 5px; + width: 95%; + user-select: none; +} + +.incident-number { + padding-right: 8px; +} + +.incident-timestamp { + color: #303030; + font-size: 10px; + font-weight: 500; +} + +.loader { + position: absolute; + left: 50%; + top: 50%; + z-index: 1; + width: 120px; + height: 120px; + border: 12px solid var(--color-1); + border-radius: 50%; + border-top: 12px solid var(--color-3); + -webkit-animation: spin 2s linear infinite; + animation: spin 2s linear infinite; +} + +.profile-loader { + margin-top: 5vh; + margin-left: auto; + margin-right: auto; + z-index: 1; + width: 120px; + height: 120px; + border: 12px solid var(--color-4); + border-radius: 50%; + border-top: 12px solid var(--color-3); + -webkit-animation: spin 2s linear infinite; + animation: spin 2s linear infinite; +} + +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.gallery-image-enlarged { + width: 40vh; + position: absolute; + top: 20%; + left: 25%; + display: none; + z-index: 999; +} + +/* Context Menu */ + +.contextmenu { + position: absolute; + width: fit-content; + padding: 2px; + margin: 0; + border: 1px solid var(--color-3); + background: var(--color-5); + z-index: 9999; + border-radius: 3px; + box-shadow: 1px 1px 4px rgba(0,0,0,.2); + opacity: 0; + transform: translate(0, 15px) scale(.95); + transition: transform 0.1s ease-out, opacity 0.1s ease-out; + pointer-events: none; +} + +.contextmenu-item { + display: block; + position: relative; + margin: 0; + padding: 0; + white-space: nowrap; +} + +.contextmenu-btn { + display: block; + color: white; + font-size: 13px; + cursor: pointer; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 8px; + border-radius: 3px; +} + +.contextmenu-btn { + outline: 0 none; + text-decoration: none; +} + +.contextmenu-text { + margin-left: 5px; +} + +.contextmenu-btn .fa { + position: absolute; + left: 8px; + top: 50%; + transform: translateY(-50%); +} + +.contextmenu-item-disabled { + opacity: .5; + pointer-events: none; +} + +.contextmenu-item-disabled .contextmenu-btn { + cursor: default; +} + +.contextmenu-item-submenu::after { + content: ""; + position: absolute; + right: 6px; + top: 50%; + transform: translateY(-50%); + border: 5px solid transparent; + border-left-color: #808080; +} + +.contextmenu-item-submenu:hover::after { + border-left-color: #fff; +} + +.contextmenu-show, +.contextmenu-item:hover > .contextmenu { + opacity: 1; + transform: translate(0, 0) scale(1); + pointer-events: auto; +} + +.contextmenu-item:hover > .contextmenu { + transition-delay: 300ms; +} + +.revoke-licence:hover { + background-color: #950909; +} + +.give-licence:hover { + background-color: #099517; +} + +.remove-image:hover { + background-color: #950909; +} + +.expand-image:hover { + background-color: #099517; +} + +.copy-image-link:hover { + background-color: #099517; +} + +.view-incident:hover { + background-color: var(--color-3); +} + +.view-incident2:hover { + background-color: var(--color-3); +} + +.make-waypoint:hover { + background-color: var(--color-3); +} + +.view-profile:hover { + background-color: var(--color-3); +} + +.gallery-upload-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#gallery-upload-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#gallery-upload-input::placeholder { + color: white; +} + +.penalcode-embed { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 96.5%; + width: 85%; + margin: auto; + overflow: hidden; +} + +.penalcode-embed iframe { + height: 96.5%; + width: 98%; + margin: auto; + border: none; + outline: none; +} + +.sop-embed { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 96.5%; + width: 85%; + margin: auto; + overflow: hidden; +} + +.sop-embed iframe { + height: 96.5%; + width: 98%; + margin: auto; + border: none; + outline: none; +} + +.incidents-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; +} + +.incidents-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.incidents-title:hover { + background-color: var(--color-3); +} + +.incidents-search-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#incidents-search-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#incidents-search-input::placeholder { + color: white; +} + +.incidents-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 95%; + height: 100%; + margin-bottom: 15px; +} + +.incidents-item { + background-color: var(--color-5); + width: 100%; + height: 5.5vh; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; + flex-direction: column; +} + +.incidents-item:hover { + background-color: var(--color-3); +} + +.incidents-top-holder { + width: 100%; + height: 50%; + display: flex; + align-items: center; +} + +.incidents-item-title { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-left: 5px; + max-width: 25vh; + margin-top: 5px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.incedent-report-name { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-right: 5px; + margin-top: 5px; +} + +.incidents-bottom-holder { + width: 100%; + height: 50%; + display: flex; + align-items: center; + padding-top: 5px; +} + +.incedent-report-id { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-left: 5px; + margin-bottom: 5px; +} + +.incedent-report-time-ago { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-right: 5px; + margin-bottom: 5px; +} + +.manage-incidents-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + max-height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + overflow: auto; +} + +.manage-incidents-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: auto; + width: 80%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.manage-incidents-title:hover { + background-color: var(--color-3); +} + +.manage-incidents-create { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 5px; + padding-bottom: 5px; + align-items: center; + background-color: var(--color-4); + margin: auto; + margin-left: 5px; + margin-top: 10px; + /* margin-right: 0px; */ + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.manage-incidents-create:hover { + background-color: var(--color-3); +} + +.manage-incidents-save { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 5px; + padding-bottom: 5px; + background-color: #1b8f25; + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.manage-incidents-save:hover { + background-color: #1caa28; +} + +.manage-incidents-title-tag { + font-size: 16px; + font-weight: lighter; + color: white; + width: 95%; + margin: auto; + text-align: left; + margin-top: 10px; + margin-bottom: 0px; +} + +.manage-incidents-title-input { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-incidents-title-input input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-incidents-reports-content { + width: 91%; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + border: none; + outline: none; + min-height: 30vh; + resize: none; + background-color: var(--color-5); + color: white; + font-size: 16px; + padding: 10px; + pointer-events: none; +} + +.manage-incidents-tags-container { + display: flex; + flex-direction: column; + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 94%; + height: fit-content; + align-items: center; + user-select: none; +} + +.manage-incidents-tags-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-right: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.manage-incidents-tags-add-btn:hover { + background-color: var(--color-3); +} + +.manage-incidents-tags-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7.25px; + padding-bottom: 7.25px; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-left: 5px; + margin-right: 0px; + width: 10%; + text-align: center; + pointer-events: none; +} + +.manage-incidents-tags-holder { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.manage-incidents-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-bottom: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; +} + +.manage-incidents-officers-container { + display: flex; + flex-direction: column; + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 94%; + height: fit-content; + align-items: center; + user-select: none; +} + +.manage-incidents-officers-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-right: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.manage-incidents-officers-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7.25px; + padding-bottom: 7.25px; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-left: 5px; + margin-right: 0px; + width: 10%; + text-align: center; + pointer-events: none; +} + +.manage-incidents-officers-add-btn:hover { + background-color: var(--color-3); +} + +.manage-incidents-officers-holder { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.manage-incidents-civilians-container { + display: flex; + flex-direction: column; + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 94%; + height: fit-content; + align-items: center; + user-select: none; +} + +.manage-incidents-civilians-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-right: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.manage-incidents-civilians-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7.25px; + padding-bottom: 7.25px; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-left: 5px; + margin-right: 0px; + width: 10%; + text-align: center; + pointer-events: none; +} + +.manage-incidents-civilians-add-btn:hover { + background-color: var(--color-3); +} + +.manage-incidents-civilians-holder { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.manage-incidents-evidence-container { + display: flex; + flex-direction: column; + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 94%; + height: fit-content; + align-items: center; + user-select: none; +} + +.manage-incidents-evidence-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-right: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.manage-incidents-evidence-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7.25px; + padding-bottom: 7.25px; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-left: 5px; + margin-right: 0px; + width: 10%; + text-align: center; + pointer-events: none; +} + +.manage-incidents-evidence-add-btn:hover { + background-color: var(--color-3); +} + +.manage-incidents-evidence-holder { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.manage-incidents-evidence { + width: 10vh; + filter: blur(5px); +} + +span.tag-incident-input[contenteditable]:empty::before { + content: 'Input Tag'; +} + +.tag-incident-input { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + outline: none; + border: none; +} + +.associated-incidents-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; +} + +.associated-incidents-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.associated-incidents-title:hover { + background-color: var(--color-3); +} + +.associated-incidents-tags-container { + display: flex; + flex-direction: column; + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 94%; + height: fit-content; + align-items: center; + user-select: none; +} + +.associated-incidents-tags-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-right: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.associated-incidents-tags-add-btn:hover { + background-color: var(--color-3); +} + +.associated-incidents-tags-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7.25px; + padding-bottom: 7.25px; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-left: 5px; + margin-right: 0px; + width: 10%; + text-align: center; + pointer-events: none; +} + +.associated-incidents-tags-holder { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.associated-incidents-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; +} + +.incidents-upload-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#incidents-upload-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#incidents-upload-input::placeholder { + color: white; +} + +.incidents-img { + width: 10vh; + filter: blur(5px); + object-fit: cover; +} + +.bulletin-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.bulletin-add-btn:hover { + background-color: var(--color-3); +} + +.associated-incidents-user-container { + display: flex; + flex-direction: column; + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + width: 94%; + height: fit-content; + align-items: center; + user-select: none; +} + +.associated-incidents-user-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.associated-incidents-user-tags-holder { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + min-height: 3.5vh; + max-height: 14vh; + user-select: none; + display: flex; + background-color: var(--color-5); +} + +.modify-charges-label { + color: white; + font-size: 13px; + font-weight: bolder; + border-bottom: 2px solid #2C537B; + padding: 2px; + margin: auto; + margin-top: 4px; + margin-bottom: -3px; + width: 95%; + align-items: center; + user-select: none; +} + +.associated-incidents-user-tag { + text-decoration: none; + margin-top: auto; + margin-bottom: auto; + margin-left: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: white; + font-size: 12px; + font-weight: 600; + background-color: black; + user-select: none; + width: fit-content; +} + +.associated-incidents-user-holder { + padding: 10px; + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 92%; + min-height: 3.5vh; + max-height: 37vh; + user-select: none; +} + +.associated-incidents-user { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-bottom: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; +} + +.associated-incidents-fine-input { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.associated-incidents-fine-input input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.associated-incidents-sentence-input { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 15px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.associated-incidents-sentence-input input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.associated-incidents-controls { + justify-content: inherit; + width: 90%; + margin-top: 5px; + margin-bottom: 15px; +} + +.control-button { + text-align: center; + background-color: var(--color-4); + border: 2px solid var(--color-3); + margin-bottom: 10px; + padding: 10px; +} + +.control-button span { + padding-right: 8px; +} + +.control-button:hover { + background-color: var(--color-3); + cursor: pointer; +} + +.incidents-person-search { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + margin-top: 32.5vh; +} + +.incidents-person-search-container { + background-color: var(--color-5); + width: 95vh; + height: 45vh; + margin: auto; + display: flex; + flex-direction: column; + z-index: 9998; + display: none; +} + +.incidents-person-search-title { + background-color: var(--color-4); + color: white; + font-size: 20px; + font-weight: bolder; + text-align: center; + padding-top: 15px; + padding-bottom: 15px; + width: 95%; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + user-select: none; +} + +.incidents-person-search-name-title { + width: 95%; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + color: white; + font-size: 15px; + text-align: left; + user-select: none; +} + +.incidents-person-search-name-input { + background-color: rgba(0, 0, 0, 0); + border: none; + outline: none; + color: white; + width: 100%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + text-align: left; + padding-bottom: 2.5px; +} + +.incidents-person-search-holder { + overflow: auto; + height: 30vh; + width: 95%; + margin: auto; + margin-top: 15px; + margin-bottom: 15px; +} + +.incidents-person-search-item { + width: 100%; + height: 12.5vh; + display: flex; + flex-direction: row; +} + +.incidents-person-search-item:hover { + background-color: var(--color-3); +} + +.incidents-person-search-item-pfp { + width: 11vh; + height: 11vh; + margin-top: auto; + margin-bottom: auto; + margin-left: 10px; +} + +.incidents-person-search-item-right { + display: flex; + flex-direction: column; + width: 100%; + margin-top: auto; + margin-bottom: auto; + margin-right: 10px; + margin-left: 10px; + height: 11vh; +} + +.incidents-person-search-item-right-cid-title { + width: 100%; + margin: auto; + margin-top: 0px; + margin-bottom: 0px; + color: white; + font-size: 16px; + text-align: left; + user-select: none; +} + +.incidents-person-search-item-right-cid-input { + width: 100%; + margin: auto; + margin-top: 5px; + margin-bottom: auto; + color: white; + font-size: 16px; + text-align: left; + padding-bottom: 2.5px; + border-bottom: 2px solid var(--color-3); + user-select: none; +} + +.incidents-person-search-item-right-name-title { + width: 100%; + margin: auto; + margin-top: auto; + margin-bottom: 0px; + color: white; + font-size: 16px; + text-align: left; + user-select: none; +} + +.incidents-person-search-item-right-name-input { + width: 100%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + color: white; + font-size: 16px; + text-align: left; + padding-bottom: 2.5px; + border-bottom: 2px solid var(--color-3); +} + +.bolos-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; +} + +.bolos-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.bolos-title:hover { + background-color: var(--color-3); +} + +.bolos-search-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#bolos-search-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#bolos-search-input::placeholder { + color: white; +} + +.bolos-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 95%; + height: 100%; + margin-bottom: 15px; +} + +.bolos-item { + background-color: var(--color-5); + width: 100%; + height: 5.5vh; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; + flex-direction: column; +} + +.manage-bolos-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + max-height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + overflow: auto; +} + +.manage-bolos-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + margin-left: 10px; + width: 66%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.manage-bolos-title-tag { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-right: 0px; + margin-bottom: 0px; + width: 84%; + align-items: center; + user-select: none; +} + +.manage-bolos-title:hover { + background-color: var(--color-3); +} + + + +.manage-bolos-create { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 5px; + padding-bottom: 5px; + align-items: center; + background-color: var(--color-4); + margin: auto; + margin-left: 5px; + margin-top: 10px; + /* margin-right: 0px; */ + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.manage-bolos-create:hover { + background-color: var(--color-3); +} + +.manage-bolos-input-tag { + font-size: 16px; + font-weight: lighter; + color: white; + width: 95%; + margin: auto; + text-align: left; + margin-top: 10px; + margin-bottom: 0px; +} + +.manage-bolos-input-title { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-bolos-input-title input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-bolos-input-plate { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-bolos-input-plate input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-bolos-input-owner { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-bolos-input-owner input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-bolos-input-individual { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-bolos-input-individual input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-bolos-save { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #1b8f25; + margin: auto; + margin-left: 0px; + margin-top: 10px; + margin-right: 13px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.manage-bolos-save:hover { + background-color: #1caa28; +} + +.manage-bolos-new { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #8f1b1b; + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.manage-bolos-new:hover { + background-color: #aa1c1c; +} + +.manage-bolos-reports-content { + width: 91%; + margin: auto; + margin-top: 15px; + margin-bottom: 15px; + border: none; + outline: none; + height: 100%; + resize: none; + background-color: var(--color-5); + color: white; + font-size: 16px; + padding: 10px; +} + +.manage-bolos-right-container { + display: flex; + flex-direction: column; + height: 95.7%; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + margin-right: 15px; +} + +.manage-bolos-tags-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + max-height: 150px; + overflow: scroll; +} + +.manage-bolos-gallery-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + margin-top: 10px; + height: 18vh; + overflow: scroll; +} + +.manage-bolos-tags-holder { + overflow: auto; + margin: auto; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.manage-officers-tags-holder { + overflow: auto; + margin: auto; + width: 95%; + max-height: 14vh; + user-select: none; + margin-top: 10px; +} + +.officers-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.officers-add-btn:hover { + background-color: var(--color-3); +} + +.manage-officers-tags-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + max-height: 150px; + margin-top: 10px; + overflow: scroll; +} + +.bolo-item { + background-color: var(--color-5); + width: 100%; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; + flex-direction: column; +} + +.bolo-item:hover { + background-color: var(--color-3); +} + +.bolo-top-holder { + width: 100%; + height: 50%; + display: flex; + align-items: center; +} + +.bolo-item-title { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-left: 5px; + margin-top: 5px; +} + +.bolo-report-name { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-right: 5px; + margin-top: 5px; +} + +.bolo-bottom-holder { + width: 100%; + height: 50%; + display: flex; + align-items: center; + margin-top: 5px +} + +.bolo-report-id { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-left: 5px; + margin-bottom: 5px; +} + +.bolo-report-time-ago { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-right: 5px; + margin-bottom: 5px; +} + +.bolos-search-refresh { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: var(--color-10); + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.bolos-search-refresh:hover { + background-color: #aa891c; +} + +.bolos-search-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 0px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + width: 80%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.bolos-search-title:hover { + background-color: var(--color-3); +} + +.manage-bolos-tags-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.manage-bolos-tags-add-btn:hover { + background-color: var(--color-3); +} + +span.tag-bolo-input[contenteditable]:empty::before { + content: 'Input Tag'; +} + +.tag-bolo-input { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-top: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + outline: none; + border: none; +} + +span.officer-tag-bolo-input[contenteditable]:empty::before { + content: 'Input Tag'; +} + +.officer-tag-bolo-input { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-top: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + outline: none; + border: none; +} + +.bolo-gallery-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.bolo-gallery-add-btn:hover { + background-color: var(--color-3); +} + +.bolo-gallery-upload-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#bolo-gallery-upload-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#bolo-gallery-upload-input::placeholder { + color: white; +} + +.bolo-img { + width: 10vh; + filter: blur(5px); + object-fit: cover; +} + +.bolo-gallery-inner-container { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.manage-bolos-editing-title { + background-color: var(--color-3); + color: white; + font-size: 15px; + font-weight: lighter; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + margin-left: 10px; + width: 95%; + align-items: center; + user-select: none; +} + +.reports-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; +} + +#home-reports-container { + height: 50%; +} + +#home-warrants-container { + height: 50%; +} + +.dispatch-comms-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 46.5%; + width: 50vh; + margin-top: 1vh; + margin-left: 10px; +} + +.reports-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.reports-title:hover { + background-color: var(--color-3); +} + +.reports-search-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#reports-search-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#reports-search-input::placeholder { + color: white; +} + +.reports-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 95%; + height: 100%; + margin-bottom: 15px; +} + +.dispatch-item { + height: auto; + padding: auto; + margin-top: 1vh; +} + +.dispatch-item:hover { + background-color: var(--color-7); +} + +.dispatch-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 94%; + height: 100%; +} + +.dispatch-message-profilepic { + width: 2.8vh; + height: 2.8vh; + object-fit: cover; + float: left; + border-radius: 50%; +} + +.dispatch-item-info { + float:left; + font-size: 14px; + font-weight: bold; + padding-left: 0.75vh; + color: var(--color-8); +} + +.dispatch-info-job-lspd { + color: #2554cc; +} + +.dispatch-info-job-bcso { + color: #cc7e25; +} + +.dispatch-info-job-sast { + color: #2589cc; +} + +.dispatch-info-job-sasp { + color: #2589cc; +} + +.dispatch-info-job-doc { + color: #7b25cc; +} + +.dispatch-info-job-sapr { + color: #5acc25; +} + +.dispatch-info-job-pa { + color: #008080; +} + +.dispatch-info-job-ambulance { + color: #cc2525; +} + +.dispatch-info-job-doj { + color: #FFEAB9; +} + +.active-info-job-lspd { + background-color: #2554cc; +} + +.active-info-job-bcso { + background-color: #cc7e25; +} + +.active-info-job-sast { + background-color: #2589cc; +} + +.active-info-job-sasp { + background-color: #2589cc; +} + +.active-info-job-doc { + background-color: #7b25cc; +} + +.active-info-job-sapr { + background-color: #5acc25; +} + +.active-info-job-pa { + background-color: #008080; +} + +.active-info-job-ambulance { + background-color: #cc2525; +} + +.active-info-job-doj { + background-color: #525252; +} + +.active-info-job-unk { + background-color: #6E707C; +} + +.dispatch-item-message { + float:left; + font-size: 14px; + font-weight: lighter; + color: white; + width: 100%; + overflow:wrap; + white-space:normal; + padding-left: 0.80vh; + padding-top: 0.2vh; +} + +.dispatch-item-msg { + padding-left: 2.8vh; + padding-bottom: 0vh; +} + +.dispatch-item-msg:hover { + background-color: var(--color-7); +} + +.dispatch-item-grid { + display:grid; +} + +.dispatch-input { + min-width: 90%; + max-width: 90%; + min-height: 0.1vh; + margin-left: 1.1vh; + margin-bottom: 1vh; + border: none; + padding: 12px 20px; + background-color: var(--color-7); + color: #bebec2; +} + +.dispatch-input:focus { + outline:none!important; +} + +.reports-search-refresh { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: var(--color-10); + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.reports-search-refresh:hover { + background-color: #aa891c; +} + +.dispatch-comms-refresh { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: var(--color-10); + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.dispatch-comms-refresh:hover { + background-color: #aa891c; +} + +.reports-search-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 0px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + width: 80%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.reports-search-title:hover { + background-color: var(--color-3); +} + +.manage-reports-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + max-height: 80.7vh; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + overflow: auto; +} + +.manage-reports-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: auto; + margin-left: 10px; + width: 80%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.manage-reports-title-tag { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-right: 0px; + margin-bottom: 0px; + width: 84%; + align-items: center; + user-select: none; +} + +.manage-reports-title:hover { + background-color: var(--color-3); +} + + + +.manage-reports-create { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 5px; + padding-bottom: 5px; + align-items: center; + background-color: var(--color-4); + margin: auto; + margin-left: 5px; + margin-top: 10px; + /* margin-right: 0px; */ + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.manage-reports-create:hover { + background-color: var(--color-3); +} + +.manage-reports-input-tag { + font-size: 16px; + font-weight: lighter; + color: white; + width: 95%; + margin: auto; + text-align: left; + margin-top: 10px; + margin-bottom: 0px; +} + +.manage-reports-input-title { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-reports-input-title input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-reports-input-type { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-reports-input-type input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-reports-input-owner { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-reports-input-owner input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-reports-input-individual { + color: white; + font-weight: lighter; + width: 95%; + margin: auto; + margin-top: 5px; + margin-bottom: 0px; + align-items: center; + display: flex; + border-bottom: 2px solid var(--color-3); +} + +.manage-reports-input-individual input { + border: none; + outline: none; + margin-left: 5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 100%; + background-color: rgba(0, 0, 0, 0); +} + +.manage-reports-save { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #1b8f25; + margin: auto; + margin-left: 0px; + margin-top: 10px; + margin-right: 13px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.manage-reports-save:hover { + background-color: #1caa28; +} + +.manage-reports-new { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #8f1b1b; + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.manage-reports-new:hover { + background-color: #aa1c1c; +} + +.incidents-remove-normal-tag:hover { + background-color: #aa1c1c; +} + +.incidents-remove-normal-civ:hover { + background-color: #aa1c1c; +} + +.incidents-remove-tag:hover { + background-color: #aa1c1c; +} + +.incidents-remove-officer-tag:hover { + background-color: #aa1c1c; +} + +.remove-tag:hover { + background-color: #aa1c1c; +} + +.manage-reports-editing-title { + background-color: var(--color-3); + color: white; + font-size: 15px; + font-weight: lighter; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + margin-left: 10px; + width: 95%; + align-items: center; + user-select: none; + display: block; +} + +.manage-reports-reports-content { + width: 91%; + margin: auto; + margin-top: 15px; + margin-bottom: 15px; + border: none; + outline: none; + height: 100%; + resize: none; + background-color: var(--color-5); + color: white; + font-size: 16px; + padding: 10px; +} + +.manage-reports-right-container { + display: flex; + flex-direction: column; + height: 95.7%; + width: 50vh; + margin-top: 10px; + margin-left: 10px; + margin-right: 15px; +} + +.manage-reports-tags-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + max-height: 150px; + overflow: scroll; +} + +.manage-reports-gallery-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + margin-top: 10px; + height: 18vh; + overflow: scroll; +} + +.manage-reports-tags-holder { + overflow: auto; + margin: auto; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.reports-officers-tags-holder { + overflow: auto; + margin: auto; + width: 95%; + max-height: 14vh; + user-select: none; + margin-top: 10px; +} + +.reports-officers-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.reports-officers-add-btn:hover { + background-color: var(--color-3); +} + +.reports-officers-tags-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + max-height: 150px; + margin-top: 10px; + overflow: scroll; +} + +.reports-gallery-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.reports-gallery-add-btn:hover { + background-color: var(--color-3); +} + +.reports-gallery-upload-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#reports-gallery-upload-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#reports-gallery-upload-input::placeholder { + color: white; +} + +.reports-img { + width: 10vh; + filter: blur(5px); + object-fit: cover; +} + +.reports-gallery-inner-container { + overflow: auto; + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.manage-reports-tags-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.manage-reports-tags-add-btn:hover { + background-color: var(--color-3); +} + +.reports-civilians-tags-container { + display: flex; + flex-direction: column; + background-color: var(--color-1); + width: 100%; + border: 2px solid var(--color-3); + max-height: 150px; + margin-top: 10px; + overflow: scroll; +} + +.reports-civilians-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7px; + padding-bottom: 7px; + margin: auto; + margin-top: 10px; + margin-left: 5px; + margin-bottom: 0px; + width: 10%; + text-align: center; +} + +.reports-civilians-add-btn:hover { + background-color: var(--color-3); +} + +.reports-civilians-tags-holder { + overflow: auto; + margin: auto; + width: 95%; + max-height: 14vh; + user-select: none; + margin-top: 10px; +} + +.reports-item { + background-color: var(--color-5); + width: 100%; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; + flex-direction: column; +} + +.reports-item:hover { + background-color: var(--color-3); +} + +.reports-top-holder { + width: 100%; + height: 50%; + display: flex; + align-items: center; +} + +.reports-item-title { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-left: 5px; + margin-top: 5px; + max-width: 25vh; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.reports-report-name { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-right: 5px; + margin-top: 5px +} + +.reports-bottom-holder { + width: 100%; + height: 50%; + display: flex; + align-items: center; + margin-top: 5px; +} + +.reports-report-id { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-left: 5px; + margin-bottom: 5px; +} + +.reports-report-time-ago { + font-size: 14px; + font-weight: lighter; + color: white; + margin: auto; + margin-right: 5px; + margin-bottom: 5px; +} + +span.tag-reports-input[contenteditable]:empty::before { + content: 'Input Tag'; +} + +.tag-reports-input { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-top: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + outline: none; + border: none; +} + + +.dmv-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50%; + margin-top: 10px; + margin-left: 10px; +} + +.dmv-search-refresh { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: var(--color-10); + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.dmv-search-refresh:hover { + background-color: #aa891c; +} + +.dmv-search-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.dmv-search-title:hover { + background-color: var(--color-3); +} + +.dmv-search-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#dmv-search-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#dmv-search-input::placeholder { + color: white; +} + +.dmv-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 95%; + height: 100%; + margin-bottom: 15px; +} + +.vehicle-information-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50%; + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; +} + +.vehicle-information-save { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #1b8f25; + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.vehicle-information-save:hover { + background-color: #1caa28; +} + +.add-charge:hover { + background-color: #1caa28; +} + +.vehicle-information-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 0px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + width: 81%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.dmv-item { + background-color: var(--color-5); + width: 100%; + height: 9vh; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; + +} + +.dmv-item:hover { + background-color: var(--color-3); +} + +.dmv-image { + width: 7vh; + height: 7vh; + margin-left: 10px; + margin-top: auto; + margin-bottom: auto; + object-fit: cover; +} + +.dmv-item-title { + font-size: 16px; + font-weight: lighter; + color: white; + padding-top: 2px; +} + +.dmv-tags { + display: flex; + overflow-x: auto; + width: 98%; + margin-top: 10px; + margin-bottom: 5px; +} + +.dmv-tag { + margin: auto; + margin-left: 0px; + margin-right: 6px; + padding: 4px; + padding-left: 7px; + padding-right: 7px; + border-radius: 10px; + color: white; + font-size: 12px; + font-weight: bolder; + background-color: #956E09; +} + +.dmv-bottom-info { + display: flex; + margin: auto; + width: 100%; +} + +.dmv-id { + color: white; + font-size: 13px; +} + +.vehicle-info-stuff { + display: flex; + flex-direction: row; + width: 95%; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; +} + +.vehicle-info-image { + width: 444px; + height: 269px; + object-fit: cover; +} + +.vehicle-info-inner-container { + display: flex; + flex-direction: column; + width: 55%; +} + +.vehicle-info-plate { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.vehicle-info-plate-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.vehicle-info-owner { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.vehicle-info-owner-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.vehicle-info-class { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.vehicle-info-class-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.vehicle-info-model { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.vehicle-info-model-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.vehicle-info-imageurl { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.vehicle-info-imageurl-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.vehicle-info-icon { + color: white; + font-size: 16px; + margin-left: 10px +} + +.vehicle-info-line { + background-color: var(--color-3); + height: 2px; + margin-left: 10px; + margin-bottom: 10px; +} + +.vehicle-info-tags-container { + display: flex; + flex-direction: column; + border: 2px solid var(--color-3); + color: white; + font-size: 18px; + font-weight: bolder; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + height: fit-content; + align-items: center; + user-select: none; +} + +.vehicle-info-tags-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.vehicle-info-tags-add-btn:hover { + background-color: var(--color-3); +} + +.vehicle-info-tags-add-btn { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 7.25px; + padding-bottom: 7.25px; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + margin-left: 5px; + margin-right: 0px; + width: 10%; + text-align: center; +} + +.vehicle-info-tags-holder { + overflow: auto; + margin: auto; + margin-top: 7px; + margin-bottom: 7px; + width: 95%; + max-height: 14vh; + user-select: none; +} + +.vehicle-info-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-bottom: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; +} + +.vehicle-info-content { + width: 93%; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + border: none; + outline: none; + min-height: 26.9vh; + resize: none; + background-color: var(--color-5); + color: white; + font-size: 16px; + padding: 10px; +} + +.vehicle-tags { + display: flex; + overflow-x: auto; + width: 98%; + margin-top: 5px; + margin-bottom: 5px; +} + +.vehicle-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + padding: 4px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: white; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + outline: none; + border: none; +} + +.stafflogs-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 66%; + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; + overflow: auto; +} + +.stafflogs-box { + display: flex; + flex-direction: column; + height: 80.7vh; + width: 100%; + margin-top: 2px; + margin-left: 1px; + margin-right: 1px; + overflow: auto; +} + +.stafflogs-box > p { + color: white; + font-size: 1.3vh; + padding-left: 1vh; +} + +.stafflogs-box-title { + align-self: center; + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-left: 10px; + margin-right: 10px; + width: 97.5%; + height: 25px; + align-items: center; + user-select: none; +} + +.leaderboard-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 33%; + margin-top: 10px; + margin-left: 4px; + margin-right: 10px; + overflow: auto; +} + +.leaderboard-box { + display: flex; + flex-direction: column; + height: 80.7vh; + width: 100%; + margin-top: 2px; + margin-left: 1px; + margin-right: 1px; + overflow: auto; +} + +.leaderboard-box-test { + margin: 0; + padding-top:0.8vh; + color: white; + font-size: 1.3vh; + padding-left: 1vh; +} + +.leaderboard-title { + align-self: center; + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-left: 10px; + margin-right: 10px; + width: 95.5%; + height: 25px; + align-items: center; + user-select: none; +} + +/* Vehicle Colors :( so long lol */ + +.black-color { + background-color: #0e0e0e; + color: white; +} + +.darksilver-color { + background-color: #333333; + color: white; +} + +.silver-color { + background-color: #333333; + color: white; +} + +.bluesilver-color { background-color: #c4d4e0; } + +.matteblack-color { + background-color: #141414; + color: white; +} + +.gray-color { + background-color: #808080; + color: white; +} + +.lightgray-color { background-color: #D3D3D3; } +.utilgunmetal-color { background-color: #39434d; } +.red-color { background-color: #c00e1a; } +.torinored-color { background-color: #da1918; } +.formulared-color { background-color: #b6111b; } +.blazered-color { background-color: #a51e23; } +.gracefulred-color { background-color: #7b1a22; } +.garnetred-color { background-color: #8e1b1f; } +.desertred-color { background-color: #6f1818; } +.cabernetred-color { background-color: #49111d; } +.candyred-color { background-color: #b60f25; } +.orange-color { background-color: #f78616; } +.gold-color { background-color: #c2944f; } +.mattedarkred-color { background-color: #732021; } +.matteyellow-color { background-color: #ffc91f; color: black } +.brightred-color { background-color: #de0f18; } +.darkgreen-color { background-color: #132428; } +.racingreen-color { background-color: #122e2b; } +.seagreen-color { background-color: #12383c; } +.olivegreen-color { background-color: #31423f; } +.green-color { background-color: #155c2d; } +.gasolinebluegreen-color { background-color: #1b6770; } +.mattelimegreen-color { background-color: #66b81f; } +.seawash-color { background-color: #65867f; } +.midnightblue-color { background-color: #222e46; } +.darkblue-color { background-color: #233155; } +.saxonyblue-color { background-color: #304c7e; } +.blue-color { background-color: #345df3; } +.diamondblue-color { background-color: #d6e7f1; } +.brightblue-color { background-color: #0b9cf1; } +.purpleblue-color { background-color: #2f2d52; } +.ultrablue-color { background-color: #2354a1; } +.lightningblue-color { background-color: #2446a8; } +.mattedarkblue-color { background-color: #1f2852; } +.matteblue-color { background-color: #253aa7; } +.yellow-color { background-color: #fbe212; color: black } +.bronze-color { background-color: #916532; } +.lime-color { background-color: #98d223; } +.champagne-color { background-color: #9b8c78; } +.beige-color { background-color: #F5F5DC; } +.darkivory-color { background-color: #473f2b; } +.brown-color { background-color: #3a2a1b; } +.lightbrown-color { background-color: #b5a079; } +.beechwood-color { background-color: #a4965f; } +.chocoorange-color { background-color: #752b19; } +.cream-color { background-color: #f7edd5; } +.white-color { background-color: #f0f0f0; color: black } +.steel-color { background-color: #6a747c; } +.blacksteel-color { background-color: #354158; } +.aluminium-color { background-color: #9ba0a8; } +.chrome-color { background-color: #5870a1; } +.wornwhite-color { background-color: #eae6de; color: black } +.offwhite-color { background-color: #dfddd0; color: black } +.lightorange-color { background-color: #f9a458; } +.pink-color { background-color: #f21f99; } +.blackblue-color { background-color: #0a0c17; } +.blackpurple-color { background-color: #0c0d18; } +.blackred-color { background-color: #0e0d14; } +.darkpurple-color { background-color: #621276; } +.olivedrab-color { background-color: #696748; } +.tan-color { background-color: #c3b492; } + +.reports-remove-image:hover { + background-color: #950909; +} + +.bolo-remove-image:hover { + background-color: #950909; +} + +.incidents-delete:hover { + background-color: #950909; +} + +.bolo-delete:hover { + background-color: #950909; +} + +.weapons-delete:hover { + background-color: #950909; +} + +.reports-delete:hover { + background-color: #950909; +} + +.remove-bulletin:hover { + background-color: #950909; +} + +.search-vehicle:hover { + background-color: #956E09; +} + +.mark-code-5:hover { + background-color: #0B9509; +} + +.remove-code-5:hover { + background-color: #950909; +} + +.mark-stolen:hover { + background-color: #0B9509; +} + +.remove-stolen:hover { + background-color: #950909; +} + +.toggle-duty:hover { + background-color: #956E09; +} + +.set-callsign:hover { + background-color: #0B9509; +} + +.set-radio:hover { + background-color: #09956b; +} + +.incidents-ghost-holder { + overflow: auto; + max-height: 80vh; + margin-top: 10px; + margin-bottom: 10px; +} + +.incidents-charges-table { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + margin: auto; + margin-top: -25vh; +} + +.incidents-charges-table-container { + background-color: var(--color-5); + width: 155vh; + height: 85vh; + margin: auto; + display: flex; + flex-direction: column; + z-index: 9998; + user-select: none; +} + +.incidents-charges-title-container { + width: 95%; + height: 11vh; + background-color: var(--color-4); + margin: auto; + margin-top: 1.5vh; + margin-bottom: 0vh; + display: flex; + flex-direction: column; + border: 2px solid var(--color-4); +} + +.incidents-charges-title { + color: white; + margin: auto; + text-align: center; + align-items: center; + font-size: 22px; + font-weight: bolder; + margin-top: 1vh; +} + +.incidents-charges-title span { + color: #B4A684; + font-size: 19px; +} + +.incidents-charges-title-description { + color: white; + margin: auto; + background-color: var(--color-5); + text-align: left; + font-size: 17px; + padding: .5vh; + width: 97%; + margin-bottom: 1.5vh; +} + +.manage-incidents-editing-title { + background-color: var(--color-3); + color: white; + font-size: 15px; + font-weight: lighter; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + margin-left: 10px; + width: 95%; + align-items: center; + user-select: none; +} + + +.current-charges-container { + width: 95%; + border: 2px solid var(--color-4); + margin: auto; + margin-top: 1.5vh; + margin-bottom: 0vh; + display: flex; +} + +.current-charges-inner-container { + background-color: var(--color-4); + width: 35vh; + height: fit-content; + margin: auto; + margin-left: 1vh; + margin-right: 0vh; + text-align: center; + display: flex; +} + +.current-charges-title { + color: white; + font-size: 19px; + font-weight: bolder; + padding: .25vh; + padding-left: 6vh; + padding-right: 6vh; + margin: auto; +} + +#current-charges-holder { + display: flex; + margin: auto; + width: 110vh; + margin-left: 1vh; + margin-right: 1vh; + overflow: hidden; +} + +.current-charges-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + padding: 5px; + padding-left: 7px; + padding-right: 7px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + background-color: white; + color: black; + white-space: nowrap; +} + +.offenses-title-container { + width: fit-content; + height: fit-content; + background-color: var(--color-4); + margin-left: 3.75vh; + margin-top: 1.5vh; + margin-bottom: 0vh; + display: flex; + border: 2px solid var(--color-4); +} + +.offenses-title { + color: white; + padding: .7vh; + padding-right: 3vh; + font-weight: bolder; + font-size: 1.4vh; +} + +.offenses-prepend-holder { + width: 95%; + background-color: var(--color-4); + margin: auto; + margin-top: 1.5vh; + margin-bottom: 0vh; + border: 2px solid var(--color-4); + display: grid; + grid-template-columns: auto auto auto auto; + grid-template-rows: auto auto auto auto; + row-gap: 0vh; + overflow: auto; +} + +.offense-item { + background-color: #0B9509; + border: 1.5px solid black; + height: 5.0vh; + margin: .5vh; + flex-direction: column; + color: white; + display: inline-block; + overflow: auto; + transition: all 0.15s ease-in-out; +} + +.offense-item:hover { + transform: scale(1.02); + transition: all 0.15s ease-in-out; +} + +.offense-item-offense { + margin: auto; + margin-left: .5vh; + margin-top: .5vh; + color: white; + font-size: 1.2vh; + font-weight: bold; +} + +.offfense-item-name { + margin: auto; + margin-right: .5vh; + margin-top: .5vh; + color: white; + font-size: 1.2vh; + font-weight: bold; +} + +.offense-item-id { + margin: auto; + margin-left: .5vh; + margin-bottom: .5vh; + color: white; + font-size: 1.2vh; + font-weight: bold; +} + +.offfense-item-months { + margin: auto; + margin-right: .5vh; + margin-bottom: .5vh; + color: white; + font-size: 1.2vh; + font-weight: bold; +} + +.offenses-main-container { + overflow: auto; + margin: auto; + margin-top: 1vh; + margin-bottom: 1vh; + width: 100%; +} + +.callsign-container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + margin-top: 40.5vh; +} + +.radio-container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + margin-top: 40.5vh; +} + +.radio-inner-container { + background-color: var(--color-5); + width: 30vh; + height: 17.5vh; + margin: auto; + display: flex; + flex-direction: column; + z-index: 9998; + border: .45vh solid white; +} + +.radio-title { + color: white; + font-size: 2vh; + font-weight: bold; + margin: auto; + margin-top: 2vh; + margin-bottom: 0vh; +} + +.radio-input { + width: 20vh; + margin: auto; + margin-top: 1.5vh; + margin-bottom: 0vh; + background-color: var(--color-6); + border: none; + outline: none; + font-size: 2vh; + color: white; + text-align: center; + padding: 1vh; +} + +.radio-buttons { + width: 20vh; + margin: auto; + margin-top: 1.5vh; + display: flex; + flex-direction: row; +} + +.radio-cancel { + color: white; + padding: .5vh; + padding-left: 1vh; + padding-right: 1vh; + background-color: #D77A0D; + border-radius: 1vh; + margin: auto; + user-select: none; +} + +.radio-cancel:hover { + background-color: #f18f1e; +} + +.radio-submit { + color: white; + padding: .5vh; + padding-left: 1vh; + padding-right: 1vh; + background-color: #0B9509; + border-radius: 1vh; + margin: auto; + user-select: none; +} + +.radio-submit:hover { + background-color: #15ac12; +} + +.callsign-inner-container { + background-color: var(--color-5); + width: 30vh; + height: 17.5vh; + margin: auto; + display: flex; + flex-direction: column; + z-index: 9998; + border: .45vh solid white; +} + +.callsign-title { + color: white; + font-size: 2vh; + font-weight: bold; + margin: auto; + margin-top: 2vh; + margin-bottom: 0vh; +} + +.callsign-input { + width: 20vh; + margin: auto; + margin-top: 1.5vh; + margin-bottom: 0vh; + background-color: var(--color-6); + border: none; + outline: none; + font-size: 2vh; + color: white; + text-align: center; + padding: 1vh; +} + +.callsign-buttons { + width: 20vh; + margin: auto; + margin-top: 1.5vh; + display: flex; + flex-direction: row; +} + +.callsign-cancel { + color: white; + padding: .5vh; + padding-left: 1vh; + padding-right: 1vh; + background-color: #D77A0D; + border-radius: 1vh; + margin: auto; + user-select: none; +} + +.callsign-cancel:hover { + background-color: #f18f1e; +} + +.callsign-submit { + color: white; + padding: .5vh; + padding-left: 1vh; + padding-right: 1vh; + background-color: #0B9509; + border-radius: 1vh; + margin: auto; + user-select: none; +} + +.callsign-submit:hover { + background-color: #15ac12; +} + + +/* Keep At Bottom */ + +.red-tag { + background-color: #950909; +} + +.orange-tag { + background-color: #956E09; +} + +.green-tag { + background-color: #0B9509; +} + +.white-tag { + display: inline-block; + text-decoration: none; + margin: auto; + margin-left: 0px; + margin-right: 10px; + margin-bottom: 6px; + padding: 7px; + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + color: black; + font-size: 12px; + font-weight: 600; + background-color: white; + user-select: none; + width: fit-content; + background-color: white; + color: black; +} + +.orange-penal-code { + background-color: #D77A0D; +} + +.green-penal-code { + background-color: #0B9509; +} + +.red-penal-code { + background-color: #950909; +} + +.header-pin { + padding-right: 5px; +} + +.priority-1 { + background-color: #bb0404; +} + +.priority-2 { + background-color: #ce7808; +} + +.call-bottom-info > span { + padding-right: 0.5vh; +} + +.call-attach:hover { + background-color: #1caa28; +} + +.Set-Waypoint:hover { + background-color: #f18f1e; +} + +.call-detach:hover { + background-color: #950909; +} + +.remove-blip:hover { + background-color: #950909; +} + +.dispatch-attached-units { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +.active-unit-item:hover { + background-color: var(--color-3); +} + +.active-calls-item:hover { + background-color: var(--color-3); +} + +.dispatch-attached-units-container { + background-color: var(--color-1); + width: 92vh; + height: 46vh; + margin: auto; + display: flex; + flex-direction: column; + z-index: 1; + border: 2px solid #FFFFFF; + display: none; + margin-top: 32.5vh; +} + +.dispatch-attached-units-title { + background-color: var(--color-4); + color: white; + font-size: 20px; + font-weight: bolder; + text-align: center; + padding-top: 15px; + padding-bottom: 15px; + width: 95%; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + user-select: none; +} + +.dispatch-attached-units-holder { + margin: auto; + margin-top: 10px; + margin-bottom: 10px; + overflow: auto; + height: 37.8vh; + display: flex; + flex-direction: column; + width: 95%; +} + +.dispatch-attached-unit-item { + padding: 10px; + height: 3vh; + background-color: var(--color-5); + display: flex; + align-items: center; + margin-bottom: 5px; +} + +.attached-units:hover { + background-color: rgb(156, 156, 156); +} + +.Set-Dispatch-Waypoint:hover { + background-color: #f18f1e; +} + +.call-dispatch-detach:hover { + background-color: #950909; +} + +.incidents-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 0px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + width: 80%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.incidents-title:hover { + background-color: var(--color-3); +} + +.incidents-search-refresh { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: var(--color-10); + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; +} + +.incidents-search-refresh:hover { + background-color: #aa891c; +} + +.respond-calls { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + margin-top: 32.5vh; +} + +.respond-calls-container { + background-color: var(--color-5); + width: 70vh; + min-height: 30vh; + max-height: 40vh; + margin: auto; + display: flex; + flex-direction: column; + z-index: 9998; + overflow: auto; +} + +.respond-calls-title { + background-color: var(--color-4); + color: white; + font-size: 20px; + font-weight: bolder; + text-align: center; + padding-top: 15px; + padding-bottom: 15px; + width: 95%; + margin: auto; + margin-top: 15px; + margin-bottom: 0px; + user-select: none; +} + +.respond-calls-input { + width: 92.5%; + margin-top: 10px; + margin-bottom: 10px; + outline: solid 3px var(--color-4); + margin-left: 27px; + min-height: 21.5vh; + max-height: 21.5vh; + border: none; + padding: 10px 10px; + background-color: transparent; + color: #dadada; + resize: none; + font-size: 16px; +} + +.respond-calls-input:focus { + outline: solid 3px var(--color-4); +} + +.respond-calls-responses { + width: 95%; + margin-left: 1.7vh +} + +.respond-calls-response { + color: #dadada; + margin-top: 0.5vh; + padding: 0.5vh; + background-color: rgba(32, 32, 32, 0.5); + color: #FFFFFF; +} + +.offenses-search-area { + width: 95%; + border: 2px solid var(--color-4); + height: 3vh; + margin: 1.5vh auto 0vh; + display: flex; +} + +.offenses-search { + background: transparent; + border: none; + outline: none; + font-size: 1.2vh; + color: rgb(255, 255, 255); + font-family: Roboto, sans-serif; + font-style: normal; + font-weight: normal; + margin-left: 1vh; + padding-top: 10px; + padding-bottom: 10px; +} + +.impound-form { + display: flex; + flex-direction: column; + + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + + width: 750px; + height: 375px; + background: var(--color-5); + border: 1px solid white; +} + +.impound-form > form { + position: absolute; + left: 10%; + width: 73%; + height: 100%; +} + +.impound-form > form > input { + border: none; + outline: none; + font-size: 24px; + color: white; + + background: transparent; + border: 1px solid rgb(168, 168, 168); + + width: 100%; + height: 13.5%; + + margin-top: 20px; + padding-left: 10%; +} + +.impound-form > form > i { + position: absolute; + color: white; + font-size: 24px; + margin-top: 37.5px; + margin-left: 12.6px; +} + +.impound-buttons { + position: absolute; + margin: auto; + display: flex; + flex-direction: row; + bottom: 6%; + left: 10%; +} + +.impound-cancel { + color: white; + padding: .5vh; + padding-left: 1vh; + padding-right: 1vh; + background-color: #D77A0D; + border-radius: 1vh; + margin: auto; + user-select: none; +} + +.impound-cancel:hover { + background-color: #f18f1e; +} + +.impound-submit { + color: white; + padding: .5vh; + padding-left: 1vh; + padding-right: 1vh; + background-color: #0B9509; + border-radius: 1vh; + margin: auto; + user-select: none; + margin-left: 10px; +} + +.impound-submit:hover { + background-color: #15ac12; +} + +.status-impound:hover { + background-color: #ac8312; +} + +.remove-impound:hover { + background-color: #ac1212; +} + +.impound-vehicle:hover { + background-color: #12ac1f; +} + +.impound-fee { + color: white; +} + +.dispatch-reply:hover { + background-color: var(--color-1); +} +.display_hidden{ + display: none; +} + +.cams-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; + overflow: auto +} + +.cams-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 100%; + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; + overflow: auto; +} + +.cams-item { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr; + grid-auto-flow: row; + gap: 15px 15px; + overflow: auto; + margin-bottom: 10px; + + +} + +.cams-items { + background-color: var(--color-5); + height: auto; + padding: 10px; + text-align: center; + margin: 10px; + color: white; + font-size: 20px; + color: white; + overflow: visible; + +} + +.cams-image { + height:125px; + width: auto; + margin: 10px; + +} + +.cams-items:hover { + background-color: var(--color-3); +} + +.weapons-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50%; + margin-top: 10px; + margin-left: 10px; +} + +.weapons-search-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.weapons-search-title:hover { + background-color: var(--color-3); +} + +.weapons-search-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#weapons-search-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#weapons-search-input::placeholder { + color: white; +} + +.weapons-items { + display: flex; + flex-direction: column; + overflow: auto; + margin: auto; + margin-top: 10px; + width: 95%; + height: 100%; + margin-bottom: 15px; +} + +.weapon-information-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 50%; + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; +} + +.weapon-information-new { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #8f1b1b; + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.weapon-information-new:hover { + background-color: #aa1c1c; +} + +.weapon-information-save { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #1b8f25; + margin: auto; + margin-left: 5px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.weapon-information-save:hover { + background-color: #1caa28; +} + +.weapon-information-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 0px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-right: 0px; + width: 81%; + /* width: 66%; */ + align-items: center; + user-select: none; +} + +.weapon-info-stuff { + display: flex; + flex-direction: row; + width: 95%; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; +} + +.weapon-info-image { + width: 444px; + height: 269px; + object-fit: cover; +} + +.weapon-info-imageurl { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.weapon-info-imageurl-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.weapon-info-inner-container { + display: flex; + flex-direction: column; + width: 55%; +} + +.weapon-info-serial { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.weapon-info-serial-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.weapon-info-icon { + color: white; + font-size: 16px; + margin-left: 10px +} + +.weapon-info-line { + background-color: var(--color-3); + height: 2px; + margin-left: 10px; + margin-bottom: 10px; +} + +.weapon-info-model { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.weapon-info-model-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.weapon-info-owner { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.weapon-info-owner-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.weapon-info-class { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.weapon-info-class-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); + width: 80%; +} + +.weapon-info-imageurl { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.weapon-info-imageurl-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +.weapon-info-content { + width: 93%; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + border: none; + outline: none; + min-height: 30.9vh; + resize: none; + background-color: var(--color-5); + color: white; + font-size: 16px; + padding: 10px; +} + +.weapons-item-title { + font-size: 16px; + font-weight: lighter; + color: white; + padding-top: 2px; +} + +.weapons-image { + width: 7vh; + height: 7vh; + margin-left: 10px; + margin-top: auto; + margin-bottom: auto; + object-fit: cover; +} + +.weapons-item-title { + font-size: 16px; + font-weight: lighter; + color: white; + padding-top: 2px; +} + +.weapons-bottom-info { + display: flex; + margin: auto; + width: 100%; +} + +.weapons-id { + color: white; + font-size: 13px; +} + +.weapons-item { + background-color: var(--color-5); + width: 100%; + height: 9vh; + margin: auto; + margin-bottom: 10px; + margin-top: 0px; + display: flex; + user-select: none; + +} + +.weapons-item:hover { + background-color: var(--color-3); +} + +.weapons-image { + width: 7vh; + height: 7vh; + margin-left: 10px; + margin-top: auto; + margin-bottom: auto; + object-fit: cover; +} + +.weapons-item-title { + font-size: 16px; + font-weight: lighter; + color: white; + padding-top: 2px; +} + +.vehicle-info-points { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; + margin-top: 5px; +} + +input[type="range"].vehicle-info-points-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 5px; + color: white; + width: 80%; +} + +input[type="range"].vehicle-info-points-input::-moz-range-thumb { + box-shadow: none; + border: 2px solid grey; + height: 16px; + width: 16px; + border-radius: 16px; + background: white; +} + +input[type="range"].vehicle-info-points-input::-moz-range-track { + width: 100%; + height: 2px; + box-shadow: none; + background: var(--color-8); + border-radius: 0px; + border: 0px; +} + +.manage-profile-apartment { + color: white; + margin-left: 10px; + font-size: 15px; + user-select: none; +} + +.manage-profile-apartment-input { + border: none; + outline: none; + margin-left: 2.5px; + font-size: 16px; + margin-top: 2px; + color: white; + background-color: rgba(0, 0, 0, 0); +} + +/* Charges Hover */ + +.ccontextmenu { + position: absolute; + width: fit-content; + padding: 2px; + margin: 0; + border: 1px solid var(--color-3); + background: var(--color-5); + z-index: 100; + border-radius: 3px; + box-shadow: 1px 1px 4px rgba(0,0,0,.2); + opacity: 0; + transform: translate(0, 15px) scale(.95); + transition: transform 0.1s ease-out, opacity 0.1s ease-out; + pointer-events: none; +} + +.ccontextmenu-item { + display: block; + position: relative; + margin: 0; + padding: 0; + /* white-space: nowrap; */ + max-width: 34ch; + word-wrap:break-word; +} + +.ccontextmenu-text { + display: block; + color: white; + font-size: 13px; + cursor: pointer; + border: 1px solid transparent; + /* white-space: nowrap; */ + padding: 6px 8px; + border-radius: 3px; + max-width: 34ch; + word-wrap:break-word; +} + +.ccontextmenu-text { + outline: 0 none; + text-decoration: none; +} + +.ccontextmenu-text .fa { + position: absolute; + left: 8px; + top: 50%; + transform: translateY(-50%); +} + +.ccontextmenu-item-disabled { + opacity: .5; + pointer-events: none; +} + +.ccontextmenu-item-disabled .ccontextmenu-text { + cursor: default; +} + +.ccontextmenu-item-submenu::after { + content: ""; + position: absolute; + right: 6px; + top: 50%; + transform: translateY(-50%); + border: 5px solid transparent; + border-left-color: #808080; +} + +.ccontextmenu-item-submenu:hover::after { + border-left-color: #fff; +} + +.ccontextmenu-show, +.ccontextmenu-item:hover > .ccontextmenu { + opacity: 1; + transform: translate(0, 0) scale(1); + pointer-events: auto; + z-index: 9999; +} + +.map-page-container { + background-color: var(--color-9); + border-radius: 15px; + position: absolute; + width: 96.5%; + height: 96.5%; + left: 2.0%; + top: 1.5%; + display: none; +} + +.calls-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 30%; + margin-top: 10px; + margin-left: 10px; +} + +.calls-search-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; +} + +.calls-search-title:hover { + background-color: var(--color-3); +} + +.calls-search-input { + background-color: var(--color-3); + color: white; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + width: 95%; + align-items: center; + user-select: none; + display: none; +} + +#calls-search-input { + outline: none; + border: none; + width: 95%; + color: white; + font-size: 15px; + background-color: rgba(0, 0, 0, 0); + margin: auto; +} + +#calls-search-input::placeholder { + color: white; +} + +.map-container { + background-color: var(--color-1); + border: 2px solid var(--color-3); + display: flex; + flex-direction: column; + height: 80.7vh; + width: 70%; + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; +} + +.map-clear { + width: 13.7%; + font-size: 15px; + font-weight: lighter; + padding-top: 7px; + padding-bottom: 7px; + background-color: #8f1b1b; + margin: auto; + margin-left: 5px; + margin-right: 10px; + margin-top: 10px; + margin-bottom: 0px; + color: white; + text-align: center; + user-select: none; + display: block; +} + +.map-clear:hover { + background-color: #aa1c1c; +} + +.map-title { + background-color: var(--color-4); + color: white; + font-size: 18px; + font-weight: bolder; + padding-top: 5px; + padding-bottom: 5px; + text-align: center; + margin: auto; + margin-top: 10px; + margin-bottom: 0px; + margin-left: 10px; + margin-right: 5px; + width: 98%; + align-items: center; + user-select: none; +} + +.map-item { + border: 2px solid var(--color-3); + position: absolute; + width: 58%; + height: 88.5%; + left: 40.6%; + top: 8%; + margin-bottom: 15px; +} + +.leaflet-marker-pane { + z-index: 600; +} + +.leaflet-tooltip-pane { + z-index: 650; +} + +.leaflet-tooltip-right { + margin-left: 6px; +} diff --git a/resources/[ps]/ps-objectspawner/.gitignore b/resources/[ps]/ps-objectspawner/.gitignore new file mode 100644 index 0000000..4f802fd --- /dev/null +++ b/resources/[ps]/ps-objectspawner/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +./svelte-source/node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/resources/[ps]/ps-objectspawner/LICENSE b/resources/[ps]/ps-objectspawner/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/resources/[ps]/ps-objectspawner/README.md b/resources/[ps]/ps-objectspawner/README.md new file mode 100644 index 0000000..9cf0e94 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/README.md @@ -0,0 +1,62 @@ +![Project Sloth GitHub Project PS-OBJECTSPAWNER Banner](https://user-images.githubusercontent.com/91661118/176777941-9f3dfa83-0da6-47e4-8cc9-5add55e198bc.png) + +### ps-objectspawner +A well thought out simplistic user-friendly experience for spawning objects around your server. + +![Project Sloth Buttons 2](https://user-images.githubusercontent.com/91661118/176778087-bd5285aa-09ac-4c5f-83d8-53687fab84a9.png) + +### Dependencies: +* [qb-core](https://github.com/qbcore-framework/qb-core) +* [qb-target](https://github.com/BerkieBb/qb-target) +* [oxmysql](https://github.com/overextended/oxmysql) + +### ⚠️Important: +First, run the included sql file to create the `objects` table in your database. Also, the `/object` command will only work for players with `god` permissions, by default. +If you have no permission to use the object command. Go to admin menu > Player Management > Select Player > Permission > Set Group to God > Confirm. Try again entering this command. + +
        + +![Project Sloth GitHub Project PS-OBJECTSPAWNER Install Banner](https://user-images.githubusercontent.com/91661118/176777943-37417e7f-0f77-4afb-92ec-fb3fab2e6543.png) + +### Instructions: +After creating the `objects` table and ensuring you have the `god` permission, use the `/object` command to open the spawning/management menu. In the Create menu, you can name and search for objects you would like to place in the world. You can also specify a spawning distance, that will determine when the object becomes visible to the player; this is specified in standard FiveM distance units. Finally, can add a type of target that the object will hold. We have provided an example (ex `container`) event/target that will create an inventory stash for the spawned object, but more can be added through the client code. + +In the Manage menu, you will see all the objects you have added and information about each. You can also teleport to the objects and delete them, if needed. + +Finally, the object hashes within the Search list are maintained in the included `objectlist` file. + +
        + +![Project Sloth GitHub Project PS-OBJECTSPAWNER Features Banner](https://user-images.githubusercontent.com/91661118/176777942-becd37e0-3186-498f-ae00-ad5281bc2019.png) + + +#### Some features to mention within this ps-objectspawner: +* Spawn objects +* Manage objects +* Render distance for optimization +* Teleport to objects placed + +
        + +![Project Sloth GitHub Project PS-OBJECTSPAWNER Showcase Banner](https://user-images.githubusercontent.com/91661118/176777945-9f072499-f1d5-41d4-ac56-c06b5064ecc2.png) + + +### Time to show you what it looks like! +Here's a few showcased examples while using ps-objectspawner. + +#### Spawn object: +![unknown (4)](https://user-images.githubusercontent.com/91661118/176781258-063b432c-4f71-40d5-baf8-f74d3d01f6a6.png) + +#### Place object: +![unknown (3)](https://user-images.githubusercontent.com/91661118/176781276-f33162bd-58d2-4ad9-977f-0da1ae03e758.png) + +#### Manage objects: +![unknown (5)](https://user-images.githubusercontent.com/91661118/176781300-d4f717c8-9b44-43ea-b609-6a3846cb8006.png) + +#### Search for object: +![unknown](https://user-images.githubusercontent.com/91661118/176781358-9907494d-2288-4b00-a15b-4d68620f707f.png) + +### Credits: +Inspiration and some code snippets from [Svelte & Lua Boilerplate](https://github.com/project-error/svelte-lua-boilerplate) by [Project Error](https://github.com/project-error) + +##### Copyright © 2022 Project Sloth. All rights reserved. diff --git a/resources/[ps]/ps-objectspawner/client/events.lua b/resources/[ps]/ps-objectspawner/client/events.lua new file mode 100644 index 0000000..00f270d --- /dev/null +++ b/resources/[ps]/ps-objectspawner/client/events.lua @@ -0,0 +1,5 @@ +RegisterNetEvent('ps-objectspawner:client:containers', function(data) + local objectData = data + TriggerServerEvent("inventory:server:OpenInventory", "stash", "container_"..objectData.id, {maxweight = 1000000, slots = 10}) + TriggerEvent("inventory:client:SetCurrentStash", "container_"..objectData.id) +end) \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/client/main.lua b/resources/[ps]/ps-objectspawner/client/main.lua new file mode 100644 index 0000000..d542a39 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/client/main.lua @@ -0,0 +1,376 @@ +local QBCore = exports['qb-core']:GetCoreObject() +local ObjectList = {} -- Object, Model, Coords, IsRendered, SpawnRange + +local PlacingObject, LoadedObjects = false, false +local CurrentModel, CurrentObject, CurrentObjectType, CurrentObjectName, CurrentSpawnRange, CurrentCoords = nil, nil, nil, nil, nil, nil + +local group = {user = true} + +local ObjectTypes = { + "none", + "container", +} + +local ObjectParams = { + ["container"] = {event = "ps-objectspawner:client:containers", icon = "fas fa-question", label = "Container", SpawnRange = 200}, + ["none"] = {SpawnRange = 200}, +} + +--Functions +local function openMenu() + SetNuiFocus(true, true) + if LoadedObjects then + SendNUIMessage({ + action = "open", + }) + else + LoadedObjects = true + local tempList = {} + -- In js, objects cant have number keys so we need to change them to strings to be treated as object + -- If we dont do this it will be sent as an array which is bad because it fills in missing array indexes + -- from 0 to min(table ids) + for k, v in pairs(ObjectList) do + tempList[""..k] = v + end + SendNUIMessage({ + action = "load", + objects = Objects, + objectTypes = ObjectTypes, + spawnedObjects = tempList, + }) + end +end + +local function CancelPlacement() + DeleteObject(CurrentObject) + PlacingObject = false + CurrentObject = nil + CurrentObjectType = nil + CurrentObjectName = nil + CurrentSpawnRange = nil + CurrentCoords = nil +end + +AddEventHandler('onResourceStart', function(resourceName) + if GetCurrentResourceName() == resourceName then + QBCore.Functions.TriggerCallback('ps-objectspawner:server:RequestObjects', function(incObjectList) + ObjectList = incObjectList + end) + end +end) + + +AddEventHandler('onResourceStop', function(resourceName) + if GetCurrentResourceName() == resourceName then + for k, v in pairs(ObjectList) do + if v["IsRendered"] then + RemoveRoadNodeSpeedZone(v["speedzone"]) + DeleteObject(v["object"]) + end + end + end +end) + +RegisterNetEvent('ps-objectspawner:client:registerobjectcommand', function(perms) + permission = perms + if permission == 'god' then + openMenu() + end +end) + +RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() + QBCore.Functions.TriggerCallback('ps-objectspawner:server:RequestObjects', function(incObjectList) + ObjectList = incObjectList + end) +end) + +local function ButtonMessage(text) + BeginTextCommandScaleformString("STRING") + AddTextComponentScaleform(text) + EndTextCommandScaleformString() +end + +local function Button(ControlButton) + N_0xe83a3e3557a56640(ControlButton) +end + +local function setupScaleform(scaleform) + local scaleform = RequestScaleformMovie(scaleform) + while not HasScaleformMovieLoaded(scaleform) do + Citizen.Wait(0) + end + + -- draw it once to set up layout + DrawScaleformMovieFullscreen(scaleform, 255, 255, 255, 0, 0) + + PushScaleformMovieFunction(scaleform, "CLEAR_ALL") + PopScaleformMovieFunctionVoid() + + PushScaleformMovieFunction(scaleform, "SET_CLEAR_SPACE") + PushScaleformMovieFunctionParameterInt(200) + PopScaleformMovieFunctionVoid() + + + PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT") + PushScaleformMovieFunctionParameterInt(0) + Button(GetControlInstructionalButton(2, 152, true)) + ButtonMessage("Cancel") + PopScaleformMovieFunctionVoid() + + PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT") + PushScaleformMovieFunctionParameterInt(1) + Button(GetControlInstructionalButton(2, 153, true)) + ButtonMessage("Place object") + PopScaleformMovieFunctionVoid() + + PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT") + PushScaleformMovieFunctionParameterInt(2) + Button(GetControlInstructionalButton(2, 190, true)) + Button(GetControlInstructionalButton(2, 189, true)) + ButtonMessage("Rotate object") + PopScaleformMovieFunctionVoid() + + PushScaleformMovieFunction(scaleform, "DRAW_INSTRUCTIONAL_BUTTONS") + PopScaleformMovieFunctionVoid() + + PushScaleformMovieFunction(scaleform, "SET_BACKGROUND_COLOUR") + PushScaleformMovieFunctionParameterInt(0) + PushScaleformMovieFunctionParameterInt(0) + PushScaleformMovieFunctionParameterInt(0) + PushScaleformMovieFunctionParameterInt(80) + PopScaleformMovieFunctionVoid() + + return scaleform +end + +local function RequestSpawnObject(object) + local hash = GetHashKey(object) + RequestModel(hash) + while not HasModelLoaded(hash) do + Wait(1000) + end +end + +local function RotationToDirection(rotation) + local adjustedRotation = + { + x = (math.pi / 180) * rotation.x, + y = (math.pi / 180) * rotation.y, + z = (math.pi / 180) * rotation.z + } + local direction = + { + x = -math.sin(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)), + y = math.cos(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)), + z = math.sin(adjustedRotation.x) + } + return direction +end + +local function RayCastGamePlayCamera(distance) + local cameraRotation = GetGameplayCamRot() + local cameraCoord = GetGameplayCamCoord() + local direction = RotationToDirection(cameraRotation) + local destination = + { + x = cameraCoord.x + direction.x * distance, + y = cameraCoord.y + direction.y * distance, + z = cameraCoord.z + direction.z * distance + } + local a, b, c, d, e = GetShapeTestResult(StartShapeTestSweptSphere(cameraCoord.x, cameraCoord.y, cameraCoord.z, destination.x, destination.y, destination.z, 0.2, 339, PlayerPedId(), 4)) + return b, c, e +end + +local function PlaceSpawnedObject(heading) + local ObjectType = 'prop' --will be replaced with inputted prop type later, which will determine options/events + local Options = { SpawnRange = tonumber(CurrentSpawnRange) } + if ObjectParams[CurrentObjectType] ~= nil then + Options = { event = ObjectParams[CurrentObjectType].event, icon = ObjectParams[CurrentObjectType].icon, label = ObjectParams[CurrentObjectType].label, SpawnRange = ObjectParams[CurrentObjectType].SpawnRange} --will be replaced with config of options later + end + local finalCoords = vector4(CurrentCoords.x, CurrentCoords.y, CurrentCoords.z, heading) + TriggerServerEvent("ps-objectspawner:server:CreateNewObject", CurrentModel, finalCoords, CurrentObjectType, Options, CurrentObjectName) + DeleteObject(CurrentObject) + PlacingObject = false + CurrentObject = nil + CurrentObjectType = nil + CurrentObjectName = nil + CurrentSpawnRange = nil + CurrentCoords = nil + CurrentModel = nil +end + +local function CreateSpawnedObject(data) + if data.object == nil then return print("Invalid Object") end + local object = data.object + CurrentObjectType = data.type + CurrentObjectName = data.name or "Random Object" + CurrentSpawnRange = ObjectParams[objectType] and ObjectParams[objectType] ~= nil or data.distance or 15 + + RequestSpawnObject(object) + CurrentModel = object + CurrentObject = CreateObject(object, 1.0, 1.0, 1.0, true, true, false) + local heading = 0.0 + SetEntityHeading(CurrentObject, 0) + + SetEntityAlpha(CurrentObject, 150) + SetEntityCollision(CurrentObject, false, false) + -- SetEntityInvincible(CurrentObject, true) + FreezeEntityPosition(CurrentObject, true) + + CreateThread(function() + form = setupScaleform("instructional_buttons") + while PlacingObject do + local hit, coords, entity = RayCastGamePlayCamera(20.0) + CurrentCoords = coords + + DrawScaleformMovieFullscreen(form, 255, 255, 255, 255, 0) + + if hit then + SetEntityCoords(CurrentObject, coords.x, coords.y, coords.z) + end + + if IsControlJustPressed(0, 174) then + heading = heading + 5 + if heading > 360 then heading = 0.0 end + end + + if IsControlJustPressed(0, 175) then + heading = heading - 5 + if heading < 0 then heading = 360.0 end + end + + if IsControlJustPressed(0, 44) then + CancelPlacement() + end + + SetEntityHeading(CurrentObject, heading) + if IsControlJustPressed(0, 38) then + PlaceSpawnedObject(heading) + end + + Wait(1) + end + end) +end +exports("CreateSpawnedObject", CreateSpawnedObject) + +RegisterNUICallback('close', function(data, cb) + SetNuiFocus(false, false) + cb('ok') +end) + +RegisterNUICallback('spawn', function(data, cb) + SetNuiFocus(false, false) + PlacingObject = true + CreateSpawnedObject(data) + cb('ok') +end) + +RegisterNetEvent("ps-objectspawner:client:UpdateObjectList", function(NewObjectList) + ObjectList = NewObjectList +end) + +CreateThread(function() + while true do + for k, v in pairs(ObjectList) do + local data = v["options"] + local objectCoords = v["coords"] + local playerCoords = GetEntityCoords(PlayerPedId()) + local dist = #(playerCoords - vector3(objectCoords["x"], objectCoords["y"], objectCoords["z"])) + if dist < data["SpawnRange"] and v["IsRendered"] == nil then + + local object = CreateObject(v["model"], objectCoords["x"], objectCoords["y"], objectCoords["z"], false, false, false) + SetEntityHeading(object, objectCoords["w"]) + SetEntityAlpha(object, 0) + PlaceObjectOnGroundProperly(object) + FreezeEntityPosition(object, true) + v["IsRendered"] = true + v["object"] = object + + --local model = GetEntityModel(object) + --local min, max = GetModelDimensions(model) --TODO: get max model dimensions to generate the SpeedZone radius + v["speedzone"] = AddRoadNodeSpeedZone(objectCoords["x"], objectCoords["y"], objectCoords["z"], 10.0, 0, false) + + for i = 0, 255, 51 do + Wait(50) + SetEntityAlpha(v["object"], i, false) + end + if ObjectParams[v.type] ~= nil and ObjectParams[v.type].event ~= nil then + exports['qb-target']:AddTargetEntity(object, { + --debugPoly=true, + options = { + { + name = "object_spawner_"..object, + event = ObjectParams[v.type].event, + icon = ObjectParams[v.type].icon, + label = ObjectParams[v.type].label, + id = v.id + }, + }, + distance = ObjectParams[data.SpawnRange] + }) + end + end + + if dist >= data["SpawnRange"] and v["IsRendered"] then + if DoesEntityExist(v["object"]) then + for i = 255, 0, -51 do + Wait(50) + SetEntityAlpha(v["object"], i, false) + end + DeleteObject(v["object"]) + + RemoveRoadNodeSpeedZone(v["speedzone"]) + v["object"] = nil + v["IsRendered"] = nil + end + end + end + Wait(1500) + end +end) + +RegisterNetEvent("ps-objectspawner:client:AddObject", function(object) + ObjectList[object.id] = object + if permission == 'god' then + SendNUIMessage({ + action = "created", + newSpawnedObject = object, + }) + end +end) + +RegisterNUICallback('tpTo', function(data, cb) + if permission == 'god' then + SetEntityCoords(PlayerPedId(), data.coords.x+1, data.coords.y+1, data.coords.z) + end + cb('ok') +end) + +RegisterNUICallback('delete', function(data, cb) + if permission == 'god' then + TriggerServerEvent("ps-objectspawner:server:DeleteObject", data.id) + end + cb('ok') +end) + +RegisterNetEvent('ps-objectspawner:client:receiveObjectDelete', function(id) + if permission == 'god' then + if ObjectList[id]["IsRendered"] then + if DoesEntityExist(ObjectList[id]["object"]) then + for i = 255, 0, -51 do + Wait(50) + SetEntityAlpha(ObjectList[id]["object"], i, false) + end + DeleteObject(ObjectList[id]["object"]) + + RemoveRoadNodeSpeedZone(ObjectList[id]["speedzone"]) + end + end + ObjectList[id] = nil + SendNUIMessage({ + action = "delete", + id = id, + }) + end +end) \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/client/objectlist.lua b/resources/[ps]/ps-objectspawner/client/objectlist.lua new file mode 100644 index 0000000..b7b6a68 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/client/objectlist.lua @@ -0,0 +1,18458 @@ +Objects = { + ["02gate3_l"] = true, + ["apa_heist_apart2_door"] = true, + ["apa_mp_apa_crashed_usaf_01a"] = true, + ["apa_mp_apa_y1_l1a"] = true, + ["apa_mp_apa_y1_l1b"] = true, + ["apa_mp_apa_y1_l1c"] = true, + ["apa_mp_apa_y1_l1d"] = true, + ["apa_mp_apa_y1_l2a"] = true, + ["apa_mp_apa_y1_l2b"] = true, + ["apa_mp_apa_y1_l2c"] = true, + ["apa_mp_apa_y1_l2d"] = true, + ["apa_mp_apa_y2_l1a"] = true, + ["apa_mp_apa_y2_l1b"] = true, + ["apa_mp_apa_y2_l1c"] = true, + ["apa_mp_apa_y2_l1d"] = true, + ["apa_mp_apa_y2_l2a"] = true, + ["apa_mp_apa_y2_l2b"] = true, + ["apa_mp_apa_y2_l2c"] = true, + ["apa_mp_apa_y2_l2d"] = true, + ["apa_mp_apa_y3_l1a"] = true, + ["apa_mp_apa_y3_l1b"] = true, + ["apa_mp_apa_y3_l1c"] = true, + ["apa_mp_apa_y3_l1d"] = true, + ["apa_mp_apa_y3_l2a"] = true, + ["apa_mp_apa_y3_l2b"] = true, + ["apa_mp_apa_y3_l2c"] = true, + ["apa_mp_apa_y3_l2d"] = true, + ["apa_mp_apa_yacht"] = true, + ["apa_mp_apa_yacht_door"] = true, + ["apa_mp_apa_yacht_door2"] = true, + ["apa_mp_apa_yacht_jacuzzi_cam"] = true, + ["apa_mp_apa_yacht_jacuzzi_ripple003"] = true, + ["apa_mp_apa_yacht_jacuzzi_ripple1"] = true, + ["apa_mp_apa_yacht_jacuzzi_ripple2"] = true, + ["apa_mp_apa_yacht_launcher_01a"] = true, + ["apa_mp_apa_yacht_o1_rail_a"] = true, + ["apa_mp_apa_yacht_o1_rail_b"] = true, + ["apa_mp_apa_yacht_o2_rail_a"] = true, + ["apa_mp_apa_yacht_o2_rail_b"] = true, + ["apa_mp_apa_yacht_o3_rail_a"] = true, + ["apa_mp_apa_yacht_o3_rail_b"] = true, + ["apa_mp_apa_yacht_option1"] = true, + ["apa_mp_apa_yacht_option1_cola"] = true, + ["apa_mp_apa_yacht_option2"] = true, + ["apa_mp_apa_yacht_option2_cola"] = true, + ["apa_mp_apa_yacht_option2_colb"] = true, + ["apa_mp_apa_yacht_option3"] = true, + ["apa_mp_apa_yacht_option3_cola"] = true, + ["apa_mp_apa_yacht_option3_colb"] = true, + ["apa_mp_apa_yacht_option3_colc"] = true, + ["apa_mp_apa_yacht_option3_cold"] = true, + ["apa_mp_apa_yacht_option3_cole"] = true, + ["apa_mp_apa_yacht_radar_01a"] = true, + ["apa_mp_apa_yacht_win"] = true, + ["apa_mp_h_acc_artwalll_01"] = true, + ["apa_mp_h_acc_artwalll_02"] = true, + ["apa_mp_h_acc_artwalll_03"] = true, + ["apa_mp_h_acc_artwallm_02"] = true, + ["apa_mp_h_acc_artwallm_03"] = true, + ["apa_mp_h_acc_artwallm_04"] = true, + ["apa_mp_h_acc_bottle_01"] = true, + ["apa_mp_h_acc_bottle_02"] = true, + ["apa_mp_h_acc_bowl_ceramic_01"] = true, + ["apa_mp_h_acc_box_trinket_01"] = true, + ["apa_mp_h_acc_box_trinket_02"] = true, + ["apa_mp_h_acc_candles_01"] = true, + ["apa_mp_h_acc_candles_02"] = true, + ["apa_mp_h_acc_candles_04"] = true, + ["apa_mp_h_acc_candles_05"] = true, + ["apa_mp_h_acc_candles_06"] = true, + ["apa_mp_h_acc_coffeemachine_01"] = true, + ["apa_mp_h_acc_dec_head_01"] = true, + ["apa_mp_h_acc_dec_plate_01"] = true, + ["apa_mp_h_acc_dec_plate_02"] = true, + ["apa_mp_h_acc_dec_sculpt_01"] = true, + ["apa_mp_h_acc_dec_sculpt_02"] = true, + ["apa_mp_h_acc_dec_sculpt_03"] = true, + ["apa_mp_h_acc_drink_tray_02"] = true, + ["apa_mp_h_acc_fruitbowl_01"] = true, + ["apa_mp_h_acc_fruitbowl_02"] = true, + ["apa_mp_h_acc_jar_02"] = true, + ["apa_mp_h_acc_jar_03"] = true, + ["apa_mp_h_acc_jar_04"] = true, + ["apa_mp_h_acc_phone_01"] = true, + ["apa_mp_h_acc_plant_palm_01"] = true, + ["apa_mp_h_acc_plant_tall_01"] = true, + ["apa_mp_h_acc_pot_pouri_01"] = true, + ["apa_mp_h_acc_rugwooll_03"] = true, + ["apa_mp_h_acc_rugwooll_04"] = true, + ["apa_mp_h_acc_rugwoolm_01"] = true, + ["apa_mp_h_acc_rugwoolm_02"] = true, + ["apa_mp_h_acc_rugwoolm_03"] = true, + ["apa_mp_h_acc_rugwoolm_04"] = true, + ["apa_mp_h_acc_rugwools_01"] = true, + ["apa_mp_h_acc_rugwools_03"] = true, + ["apa_mp_h_acc_scent_sticks_01"] = true, + ["apa_mp_h_acc_tray_01"] = true, + ["apa_mp_h_acc_vase_01"] = true, + ["apa_mp_h_acc_vase_02"] = true, + ["apa_mp_h_acc_vase_04"] = true, + ["apa_mp_h_acc_vase_05"] = true, + ["apa_mp_h_acc_vase_06"] = true, + ["apa_mp_h_acc_vase_flowers_01"] = true, + ["apa_mp_h_acc_vase_flowers_02"] = true, + ["apa_mp_h_acc_vase_flowers_03"] = true, + ["apa_mp_h_acc_vase_flowers_04"] = true, + ["apa_mp_h_bathtub_01"] = true, + ["apa_mp_h_bed_chestdrawer_02"] = true, + ["apa_mp_h_bed_double_08"] = true, + ["apa_mp_h_bed_double_09"] = true, + ["apa_mp_h_bed_table_wide_12"] = true, + ["apa_mp_h_bed_wide_05"] = true, + ["apa_mp_h_bed_with_table_02"] = true, + ["apa_mp_h_ceiling_light_01"] = true, + ["apa_mp_h_ceiling_light_01_day"] = true, + ["apa_mp_h_ceiling_light_02"] = true, + ["apa_mp_h_ceiling_light_02_day"] = true, + ["apa_mp_h_din_chair_04"] = true, + ["apa_mp_h_din_chair_08"] = true, + ["apa_mp_h_din_chair_09"] = true, + ["apa_mp_h_din_chair_12"] = true, + ["apa_mp_h_din_stool_04"] = true, + ["apa_mp_h_din_table_01"] = true, + ["apa_mp_h_din_table_04"] = true, + ["apa_mp_h_din_table_05"] = true, + ["apa_mp_h_din_table_06"] = true, + ["apa_mp_h_din_table_11"] = true, + ["apa_mp_h_floor_lamp_int_08"] = true, + ["apa_mp_h_floorlamp_a"] = true, + ["apa_mp_h_floorlamp_b"] = true, + ["apa_mp_h_floorlamp_c"] = true, + ["apa_mp_h_kit_kitchen_01_a"] = true, + ["apa_mp_h_kit_kitchen_01_b"] = true, + ["apa_mp_h_lampbulb_multiple_a"] = true, + ["apa_mp_h_lit_floorlamp_01"] = true, + ["apa_mp_h_lit_floorlamp_02"] = true, + ["apa_mp_h_lit_floorlamp_03"] = true, + ["apa_mp_h_lit_floorlamp_05"] = true, + ["apa_mp_h_lit_floorlamp_06"] = true, + ["apa_mp_h_lit_floorlamp_10"] = true, + ["apa_mp_h_lit_floorlamp_13"] = true, + ["apa_mp_h_lit_floorlamp_17"] = true, + ["apa_mp_h_lit_floorlampnight_05"] = true, + ["apa_mp_h_lit_floorlampnight_07"] = true, + ["apa_mp_h_lit_floorlampnight_14"] = true, + ["apa_mp_h_lit_lamptable_005"] = true, + ["apa_mp_h_lit_lamptable_02"] = true, + ["apa_mp_h_lit_lamptable_04"] = true, + ["apa_mp_h_lit_lamptable_09"] = true, + ["apa_mp_h_lit_lamptable_14"] = true, + ["apa_mp_h_lit_lamptable_17"] = true, + ["apa_mp_h_lit_lamptable_21"] = true, + ["apa_mp_h_lit_lamptablenight_16"] = true, + ["apa_mp_h_lit_lamptablenight_24"] = true, + ["apa_mp_h_lit_lightpendant_01"] = true, + ["apa_mp_h_lit_lightpendant_05"] = true, + ["apa_mp_h_lit_lightpendant_05b"] = true, + ["apa_mp_h_stn_chairarm_01"] = true, + ["apa_mp_h_stn_chairarm_02"] = true, + ["apa_mp_h_stn_chairarm_03"] = true, + ["apa_mp_h_stn_chairarm_09"] = true, + ["apa_mp_h_stn_chairarm_11"] = true, + ["apa_mp_h_stn_chairarm_12"] = true, + ["apa_mp_h_stn_chairarm_13"] = true, + ["apa_mp_h_stn_chairarm_23"] = true, + ["apa_mp_h_stn_chairarm_24"] = true, + ["apa_mp_h_stn_chairarm_25"] = true, + ["apa_mp_h_stn_chairarm_26"] = true, + ["apa_mp_h_stn_chairstool_12"] = true, + ["apa_mp_h_stn_chairstrip_01"] = true, + ["apa_mp_h_stn_chairstrip_02"] = true, + ["apa_mp_h_stn_chairstrip_03"] = true, + ["apa_mp_h_stn_chairstrip_04"] = true, + ["apa_mp_h_stn_chairstrip_05"] = true, + ["apa_mp_h_stn_chairstrip_06"] = true, + ["apa_mp_h_stn_chairstrip_07"] = true, + ["apa_mp_h_stn_chairstrip_08"] = true, + ["apa_mp_h_stn_foot_stool_01"] = true, + ["apa_mp_h_stn_foot_stool_02"] = true, + ["apa_mp_h_stn_sofa_daybed_01"] = true, + ["apa_mp_h_stn_sofa_daybed_02"] = true, + ["apa_mp_h_stn_sofa2seat_02"] = true, + ["apa_mp_h_stn_sofacorn_01"] = true, + ["apa_mp_h_stn_sofacorn_05"] = true, + ["apa_mp_h_stn_sofacorn_06"] = true, + ["apa_mp_h_stn_sofacorn_07"] = true, + ["apa_mp_h_stn_sofacorn_08"] = true, + ["apa_mp_h_stn_sofacorn_09"] = true, + ["apa_mp_h_stn_sofacorn_10"] = true, + ["apa_mp_h_str_avunitl_01_b"] = true, + ["apa_mp_h_str_avunitl_04"] = true, + ["apa_mp_h_str_avunitm_01"] = true, + ["apa_mp_h_str_avunitm_03"] = true, + ["apa_mp_h_str_avunits_01"] = true, + ["apa_mp_h_str_avunits_04"] = true, + ["apa_mp_h_str_shelffloorm_02"] = true, + ["apa_mp_h_str_shelffreel_01"] = true, + ["apa_mp_h_str_shelfwallm_01"] = true, + ["apa_mp_h_str_sideboardl_06"] = true, + ["apa_mp_h_str_sideboardl_09"] = true, + ["apa_mp_h_str_sideboardl_11"] = true, + ["apa_mp_h_str_sideboardl_13"] = true, + ["apa_mp_h_str_sideboardl_14"] = true, + ["apa_mp_h_str_sideboardm_02"] = true, + ["apa_mp_h_str_sideboardm_03"] = true, + ["apa_mp_h_str_sideboards_01"] = true, + ["apa_mp_h_str_sideboards_02"] = true, + ["apa_mp_h_tab_coffee_05"] = true, + ["apa_mp_h_tab_coffee_07"] = true, + ["apa_mp_h_tab_coffee_08"] = true, + ["apa_mp_h_tab_sidelrg_01"] = true, + ["apa_mp_h_tab_sidelrg_02"] = true, + ["apa_mp_h_tab_sidelrg_04"] = true, + ["apa_mp_h_tab_sidelrg_07"] = true, + ["apa_mp_h_tab_sidesml_01"] = true, + ["apa_mp_h_tab_sidesml_02"] = true, + ["apa_mp_h_table_lamp_int_08"] = true, + ["apa_mp_h_yacht_armchair_01"] = true, + ["apa_mp_h_yacht_armchair_03"] = true, + ["apa_mp_h_yacht_armchair_04"] = true, + ["apa_mp_h_yacht_barstool_01"] = true, + ["apa_mp_h_yacht_bed_01"] = true, + ["apa_mp_h_yacht_bed_02"] = true, + ["apa_mp_h_yacht_coffee_table_01"] = true, + ["apa_mp_h_yacht_coffee_table_02"] = true, + ["apa_mp_h_yacht_floor_lamp_01"] = true, + ["apa_mp_h_yacht_side_table_01"] = true, + ["apa_mp_h_yacht_side_table_02"] = true, + ["apa_mp_h_yacht_sofa_01"] = true, + ["apa_mp_h_yacht_sofa_02"] = true, + ["apa_mp_h_yacht_stool_01"] = true, + ["apa_mp_h_yacht_strip_chair_01"] = true, + ["apa_mp_h_yacht_table_lamp_01"] = true, + ["apa_mp_h_yacht_table_lamp_02"] = true, + ["apa_mp_h_yacht_table_lamp_03"] = true, + ["apa_p_apa_champ_flute_s"] = true, + ["apa_p_apdlc_crosstrainer_s"] = true, + ["apa_p_apdlc_treadmill_s"] = true, + ["apa_p_h_acc_artwalll_01"] = true, + ["apa_p_h_acc_artwalll_02"] = true, + ["apa_p_h_acc_artwalll_03"] = true, + ["apa_p_h_acc_artwalll_04"] = true, + ["apa_p_h_acc_artwallm_01"] = true, + ["apa_p_h_acc_artwallm_03"] = true, + ["apa_p_h_acc_artwallm_04"] = true, + ["apa_p_h_acc_artwalls_03"] = true, + ["apa_p_h_acc_artwalls_04"] = true, + ["apa_prop_ap_name_text"] = true, + ["apa_prop_ap_port_text"] = true, + ["apa_prop_ap_starb_text"] = true, + ["apa_prop_ap_stern_text"] = true, + ["apa_prop_apa_tumbler_empty"] = true, + ["apa_prop_aptest"] = true, + ["apa_prop_cs_plastic_cup_01"] = true, + ["apa_prop_flag_france"] = true, + ["apa_prop_flag_ireland"] = true, + ["apa_prop_hei_bankdoor_new"] = true, + ["apa_prop_heist_cutscene_doora"] = true, + ["apa_prop_heist_cutscene_doorb"] = true, + ["apa_prop_ss1_mpint_door_l"] = true, + ["apa_prop_ss1_mpint_door_r"] = true, + ["apa_prop_ss1_mpint_garage2"] = true, + ["apa_v_ilev_fh_bedrmdoor"] = true, + ["apa_v_ilev_fh_heistdoor1"] = true, + ["apa_v_ilev_fh_heistdoor2"] = true, + ["apa_v_ilev_ss_door2"] = true, + ["apa_v_ilev_ss_door7"] = true, + ["apa_v_ilev_ss_door8"] = true, + ["ar_prop_ar_ammu_sign"] = true, + ["ar_prop_ar_arrow_thin_l"] = true, + ["ar_prop_ar_arrow_thin_m"] = true, + ["ar_prop_ar_arrow_thin_xl"] = true, + ["ar_prop_ar_arrow_wide_l"] = true, + ["ar_prop_ar_arrow_wide_m"] = true, + ["ar_prop_ar_arrow_wide_xl"] = true, + ["ar_prop_ar_bblock_huge_01"] = true, + ["ar_prop_ar_bblock_huge_02"] = true, + ["ar_prop_ar_bblock_huge_03"] = true, + ["ar_prop_ar_bblock_huge_04"] = true, + ["ar_prop_ar_bblock_huge_05"] = true, + ["ar_prop_ar_checkpoint_crn"] = true, + ["ar_prop_ar_checkpoint_crn_15d"] = true, + ["ar_prop_ar_checkpoint_crn_30d"] = true, + ["ar_prop_ar_checkpoint_crn02"] = true, + ["ar_prop_ar_checkpoint_fork"] = true, + ["ar_prop_ar_checkpoint_l"] = true, + ["ar_prop_ar_checkpoint_m"] = true, + ["ar_prop_ar_checkpoint_s"] = true, + ["ar_prop_ar_checkpoint_xs"] = true, + ["ar_prop_ar_checkpoint_xxs"] = true, + ["ar_prop_ar_checkpoints_crn_5d"] = true, + ["ar_prop_ar_cp_bag"] = true, + ["ar_prop_ar_cp_random_transform"] = true, + ["ar_prop_ar_cp_tower_01a"] = true, + ["ar_prop_ar_cp_tower4x_01a"] = true, + ["ar_prop_ar_cp_tower8x_01a"] = true, + ["ar_prop_ar_hoop_med_01"] = true, + ["ar_prop_ar_jetski_ramp_01_dev"] = true, + ["ar_prop_ar_jump_loop"] = true, + ["ar_prop_ar_neon_gate_01a"] = true, + ["ar_prop_ar_neon_gate_01b"] = true, + ["ar_prop_ar_neon_gate_02a"] = true, + ["ar_prop_ar_neon_gate_02b"] = true, + ["ar_prop_ar_neon_gate_03a"] = true, + ["ar_prop_ar_neon_gate_04a"] = true, + ["ar_prop_ar_neon_gate_05a"] = true, + ["ar_prop_ar_neon_gate4x_01a"] = true, + ["ar_prop_ar_neon_gate4x_02a"] = true, + ["ar_prop_ar_neon_gate4x_03a"] = true, + ["ar_prop_ar_neon_gate4x_04a"] = true, + ["ar_prop_ar_neon_gate4x_05a"] = true, + ["ar_prop_ar_neon_gate8x_01a"] = true, + ["ar_prop_ar_neon_gate8x_02a"] = true, + ["ar_prop_ar_neon_gate8x_03a"] = true, + ["ar_prop_ar_neon_gate8x_04a"] = true, + ["ar_prop_ar_neon_gate8x_05a"] = true, + ["ar_prop_ar_speed_ring"] = true, + ["ar_prop_ar_start_01a"] = true, + ["ar_prop_ar_stunt_block_01a"] = true, + ["ar_prop_ar_stunt_block_01b"] = true, + ["ar_prop_ar_tube_2x_crn"] = true, + ["ar_prop_ar_tube_2x_crn_15d"] = true, + ["ar_prop_ar_tube_2x_crn_30d"] = true, + ["ar_prop_ar_tube_2x_crn_5d"] = true, + ["ar_prop_ar_tube_2x_crn2"] = true, + ["ar_prop_ar_tube_2x_gap_02"] = true, + ["ar_prop_ar_tube_2x_l"] = true, + ["ar_prop_ar_tube_2x_m"] = true, + ["ar_prop_ar_tube_2x_s"] = true, + ["ar_prop_ar_tube_2x_speed"] = true, + ["ar_prop_ar_tube_2x_xs"] = true, + ["ar_prop_ar_tube_2x_xxs"] = true, + ["ar_prop_ar_tube_4x_crn"] = true, + ["ar_prop_ar_tube_4x_crn_15d"] = true, + ["ar_prop_ar_tube_4x_crn_30d"] = true, + ["ar_prop_ar_tube_4x_crn_5d"] = true, + ["ar_prop_ar_tube_4x_crn2"] = true, + ["ar_prop_ar_tube_4x_gap_02"] = true, + ["ar_prop_ar_tube_4x_l"] = true, + ["ar_prop_ar_tube_4x_m"] = true, + ["ar_prop_ar_tube_4x_s"] = true, + ["ar_prop_ar_tube_4x_speed"] = true, + ["ar_prop_ar_tube_4x_xs"] = true, + ["ar_prop_ar_tube_4x_xxs"] = true, + ["ar_prop_ar_tube_crn"] = true, + ["ar_prop_ar_tube_crn_15d"] = true, + ["ar_prop_ar_tube_crn_30d"] = true, + ["ar_prop_ar_tube_crn_5d"] = true, + ["ar_prop_ar_tube_crn2"] = true, + ["ar_prop_ar_tube_cross"] = true, + ["ar_prop_ar_tube_fork"] = true, + ["ar_prop_ar_tube_gap_02"] = true, + ["ar_prop_ar_tube_hg"] = true, + ["ar_prop_ar_tube_jmp"] = true, + ["ar_prop_ar_tube_l"] = true, + ["ar_prop_ar_tube_m"] = true, + ["ar_prop_ar_tube_qg"] = true, + ["ar_prop_ar_tube_s"] = true, + ["ar_prop_ar_tube_speed"] = true, + ["ar_prop_ar_tube_xs"] = true, + ["ar_prop_ar_tube_xxs"] = true, + ["ar_prop_gate_cp_90d"] = true, + ["ar_prop_gate_cp_90d_01a"] = true, + ["ar_prop_gate_cp_90d_01a_l2"] = true, + ["ar_prop_gate_cp_90d_01b"] = true, + ["ar_prop_gate_cp_90d_01b_l2"] = true, + ["ar_prop_gate_cp_90d_01c"] = true, + ["ar_prop_gate_cp_90d_01c_l2"] = true, + ["ar_prop_gate_cp_90d_h1"] = true, + ["ar_prop_gate_cp_90d_h1_l2"] = true, + ["ar_prop_gate_cp_90d_h2"] = true, + ["ar_prop_gate_cp_90d_h2_l2"] = true, + ["ar_prop_gate_cp_90d_l2"] = true, + ["ar_prop_ig_cp_h1_l2"] = true, + ["ar_prop_ig_cp_h2_l2"] = true, + ["ar_prop_ig_cp_l2"] = true, + ["ar_prop_ig_cp_loop_01a_l2"] = true, + ["ar_prop_ig_cp_loop_01b_l2"] = true, + ["ar_prop_ig_cp_loop_01c_l2"] = true, + ["ar_prop_ig_cp_loop_h1_l2"] = true, + ["ar_prop_ig_cp_loop_h2_l2"] = true, + ["ar_prop_ig_flow_cp_b"] = true, + ["ar_prop_ig_flow_cp_b_l2"] = true, + ["ar_prop_ig_flow_cp_single"] = true, + ["ar_prop_ig_flow_cp_single_l2"] = true, + ["ar_prop_ig_jackal_cp_b"] = true, + ["ar_prop_ig_jackal_cp_b_l2"] = true, + ["ar_prop_ig_jackal_cp_single"] = true, + ["ar_prop_ig_jackal_cp_single_l2"] = true, + ["ar_prop_ig_metv_cp_b"] = true, + ["ar_prop_ig_metv_cp_b_l2"] = true, + ["ar_prop_ig_metv_cp_single"] = true, + ["ar_prop_ig_metv_cp_single_l2"] = true, + ["ar_prop_ig_raine_cp_b"] = true, + ["ar_prop_ig_raine_cp_l2"] = true, + ["ar_prop_ig_raine_cp_single"] = true, + ["ar_prop_ig_raine_cp_single_l2"] = true, + ["ar_prop_ig_shark_cp_b"] = true, + ["ar_prop_ig_shark_cp_b_l2"] = true, + ["ar_prop_ig_shark_cp_single"] = true, + ["ar_prop_ig_shark_cp_single_l2"] = true, + ["ar_prop_ig_sprunk_cp_b"] = true, + ["ar_prop_ig_sprunk_cp_b_l2"] = true, + ["ar_prop_ig_sprunk_cp_single"] = true, + ["ar_prop_ig_sprunk_cp_single_l2"] = true, + ["ar_prop_inflategates_cp"] = true, + ["ar_prop_inflategates_cp_h1"] = true, + ["ar_prop_inflategates_cp_h2"] = true, + ["ar_prop_inflategates_cp_loop"] = true, + ["ar_prop_inflategates_cp_loop_01a"] = true, + ["ar_prop_inflategates_cp_loop_01b"] = true, + ["ar_prop_inflategates_cp_loop_01c"] = true, + ["ar_prop_inflategates_cp_loop_h1"] = true, + ["ar_prop_inflategates_cp_loop_h2"] = true, + ["ar_prop_inflategates_cp_loop_l2"] = true, + ["as_prop_as_bblock_huge_04"] = true, + ["as_prop_as_bblock_huge_05"] = true, + ["as_prop_as_dwslope30"] = true, + ["as_prop_as_laptop_01a"] = true, + ["as_prop_as_speakerdock"] = true, + ["as_prop_as_stunt_target"] = true, + ["as_prop_as_stunt_target_small"] = true, + ["as_prop_as_target_big"] = true, + ["as_prop_as_target_grid"] = true, + ["as_prop_as_target_medium"] = true, + ["as_prop_as_target_scaffold_01a"] = true, + ["as_prop_as_target_scaffold_01b"] = true, + ["as_prop_as_target_scaffold_02a"] = true, + ["as_prop_as_target_scaffold_02b"] = true, + ["as_prop_as_target_small"] = true, + ["as_prop_as_target_small_02"] = true, + ["as_prop_as_tube_gap_02"] = true, + ["as_prop_as_tube_gap_03"] = true, + ["as_prop_as_tube_xxs"] = true, + ["ba_prop_batle_crates_mule"] = true, + ["ba_prop_batle_crates_pounder"] = true, + ["ba_prop_battle_amb_phone"] = true, + ["ba_prop_battle_antique_box"] = true, + ["ba_prop_battle_bag_01a"] = true, + ["ba_prop_battle_bag_01b"] = true, + ["ba_prop_battle_bar_beerfridge_01"] = true, + ["ba_prop_battle_bar_fridge_01"] = true, + ["ba_prop_battle_bar_fridge_02"] = true, + ["ba_prop_battle_barrier_01a"] = true, + ["ba_prop_battle_barrier_01b"] = true, + ["ba_prop_battle_barrier_01c"] = true, + ["ba_prop_battle_barrier_02a"] = true, + ["ba_prop_battle_bikechock"] = true, + ["ba_prop_battle_cameradrone"] = true, + ["ba_prop_battle_case_sm_03"] = true, + ["ba_prop_battle_cctv_cam_01a"] = true, + ["ba_prop_battle_cctv_cam_01b"] = true, + ["ba_prop_battle_champ_01"] = true, + ["ba_prop_battle_champ_closed"] = true, + ["ba_prop_battle_champ_closed_02"] = true, + ["ba_prop_battle_champ_closed_03"] = true, + ["ba_prop_battle_champ_open"] = true, + ["ba_prop_battle_champ_open_02"] = true, + ["ba_prop_battle_champ_open_03"] = true, + ["ba_prop_battle_chest_closed"] = true, + ["ba_prop_battle_club_chair_01"] = true, + ["ba_prop_battle_club_chair_02"] = true, + ["ba_prop_battle_club_chair_03"] = true, + ["ba_prop_battle_club_computer_01"] = true, + ["ba_prop_battle_club_computer_02"] = true, + ["ba_prop_battle_club_screen"] = true, + ["ba_prop_battle_club_screen_02"] = true, + ["ba_prop_battle_club_screen_03"] = true, + ["ba_prop_battle_club_speaker_array"] = true, + ["ba_prop_battle_club_speaker_dj"] = true, + ["ba_prop_battle_club_speaker_large"] = true, + ["ba_prop_battle_club_speaker_med"] = true, + ["ba_prop_battle_club_speaker_small"] = true, + ["ba_prop_battle_coke_block_01a"] = true, + ["ba_prop_battle_coke_doll_bigbox"] = true, + ["ba_prop_battle_control_console"] = true, + ["ba_prop_battle_control_seat"] = true, + ["ba_prop_battle_crate_art_02_bc"] = true, + ["ba_prop_battle_crate_beer_01"] = true, + ["ba_prop_battle_crate_beer_02"] = true, + ["ba_prop_battle_crate_beer_03"] = true, + ["ba_prop_battle_crate_beer_04"] = true, + ["ba_prop_battle_crate_beer_double"] = true, + ["ba_prop_battle_crate_biohazard_bc"] = true, + ["ba_prop_battle_crate_closed_bc"] = true, + ["ba_prop_battle_crate_gems_bc"] = true, + ["ba_prop_battle_crate_m_antiques"] = true, + ["ba_prop_battle_crate_m_bones"] = true, + ["ba_prop_battle_crate_m_hazard"] = true, + ["ba_prop_battle_crate_m_jewellery"] = true, + ["ba_prop_battle_crate_m_medical"] = true, + ["ba_prop_battle_crate_m_tobacco"] = true, + ["ba_prop_battle_crate_med_bc"] = true, + ["ba_prop_battle_crate_tob_bc"] = true, + ["ba_prop_battle_crate_wlife_bc"] = true, + ["ba_prop_battle_crates_pistols_01a"] = true, + ["ba_prop_battle_crates_rifles_01a"] = true, + ["ba_prop_battle_crates_rifles_02a"] = true, + ["ba_prop_battle_crates_rifles_03a"] = true, + ["ba_prop_battle_crates_rifles_04a"] = true, + ["ba_prop_battle_crates_sam_01a"] = true, + ["ba_prop_battle_crates_wpn_mix_01a"] = true, + ["ba_prop_battle_cuffs"] = true, + ["ba_prop_battle_decanter_01_s"] = true, + ["ba_prop_battle_decanter_02_s"] = true, + ["ba_prop_battle_decanter_03_s"] = true, + ["ba_prop_battle_dj_deck_01a"] = true, + ["ba_prop_battle_dj_kit_mixer"] = true, + ["ba_prop_battle_dj_kit_speaker"] = true, + ["ba_prop_battle_dj_mixer_01a"] = true, + ["ba_prop_battle_dj_mixer_01b"] = true, + ["ba_prop_battle_dj_mixer_01c"] = true, + ["ba_prop_battle_dj_mixer_01d"] = true, + ["ba_prop_battle_dj_mixer_01e"] = true, + ["ba_prop_battle_dj_stand"] = true, + ["ba_prop_battle_dj_wires_dixon"] = true, + ["ba_prop_battle_dj_wires_madonna"] = true, + ["ba_prop_battle_dj_wires_solomon"] = true, + ["ba_prop_battle_dj_wires_tale"] = true, + ["ba_prop_battle_drone_hornet"] = true, + ["ba_prop_battle_drone_quad"] = true, + ["ba_prop_battle_drone_quad_static"] = true, + ["ba_prop_battle_drug_package_02"] = true, + ["ba_prop_battle_emis_rig_01"] = true, + ["ba_prop_battle_emis_rig_02"] = true, + ["ba_prop_battle_emis_rig_03"] = true, + ["ba_prop_battle_emis_rig_04"] = true, + ["ba_prop_battle_fakeid_boxdl_01a"] = true, + ["ba_prop_battle_fakeid_boxpp_01a"] = true, + ["ba_prop_battle_fan"] = true, + ["ba_prop_battle_glowstick_01"] = true, + ["ba_prop_battle_hacker_screen"] = true, + ["ba_prop_battle_handbag"] = true, + ["ba_prop_battle_headphones_dj"] = true, + ["ba_prop_battle_hinge"] = true, + ["ba_prop_battle_hobby_horse"] = true, + ["ba_prop_battle_ice_bucket"] = true, + ["ba_prop_battle_laptop_dj"] = true, + ["ba_prop_battle_latch"] = true, + ["ba_prop_battle_mast_01a"] = true, + ["ba_prop_battle_meth_bigbag_01a"] = true, + ["ba_prop_battle_mic"] = true, + ["ba_prop_battle_moneypack_02a"] = true, + ["ba_prop_battle_pbus_screen"] = true, + ["ba_prop_battle_policet_seats"] = true, + ["ba_prop_battle_poster_promo_01"] = true, + ["ba_prop_battle_poster_promo_02"] = true, + ["ba_prop_battle_poster_promo_03"] = true, + ["ba_prop_battle_poster_promo_04"] = true, + ["ba_prop_battle_poster_skin_01"] = true, + ["ba_prop_battle_poster_skin_02"] = true, + ["ba_prop_battle_poster_skin_03"] = true, + ["ba_prop_battle_poster_skin_04"] = true, + ["ba_prop_battle_ps_box_01"] = true, + ["ba_prop_battle_rsply_crate_02a"] = true, + ["ba_prop_battle_rsply_crate_gr_02a"] = true, + ["ba_prop_battle_secpanel"] = true, + ["ba_prop_battle_secpanel_dam"] = true, + ["ba_prop_battle_security_pad"] = true, + ["ba_prop_battle_shot_glass_01"] = true, + ["ba_prop_battle_sniffing_pipe"] = true, + ["ba_prop_battle_sports_helmet"] = true, + ["ba_prop_battle_tent_01"] = true, + ["ba_prop_battle_tent_02"] = true, + ["ba_prop_battle_track_exshort"] = true, + ["ba_prop_battle_track_short"] = true, + ["ba_prop_battle_trophy_battler"] = true, + ["ba_prop_battle_trophy_dancer"] = true, + ["ba_prop_battle_trophy_no1"] = true, + ["ba_prop_battle_tube_fn_01"] = true, + ["ba_prop_battle_tube_fn_02"] = true, + ["ba_prop_battle_tube_fn_03"] = true, + ["ba_prop_battle_tube_fn_04"] = true, + ["ba_prop_battle_tube_fn_05"] = true, + ["ba_prop_battle_vape_01"] = true, + ["ba_prop_battle_vinyl_case"] = true, + ["ba_prop_battle_wallet_pickup"] = true, + ["ba_prop_battle_weed_bigbag_01a"] = true, + ["ba_prop_battle_whiskey_bottle_2_s"] = true, + ["ba_prop_battle_whiskey_bottle_s"] = true, + ["ba_prop_battle_whiskey_opaque_s"] = true, + ["ba_prop_club_champset"] = true, + ["ba_prop_club_dimmer"] = true, + ["ba_prop_club_dressing_board_01"] = true, + ["ba_prop_club_dressing_board_02"] = true, + ["ba_prop_club_dressing_board_03"] = true, + ["ba_prop_club_dressing_board_04"] = true, + ["ba_prop_club_dressing_board_05"] = true, + ["ba_prop_club_dressing_poster_01"] = true, + ["ba_prop_club_dressing_poster_02"] = true, + ["ba_prop_club_dressing_poster_03"] = true, + ["ba_prop_club_dressing_posters_01"] = true, + ["ba_prop_club_dressing_posters_02"] = true, + ["ba_prop_club_dressing_posters_03"] = true, + ["ba_prop_club_dressing_sign_01"] = true, + ["ba_prop_club_dressing_sign_02"] = true, + ["ba_prop_club_dressing_sign_03"] = true, + ["ba_prop_club_emis_rig_01"] = true, + ["ba_prop_club_emis_rig_02"] = true, + ["ba_prop_club_emis_rig_02b"] = true, + ["ba_prop_club_emis_rig_02c"] = true, + ["ba_prop_club_emis_rig_02d"] = true, + ["ba_prop_club_emis_rig_03"] = true, + ["ba_prop_club_emis_rig_04"] = true, + ["ba_prop_club_emis_rig_04b"] = true, + ["ba_prop_club_emis_rig_04c"] = true, + ["ba_prop_club_emis_rig_05"] = true, + ["ba_prop_club_emis_rig_06"] = true, + ["ba_prop_club_emis_rig_07"] = true, + ["ba_prop_club_emis_rig_08"] = true, + ["ba_prop_club_emis_rig_09"] = true, + ["ba_prop_club_emis_rig_10"] = true, + ["ba_prop_club_emis_rig_10_shad"] = true, + ["ba_prop_club_glass_opaque"] = true, + ["ba_prop_club_glass_trans"] = true, + ["ba_prop_club_laptop_dj"] = true, + ["ba_prop_club_laptop_dj_02"] = true, + ["ba_prop_club_screens_01"] = true, + ["ba_prop_club_screens_02"] = true, + ["ba_prop_club_smoke_machine"] = true, + ["ba_prop_club_tonic_bottle"] = true, + ["ba_prop_club_tonic_can"] = true, + ["ba_prop_club_water_bottle"] = true, + ["ba_prop_door_club_edgy_generic"] = true, + ["ba_prop_door_club_edgy_wc"] = true, + ["ba_prop_door_club_entrance"] = true, + ["ba_prop_door_club_generic_vip"] = true, + ["ba_prop_door_club_glam_generic"] = true, + ["ba_prop_door_club_glam_wc"] = true, + ["ba_prop_door_club_glass"] = true, + ["ba_prop_door_club_glass_opaque"] = true, + ["ba_prop_door_club_trad_generic"] = true, + ["ba_prop_door_club_trad_wc"] = true, + ["ba_prop_door_elevator_1l"] = true, + ["ba_prop_door_elevator_1r"] = true, + ["ba_prop_door_gun_safe"] = true, + ["ba_prop_door_safe"] = true, + ["ba_prop_door_safe_02"] = true, + ["ba_prop_glass_front_office"] = true, + ["ba_prop_glass_front_office_opaque"] = true, + ["ba_prop_glass_garage"] = true, + ["ba_prop_glass_garage_opaque"] = true, + ["ba_prop_glass_rear_office"] = true, + ["ba_prop_glass_rear_opaque"] = true, + ["ba_prop_int_edgy_stool"] = true, + ["ba_prop_int_edgy_table_01"] = true, + ["ba_prop_int_edgy_table_02"] = true, + ["ba_prop_int_glam_stool"] = true, + ["ba_prop_int_glam_table"] = true, + ["ba_prop_int_stool_low"] = true, + ["ba_prop_int_trad_table"] = true, + ["ba_prop_sign_galaxy"] = true, + ["ba_prop_sign_gefangnis"] = true, + ["ba_prop_sign_maison"] = true, + ["ba_prop_sign_omega"] = true, + ["ba_prop_sign_omega_02"] = true, + ["ba_prop_sign_palace"] = true, + ["ba_prop_sign_paradise"] = true, + ["ba_prop_sign_studio"] = true, + ["ba_prop_sign_technologie"] = true, + ["ba_prop_sign_tonys"] = true, + ["ba_prop_track_bend_l_b"] = true, + ["ba_prop_track_straight_lm"] = true, + ["ba_rig_dj_01_lights_01_a"] = true, + ["ba_rig_dj_01_lights_01_b"] = true, + ["ba_rig_dj_01_lights_01_c"] = true, + ["ba_rig_dj_01_lights_02_a"] = true, + ["ba_rig_dj_01_lights_02_b"] = true, + ["ba_rig_dj_01_lights_02_c"] = true, + ["ba_rig_dj_01_lights_03_a"] = true, + ["ba_rig_dj_01_lights_03_b"] = true, + ["ba_rig_dj_01_lights_03_c"] = true, + ["ba_rig_dj_01_lights_04_a"] = true, + ["ba_rig_dj_01_lights_04_a_scr"] = true, + ["ba_rig_dj_01_lights_04_b"] = true, + ["ba_rig_dj_01_lights_04_b_scr"] = true, + ["ba_rig_dj_01_lights_04_c"] = true, + ["ba_rig_dj_01_lights_04_c_scr"] = true, + ["ba_rig_dj_02_lights_01_a"] = true, + ["ba_rig_dj_02_lights_01_b"] = true, + ["ba_rig_dj_02_lights_01_c"] = true, + ["ba_rig_dj_02_lights_02_a"] = true, + ["ba_rig_dj_02_lights_02_b"] = true, + ["ba_rig_dj_02_lights_02_c"] = true, + ["ba_rig_dj_02_lights_03_a"] = true, + ["ba_rig_dj_02_lights_03_b"] = true, + ["ba_rig_dj_02_lights_03_c"] = true, + ["ba_rig_dj_02_lights_04_a"] = true, + ["ba_rig_dj_02_lights_04_a_scr"] = true, + ["ba_rig_dj_02_lights_04_b"] = true, + ["ba_rig_dj_02_lights_04_b_scr"] = true, + ["ba_rig_dj_02_lights_04_c"] = true, + ["ba_rig_dj_02_lights_04_c_scr"] = true, + ["ba_rig_dj_03_lights_01_a"] = true, + ["ba_rig_dj_03_lights_01_b"] = true, + ["ba_rig_dj_03_lights_01_c"] = true, + ["ba_rig_dj_03_lights_02_a"] = true, + ["ba_rig_dj_03_lights_02_b"] = true, + ["ba_rig_dj_03_lights_02_c"] = true, + ["ba_rig_dj_03_lights_03_a"] = true, + ["ba_rig_dj_03_lights_03_b"] = true, + ["ba_rig_dj_03_lights_03_c"] = true, + ["ba_rig_dj_03_lights_04_a"] = true, + ["ba_rig_dj_03_lights_04_a_scr"] = true, + ["ba_rig_dj_03_lights_04_b"] = true, + ["ba_rig_dj_03_lights_04_b_scr"] = true, + ["ba_rig_dj_03_lights_04_c"] = true, + ["ba_rig_dj_03_lights_04_c_scr"] = true, + ["ba_rig_dj_04_lights_01_a"] = true, + ["ba_rig_dj_04_lights_01_b"] = true, + ["ba_rig_dj_04_lights_01_c"] = true, + ["ba_rig_dj_04_lights_02_a"] = true, + ["ba_rig_dj_04_lights_02_b"] = true, + ["ba_rig_dj_04_lights_02_c"] = true, + ["ba_rig_dj_04_lights_03_a"] = true, + ["ba_rig_dj_04_lights_03_b"] = true, + ["ba_rig_dj_04_lights_03_c"] = true, + ["ba_rig_dj_04_lights_04_a"] = true, + ["ba_rig_dj_04_lights_04_a_scr"] = true, + ["ba_rig_dj_04_lights_04_b"] = true, + ["ba_rig_dj_04_lights_04_b_scr"] = true, + ["ba_rig_dj_04_lights_04_c"] = true, + ["ba_rig_dj_04_lights_04_c_scr"] = true, + ["ba_rig_dj_all_lights_01_off"] = true, + ["ba_rig_dj_all_lights_02_off"] = true, + ["ba_rig_dj_all_lights_03_off"] = true, + ["ba_rig_dj_all_lights_04_off"] = true, + ["beerrow_local"] = true, + ["beerrow_world"] = true, + ["bike_test"] = true, + ["bkr_cash_scatter_02"] = true, + ["bkr_prop_biker_barstool_01"] = true, + ["bkr_prop_biker_barstool_02"] = true, + ["bkr_prop_biker_barstool_03"] = true, + ["bkr_prop_biker_barstool_04"] = true, + ["bkr_prop_biker_bblock_cor"] = true, + ["bkr_prop_biker_bblock_cor_02"] = true, + ["bkr_prop_biker_bblock_cor_03"] = true, + ["bkr_prop_biker_bblock_huge_01"] = true, + ["bkr_prop_biker_bblock_huge_02"] = true, + ["bkr_prop_biker_bblock_huge_03"] = true, + ["bkr_prop_biker_bblock_huge_04"] = true, + ["bkr_prop_biker_bblock_huge_05"] = true, + ["bkr_prop_biker_bblock_hump_01"] = true, + ["bkr_prop_biker_bblock_hump_02"] = true, + ["bkr_prop_biker_bblock_lrg1"] = true, + ["bkr_prop_biker_bblock_lrg2"] = true, + ["bkr_prop_biker_bblock_lrg3"] = true, + ["bkr_prop_biker_bblock_mdm1"] = true, + ["bkr_prop_biker_bblock_mdm2"] = true, + ["bkr_prop_biker_bblock_mdm3"] = true, + ["bkr_prop_biker_bblock_qp"] = true, + ["bkr_prop_biker_bblock_qp2"] = true, + ["bkr_prop_biker_bblock_qp3"] = true, + ["bkr_prop_biker_bblock_sml1"] = true, + ["bkr_prop_biker_bblock_sml2"] = true, + ["bkr_prop_biker_bblock_sml3"] = true, + ["bkr_prop_biker_bblock_xl1"] = true, + ["bkr_prop_biker_bblock_xl2"] = true, + ["bkr_prop_biker_bblock_xl3"] = true, + ["bkr_prop_biker_boardchair01"] = true, + ["bkr_prop_biker_bowlpin_stand"] = true, + ["bkr_prop_biker_campbed_01"] = true, + ["bkr_prop_biker_case_shut"] = true, + ["bkr_prop_biker_ceiling_fan_base"] = true, + ["bkr_prop_biker_chair_01"] = true, + ["bkr_prop_biker_chairstrip_01"] = true, + ["bkr_prop_biker_chairstrip_02"] = true, + ["bkr_prop_biker_door_entry"] = true, + ["bkr_prop_biker_garage_locker_01"] = true, + ["bkr_prop_biker_gcase_s"] = true, + ["bkr_prop_biker_jump_01a"] = true, + ["bkr_prop_biker_jump_01b"] = true, + ["bkr_prop_biker_jump_01c"] = true, + ["bkr_prop_biker_jump_02a"] = true, + ["bkr_prop_biker_jump_02b"] = true, + ["bkr_prop_biker_jump_02c"] = true, + ["bkr_prop_biker_jump_l"] = true, + ["bkr_prop_biker_jump_lb"] = true, + ["bkr_prop_biker_jump_m"] = true, + ["bkr_prop_biker_jump_mb"] = true, + ["bkr_prop_biker_jump_s"] = true, + ["bkr_prop_biker_jump_sb"] = true, + ["bkr_prop_biker_landing_zone_01"] = true, + ["bkr_prop_biker_pendant_light"] = true, + ["bkr_prop_biker_safebody_01a"] = true, + ["bkr_prop_biker_safedoor_01a"] = true, + ["bkr_prop_biker_scriptrt_logo"] = true, + ["bkr_prop_biker_scriptrt_table"] = true, + ["bkr_prop_biker_scriptrt_wall"] = true, + ["bkr_prop_biker_target"] = true, + ["bkr_prop_biker_target_small"] = true, + ["bkr_prop_biker_tool_broom"] = true, + ["bkr_prop_biker_tube_crn"] = true, + ["bkr_prop_biker_tube_crn2"] = true, + ["bkr_prop_biker_tube_cross"] = true, + ["bkr_prop_biker_tube_gap_01"] = true, + ["bkr_prop_biker_tube_gap_02"] = true, + ["bkr_prop_biker_tube_gap_03"] = true, + ["bkr_prop_biker_tube_l"] = true, + ["bkr_prop_biker_tube_m"] = true, + ["bkr_prop_biker_tube_s"] = true, + ["bkr_prop_biker_tube_xs"] = true, + ["bkr_prop_biker_tube_xxs"] = true, + ["bkr_prop_bkr_cash_roll_01"] = true, + ["bkr_prop_bkr_cash_scatter_01"] = true, + ["bkr_prop_bkr_cash_scatter_03"] = true, + ["bkr_prop_bkr_cashpile_01"] = true, + ["bkr_prop_bkr_cashpile_02"] = true, + ["bkr_prop_bkr_cashpile_03"] = true, + ["bkr_prop_bkr_cashpile_04"] = true, + ["bkr_prop_bkr_cashpile_05"] = true, + ["bkr_prop_bkr_cashpile_06"] = true, + ["bkr_prop_bkr_cashpile_07"] = true, + ["bkr_prop_cashmove"] = true, + ["bkr_prop_cashtrolley_01a"] = true, + ["bkr_prop_clubhouse_arm_wrestle_01a"] = true, + ["bkr_prop_clubhouse_arm_wrestle_02a"] = true, + ["bkr_prop_clubhouse_armchair_01a"] = true, + ["bkr_prop_clubhouse_blackboard_01a"] = true, + ["bkr_prop_clubhouse_chair_01"] = true, + ["bkr_prop_clubhouse_chair_03"] = true, + ["bkr_prop_clubhouse_jukebox_01a"] = true, + ["bkr_prop_clubhouse_jukebox_01b"] = true, + ["bkr_prop_clubhouse_jukebox_02a"] = true, + ["bkr_prop_clubhouse_laptop_01a"] = true, + ["bkr_prop_clubhouse_laptop_01b"] = true, + ["bkr_prop_clubhouse_offchair_01a"] = true, + ["bkr_prop_clubhouse_sofa_01a"] = true, + ["bkr_prop_coke_bakingsoda"] = true, + ["bkr_prop_coke_bakingsoda_o"] = true, + ["bkr_prop_coke_block_01a"] = true, + ["bkr_prop_coke_bottle_01a"] = true, + ["bkr_prop_coke_bottle_02a"] = true, + ["bkr_prop_coke_box_01a"] = true, + ["bkr_prop_coke_boxeddoll"] = true, + ["bkr_prop_coke_cracktray_01"] = true, + ["bkr_prop_coke_cut_01"] = true, + ["bkr_prop_coke_cut_02"] = true, + ["bkr_prop_coke_cutblock_01"] = true, + ["bkr_prop_coke_dehydrator_01"] = true, + ["bkr_prop_coke_doll"] = true, + ["bkr_prop_coke_doll_bigbox"] = true, + ["bkr_prop_coke_dollbox"] = true, + ["bkr_prop_coke_dollboxfolded"] = true, + ["bkr_prop_coke_dollcast"] = true, + ["bkr_prop_coke_dollmould"] = true, + ["bkr_prop_coke_fullmetalbowl_02"] = true, + ["bkr_prop_coke_fullscoop_01a"] = true, + ["bkr_prop_coke_fullsieve_01a"] = true, + ["bkr_prop_coke_heat_01"] = true, + ["bkr_prop_coke_heatbasket_01"] = true, + ["bkr_prop_coke_metalbowl_01"] = true, + ["bkr_prop_coke_metalbowl_02"] = true, + ["bkr_prop_coke_metalbowl_03"] = true, + ["bkr_prop_coke_mixer_01"] = true, + ["bkr_prop_coke_mixtube_01"] = true, + ["bkr_prop_coke_mixtube_02"] = true, + ["bkr_prop_coke_mixtube_03"] = true, + ["bkr_prop_coke_mold_01a"] = true, + ["bkr_prop_coke_mold_02a"] = true, + ["bkr_prop_coke_mortalpestle"] = true, + ["bkr_prop_coke_painkiller_01a"] = true, + ["bkr_prop_coke_pallet_01a"] = true, + ["bkr_prop_coke_plasticbowl_01"] = true, + ["bkr_prop_coke_powder_01"] = true, + ["bkr_prop_coke_powder_02"] = true, + ["bkr_prop_coke_powderbottle_01"] = true, + ["bkr_prop_coke_powderbottle_02"] = true, + ["bkr_prop_coke_powderedmilk"] = true, + ["bkr_prop_coke_powderedmilk_o"] = true, + ["bkr_prop_coke_press_01aa"] = true, + ["bkr_prop_coke_press_01b"] = true, + ["bkr_prop_coke_press_01b_frag_"] = true, + ["bkr_prop_coke_scale_01"] = true, + ["bkr_prop_coke_scale_02"] = true, + ["bkr_prop_coke_scale_03"] = true, + ["bkr_prop_coke_spatula_01"] = true, + ["bkr_prop_coke_spatula_02"] = true, + ["bkr_prop_coke_spatula_03"] = true, + ["bkr_prop_coke_spatula_04"] = true, + ["bkr_prop_coke_spoon_01"] = true, + ["bkr_prop_coke_striplamp_long_01a"] = true, + ["bkr_prop_coke_striplamp_short_01a"] = true, + ["bkr_prop_coke_table01a"] = true, + ["bkr_prop_coke_tablepowder"] = true, + ["bkr_prop_coke_testtubes"] = true, + ["bkr_prop_coke_tin_01"] = true, + ["bkr_prop_coke_tub_01a"] = true, + ["bkr_prop_coke_tube_01"] = true, + ["bkr_prop_coke_tube_02"] = true, + ["bkr_prop_coke_tube_03"] = true, + ["bkr_prop_crate_set_01a"] = true, + ["bkr_prop_cutter_moneypage"] = true, + ["bkr_prop_cutter_moneystack_01a"] = true, + ["bkr_prop_cutter_moneystrip"] = true, + ["bkr_prop_cutter_singlestack_01a"] = true, + ["bkr_prop_duffel_bag_01a"] = true, + ["bkr_prop_fakeid_binbag_01"] = true, + ["bkr_prop_fakeid_boxdriverl_01a"] = true, + ["bkr_prop_fakeid_boxpassport_01a"] = true, + ["bkr_prop_fakeid_bundledriverl"] = true, + ["bkr_prop_fakeid_bundlepassports"] = true, + ["bkr_prop_fakeid_cd_01a"] = true, + ["bkr_prop_fakeid_clipboard_01a"] = true, + ["bkr_prop_fakeid_deskfan_01a"] = true, + ["bkr_prop_fakeid_desklamp_01a"] = true, + ["bkr_prop_fakeid_embosser"] = true, + ["bkr_prop_fakeid_foiltipper"] = true, + ["bkr_prop_fakeid_laminator"] = true, + ["bkr_prop_fakeid_magnifyingglass"] = true, + ["bkr_prop_fakeid_openpassport"] = true, + ["bkr_prop_fakeid_papercutter"] = true, + ["bkr_prop_fakeid_pen_01a"] = true, + ["bkr_prop_fakeid_pen_02a"] = true, + ["bkr_prop_fakeid_penclipboard"] = true, + ["bkr_prop_fakeid_ruler_01a"] = true, + ["bkr_prop_fakeid_ruler_02a"] = true, + ["bkr_prop_fakeid_scalpel_01a"] = true, + ["bkr_prop_fakeid_scalpel_02a"] = true, + ["bkr_prop_fakeid_scalpel_03a"] = true, + ["bkr_prop_fakeid_singledriverl"] = true, + ["bkr_prop_fakeid_singlepassport"] = true, + ["bkr_prop_fakeid_table"] = true, + ["bkr_prop_fakeid_tablet_01a"] = true, + ["bkr_prop_fertiliser_pallet_01a"] = true, + ["bkr_prop_fertiliser_pallet_01b"] = true, + ["bkr_prop_fertiliser_pallet_01c"] = true, + ["bkr_prop_fertiliser_pallet_01d"] = true, + ["bkr_prop_fertiliser_pallet_02a"] = true, + ["bkr_prop_grenades_02"] = true, + ["bkr_prop_grow_lamp_02a"] = true, + ["bkr_prop_grow_lamp_02b"] = true, + ["bkr_prop_gunlocker_01a"] = true, + ["bkr_prop_gunlocker_ammo_01a"] = true, + ["bkr_prop_jailer_keys_01a"] = true, + ["bkr_prop_mast_01a"] = true, + ["bkr_prop_memorial_wall_01a"] = true, + ["bkr_prop_meth_acetone"] = true, + ["bkr_prop_meth_ammonia"] = true, + ["bkr_prop_meth_bigbag_01a"] = true, + ["bkr_prop_meth_bigbag_02a"] = true, + ["bkr_prop_meth_bigbag_03a"] = true, + ["bkr_prop_meth_bigbag_04a"] = true, + ["bkr_prop_meth_chiller_01a"] = true, + ["bkr_prop_meth_hcacid"] = true, + ["bkr_prop_meth_lithium"] = true, + ["bkr_prop_meth_openbag_01a"] = true, + ["bkr_prop_meth_openbag_01a_frag_"] = true, + ["bkr_prop_meth_openbag_02"] = true, + ["bkr_prop_meth_pallet_01a"] = true, + ["bkr_prop_meth_phosphorus"] = true, + ["bkr_prop_meth_pseudoephedrine"] = true, + ["bkr_prop_meth_sacid"] = true, + ["bkr_prop_meth_scoop_01a"] = true, + ["bkr_prop_meth_smallbag_01a"] = true, + ["bkr_prop_meth_smashedtray_01"] = true, + ["bkr_prop_meth_smashedtray_01_frag_"] = true, + ["bkr_prop_meth_smashedtray_02"] = true, + ["bkr_prop_meth_sodium"] = true, + ["bkr_prop_meth_table01a"] = true, + ["bkr_prop_meth_toulene"] = true, + ["bkr_prop_meth_tray_01a"] = true, + ["bkr_prop_meth_tray_01b"] = true, + ["bkr_prop_meth_tray_02a"] = true, + ["bkr_prop_money_counter"] = true, + ["bkr_prop_money_pokerbucket"] = true, + ["bkr_prop_money_sorted_01"] = true, + ["bkr_prop_money_unsorted_01"] = true, + ["bkr_prop_money_wrapped_01"] = true, + ["bkr_prop_moneypack_01a"] = true, + ["bkr_prop_moneypack_02a"] = true, + ["bkr_prop_moneypack_03a"] = true, + ["bkr_prop_printmachine_4puller"] = true, + ["bkr_prop_printmachine_4rollerp_st"] = true, + ["bkr_prop_printmachine_4rollerpress"] = true, + ["bkr_prop_printmachine_6puller"] = true, + ["bkr_prop_printmachine_6rollerp_st"] = true, + ["bkr_prop_printmachine_6rollerpress"] = true, + ["bkr_prop_printmachine_cutter"] = true, + ["bkr_prop_prtmachine_dryer"] = true, + ["bkr_prop_prtmachine_dryer_op"] = true, + ["bkr_prop_prtmachine_dryer_spin"] = true, + ["bkr_prop_prtmachine_moneypage"] = true, + ["bkr_prop_prtmachine_moneypage_anim"] = true, + ["bkr_prop_prtmachine_moneyream"] = true, + ["bkr_prop_prtmachine_paperream"] = true, + ["bkr_prop_rt_clubhouse_plan_01a"] = true, + ["bkr_prop_rt_clubhouse_table"] = true, + ["bkr_prop_rt_clubhouse_wall"] = true, + ["bkr_prop_rt_memorial_active_01"] = true, + ["bkr_prop_rt_memorial_active_02"] = true, + ["bkr_prop_rt_memorial_active_03"] = true, + ["bkr_prop_rt_memorial_president"] = true, + ["bkr_prop_rt_memorial_vice_pres"] = true, + ["bkr_prop_scrunched_moneypage"] = true, + ["bkr_prop_slow_down"] = true, + ["bkr_prop_tin_cash_01a"] = true, + ["bkr_prop_weed_01_small_01a"] = true, + ["bkr_prop_weed_01_small_01b"] = true, + ["bkr_prop_weed_01_small_01c"] = true, + ["bkr_prop_weed_bag_01a"] = true, + ["bkr_prop_weed_bag_pile_01a"] = true, + ["bkr_prop_weed_bigbag_01a"] = true, + ["bkr_prop_weed_bigbag_02a"] = true, + ["bkr_prop_weed_bigbag_03a"] = true, + ["bkr_prop_weed_bigbag_open_01a"] = true, + ["bkr_prop_weed_bucket_01a"] = true, + ["bkr_prop_weed_bucket_01b"] = true, + ["bkr_prop_weed_bucket_01c"] = true, + ["bkr_prop_weed_bucket_01d"] = true, + ["bkr_prop_weed_bucket_open_01a"] = true, + ["bkr_prop_weed_bud_01a"] = true, + ["bkr_prop_weed_bud_01b"] = true, + ["bkr_prop_weed_bud_02a"] = true, + ["bkr_prop_weed_bud_02b"] = true, + ["bkr_prop_weed_bud_pruned_01a"] = true, + ["bkr_prop_weed_chair_01a"] = true, + ["bkr_prop_weed_dry_01a"] = true, + ["bkr_prop_weed_dry_02a"] = true, + ["bkr_prop_weed_dry_02b"] = true, + ["bkr_prop_weed_drying_01a"] = true, + ["bkr_prop_weed_drying_02a"] = true, + ["bkr_prop_weed_fan_ceiling_01a"] = true, + ["bkr_prop_weed_fan_floor_01a"] = true, + ["bkr_prop_weed_leaf_01a"] = true, + ["bkr_prop_weed_leaf_dry_01a"] = true, + ["bkr_prop_weed_lrg_01a"] = true, + ["bkr_prop_weed_lrg_01b"] = true, + ["bkr_prop_weed_med_01a"] = true, + ["bkr_prop_weed_med_01b"] = true, + ["bkr_prop_weed_pallet"] = true, + ["bkr_prop_weed_plantpot_stack_01a"] = true, + ["bkr_prop_weed_plantpot_stack_01b"] = true, + ["bkr_prop_weed_plantpot_stack_01c"] = true, + ["bkr_prop_weed_scales_01a"] = true, + ["bkr_prop_weed_scales_01b"] = true, + ["bkr_prop_weed_smallbag_01a"] = true, + ["bkr_prop_weed_spray_01a"] = true, + ["bkr_prop_weed_table_01a"] = true, + ["bkr_prop_weed_table_01b"] = true, + ["bot_01b_bit_01"] = true, + ["bot_01b_bit_02"] = true, + ["bot_01b_bit_03"] = true, + ["cable1_root"] = true, + ["cable2_root"] = true, + ["cable3_root"] = true, + ["ce_xr_ctr2"] = true, + ["ch_des_heist3_tunnel_01"] = true, + ["ch_des_heist3_tunnel_02"] = true, + ["ch_des_heist3_tunnel_03"] = true, + ["ch_des_heist3_tunnel_04"] = true, + ["ch_des_heist3_tunnel_end"] = true, + ["ch_des_heist3_vault_01"] = true, + ["ch_des_heist3_vault_02"] = true, + ["ch_des_heist3_vault_end"] = true, + ["ch_p_ch_jimmy_necklace_2_s"] = true, + ["ch_p_ch_rope_tie_01a"] = true, + ["ch_p_m_bag_var01_arm_s"] = true, + ["ch_p_m_bag_var02_arm_s"] = true, + ["ch_p_m_bag_var03_arm_s"] = true, + ["ch_p_m_bag_var04_arm_s"] = true, + ["ch_p_m_bag_var05_arm_s"] = true, + ["ch_p_m_bag_var06_arm_s"] = true, + ["ch_p_m_bag_var07_arm_s"] = true, + ["ch_p_m_bag_var08_arm_s"] = true, + ["ch_p_m_bag_var09_arm_s"] = true, + ["ch_p_m_bag_var10_arm_s"] = true, + ["ch_prop_10dollar_pile_01a"] = true, + ["ch_prop_20dollar_pile_01a"] = true, + ["ch_prop_adv_case_sm_flash"] = true, + ["ch_prop_arc_dege_01a_screen"] = true, + ["ch_prop_arc_dege_01a_screen_uv"] = true, + ["ch_prop_arc_love_btn_burn"] = true, + ["ch_prop_arc_love_btn_clam"] = true, + ["ch_prop_arc_love_btn_cold"] = true, + ["ch_prop_arc_love_btn_flush"] = true, + ["ch_prop_arc_love_btn_gett"] = true, + ["ch_prop_arc_love_btn_hot"] = true, + ["ch_prop_arc_love_btn_ice"] = true, + ["ch_prop_arc_love_btn_sizz"] = true, + ["ch_prop_arc_love_btn_thaw"] = true, + ["ch_prop_arc_love_btn_warm"] = true, + ["ch_prop_arc_monkey_01a_screen"] = true, + ["ch_prop_arc_monkey_01a_screen_uv"] = true, + ["ch_prop_arc_pene_01a_screen"] = true, + ["ch_prop_arc_pene_01a_screen_uv"] = true, + ["ch_prop_arcade_claw_01a"] = true, + ["ch_prop_arcade_claw_01a_c"] = true, + ["ch_prop_arcade_claw_01a_c_d"] = true, + ["ch_prop_arcade_claw_01a_r1"] = true, + ["ch_prop_arcade_claw_01a_r2"] = true, + ["ch_prop_arcade_claw_plush_01a"] = true, + ["ch_prop_arcade_claw_plush_02a"] = true, + ["ch_prop_arcade_claw_plush_03a"] = true, + ["ch_prop_arcade_claw_plush_04a"] = true, + ["ch_prop_arcade_claw_plush_05a"] = true, + ["ch_prop_arcade_claw_plush_06a"] = true, + ["ch_prop_arcade_claw_wire_01a"] = true, + ["ch_prop_arcade_collect_01a"] = true, + ["ch_prop_arcade_degenatron_01a"] = true, + ["ch_prop_arcade_drone_01a"] = true, + ["ch_prop_arcade_drone_01b"] = true, + ["ch_prop_arcade_drone_01c"] = true, + ["ch_prop_arcade_drone_01d"] = true, + ["ch_prop_arcade_drone_01e"] = true, + ["ch_prop_arcade_fortune_01a"] = true, + ["ch_prop_arcade_fortune_coin_01a"] = true, + ["ch_prop_arcade_fortune_door_01a"] = true, + ["ch_prop_arcade_gun_01a"] = true, + ["ch_prop_arcade_gun_01a_screen_p1"] = true, + ["ch_prop_arcade_gun_01a_screen_p2"] = true, + ["ch_prop_arcade_gun_bird_01a"] = true, + ["ch_prop_arcade_invade_01a"] = true, + ["ch_prop_arcade_invade_01a_scrn_uv"] = true, + ["ch_prop_arcade_jukebox_01a"] = true, + ["ch_prop_arcade_love_01a"] = true, + ["ch_prop_arcade_monkey_01a"] = true, + ["ch_prop_arcade_penetrator_01a"] = true, + ["ch_prop_arcade_race_01a"] = true, + ["ch_prop_arcade_race_01a_screen_p1"] = true, + ["ch_prop_arcade_race_01a_screen_p2"] = true, + ["ch_prop_arcade_race_01b"] = true, + ["ch_prop_arcade_race_01b_screen_p1"] = true, + ["ch_prop_arcade_race_01b_screen_p2"] = true, + ["ch_prop_arcade_race_02a"] = true, + ["ch_prop_arcade_race_02a_screen_p1"] = true, + ["ch_prop_arcade_race_02a_screen_p2"] = true, + ["ch_prop_arcade_race_bike_02a"] = true, + ["ch_prop_arcade_race_car_01a"] = true, + ["ch_prop_arcade_race_car_01b"] = true, + ["ch_prop_arcade_race_truck_01a"] = true, + ["ch_prop_arcade_race_truck_01b"] = true, + ["ch_prop_arcade_space_01a"] = true, + ["ch_prop_arcade_space_01a_scrn_uv"] = true, + ["ch_prop_arcade_street_01a"] = true, + ["ch_prop_arcade_street_01a_off"] = true, + ["ch_prop_arcade_street_01a_scrn_uv"] = true, + ["ch_prop_arcade_street_01b"] = true, + ["ch_prop_arcade_street_01b_off"] = true, + ["ch_prop_arcade_street_01c"] = true, + ["ch_prop_arcade_street_01c_off"] = true, + ["ch_prop_arcade_street_01d"] = true, + ["ch_prop_arcade_street_01d_off"] = true, + ["ch_prop_arcade_street_02b"] = true, + ["ch_prop_arcade_wizard_01a"] = true, + ["ch_prop_arcade_wizard_01a_scrn_uv"] = true, + ["ch_prop_arcade_wpngun_01a"] = true, + ["ch_prop_baggage_scanner_01a"] = true, + ["ch_prop_board_wpnwall_01a"] = true, + ["ch_prop_board_wpnwall_02a"] = true, + ["ch_prop_boring_machine_01a"] = true, + ["ch_prop_boring_machine_01b"] = true, + ["ch_prop_box_ammo01a"] = true, + ["ch_prop_box_ammo01b"] = true, + ["ch_prop_calculator_01a"] = true, + ["ch_prop_cash_low_trolly_01a"] = true, + ["ch_prop_cash_low_trolly_01b"] = true, + ["ch_prop_cash_low_trolly_01c"] = true, + ["ch_prop_casino_bin_01a"] = true, + ["ch_prop_casino_blackjack_01a"] = true, + ["ch_prop_casino_blackjack_01b"] = true, + ["ch_prop_casino_chair_01a"] = true, + ["ch_prop_casino_chair_01b"] = true, + ["ch_prop_casino_chair_01c"] = true, + ["ch_prop_casino_diamonds_01a"] = true, + ["ch_prop_casino_diamonds_01b"] = true, + ["ch_prop_casino_diamonds_02a"] = true, + ["ch_prop_casino_diamonds_03a"] = true, + ["ch_prop_casino_door_01a"] = true, + ["ch_prop_casino_door_01b"] = true, + ["ch_prop_casino_door_01c"] = true, + ["ch_prop_casino_door_01d"] = true, + ["ch_prop_casino_door_01e"] = true, + ["ch_prop_casino_door_01f"] = true, + ["ch_prop_casino_door_01g"] = true, + ["ch_prop_casino_door_02a"] = true, + ["ch_prop_casino_drinks_trolley01"] = true, + ["ch_prop_casino_drone_01a"] = true, + ["ch_prop_casino_drone_02a"] = true, + ["ch_prop_casino_drone_broken01a"] = true, + ["ch_prop_casino_keypad_01"] = true, + ["ch_prop_casino_keypad_02"] = true, + ["ch_prop_casino_lucky_wheel_01a"] = true, + ["ch_prop_casino_poker_01a"] = true, + ["ch_prop_casino_poker_01b"] = true, + ["ch_prop_casino_roulette_01a"] = true, + ["ch_prop_casino_roulette_01b"] = true, + ["ch_prop_casino_slot_01a"] = true, + ["ch_prop_casino_slot_02a"] = true, + ["ch_prop_casino_slot_03a"] = true, + ["ch_prop_casino_slot_04a"] = true, + ["ch_prop_casino_slot_04b"] = true, + ["ch_prop_casino_slot_05a"] = true, + ["ch_prop_casino_slot_06a"] = true, + ["ch_prop_casino_slot_07a"] = true, + ["ch_prop_casino_slot_08a"] = true, + ["ch_prop_casino_stool_02a"] = true, + ["ch_prop_casino_till_01a"] = true, + ["ch_prop_casino_track_chair_01"] = true, + ["ch_prop_casino_videowall"] = true, + ["ch_prop_ch_aircon_l_broken03"] = true, + ["ch_prop_ch_arcade_big_screen"] = true, + ["ch_prop_ch_arcade_fan_axis"] = true, + ["ch_prop_ch_arcade_safe_body"] = true, + ["ch_prop_ch_arcade_safe_door"] = true, + ["ch_prop_ch_bag_01a"] = true, + ["ch_prop_ch_bag_02a"] = true, + ["ch_prop_ch_bay_elev_door"] = true, + ["ch_prop_ch_bloodymachete_01a"] = true, + ["ch_prop_ch_blueprint_board_01a"] = true, + ["ch_prop_ch_boodyhand_01a"] = true, + ["ch_prop_ch_boodyhand_01b"] = true, + ["ch_prop_ch_boodyhand_01c"] = true, + ["ch_prop_ch_boodyhand_01d"] = true, + ["ch_prop_ch_bottle_holder_01a"] = true, + ["ch_prop_ch_box_ammo_06a"] = true, + ["ch_prop_ch_camera_01"] = true, + ["ch_prop_ch_cartridge_01a"] = true, + ["ch_prop_ch_cartridge_01b"] = true, + ["ch_prop_ch_cartridge_01c"] = true, + ["ch_prop_ch_case_01a"] = true, + ["ch_prop_ch_case_sm_01x"] = true, + ["ch_prop_ch_cash_trolly_01a"] = true, + ["ch_prop_ch_cash_trolly_01b"] = true, + ["ch_prop_ch_cash_trolly_01c"] = true, + ["ch_prop_ch_cashtrolley_01a"] = true, + ["ch_prop_ch_casino_button_01a"] = true, + ["ch_prop_ch_casino_button_01b"] = true, + ["ch_prop_ch_casino_door_01c"] = true, + ["ch_prop_ch_casino_shutter01x"] = true, + ["ch_prop_ch_cctv_cam_01a"] = true, + ["ch_prop_ch_cctv_cam_02a"] = true, + ["ch_prop_ch_cctv_wall_atta_01a"] = true, + ["ch_prop_ch_chemset_01a"] = true, + ["ch_prop_ch_chemset_01b"] = true, + ["ch_prop_ch_cockroach_tub_01a"] = true, + ["ch_prop_ch_coffe_table_02"] = true, + ["ch_prop_ch_corridor_door_beam"] = true, + ["ch_prop_ch_corridor_door_derelict"] = true, + ["ch_prop_ch_corridor_door_flat"] = true, + ["ch_prop_ch_crate_01a"] = true, + ["ch_prop_ch_crate_empty_01a"] = true, + ["ch_prop_ch_crate_full_01a"] = true, + ["ch_prop_ch_desk_lamp"] = true, + ["ch_prop_ch_diamond_xmastree"] = true, + ["ch_prop_ch_duffbag_gruppe_01a"] = true, + ["ch_prop_ch_duffbag_stealth_01a"] = true, + ["ch_prop_ch_duffelbag_01x"] = true, + ["ch_prop_ch_entrance_door_beam"] = true, + ["ch_prop_ch_entrance_door_derelict"] = true, + ["ch_prop_ch_entrance_door_flat"] = true, + ["ch_prop_ch_explosive_01a"] = true, + ["ch_prop_ch_fib_01a"] = true, + ["ch_prop_ch_fuse_box_01a"] = true, + ["ch_prop_ch_gazebo_01"] = true, + ["ch_prop_ch_gendoor_01"] = true, + ["ch_prop_ch_generator_01a"] = true, + ["ch_prop_ch_glassdoor_01"] = true, + ["ch_prop_ch_guncase_01a"] = true, + ["ch_prop_ch_hatch_liftshaft_01a"] = true, + ["ch_prop_ch_heist_drill"] = true, + ["ch_prop_ch_hole_01a"] = true, + ["ch_prop_ch_lamp_01"] = true, + ["ch_prop_ch_lamp_ceiling_01a"] = true, + ["ch_prop_ch_lamp_ceiling_02a"] = true, + ["ch_prop_ch_lamp_ceiling_02b"] = true, + ["ch_prop_ch_lamp_ceiling_03a"] = true, + ["ch_prop_ch_lamp_ceiling_04a"] = true, + ["ch_prop_ch_lamp_ceiling_g_01a"] = true, + ["ch_prop_ch_lamp_ceiling_g_01b"] = true, + ["ch_prop_ch_lamp_ceiling_w_01a"] = true, + ["ch_prop_ch_lamp_ceiling_w_01b"] = true, + ["ch_prop_ch_lamp_wall_01a"] = true, + ["ch_prop_ch_laundry_machine_01a"] = true, + ["ch_prop_ch_laundry_shelving_01a"] = true, + ["ch_prop_ch_laundry_shelving_01b"] = true, + ["ch_prop_ch_laundry_shelving_01c"] = true, + ["ch_prop_ch_laundry_shelving_02a"] = true, + ["ch_prop_ch_laundry_trolley_01a"] = true, + ["ch_prop_ch_laundry_trolley_01b"] = true, + ["ch_prop_ch_ld_bomb_01a"] = true, + ["ch_prop_ch_liftdoor_l_01a"] = true, + ["ch_prop_ch_liftdoor_r_01a"] = true, + ["ch_prop_ch_lobay_gate01"] = true, + ["ch_prop_ch_lobay_pillar"] = true, + ["ch_prop_ch_lobay_pillar02"] = true, + ["ch_prop_ch_lobby_pillar_03a"] = true, + ["ch_prop_ch_lobby_pillar_04a"] = true, + ["ch_prop_ch_maint_sign_01"] = true, + ["ch_prop_ch_malldoors_l_01a"] = true, + ["ch_prop_ch_malldoors_r_01a"] = true, + ["ch_prop_ch_metal_detector_01a"] = true, + ["ch_prop_ch_mobile_jammer_01x"] = true, + ["ch_prop_ch_moneybag_01a"] = true, + ["ch_prop_ch_monitor_01a"] = true, + ["ch_prop_ch_morgue_01a"] = true, + ["ch_prop_ch_ped_rug_01a"] = true, + ["ch_prop_ch_penthousedoor_01a"] = true, + ["ch_prop_ch_phone_ing_01a"] = true, + ["ch_prop_ch_phone_ing_02a"] = true, + ["ch_prop_ch_planter_01"] = true, + ["ch_prop_ch_race_gantry_02"] = true, + ["ch_prop_ch_race_gantry_03"] = true, + ["ch_prop_ch_race_gantry_04"] = true, + ["ch_prop_ch_race_gantry_05"] = true, + ["ch_prop_ch_ramp_lock_01a"] = true, + ["ch_prop_ch_room_trolly_01a"] = true, + ["ch_prop_ch_rubble_pile"] = true, + ["ch_prop_ch_schedule_01a"] = true, + ["ch_prop_ch_sec_cabinet_01a"] = true, + ["ch_prop_ch_sec_cabinet_01b"] = true, + ["ch_prop_ch_sec_cabinet_01c"] = true, + ["ch_prop_ch_sec_cabinet_01d"] = true, + ["ch_prop_ch_sec_cabinet_01e"] = true, + ["ch_prop_ch_sec_cabinet_01f"] = true, + ["ch_prop_ch_sec_cabinet_01g"] = true, + ["ch_prop_ch_sec_cabinet_01h"] = true, + ["ch_prop_ch_sec_cabinet_01i"] = true, + ["ch_prop_ch_sec_cabinet_01j"] = true, + ["ch_prop_ch_sec_cabinet_02a"] = true, + ["ch_prop_ch_sec_cabinet_03a"] = true, + ["ch_prop_ch_sec_cabinet_04a"] = true, + ["ch_prop_ch_sec_cabinet_05a"] = true, + ["ch_prop_ch_secure_door_l"] = true, + ["ch_prop_ch_secure_door_r"] = true, + ["ch_prop_ch_securesupport_half01x"] = true, + ["ch_prop_ch_security_case_01a"] = true, + ["ch_prop_ch_security_case_02a"] = true, + ["ch_prop_ch_security_monitor_01a"] = true, + ["ch_prop_ch_security_monitor_01b"] = true, + ["ch_prop_ch_serialkiller_01a"] = true, + ["ch_prop_ch_service_door_01a"] = true, + ["ch_prop_ch_service_door_01b"] = true, + ["ch_prop_ch_service_door_02a"] = true, + ["ch_prop_ch_service_door_02b"] = true, + ["ch_prop_ch_service_door_02c"] = true, + ["ch_prop_ch_service_door_02d"] = true, + ["ch_prop_ch_service_door_03a"] = true, + ["ch_prop_ch_service_door_03b"] = true, + ["ch_prop_ch_service_locker_01a"] = true, + ["ch_prop_ch_service_locker_01b"] = true, + ["ch_prop_ch_service_locker_01c"] = true, + ["ch_prop_ch_service_locker_02a"] = true, + ["ch_prop_ch_service_locker_02b"] = true, + ["ch_prop_ch_service_pillar_01a"] = true, + ["ch_prop_ch_service_pillar_02a"] = true, + ["ch_prop_ch_service_trolley_01a"] = true, + ["ch_prop_ch_side_panel01"] = true, + ["ch_prop_ch_side_panel02"] = true, + ["ch_prop_ch_toilet_door_beam"] = true, + ["ch_prop_ch_toilet_door_derelict"] = true, + ["ch_prop_ch_toilet_door_flat"] = true, + ["ch_prop_ch_top_panel01"] = true, + ["ch_prop_ch_top_panel02"] = true, + ["ch_prop_ch_tray_01a"] = true, + ["ch_prop_ch_trolly_01a"] = true, + ["ch_prop_ch_trophy_brawler_01a"] = true, + ["ch_prop_ch_trophy_cabs_01a"] = true, + ["ch_prop_ch_trophy_claw_01a"] = true, + ["ch_prop_ch_trophy_gunner_01a"] = true, + ["ch_prop_ch_trophy_king_01a"] = true, + ["ch_prop_ch_trophy_love_01a"] = true, + ["ch_prop_ch_trophy_monkey_01a"] = true, + ["ch_prop_ch_trophy_patriot_01a"] = true, + ["ch_prop_ch_trophy_racer_01a"] = true, + ["ch_prop_ch_trophy_retro_01a"] = true, + ["ch_prop_ch_trophy_strife_01a"] = true, + ["ch_prop_ch_trophy_teller_01a"] = true, + ["ch_prop_ch_tunnel_door_01_l"] = true, + ["ch_prop_ch_tunnel_door_01_r"] = true, + ["ch_prop_ch_tunnel_door01a"] = true, + ["ch_prop_ch_tunnel_fake_wall"] = true, + ["ch_prop_ch_tunnel_worklight"] = true, + ["ch_prop_ch_tv_rt_01a"] = true, + ["ch_prop_ch_uni_stacks_01a"] = true, + ["ch_prop_ch_uni_stacks_02a"] = true, + ["ch_prop_ch_unplugged_01a"] = true, + ["ch_prop_ch_usb_drive01x"] = true, + ["ch_prop_ch_utility_door_01a"] = true, + ["ch_prop_ch_utility_door_01b"] = true, + ["ch_prop_ch_utility_light_wall_01a"] = true, + ["ch_prop_ch_valet_01a"] = true, + ["ch_prop_ch_vase_01a"] = true, + ["ch_prop_ch_vase_02a"] = true, + ["ch_prop_ch_vault_blue_01"] = true, + ["ch_prop_ch_vault_blue_02"] = true, + ["ch_prop_ch_vault_blue_03"] = true, + ["ch_prop_ch_vault_blue_04"] = true, + ["ch_prop_ch_vault_blue_05"] = true, + ["ch_prop_ch_vault_blue_06"] = true, + ["ch_prop_ch_vault_blue_07"] = true, + ["ch_prop_ch_vault_blue_08"] = true, + ["ch_prop_ch_vault_blue_09"] = true, + ["ch_prop_ch_vault_blue_10"] = true, + ["ch_prop_ch_vault_blue_11"] = true, + ["ch_prop_ch_vault_blue_12"] = true, + ["ch_prop_ch_vault_d_door_01a"] = true, + ["ch_prop_ch_vault_d_frame_01a"] = true, + ["ch_prop_ch_vault_green_01"] = true, + ["ch_prop_ch_vault_green_02"] = true, + ["ch_prop_ch_vault_green_03"] = true, + ["ch_prop_ch_vault_green_04"] = true, + ["ch_prop_ch_vault_green_05"] = true, + ["ch_prop_ch_vault_green_06"] = true, + ["ch_prop_ch_vault_slide_door_lrg"] = true, + ["ch_prop_ch_vault_slide_door_sm"] = true, + ["ch_prop_ch_vault_wall_damage"] = true, + ["ch_prop_ch_vaultdoor_frame01"] = true, + ["ch_prop_ch_vaultdoor01x"] = true, + ["ch_prop_ch_wallart_01a"] = true, + ["ch_prop_ch_wallart_02a"] = true, + ["ch_prop_ch_wallart_03a"] = true, + ["ch_prop_ch_wallart_04a"] = true, + ["ch_prop_ch_wallart_05a"] = true, + ["ch_prop_ch_wallart_06a"] = true, + ["ch_prop_ch_wallart_07a"] = true, + ["ch_prop_ch_wallart_08a"] = true, + ["ch_prop_ch_wallart_09a"] = true, + ["ch_prop_champagne_01a"] = true, + ["ch_prop_chip_tray_01a"] = true, + ["ch_prop_chip_tray_01b"] = true, + ["ch_prop_collectibles_garbage_01a"] = true, + ["ch_prop_collectibles_limb_01a"] = true, + ["ch_prop_crate_stack_01a"] = true, + ["ch_prop_davies_door_01a"] = true, + ["ch_prop_diamond_trolly_01a"] = true, + ["ch_prop_diamond_trolly_01b"] = true, + ["ch_prop_diamond_trolly_01c"] = true, + ["ch_prop_drills_hat01x"] = true, + ["ch_prop_drills_hat02x"] = true, + ["ch_prop_drills_hat03x"] = true, + ["ch_prop_emp_01a"] = true, + ["ch_prop_emp_01b"] = true, + ["ch_prop_fingerprint_damaged_01"] = true, + ["ch_prop_fingerprint_scanner_01a"] = true, + ["ch_prop_fingerprint_scanner_01b"] = true, + ["ch_prop_fingerprint_scanner_01c"] = true, + ["ch_prop_fingerprint_scanner_01d"] = true, + ["ch_prop_fingerprint_scanner_01e"] = true, + ["ch_prop_fingerprint_scanner_error_01b"] = true, + ["ch_prop_gold_bar_01a"] = true, + ["ch_prop_gold_trolly_01a"] = true, + ["ch_prop_gold_trolly_01b"] = true, + ["ch_prop_gold_trolly_01c"] = true, + ["ch_prop_grapessed_door_l_01a"] = true, + ["ch_prop_grapessed_door_r_01a"] = true, + ["ch_prop_heist_drill_bag_01a"] = true, + ["ch_prop_heist_drill_bag_01b"] = true, + ["ch_prop_laptop_01a"] = true, + ["ch_prop_laserdrill_01a"] = true, + ["ch_prop_marker_01a"] = true, + ["ch_prop_master_09a"] = true, + ["ch_prop_mesa_door_01a"] = true, + ["ch_prop_mil_crate_02b"] = true, + ["ch_prop_paleto_bay_door_01a"] = true, + ["ch_prop_parking_hut_2"] = true, + ["ch_prop_pit_sign_01a"] = true, + ["ch_prop_podium_casino_01a"] = true, + ["ch_prop_princess_robo_plush_07a"] = true, + ["ch_prop_rockford_door_l_01a"] = true, + ["ch_prop_rockford_door_r_01a"] = true, + ["ch_prop_shiny_wasabi_plush_08a"] = true, + ["ch_prop_stunt_landing_zone_01a"] = true, + ["ch_prop_swipe_card_01a"] = true, + ["ch_prop_swipe_card_01b"] = true, + ["ch_prop_swipe_card_01c"] = true, + ["ch_prop_swipe_card_01d"] = true, + ["ch_prop_table_casino_short_01a"] = true, + ["ch_prop_table_casino_short_02a"] = true, + ["ch_prop_table_casino_tall_01a"] = true, + ["ch_prop_toolbox_01a"] = true, + ["ch_prop_toolbox_01b"] = true, + ["ch_prop_track_bend_bar_lc"] = true, + ["ch_prop_track_bend_lc"] = true, + ["ch_prop_track_ch_bend_135"] = true, + ["ch_prop_track_ch_bend_180d"] = true, + ["ch_prop_track_ch_bend_45"] = true, + ["ch_prop_track_ch_bend_bar_135"] = true, + ["ch_prop_track_ch_bend_bar_45d"] = true, + ["ch_prop_track_ch_bend_bar_l_b"] = true, + ["ch_prop_track_ch_bend_bar_l_out"] = true, + ["ch_prop_track_ch_bend_bar_m_in"] = true, + ["ch_prop_track_ch_bend_bar_m_out"] = true, + ["ch_prop_track_ch_straight_bar_m"] = true, + ["ch_prop_track_ch_straight_bar_s"] = true, + ["ch_prop_track_ch_straight_bar_s_s"] = true, + ["ch_prop_track_paddock_01"] = true, + ["ch_prop_track_pit_garage_01a"] = true, + ["ch_prop_track_pit_stop_01"] = true, + ["ch_prop_tree_01a"] = true, + ["ch_prop_tree_02a"] = true, + ["ch_prop_tree_03a"] = true, + ["ch_prop_tunnel_hang_lamp"] = true, + ["ch_prop_tunnel_hang_lamp2"] = true, + ["ch_prop_tunnel_tripod_lampa"] = true, + ["ch_prop_vault_dimaondbox_01a"] = true, + ["ch_prop_vault_drill_01a"] = true, + ["ch_prop_vault_key_card_01a"] = true, + ["ch_prop_vault_painting_01a"] = true, + ["ch_prop_vault_painting_01b"] = true, + ["ch_prop_vault_painting_01c"] = true, + ["ch_prop_vault_painting_01d"] = true, + ["ch_prop_vault_painting_01e"] = true, + ["ch_prop_vault_painting_01f"] = true, + ["ch_prop_vault_painting_01g"] = true, + ["ch_prop_vault_painting_01h"] = true, + ["ch_prop_vault_painting_01i"] = true, + ["ch_prop_vault_painting_01j"] = true, + ["ch_prop_vault_painting_roll_01a"] = true, + ["ch_prop_west_door_l_01a"] = true, + ["ch_prop_west_door_r_01a"] = true, + ["ch_prop_whiteboard"] = true, + ["ch_prop_whiteboard_02"] = true, + ["ch_prop_whiteboard_03"] = true, + ["ch_prop_whiteboard_04"] = true, + ["ch2_lod2_emissive_slod3"] = true, + ["ch2_lod2_slod3"] = true, + ["ch2_lod3_emissive_slod3"] = true, + ["ch2_lod3_slod3"] = true, + ["ch2_lod4_s3a"] = true, + ["ch2_lod4_s3b"] = true, + ["ch2_lod4_s3c"] = true, + ["ch3_lod_1_2_slod3"] = true, + ["ch3_lod_101114b_slod3"] = true, + ["ch3_lod_11b13_slod3"] = true, + ["ch3_lod_1414b2_slod3"] = true, + ["ch3_lod_3_4_slod3"] = true, + ["ch3_lod_6_10_slod3"] = true, + ["ch3_lod_emissive_slod3"] = true, + ["ch3_lod_emissive1_slod3"] = true, + ["ch3_lod_emissive3_slod3"] = true, + ["ch3_lod_water_slod3"] = true, + ["ch3_lod_weir_01_slod3"] = true, + ["cloudhat_altitude_heavy_a"] = true, + ["cloudhat_altitude_heavy_b"] = true, + ["cloudhat_altitude_heavy_c"] = true, + ["cloudhat_altitude_light_a"] = true, + ["cloudhat_altitude_light_b"] = true, + ["cloudhat_altitude_med_a"] = true, + ["cloudhat_altitude_med_b"] = true, + ["cloudhat_altitude_med_c"] = true, + ["cloudhat_altitude_vlight_a"] = true, + ["cloudhat_altitude_vlight_b"] = true, + ["cloudhat_altostatus_a"] = true, + ["cloudhat_altostatus_b"] = true, + ["cloudhat_cirrocumulus_a"] = true, + ["cloudhat_cirrocumulus_b"] = true, + ["cloudhat_cirrus"] = true, + ["cloudhat_clear01_a"] = true, + ["cloudhat_clear01_b"] = true, + ["cloudhat_clear01_c"] = true, + ["cloudhat_cloudy_a"] = true, + ["cloudhat_cloudy_b"] = true, + ["cloudhat_cloudy_base"] = true, + ["cloudhat_cloudy_c"] = true, + ["cloudhat_cloudy_d"] = true, + ["cloudhat_cloudy_e"] = true, + ["cloudhat_cloudy_f"] = true, + ["cloudhat_contrails_a"] = true, + ["cloudhat_contrails_b"] = true, + ["cloudhat_contrails_c"] = true, + ["cloudhat_contrails_d"] = true, + ["cloudhat_fog"] = true, + ["cloudhat_horizon_a"] = true, + ["cloudhat_horizon_b"] = true, + ["cloudhat_horizon_c"] = true, + ["cloudhat_nimbus_a"] = true, + ["cloudhat_nimbus_b"] = true, + ["cloudhat_nimbus_c"] = true, + ["cloudhat_puff_a"] = true, + ["cloudhat_puff_b"] = true, + ["cloudhat_puff_c"] = true, + ["cloudhat_puff_old"] = true, + ["cloudhat_rain_a"] = true, + ["cloudhat_rain_b"] = true, + ["cloudhat_shower_a"] = true, + ["cloudhat_shower_b"] = true, + ["cloudhat_shower_c"] = true, + ["cloudhat_snowy01"] = true, + ["cloudhat_stormy01_a"] = true, + ["cloudhat_stormy01_b"] = true, + ["cloudhat_stormy01_c"] = true, + ["cloudhat_stormy01_d"] = true, + ["cloudhat_stormy01_e"] = true, + ["cloudhat_stormy01_f"] = true, + ["cloudhat_stratocumulus"] = true, + ["cloudhat_stripey_a"] = true, + ["cloudhat_stripey_b"] = true, + ["cloudhat_test_anim"] = true, + ["cloudhat_test_animsoft"] = true, + ["cloudhat_test_fast"] = true, + ["cloudhat_test_fog"] = true, + ["cloudhat_wispy_a"] = true, + ["cloudhat_wispy_b"] = true, + ["cropduster1_skin"] = true, + ["cropduster2_skin"] = true, + ["cropduster3_skin"] = true, + ["cropduster4_skin"] = true, + ["cs_remote_01"] = true, + ["cs_x_array02"] = true, + ["cs_x_array03"] = true, + ["cs_x_rublrga"] = true, + ["cs_x_rublrgb"] = true, + ["cs_x_rublrgc"] = true, + ["cs_x_rublrgd"] = true, + ["cs_x_rublrge"] = true, + ["cs_x_rubmeda"] = true, + ["cs_x_rubmedb"] = true, + ["cs_x_rubmedc"] = true, + ["cs_x_rubmedd"] = true, + ["cs_x_rubmede"] = true, + ["cs_x_rubsmla"] = true, + ["cs_x_rubsmlb"] = true, + ["cs_x_rubsmlc"] = true, + ["cs_x_rubsmld"] = true, + ["cs_x_rubsmle"] = true, + ["cs_x_rubweea"] = true, + ["cs_x_rubweec"] = true, + ["cs_x_rubweed"] = true, + ["cs_x_rubweee"] = true, + ["cs_x_weesmlb"] = true, + ["cs1_lod_08_slod3"] = true, + ["cs1_lod_14_slod3"] = true, + ["cs1_lod_14b_slod3"] = true, + ["cs1_lod_15_slod3"] = true, + ["cs1_lod_15b_slod3"] = true, + ["cs1_lod_15c_slod3"] = true, + ["cs1_lod_16_slod3"] = true, + ["cs1_lod_riva_slod3"] = true, + ["cs1_lod_rivb_slod3"] = true, + ["cs1_lod_roadsa_slod3"] = true, + ["cs1_lod2_09_slod3"] = true, + ["cs1_lod2_emissive_slod3"] = true, + ["cs1_lod3_terrain_slod3_01"] = true, + ["cs1_lod3_terrain_slod3_02"] = true, + ["cs1_lod3_terrain_slod3_03"] = true, + ["cs1_lod3_terrain_slod3_04"] = true, + ["cs1_lod3_terrain_slod3_05"] = true, + ["cs1_lod3_terrain_slod3_06"] = true, + ["cs2_lod_06_slod3"] = true, + ["cs2_lod_1234_slod3"] = true, + ["cs2_lod_5_9_slod3"] = true, + ["cs2_lod_emissive_4_20_slod3"] = true, + ["cs2_lod_emissive_5_20_slod3"] = true, + ["cs2_lod_emissive_6_21_slod3"] = true, + ["cs2_lod_rb2_slod3"] = true, + ["cs2_lod_roads_slod3"] = true, + ["cs2_lod_roadsb_slod3"] = true, + ["cs2_lod2_emissive_4_21_slod3"] = true, + ["cs2_lod2_emissive_6_21_slod3"] = true, + ["cs2_lod2_rc_slod3"] = true, + ["cs2_lod2_roadsa_slod03"] = true, + ["cs2_lod2_slod3_08"] = true, + ["cs2_lod2_slod3_10"] = true, + ["cs2_lod2_slod3_10a"] = true, + ["cs2_lod2_slod3_11"] = true, + ["cs3_lod_1_slod3"] = true, + ["cs3_lod_2_slod3"] = true, + ["cs3_lod_emissive_slod3"] = true, + ["cs3_lod_s3_01"] = true, + ["cs3_lod_s3_05a"] = true, + ["cs3_lod_s3_06a"] = true, + ["cs3_lod_s3_06b"] = true, + ["cs3_lod_water_slod3_01"] = true, + ["cs3_lod_water_slod3_02"] = true, + ["cs3_lod_water_slod3_03"] = true, + ["cs4_lod_01_slod3"] = true, + ["cs4_lod_02_slod3"] = true, + ["cs4_lod_em_b_slod3"] = true, + ["cs4_lod_em_c_slod3"] = true, + ["cs4_lod_em_d_slod3"] = true, + ["cs4_lod_em_e_slod3"] = true, + ["cs4_lod_em_f_slod3"] = true, + ["cs4_lod_em_slod3"] = true, + ["cs5_lod_02_slod3"] = true, + ["cs5_lod_1_4_slod3"] = true, + ["cs5_lod_rd_slod3"] = true, + ["cs6_lod_em_slod3"] = true, + ["cs6_lod_slod3_01"] = true, + ["cs6_lod_slod3_02"] = true, + ["cs6_lod_slod3_03"] = true, + ["cs6_lod_slod3_04"] = true, + ["csx_coastbigroc01_"] = true, + ["csx_coastbigroc02_"] = true, + ["csx_coastbigroc03_"] = true, + ["csx_coastbigroc05_"] = true, + ["csx_coastboulder_00_"] = true, + ["csx_coastboulder_01_"] = true, + ["csx_coastboulder_02_"] = true, + ["csx_coastboulder_03_"] = true, + ["csx_coastboulder_04_"] = true, + ["csx_coastboulder_05_"] = true, + ["csx_coastboulder_06_"] = true, + ["csx_coastboulder_07_"] = true, + ["csx_coastrok1_"] = true, + ["csx_coastrok2_"] = true, + ["csx_coastrok3_"] = true, + ["csx_coastrok4_"] = true, + ["csx_coastsmalrock_01_"] = true, + ["csx_coastsmalrock_02_"] = true, + ["csx_coastsmalrock_03_"] = true, + ["csx_coastsmalrock_04_"] = true, + ["csx_coastsmalrock_05_"] = true, + ["csx_rvrbldr_biga_"] = true, + ["csx_rvrbldr_bigb_"] = true, + ["csx_rvrbldr_bigc_"] = true, + ["csx_rvrbldr_bigd_"] = true, + ["csx_rvrbldr_bige_"] = true, + ["csx_rvrbldr_meda_"] = true, + ["csx_rvrbldr_medb_"] = true, + ["csx_rvrbldr_medc_"] = true, + ["csx_rvrbldr_medd_"] = true, + ["csx_rvrbldr_mede_"] = true, + ["csx_rvrbldr_smla_"] = true, + ["csx_rvrbldr_smlb_"] = true, + ["csx_rvrbldr_smlc_"] = true, + ["csx_rvrbldr_smld_"] = true, + ["csx_rvrbldr_smle_"] = true, + ["csx_saltconcclustr_a_"] = true, + ["csx_saltconcclustr_b_"] = true, + ["csx_saltconcclustr_c_"] = true, + ["csx_saltconcclustr_d_"] = true, + ["csx_saltconcclustr_e_"] = true, + ["csx_saltconcclustr_f_"] = true, + ["csx_saltconcclustr_g_"] = true, + ["csx_seabed_bldr1_"] = true, + ["csx_seabed_bldr2_"] = true, + ["csx_seabed_bldr3_"] = true, + ["csx_seabed_bldr4_"] = true, + ["csx_seabed_bldr5_"] = true, + ["csx_seabed_bldr6_"] = true, + ["csx_seabed_bldr7_"] = true, + ["csx_seabed_bldr8_"] = true, + ["csx_seabed_rock1_"] = true, + ["csx_seabed_rock2_"] = true, + ["csx_seabed_rock3_"] = true, + ["csx_seabed_rock4_"] = true, + ["csx_seabed_rock5_"] = true, + ["csx_seabed_rock6_"] = true, + ["csx_seabed_rock7_"] = true, + ["csx_seabed_rock8_"] = true, + ["csx_searocks_02"] = true, + ["csx_searocks_03"] = true, + ["csx_searocks_04"] = true, + ["csx_searocks_05"] = true, + ["csx_searocks_06"] = true, + ["db_apart_01_"] = true, + ["db_apart_01d_"] = true, + ["db_apart_02_"] = true, + ["db_apart_02d_"] = true, + ["db_apart_03_"] = true, + ["db_apart_03d_"] = true, + ["db_apart_05_"] = true, + ["db_apart_05d_"] = true, + ["db_apart_06"] = true, + ["db_apart_06d_"] = true, + ["db_apart_07_"] = true, + ["db_apart_07d_"] = true, + ["db_apart_08_"] = true, + ["db_apart_08d_"] = true, + ["db_apart_09_"] = true, + ["db_apart_09d_"] = true, + ["db_apart_10_"] = true, + ["db_apart_10d_"] = true, + ["des_apartmentblock_skin"] = true, + ["des_aptblock_root002"] = true, + ["des_cables_root"] = true, + ["des_door_end"] = true, + ["des_door_root"] = true, + ["des_door_start"] = true, + ["des_farmhs_root1"] = true, + ["des_farmhs_root2"] = true, + ["des_farmhs_root3"] = true, + ["des_farmhs_root4"] = true, + ["des_farmhs_root5"] = true, + ["des_farmhs_root6"] = true, + ["des_farmhs_root7"] = true, + ["des_farmhs_root8"] = true, + ["des_fib_ceil_end"] = true, + ["des_fib_ceil_root"] = true, + ["des_fib_ceil_rootb"] = true, + ["des_fib_ceil_start"] = true, + ["des_fib_ceil2_end"] = true, + ["des_fib_ceil2_root"] = true, + ["des_fib_ceil2_start"] = true, + ["des_fib_frame"] = true, + ["des_fibstair_end"] = true, + ["des_fibstair_root"] = true, + ["des_fibstair_start"] = true, + ["des_finale_tunnel_end"] = true, + ["des_finale_tunnel_root000"] = true, + ["des_finale_tunnel_root001"] = true, + ["des_finale_tunnel_root002"] = true, + ["des_finale_tunnel_root003"] = true, + ["des_finale_tunnel_root004"] = true, + ["des_finale_tunnel_start"] = true, + ["des_finale_vault_end"] = true, + ["des_finale_vault_root001"] = true, + ["des_finale_vault_root002"] = true, + ["des_finale_vault_root003"] = true, + ["des_finale_vault_root004"] = true, + ["des_finale_vault_start"] = true, + ["des_floor_end"] = true, + ["des_floor_root"] = true, + ["des_floor_start"] = true, + ["des_frenchdoors_end"] = true, + ["des_frenchdoors_root"] = true, + ["des_frenchdoors_rootb"] = true, + ["des_frenchdoors_start"] = true, + ["des_gasstation_skin01"] = true, + ["des_gasstation_skin02"] = true, + ["des_gasstation_tiles_root"] = true, + ["des_glass_end"] = true, + ["des_glass_root"] = true, + ["des_glass_root2"] = true, + ["des_glass_root3"] = true, + ["des_glass_root4"] = true, + ["des_glass_start"] = true, + ["des_hospitaldoors_end"] = true, + ["des_hospitaldoors_skin_root1"] = true, + ["des_hospitaldoors_skin_root2"] = true, + ["des_hospitaldoors_skin_root3"] = true, + ["des_hospitaldoors_start"] = true, + ["des_hospitaldoors_start_old"] = true, + ["des_jewel_cab_end"] = true, + ["des_jewel_cab_root"] = true, + ["des_jewel_cab_root2"] = true, + ["des_jewel_cab_start"] = true, + ["des_jewel_cab2_end"] = true, + ["des_jewel_cab2_root"] = true, + ["des_jewel_cab2_rootb"] = true, + ["des_jewel_cab2_start"] = true, + ["des_jewel_cab3_end"] = true, + ["des_jewel_cab3_root"] = true, + ["des_jewel_cab3_rootb"] = true, + ["des_jewel_cab3_start"] = true, + ["des_jewel_cab4_end"] = true, + ["des_jewel_cab4_root"] = true, + ["des_jewel_cab4_rootb"] = true, + ["des_jewel_cab4_start"] = true, + ["des_light_panel_end"] = true, + ["des_light_panel_root"] = true, + ["des_light_panel_start"] = true, + ["des_methtrailer_skin_root001"] = true, + ["des_methtrailer_skin_root002"] = true, + ["des_methtrailer_skin_root003"] = true, + ["des_plog_decal_root"] = true, + ["des_plog_door_end"] = true, + ["des_plog_door_root"] = true, + ["des_plog_door_start"] = true, + ["des_plog_light_root"] = true, + ["des_plog_vent_root"] = true, + ["des_protree_root"] = true, + ["des_railing_root"] = true, + ["des_scaffolding_root"] = true, + ["des_scaffolding_tank_root"] = true, + ["des_server_end"] = true, + ["des_server_root"] = true, + ["des_server_start"] = true, + ["des_shipsink_01"] = true, + ["des_shipsink_02"] = true, + ["des_shipsink_03"] = true, + ["des_shipsink_04"] = true, + ["des_shipsink_05"] = true, + ["des_showroom_end"] = true, + ["des_showroom_root"] = true, + ["des_showroom_root2"] = true, + ["des_showroom_root3"] = true, + ["des_showroom_root4"] = true, + ["des_showroom_root5"] = true, + ["des_showroom_start"] = true, + ["des_smash2_root"] = true, + ["des_smash2_root005"] = true, + ["des_smash2_root006"] = true, + ["des_smash2_root2"] = true, + ["des_smash2_root3"] = true, + ["des_smash2_root4"] = true, + ["des_stilthouse_root"] = true, + ["des_stilthouse_root2"] = true, + ["des_stilthouse_root3"] = true, + ["des_stilthouse_root4"] = true, + ["des_stilthouse_root5"] = true, + ["des_stilthouse_root7"] = true, + ["des_stilthouse_root8"] = true, + ["des_stilthouse_root9"] = true, + ["des_tankercrash_01"] = true, + ["des_tankerexplosion_01"] = true, + ["des_tankerexplosion_02"] = true, + ["des_trailerparka_01"] = true, + ["des_trailerparka_02"] = true, + ["des_trailerparkb_01"] = true, + ["des_trailerparkb_02"] = true, + ["des_trailerparkc_01"] = true, + ["des_trailerparkc_02"] = true, + ["des_trailerparkd_01"] = true, + ["des_trailerparkd_02"] = true, + ["des_trailerparke_01"] = true, + ["des_traincrash_root1"] = true, + ["des_traincrash_root2"] = true, + ["des_traincrash_root3"] = true, + ["des_traincrash_root4"] = true, + ["des_traincrash_root5"] = true, + ["des_traincrash_root6"] = true, + ["des_traincrash_root7"] = true, + ["des_tvsmash_end"] = true, + ["des_tvsmash_root"] = true, + ["des_tvsmash_start"] = true, + ["des_vaultdoor001_end"] = true, + ["des_vaultdoor001_root001"] = true, + ["des_vaultdoor001_root002"] = true, + ["des_vaultdoor001_root003"] = true, + ["des_vaultdoor001_root004"] = true, + ["des_vaultdoor001_root005"] = true, + ["des_vaultdoor001_root006"] = true, + ["des_vaultdoor001_skin001"] = true, + ["des_vaultdoor001_start"] = true, + ["dlc_hei4_anims_elevator_hack_components_card_out"] = true, + ["dt1_03_mp_door"] = true, + ["dt1_05_build1_damage"] = true, + ["dt1_05_build1_damage_lod"] = true, + ["dt1_05_damage_slod"] = true, + ["dt1_20_didier_mp_door"] = true, + ["dt1_lod_5_20_emissive_proxy"] = true, + ["dt1_lod_5_21_emissive_proxy"] = true, + ["dt1_lod_6_19_emissive_proxy"] = true, + ["dt1_lod_6_20_emissive_proxy"] = true, + ["dt1_lod_6_21_emissive_proxy"] = true, + ["dt1_lod_7_20_emissive_proxy"] = true, + ["dt1_lod_f1_slod3"] = true, + ["dt1_lod_f1b_slod3"] = true, + ["dt1_lod_f2_slod3"] = true, + ["dt1_lod_f2b_slod3"] = true, + ["dt1_lod_f3_slod3"] = true, + ["dt1_lod_f4_slod3"] = true, + ["dt1_lod_slod3"] = true, + ["ela_wdn_02_"] = true, + ["ela_wdn_02_decal"] = true, + ["ela_wdn_02lod_"] = true, + ["ela_wdn_04_"] = true, + ["ela_wdn_04_decals"] = true, + ["ela_wdn_04lod_"] = true, + ["ex_cash_pile_004"] = true, + ["ex_cash_pile_005"] = true, + ["ex_cash_pile_006"] = true, + ["ex_cash_pile_01"] = true, + ["ex_cash_pile_02"] = true, + ["ex_cash_pile_07"] = true, + ["ex_cash_pile_8"] = true, + ["ex_cash_roll_01"] = true, + ["ex_cash_scatter_01"] = true, + ["ex_cash_scatter_02"] = true, + ["ex_cash_scatter_03"] = true, + ["ex_mapmarker_1_elysian_island_2"] = true, + ["ex_mapmarker_10_elburroheight_1"] = true, + ["ex_mapmarker_11_elysian_island_3"] = true, + ["ex_mapmarker_12_la_mesa_2"] = true, + ["ex_mapmarker_13_maze_bank_arena_1"] = true, + ["ex_mapmarker_14_strawberry_1"] = true, + ["ex_mapmarker_15_downtn_vine_1"] = true, + ["ex_mapmarker_16_la_mesa_3"] = true, + ["ex_mapmarker_17_la_mesa_4"] = true, + ["ex_mapmarker_18_cypress_flats_2"] = true, + ["ex_mapmarker_19_cypress_flats_3"] = true, + ["ex_mapmarker_2_la_puerta_1"] = true, + ["ex_mapmarker_20_vinewood_1"] = true, + ["ex_mapmarker_21_rancho_2"] = true, + ["ex_mapmarker_22_banning_1"] = true, + ["ex_mapmarker_3_la_mesa_1"] = true, + ["ex_mapmarker_4_rancho_1"] = true, + ["ex_mapmarker_5_west_vinewood_1"] = true, + ["ex_mapmarker_6_lsia_1"] = true, + ["ex_mapmarker_7_del_perro_1"] = true, + ["ex_mapmarker_8_lsia_2"] = true, + ["ex_mapmarker_9_elysian_island_1"] = true, + ["ex_mp_h_acc_artwalll_02"] = true, + ["ex_mp_h_acc_artwalll_03"] = true, + ["ex_mp_h_acc_artwallm_02"] = true, + ["ex_mp_h_acc_artwallm_03"] = true, + ["ex_mp_h_acc_artwallm_04"] = true, + ["ex_mp_h_acc_bottle_01"] = true, + ["ex_mp_h_acc_bowl_ceramic_01"] = true, + ["ex_mp_h_acc_box_trinket_01"] = true, + ["ex_mp_h_acc_box_trinket_02"] = true, + ["ex_mp_h_acc_candles_01"] = true, + ["ex_mp_h_acc_candles_02"] = true, + ["ex_mp_h_acc_candles_04"] = true, + ["ex_mp_h_acc_candles_05"] = true, + ["ex_mp_h_acc_candles_06"] = true, + ["ex_mp_h_acc_coffeemachine_01"] = true, + ["ex_mp_h_acc_dec_head_01"] = true, + ["ex_mp_h_acc_dec_plate_01"] = true, + ["ex_mp_h_acc_dec_plate_02"] = true, + ["ex_mp_h_acc_dec_sculpt_01"] = true, + ["ex_mp_h_acc_dec_sculpt_02"] = true, + ["ex_mp_h_acc_dec_sculpt_03"] = true, + ["ex_mp_h_acc_fruitbowl_01"] = true, + ["ex_mp_h_acc_fruitbowl_02"] = true, + ["ex_mp_h_acc_plant_palm_01"] = true, + ["ex_mp_h_acc_plant_tall_01"] = true, + ["ex_mp_h_acc_rugwoolm_04"] = true, + ["ex_mp_h_acc_scent_sticks_01"] = true, + ["ex_mp_h_acc_tray_01"] = true, + ["ex_mp_h_acc_vase_01"] = true, + ["ex_mp_h_acc_vase_02"] = true, + ["ex_mp_h_acc_vase_04"] = true, + ["ex_mp_h_acc_vase_05"] = true, + ["ex_mp_h_acc_vase_06"] = true, + ["ex_mp_h_acc_vase_flowers_01"] = true, + ["ex_mp_h_acc_vase_flowers_02"] = true, + ["ex_mp_h_acc_vase_flowers_03"] = true, + ["ex_mp_h_acc_vase_flowers_04"] = true, + ["ex_mp_h_din_chair_04"] = true, + ["ex_mp_h_din_chair_08"] = true, + ["ex_mp_h_din_chair_09"] = true, + ["ex_mp_h_din_chair_12"] = true, + ["ex_mp_h_din_stool_04"] = true, + ["ex_mp_h_din_table_01"] = true, + ["ex_mp_h_din_table_04"] = true, + ["ex_mp_h_din_table_05"] = true, + ["ex_mp_h_din_table_06"] = true, + ["ex_mp_h_din_table_11"] = true, + ["ex_mp_h_lit_lamptable_02"] = true, + ["ex_mp_h_lit_lightpendant_01"] = true, + ["ex_mp_h_off_chairstrip_01"] = true, + ["ex_mp_h_off_easychair_01"] = true, + ["ex_mp_h_off_sofa_003"] = true, + ["ex_mp_h_off_sofa_01"] = true, + ["ex_mp_h_off_sofa_02"] = true, + ["ex_mp_h_stn_chairarm_03"] = true, + ["ex_mp_h_stn_chairarm_24"] = true, + ["ex_mp_h_stn_chairstrip_01"] = true, + ["ex_mp_h_stn_chairstrip_010"] = true, + ["ex_mp_h_stn_chairstrip_011"] = true, + ["ex_mp_h_stn_chairstrip_05"] = true, + ["ex_mp_h_stn_chairstrip_07"] = true, + ["ex_mp_h_tab_coffee_05"] = true, + ["ex_mp_h_tab_coffee_08"] = true, + ["ex_mp_h_tab_sidelrg_07"] = true, + ["ex_mp_h_yacht_barstool_01"] = true, + ["ex_mp_h_yacht_coffee_table_01"] = true, + ["ex_mp_h_yacht_coffee_table_02"] = true, + ["ex_office_citymodel_01"] = true, + ["ex_office_swag_booze_cigs"] = true, + ["ex_office_swag_booze_cigs2"] = true, + ["ex_office_swag_booze_cigs3"] = true, + ["ex_office_swag_counterfeit1"] = true, + ["ex_office_swag_counterfeit2"] = true, + ["ex_office_swag_drugbag2"] = true, + ["ex_office_swag_drugbags"] = true, + ["ex_office_swag_drugstatue"] = true, + ["ex_office_swag_drugstatue2"] = true, + ["ex_office_swag_electronic"] = true, + ["ex_office_swag_electronic2"] = true, + ["ex_office_swag_electronic3"] = true, + ["ex_office_swag_furcoats"] = true, + ["ex_office_swag_furcoats2"] = true, + ["ex_office_swag_furcoats3"] = true, + ["ex_office_swag_gem01"] = true, + ["ex_office_swag_gem02"] = true, + ["ex_office_swag_gem03"] = true, + ["ex_office_swag_guns01"] = true, + ["ex_office_swag_guns02"] = true, + ["ex_office_swag_guns03"] = true, + ["ex_office_swag_guns04"] = true, + ["ex_office_swag_ivory"] = true, + ["ex_office_swag_ivory2"] = true, + ["ex_office_swag_ivory3"] = true, + ["ex_office_swag_ivory4"] = true, + ["ex_office_swag_jewelwatch"] = true, + ["ex_office_swag_jewelwatch2"] = true, + ["ex_office_swag_jewelwatch3"] = true, + ["ex_office_swag_med1"] = true, + ["ex_office_swag_med2"] = true, + ["ex_office_swag_med3"] = true, + ["ex_office_swag_med4"] = true, + ["ex_office_swag_paintings01"] = true, + ["ex_office_swag_paintings02"] = true, + ["ex_office_swag_paintings03"] = true, + ["ex_office_swag_pills1"] = true, + ["ex_office_swag_pills2"] = true, + ["ex_office_swag_pills3"] = true, + ["ex_office_swag_pills4"] = true, + ["ex_office_swag_silver"] = true, + ["ex_office_swag_silver2"] = true, + ["ex_office_swag_silver3"] = true, + ["ex_officedeskcollision"] = true, + ["ex_p_ex_decanter_01_s"] = true, + ["ex_p_ex_decanter_02_s"] = true, + ["ex_p_ex_decanter_03_s"] = true, + ["ex_p_ex_tumbler_01_empty"] = true, + ["ex_p_ex_tumbler_01_s"] = true, + ["ex_p_ex_tumbler_02_empty"] = true, + ["ex_p_ex_tumbler_02_s"] = true, + ["ex_p_ex_tumbler_03_empty"] = true, + ["ex_p_ex_tumbler_03_s"] = true, + ["ex_p_ex_tumbler_04_empty"] = true, + ["ex_p_h_acc_artwalll_01"] = true, + ["ex_p_h_acc_artwalll_03"] = true, + ["ex_p_h_acc_artwallm_01"] = true, + ["ex_p_h_acc_artwallm_03"] = true, + ["ex_p_h_acc_artwallm_04"] = true, + ["ex_p_mp_door_apart_door"] = true, + ["ex_p_mp_door_apart_door_black"] = true, + ["ex_p_mp_door_apart_door_black_s"] = true, + ["ex_p_mp_door_apart_door_s"] = true, + ["ex_p_mp_door_apart_doorbrown_s"] = true, + ["ex_p_mp_door_apart_doorbrown01"] = true, + ["ex_p_mp_door_apart_doorwhite01"] = true, + ["ex_p_mp_door_apart_doorwhite01_s"] = true, + ["ex_p_mp_door_office_door01"] = true, + ["ex_p_mp_door_office_door01_s"] = true, + ["ex_p_mp_h_showerdoor_s"] = true, + ["ex_prop_adv_case"] = true, + ["ex_prop_adv_case_sm"] = true, + ["ex_prop_adv_case_sm_02"] = true, + ["ex_prop_adv_case_sm_03"] = true, + ["ex_prop_adv_case_sm_flash"] = true, + ["ex_prop_ashtray_luxe_02"] = true, + ["ex_prop_crate_ammo_bc"] = true, + ["ex_prop_crate_ammo_sc"] = true, + ["ex_prop_crate_art_02_bc"] = true, + ["ex_prop_crate_art_02_sc"] = true, + ["ex_prop_crate_art_bc"] = true, + ["ex_prop_crate_art_sc"] = true, + ["ex_prop_crate_biohazard_bc"] = true, + ["ex_prop_crate_biohazard_sc"] = true, + ["ex_prop_crate_bull_bc_02"] = true, + ["ex_prop_crate_bull_sc_02"] = true, + ["ex_prop_crate_closed_bc"] = true, + ["ex_prop_crate_closed_ms"] = true, + ["ex_prop_crate_closed_mw"] = true, + ["ex_prop_crate_closed_rw"] = true, + ["ex_prop_crate_closed_sc"] = true, + ["ex_prop_crate_clothing_bc"] = true, + ["ex_prop_crate_clothing_sc"] = true, + ["ex_prop_crate_elec_bc"] = true, + ["ex_prop_crate_elec_sc"] = true, + ["ex_prop_crate_expl_bc"] = true, + ["ex_prop_crate_expl_sc"] = true, + ["ex_prop_crate_freel"] = true, + ["ex_prop_crate_furjacket_bc"] = true, + ["ex_prop_crate_furjacket_sc"] = true, + ["ex_prop_crate_gems_bc"] = true, + ["ex_prop_crate_gems_sc"] = true, + ["ex_prop_crate_highend_pharma_bc"] = true, + ["ex_prop_crate_highend_pharma_sc"] = true, + ["ex_prop_crate_jewels_bc"] = true, + ["ex_prop_crate_jewels_racks_bc"] = true, + ["ex_prop_crate_jewels_racks_sc"] = true, + ["ex_prop_crate_jewels_sc"] = true, + ["ex_prop_crate_med_bc"] = true, + ["ex_prop_crate_med_sc"] = true, + ["ex_prop_crate_minig"] = true, + ["ex_prop_crate_money_bc"] = true, + ["ex_prop_crate_money_sc"] = true, + ["ex_prop_crate_narc_bc"] = true, + ["ex_prop_crate_narc_sc"] = true, + ["ex_prop_crate_oegg"] = true, + ["ex_prop_crate_pharma_bc"] = true, + ["ex_prop_crate_pharma_sc"] = true, + ["ex_prop_crate_shide"] = true, + ["ex_prop_crate_tob_bc"] = true, + ["ex_prop_crate_tob_sc"] = true, + ["ex_prop_crate_watch"] = true, + ["ex_prop_crate_wlife_bc"] = true, + ["ex_prop_crate_wlife_sc"] = true, + ["ex_prop_crate_xldiam"] = true, + ["ex_prop_door_arcad_ent_l"] = true, + ["ex_prop_door_arcad_ent_r"] = true, + ["ex_prop_door_arcad_roof_l"] = true, + ["ex_prop_door_arcad_roof_r"] = true, + ["ex_prop_door_lowbank_ent_l"] = true, + ["ex_prop_door_lowbank_ent_r"] = true, + ["ex_prop_door_lowbank_roof"] = true, + ["ex_prop_door_maze2_ent_l"] = true, + ["ex_prop_door_maze2_ent_r"] = true, + ["ex_prop_door_maze2_rf_l"] = true, + ["ex_prop_door_maze2_rf_r"] = true, + ["ex_prop_door_maze2_roof"] = true, + ["ex_prop_ex_console_table_01"] = true, + ["ex_prop_ex_laptop_01a"] = true, + ["ex_prop_ex_office_text"] = true, + ["ex_prop_ex_toolchest_01"] = true, + ["ex_prop_ex_tv_flat_01"] = true, + ["ex_prop_exec_ashtray_01"] = true, + ["ex_prop_exec_award_bronze"] = true, + ["ex_prop_exec_award_diamond"] = true, + ["ex_prop_exec_award_gold"] = true, + ["ex_prop_exec_award_plastic"] = true, + ["ex_prop_exec_award_silver"] = true, + ["ex_prop_exec_bed_01"] = true, + ["ex_prop_exec_cashpile"] = true, + ["ex_prop_exec_cigar_01"] = true, + ["ex_prop_exec_crashedp"] = true, + ["ex_prop_exec_guncase"] = true, + ["ex_prop_exec_lighter_01"] = true, + ["ex_prop_exec_office_door01"] = true, + ["ex_prop_monitor_01_ex"] = true, + ["ex_prop_offchair_exec_01"] = true, + ["ex_prop_offchair_exec_02"] = true, + ["ex_prop_offchair_exec_03"] = true, + ["ex_prop_offchair_exec_04"] = true, + ["ex_prop_office_louvres"] = true, + ["ex_prop_safedoor_office1a_l"] = true, + ["ex_prop_safedoor_office1a_r"] = true, + ["ex_prop_safedoor_office1b_l"] = true, + ["ex_prop_safedoor_office1b_r"] = true, + ["ex_prop_safedoor_office1c_l"] = true, + ["ex_prop_safedoor_office1c_r"] = true, + ["ex_prop_safedoor_office2a_l"] = true, + ["ex_prop_safedoor_office2a_r"] = true, + ["ex_prop_safedoor_office3a_l"] = true, + ["ex_prop_safedoor_office3a_r"] = true, + ["ex_prop_safedoor_office3c_l"] = true, + ["ex_prop_safedoor_office3c_r"] = true, + ["ex_prop_trailer_monitor_01"] = true, + ["ex_prop_tv_settop_box"] = true, + ["ex_prop_tv_settop_remote"] = true, + ["exile1_lightrig"] = true, + ["exile1_reflecttrig"] = true, + ["fib_3_qte_lightrig"] = true, + ["fib_5_mcs_10_lightrig"] = true, + ["fib_cl2_cbl_root"] = true, + ["fib_cl2_cbl2_root"] = true, + ["fib_cl2_frm_root"] = true, + ["fib_cl2_vent_root"] = true, + ["fire_mesh_root"] = true, + ["frag_plank_a"] = true, + ["frag_plank_b"] = true, + ["frag_plank_c"] = true, + ["frag_plank_d"] = true, + ["frag_plank_e"] = true, + ["gr_dlc_gr_yacht_props_glass_01"] = true, + ["gr_dlc_gr_yacht_props_glass_02"] = true, + ["gr_dlc_gr_yacht_props_glass_03"] = true, + ["gr_dlc_gr_yacht_props_glass_04"] = true, + ["gr_dlc_gr_yacht_props_glass_05"] = true, + ["gr_dlc_gr_yacht_props_glass_06"] = true, + ["gr_dlc_gr_yacht_props_glass_07"] = true, + ["gr_dlc_gr_yacht_props_glass_08"] = true, + ["gr_dlc_gr_yacht_props_glass_09"] = true, + ["gr_dlc_gr_yacht_props_glass_10"] = true, + ["gr_dlc_gr_yacht_props_lounger"] = true, + ["gr_dlc_gr_yacht_props_seat_01"] = true, + ["gr_dlc_gr_yacht_props_seat_02"] = true, + ["gr_dlc_gr_yacht_props_seat_03"] = true, + ["gr_dlc_gr_yacht_props_table_01"] = true, + ["gr_dlc_gr_yacht_props_table_02"] = true, + ["gr_dlc_gr_yacht_props_table_03"] = true, + ["gr_prop_bunker_bed_01"] = true, + ["gr_prop_bunker_deskfan_01a"] = true, + ["gr_prop_damship_01a"] = true, + ["gr_prop_gr_2s_drillcrate_01a"] = true, + ["gr_prop_gr_2s_millcrate_01a"] = true, + ["gr_prop_gr_2stackcrate_01a"] = true, + ["gr_prop_gr_3s_drillcrate_01a"] = true, + ["gr_prop_gr_3s_millcrate_01a"] = true, + ["gr_prop_gr_3stackcrate_01a"] = true, + ["gr_prop_gr_adv_case"] = true, + ["gr_prop_gr_basepart"] = true, + ["gr_prop_gr_basepart_f"] = true, + ["gr_prop_gr_bench_01a"] = true, + ["gr_prop_gr_bench_01b"] = true, + ["gr_prop_gr_bench_02a"] = true, + ["gr_prop_gr_bench_02b"] = true, + ["gr_prop_gr_bench_03a"] = true, + ["gr_prop_gr_bench_03b"] = true, + ["gr_prop_gr_bench_04a"] = true, + ["gr_prop_gr_bench_04b"] = true, + ["gr_prop_gr_bulletscrate_01a"] = true, + ["gr_prop_gr_bunkeddoor"] = true, + ["gr_prop_gr_bunkeddoor_col"] = true, + ["gr_prop_gr_bunkeddoor_f"] = true, + ["gr_prop_gr_bunkerglass"] = true, + ["gr_prop_gr_cage_01a"] = true, + ["gr_prop_gr_campbed_01"] = true, + ["gr_prop_gr_carcreeper"] = true, + ["gr_prop_gr_chair02_ped"] = true, + ["gr_prop_gr_cnc_01a"] = true, + ["gr_prop_gr_cnc_01b"] = true, + ["gr_prop_gr_cnc_01c"] = true, + ["gr_prop_gr_console_01"] = true, + ["gr_prop_gr_crate_gun_01a"] = true, + ["gr_prop_gr_crate_mag_01a"] = true, + ["gr_prop_gr_crate_pistol_02a"] = true, + ["gr_prop_gr_crates_pistols_01a"] = true, + ["gr_prop_gr_crates_rifles_01a"] = true, + ["gr_prop_gr_crates_rifles_02a"] = true, + ["gr_prop_gr_crates_rifles_03a"] = true, + ["gr_prop_gr_crates_rifles_04a"] = true, + ["gr_prop_gr_crates_sam_01a"] = true, + ["gr_prop_gr_crates_weapon_mix_01a"] = true, + ["gr_prop_gr_crates_weapon_mix_01b"] = true, + ["gr_prop_gr_cratespile_01a"] = true, + ["gr_prop_gr_doorpart"] = true, + ["gr_prop_gr_doorpart_f"] = true, + ["gr_prop_gr_drill_01a"] = true, + ["gr_prop_gr_drill_crate_01a"] = true, + ["gr_prop_gr_drillcage_01a"] = true, + ["gr_prop_gr_driver_01a"] = true, + ["gr_prop_gr_fnclink_03e"] = true, + ["gr_prop_gr_fnclink_03f"] = true, + ["gr_prop_gr_fnclink_03g"] = true, + ["gr_prop_gr_fnclink_03gate3"] = true, + ["gr_prop_gr_fnclink_03h"] = true, + ["gr_prop_gr_fnclink_03i"] = true, + ["gr_prop_gr_grinder_01a"] = true, + ["gr_prop_gr_gunlocker_01a"] = true, + ["gr_prop_gr_gunsmithsupl_01a"] = true, + ["gr_prop_gr_gunsmithsupl_02a"] = true, + ["gr_prop_gr_gunsmithsupl_03a"] = true, + ["gr_prop_gr_hammer_01"] = true, + ["gr_prop_gr_hdsec"] = true, + ["gr_prop_gr_hdsec_deactive"] = true, + ["gr_prop_gr_hobo_stove_01"] = true, + ["gr_prop_gr_jailer_keys_01a"] = true, + ["gr_prop_gr_laptop_01a"] = true, + ["gr_prop_gr_laptop_01b"] = true, + ["gr_prop_gr_laptop_01c"] = true, + ["gr_prop_gr_lathe_01a"] = true, + ["gr_prop_gr_lathe_01b"] = true, + ["gr_prop_gr_lathe_01c"] = true, + ["gr_prop_gr_magspile_01a"] = true, + ["gr_prop_gr_mill_crate_01a"] = true, + ["gr_prop_gr_millcage_01a"] = true, + ["gr_prop_gr_missle_long"] = true, + ["gr_prop_gr_missle_short"] = true, + ["gr_prop_gr_offchair_01a"] = true, + ["gr_prop_gr_para_s_01"] = true, + ["gr_prop_gr_part_drill_01a"] = true, + ["gr_prop_gr_part_lathe_01a"] = true, + ["gr_prop_gr_part_mill_01a"] = true, + ["gr_prop_gr_pliers_01"] = true, + ["gr_prop_gr_pliers_02"] = true, + ["gr_prop_gr_pliers_03"] = true, + ["gr_prop_gr_pmine_01a"] = true, + ["gr_prop_gr_prop_welder_01a"] = true, + ["gr_prop_gr_ramproof_gate"] = true, + ["gr_prop_gr_rasp_01"] = true, + ["gr_prop_gr_rasp_02"] = true, + ["gr_prop_gr_rasp_03"] = true, + ["gr_prop_gr_rsply_crate01a"] = true, + ["gr_prop_gr_rsply_crate02a"] = true, + ["gr_prop_gr_rsply_crate03a"] = true, + ["gr_prop_gr_rsply_crate04a"] = true, + ["gr_prop_gr_rsply_crate04b"] = true, + ["gr_prop_gr_sdriver_01"] = true, + ["gr_prop_gr_sdriver_02"] = true, + ["gr_prop_gr_sdriver_03"] = true, + ["gr_prop_gr_sign_01a"] = true, + ["gr_prop_gr_sign_01b"] = true, + ["gr_prop_gr_sign_01c"] = true, + ["gr_prop_gr_sign_01e"] = true, + ["gr_prop_gr_single_bullet"] = true, + ["gr_prop_gr_speeddrill_01a"] = true, + ["gr_prop_gr_speeddrill_01b"] = true, + ["gr_prop_gr_speeddrill_01c"] = true, + ["gr_prop_gr_tape_01"] = true, + ["gr_prop_gr_target_01a"] = true, + ["gr_prop_gr_target_01b"] = true, + ["gr_prop_gr_target_02a"] = true, + ["gr_prop_gr_target_02b"] = true, + ["gr_prop_gr_target_03a"] = true, + ["gr_prop_gr_target_03b"] = true, + ["gr_prop_gr_target_04a"] = true, + ["gr_prop_gr_target_04b"] = true, + ["gr_prop_gr_target_04c"] = true, + ["gr_prop_gr_target_04d"] = true, + ["gr_prop_gr_target_05a"] = true, + ["gr_prop_gr_target_05b"] = true, + ["gr_prop_gr_target_05c"] = true, + ["gr_prop_gr_target_05d"] = true, + ["gr_prop_gr_target_1_01a"] = true, + ["gr_prop_gr_target_1_01b"] = true, + ["gr_prop_gr_target_2_04a"] = true, + ["gr_prop_gr_target_2_04b"] = true, + ["gr_prop_gr_target_3_03a"] = true, + ["gr_prop_gr_target_3_03b"] = true, + ["gr_prop_gr_target_4_01a"] = true, + ["gr_prop_gr_target_4_01b"] = true, + ["gr_prop_gr_target_5_01a"] = true, + ["gr_prop_gr_target_5_01b"] = true, + ["gr_prop_gr_target_large_01a"] = true, + ["gr_prop_gr_target_large_01b"] = true, + ["gr_prop_gr_target_long_01a"] = true, + ["gr_prop_gr_target_small_01a"] = true, + ["gr_prop_gr_target_small_01b"] = true, + ["gr_prop_gr_target_small_02a"] = true, + ["gr_prop_gr_target_small_03a"] = true, + ["gr_prop_gr_target_small_04a"] = true, + ["gr_prop_gr_target_small_05a"] = true, + ["gr_prop_gr_target_small_06a"] = true, + ["gr_prop_gr_target_small_07a"] = true, + ["gr_prop_gr_target_trap_01a"] = true, + ["gr_prop_gr_target_trap_02a"] = true, + ["gr_prop_gr_target_w_02a"] = true, + ["gr_prop_gr_target_w_02b"] = true, + ["gr_prop_gr_tool_box_01a"] = true, + ["gr_prop_gr_tool_box_02a"] = true, + ["gr_prop_gr_tool_chest_01a"] = true, + ["gr_prop_gr_tool_draw_01a"] = true, + ["gr_prop_gr_tool_draw_01b"] = true, + ["gr_prop_gr_tool_draw_01d"] = true, + ["gr_prop_gr_torque_wrench_01a"] = true, + ["gr_prop_gr_trailer_monitor_01"] = true, + ["gr_prop_gr_trailer_monitor_02"] = true, + ["gr_prop_gr_trailer_monitor_03"] = true, + ["gr_prop_gr_trailer_tv"] = true, + ["gr_prop_gr_trailer_tv_02"] = true, + ["gr_prop_gr_tunnel_gate"] = true, + ["gr_prop_gr_v_mill_crate_01a"] = true, + ["gr_prop_gr_vertmill_01a"] = true, + ["gr_prop_gr_vertmill_01b"] = true, + ["gr_prop_gr_vertmill_01c"] = true, + ["gr_prop_gr_vice_01a"] = true, + ["gr_prop_gr_wheel_bolt_01a"] = true, + ["gr_prop_gunlocker_ammo_01a"] = true, + ["gr_prop_highendchair_gr_01a"] = true, + ["gr_prop_inttruck_anchor"] = true, + ["gr_prop_inttruck_carmod_01"] = true, + ["gr_prop_inttruck_command_01"] = true, + ["gr_prop_inttruck_door_01"] = true, + ["gr_prop_inttruck_door_static"] = true, + ["gr_prop_inttruck_doorblocker"] = true, + ["gr_prop_inttruck_empty_01"] = true, + ["gr_prop_inttruck_empty_01dummy"] = true, + ["gr_prop_inttruck_empty_02"] = true, + ["gr_prop_inttruck_empty_02dummy"] = true, + ["gr_prop_inttruck_empty_03"] = true, + ["gr_prop_inttruck_empty_03dummy"] = true, + ["gr_prop_inttruck_gunmod_01"] = true, + ["gr_prop_inttruck_light_ca_b_bk"] = true, + ["gr_prop_inttruck_light_ca_b_bl"] = true, + ["gr_prop_inttruck_light_ca_b_ol"] = true, + ["gr_prop_inttruck_light_ca_b_re"] = true, + ["gr_prop_inttruck_light_ca_g_aq"] = true, + ["gr_prop_inttruck_light_ca_g_bl"] = true, + ["gr_prop_inttruck_light_ca_g_dg"] = true, + ["gr_prop_inttruck_light_ca_g_mu"] = true, + ["gr_prop_inttruck_light_ca_g_ol"] = true, + ["gr_prop_inttruck_light_ca_g_re"] = true, + ["gr_prop_inttruck_light_ca_w_br"] = true, + ["gr_prop_inttruck_light_ca_w_lg"] = true, + ["gr_prop_inttruck_light_ca_w_mu"] = true, + ["gr_prop_inttruck_light_ca_w_ol"] = true, + ["gr_prop_inttruck_light_co_b_bk"] = true, + ["gr_prop_inttruck_light_co_b_bl"] = true, + ["gr_prop_inttruck_light_co_b_ol"] = true, + ["gr_prop_inttruck_light_co_b_re"] = true, + ["gr_prop_inttruck_light_co_g_aq"] = true, + ["gr_prop_inttruck_light_co_g_bl"] = true, + ["gr_prop_inttruck_light_co_g_dg"] = true, + ["gr_prop_inttruck_light_co_g_mu"] = true, + ["gr_prop_inttruck_light_co_g_ol"] = true, + ["gr_prop_inttruck_light_co_g_re"] = true, + ["gr_prop_inttruck_light_co_w_br"] = true, + ["gr_prop_inttruck_light_co_w_lg"] = true, + ["gr_prop_inttruck_light_co_w_mu"] = true, + ["gr_prop_inttruck_light_co_w_ol"] = true, + ["gr_prop_inttruck_light_e1"] = true, + ["gr_prop_inttruck_light_e2"] = true, + ["gr_prop_inttruck_light_gu_b_bk"] = true, + ["gr_prop_inttruck_light_gu_b_bl"] = true, + ["gr_prop_inttruck_light_gu_b_ol"] = true, + ["gr_prop_inttruck_light_gu_b_re"] = true, + ["gr_prop_inttruck_light_gu_g_aq"] = true, + ["gr_prop_inttruck_light_gu_g_bl"] = true, + ["gr_prop_inttruck_light_gu_g_dg"] = true, + ["gr_prop_inttruck_light_gu_g_mu"] = true, + ["gr_prop_inttruck_light_gu_g_ol"] = true, + ["gr_prop_inttruck_light_gu_g_re"] = true, + ["gr_prop_inttruck_light_gu_w_br"] = true, + ["gr_prop_inttruck_light_gu_w_lg"] = true, + ["gr_prop_inttruck_light_gu_w_mu"] = true, + ["gr_prop_inttruck_light_gu_w_ol"] = true, + ["gr_prop_inttruck_light_li_b_bk"] = true, + ["gr_prop_inttruck_light_li_b_bl"] = true, + ["gr_prop_inttruck_light_li_b_ol"] = true, + ["gr_prop_inttruck_light_li_b_re"] = true, + ["gr_prop_inttruck_light_li_g_aq"] = true, + ["gr_prop_inttruck_light_li_g_bl"] = true, + ["gr_prop_inttruck_light_li_g_dg"] = true, + ["gr_prop_inttruck_light_li_g_mu"] = true, + ["gr_prop_inttruck_light_li_g_ol"] = true, + ["gr_prop_inttruck_light_li_g_re"] = true, + ["gr_prop_inttruck_light_li_w_br"] = true, + ["gr_prop_inttruck_light_li_w_lg"] = true, + ["gr_prop_inttruck_light_li_w_mu"] = true, + ["gr_prop_inttruck_light_li_w_ol"] = true, + ["gr_prop_inttruck_light_ve_b_bk"] = true, + ["gr_prop_inttruck_light_ve_b_bl"] = true, + ["gr_prop_inttruck_light_ve_b_ol"] = true, + ["gr_prop_inttruck_light_ve_b_re"] = true, + ["gr_prop_inttruck_light_ve_g_aq"] = true, + ["gr_prop_inttruck_light_ve_g_bl"] = true, + ["gr_prop_inttruck_light_ve_g_dg"] = true, + ["gr_prop_inttruck_light_ve_g_mu"] = true, + ["gr_prop_inttruck_light_ve_g_ol"] = true, + ["gr_prop_inttruck_light_ve_g_re"] = true, + ["gr_prop_inttruck_light_ve_w_br"] = true, + ["gr_prop_inttruck_light_ve_w_lg"] = true, + ["gr_prop_inttruck_light_ve_w_mu"] = true, + ["gr_prop_inttruck_light_ve_w_ol"] = true, + ["gr_prop_inttruck_living_01"] = true, + ["gr_prop_inttruck_vehicle_01"] = true, + ["h4_des_hs4_gate_exp_01"] = true, + ["h4_des_hs4_gate_exp_02"] = true, + ["h4_des_hs4_gate_exp_03"] = true, + ["h4_des_hs4_gate_exp_04"] = true, + ["h4_des_hs4_gate_exp_05"] = true, + ["h4_des_hs4_gate_exp_end"] = true, + ["h4_dfloor_strobe_lightproxy"] = true, + ["h4_dj_set_wbeach"] = true, + ["h4_int_lev_scuba_gear"] = true, + ["h4_int_lev_sub_chair_01"] = true, + ["h4_int_lev_sub_chair_02"] = true, + ["h4_int_lev_sub_doorl"] = true, + ["h4_int_lev_sub_doorr"] = true, + ["h4_int_lev_sub_hatch"] = true, + ["h4_int_lev_sub_periscope"] = true, + ["h4_int_lev_sub_periscope_h_up"] = true, + ["h4_int_sub_lift_doors_frm"] = true, + ["h4_int_sub_lift_doors_l"] = true, + ["h4_int_sub_lift_doors_r"] = true, + ["h4_mp_apa_yacht"] = true, + ["h4_mp_apa_yacht_jacuzzi_cam"] = true, + ["h4_mp_apa_yacht_jacuzzi_ripple003"] = true, + ["h4_mp_apa_yacht_jacuzzi_ripple1"] = true, + ["h4_mp_apa_yacht_jacuzzi_ripple2"] = true, + ["h4_mp_apa_yacht_win"] = true, + ["h4_mp_h_acc_artwalll_01"] = true, + ["h4_mp_h_acc_artwalll_02"] = true, + ["h4_mp_h_acc_artwallm_02"] = true, + ["h4_mp_h_acc_artwallm_03"] = true, + ["h4_mp_h_acc_box_trinket_02"] = true, + ["h4_mp_h_acc_candles_02"] = true, + ["h4_mp_h_acc_candles_05"] = true, + ["h4_mp_h_acc_candles_06"] = true, + ["h4_mp_h_acc_dec_sculpt_01"] = true, + ["h4_mp_h_acc_dec_sculpt_02"] = true, + ["h4_mp_h_acc_dec_sculpt_03"] = true, + ["h4_mp_h_acc_drink_tray_02"] = true, + ["h4_mp_h_acc_fruitbowl_01"] = true, + ["h4_mp_h_acc_jar_03"] = true, + ["h4_mp_h_acc_vase_04"] = true, + ["h4_mp_h_acc_vase_05"] = true, + ["h4_mp_h_acc_vase_flowers_01"] = true, + ["h4_mp_h_acc_vase_flowers_03"] = true, + ["h4_mp_h_acc_vase_flowers_04"] = true, + ["h4_mp_h_yacht_armchair_01"] = true, + ["h4_mp_h_yacht_armchair_03"] = true, + ["h4_mp_h_yacht_armchair_04"] = true, + ["h4_mp_h_yacht_barstool_01"] = true, + ["h4_mp_h_yacht_bed_01"] = true, + ["h4_mp_h_yacht_bed_02"] = true, + ["h4_mp_h_yacht_coffee_table_01"] = true, + ["h4_mp_h_yacht_coffee_table_02"] = true, + ["h4_mp_h_yacht_floor_lamp_01"] = true, + ["h4_mp_h_yacht_side_table_01"] = true, + ["h4_mp_h_yacht_side_table_02"] = true, + ["h4_mp_h_yacht_sofa_01"] = true, + ["h4_mp_h_yacht_sofa_02"] = true, + ["h4_mp_h_yacht_stool_01"] = true, + ["h4_mp_h_yacht_strip_chair_01"] = true, + ["h4_mp_h_yacht_table_lamp_01"] = true, + ["h4_mp_h_yacht_table_lamp_02"] = true, + ["h4_mp_h_yacht_table_lamp_03"] = true, + ["h4_p_cs_rope05x"] = true, + ["h4_p_cs_rope05x_01a"] = true, + ["h4_p_cs_shot_glass_2_s"] = true, + ["h4_p_h_acc_artwalll_04"] = true, + ["h4_p_h_acc_artwallm_04"] = true, + ["h4_p_h4_champ_flute_s"] = true, + ["h4_p_h4_m_bag_var22_arm_s"] = true, + ["h4_p_mp_yacht_bathroomdoor"] = true, + ["h4_p_mp_yacht_door"] = true, + ["h4_p_mp_yacht_door_01"] = true, + ["h4_p_mp_yacht_door_02"] = true, + ["h4_prop_battle_analoguemixer_01a"] = true, + ["h4_prop_battle_bar_beerfridge_01"] = true, + ["h4_prop_battle_bar_fridge_01"] = true, + ["h4_prop_battle_bar_fridge_02"] = true, + ["h4_prop_battle_chakrastones_01a"] = true, + ["h4_prop_battle_champ_closed"] = true, + ["h4_prop_battle_champ_closed_02"] = true, + ["h4_prop_battle_champ_closed_03"] = true, + ["h4_prop_battle_champ_open"] = true, + ["h4_prop_battle_champ_open_02"] = true, + ["h4_prop_battle_champ_open_03"] = true, + ["h4_prop_battle_club_chair_01"] = true, + ["h4_prop_battle_club_chair_02"] = true, + ["h4_prop_battle_club_chair_03"] = true, + ["h4_prop_battle_club_computer_01"] = true, + ["h4_prop_battle_club_computer_02"] = true, + ["h4_prop_battle_club_screen"] = true, + ["h4_prop_battle_club_screen_02"] = true, + ["h4_prop_battle_club_screen_03"] = true, + ["h4_prop_battle_club_speaker_array"] = true, + ["h4_prop_battle_club_speaker_dj"] = true, + ["h4_prop_battle_club_speaker_large"] = true, + ["h4_prop_battle_club_speaker_med"] = true, + ["h4_prop_battle_club_speaker_small"] = true, + ["h4_prop_battle_coconutdrink_01a"] = true, + ["h4_prop_battle_cuffs"] = true, + ["h4_prop_battle_decanter_01_s"] = true, + ["h4_prop_battle_decanter_02_s"] = true, + ["h4_prop_battle_decanter_03_s"] = true, + ["h4_prop_battle_dj_box_01a"] = true, + ["h4_prop_battle_dj_box_02a"] = true, + ["h4_prop_battle_dj_box_03a"] = true, + ["h4_prop_battle_dj_deck_01a"] = true, + ["h4_prop_battle_dj_deck_01a_a"] = true, + ["h4_prop_battle_dj_deck_01b"] = true, + ["h4_prop_battle_dj_kit_mixer"] = true, + ["h4_prop_battle_dj_kit_speaker"] = true, + ["h4_prop_battle_dj_mixer_01a"] = true, + ["h4_prop_battle_dj_mixer_01b"] = true, + ["h4_prop_battle_dj_mixer_01c"] = true, + ["h4_prop_battle_dj_mixer_01d"] = true, + ["h4_prop_battle_dj_mixer_01e"] = true, + ["h4_prop_battle_dj_mixer_01f"] = true, + ["h4_prop_battle_dj_stand"] = true, + ["h4_prop_battle_dj_t_box_01a"] = true, + ["h4_prop_battle_dj_t_box_02a"] = true, + ["h4_prop_battle_dj_t_box_03a"] = true, + ["h4_prop_battle_dj_wires_dixon"] = true, + ["h4_prop_battle_dj_wires_madonna"] = true, + ["h4_prop_battle_dj_wires_solomon"] = true, + ["h4_prop_battle_dj_wires_tale"] = true, + ["h4_prop_battle_emis_rig_01"] = true, + ["h4_prop_battle_emis_rig_02"] = true, + ["h4_prop_battle_emis_rig_03"] = true, + ["h4_prop_battle_emis_rig_04"] = true, + ["h4_prop_battle_fan"] = true, + ["h4_prop_battle_glowstick_01"] = true, + ["h4_prop_battle_headphones_dj"] = true, + ["h4_prop_battle_hobby_horse"] = true, + ["h4_prop_battle_ice_bucket"] = true, + ["h4_prop_battle_lights_01_bright"] = true, + ["h4_prop_battle_lights_01_dim"] = true, + ["h4_prop_battle_lights_02_bright"] = true, + ["h4_prop_battle_lights_02_dim"] = true, + ["h4_prop_battle_lights_03_bright"] = true, + ["h4_prop_battle_lights_03_dim"] = true, + ["h4_prop_battle_lights_ceiling_l_a"] = true, + ["h4_prop_battle_lights_ceiling_l_b"] = true, + ["h4_prop_battle_lights_ceiling_l_c"] = true, + ["h4_prop_battle_lights_ceiling_l_d"] = true, + ["h4_prop_battle_lights_ceiling_l_e"] = true, + ["h4_prop_battle_lights_ceiling_l_f"] = true, + ["h4_prop_battle_lights_ceiling_l_g"] = true, + ["h4_prop_battle_lights_ceiling_l_h"] = true, + ["h4_prop_battle_lights_club_df"] = true, + ["h4_prop_battle_lights_floor"] = true, + ["h4_prop_battle_lights_floor_l_a"] = true, + ["h4_prop_battle_lights_floor_l_b"] = true, + ["h4_prop_battle_lights_floorblue"] = true, + ["h4_prop_battle_lights_floorred"] = true, + ["h4_prop_battle_lights_fx_lamp"] = true, + ["h4_prop_battle_lights_fx_riga"] = true, + ["h4_prop_battle_lights_fx_rigb"] = true, + ["h4_prop_battle_lights_fx_rigc"] = true, + ["h4_prop_battle_lights_fx_rigd"] = true, + ["h4_prop_battle_lights_fx_rige"] = true, + ["h4_prop_battle_lights_fx_rigf"] = true, + ["h4_prop_battle_lights_fx_rigg"] = true, + ["h4_prop_battle_lights_fx_righ"] = true, + ["h4_prop_battle_lights_fx_rotator"] = true, + ["h4_prop_battle_lights_fx_support"] = true, + ["h4_prop_battle_lights_int_03_lr1"] = true, + ["h4_prop_battle_lights_int_03_lr2"] = true, + ["h4_prop_battle_lights_int_03_lr3"] = true, + ["h4_prop_battle_lights_int_03_lr4"] = true, + ["h4_prop_battle_lights_int_03_lr5"] = true, + ["h4_prop_battle_lights_int_03_lr6"] = true, + ["h4_prop_battle_lights_int_03_lr7"] = true, + ["h4_prop_battle_lights_int_03_lr8"] = true, + ["h4_prop_battle_lights_int_03_lr9"] = true, + ["h4_prop_battle_lights_stairs"] = true, + ["h4_prop_battle_lights_support"] = true, + ["h4_prop_battle_lights_tube_l_a"] = true, + ["h4_prop_battle_lights_tube_l_b"] = true, + ["h4_prop_battle_lights_wall_l_a"] = true, + ["h4_prop_battle_lights_wall_l_b"] = true, + ["h4_prop_battle_lights_wall_l_c"] = true, + ["h4_prop_battle_lights_wall_l_d"] = true, + ["h4_prop_battle_lights_wall_l_e"] = true, + ["h4_prop_battle_lights_wall_l_f"] = true, + ["h4_prop_battle_lights_workbench"] = true, + ["h4_prop_battle_mic"] = true, + ["h4_prop_battle_poster_promo_01"] = true, + ["h4_prop_battle_poster_promo_02"] = true, + ["h4_prop_battle_poster_promo_03"] = true, + ["h4_prop_battle_poster_promo_04"] = true, + ["h4_prop_battle_poster_skin_01"] = true, + ["h4_prop_battle_poster_skin_02"] = true, + ["h4_prop_battle_poster_skin_03"] = true, + ["h4_prop_battle_poster_skin_04"] = true, + ["h4_prop_battle_rotarymixer_01a"] = true, + ["h4_prop_battle_security_pad"] = true, + ["h4_prop_battle_shot_glass_01"] = true, + ["h4_prop_battle_sniffing_pipe"] = true, + ["h4_prop_battle_sports_helmet"] = true, + ["h4_prop_battle_trophy_battler"] = true, + ["h4_prop_battle_trophy_dancer"] = true, + ["h4_prop_battle_trophy_no1"] = true, + ["h4_prop_battle_vape_01"] = true, + ["h4_prop_battle_waterbottle_01a"] = true, + ["h4_prop_battle_whiskey_bottle_2_s"] = true, + ["h4_prop_battle_whiskey_bottle_s"] = true, + ["h4_prop_battle_whiskey_opaque_s"] = true, + ["h4_prop_bush_bgnvla_lrg_01"] = true, + ["h4_prop_bush_bgnvla_med_01"] = true, + ["h4_prop_bush_bgnvla_sml_01"] = true, + ["h4_prop_bush_boxwood_med_01"] = true, + ["h4_prop_bush_buddleia_low_01"] = true, + ["h4_prop_bush_buddleia_sml_01"] = true, + ["h4_prop_bush_cocaplant_01"] = true, + ["h4_prop_bush_cocaplant_01_row"] = true, + ["h4_prop_bush_ear_aa"] = true, + ["h4_prop_bush_ear_ab"] = true, + ["h4_prop_bush_fern_low_01"] = true, + ["h4_prop_bush_fern_tall_cc"] = true, + ["h4_prop_bush_mang_aa"] = true, + ["h4_prop_bush_mang_ac"] = true, + ["h4_prop_bush_mang_ad"] = true, + ["h4_prop_bush_mang_lg_aa"] = true, + ["h4_prop_bush_mang_low_aa"] = true, + ["h4_prop_bush_mang_low_ab"] = true, + ["h4_prop_bush_mang_lrg_01"] = true, + ["h4_prop_bush_mang_lrg_02"] = true, + ["h4_prop_bush_monstera_med_01"] = true, + ["h4_prop_bush_olndr_white_lrg"] = true, + ["h4_prop_bush_olndr_white_sml"] = true, + ["h4_prop_bush_rosemary_lrg_01"] = true, + ["h4_prop_bush_seagrape_low_01"] = true, + ["h4_prop_bush_wandering_aa"] = true, + ["h4_prop_casino_3cardpoker_01a"] = true, + ["h4_prop_casino_3cardpoker_01b"] = true, + ["h4_prop_casino_3cardpoker_01c"] = true, + ["h4_prop_casino_3cardpoker_01d"] = true, + ["h4_prop_casino_3cardpoker_01e"] = true, + ["h4_prop_casino_blckjack_01a"] = true, + ["h4_prop_casino_blckjack_01b"] = true, + ["h4_prop_casino_blckjack_01c"] = true, + ["h4_prop_casino_blckjack_01d"] = true, + ["h4_prop_casino_blckjack_01e"] = true, + ["h4_prop_casinoclub_lights_domed"] = true, + ["h4_prop_club_champset"] = true, + ["h4_prop_club_dimmer"] = true, + ["h4_prop_club_emis_rig_01"] = true, + ["h4_prop_club_emis_rig_02"] = true, + ["h4_prop_club_emis_rig_02b"] = true, + ["h4_prop_club_emis_rig_02c"] = true, + ["h4_prop_club_emis_rig_02d"] = true, + ["h4_prop_club_emis_rig_03"] = true, + ["h4_prop_club_emis_rig_04"] = true, + ["h4_prop_club_emis_rig_04b"] = true, + ["h4_prop_club_emis_rig_04c"] = true, + ["h4_prop_club_emis_rig_05"] = true, + ["h4_prop_club_emis_rig_06"] = true, + ["h4_prop_club_emis_rig_07"] = true, + ["h4_prop_club_emis_rig_08"] = true, + ["h4_prop_club_emis_rig_09"] = true, + ["h4_prop_club_emis_rig_10"] = true, + ["h4_prop_club_emis_rig_10_shad"] = true, + ["h4_prop_club_glass_opaque"] = true, + ["h4_prop_club_glass_trans"] = true, + ["h4_prop_club_laptop_dj"] = true, + ["h4_prop_club_laptop_dj_02"] = true, + ["h4_prop_club_screens_01"] = true, + ["h4_prop_club_screens_02"] = true, + ["h4_prop_club_smoke_machine"] = true, + ["h4_prop_club_tonic_bottle"] = true, + ["h4_prop_club_tonic_can"] = true, + ["h4_prop_club_water_bottle"] = true, + ["h4_prop_door_club_edgy_generic"] = true, + ["h4_prop_door_club_edgy_wc"] = true, + ["h4_prop_door_club_entrance"] = true, + ["h4_prop_door_club_generic_vip"] = true, + ["h4_prop_door_club_glam_generic"] = true, + ["h4_prop_door_club_glam_wc"] = true, + ["h4_prop_door_club_glass"] = true, + ["h4_prop_door_club_glass_opaque"] = true, + ["h4_prop_door_club_trad_generic"] = true, + ["h4_prop_door_club_trad_wc"] = true, + ["h4_prop_door_elevator_1l"] = true, + ["h4_prop_door_elevator_1r"] = true, + ["h4_prop_door_gun_safe"] = true, + ["h4_prop_door_safe"] = true, + ["h4_prop_door_safe_01"] = true, + ["h4_prop_door_safe_02"] = true, + ["h4_prop_glass_front_office"] = true, + ["h4_prop_glass_front_office_opaque"] = true, + ["h4_prop_glass_garage"] = true, + ["h4_prop_glass_garage_opaque"] = true, + ["h4_prop_glass_rear_office"] = true, + ["h4_prop_glass_rear_opaque"] = true, + ["h4_prop_grass_med_01"] = true, + ["h4_prop_grass_tropical_lush_01"] = true, + ["h4_prop_grass_wiregrass_01"] = true, + ["h4_prop_h4_air_bigradar"] = true, + ["h4_prop_h4_airmissile_01a"] = true, + ["h4_prop_h4_ante_off_01a"] = true, + ["h4_prop_h4_ante_on_01a"] = true, + ["h4_prop_h4_art_pant_01a"] = true, + ["h4_prop_h4_bag_cutter_01a"] = true, + ["h4_prop_h4_bag_djlp_01a"] = true, + ["h4_prop_h4_bag_hook_01a"] = true, + ["h4_prop_h4_barrel_01a"] = true, + ["h4_prop_h4_barrel_pile_01a"] = true, + ["h4_prop_h4_barrel_pile_02a"] = true, + ["h4_prop_h4_barstool_01a"] = true, + ["h4_prop_h4_big_bag_01a"] = true, + ["h4_prop_h4_big_bag_02a"] = true, + ["h4_prop_h4_board_01a"] = true, + ["h4_prop_h4_bolt_cutter_01a"] = true, + ["h4_prop_h4_box_ammo_01a"] = true, + ["h4_prop_h4_box_ammo_01b"] = true, + ["h4_prop_h4_box_ammo_02a"] = true, + ["h4_prop_h4_box_ammo03a"] = true, + ["h4_prop_h4_box_delivery_01a"] = true, + ["h4_prop_h4_box_delivery_01b"] = true, + ["h4_prop_h4_boxpile_01a"] = true, + ["h4_prop_h4_boxpile_01b"] = true, + ["h4_prop_h4_bracelet_01a"] = true, + ["h4_prop_h4_camera_01"] = true, + ["h4_prop_h4_can_beer_01a"] = true, + ["h4_prop_h4_card_hack_01a"] = true, + ["h4_prop_h4_case_supp_01a"] = true, + ["h4_prop_h4_cash_bag_01a"] = true, + ["h4_prop_h4_cash_bon_01a"] = true, + ["h4_prop_h4_cash_stack_01a"] = true, + ["h4_prop_h4_cash_stack_02a"] = true, + ["h4_prop_h4_casino_button_01a"] = true, + ["h4_prop_h4_casino_button_01b"] = true, + ["h4_prop_h4_caviar_spoon_01a"] = true, + ["h4_prop_h4_caviar_tin_01a"] = true, + ["h4_prop_h4_cctv_pole_04"] = true, + ["h4_prop_h4_chain_lock_01a"] = true, + ["h4_prop_h4_chair_01a"] = true, + ["h4_prop_h4_chair_02a"] = true, + ["h4_prop_h4_chair_03a"] = true, + ["h4_prop_h4_champ_tray_01a"] = true, + ["h4_prop_h4_champ_tray_01b"] = true, + ["h4_prop_h4_champ_tray_01c"] = true, + ["h4_prop_h4_chest_01a"] = true, + ["h4_prop_h4_chest_01a_land"] = true, + ["h4_prop_h4_chest_01a_uw"] = true, + ["h4_prop_h4_codes_01a"] = true, + ["h4_prop_h4_coke_bottle_01a"] = true, + ["h4_prop_h4_coke_bottle_02a"] = true, + ["h4_prop_h4_coke_metalbowl_01"] = true, + ["h4_prop_h4_coke_metalbowl_03"] = true, + ["h4_prop_h4_coke_mixtube_02"] = true, + ["h4_prop_h4_coke_mixtube_03"] = true, + ["h4_prop_h4_coke_mortalpestle"] = true, + ["h4_prop_h4_coke_plasticbowl_01"] = true, + ["h4_prop_h4_coke_powderbottle_01"] = true, + ["h4_prop_h4_coke_scale_01"] = true, + ["h4_prop_h4_coke_scale_02"] = true, + ["h4_prop_h4_coke_scale_03"] = true, + ["h4_prop_h4_coke_spatula_01"] = true, + ["h4_prop_h4_coke_spatula_02"] = true, + ["h4_prop_h4_coke_spatula_03"] = true, + ["h4_prop_h4_coke_spatula_04"] = true, + ["h4_prop_h4_coke_spoon_01"] = true, + ["h4_prop_h4_coke_stack_01a"] = true, + ["h4_prop_h4_coke_tablepowder"] = true, + ["h4_prop_h4_coke_testtubes"] = true, + ["h4_prop_h4_coke_tube_01"] = true, + ["h4_prop_h4_coke_tube_02"] = true, + ["h4_prop_h4_coke_tube_03"] = true, + ["h4_prop_h4_console_01a"] = true, + ["h4_prop_h4_couch_01a"] = true, + ["h4_prop_h4_crate_cloth_01a"] = true, + ["h4_prop_h4_crates_full_01a"] = true, + ["h4_prop_h4_cutter_01a"] = true, + ["h4_prop_h4_diamond_01a"] = true, + ["h4_prop_h4_diamond_disp_01a"] = true, + ["h4_prop_h4_dj_t_wires_01a"] = true, + ["h4_prop_h4_dj_wires_01a"] = true, + ["h4_prop_h4_dj_wires_tale_01a"] = true, + ["h4_prop_h4_door_01a"] = true, + ["h4_prop_h4_door_03a"] = true, + ["h4_prop_h4_elecbox_01a"] = true, + ["h4_prop_h4_engine_fusebox_01a"] = true, + ["h4_prop_h4_exp_device_01a"] = true, + ["h4_prop_h4_fence_arches_x2_01a"] = true, + ["h4_prop_h4_fence_arches_x3_01a"] = true, + ["h4_prop_h4_fence_seg_x1_01a"] = true, + ["h4_prop_h4_fence_seg_x3_01a"] = true, + ["h4_prop_h4_fence_seg_x5_01a"] = true, + ["h4_prop_h4_file_cylinder_01a"] = true, + ["h4_prop_h4_files_paper_01a"] = true, + ["h4_prop_h4_files_paper_01b"] = true, + ["h4_prop_h4_fingerkeypad_01a"] = true, + ["h4_prop_h4_fingerkeypad_01b"] = true, + ["h4_prop_h4_firepit_rocks_01a"] = true, + ["h4_prop_h4_fuse_box_01a"] = true, + ["h4_prop_h4_garage_door_01a"] = true, + ["h4_prop_h4_gascutter_01a"] = true, + ["h4_prop_h4_gate_02a"] = true, + ["h4_prop_h4_gate_03a"] = true, + ["h4_prop_h4_gate_04a"] = true, + ["h4_prop_h4_gate_05a"] = true, + ["h4_prop_h4_gate_l_01a"] = true, + ["h4_prop_h4_gate_l_03a"] = true, + ["h4_prop_h4_gate_r_01a"] = true, + ["h4_prop_h4_gate_r_03a"] = true, + ["h4_prop_h4_glass_cut_01a"] = true, + ["h4_prop_h4_glass_disp_01a"] = true, + ["h4_prop_h4_glass_disp_01b"] = true, + ["h4_prop_h4_gold_coin_01a"] = true, + ["h4_prop_h4_gold_pile_01a"] = true, + ["h4_prop_h4_gold_stack_01a"] = true, + ["h4_prop_h4_hatch_01a"] = true, + ["h4_prop_h4_hatch_tower_01a"] = true, + ["h4_prop_h4_ilev_roc_door2"] = true, + ["h4_prop_h4_isl_speaker_01a"] = true, + ["h4_prop_h4_jammer_01a"] = true, + ["h4_prop_h4_key_desk_01"] = true, + ["h4_prop_h4_keys_jail_01a"] = true, + ["h4_prop_h4_laptop_01a"] = true, + ["h4_prop_h4_ld_bomb_01a"] = true, + ["h4_prop_h4_ld_bomb_02a"] = true, + ["h4_prop_h4_ld_keypad_01"] = true, + ["h4_prop_h4_ld_keypad_01b"] = true, + ["h4_prop_h4_ld_keypad_01c"] = true, + ["h4_prop_h4_ld_keypad_01d"] = true, + ["h4_prop_h4_lever_box_01a"] = true, + ["h4_prop_h4_lime_01a"] = true, + ["h4_prop_h4_loch_monster"] = true, + ["h4_prop_h4_lp_01a"] = true, + ["h4_prop_h4_lp_01b"] = true, + ["h4_prop_h4_lp_02a"] = true, + ["h4_prop_h4_lrggate_01_l"] = true, + ["h4_prop_h4_lrggate_01_pst"] = true, + ["h4_prop_h4_lrggate_01_r"] = true, + ["h4_prop_h4_luggage_01a"] = true, + ["h4_prop_h4_luggage_02a"] = true, + ["h4_prop_h4_map_door_01"] = true, + ["h4_prop_h4_mb_crate_01a"] = true, + ["h4_prop_h4_med_bag_01b"] = true, + ["h4_prop_h4_mic_dj_01a"] = true, + ["h4_prop_h4_michael_backpack"] = true, + ["h4_prop_h4_mil_crate_02"] = true, + ["h4_prop_h4_mine_01a"] = true, + ["h4_prop_h4_mine_02a"] = true, + ["h4_prop_h4_mine_03a"] = true, + ["h4_prop_h4_neck_disp_01a"] = true, + ["h4_prop_h4_necklace_01a"] = true, + ["h4_prop_h4_npc_phone"] = true, + ["h4_prop_h4_p_boat_01a"] = true, + ["h4_prop_h4_painting_01a"] = true, + ["h4_prop_h4_painting_01b"] = true, + ["h4_prop_h4_painting_01c"] = true, + ["h4_prop_h4_painting_01d"] = true, + ["h4_prop_h4_painting_01e"] = true, + ["h4_prop_h4_painting_01f"] = true, + ["h4_prop_h4_painting_01g"] = true, + ["h4_prop_h4_painting_01h"] = true, + ["h4_prop_h4_photo_01a"] = true, + ["h4_prop_h4_photo_fire_01a"] = true, + ["h4_prop_h4_photo_fire_01b"] = true, + ["h4_prop_h4_pile_letters_01a"] = true, + ["h4_prop_h4_pillow_01a"] = true, + ["h4_prop_h4_pillow_02a"] = true, + ["h4_prop_h4_pillow_03a"] = true, + ["h4_prop_h4_plate_wall_01a"] = true, + ["h4_prop_h4_plate_wall_02a"] = true, + ["h4_prop_h4_plate_wall_03a"] = true, + ["h4_prop_h4_pot_01a"] = true, + ["h4_prop_h4_pot_01b"] = true, + ["h4_prop_h4_pot_01c"] = true, + ["h4_prop_h4_pot_01d"] = true, + ["h4_prop_h4_pouch_01a"] = true, + ["h4_prop_h4_powdercleaner_01a"] = true, + ["h4_prop_h4_pumpshotgunh4"] = true, + ["h4_prop_h4_rope_hook_01a"] = true, + ["h4_prop_h4_rowboat_01a"] = true, + ["h4_prop_h4_safe_01a"] = true, + ["h4_prop_h4_safe_01b"] = true, + ["h4_prop_h4_saltshaker_01a"] = true, + ["h4_prop_h4_sam_turret_01a"] = true, + ["h4_prop_h4_sec_barrier_ld_01a"] = true, + ["h4_prop_h4_sec_cabinet_dum"] = true, + ["h4_prop_h4_securitycard_01a"] = true, + ["h4_prop_h4_sign_cctv_01a"] = true, + ["h4_prop_h4_sign_vip_01a"] = true, + ["h4_prop_h4_sluce_gate_l_01a"] = true, + ["h4_prop_h4_sluce_gate_r_01a"] = true, + ["h4_prop_h4_stool_01a"] = true, + ["h4_prop_h4_sub_kos"] = true, + ["h4_prop_h4_sub_kos_extra"] = true, + ["h4_prop_h4_t_bottle_01a"] = true, + ["h4_prop_h4_t_bottle_02a"] = true, + ["h4_prop_h4_t_bottle_02b"] = true, + ["h4_prop_h4_table_01a"] = true, + ["h4_prop_h4_table_01b"] = true, + ["h4_prop_h4_table_07"] = true, + ["h4_prop_h4_table_isl_01a"] = true, + ["h4_prop_h4_tannoy_01a"] = true, + ["h4_prop_h4_tool_box_01a"] = true, + ["h4_prop_h4_tool_box_01b"] = true, + ["h4_prop_h4_tool_box_02"] = true, + ["h4_prop_h4_tray_01a"] = true, + ["h4_prop_h4_turntable_01a"] = true, + ["h4_prop_h4_valet_01a"] = true, + ["h4_prop_h4_weed_bud_02b"] = true, + ["h4_prop_h4_weed_chair_01a"] = true, + ["h4_prop_h4_weed_dry_01a"] = true, + ["h4_prop_h4_weed_stack_01a"] = true, + ["h4_prop_h4_wheel_nimbus"] = true, + ["h4_prop_h4_wheel_nimbus_f"] = true, + ["h4_prop_h4_wheel_velum2"] = true, + ["h4_prop_h4_win_blind_01a"] = true, + ["h4_prop_h4_win_blind_02a"] = true, + ["h4_prop_h4_win_blind_03a"] = true, + ["h4_prop_int_edgy_stool"] = true, + ["h4_prop_int_edgy_table_01"] = true, + ["h4_prop_int_edgy_table_02"] = true, + ["h4_prop_int_glam_stool"] = true, + ["h4_prop_int_glam_table"] = true, + ["h4_prop_int_plants_01a"] = true, + ["h4_prop_int_plants_01b"] = true, + ["h4_prop_int_plants_01c"] = true, + ["h4_prop_int_plants_02"] = true, + ["h4_prop_int_plants_03"] = true, + ["h4_prop_int_plants_04"] = true, + ["h4_prop_int_stool_low"] = true, + ["h4_prop_int_trad_table"] = true, + ["h4_prop_office_desk_01"] = true, + ["h4_prop_office_elevator_door_01"] = true, + ["h4_prop_office_elevator_door_02"] = true, + ["h4_prop_office_painting_01a"] = true, + ["h4_prop_office_painting_01b"] = true, + ["h4_prop_palmeto_sap_aa"] = true, + ["h4_prop_palmeto_sap_ab"] = true, + ["h4_prop_palmeto_sap_ac"] = true, + ["h4_prop_rock_lrg_01"] = true, + ["h4_prop_rock_lrg_02"] = true, + ["h4_prop_rock_lrg_03"] = true, + ["h4_prop_rock_lrg_04"] = true, + ["h4_prop_rock_lrg_05"] = true, + ["h4_prop_rock_lrg_06"] = true, + ["h4_prop_rock_lrg_07"] = true, + ["h4_prop_rock_lrg_08"] = true, + ["h4_prop_rock_lrg_09"] = true, + ["h4_prop_rock_lrg_10"] = true, + ["h4_prop_rock_lrg_11"] = true, + ["h4_prop_rock_lrg_12"] = true, + ["h4_prop_rock_med_01"] = true, + ["h4_prop_rock_med_02"] = true, + ["h4_prop_rock_med_03"] = true, + ["h4_prop_rock_scree_med_01"] = true, + ["h4_prop_rock_scree_med_02"] = true, + ["h4_prop_rock_scree_med_03"] = true, + ["h4_prop_rock_scree_small_01"] = true, + ["h4_prop_rock_scree_small_02"] = true, + ["h4_prop_rock_scree_small_03"] = true, + ["h4_prop_screen_bottom_sonar"] = true, + ["h4_prop_screen_btm_missile_active"] = true, + ["h4_prop_screen_btm_missile_ready"] = true, + ["h4_prop_screen_btm_missile_reload"] = true, + ["h4_prop_screen_btm_offline"] = true, + ["h4_prop_screen_top_missile_active"] = true, + ["h4_prop_screen_top_missile_ready"] = true, + ["h4_prop_screen_top_sonar"] = true, + ["h4_prop_sign_galaxy"] = true, + ["h4_prop_sign_gefangnis"] = true, + ["h4_prop_sign_maison"] = true, + ["h4_prop_sign_omega"] = true, + ["h4_prop_sign_omega_02"] = true, + ["h4_prop_sign_palace"] = true, + ["h4_prop_sign_paradise"] = true, + ["h4_prop_sign_studio"] = true, + ["h4_prop_sign_technologie"] = true, + ["h4_prop_sign_tonys"] = true, + ["h4_prop_sub_lift_platfom"] = true, + ["h4_prop_sub_pool_hatch_l_01a"] = true, + ["h4_prop_sub_pool_hatch_l_02a"] = true, + ["h4_prop_sub_pool_hatch_r_01a"] = true, + ["h4_prop_sub_pool_hatch_r_02a"] = true, + ["h4_prop_sub_screen_top_offline"] = true, + ["h4_prop_tree_banana_med_01"] = true, + ["h4_prop_tree_beech_lrg_if_01"] = true, + ["h4_prop_tree_blk_mgrv_lrg_01"] = true, + ["h4_prop_tree_blk_mgrv_lrg_02"] = true, + ["h4_prop_tree_blk_mgrv_med_01"] = true, + ["h4_prop_tree_dracaena_lrg_01"] = true, + ["h4_prop_tree_dracaena_sml_01"] = true, + ["h4_prop_tree_frangipani_lrg_01"] = true, + ["h4_prop_tree_frangipani_med_01"] = true, + ["h4_prop_tree_palm_areca_sap_02"] = true, + ["h4_prop_tree_palm_areca_sap_03"] = true, + ["h4_prop_tree_palm_fan_bea_03b"] = true, + ["h4_prop_tree_palm_thatch_01"] = true, + ["h4_prop_tree_palm_trvlr_03"] = true, + ["h4_prop_tree_umbrella_med_01"] = true, + ["h4_prop_tree_umbrella_sml_01"] = true, + ["h4_prop_tumbler_01"] = true, + ["h4_prop_weed_01_plant"] = true, + ["h4_prop_weed_01_row"] = true, + ["h4_prop_weed_groundcover_01"] = true, + ["h4_prop_x17_sub"] = true, + ["h4_prop_x17_sub_al_lamp_off"] = true, + ["h4_prop_x17_sub_al_lamp_on"] = true, + ["h4_prop_x17_sub_alarm_lamp"] = true, + ["h4_prop_x17_sub_extra"] = true, + ["h4_prop_x17_sub_lampa_large_blue"] = true, + ["h4_prop_x17_sub_lampa_large_white"] = true, + ["h4_prop_x17_sub_lampa_large_yel"] = true, + ["h4_prop_x17_sub_lampa_small_blue"] = true, + ["h4_prop_x17_sub_lampa_small_white"] = true, + ["h4_prop_x17_sub_lampa_small_yel"] = true, + ["h4_prop_yacht_glass_01"] = true, + ["h4_prop_yacht_glass_02"] = true, + ["h4_prop_yacht_glass_03"] = true, + ["h4_prop_yacht_glass_04"] = true, + ["h4_prop_yacht_glass_05"] = true, + ["h4_prop_yacht_glass_06"] = true, + ["h4_prop_yacht_glass_07"] = true, + ["h4_prop_yacht_glass_08"] = true, + ["h4_prop_yacht_glass_09"] = true, + ["h4_prop_yacht_glass_10"] = true, + ["h4_prop_yacht_showerdoor"] = true, + ["h4_rig_dj_01_lights_01_a"] = true, + ["h4_rig_dj_01_lights_01_b"] = true, + ["h4_rig_dj_01_lights_01_c"] = true, + ["h4_rig_dj_01_lights_02_a"] = true, + ["h4_rig_dj_01_lights_02_b"] = true, + ["h4_rig_dj_01_lights_02_c"] = true, + ["h4_rig_dj_01_lights_03_a"] = true, + ["h4_rig_dj_01_lights_03_b"] = true, + ["h4_rig_dj_01_lights_03_c"] = true, + ["h4_rig_dj_01_lights_04_a"] = true, + ["h4_rig_dj_01_lights_04_a_scr"] = true, + ["h4_rig_dj_01_lights_04_b"] = true, + ["h4_rig_dj_01_lights_04_b_scr"] = true, + ["h4_rig_dj_01_lights_04_c"] = true, + ["h4_rig_dj_01_lights_04_c_scr"] = true, + ["h4_rig_dj_02_lights_01_a"] = true, + ["h4_rig_dj_02_lights_01_b"] = true, + ["h4_rig_dj_02_lights_01_c"] = true, + ["h4_rig_dj_02_lights_02_a"] = true, + ["h4_rig_dj_02_lights_02_b"] = true, + ["h4_rig_dj_02_lights_02_c"] = true, + ["h4_rig_dj_02_lights_03_a"] = true, + ["h4_rig_dj_02_lights_03_b"] = true, + ["h4_rig_dj_02_lights_03_c"] = true, + ["h4_rig_dj_02_lights_04_a"] = true, + ["h4_rig_dj_02_lights_04_a_scr"] = true, + ["h4_rig_dj_02_lights_04_b"] = true, + ["h4_rig_dj_02_lights_04_b_scr"] = true, + ["h4_rig_dj_02_lights_04_c"] = true, + ["h4_rig_dj_02_lights_04_c_scr"] = true, + ["h4_rig_dj_03_lights_01_a"] = true, + ["h4_rig_dj_03_lights_01_b"] = true, + ["h4_rig_dj_03_lights_01_c"] = true, + ["h4_rig_dj_03_lights_02_a"] = true, + ["h4_rig_dj_03_lights_02_b"] = true, + ["h4_rig_dj_03_lights_02_c"] = true, + ["h4_rig_dj_03_lights_03_a"] = true, + ["h4_rig_dj_03_lights_03_b"] = true, + ["h4_rig_dj_03_lights_03_c"] = true, + ["h4_rig_dj_03_lights_04_a"] = true, + ["h4_rig_dj_03_lights_04_a_scr"] = true, + ["h4_rig_dj_03_lights_04_b"] = true, + ["h4_rig_dj_03_lights_04_b_scr"] = true, + ["h4_rig_dj_03_lights_04_c"] = true, + ["h4_rig_dj_03_lights_04_c_scr"] = true, + ["h4_rig_dj_04_lights_01_a"] = true, + ["h4_rig_dj_04_lights_01_b"] = true, + ["h4_rig_dj_04_lights_01_c"] = true, + ["h4_rig_dj_04_lights_02_a"] = true, + ["h4_rig_dj_04_lights_02_b"] = true, + ["h4_rig_dj_04_lights_02_c"] = true, + ["h4_rig_dj_04_lights_03_a"] = true, + ["h4_rig_dj_04_lights_03_b"] = true, + ["h4_rig_dj_04_lights_03_c"] = true, + ["h4_rig_dj_04_lights_04_a"] = true, + ["h4_rig_dj_04_lights_04_a_scr"] = true, + ["h4_rig_dj_04_lights_04_b"] = true, + ["h4_rig_dj_04_lights_04_b_scr"] = true, + ["h4_rig_dj_04_lights_04_c"] = true, + ["h4_rig_dj_04_lights_04_c_scr"] = true, + ["h4_rig_dj_all_lights_01_off"] = true, + ["h4_rig_dj_all_lights_02_off"] = true, + ["h4_rig_dj_all_lights_03_off"] = true, + ["h4_rig_dj_all_lights_04_off"] = true, + ["hei_bank_heist_bag"] = true, + ["hei_bank_heist_bikehelmet"] = true, + ["hei_bank_heist_card"] = true, + ["hei_bank_heist_gear"] = true, + ["hei_bank_heist_guns"] = true, + ["hei_bank_heist_laptop"] = true, + ["hei_bank_heist_motherboard"] = true, + ["hei_bank_heist_thermal"] = true, + ["hei_bio_heist_card"] = true, + ["hei_bio_heist_gear"] = true, + ["hei_bio_heist_nv_goggles"] = true, + ["hei_bio_heist_parachute"] = true, + ["hei_bio_heist_rebreather"] = true, + ["hei_bio_heist_specialops"] = true, + ["hei_dt1_03_mph_door_01"] = true, + ["hei_heist_acc_artgolddisc_01"] = true, + ["hei_heist_acc_artgolddisc_02"] = true, + ["hei_heist_acc_artgolddisc_03"] = true, + ["hei_heist_acc_artgolddisc_04"] = true, + ["hei_heist_acc_artwalll_01"] = true, + ["hei_heist_acc_artwallm_01"] = true, + ["hei_heist_acc_bowl_01"] = true, + ["hei_heist_acc_bowl_02"] = true, + ["hei_heist_acc_box_trinket_01"] = true, + ["hei_heist_acc_box_trinket_02"] = true, + ["hei_heist_acc_candles_01"] = true, + ["hei_heist_acc_flowers_01"] = true, + ["hei_heist_acc_flowers_02"] = true, + ["hei_heist_acc_jar_01"] = true, + ["hei_heist_acc_jar_02"] = true, + ["hei_heist_acc_plant_tall_01"] = true, + ["hei_heist_acc_rughidel_01"] = true, + ["hei_heist_acc_rugwooll_01"] = true, + ["hei_heist_acc_rugwooll_02"] = true, + ["hei_heist_acc_rugwooll_03"] = true, + ["hei_heist_acc_sculpture_01"] = true, + ["hei_heist_acc_storebox_01"] = true, + ["hei_heist_acc_tray_01"] = true, + ["hei_heist_acc_vase_01"] = true, + ["hei_heist_acc_vase_02"] = true, + ["hei_heist_acc_vase_03"] = true, + ["hei_heist_apart2_door"] = true, + ["hei_heist_bank_usb_drive"] = true, + ["hei_heist_bed_chestdrawer_04"] = true, + ["hei_heist_bed_double_08"] = true, + ["hei_heist_bed_table_dble_04"] = true, + ["hei_heist_crosstrainer_s"] = true, + ["hei_heist_cs_beer_box"] = true, + ["hei_heist_din_chair_01"] = true, + ["hei_heist_din_chair_02"] = true, + ["hei_heist_din_chair_03"] = true, + ["hei_heist_din_chair_04"] = true, + ["hei_heist_din_chair_05"] = true, + ["hei_heist_din_chair_06"] = true, + ["hei_heist_din_chair_08"] = true, + ["hei_heist_din_chair_09"] = true, + ["hei_heist_din_table_01"] = true, + ["hei_heist_din_table_04"] = true, + ["hei_heist_din_table_06"] = true, + ["hei_heist_din_table_07"] = true, + ["hei_heist_flecca_crate"] = true, + ["hei_heist_flecca_items"] = true, + ["hei_heist_flecca_weapons"] = true, + ["hei_heist_kit_bin_01"] = true, + ["hei_heist_kit_coffeemachine_01"] = true, + ["hei_heist_lit_floorlamp_01"] = true, + ["hei_heist_lit_floorlamp_02"] = true, + ["hei_heist_lit_floorlamp_03"] = true, + ["hei_heist_lit_floorlamp_04"] = true, + ["hei_heist_lit_floorlamp_05"] = true, + ["hei_heist_lit_lamptable_02"] = true, + ["hei_heist_lit_lamptable_03"] = true, + ["hei_heist_lit_lamptable_04"] = true, + ["hei_heist_lit_lamptable_06"] = true, + ["hei_heist_lit_lightpendant_003"] = true, + ["hei_heist_lit_lightpendant_01"] = true, + ["hei_heist_lit_lightpendant_02"] = true, + ["hei_heist_sh_bong_01"] = true, + ["hei_heist_stn_benchshort"] = true, + ["hei_heist_stn_chairarm_01"] = true, + ["hei_heist_stn_chairarm_03"] = true, + ["hei_heist_stn_chairarm_04"] = true, + ["hei_heist_stn_chairarm_06"] = true, + ["hei_heist_stn_chairstrip_01"] = true, + ["hei_heist_stn_sofa2seat_02"] = true, + ["hei_heist_stn_sofa2seat_03"] = true, + ["hei_heist_stn_sofa2seat_06"] = true, + ["hei_heist_stn_sofa3seat_01"] = true, + ["hei_heist_stn_sofa3seat_02"] = true, + ["hei_heist_stn_sofa3seat_06"] = true, + ["hei_heist_stn_sofacorn_05"] = true, + ["hei_heist_stn_sofacorn_06"] = true, + ["hei_heist_str_avunitl_01"] = true, + ["hei_heist_str_avunitl_03"] = true, + ["hei_heist_str_avunits_01"] = true, + ["hei_heist_str_sideboardl_02"] = true, + ["hei_heist_str_sideboardl_03"] = true, + ["hei_heist_str_sideboardl_04"] = true, + ["hei_heist_str_sideboardl_05"] = true, + ["hei_heist_str_sideboards_02"] = true, + ["hei_heist_tab_coffee_05"] = true, + ["hei_heist_tab_coffee_06"] = true, + ["hei_heist_tab_coffee_07"] = true, + ["hei_heist_tab_sidelrg_01"] = true, + ["hei_heist_tab_sidelrg_02"] = true, + ["hei_heist_tab_sidelrg_04"] = true, + ["hei_heist_tab_sidesml_01"] = true, + ["hei_heist_tab_sidesml_02"] = true, + ["hei_kt1_05_01"] = true, + ["hei_kt1_05_01_shadowsun"] = true, + ["hei_kt1_05_props_heli_slod"] = true, + ["hei_kt1_08_bld"] = true, + ["hei_kt1_08_buildingtop_a"] = true, + ["hei_kt1_08_fizzd_01"] = true, + ["hei_kt1_08_kt1_emissive_ema"] = true, + ["hei_kt1_08_props_combo_slod"] = true, + ["hei_kt1_08_shadowsun_mesh"] = true, + ["hei_kt1_08_slod_shell"] = true, + ["hei_kt1_08_slod_shell_emissive"] = true, + ["hei_mph_selectclothslrig"] = true, + ["hei_mph_selectclothslrig_01"] = true, + ["hei_mph_selectclothslrig_02"] = true, + ["hei_mph_selectclothslrig_03"] = true, + ["hei_mph_selectclothslrig_04"] = true, + ["hei_p_attache_case_01b_s"] = true, + ["hei_p_attache_case_shut"] = true, + ["hei_p_attache_case_shut_s"] = true, + ["hei_p_f_bag_var20_arm_s"] = true, + ["hei_p_f_bag_var6_bus_s"] = true, + ["hei_p_f_bag_var7_bus_s"] = true, + ["hei_p_generic_heist_guns"] = true, + ["hei_p_hei_champ_flute_s"] = true, + ["hei_p_heist_flecca_bag"] = true, + ["hei_p_heist_flecca_drill"] = true, + ["hei_p_heist_flecca_mask"] = true, + ["hei_p_m_bag_var18_bus_s"] = true, + ["hei_p_m_bag_var22_arm_s"] = true, + ["hei_p_parachute_s_female"] = true, + ["hei_p_post_heist_biker_stash"] = true, + ["hei_p_post_heist_coke_stash"] = true, + ["hei_p_post_heist_meth_stash"] = true, + ["hei_p_post_heist_trash_stash"] = true, + ["hei_p_post_heist_weed_stash"] = true, + ["hei_p_pre_heist_biker"] = true, + ["hei_p_pre_heist_biker_guns"] = true, + ["hei_p_pre_heist_coke"] = true, + ["hei_p_pre_heist_steal_meth"] = true, + ["hei_p_pre_heist_trash"] = true, + ["hei_p_pre_heist_weed"] = true, + ["hei_prison_heist_clothes"] = true, + ["hei_prison_heist_docs"] = true, + ["hei_prison_heist_jerry_can"] = true, + ["hei_prison_heist_parachute"] = true, + ["hei_prison_heist_schedule"] = true, + ["hei_prison_heist_weapons"] = true, + ["hei_prop_bank_alarm_01"] = true, + ["hei_prop_bank_cctv_01"] = true, + ["hei_prop_bank_cctv_02"] = true, + ["hei_prop_bank_ornatelamp"] = true, + ["hei_prop_bank_plug"] = true, + ["hei_prop_bank_transponder"] = true, + ["hei_prop_bh1_08_hdoor"] = true, + ["hei_prop_bh1_08_mp_gar2"] = true, + ["hei_prop_bh1_09_mp_gar2"] = true, + ["hei_prop_bh1_09_mph_l"] = true, + ["hei_prop_bh1_09_mph_r"] = true, + ["hei_prop_carrier_aerial_1"] = true, + ["hei_prop_carrier_aerial_2"] = true, + ["hei_prop_carrier_bombs_1"] = true, + ["hei_prop_carrier_cargo_01a"] = true, + ["hei_prop_carrier_cargo_02a"] = true, + ["hei_prop_carrier_cargo_03a"] = true, + ["hei_prop_carrier_cargo_04a"] = true, + ["hei_prop_carrier_cargo_04b"] = true, + ["hei_prop_carrier_cargo_04b_s"] = true, + ["hei_prop_carrier_cargo_04c"] = true, + ["hei_prop_carrier_cargo_05a"] = true, + ["hei_prop_carrier_cargo_05a_s"] = true, + ["hei_prop_carrier_cargo_05b"] = true, + ["hei_prop_carrier_cargo_05b_s"] = true, + ["hei_prop_carrier_crate_01a"] = true, + ["hei_prop_carrier_crate_01a_s"] = true, + ["hei_prop_carrier_crate_01b"] = true, + ["hei_prop_carrier_crate_01b_s"] = true, + ["hei_prop_carrier_defense_01"] = true, + ["hei_prop_carrier_defense_02"] = true, + ["hei_prop_carrier_docklight_01"] = true, + ["hei_prop_carrier_docklight_02"] = true, + ["hei_prop_carrier_gasbogey_01"] = true, + ["hei_prop_carrier_jet"] = true, + ["hei_prop_carrier_liferafts"] = true, + ["hei_prop_carrier_light_01"] = true, + ["hei_prop_carrier_lightset_1"] = true, + ["hei_prop_carrier_ord_01"] = true, + ["hei_prop_carrier_ord_03"] = true, + ["hei_prop_carrier_panel_1"] = true, + ["hei_prop_carrier_panel_2"] = true, + ["hei_prop_carrier_panel_3"] = true, + ["hei_prop_carrier_panel_4"] = true, + ["hei_prop_carrier_phone_01"] = true, + ["hei_prop_carrier_phone_02"] = true, + ["hei_prop_carrier_radar_1"] = true, + ["hei_prop_carrier_radar_1_l1"] = true, + ["hei_prop_carrier_radar_2"] = true, + ["hei_prop_carrier_stair_01a"] = true, + ["hei_prop_carrier_stair_01b"] = true, + ["hei_prop_carrier_trailer_01"] = true, + ["hei_prop_cash_crate_empty"] = true, + ["hei_prop_cash_crate_half_full"] = true, + ["hei_prop_cc_metalcover_01"] = true, + ["hei_prop_cntrdoor_mph_l"] = true, + ["hei_prop_cntrdoor_mph_r"] = true, + ["hei_prop_com_mp_gar2"] = true, + ["hei_prop_container_lock"] = true, + ["hei_prop_crate_stack_01"] = true, + ["hei_prop_dlc_heist_board"] = true, + ["hei_prop_dlc_heist_map"] = true, + ["hei_prop_dlc_tablet"] = true, + ["hei_prop_drug_statue_01"] = true, + ["hei_prop_drug_statue_base_01"] = true, + ["hei_prop_drug_statue_base_02"] = true, + ["hei_prop_drug_statue_box_01"] = true, + ["hei_prop_drug_statue_box_01b"] = true, + ["hei_prop_drug_statue_box_big"] = true, + ["hei_prop_drug_statue_stack"] = true, + ["hei_prop_drug_statue_top"] = true, + ["hei_prop_dt1_20_mp_gar2"] = true, + ["hei_prop_dt1_20_mph_door_l"] = true, + ["hei_prop_dt1_20_mph_door_r"] = true, + ["hei_prop_gold_trolly_empty"] = true, + ["hei_prop_gold_trolly_half_full"] = true, + ["hei_prop_hei_ammo_pile"] = true, + ["hei_prop_hei_ammo_pile_02"] = true, + ["hei_prop_hei_ammo_single"] = true, + ["hei_prop_hei_bank_mon"] = true, + ["hei_prop_hei_bank_phone_01"] = true, + ["hei_prop_hei_bankdoor_new"] = true, + ["hei_prop_hei_bio_panel"] = true, + ["hei_prop_hei_bnk_lamp_01"] = true, + ["hei_prop_hei_bnk_lamp_02"] = true, + ["hei_prop_hei_bust_01"] = true, + ["hei_prop_hei_carrier_disp_01"] = true, + ["hei_prop_hei_cash_trolly_01"] = true, + ["hei_prop_hei_cash_trolly_02"] = true, + ["hei_prop_hei_cash_trolly_03"] = true, + ["hei_prop_hei_cont_light_01"] = true, + ["hei_prop_hei_cs_keyboard"] = true, + ["hei_prop_hei_cs_stape_01"] = true, + ["hei_prop_hei_cs_stape_02"] = true, + ["hei_prop_hei_drill_hole"] = true, + ["hei_prop_hei_drug_case"] = true, + ["hei_prop_hei_drug_pack_01a"] = true, + ["hei_prop_hei_drug_pack_01b"] = true, + ["hei_prop_hei_drug_pack_02"] = true, + ["hei_prop_hei_garage_plug"] = true, + ["hei_prop_hei_hose_nozzle"] = true, + ["hei_prop_hei_id_bank"] = true, + ["hei_prop_hei_id_bio"] = true, + ["hei_prop_hei_keypad_01"] = true, + ["hei_prop_hei_keypad_02"] = true, + ["hei_prop_hei_keypad_03"] = true, + ["hei_prop_hei_lflts_01"] = true, + ["hei_prop_hei_lflts_02"] = true, + ["hei_prop_hei_med_benchset1"] = true, + ["hei_prop_hei_monitor_overlay"] = true, + ["hei_prop_hei_monitor_police_01"] = true, + ["hei_prop_hei_muster_01"] = true, + ["hei_prop_hei_new_plant"] = true, + ["hei_prop_hei_paper_bag"] = true, + ["hei_prop_hei_pic_hl_gurkhas"] = true, + ["hei_prop_hei_pic_hl_keycodes"] = true, + ["hei_prop_hei_pic_hl_raid"] = true, + ["hei_prop_hei_pic_hl_valkyrie"] = true, + ["hei_prop_hei_pic_pb_break"] = true, + ["hei_prop_hei_pic_pb_bus"] = true, + ["hei_prop_hei_pic_pb_plane"] = true, + ["hei_prop_hei_pic_pb_station"] = true, + ["hei_prop_hei_pic_ps_bike"] = true, + ["hei_prop_hei_pic_ps_convoy"] = true, + ["hei_prop_hei_pic_ps_hack"] = true, + ["hei_prop_hei_pic_ps_job"] = true, + ["hei_prop_hei_pic_ps_trucks"] = true, + ["hei_prop_hei_pic_ps_witsec"] = true, + ["hei_prop_hei_pic_ub_prep"] = true, + ["hei_prop_hei_pic_ub_prep02"] = true, + ["hei_prop_hei_pic_ub_prep02b"] = true, + ["hei_prop_hei_post_note_01"] = true, + ["hei_prop_hei_security_case"] = true, + ["hei_prop_hei_securitypanel"] = true, + ["hei_prop_hei_shack_door"] = true, + ["hei_prop_hei_shack_window"] = true, + ["hei_prop_hei_skid_chair"] = true, + ["hei_prop_hei_timetable"] = true, + ["hei_prop_hei_tree_fallen_02"] = true, + ["hei_prop_hei_warehousetrolly"] = true, + ["hei_prop_hei_warehousetrolly_02"] = true, + ["hei_prop_heist_ammo_box"] = true, + ["hei_prop_heist_apecrate"] = true, + ["hei_prop_heist_binbag"] = true, + ["hei_prop_heist_box"] = true, + ["hei_prop_heist_card_hack"] = true, + ["hei_prop_heist_card_hack_02"] = true, + ["hei_prop_heist_carrierdoorl"] = true, + ["hei_prop_heist_carrierdoorr"] = true, + ["hei_prop_heist_cash_bag_01"] = true, + ["hei_prop_heist_cash_pile"] = true, + ["hei_prop_heist_cutscene_doora"] = true, + ["hei_prop_heist_cutscene_doorb"] = true, + ["hei_prop_heist_cutscene_doorc_l"] = true, + ["hei_prop_heist_cutscene_doorc_r"] = true, + ["hei_prop_heist_deposit_box"] = true, + ["hei_prop_heist_docs_01"] = true, + ["hei_prop_heist_drill"] = true, + ["hei_prop_heist_drug_tub_01"] = true, + ["hei_prop_heist_emp"] = true, + ["hei_prop_heist_gold_bar"] = true, + ["hei_prop_heist_hook_01"] = true, + ["hei_prop_heist_hose_01"] = true, + ["hei_prop_heist_lockerdoor"] = true, + ["hei_prop_heist_magnet"] = true, + ["hei_prop_heist_off_chair"] = true, + ["hei_prop_heist_overlay_01"] = true, + ["hei_prop_heist_pc_01"] = true, + ["hei_prop_heist_pic_01"] = true, + ["hei_prop_heist_pic_02"] = true, + ["hei_prop_heist_pic_03"] = true, + ["hei_prop_heist_pic_04"] = true, + ["hei_prop_heist_pic_05"] = true, + ["hei_prop_heist_pic_06"] = true, + ["hei_prop_heist_pic_07"] = true, + ["hei_prop_heist_pic_08"] = true, + ["hei_prop_heist_pic_09"] = true, + ["hei_prop_heist_pic_10"] = true, + ["hei_prop_heist_pic_11"] = true, + ["hei_prop_heist_pic_12"] = true, + ["hei_prop_heist_pic_13"] = true, + ["hei_prop_heist_pic_14"] = true, + ["hei_prop_heist_plinth"] = true, + ["hei_prop_heist_rolladex"] = true, + ["hei_prop_heist_roller"] = true, + ["hei_prop_heist_roller_base"] = true, + ["hei_prop_heist_roller_up"] = true, + ["hei_prop_heist_safedepdoor"] = true, + ["hei_prop_heist_safedeposit"] = true, + ["hei_prop_heist_sec_door"] = true, + ["hei_prop_heist_thermite"] = true, + ["hei_prop_heist_thermite_case"] = true, + ["hei_prop_heist_thermite_flash"] = true, + ["hei_prop_heist_transponder"] = true, + ["hei_prop_heist_trevor_case"] = true, + ["hei_prop_heist_tub_truck"] = true, + ["hei_prop_heist_tug"] = true, + ["hei_prop_heist_tumbler_empty"] = true, + ["hei_prop_heist_weed_block_01"] = true, + ["hei_prop_heist_weed_block_01b"] = true, + ["hei_prop_heist_weed_pallet"] = true, + ["hei_prop_heist_weed_pallet_02"] = true, + ["hei_prop_heist_wooden_box"] = true, + ["hei_prop_hst_icon_01"] = true, + ["hei_prop_hst_laptop"] = true, + ["hei_prop_hst_usb_drive"] = true, + ["hei_prop_hst_usb_drive_light"] = true, + ["hei_prop_mini_sever_01"] = true, + ["hei_prop_mini_sever_02"] = true, + ["hei_prop_mini_sever_03"] = true, + ["hei_prop_mini_sever_broken"] = true, + ["hei_prop_pill_bag_01"] = true, + ["hei_prop_server_piece_01"] = true, + ["hei_prop_server_piece_lights"] = true, + ["hei_prop_sm_14_mp_gar2"] = true, + ["hei_prop_sm_14_mph_door_l"] = true, + ["hei_prop_sm_14_mph_door_r"] = true, + ["hei_prop_ss1_mpint_garage2"] = true, + ["hei_prop_station_gate"] = true, + ["hei_prop_sync_door_06"] = true, + ["hei_prop_sync_door_08"] = true, + ["hei_prop_sync_door_09"] = true, + ["hei_prop_sync_door_10"] = true, + ["hei_prop_sync_door01a"] = true, + ["hei_prop_sync_door01b"] = true, + ["hei_prop_sync_door02a"] = true, + ["hei_prop_sync_door02b"] = true, + ["hei_prop_sync_door03"] = true, + ["hei_prop_sync_door04"] = true, + ["hei_prop_sync_door05a"] = true, + ["hei_prop_sync_door05b"] = true, + ["hei_prop_sync_door07"] = true, + ["hei_prop_wall_alarm_off"] = true, + ["hei_prop_wall_alarm_on"] = true, + ["hei_prop_wall_light_10a_cr"] = true, + ["hei_prop_yah_glass_01"] = true, + ["hei_prop_yah_glass_02"] = true, + ["hei_prop_yah_glass_03"] = true, + ["hei_prop_yah_glass_04"] = true, + ["hei_prop_yah_glass_05"] = true, + ["hei_prop_yah_glass_06"] = true, + ["hei_prop_yah_glass_07"] = true, + ["hei_prop_yah_glass_08"] = true, + ["hei_prop_yah_glass_09"] = true, + ["hei_prop_yah_glass_10"] = true, + ["hei_prop_yah_lounger"] = true, + ["hei_prop_yah_seat_01"] = true, + ["hei_prop_yah_seat_02"] = true, + ["hei_prop_yah_seat_03"] = true, + ["hei_prop_yah_table_01"] = true, + ["hei_prop_yah_table_02"] = true, + ["hei_prop_yah_table_03"] = true, + ["hei_prop_zip_tie_positioned"] = true, + ["hei_prop_zip_tie_straight"] = true, + ["hei_v_ilev_bk_gate_molten"] = true, + ["hei_v_ilev_bk_gate_pris"] = true, + ["hei_v_ilev_bk_gate2_molten"] = true, + ["hei_v_ilev_bk_gate2_pris"] = true, + ["hei_v_ilev_bk_safegate_molten"] = true, + ["hei_v_ilev_bk_safegate_pris"] = true, + ["hei_v_ilev_fh_heistdoor1"] = true, + ["hei_v_ilev_fh_heistdoor2"] = true, + ["horizonring"] = true, + ["hw1_lod_emi_6_19_slod3"] = true, + ["hw1_lod_emi_6_21_slod3"] = true, + ["hw1_lod_slod3_emi_proxy_01"] = true, + ["hw1_lod_slod3_emi_proxy_02"] = true, + ["hw1_lod_slod4"] = true, + ["icons12_prop_ic_cp_bag"] = true, + ["id1_lod_bridge_slod4"] = true, + ["id1_lod_id1_emissive_slod"] = true, + ["id1_lod_slod4"] = true, + ["id1_lod_water_slod3"] = true, + ["id2_lod_00a_proxy"] = true, + ["imp_mapmarker_cypressflats"] = true, + ["imp_mapmarker_davis"] = true, + ["imp_mapmarker_elburroheights"] = true, + ["imp_mapmarker_elysianisland"] = true, + ["imp_mapmarker_lamesa"] = true, + ["imp_mapmarker_lapuerta"] = true, + ["imp_mapmarker_lsia_01"] = true, + ["imp_mapmarker_lsia_02"] = true, + ["imp_mapmarker_murrietaheights"] = true, + ["imp_mapmarker_warehouses"] = true, + ["imp_prop_adv_hdsec"] = true, + ["imp_prop_air_compressor_01a"] = true, + ["imp_prop_axel_stand_01a"] = true, + ["imp_prop_bench_grinder_01a"] = true, + ["imp_prop_bench_vice_01a"] = true, + ["imp_prop_bomb_ball"] = true, + ["imp_prop_car_jack_01a"] = true, + ["imp_prop_covered_vehicle_01a"] = true, + ["imp_prop_covered_vehicle_02a"] = true, + ["imp_prop_covered_vehicle_03a"] = true, + ["imp_prop_covered_vehicle_04a"] = true, + ["imp_prop_covered_vehicle_05a"] = true, + ["imp_prop_covered_vehicle_06a"] = true, + ["imp_prop_covered_vehicle_07a"] = true, + ["imp_prop_drill_01a"] = true, + ["imp_prop_engine_hoist_02a"] = true, + ["imp_prop_flatbed_ramp"] = true, + ["imp_prop_grinder_01a"] = true, + ["imp_prop_groupbarrel_01"] = true, + ["imp_prop_groupbarrel_02"] = true, + ["imp_prop_groupbarrel_03"] = true, + ["imp_prop_ie_carelev01"] = true, + ["imp_prop_ie_carelev02"] = true, + ["imp_prop_impact_driver_01a"] = true, + ["imp_prop_impex_gate_01"] = true, + ["imp_prop_impex_gate_sm_13"] = true, + ["imp_prop_impex_gate_sm_15"] = true, + ["imp_prop_impexp_bblock_huge_01"] = true, + ["imp_prop_impexp_bblock_lrg1"] = true, + ["imp_prop_impexp_bblock_mdm1"] = true, + ["imp_prop_impexp_bblock_qp3"] = true, + ["imp_prop_impexp_bblock_sml1"] = true, + ["imp_prop_impexp_bblock_xl1"] = true, + ["imp_prop_impexp_bonnet_01a"] = true, + ["imp_prop_impexp_bonnet_02a"] = true, + ["imp_prop_impexp_bonnet_03a"] = true, + ["imp_prop_impexp_bonnet_04a"] = true, + ["imp_prop_impexp_bonnet_05a"] = true, + ["imp_prop_impexp_bonnet_06a"] = true, + ["imp_prop_impexp_bonnet_07a"] = true, + ["imp_prop_impexp_boxcoke_01"] = true, + ["imp_prop_impexp_boxpile_01"] = true, + ["imp_prop_impexp_boxpile_02"] = true, + ["imp_prop_impexp_boxwood_01"] = true, + ["imp_prop_impexp_brake_caliper_01a"] = true, + ["imp_prop_impexp_campbed_01"] = true, + ["imp_prop_impexp_car_door_01a"] = true, + ["imp_prop_impexp_car_door_02a"] = true, + ["imp_prop_impexp_car_door_03a"] = true, + ["imp_prop_impexp_car_door_04a"] = true, + ["imp_prop_impexp_car_door_05a"] = true, + ["imp_prop_impexp_car_panel_01a"] = true, + ["imp_prop_impexp_cargo_01"] = true, + ["imp_prop_impexp_carrack"] = true, + ["imp_prop_impexp_clamp_01"] = true, + ["imp_prop_impexp_clamp_02"] = true, + ["imp_prop_impexp_coke_pile"] = true, + ["imp_prop_impexp_coke_trolly"] = true, + ["imp_prop_impexp_diff_01"] = true, + ["imp_prop_impexp_differential_01a"] = true, + ["imp_prop_impexp_door_vid"] = true, + ["imp_prop_impexp_engine_part_01a"] = true, + ["imp_prop_impexp_exhaust_01"] = true, + ["imp_prop_impexp_exhaust_02"] = true, + ["imp_prop_impexp_exhaust_03"] = true, + ["imp_prop_impexp_exhaust_04"] = true, + ["imp_prop_impexp_exhaust_05"] = true, + ["imp_prop_impexp_exhaust_06"] = true, + ["imp_prop_impexp_front_bars_01a"] = true, + ["imp_prop_impexp_front_bars_01b"] = true, + ["imp_prop_impexp_front_bars_02a"] = true, + ["imp_prop_impexp_front_bars_02b"] = true, + ["imp_prop_impexp_front_bumper_01a"] = true, + ["imp_prop_impexp_front_bumper_02a"] = true, + ["imp_prop_impexp_garagegate1"] = true, + ["imp_prop_impexp_garagegate2"] = true, + ["imp_prop_impexp_garagegate3"] = true, + ["imp_prop_impexp_gearbox_01"] = true, + ["imp_prop_impexp_half_cut_rack_01a"] = true, + ["imp_prop_impexp_half_cut_rack_01b"] = true, + ["imp_prop_impexp_hammer_01"] = true, + ["imp_prop_impexp_hub_rack_01a"] = true, + ["imp_prop_impexp_lappy_01a"] = true, + ["imp_prop_impexp_liftdoor_l"] = true, + ["imp_prop_impexp_liftdoor_r"] = true, + ["imp_prop_impexp_mechbench"] = true, + ["imp_prop_impexp_offchair_01a"] = true, + ["imp_prop_impexp_para_s"] = true, + ["imp_prop_impexp_parts_rack_01a"] = true, + ["imp_prop_impexp_parts_rack_02a"] = true, + ["imp_prop_impexp_parts_rack_03a"] = true, + ["imp_prop_impexp_parts_rack_04a"] = true, + ["imp_prop_impexp_parts_rack_05a"] = true, + ["imp_prop_impexp_pliers_01"] = true, + ["imp_prop_impexp_pliers_02"] = true, + ["imp_prop_impexp_pliers_03"] = true, + ["imp_prop_impexp_postlift"] = true, + ["imp_prop_impexp_postlift_up"] = true, + ["imp_prop_impexp_rack_01a"] = true, + ["imp_prop_impexp_rack_02a"] = true, + ["imp_prop_impexp_rack_03a"] = true, + ["imp_prop_impexp_rack_04a"] = true, + ["imp_prop_impexp_radiator_01"] = true, + ["imp_prop_impexp_radiator_02"] = true, + ["imp_prop_impexp_radiator_03"] = true, + ["imp_prop_impexp_radiator_04"] = true, + ["imp_prop_impexp_radiator_05"] = true, + ["imp_prop_impexp_rasp_01"] = true, + ["imp_prop_impexp_rasp_02"] = true, + ["imp_prop_impexp_rasp_03"] = true, + ["imp_prop_impexp_rear_bars_01a"] = true, + ["imp_prop_impexp_rear_bars_01b"] = true, + ["imp_prop_impexp_rear_bumper_01a"] = true, + ["imp_prop_impexp_rear_bumper_02a"] = true, + ["imp_prop_impexp_rear_bumper_03a"] = true, + ["imp_prop_impexp_sdriver_01"] = true, + ["imp_prop_impexp_sdriver_02"] = true, + ["imp_prop_impexp_sdriver_03"] = true, + ["imp_prop_impexp_sofabed_01a"] = true, + ["imp_prop_impexp_span_01"] = true, + ["imp_prop_impexp_span_02"] = true, + ["imp_prop_impexp_span_03"] = true, + ["imp_prop_impexp_spanset_01"] = true, + ["imp_prop_impexp_spoiler_01a"] = true, + ["imp_prop_impexp_spoiler_02a"] = true, + ["imp_prop_impexp_spoiler_03a"] = true, + ["imp_prop_impexp_spoiler_04a"] = true, + ["imp_prop_impexp_tablet"] = true, + ["imp_prop_impexp_tape_01"] = true, + ["imp_prop_impexp_trunk_01a"] = true, + ["imp_prop_impexp_trunk_02a"] = true, + ["imp_prop_impexp_trunk_03a"] = true, + ["imp_prop_impexp_tyre_01a"] = true, + ["imp_prop_impexp_tyre_01b"] = true, + ["imp_prop_impexp_tyre_01c"] = true, + ["imp_prop_impexp_tyre_02a"] = true, + ["imp_prop_impexp_tyre_02b"] = true, + ["imp_prop_impexp_tyre_02c"] = true, + ["imp_prop_impexp_tyre_03a"] = true, + ["imp_prop_impexp_tyre_03b"] = true, + ["imp_prop_impexp_tyre_03c"] = true, + ["imp_prop_impexp_wheel_01a"] = true, + ["imp_prop_impexp_wheel_02a"] = true, + ["imp_prop_impexp_wheel_03a"] = true, + ["imp_prop_impexp_wheel_04a"] = true, + ["imp_prop_impexp_wheel_05a"] = true, + ["imp_prop_int_garage_mirror01"] = true, + ["imp_prop_sand_blaster_01a"] = true, + ["imp_prop_ship_01a"] = true, + ["imp_prop_socket_set_01a"] = true, + ["imp_prop_socket_set_01b"] = true, + ["imp_prop_strut_compressor_01a"] = true, + ["imp_prop_tool_box_01a"] = true, + ["imp_prop_tool_box_01b"] = true, + ["imp_prop_tool_box_02a"] = true, + ["imp_prop_tool_box_02b"] = true, + ["imp_prop_tool_cabinet_01a"] = true, + ["imp_prop_tool_cabinet_01b"] = true, + ["imp_prop_tool_cabinet_01c"] = true, + ["imp_prop_tool_chest_01a"] = true, + ["imp_prop_tool_draw_01a"] = true, + ["imp_prop_tool_draw_01b"] = true, + ["imp_prop_tool_draw_01c"] = true, + ["imp_prop_tool_draw_01d"] = true, + ["imp_prop_tool_draw_01e"] = true, + ["imp_prop_torque_wrench_01a"] = true, + ["imp_prop_transmission_lift_01a"] = true, + ["imp_prop_welder_01a"] = true, + ["imp_prop_wheel_balancer_01a"] = true, + ["ind_prop_dlc_flag_01"] = true, + ["ind_prop_dlc_flag_02"] = true, + ["ind_prop_dlc_roller_car"] = true, + ["ind_prop_dlc_roller_car_02"] = true, + ["ind_prop_firework_01"] = true, + ["ind_prop_firework_02"] = true, + ["ind_prop_firework_03"] = true, + ["ind_prop_firework_04"] = true, + ["kt1_11_mp_door"] = true, + ["kt1_lod_emi_6_20_proxy"] = true, + ["kt1_lod_emi_6_21_proxy"] = true, + ["kt1_lod_kt1_emissive_slod"] = true, + ["kt1_lod_slod4"] = true, + ["lf_house_01_"] = true, + ["lf_house_01d_"] = true, + ["lf_house_04_"] = true, + ["lf_house_04d_"] = true, + ["lf_house_05_"] = true, + ["lf_house_05d_"] = true, + ["lf_house_07_"] = true, + ["lf_house_07d_"] = true, + ["lf_house_08_"] = true, + ["lf_house_08d_"] = true, + ["lf_house_09_"] = true, + ["lf_house_09d_"] = true, + ["lf_house_10_"] = true, + ["lf_house_10d_"] = true, + ["lf_house_11_"] = true, + ["lf_house_11d_"] = true, + ["lf_house_13_"] = true, + ["lf_house_13d_"] = true, + ["lf_house_14_"] = true, + ["lf_house_14d_"] = true, + ["lf_house_15_"] = true, + ["lf_house_15d_"] = true, + ["lf_house_16_"] = true, + ["lf_house_16d_"] = true, + ["lf_house_17_"] = true, + ["lf_house_17d_"] = true, + ["lf_house_18_"] = true, + ["lf_house_18d_"] = true, + ["lf_house_19_"] = true, + ["lf_house_19d_"] = true, + ["lf_house_20_"] = true, + ["lf_house_20d_"] = true, + ["light_car_rig"] = true, + ["light_plane_rig"] = true, + ["lr_bobbleheadlightrig"] = true, + ["lr_prop_boathousedoor_l"] = true, + ["lr_prop_boathousedoor_r"] = true, + ["lr_prop_carburettor_01"] = true, + ["lr_prop_carkey_fob"] = true, + ["lr_prop_clubstool_01"] = true, + ["lr_prop_rail_col_01"] = true, + ["lr_prop_suitbag_01"] = true, + ["lr_prop_supermod_door_01"] = true, + ["lr_prop_supermod_lframe"] = true, + ["lr_sc1_10_apt_03"] = true, + ["lr_sc1_10_combo_slod"] = true, + ["lr_sc1_10_det02"] = true, + ["lr_sc1_10_ground02"] = true, + ["lr_sc1_10_shop"] = true, + ["lr2_prop_gc_grenades"] = true, + ["lr2_prop_gc_grenades_02"] = true, + ["lr2_prop_ibi_01"] = true, + ["lr2_prop_ibi_02"] = true, + ["lts_p_para_bag_lts_s"] = true, + ["lts_p_para_bag_pilot2_s"] = true, + ["lts_p_para_pilot2_sp_s"] = true, + ["lts_prop_lts_elecbox_24"] = true, + ["lts_prop_lts_elecbox_24b"] = true, + ["lts_prop_lts_offroad_tyres01"] = true, + ["lts_prop_lts_ramp_01"] = true, + ["lts_prop_lts_ramp_02"] = true, + ["lts_prop_lts_ramp_03"] = true, + ["lts_prop_tumbler_01_s2"] = true, + ["lts_prop_tumbler_cs2_s2"] = true, + ["lts_prop_wine_glass_s2"] = true, + ["lux_p_champ_flute_s"] = true, + ["lux_p_pour_champagne_luxe"] = true, + ["lux_p_pour_champagne_s"] = true, + ["lux_prop_ashtray_luxe_01"] = true, + ["lux_prop_champ_01_luxe"] = true, + ["lux_prop_champ_flute_luxe"] = true, + ["lux_prop_chassis_ref_luxe"] = true, + ["lux_prop_cigar_01_luxe"] = true, + ["lux_prop_lighter_luxe"] = true, + ["marina_xr_rocks_02"] = true, + ["marina_xr_rocks_03"] = true, + ["marina_xr_rocks_04"] = true, + ["marina_xr_rocks_05"] = true, + ["marina_xr_rocks_06"] = true, + ["miss_rub_couch_01"] = true, + ["miss_rub_couch_01_l1"] = true, + ["ng_proc_beerbottle_01a"] = true, + ["ng_proc_beerbottle_01b"] = true, + ["ng_proc_beerbottle_01c"] = true, + ["ng_proc_binbag_01a"] = true, + ["ng_proc_binbag_02a"] = true, + ["ng_proc_block_01a"] = true, + ["ng_proc_block_02a"] = true, + ["ng_proc_block_02b"] = true, + ["ng_proc_box_01a"] = true, + ["ng_proc_box_02a"] = true, + ["ng_proc_box_02b"] = true, + ["ng_proc_brick_01a"] = true, + ["ng_proc_brick_01b"] = true, + ["ng_proc_brkbottle_02a"] = true, + ["ng_proc_brkbottle_02b"] = true, + ["ng_proc_brkbottle_02c"] = true, + ["ng_proc_brkbottle_02d"] = true, + ["ng_proc_brkbottle_02e"] = true, + ["ng_proc_brkbottle_02f"] = true, + ["ng_proc_brkbottle_02g"] = true, + ["ng_proc_candy01a"] = true, + ["ng_proc_cigar01a"] = true, + ["ng_proc_cigarette01a"] = true, + ["ng_proc_cigbuts01a"] = true, + ["ng_proc_cigbuts02a"] = true, + ["ng_proc_cigbuts03a"] = true, + ["ng_proc_ciglight01a"] = true, + ["ng_proc_cigpak01a"] = true, + ["ng_proc_cigpak01b"] = true, + ["ng_proc_cigpak01c"] = true, + ["ng_proc_coffee_01a"] = true, + ["ng_proc_coffee_02a"] = true, + ["ng_proc_coffee_03b"] = true, + ["ng_proc_coffee_04b"] = true, + ["ng_proc_concchips01"] = true, + ["ng_proc_concchips02"] = true, + ["ng_proc_concchips03"] = true, + ["ng_proc_concchips04"] = true, + ["ng_proc_crate_01a"] = true, + ["ng_proc_crate_02a"] = true, + ["ng_proc_crate_03a"] = true, + ["ng_proc_crate_04a"] = true, + ["ng_proc_drug01a002"] = true, + ["ng_proc_food_aple1a"] = true, + ["ng_proc_food_aple2a"] = true, + ["ng_proc_food_bag01a"] = true, + ["ng_proc_food_bag02a"] = true, + ["ng_proc_food_burg01a"] = true, + ["ng_proc_food_burg02a"] = true, + ["ng_proc_food_burg02c"] = true, + ["ng_proc_food_chips01a"] = true, + ["ng_proc_food_chips01b"] = true, + ["ng_proc_food_chips01c"] = true, + ["ng_proc_food_nana1a"] = true, + ["ng_proc_food_nana2a"] = true, + ["ng_proc_food_ornge1a"] = true, + ["ng_proc_inhaler01a"] = true, + ["ng_proc_leaves01"] = true, + ["ng_proc_leaves02"] = true, + ["ng_proc_leaves03"] = true, + ["ng_proc_leaves04"] = true, + ["ng_proc_leaves05"] = true, + ["ng_proc_leaves06"] = true, + ["ng_proc_leaves07"] = true, + ["ng_proc_leaves08"] = true, + ["ng_proc_litter_plasbot1"] = true, + ["ng_proc_litter_plasbot2"] = true, + ["ng_proc_litter_plasbot3"] = true, + ["ng_proc_oilcan01a"] = true, + ["ng_proc_ojbot_01a"] = true, + ["ng_proc_paintcan01a"] = true, + ["ng_proc_paintcan01a_sh"] = true, + ["ng_proc_paintcan02a"] = true, + ["ng_proc_paper_01a"] = true, + ["ng_proc_paper_02a"] = true, + ["ng_proc_paper_03a"] = true, + ["ng_proc_paper_03a001"] = true, + ["ng_proc_paper_burger01a"] = true, + ["ng_proc_paper_mag_1a"] = true, + ["ng_proc_paper_mag_1b"] = true, + ["ng_proc_paper_news_globe"] = true, + ["ng_proc_paper_news_meteor"] = true, + ["ng_proc_paper_news_quik"] = true, + ["ng_proc_paper_news_rag"] = true, + ["ng_proc_pizza01a"] = true, + ["ng_proc_rebar_01a"] = true, + ["ng_proc_sodabot_01a"] = true, + ["ng_proc_sodacan_01a"] = true, + ["ng_proc_sodacan_01b"] = true, + ["ng_proc_sodacan_02a"] = true, + ["ng_proc_sodacan_02b"] = true, + ["ng_proc_sodacan_02c"] = true, + ["ng_proc_sodacan_02d"] = true, + ["ng_proc_sodacan_03a"] = true, + ["ng_proc_sodacan_03b"] = true, + ["ng_proc_sodacan_04a"] = true, + ["ng_proc_sodacup_01a"] = true, + ["ng_proc_sodacup_01b"] = true, + ["ng_proc_sodacup_01c"] = true, + ["ng_proc_sodacup_02a"] = true, + ["ng_proc_sodacup_02b"] = true, + ["ng_proc_sodacup_02b001"] = true, + ["ng_proc_sodacup_02c"] = true, + ["ng_proc_sodacup_03a"] = true, + ["ng_proc_sodacup_03c"] = true, + ["ng_proc_sodacup_lid"] = true, + ["ng_proc_spraycan01a"] = true, + ["ng_proc_spraycan01b"] = true, + ["ng_proc_syrnige01a"] = true, + ["ng_proc_temp"] = true, + ["ng_proc_tyre_01"] = true, + ["ng_proc_tyre_dam1"] = true, + ["ng_proc_wood_01a"] = true, + ["ng_proc_wood_02a"] = true, + ["p_a4_sheets_s"] = true, + ["p_abat_roller_1"] = true, + ["p_abat_roller_1_col"] = true, + ["p_airdancer_01_s"] = true, + ["p_amanda_note_01_s"] = true, + ["p_amb_bag_bottle_01"] = true, + ["p_amb_bagel_01"] = true, + ["p_amb_brolly_01"] = true, + ["p_amb_brolly_01_s"] = true, + ["p_amb_clipboard_01"] = true, + ["p_amb_coffeecup_01"] = true, + ["p_amb_drain_water_double"] = true, + ["p_amb_drain_water_longstrip"] = true, + ["p_amb_drain_water_single"] = true, + ["p_amb_joint_01"] = true, + ["p_amb_lap_top_01"] = true, + ["p_amb_lap_top_02"] = true, + ["p_amb_phone_01"] = true, + ["p_arm_bind_cut_s"] = true, + ["p_armchair_01_s"] = true, + ["p_ashley_neck_01_s"] = true, + ["p_attache_case_01_s"] = true, + ["p_balaclavamichael_s"] = true, + ["p_banknote_onedollar_s"] = true, + ["p_banknote_s"] = true, + ["p_barier_test_s"] = true, + ["p_barierbase_test_s"] = true, + ["p_barriercrash_01_s"] = true, + ["p_beefsplitter_s"] = true, + ["p_binbag_01_s"] = true, + ["p_bison_winch_s"] = true, + ["p_bloodsplat_s"] = true, + ["p_blueprints_01_s"] = true, + ["p_brain_chunk_s"] = true, + ["p_bs_map_door_01_s"] = true, + ["p_cablecar_s"] = true, + ["p_cablecar_s_door_l"] = true, + ["p_cablecar_s_door_r"] = true, + ["p_car_keys_01"] = true, + ["p_cargo_chute_s"] = true, + ["p_cash_envelope_01_s"] = true, + ["p_cctv_s"] = true, + ["p_champ_flute_s"] = true, + ["p_chem_vial_02b_s"] = true, + ["p_cigar_pack_02_s"] = true, + ["p_clb_officechair_s"] = true, + ["p_cletus_necklace_s"] = true, + ["p_cloth_airdancer_s"] = true, + ["p_clothtarp_down_s"] = true, + ["p_clothtarp_s"] = true, + ["p_clothtarp_up_s"] = true, + ["p_controller_01_s"] = true, + ["p_counter_01_glass"] = true, + ["p_counter_01_glass_plug"] = true, + ["p_counter_02_glass"] = true, + ["p_counter_03_glass"] = true, + ["p_counter_04_glass"] = true, + ["p_crahsed_heli_s"] = true, + ["p_cs_15m_rope_s"] = true, + ["p_cs_bandana_s"] = true, + ["p_cs_bbbat_01"] = true, + ["p_cs_beachtowel_01_s"] = true, + ["p_cs_beverly_lanyard_s"] = true, + ["p_cs_bottle_01"] = true, + ["p_cs_bowl_01b_s"] = true, + ["p_cs_cam_phone"] = true, + ["p_cs_ciggy_01b_s"] = true, + ["p_cs_clipboard"] = true, + ["p_cs_clothes_box_s"] = true, + ["p_cs_coke_line_s"] = true, + ["p_cs_comb_01"] = true, + ["p_cs_cuffs_02_s"] = true, + ["p_cs_duffel_01_s"] = true, + ["p_cs_joint_01"] = true, + ["p_cs_joint_02"] = true, + ["p_cs_laptop_02"] = true, + ["p_cs_laptop_02_w"] = true, + ["p_cs_laz_ptail_s"] = true, + ["p_cs_leaf_s"] = true, + ["p_cs_lighter_01"] = true, + ["p_cs_locker_01"] = true, + ["p_cs_locker_01_s"] = true, + ["p_cs_locker_02"] = true, + ["p_cs_locker_door_01"] = true, + ["p_cs_locker_door_01b"] = true, + ["p_cs_locker_door_02"] = true, + ["p_cs_mp_jet_01_s"] = true, + ["p_cs_newspaper_s"] = true, + ["p_cs_pamphlet_01_s"] = true, + ["p_cs_panties_03_s"] = true, + ["p_cs_paper_disp_02"] = true, + ["p_cs_paper_disp_1"] = true, + ["p_cs_papers_01"] = true, + ["p_cs_papers_02"] = true, + ["p_cs_papers_03"] = true, + ["p_cs_para_ropebit_s"] = true, + ["p_cs_para_ropes_s"] = true, + ["p_cs_polaroid_s"] = true, + ["p_cs_police_torch_s"] = true, + ["p_cs_pour_tube_s"] = true, + ["p_cs_power_cord_s"] = true, + ["p_cs_rope_tie_01_s"] = true, + ["p_cs_sack_01_s"] = true, + ["p_cs_saucer_01_s"] = true, + ["p_cs_scissors_s"] = true, + ["p_cs_script_bottle_s"] = true, + ["p_cs_script_s"] = true, + ["p_cs_shirt_01_s"] = true, + ["p_cs_shot_glass_2_s"] = true, + ["p_cs_shot_glass_s"] = true, + ["p_cs_sub_hook_01_s"] = true, + ["p_cs_toaster_s"] = true, + ["p_cs_tracy_neck2_s"] = true, + ["p_cs_trolley_01_s"] = true, + ["p_cs1_14b_train_esdoor"] = true, + ["p_cs1_14b_train_s"] = true, + ["p_cs1_14b_train_s_col"] = true, + ["p_cs1_14b_train_s_colopen"] = true, + ["p_csbporndudes_necklace_s"] = true, + ["p_csh_strap_01_pro_s"] = true, + ["p_csh_strap_01_s"] = true, + ["p_csh_strap_03_s"] = true, + ["p_cut_door_01"] = true, + ["p_cut_door_02"] = true, + ["p_cut_door_03"] = true, + ["p_d_scuba_mask_s"] = true, + ["p_d_scuba_tank_s"] = true, + ["p_defilied_ragdoll_01_s"] = true, + ["p_devin_box_01_s"] = true, + ["p_dinechair_01_s"] = true, + ["p_disp_02_door_01"] = true, + ["p_dock_crane_cabl_s"] = true, + ["p_dock_crane_cable_s"] = true, + ["p_dock_crane_sld_s"] = true, + ["p_dock_rtg_ld_cab"] = true, + ["p_dock_rtg_ld_spdr"] = true, + ["p_dock_rtg_ld_wheel"] = true, + ["p_dumpster_t"] = true, + ["p_ecg_01_cable_01_s"] = true, + ["p_f_duster_handle_01"] = true, + ["p_f_duster_head_01"] = true, + ["p_fag_packet_01_s"] = true, + ["p_ferris_car_01"] = true, + ["p_ferris_wheel_amo_l"] = true, + ["p_ferris_wheel_amo_l2"] = true, + ["p_ferris_wheel_amo_p"] = true, + ["p_fib_rubble_s"] = true, + ["p_film_set_static_01"] = true, + ["p_fin_vaultdoor_s"] = true, + ["p_finale_bld_ground_s"] = true, + ["p_finale_bld_pool_s"] = true, + ["p_flatbed_strap_s"] = true, + ["p_fnclink_dtest"] = true, + ["p_folding_chair_01_s"] = true, + ["p_gaffer_tape_s"] = true, + ["p_gaffer_tape_strip_s"] = true, + ["p_gar_door_01_s"] = true, + ["p_gar_door_02_s"] = true, + ["p_gar_door_03_s"] = true, + ["p_gasmask_s"] = true, + ["p_gate_prison_01_s"] = true, + ["p_gcase_s"] = true, + ["p_gdoor1_s"] = true, + ["p_gdoor1colobject_s"] = true, + ["p_gdoortest_s"] = true, + ["p_hand_toilet_s"] = true, + ["p_hw1_22_doors_s"] = true, + ["p_hw1_22_table_s"] = true, + ["p_ice_box_01_s"] = true, + ["p_ice_box_proxy_col"] = true, + ["p_idol_case_s"] = true, + ["p_ilev_p_easychair_s"] = true, + ["p_ing_bagel_01"] = true, + ["p_ing_coffeecup_01"] = true, + ["p_ing_coffeecup_02"] = true, + ["p_ing_microphonel_01"] = true, + ["p_ing_skiprope_01"] = true, + ["p_ing_skiprope_01_s"] = true, + ["p_inhaler_01_s"] = true, + ["p_int_jewel_mirror"] = true, + ["p_int_jewel_plant_01"] = true, + ["p_int_jewel_plant_02"] = true, + ["p_jewel_door_l"] = true, + ["p_jewel_door_r1"] = true, + ["p_jewel_necklace_02"] = true, + ["p_jewel_necklace01_s"] = true, + ["p_jewel_necklace02_s"] = true, + ["p_jewel_pickup33_s"] = true, + ["p_jimmy_necklace_s"] = true, + ["p_jimmyneck_03_s"] = true, + ["p_kitch_juicer_s"] = true, + ["p_lamarneck_01_s"] = true, + ["p_laptop_02_s"] = true, + ["p_large_gold_s"] = true, + ["p_laz_j01_s"] = true, + ["p_laz_j02_s"] = true, + ["p_lazlow_shirt_s"] = true, + ["p_ld_am_ball_01"] = true, + ["p_ld_bs_bag_01"] = true, + ["p_ld_cable_tie_01_s"] = true, + ["p_ld_coffee_vend_01"] = true, + ["p_ld_coffee_vend_s"] = true, + ["p_ld_conc_cyl_01"] = true, + ["p_ld_crocclips01_s"] = true, + ["p_ld_crocclips02_s"] = true, + ["p_ld_frisbee_01"] = true, + ["p_ld_heist_bag_01"] = true, + ["p_ld_heist_bag_s"] = true, + ["p_ld_heist_bag_s_1"] = true, + ["p_ld_heist_bag_s_2"] = true, + ["p_ld_heist_bag_s_pro"] = true, + ["p_ld_heist_bag_s_pro_o"] = true, + ["p_ld_heist_bag_s_pro2_s"] = true, + ["p_ld_id_card_002"] = true, + ["p_ld_id_card_01"] = true, + ["p_ld_sax"] = true, + ["p_ld_soc_ball_01"] = true, + ["p_ld_stinger_s"] = true, + ["p_leg_bind_cut_s"] = true, + ["p_lestersbed_s"] = true, + ["p_lev_sofa_s"] = true, + ["p_lifeinv_neck_01_s"] = true, + ["p_litter_picker_s"] = true, + ["p_loose_rag_01_s"] = true, + ["p_mast_01_s"] = true, + ["p_mbbed_s"] = true, + ["p_med_jet_01_s"] = true, + ["p_medal_01_s"] = true, + ["p_meth_bag_01_s"] = true, + ["p_michael_backpack_s"] = true, + ["p_michael_scuba_mask_s"] = true, + ["p_michael_scuba_tank_s"] = true, + ["p_mp_showerdoor_s"] = true, + ["p_mr_raspberry_01_s"] = true, + ["p_mrk_harness_s"] = true, + ["p_new_j_counter_01"] = true, + ["p_new_j_counter_02"] = true, + ["p_new_j_counter_03"] = true, + ["p_notepad_01_s"] = true, + ["p_novel_01_s"] = true, + ["p_num_plate_01"] = true, + ["p_num_plate_02"] = true, + ["p_num_plate_03"] = true, + ["p_num_plate_04"] = true, + ["p_oil_pjack_01_amo"] = true, + ["p_oil_pjack_01_frg_s"] = true, + ["p_oil_pjack_01_s"] = true, + ["p_oil_pjack_02_amo"] = true, + ["p_oil_pjack_02_frg_s"] = true, + ["p_oil_pjack_02_s"] = true, + ["p_oil_pjack_03_amo"] = true, + ["p_oil_pjack_03_frg_s"] = true, + ["p_oil_pjack_03_s"] = true, + ["p_oil_slick_01"] = true, + ["p_omega_neck_01_s"] = true, + ["p_omega_neck_02_s"] = true, + ["p_orleans_mask_s"] = true, + ["p_ortega_necklace_s"] = true, + ["p_oscar_necklace_s"] = true, + ["p_overalls_02_s"] = true, + ["p_pallet_02a_s"] = true, + ["p_panties_s"] = true, + ["p_para_bag_xmas_s"] = true, + ["p_para_broken1_s"] = true, + ["p_parachute_fallen_s"] = true, + ["p_parachute_s"] = true, + ["p_parachute_s_shop"] = true, + ["p_parachute1_mp_dec"] = true, + ["p_parachute1_mp_s"] = true, + ["p_parachute1_s"] = true, + ["p_parachute1_sp_dec"] = true, + ["p_parachute1_sp_s"] = true, + ["p_patio_lounger1_s"] = true, + ["p_pharm_unit_01"] = true, + ["p_pharm_unit_02"] = true, + ["p_phonebox_01b_s"] = true, + ["p_phonebox_02_s"] = true, + ["p_pistol_holster_s"] = true, + ["p_planning_board_01"] = true, + ["p_planning_board_02"] = true, + ["p_planning_board_03"] = true, + ["p_planning_board_04"] = true, + ["p_pliers_01_s"] = true, + ["p_po1_01_doorm_s"] = true, + ["p_police_radio_hset_s"] = true, + ["p_poly_bag_01_s"] = true, + ["p_pour_wine_s"] = true, + ["p_rail_controller_s"] = true, + ["p_rc_handset"] = true, + ["p_rcss_folded"] = true, + ["p_rcss_s"] = true, + ["p_res_sofa_l_s"] = true, + ["p_ringbinder_01_s"] = true, + ["p_rpulley_s"] = true, + ["p_rub_binbag_test"] = true, + ["p_s_scuba_mask_s"] = true, + ["p_s_scuba_tank_s"] = true, + ["p_seabed_whalebones"] = true, + ["p_sec_case_02_s"] = true, + ["p_sec_gate_01_s"] = true, + ["p_sec_gate_01_s_col"] = true, + ["p_secret_weapon_02"] = true, + ["p_shoalfish_s"] = true, + ["p_shower_towel_s"] = true, + ["p_single_rose_s"] = true, + ["p_skiprope_r_s"] = true, + ["p_smg_holster_01_s"] = true, + ["p_soloffchair_s"] = true, + ["p_spinning_anus_s"] = true, + ["p_steve_scuba_hood_s"] = true, + ["p_stinger_02"] = true, + ["p_stinger_03"] = true, + ["p_stinger_04"] = true, + ["p_stinger_piece_01"] = true, + ["p_stinger_piece_02"] = true, + ["p_stretch_necklace_s"] = true, + ["p_sub_crane_s"] = true, + ["p_sunglass_m_s"] = true, + ["p_syringe_01_s"] = true, + ["p_t_shirt_pile_s"] = true, + ["p_tennis_bag_01_s"] = true, + ["p_till_01_s"] = true, + ["p_tmom_earrings_s"] = true, + ["p_tourist_map_01_s"] = true, + ["p_tram_crash_s"] = true, + ["p_trev_rope_01_s"] = true, + ["p_trev_ski_mask_s"] = true, + ["p_trevor_prologe_bally_s"] = true, + ["p_tumbler_01_bar_s"] = true, + ["p_tumbler_01_s"] = true, + ["p_tumbler_01_trev_s"] = true, + ["p_tumbler_02_s1"] = true, + ["p_tumbler_cs2_s"] = true, + ["p_tumbler_cs2_s_day"] = true, + ["p_tumbler_cs2_s_trev"] = true, + ["p_tv_cam_02_s"] = true, + ["p_v_43_safe_s"] = true, + ["p_v_ilev_chopshopswitch_s"] = true, + ["p_v_med_p_sofa_s"] = true, + ["p_v_res_tt_bed_s"] = true, + ["p_w_ar_musket_chrg"] = true, + ["p_w_grass_gls_s"] = true, + ["p_wade_necklace_s"] = true, + ["p_watch_01"] = true, + ["p_watch_01_s"] = true, + ["p_watch_02"] = true, + ["p_watch_02_s"] = true, + ["p_watch_03"] = true, + ["p_watch_03_s"] = true, + ["p_watch_04"] = true, + ["p_watch_05"] = true, + ["p_watch_06"] = true, + ["p_waterboardc_s"] = true, + ["p_wboard_clth_s"] = true, + ["p_weed_bottle_s"] = true, + ["p_whiskey_bottle_s"] = true, + ["p_whiskey_notop"] = true, + ["p_whiskey_notop_empty"] = true, + ["p_winch_long_s"] = true, + ["p_wine_glass_s"] = true, + ["p_yacht_chair_01_s"] = true, + ["p_yacht_sofa_01_s"] = true, + ["p_yoga_mat_01_s"] = true, + ["p_yoga_mat_02_s"] = true, + ["p_yoga_mat_03_s"] = true, + ["physics_glasses"] = true, + ["physics_hat"] = true, + ["physics_hat2"] = true, + ["pil_p_para_bag_pilot_s"] = true, + ["pil_p_para_pilot_sp_s"] = true, + ["pil_prop_fs_safedoor"] = true, + ["pil_prop_fs_target_01"] = true, + ["pil_prop_fs_target_02"] = true, + ["pil_prop_fs_target_03"] = true, + ["pil_prop_fs_target_base"] = true, + ["pil_prop_pilot_icon_01"] = true, + ["po1_lod_emi_proxy_slod3"] = true, + ["po1_lod_slod4"] = true, + ["pop_v_bank_door_l"] = true, + ["pop_v_bank_door_r"] = true, + ["poro_06_sig1_c_source"] = true, + ["port_xr_bins"] = true, + ["port_xr_cont_01"] = true, + ["port_xr_cont_02"] = true, + ["port_xr_cont_03"] = true, + ["port_xr_cont_04"] = true, + ["port_xr_cont_sm"] = true, + ["port_xr_contpod_01"] = true, + ["port_xr_contpod_02"] = true, + ["port_xr_contpod_03"] = true, + ["port_xr_cranelg"] = true, + ["port_xr_door_01"] = true, + ["port_xr_door_04"] = true, + ["port_xr_door_05"] = true, + ["port_xr_elecbox_1"] = true, + ["port_xr_elecbox_2"] = true, + ["port_xr_elecbox_3"] = true, + ["port_xr_fire"] = true, + ["port_xr_firehose"] = true, + ["port_xr_lifeboat"] = true, + ["port_xr_lifep"] = true, + ["port_xr_lightdoor"] = true, + ["port_xr_lighthal"] = true, + ["port_xr_lightspot"] = true, + ["port_xr_railbal"] = true, + ["port_xr_railside"] = true, + ["port_xr_railst"] = true, + ["port_xr_spoolsm"] = true, + ["port_xr_stairs_01"] = true, + ["port_xr_tiedown"] = true, + ["proair_hoc_puck"] = true, + ["proc_brittlebush_01"] = true, + ["proc_desert_sage_01"] = true, + ["proc_dry_plants_01"] = true, + ["proc_drygrasses01"] = true, + ["proc_drygrasses01b"] = true, + ["proc_drygrassfronds01"] = true, + ["proc_dryplantsgrass_01"] = true, + ["proc_dryplantsgrass_02"] = true, + ["proc_forest_ivy_01"] = true, + ["proc_grassdandelion01"] = true, + ["proc_grasses01"] = true, + ["proc_grasses01b"] = true, + ["proc_grassfronds01"] = true, + ["proc_grassplantmix_01"] = true, + ["proc_grassplantmix_02"] = true, + ["proc_indian_pbrush_01"] = true, + ["proc_leafybush_01"] = true, + ["proc_leafyplant_01"] = true, + ["proc_litter_01"] = true, + ["proc_litter_02"] = true, + ["proc_lizardtail_01"] = true, + ["proc_lupins_01"] = true, + ["proc_meadowmix_01"] = true, + ["proc_meadowpoppy_01"] = true, + ["proc_mntn_stone01"] = true, + ["proc_mntn_stone02"] = true, + ["proc_mntn_stone03"] = true, + ["proc_sage_01"] = true, + ["proc_scrub_bush01"] = true, + ["proc_searock_01"] = true, + ["proc_searock_02"] = true, + ["proc_searock_03"] = true, + ["proc_sml_reeds_01"] = true, + ["proc_sml_reeds_01b"] = true, + ["proc_sml_reeds_01c"] = true, + ["proc_sml_stones01"] = true, + ["proc_sml_stones02"] = true, + ["proc_sml_stones03"] = true, + ["proc_stones_01"] = true, + ["proc_stones_02"] = true, + ["proc_stones_03"] = true, + ["proc_stones_04"] = true, + ["proc_stones_05"] = true, + ["proc_stones_06"] = true, + ["proc_wildquinine"] = true, + ["prop_06_sig1_a"] = true, + ["prop_06_sig1_b"] = true, + ["prop_06_sig1_d"] = true, + ["prop_06_sig1_e"] = true, + ["prop_06_sig1_f"] = true, + ["prop_06_sig1_g"] = true, + ["prop_06_sig1_h"] = true, + ["prop_06_sig1_i"] = true, + ["prop_06_sig1_j"] = true, + ["prop_06_sig1_k"] = true, + ["prop_06_sig1_l"] = true, + ["prop_06_sig1_m"] = true, + ["prop_06_sig1_n"] = true, + ["prop_06_sig1_o"] = true, + ["prop_1st_hostage_scene"] = true, + ["prop_1st_prologue_scene"] = true, + ["prop_2nd_hostage_scene"] = true, + ["prop_50s_jukebox"] = true, + ["prop_a_base_bars_01"] = true, + ["prop_a_trailer_door_01"] = true, + ["prop_a4_pile_01"] = true, + ["prop_a4_sheet_01"] = true, + ["prop_a4_sheet_02"] = true, + ["prop_a4_sheet_03"] = true, + ["prop_a4_sheet_04"] = true, + ["prop_a4_sheet_05"] = true, + ["prop_abat_roller_static"] = true, + ["prop_abat_slide"] = true, + ["prop_ac_pit_lane_blip"] = true, + ["prop_acc_guitar_01"] = true, + ["prop_acc_guitar_01_d1"] = true, + ["prop_aerial_01a"] = true, + ["prop_aerial_01b"] = true, + ["prop_aerial_01c"] = true, + ["prop_aerial_01d"] = true, + ["prop_afsign_amun"] = true, + ["prop_afsign_vbike"] = true, + ["prop_agave_01"] = true, + ["prop_agave_02"] = true, + ["prop_aiprort_sign_01"] = true, + ["prop_aiprort_sign_02"] = true, + ["prop_air_bagloader"] = true, + ["prop_air_bagloader2"] = true, + ["prop_air_bagloader2_cr"] = true, + ["prop_air_barrier"] = true, + ["prop_air_bench_01"] = true, + ["prop_air_bench_02"] = true, + ["prop_air_bigradar"] = true, + ["prop_air_bigradar_l1"] = true, + ["prop_air_bigradar_l2"] = true, + ["prop_air_bigradar_slod"] = true, + ["prop_air_blastfence_01"] = true, + ["prop_air_blastfence_02"] = true, + ["prop_air_bridge01"] = true, + ["prop_air_bridge02"] = true, + ["prop_air_cargo_01a"] = true, + ["prop_air_cargo_01b"] = true, + ["prop_air_cargo_01c"] = true, + ["prop_air_cargo_02a"] = true, + ["prop_air_cargo_02b"] = true, + ["prop_air_cargo_03a"] = true, + ["prop_air_cargo_04a"] = true, + ["prop_air_cargo_04b"] = true, + ["prop_air_cargo_04c"] = true, + ["prop_air_cargoloader_01"] = true, + ["prop_air_chock_01"] = true, + ["prop_air_chock_03"] = true, + ["prop_air_chock_04"] = true, + ["prop_air_conelight"] = true, + ["prop_air_fireexting"] = true, + ["prop_air_fueltrail1"] = true, + ["prop_air_fueltrail2"] = true, + ["prop_air_gasbogey_01"] = true, + ["prop_air_generator_01"] = true, + ["prop_air_generator_03"] = true, + ["prop_air_hoc_paddle_01"] = true, + ["prop_air_hoc_paddle_02"] = true, + ["prop_air_lights_01a"] = true, + ["prop_air_lights_01b"] = true, + ["prop_air_lights_02a"] = true, + ["prop_air_lights_02b"] = true, + ["prop_air_lights_03a"] = true, + ["prop_air_lights_04a"] = true, + ["prop_air_lights_05a"] = true, + ["prop_air_luggtrolley"] = true, + ["prop_air_mast_01"] = true, + ["prop_air_mast_02"] = true, + ["prop_air_monhut_01"] = true, + ["prop_air_monhut_02"] = true, + ["prop_air_monhut_03"] = true, + ["prop_air_monhut_03_cr"] = true, + ["prop_air_propeller01"] = true, + ["prop_air_radar_01"] = true, + ["prop_air_sechut_01"] = true, + ["prop_air_stair_01"] = true, + ["prop_air_stair_02"] = true, + ["prop_air_stair_03"] = true, + ["prop_air_stair_04a"] = true, + ["prop_air_stair_04a_cr"] = true, + ["prop_air_stair_04b"] = true, + ["prop_air_stair_04b_cr"] = true, + ["prop_air_taxisign_01a"] = true, + ["prop_air_taxisign_02a"] = true, + ["prop_air_taxisign_03a"] = true, + ["prop_air_terlight_01a"] = true, + ["prop_air_terlight_01b"] = true, + ["prop_air_terlight_01c"] = true, + ["prop_air_towbar_01"] = true, + ["prop_air_towbar_02"] = true, + ["prop_air_towbar_03"] = true, + ["prop_air_trailer_1a"] = true, + ["prop_air_trailer_1b"] = true, + ["prop_air_trailer_1c"] = true, + ["prop_air_trailer_2a"] = true, + ["prop_air_trailer_2b"] = true, + ["prop_air_trailer_3a"] = true, + ["prop_air_trailer_3b"] = true, + ["prop_air_trailer_4a"] = true, + ["prop_air_trailer_4b"] = true, + ["prop_air_trailer_4c"] = true, + ["prop_air_watertank1"] = true, + ["prop_air_watertank2"] = true, + ["prop_air_watertank3"] = true, + ["prop_air_windsock"] = true, + ["prop_air_windsock_base"] = true, + ["prop_air_woodsteps"] = true, + ["prop_aircon_l_01"] = true, + ["prop_aircon_l_02"] = true, + ["prop_aircon_l_03"] = true, + ["prop_aircon_l_03_dam"] = true, + ["prop_aircon_l_04"] = true, + ["prop_aircon_m_01"] = true, + ["prop_aircon_m_02"] = true, + ["prop_aircon_m_03"] = true, + ["prop_aircon_m_04"] = true, + ["prop_aircon_m_05"] = true, + ["prop_aircon_m_06"] = true, + ["prop_aircon_m_07"] = true, + ["prop_aircon_m_08"] = true, + ["prop_aircon_m_09"] = true, + ["prop_aircon_m_10"] = true, + ["prop_aircon_s_01a"] = true, + ["prop_aircon_s_02a"] = true, + ["prop_aircon_s_02b"] = true, + ["prop_aircon_s_03a"] = true, + ["prop_aircon_s_03b"] = true, + ["prop_aircon_s_04a"] = true, + ["prop_aircon_s_05a"] = true, + ["prop_aircon_s_06a"] = true, + ["prop_aircon_s_07a"] = true, + ["prop_aircon_s_07b"] = true, + ["prop_aircon_t_03"] = true, + ["prop_aircon_tna_02"] = true, + ["prop_airdancer_2_cloth"] = true, + ["prop_airdancer_base"] = true, + ["prop_airhockey_01"] = true, + ["prop_airport_sale_sign"] = true, + ["prop_alarm_01"] = true, + ["prop_alarm_02"] = true, + ["prop_alien_egg_01"] = true, + ["prop_aloevera_01"] = true, + ["prop_am_box_wood_01"] = true, + ["prop_amanda_note_01"] = true, + ["prop_amanda_note_01b"] = true, + ["prop_amb_40oz_02"] = true, + ["prop_amb_40oz_03"] = true, + ["prop_amb_beer_bottle"] = true, + ["prop_amb_ciggy_01"] = true, + ["prop_amb_donut"] = true, + ["prop_amb_handbag_01"] = true, + ["prop_amb_phone"] = true, + ["prop_ammunation_sign_01"] = true, + ["prop_amp_01"] = true, + ["prop_anim_cash_note"] = true, + ["prop_anim_cash_note_b"] = true, + ["prop_anim_cash_pile_01"] = true, + ["prop_anim_cash_pile_02"] = true, + ["prop_apple_box_01"] = true, + ["prop_apple_box_02"] = true, + ["prop_ar_arrow_1"] = true, + ["prop_ar_arrow_2"] = true, + ["prop_ar_arrow_3"] = true, + ["prop_ar_ring_01"] = true, + ["prop_arc_blueprints_01"] = true, + ["prop_arcade_01"] = true, + ["prop_arcade_02"] = true, + ["prop_arena_icon_boxmk"] = true, + ["prop_arena_icon_flag_green"] = true, + ["prop_arena_icon_flag_pink"] = true, + ["prop_arena_icon_flag_purple"] = true, + ["prop_arena_icon_flag_red"] = true, + ["prop_arena_icon_flag_white"] = true, + ["prop_arena_icon_flag_yellow"] = true, + ["prop_arm_gate_l"] = true, + ["prop_arm_wrestle_01"] = true, + ["prop_armchair_01"] = true, + ["prop_armenian_gate"] = true, + ["prop_armour_pickup"] = true, + ["prop_artgallery_02_dl"] = true, + ["prop_artgallery_02_dr"] = true, + ["prop_artgallery_dl"] = true, + ["prop_artgallery_dr"] = true, + ["prop_artifact_01"] = true, + ["prop_ashtray_01"] = true, + ["prop_asteroid_01"] = true, + ["prop_astro_table_01"] = true, + ["prop_astro_table_02"] = true, + ["prop_atm_01"] = true, + ["prop_atm_02"] = true, + ["prop_atm_03"] = true, + ["prop_attache_case_01"] = true, + ["prop_aviators_01"] = true, + ["prop_b_board_blank"] = true, + ["prop_bahammenu"] = true, + ["prop_balcony_glass_01"] = true, + ["prop_balcony_glass_02"] = true, + ["prop_balcony_glass_03"] = true, + ["prop_balcony_glass_04"] = true, + ["prop_ball_box"] = true, + ["prop_ballistic_shield"] = true, + ["prop_ballistic_shield_lod1"] = true, + ["prop_bandsaw_01"] = true, + ["prop_bank_shutter"] = true, + ["prop_bank_vaultdoor"] = true, + ["prop_bar_beans"] = true, + ["prop_bar_beerfridge_01"] = true, + ["prop_bar_caddy"] = true, + ["prop_bar_coastbarr"] = true, + ["prop_bar_coastchamp"] = true, + ["prop_bar_coastdusc"] = true, + ["prop_bar_coasterdisp"] = true, + ["prop_bar_coastmount"] = true, + ["prop_bar_cockshaker"] = true, + ["prop_bar_cockshakropn"] = true, + ["prop_bar_cooler_01"] = true, + ["prop_bar_cooler_03"] = true, + ["prop_bar_drinkstraws"] = true, + ["prop_bar_fridge_01"] = true, + ["prop_bar_fridge_02"] = true, + ["prop_bar_fridge_03"] = true, + ["prop_bar_fridge_04"] = true, + ["prop_bar_fruit"] = true, + ["prop_bar_ice_01"] = true, + ["prop_bar_lemons"] = true, + ["prop_bar_limes"] = true, + ["prop_bar_measrjug"] = true, + ["prop_bar_napkindisp"] = true, + ["prop_bar_nuts"] = true, + ["prop_bar_pump_01"] = true, + ["prop_bar_pump_04"] = true, + ["prop_bar_pump_05"] = true, + ["prop_bar_pump_06"] = true, + ["prop_bar_pump_07"] = true, + ["prop_bar_pump_08"] = true, + ["prop_bar_pump_09"] = true, + ["prop_bar_pump_10"] = true, + ["prop_bar_shots"] = true, + ["prop_bar_sink_01"] = true, + ["prop_bar_stirrers"] = true, + ["prop_bar_stool_01"] = true, + ["prop_barbell_01"] = true, + ["prop_barbell_02"] = true, + ["prop_barbell_100kg"] = true, + ["prop_barbell_10kg"] = true, + ["prop_barbell_20kg"] = true, + ["prop_barbell_30kg"] = true, + ["prop_barbell_40kg"] = true, + ["prop_barbell_50kg"] = true, + ["prop_barbell_60kg"] = true, + ["prop_barbell_80kg"] = true, + ["prop_barebulb_01"] = true, + ["prop_barier_conc_01a"] = true, + ["prop_barier_conc_01b"] = true, + ["prop_barier_conc_01c"] = true, + ["prop_barier_conc_02a"] = true, + ["prop_barier_conc_02b"] = true, + ["prop_barier_conc_02c"] = true, + ["prop_barier_conc_03a"] = true, + ["prop_barier_conc_04a"] = true, + ["prop_barier_conc_05a"] = true, + ["prop_barier_conc_05b"] = true, + ["prop_barier_conc_05c"] = true, + ["prop_barn_door_l"] = true, + ["prop_barn_door_r"] = true, + ["prop_barrachneon"] = true, + ["prop_barrel_01a"] = true, + ["prop_barrel_02a"] = true, + ["prop_barrel_02b"] = true, + ["prop_barrel_03a"] = true, + ["prop_barrel_03d"] = true, + ["prop_barrel_exp_01a"] = true, + ["prop_barrel_exp_01b"] = true, + ["prop_barrel_exp_01c"] = true, + ["prop_barrel_float_1"] = true, + ["prop_barrel_float_2"] = true, + ["prop_barrel_pile_01"] = true, + ["prop_barrel_pile_02"] = true, + ["prop_barrel_pile_03"] = true, + ["prop_barrel_pile_04"] = true, + ["prop_barrel_pile_05"] = true, + ["prop_barrier_wat_01a"] = true, + ["prop_barrier_wat_03a"] = true, + ["prop_barrier_wat_03b"] = true, + ["prop_barrier_wat_04a"] = true, + ["prop_barrier_wat_04b"] = true, + ["prop_barrier_wat_04c"] = true, + ["prop_barrier_work01a"] = true, + ["prop_barrier_work01b"] = true, + ["prop_barrier_work01c"] = true, + ["prop_barrier_work01d"] = true, + ["prop_barrier_work02a"] = true, + ["prop_barrier_work04a"] = true, + ["prop_barrier_work05"] = true, + ["prop_barrier_work06a"] = true, + ["prop_barrier_work06b"] = true, + ["prop_barriercrash_01"] = true, + ["prop_barriercrash_02"] = true, + ["prop_barriercrash_03"] = true, + ["prop_barriercrash_04"] = true, + ["prop_barry_table_detail"] = true, + ["prop_basejump_target_01"] = true, + ["prop_basketball_net"] = true, + ["prop_battery_01"] = true, + ["prop_battery_02"] = true, + ["prop_bball_arcade_01"] = true, + ["prop_bbq_1"] = true, + ["prop_bbq_2"] = true, + ["prop_bbq_3"] = true, + ["prop_bbq_4"] = true, + ["prop_bbq_4_l1"] = true, + ["prop_bbq_5"] = true, + ["prop_beach_bag_01a"] = true, + ["prop_beach_bag_01b"] = true, + ["prop_beach_bag_02"] = true, + ["prop_beach_bag_03"] = true, + ["prop_beach_bars_01"] = true, + ["prop_beach_bars_02"] = true, + ["prop_beach_bbq"] = true, + ["prop_beach_dip_bars_01"] = true, + ["prop_beach_dip_bars_02"] = true, + ["prop_beach_fire"] = true, + ["prop_beach_lg_float"] = true, + ["prop_beach_lg_stretch"] = true, + ["prop_beach_lg_surf"] = true, + ["prop_beach_lilo_01"] = true, + ["prop_beach_lilo_02"] = true, + ["prop_beach_lotion_01"] = true, + ["prop_beach_lotion_02"] = true, + ["prop_beach_lotion_03"] = true, + ["prop_beach_parasol_01"] = true, + ["prop_beach_parasol_02"] = true, + ["prop_beach_parasol_03"] = true, + ["prop_beach_parasol_04"] = true, + ["prop_beach_parasol_05"] = true, + ["prop_beach_parasol_06"] = true, + ["prop_beach_parasol_07"] = true, + ["prop_beach_parasol_08"] = true, + ["prop_beach_parasol_09"] = true, + ["prop_beach_parasol_10"] = true, + ["prop_beach_punchbag"] = true, + ["prop_beach_ring_01"] = true, + ["prop_beach_rings_01"] = true, + ["prop_beach_sandcas_01"] = true, + ["prop_beach_sandcas_03"] = true, + ["prop_beach_sandcas_04"] = true, + ["prop_beach_sandcas_05"] = true, + ["prop_beach_sculp_01"] = true, + ["prop_beach_towel_01"] = true, + ["prop_beach_towel_02"] = true, + ["prop_beach_towel_03"] = true, + ["prop_beach_towel_04"] = true, + ["prop_beach_volball01"] = true, + ["prop_beach_volball02"] = true, + ["prop_beachbag_01"] = true, + ["prop_beachbag_02"] = true, + ["prop_beachbag_03"] = true, + ["prop_beachbag_04"] = true, + ["prop_beachbag_05"] = true, + ["prop_beachbag_06"] = true, + ["prop_beachbag_combo_01"] = true, + ["prop_beachbag_combo_02"] = true, + ["prop_beachball_01"] = true, + ["prop_beachball_02"] = true, + ["prop_beachf_01_cr"] = true, + ["prop_beachflag_01"] = true, + ["prop_beachflag_02"] = true, + ["prop_beachflag_le"] = true, + ["prop_beer_am"] = true, + ["prop_beer_amopen"] = true, + ["prop_beer_bar"] = true, + ["prop_beer_bison"] = true, + ["prop_beer_blr"] = true, + ["prop_beer_bottle"] = true, + ["prop_beer_box_01"] = true, + ["prop_beer_jakey"] = true, + ["prop_beer_logger"] = true, + ["prop_beer_logopen"] = true, + ["prop_beer_neon_01"] = true, + ["prop_beer_neon_02"] = true, + ["prop_beer_neon_03"] = true, + ["prop_beer_neon_04"] = true, + ["prop_beer_patriot"] = true, + ["prop_beer_pissh"] = true, + ["prop_beer_pride"] = true, + ["prop_beer_stz"] = true, + ["prop_beer_stzopen"] = true, + ["prop_beerdusche"] = true, + ["prop_beerneon"] = true, + ["prop_beggers_sign_01"] = true, + ["prop_beggers_sign_02"] = true, + ["prop_beggers_sign_03"] = true, + ["prop_beggers_sign_04"] = true, + ["prop_bench_01a"] = true, + ["prop_bench_01b"] = true, + ["prop_bench_01c"] = true, + ["prop_bench_02"] = true, + ["prop_bench_03"] = true, + ["prop_bench_04"] = true, + ["prop_bench_05"] = true, + ["prop_bench_06"] = true, + ["prop_bench_07"] = true, + ["prop_bench_08"] = true, + ["prop_bench_09"] = true, + ["prop_bench_10"] = true, + ["prop_bench_11"] = true, + ["prop_beta_tape"] = true, + ["prop_beware_dog_sign"] = true, + ["prop_bh1_03_gate_l"] = true, + ["prop_bh1_03_gate_r"] = true, + ["prop_bh1_08_mp_gar"] = true, + ["prop_bh1_09_mp_gar"] = true, + ["prop_bh1_09_mp_l"] = true, + ["prop_bh1_09_mp_r"] = true, + ["prop_bh1_16_display"] = true, + ["prop_bh1_44_door_01l"] = true, + ["prop_bh1_44_door_01r"] = true, + ["prop_bh1_48_backdoor_l"] = true, + ["prop_bh1_48_backdoor_r"] = true, + ["prop_bh1_48_gate_1"] = true, + ["prop_bhhotel_door_l"] = true, + ["prop_bhhotel_door_r"] = true, + ["prop_big_bag_01"] = true, + ["prop_big_cin_screen"] = true, + ["prop_big_clock_01"] = true, + ["prop_big_shit_01"] = true, + ["prop_big_shit_02"] = true, + ["prop_bikerack_1a"] = true, + ["prop_bikerack_2"] = true, + ["prop_bikerset"] = true, + ["prop_bikini_disp_01"] = true, + ["prop_bikini_disp_02"] = true, + ["prop_bikini_disp_03"] = true, + ["prop_bikini_disp_04"] = true, + ["prop_bikini_disp_05"] = true, + ["prop_bikini_disp_06"] = true, + ["prop_billb_frame01a"] = true, + ["prop_billb_frame01b"] = true, + ["prop_billb_frame03a"] = true, + ["prop_billb_frame03b"] = true, + ["prop_billb_frame03c"] = true, + ["prop_billb_frame04a"] = true, + ["prop_billb_frame04b"] = true, + ["prop_billboard_01"] = true, + ["prop_billboard_02"] = true, + ["prop_billboard_03"] = true, + ["prop_billboard_04"] = true, + ["prop_billboard_05"] = true, + ["prop_billboard_06"] = true, + ["prop_billboard_07"] = true, + ["prop_billboard_08"] = true, + ["prop_billboard_09"] = true, + ["prop_billboard_09wall"] = true, + ["prop_billboard_10"] = true, + ["prop_billboard_11"] = true, + ["prop_billboard_12"] = true, + ["prop_billboard_13"] = true, + ["prop_billboard_14"] = true, + ["prop_billboard_15"] = true, + ["prop_billboard_16"] = true, + ["prop_bin_01a"] = true, + ["prop_bin_02a"] = true, + ["prop_bin_03a"] = true, + ["prop_bin_04a"] = true, + ["prop_bin_05a"] = true, + ["prop_bin_06a"] = true, + ["prop_bin_07a"] = true, + ["prop_bin_07b"] = true, + ["prop_bin_07c"] = true, + ["prop_bin_07d"] = true, + ["prop_bin_08a"] = true, + ["prop_bin_08open"] = true, + ["prop_bin_09a"] = true, + ["prop_bin_10a"] = true, + ["prop_bin_10b"] = true, + ["prop_bin_11a"] = true, + ["prop_bin_11b"] = true, + ["prop_bin_12a"] = true, + ["prop_bin_13a"] = true, + ["prop_bin_14a"] = true, + ["prop_bin_14b"] = true, + ["prop_bin_beach_01a"] = true, + ["prop_bin_beach_01d"] = true, + ["prop_bin_delpiero"] = true, + ["prop_bin_delpiero_b"] = true, + ["prop_binoc_01"] = true, + ["prop_biolab_g_door"] = true, + ["prop_biotech_store"] = true, + ["prop_bird_poo"] = true, + ["prop_birdbath1"] = true, + ["prop_birdbath2"] = true, + ["prop_birdbathtap"] = true, + ["prop_bison_winch"] = true, + ["prop_blackjack_01"] = true, + ["prop_bleachers_01"] = true, + ["prop_bleachers_02"] = true, + ["prop_bleachers_03"] = true, + ["prop_bleachers_04"] = true, + ["prop_bleachers_04_cr"] = true, + ["prop_bleachers_05"] = true, + ["prop_bleachers_05_cr"] = true, + ["prop_blox_spray"] = true, + ["prop_bmu_01"] = true, + ["prop_bmu_01_b"] = true, + ["prop_bmu_02"] = true, + ["prop_bmu_02_ld"] = true, + ["prop_bmu_02_ld_cab"] = true, + ["prop_bmu_02_ld_sup"] = true, + ["prop_bmu_track01"] = true, + ["prop_bmu_track02"] = true, + ["prop_bmu_track03"] = true, + ["prop_bodyarmour_02"] = true, + ["prop_bodyarmour_03"] = true, + ["prop_bodyarmour_04"] = true, + ["prop_bodyarmour_05"] = true, + ["prop_bodyarmour_06"] = true, + ["prop_bollard_01a"] = true, + ["prop_bollard_01b"] = true, + ["prop_bollard_01c"] = true, + ["prop_bollard_02a"] = true, + ["prop_bollard_02b"] = true, + ["prop_bollard_02c"] = true, + ["prop_bollard_03a"] = true, + ["prop_bollard_04"] = true, + ["prop_bollard_05"] = true, + ["prop_bomb_01"] = true, + ["prop_bomb_01_s"] = true, + ["prop_bonesaw"] = true, + ["prop_bong_01"] = true, + ["prop_bongos_01"] = true, + ["prop_boogbd_stack_01"] = true, + ["prop_boogbd_stack_02"] = true, + ["prop_boogieboard_01"] = true, + ["prop_boogieboard_02"] = true, + ["prop_boogieboard_03"] = true, + ["prop_boogieboard_04"] = true, + ["prop_boogieboard_05"] = true, + ["prop_boogieboard_06"] = true, + ["prop_boogieboard_07"] = true, + ["prop_boogieboard_08"] = true, + ["prop_boogieboard_09"] = true, + ["prop_boogieboard_10"] = true, + ["prop_boombox_01"] = true, + ["prop_bottle_brandy"] = true, + ["prop_bottle_cap_01"] = true, + ["prop_bottle_cognac"] = true, + ["prop_bottle_macbeth"] = true, + ["prop_bottle_richard"] = true, + ["prop_bowl_crisps"] = true, + ["prop_bowling_ball"] = true, + ["prop_bowling_pin"] = true, + ["prop_box_ammo01a"] = true, + ["prop_box_ammo02a"] = true, + ["prop_box_ammo03a"] = true, + ["prop_box_ammo03a_set"] = true, + ["prop_box_ammo03a_set2"] = true, + ["prop_box_ammo04a"] = true, + ["prop_box_ammo05b"] = true, + ["prop_box_ammo06a"] = true, + ["prop_box_ammo07a"] = true, + ["prop_box_ammo07b"] = true, + ["prop_box_guncase_01a"] = true, + ["prop_box_guncase_02a"] = true, + ["prop_box_guncase_03a"] = true, + ["prop_box_tea01a"] = true, + ["prop_box_wood01a"] = true, + ["prop_box_wood02a"] = true, + ["prop_box_wood02a_mws"] = true, + ["prop_box_wood02a_pu"] = true, + ["prop_box_wood03a"] = true, + ["prop_box_wood04a"] = true, + ["prop_box_wood05a"] = true, + ["prop_box_wood05b"] = true, + ["prop_box_wood06a"] = true, + ["prop_box_wood07a"] = true, + ["prop_box_wood08a"] = true, + ["prop_boxcar5_handle"] = true, + ["prop_boxing_glove_01"] = true, + ["prop_boxpile_01a"] = true, + ["prop_boxpile_02b"] = true, + ["prop_boxpile_02c"] = true, + ["prop_boxpile_02d"] = true, + ["prop_boxpile_03a"] = true, + ["prop_boxpile_04a"] = true, + ["prop_boxpile_05a"] = true, + ["prop_boxpile_06a"] = true, + ["prop_boxpile_06b"] = true, + ["prop_boxpile_07a"] = true, + ["prop_boxpile_07d"] = true, + ["prop_boxpile_08a"] = true, + ["prop_boxpile_09a"] = true, + ["prop_boxpile_10a"] = true, + ["prop_boxpile_10b"] = true, + ["prop_brandy_glass"] = true, + ["prop_bread_rack_01"] = true, + ["prop_bread_rack_02"] = true, + ["prop_breadbin_01"] = true, + ["prop_break_skylight_01"] = true, + ["prop_broken_cboard_p1"] = true, + ["prop_broken_cboard_p2"] = true, + ["prop_broken_cell_gate_01"] = true, + ["prop_bs_map_door_01"] = true, + ["prop_bskball_01"] = true, + ["prop_buck_spade_01"] = true, + ["prop_buck_spade_02"] = true, + ["prop_buck_spade_03"] = true, + ["prop_buck_spade_04"] = true, + ["prop_buck_spade_05"] = true, + ["prop_buck_spade_06"] = true, + ["prop_buck_spade_07"] = true, + ["prop_buck_spade_08"] = true, + ["prop_buck_spade_09"] = true, + ["prop_buck_spade_10"] = true, + ["prop_bucket_01a"] = true, + ["prop_bucket_01b"] = true, + ["prop_bucket_02a"] = true, + ["prop_buckets_02"] = true, + ["prop_bumper_01"] = true, + ["prop_bumper_02"] = true, + ["prop_bumper_03"] = true, + ["prop_bumper_04"] = true, + ["prop_bumper_05"] = true, + ["prop_bumper_06"] = true, + ["prop_bumper_car_01"] = true, + ["prop_burgerstand_01"] = true, + ["prop_burto_gate_01"] = true, + ["prop_bus_stop_sign"] = true, + ["prop_bush_dead_02"] = true, + ["prop_bush_grape_01"] = true, + ["prop_bush_ivy_01_1m"] = true, + ["prop_bush_ivy_01_2m"] = true, + ["prop_bush_ivy_01_bk"] = true, + ["prop_bush_ivy_01_l"] = true, + ["prop_bush_ivy_01_pot"] = true, + ["prop_bush_ivy_01_r"] = true, + ["prop_bush_ivy_01_top"] = true, + ["prop_bush_ivy_02_1m"] = true, + ["prop_bush_ivy_02_2m"] = true, + ["prop_bush_ivy_02_l"] = true, + ["prop_bush_ivy_02_pot"] = true, + ["prop_bush_ivy_02_r"] = true, + ["prop_bush_ivy_02_top"] = true, + ["prop_bush_lrg_01"] = true, + ["prop_bush_lrg_01b"] = true, + ["prop_bush_lrg_01c"] = true, + ["prop_bush_lrg_01c_cr"] = true, + ["prop_bush_lrg_01d"] = true, + ["prop_bush_lrg_01e"] = true, + ["prop_bush_lrg_01e_cr"] = true, + ["prop_bush_lrg_01e_cr2"] = true, + ["prop_bush_lrg_02"] = true, + ["prop_bush_lrg_02b"] = true, + ["prop_bush_lrg_03"] = true, + ["prop_bush_lrg_04b"] = true, + ["prop_bush_lrg_04c"] = true, + ["prop_bush_lrg_04d"] = true, + ["prop_bush_med_01"] = true, + ["prop_bush_med_02"] = true, + ["prop_bush_med_03"] = true, + ["prop_bush_med_03_cr"] = true, + ["prop_bush_med_03_cr2"] = true, + ["prop_bush_med_05"] = true, + ["prop_bush_med_06"] = true, + ["prop_bush_med_07"] = true, + ["prop_bush_neat_01"] = true, + ["prop_bush_neat_02"] = true, + ["prop_bush_neat_03"] = true, + ["prop_bush_neat_04"] = true, + ["prop_bush_neat_05"] = true, + ["prop_bush_neat_06"] = true, + ["prop_bush_neat_07"] = true, + ["prop_bush_neat_08"] = true, + ["prop_bush_ornament_01"] = true, + ["prop_bush_ornament_02"] = true, + ["prop_bush_ornament_03"] = true, + ["prop_bush_ornament_04"] = true, + ["prop_busker_hat_01"] = true, + ["prop_busstop_02"] = true, + ["prop_busstop_04"] = true, + ["prop_busstop_05"] = true, + ["prop_byard_bench01"] = true, + ["prop_byard_bench02"] = true, + ["prop_byard_benchset"] = true, + ["prop_byard_block_01"] = true, + ["prop_byard_boat01"] = true, + ["prop_byard_boat02"] = true, + ["prop_byard_chains01"] = true, + ["prop_byard_dingy"] = true, + ["prop_byard_elecbox01"] = true, + ["prop_byard_elecbox02"] = true, + ["prop_byard_elecbox03"] = true, + ["prop_byard_elecbox04"] = true, + ["prop_byard_float_01"] = true, + ["prop_byard_float_01b"] = true, + ["prop_byard_float_02"] = true, + ["prop_byard_float_02b"] = true, + ["prop_byard_floatpile"] = true, + ["prop_byard_gastank01"] = true, + ["prop_byard_gastank02"] = true, + ["prop_byard_hoist"] = true, + ["prop_byard_hoist_2"] = true, + ["prop_byard_hoses01"] = true, + ["prop_byard_hoses02"] = true, + ["prop_byard_ladder01"] = true, + ["prop_byard_lifering"] = true, + ["prop_byard_machine01"] = true, + ["prop_byard_machine02"] = true, + ["prop_byard_machine03"] = true, + ["prop_byard_motor_01"] = true, + ["prop_byard_motor_02"] = true, + ["prop_byard_motor_03"] = true, + ["prop_byard_net02"] = true, + ["prop_byard_phone"] = true, + ["prop_byard_pipe_01"] = true, + ["prop_byard_pipes01"] = true, + ["prop_byard_planks01"] = true, + ["prop_byard_pulley01"] = true, + ["prop_byard_rack"] = true, + ["prop_byard_ramp"] = true, + ["prop_byard_rampold"] = true, + ["prop_byard_rampold_cr"] = true, + ["prop_byard_rowboat1"] = true, + ["prop_byard_rowboat2"] = true, + ["prop_byard_rowboat3"] = true, + ["prop_byard_rowboat4"] = true, + ["prop_byard_rowboat5"] = true, + ["prop_byard_scfhold01"] = true, + ["prop_byard_sleeper01"] = true, + ["prop_byard_sleeper02"] = true, + ["prop_byard_steps_01"] = true, + ["prop_byard_tank_01"] = true, + ["prop_byard_trailer01"] = true, + ["prop_byard_trailer02"] = true, + ["prop_c4_final"] = true, + ["prop_c4_final_green"] = true, + ["prop_c4_num_0001"] = true, + ["prop_c4_num_0002"] = true, + ["prop_c4_num_0003"] = true, + ["prop_cabinet_01"] = true, + ["prop_cabinet_01b"] = true, + ["prop_cabinet_02b"] = true, + ["prop_cable_hook_01"] = true, + ["prop_cablespool_01a"] = true, + ["prop_cablespool_01b"] = true, + ["prop_cablespool_02"] = true, + ["prop_cablespool_03"] = true, + ["prop_cablespool_04"] = true, + ["prop_cablespool_05"] = true, + ["prop_cablespool_06"] = true, + ["prop_cactus_01a"] = true, + ["prop_cactus_01b"] = true, + ["prop_cactus_01c"] = true, + ["prop_cactus_01d"] = true, + ["prop_cactus_01e"] = true, + ["prop_cactus_02"] = true, + ["prop_cactus_03"] = true, + ["prop_camera_strap"] = true, + ["prop_can_canoe"] = true, + ["prop_candy_pqs"] = true, + ["prop_cap_01"] = true, + ["prop_cap_01b"] = true, + ["prop_cap_row_01"] = true, + ["prop_cap_row_01b"] = true, + ["prop_cap_row_02"] = true, + ["prop_cap_row_02b"] = true, + ["prop_car_battery_01"] = true, + ["prop_car_bonnet_01"] = true, + ["prop_car_bonnet_02"] = true, + ["prop_car_door_01"] = true, + ["prop_car_door_02"] = true, + ["prop_car_door_03"] = true, + ["prop_car_door_04"] = true, + ["prop_car_engine_01"] = true, + ["prop_car_exhaust_01"] = true, + ["prop_car_ignition"] = true, + ["prop_car_seat"] = true, + ["prop_carcreeper"] = true, + ["prop_cardbordbox_01a"] = true, + ["prop_cardbordbox_02a"] = true, + ["prop_cardbordbox_03a"] = true, + ["prop_cardbordbox_04a"] = true, + ["prop_cardbordbox_05a"] = true, + ["prop_cargo_int"] = true, + ["prop_carjack"] = true, + ["prop_carjack_l2"] = true, + ["prop_carrier_bag_01"] = true, + ["prop_carrier_bag_01_lod"] = true, + ["prop_cartwheel_01"] = true, + ["prop_carwash_roller_horz"] = true, + ["prop_carwash_roller_vert"] = true, + ["prop_casey_sec_id"] = true, + ["prop_cash_case_01"] = true, + ["prop_cash_case_02"] = true, + ["prop_cash_crate_01"] = true, + ["prop_cash_dep_bag_01"] = true, + ["prop_cash_depot_billbrd"] = true, + ["prop_cash_envelope_01"] = true, + ["prop_cash_note_01"] = true, + ["prop_cash_pile_01"] = true, + ["prop_cash_pile_02"] = true, + ["prop_cash_trolly"] = true, + ["prop_casino_door_01l"] = true, + ["prop_casino_door_01r"] = true, + ["prop_cat_tail_01"] = true, + ["prop_cattlecrush"] = true, + ["prop_cava"] = true, + ["prop_cctv_01_sm"] = true, + ["prop_cctv_01_sm_02"] = true, + ["prop_cctv_02_sm"] = true, + ["prop_cctv_cam_01a"] = true, + ["prop_cctv_cam_01b"] = true, + ["prop_cctv_cam_02a"] = true, + ["prop_cctv_cam_03a"] = true, + ["prop_cctv_cam_04a"] = true, + ["prop_cctv_cam_04b"] = true, + ["prop_cctv_cam_04c"] = true, + ["prop_cctv_cam_05a"] = true, + ["prop_cctv_cam_06a"] = true, + ["prop_cctv_cam_07a"] = true, + ["prop_cctv_cont_01"] = true, + ["prop_cctv_cont_02"] = true, + ["prop_cctv_cont_03"] = true, + ["prop_cctv_cont_04"] = true, + ["prop_cctv_cont_05"] = true, + ["prop_cctv_cont_06"] = true, + ["prop_cctv_mon_02"] = true, + ["prop_cctv_pole_01a"] = true, + ["prop_cctv_pole_02"] = true, + ["prop_cctv_pole_03"] = true, + ["prop_cctv_pole_04"] = true, + ["prop_cctv_unit_01"] = true, + ["prop_cctv_unit_02"] = true, + ["prop_cctv_unit_03"] = true, + ["prop_cctv_unit_04"] = true, + ["prop_cctv_unit_05"] = true, + ["prop_cd_folder_pile1"] = true, + ["prop_cd_folder_pile2"] = true, + ["prop_cd_folder_pile3"] = true, + ["prop_cd_folder_pile4"] = true, + ["prop_cd_lamp"] = true, + ["prop_cd_paper_pile1"] = true, + ["prop_cd_paper_pile2"] = true, + ["prop_cd_paper_pile3"] = true, + ["prop_cementbags01"] = true, + ["prop_cementmixer_01a"] = true, + ["prop_cementmixer_02a"] = true, + ["prop_ceramic_jug_01"] = true, + ["prop_ceramic_jug_cork"] = true, + ["prop_ch_025c_g_door_01"] = true, + ["prop_ch1_02_glass_01"] = true, + ["prop_ch1_02_glass_02"] = true, + ["prop_ch1_07_door_01l"] = true, + ["prop_ch1_07_door_01r"] = true, + ["prop_ch1_07_door_02l"] = true, + ["prop_ch1_07_door_02r"] = true, + ["prop_ch2_05d_g_door"] = true, + ["prop_ch2_07b_20_g_door"] = true, + ["prop_ch2_09b_door"] = true, + ["prop_ch2_09c_garage_door"] = true, + ["prop_ch2_wdfence_01"] = true, + ["prop_ch2_wdfence_02"] = true, + ["prop_ch3_01_trlrdoor_l"] = true, + ["prop_ch3_01_trlrdoor_r"] = true, + ["prop_ch3_04_door_01l"] = true, + ["prop_ch3_04_door_01r"] = true, + ["prop_ch3_04_door_02"] = true, + ["prop_chair_01a"] = true, + ["prop_chair_01b"] = true, + ["prop_chair_02"] = true, + ["prop_chair_03"] = true, + ["prop_chair_04a"] = true, + ["prop_chair_04b"] = true, + ["prop_chair_05"] = true, + ["prop_chair_06"] = true, + ["prop_chair_07"] = true, + ["prop_chair_08"] = true, + ["prop_chair_09"] = true, + ["prop_chair_10"] = true, + ["prop_chair_pile_01"] = true, + ["prop_chall_lamp_01"] = true, + ["prop_chall_lamp_01n"] = true, + ["prop_chall_lamp_02"] = true, + ["prop_champ_01a"] = true, + ["prop_champ_01b"] = true, + ["prop_champ_box_01"] = true, + ["prop_champ_cool"] = true, + ["prop_champ_flute"] = true, + ["prop_champ_jer_01a"] = true, + ["prop_champ_jer_01b"] = true, + ["prop_champset"] = true, + ["prop_chateau_chair_01"] = true, + ["prop_chateau_table_01"] = true, + ["prop_cheetah_covered"] = true, + ["prop_chem_grill"] = true, + ["prop_chem_grill_bit"] = true, + ["prop_chem_vial_02"] = true, + ["prop_chem_vial_02b"] = true, + ["prop_cherenkov_01"] = true, + ["prop_cherenkov_02"] = true, + ["prop_cherenkov_03"] = true, + ["prop_cherenkov_04"] = true, + ["prop_cherenneon"] = true, + ["prop_chickencoop_a"] = true, + ["prop_chip_fryer"] = true, + ["prop_choc_ego"] = true, + ["prop_choc_meto"] = true, + ["prop_choc_pq"] = true, + ["prop_cigar_01"] = true, + ["prop_cigar_02"] = true, + ["prop_cigar_03"] = true, + ["prop_cigar_pack_01"] = true, + ["prop_cigar_pack_02"] = true, + ["prop_cj_big_boat"] = true, + ["prop_clapper_brd_01"] = true, + ["prop_cleaning_trolly"] = true, + ["prop_cleaver"] = true, + ["prop_cliff_paper"] = true, + ["prop_clippers_01"] = true, + ["prop_clothes_rail_01"] = true, + ["prop_clothes_rail_02"] = true, + ["prop_clothes_rail_03"] = true, + ["prop_clothes_rail_2b"] = true, + ["prop_clothes_tub_01"] = true, + ["prop_clown_chair"] = true, + ["prop_clubset"] = true, + ["prop_cntrdoor_ld_l"] = true, + ["prop_cntrdoor_ld_r"] = true, + ["prop_coathook_01"] = true, + ["prop_cockneon"] = true, + ["prop_cocktail"] = true, + ["prop_cocktail_glass"] = true, + ["prop_coffee_cup_trailer"] = true, + ["prop_coffee_mac_01"] = true, + ["prop_coffee_mac_02"] = true, + ["prop_coffin_01"] = true, + ["prop_coffin_02"] = true, + ["prop_coffin_02b"] = true, + ["prop_coke_block_01"] = true, + ["prop_coke_block_half_a"] = true, + ["prop_coke_block_half_b"] = true, + ["prop_com_gar_door_01"] = true, + ["prop_com_ls_door_01"] = true, + ["prop_compressor_01"] = true, + ["prop_compressor_02"] = true, + ["prop_compressor_03"] = true, + ["prop_conc_blocks01a"] = true, + ["prop_conc_blocks01b"] = true, + ["prop_conc_blocks01c"] = true, + ["prop_conc_sacks_02a"] = true, + ["prop_cone_float_1"] = true, + ["prop_cons_cements01"] = true, + ["prop_cons_crate"] = true, + ["prop_cons_plank"] = true, + ["prop_cons_ply01"] = true, + ["prop_cons_ply02"] = true, + ["prop_cons_plyboard_01"] = true, + ["prop_conschute"] = true, + ["prop_consign_01a"] = true, + ["prop_consign_01b"] = true, + ["prop_consign_01c"] = true, + ["prop_consign_02a"] = true, + ["prop_conslift_base"] = true, + ["prop_conslift_brace"] = true, + ["prop_conslift_cage"] = true, + ["prop_conslift_door"] = true, + ["prop_conslift_lift"] = true, + ["prop_conslift_rail"] = true, + ["prop_conslift_rail2"] = true, + ["prop_conslift_steps"] = true, + ["prop_console_01"] = true, + ["prop_const_fence01a"] = true, + ["prop_const_fence01b"] = true, + ["prop_const_fence01b_cr"] = true, + ["prop_const_fence02a"] = true, + ["prop_const_fence02b"] = true, + ["prop_const_fence03a_cr"] = true, + ["prop_const_fence03b"] = true, + ["prop_const_fence03b_cr"] = true, + ["prop_construcionlamp_01"] = true, + ["prop_cont_chiller_01"] = true, + ["prop_container_01a"] = true, + ["prop_container_01b"] = true, + ["prop_container_01c"] = true, + ["prop_container_01d"] = true, + ["prop_container_01e"] = true, + ["prop_container_01f"] = true, + ["prop_container_01g"] = true, + ["prop_container_01h"] = true, + ["prop_container_01mb"] = true, + ["prop_container_02a"] = true, + ["prop_container_03_ld"] = true, + ["prop_container_03a"] = true, + ["prop_container_03b"] = true, + ["prop_container_03mb"] = true, + ["prop_container_04a"] = true, + ["prop_container_04mb"] = true, + ["prop_container_05a"] = true, + ["prop_container_05mb"] = true, + ["prop_container_door_mb_l"] = true, + ["prop_container_door_mb_r"] = true, + ["prop_container_hole"] = true, + ["prop_container_ld"] = true, + ["prop_container_ld_d"] = true, + ["prop_container_ld_pu"] = true, + ["prop_container_ld2"] = true, + ["prop_container_old1"] = true, + ["prop_contnr_pile_01a"] = true, + ["prop_contr_03b_ld"] = true, + ["prop_control_rm_door_01"] = true, + ["prop_controller_01"] = true, + ["prop_cooker_03"] = true, + ["prop_coolbox_01"] = true, + ["prop_copier_01"] = true, + ["prop_copper_pan"] = true, + ["prop_cora_clam_01"] = true, + ["prop_coral_01"] = true, + ["prop_coral_02"] = true, + ["prop_coral_03"] = true, + ["prop_coral_bush_01"] = true, + ["prop_coral_flat_01"] = true, + ["prop_coral_flat_01_l1"] = true, + ["prop_coral_flat_02"] = true, + ["prop_coral_flat_brainy"] = true, + ["prop_coral_flat_clam"] = true, + ["prop_coral_grass_01"] = true, + ["prop_coral_grass_02"] = true, + ["prop_coral_kelp_01"] = true, + ["prop_coral_kelp_01_l1"] = true, + ["prop_coral_kelp_02"] = true, + ["prop_coral_kelp_02_l1"] = true, + ["prop_coral_kelp_03"] = true, + ["prop_coral_kelp_03_l1"] = true, + ["prop_coral_kelp_03a"] = true, + ["prop_coral_kelp_03b"] = true, + ["prop_coral_kelp_03c"] = true, + ["prop_coral_kelp_03d"] = true, + ["prop_coral_kelp_04"] = true, + ["prop_coral_kelp_04_l1"] = true, + ["prop_coral_pillar_01"] = true, + ["prop_coral_pillar_02"] = true, + ["prop_coral_spikey_01"] = true, + ["prop_coral_stone_03"] = true, + ["prop_coral_stone_04"] = true, + ["prop_coral_sweed_01"] = true, + ["prop_coral_sweed_02"] = true, + ["prop_coral_sweed_03"] = true, + ["prop_coral_sweed_04"] = true, + ["prop_cork_board"] = true, + ["prop_couch_01"] = true, + ["prop_couch_03"] = true, + ["prop_couch_04"] = true, + ["prop_couch_lg_02"] = true, + ["prop_couch_lg_05"] = true, + ["prop_couch_lg_06"] = true, + ["prop_couch_lg_07"] = true, + ["prop_couch_lg_08"] = true, + ["prop_couch_sm_02"] = true, + ["prop_couch_sm_05"] = true, + ["prop_couch_sm_06"] = true, + ["prop_couch_sm_07"] = true, + ["prop_couch_sm1_07"] = true, + ["prop_couch_sm2_07"] = true, + ["prop_crane_01_truck1"] = true, + ["prop_crane_01_truck2"] = true, + ["prop_cranial_saw"] = true, + ["prop_crashed_heli"] = true, + ["prop_crate_01a"] = true, + ["prop_crate_02a"] = true, + ["prop_crate_03a"] = true, + ["prop_crate_04a"] = true, + ["prop_crate_05a"] = true, + ["prop_crate_06a"] = true, + ["prop_crate_07a"] = true, + ["prop_crate_08a"] = true, + ["prop_crate_09a"] = true, + ["prop_crate_10a"] = true, + ["prop_crate_11a"] = true, + ["prop_crate_11b"] = true, + ["prop_crate_11c"] = true, + ["prop_crate_11d"] = true, + ["prop_crate_11e"] = true, + ["prop_crate_float_1"] = true, + ["prop_cratepile_01a"] = true, + ["prop_cratepile_02a"] = true, + ["prop_cratepile_03a"] = true, + ["prop_cratepile_05a"] = true, + ["prop_cratepile_07a"] = true, + ["prop_cratepile_07a_l1"] = true, + ["prop_creosote_b_01"] = true, + ["prop_crisp"] = true, + ["prop_crisp_small"] = true, + ["prop_crosssaw_01"] = true, + ["prop_crt_mon_01"] = true, + ["prop_crt_mon_02"] = true, + ["prop_cs_20m_rope"] = true, + ["prop_cs_30m_rope"] = true, + ["prop_cs_abattoir_switch"] = true, + ["prop_cs_aircon_01"] = true, + ["prop_cs_aircon_fan"] = true, + ["prop_cs_amanda_shoe"] = true, + ["prop_cs_ashtray"] = true, + ["prop_cs_bandana"] = true, + ["prop_cs_bar"] = true, + ["prop_cs_beachtowel_01"] = true, + ["prop_cs_beer_bot_01"] = true, + ["prop_cs_beer_bot_01b"] = true, + ["prop_cs_beer_bot_01lod"] = true, + ["prop_cs_beer_bot_02"] = true, + ["prop_cs_beer_bot_03"] = true, + ["prop_cs_beer_bot_40oz"] = true, + ["prop_cs_beer_bot_40oz_02"] = true, + ["prop_cs_beer_bot_40oz_03"] = true, + ["prop_cs_beer_bot_test"] = true, + ["prop_cs_beer_box"] = true, + ["prop_cs_bin_01"] = true, + ["prop_cs_bin_01_lid"] = true, + ["prop_cs_bin_01_skinned"] = true, + ["prop_cs_bin_02"] = true, + ["prop_cs_bin_03"] = true, + ["prop_cs_binder_01"] = true, + ["prop_cs_book_01"] = true, + ["prop_cs_bottle_opener"] = true, + ["prop_cs_bowie_knife"] = true, + ["prop_cs_bowl_01"] = true, + ["prop_cs_bowl_01b"] = true, + ["prop_cs_box_clothes"] = true, + ["prop_cs_box_step"] = true, + ["prop_cs_brain_chunk"] = true, + ["prop_cs_bs_cup"] = true, + ["prop_cs_bucket_s"] = true, + ["prop_cs_bucket_s_lod"] = true, + ["prop_cs_burger_01"] = true, + ["prop_cs_business_card"] = true, + ["prop_cs_cardbox_01"] = true, + ["prop_cs_cash_note_01"] = true, + ["prop_cs_cashenvelope"] = true, + ["prop_cs_cctv"] = true, + ["prop_cs_champ_flute"] = true, + ["prop_cs_ciggy_01"] = true, + ["prop_cs_ciggy_01b"] = true, + ["prop_cs_clothes_box"] = true, + ["prop_cs_coke_line"] = true, + ["prop_cs_cont_latch"] = true, + ["prop_cs_crackpipe"] = true, + ["prop_cs_credit_card"] = true, + ["prop_cs_creeper_01"] = true, + ["prop_cs_crisps_01"] = true, + ["prop_cs_cuffs_01"] = true, + ["prop_cs_diaphram"] = true, + ["prop_cs_dildo_01"] = true, + ["prop_cs_documents_01"] = true, + ["prop_cs_dog_lead_2a"] = true, + ["prop_cs_dog_lead_2b"] = true, + ["prop_cs_dog_lead_2c"] = true, + ["prop_cs_dog_lead_3a"] = true, + ["prop_cs_dog_lead_3b"] = true, + ["prop_cs_dog_lead_a"] = true, + ["prop_cs_dog_lead_a_s"] = true, + ["prop_cs_dog_lead_b"] = true, + ["prop_cs_dog_lead_b_s"] = true, + ["prop_cs_dog_lead_c"] = true, + ["prop_cs_duffel_01"] = true, + ["prop_cs_duffel_01b"] = true, + ["prop_cs_dumpster_01a"] = true, + ["prop_cs_dumpster_lidl"] = true, + ["prop_cs_dumpster_lidr"] = true, + ["prop_cs_dvd"] = true, + ["prop_cs_dvd_case"] = true, + ["prop_cs_dvd_player"] = true, + ["prop_cs_envolope_01"] = true, + ["prop_cs_fertilizer"] = true, + ["prop_cs_film_reel_01"] = true, + ["prop_cs_focussheet1"] = true, + ["prop_cs_folding_chair_01"] = true, + ["prop_cs_fork"] = true, + ["prop_cs_frank_photo"] = true, + ["prop_cs_freightdoor_l1"] = true, + ["prop_cs_freightdoor_r1"] = true, + ["prop_cs_fridge"] = true, + ["prop_cs_fridge_door"] = true, + ["prop_cs_fuel_hose"] = true, + ["prop_cs_fuel_nozle"] = true, + ["prop_cs_gascutter_1"] = true, + ["prop_cs_gascutter_2"] = true, + ["prop_cs_glass_scrap"] = true, + ["prop_cs_gravyard_gate_l"] = true, + ["prop_cs_gravyard_gate_r"] = true, + ["prop_cs_gunrack"] = true, + ["prop_cs_h_bag_strap_01"] = true, + ["prop_cs_hand_radio"] = true, + ["prop_cs_heist_bag_01"] = true, + ["prop_cs_heist_bag_02"] = true, + ["prop_cs_heist_bag_strap_01"] = true, + ["prop_cs_heist_rope"] = true, + ["prop_cs_heist_rope_b"] = true, + ["prop_cs_hotdog_01"] = true, + ["prop_cs_hotdog_02"] = true, + ["prop_cs_ice_locker"] = true, + ["prop_cs_ice_locker_door_l"] = true, + ["prop_cs_ice_locker_door_r"] = true, + ["prop_cs_ilev_blind_01"] = true, + ["prop_cs_ironing_board"] = true, + ["prop_cs_katana_01"] = true, + ["prop_cs_kettle_01"] = true, + ["prop_cs_keyboard_01"] = true, + ["prop_cs_keys_01"] = true, + ["prop_cs_kitchen_cab_l"] = true, + ["prop_cs_kitchen_cab_l2"] = true, + ["prop_cs_kitchen_cab_ld"] = true, + ["prop_cs_kitchen_cab_r"] = true, + ["prop_cs_kitchen_cab_rd"] = true, + ["prop_cs_lazlow_ponytail"] = true, + ["prop_cs_lazlow_shirt_01"] = true, + ["prop_cs_lazlow_shirt_01b"] = true, + ["prop_cs_leaf"] = true, + ["prop_cs_leg_chain_01"] = true, + ["prop_cs_lester_crate"] = true, + ["prop_cs_lipstick"] = true, + ["prop_cs_magazine"] = true, + ["prop_cs_marker_01"] = true, + ["prop_cs_meth_pipe"] = true, + ["prop_cs_milk_01"] = true, + ["prop_cs_mini_tv"] = true, + ["prop_cs_mop_s"] = true, + ["prop_cs_mopbucket_01"] = true, + ["prop_cs_mouse_01"] = true, + ["prop_cs_nail_file"] = true, + ["prop_cs_newspaper"] = true, + ["prop_cs_office_chair"] = true, + ["prop_cs_overalls_01"] = true, + ["prop_cs_package_01"] = true, + ["prop_cs_padlock"] = true, + ["prop_cs_pamphlet_01"] = true, + ["prop_cs_panel_01"] = true, + ["prop_cs_panties"] = true, + ["prop_cs_panties_02"] = true, + ["prop_cs_panties_03"] = true, + ["prop_cs_paper_cup"] = true, + ["prop_cs_para_ropebit"] = true, + ["prop_cs_para_ropes"] = true, + ["prop_cs_pebble"] = true, + ["prop_cs_pebble_02"] = true, + ["prop_cs_petrol_can"] = true, + ["prop_cs_phone_01"] = true, + ["prop_cs_photoframe_01"] = true, + ["prop_cs_pills"] = true, + ["prop_cs_plane_int_01"] = true, + ["prop_cs_planning_photo"] = true, + ["prop_cs_plant_01"] = true, + ["prop_cs_plate_01"] = true, + ["prop_cs_polaroid"] = true, + ["prop_cs_police_torch"] = true, + ["prop_cs_police_torch_02"] = true, + ["prop_cs_pour_tube"] = true, + ["prop_cs_power_cell"] = true, + ["prop_cs_power_cord"] = true, + ["prop_cs_protest_sign_01"] = true, + ["prop_cs_protest_sign_02"] = true, + ["prop_cs_protest_sign_02b"] = true, + ["prop_cs_protest_sign_03"] = true, + ["prop_cs_protest_sign_04a"] = true, + ["prop_cs_protest_sign_04b"] = true, + ["prop_cs_r_business_card"] = true, + ["prop_cs_rage_statue_p1"] = true, + ["prop_cs_rage_statue_p2"] = true, + ["prop_cs_remote_01"] = true, + ["prop_cs_rolled_paper"] = true, + ["prop_cs_rope_tie_01"] = true, + ["prop_cs_rub_binbag_01"] = true, + ["prop_cs_rub_box_01"] = true, + ["prop_cs_rub_box_02"] = true, + ["prop_cs_sack_01"] = true, + ["prop_cs_saucer_01"] = true, + ["prop_cs_sc1_11_gate"] = true, + ["prop_cs_scissors"] = true, + ["prop_cs_script_bottle"] = true, + ["prop_cs_script_bottle_01"] = true, + ["prop_cs_server_drive"] = true, + ["prop_cs_sheers"] = true, + ["prop_cs_shirt_01"] = true, + ["prop_cs_shopping_bag"] = true, + ["prop_cs_shot_glass"] = true, + ["prop_cs_silver_tray"] = true, + ["prop_cs_sink_filler"] = true, + ["prop_cs_sink_filler_02"] = true, + ["prop_cs_sink_filler_03"] = true, + ["prop_cs_sm_27_gate"] = true, + ["prop_cs_sol_glasses"] = true, + ["prop_cs_spray_can"] = true, + ["prop_cs_steak"] = true, + ["prop_cs_stock_book"] = true, + ["prop_cs_street_binbag_01"] = true, + ["prop_cs_street_card_01"] = true, + ["prop_cs_street_card_02"] = true, + ["prop_cs_sub_hook_01"] = true, + ["prop_cs_sub_rope_01"] = true, + ["prop_cs_swipe_card"] = true, + ["prop_cs_t_shirt_pile"] = true, + ["prop_cs_tablet"] = true, + ["prop_cs_tablet_02"] = true, + ["prop_cs_toaster"] = true, + ["prop_cs_trev_overlay"] = true, + ["prop_cs_trolley_01"] = true, + ["prop_cs_trowel"] = true, + ["prop_cs_truck_ladder"] = true, + ["prop_cs_tshirt_ball_01"] = true, + ["prop_cs_tv_stand"] = true, + ["prop_cs_valve"] = true, + ["prop_cs_vent_cover"] = true, + ["prop_cs_vial_01"] = true, + ["prop_cs_walkie_talkie"] = true, + ["prop_cs_walking_stick"] = true, + ["prop_cs_whiskey_bot_stop"] = true, + ["prop_cs_whiskey_bottle"] = true, + ["prop_cs_wrench"] = true, + ["prop_cs1_14b_traind"] = true, + ["prop_cs1_14b_traind_dam"] = true, + ["prop_cs4_05_tdoor"] = true, + ["prop_cs4_10_tr_gd_01"] = true, + ["prop_cs4_11_door"] = true, + ["prop_cs6_03_door_l"] = true, + ["prop_cs6_03_door_r"] = true, + ["prop_cs6_04_glass"] = true, + ["prop_cub_door_lifeblurb"] = true, + ["prop_cub_lifeblurb"] = true, + ["prop_cuff_keys_01"] = true, + ["prop_cup_saucer_01"] = true, + ["prop_curl_bar_01"] = true, + ["prop_d_balcony_l_light"] = true, + ["prop_d_balcony_r_light"] = true, + ["prop_daiquiri"] = true, + ["prop_damdoor_01"] = true, + ["prop_dandy_b"] = true, + ["prop_dart_1"] = true, + ["prop_dart_2"] = true, + ["prop_dart_bd_01"] = true, + ["prop_dart_bd_cab_01"] = true, + ["prop_dealer_win_01"] = true, + ["prop_dealer_win_02"] = true, + ["prop_dealer_win_03"] = true, + ["prop_defilied_ragdoll_01"] = true, + ["prop_desert_iron_01"] = true, + ["prop_dest_cctv_01"] = true, + ["prop_dest_cctv_02"] = true, + ["prop_dest_cctv_03"] = true, + ["prop_dest_cctv_03b"] = true, + ["prop_detergent_01a"] = true, + ["prop_detergent_01b"] = true, + ["prop_devin_box_01"] = true, + ["prop_devin_box_closed"] = true, + ["prop_devin_box_dummy_01"] = true, + ["prop_devin_rope_01"] = true, + ["prop_diggerbkt_01"] = true, + ["prop_direct_chair_01"] = true, + ["prop_direct_chair_02"] = true, + ["prop_disp_cabinet_002"] = true, + ["prop_disp_cabinet_01"] = true, + ["prop_disp_razor_01"] = true, + ["prop_display_unit_01"] = true, + ["prop_display_unit_02"] = true, + ["prop_distantcar_day"] = true, + ["prop_distantcar_night"] = true, + ["prop_distantcar_truck"] = true, + ["prop_dj_deck_01"] = true, + ["prop_dj_deck_02"] = true, + ["prop_dock_bouy_1"] = true, + ["prop_dock_bouy_2"] = true, + ["prop_dock_bouy_3"] = true, + ["prop_dock_bouy_5"] = true, + ["prop_dock_crane_01"] = true, + ["prop_dock_crane_02"] = true, + ["prop_dock_crane_02_cab"] = true, + ["prop_dock_crane_02_hook"] = true, + ["prop_dock_crane_02_ld"] = true, + ["prop_dock_crane_04"] = true, + ["prop_dock_crane_lift"] = true, + ["prop_dock_float_1"] = true, + ["prop_dock_float_1b"] = true, + ["prop_dock_moor_01"] = true, + ["prop_dock_moor_04"] = true, + ["prop_dock_moor_05"] = true, + ["prop_dock_moor_06"] = true, + ["prop_dock_moor_07"] = true, + ["prop_dock_ropefloat"] = true, + ["prop_dock_ropetyre1"] = true, + ["prop_dock_ropetyre2"] = true, + ["prop_dock_ropetyre3"] = true, + ["prop_dock_rtg_01"] = true, + ["prop_dock_rtg_ld"] = true, + ["prop_dock_shippad"] = true, + ["prop_dock_sign_01"] = true, + ["prop_dock_woodpole1"] = true, + ["prop_dock_woodpole2"] = true, + ["prop_dock_woodpole3"] = true, + ["prop_dock_woodpole4"] = true, + ["prop_dock_woodpole5"] = true, + ["prop_dog_cage_01"] = true, + ["prop_dog_cage_02"] = true, + ["prop_doghouse_01"] = true, + ["prop_dolly_01"] = true, + ["prop_dolly_02"] = true, + ["prop_donut_01"] = true, + ["prop_donut_02"] = true, + ["prop_donut_02b"] = true, + ["prop_door_01"] = true, + ["prop_door_balcony_frame"] = true, + ["prop_door_balcony_left"] = true, + ["prop_door_balcony_right"] = true, + ["prop_door_bell_01"] = true, + ["prop_double_grid_line"] = true, + ["prop_dress_disp_01"] = true, + ["prop_dress_disp_02"] = true, + ["prop_dress_disp_03"] = true, + ["prop_dress_disp_04"] = true, + ["prop_drink_champ"] = true, + ["prop_drink_redwine"] = true, + ["prop_drink_whisky"] = true, + ["prop_drink_whtwine"] = true, + ["prop_drinkmenu"] = true, + ["prop_drop_armscrate_01"] = true, + ["prop_drop_armscrate_01b"] = true, + ["prop_drop_crate_01"] = true, + ["prop_drop_crate_01_set"] = true, + ["prop_drop_crate_01_set2"] = true, + ["prop_drug_bottle"] = true, + ["prop_drug_burner"] = true, + ["prop_drug_erlenmeyer"] = true, + ["prop_drug_package"] = true, + ["prop_drug_package_02"] = true, + ["prop_drywallpile_01"] = true, + ["prop_drywallpile_02"] = true, + ["prop_dryweed_001_a"] = true, + ["prop_dryweed_002_a"] = true, + ["prop_dt1_13_groundlight"] = true, + ["prop_dt1_13_walllightsource"] = true, + ["prop_dt1_20_mp_door_l"] = true, + ["prop_dt1_20_mp_door_r"] = true, + ["prop_dt1_20_mp_gar"] = true, + ["prop_ducktape_01"] = true, + ["prop_dummy_01"] = true, + ["prop_dummy_car"] = true, + ["prop_dummy_light"] = true, + ["prop_dummy_plane"] = true, + ["prop_dumpster_01a"] = true, + ["prop_dumpster_02a"] = true, + ["prop_dumpster_02b"] = true, + ["prop_dumpster_3a"] = true, + ["prop_dumpster_3step"] = true, + ["prop_dumpster_4a"] = true, + ["prop_dumpster_4b"] = true, + ["prop_dyn_pc"] = true, + ["prop_dyn_pc_02"] = true, + ["prop_ear_defenders_01"] = true, + ["prop_ecg_01"] = true, + ["prop_ecg_01_cable_01"] = true, + ["prop_ecg_01_cable_02"] = true, + ["prop_ecola_can"] = true, + ["prop_egg_clock_01"] = true, + ["prop_ejector_seat_01"] = true, + ["prop_el_guitar_01"] = true, + ["prop_el_guitar_02"] = true, + ["prop_el_guitar_03"] = true, + ["prop_el_tapeplayer_01"] = true, + ["prop_elec_heater_01"] = true, + ["prop_elecbox_01a"] = true, + ["prop_elecbox_01b"] = true, + ["prop_elecbox_02a"] = true, + ["prop_elecbox_02b"] = true, + ["prop_elecbox_03a"] = true, + ["prop_elecbox_04a"] = true, + ["prop_elecbox_05a"] = true, + ["prop_elecbox_06a"] = true, + ["prop_elecbox_07a"] = true, + ["prop_elecbox_08"] = true, + ["prop_elecbox_08b"] = true, + ["prop_elecbox_09"] = true, + ["prop_elecbox_10"] = true, + ["prop_elecbox_10_cr"] = true, + ["prop_elecbox_11"] = true, + ["prop_elecbox_12"] = true, + ["prop_elecbox_13"] = true, + ["prop_elecbox_14"] = true, + ["prop_elecbox_15"] = true, + ["prop_elecbox_15_cr"] = true, + ["prop_elecbox_16"] = true, + ["prop_elecbox_17"] = true, + ["prop_elecbox_17_cr"] = true, + ["prop_elecbox_18"] = true, + ["prop_elecbox_19"] = true, + ["prop_elecbox_20"] = true, + ["prop_elecbox_21"] = true, + ["prop_elecbox_22"] = true, + ["prop_elecbox_23"] = true, + ["prop_elecbox_24"] = true, + ["prop_elecbox_24b"] = true, + ["prop_elecbox_25"] = true, + ["prop_employee_month_01"] = true, + ["prop_employee_month_02"] = true, + ["prop_energy_drink"] = true, + ["prop_engine_hoist"] = true, + ["prop_entityxf_covered"] = true, + ["prop_epsilon_door_l"] = true, + ["prop_epsilon_door_r"] = true, + ["prop_etricmotor_01"] = true, + ["prop_ex_b_shark"] = true, + ["prop_ex_b_shark_g"] = true, + ["prop_ex_b_shark_p"] = true, + ["prop_ex_b_shark_pk"] = true, + ["prop_ex_b_shark_wh"] = true, + ["prop_ex_b_time"] = true, + ["prop_ex_b_time_g"] = true, + ["prop_ex_b_time_p"] = true, + ["prop_ex_b_time_pk"] = true, + ["prop_ex_b_time_wh"] = true, + ["prop_ex_bmd"] = true, + ["prop_ex_bmd_g"] = true, + ["prop_ex_bmd_p"] = true, + ["prop_ex_bmd_pk"] = true, + ["prop_ex_bmd_wh"] = true, + ["prop_ex_hidden"] = true, + ["prop_ex_hidden_g"] = true, + ["prop_ex_hidden_p"] = true, + ["prop_ex_hidden_pk"] = true, + ["prop_ex_hidden_wh"] = true, + ["prop_ex_random"] = true, + ["prop_ex_random_g"] = true, + ["prop_ex_random_g_tr"] = true, + ["prop_ex_random_p"] = true, + ["prop_ex_random_p_tr"] = true, + ["prop_ex_random_pk"] = true, + ["prop_ex_random_pk_tr"] = true, + ["prop_ex_random_tr"] = true, + ["prop_ex_random_wh"] = true, + ["prop_ex_random_wh_tr"] = true, + ["prop_ex_swap"] = true, + ["prop_ex_swap_g"] = true, + ["prop_ex_swap_g_tr"] = true, + ["prop_ex_swap_p"] = true, + ["prop_ex_swap_p_tr"] = true, + ["prop_ex_swap_pk"] = true, + ["prop_ex_swap_pk_tr"] = true, + ["prop_ex_swap_tr"] = true, + ["prop_ex_swap_wh"] = true, + ["prop_ex_swap_wh_tr"] = true, + ["prop_ex_weed"] = true, + ["prop_ex_weed_g"] = true, + ["prop_ex_weed_p"] = true, + ["prop_ex_weed_pk"] = true, + ["prop_ex_weed_wh"] = true, + ["prop_exer_bike_01"] = true, + ["prop_exer_bike_mg"] = true, + ["prop_exercisebike"] = true, + ["prop_f_b_insert_broken"] = true, + ["prop_f_duster_01_s"] = true, + ["prop_f_duster_02"] = true, + ["prop_fac_machine_02"] = true, + ["prop_face_rag_01"] = true, + ["prop_faceoffice_door_l"] = true, + ["prop_faceoffice_door_r"] = true, + ["prop_facgate_01"] = true, + ["prop_facgate_01b"] = true, + ["prop_facgate_02_l"] = true, + ["prop_facgate_02pole"] = true, + ["prop_facgate_03_l"] = true, + ["prop_facgate_03_ld_l"] = true, + ["prop_facgate_03_ld_r"] = true, + ["prop_facgate_03_r"] = true, + ["prop_facgate_03b_l"] = true, + ["prop_facgate_03b_r"] = true, + ["prop_facgate_03post"] = true, + ["prop_facgate_04_l"] = true, + ["prop_facgate_04_r"] = true, + ["prop_facgate_05_r"] = true, + ["prop_facgate_05_r_dam_l1"] = true, + ["prop_facgate_05_r_l1"] = true, + ["prop_facgate_06_l"] = true, + ["prop_facgate_06_r"] = true, + ["prop_facgate_07"] = true, + ["prop_facgate_07b"] = true, + ["prop_facgate_08"] = true, + ["prop_facgate_08_frame"] = true, + ["prop_facgate_08_ld"] = true, + ["prop_facgate_08_ld2"] = true, + ["prop_facgate_id1_27"] = true, + ["prop_fag_packet_01"] = true, + ["prop_fan_01"] = true, + ["prop_fan_palm_01a"] = true, + ["prop_fax_01"] = true, + ["prop_fbi3_coffee_table"] = true, + ["prop_fbibombbin"] = true, + ["prop_fbibombcupbrd"] = true, + ["prop_fbibombfile"] = true, + ["prop_fbibombplant"] = true, + ["prop_feed_sack_01"] = true, + ["prop_feed_sack_02"] = true, + ["prop_feeder1"] = true, + ["prop_feeder1_cr"] = true, + ["prop_fem_01"] = true, + ["prop_fence_log_01"] = true, + ["prop_fence_log_02"] = true, + ["prop_fernba"] = true, + ["prop_fernbb"] = true, + ["prop_ferris_car_01"] = true, + ["prop_ferris_car_01_lod1"] = true, + ["prop_ff_counter_01"] = true, + ["prop_ff_counter_02"] = true, + ["prop_ff_counter_03"] = true, + ["prop_ff_noodle_01"] = true, + ["prop_ff_noodle_02"] = true, + ["prop_ff_shelves_01"] = true, + ["prop_ff_sink_01"] = true, + ["prop_ff_sink_02"] = true, + ["prop_fib_3b_bench"] = true, + ["prop_fib_3b_cover1"] = true, + ["prop_fib_3b_cover2"] = true, + ["prop_fib_3b_cover3"] = true, + ["prop_fib_ashtray_01"] = true, + ["prop_fib_badge"] = true, + ["prop_fib_broken_window"] = true, + ["prop_fib_broken_window_2"] = true, + ["prop_fib_broken_window_3"] = true, + ["prop_fib_clipboard"] = true, + ["prop_fib_coffee"] = true, + ["prop_fib_counter"] = true, + ["prop_fib_morg_cnr01"] = true, + ["prop_fib_morg_plr01"] = true, + ["prop_fib_morg_wal01"] = true, + ["prop_fib_plant_01"] = true, + ["prop_fib_plant_02"] = true, + ["prop_fib_skylight_piece"] = true, + ["prop_fib_skylight_plug"] = true, + ["prop_fib_wallfrag01"] = true, + ["prop_film_cam_01"] = true, + ["prop_fire_driser_1a"] = true, + ["prop_fire_driser_1b"] = true, + ["prop_fire_driser_2b"] = true, + ["prop_fire_driser_3b"] = true, + ["prop_fire_driser_4a"] = true, + ["prop_fire_driser_4b"] = true, + ["prop_fire_exting_1a"] = true, + ["prop_fire_exting_1b"] = true, + ["prop_fire_exting_2a"] = true, + ["prop_fire_exting_3a"] = true, + ["prop_fire_hosebox_01"] = true, + ["prop_fire_hosereel"] = true, + ["prop_fire_hosereel_l1"] = true, + ["prop_fire_hydrant_1"] = true, + ["prop_fire_hydrant_2"] = true, + ["prop_fire_hydrant_2_l1"] = true, + ["prop_fire_hydrant_4"] = true, + ["prop_fireescape_01a"] = true, + ["prop_fireescape_01b"] = true, + ["prop_fireescape_02a"] = true, + ["prop_fireescape_02b"] = true, + ["prop_fish_slice_01"] = true, + ["prop_fishing_rod_01"] = true, + ["prop_fishing_rod_02"] = true, + ["prop_flag_canada"] = true, + ["prop_flag_canada_s"] = true, + ["prop_flag_eu"] = true, + ["prop_flag_eu_s"] = true, + ["prop_flag_france"] = true, + ["prop_flag_france_s"] = true, + ["prop_flag_german"] = true, + ["prop_flag_german_s"] = true, + ["prop_flag_ireland"] = true, + ["prop_flag_ireland_s"] = true, + ["prop_flag_japan"] = true, + ["prop_flag_japan_s"] = true, + ["prop_flag_ls"] = true, + ["prop_flag_ls_s"] = true, + ["prop_flag_lsfd"] = true, + ["prop_flag_lsfd_s"] = true, + ["prop_flag_lsservices"] = true, + ["prop_flag_lsservices_s"] = true, + ["prop_flag_mexico"] = true, + ["prop_flag_mexico_s"] = true, + ["prop_flag_russia"] = true, + ["prop_flag_russia_s"] = true, + ["prop_flag_s"] = true, + ["prop_flag_sa"] = true, + ["prop_flag_sa_s"] = true, + ["prop_flag_sapd"] = true, + ["prop_flag_sapd_s"] = true, + ["prop_flag_scotland"] = true, + ["prop_flag_scotland_s"] = true, + ["prop_flag_sheriff"] = true, + ["prop_flag_sheriff_s"] = true, + ["prop_flag_uk"] = true, + ["prop_flag_uk_s"] = true, + ["prop_flag_us"] = true, + ["prop_flag_us_r"] = true, + ["prop_flag_us_s"] = true, + ["prop_flag_usboat"] = true, + ["prop_flagpole_1a"] = true, + ["prop_flagpole_2a"] = true, + ["prop_flagpole_2b"] = true, + ["prop_flagpole_2c"] = true, + ["prop_flagpole_3a"] = true, + ["prop_flamingo"] = true, + ["prop_flare_01"] = true, + ["prop_flare_01b"] = true, + ["prop_flash_unit"] = true, + ["prop_flatbed_strap"] = true, + ["prop_flatbed_strap_b"] = true, + ["prop_flatscreen_overlay"] = true, + ["prop_flattrailer_01a"] = true, + ["prop_flattruck_01a"] = true, + ["prop_flattruck_01b"] = true, + ["prop_flattruck_01c"] = true, + ["prop_flattruck_01d"] = true, + ["prop_fleeca_atm"] = true, + ["prop_flight_box_01"] = true, + ["prop_flight_box_insert"] = true, + ["prop_flight_box_insert2"] = true, + ["prop_flipchair_01"] = true, + ["prop_floor_duster_01"] = true, + ["prop_flowerweed_005_a"] = true, + ["prop_fnc_farm_01a"] = true, + ["prop_fnc_farm_01b"] = true, + ["prop_fnc_farm_01c"] = true, + ["prop_fnc_farm_01d"] = true, + ["prop_fnc_farm_01e"] = true, + ["prop_fnc_farm_01f"] = true, + ["prop_fnc_omesh_01a"] = true, + ["prop_fnc_omesh_02a"] = true, + ["prop_fnc_omesh_03a"] = true, + ["prop_fncbeach_01a"] = true, + ["prop_fncbeach_01b"] = true, + ["prop_fncbeach_01c"] = true, + ["prop_fncconstruc_01d"] = true, + ["prop_fncconstruc_02a"] = true, + ["prop_fncconstruc_ld"] = true, + ["prop_fnccorgm_01a"] = true, + ["prop_fnccorgm_01b"] = true, + ["prop_fnccorgm_02a"] = true, + ["prop_fnccorgm_02b"] = true, + ["prop_fnccorgm_02c"] = true, + ["prop_fnccorgm_02d"] = true, + ["prop_fnccorgm_02e"] = true, + ["prop_fnccorgm_02pole"] = true, + ["prop_fnccorgm_03a"] = true, + ["prop_fnccorgm_03b"] = true, + ["prop_fnccorgm_03c"] = true, + ["prop_fnccorgm_04a"] = true, + ["prop_fnccorgm_04c"] = true, + ["prop_fnccorgm_05a"] = true, + ["prop_fnccorgm_05b"] = true, + ["prop_fnccorgm_06a"] = true, + ["prop_fnccorgm_06b"] = true, + ["prop_fncglass_01a"] = true, + ["prop_fnclink_01a"] = true, + ["prop_fnclink_01b"] = true, + ["prop_fnclink_01c"] = true, + ["prop_fnclink_01d"] = true, + ["prop_fnclink_01e"] = true, + ["prop_fnclink_01f"] = true, + ["prop_fnclink_01gate1"] = true, + ["prop_fnclink_01h"] = true, + ["prop_fnclink_02a"] = true, + ["prop_fnclink_02a_sdt"] = true, + ["prop_fnclink_02b"] = true, + ["prop_fnclink_02c"] = true, + ["prop_fnclink_02d"] = true, + ["prop_fnclink_02e"] = true, + ["prop_fnclink_02f"] = true, + ["prop_fnclink_02g"] = true, + ["prop_fnclink_02gate1"] = true, + ["prop_fnclink_02gate2"] = true, + ["prop_fnclink_02gate3"] = true, + ["prop_fnclink_02gate4"] = true, + ["prop_fnclink_02gate5"] = true, + ["prop_fnclink_02gate6"] = true, + ["prop_fnclink_02gate6_l"] = true, + ["prop_fnclink_02gate6_r"] = true, + ["prop_fnclink_02gate7"] = true, + ["prop_fnclink_02h"] = true, + ["prop_fnclink_02i"] = true, + ["prop_fnclink_02j"] = true, + ["prop_fnclink_02k"] = true, + ["prop_fnclink_02l"] = true, + ["prop_fnclink_02m"] = true, + ["prop_fnclink_02n"] = true, + ["prop_fnclink_02o"] = true, + ["prop_fnclink_02p"] = true, + ["prop_fnclink_03a"] = true, + ["prop_fnclink_03b"] = true, + ["prop_fnclink_03c"] = true, + ["prop_fnclink_03d"] = true, + ["prop_fnclink_03e"] = true, + ["prop_fnclink_03f"] = true, + ["prop_fnclink_03g"] = true, + ["prop_fnclink_03gate1"] = true, + ["prop_fnclink_03gate2"] = true, + ["prop_fnclink_03gate3"] = true, + ["prop_fnclink_03gate4"] = true, + ["prop_fnclink_03gate5"] = true, + ["prop_fnclink_03h"] = true, + ["prop_fnclink_03i"] = true, + ["prop_fnclink_04a"] = true, + ["prop_fnclink_04b"] = true, + ["prop_fnclink_04c"] = true, + ["prop_fnclink_04d"] = true, + ["prop_fnclink_04e"] = true, + ["prop_fnclink_04f"] = true, + ["prop_fnclink_04g"] = true, + ["prop_fnclink_04gate1"] = true, + ["prop_fnclink_04h"] = true, + ["prop_fnclink_04h_l2"] = true, + ["prop_fnclink_04j"] = true, + ["prop_fnclink_04k"] = true, + ["prop_fnclink_04l"] = true, + ["prop_fnclink_04m"] = true, + ["prop_fnclink_05a"] = true, + ["prop_fnclink_05b"] = true, + ["prop_fnclink_05c"] = true, + ["prop_fnclink_05crnr1"] = true, + ["prop_fnclink_05d"] = true, + ["prop_fnclink_05pole"] = true, + ["prop_fnclink_06a"] = true, + ["prop_fnclink_06b"] = true, + ["prop_fnclink_06c"] = true, + ["prop_fnclink_06d"] = true, + ["prop_fnclink_06gate2"] = true, + ["prop_fnclink_06gate3"] = true, + ["prop_fnclink_06gatepost"] = true, + ["prop_fnclink_07a"] = true, + ["prop_fnclink_07b"] = true, + ["prop_fnclink_07c"] = true, + ["prop_fnclink_07d"] = true, + ["prop_fnclink_07gate1"] = true, + ["prop_fnclink_07gate2"] = true, + ["prop_fnclink_07gate3"] = true, + ["prop_fnclink_08b"] = true, + ["prop_fnclink_08c"] = true, + ["prop_fnclink_08post"] = true, + ["prop_fnclink_09a"] = true, + ["prop_fnclink_09b"] = true, + ["prop_fnclink_09crnr1"] = true, + ["prop_fnclink_09d"] = true, + ["prop_fnclink_09e"] = true, + ["prop_fnclink_09frame"] = true, + ["prop_fnclink_09gate1"] = true, + ["prop_fnclink_10a"] = true, + ["prop_fnclink_10b"] = true, + ["prop_fnclink_10c"] = true, + ["prop_fnclink_10d"] = true, + ["prop_fnclink_10d_ld"] = true, + ["prop_fnclink_10e"] = true, + ["prop_fnclog_01a"] = true, + ["prop_fnclog_01b"] = true, + ["prop_fnclog_01c"] = true, + ["prop_fnclog_02a"] = true, + ["prop_fnclog_02b"] = true, + ["prop_fnclog_03a"] = true, + ["prop_fncpeir_03a"] = true, + ["prop_fncply_01a"] = true, + ["prop_fncply_01b"] = true, + ["prop_fncply_01gate"] = true, + ["prop_fncply_01post"] = true, + ["prop_fncres_01a"] = true, + ["prop_fncres_01b"] = true, + ["prop_fncres_01c"] = true, + ["prop_fncres_02_gate1"] = true, + ["prop_fncres_02a"] = true, + ["prop_fncres_02b"] = true, + ["prop_fncres_02c"] = true, + ["prop_fncres_02d"] = true, + ["prop_fncres_03a"] = true, + ["prop_fncres_03b"] = true, + ["prop_fncres_03c"] = true, + ["prop_fncres_03gate1"] = true, + ["prop_fncres_04a"] = true, + ["prop_fncres_04b"] = true, + ["prop_fncres_05a"] = true, + ["prop_fncres_05b"] = true, + ["prop_fncres_05c"] = true, + ["prop_fncres_05c_l1"] = true, + ["prop_fncres_06a"] = true, + ["prop_fncres_06b"] = true, + ["prop_fncres_06gatel"] = true, + ["prop_fncres_06gater"] = true, + ["prop_fncres_07a"] = true, + ["prop_fncres_07b"] = true, + ["prop_fncres_07gate"] = true, + ["prop_fncres_08a"] = true, + ["prop_fncres_08gatel"] = true, + ["prop_fncres_09a"] = true, + ["prop_fncres_09gate"] = true, + ["prop_fncsec_01a"] = true, + ["prop_fncsec_01b"] = true, + ["prop_fncsec_01crnr"] = true, + ["prop_fncsec_01gate"] = true, + ["prop_fncsec_01pole"] = true, + ["prop_fncsec_02a"] = true, + ["prop_fncsec_02pole"] = true, + ["prop_fncsec_03a"] = true, + ["prop_fncsec_03b"] = true, + ["prop_fncsec_03c"] = true, + ["prop_fncsec_03d"] = true, + ["prop_fncsec_04a"] = true, + ["prop_fncwood_01_ld"] = true, + ["prop_fncwood_01a"] = true, + ["prop_fncwood_01b"] = true, + ["prop_fncwood_01c"] = true, + ["prop_fncwood_01gate"] = true, + ["prop_fncwood_02b"] = true, + ["prop_fncwood_03a"] = true, + ["prop_fncwood_04a"] = true, + ["prop_fncwood_06a"] = true, + ["prop_fncwood_06b"] = true, + ["prop_fncwood_06c"] = true, + ["prop_fncwood_07a"] = true, + ["prop_fncwood_07gate1"] = true, + ["prop_fncwood_08a"] = true, + ["prop_fncwood_08b"] = true, + ["prop_fncwood_08c"] = true, + ["prop_fncwood_08d"] = true, + ["prop_fncwood_09a"] = true, + ["prop_fncwood_09b"] = true, + ["prop_fncwood_09c"] = true, + ["prop_fncwood_09d"] = true, + ["prop_fncwood_10b"] = true, + ["prop_fncwood_10d"] = true, + ["prop_fncwood_11a"] = true, + ["prop_fncwood_11a_l1"] = true, + ["prop_fncwood_12a"] = true, + ["prop_fncwood_13c"] = true, + ["prop_fncwood_14a"] = true, + ["prop_fncwood_14b"] = true, + ["prop_fncwood_14c"] = true, + ["prop_fncwood_14d"] = true, + ["prop_fncwood_14e"] = true, + ["prop_fncwood_15a"] = true, + ["prop_fncwood_15b"] = true, + ["prop_fncwood_15c"] = true, + ["prop_fncwood_16a"] = true, + ["prop_fncwood_16b"] = true, + ["prop_fncwood_16c"] = true, + ["prop_fncwood_16d"] = true, + ["prop_fncwood_16e"] = true, + ["prop_fncwood_16f"] = true, + ["prop_fncwood_16g"] = true, + ["prop_fncwood_17b"] = true, + ["prop_fncwood_17c"] = true, + ["prop_fncwood_18a"] = true, + ["prop_fncwood_19_end"] = true, + ["prop_fncwood_19a"] = true, + ["prop_folded_polo_shirt"] = true, + ["prop_folder_01"] = true, + ["prop_folder_02"] = true, + ["prop_food_bag1"] = true, + ["prop_food_bag2"] = true, + ["prop_food_bin_01"] = true, + ["prop_food_bin_02"] = true, + ["prop_food_bs_bag_01"] = true, + ["prop_food_bs_bag_02"] = true, + ["prop_food_bs_bag_03"] = true, + ["prop_food_bs_bag_04"] = true, + ["prop_food_bs_bshelf"] = true, + ["prop_food_bs_burg1"] = true, + ["prop_food_bs_burg3"] = true, + ["prop_food_bs_burger2"] = true, + ["prop_food_bs_chips"] = true, + ["prop_food_bs_coffee"] = true, + ["prop_food_bs_cups01"] = true, + ["prop_food_bs_cups02"] = true, + ["prop_food_bs_cups03"] = true, + ["prop_food_bs_juice01"] = true, + ["prop_food_bs_juice02"] = true, + ["prop_food_bs_juice03"] = true, + ["prop_food_bs_soda_01"] = true, + ["prop_food_bs_soda_02"] = true, + ["prop_food_bs_tray_01"] = true, + ["prop_food_bs_tray_02"] = true, + ["prop_food_bs_tray_03"] = true, + ["prop_food_bs_tray_06"] = true, + ["prop_food_burg1"] = true, + ["prop_food_burg2"] = true, + ["prop_food_burg3"] = true, + ["prop_food_cb_bag_01"] = true, + ["prop_food_cb_bag_02"] = true, + ["prop_food_cb_bshelf"] = true, + ["prop_food_cb_burg01"] = true, + ["prop_food_cb_burg02"] = true, + ["prop_food_cb_chips"] = true, + ["prop_food_cb_coffee"] = true, + ["prop_food_cb_cups01"] = true, + ["prop_food_cb_cups02"] = true, + ["prop_food_cb_cups04"] = true, + ["prop_food_cb_donuts"] = true, + ["prop_food_cb_juice01"] = true, + ["prop_food_cb_juice02"] = true, + ["prop_food_cb_nugets"] = true, + ["prop_food_cb_soda_01"] = true, + ["prop_food_cb_soda_02"] = true, + ["prop_food_cb_tray_01"] = true, + ["prop_food_cb_tray_02"] = true, + ["prop_food_cb_tray_03"] = true, + ["prop_food_chips"] = true, + ["prop_food_coffee"] = true, + ["prop_food_cups1"] = true, + ["prop_food_cups2"] = true, + ["prop_food_juice01"] = true, + ["prop_food_juice02"] = true, + ["prop_food_ketchup"] = true, + ["prop_food_mustard"] = true, + ["prop_food_napkin_01"] = true, + ["prop_food_napkin_02"] = true, + ["prop_food_sugarjar"] = true, + ["prop_food_tray_01"] = true, + ["prop_food_tray_02"] = true, + ["prop_food_tray_03"] = true, + ["prop_food_van_01"] = true, + ["prop_food_van_02"] = true, + ["prop_foodprocess_01"] = true, + ["prop_forsale_dyn_01"] = true, + ["prop_forsale_dyn_02"] = true, + ["prop_forsale_lenny_01"] = true, + ["prop_forsale_lrg_01"] = true, + ["prop_forsale_lrg_02"] = true, + ["prop_forsale_lrg_03"] = true, + ["prop_forsale_lrg_04"] = true, + ["prop_forsale_lrg_05"] = true, + ["prop_forsale_lrg_06"] = true, + ["prop_forsale_lrg_07"] = true, + ["prop_forsale_lrg_08"] = true, + ["prop_forsale_lrg_09"] = true, + ["prop_forsale_lrg_10"] = true, + ["prop_forsale_sign_01"] = true, + ["prop_forsale_sign_02"] = true, + ["prop_forsale_sign_03"] = true, + ["prop_forsale_sign_04"] = true, + ["prop_forsale_sign_05"] = true, + ["prop_forsale_sign_06"] = true, + ["prop_forsale_sign_07"] = true, + ["prop_forsale_sign_fs"] = true, + ["prop_forsale_sign_jb"] = true, + ["prop_forsale_tri_01"] = true, + ["prop_forsalejr1"] = true, + ["prop_forsalejr2"] = true, + ["prop_forsalejr3"] = true, + ["prop_forsalejr4"] = true, + ["prop_foundation_sponge"] = true, + ["prop_fountain1"] = true, + ["prop_fountain2"] = true, + ["prop_fragtest_cnst_01"] = true, + ["prop_fragtest_cnst_02"] = true, + ["prop_fragtest_cnst_03"] = true, + ["prop_fragtest_cnst_04"] = true, + ["prop_fragtest_cnst_05"] = true, + ["prop_fragtest_cnst_06"] = true, + ["prop_fragtest_cnst_06b"] = true, + ["prop_fragtest_cnst_07"] = true, + ["prop_fragtest_cnst_08"] = true, + ["prop_fragtest_cnst_08b"] = true, + ["prop_fragtest_cnst_08c"] = true, + ["prop_fragtest_cnst_09"] = true, + ["prop_fragtest_cnst_09b"] = true, + ["prop_fragtest_cnst_10"] = true, + ["prop_fragtest_cnst_11"] = true, + ["prop_franklin_dl"] = true, + ["prop_freeweight_01"] = true, + ["prop_freeweight_02"] = true, + ["prop_fridge_01"] = true, + ["prop_fridge_03"] = true, + ["prop_front_seat_01"] = true, + ["prop_front_seat_02"] = true, + ["prop_front_seat_03"] = true, + ["prop_front_seat_04"] = true, + ["prop_front_seat_05"] = true, + ["prop_front_seat_06"] = true, + ["prop_front_seat_07"] = true, + ["prop_front_seat_row_01"] = true, + ["prop_fruit_basket"] = true, + ["prop_fruit_plas_crate_01"] = true, + ["prop_fruit_sign_01"] = true, + ["prop_fruit_stand_01"] = true, + ["prop_fruit_stand_02"] = true, + ["prop_fruit_stand_03"] = true, + ["prop_fruitstand_01"] = true, + ["prop_fruitstand_b"] = true, + ["prop_fruitstand_b_nite"] = true, + ["prop_ftowel_01"] = true, + ["prop_ftowel_07"] = true, + ["prop_ftowel_08"] = true, + ["prop_ftowel_10"] = true, + ["prop_funfair_zoltan"] = true, + ["prop_gaffer_arm_bind"] = true, + ["prop_gaffer_arm_bind_cut"] = true, + ["prop_gaffer_leg_bind"] = true, + ["prop_gaffer_leg_bind_cut"] = true, + ["prop_gaffer_tape"] = true, + ["prop_gaffer_tape_strip"] = true, + ["prop_game_clock_01"] = true, + ["prop_game_clock_02"] = true, + ["prop_gar_door_01"] = true, + ["prop_gar_door_02"] = true, + ["prop_gar_door_03"] = true, + ["prop_gar_door_03_ld"] = true, + ["prop_gar_door_04"] = true, + ["prop_gar_door_05"] = true, + ["prop_gar_door_05_l"] = true, + ["prop_gar_door_05_r"] = true, + ["prop_gar_door_a_01"] = true, + ["prop_gar_door_plug"] = true, + ["prop_garden_chimes_01"] = true, + ["prop_garden_dreamcatch_01"] = true, + ["prop_garden_edging_01"] = true, + ["prop_garden_edging_02"] = true, + ["prop_garden_zapper_01"] = true, + ["prop_gardnght_01"] = true, + ["prop_gas_01"] = true, + ["prop_gas_02"] = true, + ["prop_gas_03"] = true, + ["prop_gas_04"] = true, + ["prop_gas_05"] = true, + ["prop_gas_airunit01"] = true, + ["prop_gas_binunit01"] = true, + ["prop_gas_grenade"] = true, + ["prop_gas_mask_hang_01bb"] = true, + ["prop_gas_pump_1a"] = true, + ["prop_gas_pump_1b"] = true, + ["prop_gas_pump_1c"] = true, + ["prop_gas_pump_1d"] = true, + ["prop_gas_pump_old2"] = true, + ["prop_gas_pump_old3"] = true, + ["prop_gas_rack01"] = true, + ["prop_gas_smallbin01"] = true, + ["prop_gas_tank_01a"] = true, + ["prop_gas_tank_02a"] = true, + ["prop_gas_tank_02b"] = true, + ["prop_gas_tank_04a"] = true, + ["prop_gascage01"] = true, + ["prop_gascyl_01a"] = true, + ["prop_gascyl_02a"] = true, + ["prop_gascyl_02b"] = true, + ["prop_gascyl_03a"] = true, + ["prop_gascyl_03b"] = true, + ["prop_gascyl_04a"] = true, + ["prop_gascyl_ramp_01"] = true, + ["prop_gascyl_ramp_door_01"] = true, + ["prop_gate_airport_01"] = true, + ["prop_gate_bridge_ld"] = true, + ["prop_gate_cult_01_l"] = true, + ["prop_gate_cult_01_r"] = true, + ["prop_gate_docks_ld"] = true, + ["prop_gate_farm_01a"] = true, + ["prop_gate_farm_03"] = true, + ["prop_gate_farm_post"] = true, + ["prop_gate_frame_01"] = true, + ["prop_gate_frame_02"] = true, + ["prop_gate_frame_04"] = true, + ["prop_gate_frame_05"] = true, + ["prop_gate_frame_06"] = true, + ["prop_gate_military_01"] = true, + ["prop_gate_prison_01"] = true, + ["prop_gate_tep_01_l"] = true, + ["prop_gate_tep_01_r"] = true, + ["prop_gatecom_01"] = true, + ["prop_gatecom_02"] = true, + ["prop_gazebo_01"] = true, + ["prop_gazebo_02"] = true, + ["prop_gazebo_03"] = true, + ["prop_gc_chair02"] = true, + ["prop_gd_ch2_08"] = true, + ["prop_generator_01a"] = true, + ["prop_generator_02a"] = true, + ["prop_generator_03a"] = true, + ["prop_generator_03b"] = true, + ["prop_generator_04"] = true, + ["prop_ghettoblast_01"] = true, + ["prop_ghettoblast_02"] = true, + ["prop_girder_01a"] = true, + ["prop_girder_01b"] = true, + ["prop_glass_panel_01"] = true, + ["prop_glass_panel_02"] = true, + ["prop_glass_panel_03"] = true, + ["prop_glass_panel_04"] = true, + ["prop_glass_panel_05"] = true, + ["prop_glass_panel_06"] = true, + ["prop_glass_panel_07"] = true, + ["prop_glass_stack_01"] = true, + ["prop_glass_stack_02"] = true, + ["prop_glass_stack_03"] = true, + ["prop_glass_stack_04"] = true, + ["prop_glass_stack_05"] = true, + ["prop_glass_stack_06"] = true, + ["prop_glass_stack_07"] = true, + ["prop_glass_stack_08"] = true, + ["prop_glass_stack_09"] = true, + ["prop_glass_stack_10"] = true, + ["prop_glass_suck_holder"] = true, + ["prop_glasscutter_01"] = true, + ["prop_glf_roller"] = true, + ["prop_glf_spreader"] = true, + ["prop_gnome1"] = true, + ["prop_gnome2"] = true, + ["prop_gnome3"] = true, + ["prop_goal_posts_01"] = true, + ["prop_gold_bar"] = true, + ["prop_gold_cont_01"] = true, + ["prop_gold_cont_01b"] = true, + ["prop_gold_trolly"] = true, + ["prop_gold_trolly_full"] = true, + ["prop_gold_trolly_strap_01"] = true, + ["prop_gold_vault_fence_l"] = true, + ["prop_gold_vault_fence_r"] = true, + ["prop_gold_vault_gate_01"] = true, + ["prop_golf_bag_01"] = true, + ["prop_golf_bag_01b"] = true, + ["prop_golf_bag_01c"] = true, + ["prop_golf_ball"] = true, + ["prop_golf_ball_p2"] = true, + ["prop_golf_ball_p3"] = true, + ["prop_golf_ball_p4"] = true, + ["prop_golf_ball_tee"] = true, + ["prop_golf_driver"] = true, + ["prop_golf_iron_01"] = true, + ["prop_golf_marker_01"] = true, + ["prop_golf_pitcher_01"] = true, + ["prop_golf_putter_01"] = true, + ["prop_golf_tee"] = true, + ["prop_golf_wood_01"] = true, + ["prop_golfflag"] = true, + ["prop_gr_bmd_b"] = true, + ["prop_grain_hopper"] = true, + ["prop_grapes_01"] = true, + ["prop_grapes_02"] = true, + ["prop_grapeseed_sign_01"] = true, + ["prop_grapeseed_sign_02"] = true, + ["prop_grass_001_a"] = true, + ["prop_grass_ca"] = true, + ["prop_grass_da"] = true, + ["prop_grass_dry_02"] = true, + ["prop_grass_dry_03"] = true, + ["prop_gravestones_01a"] = true, + ["prop_gravestones_02a"] = true, + ["prop_gravestones_03a"] = true, + ["prop_gravestones_04a"] = true, + ["prop_gravestones_05a"] = true, + ["prop_gravestones_06a"] = true, + ["prop_gravestones_07a"] = true, + ["prop_gravestones_08a"] = true, + ["prop_gravestones_09a"] = true, + ["prop_gravestones_10a"] = true, + ["prop_gravetomb_01a"] = true, + ["prop_gravetomb_02a"] = true, + ["prop_griddle_01"] = true, + ["prop_griddle_02"] = true, + ["prop_grumandoor_l"] = true, + ["prop_grumandoor_r"] = true, + ["prop_gshotsensor_01"] = true, + ["prop_guard_tower_glass"] = true, + ["prop_gumball_01"] = true, + ["prop_gumball_02"] = true, + ["prop_gumball_03"] = true, + ["prop_gun_case_01"] = true, + ["prop_gun_case_02"] = true, + ["prop_gun_frame"] = true, + ["prop_hacky_sack_01"] = true, + ["prop_hand_toilet"] = true, + ["prop_handdry_01"] = true, + ["prop_handdry_02"] = true, + ["prop_handrake"] = true, + ["prop_handtowels"] = true, + ["prop_hanger_door_1"] = true, + ["prop_hard_hat_01"] = true, + ["prop_hat_box_01"] = true, + ["prop_hat_box_02"] = true, + ["prop_hat_box_03"] = true, + ["prop_hat_box_04"] = true, + ["prop_hat_box_05"] = true, + ["prop_hat_box_06"] = true, + ["prop_hayb_st_01_cr"] = true, + ["prop_haybailer_01"] = true, + ["prop_haybale_01"] = true, + ["prop_haybale_02"] = true, + ["prop_haybale_03"] = true, + ["prop_haybale_stack_01"] = true, + ["prop_hd_seats_01"] = true, + ["prop_headphones_01"] = true, + ["prop_headset_01"] = true, + ["prop_hedge_trimmer_01"] = true, + ["prop_helipad_01"] = true, + ["prop_helipad_02"] = true, + ["prop_henna_disp_01"] = true, + ["prop_henna_disp_02"] = true, + ["prop_henna_disp_03"] = true, + ["prop_hifi_01"] = true, + ["prop_highway_paddle"] = true, + ["prop_hobo_seat_01"] = true, + ["prop_hobo_stove_01"] = true, + ["prop_hockey_bag_01"] = true, + ["prop_hole_plug_01"] = true, + ["prop_holster_01"] = true, + ["prop_homeles_shelter_01"] = true, + ["prop_homeles_shelter_02"] = true, + ["prop_homeless_matress_01"] = true, + ["prop_homeless_matress_02"] = true, + ["prop_horo_box_01"] = true, + ["prop_horo_box_02"] = true, + ["prop_hose_1"] = true, + ["prop_hose_2"] = true, + ["prop_hose_3"] = true, + ["prop_hose_nozzle"] = true, + ["prop_hospital_door_l"] = true, + ["prop_hospital_door_r"] = true, + ["prop_hospitaldoors_start"] = true, + ["prop_hot_tub_coverd"] = true, + ["prop_hotdogstand_01"] = true, + ["prop_hotel_clock_01"] = true, + ["prop_hotel_trolley"] = true, + ["prop_hottub2"] = true, + ["prop_huf_rag_01"] = true, + ["prop_huge_display_01"] = true, + ["prop_huge_display_02"] = true, + ["prop_hunterhide"] = true, + ["prop_hw1_03_gardoor_01"] = true, + ["prop_hw1_04_door_l1"] = true, + ["prop_hw1_04_door_r1"] = true, + ["prop_hw1_23_door"] = true, + ["prop_hwbowl_pseat_6x1"] = true, + ["prop_hwbowl_seat_01"] = true, + ["prop_hwbowl_seat_02"] = true, + ["prop_hwbowl_seat_03"] = true, + ["prop_hwbowl_seat_03b"] = true, + ["prop_hwbowl_seat_6x6"] = true, + ["prop_hx_arm"] = true, + ["prop_hx_arm_g"] = true, + ["prop_hx_arm_g_tr"] = true, + ["prop_hx_arm_p"] = true, + ["prop_hx_arm_p_tr"] = true, + ["prop_hx_arm_pk"] = true, + ["prop_hx_arm_pk_tr"] = true, + ["prop_hx_arm_tr"] = true, + ["prop_hx_arm_wh"] = true, + ["prop_hx_arm_wh_tr"] = true, + ["prop_hx_deadl"] = true, + ["prop_hx_deadl_g"] = true, + ["prop_hx_deadl_g_tr"] = true, + ["prop_hx_deadl_p"] = true, + ["prop_hx_deadl_p_tr"] = true, + ["prop_hx_deadl_pk"] = true, + ["prop_hx_deadl_pk_tr"] = true, + ["prop_hx_deadl_tr"] = true, + ["prop_hx_deadl_wh"] = true, + ["prop_hx_deadl_wh_tr"] = true, + ["prop_hx_special_buggy"] = true, + ["prop_hx_special_buggy_g"] = true, + ["prop_hx_special_buggy_g_tr"] = true, + ["prop_hx_special_buggy_p"] = true, + ["prop_hx_special_buggy_pk"] = true, + ["prop_hx_special_buggy_pk_tr"] = true, + ["prop_hx_special_buggy_wh"] = true, + ["prop_hx_special_buggy_wh_tr"] = true, + ["prop_hx_special_ruiner"] = true, + ["prop_hx_special_ruiner_g"] = true, + ["prop_hx_special_ruiner_g_tr"] = true, + ["prop_hx_special_ruiner_p"] = true, + ["prop_hx_special_ruiner_pk"] = true, + ["prop_hx_special_ruiner_pk_tr"] = true, + ["prop_hx_special_ruiner_wh"] = true, + ["prop_hx_special_ruiner_wh_tr"] = true, + ["prop_hx_special_vehicle"] = true, + ["prop_hx_special_vehicle__p_tr"] = true, + ["prop_hx_special_vehicle_g"] = true, + ["prop_hx_special_vehicle_g_tr"] = true, + ["prop_hx_special_vehicle_p"] = true, + ["prop_hx_special_vehicle_pk"] = true, + ["prop_hx_special_vehicle_pk_tr"] = true, + ["prop_hx_special_vehicle_tr"] = true, + ["prop_hx_special_vehicle_wh"] = true, + ["prop_hx_special_vehicle_wh_tr"] = true, + ["prop_hydro_platform_01"] = true, + ["prop_ic_10"] = true, + ["prop_ic_10_b"] = true, + ["prop_ic_10_bl"] = true, + ["prop_ic_10_g"] = true, + ["prop_ic_10_p"] = true, + ["prop_ic_10_pk"] = true, + ["prop_ic_10_wh"] = true, + ["prop_ic_15"] = true, + ["prop_ic_15_b"] = true, + ["prop_ic_15_bl"] = true, + ["prop_ic_15_g"] = true, + ["prop_ic_15_p"] = true, + ["prop_ic_15_pk"] = true, + ["prop_ic_15_wh"] = true, + ["prop_ic_20"] = true, + ["prop_ic_20_b"] = true, + ["prop_ic_20_bl"] = true, + ["prop_ic_20_g"] = true, + ["prop_ic_20_p"] = true, + ["prop_ic_20_pk"] = true, + ["prop_ic_20_wh"] = true, + ["prop_ic_30"] = true, + ["prop_ic_30_b"] = true, + ["prop_ic_30_bl"] = true, + ["prop_ic_30_g"] = true, + ["prop_ic_30_p"] = true, + ["prop_ic_30_pk"] = true, + ["prop_ic_30_wh"] = true, + ["prop_ic_5"] = true, + ["prop_ic_5_b"] = true, + ["prop_ic_5_bl"] = true, + ["prop_ic_5_g"] = true, + ["prop_ic_5_p"] = true, + ["prop_ic_5_pk"] = true, + ["prop_ic_5_wh"] = true, + ["prop_ic_acce_b"] = true, + ["prop_ic_acce_bl"] = true, + ["prop_ic_acce_p"] = true, + ["prop_ic_acce_wh"] = true, + ["prop_ic_accel"] = true, + ["prop_ic_accel_g"] = true, + ["prop_ic_accel_pk"] = true, + ["prop_ic_arm"] = true, + ["prop_ic_arm_b"] = true, + ["prop_ic_arm_bl"] = true, + ["prop_ic_arm_g"] = true, + ["prop_ic_arm_p"] = true, + ["prop_ic_arm_pk"] = true, + ["prop_ic_arm_wh"] = true, + ["prop_ic_bomb"] = true, + ["prop_ic_bomb_b"] = true, + ["prop_ic_bomb_b_tr"] = true, + ["prop_ic_bomb_bl"] = true, + ["prop_ic_bomb_bl_tr"] = true, + ["prop_ic_bomb_g"] = true, + ["prop_ic_bomb_g_tr"] = true, + ["prop_ic_bomb_p"] = true, + ["prop_ic_bomb_p_tr"] = true, + ["prop_ic_bomb_pk"] = true, + ["prop_ic_bomb_pk_tr"] = true, + ["prop_ic_bomb_tr"] = true, + ["prop_ic_bomb_wh"] = true, + ["prop_ic_bomb_wh_tr"] = true, + ["prop_ic_boost"] = true, + ["prop_ic_boost_g"] = true, + ["prop_ic_boost_p"] = true, + ["prop_ic_boost_pk"] = true, + ["prop_ic_boost_wh"] = true, + ["prop_ic_cp_bag"] = true, + ["prop_ic_deadl"] = true, + ["prop_ic_deadl_b"] = true, + ["prop_ic_deadl_bl"] = true, + ["prop_ic_deadl_g"] = true, + ["prop_ic_deadl_p"] = true, + ["prop_ic_deadl_pk"] = true, + ["prop_ic_deadl_wh"] = true, + ["prop_ic_deton"] = true, + ["prop_ic_deton_b"] = true, + ["prop_ic_deton_bl"] = true, + ["prop_ic_deton_g"] = true, + ["prop_ic_deton_p"] = true, + ["prop_ic_deton_pk"] = true, + ["prop_ic_deton_wh"] = true, + ["prop_ic_ghost"] = true, + ["prop_ic_ghost_b"] = true, + ["prop_ic_ghost_bl"] = true, + ["prop_ic_ghost_g"] = true, + ["prop_ic_ghost_p"] = true, + ["prop_ic_ghost_pk"] = true, + ["prop_ic_ghost_wh"] = true, + ["prop_ic_homing_rocket"] = true, + ["prop_ic_homing_rocket_b"] = true, + ["prop_ic_homing_rocket_bl"] = true, + ["prop_ic_homing_rocket_g"] = true, + ["prop_ic_homing_rocket_p"] = true, + ["prop_ic_homing_rocket_pk"] = true, + ["prop_ic_homing_rocket_wh"] = true, + ["prop_ic_hop"] = true, + ["prop_ic_hop_g"] = true, + ["prop_ic_hop_p"] = true, + ["prop_ic_hop_pk"] = true, + ["prop_ic_hop_wh"] = true, + ["prop_ic_jugg"] = true, + ["prop_ic_jugg_b"] = true, + ["prop_ic_jugg_bl"] = true, + ["prop_ic_jugg_g"] = true, + ["prop_ic_jugg_p"] = true, + ["prop_ic_jugg_pk"] = true, + ["prop_ic_jugg_wh"] = true, + ["prop_ic_jump"] = true, + ["prop_ic_jump_b"] = true, + ["prop_ic_jump_bl"] = true, + ["prop_ic_jump_g"] = true, + ["prop_ic_jump_p"] = true, + ["prop_ic_jump_pk"] = true, + ["prop_ic_jump_wh"] = true, + ["prop_ic_mguns"] = true, + ["prop_ic_mguns_b"] = true, + ["prop_ic_mguns_b_tr"] = true, + ["prop_ic_mguns_bl"] = true, + ["prop_ic_mguns_bl_tr"] = true, + ["prop_ic_mguns_g"] = true, + ["prop_ic_mguns_g_tr"] = true, + ["prop_ic_mguns_p"] = true, + ["prop_ic_mguns_p_tr"] = true, + ["prop_ic_mguns_pk"] = true, + ["prop_ic_mguns_pk_tr"] = true, + ["prop_ic_mguns_tr"] = true, + ["prop_ic_mguns_wh"] = true, + ["prop_ic_mguns_wh_tr"] = true, + ["prop_ic_non_hrocket"] = true, + ["prop_ic_non_hrocket_b"] = true, + ["prop_ic_non_hrocket_bl"] = true, + ["prop_ic_non_hrocket_g"] = true, + ["prop_ic_non_hrocket_p"] = true, + ["prop_ic_non_hrocket_pk"] = true, + ["prop_ic_non_hrocket_wh"] = true, + ["prop_ic_parachute"] = true, + ["prop_ic_parachute_b"] = true, + ["prop_ic_parachute_bl"] = true, + ["prop_ic_parachute_g"] = true, + ["prop_ic_parachute_p"] = true, + ["prop_ic_parachute_pk"] = true, + ["prop_ic_parachute_wh"] = true, + ["prop_ic_rboost"] = true, + ["prop_ic_rboost_b"] = true, + ["prop_ic_rboost_bl"] = true, + ["prop_ic_rboost_g"] = true, + ["prop_ic_rboost_p"] = true, + ["prop_ic_rboost_pk"] = true, + ["prop_ic_rboost_wh"] = true, + ["prop_ic_repair"] = true, + ["prop_ic_repair_b"] = true, + ["prop_ic_repair_bl"] = true, + ["prop_ic_repair_g"] = true, + ["prop_ic_repair_p"] = true, + ["prop_ic_repair_pk"] = true, + ["prop_ic_repair_wh"] = true, + ["prop_ic_rock"] = true, + ["prop_ic_rock_b"] = true, + ["prop_ic_rock_b_tr"] = true, + ["prop_ic_rock_bl"] = true, + ["prop_ic_rock_g"] = true, + ["prop_ic_rock_g_tr"] = true, + ["prop_ic_rock_p"] = true, + ["prop_ic_rock_p_tr"] = true, + ["prop_ic_rock_pk"] = true, + ["prop_ic_rock_tr"] = true, + ["prop_ic_rock_wh"] = true, + ["prop_ic_rock_wh_tr"] = true, + ["prop_ic_rocket_bl_tr"] = true, + ["prop_ic_special_buggy"] = true, + ["prop_ic_special_buggy_b"] = true, + ["prop_ic_special_buggy_bl"] = true, + ["prop_ic_special_buggy_g"] = true, + ["prop_ic_special_buggy_p"] = true, + ["prop_ic_special_buggy_p_tr"] = true, + ["prop_ic_special_buggy_pk"] = true, + ["prop_ic_special_buggy_tr"] = true, + ["prop_ic_special_buggy_wh"] = true, + ["prop_ic_special_ruiner"] = true, + ["prop_ic_special_ruiner_bl"] = true, + ["prop_ic_special_ruiner_g"] = true, + ["prop_ic_special_ruiner_p"] = true, + ["prop_ic_special_ruiner_p_tr"] = true, + ["prop_ic_special_ruiner_pk"] = true, + ["prop_ic_special_ruiner_tr"] = true, + ["prop_ic_special_ruiner_wh"] = true, + ["prop_ic_special_runier_b"] = true, + ["prop_ic_special_vehicle"] = true, + ["prop_ic_special_vehicle_b"] = true, + ["prop_ic_special_vehicle_bl"] = true, + ["prop_ic_special_vehicle_g"] = true, + ["prop_ic_special_vehicle_p"] = true, + ["prop_ic_special_vehicle_pk"] = true, + ["prop_ic_special_vehicle_wh"] = true, + ["prop_ice_box_01"] = true, + ["prop_ice_box_01_l1"] = true, + ["prop_ice_cube_01"] = true, + ["prop_ice_cube_02"] = true, + ["prop_ice_cube_03"] = true, + ["prop_icrocket_pk_tr"] = true, + ["prop_id_21_gardoor_01"] = true, + ["prop_id_21_gardoor_02"] = true, + ["prop_id2_11_gdoor"] = true, + ["prop_id2_20_clock"] = true, + ["prop_idol_01"] = true, + ["prop_idol_01_error"] = true, + ["prop_idol_case"] = true, + ["prop_idol_case_01"] = true, + ["prop_idol_case_02"] = true, + ["prop_ind_barge_01"] = true, + ["prop_ind_barge_01_cr"] = true, + ["prop_ind_barge_02"] = true, + ["prop_ind_coalcar_01"] = true, + ["prop_ind_coalcar_02"] = true, + ["prop_ind_coalcar_03"] = true, + ["prop_ind_conveyor_01"] = true, + ["prop_ind_conveyor_02"] = true, + ["prop_ind_conveyor_04"] = true, + ["prop_ind_crusher"] = true, + ["prop_ind_deiseltank"] = true, + ["prop_ind_light_01a"] = true, + ["prop_ind_light_01b"] = true, + ["prop_ind_light_01c"] = true, + ["prop_ind_light_02a"] = true, + ["prop_ind_light_02b"] = true, + ["prop_ind_light_02c"] = true, + ["prop_ind_light_03a"] = true, + ["prop_ind_light_03b"] = true, + ["prop_ind_light_03c"] = true, + ["prop_ind_light_04"] = true, + ["prop_ind_light_05"] = true, + ["prop_ind_mech_01c"] = true, + ["prop_ind_mech_02a"] = true, + ["prop_ind_mech_02b"] = true, + ["prop_ind_mech_03a"] = true, + ["prop_ind_mech_04a"] = true, + ["prop_ind_oldcrane"] = true, + ["prop_ind_pipe_01"] = true, + ["prop_ind_washer_02"] = true, + ["prop_indus_meet_door_l"] = true, + ["prop_indus_meet_door_r"] = true, + ["prop_inflatearch_01"] = true, + ["prop_inflategate_01"] = true, + ["prop_ing_camera_01"] = true, + ["prop_ing_crowbar"] = true, + ["prop_inhaler_01"] = true, + ["prop_inout_tray_01"] = true, + ["prop_inout_tray_02"] = true, + ["prop_int_cf_chick_01"] = true, + ["prop_int_cf_chick_02"] = true, + ["prop_int_cf_chick_03"] = true, + ["prop_int_gate01"] = true, + ["prop_irish_sign_01"] = true, + ["prop_irish_sign_02"] = true, + ["prop_irish_sign_03"] = true, + ["prop_irish_sign_04"] = true, + ["prop_irish_sign_05"] = true, + ["prop_irish_sign_06"] = true, + ["prop_irish_sign_07"] = true, + ["prop_irish_sign_08"] = true, + ["prop_irish_sign_09"] = true, + ["prop_irish_sign_10"] = true, + ["prop_irish_sign_11"] = true, + ["prop_irish_sign_12"] = true, + ["prop_irish_sign_13"] = true, + ["prop_iron_01"] = true, + ["prop_j_disptray_01"] = true, + ["prop_j_disptray_01_dam"] = true, + ["prop_j_disptray_01b"] = true, + ["prop_j_disptray_02"] = true, + ["prop_j_disptray_02_dam"] = true, + ["prop_j_disptray_03"] = true, + ["prop_j_disptray_03_dam"] = true, + ["prop_j_disptray_04"] = true, + ["prop_j_disptray_04b"] = true, + ["prop_j_disptray_05"] = true, + ["prop_j_disptray_05b"] = true, + ["prop_j_heist_pic_01"] = true, + ["prop_j_heist_pic_02"] = true, + ["prop_j_heist_pic_03"] = true, + ["prop_j_heist_pic_04"] = true, + ["prop_j_neck_disp_01"] = true, + ["prop_j_neck_disp_02"] = true, + ["prop_j_neck_disp_03"] = true, + ["prop_jb700_covered"] = true, + ["prop_jeans_01"] = true, + ["prop_jerrycan_01a"] = true, + ["prop_jet_bloodsplat_01"] = true, + ["prop_jetski_ramp_01"] = true, + ["prop_jetski_trailer_01"] = true, + ["prop_jewel_02a"] = true, + ["prop_jewel_02b"] = true, + ["prop_jewel_02c"] = true, + ["prop_jewel_03a"] = true, + ["prop_jewel_03b"] = true, + ["prop_jewel_04a"] = true, + ["prop_jewel_04b"] = true, + ["prop_jewel_glass"] = true, + ["prop_jewel_glass_root"] = true, + ["prop_jewel_pickup_new_01"] = true, + ["prop_joshua_tree_01a"] = true, + ["prop_joshua_tree_01b"] = true, + ["prop_joshua_tree_01c"] = true, + ["prop_joshua_tree_01d"] = true, + ["prop_joshua_tree_01e"] = true, + ["prop_joshua_tree_02a"] = true, + ["prop_joshua_tree_02b"] = true, + ["prop_joshua_tree_02c"] = true, + ["prop_joshua_tree_02d"] = true, + ["prop_joshua_tree_02e"] = true, + ["prop_juice_dispenser"] = true, + ["prop_juice_pool_01"] = true, + ["prop_juicestand"] = true, + ["prop_jukebox_01"] = true, + ["prop_jukebox_02"] = true, + ["prop_jyard_block_01a"] = true, + ["prop_kayak_01"] = true, + ["prop_kayak_01b"] = true, + ["prop_kebab_grill"] = true, + ["prop_keg_01"] = true, + ["prop_kettle"] = true, + ["prop_kettle_01"] = true, + ["prop_keyboard_01a"] = true, + ["prop_keyboard_01b"] = true, + ["prop_kino_light_01"] = true, + ["prop_kino_light_02"] = true, + ["prop_kino_light_03"] = true, + ["prop_kitch_juicer"] = true, + ["prop_kitch_pot_fry"] = true, + ["prop_kitch_pot_huge"] = true, + ["prop_kitch_pot_lrg"] = true, + ["prop_kitch_pot_lrg2"] = true, + ["prop_kitch_pot_med"] = true, + ["prop_kitch_pot_sm"] = true, + ["prop_knife"] = true, + ["prop_knife_stand"] = true, + ["prop_kt1_06_door_l"] = true, + ["prop_kt1_06_door_r"] = true, + ["prop_kt1_10_mpdoor_l"] = true, + ["prop_kt1_10_mpdoor_r"] = true, + ["prop_ladel"] = true, + ["prop_laptop_01a"] = true, + ["prop_laptop_02_closed"] = true, + ["prop_laptop_jimmy"] = true, + ["prop_laptop_lester"] = true, + ["prop_laptop_lester2"] = true, + ["prop_large_gold"] = true, + ["prop_large_gold_alt_a"] = true, + ["prop_large_gold_alt_b"] = true, + ["prop_large_gold_alt_c"] = true, + ["prop_large_gold_empty"] = true, + ["prop_lawnmower_01"] = true, + ["prop_ld_alarm_01"] = true, + ["prop_ld_alarm_01_dam"] = true, + ["prop_ld_alarm_alert"] = true, + ["prop_ld_ammo_pack_01"] = true, + ["prop_ld_ammo_pack_02"] = true, + ["prop_ld_ammo_pack_03"] = true, + ["prop_ld_armour"] = true, + ["prop_ld_balastrude"] = true, + ["prop_ld_balcfnc_01a"] = true, + ["prop_ld_balcfnc_01b"] = true, + ["prop_ld_balcfnc_02a"] = true, + ["prop_ld_balcfnc_02b"] = true, + ["prop_ld_balcfnc_02c"] = true, + ["prop_ld_balcfnc_03a"] = true, + ["prop_ld_balcfnc_03b"] = true, + ["prop_ld_bale01"] = true, + ["prop_ld_bankdoors_01"] = true, + ["prop_ld_bankdoors_02"] = true, + ["prop_ld_barrier_01"] = true, + ["prop_ld_bench01"] = true, + ["prop_ld_binbag_01"] = true, + ["prop_ld_bomb"] = true, + ["prop_ld_bomb_01"] = true, + ["prop_ld_bomb_01_open"] = true, + ["prop_ld_bomb_anim"] = true, + ["prop_ld_breakmast"] = true, + ["prop_ld_cable"] = true, + ["prop_ld_cable_tie_01"] = true, + ["prop_ld_can_01"] = true, + ["prop_ld_can_01b"] = true, + ["prop_ld_case_01"] = true, + ["prop_ld_case_01_lod"] = true, + ["prop_ld_case_01_s"] = true, + ["prop_ld_cont_light_01"] = true, + ["prop_ld_contact_card"] = true, + ["prop_ld_contain_dl"] = true, + ["prop_ld_contain_dl2"] = true, + ["prop_ld_contain_dr"] = true, + ["prop_ld_contain_dr2"] = true, + ["prop_ld_container"] = true, + ["prop_ld_crate_01"] = true, + ["prop_ld_crate_lid_01"] = true, + ["prop_ld_crocclips01"] = true, + ["prop_ld_crocclips02"] = true, + ["prop_ld_dstcover_01"] = true, + ["prop_ld_dstcover_02"] = true, + ["prop_ld_dstpillar_01"] = true, + ["prop_ld_dstpillar_02"] = true, + ["prop_ld_dstpillar_03"] = true, + ["prop_ld_dstpillar_04"] = true, + ["prop_ld_dstpillar_05"] = true, + ["prop_ld_dstpillar_06"] = true, + ["prop_ld_dstpillar_07"] = true, + ["prop_ld_dstpillar_08"] = true, + ["prop_ld_dstplanter_01"] = true, + ["prop_ld_dstplanter_02"] = true, + ["prop_ld_dstsign_01"] = true, + ["prop_ld_dummy_rope"] = true, + ["prop_ld_fags_01"] = true, + ["prop_ld_fags_02"] = true, + ["prop_ld_fan_01"] = true, + ["prop_ld_fan_01_old"] = true, + ["prop_ld_farm_chair01"] = true, + ["prop_ld_farm_cnr01"] = true, + ["prop_ld_farm_couch01"] = true, + ["prop_ld_farm_couch02"] = true, + ["prop_ld_farm_rail01"] = true, + ["prop_ld_farm_table01"] = true, + ["prop_ld_farm_table02"] = true, + ["prop_ld_faucet"] = true, + ["prop_ld_ferris_wheel"] = true, + ["prop_ld_fib_pillar01"] = true, + ["prop_ld_filmset"] = true, + ["prop_ld_fireaxe"] = true, + ["prop_ld_flow_bottle"] = true, + ["prop_ld_fragwall_01a"] = true, + ["prop_ld_fragwall_01b"] = true, + ["prop_ld_garaged_01"] = true, + ["prop_ld_gold_chest"] = true, + ["prop_ld_gold_tooth"] = true, + ["prop_ld_greenscreen_01"] = true, + ["prop_ld_handbag"] = true, + ["prop_ld_handbag_s"] = true, + ["prop_ld_hat_01"] = true, + ["prop_ld_haybail"] = true, + ["prop_ld_hdd_01"] = true, + ["prop_ld_headset_01"] = true, + ["prop_ld_health_pack"] = true, + ["prop_ld_hook"] = true, + ["prop_ld_int_safe_01"] = true, + ["prop_ld_jail_door"] = true, + ["prop_ld_jeans_01"] = true, + ["prop_ld_jeans_02"] = true, + ["prop_ld_jerrycan_01"] = true, + ["prop_ld_keypad_01"] = true, + ["prop_ld_keypad_01b"] = true, + ["prop_ld_keypad_01b_lod"] = true, + ["prop_ld_lab_corner01"] = true, + ["prop_ld_lab_dorway01"] = true, + ["prop_ld_lap_top"] = true, + ["prop_ld_monitor_01"] = true, + ["prop_ld_peep_slider"] = true, + ["prop_ld_pipe_single_01"] = true, + ["prop_ld_planning_pin_01"] = true, + ["prop_ld_planning_pin_02"] = true, + ["prop_ld_planning_pin_03"] = true, + ["prop_ld_planter1a"] = true, + ["prop_ld_planter1b"] = true, + ["prop_ld_planter1c"] = true, + ["prop_ld_planter2a"] = true, + ["prop_ld_planter2b"] = true, + ["prop_ld_planter2c"] = true, + ["prop_ld_planter3a"] = true, + ["prop_ld_planter3b"] = true, + ["prop_ld_planter3c"] = true, + ["prop_ld_purse_01"] = true, + ["prop_ld_purse_01_lod"] = true, + ["prop_ld_rail_01"] = true, + ["prop_ld_rail_02"] = true, + ["prop_ld_rope_t"] = true, + ["prop_ld_rub_binbag_01"] = true, + ["prop_ld_rubble_01"] = true, + ["prop_ld_rubble_02"] = true, + ["prop_ld_rubble_03"] = true, + ["prop_ld_rubble_04"] = true, + ["prop_ld_scrap"] = true, + ["prop_ld_shirt_01"] = true, + ["prop_ld_shoe_01"] = true, + ["prop_ld_shoe_02"] = true, + ["prop_ld_shovel"] = true, + ["prop_ld_shovel_dirt"] = true, + ["prop_ld_snack_01"] = true, + ["prop_ld_suitcase_01"] = true, + ["prop_ld_suitcase_02"] = true, + ["prop_ld_test_01"] = true, + ["prop_ld_toilet_01"] = true, + ["prop_ld_tooth"] = true, + ["prop_ld_tshirt_01"] = true, + ["prop_ld_tshirt_02"] = true, + ["prop_ld_vault_door"] = true, + ["prop_ld_w_me_machette"] = true, + ["prop_ld_wallet_01"] = true, + ["prop_ld_wallet_01_s"] = true, + ["prop_ld_wallet_02"] = true, + ["prop_ld_wallet_pickup"] = true, + ["prop_leaf_blower_01"] = true, + ["prop_lectern_01"] = true, + ["prop_letterbox_01"] = true, + ["prop_letterbox_02"] = true, + ["prop_letterbox_03"] = true, + ["prop_letterbox_04"] = true, + ["prop_lev_crate_01"] = true, + ["prop_lev_des_barge_01"] = true, + ["prop_lev_des_barge_02"] = true, + ["prop_life_ring_01"] = true, + ["prop_life_ring_02"] = true, + ["prop_lifeblurb_01"] = true, + ["prop_lifeblurb_01b"] = true, + ["prop_lifeblurb_02"] = true, + ["prop_lifeblurb_02b"] = true, + ["prop_lift_overlay_01"] = true, + ["prop_lift_overlay_02"] = true, + ["prop_lime_jar"] = true, + ["prop_litter_picker"] = true, + ["prop_log_01"] = true, + ["prop_log_02"] = true, + ["prop_log_03"] = true, + ["prop_log_aa"] = true, + ["prop_log_ab"] = true, + ["prop_log_ac"] = true, + ["prop_log_ad"] = true, + ["prop_log_ae"] = true, + ["prop_log_af"] = true, + ["prop_log_break_01"] = true, + ["prop_loggneon"] = true, + ["prop_logpile_01"] = true, + ["prop_logpile_02"] = true, + ["prop_logpile_03"] = true, + ["prop_logpile_04"] = true, + ["prop_logpile_05"] = true, + ["prop_logpile_06"] = true, + ["prop_logpile_06b"] = true, + ["prop_logpile_07"] = true, + ["prop_logpile_07b"] = true, + ["prop_loose_rag_01"] = true, + ["prop_lrggate_01_l"] = true, + ["prop_lrggate_01_pst"] = true, + ["prop_lrggate_01_r"] = true, + ["prop_lrggate_01b"] = true, + ["prop_lrggate_01c_l"] = true, + ["prop_lrggate_01c_r"] = true, + ["prop_lrggate_02"] = true, + ["prop_lrggate_02_ld"] = true, + ["prop_lrggate_03a"] = true, + ["prop_lrggate_03b"] = true, + ["prop_lrggate_03b_ld"] = true, + ["prop_lrggate_04a"] = true, + ["prop_lrggate_05a"] = true, + ["prop_lrggate_06a"] = true, + ["prop_luggage_01a"] = true, + ["prop_luggage_02a"] = true, + ["prop_luggage_03a"] = true, + ["prop_luggage_04a"] = true, + ["prop_luggage_05a"] = true, + ["prop_luggage_06a"] = true, + ["prop_luggage_07a"] = true, + ["prop_luggage_08a"] = true, + ["prop_luggage_09a"] = true, + ["prop_m_pack_int_01"] = true, + ["prop_magenta_door"] = true, + ["prop_makeup_brush"] = true, + ["prop_makeup_trail_01"] = true, + ["prop_makeup_trail_01_cr"] = true, + ["prop_makeup_trail_02"] = true, + ["prop_makeup_trail_02_cr"] = true, + ["prop_map_door_01"] = true, + ["prop_mask_ballistic"] = true, + ["prop_mask_ballistic_trip1"] = true, + ["prop_mask_ballistic_trip2"] = true, + ["prop_mask_bugstar"] = true, + ["prop_mask_bugstar_trip"] = true, + ["prop_mask_fireman"] = true, + ["prop_mask_flight"] = true, + ["prop_mask_motobike"] = true, + ["prop_mask_motobike_a"] = true, + ["prop_mask_motobike_b"] = true, + ["prop_mask_motobike_trip"] = true, + ["prop_mask_motox"] = true, + ["prop_mask_motox_trip"] = true, + ["prop_mask_scuba01"] = true, + ["prop_mask_scuba01_trip"] = true, + ["prop_mask_scuba02"] = true, + ["prop_mask_scuba02_trip"] = true, + ["prop_mask_scuba03"] = true, + ["prop_mask_scuba03_trip"] = true, + ["prop_mask_scuba04"] = true, + ["prop_mask_scuba04_trip"] = true, + ["prop_mask_specops"] = true, + ["prop_mask_specops_trip"] = true, + ["prop_mask_test_01"] = true, + ["prop_mast_01"] = true, + ["prop_mat_box"] = true, + ["prop_maxheight_01"] = true, + ["prop_mb_cargo_01a"] = true, + ["prop_mb_cargo_02a"] = true, + ["prop_mb_cargo_03a"] = true, + ["prop_mb_cargo_04a"] = true, + ["prop_mb_cargo_04b"] = true, + ["prop_mb_crate_01a"] = true, + ["prop_mb_crate_01a_set"] = true, + ["prop_mb_crate_01b"] = true, + ["prop_mb_hanger_sprinkler"] = true, + ["prop_mb_hesco_06"] = true, + ["prop_mb_ordnance_01"] = true, + ["prop_mb_ordnance_02"] = true, + ["prop_mb_ordnance_03"] = true, + ["prop_mb_ordnance_04"] = true, + ["prop_mb_sandblock_01"] = true, + ["prop_mb_sandblock_02"] = true, + ["prop_mb_sandblock_03"] = true, + ["prop_mb_sandblock_03_cr"] = true, + ["prop_mb_sandblock_04"] = true, + ["prop_mb_sandblock_05"] = true, + ["prop_mb_sandblock_05_cr"] = true, + ["prop_mc_conc_barrier_01"] = true, + ["prop_med_bag_01"] = true, + ["prop_med_bag_01b"] = true, + ["prop_med_jet_01"] = true, + ["prop_medal_01"] = true, + ["prop_medstation_01"] = true, + ["prop_medstation_02"] = true, + ["prop_medstation_03"] = true, + ["prop_medstation_04"] = true, + ["prop_megaphone_01"] = true, + ["prop_mem_candle_01"] = true, + ["prop_mem_candle_02"] = true, + ["prop_mem_candle_03"] = true, + ["prop_mem_candle_04"] = true, + ["prop_mem_candle_05"] = true, + ["prop_mem_candle_06"] = true, + ["prop_mem_candle_combo"] = true, + ["prop_metal_plates01"] = true, + ["prop_metal_plates02"] = true, + ["prop_metalfoodjar_002"] = true, + ["prop_metalfoodjar_01"] = true, + ["prop_meth_bag_01"] = true, + ["prop_meth_setup_01"] = true, + ["prop_michael_backpack"] = true, + ["prop_michael_balaclava"] = true, + ["prop_michael_door"] = true, + ["prop_michael_sec_id"] = true, + ["prop_michaels_credit_tv"] = true, + ["prop_micro_01"] = true, + ["prop_micro_02"] = true, + ["prop_micro_04"] = true, + ["prop_micro_cs_01"] = true, + ["prop_micro_cs_01_door"] = true, + ["prop_microphone_02"] = true, + ["prop_microwave_1"] = true, + ["prop_mil_crate_01"] = true, + ["prop_mil_crate_02"] = true, + ["prop_military_pickup_01"] = true, + ["prop_mine_doorng_l"] = true, + ["prop_mine_doorng_r"] = true, + ["prop_mineshaft_door"] = true, + ["prop_minigun_01"] = true, + ["prop_mk_arrow_3d"] = true, + ["prop_mk_arrow_flat"] = true, + ["prop_mk_b_shark"] = true, + ["prop_mk_b_time"] = true, + ["prop_mk_ball"] = true, + ["prop_mk_beast"] = true, + ["prop_mk_bike_logo_1"] = true, + ["prop_mk_bike_logo_2"] = true, + ["prop_mk_bmd"] = true, + ["prop_mk_boost"] = true, + ["prop_mk_cone"] = true, + ["prop_mk_cylinder"] = true, + ["prop_mk_flag"] = true, + ["prop_mk_flag_2"] = true, + ["prop_mk_heli"] = true, + ["prop_mk_hidden"] = true, + ["prop_mk_lap"] = true, + ["prop_mk_lines"] = true, + ["prop_mk_money"] = true, + ["prop_mk_mp_ring_01"] = true, + ["prop_mk_mp_ring_01b"] = true, + ["prop_mk_num_0"] = true, + ["prop_mk_num_1"] = true, + ["prop_mk_num_2"] = true, + ["prop_mk_num_3"] = true, + ["prop_mk_num_4"] = true, + ["prop_mk_num_5"] = true, + ["prop_mk_num_6"] = true, + ["prop_mk_num_7"] = true, + ["prop_mk_num_8"] = true, + ["prop_mk_num_9"] = true, + ["prop_mk_plane"] = true, + ["prop_mk_race_chevron_01"] = true, + ["prop_mk_race_chevron_02"] = true, + ["prop_mk_race_chevron_03"] = true, + ["prop_mk_random"] = true, + ["prop_mk_random_transform"] = true, + ["prop_mk_repair"] = true, + ["prop_mk_ring"] = true, + ["prop_mk_ring_flat"] = true, + ["prop_mk_s_time"] = true, + ["prop_mk_sphere"] = true, + ["prop_mk_swap"] = true, + ["prop_mk_thermal"] = true, + ["prop_mk_transform_bike"] = true, + ["prop_mk_transform_boat"] = true, + ["prop_mk_transform_car"] = true, + ["prop_mk_transform_helicopter"] = true, + ["prop_mk_transform_parachute"] = true, + ["prop_mk_transform_plane"] = true, + ["prop_mk_transform_push_bike"] = true, + ["prop_mk_transform_thruster"] = true, + ["prop_mk_transform_truck"] = true, + ["prop_mk_tri_cycle"] = true, + ["prop_mk_tri_run"] = true, + ["prop_mk_tri_swim"] = true, + ["prop_mk_warp"] = true, + ["prop_mk_weed"] = true, + ["prop_mobile_mast_1"] = true, + ["prop_mobile_mast_2"] = true, + ["prop_mojito"] = true, + ["prop_money_bag_01"] = true, + ["prop_monitor_01a"] = true, + ["prop_monitor_01b"] = true, + ["prop_monitor_01c"] = true, + ["prop_monitor_01d"] = true, + ["prop_monitor_02"] = true, + ["prop_monitor_03b"] = true, + ["prop_monitor_04a"] = true, + ["prop_monitor_li"] = true, + ["prop_monitor_w_large"] = true, + ["prop_motel_door_09"] = true, + ["prop_mouse_01"] = true, + ["prop_mouse_01a"] = true, + ["prop_mouse_01b"] = true, + ["prop_mouse_02"] = true, + ["prop_mov_sechutwin"] = true, + ["prop_mov_sechutwin_02"] = true, + ["prop_movie_rack"] = true, + ["prop_mp_arrow_barrier_01"] = true, + ["prop_mp_arrow_ring"] = true, + ["prop_mp_barrier_01"] = true, + ["prop_mp_barrier_01b"] = true, + ["prop_mp_barrier_02"] = true, + ["prop_mp_barrier_02b"] = true, + ["prop_mp_base_marker"] = true, + ["prop_mp_boost_01"] = true, + ["prop_mp_cant_place_lrg"] = true, + ["prop_mp_cant_place_med"] = true, + ["prop_mp_cant_place_sm"] = true, + ["prop_mp_conc_barrier_01"] = true, + ["prop_mp_cone_01"] = true, + ["prop_mp_cone_02"] = true, + ["prop_mp_cone_03"] = true, + ["prop_mp_cone_04"] = true, + ["prop_mp_drug_pack_blue"] = true, + ["prop_mp_drug_pack_red"] = true, + ["prop_mp_drug_package"] = true, + ["prop_mp_halo"] = true, + ["prop_mp_halo_lrg"] = true, + ["prop_mp_halo_med"] = true, + ["prop_mp_halo_point"] = true, + ["prop_mp_halo_point_lrg"] = true, + ["prop_mp_halo_point_med"] = true, + ["prop_mp_halo_point_sm"] = true, + ["prop_mp_halo_rotate"] = true, + ["prop_mp_halo_rotate_lrg"] = true, + ["prop_mp_halo_rotate_med"] = true, + ["prop_mp_halo_rotate_sm"] = true, + ["prop_mp_halo_sm"] = true, + ["prop_mp_icon_shad_lrg"] = true, + ["prop_mp_icon_shad_med"] = true, + ["prop_mp_icon_shad_sm"] = true, + ["prop_mp_max_out_lrg"] = true, + ["prop_mp_max_out_med"] = true, + ["prop_mp_max_out_sm"] = true, + ["prop_mp_num_0"] = true, + ["prop_mp_num_1"] = true, + ["prop_mp_num_2"] = true, + ["prop_mp_num_3"] = true, + ["prop_mp_num_4"] = true, + ["prop_mp_num_5"] = true, + ["prop_mp_num_6"] = true, + ["prop_mp_num_7"] = true, + ["prop_mp_num_8"] = true, + ["prop_mp_num_9"] = true, + ["prop_mp_placement"] = true, + ["prop_mp_placement_lrg"] = true, + ["prop_mp_placement_maxd"] = true, + ["prop_mp_placement_med"] = true, + ["prop_mp_placement_red"] = true, + ["prop_mp_placement_sm"] = true, + ["prop_mp_pointer_ring"] = true, + ["prop_mp_ramp_01"] = true, + ["prop_mp_ramp_01_tu"] = true, + ["prop_mp_ramp_02"] = true, + ["prop_mp_ramp_02_tu"] = true, + ["prop_mp_ramp_03"] = true, + ["prop_mp_ramp_03_tu"] = true, + ["prop_mp_repair"] = true, + ["prop_mp_repair_01"] = true, + ["prop_mp_respawn_02"] = true, + ["prop_mp_rocket_01"] = true, + ["prop_mp_solid_ring"] = true, + ["prop_mp_spike_01"] = true, + ["prop_mp3_dock"] = true, + ["prop_mr_rasberryclean"] = true, + ["prop_mr_raspberry_01"] = true, + ["prop_mug_01"] = true, + ["prop_mug_02"] = true, + ["prop_mug_03"] = true, + ["prop_mug_04"] = true, + ["prop_mug_06"] = true, + ["prop_mugs_rm_flashb"] = true, + ["prop_mugs_rm_lightoff"] = true, + ["prop_mugs_rm_lighton"] = true, + ["prop_muscle_bench_01"] = true, + ["prop_muscle_bench_02"] = true, + ["prop_muscle_bench_03"] = true, + ["prop_muscle_bench_04"] = true, + ["prop_muscle_bench_05"] = true, + ["prop_muscle_bench_06"] = true, + ["prop_muster_wboard_01"] = true, + ["prop_muster_wboard_02"] = true, + ["prop_necklace_board"] = true, + ["prop_new_drug_pack_01"] = true, + ["prop_news_disp_01a"] = true, + ["prop_news_disp_02a"] = true, + ["prop_news_disp_02a_s"] = true, + ["prop_news_disp_02b"] = true, + ["prop_news_disp_02c"] = true, + ["prop_news_disp_02d"] = true, + ["prop_news_disp_02e"] = true, + ["prop_news_disp_03a"] = true, + ["prop_news_disp_03c"] = true, + ["prop_news_disp_05a"] = true, + ["prop_news_disp_06a"] = true, + ["prop_ng_sculpt_fix"] = true, + ["prop_nigel_bag_pickup"] = true, + ["prop_night_safe_01"] = true, + ["prop_notepad_01"] = true, + ["prop_notepad_02"] = true, + ["prop_novel_01"] = true, + ["prop_npc_phone"] = true, + ["prop_npc_phone_02"] = true, + ["prop_off_chair_01"] = true, + ["prop_off_chair_03"] = true, + ["prop_off_chair_04"] = true, + ["prop_off_chair_04_s"] = true, + ["prop_off_chair_04b"] = true, + ["prop_off_chair_05"] = true, + ["prop_off_phone_01"] = true, + ["prop_office_alarm_01"] = true, + ["prop_office_desk_01"] = true, + ["prop_office_phone_tnt"] = true, + ["prop_offroad_bale01"] = true, + ["prop_offroad_bale02"] = true, + ["prop_offroad_bale03"] = true, + ["prop_offroad_barrel01"] = true, + ["prop_offroad_barrel02"] = true, + ["prop_offroad_tyres01"] = true, + ["prop_offroad_tyres01_tu"] = true, + ["prop_offroad_tyres02"] = true, + ["prop_oil_derrick_01"] = true, + ["prop_oil_guage_01"] = true, + ["prop_oil_spool_02"] = true, + ["prop_oil_valve_01"] = true, + ["prop_oil_valve_02"] = true, + ["prop_oil_wellhead_01"] = true, + ["prop_oil_wellhead_03"] = true, + ["prop_oil_wellhead_04"] = true, + ["prop_oil_wellhead_05"] = true, + ["prop_oil_wellhead_06"] = true, + ["prop_oilcan_01a"] = true, + ["prop_oilcan_02a"] = true, + ["prop_oiltub_01"] = true, + ["prop_oiltub_02"] = true, + ["prop_oiltub_03"] = true, + ["prop_oiltub_04"] = true, + ["prop_oiltub_05"] = true, + ["prop_oiltub_06"] = true, + ["prop_old_boot"] = true, + ["prop_old_churn_01"] = true, + ["prop_old_churn_02"] = true, + ["prop_old_deck_chair"] = true, + ["prop_old_deck_chair_02"] = true, + ["prop_old_farm_01"] = true, + ["prop_old_farm_02"] = true, + ["prop_old_farm_03"] = true, + ["prop_old_wood_chair"] = true, + ["prop_old_wood_chair_lod"] = true, + ["prop_oldlight_01a"] = true, + ["prop_oldlight_01b"] = true, + ["prop_oldlight_01c"] = true, + ["prop_oldplough1"] = true, + ["prop_optic_jd"] = true, + ["prop_optic_rum"] = true, + ["prop_optic_vodka"] = true, + ["prop_orang_can_01"] = true, + ["prop_out_door_speaker"] = true, + ["prop_outdoor_fan_01"] = true, + ["prop_overalls_01"] = true, + ["prop_owl_totem_01"] = true, + ["prop_p_jack_03_col"] = true, + ["prop_p_spider_01a"] = true, + ["prop_p_spider_01c"] = true, + ["prop_p_spider_01d"] = true, + ["prop_paint_brush01"] = true, + ["prop_paint_brush02"] = true, + ["prop_paint_brush03"] = true, + ["prop_paint_brush04"] = true, + ["prop_paint_brush05"] = true, + ["prop_paint_roller"] = true, + ["prop_paint_spray01a"] = true, + ["prop_paint_spray01b"] = true, + ["prop_paint_stepl01"] = true, + ["prop_paint_stepl01b"] = true, + ["prop_paint_stepl02"] = true, + ["prop_paint_tray"] = true, + ["prop_paint_wpaper01"] = true, + ["prop_paints_bench01"] = true, + ["prop_paints_can01"] = true, + ["prop_paints_can02"] = true, + ["prop_paints_can03"] = true, + ["prop_paints_can04"] = true, + ["prop_paints_can05"] = true, + ["prop_paints_can06"] = true, + ["prop_paints_can07"] = true, + ["prop_paints_pallete01"] = true, + ["prop_pallet_01a"] = true, + ["prop_pallet_02a"] = true, + ["prop_pallet_03a"] = true, + ["prop_pallet_03b"] = true, + ["prop_pallet_pile_01"] = true, + ["prop_pallet_pile_02"] = true, + ["prop_pallet_pile_03"] = true, + ["prop_pallet_pile_04"] = true, + ["prop_pallettruck_01"] = true, + ["prop_pallettruck_02"] = true, + ["prop_palm_fan_02_a"] = true, + ["prop_palm_fan_02_b"] = true, + ["prop_palm_fan_03_a"] = true, + ["prop_palm_fan_03_b"] = true, + ["prop_palm_fan_03_c"] = true, + ["prop_palm_fan_03_c_graff"] = true, + ["prop_palm_fan_03_d"] = true, + ["prop_palm_fan_03_d_graff"] = true, + ["prop_palm_fan_04_a"] = true, + ["prop_palm_fan_04_b"] = true, + ["prop_palm_fan_04_c"] = true, + ["prop_palm_fan_04_d"] = true, + ["prop_palm_huge_01a"] = true, + ["prop_palm_huge_01b"] = true, + ["prop_palm_med_01a"] = true, + ["prop_palm_med_01b"] = true, + ["prop_palm_med_01c"] = true, + ["prop_palm_med_01d"] = true, + ["prop_palm_sm_01a"] = true, + ["prop_palm_sm_01d"] = true, + ["prop_palm_sm_01e"] = true, + ["prop_palm_sm_01f"] = true, + ["prop_pap_camera_01"] = true, + ["prop_paper_bag_01"] = true, + ["prop_paper_bag_small"] = true, + ["prop_paper_ball"] = true, + ["prop_paper_box_01"] = true, + ["prop_paper_box_02"] = true, + ["prop_paper_box_03"] = true, + ["prop_paper_box_04"] = true, + ["prop_paper_box_05"] = true, + ["prop_parachute"] = true, + ["prop_parapack_01"] = true, + ["prop_parasol_01"] = true, + ["prop_parasol_01_b"] = true, + ["prop_parasol_01_c"] = true, + ["prop_parasol_01_down"] = true, + ["prop_parasol_01_lod"] = true, + ["prop_parasol_01b_lod"] = true, + ["prop_parasol_02"] = true, + ["prop_parasol_02_b"] = true, + ["prop_parasol_02_c"] = true, + ["prop_parasol_03"] = true, + ["prop_parasol_03_b"] = true, + ["prop_parasol_03_c"] = true, + ["prop_parasol_04"] = true, + ["prop_parasol_04b"] = true, + ["prop_parasol_04c"] = true, + ["prop_parasol_04d"] = true, + ["prop_parasol_04e"] = true, + ["prop_parasol_04e_lod1"] = true, + ["prop_parasol_05"] = true, + ["prop_parasol_bh_48"] = true, + ["prop_park_ticket_01"] = true, + ["prop_parking_hut_2"] = true, + ["prop_parking_hut_2b"] = true, + ["prop_parking_sign_06"] = true, + ["prop_parking_sign_07"] = true, + ["prop_parking_sign_1"] = true, + ["prop_parking_sign_2"] = true, + ["prop_parking_wand_01"] = true, + ["prop_parkingpay"] = true, + ["prop_parknmeter_01"] = true, + ["prop_parknmeter_02"] = true, + ["prop_partsbox_01"] = true, + ["prop_passport_01"] = true, + ["prop_patio_heater_01"] = true, + ["prop_patio_lounger_2"] = true, + ["prop_patio_lounger_3"] = true, + ["prop_patio_lounger1"] = true, + ["prop_patio_lounger1_table"] = true, + ["prop_patio_lounger1b"] = true, + ["prop_patriotneon"] = true, + ["prop_paynspray_door_l"] = true, + ["prop_paynspray_door_r"] = true, + ["prop_pc_01a"] = true, + ["prop_pc_02a"] = true, + ["prop_peanut_bowl_01"] = true, + ["prop_ped_gib_01"] = true, + ["prop_ped_pic_01"] = true, + ["prop_ped_pic_01_sm"] = true, + ["prop_ped_pic_02"] = true, + ["prop_ped_pic_02_sm"] = true, + ["prop_ped_pic_03"] = true, + ["prop_ped_pic_03_sm"] = true, + ["prop_ped_pic_04"] = true, + ["prop_ped_pic_04_sm"] = true, + ["prop_ped_pic_05"] = true, + ["prop_ped_pic_05_sm"] = true, + ["prop_ped_pic_06"] = true, + ["prop_ped_pic_06_sm"] = true, + ["prop_ped_pic_07"] = true, + ["prop_ped_pic_07_sm"] = true, + ["prop_ped_pic_08"] = true, + ["prop_ped_pic_08_sm"] = true, + ["prop_pencil_01"] = true, + ["prop_peyote_chunk_01"] = true, + ["prop_peyote_gold_01"] = true, + ["prop_peyote_highland_01"] = true, + ["prop_peyote_highland_02"] = true, + ["prop_peyote_lowland_01"] = true, + ["prop_peyote_lowland_02"] = true, + ["prop_peyote_water_01"] = true, + ["prop_pharm_sign_01"] = true, + ["prop_phone_cs_frank"] = true, + ["prop_phone_ing"] = true, + ["prop_phone_ing_02"] = true, + ["prop_phone_ing_02_lod"] = true, + ["prop_phone_ing_03"] = true, + ["prop_phone_ing_03_lod"] = true, + ["prop_phone_overlay_01"] = true, + ["prop_phone_overlay_02"] = true, + ["prop_phone_overlay_03"] = true, + ["prop_phone_overlay_anim"] = true, + ["prop_phone_proto"] = true, + ["prop_phone_proto_back"] = true, + ["prop_phone_proto_battery"] = true, + ["prop_phonebox_01a"] = true, + ["prop_phonebox_01b"] = true, + ["prop_phonebox_01c"] = true, + ["prop_phonebox_02"] = true, + ["prop_phonebox_03"] = true, + ["prop_phonebox_04"] = true, + ["prop_phonebox_05a"] = true, + ["prop_phys_wades_head"] = true, + ["prop_picnictable_01"] = true, + ["prop_picnictable_01_lod"] = true, + ["prop_picnictable_02"] = true, + ["prop_pier_kiosk_01"] = true, + ["prop_pier_kiosk_02"] = true, + ["prop_pier_kiosk_03"] = true, + ["prop_piercing_gun"] = true, + ["prop_pighouse1"] = true, + ["prop_pighouse2"] = true, + ["prop_pile_dirt_01"] = true, + ["prop_pile_dirt_02"] = true, + ["prop_pile_dirt_03"] = true, + ["prop_pile_dirt_04"] = true, + ["prop_pile_dirt_06"] = true, + ["prop_pile_dirt_07"] = true, + ["prop_pile_dirt_07_cr"] = true, + ["prop_pinacolada"] = true, + ["prop_pineapple"] = true, + ["prop_ping_pong"] = true, + ["prop_pint_glass_01"] = true, + ["prop_pint_glass_02"] = true, + ["prop_pint_glass_tall"] = true, + ["prop_pipe_single_01"] = true, + ["prop_pipe_stack_01"] = true, + ["prop_pipes_01a"] = true, + ["prop_pipes_01b"] = true, + ["prop_pipes_02a"] = true, + ["prop_pipes_02b"] = true, + ["prop_pipes_03a"] = true, + ["prop_pipes_03b"] = true, + ["prop_pipes_04a"] = true, + ["prop_pipes_05a"] = true, + ["prop_pipes_conc_01"] = true, + ["prop_pipes_conc_02"] = true, + ["prop_pipes_ld_01"] = true, + ["prop_pistol_holster"] = true, + ["prop_pitcher_01"] = true, + ["prop_pitcher_01_cs"] = true, + ["prop_pitcher_02"] = true, + ["prop_pizza_box_01"] = true, + ["prop_pizza_box_02"] = true, + ["prop_pizza_box_03"] = true, + ["prop_pizza_oven_01"] = true, + ["prop_planer_01"] = true, + ["prop_plant_01a"] = true, + ["prop_plant_01b"] = true, + ["prop_plant_base_01"] = true, + ["prop_plant_base_02"] = true, + ["prop_plant_base_03"] = true, + ["prop_plant_cane_01a"] = true, + ["prop_plant_cane_01b"] = true, + ["prop_plant_cane_02a"] = true, + ["prop_plant_cane_02b"] = true, + ["prop_plant_clover_01"] = true, + ["prop_plant_clover_02"] = true, + ["prop_plant_fern_01a"] = true, + ["prop_plant_fern_01b"] = true, + ["prop_plant_fern_02a"] = true, + ["prop_plant_fern_02b"] = true, + ["prop_plant_fern_02c"] = true, + ["prop_plant_flower_01"] = true, + ["prop_plant_flower_02"] = true, + ["prop_plant_flower_03"] = true, + ["prop_plant_flower_04"] = true, + ["prop_plant_group_01"] = true, + ["prop_plant_group_02"] = true, + ["prop_plant_group_03"] = true, + ["prop_plant_group_04"] = true, + ["prop_plant_group_04_cr"] = true, + ["prop_plant_group_05"] = true, + ["prop_plant_group_05b"] = true, + ["prop_plant_group_05c"] = true, + ["prop_plant_group_05d"] = true, + ["prop_plant_group_05e"] = true, + ["prop_plant_group_06a"] = true, + ["prop_plant_group_06b"] = true, + ["prop_plant_group_06c"] = true, + ["prop_plant_int_01a"] = true, + ["prop_plant_int_01b"] = true, + ["prop_plant_int_02a"] = true, + ["prop_plant_int_02b"] = true, + ["prop_plant_int_03a"] = true, + ["prop_plant_int_03b"] = true, + ["prop_plant_int_03c"] = true, + ["prop_plant_int_04a"] = true, + ["prop_plant_int_04b"] = true, + ["prop_plant_int_04c"] = true, + ["prop_plant_int_05a"] = true, + ["prop_plant_int_05b"] = true, + ["prop_plant_int_06a"] = true, + ["prop_plant_int_06b"] = true, + ["prop_plant_int_06c"] = true, + ["prop_plant_interior_05a"] = true, + ["prop_plant_palm_01a"] = true, + ["prop_plant_palm_01b"] = true, + ["prop_plant_palm_01c"] = true, + ["prop_plant_paradise"] = true, + ["prop_plant_paradise_b"] = true, + ["prop_plas_barier_01a"] = true, + ["prop_plastic_cup_02"] = true, + ["prop_plate_01"] = true, + ["prop_plate_02"] = true, + ["prop_plate_03"] = true, + ["prop_plate_04"] = true, + ["prop_plate_stand_01"] = true, + ["prop_plate_warmer"] = true, + ["prop_player_gasmask"] = true, + ["prop_player_phone_01"] = true, + ["prop_player_phone_02"] = true, + ["prop_pliers_01"] = true, + ["prop_plonk_red"] = true, + ["prop_plonk_rose"] = true, + ["prop_plonk_white"] = true, + ["prop_plough"] = true, + ["prop_plywoodpile_01a"] = true, + ["prop_plywoodpile_01b"] = true, + ["prop_podium_mic"] = true, + ["prop_police_door_l"] = true, + ["prop_police_door_l_dam"] = true, + ["prop_police_door_r"] = true, + ["prop_police_door_r_dam"] = true, + ["prop_police_door_surround"] = true, + ["prop_police_id_board"] = true, + ["prop_police_id_text"] = true, + ["prop_police_id_text_02"] = true, + ["prop_police_phone"] = true, + ["prop_police_radio_handset"] = true, + ["prop_police_radio_main"] = true, + ["prop_poly_bag_01"] = true, + ["prop_poly_bag_money"] = true, + ["prop_pool_ball_01"] = true, + ["prop_pool_cue"] = true, + ["prop_pool_rack_01"] = true, + ["prop_pool_rack_02"] = true, + ["prop_pool_tri"] = true, + ["prop_poolball_1"] = true, + ["prop_poolball_10"] = true, + ["prop_poolball_11"] = true, + ["prop_poolball_12"] = true, + ["prop_poolball_13"] = true, + ["prop_poolball_14"] = true, + ["prop_poolball_15"] = true, + ["prop_poolball_2"] = true, + ["prop_poolball_3"] = true, + ["prop_poolball_4"] = true, + ["prop_poolball_5"] = true, + ["prop_poolball_6"] = true, + ["prop_poolball_7"] = true, + ["prop_poolball_8"] = true, + ["prop_poolball_9"] = true, + ["prop_poolball_cue"] = true, + ["prop_poolskimmer"] = true, + ["prop_pooltable_02"] = true, + ["prop_pooltable_3b"] = true, + ["prop_porn_mag_01"] = true, + ["prop_porn_mag_02"] = true, + ["prop_porn_mag_03"] = true, + ["prop_porn_mag_04"] = true, + ["prop_portable_hifi_01"] = true, + ["prop_portacabin01"] = true, + ["prop_portaloo_01a"] = true, + ["prop_portasteps_01"] = true, + ["prop_portasteps_02"] = true, + ["prop_postbox_01a"] = true, + ["prop_postbox_ss_01a"] = true, + ["prop_postcard_rack"] = true, + ["prop_poster_tube_01"] = true, + ["prop_poster_tube_02"] = true, + ["prop_postit_drive"] = true, + ["prop_postit_gun"] = true, + ["prop_postit_it"] = true, + ["prop_postit_lock"] = true, + ["prop_pot_01"] = true, + ["prop_pot_02"] = true, + ["prop_pot_03"] = true, + ["prop_pot_04"] = true, + ["prop_pot_05"] = true, + ["prop_pot_06"] = true, + ["prop_pot_plant_01a"] = true, + ["prop_pot_plant_01b"] = true, + ["prop_pot_plant_01c"] = true, + ["prop_pot_plant_01d"] = true, + ["prop_pot_plant_01e"] = true, + ["prop_pot_plant_02a"] = true, + ["prop_pot_plant_02b"] = true, + ["prop_pot_plant_02c"] = true, + ["prop_pot_plant_02d"] = true, + ["prop_pot_plant_03a"] = true, + ["prop_pot_plant_03b"] = true, + ["prop_pot_plant_03b_cr2"] = true, + ["prop_pot_plant_03c"] = true, + ["prop_pot_plant_04a"] = true, + ["prop_pot_plant_04b"] = true, + ["prop_pot_plant_04c"] = true, + ["prop_pot_plant_05a"] = true, + ["prop_pot_plant_05b"] = true, + ["prop_pot_plant_05c"] = true, + ["prop_pot_plant_05d"] = true, + ["prop_pot_plant_05d_l1"] = true, + ["prop_pot_plant_6a"] = true, + ["prop_pot_plant_6b"] = true, + ["prop_pot_plant_bh1"] = true, + ["prop_pot_plant_inter_03a"] = true, + ["prop_pot_rack"] = true, + ["prop_potatodigger"] = true, + ["prop_power_cell"] = true, + ["prop_power_cord_01"] = true, + ["prop_premier_fence_01"] = true, + ["prop_premier_fence_02"] = true, + ["prop_printer_01"] = true, + ["prop_printer_02"] = true, + ["prop_pris_bars_01"] = true, + ["prop_pris_bench_01"] = true, + ["prop_pris_door_01_l"] = true, + ["prop_pris_door_01_r"] = true, + ["prop_pris_door_02"] = true, + ["prop_pris_door_03"] = true, + ["prop_prlg_gravestone_01a"] = true, + ["prop_prlg_gravestone_02a"] = true, + ["prop_prlg_gravestone_03a"] = true, + ["prop_prlg_gravestone_04a"] = true, + ["prop_prlg_gravestone_05a"] = true, + ["prop_prlg_gravestone_05a_l1"] = true, + ["prop_prlg_gravestone_06a"] = true, + ["prop_prlg_snowpile"] = true, + ["prop_projector_overlay"] = true, + ["prop_prologue_phone"] = true, + ["prop_prologue_phone_lod"] = true, + ["prop_prologue_pillar_01"] = true, + ["prop_prop_tree_01"] = true, + ["prop_prop_tree_02"] = true, + ["prop_protest_sign_01"] = true, + ["prop_protest_table_01"] = true, + ["prop_prototype_minibomb"] = true, + ["prop_proxy_chateau_table"] = true, + ["prop_proxy_hat_01"] = true, + ["prop_punch_bag_l"] = true, + ["prop_pylon_01"] = true, + ["prop_pylon_02"] = true, + ["prop_pylon_03"] = true, + ["prop_pylon_04"] = true, + ["prop_ql_revolving_door"] = true, + ["prop_quad_grid_line"] = true, + ["prop_rad_waste_barrel_01"] = true, + ["prop_radio_01"] = true, + ["prop_radiomast01"] = true, + ["prop_radiomast02"] = true, + ["prop_rag_01"] = true, + ["prop_ragganeon"] = true, + ["prop_rail_boxcar"] = true, + ["prop_rail_boxcar2"] = true, + ["prop_rail_boxcar3"] = true, + ["prop_rail_boxcar4"] = true, + ["prop_rail_boxcar5"] = true, + ["prop_rail_boxcar5_d"] = true, + ["prop_rail_buffer_01"] = true, + ["prop_rail_buffer_02"] = true, + ["prop_rail_controller"] = true, + ["prop_rail_crane_01"] = true, + ["prop_rail_points01"] = true, + ["prop_rail_points02"] = true, + ["prop_rail_points04"] = true, + ["prop_rail_sigbox01"] = true, + ["prop_rail_sigbox02"] = true, + ["prop_rail_sign01"] = true, + ["prop_rail_sign02"] = true, + ["prop_rail_sign03"] = true, + ["prop_rail_sign04"] = true, + ["prop_rail_sign05"] = true, + ["prop_rail_sign06"] = true, + ["prop_rail_signals01"] = true, + ["prop_rail_signals02"] = true, + ["prop_rail_signals03"] = true, + ["prop_rail_signals04"] = true, + ["prop_rail_tankcar"] = true, + ["prop_rail_tankcar2"] = true, + ["prop_rail_tankcar3"] = true, + ["prop_rail_wellcar"] = true, + ["prop_rail_wellcar2"] = true, + ["prop_rail_wheel01"] = true, + ["prop_railsleepers01"] = true, + ["prop_railsleepers02"] = true, + ["prop_railstack01"] = true, + ["prop_railstack02"] = true, + ["prop_railstack03"] = true, + ["prop_railstack04"] = true, + ["prop_railstack05"] = true, + ["prop_railway_barrier_01"] = true, + ["prop_railway_barrier_02"] = true, + ["prop_range_target_01"] = true, + ["prop_range_target_02"] = true, + ["prop_range_target_03"] = true, + ["prop_rcyl_win_01"] = true, + ["prop_rcyl_win_02"] = true, + ["prop_rcyl_win_03"] = true, + ["prop_rebar_pile01"] = true, + ["prop_rebar_pile02"] = true, + ["prop_recycle_light"] = true, + ["prop_recyclebin_01a"] = true, + ["prop_recyclebin_02_c"] = true, + ["prop_recyclebin_02_d"] = true, + ["prop_recyclebin_02a"] = true, + ["prop_recyclebin_02b"] = true, + ["prop_recyclebin_03_a"] = true, + ["prop_recyclebin_04_a"] = true, + ["prop_recyclebin_04_b"] = true, + ["prop_recyclebin_05_a"] = true, + ["prop_ret_door"] = true, + ["prop_ret_door_02"] = true, + ["prop_ret_door_03"] = true, + ["prop_ret_door_04"] = true, + ["prop_rf_conc_pillar"] = true, + ["prop_riding_crop_01"] = true, + ["prop_rio_del_01"] = true, + ["prop_rio_del_01_l3"] = true, + ["prop_riot_shield"] = true, + ["prop_road_memorial_01"] = true, + ["prop_road_memorial_02"] = true, + ["prop_roadcone01a"] = true, + ["prop_roadcone01b"] = true, + ["prop_roadcone01c"] = true, + ["prop_roadcone02a"] = true, + ["prop_roadcone02b"] = true, + ["prop_roadcone02c"] = true, + ["prop_roadheader_01"] = true, + ["prop_roadpole_01a"] = true, + ["prop_roadpole_01b"] = true, + ["prop_rock_1_a"] = true, + ["prop_rock_1_b"] = true, + ["prop_rock_1_c"] = true, + ["prop_rock_1_d"] = true, + ["prop_rock_1_e"] = true, + ["prop_rock_1_f"] = true, + ["prop_rock_1_g"] = true, + ["prop_rock_1_h"] = true, + ["prop_rock_1_i"] = true, + ["prop_rock_2_a"] = true, + ["prop_rock_2_c"] = true, + ["prop_rock_2_d"] = true, + ["prop_rock_2_f"] = true, + ["prop_rock_2_g"] = true, + ["prop_rock_3_a"] = true, + ["prop_rock_3_b"] = true, + ["prop_rock_3_c"] = true, + ["prop_rock_3_d"] = true, + ["prop_rock_3_e"] = true, + ["prop_rock_3_f"] = true, + ["prop_rock_3_g"] = true, + ["prop_rock_3_h"] = true, + ["prop_rock_3_i"] = true, + ["prop_rock_3_j"] = true, + ["prop_rock_4_a"] = true, + ["prop_rock_4_b"] = true, + ["prop_rock_4_big"] = true, + ["prop_rock_4_big2"] = true, + ["prop_rock_4_c"] = true, + ["prop_rock_4_c_2"] = true, + ["prop_rock_4_cl_1"] = true, + ["prop_rock_4_cl_2"] = true, + ["prop_rock_4_d"] = true, + ["prop_rock_4_e"] = true, + ["prop_rock_5_a"] = true, + ["prop_rock_5_b"] = true, + ["prop_rock_5_c"] = true, + ["prop_rock_5_d"] = true, + ["prop_rock_5_e"] = true, + ["prop_rock_5_smash1"] = true, + ["prop_rock_5_smash2"] = true, + ["prop_rock_5_smash3"] = true, + ["prop_rock_chair_01"] = true, + ["prop_rolled_sock_01"] = true, + ["prop_rolled_sock_02"] = true, + ["prop_rolled_yoga_mat"] = true, + ["prop_roller_car_01"] = true, + ["prop_roller_car_02"] = true, + ["prop_ron_door_01"] = true, + ["prop_roofpipe_01"] = true, + ["prop_roofpipe_02"] = true, + ["prop_roofpipe_03"] = true, + ["prop_roofpipe_04"] = true, + ["prop_roofpipe_05"] = true, + ["prop_roofpipe_06"] = true, + ["prop_roofvent_011a"] = true, + ["prop_roofvent_01a"] = true, + ["prop_roofvent_01b"] = true, + ["prop_roofvent_02a"] = true, + ["prop_roofvent_02b"] = true, + ["prop_roofvent_03a"] = true, + ["prop_roofvent_04a"] = true, + ["prop_roofvent_05a"] = true, + ["prop_roofvent_05b"] = true, + ["prop_roofvent_06a"] = true, + ["prop_roofvent_07a"] = true, + ["prop_roofvent_08a"] = true, + ["prop_roofvent_09a"] = true, + ["prop_roofvent_10a"] = true, + ["prop_roofvent_10b"] = true, + ["prop_roofvent_11b"] = true, + ["prop_roofvent_11c"] = true, + ["prop_roofvent_12a"] = true, + ["prop_roofvent_13a"] = true, + ["prop_roofvent_14a"] = true, + ["prop_roofvent_15a"] = true, + ["prop_roofvent_16a"] = true, + ["prop_rope_family_3"] = true, + ["prop_rope_hook_01"] = true, + ["prop_roundbailer01"] = true, + ["prop_roundbailer02"] = true, + ["prop_rub_bike_01"] = true, + ["prop_rub_bike_02"] = true, + ["prop_rub_bike_03"] = true, + ["prop_rub_binbag_01"] = true, + ["prop_rub_binbag_01b"] = true, + ["prop_rub_binbag_03"] = true, + ["prop_rub_binbag_03b"] = true, + ["prop_rub_binbag_04"] = true, + ["prop_rub_binbag_05"] = true, + ["prop_rub_binbag_06"] = true, + ["prop_rub_binbag_08"] = true, + ["prop_rub_binbag_sd_01"] = true, + ["prop_rub_binbag_sd_02"] = true, + ["prop_rub_boxpile_01"] = true, + ["prop_rub_boxpile_02"] = true, + ["prop_rub_boxpile_03"] = true, + ["prop_rub_boxpile_04"] = true, + ["prop_rub_boxpile_04b"] = true, + ["prop_rub_boxpile_05"] = true, + ["prop_rub_boxpile_06"] = true, + ["prop_rub_boxpile_07"] = true, + ["prop_rub_boxpile_08"] = true, + ["prop_rub_boxpile_09"] = true, + ["prop_rub_boxpile_10"] = true, + ["prop_rub_busdoor_01"] = true, + ["prop_rub_busdoor_02"] = true, + ["prop_rub_buswreck_01"] = true, + ["prop_rub_buswreck_03"] = true, + ["prop_rub_buswreck_06"] = true, + ["prop_rub_cabinet"] = true, + ["prop_rub_cabinet01"] = true, + ["prop_rub_cabinet02"] = true, + ["prop_rub_cabinet03"] = true, + ["prop_rub_cage01a"] = true, + ["prop_rub_cage01b"] = true, + ["prop_rub_cage01c"] = true, + ["prop_rub_cage01d"] = true, + ["prop_rub_cage01e"] = true, + ["prop_rub_cardpile_01"] = true, + ["prop_rub_cardpile_02"] = true, + ["prop_rub_cardpile_03"] = true, + ["prop_rub_cardpile_04"] = true, + ["prop_rub_cardpile_05"] = true, + ["prop_rub_cardpile_06"] = true, + ["prop_rub_cardpile_07"] = true, + ["prop_rub_carpart_02"] = true, + ["prop_rub_carpart_03"] = true, + ["prop_rub_carpart_04"] = true, + ["prop_rub_carpart_05"] = true, + ["prop_rub_carwreck_10"] = true, + ["prop_rub_carwreck_11"] = true, + ["prop_rub_carwreck_12"] = true, + ["prop_rub_carwreck_13"] = true, + ["prop_rub_carwreck_14"] = true, + ["prop_rub_carwreck_15"] = true, + ["prop_rub_carwreck_16"] = true, + ["prop_rub_carwreck_17"] = true, + ["prop_rub_carwreck_2"] = true, + ["prop_rub_carwreck_3"] = true, + ["prop_rub_carwreck_5"] = true, + ["prop_rub_carwreck_7"] = true, + ["prop_rub_carwreck_8"] = true, + ["prop_rub_carwreck_9"] = true, + ["prop_rub_chassis_01"] = true, + ["prop_rub_chassis_02"] = true, + ["prop_rub_chassis_03"] = true, + ["prop_rub_cont_01a"] = true, + ["prop_rub_cont_01b"] = true, + ["prop_rub_cont_01c"] = true, + ["prop_rub_couch01"] = true, + ["prop_rub_couch02"] = true, + ["prop_rub_couch03"] = true, + ["prop_rub_couch04"] = true, + ["prop_rub_flotsam_01"] = true, + ["prop_rub_flotsam_02"] = true, + ["prop_rub_flotsam_03"] = true, + ["prop_rub_frklft"] = true, + ["prop_rub_generator"] = true, + ["prop_rub_litter_01"] = true, + ["prop_rub_litter_02"] = true, + ["prop_rub_litter_03"] = true, + ["prop_rub_litter_03b"] = true, + ["prop_rub_litter_03c"] = true, + ["prop_rub_litter_04"] = true, + ["prop_rub_litter_04b"] = true, + ["prop_rub_litter_05"] = true, + ["prop_rub_litter_06"] = true, + ["prop_rub_litter_07"] = true, + ["prop_rub_litter_09"] = true, + ["prop_rub_litter_8"] = true, + ["prop_rub_matress_01"] = true, + ["prop_rub_matress_02"] = true, + ["prop_rub_matress_03"] = true, + ["prop_rub_matress_04"] = true, + ["prop_rub_monitor"] = true, + ["prop_rub_pile_01"] = true, + ["prop_rub_pile_02"] = true, + ["prop_rub_pile_03"] = true, + ["prop_rub_pile_04"] = true, + ["prop_rub_planks_01"] = true, + ["prop_rub_planks_02"] = true, + ["prop_rub_planks_03"] = true, + ["prop_rub_planks_04"] = true, + ["prop_rub_railwreck_1"] = true, + ["prop_rub_railwreck_2"] = true, + ["prop_rub_railwreck_3"] = true, + ["prop_rub_scrap_02"] = true, + ["prop_rub_scrap_03"] = true, + ["prop_rub_scrap_04"] = true, + ["prop_rub_scrap_05"] = true, + ["prop_rub_scrap_06"] = true, + ["prop_rub_scrap_07"] = true, + ["prop_rub_stool"] = true, + ["prop_rub_sunktyre"] = true, + ["prop_rub_t34"] = true, + ["prop_rub_table_01"] = true, + ["prop_rub_table_02"] = true, + ["prop_rub_trainers_01"] = true, + ["prop_rub_trainers_01b"] = true, + ["prop_rub_trainers_01c"] = true, + ["prop_rub_trolley01a"] = true, + ["prop_rub_trolley02a"] = true, + ["prop_rub_trolley03a"] = true, + ["prop_rub_trukwreck_1"] = true, + ["prop_rub_trukwreck_2"] = true, + ["prop_rub_tyre_01"] = true, + ["prop_rub_tyre_02"] = true, + ["prop_rub_tyre_03"] = true, + ["prop_rub_tyre_dam1"] = true, + ["prop_rub_tyre_dam2"] = true, + ["prop_rub_tyre_dam3"] = true, + ["prop_rub_washer_01"] = true, + ["prop_rub_wheel_01"] = true, + ["prop_rub_wheel_02"] = true, + ["prop_rub_wreckage_3"] = true, + ["prop_rub_wreckage_4"] = true, + ["prop_rub_wreckage_5"] = true, + ["prop_rub_wreckage_6"] = true, + ["prop_rub_wreckage_7"] = true, + ["prop_rub_wreckage_8"] = true, + ["prop_rub_wreckage_9"] = true, + ["prop_rum_bottle"] = true, + ["prop_runlight_b"] = true, + ["prop_runlight_g"] = true, + ["prop_runlight_r"] = true, + ["prop_runlight_y"] = true, + ["prop_rural_windmill"] = true, + ["prop_rural_windmill_l1"] = true, + ["prop_rural_windmill_l2"] = true, + ["prop_rus_olive"] = true, + ["prop_rus_olive_l2"] = true, + ["prop_rus_olive_wint"] = true, + ["prop_s_pine_dead_01"] = true, + ["prop_sacktruck_01"] = true, + ["prop_sacktruck_02a"] = true, + ["prop_sacktruck_02b"] = true, + ["prop_safety_glasses"] = true, + ["prop_sam_01"] = true, + ["prop_sandwich_01"] = true, + ["prop_saplin_001_b"] = true, + ["prop_saplin_001_c"] = true, + ["prop_saplin_002_b"] = true, + ["prop_saplin_002_c"] = true, + ["prop_sapling_break_01"] = true, + ["prop_sapling_break_02"] = true, + ["prop_satdish_2_a"] = true, + ["prop_satdish_2_b"] = true, + ["prop_satdish_2_f"] = true, + ["prop_satdish_2_g"] = true, + ["prop_satdish_3_b"] = true, + ["prop_satdish_3_c"] = true, + ["prop_satdish_3_d"] = true, + ["prop_satdish_l_01"] = true, + ["prop_satdish_l_02"] = true, + ["prop_satdish_l_02b"] = true, + ["prop_satdish_s_01"] = true, + ["prop_satdish_s_02"] = true, + ["prop_satdish_s_03"] = true, + ["prop_satdish_s_04a"] = true, + ["prop_satdish_s_04b"] = true, + ["prop_satdish_s_04c"] = true, + ["prop_satdish_s_05a"] = true, + ["prop_satdish_s_05b"] = true, + ["prop_sc1_06_gate_l"] = true, + ["prop_sc1_06_gate_r"] = true, + ["prop_sc1_12_door"] = true, + ["prop_sc1_21_g_door_01"] = true, + ["prop_scaffold_pole"] = true, + ["prop_scafold_01a"] = true, + ["prop_scafold_01c"] = true, + ["prop_scafold_01f"] = true, + ["prop_scafold_02a"] = true, + ["prop_scafold_02c"] = true, + ["prop_scafold_03a"] = true, + ["prop_scafold_03b"] = true, + ["prop_scafold_03c"] = true, + ["prop_scafold_03f"] = true, + ["prop_scafold_04a"] = true, + ["prop_scafold_05a"] = true, + ["prop_scafold_06a"] = true, + ["prop_scafold_06b"] = true, + ["prop_scafold_06c"] = true, + ["prop_scafold_07a"] = true, + ["prop_scafold_08a"] = true, + ["prop_scafold_09a"] = true, + ["prop_scafold_frame1a"] = true, + ["prop_scafold_frame1b"] = true, + ["prop_scafold_frame1c"] = true, + ["prop_scafold_frame1f"] = true, + ["prop_scafold_frame2a"] = true, + ["prop_scafold_frame2b"] = true, + ["prop_scafold_frame2c"] = true, + ["prop_scafold_frame3a"] = true, + ["prop_scafold_frame3c"] = true, + ["prop_scafold_rail_01"] = true, + ["prop_scafold_rail_02"] = true, + ["prop_scafold_rail_03"] = true, + ["prop_scafold_xbrace"] = true, + ["prop_scalpel"] = true, + ["prop_scn_police_torch"] = true, + ["prop_scourer_01"] = true, + ["prop_scrap_2_crate"] = true, + ["prop_scrap_win_01"] = true, + ["prop_scrim_01"] = true, + ["prop_scrim_02"] = true, + ["prop_scythemower"] = true, + ["prop_sea_rubprox_01"] = true, + ["prop_seabrain_01"] = true, + ["prop_seagroup_02"] = true, + ["prop_sealife_01"] = true, + ["prop_sealife_02"] = true, + ["prop_sealife_03"] = true, + ["prop_sealife_04"] = true, + ["prop_sealife_05"] = true, + ["prop_seaweed_01"] = true, + ["prop_seaweed_02"] = true, + ["prop_sec_barier_01a"] = true, + ["prop_sec_barier_02a"] = true, + ["prop_sec_barier_02b"] = true, + ["prop_sec_barier_03a"] = true, + ["prop_sec_barier_03b"] = true, + ["prop_sec_barier_04a"] = true, + ["prop_sec_barier_04b"] = true, + ["prop_sec_barier_base_01"] = true, + ["prop_sec_barrier_ld_01a"] = true, + ["prop_sec_barrier_ld_02a"] = true, + ["prop_sec_gate_01b"] = true, + ["prop_sec_gate_01c"] = true, + ["prop_sec_gate_01d"] = true, + ["prop_secdoor_01"] = true, + ["prop_section_garage_01"] = true, + ["prop_security_case_01"] = true, + ["prop_security_case_02"] = true, + ["prop_securityvan_lightrig"] = true, + ["prop_set_generator_01"] = true, + ["prop_set_generator_01_cr"] = true, + ["prop_sewing_fabric"] = true, + ["prop_sewing_machine"] = true, + ["prop_sglasses_stand_01"] = true, + ["prop_sglasses_stand_02"] = true, + ["prop_sglasses_stand_02b"] = true, + ["prop_sglasses_stand_03"] = true, + ["prop_sglasses_stand_1b"] = true, + ["prop_sglasss_1_lod"] = true, + ["prop_sglasss_1b_lod"] = true, + ["prop_sgun_casing"] = true, + ["prop_sh_beer_pissh_01"] = true, + ["prop_sh_bong_01"] = true, + ["prop_sh_cigar_01"] = true, + ["prop_sh_joint_01"] = true, + ["prop_sh_mr_rasp_01"] = true, + ["prop_sh_shot_glass"] = true, + ["prop_sh_tall_glass"] = true, + ["prop_sh_tt_fridgedoor"] = true, + ["prop_sh_wine_glass"] = true, + ["prop_shamal_crash"] = true, + ["prop_shelves_01"] = true, + ["prop_shelves_02"] = true, + ["prop_shelves_03"] = true, + ["prop_shop_front_door_l"] = true, + ["prop_shop_front_door_r"] = true, + ["prop_shopping_bags01"] = true, + ["prop_shopping_bags02"] = true, + ["prop_shopsign_01"] = true, + ["prop_shot_glass"] = true, + ["prop_shots_glass_cs"] = true, + ["prop_shower_rack_01"] = true, + ["prop_shower_towel"] = true, + ["prop_showroom_door_l"] = true, + ["prop_showroom_door_r"] = true, + ["prop_showroom_glass_1"] = true, + ["prop_showroom_glass_1b"] = true, + ["prop_showroom_glass_2"] = true, + ["prop_showroom_glass_3"] = true, + ["prop_showroom_glass_4"] = true, + ["prop_showroom_glass_5"] = true, + ["prop_showroom_glass_6"] = true, + ["prop_shredder_01"] = true, + ["prop_shrub_rake"] = true, + ["prop_shuttering01"] = true, + ["prop_shuttering02"] = true, + ["prop_shuttering03"] = true, + ["prop_shuttering04"] = true, + ["prop_side_lights"] = true, + ["prop_side_spreader"] = true, + ["prop_sign_airp_01a"] = true, + ["prop_sign_airp_02a"] = true, + ["prop_sign_airp_02b"] = true, + ["prop_sign_big_01"] = true, + ["prop_sign_freewayentrance"] = true, + ["prop_sign_gas_01"] = true, + ["prop_sign_gas_02"] = true, + ["prop_sign_gas_03"] = true, + ["prop_sign_gas_04"] = true, + ["prop_sign_interstate_01"] = true, + ["prop_sign_interstate_02"] = true, + ["prop_sign_interstate_03"] = true, + ["prop_sign_interstate_04"] = true, + ["prop_sign_interstate_05"] = true, + ["prop_sign_loading_1"] = true, + ["prop_sign_mallet"] = true, + ["prop_sign_parking_1"] = true, + ["prop_sign_prologue_01a"] = true, + ["prop_sign_prologue_06e"] = true, + ["prop_sign_prologue_06g"] = true, + ["prop_sign_road_01a"] = true, + ["prop_sign_road_01b"] = true, + ["prop_sign_road_01c"] = true, + ["prop_sign_road_02a"] = true, + ["prop_sign_road_03a"] = true, + ["prop_sign_road_03b"] = true, + ["prop_sign_road_03c"] = true, + ["prop_sign_road_03d"] = true, + ["prop_sign_road_03e"] = true, + ["prop_sign_road_03f"] = true, + ["prop_sign_road_03g"] = true, + ["prop_sign_road_03h"] = true, + ["prop_sign_road_03i"] = true, + ["prop_sign_road_03j"] = true, + ["prop_sign_road_03k"] = true, + ["prop_sign_road_03l"] = true, + ["prop_sign_road_03m"] = true, + ["prop_sign_road_03n"] = true, + ["prop_sign_road_03o"] = true, + ["prop_sign_road_03p"] = true, + ["prop_sign_road_03q"] = true, + ["prop_sign_road_03r"] = true, + ["prop_sign_road_03s"] = true, + ["prop_sign_road_03t"] = true, + ["prop_sign_road_03u"] = true, + ["prop_sign_road_03v"] = true, + ["prop_sign_road_03w"] = true, + ["prop_sign_road_03x"] = true, + ["prop_sign_road_03y"] = true, + ["prop_sign_road_03z"] = true, + ["prop_sign_road_04a"] = true, + ["prop_sign_road_04b"] = true, + ["prop_sign_road_04c"] = true, + ["prop_sign_road_04d"] = true, + ["prop_sign_road_04e"] = true, + ["prop_sign_road_04f"] = true, + ["prop_sign_road_04g"] = true, + ["prop_sign_road_04g_l1"] = true, + ["prop_sign_road_04h"] = true, + ["prop_sign_road_04i"] = true, + ["prop_sign_road_04j"] = true, + ["prop_sign_road_04k"] = true, + ["prop_sign_road_04l"] = true, + ["prop_sign_road_04m"] = true, + ["prop_sign_road_04n"] = true, + ["prop_sign_road_04o"] = true, + ["prop_sign_road_04p"] = true, + ["prop_sign_road_04q"] = true, + ["prop_sign_road_04r"] = true, + ["prop_sign_road_04s"] = true, + ["prop_sign_road_04t"] = true, + ["prop_sign_road_04u"] = true, + ["prop_sign_road_04v"] = true, + ["prop_sign_road_04w"] = true, + ["prop_sign_road_04x"] = true, + ["prop_sign_road_04y"] = true, + ["prop_sign_road_04z"] = true, + ["prop_sign_road_04za"] = true, + ["prop_sign_road_04zb"] = true, + ["prop_sign_road_05a"] = true, + ["prop_sign_road_05b"] = true, + ["prop_sign_road_05c"] = true, + ["prop_sign_road_05d"] = true, + ["prop_sign_road_05e"] = true, + ["prop_sign_road_05f"] = true, + ["prop_sign_road_05g"] = true, + ["prop_sign_road_05h"] = true, + ["prop_sign_road_05i"] = true, + ["prop_sign_road_05j"] = true, + ["prop_sign_road_05k"] = true, + ["prop_sign_road_05l"] = true, + ["prop_sign_road_05m"] = true, + ["prop_sign_road_05n"] = true, + ["prop_sign_road_05o"] = true, + ["prop_sign_road_05p"] = true, + ["prop_sign_road_05q"] = true, + ["prop_sign_road_05r"] = true, + ["prop_sign_road_05s"] = true, + ["prop_sign_road_05t"] = true, + ["prop_sign_road_05u"] = true, + ["prop_sign_road_05v"] = true, + ["prop_sign_road_05w"] = true, + ["prop_sign_road_05x"] = true, + ["prop_sign_road_05y"] = true, + ["prop_sign_road_05z"] = true, + ["prop_sign_road_05za"] = true, + ["prop_sign_road_06a"] = true, + ["prop_sign_road_06b"] = true, + ["prop_sign_road_06c"] = true, + ["prop_sign_road_06d"] = true, + ["prop_sign_road_06e"] = true, + ["prop_sign_road_06f"] = true, + ["prop_sign_road_06g"] = true, + ["prop_sign_road_06h"] = true, + ["prop_sign_road_06i"] = true, + ["prop_sign_road_06j"] = true, + ["prop_sign_road_06k"] = true, + ["prop_sign_road_06l"] = true, + ["prop_sign_road_06m"] = true, + ["prop_sign_road_06n"] = true, + ["prop_sign_road_06o"] = true, + ["prop_sign_road_06p"] = true, + ["prop_sign_road_06q"] = true, + ["prop_sign_road_06r"] = true, + ["prop_sign_road_06s"] = true, + ["prop_sign_road_07a"] = true, + ["prop_sign_road_07b"] = true, + ["prop_sign_road_08a"] = true, + ["prop_sign_road_08b"] = true, + ["prop_sign_road_09a"] = true, + ["prop_sign_road_09b"] = true, + ["prop_sign_road_09c"] = true, + ["prop_sign_road_09d"] = true, + ["prop_sign_road_09e"] = true, + ["prop_sign_road_09f"] = true, + ["prop_sign_road_callbox"] = true, + ["prop_sign_road_restriction_10"] = true, + ["prop_sign_route_01"] = true, + ["prop_sign_route_11"] = true, + ["prop_sign_route_13"] = true, + ["prop_sign_route_15"] = true, + ["prop_sign_sec_01"] = true, + ["prop_sign_sec_02"] = true, + ["prop_sign_sec_03"] = true, + ["prop_sign_sec_04"] = true, + ["prop_sign_sec_05"] = true, + ["prop_sign_sec_06"] = true, + ["prop_sign_taxi_1"] = true, + ["prop_single_grid_line"] = true, + ["prop_single_rose"] = true, + ["prop_sink_02"] = true, + ["prop_sink_04"] = true, + ["prop_sink_05"] = true, + ["prop_sink_06"] = true, + ["prop_skate_flatramp"] = true, + ["prop_skate_flatramp_cr"] = true, + ["prop_skate_funbox"] = true, + ["prop_skate_funbox_cr"] = true, + ["prop_skate_halfpipe"] = true, + ["prop_skate_halfpipe_cr"] = true, + ["prop_skate_kickers"] = true, + ["prop_skate_kickers_cr"] = true, + ["prop_skate_quartpipe"] = true, + ["prop_skate_quartpipe_cr"] = true, + ["prop_skate_rail"] = true, + ["prop_skate_spiner"] = true, + ["prop_skate_spiner_cr"] = true, + ["prop_skid_box_01"] = true, + ["prop_skid_box_02"] = true, + ["prop_skid_box_03"] = true, + ["prop_skid_box_04"] = true, + ["prop_skid_box_05"] = true, + ["prop_skid_box_06"] = true, + ["prop_skid_box_07"] = true, + ["prop_skid_chair_01"] = true, + ["prop_skid_chair_02"] = true, + ["prop_skid_chair_03"] = true, + ["prop_skid_pillar_01"] = true, + ["prop_skid_pillar_02"] = true, + ["prop_skid_sleepbag_1"] = true, + ["prop_skid_tent_01"] = true, + ["prop_skid_tent_01b"] = true, + ["prop_skid_tent_03"] = true, + ["prop_skid_tent_cloth"] = true, + ["prop_skid_trolley_1"] = true, + ["prop_skid_trolley_2"] = true, + ["prop_skip_01a"] = true, + ["prop_skip_02a"] = true, + ["prop_skip_03"] = true, + ["prop_skip_04"] = true, + ["prop_skip_05a"] = true, + ["prop_skip_05b"] = true, + ["prop_skip_06a"] = true, + ["prop_skip_08a"] = true, + ["prop_skip_08b"] = true, + ["prop_skip_10a"] = true, + ["prop_skip_rope_01"] = true, + ["prop_skunk_bush_01"] = true, + ["prop_sky_cover_01"] = true, + ["prop_skylight_01"] = true, + ["prop_skylight_02"] = true, + ["prop_skylight_02_l1"] = true, + ["prop_skylight_03"] = true, + ["prop_skylight_04"] = true, + ["prop_skylight_05"] = true, + ["prop_skylight_06b"] = true, + ["prop_skylight_06c"] = true, + ["prop_slacks_01"] = true, + ["prop_slacks_02"] = true, + ["prop_sluicegate"] = true, + ["prop_sluicegatel"] = true, + ["prop_sluicegater"] = true, + ["prop_slush_dispenser"] = true, + ["prop_sm_10_mp_door"] = true, + ["prop_sm_14_mp_gar"] = true, + ["prop_sm_19_clock"] = true, + ["prop_sm_27_door"] = true, + ["prop_sm_27_gate"] = true, + ["prop_sm_27_gate_02"] = true, + ["prop_sm_27_gate_03"] = true, + ["prop_sm_27_gate_04"] = true, + ["prop_sm_locker_door"] = true, + ["prop_sm1_11_doorl"] = true, + ["prop_sm1_11_doorr"] = true, + ["prop_sm1_11_garaged"] = true, + ["prop_small_bushyba"] = true, + ["prop_smg_holster_01"] = true, + ["prop_snow_bailer_01"] = true, + ["prop_snow_barrel_pile_03"] = true, + ["prop_snow_bench_01"] = true, + ["prop_snow_bin_01"] = true, + ["prop_snow_bin_02"] = true, + ["prop_snow_bush_01_a"] = true, + ["prop_snow_bush_02_a"] = true, + ["prop_snow_bush_02_b"] = true, + ["prop_snow_bush_03"] = true, + ["prop_snow_bush_04"] = true, + ["prop_snow_bush_04b"] = true, + ["prop_snow_cam_03"] = true, + ["prop_snow_cam_03a"] = true, + ["prop_snow_diggerbkt_01"] = true, + ["prop_snow_dumpster_01"] = true, + ["prop_snow_elecbox_16"] = true, + ["prop_snow_facgate_01"] = true, + ["prop_snow_field_01"] = true, + ["prop_snow_field_02"] = true, + ["prop_snow_field_03"] = true, + ["prop_snow_field_04"] = true, + ["prop_snow_flower_01"] = true, + ["prop_snow_flower_02"] = true, + ["prop_snow_fnc_01"] = true, + ["prop_snow_fnclink_03crnr2"] = true, + ["prop_snow_fnclink_03h"] = true, + ["prop_snow_fnclink_03i"] = true, + ["prop_snow_fncwood_14a"] = true, + ["prop_snow_fncwood_14b"] = true, + ["prop_snow_fncwood_14c"] = true, + ["prop_snow_fncwood_14d"] = true, + ["prop_snow_fncwood_14e"] = true, + ["prop_snow_gate_farm_03"] = true, + ["prop_snow_grain_01"] = true, + ["prop_snow_grass_01"] = true, + ["prop_snow_light_01"] = true, + ["prop_snow_oldlight_01b"] = true, + ["prop_snow_rail_signals02"] = true, + ["prop_snow_rub_trukwreck_2"] = true, + ["prop_snow_side_spreader_01"] = true, + ["prop_snow_sign_road_01a"] = true, + ["prop_snow_sign_road_06e"] = true, + ["prop_snow_sign_road_06g"] = true, + ["prop_snow_streetlight_01_frag_"] = true, + ["prop_snow_streetlight_09"] = true, + ["prop_snow_streetlight01"] = true, + ["prop_snow_sub_frame_01a"] = true, + ["prop_snow_sub_frame_04b"] = true, + ["prop_snow_t_ml_01"] = true, + ["prop_snow_t_ml_02"] = true, + ["prop_snow_t_ml_03"] = true, + ["prop_snow_t_ml_cscene"] = true, + ["prop_snow_telegraph_01a"] = true, + ["prop_snow_telegraph_02a"] = true, + ["prop_snow_telegraph_03"] = true, + ["prop_snow_traffic_rail_1a"] = true, + ["prop_snow_traffic_rail_1b"] = true, + ["prop_snow_trailer01"] = true, + ["prop_snow_tree_03_e"] = true, + ["prop_snow_tree_03_h"] = true, + ["prop_snow_tree_03_i"] = true, + ["prop_snow_tree_04_d"] = true, + ["prop_snow_tree_04_f"] = true, + ["prop_snow_truktrailer_01a"] = true, + ["prop_snow_tyre_01"] = true, + ["prop_snow_wall_light_09a"] = true, + ["prop_snow_wall_light_15a"] = true, + ["prop_snow_watertower01"] = true, + ["prop_snow_watertower01_l2"] = true, + ["prop_snow_watertower03"] = true, + ["prop_snow_woodpile_04a"] = true, + ["prop_snow_xmas_cards_01"] = true, + ["prop_snow_xmas_cards_02"] = true, + ["prop_soap_disp_01"] = true, + ["prop_sock_box_01"] = true, + ["prop_sol_chair"] = true, + ["prop_solarpanel_01"] = true, + ["prop_solarpanel_02"] = true, + ["prop_solarpanel_03"] = true, + ["prop_space_pistol"] = true, + ["prop_space_rifle"] = true, + ["prop_speaker_01"] = true, + ["prop_speaker_02"] = true, + ["prop_speaker_03"] = true, + ["prop_speaker_05"] = true, + ["prop_speaker_06"] = true, + ["prop_speaker_07"] = true, + ["prop_speaker_08"] = true, + ["prop_speedball_01"] = true, + ["prop_sponge_01"] = true, + ["prop_sports_clock_01"] = true, + ["prop_spot_01"] = true, + ["prop_spot_clamp"] = true, + ["prop_spot_clamp_02"] = true, + ["prop_spray_backpack_01"] = true, + ["prop_spray_jackframe"] = true, + ["prop_spray_jackleg"] = true, + ["prop_sprayer"] = true, + ["prop_spraygun_01"] = true, + ["prop_sprink_crop_01"] = true, + ["prop_sprink_golf_01"] = true, + ["prop_sprink_park_01"] = true, + ["prop_spycam"] = true, + ["prop_squeegee"] = true, + ["prop_ss1_05_mp_door"] = true, + ["prop_ss1_08_mp_door_l"] = true, + ["prop_ss1_08_mp_door_r"] = true, + ["prop_ss1_10_door_l"] = true, + ["prop_ss1_10_door_r"] = true, + ["prop_ss1_14_garage_door"] = true, + ["prop_ss1_mpint_garage"] = true, + ["prop_ss1_mpint_garage_cl"] = true, + ["prop_stag_do_rope"] = true, + ["prop_starfish_01"] = true, + ["prop_starfish_02"] = true, + ["prop_starfish_03"] = true, + ["prop_start_finish_line_01"] = true, + ["prop_start_gate_01"] = true, + ["prop_start_gate_01b"] = true, + ["prop_start_grid_01"] = true, + ["prop_stat_pack_01"] = true, + ["prop_staticmixer_01"] = true, + ["prop_steam_basket_01"] = true, + ["prop_steam_basket_02"] = true, + ["prop_steps_big_01"] = true, + ["prop_stickbfly"] = true, + ["prop_stickhbird"] = true, + ["prop_still"] = true, + ["prop_stockade_wheel"] = true, + ["prop_stockade_wheel_flat"] = true, + ["prop_stoneshroom1"] = true, + ["prop_stoneshroom2"] = true, + ["prop_stool_01"] = true, + ["prop_storagetank_01"] = true, + ["prop_storagetank_01_cr"] = true, + ["prop_storagetank_02"] = true, + ["prop_storagetank_02b"] = true, + ["prop_storagetank_03"] = true, + ["prop_storagetank_03a"] = true, + ["prop_storagetank_03b"] = true, + ["prop_storagetank_04"] = true, + ["prop_storagetank_05"] = true, + ["prop_storagetank_06"] = true, + ["prop_storagetank_07a"] = true, + ["prop_streetlight_01"] = true, + ["prop_streetlight_01b"] = true, + ["prop_streetlight_02"] = true, + ["prop_streetlight_03"] = true, + ["prop_streetlight_03b"] = true, + ["prop_streetlight_03c"] = true, + ["prop_streetlight_03d"] = true, + ["prop_streetlight_03e"] = true, + ["prop_streetlight_04"] = true, + ["prop_streetlight_05"] = true, + ["prop_streetlight_05_b"] = true, + ["prop_streetlight_06"] = true, + ["prop_streetlight_07a"] = true, + ["prop_streetlight_07b"] = true, + ["prop_streetlight_08"] = true, + ["prop_streetlight_09"] = true, + ["prop_streetlight_10"] = true, + ["prop_streetlight_11a"] = true, + ["prop_streetlight_11b"] = true, + ["prop_streetlight_11c"] = true, + ["prop_streetlight_12a"] = true, + ["prop_streetlight_12b"] = true, + ["prop_streetlight_14a"] = true, + ["prop_streetlight_15a"] = true, + ["prop_streetlight_16a"] = true, + ["prop_strip_door_01"] = true, + ["prop_strip_pole_01"] = true, + ["prop_stripmenu"] = true, + ["prop_stripset"] = true, + ["prop_studio_light_01"] = true, + ["prop_studio_light_02"] = true, + ["prop_studio_light_03"] = true, + ["prop_sub_chunk_01"] = true, + ["prop_sub_cover_01"] = true, + ["prop_sub_crane_hook"] = true, + ["prop_sub_frame_01a"] = true, + ["prop_sub_frame_01b"] = true, + ["prop_sub_frame_01c"] = true, + ["prop_sub_frame_02a"] = true, + ["prop_sub_frame_03a"] = true, + ["prop_sub_frame_04a"] = true, + ["prop_sub_frame_04b"] = true, + ["prop_sub_gantry"] = true, + ["prop_sub_release"] = true, + ["prop_sub_trans_01a"] = true, + ["prop_sub_trans_02a"] = true, + ["prop_sub_trans_03a"] = true, + ["prop_sub_trans_04a"] = true, + ["prop_sub_trans_05b"] = true, + ["prop_sub_trans_06b"] = true, + ["prop_suitcase_01"] = true, + ["prop_suitcase_01b"] = true, + ["prop_suitcase_01c"] = true, + ["prop_suitcase_01d"] = true, + ["prop_suitcase_02"] = true, + ["prop_suitcase_03"] = true, + ["prop_suitcase_03b"] = true, + ["prop_surf_board_01"] = true, + ["prop_surf_board_02"] = true, + ["prop_surf_board_03"] = true, + ["prop_surf_board_04"] = true, + ["prop_surf_board_ldn_01"] = true, + ["prop_surf_board_ldn_02"] = true, + ["prop_surf_board_ldn_03"] = true, + ["prop_surf_board_ldn_04"] = true, + ["prop_swiss_ball_01"] = true, + ["prop_syringe_01"] = true, + ["prop_t_coffe_table"] = true, + ["prop_t_coffe_table_02"] = true, + ["prop_t_shirt_ironing"] = true, + ["prop_t_shirt_row_01"] = true, + ["prop_t_shirt_row_02"] = true, + ["prop_t_shirt_row_02b"] = true, + ["prop_t_shirt_row_03"] = true, + ["prop_t_shirt_row_04"] = true, + ["prop_t_shirt_row_05l"] = true, + ["prop_t_shirt_row_05r"] = true, + ["prop_t_sofa"] = true, + ["prop_t_sofa_02"] = true, + ["prop_t_telescope_01b"] = true, + ["prop_table_01"] = true, + ["prop_table_01_chr_a"] = true, + ["prop_table_01_chr_b"] = true, + ["prop_table_02"] = true, + ["prop_table_02_chr"] = true, + ["prop_table_03"] = true, + ["prop_table_03_chr"] = true, + ["prop_table_03b"] = true, + ["prop_table_03b_chr"] = true, + ["prop_table_03b_cs"] = true, + ["prop_table_04"] = true, + ["prop_table_04_chr"] = true, + ["prop_table_05"] = true, + ["prop_table_05_chr"] = true, + ["prop_table_06"] = true, + ["prop_table_06_chr"] = true, + ["prop_table_07"] = true, + ["prop_table_07_l1"] = true, + ["prop_table_08"] = true, + ["prop_table_08_chr"] = true, + ["prop_table_08_side"] = true, + ["prop_table_mic_01"] = true, + ["prop_table_para_comb_01"] = true, + ["prop_table_para_comb_02"] = true, + ["prop_table_para_comb_03"] = true, + ["prop_table_para_comb_04"] = true, + ["prop_table_para_comb_05"] = true, + ["prop_table_ten_bat"] = true, + ["prop_table_tennis"] = true, + ["prop_tablesaw_01"] = true, + ["prop_tablesmall_01"] = true, + ["prop_taco_01"] = true, + ["prop_taco_02"] = true, + ["prop_tail_gate_col"] = true, + ["prop_tall_drygrass_aa"] = true, + ["prop_tall_glass"] = true, + ["prop_tanktrailer_01a"] = true, + ["prop_tapeplayer_01"] = true, + ["prop_target_arm"] = true, + ["prop_target_arm_b"] = true, + ["prop_target_arm_long"] = true, + ["prop_target_arm_sm"] = true, + ["prop_target_backboard"] = true, + ["prop_target_backboard_b"] = true, + ["prop_target_blue"] = true, + ["prop_target_blue_arrow"] = true, + ["prop_target_bull"] = true, + ["prop_target_bull_b"] = true, + ["prop_target_comp_metal"] = true, + ["prop_target_comp_wood"] = true, + ["prop_target_frag_board"] = true, + ["prop_target_frame_01"] = true, + ["prop_target_inner_b"] = true, + ["prop_target_inner1"] = true, + ["prop_target_inner2"] = true, + ["prop_target_inner2_b"] = true, + ["prop_target_inner3"] = true, + ["prop_target_inner3_b"] = true, + ["prop_target_ora_purp_01"] = true, + ["prop_target_oran_cross"] = true, + ["prop_target_orange_arrow"] = true, + ["prop_target_purp_arrow"] = true, + ["prop_target_purp_cross"] = true, + ["prop_target_red"] = true, + ["prop_target_red_arrow"] = true, + ["prop_target_red_blue_01"] = true, + ["prop_target_red_cross"] = true, + ["prop_tarp_strap"] = true, + ["prop_taxi_meter_1"] = true, + ["prop_taxi_meter_2"] = true, + ["prop_tea_trolly"] = true, + ["prop_tea_urn"] = true, + ["prop_telegraph_01a"] = true, + ["prop_telegraph_01b"] = true, + ["prop_telegraph_01c"] = true, + ["prop_telegraph_01d"] = true, + ["prop_telegraph_01e"] = true, + ["prop_telegraph_01f"] = true, + ["prop_telegraph_01g"] = true, + ["prop_telegraph_02a"] = true, + ["prop_telegraph_02b"] = true, + ["prop_telegraph_03"] = true, + ["prop_telegraph_04a"] = true, + ["prop_telegraph_04b"] = true, + ["prop_telegraph_05a"] = true, + ["prop_telegraph_05b"] = true, + ["prop_telegraph_05c"] = true, + ["prop_telegraph_06a"] = true, + ["prop_telegraph_06b"] = true, + ["prop_telegraph_06c"] = true, + ["prop_telegwall_01a"] = true, + ["prop_telegwall_01b"] = true, + ["prop_telegwall_02a"] = true, + ["prop_telegwall_03a"] = true, + ["prop_telegwall_03b"] = true, + ["prop_telegwall_04a"] = true, + ["prop_telescope"] = true, + ["prop_telescope_01"] = true, + ["prop_temp_block_blocker"] = true, + ["prop_temp_carrier"] = true, + ["prop_tennis_bag_01"] = true, + ["prop_tennis_ball"] = true, + ["prop_tennis_ball_lobber"] = true, + ["prop_tennis_net_01"] = true, + ["prop_tennis_rack_01"] = true, + ["prop_tennis_rack_01b"] = true, + ["prop_tequila"] = true, + ["prop_tequila_bottle"] = true, + ["prop_tequsunrise"] = true, + ["prop_test_boulder_01"] = true, + ["prop_test_boulder_02"] = true, + ["prop_test_boulder_03"] = true, + ["prop_test_boulder_04"] = true, + ["prop_test_elevator"] = true, + ["prop_test_elevator_dl"] = true, + ["prop_test_elevator_dr"] = true, + ["prop_test_rocks01"] = true, + ["prop_test_rocks02"] = true, + ["prop_test_rocks03"] = true, + ["prop_test_rocks04"] = true, + ["prop_test_sandcas_002"] = true, + ["prop_thindesertfiller_aa"] = true, + ["prop_tick"] = true, + ["prop_tick_02"] = true, + ["prop_till_01"] = true, + ["prop_till_01_dam"] = true, + ["prop_till_02"] = true, + ["prop_till_03"] = true, + ["prop_time_capsule_01"] = true, + ["prop_tint_towel"] = true, + ["prop_tint_towels_01"] = true, + ["prop_tint_towels_01b"] = true, + ["prop_toaster_01"] = true, + ["prop_toaster_02"] = true, + ["prop_toilet_01"] = true, + ["prop_toilet_02"] = true, + ["prop_toilet_brush_01"] = true, + ["prop_toilet_roll_01"] = true, + ["prop_toilet_roll_02"] = true, + ["prop_toilet_roll_05"] = true, + ["prop_toilet_shamp_01"] = true, + ["prop_toilet_shamp_02"] = true, + ["prop_toilet_soap_01"] = true, + ["prop_toilet_soap_02"] = true, + ["prop_toilet_soap_03"] = true, + ["prop_toilet_soap_04"] = true, + ["prop_toiletfoot_static"] = true, + ["prop_tollbooth_1"] = true, + ["prop_tool_adjspanner"] = true, + ["prop_tool_bench01"] = true, + ["prop_tool_bench02"] = true, + ["prop_tool_bench02_ld"] = true, + ["prop_tool_blowtorch"] = true, + ["prop_tool_bluepnt"] = true, + ["prop_tool_box_01"] = true, + ["prop_tool_box_02"] = true, + ["prop_tool_box_03"] = true, + ["prop_tool_box_04"] = true, + ["prop_tool_box_05"] = true, + ["prop_tool_box_06"] = true, + ["prop_tool_box_07"] = true, + ["prop_tool_broom"] = true, + ["prop_tool_broom2"] = true, + ["prop_tool_broom2_l1"] = true, + ["prop_tool_cable01"] = true, + ["prop_tool_cable02"] = true, + ["prop_tool_consaw"] = true, + ["prop_tool_drill"] = true, + ["prop_tool_fireaxe"] = true, + ["prop_tool_hammer"] = true, + ["prop_tool_hardhat"] = true, + ["prop_tool_jackham"] = true, + ["prop_tool_mallet"] = true, + ["prop_tool_mopbucket"] = true, + ["prop_tool_nailgun"] = true, + ["prop_tool_pickaxe"] = true, + ["prop_tool_pliers"] = true, + ["prop_tool_rake"] = true, + ["prop_tool_rake_l1"] = true, + ["prop_tool_sawhorse"] = true, + ["prop_tool_screwdvr01"] = true, + ["prop_tool_screwdvr02"] = true, + ["prop_tool_screwdvr03"] = true, + ["prop_tool_shovel"] = true, + ["prop_tool_shovel006"] = true, + ["prop_tool_shovel2"] = true, + ["prop_tool_shovel3"] = true, + ["prop_tool_shovel4"] = true, + ["prop_tool_shovel5"] = true, + ["prop_tool_sledgeham"] = true, + ["prop_tool_spanner01"] = true, + ["prop_tool_spanner02"] = true, + ["prop_tool_spanner03"] = true, + ["prop_tool_torch"] = true, + ["prop_tool_wrench"] = true, + ["prop_toolchest_01"] = true, + ["prop_toolchest_02"] = true, + ["prop_toolchest_03"] = true, + ["prop_toolchest_03_l2"] = true, + ["prop_toolchest_04"] = true, + ["prop_toolchest_05"] = true, + ["prop_toothb_cup_01"] = true, + ["prop_toothbrush_01"] = true, + ["prop_toothpaste_01"] = true, + ["prop_tornado_wheel"] = true, + ["prop_torture_01"] = true, + ["prop_torture_ch_01"] = true, + ["prop_tourist_map_01"] = true, + ["prop_towel_01"] = true, + ["prop_towel_rail_01"] = true, + ["prop_towel_rail_02"] = true, + ["prop_towel_shelf_01"] = true, + ["prop_towel2_01"] = true, + ["prop_towel2_02"] = true, + ["prop_towercrane_01a"] = true, + ["prop_towercrane_02a"] = true, + ["prop_towercrane_02b"] = true, + ["prop_towercrane_02c"] = true, + ["prop_towercrane_02d"] = true, + ["prop_towercrane_02e"] = true, + ["prop_towercrane_02el"] = true, + ["prop_towercrane_02el2"] = true, + ["prop_traffic_01a"] = true, + ["prop_traffic_01b"] = true, + ["prop_traffic_01d"] = true, + ["prop_traffic_02a"] = true, + ["prop_traffic_02b"] = true, + ["prop_traffic_03a"] = true, + ["prop_traffic_03b"] = true, + ["prop_traffic_lightset_01"] = true, + ["prop_traffic_rail_1a"] = true, + ["prop_traffic_rail_1c"] = true, + ["prop_traffic_rail_2"] = true, + ["prop_traffic_rail_3"] = true, + ["prop_trafficdiv_01"] = true, + ["prop_trafficdiv_02"] = true, + ["prop_trailer_01_new"] = true, + ["prop_trailer_door_closed"] = true, + ["prop_trailer_door_open"] = true, + ["prop_trailer01"] = true, + ["prop_trailer01_up"] = true, + ["prop_trailr_backside"] = true, + ["prop_trailr_base"] = true, + ["prop_trailr_base_static"] = true, + ["prop_trailr_fridge"] = true, + ["prop_trailr_porch1"] = true, + ["prop_train_ticket_02"] = true, + ["prop_train_ticket_02_tu"] = true, + ["prop_tram_pole_double01"] = true, + ["prop_tram_pole_double02"] = true, + ["prop_tram_pole_double03"] = true, + ["prop_tram_pole_roadside"] = true, + ["prop_tram_pole_single01"] = true, + ["prop_tram_pole_single02"] = true, + ["prop_tram_pole_wide01"] = true, + ["prop_tree_birch_01"] = true, + ["prop_tree_birch_02"] = true, + ["prop_tree_birch_03"] = true, + ["prop_tree_birch_03b"] = true, + ["prop_tree_birch_04"] = true, + ["prop_tree_birch_05"] = true, + ["prop_tree_cedar_02"] = true, + ["prop_tree_cedar_03"] = true, + ["prop_tree_cedar_04"] = true, + ["prop_tree_cedar_s_01"] = true, + ["prop_tree_cedar_s_02"] = true, + ["prop_tree_cedar_s_04"] = true, + ["prop_tree_cedar_s_05"] = true, + ["prop_tree_cedar_s_06"] = true, + ["prop_tree_cypress_01"] = true, + ["prop_tree_eng_oak_01"] = true, + ["prop_tree_eng_oak_cr2"] = true, + ["prop_tree_eng_oak_creator"] = true, + ["prop_tree_eucalip_01"] = true, + ["prop_tree_fallen_01"] = true, + ["prop_tree_fallen_02"] = true, + ["prop_tree_fallen_pine_01"] = true, + ["prop_tree_jacada_01"] = true, + ["prop_tree_jacada_02"] = true, + ["prop_tree_lficus_02"] = true, + ["prop_tree_lficus_03"] = true, + ["prop_tree_lficus_05"] = true, + ["prop_tree_lficus_06"] = true, + ["prop_tree_log_01"] = true, + ["prop_tree_log_02"] = true, + ["prop_tree_maple_02"] = true, + ["prop_tree_maple_03"] = true, + ["prop_tree_mquite_01"] = true, + ["prop_tree_mquite_01_l2"] = true, + ["prop_tree_oak_01"] = true, + ["prop_tree_olive_01"] = true, + ["prop_tree_olive_cr2"] = true, + ["prop_tree_olive_creator"] = true, + ["prop_tree_pine_01"] = true, + ["prop_tree_pine_02"] = true, + ["prop_tree_stump_01"] = true, + ["prop_trev_sec_id"] = true, + ["prop_trev_tv_01"] = true, + ["prop_trevor_rope_01"] = true, + ["prop_tri_finish_banner"] = true, + ["prop_tri_pod"] = true, + ["prop_tri_pod_lod"] = true, + ["prop_tri_start_banner"] = true, + ["prop_tri_table_01"] = true, + ["prop_trials_seesaw"] = true, + ["prop_trials_seesaw2"] = true, + ["prop_triple_grid_line"] = true, + ["prop_trough1"] = true, + ["prop_truktrailer_01a"] = true, + ["prop_tshirt_box_01"] = true, + ["prop_tshirt_box_02"] = true, + ["prop_tshirt_shelf_1"] = true, + ["prop_tshirt_shelf_2"] = true, + ["prop_tshirt_shelf_2a"] = true, + ["prop_tshirt_shelf_2b"] = true, + ["prop_tshirt_shelf_2c"] = true, + ["prop_tshirt_stand_01"] = true, + ["prop_tshirt_stand_01b"] = true, + ["prop_tshirt_stand_02"] = true, + ["prop_tshirt_stand_04"] = true, + ["prop_tt_screenstatic"] = true, + ["prop_tumbler_01"] = true, + ["prop_tumbler_01_empty"] = true, + ["prop_tumbler_01b"] = true, + ["prop_tumbler_01b_bar"] = true, + ["prop_tunnel_liner01"] = true, + ["prop_tunnel_liner02"] = true, + ["prop_tunnel_liner03"] = true, + ["prop_turkey_leg_01"] = true, + ["prop_turnstyle_01"] = true, + ["prop_turnstyle_bars"] = true, + ["prop_tv_01"] = true, + ["prop_tv_02"] = true, + ["prop_tv_03"] = true, + ["prop_tv_03_overlay"] = true, + ["prop_tv_04"] = true, + ["prop_tv_05"] = true, + ["prop_tv_06"] = true, + ["prop_tv_07"] = true, + ["prop_tv_cabinet_03"] = true, + ["prop_tv_cabinet_04"] = true, + ["prop_tv_cabinet_05"] = true, + ["prop_tv_cam_02"] = true, + ["prop_tv_flat_01"] = true, + ["prop_tv_flat_01_screen"] = true, + ["prop_tv_flat_02"] = true, + ["prop_tv_flat_02b"] = true, + ["prop_tv_flat_03"] = true, + ["prop_tv_flat_03b"] = true, + ["prop_tv_flat_michael"] = true, + ["prop_tv_screeen_sign"] = true, + ["prop_tv_stand_01"] = true, + ["prop_tv_test"] = true, + ["prop_tyre_rack_01"] = true, + ["prop_tyre_spike_01"] = true, + ["prop_tyre_wall_01"] = true, + ["prop_tyre_wall_01b"] = true, + ["prop_tyre_wall_01c"] = true, + ["prop_tyre_wall_02"] = true, + ["prop_tyre_wall_02b"] = true, + ["prop_tyre_wall_02c"] = true, + ["prop_tyre_wall_03"] = true, + ["prop_tyre_wall_03b"] = true, + ["prop_tyre_wall_03c"] = true, + ["prop_tyre_wall_04"] = true, + ["prop_tyre_wall_05"] = true, + ["prop_umpire_01"] = true, + ["prop_utensil"] = true, + ["prop_v_15_cars_clock"] = true, + ["prop_v_5_bclock"] = true, + ["prop_v_bmike_01"] = true, + ["prop_v_cam_01"] = true, + ["prop_v_door_44"] = true, + ["prop_v_hook_s"] = true, + ["prop_v_m_phone_01"] = true, + ["prop_v_m_phone_o1s"] = true, + ["prop_v_parachute"] = true, + ["prop_valet_01"] = true, + ["prop_valet_02"] = true, + ["prop_valet_03"] = true, + ["prop_valet_04"] = true, + ["prop_vault_door_scene"] = true, + ["prop_vault_shutter"] = true, + ["prop_vb_34_tencrt_lighting"] = true, + ["prop_vcr_01"] = true, + ["prop_veg_corn_01"] = true, + ["prop_veg_crop_01"] = true, + ["prop_veg_crop_02"] = true, + ["prop_veg_crop_03_cab"] = true, + ["prop_veg_crop_03_pump"] = true, + ["prop_veg_crop_04"] = true, + ["prop_veg_crop_04_leaf"] = true, + ["prop_veg_crop_05"] = true, + ["prop_veg_crop_06"] = true, + ["prop_veg_crop_orange"] = true, + ["prop_veg_crop_tr_01"] = true, + ["prop_veg_crop_tr_02"] = true, + ["prop_veg_grass_01_a"] = true, + ["prop_veg_grass_01_b"] = true, + ["prop_veg_grass_01_c"] = true, + ["prop_veg_grass_01_d"] = true, + ["prop_veg_grass_02_a"] = true, + ["prop_vehicle_hook"] = true, + ["prop_ven_market_stool"] = true, + ["prop_ven_market_table1"] = true, + ["prop_ven_shop_1_counter"] = true, + ["prop_vend_coffe_01"] = true, + ["prop_vend_condom_01"] = true, + ["prop_vend_fags_01"] = true, + ["prop_vend_fridge01"] = true, + ["prop_vend_snak_01"] = true, + ["prop_vend_snak_01_tu"] = true, + ["prop_vend_soda_01"] = true, + ["prop_vend_soda_02"] = true, + ["prop_vend_water_01"] = true, + ["prop_venice_board_01"] = true, + ["prop_venice_board_02"] = true, + ["prop_venice_board_03"] = true, + ["prop_venice_counter_01"] = true, + ["prop_venice_counter_02"] = true, + ["prop_venice_counter_03"] = true, + ["prop_venice_counter_04"] = true, + ["prop_venice_shop_front_01"] = true, + ["prop_venice_sign_01"] = true, + ["prop_venice_sign_02"] = true, + ["prop_venice_sign_03"] = true, + ["prop_venice_sign_04"] = true, + ["prop_venice_sign_05"] = true, + ["prop_venice_sign_06"] = true, + ["prop_venice_sign_07"] = true, + ["prop_venice_sign_08"] = true, + ["prop_venice_sign_09"] = true, + ["prop_venice_sign_10"] = true, + ["prop_venice_sign_11"] = true, + ["prop_venice_sign_12"] = true, + ["prop_venice_sign_14"] = true, + ["prop_venice_sign_15"] = true, + ["prop_venice_sign_16"] = true, + ["prop_venice_sign_17"] = true, + ["prop_venice_sign_18"] = true, + ["prop_venice_sign_19"] = true, + ["prop_ventsystem_01"] = true, + ["prop_ventsystem_02"] = true, + ["prop_ventsystem_03"] = true, + ["prop_ventsystem_04"] = true, + ["prop_vertdrill_01"] = true, + ["prop_vinewood_sign_01"] = true, + ["prop_vintage_filmcan"] = true, + ["prop_vintage_pump"] = true, + ["prop_vodka_bottle"] = true, + ["prop_voltmeter_01"] = true, + ["prop_w_board_blank"] = true, + ["prop_w_board_blank_2"] = true, + ["prop_w_fountain_01"] = true, + ["prop_w_me_bottle"] = true, + ["prop_w_me_dagger"] = true, + ["prop_w_me_hatchet"] = true, + ["prop_w_me_knife_01"] = true, + ["prop_w_r_cedar_01"] = true, + ["prop_w_r_cedar_dead"] = true, + ["prop_wait_bench_01"] = true, + ["prop_waiting_seat_01"] = true, + ["prop_wall_light_01a"] = true, + ["prop_wall_light_02a"] = true, + ["prop_wall_light_03a"] = true, + ["prop_wall_light_03b"] = true, + ["prop_wall_light_04a"] = true, + ["prop_wall_light_05a"] = true, + ["prop_wall_light_05c"] = true, + ["prop_wall_light_06a"] = true, + ["prop_wall_light_07a"] = true, + ["prop_wall_light_08a"] = true, + ["prop_wall_light_09a"] = true, + ["prop_wall_light_09b"] = true, + ["prop_wall_light_09c"] = true, + ["prop_wall_light_09d"] = true, + ["prop_wall_light_10a"] = true, + ["prop_wall_light_10b"] = true, + ["prop_wall_light_10c"] = true, + ["prop_wall_light_11"] = true, + ["prop_wall_light_12"] = true, + ["prop_wall_light_12a"] = true, + ["prop_wall_light_13_snw"] = true, + ["prop_wall_light_13a"] = true, + ["prop_wall_light_14a"] = true, + ["prop_wall_light_14b"] = true, + ["prop_wall_light_15a"] = true, + ["prop_wall_light_16a"] = true, + ["prop_wall_light_16b"] = true, + ["prop_wall_light_16c"] = true, + ["prop_wall_light_16d"] = true, + ["prop_wall_light_16e"] = true, + ["prop_wall_light_17a"] = true, + ["prop_wall_light_17b"] = true, + ["prop_wall_light_18a"] = true, + ["prop_wall_light_19a"] = true, + ["prop_wall_light_20a"] = true, + ["prop_wall_light_21"] = true, + ["prop_wall_vent_01"] = true, + ["prop_wall_vent_02"] = true, + ["prop_wall_vent_03"] = true, + ["prop_wall_vent_04"] = true, + ["prop_wall_vent_05"] = true, + ["prop_wall_vent_06"] = true, + ["prop_wallbrick_01"] = true, + ["prop_wallbrick_02"] = true, + ["prop_wallbrick_03"] = true, + ["prop_wallchunk_01"] = true, + ["prop_walllight_ld_01"] = true, + ["prop_walllight_ld_01b"] = true, + ["prop_wardrobe_door_01"] = true, + ["prop_warehseshelf01"] = true, + ["prop_warehseshelf02"] = true, + ["prop_warehseshelf03"] = true, + ["prop_warninglight_01"] = true, + ["prop_washer_01"] = true, + ["prop_washer_02"] = true, + ["prop_washer_03"] = true, + ["prop_washing_basket_01"] = true, + ["prop_water_bottle"] = true, + ["prop_water_bottle_dark"] = true, + ["prop_water_corpse_01"] = true, + ["prop_water_corpse_02"] = true, + ["prop_water_frame"] = true, + ["prop_water_ramp_01"] = true, + ["prop_water_ramp_02"] = true, + ["prop_water_ramp_03"] = true, + ["prop_watercooler"] = true, + ["prop_watercooler_dark"] = true, + ["prop_watercrate_01"] = true, + ["prop_wateringcan"] = true, + ["prop_watertower01"] = true, + ["prop_watertower02"] = true, + ["prop_watertower03"] = true, + ["prop_watertower04"] = true, + ["prop_waterwheela"] = true, + ["prop_waterwheelb"] = true, + ["prop_weed_001_aa"] = true, + ["prop_weed_002_ba"] = true, + ["prop_weed_01"] = true, + ["prop_weed_02"] = true, + ["prop_weed_block_01"] = true, + ["prop_weed_bottle"] = true, + ["prop_weed_tub_01"] = true, + ["prop_weed_tub_01b"] = true, + ["prop_weeddead_nxg01"] = true, + ["prop_weeddead_nxg02"] = true, + ["prop_weeddry_nxg01"] = true, + ["prop_weeddry_nxg01b"] = true, + ["prop_weeddry_nxg02"] = true, + ["prop_weeddry_nxg02b"] = true, + ["prop_weeddry_nxg03"] = true, + ["prop_weeddry_nxg03b"] = true, + ["prop_weeddry_nxg04"] = true, + ["prop_weeddry_nxg05"] = true, + ["prop_weeds_nxg01"] = true, + ["prop_weeds_nxg01b"] = true, + ["prop_weeds_nxg02"] = true, + ["prop_weeds_nxg02b"] = true, + ["prop_weeds_nxg03"] = true, + ["prop_weeds_nxg03b"] = true, + ["prop_weeds_nxg04"] = true, + ["prop_weeds_nxg04b"] = true, + ["prop_weeds_nxg05"] = true, + ["prop_weeds_nxg05b"] = true, + ["prop_weeds_nxg06"] = true, + ["prop_weeds_nxg06b"] = true, + ["prop_weeds_nxg07b"] = true, + ["prop_weeds_nxg07b001"] = true, + ["prop_weeds_nxg08"] = true, + ["prop_weeds_nxg08b"] = true, + ["prop_weeds_nxg09"] = true, + ["prop_weight_1_5k"] = true, + ["prop_weight_10k"] = true, + ["prop_weight_15k"] = true, + ["prop_weight_2_5k"] = true, + ["prop_weight_20k"] = true, + ["prop_weight_5k"] = true, + ["prop_weight_bench_02"] = true, + ["prop_weight_rack_01"] = true, + ["prop_weight_rack_02"] = true, + ["prop_weight_squat"] = true, + ["prop_weld_torch"] = true, + ["prop_welding_mask_01"] = true, + ["prop_welding_mask_01_s"] = true, + ["prop_wheat_grass_empty"] = true, + ["prop_wheat_grass_glass"] = true, + ["prop_wheat_grass_half"] = true, + ["prop_wheel_01"] = true, + ["prop_wheel_02"] = true, + ["prop_wheel_03"] = true, + ["prop_wheel_04"] = true, + ["prop_wheel_05"] = true, + ["prop_wheel_06"] = true, + ["prop_wheel_hub_01"] = true, + ["prop_wheel_hub_02_lod_02"] = true, + ["prop_wheel_rim_01"] = true, + ["prop_wheel_rim_02"] = true, + ["prop_wheel_rim_03"] = true, + ["prop_wheel_rim_04"] = true, + ["prop_wheel_rim_05"] = true, + ["prop_wheel_tyre"] = true, + ["prop_wheelbarrow01a"] = true, + ["prop_wheelbarrow02a"] = true, + ["prop_wheelchair_01"] = true, + ["prop_wheelchair_01_s"] = true, + ["prop_whisk"] = true, + ["prop_whiskey_01"] = true, + ["prop_whiskey_bottle"] = true, + ["prop_whiskey_glasses"] = true, + ["prop_white_keyboard"] = true, + ["prop_win_plug_01"] = true, + ["prop_win_plug_01_dam"] = true, + ["prop_win_trailer_ld"] = true, + ["prop_winch_hook_long"] = true, + ["prop_winch_hook_short"] = true, + ["prop_windmill_01"] = true, + ["prop_windmill_01_l1"] = true, + ["prop_windmill_01_slod"] = true, + ["prop_windmill_01_slod2"] = true, + ["prop_windmill1"] = true, + ["prop_windmill2"] = true, + ["prop_windowbox_a"] = true, + ["prop_windowbox_b"] = true, + ["prop_windowbox_broken"] = true, + ["prop_windowbox_small"] = true, + ["prop_wine_bot_01"] = true, + ["prop_wine_bot_02"] = true, + ["prop_wine_glass"] = true, + ["prop_wine_red"] = true, + ["prop_wine_rose"] = true, + ["prop_wine_white"] = true, + ["prop_wok"] = true, + ["prop_wooden_barrel"] = true, + ["prop_woodpile_01a"] = true, + ["prop_woodpile_01b"] = true, + ["prop_woodpile_01c"] = true, + ["prop_woodpile_02a"] = true, + ["prop_woodpile_03a"] = true, + ["prop_woodpile_04a"] = true, + ["prop_woodpile_04b"] = true, + ["prop_worklight_01a"] = true, + ["prop_worklight_01a_l1"] = true, + ["prop_worklight_02a"] = true, + ["prop_worklight_03a"] = true, + ["prop_worklight_03b"] = true, + ["prop_worklight_04a"] = true, + ["prop_worklight_04b"] = true, + ["prop_worklight_04b_l1"] = true, + ["prop_worklight_04c"] = true, + ["prop_worklight_04c_l1"] = true, + ["prop_worklight_04d"] = true, + ["prop_worklight_04d_l1"] = true, + ["prop_workwall_01"] = true, + ["prop_workwall_02"] = true, + ["prop_wrecked_buzzard"] = true, + ["prop_wreckedcart"] = true, + ["prop_xmas_ext"] = true, + ["prop_xmas_tree_int"] = true, + ["prop_yacht_lounger"] = true, + ["prop_yacht_seat_01"] = true, + ["prop_yacht_seat_02"] = true, + ["prop_yacht_seat_03"] = true, + ["prop_yacht_table_01"] = true, + ["prop_yacht_table_02"] = true, + ["prop_yacht_table_03"] = true, + ["prop_yaught_chair_01"] = true, + ["prop_yaught_sofa_01"] = true, + ["prop_yell_plastic_target"] = true, + ["prop_yoga_mat_01"] = true, + ["prop_yoga_mat_02"] = true, + ["prop_yoga_mat_03"] = true, + ["prop_ztype_covered"] = true, + ["reeds_03"] = true, + ["rock_4_cl_2_1"] = true, + ["rock_4_cl_2_2"] = true, + ["root_scroll_anim_skel"] = true, + ["s_prop_hdphones"] = true, + ["s_prop_hdphones_1"] = true, + ["sc1_lod_emi_a_slod3"] = true, + ["sc1_lod_emi_b_slod3"] = true, + ["sc1_lod_emi_c_slod3"] = true, + ["sc1_lod_slod4"] = true, + ["sd_palm10_low_uv"] = true, + ["sf_bdrm_reflect_blocker2"] = true, + ["sf_bedathpl3"] = true, + ["sf_bedroom_light_blocker"] = true, + ["sf_ceilingstarz"] = true, + ["sf_fixer_door_hanger"] = true, + ["sf_fixer_door_hanger_lod"] = true, + ["sf_hall_reflect_blocker"] = true, + ["sf_int_w02_count_wall_details"] = true, + ["sf_int_w02_shell"] = true, + ["sf_int1_1_shell_dropped_ceiling"] = true, + ["sf_int1_1_shell_structure"] = true, + ["sf_int1_2_armour_doors"] = true, + ["sf_int1_2_details_cabinets"] = true, + ["sf_int1_2_details_doors"] = true, + ["sf_int1_2_details_double_door"] = true, + ["sf_int1_2_details_dropp02"] = true, + ["sf_int1_2_details_dropped_ceiling"] = true, + ["sf_int1_2_details_i03"] = true, + ["sf_int1_2_details_partition_wall"] = true, + ["sf_int1_2_details_window"] = true, + ["sf_int1_2_details_windows"] = true, + ["sf_int1_3_corner_sofa"] = true, + ["sf_int1_3_dressing_earpiece"] = true, + ["sf_int1_3_dressing_thermal"] = true, + ["sf_int1_3_kitchen_cabinets"] = true, + ["sf_int1_3_safe_shelving"] = true, + ["sf_int1_3_temp_buzzer"] = true, + ["sf_int1_3_temp_desk"] = true, + ["sf_int1_3_temp_meeti05"] = true, + ["sf_int1_3_temp_safe_door001"] = true, + ["sf_int1_3_temp_shelving005"] = true, + ["sf_int1_3_temp_shelving006"] = true, + ["sf_int1_4_lights"] = true, + ["sf_int1_apart_wpaper_1"] = true, + ["sf_int1_apart_wpaper_2"] = true, + ["sf_int1_apart_wpaper_3"] = true, + ["sf_int1_apart_wpaper_4"] = true, + ["sf_int1_apart_wpaper_5"] = true, + ["sf_int1_apart_wpaper_6"] = true, + ["sf_int1_apart_wpaper_7"] = true, + ["sf_int1_apart_wpaper_8"] = true, + ["sf_int1_apart_wpaper_9"] = true, + ["sf_int1_aprt_art1"] = true, + ["sf_int1_aprt_art3"] = true, + ["sf_int1_apt_pillars"] = true, + ["sf_int1_apt_tints"] = true, + ["sf_int1_apt_winframes"] = true, + ["sf_int1_armoury_screen"] = true, + ["sf_int1_armoury_table"] = true, + ["sf_int1_art_statue_tgr_01a"] = true, + ["sf_int1_art1_mainrm"] = true, + ["sf_int1_art1_operations"] = true, + ["sf_int1_art1_stairs"] = true, + ["sf_int1_art2_apt1"] = true, + ["sf_int1_art2_mainroom"] = true, + ["sf_int1_art2_operations"] = true, + ["sf_int1_art2_stairs"] = true, + ["sf_int1_art3_mainstuff"] = true, + ["sf_int1_art3_new1"] = true, + ["sf_int1_art3_new3"] = true, + ["sf_int1_art3_stairs1"] = true, + ["sf_int1_back_tints"] = true, + ["sf_int1_backstair_glasspans"] = true, + ["sf_int1_bar_stool002"] = true, + ["sf_int1_bar_stool003"] = true, + ["sf_int1_bar_stool004"] = true, + ["sf_int1_bar_stool1"] = true, + ["sf_int1_barstools"] = true, + ["sf_int1_bath_details"] = true, + ["sf_int1_bdr_bed"] = true, + ["sf_int1_blender"] = true, + ["sf_int1_blinds"] = true, + ["sf_int1_blockers_dummy"] = true, + ["sf_int1_cabinet_doors"] = true, + ["sf_int1_cabinet_doors2a"] = true, + ["sf_int1_cables_desk"] = true, + ["sf_int1_cctv"] = true, + ["sf_int1_cctv001"] = true, + ["sf_int1_cctv002"] = true, + ["sf_int1_cctv003"] = true, + ["sf_int1_ceillingrecess001"] = true, + ["sf_int1_ceillingrecess002"] = true, + ["sf_int1_ceillingrecess003"] = true, + ["sf_int1_ceillingrecess004"] = true, + ["sf_int1_clothing"] = true, + ["sf_int1_coff_tab002"] = true, + ["sf_int1_coff_tab003"] = true, + ["sf_int1_coffee_table"] = true, + ["sf_int1_comf_chair_1"] = true, + ["sf_int1_comf_chair_2"] = true, + ["sf_int1_comf_chair_3"] = true, + ["sf_int1_comf_chair_4"] = true, + ["sf_int1_computerscreen_pcanim"] = true, + ["sf_int1_computerscreen_temp004"] = true, + ["sf_int1_computerscreen_temp005"] = true, + ["sf_int1_computerscreen_temp006"] = true, + ["sf_int1_computerscreen_temp007"] = true, + ["sf_int1_computerscreen_temp008"] = true, + ["sf_int1_computerscreen_temp009"] = true, + ["sf_int1_computerscreen_temp010"] = true, + ["sf_int1_computerscreen_temp011"] = true, + ["sf_int1_console"] = true, + ["sf_int1_details_shelving"] = true, + ["sf_int1_details_shelving001"] = true, + ["sf_int1_details_stairs"] = true, + ["sf_int1_details_vertical_profiles"] = true, + ["sf_int1_details_wall_finish"] = true, + ["sf_int1_door"] = true, + ["sf_int1_doors"] = true, + ["sf_int1_drop_ceil_mainrm"] = true, + ["sf_int1_dropdownlight022"] = true, + ["sf_int1_dropdownlight025"] = true, + ["sf_int1_dropdownlight026"] = true, + ["sf_int1_dropdownlight027"] = true, + ["sf_int1_dropdownlight028"] = true, + ["sf_int1_dropdownlight029"] = true, + ["sf_int1_dropdownlight030"] = true, + ["sf_int1_dropdownlight031"] = true, + ["sf_int1_dropdownlight032"] = true, + ["sf_int1_dropdownlight033"] = true, + ["sf_int1_dropdownlight034"] = true, + ["sf_int1_dropdownlight035"] = true, + ["sf_int1_dropdownlight036"] = true, + ["sf_int1_dropdownlight037"] = true, + ["sf_int1_dropdownlight038"] = true, + ["sf_int1_dropdownlight039"] = true, + ["sf_int1_dropdownlight041"] = true, + ["sf_int1_dropdownlight042"] = true, + ["sf_int1_dropdownlight043"] = true, + ["sf_int1_dropdownlight044"] = true, + ["sf_int1_dropdownlight045"] = true, + ["sf_int1_dropdownlight046"] = true, + ["sf_int1_dropdownlight047"] = true, + ["sf_int1_dropdownlight048"] = true, + ["sf_int1_dropdownlight050"] = true, + ["sf_int1_dropdownlight051"] = true, + ["sf_int1_dropdownlight052"] = true, + ["sf_int1_dropdownlight053"] = true, + ["sf_int1_dropdownlight054"] = true, + ["sf_int1_dropdownlight055"] = true, + ["sf_int1_dropdownlight056"] = true, + ["sf_int1_dropdownlight057"] = true, + ["sf_int1_dropdownlight058"] = true, + ["sf_int1_dropdownlight059"] = true, + ["sf_int1_dropdownlight060"] = true, + ["sf_int1_dropdownlight061"] = true, + ["sf_int1_dropdownlight062"] = true, + ["sf_int1_dropdownlight063"] = true, + ["sf_int1_edge_blends"] = true, + ["sf_int1_elevators"] = true, + ["sf_int1_elevators001"] = true, + ["sf_int1_fnlyn_coff_tab"] = true, + ["sf_int1_foyer_glass"] = true, + ["sf_int1_franklin_screen"] = true, + ["sf_int1_franklyn_desk"] = true, + ["sf_int1_franks_mem"] = true, + ["sf_int1_fruit"] = true, + ["sf_int1_gold_disc002"] = true, + ["sf_int1_gold_disc003"] = true, + ["sf_int1_gold_disc004"] = true, + ["sf_int1_gold_disc005"] = true, + ["sf_int1_gold_disc006"] = true, + ["sf_int1_gold_disc1"] = true, + ["sf_int1_gun_stuff"] = true, + ["sf_int1_hacker_light"] = true, + ["sf_int1_halolights"] = true, + ["sf_int1_hangout_coffeetable"] = true, + ["sf_int1_int2_elevator_details_00"] = true, + ["sf_int1_int2_elevator_details_001"] = true, + ["sf_int1_island_unit"] = true, + ["sf_int1_kitchen_doors_mid"] = true, + ["sf_int1_laptop_armoury"] = true, + ["sf_int1_laptopscreen_1"] = true, + ["sf_int1_laptopscreen_2"] = true, + ["sf_int1_large_wood_doors"] = true, + ["sf_int1_ledpanel000"] = true, + ["sf_int1_ledpanel001"] = true, + ["sf_int1_ledpanel002"] = true, + ["sf_int1_ledpanel003"] = true, + ["sf_int1_ledpanel004"] = true, + ["sf_int1_ledpanel005"] = true, + ["sf_int1_ledpanel006"] = true, + ["sf_int1_ledpanel007"] = true, + ["sf_int1_ledpanel008"] = true, + ["sf_int1_ledpanel009"] = true, + ["sf_int1_ledpanel010"] = true, + ["sf_int1_ledpanel010b"] = true, + ["sf_int1_ledpanel011"] = true, + ["sf_int1_ledpanel011b"] = true, + ["sf_int1_ledpanel012"] = true, + ["sf_int1_ledpanel012b"] = true, + ["sf_int1_ledpanel013"] = true, + ["sf_int1_ledpanel014"] = true, + ["sf_int1_ledpanel015"] = true, + ["sf_int1_ledpanel016"] = true, + ["sf_int1_ledpanel034"] = true, + ["sf_int1_lift_digits1"] = true, + ["sf_int1_lift_digits2"] = true, + ["sf_int1_lightproxy_armory"] = true, + ["sf_int1_lightproxy_bedroom"] = true, + ["sf_int1_lightproxy_bottomfloor"] = true, + ["sf_int1_lightproxy_office"] = true, + ["sf_int1_lightproxy_stairs"] = true, + ["sf_int1_lightproxy_workstation"] = true, + ["sf_int1_lightswitch"] = true, + ["sf_int1_lightswitch001"] = true, + ["sf_int1_lightswitch002"] = true, + ["sf_int1_lightswitch003"] = true, + ["sf_int1_lightswitch004"] = true, + ["sf_int1_lightswitch006"] = true, + ["sf_int1_lightswitch008"] = true, + ["sf_int1_lightswitch009"] = true, + ["sf_int1_lightswitch010"] = true, + ["sf_int1_lightswitch011"] = true, + ["sf_int1_lightswitch012"] = true, + ["sf_int1_lightswitch013"] = true, + ["sf_int1_lightswitch014"] = true, + ["sf_int1_lightswitch015"] = true, + ["sf_int1_lightswitch016"] = true, + ["sf_int1_lightswitch017"] = true, + ["sf_int1_lightswitch018"] = true, + ["sf_int1_living_rug_01"] = true, + ["sf_int1_lobby_chairs"] = true, + ["sf_int1_logo"] = true, + ["sf_int1_main_rm_flr_blnds"] = true, + ["sf_int1_main_rm_stordrs"] = true, + ["sf_int1_main_rm_tints"] = true, + ["sf_int1_main_wpaper_1"] = true, + ["sf_int1_main_wpaper_2"] = true, + ["sf_int1_main_wpaper_3"] = true, + ["sf_int1_main_wpaper_4"] = true, + ["sf_int1_main_wpaper_5"] = true, + ["sf_int1_main_wpaper_6"] = true, + ["sf_int1_main_wpaper_7"] = true, + ["sf_int1_main_wpaper_8"] = true, + ["sf_int1_main_wpaper_9"] = true, + ["sf_int1_matt_mouse"] = true, + ["sf_int1_minifridge_bar_01a"] = true, + ["sf_int1_off1a_boardtable"] = true, + ["sf_int1_office_c_panels"] = true, + ["sf_int1_office_glass1"] = true, + ["sf_int1_office_glass2"] = true, + ["sf_int1_office_glass3"] = true, + ["sf_int1_office_glass4"] = true, + ["sf_int1_office_glass5"] = true, + ["sf_int1_office_wpaper_1"] = true, + ["sf_int1_office_wpaper_2"] = true, + ["sf_int1_office_wpaper_3"] = true, + ["sf_int1_office_wpaper_4"] = true, + ["sf_int1_office_wpaper_5"] = true, + ["sf_int1_office_wpaper_6"] = true, + ["sf_int1_office_wpaper_7"] = true, + ["sf_int1_office_wpaper_8"] = true, + ["sf_int1_office_wpaper_9"] = true, + ["sf_int1_office2a_sideboard2"] = true, + ["sf_int1_panel"] = true, + ["sf_int1_plant_005"] = true, + ["sf_int1_plant_006"] = true, + ["sf_int1_plant_2"] = true, + ["sf_int1_plant_3"] = true, + ["sf_int1_plant_4"] = true, + ["sf_int1_player_desk"] = true, + ["sf_int1_proxy_executive_toy"] = true, + ["sf_int1_reception_desk"] = true, + ["sf_int1_reception_screen_01"] = true, + ["sf_int1_reception_screen_2"] = true, + ["sf_int1_recessed000"] = true, + ["sf_int1_recessed004"] = true, + ["sf_int1_recessed005"] = true, + ["sf_int1_recessed006"] = true, + ["sf_int1_recessed007"] = true, + ["sf_int1_recessed008"] = true, + ["sf_int1_recessed009"] = true, + ["sf_int1_recessed010"] = true, + ["sf_int1_recessed011"] = true, + ["sf_int1_recessed013"] = true, + ["sf_int1_recessed035"] = true, + ["sf_int1_recessed041"] = true, + ["sf_int1_recessedlights030"] = true, + ["sf_int1_recessedlights031"] = true, + ["sf_int1_rugs_main"] = true, + ["sf_int1_safe_lights"] = true, + ["sf_int1_seating003"] = true, + ["sf_int1_seating004"] = true, + ["sf_int1_seating1"] = true, + ["sf_int1_seating2"] = true, + ["sf_int1_shadow_sock"] = true, + ["sf_int1_shell_main"] = true, + ["sf_int1_shower"] = true, + ["sf_int1_shower_screen"] = true, + ["sf_int1_snack_display"] = true, + ["sf_int1_sofa_hangout"] = true, + ["sf_int1_stairs"] = true, + ["sf_int1_stairs_winframe"] = true, + ["sf_int1_stairs_wpaper_1"] = true, + ["sf_int1_stairs_wpaper_2"] = true, + ["sf_int1_stairs_wpaper_3"] = true, + ["sf_int1_stairs_wpaper_4"] = true, + ["sf_int1_stairs_wpaper_5"] = true, + ["sf_int1_stairs_wpaper_6"] = true, + ["sf_int1_stairs_wpaper_7"] = true, + ["sf_int1_stairs_wpaper_8"] = true, + ["sf_int1_stairs_wpaper_9"] = true, + ["sf_int1_support_pillar"] = true, + ["sf_int1_supports_off"] = true, + ["sf_int1_table_glass"] = true, + ["sf_int1_table_player"] = true, + ["sf_int1_tint_edgblends1"] = true, + ["sf_int1_tint_edgblends2"] = true, + ["sf_int1_top_flr_olays"] = true, + ["sf_int1_tv_bracket"] = true, + ["sf_int1_unit_belends"] = true, + ["sf_int1_upper_c_gubbins"] = true, + ["sf_int1_upper_glass1"] = true, + ["sf_int1_upper_glass2"] = true, + ["sf_int1_upper_glass3"] = true, + ["sf_int1_upper_glass4"] = true, + ["sf_int1_upper_office_tints"] = true, + ["sf_int1_v_res_mousemat38"] = true, + ["sf_int1_wardrobe"] = true, + ["sf_int2_1_garage_blends_00"] = true, + ["sf_int2_1_garage_blends_001"] = true, + ["sf_int2_1_garage_blends_02"] = true, + ["sf_int2_1_shell_bottom_garage00"] = true, + ["sf_int2_1_shell_bottom_garage01"] = true, + ["sf_int2_1_shell_bottom_garage02"] = true, + ["sf_int2_1_shell_elevator"] = true, + ["sf_int2_1_shell_elevator003"] = true, + ["sf_int2_1_shell_elevator004"] = true, + ["sf_int2_1_shell_offices002"] = true, + ["sf_int2_1_shell_stairs001"] = true, + ["sf_int2_1_stairs_blend"] = true, + ["sf_int2_2_false_ceiling00"] = true, + ["sf_int2_2_false_ceiling01"] = true, + ["sf_int2_2_false_ceiling02"] = true, + ["sf_int2_4_light_focal"] = true, + ["sf_int2_4_light_focal002"] = true, + ["sf_int2_4_light_focal01"] = true, + ["sf_int2_art_f2_option_2"] = true, + ["sf_int2_art_f2_option_3"] = true, + ["sf_int2_art_f3_option_004"] = true, + ["sf_int2_art_f3_option_006"] = true, + ["sf_int2_art_f3_option_1"] = true, + ["sf_int2_art_f3_option_1_nomod"] = true, + ["sf_int2_art_f3_option_2"] = true, + ["sf_int2_art_f3_option_3"] = true, + ["sf_int2_art_gf_option_1_f0"] = true, + ["sf_int2_art_gf_option_1_f2"] = true, + ["sf_int2_art_gf_option_2"] = true, + ["sf_int2_art_gf_option_3"] = true, + ["sf_int2_car_elevator_00"] = true, + ["sf_int2_car_elevator_001"] = true, + ["sf_int2_car_elevator_002"] = true, + ["sf_int2_ceiling_boxing"] = true, + ["sf_int2_columns"] = true, + ["sf_int2_columns001"] = true, + ["sf_int2_columns002"] = true, + ["sf_int2_concrete_seam_decal"] = true, + ["sf_int2_concrete_seam_decal001"] = true, + ["sf_int2_concrete_seam_decal002"] = true, + ["sf_int2_elevator_details_00"] = true, + ["sf_int2_elevator_details_01"] = true, + ["sf_int2_elevator_details_02"] = true, + ["sf_int2_elevators"] = true, + ["sf_int2_elevators001"] = true, + ["sf_int2_elevators002"] = true, + ["sf_int2_int3_ceiling_recessed007"] = true, + ["sf_int2_int3_ceiling_recessed008"] = true, + ["sf_int2_int3_ceiling_recessed009"] = true, + ["sf_int2_int3_ceiling_recessed010"] = true, + ["sf_int2_int3_ceiling_recessed011"] = true, + ["sf_int2_light_lp"] = true, + ["sf_int2_light_lp_workshop"] = true, + ["sf_int2_light_lp004"] = true, + ["sf_int2_light_lp01"] = true, + ["sf_int2_light_lp02"] = true, + ["sf_int2_planter"] = true, + ["sf_int2_post_lift"] = true, + ["sf_int2_speakers"] = true, + ["sf_int2_stair_tint"] = true, + ["sf_int2_stairs"] = true, + ["sf_int2_steps_blend"] = true, + ["sf_int2_strair_railings"] = true, + ["sf_int2_tint_00"] = true, + ["sf_int2_tint_01"] = true, + ["sf_int2_tint_02"] = true, + ["sf_int2_toolchests"] = true, + ["sf_int2_track_light"] = true, + ["sf_int2_vent"] = true, + ["sf_int2_wallpaper_stairs_01"] = true, + ["sf_int2_wallpaper_stairs_02"] = true, + ["sf_int2_wallpaper_stairs_03"] = true, + ["sf_int2_wallpaper_stairs_04"] = true, + ["sf_int2_wallpaper_stairs_05"] = true, + ["sf_int2_wallpaper_stairs_06"] = true, + ["sf_int2_wallpaper_stairs_07"] = true, + ["sf_int2_wallpaper_stairs_08"] = true, + ["sf_int2_wallpaper_stairs_09"] = true, + ["sf_int2_wallpaper00_01"] = true, + ["sf_int2_wallpaper00_02"] = true, + ["sf_int2_wallpaper00_03"] = true, + ["sf_int2_wallpaper00_04"] = true, + ["sf_int2_wallpaper00_05"] = true, + ["sf_int2_wallpaper00_06"] = true, + ["sf_int2_wallpaper00_07"] = true, + ["sf_int2_wallpaper00_08"] = true, + ["sf_int2_wallpaper00_09"] = true, + ["sf_int2_wallpaper01_01"] = true, + ["sf_int2_wallpaper01_02"] = true, + ["sf_int2_wallpaper01_03"] = true, + ["sf_int2_wallpaper01_04"] = true, + ["sf_int2_wallpaper01_05"] = true, + ["sf_int2_wallpaper01_06"] = true, + ["sf_int2_wallpaper01_07"] = true, + ["sf_int2_wallpaper01_08"] = true, + ["sf_int2_wallpaper01_09"] = true, + ["sf_int2_wallpaper02_01"] = true, + ["sf_int2_wallpaper02_02"] = true, + ["sf_int2_wallpaper02_03"] = true, + ["sf_int2_wallpaper02_04"] = true, + ["sf_int2_wallpaper02_05"] = true, + ["sf_int2_wallpaper02_06"] = true, + ["sf_int2_wallpaper02_07"] = true, + ["sf_int2_wallpaper02_08"] = true, + ["sf_int2_wallpaper02_09"] = true, + ["sf_int2_wheel_rack_01"] = true, + ["sf_int2_wheel_rack_02"] = true, + ["sf_int2_workshop_ceiling"] = true, + ["sf_int2_workshop_wall"] = true, + ["sf_int3_bar01"] = true, + ["sf_int3_cables_01"] = true, + ["sf_int3_cables_02"] = true, + ["sf_int3_caps"] = true, + ["sf_int3_cctv"] = true, + ["sf_int3_cctv001"] = true, + ["sf_int3_cctv002"] = true, + ["sf_int3_cctv003"] = true, + ["sf_int3_ceil_panels"] = true, + ["sf_int3_ceiling_recessed_f003"] = true, + ["sf_int3_ceiling_recessed010"] = true, + ["sf_int3_ceiling_recption192"] = true, + ["sf_int3_chair_stool_44a34"] = true, + ["sf_int3_clothing"] = true, + ["sf_int3_concertina_doors"] = true, + ["sf_int3_contrl_room_ceiling04"] = true, + ["sf_int3_corr_ceiling_panels_01"] = true, + ["sf_int3_corr_window"] = true, + ["sf_int3_corridor_decal_01"] = true, + ["sf_int3_desk_extras"] = true, + ["sf_int3_desk_small_01"] = true, + ["sf_int3_diffuser_01"] = true, + ["sf_int3_disc_frames_02"] = true, + ["sf_int3_disc_frames_weed"] = true, + ["sf_int3_door_frames"] = true, + ["sf_int3_doors_studios201"] = true, + ["sf_int3_drum_sound_diffuse"] = true, + ["sf_int3_edgeblends"] = true, + ["sf_int3_entrance_doors"] = true, + ["sf_int3_extinguisher_box"] = true, + ["sf_int3_extinguisher_box001"] = true, + ["sf_int3_fabric_decal_01"] = true, + ["sf_int3_fabric_decal_02"] = true, + ["sf_int3_fabric_decal_04"] = true, + ["sf_int3_fabric_decal_05x"] = true, + ["sf_int3_fire_alarm"] = true, + ["sf_int3_fire_alarm001"] = true, + ["sf_int3_fire_alarm002"] = true, + ["sf_int3_floorbox"] = true, + ["sf_int3_floorbox001"] = true, + ["sf_int3_floorbox002"] = true, + ["sf_int3_floorbox003"] = true, + ["sf_int3_floorbox004"] = true, + ["sf_int3_floorbox005"] = true, + ["sf_int3_floorbox006"] = true, + ["sf_int3_floorbox007"] = true, + ["sf_int3_floorbox008"] = true, + ["sf_int3_floorbox009"] = true, + ["sf_int3_floorbox010"] = true, + ["sf_int3_floorbox011"] = true, + ["sf_int3_floorbox012"] = true, + ["sf_int3_floorbox013"] = true, + ["sf_int3_floorbox014"] = true, + ["sf_int3_floorbox015"] = true, + ["sf_int3_floorbox016"] = true, + ["sf_int3_floorbox017"] = true, + ["sf_int3_floorbox018"] = true, + ["sf_int3_floorbox019"] = true, + ["sf_int3_foam"] = true, + ["sf_int3_foam004"] = true, + ["sf_int3_foam005"] = true, + ["sf_int3_fob_reader"] = true, + ["sf_int3_glass_table"] = true, + ["sf_int3_glass_table_004"] = true, + ["sf_int3_glass_table_005"] = true, + ["sf_int3_glass_table_006"] = true, + ["sf_int3_glass_table_007"] = true, + ["sf_int3_glass_table_02"] = true, + ["sf_int3_glass_table_03"] = true, + ["sf_int3_guitar_case"] = true, + ["sf_int3_guitar_holder002"] = true, + ["sf_int3_guitar_holder01"] = true, + ["sf_int3_guitar_shadows"] = true, + ["sf_int3_hall_ceiling_lightx"] = true, + ["sf_int3_hall_ceiling_lightx_em"] = true, + ["sf_int3_hall_ceiling_lightx001"] = true, + ["sf_int3_hall_ceiling_lightx002"] = true, + ["sf_int3_hanger_shop0907"] = true, + ["sf_int3_hatch_inspect"] = true, + ["sf_int3_hatch_inspect001"] = true, + ["sf_int3_hatch_inspect002"] = true, + ["sf_int3_hatch_inspect003"] = true, + ["sf_int3_lamp"] = true, + ["sf_int3_lamp001"] = true, + ["sf_int3_lamp002"] = true, + ["sf_int3_light_int_furn_spotl27"] = true, + ["sf_int3_light_spotlight_100"] = true, + ["sf_int3_light_spotlight_101"] = true, + ["sf_int3_light_spotlight_102"] = true, + ["sf_int3_light_spotlight_103"] = true, + ["sf_int3_light_spotlight_104"] = true, + ["sf_int3_light_spotlight_105"] = true, + ["sf_int3_light_spotlight_106"] = true, + ["sf_int3_light_spotlight_110"] = true, + ["sf_int3_light_spotlight_111"] = true, + ["sf_int3_light_spotlight_62"] = true, + ["sf_int3_lighting_reception01237"] = true, + ["sf_int3_lighting_reception02238"] = true, + ["sf_int3_lighting_reception03239"] = true, + ["sf_int3_lightswitch_01a"] = true, + ["sf_int3_lightswitch_01a001"] = true, + ["sf_int3_lightswitch_01a002"] = true, + ["sf_int3_lightswitch_01a003"] = true, + ["sf_int3_lightswitch_01a004"] = true, + ["sf_int3_lightswitch_01a005"] = true, + ["sf_int3_lightswitch_01a006"] = true, + ["sf_int3_lightswitch_01a007"] = true, + ["sf_int3_lightswitch_01a008"] = true, + ["sf_int3_lightswitch_01a009"] = true, + ["sf_int3_lightswitch_01a010"] = true, + ["sf_int3_lightswitch_01a011"] = true, + ["sf_int3_lightswitch_01a012"] = true, + ["sf_int3_lightswitch_01a013"] = true, + ["sf_int3_lightswitch_01b"] = true, + ["sf_int3_lightswitch_01b001"] = true, + ["sf_int3_lightswitch_01b002"] = true, + ["sf_int3_lightswitch_01b004"] = true, + ["sf_int3_lightswitch_01b005"] = true, + ["sf_int3_lightswitch_01b006"] = true, + ["sf_int3_lightswitch_01b007"] = true, + ["sf_int3_lightswitch_01b008"] = true, + ["sf_int3_lightswitch_01b009"] = true, + ["sf_int3_lightswitch_01b010"] = true, + ["sf_int3_lightswitch_01b011"] = true, + ["sf_int3_lit_lamptable_02221"] = true, + ["sf_int3_lit_lamptable_02322"] = true, + ["sf_int3_lit_lamptable_02423"] = true, + ["sf_int3_lobby_ceiling_panels155"] = true, + ["sf_int3_logo"] = true, + ["sf_int3_lp_all_rooms"] = true, + ["sf_int3_lp_foyer"] = true, + ["sf_int3_lp_hall"] = true, + ["sf_int3_lp_locker01"] = true, + ["sf_int3_lp_locker02"] = true, + ["sf_int3_lp_rec01"] = true, + ["sf_int3_lp_rec02"] = true, + ["sf_int3_lp_smokerm"] = true, + ["sf_int3_lp_studio"] = true, + ["sf_int3_lp_studio_vol_01"] = true, + ["sf_int3_lp_studio_vol_02"] = true, + ["sf_int3_lp_studio_vol_03"] = true, + ["sf_int3_lp_studio001"] = true, + ["sf_int3_mic_rec_piano"] = true, + ["sf_int3_mixing_console"] = true, + ["sf_int3_mixing_console_smoke"] = true, + ["sf_int3_mobile_panels110"] = true, + ["sf_int3_mp_h_yacht_stool_02"] = true, + ["sf_int3_noise_damper_wood_01"] = true, + ["sf_int3_noise_damper_wood_02"] = true, + ["sf_int3_noise_damper_wood_03"] = true, + ["sf_int3_noise_damper_wood_03x"] = true, + ["sf_int3_noise_damper_wood_03xx"] = true, + ["sf_int3_noise_damper_wood_03xx001"] = true, + ["sf_int3_noise_damper_wood_03xx002"] = true, + ["sf_int3_noise_damper_wood_04"] = true, + ["sf_int3_noise_damper_wood_05x"] = true, + ["sf_int3_p_object00628"] = true, + ["sf_int3_photo_frame154"] = true, + ["sf_int3_piano_keyboard_02a"] = true, + ["sf_int3_pouf117"] = true, + ["sf_int3_rec_coll_dum"] = true, + ["sf_int3_rec_frame"] = true, + ["sf_int3_rec2_coll_dum_def"] = true, + ["sf_int3_rec2_coll_dum_drums"] = true, + ["sf_int3_rec2_coll_dum_fire"] = true, + ["sf_int3_reception_desk"] = true, + ["sf_int3_rug_004"] = true, + ["sf_int3_rug_01"] = true, + ["sf_int3_rug_02"] = true, + ["sf_int3_rug_03"] = true, + ["sf_int3_screen_music_01"] = true, + ["sf_int3_screen_music_dre002"] = true, + ["sf_int3_screen_music_dre01"] = true, + ["sf_int3_screen_reception"] = true, + ["sf_int3_screen_sec01"] = true, + ["sf_int3_screen_sec02"] = true, + ["sf_int3_screen_weed"] = true, + ["sf_int3_server"] = true, + ["sf_int3_server001"] = true, + ["sf_int3_server002"] = true, + ["sf_int3_server003"] = true, + ["sf_int3_server004"] = true, + ["sf_int3_server005"] = true, + ["sf_int3_server006"] = true, + ["sf_int3_server007"] = true, + ["sf_int3_server008"] = true, + ["sf_int3_server009"] = true, + ["sf_int3_shelf_book_01a209136"] = true, + ["sf_int3_shell"] = true, + ["sf_int3_sound_damp_005"] = true, + ["sf_int3_sound_damp_04"] = true, + ["sf_int3_sound_locker_ceiling159"] = true, + ["sf_int3_sounder_wall"] = true, + ["sf_int3_sounder_wall001"] = true, + ["sf_int3_studio_window_01"] = true, + ["sf_int3_studio_window_010"] = true, + ["sf_int3_studio_window_011"] = true, + ["sf_int3_studio_window_012"] = true, + ["sf_int3_studio_window_02"] = true, + ["sf_int3_studio_window_021"] = true, + ["sf_int3_studio_window_03"] = true, + ["sf_int3_studio_window_04"] = true, + ["sf_int3_studio_window_06"] = true, + ["sf_int3_studio_window_07"] = true, + ["sf_int3_studio_window_08"] = true, + ["sf_int3_studio_window_09"] = true, + ["sf_int3_track_light"] = true, + ["sf_int3_track_light009"] = true, + ["sf_int3_track_light011"] = true, + ["sf_int3_track_light012"] = true, + ["sf_int3_troom_ceiling"] = true, + ["sf_int3_vocalbooth_frame"] = true, + ["sf_int3_wall_corridor_entance60"] = true, + ["sf_int3_wall_light"] = true, + ["sf_int3_wall_light001"] = true, + ["sf_int3_wall_light002"] = true, + ["sf_int3_wall_light003"] = true, + ["sf_int3_wall_panels"] = true, + ["sf_int3_wall_speaker_01"] = true, + ["sf_int3_wall_speaker_02"] = true, + ["sf_int3_weed_ceil"] = true, + ["sf_int3_window_frames45"] = true, + ["sf_lightattach_entrance_standard1"] = true, + ["sf_lightattach_entrance_standard2"] = true, + ["sf_lightattach_room_standard"] = true, + ["sf_lostyacht_kitchlamps"] = true, + ["sf_mp_apa_crashed_usaf_01a"] = true, + ["sf_mp_apa_y1_l1a"] = true, + ["sf_mp_apa_y1_l1b"] = true, + ["sf_mp_apa_y1_l1c"] = true, + ["sf_mp_apa_y1_l1d"] = true, + ["sf_mp_apa_y1_l2a"] = true, + ["sf_mp_apa_y1_l2b"] = true, + ["sf_mp_apa_y1_l2c"] = true, + ["sf_mp_apa_y1_l2d"] = true, + ["sf_mp_apa_y2_l1a"] = true, + ["sf_mp_apa_y2_l1b"] = true, + ["sf_mp_apa_y2_l1c"] = true, + ["sf_mp_apa_y2_l1d"] = true, + ["sf_mp_apa_y2_l2a"] = true, + ["sf_mp_apa_y2_l2b"] = true, + ["sf_mp_apa_y2_l2c"] = true, + ["sf_mp_apa_y2_l2d"] = true, + ["sf_mp_apa_y3_l1a"] = true, + ["sf_mp_apa_y3_l1b"] = true, + ["sf_mp_apa_y3_l1c"] = true, + ["sf_mp_apa_y3_l1d"] = true, + ["sf_mp_apa_y3_l2a"] = true, + ["sf_mp_apa_y3_l2b"] = true, + ["sf_mp_apa_y3_l2c"] = true, + ["sf_mp_apa_y3_l2d"] = true, + ["sf_mp_apa_yacht"] = true, + ["sf_mp_apa_yacht_door"] = true, + ["sf_mp_apa_yacht_door2"] = true, + ["sf_mp_apa_yacht_jacuzzi_camera"] = true, + ["sf_mp_apa_yacht_jacuzzi_ripple003"] = true, + ["sf_mp_apa_yacht_jacuzzi_ripple1"] = true, + ["sf_mp_apa_yacht_jacuzzi_ripple2"] = true, + ["sf_mp_apa_yacht_win"] = true, + ["sf_mp_h_acc_artwalll_01"] = true, + ["sf_mp_h_acc_artwalll_02"] = true, + ["sf_mp_h_acc_artwallm_02"] = true, + ["sf_mp_h_acc_artwallm_03"] = true, + ["sf_mp_h_acc_box_trinket_02"] = true, + ["sf_mp_h_acc_candles_02"] = true, + ["sf_mp_h_acc_candles_05"] = true, + ["sf_mp_h_acc_candles_06"] = true, + ["sf_mp_h_acc_dec_sculpt_01"] = true, + ["sf_mp_h_acc_dec_sculpt_02"] = true, + ["sf_mp_h_acc_dec_sculpt_03"] = true, + ["sf_mp_h_acc_drink_tray_02"] = true, + ["sf_mp_h_acc_fruitbowl_01"] = true, + ["sf_mp_h_acc_jar_03"] = true, + ["sf_mp_h_acc_vase_04"] = true, + ["sf_mp_h_acc_vase_05"] = true, + ["sf_mp_h_acc_vase_flowers_01"] = true, + ["sf_mp_h_acc_vase_flowers_03"] = true, + ["sf_mp_h_acc_vase_flowers_04"] = true, + ["sf_mp_h_yacht_armchair_01"] = true, + ["sf_mp_h_yacht_armchair_03"] = true, + ["sf_mp_h_yacht_armchair_04"] = true, + ["sf_mp_h_yacht_barstool_01"] = true, + ["sf_mp_h_yacht_bed_01"] = true, + ["sf_mp_h_yacht_bed_02"] = true, + ["sf_mp_h_yacht_coffee_table_01"] = true, + ["sf_mp_h_yacht_coffee_table_02"] = true, + ["sf_mp_h_yacht_floor_lamp_01"] = true, + ["sf_mp_h_yacht_side_table_01"] = true, + ["sf_mp_h_yacht_side_table_02"] = true, + ["sf_mp_h_yacht_sofa_01"] = true, + ["sf_mp_h_yacht_sofa_02"] = true, + ["sf_mp_h_yacht_stool_01"] = true, + ["sf_mp_h_yacht_strip_chair_01"] = true, + ["sf_mp_h_yacht_table_lamp_01"] = true, + ["sf_mp_h_yacht_table_lamp_02"] = true, + ["sf_mp_h_yacht_table_lamp_03"] = true, + ["sf_mp_yacht_worldmap"] = true, + ["sf_mpapayacht_glass_sky"] = true, + ["sf_mpapyacht_2beds_hallpart"] = true, + ["sf_mpapyacht_bar1_rof2"] = true, + ["sf_mpapyacht_bar1_shell"] = true, + ["sf_mpapyacht_bar2detail"] = true, + ["sf_mpapyacht_base_01"] = true, + ["sf_mpapyacht_bath1_detail"] = true, + ["sf_mpapyacht_bath1_lamps"] = true, + ["sf_mpapyacht_bath1_shell"] = true, + ["sf_mpapyacht_bath2_shell"] = true, + ["sf_mpapyacht_bed1_lamps3"] = true, + ["sf_mpapyacht_bed1_shell"] = true, + ["sf_mpapyacht_bed3_detail"] = true, + ["sf_mpapyacht_bed3_shell"] = true, + ["sf_mpapyacht_bed3bath"] = true, + ["sf_mpapyacht_bed3stuff"] = true, + ["sf_mpapyacht_bedbooks1"] = true, + ["sf_mpapyacht_bedbooks3"] = true, + ["sf_mpapyacht_bedhall_lamps"] = true, + ["sf_mpapyacht_bedr2_carpet"] = true, + ["sf_mpapyacht_bedr2_lamps"] = true, + ["sf_mpapyacht_bedrmdrs"] = true, + ["sf_mpapyacht_bedroom1_lamps"] = true, + ["sf_mpapyacht_books002"] = true, + ["sf_mpapyacht_brdg_detail"] = true, + ["sf_mpapyacht_bridge_shell"] = true, + ["sf_mpapyacht_console_h"] = true, + ["sf_mpapyacht_corrframes"] = true, + ["sf_mpapyacht_d2_bath2det"] = true, + ["sf_mpapyacht_d2_bedetailscunt"] = true, + ["sf_mpapyacht_d2bed_lamps"] = true, + ["sf_mpapyacht_d2beds_bed"] = true, + ["sf_mpapyacht_d2beds_book1"] = true, + ["sf_mpapyacht_d2beds_books"] = true, + ["sf_mpapyacht_d2beds_floor3"] = true, + ["sf_mpapyacht_deck2_carpets"] = true, + ["sf_mpapyacht_dk3_bar1"] = true, + ["sf_mpapyacht_dk3_bar1detail"] = true, + ["sf_mpapyacht_dk3_spots"] = true, + ["sf_mpapyacht_dk3_spots1"] = true, + ["sf_mpapyacht_doorframes"] = true, + ["sf_mpapyacht_ed1_blinds001"] = true, + ["sf_mpapyacht_ed3_blind"] = true, + ["sf_mpapyacht_entry_lamps"] = true, + ["sf_mpapyacht_entry_shell"] = true, + ["sf_mpapyacht_glass00"] = true, + ["sf_mpapyacht_glass01"] = true, + ["sf_mpapyacht_glass02"] = true, + ["sf_mpapyacht_glass03"] = true, + ["sf_mpapyacht_glass04"] = true, + ["sf_mpapyacht_glass043"] = true, + ["sf_mpapyacht_glass05"] = true, + ["sf_mpapyacht_glass06"] = true, + ["sf_mpapyacht_glass07"] = true, + ["sf_mpapyacht_glass08"] = true, + ["sf_mpapyacht_glass09"] = true, + ["sf_mpapyacht_glass10"] = true, + ["sf_mpapyacht_glass11"] = true, + ["sf_mpapyacht_glass12"] = true, + ["sf_mpapyacht_glass13"] = true, + ["sf_mpapyacht_glass14"] = true, + ["sf_mpapyacht_glass15"] = true, + ["sf_mpapyacht_glass16"] = true, + ["sf_mpapyacht_glass17"] = true, + ["sf_mpapyacht_glass18"] = true, + ["sf_mpapyacht_glass19"] = true, + ["sf_mpapyacht_hall_shell"] = true, + ["sf_mpapyacht_hallpart_glow"] = true, + ["sf_mpapyacht_hallrug"] = true, + ["sf_mpapyacht_kitchcupb"] = true, + ["sf_mpapyacht_kitchdetail"] = true, + ["sf_mpapyacht_mirror1"] = true, + ["sf_mpapyacht_mirror2"] = true, + ["sf_mpapyacht_mirror3"] = true, + ["sf_mpapyacht_p_map_h"] = true, + ["sf_mpapyacht_pants1"] = true, + ["sf_mpapyacht_pants2"] = true, + ["sf_mpapyacht_pants3"] = true, + ["sf_mpapyacht_pants4"] = true, + ["sf_mpapyacht_pants5"] = true, + ["sf_mpapyacht_pants6"] = true, + ["sf_mpapyacht_plug2"] = true, + ["sf_mpapyacht_shadow_proxy"] = true, + ["sf_mpapyacht_smallhalldetail"] = true, + ["sf_mpapyacht_smlhall_lamps"] = true, + ["sf_mpapyacht_st_011"] = true, + ["sf_mpapyacht_st_012"] = true, + ["sf_mpapyacht_st_02"] = true, + ["sf_mpapyacht_stairsdetail"] = true, + ["sf_mpapyacht_stairslamps"] = true, + ["sf_mpapyacht_storagebox01"] = true, + ["sf_mpapyacht_study_shell"] = true, + ["sf_mpapyacht_t_pa_smll_base_h007"] = true, + ["sf_mpapyacht_t_pa_smll_base_h008"] = true, + ["sf_mpapyacht_t_smll_base"] = true, + ["sf_mpapyacht_taps"] = true, + ["sf_mpapyacht_tvrm_glass"] = true, + ["sf_mpapyacht_ws"] = true, + ["sf_mpapyacht_yacht_bedroom2_glow"] = true, + ["sf_mpsecurity_additions_bb01"] = true, + ["sf_mpsecurity_additions_bb01_lod"] = true, + ["sf_mpsecurity_additions_bb01_slod"] = true, + ["sf_mpsecurity_additions_bb02"] = true, + ["sf_mpsecurity_additions_bb02_lod"] = true, + ["sf_mpsecurity_additions_bb03"] = true, + ["sf_mpsecurity_additions_bb03_lod"] = true, + ["sf_mpsecurity_additions_bb03_slod"] = true, + ["sf_mpsecurity_additions_bb04"] = true, + ["sf_mpsecurity_additions_bb04_lod"] = true, + ["sf_mpsecurity_additions_bh1_05_emm_plaque"] = true, + ["sf_mpsecurity_additions_bh1_05_plaque"] = true, + ["sf_mpsecurity_additions_build1_emm_lod001"] = true, + ["sf_mpsecurity_additions_build1_emm_lod002"] = true, + ["sf_mpsecurity_additions_cs_helicrash"] = true, + ["sf_mpsecurity_additions_cs_helicrash_dec"] = true, + ["sf_mpsecurity_additions_franklin_extra"] = true, + ["sf_mpsecurity_additions_hw1_08_plaque"] = true, + ["sf_mpsecurity_additions_kt1_05_plaque"] = true, + ["sf_mpsecurity_additions_kt1_08_plaque"] = true, + ["sf_mpsecurity_additions_mansionroof"] = true, + ["sf_mpsecurity_additions_musicrooftop"] = true, + ["sf_mpsecurity_additions_musicrooftop_canopy"] = true, + ["sf_mpsecurity_additions_musicrooftop_canopy_lod"] = true, + ["sf_mpsecurity_additions_musicrooftop_canopy001"] = true, + ["sf_mpsecurity_additions_musicrooftop_canopy2_lod"] = true, + ["sf_mpsecurity_additions_musicrooftop_det"] = true, + ["sf_mpsecurity_additions_musicrooftop_emi"] = true, + ["sf_mpsecurity_additions_musicrooftop_lod"] = true, + ["sf_mpsecurity_additions_musicrooftop_slod"] = true, + ["sf_mpsecurity_additions_water"] = true, + ["sf_mpyacht_entrydetail"] = true, + ["sf_mpyacht_seatingflrtrim"] = true, + ["sf_p_h_acc_artwalll_04"] = true, + ["sf_p_h_acc_artwallm_04"] = true, + ["sf_p_mp_yacht_bathroomdoor"] = true, + ["sf_p_mp_yacht_door"] = true, + ["sf_p_mp_yacht_door_01"] = true, + ["sf_p_mp_yacht_door_02"] = true, + ["sf_p_sf_grass_gls_s_01a"] = true, + ["sf_p_sf_grass_gls_s_02a"] = true, + ["sf_prop_air_compressor_01a"] = true, + ["sf_prop_ap_name_text"] = true, + ["sf_prop_ap_port_text"] = true, + ["sf_prop_ap_starb_text"] = true, + ["sf_prop_ap_stern_text"] = true, + ["sf_prop_art_cap_01a"] = true, + ["sf_prop_bench_vice_01a"] = true, + ["sf_prop_car_jack_01a"] = true, + ["sf_prop_drill_01a"] = true, + ["sf_prop_grinder_01a"] = true, + ["sf_prop_grow_lamp_02a"] = true, + ["sf_prop_impact_driver_01a"] = true, + ["sf_prop_sf_acc_guitar_01a"] = true, + ["sf_prop_sf_acc_stand_01a"] = true, + ["sf_prop_sf_air_cargo_1a"] = true, + ["sf_prop_sf_air_generator_01"] = true, + ["sf_prop_sf_amp_01a"] = true, + ["sf_prop_sf_amp_02a"] = true, + ["sf_prop_sf_amp_head_01a"] = true, + ["sf_prop_sf_amp_s_01a"] = true, + ["sf_prop_sf_apple_01a"] = true, + ["sf_prop_sf_apple_01b"] = true, + ["sf_prop_sf_art_basketball_01a"] = true, + ["sf_prop_sf_art_bobble_01a"] = true, + ["sf_prop_sf_art_bobble_bb_01a"] = true, + ["sf_prop_sf_art_bobble_bb_01b"] = true, + ["sf_prop_sf_art_box_cig_01a"] = true, + ["sf_prop_sf_art_bullet_01a"] = true, + ["sf_prop_sf_art_car_01a"] = true, + ["sf_prop_sf_art_car_02a"] = true, + ["sf_prop_sf_art_car_03a"] = true, + ["sf_prop_sf_art_coin_01a"] = true, + ["sf_prop_sf_art_dog_01a"] = true, + ["sf_prop_sf_art_dog_01b"] = true, + ["sf_prop_sf_art_dog_01c"] = true, + ["sf_prop_sf_art_ex_pe_01a"] = true, + ["sf_prop_sf_art_guns_01a"] = true, + ["sf_prop_sf_art_laptop_01a"] = true, + ["sf_prop_sf_art_phone_01a"] = true, + ["sf_prop_sf_art_photo_db_01a"] = true, + ["sf_prop_sf_art_photo_mg_01a"] = true, + ["sf_prop_sf_art_pillar_01a"] = true, + ["sf_prop_sf_art_pin_01a"] = true, + ["sf_prop_sf_art_plant_s_01a"] = true, + ["sf_prop_sf_art_pogo_01a"] = true, + ["sf_prop_sf_art_roll_up_01a"] = true, + ["sf_prop_sf_art_s_board_01a"] = true, + ["sf_prop_sf_art_s_board_02a"] = true, + ["sf_prop_sf_art_s_board_02b"] = true, + ["sf_prop_sf_art_sign_01a"] = true, + ["sf_prop_sf_art_statue_01a"] = true, + ["sf_prop_sf_art_statue_02a"] = true, + ["sf_prop_sf_art_statue_tgr_01a"] = true, + ["sf_prop_sf_art_trophy_co_01a"] = true, + ["sf_prop_sf_art_trophy_cp_01a"] = true, + ["sf_prop_sf_backpack_01a"] = true, + ["sf_prop_sf_backpack_02a"] = true, + ["sf_prop_sf_backpack_03a"] = true, + ["sf_prop_sf_bag_weed_01a"] = true, + ["sf_prop_sf_bag_weed_01b"] = true, + ["sf_prop_sf_bag_weed_open_01a"] = true, + ["sf_prop_sf_bag_weed_open_01b"] = true, + ["sf_prop_sf_bag_weed_open_01c"] = true, + ["sf_prop_sf_barrel_1a"] = true, + ["sf_prop_sf_baseball_01a"] = true, + ["sf_prop_sf_basketball_01a"] = true, + ["sf_prop_sf_bed_dog_01a"] = true, + ["sf_prop_sf_bed_dog_01b"] = true, + ["sf_prop_sf_bench_piano_01a"] = true, + ["sf_prop_sf_blocker_studio_01a"] = true, + ["sf_prop_sf_blocker_studio_02a"] = true, + ["sf_prop_sf_bong_01a"] = true, + ["sf_prop_sf_bot_broken_01a"] = true, + ["sf_prop_sf_bowl_fruit_01a"] = true, + ["sf_prop_sf_box_cash_01a"] = true, + ["sf_prop_sf_box_cigar_01a"] = true, + ["sf_prop_sf_box_wood_01a"] = true, + ["sf_prop_sf_bracelet_01a"] = true, + ["sf_prop_sf_brochure_01a"] = true, + ["sf_prop_sf_cam_case_01a"] = true, + ["sf_prop_sf_can_01a"] = true, + ["sf_prop_sf_car_keys_01a"] = true, + ["sf_prop_sf_carrier_jet"] = true, + ["sf_prop_sf_cash_pile_01"] = true, + ["sf_prop_sf_cash_roll_01a"] = true, + ["sf_prop_sf_cds_pile_01a"] = true, + ["sf_prop_sf_cds_pile_01b"] = true, + ["sf_prop_sf_cga_drums_01a"] = true, + ["sf_prop_sf_chair_stool_08a"] = true, + ["sf_prop_sf_chair_stool_09a"] = true, + ["sf_prop_sf_chophse_01a"] = true, + ["sf_prop_sf_cleaning_pad_01a"] = true, + ["sf_prop_sf_club_overlay"] = true, + ["sf_prop_sf_codes_01a"] = true, + ["sf_prop_sf_crate_01a"] = true, + ["sf_prop_sf_crate_ammu_01a"] = true, + ["sf_prop_sf_crate_animal_01a"] = true, + ["sf_prop_sf_crate_jugs_01a"] = true, + ["sf_prop_sf_desk_laptop_01a"] = true, + ["sf_prop_sf_distillery_01a"] = true, + ["sf_prop_sf_dj_desk_01a"] = true, + ["sf_prop_sf_dj_desk_02a"] = true, + ["sf_prop_sf_door_apt_l_01a"] = true, + ["sf_prop_sf_door_apt_r_01a"] = true, + ["sf_prop_sf_door_bth_01a"] = true, + ["sf_prop_sf_door_cabinet_01a"] = true, + ["sf_prop_sf_door_com_l_06a"] = true, + ["sf_prop_sf_door_com_r_06a"] = true, + ["sf_prop_sf_door_glass_01a"] = true, + ["sf_prop_sf_door_hangar_01a"] = true, + ["sf_prop_sf_door_office_l_01a"] = true, + ["sf_prop_sf_door_office_r_01a"] = true, + ["sf_prop_sf_door_rec_01a"] = true, + ["sf_prop_sf_door_safe_01a"] = true, + ["sf_prop_sf_door_stat_l_01a"] = true, + ["sf_prop_sf_door_stat_r_01a"] = true, + ["sf_prop_sf_door_stud_01a"] = true, + ["sf_prop_sf_door_stud_01b"] = true, + ["sf_prop_sf_drawing_ms_01a"] = true, + ["sf_prop_sf_drum_kit_01a"] = true, + ["sf_prop_sf_drum_stick_01a"] = true, + ["sf_prop_sf_el_box_01a"] = true, + ["sf_prop_sf_el_guitar_01a"] = true, + ["sf_prop_sf_el_guitar_02a"] = true, + ["sf_prop_sf_el_guitar_03a"] = true, + ["sf_prop_sf_engineer_screen_01a"] = true, + ["sf_prop_sf_esp_machine_01a"] = true, + ["sf_prop_sf_filter_handle_01a"] = true, + ["sf_prop_sf_flightcase_01a"] = true, + ["sf_prop_sf_flightcase_01b"] = true, + ["sf_prop_sf_flightcase_01c"] = true, + ["sf_prop_sf_flyer_01a"] = true, + ["sf_prop_sf_fnc_01a"] = true, + ["sf_prop_sf_fncsec_01a"] = true, + ["sf_prop_sf_football_01a"] = true, + ["sf_prop_sf_g_bong_01a"] = true, + ["sf_prop_sf_game_clock_01a"] = true, + ["sf_prop_sf_gar_door_01a"] = true, + ["sf_prop_sf_gas_tank_01a"] = true, + ["sf_prop_sf_glass_stu_01a"] = true, + ["sf_prop_sf_golf_bag_01b"] = true, + ["sf_prop_sf_golf_iron_01a"] = true, + ["sf_prop_sf_golf_iron_01b"] = true, + ["sf_prop_sf_golf_wood_01a"] = true, + ["sf_prop_sf_golf_wood_02a"] = true, + ["sf_prop_sf_guitar_case_01a"] = true, + ["sf_prop_sf_guitars_rack_01a"] = true, + ["sf_prop_sf_handler_01a"] = true, + ["sf_prop_sf_headphones_dj"] = true, + ["sf_prop_sf_heli_blade_b_01a"] = true, + ["sf_prop_sf_heli_blade_b_02a"] = true, + ["sf_prop_sf_heli_blade_b_03a"] = true, + ["sf_prop_sf_heli_blade_b_04a"] = true, + ["sf_prop_sf_heli_blade_f_01a"] = true, + ["sf_prop_sf_heli_blade_f_02a"] = true, + ["sf_prop_sf_heli_blade_f_03a"] = true, + ["sf_prop_sf_helmet_01a"] = true, + ["sf_prop_sf_hydro_platform_01a"] = true, + ["sf_prop_sf_imporage_01a"] = true, + ["sf_prop_sf_jewel_01a"] = true, + ["sf_prop_sf_keyboard_01a"] = true, + ["sf_prop_sf_lamp_studio_01a"] = true, + ["sf_prop_sf_lamp_studio_02a"] = true, + ["sf_prop_sf_laptop_01a"] = true, + ["sf_prop_sf_laptop_01b"] = true, + ["sf_prop_sf_lightbox_rec_01a"] = true, + ["sf_prop_sf_lightbox_rec_on_01a"] = true, + ["sf_prop_sf_lp_01a"] = true, + ["sf_prop_sf_lp_plaque_01a"] = true, + ["sf_prop_sf_mic_01a"] = true, + ["sf_prop_sf_mic_rec_01a"] = true, + ["sf_prop_sf_mic_rec_01b"] = true, + ["sf_prop_sf_mic_rec_02a"] = true, + ["sf_prop_sf_monitor_01a"] = true, + ["sf_prop_sf_monitor_b_02a"] = true, + ["sf_prop_sf_monitor_b_02b"] = true, + ["sf_prop_sf_monitor_s_02a"] = true, + ["sf_prop_sf_monitor_stu_01a"] = true, + ["sf_prop_sf_mug_01a"] = true, + ["sf_prop_sf_music_stand_01a"] = true, + ["sf_prop_sf_necklace_01a"] = true, + ["sf_prop_sf_npc_phone_01a"] = true, + ["sf_prop_sf_offchair_exec_01a"] = true, + ["sf_prop_sf_offchair_exec_04a"] = true, + ["sf_prop_sf_og1_01a"] = true, + ["sf_prop_sf_og2_01a"] = true, + ["sf_prop_sf_og3_01a"] = true, + ["sf_prop_sf_pack_can_01a"] = true, + ["sf_prop_sf_pallet_01a"] = true, + ["sf_prop_sf_penthouse_party"] = true, + ["sf_prop_sf_phone_01a"] = true, + ["sf_prop_sf_phonebox_01b_s"] = true, + ["sf_prop_sf_phonebox_01b_straight"] = true, + ["sf_prop_sf_photo_01a"] = true, + ["sf_prop_sf_piano_01a"] = true, + ["sf_prop_sf_pogo_01a"] = true, + ["sf_prop_sf_ps_mixer_01a"] = true, + ["sf_prop_sf_rack_audio_01a"] = true, + ["sf_prop_sf_rotor_01a"] = true, + ["sf_prop_sf_s_mixer_01a"] = true, + ["sf_prop_sf_s_mixer_01b"] = true, + ["sf_prop_sf_s_mixer_02a"] = true, + ["sf_prop_sf_s_mixer_02b"] = true, + ["sf_prop_sf_s_scrn_01a"] = true, + ["sf_prop_sf_scr_m_lrg_01a"] = true, + ["sf_prop_sf_scr_m_lrg_01b"] = true, + ["sf_prop_sf_scr_m_lrg_01c"] = true, + ["sf_prop_sf_scrn_drp_01a"] = true, + ["sf_prop_sf_scrn_la_01a"] = true, + ["sf_prop_sf_scrn_la_02a"] = true, + ["sf_prop_sf_scrn_la_03a"] = true, + ["sf_prop_sf_scrn_la_04a"] = true, + ["sf_prop_sf_scrn_ppp_01a"] = true, + ["sf_prop_sf_scrn_tablet_01a"] = true, + ["sf_prop_sf_scrn_tr_01a"] = true, + ["sf_prop_sf_scrn_tr_02a"] = true, + ["sf_prop_sf_scrn_tr_03a"] = true, + ["sf_prop_sf_scrn_tr_04a"] = true, + ["sf_prop_sf_shutter_01a"] = true, + ["sf_prop_sf_sign_neon_01a"] = true, + ["sf_prop_sf_slot_pallet_01a"] = true, + ["sf_prop_sf_sofa_chefield_01a"] = true, + ["sf_prop_sf_sofa_chefield_02a"] = true, + ["sf_prop_sf_sofa_studio_01a"] = true, + ["sf_prop_sf_spa_doors_01a"] = true, + ["sf_prop_sf_spa_doors_cls_01a"] = true, + ["sf_prop_sf_speaker_l_01a"] = true, + ["sf_prop_sf_speaker_stand_01a"] = true, + ["sf_prop_sf_speaker_wall_01a"] = true, + ["sf_prop_sf_spray_fresh_01a"] = true, + ["sf_prop_sf_stool_01a"] = true, + ["sf_prop_sf_structure_01a"] = true, + ["sf_prop_sf_surve_equip_01a"] = true, + ["sf_prop_sf_swift2_01a"] = true, + ["sf_prop_sf_table_office_01a"] = true, + ["sf_prop_sf_table_rt"] = true, + ["sf_prop_sf_table_studio_01a"] = true, + ["sf_prop_sf_tablet_01a"] = true, + ["sf_prop_sf_tanker_crash_01a"] = true, + ["sf_prop_sf_track_mouse_01a"] = true, + ["sf_prop_sf_tv_flat_scr_01a"] = true, + ["sf_prop_sf_tv_studio_01a"] = true, + ["sf_prop_sf_usb_drive_01a"] = true, + ["sf_prop_sf_vend_drink_01a"] = true, + ["sf_prop_sf_wall_block_01a"] = true, + ["sf_prop_sf_watch_01a"] = true, + ["sf_prop_sf_weed_01_small_01a"] = true, + ["sf_prop_sf_weed_bigbag_01a"] = true, + ["sf_prop_sf_weed_lrg_01a"] = true, + ["sf_prop_sf_weed_med_01a"] = true, + ["sf_prop_sf_weed_overlay"] = true, + ["sf_prop_sf_wheel_vol_f_01a"] = true, + ["sf_prop_sf_wheel_vol_r_01a"] = true, + ["sf_prop_sf_win_blind_01a"] = true, + ["sf_prop_socket_set_01a"] = true, + ["sf_prop_socket_set_01b"] = true, + ["sf_prop_strut_compressor_01a"] = true, + ["sf_prop_tool_chest_01a"] = true, + ["sf_prop_tool_draw_01a"] = true, + ["sf_prop_tool_draw_01b"] = true, + ["sf_prop_tool_draw_01d"] = true, + ["sf_prop_torque_wrench_01a"] = true, + ["sf_prop_transmission_lift_01a"] = true, + ["sf_prop_v_43_safe_s_bk_01a"] = true, + ["sf_prop_v_43_safe_s_bk_01b"] = true, + ["sf_prop_v_43_safe_s_gd_01a"] = true, + ["sf_prop_welder_01a"] = true, + ["sf_prop_wheel_balancer_01a"] = true, + ["sf_prop_yacht_glass_01"] = true, + ["sf_prop_yacht_glass_02"] = true, + ["sf_prop_yacht_glass_03"] = true, + ["sf_prop_yacht_glass_04"] = true, + ["sf_prop_yacht_glass_05"] = true, + ["sf_prop_yacht_glass_06"] = true, + ["sf_prop_yacht_glass_07"] = true, + ["sf_prop_yacht_glass_08"] = true, + ["sf_prop_yacht_glass_09"] = true, + ["sf_prop_yacht_glass_10"] = true, + ["sf_prop_yacht_showerdoor"] = true, + ["sf_reflect_proxy"] = true, + ["sf_stairs_ref_proxy"] = true, + ["sf_wallsheet1"] = true, + ["sf_wee_room_crap"] = true, + ["sf_weed_clothstrip003"] = true, + ["sf_weed_clothstrip1"] = true, + ["sf_weed_dery_wall_dirt"] = true, + ["sf_weed_dirt"] = true, + ["sf_weed_dry_dirt"] = true, + ["sf_weed_entry_door"] = true, + ["sf_weed_fact_trunking"] = true, + ["sf_weed_factory03"] = true, + ["sf_weed_factory05"] = true, + ["sf_weed_factory06"] = true, + ["sf_weed_factory09"] = true, + ["sf_weed_factory12"] = true, + ["sf_weed_factory15"] = true, + ["sf_weed_factory16"] = true, + ["sf_weed_factory17"] = true, + ["sf_weed_factory18"] = true, + ["sf_weed_factoryair_ducts"] = true, + ["sf_weed_floorsheets"] = true, + ["sf_weed_pipes"] = true, + ["sf_weed_sort_tarp"] = true, + ["sf_weed_wall_decals"] = true, + ["sf_yacht_bar_ref_blocker"] = true, + ["sf_yacht_bridge_glass01"] = true, + ["sf_yacht_bridge_glass02"] = true, + ["sf_yacht_bridge_glass03"] = true, + ["sf_yacht_bridge_glass04"] = true, + ["sf_yacht_bridge_glass05"] = true, + ["sf_yacht_bridge_glass06"] = true, + ["sf_yacht_bridge_glass07"] = true, + ["sf_yacht_bridge_glass08"] = true, + ["sf_yacht_bridge_glass09"] = true, + ["sf_yacht_bridge_glass10"] = true, + ["sf_yacht_bridge_glass11"] = true, + ["sf_yacht_bridge_glass12"] = true, + ["sf_yacht_bridge_glass13"] = true, + ["sf_yacht_bridge_glass14"] = true, + ["sf_yacht_bridge_glass15"] = true, + ["sf_yacht_bridge_glass16"] = true, + ["sf_yacht_bridge_glass17"] = true, + ["sf_yacht_bridge_glass18"] = true, + ["sf_yacht_hallstar_ref_blk"] = true, + ["sf_yacht_mod_windsur"] = true, + ["sf_yacht_proxydummy001"] = true, + ["sf_yacht_proxydummy002"] = true, + ["sf_yacht_refproxy001"] = true, + ["sf_yacht_refproxy002"] = true, + ["sf_yacht_tv_ref_blocker"] = true, + ["sf_yachtbthrm3lghts"] = true, + ["sf_ych_mod_glass1"] = true, + ["sf_ych_mod_glass10"] = true, + ["sf_ych_mod_glass11"] = true, + ["sf_ych_mod_glass12"] = true, + ["sf_ych_mod_glass13"] = true, + ["sf_ych_mod_glass2"] = true, + ["sf_ych_mod_glass3"] = true, + ["sf_ych_mod_glass3wang"] = true, + ["sf_ych_mod_glass5"] = true, + ["sf_ych_mod_glass6"] = true, + ["sf_ych_mod_glass7"] = true, + ["sf_ych_mod_glass8"] = true, + ["sf_ych_mod_glass9"] = true, + ["sm_14_mp_door_l"] = true, + ["sm_14_mp_door_r"] = true, + ["sm_prop_hanger_sm_01"] = true, + ["sm_prop_hanger_sm_02"] = true, + ["sm_prop_hanger_sm_03"] = true, + ["sm_prop_hanger_sm_04"] = true, + ["sm_prop_hanger_sm_05"] = true, + ["sm_prop_inttruck_door_static2"] = true, + ["sm_prop_inttruck_doorblock2"] = true, + ["sm_prop_offchair_smug_01"] = true, + ["sm_prop_offchair_smug_02"] = true, + ["sm_prop_portaglass_01"] = true, + ["sm_prop_portaglass_02"] = true, + ["sm_prop_smug_cctv_mon_01"] = true, + ["sm_prop_smug_cont_01a"] = true, + ["sm_prop_smug_cover_01a"] = true, + ["sm_prop_smug_crane_01"] = true, + ["sm_prop_smug_crane_02"] = true, + ["sm_prop_smug_cranecrab_01"] = true, + ["sm_prop_smug_cranecrab_02"] = true, + ["sm_prop_smug_crate_01a"] = true, + ["sm_prop_smug_crate_l_antiques"] = true, + ["sm_prop_smug_crate_l_bones"] = true, + ["sm_prop_smug_crate_l_fake"] = true, + ["sm_prop_smug_crate_l_hazard"] = true, + ["sm_prop_smug_crate_l_jewellery"] = true, + ["sm_prop_smug_crate_l_medical"] = true, + ["sm_prop_smug_crate_l_narc"] = true, + ["sm_prop_smug_crate_l_tobacco"] = true, + ["sm_prop_smug_crate_m_01a"] = true, + ["sm_prop_smug_crate_m_antiques"] = true, + ["sm_prop_smug_crate_m_bones"] = true, + ["sm_prop_smug_crate_m_fake"] = true, + ["sm_prop_smug_crate_m_hazard"] = true, + ["sm_prop_smug_crate_m_jewellery"] = true, + ["sm_prop_smug_crate_m_medical"] = true, + ["sm_prop_smug_crate_m_narc"] = true, + ["sm_prop_smug_crate_m_tobacco"] = true, + ["sm_prop_smug_crate_s_antiques"] = true, + ["sm_prop_smug_crate_s_bones"] = true, + ["sm_prop_smug_crate_s_fake"] = true, + ["sm_prop_smug_crate_s_hazard"] = true, + ["sm_prop_smug_crate_s_jewellery"] = true, + ["sm_prop_smug_crate_s_medical"] = true, + ["sm_prop_smug_crate_s_narc"] = true, + ["sm_prop_smug_crate_s_tobacco"] = true, + ["sm_prop_smug_flask"] = true, + ["sm_prop_smug_hangar_lamp_led_a"] = true, + ["sm_prop_smug_hangar_lamp_led_b"] = true, + ["sm_prop_smug_hangar_lamp_wall_a"] = true, + ["sm_prop_smug_hangar_lamp_wall_b"] = true, + ["sm_prop_smug_hangar_light_a"] = true, + ["sm_prop_smug_hangar_light_b"] = true, + ["sm_prop_smug_hangar_light_c"] = true, + ["sm_prop_smug_hangar_wardrobe_lrig"] = true, + ["sm_prop_smug_havok"] = true, + ["sm_prop_smug_heli"] = true, + ["sm_prop_smug_hgrdoors_01"] = true, + ["sm_prop_smug_hgrdoors_02"] = true, + ["sm_prop_smug_hgrdoors_03"] = true, + ["sm_prop_smug_hgrdoors_light_a"] = true, + ["sm_prop_smug_hgrdoors_light_b"] = true, + ["sm_prop_smug_hgrdoors_light_c"] = true, + ["sm_prop_smug_hgrground_01"] = true, + ["sm_prop_smug_jammer"] = true, + ["sm_prop_smug_mic"] = true, + ["sm_prop_smug_monitor_01"] = true, + ["sm_prop_smug_offchair_01a"] = true, + ["sm_prop_smug_radio_01"] = true, + ["sm_prop_smug_rsply_crate01a"] = true, + ["sm_prop_smug_rsply_crate02a"] = true, + ["sm_prop_smug_speaker"] = true, + ["sm_prop_smug_tv_flat_01"] = true, + ["sm_prop_smug_wall_radio_01"] = true, + ["sm_smugdlc_prop_test"] = true, + ["sp1_lod_emi_slod4"] = true, + ["sp1_lod_slod4"] = true, + ["spiritsrow"] = true, + ["sr_mp_spec_races_ammu_sign"] = true, + ["sr_mp_spec_races_blimp_sign"] = true, + ["sr_mp_spec_races_ron_sign"] = true, + ["sr_mp_spec_races_take_flight_sign"] = true, + ["sr_mp_spec_races_xero_sign"] = true, + ["sr_prop_spec_target_b_01a"] = true, + ["sr_prop_spec_target_m_01a"] = true, + ["sr_prop_spec_target_s_01a"] = true, + ["sr_prop_spec_tube_crn_01a"] = true, + ["sr_prop_spec_tube_crn_02a"] = true, + ["sr_prop_spec_tube_crn_03a"] = true, + ["sr_prop_spec_tube_crn_04a"] = true, + ["sr_prop_spec_tube_crn_05a"] = true, + ["sr_prop_spec_tube_crn_30d_01a"] = true, + ["sr_prop_spec_tube_crn_30d_02a"] = true, + ["sr_prop_spec_tube_crn_30d_03a"] = true, + ["sr_prop_spec_tube_crn_30d_04a"] = true, + ["sr_prop_spec_tube_crn_30d_05a"] = true, + ["sr_prop_spec_tube_l_01a"] = true, + ["sr_prop_spec_tube_l_02a"] = true, + ["sr_prop_spec_tube_l_03a"] = true, + ["sr_prop_spec_tube_l_04a"] = true, + ["sr_prop_spec_tube_l_05a"] = true, + ["sr_prop_spec_tube_m_01a"] = true, + ["sr_prop_spec_tube_m_02a"] = true, + ["sr_prop_spec_tube_m_03a"] = true, + ["sr_prop_spec_tube_m_04a"] = true, + ["sr_prop_spec_tube_m_05a"] = true, + ["sr_prop_spec_tube_refill"] = true, + ["sr_prop_spec_tube_s_01a"] = true, + ["sr_prop_spec_tube_s_02a"] = true, + ["sr_prop_spec_tube_s_03a"] = true, + ["sr_prop_spec_tube_s_04a"] = true, + ["sr_prop_spec_tube_s_05a"] = true, + ["sr_prop_spec_tube_xxs_01a"] = true, + ["sr_prop_spec_tube_xxs_02a"] = true, + ["sr_prop_spec_tube_xxs_03a"] = true, + ["sr_prop_spec_tube_xxs_04a"] = true, + ["sr_prop_spec_tube_xxs_05a"] = true, + ["sr_prop_special_bblock_lrg11"] = true, + ["sr_prop_special_bblock_lrg2"] = true, + ["sr_prop_special_bblock_lrg3"] = true, + ["sr_prop_special_bblock_mdm1"] = true, + ["sr_prop_special_bblock_mdm2"] = true, + ["sr_prop_special_bblock_mdm3"] = true, + ["sr_prop_special_bblock_sml1"] = true, + ["sr_prop_special_bblock_sml2"] = true, + ["sr_prop_special_bblock_sml3"] = true, + ["sr_prop_special_bblock_xl1"] = true, + ["sr_prop_special_bblock_xl2"] = true, + ["sr_prop_special_bblock_xl3"] = true, + ["sr_prop_special_bblock_xl3_fixed"] = true, + ["sr_prop_specraces_para_s"] = true, + ["sr_prop_specraces_para_s_01"] = true, + ["sr_prop_sr_boxpile_01"] = true, + ["sr_prop_sr_boxpile_02"] = true, + ["sr_prop_sr_boxpile_03"] = true, + ["sr_prop_sr_boxwood_01"] = true, + ["sr_prop_sr_start_line_02"] = true, + ["sr_prop_sr_target_1_01a"] = true, + ["sr_prop_sr_target_2_04a"] = true, + ["sr_prop_sr_target_3_03a"] = true, + ["sr_prop_sr_target_4_01a"] = true, + ["sr_prop_sr_target_5_01a"] = true, + ["sr_prop_sr_target_large_01a"] = true, + ["sr_prop_sr_target_long_01a"] = true, + ["sr_prop_sr_target_small_01a"] = true, + ["sr_prop_sr_target_small_02a"] = true, + ["sr_prop_sr_target_small_03a"] = true, + ["sr_prop_sr_target_small_04a"] = true, + ["sr_prop_sr_target_small_05a"] = true, + ["sr_prop_sr_target_small_06a"] = true, + ["sr_prop_sr_target_small_07a"] = true, + ["sr_prop_sr_target_trap_01a"] = true, + ["sr_prop_sr_target_trap_02a"] = true, + ["sr_prop_sr_track_block_01"] = true, + ["sr_prop_sr_track_jumpwall"] = true, + ["sr_prop_sr_track_wall"] = true, + ["sr_prop_sr_tube_end"] = true, + ["sr_prop_sr_tube_wall"] = true, + ["sr_prop_stunt_tube_crn_15d_01a"] = true, + ["sr_prop_stunt_tube_crn_15d_02a"] = true, + ["sr_prop_stunt_tube_crn_15d_03a"] = true, + ["sr_prop_stunt_tube_crn_15d_04a"] = true, + ["sr_prop_stunt_tube_crn_15d_05a"] = true, + ["sr_prop_stunt_tube_crn_5d_01a"] = true, + ["sr_prop_stunt_tube_crn_5d_02a"] = true, + ["sr_prop_stunt_tube_crn_5d_03a"] = true, + ["sr_prop_stunt_tube_crn_5d_04a"] = true, + ["sr_prop_stunt_tube_crn_5d_05a"] = true, + ["sr_prop_stunt_tube_crn2_01a"] = true, + ["sr_prop_stunt_tube_crn2_02a"] = true, + ["sr_prop_stunt_tube_crn2_03a"] = true, + ["sr_prop_stunt_tube_crn2_04a"] = true, + ["sr_prop_stunt_tube_crn2_05a"] = true, + ["sr_prop_stunt_tube_xs_01a"] = true, + ["sr_prop_stunt_tube_xs_02a"] = true, + ["sr_prop_stunt_tube_xs_03a"] = true, + ["sr_prop_stunt_tube_xs_04a"] = true, + ["sr_prop_stunt_tube_xs_05a"] = true, + ["sr_prop_track_refill"] = true, + ["sr_prop_track_refill_t1"] = true, + ["sr_prop_track_refill_t2"] = true, + ["sr_prop_track_straight_l_d15"] = true, + ["sr_prop_track_straight_l_d30"] = true, + ["sr_prop_track_straight_l_d45"] = true, + ["sr_prop_track_straight_l_d5"] = true, + ["sr_prop_track_straight_l_u15"] = true, + ["sr_prop_track_straight_l_u30"] = true, + ["sr_prop_track_straight_l_u45"] = true, + ["sr_prop_track_straight_l_u5"] = true, + ["ss1_lod_emissive_05"] = true, + ["ss1_lod_emissive_slod3"] = true, + ["ss1_lod_slod3"] = true, + ["stt_prop_c4_stack"] = true, + ["stt_prop_corner_sign_01"] = true, + ["stt_prop_corner_sign_02"] = true, + ["stt_prop_corner_sign_03"] = true, + ["stt_prop_corner_sign_04"] = true, + ["stt_prop_corner_sign_05"] = true, + ["stt_prop_corner_sign_06"] = true, + ["stt_prop_corner_sign_07"] = true, + ["stt_prop_corner_sign_08"] = true, + ["stt_prop_corner_sign_09"] = true, + ["stt_prop_corner_sign_10"] = true, + ["stt_prop_corner_sign_11"] = true, + ["stt_prop_corner_sign_12"] = true, + ["stt_prop_corner_sign_13"] = true, + ["stt_prop_corner_sign_14"] = true, + ["stt_prop_flagpole_1a"] = true, + ["stt_prop_flagpole_1b"] = true, + ["stt_prop_flagpole_1c"] = true, + ["stt_prop_flagpole_1d"] = true, + ["stt_prop_flagpole_1e"] = true, + ["stt_prop_flagpole_1f"] = true, + ["stt_prop_flagpole_2a"] = true, + ["stt_prop_flagpole_2b"] = true, + ["stt_prop_flagpole_2c"] = true, + ["stt_prop_flagpole_2d"] = true, + ["stt_prop_flagpole_2e"] = true, + ["stt_prop_flagpole_2f"] = true, + ["stt_prop_hoop_constraction_01a"] = true, + ["stt_prop_hoop_small_01"] = true, + ["stt_prop_hoop_tyre_01a"] = true, + ["stt_prop_lives_bottle"] = true, + ["stt_prop_race_gantry_01"] = true, + ["stt_prop_race_start_line_01"] = true, + ["stt_prop_race_start_line_01b"] = true, + ["stt_prop_race_start_line_02"] = true, + ["stt_prop_race_start_line_02b"] = true, + ["stt_prop_race_start_line_03"] = true, + ["stt_prop_race_start_line_03b"] = true, + ["stt_prop_race_tannoy"] = true, + ["stt_prop_ramp_adj_flip_m"] = true, + ["stt_prop_ramp_adj_flip_mb"] = true, + ["stt_prop_ramp_adj_flip_s"] = true, + ["stt_prop_ramp_adj_flip_sb"] = true, + ["stt_prop_ramp_adj_hloop"] = true, + ["stt_prop_ramp_adj_loop"] = true, + ["stt_prop_ramp_jump_l"] = true, + ["stt_prop_ramp_jump_m"] = true, + ["stt_prop_ramp_jump_s"] = true, + ["stt_prop_ramp_jump_xl"] = true, + ["stt_prop_ramp_jump_xs"] = true, + ["stt_prop_ramp_jump_xxl"] = true, + ["stt_prop_ramp_multi_loop_rb"] = true, + ["stt_prop_ramp_spiral_l"] = true, + ["stt_prop_ramp_spiral_l_l"] = true, + ["stt_prop_ramp_spiral_l_m"] = true, + ["stt_prop_ramp_spiral_l_s"] = true, + ["stt_prop_ramp_spiral_l_xxl"] = true, + ["stt_prop_ramp_spiral_m"] = true, + ["stt_prop_ramp_spiral_s"] = true, + ["stt_prop_ramp_spiral_xxl"] = true, + ["stt_prop_sign_circuit_01"] = true, + ["stt_prop_sign_circuit_02"] = true, + ["stt_prop_sign_circuit_03"] = true, + ["stt_prop_sign_circuit_04"] = true, + ["stt_prop_sign_circuit_05"] = true, + ["stt_prop_sign_circuit_06"] = true, + ["stt_prop_sign_circuit_07"] = true, + ["stt_prop_sign_circuit_08"] = true, + ["stt_prop_sign_circuit_09"] = true, + ["stt_prop_sign_circuit_10"] = true, + ["stt_prop_sign_circuit_11"] = true, + ["stt_prop_sign_circuit_11b"] = true, + ["stt_prop_sign_circuit_12"] = true, + ["stt_prop_sign_circuit_13"] = true, + ["stt_prop_sign_circuit_13b"] = true, + ["stt_prop_sign_circuit_14"] = true, + ["stt_prop_sign_circuit_14b"] = true, + ["stt_prop_sign_circuit_15"] = true, + ["stt_prop_slow_down"] = true, + ["stt_prop_speakerstack_01a"] = true, + ["stt_prop_startline_gantry"] = true, + ["stt_prop_stunt_bblock_huge_01"] = true, + ["stt_prop_stunt_bblock_huge_02"] = true, + ["stt_prop_stunt_bblock_huge_03"] = true, + ["stt_prop_stunt_bblock_huge_04"] = true, + ["stt_prop_stunt_bblock_huge_05"] = true, + ["stt_prop_stunt_bblock_hump_01"] = true, + ["stt_prop_stunt_bblock_hump_02"] = true, + ["stt_prop_stunt_bblock_lrg1"] = true, + ["stt_prop_stunt_bblock_lrg2"] = true, + ["stt_prop_stunt_bblock_lrg3"] = true, + ["stt_prop_stunt_bblock_mdm1"] = true, + ["stt_prop_stunt_bblock_mdm2"] = true, + ["stt_prop_stunt_bblock_mdm3"] = true, + ["stt_prop_stunt_bblock_qp"] = true, + ["stt_prop_stunt_bblock_qp2"] = true, + ["stt_prop_stunt_bblock_qp3"] = true, + ["stt_prop_stunt_bblock_sml1"] = true, + ["stt_prop_stunt_bblock_sml2"] = true, + ["stt_prop_stunt_bblock_sml3"] = true, + ["stt_prop_stunt_bblock_xl1"] = true, + ["stt_prop_stunt_bblock_xl2"] = true, + ["stt_prop_stunt_bblock_xl3"] = true, + ["stt_prop_stunt_bowling_ball"] = true, + ["stt_prop_stunt_bowling_pin"] = true, + ["stt_prop_stunt_bowlpin_stand"] = true, + ["stt_prop_stunt_domino"] = true, + ["stt_prop_stunt_jump_l"] = true, + ["stt_prop_stunt_jump_lb"] = true, + ["stt_prop_stunt_jump_loop"] = true, + ["stt_prop_stunt_jump_m"] = true, + ["stt_prop_stunt_jump_mb"] = true, + ["stt_prop_stunt_jump_s"] = true, + ["stt_prop_stunt_jump_sb"] = true, + ["stt_prop_stunt_jump15"] = true, + ["stt_prop_stunt_jump30"] = true, + ["stt_prop_stunt_jump45"] = true, + ["stt_prop_stunt_landing_zone_01"] = true, + ["stt_prop_stunt_ramp"] = true, + ["stt_prop_stunt_soccer_ball"] = true, + ["stt_prop_stunt_soccer_goal"] = true, + ["stt_prop_stunt_soccer_lball"] = true, + ["stt_prop_stunt_soccer_sball"] = true, + ["stt_prop_stunt_target"] = true, + ["stt_prop_stunt_target_small"] = true, + ["stt_prop_stunt_track_bumps"] = true, + ["stt_prop_stunt_track_cutout"] = true, + ["stt_prop_stunt_track_dwlink"] = true, + ["stt_prop_stunt_track_dwlink_02"] = true, + ["stt_prop_stunt_track_dwsh15"] = true, + ["stt_prop_stunt_track_dwshort"] = true, + ["stt_prop_stunt_track_dwslope15"] = true, + ["stt_prop_stunt_track_dwslope30"] = true, + ["stt_prop_stunt_track_dwslope45"] = true, + ["stt_prop_stunt_track_dwturn"] = true, + ["stt_prop_stunt_track_dwuturn"] = true, + ["stt_prop_stunt_track_exshort"] = true, + ["stt_prop_stunt_track_fork"] = true, + ["stt_prop_stunt_track_funlng"] = true, + ["stt_prop_stunt_track_funnel"] = true, + ["stt_prop_stunt_track_hill"] = true, + ["stt_prop_stunt_track_hill2"] = true, + ["stt_prop_stunt_track_jump"] = true, + ["stt_prop_stunt_track_link"] = true, + ["stt_prop_stunt_track_otake"] = true, + ["stt_prop_stunt_track_sh15"] = true, + ["stt_prop_stunt_track_sh30"] = true, + ["stt_prop_stunt_track_sh45"] = true, + ["stt_prop_stunt_track_sh45_a"] = true, + ["stt_prop_stunt_track_short"] = true, + ["stt_prop_stunt_track_slope15"] = true, + ["stt_prop_stunt_track_slope30"] = true, + ["stt_prop_stunt_track_slope45"] = true, + ["stt_prop_stunt_track_st_01"] = true, + ["stt_prop_stunt_track_st_02"] = true, + ["stt_prop_stunt_track_start"] = true, + ["stt_prop_stunt_track_start_02"] = true, + ["stt_prop_stunt_track_straight"] = true, + ["stt_prop_stunt_track_straightice"] = true, + ["stt_prop_stunt_track_turn"] = true, + ["stt_prop_stunt_track_turnice"] = true, + ["stt_prop_stunt_track_uturn"] = true, + ["stt_prop_stunt_tube_crn"] = true, + ["stt_prop_stunt_tube_crn_15d"] = true, + ["stt_prop_stunt_tube_crn_30d"] = true, + ["stt_prop_stunt_tube_crn_5d"] = true, + ["stt_prop_stunt_tube_crn2"] = true, + ["stt_prop_stunt_tube_cross"] = true, + ["stt_prop_stunt_tube_end"] = true, + ["stt_prop_stunt_tube_ent"] = true, + ["stt_prop_stunt_tube_fn_01"] = true, + ["stt_prop_stunt_tube_fn_02"] = true, + ["stt_prop_stunt_tube_fn_03"] = true, + ["stt_prop_stunt_tube_fn_04"] = true, + ["stt_prop_stunt_tube_fn_05"] = true, + ["stt_prop_stunt_tube_fork"] = true, + ["stt_prop_stunt_tube_gap_01"] = true, + ["stt_prop_stunt_tube_gap_02"] = true, + ["stt_prop_stunt_tube_gap_03"] = true, + ["stt_prop_stunt_tube_hg"] = true, + ["stt_prop_stunt_tube_jmp"] = true, + ["stt_prop_stunt_tube_jmp2"] = true, + ["stt_prop_stunt_tube_l"] = true, + ["stt_prop_stunt_tube_m"] = true, + ["stt_prop_stunt_tube_qg"] = true, + ["stt_prop_stunt_tube_s"] = true, + ["stt_prop_stunt_tube_speed"] = true, + ["stt_prop_stunt_tube_speeda"] = true, + ["stt_prop_stunt_tube_speedb"] = true, + ["stt_prop_stunt_tube_xs"] = true, + ["stt_prop_stunt_tube_xxs"] = true, + ["stt_prop_stunt_wideramp"] = true, + ["stt_prop_track_bend_15d"] = true, + ["stt_prop_track_bend_15d_bar"] = true, + ["stt_prop_track_bend_180d"] = true, + ["stt_prop_track_bend_180d_bar"] = true, + ["stt_prop_track_bend_30d"] = true, + ["stt_prop_track_bend_30d_bar"] = true, + ["stt_prop_track_bend_5d"] = true, + ["stt_prop_track_bend_5d_bar"] = true, + ["stt_prop_track_bend_bar_l"] = true, + ["stt_prop_track_bend_bar_l_b"] = true, + ["stt_prop_track_bend_bar_m"] = true, + ["stt_prop_track_bend_l"] = true, + ["stt_prop_track_bend_l_b"] = true, + ["stt_prop_track_bend_m"] = true, + ["stt_prop_track_bend2_bar_l"] = true, + ["stt_prop_track_bend2_bar_l_b"] = true, + ["stt_prop_track_bend2_l"] = true, + ["stt_prop_track_bend2_l_b"] = true, + ["stt_prop_track_block_01"] = true, + ["stt_prop_track_block_02"] = true, + ["stt_prop_track_block_03"] = true, + ["stt_prop_track_chicane_l"] = true, + ["stt_prop_track_chicane_l_02"] = true, + ["stt_prop_track_chicane_r"] = true, + ["stt_prop_track_chicane_r_02"] = true, + ["stt_prop_track_cross"] = true, + ["stt_prop_track_cross_bar"] = true, + ["stt_prop_track_fork"] = true, + ["stt_prop_track_fork_bar"] = true, + ["stt_prop_track_funnel"] = true, + ["stt_prop_track_funnel_ads_01a"] = true, + ["stt_prop_track_funnel_ads_01b"] = true, + ["stt_prop_track_funnel_ads_01c"] = true, + ["stt_prop_track_jump_01a"] = true, + ["stt_prop_track_jump_01b"] = true, + ["stt_prop_track_jump_01c"] = true, + ["stt_prop_track_jump_02a"] = true, + ["stt_prop_track_jump_02b"] = true, + ["stt_prop_track_jump_02c"] = true, + ["stt_prop_track_link"] = true, + ["stt_prop_track_slowdown"] = true, + ["stt_prop_track_slowdown_t1"] = true, + ["stt_prop_track_slowdown_t2"] = true, + ["stt_prop_track_speedup"] = true, + ["stt_prop_track_speedup_t1"] = true, + ["stt_prop_track_speedup_t2"] = true, + ["stt_prop_track_start"] = true, + ["stt_prop_track_start_02"] = true, + ["stt_prop_track_stop_sign"] = true, + ["stt_prop_track_straight_bar_l"] = true, + ["stt_prop_track_straight_bar_m"] = true, + ["stt_prop_track_straight_bar_s"] = true, + ["stt_prop_track_straight_l"] = true, + ["stt_prop_track_straight_lm"] = true, + ["stt_prop_track_straight_lm_bar"] = true, + ["stt_prop_track_straight_m"] = true, + ["stt_prop_track_straight_s"] = true, + ["stt_prop_track_tube_01"] = true, + ["stt_prop_track_tube_02"] = true, + ["stt_prop_tyre_wall_01"] = true, + ["stt_prop_tyre_wall_010"] = true, + ["stt_prop_tyre_wall_011"] = true, + ["stt_prop_tyre_wall_012"] = true, + ["stt_prop_tyre_wall_013"] = true, + ["stt_prop_tyre_wall_014"] = true, + ["stt_prop_tyre_wall_015"] = true, + ["stt_prop_tyre_wall_02"] = true, + ["stt_prop_tyre_wall_03"] = true, + ["stt_prop_tyre_wall_04"] = true, + ["stt_prop_tyre_wall_05"] = true, + ["stt_prop_tyre_wall_06"] = true, + ["stt_prop_tyre_wall_07"] = true, + ["stt_prop_tyre_wall_08"] = true, + ["stt_prop_tyre_wall_09"] = true, + ["stt_prop_tyre_wall_0l010"] = true, + ["stt_prop_tyre_wall_0l012"] = true, + ["stt_prop_tyre_wall_0l013"] = true, + ["stt_prop_tyre_wall_0l014"] = true, + ["stt_prop_tyre_wall_0l015"] = true, + ["stt_prop_tyre_wall_0l018"] = true, + ["stt_prop_tyre_wall_0l019"] = true, + ["stt_prop_tyre_wall_0l020"] = true, + ["stt_prop_tyre_wall_0l04"] = true, + ["stt_prop_tyre_wall_0l05"] = true, + ["stt_prop_tyre_wall_0l06"] = true, + ["stt_prop_tyre_wall_0l07"] = true, + ["stt_prop_tyre_wall_0l08"] = true, + ["stt_prop_tyre_wall_0l1"] = true, + ["stt_prop_tyre_wall_0l16"] = true, + ["stt_prop_tyre_wall_0l17"] = true, + ["stt_prop_tyre_wall_0l2"] = true, + ["stt_prop_tyre_wall_0l3"] = true, + ["stt_prop_tyre_wall_0r010"] = true, + ["stt_prop_tyre_wall_0r011"] = true, + ["stt_prop_tyre_wall_0r012"] = true, + ["stt_prop_tyre_wall_0r013"] = true, + ["stt_prop_tyre_wall_0r014"] = true, + ["stt_prop_tyre_wall_0r015"] = true, + ["stt_prop_tyre_wall_0r016"] = true, + ["stt_prop_tyre_wall_0r017"] = true, + ["stt_prop_tyre_wall_0r018"] = true, + ["stt_prop_tyre_wall_0r019"] = true, + ["stt_prop_tyre_wall_0r04"] = true, + ["stt_prop_tyre_wall_0r05"] = true, + ["stt_prop_tyre_wall_0r06"] = true, + ["stt_prop_tyre_wall_0r07"] = true, + ["stt_prop_tyre_wall_0r08"] = true, + ["stt_prop_tyre_wall_0r09"] = true, + ["stt_prop_tyre_wall_0r1"] = true, + ["stt_prop_tyre_wall_0r2"] = true, + ["stt_prop_tyre_wall_0r3"] = true, + ["stt_prop_wallride_01"] = true, + ["stt_prop_wallride_01b"] = true, + ["stt_prop_wallride_02"] = true, + ["stt_prop_wallride_02b"] = true, + ["stt_prop_wallride_04"] = true, + ["stt_prop_wallride_05"] = true, + ["stt_prop_wallride_05b"] = true, + ["stt_prop_wallride_45l"] = true, + ["stt_prop_wallride_45la"] = true, + ["stt_prop_wallride_45r"] = true, + ["stt_prop_wallride_45ra"] = true, + ["stt_prop_wallride_90l"] = true, + ["stt_prop_wallride_90lb"] = true, + ["stt_prop_wallride_90r"] = true, + ["stt_prop_wallride_90rb"] = true, + ["sum_ac_prop_container_01a"] = true, + ["sum_bdrm_reflect_blocker2"] = true, + ["sum_bedathpl3"] = true, + ["sum_bedroom_light_blocker"] = true, + ["sum_ceilingstarz"] = true, + ["sum_hall_reflect_blocker"] = true, + ["sum_lostyacht_kitchlamps"] = true, + ["sum_mp_apa_yacht"] = true, + ["sum_mp_apa_yacht_jacuzzi_cam"] = true, + ["sum_mp_apa_yacht_jacuzzi_ripple003"] = true, + ["sum_mp_apa_yacht_jacuzzi_ripple1"] = true, + ["sum_mp_apa_yacht_jacuzzi_ripple2"] = true, + ["sum_mp_apa_yacht_win"] = true, + ["sum_mp_h_acc_artwalll_01"] = true, + ["sum_mp_h_acc_artwalll_02"] = true, + ["sum_mp_h_acc_artwallm_02"] = true, + ["sum_mp_h_acc_artwallm_03"] = true, + ["sum_mp_h_acc_box_trinket_02"] = true, + ["sum_mp_h_acc_candles_02"] = true, + ["sum_mp_h_acc_candles_05"] = true, + ["sum_mp_h_acc_candles_06"] = true, + ["sum_mp_h_acc_dec_sculpt_01"] = true, + ["sum_mp_h_acc_dec_sculpt_02"] = true, + ["sum_mp_h_acc_dec_sculpt_03"] = true, + ["sum_mp_h_acc_drink_tray_02"] = true, + ["sum_mp_h_acc_fruitbowl_01"] = true, + ["sum_mp_h_acc_jar_03"] = true, + ["sum_mp_h_acc_vase_04"] = true, + ["sum_mp_h_acc_vase_05"] = true, + ["sum_mp_h_acc_vase_flowers_01"] = true, + ["sum_mp_h_acc_vase_flowers_03"] = true, + ["sum_mp_h_acc_vase_flowers_04"] = true, + ["sum_mp_h_yacht_armchair_01"] = true, + ["sum_mp_h_yacht_armchair_03"] = true, + ["sum_mp_h_yacht_armchair_04"] = true, + ["sum_mp_h_yacht_barstool_01"] = true, + ["sum_mp_h_yacht_bed_01"] = true, + ["sum_mp_h_yacht_bed_02"] = true, + ["sum_mp_h_yacht_coffee_table_01"] = true, + ["sum_mp_h_yacht_coffee_table_02"] = true, + ["sum_mp_h_yacht_floor_lamp_01"] = true, + ["sum_mp_h_yacht_side_table_01"] = true, + ["sum_mp_h_yacht_side_table_02"] = true, + ["sum_mp_h_yacht_sofa_01"] = true, + ["sum_mp_h_yacht_sofa_02"] = true, + ["sum_mp_h_yacht_stool_01"] = true, + ["sum_mp_h_yacht_strip_chair_01"] = true, + ["sum_mp_h_yacht_table_lamp_01"] = true, + ["sum_mp_h_yacht_table_lamp_02"] = true, + ["sum_mp_h_yacht_table_lamp_03"] = true, + ["sum_mp_yacht_worldmap"] = true, + ["sum_mpapayacht_glass_sky"] = true, + ["sum_mpapyacht_2beds_hallpart"] = true, + ["sum_mpapyacht_bar1_rof2"] = true, + ["sum_mpapyacht_bar1_shell"] = true, + ["sum_mpapyacht_bar2detail"] = true, + ["sum_mpapyacht_base_01"] = true, + ["sum_mpapyacht_bath1_detail"] = true, + ["sum_mpapyacht_bath1_lamps"] = true, + ["sum_mpapyacht_bath1_shell"] = true, + ["sum_mpapyacht_bath2_shell"] = true, + ["sum_mpapyacht_bed1_lamps3"] = true, + ["sum_mpapyacht_bed1_shell"] = true, + ["sum_mpapyacht_bed3_detail"] = true, + ["sum_mpapyacht_bed3_shell"] = true, + ["sum_mpapyacht_bed3bath"] = true, + ["sum_mpapyacht_bed3stuff"] = true, + ["sum_mpapyacht_bedbooks1"] = true, + ["sum_mpapyacht_bedbooks3"] = true, + ["sum_mpapyacht_bedhall_lamps"] = true, + ["sum_mpapyacht_bedr2_carpet"] = true, + ["sum_mpapyacht_bedr2_lamps"] = true, + ["sum_mpapyacht_bedrmdrs"] = true, + ["sum_mpapyacht_bedroom1_lamps"] = true, + ["sum_mpapyacht_books002"] = true, + ["sum_mpapyacht_brdg_detail"] = true, + ["sum_mpapyacht_bridge_shell"] = true, + ["sum_mpapyacht_console_h"] = true, + ["sum_mpapyacht_corrframes"] = true, + ["sum_mpapyacht_d2_bath2det"] = true, + ["sum_mpapyacht_d2_bedetailscunt"] = true, + ["sum_mpapyacht_d2bed_lamps"] = true, + ["sum_mpapyacht_d2beds_bed"] = true, + ["sum_mpapyacht_d2beds_book1"] = true, + ["sum_mpapyacht_d2beds_books"] = true, + ["sum_mpapyacht_d2beds_floor3"] = true, + ["sum_mpapyacht_deck2_carpets"] = true, + ["sum_mpapyacht_dk3_bar1"] = true, + ["sum_mpapyacht_dk3_bar1detail"] = true, + ["sum_mpapyacht_dk3_spots"] = true, + ["sum_mpapyacht_dk3_spots1"] = true, + ["sum_mpapyacht_doorframes"] = true, + ["sum_mpapyacht_ed1_blinds001"] = true, + ["sum_mpapyacht_ed3_blind"] = true, + ["sum_mpapyacht_entry_lamps"] = true, + ["sum_mpapyacht_entry_shell"] = true, + ["sum_mpapyacht_glass00"] = true, + ["sum_mpapyacht_glass01"] = true, + ["sum_mpapyacht_glass02"] = true, + ["sum_mpapyacht_glass03"] = true, + ["sum_mpapyacht_glass04"] = true, + ["sum_mpapyacht_glass043"] = true, + ["sum_mpapyacht_glass05"] = true, + ["sum_mpapyacht_glass06"] = true, + ["sum_mpapyacht_glass07"] = true, + ["sum_mpapyacht_glass08"] = true, + ["sum_mpapyacht_glass09"] = true, + ["sum_mpapyacht_glass10"] = true, + ["sum_mpapyacht_glass11"] = true, + ["sum_mpapyacht_glass12"] = true, + ["sum_mpapyacht_glass13"] = true, + ["sum_mpapyacht_glass14"] = true, + ["sum_mpapyacht_glass15"] = true, + ["sum_mpapyacht_glass16"] = true, + ["sum_mpapyacht_glass17"] = true, + ["sum_mpapyacht_glass18"] = true, + ["sum_mpapyacht_glass19"] = true, + ["sum_mpapyacht_hall_shell"] = true, + ["sum_mpapyacht_hallpart_glow"] = true, + ["sum_mpapyacht_hallrug"] = true, + ["sum_mpapyacht_kitchcupb"] = true, + ["sum_mpapyacht_kitchdetail"] = true, + ["sum_mpapyacht_mirror1"] = true, + ["sum_mpapyacht_mirror2"] = true, + ["sum_mpapyacht_mirror3"] = true, + ["sum_mpapyacht_p_map_h"] = true, + ["sum_mpapyacht_pants1"] = true, + ["sum_mpapyacht_pants2"] = true, + ["sum_mpapyacht_pants3"] = true, + ["sum_mpapyacht_pants4"] = true, + ["sum_mpapyacht_pants5"] = true, + ["sum_mpapyacht_pants6"] = true, + ["sum_mpapyacht_plug2"] = true, + ["sum_mpapyacht_shadow_proxy"] = true, + ["sum_mpapyacht_smallhalldetail"] = true, + ["sum_mpapyacht_smlhall_lamps"] = true, + ["sum_mpapyacht_st_011"] = true, + ["sum_mpapyacht_st_012"] = true, + ["sum_mpapyacht_st_02"] = true, + ["sum_mpapyacht_stairsdetail"] = true, + ["sum_mpapyacht_stairslamps"] = true, + ["sum_mpapyacht_storagebox01"] = true, + ["sum_mpapyacht_study_shell"] = true, + ["sum_mpapyacht_t_pa_smll_base_h007"] = true, + ["sum_mpapyacht_t_pa_smll_base_h008"] = true, + ["sum_mpapyacht_t_smll_base"] = true, + ["sum_mpapyacht_taps"] = true, + ["sum_mpapyacht_tvrm_glass"] = true, + ["sum_mpapyacht_ws"] = true, + ["sum_mpapyacht_yacht_bedroom2_glow"] = true, + ["sum_mpyacht_entrydetail"] = true, + ["sum_mpyacht_seatingflrtrim"] = true, + ["sum_p_h_acc_artwalll_04"] = true, + ["sum_p_h_acc_artwallm_04"] = true, + ["sum_p_mp_yacht_bathroomdoor"] = true, + ["sum_p_mp_yacht_door"] = true, + ["sum_p_mp_yacht_door_01"] = true, + ["sum_p_mp_yacht_door_02"] = true, + ["sum_prop_ac_aircon_02a"] = true, + ["sum_prop_ac_alienhead_01a"] = true, + ["sum_prop_ac_barge_01"] = true, + ["sum_prop_ac_barge_col_01"] = true, + ["sum_prop_ac_clapperboard_01a"] = true, + ["sum_prop_ac_constructsign_01a"] = true, + ["sum_prop_ac_drinkglobe_01a"] = true, + ["sum_prop_ac_dustsheet_01a"] = true, + ["sum_prop_ac_filmreel_01a"] = true, + ["sum_prop_ac_grandstand_01a"] = true, + ["sum_prop_ac_headdress_01a"] = true, + ["sum_prop_ac_ind_light_02a"] = true, + ["sum_prop_ac_ind_light_03c"] = true, + ["sum_prop_ac_ind_light_04"] = true, + ["sum_prop_ac_long_barrier_05d"] = true, + ["sum_prop_ac_long_barrier_15d"] = true, + ["sum_prop_ac_long_barrier_30d"] = true, + ["sum_prop_ac_long_barrier_45d"] = true, + ["sum_prop_ac_long_barrier_90d"] = true, + ["sum_prop_ac_monstermask_01a"] = true, + ["sum_prop_ac_mummyhead_01a"] = true, + ["sum_prop_ac_papers_01a"] = true, + ["sum_prop_ac_pit_garage_01a"] = true, + ["sum_prop_ac_pit_sign_l_01a"] = true, + ["sum_prop_ac_pit_sign_left"] = true, + ["sum_prop_ac_pit_sign_r_01a"] = true, + ["sum_prop_ac_pit_sign_right"] = true, + ["sum_prop_ac_qub3d_cube_01"] = true, + ["sum_prop_ac_qub3d_cube_02"] = true, + ["sum_prop_ac_qub3d_flippedcube"] = true, + ["sum_prop_ac_qub3d_grid"] = true, + ["sum_prop_ac_qub3d_poster_01a"] = true, + ["sum_prop_ac_rock_01a"] = true, + ["sum_prop_ac_rock_01b"] = true, + ["sum_prop_ac_rock_01c"] = true, + ["sum_prop_ac_rock_01d"] = true, + ["sum_prop_ac_rock_01e"] = true, + ["sum_prop_ac_sarcophagus_01a"] = true, + ["sum_prop_ac_short_barrier_05d"] = true, + ["sum_prop_ac_short_barrier_15d"] = true, + ["sum_prop_ac_short_barrier_30d"] = true, + ["sum_prop_ac_short_barrier_45d"] = true, + ["sum_prop_ac_short_barrier_90d"] = true, + ["sum_prop_ac_tigerrug_01a"] = true, + ["sum_prop_ac_track_paddock_01"] = true, + ["sum_prop_ac_track_pit_stop_01"] = true, + ["sum_prop_ac_track_pit_stop_16l"] = true, + ["sum_prop_ac_track_pit_stop_16r"] = true, + ["sum_prop_ac_track_pit_stop_30l"] = true, + ["sum_prop_ac_track_pit_stop_30r"] = true, + ["sum_prop_ac_tyre_wall_lit_01"] = true, + ["sum_prop_ac_tyre_wall_lit_0l1"] = true, + ["sum_prop_ac_tyre_wall_lit_0r1"] = true, + ["sum_prop_ac_tyre_wall_pit_l"] = true, + ["sum_prop_ac_tyre_wall_pit_r"] = true, + ["sum_prop_ac_tyre_wall_u_l"] = true, + ["sum_prop_ac_tyre_wall_u_r"] = true, + ["sum_prop_ac_wall_light_09a"] = true, + ["sum_prop_ac_wall_sign_01"] = true, + ["sum_prop_ac_wall_sign_02"] = true, + ["sum_prop_ac_wall_sign_03"] = true, + ["sum_prop_ac_wall_sign_04"] = true, + ["sum_prop_ac_wall_sign_05"] = true, + ["sum_prop_ac_wall_sign_0l1"] = true, + ["sum_prop_ac_wall_sign_0r1"] = true, + ["sum_prop_ac_wifaaward_01a"] = true, + ["sum_prop_arcade_qub3d_01a"] = true, + ["sum_prop_arcade_qub3d_01a_scrn_uv"] = true, + ["sum_prop_arcade_str_bar_01a"] = true, + ["sum_prop_arcade_str_lightoff"] = true, + ["sum_prop_arcade_str_lighton"] = true, + ["sum_prop_arcade_strength_01a"] = true, + ["sum_prop_arcade_strength_ham_01a"] = true, + ["sum_prop_archway_01"] = true, + ["sum_prop_archway_02"] = true, + ["sum_prop_archway_03"] = true, + ["sum_prop_barrier_ac_bend_05d"] = true, + ["sum_prop_barrier_ac_bend_15d"] = true, + ["sum_prop_barrier_ac_bend_30d"] = true, + ["sum_prop_barrier_ac_bend_45d"] = true, + ["sum_prop_barrier_ac_bend_90d"] = true, + ["sum_prop_dufocore_01a"] = true, + ["sum_prop_hangerdoor_01a"] = true, + ["sum_prop_race_barrier_01_sec"] = true, + ["sum_prop_race_barrier_02_sec"] = true, + ["sum_prop_race_barrier_04_sec"] = true, + ["sum_prop_race_barrier_08_sec"] = true, + ["sum_prop_race_barrier_16_sec"] = true, + ["sum_prop_sum_arcade_plush_01a"] = true, + ["sum_prop_sum_arcade_plush_02a"] = true, + ["sum_prop_sum_arcade_plush_03a"] = true, + ["sum_prop_sum_arcade_plush_04a"] = true, + ["sum_prop_sum_arcade_plush_05a"] = true, + ["sum_prop_sum_arcade_plush_06a"] = true, + ["sum_prop_sum_arcade_plush_07a"] = true, + ["sum_prop_sum_arcade_plush_08a"] = true, + ["sum_prop_sum_arcade_plush_09a"] = true, + ["sum_prop_sum_power_cell"] = true, + ["sum_prop_sum_trophy_qub3d_01a"] = true, + ["sum_prop_sum_trophy_ripped_01a"] = true, + ["sum_prop_track_ac_bend_135"] = true, + ["sum_prop_track_ac_bend_180d"] = true, + ["sum_prop_track_ac_bend_45"] = true, + ["sum_prop_track_ac_bend_bar_135"] = true, + ["sum_prop_track_ac_bend_bar_180d"] = true, + ["sum_prop_track_ac_bend_bar_45"] = true, + ["sum_prop_track_ac_bend_bar_l_b"] = true, + ["sum_prop_track_ac_bend_bar_l_out"] = true, + ["sum_prop_track_ac_bend_bar_m_in"] = true, + ["sum_prop_track_ac_bend_bar_m_out"] = true, + ["sum_prop_track_ac_bend_lc"] = true, + ["sum_prop_track_ac_straight_bar_s"] = true, + ["sum_prop_track_ac_straight_bar_s_s"] = true, + ["sum_prop_track_pit_garage_02a"] = true, + ["sum_prop_track_pit_garage_03a"] = true, + ["sum_prop_track_pit_garage_04a"] = true, + ["sum_prop_track_pit_garage_05a"] = true, + ["sum_prop_yacht_glass_01"] = true, + ["sum_prop_yacht_glass_02"] = true, + ["sum_prop_yacht_glass_03"] = true, + ["sum_prop_yacht_glass_04"] = true, + ["sum_prop_yacht_glass_05"] = true, + ["sum_prop_yacht_glass_06"] = true, + ["sum_prop_yacht_glass_07"] = true, + ["sum_prop_yacht_glass_08"] = true, + ["sum_prop_yacht_glass_09"] = true, + ["sum_prop_yacht_glass_10"] = true, + ["sum_prop_yacht_showerdoor"] = true, + ["sum_stairs_ref_proxy"] = true, + ["sum_yacht_bar_ref_blocker"] = true, + ["sum_yacht_bridge_glass01"] = true, + ["sum_yacht_bridge_glass02"] = true, + ["sum_yacht_bridge_glass03"] = true, + ["sum_yacht_bridge_glass04"] = true, + ["sum_yacht_bridge_glass05"] = true, + ["sum_yacht_bridge_glass06"] = true, + ["sum_yacht_bridge_glass07"] = true, + ["sum_yacht_bridge_glass08"] = true, + ["sum_yacht_bridge_glass09"] = true, + ["sum_yacht_bridge_glass10"] = true, + ["sum_yacht_bridge_glass11"] = true, + ["sum_yacht_bridge_glass12"] = true, + ["sum_yacht_bridge_glass13"] = true, + ["sum_yacht_bridge_glass14"] = true, + ["sum_yacht_bridge_glass15"] = true, + ["sum_yacht_bridge_glass16"] = true, + ["sum_yacht_bridge_glass17"] = true, + ["sum_yacht_bridge_glass18"] = true, + ["sum_yacht_hallstar_ref_blk"] = true, + ["sum_yacht_mod_windsur"] = true, + ["sum_yacht_proxydummy"] = true, + ["sum_yacht_refproxy"] = true, + ["sum_yacht_tv_ref_blocker"] = true, + ["sum_yachtbthrm3lghts"] = true, + ["sum_ych_mod_glass1"] = true, + ["sum_ych_mod_glass10"] = true, + ["sum_ych_mod_glass11"] = true, + ["sum_ych_mod_glass12"] = true, + ["sum_ych_mod_glass13"] = true, + ["sum_ych_mod_glass2"] = true, + ["sum_ych_mod_glass3"] = true, + ["sum_ych_mod_glass3wang"] = true, + ["sum_ych_mod_glass5"] = true, + ["sum_ych_mod_glass6"] = true, + ["sum_ych_mod_glass7"] = true, + ["sum_ych_mod_glass8"] = true, + ["sum_ych_mod_glass9"] = true, + ["test_prop_gravestones_01a"] = true, + ["test_prop_gravestones_02a"] = true, + ["test_prop_gravestones_04a"] = true, + ["test_prop_gravestones_05a"] = true, + ["test_prop_gravestones_07a"] = true, + ["test_prop_gravestones_08a"] = true, + ["test_prop_gravestones_09a"] = true, + ["test_prop_gravetomb_01a"] = true, + ["test_prop_gravetomb_02a"] = true, + ["test_tree_cedar_trunk_001"] = true, + ["test_tree_forest_trunk_01"] = true, + ["test_tree_forest_trunk_04"] = true, + ["test_tree_forest_trunk_base_01"] = true, + ["test_tree_forest_trunk_fall_01"] = true, + ["to_be_swapped"] = true, + ["tr_dt1_17_tuner_hd"] = true, + ["tr_dt1_17_tuner_lod"] = true, + ["tr_dt1_17_tuner_slod"] = true, + ["tr_id2_18_tuner_la_mesa_hd"] = true, + ["tr_id2_18_tuner_la_mesa_lod"] = true, + ["tr_id2_18_tuner_la_mesa_slod"] = true, + ["tr_id2_18_tuner_meetup_decal"] = true, + ["tr_id2_18_tuner_meetup_grnd_hd"] = true, + ["tr_id2_18_tuner_meetup_hd"] = true, + ["tr_id2_18_tuner_meetup_lod"] = true, + ["tr_id2_18_tuner_meetup_roof"] = true, + ["tr_id2_18_tuner_meetup_stripe"] = true, + ["tr_id2_18_tuner_meetupl_slod"] = true, + ["tr_int1_bedroom_empty_col_proxy"] = true, + ["tr_int1_campbed"] = true, + ["tr_int1_carbon_fibre_base"] = true, + ["tr_int1_carbon_fibre_mirror"] = true, + ["tr_int1_chalkboard"] = true, + ["tr_int1_clotheslocker"] = true, + ["tr_int1_clutter_col_proxy"] = true, + ["tr_int1_coffee_table_style2_004"] = true, + ["tr_int1_coffee_table_style2_005"] = true, + ["tr_int1_coffee_table_style2_006"] = true, + ["tr_int1_coffee_table_style2_007"] = true, + ["tr_int1_coffee_table_style2_008"] = true, + ["tr_int1_coffee_table_style2_01"] = true, + ["tr_int1_coffee_table_style2_02"] = true, + ["tr_int1_coffee_table_style2_03"] = true, + ["tr_int1_comp_barrels"] = true, + ["tr_int1_comp_barrels00dark"] = true, + ["tr_int1_comp_structure_01"] = true, + ["tr_int1_comp_structure_02"] = true, + ["tr_int1_comp_structure_03"] = true, + ["tr_int1_comp_structure_04"] = true, + ["tr_int1_comp_structure_05"] = true, + ["tr_int1_comp_structure_06"] = true, + ["tr_int1_comp_structure_07"] = true, + ["tr_int1_comp_structure_08"] = true, + ["tr_int1_comp_structure_09"] = true, + ["tr_int1_desklamp_beam_01"] = true, + ["tr_int1_drinkscabinet_002"] = true, + ["tr_int1_drinkscabinet_003"] = true, + ["tr_int1_drinkscabinet_004"] = true, + ["tr_int1_drinkscabinet_005"] = true, + ["tr_int1_drinkscabinet_006"] = true, + ["tr_int1_drinkscabinet_007"] = true, + ["tr_int1_drinkscabinet_008"] = true, + ["tr_int1_drinkscabinet_009"] = true, + ["tr_int1_drinkscabinet_1"] = true, + ["tr_int1_emblem_tarp_1"] = true, + ["tr_int1_emblem_tarp_2"] = true, + ["tr_int1_gunlocker"] = true, + ["tr_int1_highlights_proxy001"] = true, + ["tr_int1_light_bedroomproxy"] = true, + ["tr_int1_light_hooks"] = true, + ["tr_int1_light_proxy"] = true, + ["tr_int1_lightamericana_proxy001"] = true, + ["tr_int1_lightcap_proxy001"] = true, + ["tr_int1_lightcapgamer_proxy001"] = true, + ["tr_int1_lightcorona_proxy001"] = true, + ["tr_int1_lightjap_proxy001"] = true, + ["tr_int1_lightled_proxy001"] = true, + ["tr_int1_lightsprayroom_proxy"] = true, + ["tr_int1_mod_armchair_009"] = true, + ["tr_int1_mod_armchair_05"] = true, + ["tr_int1_mod_banners005"] = true, + ["tr_int1_mod_banners007"] = true, + ["tr_int1_mod_banners008"] = true, + ["tr_int1_mod_banners009"] = true, + ["tr_int1_mod_banners010"] = true, + ["tr_int1_mod_banners1"] = true, + ["tr_int1_mod_barnachair_003"] = true, + ["tr_int1_mod_barnachair_004"] = true, + ["tr_int1_mod_barnachair_005"] = true, + ["tr_int1_mod_barnachair_006"] = true, + ["tr_int1_mod_barnachair_2"] = true, + ["tr_int1_mod_beams1"] = true, + ["tr_int1_mod_cabinet"] = true, + ["tr_int1_mod_carlift"] = true, + ["tr_int1_mod_cctv_table"] = true, + ["tr_int1_mod_ceillinglights_006"] = true, + ["tr_int1_mod_ceillinglights_07"] = true, + ["tr_int1_mod_ceillinglights_9"] = true, + ["tr_int1_mod_decals_01"] = true, + ["tr_int1_mod_dirt"] = true, + ["tr_int1_mod_dirtb"] = true, + ["tr_int1_mod_elec_01"] = true, + ["tr_int1_mod_elec_02"] = true, + ["tr_int1_mod_framework"] = true, + ["tr_int1_mod_hood"] = true, + ["tr_int1_mod_hood001"] = true, + ["tr_int1_mod_int_col_proxy"] = true, + ["tr_int1_mod_int_det_style_2"] = true, + ["tr_int1_mod_int_grind_col_proxy"] = true, + ["tr_int1_mod_int_ledstrip_ref"] = true, + ["tr_int1_mod_int_ledstrip_ref002"] = true, + ["tr_int1_mod_int_neonreflection001"] = true, + ["tr_int1_mod_int_shell"] = true, + ["tr_int1_mod_int_style_2"] = true, + ["tr_int1_mod_int_style_3"] = true, + ["tr_int1_mod_int_style_4"] = true, + ["tr_int1_mod_int_style_5"] = true, + ["tr_int1_mod_int_style_6"] = true, + ["tr_int1_mod_int_style_7"] = true, + ["tr_int1_mod_int_style_8"] = true, + ["tr_int1_mod_int_style_9"] = true, + ["tr_int1_mod_int_tool_col_proxy"] = true, + ["tr_int1_mod_lamps"] = true, + ["tr_int1_mod_lamps_source_on"] = true, + ["tr_int1_mod_lframe_01a_proxy"] = true, + ["tr_int1_mod_lights_008"] = true, + ["tr_int1_mod_lights_009"] = true, + ["tr_int1_mod_lights_1"] = true, + ["tr_int1_mod_lights_2"] = true, + ["tr_int1_mod_lights_3"] = true, + ["tr_int1_mod_lights4_01"] = true, + ["tr_int1_mod_mezzanine_style1"] = true, + ["tr_int1_mod_mezzanine_style2"] = true, + ["tr_int1_mod_mezzanine_style3"] = true, + ["tr_int1_mod_mezzanine_style4"] = true, + ["tr_int1_mod_mezzanine_style5"] = true, + ["tr_int1_mod_mezzanine_style6"] = true, + ["tr_int1_mod_mezzanine_style7"] = true, + ["tr_int1_mod_mezzanine_style8"] = true, + ["tr_int1_mod_mezzanine_style9"] = true, + ["tr_int1_mod_mirror_04"] = true, + ["tr_int1_mod_mirror_05"] = true, + ["tr_int1_mod_mirror_07"] = true, + ["tr_int1_mod_mural_neon"] = true, + ["tr_int1_mod_murals_09"] = true, + ["tr_int1_mod_neontubes_blue"] = true, + ["tr_int1_mod_neontubes_green02"] = true, + ["tr_int1_mod_office_01"] = true, + ["tr_int1_mod_office_table_01"] = true, + ["tr_int1_mod_pillars01"] = true, + ["tr_int1_mod_pillars010"] = true, + ["tr_int1_mod_pillars02"] = true, + ["tr_int1_mod_pillars03"] = true, + ["tr_int1_mod_pillars04"] = true, + ["tr_int1_mod_pillars05"] = true, + ["tr_int1_mod_pillars06"] = true, + ["tr_int1_mod_pillars08"] = true, + ["tr_int1_mod_pillars09"] = true, + ["tr_int1_mod_posters09"] = true, + ["tr_int1_mod_recessed_light003"] = true, + ["tr_int1_mod_reffloor_1"] = true, + ["tr_int1_mod_reffloor_2"] = true, + ["tr_int1_mod_reffloor_3"] = true, + ["tr_int1_mod_sofa_003"] = true, + ["tr_int1_mod_sofa_009"] = true, + ["tr_int1_mod_sofa_010"] = true, + ["tr_int1_mod_sofa_011"] = true, + ["tr_int1_mod_sofa_012"] = true, + ["tr_int1_mod_sofa_2"] = true, + ["tr_int1_mod_sofa_8"] = true, + ["tr_int1_mod_spray004"] = true, + ["tr_int1_mod_spray008"] = true, + ["tr_int1_mod_spray009"] = true, + ["tr_int1_mod_spray01"] = true, + ["tr_int1_mod_spray010"] = true, + ["tr_int1_mod_spray02"] = true, + ["tr_int1_mod_spray03"] = true, + ["tr_int1_mod_spray05"] = true, + ["tr_int1_mod_spray06"] = true, + ["tr_int1_mod_style05_posters"] = true, + ["tr_int1_mod_table"] = true, + ["tr_int1_mod_vinyl_05"] = true, + ["tr_int1_mod_window_01"] = true, + ["tr_int1_mod_window_02"] = true, + ["tr_int1_mod_window_03"] = true, + ["tr_int1_office_drawers"] = true, + ["tr_int1_plan_cube"] = true, + ["tr_int1_plan_table008"] = true, + ["tr_int1_plan_table009"] = true, + ["tr_int1_plan_table01"] = true, + ["tr_int1_plan_table010"] = true, + ["tr_int1_plan_table02"] = true, + ["tr_int1_plan_table03"] = true, + ["tr_int1_plan_table05"] = true, + ["tr_int1_play_text"] = true, + ["tr_int1_roller_door_ref_proxy"] = true, + ["tr_int1_sideboard_style2_003"] = true, + ["tr_int1_sideboard_style2_004"] = true, + ["tr_int1_sideboard_style2_005"] = true, + ["tr_int1_sideboard_style2_006"] = true, + ["tr_int1_sideboard_style2_01"] = true, + ["tr_int1_sideboard_style2_010"] = true, + ["tr_int1_sideboard_style2_011"] = true, + ["tr_int1_sideboard_style2_012"] = true, + ["tr_int1_sideboard_style2_013"] = true, + ["tr_int1_sideboard_style2_014"] = true, + ["tr_int1_sideboard_style2_015"] = true, + ["tr_int1_sideboard_style2_017"] = true, + ["tr_int1_sideboard_style2_018"] = true, + ["tr_int1_sideboard_style2_019"] = true, + ["tr_int1_sideboard_style2_02"] = true, + ["tr_int1_smod_barrel_01a_001"] = true, + ["tr_int1_smod_carcreeper_001"] = true, + ["tr_int1_smod_carjack_01"] = true, + ["tr_int1_smod_compressor_03"] = true, + ["tr_int1_smod_engine_hoist_001"] = true, + ["tr_int1_smod_oilcan_01a_001"] = true, + ["tr_int1_smod_sacktruck_02a_001"] = true, + ["tr_int1_smod_toolchest_02_001"] = true, + ["tr_int1_smod_toolchest_05_001"] = true, + ["tr_int1_smod_toolchest9"] = true, + ["tr_int1_smodd_cm_heatlamp_001"] = true, + ["tr_int1_smodd_cm_weldmachine_001"] = true, + ["tr_int1_smodd_cor_hose_001"] = true, + ["tr_int1_smodd_cs_jerrycan01_001"] = true, + ["tr_int1_smoking_table"] = true, + ["tr_int1_smoking_table008"] = true, + ["tr_int1_smoking_table009"] = true, + ["tr_int1_smoking_table009x"] = true, + ["tr_int1_smoking_table009x001"] = true, + ["tr_int1_smoking_table009x002"] = true, + ["tr_int1_smoking_table010"] = true, + ["tr_int1_smoking_table2"] = true, + ["tr_int1_style_8_decals"] = true, + ["tr_int1_tool_draw_01d"] = true, + ["tr_int1_tool_draw_01d001"] = true, + ["tr_int1_tool_draw_01d002"] = true, + ["tr_int1_tool_draw_01d003"] = true, + ["tr_int1_tool_draw_01d004"] = true, + ["tr_int1_tool_draw_01d005"] = true, + ["tr_int1_tool_draw_01d006"] = true, + ["tr_int1_tool_draw_01d007"] = true, + ["tr_int1_tool_draw_01e003"] = true, + ["tr_int1_tool_draw_01e004"] = true, + ["tr_int1_tool_draw_01e005"] = true, + ["tr_int1_tool_draw_01e006"] = true, + ["tr_int1_tool_draw_01e007"] = true, + ["tr_int1_tool_draw_01e008"] = true, + ["tr_int1_tuner_posters"] = true, + ["tr_int1_tyre_marks"] = true, + ["tr_int1_v_45_racks"] = true, + ["tr_int1_v_res_fh_coftableb"] = true, + ["tr_int1_v_res_fh_coftableb001"] = true, + ["tr_int1_vend_skin_2"] = true, + ["tr_int1_vend_skin_3"] = true, + ["tr_int1_vend_skin_4"] = true, + ["tr_int1_vend_skin_7"] = true, + ["tr_int1_vend_skin_8"] = true, + ["tr_int2_angled_kerbs"] = true, + ["tr_int2_blends_meet"] = true, + ["tr_int2_bulks"] = true, + ["tr_int2_cable_trays"] = true, + ["tr_int2_cables_003"] = true, + ["tr_int2_cables_2"] = true, + ["tr_int2_caps"] = true, + ["tr_int2_carware_brands_decals"] = true, + ["tr_int2_carware_fldecals_urban"] = true, + ["tr_int2_carwarecareware_skidders"] = true, + ["tr_int2_carwareconc_decals_basic"] = true, + ["tr_int2_ceiling"] = true, + ["tr_int2_ceiling_decals"] = true, + ["tr_int2_ceiling_decs"] = true, + ["tr_int2_ceiling_fan"] = true, + ["tr_int2_ceilng_vents"] = true, + ["tr_int2_chainlinkfence"] = true, + ["tr_int2_chimney"] = true, + ["tr_int2_chimney_02"] = true, + ["tr_int2_chimney_03"] = true, + ["tr_int2_chimney_04"] = true, + ["tr_int2_chimney_05"] = true, + ["tr_int2_chimney_06"] = true, + ["tr_int2_chimney_07"] = true, + ["tr_int2_chimney_08"] = true, + ["tr_int2_clothes_boxes"] = true, + ["tr_int2_conc_bases_tuns"] = true, + ["tr_int2_crane"] = true, + ["tr_int2_crane_02"] = true, + ["tr_int2_crane_03"] = true, + ["tr_int2_crane_04"] = true, + ["tr_int2_debris"] = true, + ["tr_int2_debris_decals"] = true, + ["tr_int2_decal_test"] = true, + ["tr_int2_detail_shell"] = true, + ["tr_int2_details_02"] = true, + ["tr_int2_details_04"] = true, + ["tr_int2_donuts002"] = true, + ["tr_int2_donuts003"] = true, + ["tr_int2_donuts004"] = true, + ["tr_int2_donuts005"] = true, + ["tr_int2_donuts006"] = true, + ["tr_int2_donuts1"] = true, + ["tr_int2_drains"] = true, + ["tr_int2_ducting"] = true, + ["tr_int2_ducting_02"] = true, + ["tr_int2_ducting_03"] = true, + ["tr_int2_ducting_04"] = true, + ["tr_int2_ducting_05"] = true, + ["tr_int2_ducting_06"] = true, + ["tr_int2_ducting_meet"] = true, + ["tr_int2_ducting_view_01"] = true, + ["tr_int2_ducting_view_02"] = true, + ["tr_int2_exit_signs"] = true, + ["tr_int2_exit_signs001"] = true, + ["tr_int2_exit_signs002"] = true, + ["tr_int2_fluoro_ceiling_sandbox"] = true, + ["tr_int2_fluoro_ref_only_mesh"] = true, + ["tr_int2_gas_pipes"] = true, + ["tr_int2_hoarding"] = true, + ["tr_int2_insulation"] = true, + ["tr_int2_kerbs"] = true, + ["tr_int2_large_duct"] = true, + ["tr_int2_large_duct_02"] = true, + ["tr_int2_large_duct_03"] = true, + ["tr_int2_large_duct_04"] = true, + ["tr_int2_large_duct_05"] = true, + ["tr_int2_large_duct_06"] = true, + ["tr_int2_light_prox_mn_cheap"] = true, + ["tr_int2_light_proxy_main_fancy"] = true, + ["tr_int2_light_proxy_meet_cheap"] = true, + ["tr_int2_light_proxy_meet_fancy"] = true, + ["tr_int2_lintels"] = true, + ["tr_int2_lps_wall_lamp"] = true, + ["tr_int2_main_gates"] = true, + ["tr_int2_meet_collision_proxy"] = true, + ["tr_int2_meet_cracks"] = true, + ["tr_int2_meet_dbris"] = true, + ["tr_int2_meet_drains"] = true, + ["tr_int2_meet_dubs"] = true, + ["tr_int2_meet_pillars"] = true, + ["tr_int2_meet_pipe"] = true, + ["tr_int2_meetcables"] = true, + ["tr_int2_meets_blends"] = true, + ["tr_int2_metal_beam"] = true, + ["tr_int2_metal_beam_02"] = true, + ["tr_int2_metal_beam_03"] = true, + ["tr_int2_metal_beam_04"] = true, + ["tr_int2_metal_debris"] = true, + ["tr_int2_metal_support"] = true, + ["tr_int2_metal_wall"] = true, + ["tr_int2_new_hut"] = true, + ["tr_int2_outer_lines"] = true, + ["tr_int2_plaster_chips_decal"] = true, + ["tr_int2_prop_tr_light_ceiling_01a"] = true, + ["tr_int2_prop_tr_serv_tu_light047"] = true, + ["tr_int2_puddles"] = true, + ["tr_int2_railing"] = true, + ["tr_int2_rails"] = true, + ["tr_int2_rails_new"] = true, + ["tr_int2_rebar_decals"] = true, + ["tr_int2_round_column"] = true, + ["tr_int2_rusty_pipes"] = true, + ["tr_int2_rusty_pipes_02"] = true, + ["tr_int2_rusty_pipes_03"] = true, + ["tr_int2_rusty_pipes_04"] = true, + ["tr_int2_rusty_pipes_05"] = true, + ["tr_int2_rusty_pipes_06"] = true, + ["tr_int2_rusty_pipes_07"] = true, + ["tr_int2_rusty_pipes_08"] = true, + ["tr_int2_rusty_pipes_10"] = true, + ["tr_int2_sandbox_barrier"] = true, + ["tr_int2_sandbox_collision_proxy"] = true, + ["tr_int2_sandbox_signage"] = true, + ["tr_int2_sb_structure"] = true, + ["tr_int2_scores"] = true, + ["tr_int2_scuff_decals"] = true, + ["tr_int2_shell"] = true, + ["tr_int2_shell_blends"] = true, + ["tr_int2_skidders"] = true, + ["tr_int2_sliding_door_003"] = true, + ["tr_int2_sliding_door_004"] = true, + ["tr_int2_sliding_door_01"] = true, + ["tr_int2_sliding_door_02"] = true, + ["tr_int2_start_spot"] = true, + ["tr_int2_tats_n_sht"] = true, + ["tr_int2_track_lines"] = true, + ["tr_int2_turn_marks"] = true, + ["tr_int2_view_rm1_decals"] = true, + ["tr_int2_view_rm1_details"] = true, + ["tr_int2_view_rm2_decals"] = true, + ["tr_int2_wee_stanes"] = true, + ["tr_int4_blends"] = true, + ["tr_int4_conduit"] = true, + ["tr_int4_details"] = true, + ["tr_int4_door"] = true, + ["tr_int4_hiddenshell"] = true, + ["tr_int4_methkit_bas_decals"] = true, + ["tr_int4_methkit_basic"] = true, + ["tr_int4_methkit_lightproxy"] = true, + ["tr_int4_methkit_set_decals"] = true, + ["tr_int4_methkit_set_details"] = true, + ["tr_int4_misc_details"] = true, + ["tr_int4_racks"] = true, + ["tr_int4_shell"] = true, + ["tr_int4_sidewindd"] = true, + ["tr_int4_structure_cs"] = true, + ["tr_int4_structure_ns"] = true, + ["tr_p_para_bag_tr_s_01a"] = true, + ["tr_prop_biker_tool_broom"] = true, + ["tr_prop_meth_acetone"] = true, + ["tr_prop_meth_ammonia"] = true, + ["tr_prop_meth_bigbag_01a"] = true, + ["tr_prop_meth_bigbag_02a"] = true, + ["tr_prop_meth_bigbag_03a"] = true, + ["tr_prop_meth_bigbag_04a"] = true, + ["tr_prop_meth_chiller_01a"] = true, + ["tr_prop_meth_hcacid"] = true, + ["tr_prop_meth_lithium"] = true, + ["tr_prop_meth_openbag_01a"] = true, + ["tr_prop_meth_openbag_01a_frag_"] = true, + ["tr_prop_meth_openbag_02"] = true, + ["tr_prop_meth_pallet_01a"] = true, + ["tr_prop_meth_phosphorus"] = true, + ["tr_prop_meth_pseudoephedrine"] = true, + ["tr_prop_meth_sacid"] = true, + ["tr_prop_meth_scoop_01a"] = true, + ["tr_prop_meth_smallbag_01a"] = true, + ["tr_prop_meth_smashedtray_01"] = true, + ["tr_prop_meth_smashedtray_01_frag_"] = true, + ["tr_prop_meth_smashedtray_02"] = true, + ["tr_prop_meth_sodium"] = true, + ["tr_prop_meth_table01a"] = true, + ["tr_prop_meth_toulene"] = true, + ["tr_prop_meth_tray_01a"] = true, + ["tr_prop_meth_tray_01b"] = true, + ["tr_prop_meth_tray_02a"] = true, + ["tr_prop_scriptrt_crew_logo01a"] = true, + ["tr_prop_scriptrt_hood"] = true, + ["tr_prop_scriptrt_style8"] = true, + ["tr_prop_scriptrt_style8_sticker_l"] = true, + ["tr_prop_scriptrt_style8_sticker_m"] = true, + ["tr_prop_scriptrt_style8_sticker_s"] = true, + ["tr_prop_scriptrt_style8x"] = true, + ["tr_prop_scriptrt_table"] = true, + ["tr_prop_scriptrt_table01a"] = true, + ["tr_prop_tr_acc_pass_01a"] = true, + ["tr_prop_tr_adv_case_01a"] = true, + ["tr_prop_tr_bag_bombs_01a"] = true, + ["tr_prop_tr_bag_clothing_01a"] = true, + ["tr_prop_tr_bag_djlp_01a"] = true, + ["tr_prop_tr_bag_flipjam_01a"] = true, + ["tr_prop_tr_bag_grinder_01a"] = true, + ["tr_prop_tr_bag_thermite_01a"] = true, + ["tr_prop_tr_blueprt_01a"] = true, + ["tr_prop_tr_boat_wreck_01a"] = true, + ["tr_prop_tr_break_dev_01a"] = true, + ["tr_prop_tr_cabine_01a"] = true, + ["tr_prop_tr_camhedz_01a"] = true, + ["tr_prop_tr_camhedz_01a_screen_p1"] = true, + ["tr_prop_tr_camhedz_01a_screen_p2"] = true, + ["tr_prop_tr_camhedz_cctv_01a"] = true, + ["tr_prop_tr_car_keys_01a"] = true, + ["tr_prop_tr_car_lift_01a"] = true, + ["tr_prop_tr_carry_box_01a"] = true, + ["tr_prop_tr_cctv_cam_01a"] = true, + ["tr_prop_tr_cctv_wall_atta_01a"] = true, + ["tr_prop_tr_chair_01a"] = true, + ["tr_prop_tr_chest_01a"] = true, + ["tr_prop_tr_clipboard_sh_01a"] = true, + ["tr_prop_tr_clipboard_ta_01a"] = true, + ["tr_prop_tr_clipboard_tr_01a"] = true, + ["tr_prop_tr_coke_powder_01a"] = true, + ["tr_prop_tr_cont_coll_01a"] = true, + ["tr_prop_tr_container_01a"] = true, + ["tr_prop_tr_container_01b"] = true, + ["tr_prop_tr_container_01c"] = true, + ["tr_prop_tr_container_01d"] = true, + ["tr_prop_tr_container_01e"] = true, + ["tr_prop_tr_container_01f"] = true, + ["tr_prop_tr_container_01g"] = true, + ["tr_prop_tr_container_01h"] = true, + ["tr_prop_tr_container_01i"] = true, + ["tr_prop_tr_control_unit_01a"] = true, + ["tr_prop_tr_corp_servercln_01a"] = true, + ["tr_prop_tr_crates_sam_01a"] = true, + ["tr_prop_tr_dd_necklace_01a"] = true, + ["tr_prop_tr_desk_main_01a"] = true, + ["tr_prop_tr_door2"] = true, + ["tr_prop_tr_door3"] = true, + ["tr_prop_tr_door4"] = true, + ["tr_prop_tr_door5"] = true, + ["tr_prop_tr_door6"] = true, + ["tr_prop_tr_door7"] = true, + ["tr_prop_tr_door8"] = true, + ["tr_prop_tr_door9"] = true, + ["tr_prop_tr_elecbox_01a"] = true, + ["tr_prop_tr_elecbox_23"] = true, + ["tr_prop_tr_facility_glass_01j"] = true, + ["tr_prop_tr_file_cylinder_01a"] = true, + ["tr_prop_tr_files_paper_01b"] = true, + ["tr_prop_tr_finish_line_01a"] = true, + ["tr_prop_tr_flag_01a"] = true, + ["tr_prop_tr_flipjam_01a"] = true, + ["tr_prop_tr_flipjam_01b"] = true, + ["tr_prop_tr_folder_mc_01a"] = true, + ["tr_prop_tr_fp_scanner_01a"] = true, + ["tr_prop_tr_fuse_box_01a"] = true, + ["tr_prop_tr_gate_l_01a"] = true, + ["tr_prop_tr_gate_r_01a"] = true, + ["tr_prop_tr_grinder_01a"] = true, + ["tr_prop_tr_iaa_base_door_01a"] = true, + ["tr_prop_tr_iaa_door_01a"] = true, + ["tr_prop_tr_ilev_gb_vaubar_01a"] = true, + ["tr_prop_tr_laptop_jimmy"] = true, + ["tr_prop_tr_light_ceiling_01a"] = true, + ["tr_prop_tr_lightbox_01a"] = true, + ["tr_prop_tr_lock_01a"] = true, + ["tr_prop_tr_med_table_01a"] = true, + ["tr_prop_tr_meet_coll_01"] = true, + ["tr_prop_tr_mil_crate_02"] = true, + ["tr_prop_tr_military_pickup_01a"] = true, + ["tr_prop_tr_mod_lframe_01a"] = true, + ["tr_prop_tr_monitor_01a"] = true, + ["tr_prop_tr_monitor_01b"] = true, + ["tr_prop_tr_mule_ms_01a"] = true, + ["tr_prop_tr_mule_mt_01a"] = true, + ["tr_prop_tr_note_rolled_01a"] = true, + ["tr_prop_tr_notice_01a"] = true, + ["tr_prop_tr_officedesk_01a"] = true, + ["tr_prop_tr_para_sp_s_01a"] = true, + ["tr_prop_tr_photo_car_01a"] = true, + ["tr_prop_tr_pile_dirt_01a"] = true, + ["tr_prop_tr_planning_board_01a"] = true, + ["tr_prop_tr_plate_sweets_01a"] = true, + ["tr_prop_tr_races_barrel_01a"] = true, + ["tr_prop_tr_ramp_01a"] = true, + ["tr_prop_tr_roller_door_01a"] = true, + ["tr_prop_tr_roller_door_02a"] = true, + ["tr_prop_tr_roller_door_03a"] = true, + ["tr_prop_tr_roller_door_04a"] = true, + ["tr_prop_tr_roller_door_05a"] = true, + ["tr_prop_tr_roller_door_06a"] = true, + ["tr_prop_tr_roller_door_07a"] = true, + ["tr_prop_tr_roller_door_08a"] = true, + ["tr_prop_tr_roller_door_09a"] = true, + ["tr_prop_tr_sand_01a"] = true, + ["tr_prop_tr_sand_01b"] = true, + ["tr_prop_tr_sand_cs_01a"] = true, + ["tr_prop_tr_sand_cs_01b"] = true, + ["tr_prop_tr_scrn_phone_01a"] = true, + ["tr_prop_tr_scrn_phone_01b"] = true, + ["tr_prop_tr_ser_storage_01a"] = true, + ["tr_prop_tr_serv_tu_light3"] = true, + ["tr_prop_tr_serv_tu_light4"] = true, + ["tr_prop_tr_sign_gf_ll_01a"] = true, + ["tr_prop_tr_sign_gf_lr_01a"] = true, + ["tr_prop_tr_sign_gf_ls_01a"] = true, + ["tr_prop_tr_sign_gf_lul_01a"] = true, + ["tr_prop_tr_sign_gf_lur_01a"] = true, + ["tr_prop_tr_sign_gf_ml_01a"] = true, + ["tr_prop_tr_sign_gf_mr_01a"] = true, + ["tr_prop_tr_sign_gf_ms_01a"] = true, + ["tr_prop_tr_sign_gf_mul_01a"] = true, + ["tr_prop_tr_sign_gf_mur_01a"] = true, + ["tr_prop_tr_skidmark_01a"] = true, + ["tr_prop_tr_skidmark_01b"] = true, + ["tr_prop_tr_skip_ramp_01a"] = true, + ["tr_prop_tr_start_grid_01a"] = true, + ["tr_prop_tr_swipe_card_01a"] = true, + ["tr_prop_tr_table_vault_01a"] = true, + ["tr_prop_tr_table_vault_01b"] = true, + ["tr_prop_tr_tampa2"] = true, + ["tr_prop_tr_trailer_ramp_01a"] = true, + ["tr_prop_tr_tripod_lamp_01a"] = true, + ["tr_prop_tr_trophy_camhedz_01a"] = true, + ["tr_prop_tr_truktrailer_01a"] = true, + ["tr_prop_tr_tyre_wall_u_l"] = true, + ["tr_prop_tr_tyre_wall_u_r"] = true, + ["tr_prop_tr_usb_drive_01a"] = true, + ["tr_prop_tr_usb_drive_02a"] = true, + ["tr_prop_tr_v_door_disp_01a"] = true, + ["tr_prop_tr_van_ts_01a"] = true, + ["tr_prop_tr_wall_sign_01"] = true, + ["tr_prop_tr_wall_sign_01_b"] = true, + ["tr_prop_tr_wall_sign_0l1"] = true, + ["tr_prop_tr_wall_sign_0l1_b"] = true, + ["tr_prop_tr_wall_sign_0r1"] = true, + ["tr_prop_tr_wall_sign_0r1_b"] = true, + ["tr_prop_tr_worklight_03b"] = true, + ["tr_prop_tr_wpncamhedz_01a"] = true, + ["tr_prop_wall_light_02a"] = true, + ["tr_sc1_02_tuner__combo_01_lod"] = true, + ["tr_sc1_02_tuner__combo_slod"] = true, + ["tr_sc1_02_tuner_ground_hd"] = true, + ["tr_sc1_02_tuner_hd"] = true, + ["tr_sc1_02_tuner_lod"] = true, + ["tr_sc1_02_tuner_slod"] = true, + ["tr_sc1_28_tuner_hd"] = true, + ["tr_sc1_28_tuner_lod"] = true, + ["tr_sc1_28_tuner_slod"] = true, + ["tr_ss1_05_tuner_02_hd"] = true, + ["tr_ss1_05_tuner_02_lod"] = true, + ["tr_ss1_05_tuner_hd"] = true, + ["tr_ss1_05_tuner_lod"] = true, + ["tr_ss1_05_tuner_slod"] = true, + ["urbandryfrnds_01"] = true, + ["urbandrygrass_01"] = true, + ["urbangrnfrnds_01"] = true, + ["urbangrngrass_01"] = true, + ["urbanweeds01"] = true, + ["urbanweeds01_l1"] = true, + ["urbanweeds02"] = true, + ["v_11__abbconang1"] = true, + ["v_11__abbmetdoors"] = true, + ["v_11__abbprodover"] = true, + ["v_11_ab_dirty"] = true, + ["v_11_ab_pipes"] = true, + ["v_11_ab_pipes001"] = true, + ["v_11_ab_pipes002"] = true, + ["v_11_ab_pipes003"] = true, + ["v_11_ab_pipesfrnt"] = true, + ["v_11_abalphook001"] = true, + ["v_11_abarmsupp"] = true, + ["v_11_abattoirshadprox"] = true, + ["v_11_abattoirshell"] = true, + ["v_11_abattoirsubshell"] = true, + ["v_11_abattoirsubshell2"] = true, + ["v_11_abattoirsubshell3"] = true, + ["v_11_abattoirsubshell4"] = true, + ["v_11_abattpens"] = true, + ["v_11_abb_repipes"] = true, + ["v_11_abbabits01"] = true, + ["v_11_abbbetlights"] = true, + ["v_11_abbbetlights_day"] = true, + ["v_11_abbbigconv1"] = true, + ["v_11_abbcattlehooist"] = true, + ["v_11_abbconduit"] = true, + ["v_11_abbcoofence"] = true, + ["v_11_abbcorrishad"] = true, + ["v_11_abbcorrsigns"] = true, + ["v_11_abbdangles"] = true, + ["v_11_abbdoorstop"] = true, + ["v_11_abbebtsigns"] = true, + ["v_11_abbendsigns"] = true, + ["v_11_abbexitoverlays"] = true, + ["v_11_abbgate"] = true, + ["v_11_abbhosethings"] = true, + ["v_11_abbinbeplat"] = true, + ["v_11_abbleeddrains"] = true, + ["v_11_abbmain1_stuts"] = true, + ["v_11_abbmain2_dirt"] = true, + ["v_11_abbmain2_rails"] = true, + ["v_11_abbmain3_rails"] = true, + ["v_11_abbmain3bits"] = true, + ["v_11_abbmainbit1pipes"] = true, + ["v_11_abbmeatchunks001"] = true, + ["v_11_abbmnrmshad1"] = true, + ["v_11_abbmnrmshad2"] = true, + ["v_11_abbmnrmshad3"] = true, + ["v_11_abbnardirt"] = true, + ["v_11_abbnearenddirt"] = true, + ["v_11_abboffovers"] = true, + ["v_11_abbpordshadroom"] = true, + ["v_11_abbprodbig"] = true, + ["v_11_abbproddirt"] = true, + ["v_11_abbprodlit"] = true, + ["v_11_abbprodplats2"] = true, + ["v_11_abbrack1"] = true, + ["v_11_abbrack2"] = true, + ["v_11_abbrack3"] = true, + ["v_11_abbrack4"] = true, + ["v_11_abbreargirds"] = true, + ["v_11_abbrodovers"] = true, + ["v_11_abbrolldorrswitch"] = true, + ["v_11_abbrolldors"] = true, + ["v_11_abbseams1"] = true, + ["v_11_abbslaugbld"] = true, + ["v_11_abbslaugdirt"] = true, + ["v_11_abbslaughtdrains"] = true, + ["v_11_abbslaughtshad"] = true, + ["v_11_abbslaughtshad2"] = true, + ["v_11_abbslausigns"] = true, + ["v_11_abbtops1"] = true, + ["v_11_abbtops2"] = true, + ["v_11_abbtops3"] = true, + ["v_11_abbwins"] = true, + ["v_11_abcattlegirds"] = true, + ["v_11_abcattlights"] = true, + ["v_11_abcattlightsent"] = true, + ["v_11_abcoolershad"] = true, + ["v_11_abinbetbeams"] = true, + ["v_11_abmatinbet"] = true, + ["v_11_abmeatbandsaw"] = true, + ["v_11_aboffal"] = true, + ["v_11_aboffplatfrm"] = true, + ["v_11_abplastipsprod"] = true, + ["v_11_abplatmovecop1"] = true, + ["v_11_abplatmoveinbet"] = true, + ["v_11_abplatstatic"] = true, + ["v_11_abprodbeams"] = true, + ["v_11_abseamsmain"] = true, + ["v_11_abskinpull"] = true, + ["v_11_abslaughmats"] = true, + ["v_11_abslauplat"] = true, + ["v_11_abslughtbeams"] = true, + ["v_11_abstrthooks"] = true, + ["v_11_backrails"] = true, + ["v_11_beefheaddropper"] = true, + ["v_11_beefheaddroppermn"] = true, + ["v_11_beefsigns"] = true, + ["v_11_bleederstep"] = true, + ["v_11_blufrocksign"] = true, + ["v_11_cooheidrack"] = true, + ["v_11_cooheidrack001"] = true, + ["v_11_coolblood001"] = true, + ["v_11_cooler_drs"] = true, + ["v_11_coolerrack001"] = true, + ["v_11_coolgirdsvest"] = true, + ["v_11_crseloadpmp1"] = true, + ["v_11_de-hidebeam"] = true, + ["v_11_endoffbits"] = true, + ["v_11_hangslughshp"] = true, + ["v_11_headlopperplatform"] = true, + ["v_11_jointracksect"] = true, + ["v_11_leccybox"] = true, + ["v_11_mainarms"] = true, + ["v_11_mainbitrolldoor"] = true, + ["v_11_mainbitrolldoor2"] = true, + ["v_11_maindrainover"] = true, + ["v_11_manrmsupps"] = true, + ["v_11_meatinbetween"] = true, + ["v_11_meatmain"] = true, + ["v_11_metplate"] = true, + ["v_11_midoffbuckets"] = true, + ["v_11_midrackingsection"] = true, + ["v_11_mincertrolley"] = true, + ["v_11_prod_wheel_hooks"] = true, + ["v_11_prodflrmeat"] = true, + ["v_11_producemeat"] = true, + ["v_11_rack_signs"] = true, + ["v_11_rack_signsblu"] = true, + ["v_11_sheephumperlight"] = true, + ["v_11_slaughtbox"] = true, + ["v_11_stungun"] = true, + ["v_11_stungun001"] = true, + ["v_11_wincharm"] = true, + ["v_16_ap_hi_pants1"] = true, + ["v_16_ap_hi_pants2"] = true, + ["v_16_ap_hi_pants3"] = true, + ["v_16_ap_hi_pants4"] = true, + ["v_16_ap_hi_pants5"] = true, + ["v_16_ap_hi_pants6"] = true, + ["v_16_ap_mid_pants1"] = true, + ["v_16_ap_mid_pants2"] = true, + ["v_16_ap_mid_pants3"] = true, + ["v_16_ap_mid_pants4"] = true, + ["v_16_ap_mid_pants5"] = true, + ["v_16_barglow"] = true, + ["v_16_barglow001"] = true, + ["v_16_barglownight"] = true, + ["v_16_basketball"] = true, + ["v_16_bathemon"] = true, + ["v_16_bathmirror"] = true, + ["v_16_bathstuff"] = true, + ["v_16_bdr_mesh_bed"] = true, + ["v_16_bdrm_mesh_bath"] = true, + ["v_16_bdrm_paintings002"] = true, + ["v_16_bed_mesh_blinds"] = true, + ["v_16_bed_mesh_delta"] = true, + ["v_16_bed_mesh_windows"] = true, + ["v_16_bedrmemon"] = true, + ["v_16_bookend"] = true, + ["v_16_dnr_a"] = true, + ["v_16_dnr_c"] = true, + ["v_16_dt"] = true, + ["v_16_fh_sidebrdlngb_rsref001"] = true, + ["v_16_frankcable"] = true, + ["v_16_frankcurtain1"] = true, + ["v_16_frankstuff"] = true, + ["v_16_frankstuff_noshad"] = true, + ["v_16_frankstuff003"] = true, + ["v_16_frankstuff004"] = true, + ["v_16_goldrecords"] = true, + ["v_16_hi_apt_planningrmstf"] = true, + ["v_16_hi_apt_s_books"] = true, + ["v_16_hi_studdorrtrim"] = true, + ["v_16_hifi"] = true, + ["v_16_high_bath_delta"] = true, + ["v_16_high_bath_mesh_mirror"] = true, + ["v_16_high_bath_over_normals"] = true, + ["v_16_high_bath_over_shadow"] = true, + ["v_16_high_bath_showerdoor"] = true, + ["v_16_high_bed_mesh_lights"] = true, + ["v_16_high_bed_mesh_unit"] = true, + ["v_16_high_bed_over_dirt"] = true, + ["v_16_high_bed_over_normal"] = true, + ["v_16_high_bed_over_shadow"] = true, + ["v_16_high_hal_mesh_plant"] = true, + ["v_16_high_hall_mesh_delta"] = true, + ["v_16_high_hall_over_dirt"] = true, + ["v_16_high_hall_over_normal"] = true, + ["v_16_high_hall_over_shadow"] = true, + ["v_16_high_kit_mesh_unit"] = true, + ["v_16_high_ktn_mesh_delta"] = true, + ["v_16_high_ktn_mesh_fire"] = true, + ["v_16_high_ktn_mesh_windows"] = true, + ["v_16_high_ktn_over_decal"] = true, + ["v_16_high_ktn_over_shadow"] = true, + ["v_16_high_ktn_over_shadows"] = true, + ["v_16_high_lng_armchairs"] = true, + ["v_16_high_lng_details"] = true, + ["v_16_high_lng_mesh_delta"] = true, + ["v_16_high_lng_mesh_plant"] = true, + ["v_16_high_lng_mesh_shelf"] = true, + ["v_16_high_lng_mesh_tvunit"] = true, + ["v_16_high_lng_over_shadow"] = true, + ["v_16_high_lng_over_shadow2"] = true, + ["v_16_high_plan_mesh_delta"] = true, + ["v_16_high_plan_over_normal"] = true, + ["v_16_high_pln_m_map"] = true, + ["v_16_high_pln_mesh_lights"] = true, + ["v_16_high_pln_over_shadow"] = true, + ["v_16_high_stp_mesh_unit"] = true, + ["v_16_high_ward_over_decal"] = true, + ["v_16_high_ward_over_normal"] = true, + ["v_16_high_ward_over_shadow"] = true, + ["v_16_highstudwalldirt"] = true, + ["v_16_hiigh_ktn_over_normal"] = true, + ["v_16_ironwork"] = true, + ["v_16_knt_c"] = true, + ["v_16_knt_f"] = true, + ["v_16_knt_mesh_stuff"] = true, + ["v_16_lgb_mesh_lngprop"] = true, + ["v_16_lgb_rock001"] = true, + ["v_16_livstuff003"] = true, + ["v_16_livstuff00k2"] = true, + ["v_16_lnb_mesh_coffee"] = true, + ["v_16_lnb_mesh_tablecenter001"] = true, + ["v_16_lng_mesh_blinds"] = true, + ["v_16_lng_mesh_delta"] = true, + ["v_16_lng_mesh_stairglass"] = true, + ["v_16_lng_mesh_stairglassb"] = true, + ["v_16_lng_mesh_windows"] = true, + ["v_16_lng_over_normal"] = true, + ["v_16_lngas_mesh_delta003"] = true, + ["v_16_lo_shower"] = true, + ["v_16_low_bath_mesh_window"] = true, + ["v_16_low_bath_over_decal"] = true, + ["v_16_low_bed_over_decal"] = true, + ["v_16_low_bed_over_normal"] = true, + ["v_16_low_bed_over_shadow"] = true, + ["v_16_low_ktn_mesh_sideboard"] = true, + ["v_16_low_ktn_mesh_units"] = true, + ["v_16_low_ktn_over_decal"] = true, + ["v_16_low_lng_mesh_armchair"] = true, + ["v_16_low_lng_mesh_coffeetable"] = true, + ["v_16_low_lng_mesh_fireplace"] = true, + ["v_16_low_lng_mesh_plant"] = true, + ["v_16_low_lng_mesh_rugs"] = true, + ["v_16_low_lng_mesh_sidetable"] = true, + ["v_16_low_lng_mesh_sofa1"] = true, + ["v_16_low_lng_mesh_sofa2"] = true, + ["v_16_low_lng_mesh_tv"] = true, + ["v_16_low_lng_over_decal"] = true, + ["v_16_low_lng_over_normal"] = true, + ["v_16_low_lng_over_shadow"] = true, + ["v_16_low_mesh_lng_shelf"] = true, + ["v_16_mags"] = true, + ["v_16_mesh_delta"] = true, + ["v_16_mesh_shell"] = true, + ["v_16_mid_bath_mesh_delta"] = true, + ["v_16_mid_bath_mesh_mirror"] = true, + ["v_16_mid_bed_bed"] = true, + ["v_16_mid_bed_delta"] = true, + ["v_16_mid_bed_over_decal"] = true, + ["v_16_mid_hall_mesh_delta"] = true, + ["v_16_mid_shell"] = true, + ["v_16_midapartdeta"] = true, + ["v_16_midapt_cabinet"] = true, + ["v_16_midapt_curts"] = true, + ["v_16_midapt_deca"] = true, + ["v_16_molding01"] = true, + ["v_16_mpmidapart00"] = true, + ["v_16_mpmidapart01"] = true, + ["v_16_mpmidapart018"] = true, + ["v_16_mpmidapart03"] = true, + ["v_16_mpmidapart07"] = true, + ["v_16_mpmidapart09"] = true, + ["v_16_mpmidapart13"] = true, + ["v_16_mpmidapart17"] = true, + ["v_16_rpt_mesh_pictures"] = true, + ["v_16_rpt_mesh_pictures003"] = true, + ["v_16_shadowobject69"] = true, + ["v_16_shadsy"] = true, + ["v_16_shitbench"] = true, + ["v_16_skateboard"] = true, + ["v_16_strsdet01"] = true, + ["v_16_studapart00"] = true, + ["v_16_studframe"] = true, + ["v_16_studio_loshell"] = true, + ["v_16_studio_pants1"] = true, + ["v_16_studio_pants2"] = true, + ["v_16_studio_pants3"] = true, + ["v_16_studio_skirt"] = true, + ["v_16_studio_slip1"] = true, + ["v_16_studposters"] = true, + ["v_16_studunits"] = true, + ["v_16_study_rug"] = true, + ["v_16_study_sofa"] = true, + ["v_16_treeglow"] = true, + ["v_16_treeglow001"] = true, + ["v_16_v_1_studapart02"] = true, + ["v_16_v_sofa"] = true, + ["v_16_vint1_multilow02"] = true, + ["v_16_wardrobe"] = true, + ["v_19_babr_neon"] = true, + ["v_19_bar_speccy"] = true, + ["v_19_bubbles"] = true, + ["v_19_changeshadsmain"] = true, + ["v_19_corridor_bits"] = true, + ["v_19_curts"] = true, + ["v_19_dirtframes_ent"] = true, + ["v_19_dtrpsbitsmore"] = true, + ["v_19_ducts"] = true, + ["v_19_fishy_coral"] = true, + ["v_19_fishy_coral2"] = true, + ["v_19_jakemenneon"] = true, + ["v_19_jetceilights"] = true, + ["v_19_jetchangebits"] = true, + ["v_19_jetchangerail"] = true, + ["v_19_jetchnceistuff"] = true, + ["v_19_jetchngwrkcrd"] = true, + ["v_19_jetdado"] = true, + ["v_19_jetdncflrlights"] = true, + ["v_19_jetstripceilpan"] = true, + ["v_19_jetstripceilpan2"] = true, + ["v_19_jetstrpstge"] = true, + ["v_19_maindressingstuff"] = true, + ["v_19_office_trim"] = true, + ["v_19_orifice_light"] = true, + ["v_19_payboothtrim"] = true, + ["v_19_premium2"] = true, + ["v_19_priv_bits"] = true, + ["v_19_priv_shads"] = true, + ["v_19_stp3fistank"] = true, + ["v_19_stplightspriv"] = true, + ["v_19_stpprvrmpics"] = true, + ["v_19_stri3litstps"] = true, + ["v_19_strip_off_overs"] = true, + ["v_19_strip_stickers"] = true, + ["v_19_strip3pole"] = true, + ["v_19_stripbootbits"] = true, + ["v_19_stripbooths"] = true, + ["v_19_stripchangemirror"] = true, + ["v_19_stripduct"] = true, + ["v_19_stripduct2"] = true, + ["v_19_strmncrt1"] = true, + ["v_19_strmncrt2"] = true, + ["v_19_strmncrt3"] = true, + ["v_19_strmncrt4"] = true, + ["v_19_strp_offbits"] = true, + ["v_19_strp_rig"] = true, + ["v_19_strp3mirrors"] = true, + ["v_19_strpbar"] = true, + ["v_19_strpbarrier"] = true, + ["v_19_strpchngover1"] = true, + ["v_19_strpchngover2"] = true, + ["v_19_strpdjbarr"] = true, + ["v_19_strpdrfrm1"] = true, + ["v_19_strpdrfrm2"] = true, + ["v_19_strpdrfrm3"] = true, + ["v_19_strpdrfrm4"] = true, + ["v_19_strpdrfrm5"] = true, + ["v_19_strpdrfrm6"] = true, + ["v_19_strpentlites"] = true, + ["v_19_strpfrntpl"] = true, + ["v_19_strpmncled"] = true, + ["v_19_strpprivlits"] = true, + ["v_19_strpprvrmcrt003"] = true, + ["v_19_strpprvrmcrt004"] = true, + ["v_19_strpprvrmcrt005"] = true, + ["v_19_strpprvrmcrt006"] = true, + ["v_19_strpprvrmcrt007"] = true, + ["v_19_strpprvrmcrt008"] = true, + ["v_19_strpprvrmcrt009"] = true, + ["v_19_strpprvrmcrt010"] = true, + ["v_19_strpprvrmcrt011"] = true, + ["v_19_strpprvrmcrt012"] = true, + ["v_19_strpprvrmcrt013"] = true, + ["v_19_strpprvrmcrt014"] = true, + ["v_19_strpprvrmcrt015"] = true, + ["v_19_strpprvrmcrt016"] = true, + ["v_19_strpprvrmcrt1"] = true, + ["v_19_strpprvrmcrt2"] = true, + ["v_19_strprvrmgdbits"] = true, + ["v_19_strpshell"] = true, + ["v_19_strpshellref"] = true, + ["v_19_strpstgecurt1"] = true, + ["v_19_strpstgecurt2"] = true, + ["v_19_strpstglt"] = true, + ["v_19_strpstgtrm"] = true, + ["v_19_strpstrplit"] = true, + ["v_19_trev_stuff"] = true, + ["v_19_trev_stuff1"] = true, + ["v_19_vabbarcables"] = true, + ["v_19_vanbckofftrim"] = true, + ["v_19_vanchngfacings"] = true, + ["v_19_vanchngfcngfrst"] = true, + ["v_19_vangroundover"] = true, + ["v_19_vanilla_sign_neon"] = true, + ["v_19_vanillasigneon"] = true, + ["v_19_vanillasigneon2"] = true, + ["v_19_vanlobsigns"] = true, + ["v_19_vanmainsectdirt"] = true, + ["v_19_vanmenuplain"] = true, + ["v_19_vannuisigns"] = true, + ["v_19_vanshadmainrm"] = true, + ["v_19_vanstageshads"] = true, + ["v_19_vanuniwllart"] = true, + ["v_19_vanunofflights"] = true, + ["v_19_weebitstuff"] = true, + ["v_24_5"] = true, + ["v_24_bdr_mesh_bed"] = true, + ["v_24_bdr_mesh_bed_stuff"] = true, + ["v_24_bdr_mesh_delta"] = true, + ["v_24_bdr_mesh_lamp"] = true, + ["v_24_bdr_mesh_lstshirt"] = true, + ["v_24_bdr_mesh_windows_closed"] = true, + ["v_24_bdr_mesh_windows_open"] = true, + ["v_24_bdr_over_decal"] = true, + ["v_24_bdr_over_dirt"] = true, + ["v_24_bdr_over_emmisve"] = true, + ["v_24_bdr_over_normal"] = true, + ["v_24_bdr_over_shadow"] = true, + ["v_24_bdr_over_shadow_boxes"] = true, + ["v_24_bdr_over_shadow_frank"] = true, + ["v_24_bdrm_mesh_arta"] = true, + ["v_24_bdrm_mesh_bath"] = true, + ["v_24_bdrm_mesh_bathprops"] = true, + ["v_24_bdrm_mesh_bookcase"] = true, + ["v_24_bdrm_mesh_bookcasestuff"] = true, + ["v_24_bdrm_mesh_boxes"] = true, + ["v_24_bdrm_mesh_closetdoors"] = true, + ["v_24_bdrm_mesh_dresser"] = true, + ["v_24_bdrm_mesh_mags"] = true, + ["v_24_bdrm_mesh_mirror"] = true, + ["v_24_bdrm_mesh_picframes"] = true, + ["v_24_bdrm_mesh_rugs"] = true, + ["v_24_bdrm_mesh_wallshirts"] = true, + ["v_24_bedroomshell"] = true, + ["v_24_details1"] = true, + ["v_24_details2"] = true, + ["v_24_hal_mesh_delta"] = true, + ["v_24_hal_mesh_props"] = true, + ["v_24_hal_over_decal"] = true, + ["v_24_hal_over_normal"] = true, + ["v_24_hal_over_shadow"] = true, + ["v_24_hangingclothes"] = true, + ["v_24_hangingclothes1"] = true, + ["v_24_knt_mesh_blindl"] = true, + ["v_24_knt_mesh_blindr"] = true, + ["v_24_knt_mesh_boxes"] = true, + ["v_24_knt_mesh_center"] = true, + ["v_24_knt_mesh_delta"] = true, + ["v_24_knt_mesh_flyer"] = true, + ["v_24_knt_mesh_mags"] = true, + ["v_24_knt_mesh_stuff"] = true, + ["v_24_knt_mesh_units"] = true, + ["v_24_knt_mesh_windowb2"] = true, + ["v_24_knt_mesh_windowsa"] = true, + ["v_24_knt_over_decal"] = true, + ["v_24_knt_over_normal"] = true, + ["v_24_knt_over_shadow"] = true, + ["v_24_knt_over_shadow_boxes"] = true, + ["v_24_knt_over_shelf"] = true, + ["v_24_ktn_over_dirt"] = true, + ["v_24_lga_mesh_blinds1"] = true, + ["v_24_lga_mesh_blinds2"] = true, + ["v_24_lga_mesh_delta"] = true, + ["v_24_lga_mesh_delta1"] = true, + ["v_24_lga_mesh_delta2"] = true, + ["v_24_lga_mesh_delta3"] = true, + ["v_24_lga_mesh_delta4"] = true, + ["v_24_lga_over_dirt"] = true, + ["v_24_lga_over_normal"] = true, + ["v_24_lga_over_shadow"] = true, + ["v_24_lgb_mesh_bottomdelta"] = true, + ["v_24_lgb_mesh_fire"] = true, + ["v_24_lgb_mesh_lngprop"] = true, + ["v_24_lgb_mesh_sideboard"] = true, + ["v_24_lgb_mesh_sideboard_em"] = true, + ["v_24_lgb_mesh_sideprops"] = true, + ["v_24_lgb_mesh_sofa"] = true, + ["v_24_lgb_mesh_topdelta"] = true, + ["v_24_lgb_over_dirt"] = true, + ["v_24_llga_mesh_coffeetable"] = true, + ["v_24_llga_mesh_props"] = true, + ["v_24_lna_mesh_win1"] = true, + ["v_24_lna_mesh_win2"] = true, + ["v_24_lna_mesh_win3"] = true, + ["v_24_lna_mesh_win4"] = true, + ["v_24_lna_stair_window"] = true, + ["v_24_lnb_coffeestuff"] = true, + ["v_24_lnb_mesh_artwork"] = true, + ["v_24_lnb_mesh_books"] = true, + ["v_24_lnb_mesh_cddecks"] = true, + ["v_24_lnb_mesh_coffee"] = true, + ["v_24_lnb_mesh_djdecks"] = true, + ["v_24_lnb_mesh_dvds"] = true, + ["v_24_lnb_mesh_fireglass"] = true, + ["v_24_lnb_mesh_goldrecords"] = true, + ["v_24_lnb_mesh_lightceiling"] = true, + ["v_24_lnb_mesh_records"] = true, + ["v_24_lnb_mesh_sideboard"] = true, + ["v_24_lnb_mesh_smallvase"] = true, + ["v_24_lnb_mesh_tablecenter"] = true, + ["v_24_lnb_mesh_windows"] = true, + ["v_24_lnb_over_disk_shadow"] = true, + ["v_24_lnb_over_shadow"] = true, + ["v_24_lnb_over_shadow_boxes"] = true, + ["v_24_lng_over_decal"] = true, + ["v_24_lng_over_normal"] = true, + ["v_24_lngb_mesh_boxes"] = true, + ["v_24_lngb_mesh_chopbed"] = true, + ["v_24_lngb_mesh_mags"] = true, + ["v_24_postertubes"] = true, + ["v_24_rct_lamptablestuff"] = true, + ["v_24_rct_mesh_boxes"] = true, + ["v_24_rct_mesh_lamptable"] = true, + ["v_24_rct_over_decal"] = true, + ["v_24_rec_mesh_palnt"] = true, + ["v_24_rpt_mesh_delta"] = true, + ["v_24_rpt_mesh_pictures"] = true, + ["v_24_rpt_over_normal"] = true, + ["v_24_rpt_over_shadow"] = true, + ["v_24_rpt_over_shadow_boxes"] = true, + ["v_24_shell"] = true, + ["v_24_shlfstudy"] = true, + ["v_24_shlfstudybooks"] = true, + ["v_24_shlfstudypics"] = true, + ["v_24_sta_mesh_delta"] = true, + ["v_24_sta_mesh_glass"] = true, + ["v_24_sta_mesh_plant"] = true, + ["v_24_sta_mesh_props"] = true, + ["v_24_sta_over_normal"] = true, + ["v_24_sta_over_shadow"] = true, + ["v_24_sta_painting"] = true, + ["v_24_storageboxs"] = true, + ["v_24_studylamps"] = true, + ["v_24_tablebooks"] = true, + ["v_24_wdr_mesh_delta"] = true, + ["v_24_wdr_mesh_rugs"] = true, + ["v_24_wdr_mesh_windows"] = true, + ["v_24_wdr_over_decal"] = true, + ["v_24_wdr_over_dirt"] = true, + ["v_24_wdr_over_normal"] = true, + ["v_24_wrd_mesh_boxes"] = true, + ["v_24_wrd_mesh_tux"] = true, + ["v_24_wrd_mesh_wardrobe"] = true, + ["v_28_alrm_case002"] = true, + ["v_28_alrm_case003"] = true, + ["v_28_alrm_case004"] = true, + ["v_28_alrm_case005"] = true, + ["v_28_alrm_case006"] = true, + ["v_28_alrm_case007"] = true, + ["v_28_alrm_case008"] = true, + ["v_28_alrm_case009"] = true, + ["v_28_alrm_case010"] = true, + ["v_28_alrm_case011"] = true, + ["v_28_alrm_case012"] = true, + ["v_28_alrm_case013"] = true, + ["v_28_alrm_case014"] = true, + ["v_28_alrm_case015"] = true, + ["v_28_alrm_case016"] = true, + ["v_28_an1_deca"] = true, + ["v_28_an1_deta"] = true, + ["v_28_an1_dirt"] = true, + ["v_28_an1_over"] = true, + ["v_28_an1_refl"] = true, + ["v_28_an1_shut"] = true, + ["v_28_an2_deca"] = true, + ["v_28_an2_deta"] = true, + ["v_28_an2_dirt"] = true, + ["v_28_an2_refl"] = true, + ["v_28_an2_shut"] = true, + ["v_28_backlab_deta"] = true, + ["v_28_backlab_refl"] = true, + ["v_28_blab_dirt"] = true, + ["v_28_blab_over"] = true, + ["v_28_coldr_deta"] = true, + ["v_28_coldr_dirt"] = true, + ["v_28_coldr_glass1"] = true, + ["v_28_coldr_glass2"] = true, + ["v_28_coldr_glass3"] = true, + ["v_28_coldr_glass4"] = true, + ["v_28_coldr_over"] = true, + ["v_28_coldr_refl"] = true, + ["v_28_corr_deta"] = true, + ["v_28_corr_dirt"] = true, + ["v_28_corr_over"] = true, + ["v_28_corr_refl"] = true, + ["v_28_gua2_deta"] = true, + ["v_28_gua2_dirt"] = true, + ["v_28_gua2_over"] = true, + ["v_28_gua2_refl"] = true, + ["v_28_guard1_deta"] = true, + ["v_28_guard1_dirt"] = true, + ["v_28_guard1_over"] = true, + ["v_28_guard1_refl"] = true, + ["v_28_ha1_cover"] = true, + ["v_28_ha1_cover001"] = true, + ["v_28_ha1_deca"] = true, + ["v_28_ha1_deta"] = true, + ["v_28_ha1_dirt"] = true, + ["v_28_ha1_refl"] = true, + ["v_28_ha1_step"] = true, + ["v_28_ha2_deca"] = true, + ["v_28_ha2_deta"] = true, + ["v_28_ha2_dirt"] = true, + ["v_28_ha2_refl"] = true, + ["v_28_ha2_ste1"] = true, + ["v_28_ha2_ste2"] = true, + ["v_28_hazmat1_deta"] = true, + ["v_28_hazmat1_dirt"] = true, + ["v_28_hazmat1_over"] = true, + ["v_28_hazmat1_refl"] = true, + ["v_28_hazmat2_deta"] = true, + ["v_28_hazmat2_dirt"] = true, + ["v_28_hazmat2_over"] = true, + ["v_28_hazmat2_refl"] = true, + ["v_28_lab_end"] = true, + ["v_28_lab_gar_dcl_01"] = true, + ["v_28_lab_poen_deta"] = true, + ["v_28_lab_poen_pipe"] = true, + ["v_28_lab_pool"] = true, + ["v_28_lab_pool_deta"] = true, + ["v_28_lab_pool_ladd"] = true, + ["v_28_lab_pool_wat1"] = true, + ["v_28_lab_poolshell"] = true, + ["v_28_lab_shell1"] = true, + ["v_28_lab_shell2"] = true, + ["v_28_lab_trellis"] = true, + ["v_28_lab1_deta"] = true, + ["v_28_lab1_dirt"] = true, + ["v_28_lab1_glas"] = true, + ["v_28_lab1_glass"] = true, + ["v_28_lab1_over"] = true, + ["v_28_lab1_refl"] = true, + ["v_28_lab2_deta"] = true, + ["v_28_lab2_dirt"] = true, + ["v_28_lab2_over"] = true, + ["v_28_lab2_refl"] = true, + ["v_28_loa_deta"] = true, + ["v_28_loa_deta2"] = true, + ["v_28_loa_dirt"] = true, + ["v_28_loa_lamp"] = true, + ["v_28_loa_over"] = true, + ["v_28_loa_refl"] = true, + ["v_28_monkeyt_deta"] = true, + ["v_28_monkeyt_dirt"] = true, + ["v_28_monkeyt_over"] = true, + ["v_28_monkeyt_refl"] = true, + ["v_28_pool_deca"] = true, + ["v_28_pool_dirt"] = true, + ["v_28_pr1_deca"] = true, + ["v_28_pr1_deta"] = true, + ["v_28_pr1_dirt"] = true, + ["v_28_pr1_refl"] = true, + ["v_28_pr2_deca"] = true, + ["v_28_pr2_deta"] = true, + ["v_28_pr2_dirt"] = true, + ["v_28_pr2_refl"] = true, + ["v_28_pra_deca"] = true, + ["v_28_pra_deta"] = true, + ["v_28_pra_dirt"] = true, + ["v_28_pra_refl"] = true, + ["v_28_prh_deca"] = true, + ["v_28_prh_deta"] = true, + ["v_28_prh_dirt"] = true, + ["v_28_prh_refl"] = true, + ["v_28_prh_shut"] = true, + ["v_28_prh_strs"] = true, + ["v_28_steps_2"] = true, + ["v_28_wascor_deta"] = true, + ["v_28_wascor_dirt"] = true, + ["v_28_wascor_over"] = true, + ["v_28_wasele_deta"] = true, + ["v_28_wasele_dirt"] = true, + ["v_28_wasele_refl"] = true, + ["v_28_waste_deta"] = true, + ["v_28_waste_dirt"] = true, + ["v_28_waste_over"] = true, + ["v_28_waste_refl"] = true, + ["v_28_wastecor_refl"] = true, + ["v_31_andyblend5"] = true, + ["v_31_andyblend6"] = true, + ["v_31_cablemesh5785278_hvstd"] = true, + ["v_31_cablemesh5785279_hvstd"] = true, + ["v_31_cablemesh5785280_hvstd"] = true, + ["v_31_cablemesh5785282_hvstd"] = true, + ["v_31_cablemesh5785283_hvstd"] = true, + ["v_31_cablemesh5785284_hvstd"] = true, + ["v_31_cablemesh5785285_hvstd"] = true, + ["v_31_cablemesh5785286_hvstd"] = true, + ["v_31_cablemesh5785287_hvstd"] = true, + ["v_31_cablemesh5785290_hvstd"] = true, + ["v_31_crappy_ramp"] = true, + ["v_31_dangle_light"] = true, + ["v_31_elec_supports"] = true, + ["v_31_electricityyparetn"] = true, + ["v_31_emmisve_ext"] = true, + ["v_31_emrglightnew011"] = true, + ["v_31_faked_water"] = true, + ["v_31_flow_fork_ah1"] = true, + ["v_31_flow1_0069"] = true, + ["v_31_flow1_0079"] = true, + ["v_31_low_tun_extem"] = true, + ["v_31_lowerwater"] = true, + ["v_31_metro_30_cables003"] = true, + ["v_31_newtun_mech_05c"] = true, + ["v_31_newtun_sh"] = true, + ["v_31_newtun01ol"] = true, + ["v_31_newtun01water"] = true, + ["v_31_newtun01waterb"] = true, + ["v_31_newtun1reflect"] = true, + ["v_31_newtun2_mech_05a"] = true, + ["v_31_newtun2mech_05b"] = true, + ["v_31_newtun2ol"] = true, + ["v_31_newtun2reflect001"] = true, + ["v_31_newtun2sh"] = true, + ["v_31_newtun2water"] = true, + ["v_31_newtun3ol"] = true, + ["v_31_newtun3sh"] = true, + ["v_31_station_curtains"] = true, + ["v_31_tun_06_reflect"] = true, + ["v_31_tun_06_refwater"] = true, + ["v_31_tun_07_reflect"] = true, + ["v_31_tun_cages"] = true, + ["v_31_tun05"] = true, + ["v_31_tun05_reflect"] = true, + ["v_31_tun05-overlay"] = true, + ["v_31_tun05b"] = true, + ["v_31_tun05f"] = true, + ["v_31_tun05gravelol"] = true, + ["v_31_tun05shadprox"] = true, + ["v_31_tun05stationsign"] = true, + ["v_31_tun06"] = true, + ["v_31_tun06_olay"] = true, + ["v_31_tun06b"] = true, + ["v_31_tun06pipes"] = true, + ["v_31_tun06scrapes"] = true, + ["v_31_tun07"] = true, + ["v_31_tun07_olay"] = true, + ["v_31_tun07b"] = true, + ["v_31_tun07b001"] = true, + ["v_31_tun07bgate"] = true, + ["v_31_tun08"] = true, + ["v_31_tun08_olay"] = true, + ["v_31_tun08reflect"] = true, + ["v_31_tun09"] = true, + ["v_31_tun09b"] = true, + ["v_31_tun09bol"] = true, + ["v_31_tun09junk005"] = true, + ["v_31_tun09junk009"] = true, + ["v_31_tun09junk009a"] = true, + ["v_31_tun09junk2"] = true, + ["v_31_tun09reflect"] = true, + ["v_31_tun10_gridnew"] = true, + ["v_31_tun10_olay"] = true, + ["v_31_tun10_olaynew"] = true, + ["v_31_tun10new"] = true, + ["v_31_tune06_newols"] = true, + ["v_31_tune06_newols001"] = true, + ["v_31_walltext001"] = true, + ["v_31_walltext002"] = true, + ["v_31_walltext003"] = true, + ["v_31_walltext005"] = true, + ["v_31_walltext006"] = true, + ["v_31_walltext007"] = true, + ["v_31_walltext009"] = true, + ["v_31_walltext010"] = true, + ["v_31_walltext012"] = true, + ["v_31_walltext013"] = true, + ["v_31_walltext014"] = true, + ["v_31_walltext015"] = true, + ["v_31_walltext016"] = true, + ["v_31_walltext017"] = true, + ["v_31_walltext018"] = true, + ["v_31_walltext019"] = true, + ["v_31_walltext020"] = true, + ["v_31_walltext021"] = true, + ["v_31_walltext022"] = true, + ["v_31_walltext023"] = true, + ["v_31_walltext024"] = true, + ["v_31_walltext025"] = true, + ["v_31_walltext026"] = true, + ["v_31_walltext027"] = true, + ["v_31_walltext028"] = true, + ["v_31_walltext031"] = true, + ["v_31a_cablemesh5777513_thvy"] = true, + ["v_31a_cablemesh5777640_thvy"] = true, + ["v_31a_cablemesh5777641_thvy"] = true, + ["v_31a_cablemesh5777642_thvy"] = true, + ["v_31a_cablemesh5777643_thvy"] = true, + ["v_31a_cablemesh5777644_thvy"] = true, + ["v_31a_cablemesh5777645_thvy"] = true, + ["v_31a_cablemesh5777646_thvy"] = true, + ["v_31a_cablemesh5777647_thvy"] = true, + ["v_31a_cablemesh5777648_thvy"] = true, + ["v_31a_cablemesh5777663_thvy"] = true, + ["v_31a_cablemesh5777678_thvy"] = true, + ["v_31a_cablemesh5777693_thvy"] = true, + ["v_31a_cablemesh5777750_thvy"] = true, + ["v_31a_cablemesh5777751_thvy"] = true, + ["v_31a_cablemesh5777752_thvy"] = true, + ["v_31a_cablemesh5777753_thvy"] = true, + ["v_31a_ducttape"] = true, + ["v_31a_emrglight005"] = true, + ["v_31a_emrglight007"] = true, + ["v_31a_emrglightnew"] = true, + ["v_31a_highvizjackets"] = true, + ["v_31a_highvizjackets001"] = true, + ["v_31a_jh_steps"] = true, + ["v_31a_jh_tun_plastic"] = true, + ["v_31a_jh_tunn_01a"] = true, + ["v_31a_jh_tunn_02a"] = true, + ["v_31a_jh_tunn_02b"] = true, + ["v_31a_jh_tunn_02c"] = true, + ["v_31a_jh_tunn_02x"] = true, + ["v_31a_jh_tunn_03aextra"] = true, + ["v_31a_jh_tunn_03b"] = true, + ["v_31a_jh_tunn_03c"] = true, + ["v_31a_jh_tunn_03d"] = true, + ["v_31a_jh_tunn_03e"] = true, + ["v_31a_jh_tunn_03f"] = true, + ["v_31a_jh_tunn_03g"] = true, + ["v_31a_jh_tunn_03h"] = true, + ["v_31a_jh_tunn_03wood"] = true, + ["v_31a_jh_tunn_04b"] = true, + ["v_31a_jh_tunn_04b_ducktape"] = true, + ["v_31a_jh_tunn_04d"] = true, + ["v_31a_jh_tunn_04e"] = true, + ["v_31a_jh_tunn_04f"] = true, + ["v_31a_jh_tunnground"] = true, + ["v_31a_newtun4shpile008"] = true, + ["v_31a_ootside_bit"] = true, + ["v_31a_reflectionbox"] = true, + ["v_31a_reflectionbox2"] = true, + ["v_31a_reftun2"] = true, + ["v_31a_start_tun_cable_bits"] = true, + ["v_31a_start_tun_cable_bits2"] = true, + ["v_31a_start_tun_roombits1"] = true, + ["v_31a_tun_01_shadowbox"] = true, + ["v_31a_tun_03frame"] = true, + ["v_31a_tun_05fakelod"] = true, + ["v_31a_tun_puds"] = true, + ["v_31a_tun_tarp"] = true, + ["v_31a_tun_tarp_tower"] = true, + ["v_31a_tun01"] = true, + ["v_31a_tun01_ovly"] = true, + ["v_31a_tun01_shpile"] = true, + ["v_31a_tun01_shpile2"] = true, + ["v_31a_tun01bitsnew"] = true, + ["v_31a_tun01bitsnew2"] = true, + ["v_31a_tun01rocks"] = true, + ["v_31a_tun01rocks2"] = true, + ["v_31a_tun02"] = true, + ["v_31a_tun02bits"] = true, + ["v_31a_tun02bits_dirtol"] = true, + ["v_31a_tun02rocks"] = true, + ["v_31a_tun03"] = true, + ["v_31a_tun03_over2a"] = true, + ["v_31a_tun03_over2b"] = true, + ["v_31a_tun03_over2c"] = true, + ["v_31a_tun03_over2d"] = true, + ["v_31a_tun03_over2e"] = true, + ["v_31a_tun03i"] = true, + ["v_31a_tun03j"] = true, + ["v_31a_tun03k"] = true, + ["v_31a_tun03l"] = true, + ["v_31a_tun03m"] = true, + ["v_31a_tun03n"] = true, + ["v_31a_tun03o"] = true, + ["v_31a_tun03p"] = true, + ["v_31a_tun04_olay"] = true, + ["v_31a_tunn_02_ovlay"] = true, + ["v_31a_tunnelsheeting"] = true, + ["v_31a_tunnerl_diger"] = true, + ["v_31a_tunreflect"] = true, + ["v_31a_tunroof_01"] = true, + ["v_31a_tunspoxyshadow"] = true, + ["v_31a_tunswap_dirt"] = true, + ["v_31a_tunswap_girders"] = true, + ["v_31a_tunswap_ground"] = true, + ["v_31a_tunswap_plastic"] = true, + ["v_31a_tunswap_platforms"] = true, + ["v_31a_tunswap_puds"] = true, + ["v_31a_tunswap_reflection"] = true, + ["v_31a_tunswap_rocks"] = true, + ["v_31a_tunswap_shad_proxy"] = true, + ["v_31a_tunswap_sheet"] = true, + ["v_31a_tunswap_steps"] = true, + ["v_31a_tunswap_tarp"] = true, + ["v_31a_tunswap_tower"] = true, + ["v_31a_tunswapbitofcrap"] = true, + ["v_31a_tunswapbits"] = true, + ["v_31a_tunswaphit1"] = true, + ["v_31a_tunswaplight1"] = true, + ["v_31a_tunswaplight2"] = true, + ["v_31a_tunswapover1"] = true, + ["v_31a_tunswaptunroof"] = true, + ["v_31a_tunswapwalls"] = true, + ["v_31a_tunswapwallthing"] = true, + ["v_31a_tuntobankol"] = true, + ["v_31a_v_tunnels_01b"] = true, + ["v_31a_walltext029"] = true, + ["v_31a_worklight_03b"] = true, + ["v_34_5"] = true, + ["v_34_boxes"] = true, + ["v_34_boxes02"] = true, + ["v_34_boxes03"] = true, + ["v_34_cable1"] = true, + ["v_34_cable2"] = true, + ["v_34_cable3"] = true, + ["v_34_cb_glass"] = true, + ["v_34_cb_glass2"] = true, + ["v_34_cb_glass3"] = true, + ["v_34_cb_glass4"] = true, + ["v_34_cb_reflect1"] = true, + ["v_34_cb_reflect2"] = true, + ["v_34_cb_reflect3"] = true, + ["v_34_cb_reflect4"] = true, + ["v_34_cb_shell1"] = true, + ["v_34_cb_shell2"] = true, + ["v_34_cb_shell3"] = true, + ["v_34_cb_shell4"] = true, + ["v_34_cb_windows"] = true, + ["v_34_chckmachine"] = true, + ["v_34_chickcrates"] = true, + ["v_34_chickcrates2"] = true, + ["v_34_chickcratesb"] = true, + ["v_34_chknrack"] = true, + ["v_34_containers"] = true, + ["v_34_corrcratesa"] = true, + ["v_34_corrcratesb"] = true, + ["v_34_corrdirt"] = true, + ["v_34_corrdirt2"] = true, + ["v_34_corrdirt4"] = true, + ["v_34_corrdirtb"] = true, + ["v_34_corrvents"] = true, + ["v_34_curtain01"] = true, + ["v_34_curtain02"] = true, + ["v_34_delcorrjunk"] = true, + ["v_34_delivery"] = true, + ["v_34_deloffice001"] = true, + ["v_34_dirtchill"] = true, + ["v_34_drains"] = true, + ["v_34_drains001"] = true, + ["v_34_drains002"] = true, + ["v_34_emwidw"] = true, + ["v_34_entcrates"] = true, + ["v_34_entdirt"] = true, + ["v_34_entoverlay"] = true, + ["v_34_entpipes"] = true, + ["v_34_entshutter"] = true, + ["v_34_entvents"] = true, + ["v_34_feathers"] = true, + ["v_34_hallmarks"] = true, + ["v_34_hallmarksb"] = true, + ["v_34_hallsigns"] = true, + ["v_34_hallsigns2"] = true, + ["v_34_hose"] = true, + ["v_34_killrmcable1"] = true, + ["v_34_killvents"] = true, + ["v_34_lights01"] = true, + ["v_34_lockers"] = true, + ["v_34_machine"] = true, + ["v_34_meatglue"] = true, + ["v_34_offdirt"] = true, + ["v_34_officepipe"] = true, + ["v_34_offoverlay"] = true, + ["v_34_overlays01"] = true, + ["v_34_partwall"] = true, + ["v_34_procdirt"] = true, + ["v_34_procequip"] = true, + ["v_34_proclights"] = true, + ["v_34_proclights01"] = true, + ["v_34_proclights2"] = true, + ["v_34_procstains"] = true, + ["v_34_puddle"] = true, + ["v_34_racks"] = true, + ["v_34_racksb"] = true, + ["v_34_racksc"] = true, + ["v_34_shrinkwrap2"] = true, + ["v_34_slurry"] = true, + ["v_34_slurrywrap"] = true, + ["v_34_sm_chill"] = true, + ["v_34_sm_corr"] = true, + ["v_34_sm_corrb"] = true, + ["v_34_sm_deloff"] = true, + ["v_34_sm_ent"] = true, + ["v_34_sm_kill"] = true, + ["v_34_sm_proc"] = true, + ["v_34_sm_staff2"] = true, + ["v_34_sm_ware1"] = true, + ["v_34_sm_ware1corr"] = true, + ["v_34_sm_ware2"] = true, + ["v_34_staffwin"] = true, + ["v_34_strips"] = true, + ["v_34_strips001"] = true, + ["v_34_strips002"] = true, + ["v_34_strips003"] = true, + ["v_34_trolley05"] = true, + ["v_34_vents2"] = true, + ["v_34_walkway"] = true, + ["v_34_ware2dirt"] = true, + ["v_34_ware2dirt2"] = true, + ["v_34_ware2vents"] = true, + ["v_34_ware2vents2"] = true, + ["v_34_ware2vents3"] = true, + ["v_34_waredamp"] = true, + ["v_34_waredirt"] = true, + ["v_34_warehouse"] = true, + ["v_34_warejunk"] = true, + ["v_34_wareover2"] = true, + ["v_34_wareracks"] = true, + ["v_34_waresuprt"] = true, + ["v_34_warevents"] = true, + ["v_34_wcorrdirt"] = true, + ["v_34_wcorrtyremks"] = true, + ["v_34_wtyremks"] = true, + ["v_44_1_daught_cdoor"] = true, + ["v_44_1_daught_cdoor2"] = true, + ["v_44_1_daught_deta"] = true, + ["v_44_1_daught_deta_ns"] = true, + ["v_44_1_daught_geoml"] = true, + ["v_44_1_daught_item"] = true, + ["v_44_1_daught_mirr"] = true, + ["v_44_1_daught_moved"] = true, + ["v_44_1_hall_deca"] = true, + ["v_44_1_hall_deta"] = true, + ["v_44_1_hall_emis"] = true, + ["v_44_1_hall2_deca"] = true, + ["v_44_1_hall2_deta"] = true, + ["v_44_1_hall2_emis"] = true, + ["v_44_1_mast_wadeca"] = true, + ["v_44_1_mast_washel"] = true, + ["v_44_1_mast_washel_m"] = true, + ["v_44_1_master_chan"] = true, + ["v_44_1_master_deca"] = true, + ["v_44_1_master_deta"] = true, + ["v_44_1_master_mirdecal"] = true, + ["v_44_1_master_mirr"] = true, + ["v_44_1_master_pics1"] = true, + ["v_44_1_master_pics2"] = true, + ["v_44_1_master_refl"] = true, + ["v_44_1_master_wait"] = true, + ["v_44_1_master_ward"] = true, + ["v_44_1_master_wcha"] = true, + ["v_44_1_master_wrefl"] = true, + ["v_44_1_son_deca"] = true, + ["v_44_1_son_deta"] = true, + ["v_44_1_son_item"] = true, + ["v_44_1_son_swap"] = true, + ["v_44_1_wc_deca"] = true, + ["v_44_1_wc_deta"] = true, + ["v_44_1_wc_mirr"] = true, + ["v_44_1_wc_wall"] = true, + ["v_44_cablemesh3833165_tstd"] = true, + ["v_44_cablemesh3833165_tstd001"] = true, + ["v_44_cablemesh3833165_tstd002"] = true, + ["v_44_cablemesh3833165_tstd003"] = true, + ["v_44_cablemesh3833165_tstd004"] = true, + ["v_44_cablemesh3833165_tstd005"] = true, + ["v_44_cablemesh3833165_tstd006"] = true, + ["v_44_cablemesh3833165_tstd007"] = true, + ["v_44_cablemesh3833165_tstd008"] = true, + ["v_44_cablemesh3833165_tstd009"] = true, + ["v_44_cablemesh3833165_tstd010"] = true, + ["v_44_cablemesh3833165_tstd011"] = true, + ["v_44_cablemesh3833165_tstd012"] = true, + ["v_44_cablemesh3833165_tstd013"] = true, + ["v_44_cablemesh3833165_tstd014"] = true, + ["v_44_cablemesh3833165_tstd015"] = true, + ["v_44_cablemesh3833165_tstd016"] = true, + ["v_44_cablemesh3833165_tstd017"] = true, + ["v_44_cablemesh3833165_tstd018"] = true, + ["v_44_cablemesh3833165_tstd019"] = true, + ["v_44_cablemesh3833165_tstd020"] = true, + ["v_44_cablemesh3833165_tstd021"] = true, + ["v_44_cablemesh3833165_tstd022"] = true, + ["v_44_cablemesh3833165_tstd023"] = true, + ["v_44_cablemesh3833165_tstd024"] = true, + ["v_44_cablemesh3833165_tstd025"] = true, + ["v_44_cablemesh3833165_tstd026"] = true, + ["v_44_cablemesh3833165_tstd027"] = true, + ["v_44_cablemesh3833165_tstd028"] = true, + ["v_44_cablemesh3833165_tstd029"] = true, + ["v_44_cablemesh3833165_tstd030"] = true, + ["v_44_d_chand"] = true, + ["v_44_d_emis"] = true, + ["v_44_d_items_over"] = true, + ["v_44_dine_deca"] = true, + ["v_44_dine_deta"] = true, + ["v_44_dine_detail"] = true, + ["v_44_fakewindow007"] = true, + ["v_44_fakewindow2"] = true, + ["v_44_fakewindow5"] = true, + ["v_44_fakewindow6"] = true, + ["v_44_g_cor_blen"] = true, + ["v_44_g_cor_deta"] = true, + ["v_44_g_fron_deca"] = true, + ["v_44_g_fron_deta"] = true, + ["v_44_g_fron_refl"] = true, + ["v_44_g_gara_deca"] = true, + ["v_44_g_gara_deta"] = true, + ["v_44_g_gara_ref"] = true, + ["v_44_g_gara_shad"] = true, + ["v_44_g_hall_deca"] = true, + ["v_44_g_hall_detail"] = true, + ["v_44_g_hall_emis"] = true, + ["v_44_g_hall_stairs"] = true, + ["v_44_g_kitche_deca"] = true, + ["v_44_g_kitche_deca1"] = true, + ["v_44_g_kitche_deta"] = true, + ["v_44_g_kitche_mirror"] = true, + ["v_44_g_kitche_shad"] = true, + ["v_44_g_scubagear"] = true, + ["v_44_garage_shell"] = true, + ["v_44_kitc_chand"] = true, + ["v_44_kitc_emmi_refl"] = true, + ["v_44_kitch_moved"] = true, + ["v_44_kitche_cables"] = true, + ["v_44_kitche_units"] = true, + ["v_44_lounge_deca"] = true, + ["v_44_lounge_decal"] = true, + ["v_44_lounge_deta"] = true, + ["v_44_lounge_items"] = true, + ["v_44_lounge_movebot"] = true, + ["v_44_lounge_movepic"] = true, + ["v_44_lounge_photos"] = true, + ["v_44_lounge_refl"] = true, + ["v_44_m_clothes"] = true, + ["v_44_m_daught_over"] = true, + ["v_44_m_premier"] = true, + ["v_44_m_spyglasses"] = true, + ["v_44_master_movebot"] = true, + ["v_44_planeticket"] = true, + ["v_44_s_posters"] = true, + ["v_44_shell"] = true, + ["v_44_shell_dt"] = true, + ["v_44_shell_kitchen"] = true, + ["v_44_shell_refl"] = true, + ["v_44_shell2"] = true, + ["v_44_shell2_mb_ward_refl"] = true, + ["v_44_shell2_mb_wind_refl"] = true, + ["v_44_shell2_refl"] = true, + ["v_44_son_clutter"] = true, + ["v_61_bath_over_dec"] = true, + ["v_61_bd1_binbag"] = true, + ["v_61_bd1_mesh_curtains"] = true, + ["v_61_bd1_mesh_delta"] = true, + ["v_61_bd1_mesh_door"] = true, + ["v_61_bd1_mesh_doorswap"] = true, + ["v_61_bd1_mesh_lamp"] = true, + ["v_61_bd1_mesh_makeup"] = true, + ["v_61_bd1_mesh_mess"] = true, + ["v_61_bd1_mesh_pillows"] = true, + ["v_61_bd1_mesh_props"] = true, + ["v_61_bd1_mesh_rosevase"] = true, + ["v_61_bd1_mesh_sheet"] = true, + ["v_61_bd1_mesh_shoes"] = true, + ["v_61_bd1_over_decal"] = true, + ["v_61_bd1_over_normal"] = true, + ["v_61_bd1_over_shadow_ore"] = true, + ["v_61_bd2_mesh_bed"] = true, + ["v_61_bd2_mesh_cupboard"] = true, + ["v_61_bd2_mesh_curtains"] = true, + ["v_61_bd2_mesh_darts"] = true, + ["v_61_bd2_mesh_delta"] = true, + ["v_61_bd2_mesh_drawers"] = true, + ["v_61_bd2_mesh_drawers_mess"] = true, + ["v_61_bd2_mesh_roadsign"] = true, + ["v_61_bd2_mesh_yogamat"] = true, + ["v_61_bd2_over_shadow"] = true, + ["v_61_bd2_over_shadow_clean"] = true, + ["v_61_bed_over_decal_scuz1"] = true, + ["v_61_bed1_mesh_bottles"] = true, + ["v_61_bed1_mesh_clothes"] = true, + ["v_61_bed1_mesh_clothesmess"] = true, + ["v_61_bed1_mesh_drugstuff"] = true, + ["v_61_bed2_mesh_drugstuff001"] = true, + ["v_61_bed2_mesh_lampshade"] = true, + ["v_61_bed2_over_normal"] = true, + ["v_61_bed2_over_rips"] = true, + ["v_61_bed2_over_shadows"] = true, + ["v_61_bth_mesh_bath"] = true, + ["v_61_bth_mesh_delta"] = true, + ["v_61_bth_mesh_mess_a"] = true, + ["v_61_bth_mesh_mess_b"] = true, + ["v_61_bth_mesh_mirror"] = true, + ["v_61_bth_mesh_sexdoll"] = true, + ["v_61_bth_mesh_sink"] = true, + ["v_61_bth_mesh_toilet"] = true, + ["v_61_bth_mesh_toilet_clean"] = true, + ["v_61_bth_mesh_toilet_messy"] = true, + ["v_61_bth_mesh_toiletroll"] = true, + ["v_61_bth_mesh_window"] = true, + ["v_61_bth_over_decal"] = true, + ["v_61_bth_over_shadow"] = true, + ["v_61_ducttape"] = true, + ["v_61_fdr_over_decal"] = true, + ["v_61_fnt_mesh_delta"] = true, + ["v_61_fnt_mesh_hooks"] = true, + ["v_61_fnt_mesh_props"] = true, + ["v_61_fnt_mesh_shitmarks"] = true, + ["v_61_fnt_over_normal"] = true, + ["v_61_hal_over_decal_shit"] = true, + ["v_61_hall_lampbase"] = true, + ["v_61_hall_mesh_frames"] = true, + ["v_61_hall_mesh_sideboard"] = true, + ["v_61_hall_mesh_sidesmess"] = true, + ["v_61_hall_mesh_sidestuff"] = true, + ["v_61_hall_mesh_starfish"] = true, + ["v_61_hall_over_decal_scuz"] = true, + ["v_61_hlw_mesh_cdoor"] = true, + ["v_61_hlw_mesh_delta"] = true, + ["v_61_hlw_mesh_doorbroken"] = true, + ["v_61_hlw_over_decal"] = true, + ["v_61_hlw_over_decal_mural"] = true, + ["v_61_hlw_over_decal_muraldirty"] = true, + ["v_61_hlw_over_normals"] = true, + ["v_61_kit_over_dec_cruma"] = true, + ["v_61_kit_over_dec_crumb"] = true, + ["v_61_kit_over_dec_crumc"] = true, + ["v_61_kit_over_decal_scuz"] = true, + ["v_61_kitc_mesh_board_a"] = true, + ["v_61_kitc_mesh_lights"] = true, + ["v_61_kitch_pizza"] = true, + ["v_61_kitn_mesh_plate"] = true, + ["v_61_ktcn_mesh_dildo"] = true, + ["v_61_ktcn_mesh_mess_01"] = true, + ["v_61_ktcn_mesh_mess_02"] = true, + ["v_61_ktcn_mesh_mess_03"] = true, + ["v_61_ktm_mesh_delta"] = true, + ["v_61_ktn_mesh_delta"] = true, + ["v_61_ktn_mesh_fridge"] = true, + ["v_61_ktn_mesh_lights"] = true, + ["v_61_ktn_mesh_windows"] = true, + ["v_61_ktn_over_decal"] = true, + ["v_61_ktn_over_normal"] = true, + ["v_61_lamponem"] = true, + ["v_61_lamponem2"] = true, + ["v_61_lgn_mesh_wickerbasket"] = true, + ["v_61_lng_cancrsh1"] = true, + ["v_61_lng_cigends"] = true, + ["v_61_lng_cigends2"] = true, + ["v_61_lng_mesh_bottles"] = true, + ["v_61_lng_mesh_case"] = true, + ["v_61_lng_mesh_coffeetable"] = true, + ["v_61_lng_mesh_comptable"] = true, + ["v_61_lng_mesh_curtains"] = true, + ["v_61_lng_mesh_delta"] = true, + ["v_61_lng_mesh_drugs"] = true, + ["v_61_lng_mesh_fireplace"] = true, + ["v_61_lng_mesh_mags"] = true, + ["v_61_lng_mesh_pics"] = true, + ["v_61_lng_mesh_picsmess"] = true, + ["v_61_lng_mesh_pizza"] = true, + ["v_61_lng_mesh_props"] = true, + ["v_61_lng_mesh_shell_scuzz"] = true, + ["v_61_lng_mesh_sidetable"] = true, + ["v_61_lng_mesh_smalltable"] = true, + ["v_61_lng_mesh_table_scuz"] = true, + ["v_61_lng_mesh_unita"] = true, + ["v_61_lng_mesh_unita_swap"] = true, + ["v_61_lng_mesh_unitb"] = true, + ["v_61_lng_mesh_unitc"] = true, + ["v_61_lng_mesh_unitc_items"] = true, + ["v_61_lng_mesh_windows"] = true, + ["v_61_lng_mesh_windows2"] = true, + ["v_61_lng_over_dec_crum"] = true, + ["v_61_lng_over_dec_crum1"] = true, + ["v_61_lng_over_decal"] = true, + ["v_61_lng_over_decal_scuz"] = true, + ["v_61_lng_over_decal_shit"] = true, + ["v_61_lng_over_decal_wademess"] = true, + ["v_61_lng_over_normal"] = true, + ["v_61_lng_over_shadow"] = true, + ["v_61_lng_pizza"] = true, + ["v_61_lng_poster1"] = true, + ["v_61_lng_poster2"] = true, + ["v_61_lng_rugdirt"] = true, + ["v_61_pizzaedge"] = true, + ["v_61_shell_doorframes"] = true, + ["v_61_shell_fdframe"] = true, + ["v_61_shell_walls"] = true, + ["v_61_shell_windowback"] = true, + ["v_73_4_fib_reflect00"] = true, + ["v_73_4_fib_reflect01"] = true, + ["v_73_4_fib_reflect03"] = true, + ["v_73_4_fib_reflect04"] = true, + ["v_73_4_fib_reflect09"] = true, + ["v_73_5_bathroom_dcl"] = true, + ["v_73_5_bathroom_dcl001"] = true, + ["v_73_ao_5_a"] = true, + ["v_73_ao_5_b"] = true, + ["v_73_ao_5_c"] = true, + ["v_73_ao_5_d"] = true, + ["v_73_ao_5_e"] = true, + ["v_73_ao_5_f"] = true, + ["v_73_ao_5_g"] = true, + ["v_73_ao_5_h"] = true, + ["v_73_ap_bano_dspwall_ab003"] = true, + ["v_73_ap_bano_dspwall_ab99"] = true, + ["v_73_cur_ao_test"] = true, + ["v_73_cur_el2_deta"] = true, + ["v_73_cur_el2_over"] = true, + ["v_73_cur_ele_deta"] = true, + ["v_73_cur_ele_elev"] = true, + ["v_73_cur_ele_elev001"] = true, + ["v_73_cur_ele_over"] = true, + ["v_73_cur_of1_blin"] = true, + ["v_73_cur_of1_deta"] = true, + ["v_73_cur_of2_blin"] = true, + ["v_73_cur_of2_deta"] = true, + ["v_73_cur_of3_blin"] = true, + ["v_73_cur_of3_deta"] = true, + ["v_73_cur_off2rm_ao"] = true, + ["v_73_cur_off2rm_de"] = true, + ["v_73_cur_over1"] = true, + ["v_73_cur_over2"] = true, + ["v_73_cur_over3"] = true, + ["v_73_cur_reflect"] = true, + ["v_73_cur_sec_desk"] = true, + ["v_73_cur_sec_deta"] = true, + ["v_73_cur_sec_over"] = true, + ["v_73_cur_sec_stat"] = true, + ["v_73_cur_shell"] = true, + ["v_73_elev_det"] = true, + ["v_73_elev_plat"] = true, + ["v_73_elev_sec1"] = true, + ["v_73_elev_sec2"] = true, + ["v_73_elev_sec3"] = true, + ["v_73_elev_sec4"] = true, + ["v_73_elev_sec5"] = true, + ["v_73_elev_shell_refl"] = true, + ["v_73_fib_5_glow_019"] = true, + ["v_73_fib_5_glow_020"] = true, + ["v_73_fib_5_glow_021"] = true, + ["v_73_fib_5_glow_022"] = true, + ["v_73_fib_5_glow_023"] = true, + ["v_73_fib_5_glow_024"] = true, + ["v_73_fib_5_glow_025"] = true, + ["v_73_fib_5_glow_026"] = true, + ["v_73_fib_5_glow_098"] = true, + ["v_73_glass_5_deta"] = true, + ["v_73_glass_5_deta004"] = true, + ["v_73_glass_5_deta005"] = true, + ["v_73_glass_5_deta020"] = true, + ["v_73_glass_5_deta021"] = true, + ["v_73_glass_5_deta022"] = true, + ["v_73_glass_5_deta1"] = true, + ["v_73_glass_5_deta2"] = true, + ["v_73_glass_5_deta3"] = true, + ["v_73_jan_cm1_deta"] = true, + ["v_73_jan_cm1_leds"] = true, + ["v_73_jan_cm1_over"] = true, + ["v_73_jan_cm2_deta"] = true, + ["v_73_jan_cm2_over"] = true, + ["v_73_jan_cm3_deta"] = true, + ["v_73_jan_cm3_over"] = true, + ["v_73_jan_dirt_test"] = true, + ["v_73_jan_ele_deta"] = true, + ["v_73_jan_ele_leds"] = true, + ["v_73_jan_ele_over"] = true, + ["v_73_jan_of1_deta"] = true, + ["v_73_jan_of1_deta2"] = true, + ["v_73_jan_of2_ceil"] = true, + ["v_73_jan_of2_deta"] = true, + ["v_73_jan_of2_over"] = true, + ["v_73_jan_of3_ceil"] = true, + ["v_73_jan_of3_deta"] = true, + ["v_73_jan_of3_over"] = true, + ["v_73_jan_over1"] = true, + ["v_73_jan_sec_desk"] = true, + ["v_73_jan_shell"] = true, + ["v_73_jan_wcm_deta"] = true, + ["v_73_jan_wcm_mirr"] = true, + ["v_73_jan_wcm_over"] = true, + ["v_73_off_st1_deta"] = true, + ["v_73_off_st1_over"] = true, + ["v_73_off_st1_ref"] = true, + ["v_73_off_st1_step"] = true, + ["v_73_off_st2_deta"] = true, + ["v_73_off_st2_over"] = true, + ["v_73_off_st2_ref"] = true, + ["v_73_off_st2_step"] = true, + ["v_73_p_ap_banosink_aa001"] = true, + ["v_73_p_ap_banostall_az"] = true, + ["v_73_p_ap_banourinal_aa003"] = true, + ["v_73_recp_seats001"] = true, + ["v_73_screen_a"] = true, + ["v_73_servdesk001"] = true, + ["v_73_servers001"] = true, + ["v_73_servlights001"] = true, + ["v_73_sign_006"] = true, + ["v_73_sign_5"] = true, + ["v_73_stair_shell"] = true, + ["v_73_stair_shell_refl"] = true, + ["v_73_stair_shell001"] = true, + ["v_73_v_fib_flag_a"] = true, + ["v_73_v_fib_flag_a001"] = true, + ["v_73_v_fib_flag_a002"] = true, + ["v_73_v_fib_flag_a003"] = true, + ["v_73_v_fib_flag_b"] = true, + ["v_73_vfx_curve_dummy"] = true, + ["v_73_vfx_curve_dummy001"] = true, + ["v_73_vfx_curve_dummy002"] = true, + ["v_73_vfx_curve_dummy003"] = true, + ["v_73_vfx_curve_dummy004"] = true, + ["v_73_vfx_curve_dummy005"] = true, + ["v_73_vfx_mesh_dummy_00"] = true, + ["v_73_vfx_mesh_dummy_01"] = true, + ["v_73_vfx_mesh_dummy_02"] = true, + ["v_73_vfx_mesh_dummy_03"] = true, + ["v_73_vfx_mesh_dummy_04"] = true, + ["v_73screen_b"] = true, + ["v_74_3_emerg_008"] = true, + ["v_74_3_emerg_009"] = true, + ["v_74_3_emerg_010"] = true, + ["v_74_3_emerg_1"] = true, + ["v_74_3_emerg_2"] = true, + ["v_74_3_emerg_3"] = true, + ["v_74_3_emerg_4"] = true, + ["v_74_3_emerg_6"] = true, + ["v_74_3_emerg_7"] = true, + ["v_74_3_stairlights"] = true, + ["v_74_4_emerg"] = true, + ["v_74_4_emerg_10"] = true, + ["v_74_4_emerg_2"] = true, + ["v_74_4_emerg_3"] = true, + ["v_74_4_emerg_4"] = true, + ["v_74_4_emerg_5"] = true, + ["v_74_4_emerg_6"] = true, + ["v_74_ao_5_h001"] = true, + ["v_74_atr_cor1_d_ns"] = true, + ["v_74_atr_cor1_deta"] = true, + ["v_74_atr_door_light"] = true, + ["v_74_atr_hall_d_ns"] = true, + ["v_74_atr_hall_d_ns001"] = true, + ["v_74_atr_hall_d_ns002"] = true, + ["v_74_atr_hall_deta"] = true, + ["v_74_atr_hall_deta001"] = true, + ["v_74_atr_hall_deta002"] = true, + ["v_74_atr_hall_deta003"] = true, + ["v_74_atr_hall_deta004"] = true, + ["v_74_atr_hall_lamp"] = true, + ["v_74_atr_hall_lamp001"] = true, + ["v_74_atr_hall_lamp002"] = true, + ["v_74_atr_hall_m_refl"] = true, + ["v_74_atr_off1_d_ns"] = true, + ["v_74_atr_off1_deta"] = true, + ["v_74_atr_off2_d_ns"] = true, + ["v_74_atr_off2_deta"] = true, + ["v_74_atr_off3_d_ns"] = true, + ["v_74_atr_off3_deta"] = true, + ["v_74_atr_spn1detail"] = true, + ["v_74_atr_spn2detail"] = true, + ["v_74_atr_spn3detail"] = true, + ["v_74_atr_stai_d_ns"] = true, + ["v_74_atr_stai_deta"] = true, + ["v_74_atrium_shell"] = true, + ["v_74_ceilin2"] = true, + ["v_74_cfemlight_rsref002"] = true, + ["v_74_cfemlight_rsref003"] = true, + ["v_74_cfemlight_rsref004"] = true, + ["v_74_cfemlight_rsref005"] = true, + ["v_74_cfemlight_rsref006"] = true, + ["v_74_cfemlight_rsref007"] = true, + ["v_74_cfemlight_rsref008"] = true, + ["v_74_cfemlight_rsref019"] = true, + ["v_74_cfemlight_rsref020"] = true, + ["v_74_cfemlight_rsref021"] = true, + ["v_74_cfemlight_rsref023"] = true, + ["v_74_cfemlight_rsref024"] = true, + ["v_74_cfemlight_rsref025"] = true, + ["v_74_cfemlight_rsref026"] = true, + ["v_74_cfemlight_rsref027"] = true, + ["v_74_cfemlight_rsref028"] = true, + ["v_74_cfemlight_rsref029"] = true, + ["v_74_cfemlight_rsref030"] = true, + ["v_74_cfemlight_rsref031"] = true, + ["v_74_collapsedfl3"] = true, + ["v_74_fib_embb"] = true, + ["v_74_fib_embb001"] = true, + ["v_74_fib_embb002"] = true, + ["v_74_fib_embb003"] = true, + ["v_74_fib_embb004"] = true, + ["v_74_fib_embb005"] = true, + ["v_74_fib_embb006"] = true, + ["v_74_fib_embb007"] = true, + ["v_74_fib_embb009"] = true, + ["v_74_fib_embb010"] = true, + ["v_74_fib_embb011"] = true, + ["v_74_fib_embb012"] = true, + ["v_74_fib_embb013"] = true, + ["v_74_fib_embb014"] = true, + ["v_74_fib_embb019"] = true, + ["v_74_fib_embb022"] = true, + ["v_74_fib_embb023"] = true, + ["v_74_fib_embb024"] = true, + ["v_74_fib_embb025"] = true, + ["v_74_fib_embb026"] = true, + ["v_74_fib_embb027"] = true, + ["v_74_fib_embb028"] = true, + ["v_74_fib_embb029"] = true, + ["v_74_fib_embb030"] = true, + ["v_74_fib_embb031"] = true, + ["v_74_fib_embb032"] = true, + ["v_74_fib_embb033"] = true, + ["v_74_fib_embb034"] = true, + ["v_74_fircub_glsshards007"] = true, + ["v_74_fircub_glsshards008"] = true, + ["v_74_fircub_glsshards009"] = true, + ["v_74_glass_a_deta003"] = true, + ["v_74_glass_a_deta004"] = true, + ["v_74_glass_a_deta005"] = true, + ["v_74_glass_a_deta007"] = true, + ["v_74_glass_a_deta008"] = true, + ["v_74_glass_a_deta009"] = true, + ["v_74_glass_a_deta010"] = true, + ["v_74_glass_a_deta011"] = true, + ["v_74_hobar_debris005"] = true, + ["v_74_hobar_debris006"] = true, + ["v_74_hobar_debris007"] = true, + ["v_74_hobar_debris008"] = true, + ["v_74_hobar_debris009"] = true, + ["v_74_hobar_debris010"] = true, + ["v_74_hobar_debris011"] = true, + ["v_74_hobar_debris012"] = true, + ["v_74_hobar_debris013"] = true, + ["v_74_hobar_debris014"] = true, + ["v_74_hobar_debris015"] = true, + ["v_74_hobar_debris016"] = true, + ["v_74_hobar_debris017"] = true, + ["v_74_hobar_debris018"] = true, + ["v_74_hobar_debris019"] = true, + ["v_74_hobar_debris020"] = true, + ["v_74_hobar_debris023"] = true, + ["v_74_hobar_debris024"] = true, + ["v_74_hobar_debris026"] = true, + ["v_74_hobar_debris027"] = true, + ["v_74_hobar_debris028"] = true, + ["v_74_it1_ceil3"] = true, + ["v_74_it1_ceiling_smoke_02_skin"] = true, + ["v_74_it1_ceiling_smoke_03_skin"] = true, + ["v_74_it1_ceiling_smoke_04_skin"] = true, + ["v_74_it1_ceiling_smoke_05_skin"] = true, + ["v_74_it1_ceiling_smoke_06_skin"] = true, + ["v_74_it1_ceiling_smoke_07_skin"] = true, + ["v_74_it1_ceiling_smoke_08_skin"] = true, + ["v_74_it1_ceiling_smoke_09_skin"] = true, + ["v_74_it1_ceiling_smoke_13_skin"] = true, + ["v_74_it1_cor1_ceil"] = true, + ["v_74_it1_cor1_deca"] = true, + ["v_74_it1_cor1_deta"] = true, + ["v_74_it1_cor2_ceil"] = true, + ["v_74_it1_cor2_deca"] = true, + ["v_74_it1_cor2_deta"] = true, + ["v_74_it1_elev_deca"] = true, + ["v_74_it1_elev_deta"] = true, + ["v_74_it1_off1_debr"] = true, + ["v_74_it1_off1_deta"] = true, + ["v_74_it1_off1_deta001"] = true, + ["v_74_it1_off2_debr"] = true, + ["v_74_it1_off2_deca"] = true, + ["v_74_it1_off2_deta"] = true, + ["v_74_it1_off3_ceil"] = true, + ["v_74_it1_off3_debr"] = true, + ["v_74_it1_off3_deca"] = true, + ["v_74_it1_off3_deta"] = true, + ["v_74_it1_post_ceil"] = true, + ["v_74_it1_post_deca"] = true, + ["v_74_it1_post_deta"] = true, + ["v_74_it1_shell"] = true, + ["v_74_it1_stai_deca"] = true, + ["v_74_it1_stai_deta"] = true, + ["v_74_it1_tiles2"] = true, + ["v_74_it1_void_deca"] = true, + ["v_74_it1_void_deta"] = true, + ["v_74_it2_ceiling_smoke_00_skin"] = true, + ["v_74_it2_ceiling_smoke_01_skin"] = true, + ["v_74_it2_ceiling_smoke_03_skin"] = true, + ["v_74_it2_ceiling_smoke_04_skin"] = true, + ["v_74_it2_ceiling_smoke_06_skin"] = true, + ["v_74_it2_ceiling_smoke_07_skin"] = true, + ["v_74_it2_ceiling_smoke_08_skin"] = true, + ["v_74_it2_ceiling_smoke_09_skin"] = true, + ["v_74_it2_ceiling_smoke_10_skin"] = true, + ["v_74_it2_ceiling_smoke_11_skin"] = true, + ["v_74_it2_ceiling_smoke_12_skin"] = true, + ["v_74_it2_ceiling_smoke_14_skin"] = true, + ["v_74_it2_ceiling_smoke_15_skin"] = true, + ["v_74_it2_ceiling_smoke_16_skin"] = true, + ["v_74_it2_cor1_deta"] = true, + ["v_74_it2_cor1_dirt"] = true, + ["v_74_it2_cor2_ceil"] = true, + ["v_74_it2_cor2_debr"] = true, + ["v_74_it2_cor2_deca"] = true, + ["v_74_it2_cor2_deta"] = true, + ["v_74_it2_cor3_ceil"] = true, + ["v_74_it2_cor3_deca"] = true, + ["v_74_it2_cor3_deta"] = true, + ["v_74_it2_elev_deta"] = true, + ["v_74_it2_elev_dirt"] = true, + ["v_74_it2_open_ceil"] = true, + ["v_74_it2_open_deta"] = true, + ["v_74_it2_open_dirt"] = true, + ["v_74_it2_post_deca2"] = true, + ["v_74_it2_post_deta"] = true, + ["v_74_it2_ser1_ceil"] = true, + ["v_74_it2_ser1_debr"] = true, + ["v_74_it2_ser1_deca"] = true, + ["v_74_it2_ser1_deta"] = true, + ["v_74_it2_ser2_ceil"] = true, + ["v_74_it2_ser2_deca"] = true, + ["v_74_it2_ser2_deta"] = true, + ["v_74_it2_shell"] = true, + ["v_74_it2_stai_deca"] = true, + ["v_74_it2_stai_deta"] = true, + ["v_74_it3_ceil2"] = true, + ["v_74_it3_ceilc"] = true, + ["v_74_it3_ceild"] = true, + ["v_74_it3_ceiling_smoke_01_skin"] = true, + ["v_74_it3_ceiling_smoke_03_skin"] = true, + ["v_74_it3_ceiling_smoke_04_skin"] = true, + ["v_74_it3_co1_deta"] = true, + ["v_74_it3_cor1_mnds"] = true, + ["v_74_it3_cor2_deta"] = true, + ["v_74_it3_cor3_debr"] = true, + ["v_74_it3_debf"] = true, + ["v_74_it3_hall_mnds"] = true, + ["v_74_it3_offi_deta"] = true, + ["v_74_it3_offi_mnds"] = true, + ["v_74_it3_ope_deta"] = true, + ["v_74_it3_open_mnds"] = true, + ["v_74_it3_ser2_debr"] = true, + ["v_74_it3_shell"] = true, + ["v_74_it3_sta_deta"] = true, + ["v_74_jan_over002"] = true, + ["v_74_jan_over003"] = true, + ["v_74_of_litter_d_h011"] = true, + ["v_74_of_litter_d_h013"] = true, + ["v_74_of_litter_d_h014"] = true, + ["v_74_of_litter_d_h015"] = true, + ["v_74_of_litter_d_h016"] = true, + ["v_74_of_litter_d_h017"] = true, + ["v_74_of_litter_d_h018"] = true, + ["v_74_of_litter_d_h019"] = true, + ["v_74_of_litter_d_h020"] = true, + ["v_74_of_litter_d_h021"] = true, + ["v_74_ofc_debrizz001"] = true, + ["v_74_ofc_debrizz002"] = true, + ["v_74_ofc_debrizz003"] = true, + ["v_74_ofc_debrizz004"] = true, + ["v_74_ofc_debrizz005"] = true, + ["v_74_ofc_debrizz007"] = true, + ["v_74_ofc_debrizz009"] = true, + ["v_74_ofc_debrizz010"] = true, + ["v_74_ofc_debrizz012"] = true, + ["v_74_ofc_debrizz013"] = true, + ["v_74_recp_seats002"] = true, + ["v_74_servdesk002"] = true, + ["v_74_servers002"] = true, + ["v_74_servlights002"] = true, + ["v_74_stair4"] = true, + ["v_74_stair5"] = true, + ["v_74_str2_deta"] = true, + ["v_74_v_14_hobar_debris021"] = true, + ["v_74_v_14_it3_cor1_mnds"] = true, + ["v_74_v_fib_flag_a004"] = true, + ["v_74_v_fib_flag_a007"] = true, + ["v_74_v_fib02_it1_004"] = true, + ["v_74_v_fib02_it1_005"] = true, + ["v_74_v_fib02_it1_006"] = true, + ["v_74_v_fib02_it1_007"] = true, + ["v_74_v_fib02_it1_008"] = true, + ["v_74_v_fib02_it1_009"] = true, + ["v_74_v_fib02_it1_010"] = true, + ["v_74_v_fib02_it1_011"] = true, + ["v_74_v_fib02_it1_03"] = true, + ["v_74_v_fib02_it1_off1"] = true, + ["v_74_v_fib02_it1_off2"] = true, + ["v_74_v_fib02_it2_cor004"] = true, + ["v_74_v_fib02_it2_cor005"] = true, + ["v_74_v_fib02_it2_cor006"] = true, + ["v_74_v_fib02_it2_cor007"] = true, + ["v_74_v_fib02_it2_cor008"] = true, + ["v_74_v_fib02_it2_cor009"] = true, + ["v_74_v_fib02_it2_cor01"] = true, + ["v_74_v_fib02_it2_cor2"] = true, + ["v_74_v_fib02_it2_cor3"] = true, + ["v_74_v_fib02_it2_elev"] = true, + ["v_74_v_fib02_it2_elev001"] = true, + ["v_74_v_fib02_it2_ser004"] = true, + ["v_74_v_fib02_it2_ser005"] = true, + ["v_74_v_fib02_it2_ser006"] = true, + ["v_74_v_fib02_it2_ser1"] = true, + ["v_74_v_fib02_it2_ser2"] = true, + ["v_74_v_fib03_it3_cor002"] = true, + ["v_74_v_fib03_it3_cor1"] = true, + ["v_74_v_fib03_it3_open"] = true, + ["v_74_v_fib2_3b_cvr"] = true, + ["v_74_vfx_3a_it3_01"] = true, + ["v_74_vfx_3b_it3_01"] = true, + ["v_74_vfx_it3_002"] = true, + ["v_74_vfx_it3_003"] = true, + ["v_74_vfx_it3_004"] = true, + ["v_74_vfx_it3_005"] = true, + ["v_74_vfx_it3_006"] = true, + ["v_74_vfx_it3_007"] = true, + ["v_74_vfx_it3_008"] = true, + ["v_74_vfx_it3_009"] = true, + ["v_74_vfx_it3_010"] = true, + ["v_74_vfx_it3_02"] = true, + ["v_74_vfx_it3_3a_003"] = true, + ["v_74_vfx_it3_3b_004"] = true, + ["v_74_vfx_it3_3b_02"] = true, + ["v_74_vfx_it3_cor"] = true, + ["v_74_vfx_it3_cor001"] = true, + ["v_74_vfx_it3_open_cav"] = true, + ["v_74_vfx_mesh_fire_00"] = true, + ["v_74_vfx_mesh_fire_01"] = true, + ["v_74_vfx_mesh_fire_03"] = true, + ["v_74_vfx_mesh_fire_04"] = true, + ["v_74_vfx_mesh_fire_05"] = true, + ["v_74_vfx_mesh_fire_06"] = true, + ["v_74_vfx_mesh_fire_07"] = true, + ["v_8_basedecaldirt"] = true, + ["v_8_baseoverla"] = true, + ["v_8_baseoverlay"] = true, + ["v_8_baseoverlay2"] = true, + ["v_8_bath"] = true, + ["v_8_bath2"] = true, + ["v_8_bathrm3"] = true, + ["v_8_bed1bulbon"] = true, + ["v_8_bed1decaldirt"] = true, + ["v_8_bed1ovrly"] = true, + ["v_8_bed1stuff"] = true, + ["v_8_bed2decaldirt"] = true, + ["v_8_bed2ovlys"] = true, + ["v_8_bed3decaldirt"] = true, + ["v_8_bed3ovrly"] = true, + ["v_8_bed3rmbulbon"] = true, + ["v_8_bed3stuff"] = true, + ["v_8_bed4bulbon"] = true, + ["v_8_bedrm4stuff"] = true, + ["v_8_cloth002"] = true, + ["v_8_cloth01"] = true, + ["v_8_diningdecdirt"] = true, + ["v_8_diningovlys"] = true, + ["v_8_diningtable"] = true, + ["v_8_ducttape"] = true, + ["v_8_farmshad01"] = true, + ["v_8_farmshad02"] = true, + ["v_8_farmshad03"] = true, + ["v_8_farmshad04"] = true, + ["v_8_farmshad05"] = true, + ["v_8_farmshad06"] = true, + ["v_8_farmshad07"] = true, + ["v_8_farmshad08"] = true, + ["v_8_farmshad09"] = true, + ["v_8_farmshad10"] = true, + ["v_8_farmshad11"] = true, + ["v_8_farmshad13"] = true, + ["v_8_farmshad14"] = true, + ["v_8_farmshad15"] = true, + ["v_8_farmshad18"] = true, + ["v_8_farmshad19"] = true, + ["v_8_farmshad20"] = true, + ["v_8_farmshad21"] = true, + ["v_8_farmshad22"] = true, + ["v_8_farmshad24"] = true, + ["v_8_farmshad25"] = true, + ["v_8_footprints"] = true, + ["v_8_framebath"] = true, + ["v_8_framebd1"] = true, + ["v_8_framebd2"] = true, + ["v_8_framebd3"] = true, + ["v_8_framebd4"] = true, + ["v_8_framedin"] = true, + ["v_8_framefrnt"] = true, + ["v_8_framehl2"] = true, + ["v_8_framehl4"] = true, + ["v_8_framehl5"] = true, + ["v_8_framehl6"] = true, + ["v_8_framehll3"] = true, + ["v_8_framektc"] = true, + ["v_8_framel1"] = true, + ["v_8_frameliv"] = true, + ["v_8_framesp1"] = true, + ["v_8_framesp2"] = true, + ["v_8_framesp3"] = true, + ["v_8_framestd"] = true, + ["v_8_frameut001"] = true, + ["v_8_frntoverlay"] = true, + ["v_8_frontdecdirt"] = true, + ["v_8_furnace"] = true, + ["v_8_hall1decdirt"] = true, + ["v_8_hall1overlay"] = true, + ["v_8_hall1stuff"] = true, + ["v_8_hall2decdirt"] = true, + ["v_8_hall2overlay"] = true, + ["v_8_hall3decdirt"] = true, + ["v_8_hall3ovlys"] = true, + ["v_8_hall4decdirt"] = true, + ["v_8_hall4ovrly"] = true, + ["v_8_hall5overlay"] = true, + ["v_8_hall6decdirt"] = true, + ["v_8_hall6ovlys"] = true, + ["v_8_kitchdecdirt"] = true, + ["v_8_kitchen"] = true, + ["v_8_kitcovlys"] = true, + ["v_8_laundecdirt"] = true, + ["v_8_laundryovlys"] = true, + ["v_8_livingdecdirt"] = true, + ["v_8_livoverlays"] = true, + ["v_8_livstuff"] = true, + ["v_8_reflection_proxy"] = true, + ["v_8_shell"] = true, + ["v_8_sp1decdirt"] = true, + ["v_8_sp1ovrly"] = true, + ["v_8_sp2decdirt"] = true, + ["v_8_spare1stuff"] = true, + ["v_8_stairs"] = true, + ["v_8_stairs2"] = true, + ["v_8_stairspart2"] = true, + ["v_8_studdecdirt"] = true, + ["v_8_studovly"] = true, + ["v_8_studybulbon"] = true, + ["v_8_studycloth"] = true, + ["v_8_studyclothtop"] = true, + ["v_8_studystuff"] = true, + ["v_8_utilstuff"] = true, + ["v_club_baham_bckt_chr"] = true, + ["v_club_bahbarstool"] = true, + ["v_club_barchair"] = true, + ["v_club_brablk"] = true, + ["v_club_brablu"] = true, + ["v_club_bragld"] = true, + ["v_club_brapnk"] = true, + ["v_club_brush"] = true, + ["v_club_cc_stool"] = true, + ["v_club_ch_armchair"] = true, + ["v_club_ch_briefchair"] = true, + ["v_club_comb"] = true, + ["v_club_dress1"] = true, + ["v_club_officechair"] = true, + ["v_club_officeset"] = true, + ["v_club_officesofa"] = true, + ["v_club_rack"] = true, + ["v_club_roc_cab1"] = true, + ["v_club_roc_cab2"] = true, + ["v_club_roc_cab3"] = true, + ["v_club_roc_cabamp"] = true, + ["v_club_roc_ctable"] = true, + ["v_club_roc_eq1"] = true, + ["v_club_roc_eq2"] = true, + ["v_club_roc_gstand"] = true, + ["v_club_roc_jacket1"] = true, + ["v_club_roc_jacket2"] = true, + ["v_club_roc_lampoff"] = true, + ["v_club_roc_micstd"] = true, + ["v_club_roc_mixer1"] = true, + ["v_club_roc_mixer2"] = true, + ["v_club_roc_monitor"] = true, + ["v_club_roc_mscreen"] = true, + ["v_club_roc_spot_b"] = true, + ["v_club_roc_spot_g"] = true, + ["v_club_roc_spot_off"] = true, + ["v_club_roc_spot_r"] = true, + ["v_club_roc_spot_w"] = true, + ["v_club_roc_spot_y"] = true, + ["v_club_roc_zstand"] = true, + ["v_club_shoerack"] = true, + ["v_club_silkrobe"] = true, + ["v_club_skirtflare"] = true, + ["v_club_skirtplt"] = true, + ["v_club_slip"] = true, + ["v_club_stagechair"] = true, + ["v_club_vu_ashtray"] = true, + ["v_club_vu_bear"] = true, + ["v_club_vu_boa"] = true, + ["v_club_vu_chngestool"] = true, + ["v_club_vu_coffeecup"] = true, + ["v_club_vu_coffeemug1"] = true, + ["v_club_vu_coffeemug2"] = true, + ["v_club_vu_deckcase"] = true, + ["v_club_vu_djbag"] = true, + ["v_club_vu_djunit"] = true, + ["v_club_vu_drawer"] = true, + ["v_club_vu_drawopen"] = true, + ["v_club_vu_ink_1"] = true, + ["v_club_vu_ink_2"] = true, + ["v_club_vu_ink_3"] = true, + ["v_club_vu_ink_4"] = true, + ["v_club_vu_lamp"] = true, + ["v_club_vu_pills"] = true, + ["v_club_vu_roladex"] = true, + ["v_club_vu_statue"] = true, + ["v_club_vu_table"] = true, + ["v_club_vuarmchair"] = true, + ["v_club_vubrushpot"] = true, + ["v_club_vuhairdryer"] = true, + ["v_club_vumakeupbrsh"] = true, + ["v_club_vusnaketank"] = true, + ["v_club_vutongs"] = true, + ["v_club_vuvanity"] = true, + ["v_club_vuvanityboxop"] = true, + ["v_corp_bank_pen"] = true, + ["v_corp_banktrolley"] = true, + ["v_corp_bk_balustrade"] = true, + ["v_corp_bk_bust"] = true, + ["v_corp_bk_chair1"] = true, + ["v_corp_bk_chair2"] = true, + ["v_corp_bk_chair3"] = true, + ["v_corp_bk_filecab"] = true, + ["v_corp_bk_filedraw"] = true, + ["v_corp_bk_flag"] = true, + ["v_corp_bk_lamp1"] = true, + ["v_corp_bk_lamp2"] = true, + ["v_corp_bk_lflts"] = true, + ["v_corp_bk_lfltstand"] = true, + ["v_corp_bk_pens"] = true, + ["v_corp_bk_rolladex"] = true, + ["v_corp_bk_rope"] = true, + ["v_corp_bk_secpanel"] = true, + ["v_corp_bombbin"] = true, + ["v_corp_bombhum"] = true, + ["v_corp_bombplant"] = true, + ["v_corp_boxpapr1fd"] = true, + ["v_corp_boxpaprfd"] = true, + ["v_corp_cabshelves01"] = true, + ["v_corp_cashpack"] = true, + ["v_corp_cashtrolley"] = true, + ["v_corp_cashtrolley_2"] = true, + ["v_corp_cd_chair"] = true, + ["v_corp_cd_desklamp"] = true, + ["v_corp_cd_heater"] = true, + ["v_corp_cd_intercom"] = true, + ["v_corp_cd_pen"] = true, + ["v_corp_cd_poncho"] = true, + ["v_corp_cd_recseat"] = true, + ["v_corp_cd_rectable"] = true, + ["v_corp_cd_wellies"] = true, + ["v_corp_closed_sign"] = true, + ["v_corp_conftable"] = true, + ["v_corp_conftable2"] = true, + ["v_corp_conftable3"] = true, + ["v_corp_conftable4"] = true, + ["v_corp_cubiclefd"] = true, + ["v_corp_deskdraw"] = true, + ["v_corp_deskdrawdark01"] = true, + ["v_corp_deskdrawfd"] = true, + ["v_corp_deskseta"] = true, + ["v_corp_desksetb"] = true, + ["v_corp_divide"] = true, + ["v_corp_facebeanbag"] = true, + ["v_corp_facebeanbagb"] = true, + ["v_corp_facebeanbagc"] = true, + ["v_corp_facebeanbagd"] = true, + ["v_corp_fib_glass_thin"] = true, + ["v_corp_fib_glass1"] = true, + ["v_corp_filecabdark01"] = true, + ["v_corp_filecabdark02"] = true, + ["v_corp_filecabdark03"] = true, + ["v_corp_filecablow"] = true, + ["v_corp_filecabtall"] = true, + ["v_corp_filecabtall_01"] = true, + ["v_corp_fleeca_display"] = true, + ["v_corp_go_glass2"] = true, + ["v_corp_hicksdoor"] = true, + ["v_corp_humidifier"] = true, + ["v_corp_lazychair"] = true, + ["v_corp_lazychairfd"] = true, + ["v_corp_lidesk01"] = true, + ["v_corp_lngestool"] = true, + ["v_corp_lngestoolfd"] = true, + ["v_corp_lowcabdark01"] = true, + ["v_corp_maindesk"] = true, + ["v_corp_maindeskfd"] = true, + ["v_corp_offchair"] = true, + ["v_corp_offchairfd"] = true, + ["v_corp_officedesk"] = true, + ["v_corp_officedesk_5"] = true, + ["v_corp_officedesk003"] = true, + ["v_corp_officedesk004"] = true, + ["v_corp_officedesk1"] = true, + ["v_corp_officedesk2"] = true, + ["v_corp_offshelf"] = true, + ["v_corp_offshelfclo"] = true, + ["v_corp_offshelfdark"] = true, + ["v_corp_partitionfd"] = true, + ["v_corp_plants"] = true, + ["v_corp_post_open"] = true, + ["v_corp_postbox"] = true, + ["v_corp_postboxa"] = true, + ["v_corp_potplant1"] = true, + ["v_corp_potplant2"] = true, + ["v_corp_servercln"] = true, + ["v_corp_servercln2"] = true, + ["v_corp_servers1"] = true, + ["v_corp_servers2"] = true, + ["v_corp_servrlowfd"] = true, + ["v_corp_servrtwrfd"] = true, + ["v_corp_sidechair"] = true, + ["v_corp_sidechairfd"] = true, + ["v_corp_sidetable"] = true, + ["v_corp_sidetblefd"] = true, + ["v_corp_srvrrackfd"] = true, + ["v_corp_srvrtwrsfd"] = true, + ["v_corp_tallcabdark01"] = true, + ["v_corp_trolley_fd"] = true, + ["v_hair_d_bcream"] = true, + ["v_hair_d_gel"] = true, + ["v_hair_d_shave"] = true, + ["v_haird_mousse"] = true, + ["v_ilev_247_offdorr"] = true, + ["v_ilev_247door"] = true, + ["v_ilev_247door_r"] = true, + ["v_ilev_a_tissue"] = true, + ["v_ilev_abbmaindoor"] = true, + ["v_ilev_abbmaindoor2"] = true, + ["v_ilev_abmincer"] = true, + ["v_ilev_acet_projector"] = true, + ["v_ilev_arm_secdoor"] = true, + ["v_ilev_bank4door01"] = true, + ["v_ilev_bank4door02"] = true, + ["v_ilev_bank4doorcls01"] = true, + ["v_ilev_bank4doorcls02"] = true, + ["v_ilev_bk_closedsign"] = true, + ["v_ilev_bk_door"] = true, + ["v_ilev_bk_door2"] = true, + ["v_ilev_bk_gate"] = true, + ["v_ilev_bk_gate2"] = true, + ["v_ilev_bk_gatedam"] = true, + ["v_ilev_bk_safegate"] = true, + ["v_ilev_bk_vaultdoor"] = true, + ["v_ilev_bl_door_l"] = true, + ["v_ilev_bl_door_r"] = true, + ["v_ilev_bl_doorel_l"] = true, + ["v_ilev_bl_doorel_r"] = true, + ["v_ilev_bl_doorpool"] = true, + ["v_ilev_bl_doorsl_l"] = true, + ["v_ilev_bl_doorsl_r"] = true, + ["v_ilev_bl_elevdis1"] = true, + ["v_ilev_bl_elevdis2"] = true, + ["v_ilev_bl_elevdis3"] = true, + ["v_ilev_bl_shutter1"] = true, + ["v_ilev_bl_shutter2"] = true, + ["v_ilev_blnds_clsd"] = true, + ["v_ilev_blnds_opn"] = true, + ["v_ilev_body_parts"] = true, + ["v_ilev_bs_door"] = true, + ["v_ilev_carmod3door"] = true, + ["v_ilev_carmod3lamp"] = true, + ["v_ilev_carmodlamps"] = true, + ["v_ilev_cbankcountdoor01"] = true, + ["v_ilev_cbankvauldoor01"] = true, + ["v_ilev_cbankvaulgate01"] = true, + ["v_ilev_cbankvaulgate02"] = true, + ["v_ilev_cd_door"] = true, + ["v_ilev_cd_door2"] = true, + ["v_ilev_cd_door3"] = true, + ["v_ilev_cd_dust"] = true, + ["v_ilev_cd_entrydoor"] = true, + ["v_ilev_cd_lampal"] = true, + ["v_ilev_cd_lampal_off"] = true, + ["v_ilev_cd_secdoor"] = true, + ["v_ilev_cd_secdoor2"] = true, + ["v_ilev_cd_sprklr"] = true, + ["v_ilev_cd_sprklr_on"] = true, + ["v_ilev_cd_sprklr_on2"] = true, + ["v_ilev_cf_officedoor"] = true, + ["v_ilev_ch_glassdoor"] = true, + ["v_ilev_chair02_ped"] = true, + ["v_ilev_chopshopswitch"] = true, + ["v_ilev_ciawin_solid"] = true, + ["v_ilev_cin_screen"] = true, + ["v_ilev_clothhiendlights"] = true, + ["v_ilev_clothhiendlightsb"] = true, + ["v_ilev_clothmiddoor"] = true, + ["v_ilev_cm_door1"] = true, + ["v_ilev_cor_darkdoor"] = true, + ["v_ilev_cor_doorglassa"] = true, + ["v_ilev_cor_doorglassb"] = true, + ["v_ilev_cor_doorlift01"] = true, + ["v_ilev_cor_doorlift02"] = true, + ["v_ilev_cor_firedoor"] = true, + ["v_ilev_cor_firedoorwide"] = true, + ["v_ilev_cor_offdoora"] = true, + ["v_ilev_cor_windowsmash"] = true, + ["v_ilev_cor_windowsolid"] = true, + ["v_ilev_cs_door"] = true, + ["v_ilev_cs_door01"] = true, + ["v_ilev_cs_door01_r"] = true, + ["v_ilev_csr_door_l"] = true, + ["v_ilev_csr_door_r"] = true, + ["v_ilev_csr_garagedoor"] = true, + ["v_ilev_csr_lod_boarded"] = true, + ["v_ilev_csr_lod_broken"] = true, + ["v_ilev_csr_lod_normal"] = true, + ["v_ilev_ct_door01"] = true, + ["v_ilev_ct_door02"] = true, + ["v_ilev_ct_door03"] = true, + ["v_ilev_ct_doorl"] = true, + ["v_ilev_ct_doorr"] = true, + ["v_ilev_depboxdoor01"] = true, + ["v_ilev_depo_box01"] = true, + ["v_ilev_depo_box01_lid"] = true, + ["v_ilev_dev_door"] = true, + ["v_ilev_dev_windowdoor"] = true, + ["v_ilev_deviantfrontdoor"] = true, + ["v_ilev_door_orange"] = true, + ["v_ilev_door_orangesolid"] = true, + ["v_ilev_epsstoredoor"] = true, + ["v_ilev_exball_blue"] = true, + ["v_ilev_exball_grey"] = true, + ["v_ilev_fa_backdoor"] = true, + ["v_ilev_fa_dinedoor"] = true, + ["v_ilev_fa_frontdoor"] = true, + ["v_ilev_fa_roomdoor"] = true, + ["v_ilev_fa_slidedoor"] = true, + ["v_ilev_fa_warddoorl"] = true, + ["v_ilev_fa_warddoorr"] = true, + ["v_ilev_fb_door01"] = true, + ["v_ilev_fb_door02"] = true, + ["v_ilev_fb_doorshortl"] = true, + ["v_ilev_fb_doorshortr"] = true, + ["v_ilev_fb_sl_door01"] = true, + ["v_ilev_fbisecgate"] = true, + ["v_ilev_fh_dineeamesa"] = true, + ["v_ilev_fh_door01"] = true, + ["v_ilev_fh_door02"] = true, + ["v_ilev_fh_door03"] = true, + ["v_ilev_fh_door4"] = true, + ["v_ilev_fh_door5"] = true, + ["v_ilev_fh_frntdoor"] = true, + ["v_ilev_fh_frontdoor"] = true, + ["v_ilev_fh_kitchenstool"] = true, + ["v_ilev_fh_lampa_on"] = true, + ["v_ilev_fh_slidingdoor"] = true, + ["v_ilev_fib_atrcol"] = true, + ["v_ilev_fib_atrgl1"] = true, + ["v_ilev_fib_atrgl1s"] = true, + ["v_ilev_fib_atrgl2"] = true, + ["v_ilev_fib_atrgl2s"] = true, + ["v_ilev_fib_atrgl3"] = true, + ["v_ilev_fib_atrgl3s"] = true, + ["v_ilev_fib_atrglswap"] = true, + ["v_ilev_fib_btrmdr"] = true, + ["v_ilev_fib_debris"] = true, + ["v_ilev_fib_door_ld"] = true, + ["v_ilev_fib_door_maint"] = true, + ["v_ilev_fib_door1"] = true, + ["v_ilev_fib_door1_s"] = true, + ["v_ilev_fib_door2"] = true, + ["v_ilev_fib_door3"] = true, + ["v_ilev_fib_doorbrn"] = true, + ["v_ilev_fib_doore_l"] = true, + ["v_ilev_fib_doore_r"] = true, + ["v_ilev_fib_frame"] = true, + ["v_ilev_fib_frame02"] = true, + ["v_ilev_fib_frame03"] = true, + ["v_ilev_fib_postbox_door"] = true, + ["v_ilev_fib_sprklr"] = true, + ["v_ilev_fib_sprklr_off"] = true, + ["v_ilev_fib_sprklr_on"] = true, + ["v_ilev_fibl_door01"] = true, + ["v_ilev_fibl_door02"] = true, + ["v_ilev_fin_vaultdoor"] = true, + ["v_ilev_finale_shut01"] = true, + ["v_ilev_finelevdoor01"] = true, + ["v_ilev_fingate"] = true, + ["v_ilev_fos_desk"] = true, + ["v_ilev_fos_mic"] = true, + ["v_ilev_fos_tvstage"] = true, + ["v_ilev_found_crane_pulley"] = true, + ["v_ilev_found_cranebucket"] = true, + ["v_ilev_found_gird_crane"] = true, + ["v_ilev_frnkwarddr1"] = true, + ["v_ilev_frnkwarddr2"] = true, + ["v_ilev_gangsafe"] = true, + ["v_ilev_gangsafedial"] = true, + ["v_ilev_gangsafedoor"] = true, + ["v_ilev_garageliftdoor"] = true, + ["v_ilev_gasdoor"] = true, + ["v_ilev_gasdoor_r"] = true, + ["v_ilev_gb_teldr"] = true, + ["v_ilev_gb_vaubar"] = true, + ["v_ilev_gb_vauldr"] = true, + ["v_ilev_gc_door01"] = true, + ["v_ilev_gc_door02"] = true, + ["v_ilev_gc_door03"] = true, + ["v_ilev_gc_door04"] = true, + ["v_ilev_gc_grenades"] = true, + ["v_ilev_gc_handguns"] = true, + ["v_ilev_gc_weapons"] = true, + ["v_ilev_gcshape_assmg_25"] = true, + ["v_ilev_gcshape_assmg_50"] = true, + ["v_ilev_gcshape_asssmg_25"] = true, + ["v_ilev_gcshape_asssmg_50"] = true, + ["v_ilev_gcshape_asssnip_25"] = true, + ["v_ilev_gcshape_asssnip_50"] = true, + ["v_ilev_gcshape_bull_25"] = true, + ["v_ilev_gcshape_bull_50"] = true, + ["v_ilev_gcshape_hvyrif_25"] = true, + ["v_ilev_gcshape_hvyrif_50"] = true, + ["v_ilev_gcshape_pistol50_25"] = true, + ["v_ilev_gcshape_pistol50_50"] = true, + ["v_ilev_gcshape_progar_25"] = true, + ["v_ilev_gcshape_progar_50"] = true, + ["v_ilev_genbankdoor1"] = true, + ["v_ilev_genbankdoor2"] = true, + ["v_ilev_gendoor01"] = true, + ["v_ilev_gendoor02"] = true, + ["v_ilev_go_window"] = true, + ["v_ilev_gold"] = true, + ["v_ilev_gtdoor"] = true, + ["v_ilev_gtdoor02"] = true, + ["v_ilev_gunhook"] = true, + ["v_ilev_gunsign_assmg"] = true, + ["v_ilev_gunsign_asssmg"] = true, + ["v_ilev_gunsign_asssniper"] = true, + ["v_ilev_gunsign_bull"] = true, + ["v_ilev_gunsign_hvyrif"] = true, + ["v_ilev_gunsign_pistol50"] = true, + ["v_ilev_gunsign_progar"] = true, + ["v_ilev_hd_chair"] = true, + ["v_ilev_hd_door_l"] = true, + ["v_ilev_hd_door_r"] = true, + ["v_ilev_housedoor1"] = true, + ["v_ilev_j2_door"] = true, + ["v_ilev_janitor_frontdoor"] = true, + ["v_ilev_leath_chr"] = true, + ["v_ilev_lest_bigscreen"] = true, + ["v_ilev_lester_doorfront"] = true, + ["v_ilev_lester_doorveranda"] = true, + ["v_ilev_liconftable_sml"] = true, + ["v_ilev_light_wardrobe_face"] = true, + ["v_ilev_lostdoor"] = true, + ["v_ilev_losttoiletdoor"] = true, + ["v_ilev_m_dinechair"] = true, + ["v_ilev_m_pitcher"] = true, + ["v_ilev_m_sofa"] = true, + ["v_ilev_m_sofacushion"] = true, + ["v_ilev_mchalkbrd_1"] = true, + ["v_ilev_mchalkbrd_2"] = true, + ["v_ilev_mchalkbrd_3"] = true, + ["v_ilev_mchalkbrd_4"] = true, + ["v_ilev_mchalkbrd_5"] = true, + ["v_ilev_melt_set01"] = true, + ["v_ilev_methdoorbust"] = true, + ["v_ilev_methdoorscuff"] = true, + ["v_ilev_methtraildoor"] = true, + ["v_ilev_ml_door1"] = true, + ["v_ilev_mldoor02"] = true, + ["v_ilev_mm_door"] = true, + ["v_ilev_mm_doordaughter"] = true, + ["v_ilev_mm_doorm_l"] = true, + ["v_ilev_mm_doorm_r"] = true, + ["v_ilev_mm_doorson"] = true, + ["v_ilev_mm_doorw"] = true, + ["v_ilev_mm_faucet"] = true, + ["v_ilev_mm_fridge_l"] = true, + ["v_ilev_mm_fridge_r"] = true, + ["v_ilev_mm_fridgeint"] = true, + ["v_ilev_mm_scre_off"] = true, + ["v_ilev_mm_screen"] = true, + ["v_ilev_mm_screen2"] = true, + ["v_ilev_mm_screen2_vl"] = true, + ["v_ilev_mm_windowwc"] = true, + ["v_ilev_moteldoorcso"] = true, + ["v_ilev_mp_bedsidebook"] = true, + ["v_ilev_mp_high_frontdoor"] = true, + ["v_ilev_mp_low_frontdoor"] = true, + ["v_ilev_mp_mid_frontdoor"] = true, + ["v_ilev_mr_rasberryclean"] = true, + ["v_ilev_out_serv_sign"] = true, + ["v_ilev_p_easychair"] = true, + ["v_ilev_ph_bench"] = true, + ["v_ilev_ph_cellgate"] = true, + ["v_ilev_ph_cellgate02"] = true, + ["v_ilev_ph_door002"] = true, + ["v_ilev_ph_door01"] = true, + ["v_ilev_ph_doorframe"] = true, + ["v_ilev_ph_gendoor"] = true, + ["v_ilev_ph_gendoor002"] = true, + ["v_ilev_ph_gendoor003"] = true, + ["v_ilev_ph_gendoor004"] = true, + ["v_ilev_ph_gendoor005"] = true, + ["v_ilev_ph_gendoor006"] = true, + ["v_ilev_phroofdoor"] = true, + ["v_ilev_po_door"] = true, + ["v_ilev_prop_74_emr_3b"] = true, + ["v_ilev_prop_74_emr_3b_02"] = true, + ["v_ilev_prop_fib_glass"] = true, + ["v_ilev_ra_door1_l"] = true, + ["v_ilev_ra_door1_r"] = true, + ["v_ilev_ra_door2"] = true, + ["v_ilev_ra_door3"] = true, + ["v_ilev_ra_door4l"] = true, + ["v_ilev_ra_door4r"] = true, + ["v_ilev_ra_doorsafe"] = true, + ["v_ilev_rc_door1"] = true, + ["v_ilev_rc_door1_st"] = true, + ["v_ilev_rc_door2"] = true, + ["v_ilev_rc_door3_l"] = true, + ["v_ilev_rc_door3_r"] = true, + ["v_ilev_rc_doorel_l"] = true, + ["v_ilev_rc_doorel_r"] = true, + ["v_ilev_rc_win_col"] = true, + ["v_ilev_roc_door1_l"] = true, + ["v_ilev_roc_door1_r"] = true, + ["v_ilev_roc_door2"] = true, + ["v_ilev_roc_door3"] = true, + ["v_ilev_roc_door4"] = true, + ["v_ilev_roc_door5"] = true, + ["v_ilev_serv_door01"] = true, + ["v_ilev_shrf2door"] = true, + ["v_ilev_shrfdoor"] = true, + ["v_ilev_sol_off_door01"] = true, + ["v_ilev_sol_windl"] = true, + ["v_ilev_sol_windr"] = true, + ["v_ilev_spraydoor"] = true, + ["v_ilev_ss_door01"] = true, + ["v_ilev_ss_door02"] = true, + ["v_ilev_ss_door03"] = true, + ["v_ilev_ss_door04"] = true, + ["v_ilev_ss_door5_l"] = true, + ["v_ilev_ss_door5_r"] = true, + ["v_ilev_ss_doorext"] = true, + ["v_ilev_stad_fdoor"] = true, + ["v_ilev_staffdoor"] = true, + ["v_ilev_store_door"] = true, + ["v_ilev_ta_door"] = true, + ["v_ilev_ta_door2"] = true, + ["v_ilev_ta_tatgun"] = true, + ["v_ilev_tort_door"] = true, + ["v_ilev_tort_stool"] = true, + ["v_ilev_tow_doorlifta"] = true, + ["v_ilev_tow_doorliftb"] = true, + ["v_ilev_trev_door"] = true, + ["v_ilev_trev_doorbath"] = true, + ["v_ilev_trev_doorfront"] = true, + ["v_ilev_trev_patiodoor"] = true, + ["v_ilev_trev_pictureframe"] = true, + ["v_ilev_trev_pictureframebroken"] = true, + ["v_ilev_trev_planningboard"] = true, + ["v_ilev_trevtraildr"] = true, + ["v_ilev_tt_plate01"] = true, + ["v_ilev_uvcheetah"] = true, + ["v_ilev_uventity"] = true, + ["v_ilev_uvjb700"] = true, + ["v_ilev_uvline"] = true, + ["v_ilev_uvmonroe"] = true, + ["v_ilev_uvsquiggle"] = true, + ["v_ilev_uvtext"] = true, + ["v_ilev_uvztype"] = true, + ["v_ilev_vag_door"] = true, + ["v_ilev_vagostoiletdoor"] = true, + ["v_ilev_winblnd_clsd"] = true, + ["v_ilev_winblnd_opn"] = true, + ["v_ind_bin_01"] = true, + ["v_ind_cf_bollard"] = true, + ["v_ind_cf_boxes"] = true, + ["v_ind_cf_broom"] = true, + ["v_ind_cf_bugzap"] = true, + ["v_ind_cf_chckbox1"] = true, + ["v_ind_cf_chckbox2"] = true, + ["v_ind_cf_chckbox3"] = true, + ["v_ind_cf_chickfeed"] = true, + ["v_ind_cf_crate"] = true, + ["v_ind_cf_crate1"] = true, + ["v_ind_cf_crate2"] = true, + ["v_ind_cf_flour"] = true, + ["v_ind_cf_meatbox"] = true, + ["v_ind_cf_paltruck"] = true, + ["v_ind_cf_shelf"] = true, + ["v_ind_cf_shelf2"] = true, + ["v_ind_cf_wheat"] = true, + ["v_ind_cf_wheat2"] = true, + ["v_ind_cfbin"] = true, + ["v_ind_cfbottle"] = true, + ["v_ind_cfbox"] = true, + ["v_ind_cfbox2"] = true, + ["v_ind_cfbucket"] = true, + ["v_ind_cfcarcass1"] = true, + ["v_ind_cfcarcass2"] = true, + ["v_ind_cfcarcass3"] = true, + ["v_ind_cfcovercrate"] = true, + ["v_ind_cfcrate3"] = true, + ["v_ind_cfcup"] = true, + ["v_ind_cfemlight"] = true, + ["v_ind_cfkeyboard"] = true, + ["v_ind_cfknife"] = true, + ["v_ind_cflight"] = true, + ["v_ind_cflight02"] = true, + ["v_ind_cfmouse"] = true, + ["v_ind_cfpaste"] = true, + ["v_ind_cfscoop"] = true, + ["v_ind_cftable"] = true, + ["v_ind_cftray"] = true, + ["v_ind_cftrayfillets"] = true, + ["v_ind_cftub"] = true, + ["v_ind_cfwaste"] = true, + ["v_ind_cfwrap"] = true, + ["v_ind_chickensx3"] = true, + ["v_ind_cm_aircomp"] = true, + ["v_ind_cm_crowbar"] = true, + ["v_ind_cm_electricbox"] = true, + ["v_ind_cm_fan"] = true, + ["v_ind_cm_grinder"] = true, + ["v_ind_cm_heatlamp"] = true, + ["v_ind_cm_hosereel"] = true, + ["v_ind_cm_ladder"] = true, + ["v_ind_cm_light_off"] = true, + ["v_ind_cm_light_on"] = true, + ["v_ind_cm_lubcan"] = true, + ["v_ind_cm_paintbckt01"] = true, + ["v_ind_cm_paintbckt02"] = true, + ["v_ind_cm_paintbckt03"] = true, + ["v_ind_cm_paintbckt04"] = true, + ["v_ind_cm_paintbckt06"] = true, + ["v_ind_cm_panelstd"] = true, + ["v_ind_cm_sprgun"] = true, + ["v_ind_cm_tyre01"] = true, + ["v_ind_cm_tyre02"] = true, + ["v_ind_cm_tyre03"] = true, + ["v_ind_cm_tyre04"] = true, + ["v_ind_cm_tyre05"] = true, + ["v_ind_cm_tyre06"] = true, + ["v_ind_cm_tyre07"] = true, + ["v_ind_cm_tyre08"] = true, + ["v_ind_cm_weldmachine"] = true, + ["v_ind_coo_half"] = true, + ["v_ind_coo_heed"] = true, + ["v_ind_coo_quarter"] = true, + ["v_ind_cs_axe"] = true, + ["v_ind_cs_blowtorch"] = true, + ["v_ind_cs_bottle"] = true, + ["v_ind_cs_box01"] = true, + ["v_ind_cs_box02"] = true, + ["v_ind_cs_bucket"] = true, + ["v_ind_cs_chemcan"] = true, + ["v_ind_cs_drill"] = true, + ["v_ind_cs_gascanister"] = true, + ["v_ind_cs_hammer"] = true, + ["v_ind_cs_hifi"] = true, + ["v_ind_cs_hubcap"] = true, + ["v_ind_cs_jerrycan01"] = true, + ["v_ind_cs_jerrycan02"] = true, + ["v_ind_cs_jerrycan03"] = true, + ["v_ind_cs_mallet"] = true, + ["v_ind_cs_oilbot01"] = true, + ["v_ind_cs_oilbot02"] = true, + ["v_ind_cs_oilbot03"] = true, + ["v_ind_cs_oilbot04"] = true, + ["v_ind_cs_oilbot05"] = true, + ["v_ind_cs_oiltin"] = true, + ["v_ind_cs_oiltub"] = true, + ["v_ind_cs_paint"] = true, + ["v_ind_cs_paper"] = true, + ["v_ind_cs_pliers"] = true, + ["v_ind_cs_powersaw"] = true, + ["v_ind_cs_screwdrivr1"] = true, + ["v_ind_cs_screwdrivr2"] = true, + ["v_ind_cs_screwdrivr3"] = true, + ["v_ind_cs_spanner01"] = true, + ["v_ind_cs_spanner02"] = true, + ["v_ind_cs_spanner03"] = true, + ["v_ind_cs_spanner04"] = true, + ["v_ind_cs_spray"] = true, + ["v_ind_cs_striplight"] = true, + ["v_ind_cs_toolboard"] = true, + ["v_ind_cs_toolbox1"] = true, + ["v_ind_cs_toolbox2"] = true, + ["v_ind_cs_toolbox3"] = true, + ["v_ind_cs_toolbox4"] = true, + ["v_ind_cs_tray01"] = true, + ["v_ind_cs_tray02"] = true, + ["v_ind_cs_tray03"] = true, + ["v_ind_cs_tray04"] = true, + ["v_ind_cs_wrench"] = true, + ["v_ind_dc_desk01"] = true, + ["v_ind_dc_desk02"] = true, + ["v_ind_dc_desk03"] = true, + ["v_ind_dc_filecab01"] = true, + ["v_ind_dc_table"] = true, + ["v_ind_fatbox"] = true, + ["v_ind_found_cont_win_frm"] = true, + ["v_ind_meat_comm"] = true, + ["v_ind_meatbench"] = true, + ["v_ind_meatbox"] = true, + ["v_ind_meatboxsml"] = true, + ["v_ind_meatboxsml_02"] = true, + ["v_ind_meatbutton"] = true, + ["v_ind_meatclner"] = true, + ["v_ind_meatcoatblu"] = true, + ["v_ind_meatcoatwhte"] = true, + ["v_ind_meatcpboard"] = true, + ["v_ind_meatdesk"] = true, + ["v_ind_meatdogpack"] = true, + ["v_ind_meatexit"] = true, + ["v_ind_meathatblu"] = true, + ["v_ind_meathatwht"] = true, + ["v_ind_meatpacks"] = true, + ["v_ind_meatpacks_03"] = true, + ["v_ind_meattherm"] = true, + ["v_ind_meatwash"] = true, + ["v_ind_meatwellie"] = true, + ["v_ind_plazbags"] = true, + ["v_ind_rc_balec1"] = true, + ["v_ind_rc_balec2"] = true, + ["v_ind_rc_balec3"] = true, + ["v_ind_rc_balep1"] = true, + ["v_ind_rc_balep2"] = true, + ["v_ind_rc_balep3"] = true, + ["v_ind_rc_bench"] = true, + ["v_ind_rc_brush"] = true, + ["v_ind_rc_cage"] = true, + ["v_ind_rc_dustmask"] = true, + ["v_ind_rc_fans"] = true, + ["v_ind_rc_hanger"] = true, + ["v_ind_rc_locker"] = true, + ["v_ind_rc_lockeropn"] = true, + ["v_ind_rc_lowtable"] = true, + ["v_ind_rc_overalldrp"] = true, + ["v_ind_rc_overallfld"] = true, + ["v_ind_rc_plaztray"] = true, + ["v_ind_rc_rubbish"] = true, + ["v_ind_rc_rubbish2"] = true, + ["v_ind_rc_rubbishppr"] = true, + ["v_ind_rc_shovel"] = true, + ["v_ind_rc_towel"] = true, + ["v_ind_rc_workbag"] = true, + ["v_ind_sinkequip"] = true, + ["v_ind_sinkhand"] = true, + ["v_ind_ss_box01"] = true, + ["v_ind_ss_box02"] = true, + ["v_ind_ss_box03"] = true, + ["v_ind_ss_box04"] = true, + ["v_ind_ss_chair01"] = true, + ["v_ind_ss_chair2"] = true, + ["v_ind_ss_chair3_cso"] = true, + ["v_ind_ss_clothrack"] = true, + ["v_ind_ss_deskfan"] = true, + ["v_ind_ss_deskfan2"] = true, + ["v_ind_ss_laptop"] = true, + ["v_ind_ss_materiala"] = true, + ["v_ind_ss_materialb"] = true, + ["v_ind_ss_thread1"] = true, + ["v_ind_ss_thread10"] = true, + ["v_ind_ss_thread2"] = true, + ["v_ind_ss_thread3"] = true, + ["v_ind_ss_thread4"] = true, + ["v_ind_ss_thread5"] = true, + ["v_ind_ss_thread6"] = true, + ["v_ind_ss_thread7"] = true, + ["v_ind_ss_thread8"] = true, + ["v_ind_ss_thread9"] = true, + ["v_ind_ss_threadsa"] = true, + ["v_ind_ss_threadsb"] = true, + ["v_ind_ss_threadsc"] = true, + ["v_ind_ss_threadsd"] = true, + ["v_ind_tor_bulkheadlight"] = true, + ["v_ind_tor_clockincard"] = true, + ["v_ind_tor_smallhoist01"] = true, + ["v_ind_v_recycle_lamp1"] = true, + ["v_lirg_frankaunt_ward_face"] = true, + ["v_lirg_frankaunt_ward_main"] = true, + ["v_lirg_frankhill_ward_face"] = true, + ["v_lirg_frankhill_ward_main"] = true, + ["v_lirg_gunlight"] = true, + ["v_lirg_michael_ward_default"] = true, + ["v_lirg_michael_ward_face"] = true, + ["v_lirg_michael_ward_main"] = true, + ["v_lirg_mphigh_ward_face"] = true, + ["v_lirg_mphigh_ward_main"] = true, + ["v_lirg_shop_high"] = true, + ["v_lirg_shop_low"] = true, + ["v_lirg_shop_mid"] = true, + ["v_lirg_trevapt_ward_face"] = true, + ["v_lirg_trevapt_ward_main"] = true, + ["v_lirg_trevstrip_ward_face"] = true, + ["v_lirg_trevstrip_ward_main"] = true, + ["v_lirg_trevtrail_ward_face"] = true, + ["v_lirg_trevtrail_ward_main"] = true, + ["v_med_apecrate"] = true, + ["v_med_apecratelrg"] = true, + ["v_med_barrel"] = true, + ["v_med_beaker"] = true, + ["v_med_bed1"] = true, + ["v_med_bed2"] = true, + ["v_med_bedtable"] = true, + ["v_med_bench1"] = true, + ["v_med_bench2"] = true, + ["v_med_benchcentr"] = true, + ["v_med_benchset1"] = true, + ["v_med_bigtable"] = true, + ["v_med_bin"] = true, + ["v_med_bl_fan_base"] = true, + ["v_med_bottles1"] = true, + ["v_med_bottles2"] = true, + ["v_med_bottles3"] = true, + ["v_med_centrifuge1"] = true, + ["v_med_centrifuge2"] = true, + ["v_med_cooler"] = true, + ["v_med_cor_alarmlight"] = true, + ["v_med_cor_autopsytbl"] = true, + ["v_med_cor_ceilingmonitor"] = true, + ["v_med_cor_cembin"] = true, + ["v_med_cor_cemtrolly"] = true, + ["v_med_cor_cemtrolly2"] = true, + ["v_med_cor_chemical"] = true, + ["v_med_cor_divider"] = true, + ["v_med_cor_dividerframe"] = true, + ["v_med_cor_downlight"] = true, + ["v_med_cor_emblmtable"] = true, + ["v_med_cor_fileboxa"] = true, + ["v_med_cor_filingcab"] = true, + ["v_med_cor_flatscreentv"] = true, + ["v_med_cor_hose"] = true, + ["v_med_cor_largecupboard"] = true, + ["v_med_cor_lightbox"] = true, + ["v_med_cor_mask"] = true, + ["v_med_cor_masks"] = true, + ["v_med_cor_medhose"] = true, + ["v_med_cor_medstool"] = true, + ["v_med_cor_minifridge"] = true, + ["v_med_cor_neckrest"] = true, + ["v_med_cor_offglass"] = true, + ["v_med_cor_offglasssm"] = true, + ["v_med_cor_offglasstopw"] = true, + ["v_med_cor_papertowels"] = true, + ["v_med_cor_photocopy"] = true, + ["v_med_cor_pinboard"] = true, + ["v_med_cor_reception_glass"] = true, + ["v_med_cor_shelfrack"] = true, + ["v_med_cor_stepladder"] = true, + ["v_med_cor_tvstand"] = true, + ["v_med_cor_unita"] = true, + ["v_med_cor_walllight"] = true, + ["v_med_cor_wallunita"] = true, + ["v_med_cor_wallunitb"] = true, + ["v_med_cor_wheelbench"] = true, + ["v_med_cor_whiteboard"] = true, + ["v_med_cor_winftop"] = true, + ["v_med_cor_winfwide"] = true, + ["v_med_corlowfilecab"] = true, + ["v_med_crutch01"] = true, + ["v_med_curtains"] = true, + ["v_med_curtains1"] = true, + ["v_med_curtains2"] = true, + ["v_med_curtains3"] = true, + ["v_med_curtainsnewcloth1"] = true, + ["v_med_curtainsnewcloth2"] = true, + ["v_med_emptybed"] = true, + ["v_med_examlight"] = true, + ["v_med_examlight_static"] = true, + ["v_med_fabricchair1"] = true, + ["v_med_flask"] = true, + ["v_med_fumesink"] = true, + ["v_med_gastank"] = true, + ["v_med_hazmatscan"] = true, + ["v_med_hospheadwall1"] = true, + ["v_med_hospseating1"] = true, + ["v_med_hospseating2"] = true, + ["v_med_hospseating3"] = true, + ["v_med_hospseating4"] = true, + ["v_med_hosptable"] = true, + ["v_med_hosptableglass"] = true, + ["v_med_lab_elecbox1"] = true, + ["v_med_lab_elecbox2"] = true, + ["v_med_lab_elecbox3"] = true, + ["v_med_lab_filtera"] = true, + ["v_med_lab_filterb"] = true, + ["v_med_lab_fridge"] = true, + ["v_med_lab_optable"] = true, + ["v_med_lab_wallcab"] = true, + ["v_med_lab_whboard1"] = true, + ["v_med_lab_whboard2"] = true, + ["v_med_latexgloveboxblue"] = true, + ["v_med_latexgloveboxgreen"] = true, + ["v_med_latexgloveboxred"] = true, + ["v_med_lrgisolator"] = true, + ["v_med_mattress"] = true, + ["v_med_medwastebin"] = true, + ["v_med_metalfume"] = true, + ["v_med_microscope"] = true, + ["v_med_oscillator1"] = true, + ["v_med_oscillator2"] = true, + ["v_med_oscillator3"] = true, + ["v_med_oscillator4"] = true, + ["v_med_p_coffeetable"] = true, + ["v_med_p_desk"] = true, + ["v_med_p_deskchair"] = true, + ["v_med_p_easychair"] = true, + ["v_med_p_ext_plant"] = true, + ["v_med_p_fanlight"] = true, + ["v_med_p_figfish"] = true, + ["v_med_p_floorlamp"] = true, + ["v_med_p_lamp_on"] = true, + ["v_med_p_notebook"] = true, + ["v_med_p_phrenhead"] = true, + ["v_med_p_planter"] = true, + ["v_med_p_sideboard"] = true, + ["v_med_p_sidetable"] = true, + ["v_med_p_sofa"] = true, + ["v_med_p_tidybox"] = true, + ["v_med_p_vaseround"] = true, + ["v_med_p_vasetall"] = true, + ["v_med_p_wallhead"] = true, + ["v_med_pillow"] = true, + ["v_med_smokealarm"] = true, + ["v_med_soapdisp"] = true, + ["v_med_soapdispencer"] = true, + ["v_med_storage"] = true, + ["v_med_testtubes"] = true, + ["v_med_testuberack"] = true, + ["v_med_trolley"] = true, + ["v_med_trolley2"] = true, + ["v_med_vats"] = true, + ["v_med_vcor_winfnarrow"] = true, + ["v_med_wallpicture1"] = true, + ["v_med_wallpicture2"] = true, + ["v_med_whickchair2"] = true, + ["v_med_whickchair2bit"] = true, + ["v_med_whickerchair1"] = true, + ["v_med_xray"] = true, + ["v_proc2_temp"] = true, + ["v_prop_floatcandle"] = true, + ["v_res_binder"] = true, + ["v_res_bowl_dec"] = true, + ["v_res_cabinet"] = true, + ["v_res_cakedome"] = true, + ["v_res_cctv"] = true, + ["v_res_cd"] = true, + ["v_res_cdstorage"] = true, + ["v_res_cherubvase"] = true, + ["v_res_d_armchair"] = true, + ["v_res_d_bed"] = true, + ["v_res_d_closetdoorl"] = true, + ["v_res_d_closetdoorr"] = true, + ["v_res_d_coffeetable"] = true, + ["v_res_d_dildo_a"] = true, + ["v_res_d_dildo_b"] = true, + ["v_res_d_dildo_c"] = true, + ["v_res_d_dildo_d"] = true, + ["v_res_d_dildo_e"] = true, + ["v_res_d_dildo_f"] = true, + ["v_res_d_dressdummy"] = true, + ["v_res_d_dressingtable"] = true, + ["v_res_d_highchair"] = true, + ["v_res_d_lampa"] = true, + ["v_res_d_lube"] = true, + ["v_res_d_paddedwall"] = true, + ["v_res_d_ramskull"] = true, + ["v_res_d_roundtable"] = true, + ["v_res_d_sideunit"] = true, + ["v_res_d_smallsidetable"] = true, + ["v_res_d_sofa"] = true, + ["v_res_d_whips"] = true, + ["v_res_d_zimmerframe"] = true, + ["v_res_desklamp"] = true, + ["v_res_desktidy"] = true, + ["v_res_exoticvase"] = true, + ["v_res_fa_basket"] = true, + ["v_res_fa_book01"] = true, + ["v_res_fa_book02"] = true, + ["v_res_fa_book03"] = true, + ["v_res_fa_book04"] = true, + ["v_res_fa_boot01l"] = true, + ["v_res_fa_boot01r"] = true, + ["v_res_fa_bread01"] = true, + ["v_res_fa_bread02"] = true, + ["v_res_fa_bread03"] = true, + ["v_res_fa_butknife"] = true, + ["v_res_fa_candle01"] = true, + ["v_res_fa_candle02"] = true, + ["v_res_fa_candle03"] = true, + ["v_res_fa_candle04"] = true, + ["v_res_fa_cap01"] = true, + ["v_res_fa_cereal01"] = true, + ["v_res_fa_cereal02"] = true, + ["v_res_fa_chair01"] = true, + ["v_res_fa_chair02"] = true, + ["v_res_fa_chopbrd"] = true, + ["v_res_fa_crystal01"] = true, + ["v_res_fa_crystal02"] = true, + ["v_res_fa_crystal03"] = true, + ["v_res_fa_fan"] = true, + ["v_res_fa_grater"] = true, + ["v_res_fa_idol02"] = true, + ["v_res_fa_ketchup"] = true, + ["v_res_fa_lamp1on"] = true, + ["v_res_fa_lamp2off"] = true, + ["v_res_fa_mag_motor"] = true, + ["v_res_fa_mag_rumor"] = true, + ["v_res_fa_magtidy"] = true, + ["v_res_fa_phone"] = true, + ["v_res_fa_plant01"] = true, + ["v_res_fa_potcof"] = true, + ["v_res_fa_potnoodle"] = true, + ["v_res_fa_potsug"] = true, + ["v_res_fa_pottea"] = true, + ["v_res_fa_pyramid"] = true, + ["v_res_fa_radioalrm"] = true, + ["v_res_fa_shoebox1"] = true, + ["v_res_fa_shoebox2"] = true, + ["v_res_fa_shoebox3"] = true, + ["v_res_fa_shoebox4"] = true, + ["v_res_fa_smokealarm"] = true, + ["v_res_fa_sponge01"] = true, + ["v_res_fa_stones01"] = true, + ["v_res_fa_tincorn"] = true, + ["v_res_fa_tintomsoup"] = true, + ["v_res_fa_trainer01l"] = true, + ["v_res_fa_trainer01r"] = true, + ["v_res_fa_trainer02l"] = true, + ["v_res_fa_trainer02r"] = true, + ["v_res_fa_trainer03l"] = true, + ["v_res_fa_trainer03r"] = true, + ["v_res_fa_trainer04l"] = true, + ["v_res_fa_trainer04r"] = true, + ["v_res_fa_umbrella"] = true, + ["v_res_fa_washlq"] = true, + ["v_res_fa_yogamat002"] = true, + ["v_res_fa_yogamat1"] = true, + ["v_res_fashmag1"] = true, + ["v_res_fashmagopen"] = true, + ["v_res_fh_aftershavebox"] = true, + ["v_res_fh_barcchair"] = true, + ["v_res_fh_bedsideclock"] = true, + ["v_res_fh_benchlong"] = true, + ["v_res_fh_benchshort"] = true, + ["v_res_fh_coftablea"] = true, + ["v_res_fh_coftableb"] = true, + ["v_res_fh_coftbldisp"] = true, + ["v_res_fh_crateclosed"] = true, + ["v_res_fh_crateopen"] = true, + ["v_res_fh_dineeamesa"] = true, + ["v_res_fh_dineeamesb"] = true, + ["v_res_fh_dineeamesc"] = true, + ["v_res_fh_diningtable"] = true, + ["v_res_fh_easychair"] = true, + ["v_res_fh_floorlamp"] = true, + ["v_res_fh_flowersa"] = true, + ["v_res_fh_fruitbowl"] = true, + ["v_res_fh_guitaramp"] = true, + ["v_res_fh_kitnstool"] = true, + ["v_res_fh_lampa_on"] = true, + ["v_res_fh_laundrybasket"] = true, + ["v_res_fh_pouf"] = true, + ["v_res_fh_sculptmod"] = true, + ["v_res_fh_sidebrddine"] = true, + ["v_res_fh_sidebrdlng"] = true, + ["v_res_fh_sidebrdlngb"] = true, + ["v_res_fh_singleseat"] = true, + ["v_res_fh_sofa"] = true, + ["v_res_fh_speaker"] = true, + ["v_res_fh_speakerdock"] = true, + ["v_res_fh_tableplace"] = true, + ["v_res_fh_towelstack"] = true, + ["v_res_fh_towerfan"] = true, + ["v_res_filebox01"] = true, + ["v_res_foodjara"] = true, + ["v_res_foodjarb"] = true, + ["v_res_foodjarc"] = true, + ["v_res_fridgemoda"] = true, + ["v_res_fridgemodsml"] = true, + ["v_res_glasspot"] = true, + ["v_res_harddrive"] = true, + ["v_res_int_oven"] = true, + ["v_res_investbook01"] = true, + ["v_res_investbook08"] = true, + ["v_res_ipoddock"] = true, + ["v_res_ivy"] = true, + ["v_res_j_coffeetable"] = true, + ["v_res_j_dinechair"] = true, + ["v_res_j_lowtable"] = true, + ["v_res_j_magrack"] = true, + ["v_res_j_phone"] = true, + ["v_res_j_radio"] = true, + ["v_res_j_sofa"] = true, + ["v_res_j_stool"] = true, + ["v_res_j_tablelamp1"] = true, + ["v_res_j_tablelamp2"] = true, + ["v_res_j_tvstand"] = true, + ["v_res_jarmchair"] = true, + ["v_res_jcushiona"] = true, + ["v_res_jcushionb"] = true, + ["v_res_jcushionc"] = true, + ["v_res_jcushiond"] = true, + ["v_res_jewelbox"] = true, + ["v_res_keyboard"] = true, + ["v_res_kitchnstool"] = true, + ["v_res_lest_bigscreen"] = true, + ["v_res_lest_monitor"] = true, + ["v_res_lestersbed"] = true, + ["v_res_m_armchair"] = true, + ["v_res_m_armoire"] = true, + ["v_res_m_armoirmove"] = true, + ["v_res_m_bananaplant"] = true, + ["v_res_m_candle"] = true, + ["v_res_m_candlelrg"] = true, + ["v_res_m_console"] = true, + ["v_res_m_dinechair"] = true, + ["v_res_m_dinetble"] = true, + ["v_res_m_dinetble_replace"] = true, + ["v_res_m_fame_flyer"] = true, + ["v_res_m_fameshame"] = true, + ["v_res_m_h_console"] = true, + ["v_res_m_h_sofa"] = true, + ["v_res_m_h_sofa_sml"] = true, + ["v_res_m_horsefig"] = true, + ["v_res_m_kscales"] = true, + ["v_res_m_l_chair1"] = true, + ["v_res_m_lampstand"] = true, + ["v_res_m_lampstand2"] = true, + ["v_res_m_lamptbl"] = true, + ["v_res_m_lamptbl_off"] = true, + ["v_res_m_palmstairs"] = true, + ["v_res_m_pot1"] = true, + ["v_res_m_sidetable"] = true, + ["v_res_m_sinkunit"] = true, + ["v_res_m_spanishbox"] = true, + ["v_res_m_statue"] = true, + ["v_res_m_stool"] = true, + ["v_res_m_stool_replaced"] = true, + ["v_res_m_urn"] = true, + ["v_res_m_vasedead"] = true, + ["v_res_m_vasefresh"] = true, + ["v_res_m_wbowl_move"] = true, + ["v_res_m_wctoiletroll"] = true, + ["v_res_m_woodbowl"] = true, + ["v_res_mbaccessory"] = true, + ["v_res_mbath"] = true, + ["v_res_mbathpot"] = true, + ["v_res_mbbed"] = true, + ["v_res_mbbed_mess"] = true, + ["v_res_mbbedtable"] = true, + ["v_res_mbbin"] = true, + ["v_res_mbchair"] = true, + ["v_res_mbdresser"] = true, + ["v_res_mbottoman"] = true, + ["v_res_mbowl"] = true, + ["v_res_mbowlornate"] = true, + ["v_res_mbronzvase"] = true, + ["v_res_mbsink"] = true, + ["v_res_mbtaps"] = true, + ["v_res_mbtowel"] = true, + ["v_res_mbtowelfld"] = true, + ["v_res_mchalkbrd"] = true, + ["v_res_mchopboard"] = true, + ["v_res_mcofcup"] = true, + ["v_res_mcofcupdirt"] = true, + ["v_res_mconsolemod"] = true, + ["v_res_mconsolemove"] = true, + ["v_res_mconsoletrad"] = true, + ["v_res_mcupboard"] = true, + ["v_res_mdbed"] = true, + ["v_res_mdbedlamp"] = true, + ["v_res_mdbedlamp_off"] = true, + ["v_res_mdbedtable"] = true, + ["v_res_mdchest"] = true, + ["v_res_mdchest_moved"] = true, + ["v_res_mddesk"] = true, + ["v_res_mddresser"] = true, + ["v_res_mddresser_off"] = true, + ["v_res_mexball"] = true, + ["v_res_mflowers"] = true, + ["v_res_mknifeblock"] = true, + ["v_res_mkniferack"] = true, + ["v_res_mlaundry"] = true, + ["v_res_mm_audio"] = true, + ["v_res_mmug"] = true, + ["v_res_monitor"] = true, + ["v_res_monitorsquare"] = true, + ["v_res_monitorstand"] = true, + ["v_res_monitorwidelarge"] = true, + ["v_res_mountedprojector"] = true, + ["v_res_mousemat"] = true, + ["v_res_mp_ashtraya"] = true, + ["v_res_mp_ashtrayb"] = true, + ["v_res_mp_sofa"] = true, + ["v_res_mp_stripchair"] = true, + ["v_res_mplanttongue"] = true, + ["v_res_mplatelrg"] = true, + ["v_res_mplatesml"] = true, + ["v_res_mplinth"] = true, + ["v_res_mpotpouri"] = true, + ["v_res_msidetblemod"] = true, + ["v_res_msonbed"] = true, + ["v_res_msonbed_s"] = true, + ["v_res_msoncabinet"] = true, + ["v_res_mtblelampmod"] = true, + ["v_res_mutensils"] = true, + ["v_res_mvasechinese"] = true, + ["v_res_officeboxfile01"] = true, + ["v_res_ovenhobmod"] = true, + ["v_res_paperfolders"] = true, + ["v_res_pcheadset"] = true, + ["v_res_pcspeaker"] = true, + ["v_res_pctower"] = true, + ["v_res_pcwoofer"] = true, + ["v_res_pestle"] = true, + ["v_res_picture_frame"] = true, + ["v_res_plate_dec"] = true, + ["v_res_printer"] = true, + ["v_res_r_bublbath"] = true, + ["v_res_r_coffpot"] = true, + ["v_res_r_cottonbuds"] = true, + ["v_res_r_figauth1"] = true, + ["v_res_r_figauth2"] = true, + ["v_res_r_figcat"] = true, + ["v_res_r_figclown"] = true, + ["v_res_r_figdancer"] = true, + ["v_res_r_figfemale"] = true, + ["v_res_r_figflamenco"] = true, + ["v_res_r_figgirl"] = true, + ["v_res_r_figgirlclown"] = true, + ["v_res_r_fighorse"] = true, + ["v_res_r_fighorsestnd"] = true, + ["v_res_r_figoblisk"] = true, + ["v_res_r_figpillar"] = true, + ["v_res_r_lotion"] = true, + ["v_res_r_milkjug"] = true, + ["v_res_r_pepppot"] = true, + ["v_res_r_perfume"] = true, + ["v_res_r_silvrtray"] = true, + ["v_res_r_sofa"] = true, + ["v_res_r_sugarbowl"] = true, + ["v_res_r_teapot"] = true, + ["v_res_rosevase"] = true, + ["v_res_rosevasedead"] = true, + ["v_res_rubberplant"] = true, + ["v_res_sculpt_dec"] = true, + ["v_res_sculpt_decb"] = true, + ["v_res_sculpt_decd"] = true, + ["v_res_sculpt_dece"] = true, + ["v_res_sculpt_decf"] = true, + ["v_res_skateboard"] = true, + ["v_res_sketchpad"] = true, + ["v_res_smallplasticbox"] = true, + ["v_res_son_desk"] = true, + ["v_res_son_unitgone"] = true, + ["v_res_study_chair"] = true, + ["v_res_tabloidsa"] = true, + ["v_res_tabloidsb"] = true, + ["v_res_tabloidsc"] = true, + ["v_res_tissues"] = true, + ["v_res_tre_alarmbox"] = true, + ["v_res_tre_banana"] = true, + ["v_res_tre_basketmess"] = true, + ["v_res_tre_bed1"] = true, + ["v_res_tre_bed1_messy"] = true, + ["v_res_tre_bed2"] = true, + ["v_res_tre_bedsidetable"] = true, + ["v_res_tre_bedsidetableb"] = true, + ["v_res_tre_bin"] = true, + ["v_res_tre_chair"] = true, + ["v_res_tre_cuprack"] = true, + ["v_res_tre_cushiona"] = true, + ["v_res_tre_cushionb"] = true, + ["v_res_tre_cushionc"] = true, + ["v_res_tre_cushiond"] = true, + ["v_res_tre_cushnscuzb"] = true, + ["v_res_tre_cushnscuzd"] = true, + ["v_res_tre_dvdplayer"] = true, + ["v_res_tre_flatbasket"] = true, + ["v_res_tre_fridge"] = true, + ["v_res_tre_fruitbowl"] = true, + ["v_res_tre_laundrybasket"] = true, + ["v_res_tre_lightfan"] = true, + ["v_res_tre_mixer"] = true, + ["v_res_tre_officechair"] = true, + ["v_res_tre_pineapple"] = true, + ["v_res_tre_plant"] = true, + ["v_res_tre_plugsocket"] = true, + ["v_res_tre_remote"] = true, + ["v_res_tre_sideboard"] = true, + ["v_res_tre_smallbookshelf"] = true, + ["v_res_tre_sofa"] = true, + ["v_res_tre_sofa_mess_a"] = true, + ["v_res_tre_sofa_mess_b"] = true, + ["v_res_tre_sofa_mess_c"] = true, + ["v_res_tre_sofa_s"] = true, + ["v_res_tre_stool"] = true, + ["v_res_tre_stool_leather"] = true, + ["v_res_tre_stool_scuz"] = true, + ["v_res_tre_storagebox"] = true, + ["v_res_tre_storageunit"] = true, + ["v_res_tre_table001"] = true, + ["v_res_tre_table2"] = true, + ["v_res_tre_talllamp"] = true, + ["v_res_tre_tree"] = true, + ["v_res_tre_tvstand"] = true, + ["v_res_tre_tvstand_tall"] = true, + ["v_res_tre_wardrobe"] = true, + ["v_res_tre_washbasket"] = true, + ["v_res_tre_wdunitscuz"] = true, + ["v_res_tre_weight"] = true, + ["v_res_tre_woodunit"] = true, + ["v_res_trev_framechair"] = true, + ["v_res_tt_basket"] = true, + ["v_res_tt_bed"] = true, + ["v_res_tt_bedpillow"] = true, + ["v_res_tt_bowl"] = true, + ["v_res_tt_bowlpile01"] = true, + ["v_res_tt_bowlpile02"] = true, + ["v_res_tt_can01"] = true, + ["v_res_tt_can02"] = true, + ["v_res_tt_can03"] = true, + ["v_res_tt_cancrsh01"] = true, + ["v_res_tt_cancrsh02"] = true, + ["v_res_tt_cbbox"] = true, + ["v_res_tt_cereal01"] = true, + ["v_res_tt_cereal02"] = true, + ["v_res_tt_cigs01"] = true, + ["v_res_tt_doughnut01"] = true, + ["v_res_tt_doughnuts"] = true, + ["v_res_tt_flusher"] = true, + ["v_res_tt_fridge"] = true, + ["v_res_tt_fridgedoor"] = true, + ["v_res_tt_lighter"] = true, + ["v_res_tt_litter1"] = true, + ["v_res_tt_litter2"] = true, + ["v_res_tt_litter3"] = true, + ["v_res_tt_looroll"] = true, + ["v_res_tt_milk"] = true, + ["v_res_tt_mug01"] = true, + ["v_res_tt_mug2"] = true, + ["v_res_tt_pharm1"] = true, + ["v_res_tt_pharm2"] = true, + ["v_res_tt_pharm3"] = true, + ["v_res_tt_pizzaplate"] = true, + ["v_res_tt_plate01"] = true, + ["v_res_tt_platepile"] = true, + ["v_res_tt_plunger"] = true, + ["v_res_tt_porndvd01"] = true, + ["v_res_tt_porndvd02"] = true, + ["v_res_tt_porndvd03"] = true, + ["v_res_tt_porndvd04"] = true, + ["v_res_tt_pornmag01"] = true, + ["v_res_tt_pornmag02"] = true, + ["v_res_tt_pornmag03"] = true, + ["v_res_tt_pornmag04"] = true, + ["v_res_tt_pot01"] = true, + ["v_res_tt_pot02"] = true, + ["v_res_tt_pot03"] = true, + ["v_res_tt_sofa"] = true, + ["v_res_tt_tissues"] = true, + ["v_res_tt_tvremote"] = true, + ["v_res_vacuum"] = true, + ["v_res_vhsplayer"] = true, + ["v_res_videotape"] = true, + ["v_res_wall"] = true, + ["v_res_wall_cornertop"] = true, + ["v_ret_247_bread1"] = true, + ["v_ret_247_cereal1"] = true, + ["v_ret_247_choptom"] = true, + ["v_ret_247_cigs"] = true, + ["v_ret_247_donuts"] = true, + ["v_ret_247_eggs"] = true, + ["v_ret_247_flour"] = true, + ["v_ret_247_fruit"] = true, + ["v_ret_247_ketchup1"] = true, + ["v_ret_247_ketchup2"] = true, + ["v_ret_247_lottery"] = true, + ["v_ret_247_lotterysign"] = true, + ["v_ret_247_mustard"] = true, + ["v_ret_247_noodle1"] = true, + ["v_ret_247_noodle2"] = true, + ["v_ret_247_noodle3"] = true, + ["v_ret_247_pharmbetta"] = true, + ["v_ret_247_pharmbox"] = true, + ["v_ret_247_pharmdeo"] = true, + ["v_ret_247_pharmstuff"] = true, + ["v_ret_247_popbot4"] = true, + ["v_ret_247_popcan2"] = true, + ["v_ret_247_soappowder2"] = true, + ["v_ret_247_sweetcount"] = true, + ["v_ret_247_swtcorn2"] = true, + ["v_ret_247_tomsoup1"] = true, + ["v_ret_247_tuna"] = true, + ["v_ret_247_vegsoup1"] = true, + ["v_ret_247_win1"] = true, + ["v_ret_247_win2"] = true, + ["v_ret_247_win3"] = true, + ["v_ret_247shelves01"] = true, + ["v_ret_247shelves02"] = true, + ["v_ret_247shelves03"] = true, + ["v_ret_247shelves04"] = true, + ["v_ret_247shelves05"] = true, + ["v_ret_baglrg"] = true, + ["v_ret_bagsml"] = true, + ["v_ret_box"] = true, + ["v_ret_chair"] = true, + ["v_ret_chair_white"] = true, + ["v_ret_csr_bin"] = true, + ["v_ret_csr_signa"] = true, + ["v_ret_csr_signb"] = true, + ["v_ret_csr_signc"] = true, + ["v_ret_csr_signceiling"] = true, + ["v_ret_csr_signd"] = true, + ["v_ret_csr_signtri"] = true, + ["v_ret_csr_signtrismall"] = true, + ["v_ret_csr_table"] = true, + ["v_ret_csr_tyresale"] = true, + ["v_ret_fh_ashtray"] = true, + ["v_ret_fh_bsbag"] = true, + ["v_ret_fh_bscup"] = true, + ["v_ret_fh_chair01"] = true, + ["v_ret_fh_coolbox"] = true, + ["v_ret_fh_dinetable"] = true, + ["v_ret_fh_displayc"] = true, + ["v_ret_fh_doorframe"] = true, + ["v_ret_fh_doorfrmwide"] = true, + ["v_ret_fh_dryer"] = true, + ["v_ret_fh_emptybot1"] = true, + ["v_ret_fh_emptybot2"] = true, + ["v_ret_fh_fanltoff"] = true, + ["v_ret_fh_fanltonbas"] = true, + ["v_ret_fh_fry02"] = true, + ["v_ret_fh_ironbrd"] = true, + ["v_ret_fh_kitchtable"] = true, + ["v_ret_fh_noodle"] = true, + ["v_ret_fh_pizza01"] = true, + ["v_ret_fh_pizza02"] = true, + ["v_ret_fh_plate1"] = true, + ["v_ret_fh_plate2"] = true, + ["v_ret_fh_plate3"] = true, + ["v_ret_fh_plate4"] = true, + ["v_ret_fh_pot01"] = true, + ["v_ret_fh_pot02"] = true, + ["v_ret_fh_pot05"] = true, + ["v_ret_fh_radiator"] = true, + ["v_ret_fh_shelf_01"] = true, + ["v_ret_fh_shelf_02"] = true, + ["v_ret_fh_shelf_03"] = true, + ["v_ret_fh_shelf_04"] = true, + ["v_ret_fh_walllightoff"] = true, + ["v_ret_fh_walllighton"] = true, + ["v_ret_fh_washmach"] = true, + ["v_ret_fh_wickbskt"] = true, + ["v_ret_fhglassairfrm"] = true, + ["v_ret_fhglassfrm"] = true, + ["v_ret_fhglassfrmsml"] = true, + ["v_ret_flowers"] = true, + ["v_ret_gassweetcount"] = true, + ["v_ret_gassweets"] = true, + ["v_ret_gc_ammo1"] = true, + ["v_ret_gc_ammo2"] = true, + ["v_ret_gc_ammo3"] = true, + ["v_ret_gc_ammo4"] = true, + ["v_ret_gc_ammo5"] = true, + ["v_ret_gc_ammo8"] = true, + ["v_ret_gc_ammostack"] = true, + ["v_ret_gc_bag01"] = true, + ["v_ret_gc_bag02"] = true, + ["v_ret_gc_bin"] = true, + ["v_ret_gc_boot04"] = true, + ["v_ret_gc_bootdisp"] = true, + ["v_ret_gc_box1"] = true, + ["v_ret_gc_box2"] = true, + ["v_ret_gc_bullet"] = true, + ["v_ret_gc_calc"] = true, + ["v_ret_gc_cashreg"] = true, + ["v_ret_gc_chair01"] = true, + ["v_ret_gc_chair02"] = true, + ["v_ret_gc_chair03"] = true, + ["v_ret_gc_clock"] = true, + ["v_ret_gc_cup"] = true, + ["v_ret_gc_ear01"] = true, + ["v_ret_gc_ear02"] = true, + ["v_ret_gc_ear03"] = true, + ["v_ret_gc_fan"] = true, + ["v_ret_gc_fax"] = true, + ["v_ret_gc_folder1"] = true, + ["v_ret_gc_folder2"] = true, + ["v_ret_gc_gasmask"] = true, + ["v_ret_gc_knifehold1"] = true, + ["v_ret_gc_knifehold2"] = true, + ["v_ret_gc_lamp"] = true, + ["v_ret_gc_mags"] = true, + ["v_ret_gc_mug01"] = true, + ["v_ret_gc_mug02"] = true, + ["v_ret_gc_mug03"] = true, + ["v_ret_gc_mugdisplay"] = true, + ["v_ret_gc_pen1"] = true, + ["v_ret_gc_pen2"] = true, + ["v_ret_gc_phone"] = true, + ["v_ret_gc_plant1"] = true, + ["v_ret_gc_print"] = true, + ["v_ret_gc_scissors"] = true, + ["v_ret_gc_shred"] = true, + ["v_ret_gc_sprinkler"] = true, + ["v_ret_gc_staple"] = true, + ["v_ret_gc_trays"] = true, + ["v_ret_gc_tshirt1"] = true, + ["v_ret_gc_tshirt5"] = true, + ["v_ret_gc_tv"] = true, + ["v_ret_gc_vent"] = true, + ["v_ret_gs_glass01"] = true, + ["v_ret_gs_glass02"] = true, + ["v_ret_hd_hooks_"] = true, + ["v_ret_hd_prod1_"] = true, + ["v_ret_hd_prod2_"] = true, + ["v_ret_hd_prod3_"] = true, + ["v_ret_hd_prod4_"] = true, + ["v_ret_hd_prod5_"] = true, + ["v_ret_hd_prod6_"] = true, + ["v_ret_hd_unit1_"] = true, + ["v_ret_hd_unit2_"] = true, + ["v_ret_j_flowerdisp"] = true, + ["v_ret_j_flowerdisp_white"] = true, + ["v_ret_mirror"] = true, + ["v_ret_ml_6bottles"] = true, + ["v_ret_ml_beeram"] = true, + ["v_ret_ml_beerbar"] = true, + ["v_ret_ml_beerben1"] = true, + ["v_ret_ml_beerben2"] = true, + ["v_ret_ml_beerbla1"] = true, + ["v_ret_ml_beerbla2"] = true, + ["v_ret_ml_beerdus"] = true, + ["v_ret_ml_beerjak1"] = true, + ["v_ret_ml_beerjak2"] = true, + ["v_ret_ml_beerlog1"] = true, + ["v_ret_ml_beerlog2"] = true, + ["v_ret_ml_beerpat1"] = true, + ["v_ret_ml_beerpat2"] = true, + ["v_ret_ml_beerpis1"] = true, + ["v_ret_ml_beerpis2"] = true, + ["v_ret_ml_beerpride"] = true, + ["v_ret_ml_chips1"] = true, + ["v_ret_ml_chips2"] = true, + ["v_ret_ml_chips3"] = true, + ["v_ret_ml_chips4"] = true, + ["v_ret_ml_cigs"] = true, + ["v_ret_ml_cigs2"] = true, + ["v_ret_ml_cigs3"] = true, + ["v_ret_ml_cigs4"] = true, + ["v_ret_ml_cigs5"] = true, + ["v_ret_ml_cigs6"] = true, + ["v_ret_ml_fridge"] = true, + ["v_ret_ml_fridge02"] = true, + ["v_ret_ml_fridge02_dr"] = true, + ["v_ret_ml_liqshelfa"] = true, + ["v_ret_ml_liqshelfb"] = true, + ["v_ret_ml_liqshelfc"] = true, + ["v_ret_ml_liqshelfd"] = true, + ["v_ret_ml_liqshelfe"] = true, + ["v_ret_ml_meth"] = true, + ["v_ret_ml_methcigs"] = true, + ["v_ret_ml_methsweets"] = true, + ["v_ret_ml_papers"] = true, + ["v_ret_ml_partframe1"] = true, + ["v_ret_ml_partframe2"] = true, + ["v_ret_ml_partframe3"] = true, + ["v_ret_ml_scale"] = true, + ["v_ret_ml_shelfrk"] = true, + ["v_ret_ml_sweet1"] = true, + ["v_ret_ml_sweet2"] = true, + ["v_ret_ml_sweet3"] = true, + ["v_ret_ml_sweet4"] = true, + ["v_ret_ml_sweet5"] = true, + ["v_ret_ml_sweet6"] = true, + ["v_ret_ml_sweet7"] = true, + ["v_ret_ml_sweet8"] = true, + ["v_ret_ml_sweet9"] = true, + ["v_ret_ml_sweetego"] = true, + ["v_ret_ml_tablea"] = true, + ["v_ret_ml_tableb"] = true, + ["v_ret_ml_tablec"] = true, + ["v_ret_ml_win2"] = true, + ["v_ret_ml_win3"] = true, + ["v_ret_ml_win4"] = true, + ["v_ret_ml_win5"] = true, + ["v_ret_neon_baracho"] = true, + ["v_ret_neon_blarneys"] = true, + ["v_ret_neon_logger"] = true, + ["v_ret_ps_bag_01"] = true, + ["v_ret_ps_bag_02"] = true, + ["v_ret_ps_box_01"] = true, + ["v_ret_ps_box_02"] = true, + ["v_ret_ps_box_03"] = true, + ["v_ret_ps_carrier01"] = true, + ["v_ret_ps_carrier02"] = true, + ["v_ret_ps_chair"] = true, + ["v_ret_ps_cologne"] = true, + ["v_ret_ps_cologne_01"] = true, + ["v_ret_ps_flowers_01"] = true, + ["v_ret_ps_flowers_02"] = true, + ["v_ret_ps_pot"] = true, + ["v_ret_ps_shades01"] = true, + ["v_ret_ps_shades02"] = true, + ["v_ret_ps_shoe_01"] = true, + ["v_ret_ps_ties_01"] = true, + ["v_ret_ps_ties_02"] = true, + ["v_ret_ps_ties_03"] = true, + ["v_ret_ps_ties_04"] = true, + ["v_ret_ps_tissue"] = true, + ["v_ret_ps_toiletbag"] = true, + ["v_ret_ps_toiletry_01"] = true, + ["v_ret_ps_toiletry_02"] = true, + ["v_ret_ta_book1"] = true, + ["v_ret_ta_book2"] = true, + ["v_ret_ta_book3"] = true, + ["v_ret_ta_book4"] = true, + ["v_ret_ta_box"] = true, + ["v_ret_ta_camera"] = true, + ["v_ret_ta_firstaid"] = true, + ["v_ret_ta_gloves"] = true, + ["v_ret_ta_hero"] = true, + ["v_ret_ta_ink03"] = true, + ["v_ret_ta_ink04"] = true, + ["v_ret_ta_ink05"] = true, + ["v_ret_ta_jelly"] = true, + ["v_ret_ta_mag1"] = true, + ["v_ret_ta_mag2"] = true, + ["v_ret_ta_mug"] = true, + ["v_ret_ta_paproll"] = true, + ["v_ret_ta_paproll2"] = true, + ["v_ret_ta_pot1"] = true, + ["v_ret_ta_pot2"] = true, + ["v_ret_ta_pot3"] = true, + ["v_ret_ta_power"] = true, + ["v_ret_ta_skull"] = true, + ["v_ret_ta_spray"] = true, + ["v_ret_ta_stool"] = true, + ["v_ret_tablesml"] = true, + ["v_ret_tat2stuff_01"] = true, + ["v_ret_tat2stuff_02"] = true, + ["v_ret_tat2stuff_03"] = true, + ["v_ret_tat2stuff_04"] = true, + ["v_ret_tat2stuff_05"] = true, + ["v_ret_tat2stuff_06"] = true, + ["v_ret_tat2stuff_07"] = true, + ["v_ret_tatstuff01"] = true, + ["v_ret_tatstuff02"] = true, + ["v_ret_tatstuff03"] = true, + ["v_ret_tatstuff04"] = true, + ["v_ret_tissue"] = true, + ["v_ret_washpow1"] = true, + ["v_ret_washpow2"] = true, + ["v_ret_wind2"] = true, + ["v_ret_window"] = true, + ["v_ret_windowair"] = true, + ["v_ret_windowsmall"] = true, + ["v_ret_windowutil"] = true, + ["v_serv_1socket"] = true, + ["v_serv_2socket"] = true, + ["v_serv_abox_02"] = true, + ["v_serv_abox_04"] = true, + ["v_serv_abox_1"] = true, + ["v_serv_abox_g1"] = true, + ["v_serv_abox_g3"] = true, + ["v_serv_aboxes_02"] = true, + ["v_serv_bktmop_h"] = true, + ["v_serv_bs_barbchair"] = true, + ["v_serv_bs_barbchair2"] = true, + ["v_serv_bs_barbchair3"] = true, + ["v_serv_bs_barbchair5"] = true, + ["v_serv_bs_cliipbit1"] = true, + ["v_serv_bs_cliipbit2"] = true, + ["v_serv_bs_cliipbit3"] = true, + ["v_serv_bs_clippers"] = true, + ["v_serv_bs_clutter"] = true, + ["v_serv_bs_comb"] = true, + ["v_serv_bs_cond"] = true, + ["v_serv_bs_foam1"] = true, + ["v_serv_bs_foamx3"] = true, + ["v_serv_bs_gel"] = true, + ["v_serv_bs_gelx3"] = true, + ["v_serv_bs_hairdryer"] = true, + ["v_serv_bs_looroll"] = true, + ["v_serv_bs_mug"] = true, + ["v_serv_bs_razor"] = true, + ["v_serv_bs_scissors"] = true, + ["v_serv_bs_shampoo"] = true, + ["v_serv_bs_shvbrush"] = true, + ["v_serv_bs_spray"] = true, + ["v_serv_cln_prod_04"] = true, + ["v_serv_cln_prod_06"] = true, + ["v_serv_crdbox_2"] = true, + ["v_serv_ct_binoculars"] = true, + ["v_serv_ct_chair01"] = true, + ["v_serv_ct_chair02"] = true, + ["v_serv_ct_lamp"] = true, + ["v_serv_ct_light"] = true, + ["v_serv_ct_monitor01"] = true, + ["v_serv_ct_monitor02"] = true, + ["v_serv_ct_monitor03"] = true, + ["v_serv_ct_monitor04"] = true, + ["v_serv_ct_monitor05"] = true, + ["v_serv_ct_monitor06"] = true, + ["v_serv_ct_monitor07"] = true, + ["v_serv_ct_striplight"] = true, + ["v_serv_cupboard_01"] = true, + ["v_serv_emrglgt_off"] = true, + ["v_serv_firbel"] = true, + ["v_serv_firealarm"] = true, + ["v_serv_flurlgt_01"] = true, + ["v_serv_gt_glass1"] = true, + ["v_serv_gt_glass2"] = true, + ["v_serv_hndtrk_n2_aa_h"] = true, + ["v_serv_lgtemg"] = true, + ["v_serv_metro_advertmid"] = true, + ["v_serv_metro_advertstand1"] = true, + ["v_serv_metro_advertstand2"] = true, + ["v_serv_metro_advertstand3"] = true, + ["v_serv_metro_ceilingspeaker"] = true, + ["v_serv_metro_ceilingvent"] = true, + ["v_serv_metro_elecpole_singlel"] = true, + ["v_serv_metro_elecpole_singler"] = true, + ["v_serv_metro_floorbin"] = true, + ["v_serv_metro_infoscreen1"] = true, + ["v_serv_metro_infoscreen3"] = true, + ["v_serv_metro_metaljunk1"] = true, + ["v_serv_metro_metaljunk2"] = true, + ["v_serv_metro_metaljunk3"] = true, + ["v_serv_metro_paybooth"] = true, + ["v_serv_metro_signals1"] = true, + ["v_serv_metro_signals2"] = true, + ["v_serv_metro_signconnect"] = true, + ["v_serv_metro_signlossantos"] = true, + ["v_serv_metro_signmap"] = true, + ["v_serv_metro_signroutes"] = true, + ["v_serv_metro_signtravel"] = true, + ["v_serv_metro_stationfence"] = true, + ["v_serv_metro_stationfence2"] = true, + ["v_serv_metro_stationgate"] = true, + ["v_serv_metro_statseat1"] = true, + ["v_serv_metro_statseat2"] = true, + ["v_serv_metro_tubelight"] = true, + ["v_serv_metro_tubelight2"] = true, + ["v_serv_metro_tunnellight1"] = true, + ["v_serv_metro_tunnellight2"] = true, + ["v_serv_metro_wallbin"] = true, + ["v_serv_metro_walllightcage"] = true, + ["v_serv_metroelecpolecurve"] = true, + ["v_serv_metroelecpolenarrow"] = true, + ["v_serv_metroelecpolestation"] = true, + ["v_serv_plas_boxg4"] = true, + ["v_serv_plas_boxgt2"] = true, + ["v_serv_plastic_box"] = true, + ["v_serv_plastic_box_lid"] = true, + ["v_serv_radio"] = true, + ["v_serv_securitycam_03"] = true, + ["v_serv_securitycam_1a"] = true, + ["v_serv_switch_2"] = true, + ["v_serv_switch_3"] = true, + ["v_serv_tc_bin1_"] = true, + ["v_serv_tc_bin2_"] = true, + ["v_serv_tc_bin3_"] = true, + ["v_serv_tu_iron_"] = true, + ["v_serv_tu_iron2_"] = true, + ["v_serv_tu_light1_"] = true, + ["v_serv_tu_light2_"] = true, + ["v_serv_tu_light3_"] = true, + ["v_serv_tu_statio1_"] = true, + ["v_serv_tu_statio2_"] = true, + ["v_serv_tu_statio3_"] = true, + ["v_serv_tu_statio4_"] = true, + ["v_serv_tu_statio5_"] = true, + ["v_serv_tu_stay_"] = true, + ["v_serv_tu_stay2_"] = true, + ["v_serv_tu_trak1_"] = true, + ["v_serv_tu_trak2_"] = true, + ["v_serv_tvrack"] = true, + ["v_serv_waste_bin1"] = true, + ["v_serv_wetfloorsn"] = true, + ["v_tre_sofa_mess_a_s"] = true, + ["v_tre_sofa_mess_b_s"] = true, + ["v_tre_sofa_mess_c_s"] = true, + ["vb_43_door_l_mp"] = true, + ["vb_43_door_r_mp"] = true, + ["vb_additions_bh1_09_fix"] = true, + ["vb_additions_hs005_fix"] = true, + ["vb_additions_ss1_08_fix"] = true, + ["vb_additions_toileta"] = true, + ["vb_additions_toiletb"] = true, + ["vb_additions_toiletblock01_lod"] = true, + ["vb_additions_toiletblock02_lod"] = true, + ["vb_additions_vb_09_escapefix"] = true, + ["vb_lod_01_02_07_proxy"] = true, + ["vb_lod_17_022_proxy"] = true, + ["vb_lod_emissive_5_proxy"] = true, + ["vb_lod_emissive_6_20_proxy"] = true, + ["vb_lod_emissive_6_proxy"] = true, + ["vb_lod_rv_slod4"] = true, + ["vb_lod_slod4"] = true, + ["vfx_it1_00"] = true, + ["vfx_it1_01"] = true, + ["vfx_it1_02"] = true, + ["vfx_it1_03"] = true, + ["vfx_it1_04"] = true, + ["vfx_it1_05"] = true, + ["vfx_it1_06"] = true, + ["vfx_it1_07"] = true, + ["vfx_it1_08"] = true, + ["vfx_it1_09"] = true, + ["vfx_it1_10"] = true, + ["vfx_it1_11"] = true, + ["vfx_it1_12"] = true, + ["vfx_it1_13"] = true, + ["vfx_it1_14"] = true, + ["vfx_it1_15"] = true, + ["vfx_it1_16"] = true, + ["vfx_it1_17"] = true, + ["vfx_it1_18"] = true, + ["vfx_it1_19"] = true, + ["vfx_it1_20"] = true, + ["vfx_it2_00"] = true, + ["vfx_it2_01"] = true, + ["vfx_it2_02"] = true, + ["vfx_it2_03"] = true, + ["vfx_it2_04"] = true, + ["vfx_it2_05"] = true, + ["vfx_it2_06"] = true, + ["vfx_it2_07"] = true, + ["vfx_it2_08"] = true, + ["vfx_it2_09"] = true, + ["vfx_it2_10"] = true, + ["vfx_it2_11"] = true, + ["vfx_it2_12"] = true, + ["vfx_it2_13"] = true, + ["vfx_it2_14"] = true, + ["vfx_it2_15"] = true, + ["vfx_it2_16"] = true, + ["vfx_it2_17"] = true, + ["vfx_it2_18"] = true, + ["vfx_it2_19"] = true, + ["vfx_it2_20"] = true, + ["vfx_it2_21"] = true, + ["vfx_it2_22"] = true, + ["vfx_it2_23"] = true, + ["vfx_it2_24"] = true, + ["vfx_it2_25"] = true, + ["vfx_it2_26"] = true, + ["vfx_it2_27"] = true, + ["vfx_it2_28"] = true, + ["vfx_it2_29"] = true, + ["vfx_it2_30"] = true, + ["vfx_it2_31"] = true, + ["vfx_it2_32"] = true, + ["vfx_it2_33"] = true, + ["vfx_it2_34"] = true, + ["vfx_it2_35"] = true, + ["vfx_it2_36"] = true, + ["vfx_it2_37"] = true, + ["vfx_it2_38"] = true, + ["vfx_it2_39"] = true, + ["vfx_it3_00"] = true, + ["vfx_it3_01"] = true, + ["vfx_it3_02"] = true, + ["vfx_it3_03"] = true, + ["vfx_it3_04"] = true, + ["vfx_it3_05"] = true, + ["vfx_it3_06"] = true, + ["vfx_it3_07"] = true, + ["vfx_it3_08"] = true, + ["vfx_it3_09"] = true, + ["vfx_it3_11"] = true, + ["vfx_it3_12"] = true, + ["vfx_it3_13"] = true, + ["vfx_it3_14"] = true, + ["vfx_it3_15"] = true, + ["vfx_it3_16"] = true, + ["vfx_it3_17"] = true, + ["vfx_it3_18"] = true, + ["vfx_it3_19"] = true, + ["vfx_it3_20"] = true, + ["vfx_it3_21"] = true, + ["vfx_it3_22"] = true, + ["vfx_it3_23"] = true, + ["vfx_it3_24"] = true, + ["vfx_it3_25"] = true, + ["vfx_it3_26"] = true, + ["vfx_it3_27"] = true, + ["vfx_it3_28"] = true, + ["vfx_it3_29"] = true, + ["vfx_it3_30"] = true, + ["vfx_it3_31"] = true, + ["vfx_it3_32"] = true, + ["vfx_it3_33"] = true, + ["vfx_it3_34"] = true, + ["vfx_it3_35"] = true, + ["vfx_it3_36"] = true, + ["vfx_it3_37"] = true, + ["vfx_it3_38"] = true, + ["vfx_it3_39"] = true, + ["vfx_it3_40"] = true, + ["vfx_it3_41"] = true, + ["vfx_rnd_wave_01"] = true, + ["vfx_rnd_wave_02"] = true, + ["vfx_rnd_wave_03"] = true, + ["vfx_wall_wave_01"] = true, + ["vfx_wall_wave_02"] = true, + ["vfx_wall_wave_03"] = true, + ["vodkarow"] = true, + ["vw_des_vine_casino_doors_01"] = true, + ["vw_des_vine_casino_doors_02"] = true, + ["vw_des_vine_casino_doors_03"] = true, + ["vw_des_vine_casino_doors_04"] = true, + ["vw_des_vine_casino_doors_05"] = true, + ["vw_des_vine_casino_doors_end"] = true, + ["vw_p_para_bag_vine_s"] = true, + ["vw_p_vw_cs_bandana_s"] = true, + ["vw_prop_animscreen_temp_01"] = true, + ["vw_prop_arena_turntable_02f_sf"] = true, + ["vw_prop_art_football_01a"] = true, + ["vw_prop_art_mic_01a"] = true, + ["vw_prop_art_pug_01a"] = true, + ["vw_prop_art_pug_01b"] = true, + ["vw_prop_art_pug_02a"] = true, + ["vw_prop_art_pug_02b"] = true, + ["vw_prop_art_pug_03a"] = true, + ["vw_prop_art_pug_03b"] = true, + ["vw_prop_art_resin_balls_01a"] = true, + ["vw_prop_art_resin_guns_01a"] = true, + ["vw_prop_art_wall_segment_01a"] = true, + ["vw_prop_art_wall_segment_02a"] = true, + ["vw_prop_art_wall_segment_02b"] = true, + ["vw_prop_art_wall_segment_03a"] = true, + ["vw_prop_art_wings_01a"] = true, + ["vw_prop_art_wings_01b"] = true, + ["vw_prop_book_stack_01a"] = true, + ["vw_prop_book_stack_01b"] = true, + ["vw_prop_book_stack_01c"] = true, + ["vw_prop_book_stack_02a"] = true, + ["vw_prop_book_stack_02b"] = true, + ["vw_prop_book_stack_02c"] = true, + ["vw_prop_book_stack_03a"] = true, + ["vw_prop_book_stack_03b"] = true, + ["vw_prop_book_stack_03c"] = true, + ["vw_prop_cas_card_club_02"] = true, + ["vw_prop_cas_card_club_03"] = true, + ["vw_prop_cas_card_club_04"] = true, + ["vw_prop_cas_card_club_05"] = true, + ["vw_prop_cas_card_club_06"] = true, + ["vw_prop_cas_card_club_07"] = true, + ["vw_prop_cas_card_club_08"] = true, + ["vw_prop_cas_card_club_09"] = true, + ["vw_prop_cas_card_club_10"] = true, + ["vw_prop_cas_card_club_ace"] = true, + ["vw_prop_cas_card_club_jack"] = true, + ["vw_prop_cas_card_club_king"] = true, + ["vw_prop_cas_card_club_queen"] = true, + ["vw_prop_cas_card_dia_02"] = true, + ["vw_prop_cas_card_dia_03"] = true, + ["vw_prop_cas_card_dia_04"] = true, + ["vw_prop_cas_card_dia_05"] = true, + ["vw_prop_cas_card_dia_06"] = true, + ["vw_prop_cas_card_dia_07"] = true, + ["vw_prop_cas_card_dia_08"] = true, + ["vw_prop_cas_card_dia_09"] = true, + ["vw_prop_cas_card_dia_10"] = true, + ["vw_prop_cas_card_dia_ace"] = true, + ["vw_prop_cas_card_dia_jack"] = true, + ["vw_prop_cas_card_dia_king"] = true, + ["vw_prop_cas_card_dia_queen"] = true, + ["vw_prop_cas_card_hrt_02"] = true, + ["vw_prop_cas_card_hrt_03"] = true, + ["vw_prop_cas_card_hrt_04"] = true, + ["vw_prop_cas_card_hrt_05"] = true, + ["vw_prop_cas_card_hrt_06"] = true, + ["vw_prop_cas_card_hrt_07"] = true, + ["vw_prop_cas_card_hrt_08"] = true, + ["vw_prop_cas_card_hrt_09"] = true, + ["vw_prop_cas_card_hrt_10"] = true, + ["vw_prop_cas_card_hrt_ace"] = true, + ["vw_prop_cas_card_hrt_jack"] = true, + ["vw_prop_cas_card_hrt_king"] = true, + ["vw_prop_cas_card_hrt_queen"] = true, + ["vw_prop_cas_card_spd_02"] = true, + ["vw_prop_cas_card_spd_03"] = true, + ["vw_prop_cas_card_spd_04"] = true, + ["vw_prop_cas_card_spd_05"] = true, + ["vw_prop_cas_card_spd_06"] = true, + ["vw_prop_cas_card_spd_07"] = true, + ["vw_prop_cas_card_spd_08"] = true, + ["vw_prop_cas_card_spd_09"] = true, + ["vw_prop_cas_card_spd_10"] = true, + ["vw_prop_cas_card_spd_ace"] = true, + ["vw_prop_cas_card_spd_jack"] = true, + ["vw_prop_cas_card_spd_king"] = true, + ["vw_prop_cas_card_spd_queen"] = true, + ["vw_prop_casino_3cardpoker_01"] = true, + ["vw_prop_casino_3cardpoker_01b"] = true, + ["vw_prop_casino_art_absman_01a"] = true, + ["vw_prop_casino_art_basketball_01a"] = true, + ["vw_prop_casino_art_basketball_02a"] = true, + ["vw_prop_casino_art_bird_01a"] = true, + ["vw_prop_casino_art_bottle_01a"] = true, + ["vw_prop_casino_art_bowling_01a"] = true, + ["vw_prop_casino_art_bowling_01b"] = true, + ["vw_prop_casino_art_bowling_02a"] = true, + ["vw_prop_casino_art_car_01a"] = true, + ["vw_prop_casino_art_car_02a"] = true, + ["vw_prop_casino_art_car_03a"] = true, + ["vw_prop_casino_art_car_04a"] = true, + ["vw_prop_casino_art_car_05a"] = true, + ["vw_prop_casino_art_car_06a"] = true, + ["vw_prop_casino_art_car_07a"] = true, + ["vw_prop_casino_art_car_08a"] = true, + ["vw_prop_casino_art_car_09a"] = true, + ["vw_prop_casino_art_car_10a"] = true, + ["vw_prop_casino_art_car_11a"] = true, + ["vw_prop_casino_art_car_12a"] = true, + ["vw_prop_casino_art_cherries_01a"] = true, + ["vw_prop_casino_art_concrete_01a"] = true, + ["vw_prop_casino_art_concrete_02a"] = true, + ["vw_prop_casino_art_console_01a"] = true, + ["vw_prop_casino_art_console_02a"] = true, + ["vw_prop_casino_art_deer_01a"] = true, + ["vw_prop_casino_art_dog_01a"] = true, + ["vw_prop_casino_art_egg_01a"] = true, + ["vw_prop_casino_art_ego_01a"] = true, + ["vw_prop_casino_art_figurines_01a"] = true, + ["vw_prop_casino_art_figurines_02a"] = true, + ["vw_prop_casino_art_grenade_01a"] = true, + ["vw_prop_casino_art_grenade_01b"] = true, + ["vw_prop_casino_art_grenade_01c"] = true, + ["vw_prop_casino_art_grenade_01d"] = true, + ["vw_prop_casino_art_guitar_01a"] = true, + ["vw_prop_casino_art_gun_01a"] = true, + ["vw_prop_casino_art_gun_02a"] = true, + ["vw_prop_casino_art_head_01a"] = true, + ["vw_prop_casino_art_head_01b"] = true, + ["vw_prop_casino_art_head_01c"] = true, + ["vw_prop_casino_art_head_01d"] = true, + ["vw_prop_casino_art_horse_01a"] = true, + ["vw_prop_casino_art_horse_01b"] = true, + ["vw_prop_casino_art_horse_01c"] = true, + ["vw_prop_casino_art_lampf_01a"] = true, + ["vw_prop_casino_art_lampm_01a"] = true, + ["vw_prop_casino_art_lollipop_01a"] = true, + ["vw_prop_casino_art_miniature_05a"] = true, + ["vw_prop_casino_art_miniature_05b"] = true, + ["vw_prop_casino_art_miniature_05c"] = true, + ["vw_prop_casino_art_miniature_09a"] = true, + ["vw_prop_casino_art_miniature_09b"] = true, + ["vw_prop_casino_art_miniature_09c"] = true, + ["vw_prop_casino_art_mod_01a"] = true, + ["vw_prop_casino_art_mod_02a"] = true, + ["vw_prop_casino_art_mod_03a"] = true, + ["vw_prop_casino_art_mod_03a_a"] = true, + ["vw_prop_casino_art_mod_03a_b"] = true, + ["vw_prop_casino_art_mod_03a_c"] = true, + ["vw_prop_casino_art_mod_03b"] = true, + ["vw_prop_casino_art_mod_03b_a"] = true, + ["vw_prop_casino_art_mod_03b_b"] = true, + ["vw_prop_casino_art_mod_03b_c"] = true, + ["vw_prop_casino_art_mod_04a"] = true, + ["vw_prop_casino_art_mod_04b"] = true, + ["vw_prop_casino_art_mod_04c"] = true, + ["vw_prop_casino_art_mod_05a"] = true, + ["vw_prop_casino_art_mod_06a"] = true, + ["vw_prop_casino_art_panther_01a"] = true, + ["vw_prop_casino_art_panther_01b"] = true, + ["vw_prop_casino_art_panther_01c"] = true, + ["vw_prop_casino_art_pill_01a"] = true, + ["vw_prop_casino_art_pill_01b"] = true, + ["vw_prop_casino_art_pill_01c"] = true, + ["vw_prop_casino_art_plant_01a"] = true, + ["vw_prop_casino_art_plant_02a"] = true, + ["vw_prop_casino_art_plant_03a"] = true, + ["vw_prop_casino_art_plant_04a"] = true, + ["vw_prop_casino_art_plant_05a"] = true, + ["vw_prop_casino_art_plant_06a"] = true, + ["vw_prop_casino_art_plant_07a"] = true, + ["vw_prop_casino_art_plant_08a"] = true, + ["vw_prop_casino_art_plant_09a"] = true, + ["vw_prop_casino_art_plant_10a"] = true, + ["vw_prop_casino_art_plant_11a"] = true, + ["vw_prop_casino_art_plant_12a"] = true, + ["vw_prop_casino_art_rocket_01a"] = true, + ["vw_prop_casino_art_sculpture_01a"] = true, + ["vw_prop_casino_art_sculpture_02a"] = true, + ["vw_prop_casino_art_sculpture_02b"] = true, + ["vw_prop_casino_art_sh_01a"] = true, + ["vw_prop_casino_art_skull_01a"] = true, + ["vw_prop_casino_art_skull_01b"] = true, + ["vw_prop_casino_art_skull_02a"] = true, + ["vw_prop_casino_art_skull_02b"] = true, + ["vw_prop_casino_art_skull_03a"] = true, + ["vw_prop_casino_art_skull_03b"] = true, + ["vw_prop_casino_art_statue_01a"] = true, + ["vw_prop_casino_art_statue_02a"] = true, + ["vw_prop_casino_art_statue_04a"] = true, + ["vw_prop_casino_art_v_01a"] = true, + ["vw_prop_casino_art_v_01b"] = true, + ["vw_prop_casino_art_vase_01a"] = true, + ["vw_prop_casino_art_vase_02a"] = true, + ["vw_prop_casino_art_vase_03a"] = true, + ["vw_prop_casino_art_vase_04a"] = true, + ["vw_prop_casino_art_vase_05a"] = true, + ["vw_prop_casino_art_vase_06a"] = true, + ["vw_prop_casino_art_vase_07a"] = true, + ["vw_prop_casino_art_vase_08a"] = true, + ["vw_prop_casino_art_vase_09a"] = true, + ["vw_prop_casino_art_vase_10a"] = true, + ["vw_prop_casino_art_vase_11a"] = true, + ["vw_prop_casino_art_vase_12a"] = true, + ["vw_prop_casino_blckjack_01"] = true, + ["vw_prop_casino_blckjack_01b"] = true, + ["vw_prop_casino_calc"] = true, + ["vw_prop_casino_cards_01"] = true, + ["vw_prop_casino_cards_02"] = true, + ["vw_prop_casino_cards_single"] = true, + ["vw_prop_casino_chair_01a"] = true, + ["vw_prop_casino_champset"] = true, + ["vw_prop_casino_chip_tray_01"] = true, + ["vw_prop_casino_chip_tray_02"] = true, + ["vw_prop_casino_keypad_01"] = true, + ["vw_prop_casino_keypad_02"] = true, + ["vw_prop_casino_magazine_01a"] = true, + ["vw_prop_casino_mediaplayer_play"] = true, + ["vw_prop_casino_mediaplayer_stop"] = true, + ["vw_prop_casino_phone_01a"] = true, + ["vw_prop_casino_phone_01b"] = true, + ["vw_prop_casino_phone_01b_handle"] = true, + ["vw_prop_casino_roulette_01"] = true, + ["vw_prop_casino_roulette_01b"] = true, + ["vw_prop_casino_schedule_01a"] = true, + ["vw_prop_casino_shopping_bag_01a"] = true, + ["vw_prop_casino_slot_01a"] = true, + ["vw_prop_casino_slot_01a_reels"] = true, + ["vw_prop_casino_slot_01b_reels"] = true, + ["vw_prop_casino_slot_02a"] = true, + ["vw_prop_casino_slot_02a_reels"] = true, + ["vw_prop_casino_slot_02b_reels"] = true, + ["vw_prop_casino_slot_03a"] = true, + ["vw_prop_casino_slot_03a_reels"] = true, + ["vw_prop_casino_slot_03b_reels"] = true, + ["vw_prop_casino_slot_04a"] = true, + ["vw_prop_casino_slot_04a_reels"] = true, + ["vw_prop_casino_slot_04b_reels"] = true, + ["vw_prop_casino_slot_05a"] = true, + ["vw_prop_casino_slot_05a_reels"] = true, + ["vw_prop_casino_slot_05b_reels"] = true, + ["vw_prop_casino_slot_06a"] = true, + ["vw_prop_casino_slot_06a_reels"] = true, + ["vw_prop_casino_slot_06b_reels"] = true, + ["vw_prop_casino_slot_07a"] = true, + ["vw_prop_casino_slot_07a_reels"] = true, + ["vw_prop_casino_slot_07b_reels"] = true, + ["vw_prop_casino_slot_08a"] = true, + ["vw_prop_casino_slot_08a_reels"] = true, + ["vw_prop_casino_slot_08b_reels"] = true, + ["vw_prop_casino_slot_betmax"] = true, + ["vw_prop_casino_slot_betone"] = true, + ["vw_prop_casino_slot_spin"] = true, + ["vw_prop_casino_stool_02a"] = true, + ["vw_prop_casino_till"] = true, + ["vw_prop_casino_track_chair_01"] = true, + ["vw_prop_casino_water_bottle_01a"] = true, + ["vw_prop_casino_wine_glass_01a"] = true, + ["vw_prop_casino_wine_glass_01b"] = true, + ["vw_prop_chip_100dollar_st"] = true, + ["vw_prop_chip_100dollar_x1"] = true, + ["vw_prop_chip_10dollar_st"] = true, + ["vw_prop_chip_10dollar_x1"] = true, + ["vw_prop_chip_10kdollar_st"] = true, + ["vw_prop_chip_10kdollar_x1"] = true, + ["vw_prop_chip_1kdollar_st"] = true, + ["vw_prop_chip_1kdollar_x1"] = true, + ["vw_prop_chip_500dollar_st"] = true, + ["vw_prop_chip_500dollar_x1"] = true, + ["vw_prop_chip_50dollar_st"] = true, + ["vw_prop_chip_50dollar_x1"] = true, + ["vw_prop_chip_5kdollar_st"] = true, + ["vw_prop_chip_5kdollar_x1"] = true, + ["vw_prop_door_country_club_01a"] = true, + ["vw_prop_flowers_potted_01a"] = true, + ["vw_prop_flowers_potted_02a"] = true, + ["vw_prop_flowers_potted_03a"] = true, + ["vw_prop_flowers_vase_01a"] = true, + ["vw_prop_flowers_vase_02a"] = true, + ["vw_prop_flowers_vase_03a"] = true, + ["vw_prop_garage_control_panel_01a"] = true, + ["vw_prop_miniature_yacht_01a"] = true, + ["vw_prop_miniature_yacht_01b"] = true, + ["vw_prop_miniature_yacht_01c"] = true, + ["vw_prop_notebook_01a"] = true, + ["vw_prop_plaq_10kdollar_st"] = true, + ["vw_prop_plaq_10kdollar_x1"] = true, + ["vw_prop_plaq_1kdollar_x1"] = true, + ["vw_prop_plaq_5kdollar_st"] = true, + ["vw_prop_plaq_5kdollar_x1"] = true, + ["vw_prop_plaque_01a"] = true, + ["vw_prop_plaque_02a"] = true, + ["vw_prop_plaque_02b"] = true, + ["vw_prop_roulette_ball"] = true, + ["vw_prop_roulette_marker"] = true, + ["vw_prop_roulette_rake"] = true, + ["vw_prop_toy_sculpture_01a"] = true, + ["vw_prop_toy_sculpture_02a"] = true, + ["vw_prop_vw_3card_01a"] = true, + ["vw_prop_vw_aircon_m_01"] = true, + ["vw_prop_vw_arcade_01_screen"] = true, + ["vw_prop_vw_arcade_01a"] = true, + ["vw_prop_vw_arcade_02_screen"] = true, + ["vw_prop_vw_arcade_02a"] = true, + ["vw_prop_vw_arcade_02b"] = true, + ["vw_prop_vw_arcade_02b_screen"] = true, + ["vw_prop_vw_arcade_02c"] = true, + ["vw_prop_vw_arcade_02c_screen"] = true, + ["vw_prop_vw_arcade_02d"] = true, + ["vw_prop_vw_arcade_02d_screen"] = true, + ["vw_prop_vw_arcade_03_screen"] = true, + ["vw_prop_vw_arcade_03a"] = true, + ["vw_prop_vw_arcade_03b"] = true, + ["vw_prop_vw_arcade_03c"] = true, + ["vw_prop_vw_arcade_03d"] = true, + ["vw_prop_vw_arcade_04_screen"] = true, + ["vw_prop_vw_arcade_04b_screen"] = true, + ["vw_prop_vw_arcade_04c_screen"] = true, + ["vw_prop_vw_arcade_04d_screen"] = true, + ["vw_prop_vw_backpack_01a"] = true, + ["vw_prop_vw_barrel_01a"] = true, + ["vw_prop_vw_barrel_pile_01a"] = true, + ["vw_prop_vw_barrel_pile_02a"] = true, + ["vw_prop_vw_barrier_rope_01a"] = true, + ["vw_prop_vw_barrier_rope_01b"] = true, + ["vw_prop_vw_barrier_rope_01c"] = true, + ["vw_prop_vw_barrier_rope_02a"] = true, + ["vw_prop_vw_barrier_rope_03a"] = true, + ["vw_prop_vw_barrier_rope_03b"] = true, + ["vw_prop_vw_bblock_huge_01"] = true, + ["vw_prop_vw_bblock_huge_02"] = true, + ["vw_prop_vw_bblock_huge_03"] = true, + ["vw_prop_vw_bblock_huge_04"] = true, + ["vw_prop_vw_bblock_huge_05"] = true, + ["vw_prop_vw_board_01a"] = true, + ["vw_prop_vw_box_empty_01a"] = true, + ["vw_prop_vw_boxwood_01a"] = true, + ["vw_prop_vw_card_case_01a"] = true, + ["vw_prop_vw_casino_bin_01a"] = true, + ["vw_prop_vw_casino_cards_01"] = true, + ["vw_prop_vw_casino_door_01a"] = true, + ["vw_prop_vw_casino_door_01b"] = true, + ["vw_prop_vw_casino_door_01c"] = true, + ["vw_prop_vw_casino_door_01d"] = true, + ["vw_prop_vw_casino_door_02a"] = true, + ["vw_prop_vw_casino_door_r_02a"] = true, + ["vw_prop_vw_casino_podium_01a"] = true, + ["vw_prop_vw_champ_closed"] = true, + ["vw_prop_vw_champ_cool"] = true, + ["vw_prop_vw_champ_open"] = true, + ["vw_prop_vw_chip_carrier_01a"] = true, + ["vw_prop_vw_chips_bag_01a"] = true, + ["vw_prop_vw_chips_pile_01a"] = true, + ["vw_prop_vw_chips_pile_02a"] = true, + ["vw_prop_vw_chips_pile_03a"] = true, + ["vw_prop_vw_chipsmachine_01a"] = true, + ["vw_prop_vw_cinema_tv_01"] = true, + ["vw_prop_vw_club_char_02a"] = true, + ["vw_prop_vw_club_char_03a"] = true, + ["vw_prop_vw_club_char_04a"] = true, + ["vw_prop_vw_club_char_05a"] = true, + ["vw_prop_vw_club_char_06a"] = true, + ["vw_prop_vw_club_char_07a"] = true, + ["vw_prop_vw_club_char_08a"] = true, + ["vw_prop_vw_club_char_09a"] = true, + ["vw_prop_vw_club_char_10a"] = true, + ["vw_prop_vw_club_char_a_a"] = true, + ["vw_prop_vw_club_char_j_a"] = true, + ["vw_prop_vw_club_char_k_a"] = true, + ["vw_prop_vw_club_char_q_a"] = true, + ["vw_prop_vw_coin_01a"] = true, + ["vw_prop_vw_colle_alien"] = true, + ["vw_prop_vw_colle_beast"] = true, + ["vw_prop_vw_colle_imporage"] = true, + ["vw_prop_vw_colle_pogo"] = true, + ["vw_prop_vw_colle_prbubble"] = true, + ["vw_prop_vw_colle_rsrcomm"] = true, + ["vw_prop_vw_colle_rsrgeneric"] = true, + ["vw_prop_vw_colle_sasquatch"] = true, + ["vw_prop_vw_contr_01a_ld"] = true, + ["vw_prop_vw_contr_01b_ld"] = true, + ["vw_prop_vw_contr_01c_ld"] = true, + ["vw_prop_vw_contr_01d_ld"] = true, + ["vw_prop_vw_crate_01a"] = true, + ["vw_prop_vw_crate_02a"] = true, + ["vw_prop_vw_dia_char_02a"] = true, + ["vw_prop_vw_dia_char_03a"] = true, + ["vw_prop_vw_dia_char_04a"] = true, + ["vw_prop_vw_dia_char_05a"] = true, + ["vw_prop_vw_dia_char_06a"] = true, + ["vw_prop_vw_dia_char_07a"] = true, + ["vw_prop_vw_dia_char_08a"] = true, + ["vw_prop_vw_dia_char_09a"] = true, + ["vw_prop_vw_dia_char_10a"] = true, + ["vw_prop_vw_dia_char_a_a"] = true, + ["vw_prop_vw_dia_char_j_a"] = true, + ["vw_prop_vw_dia_char_k_a"] = true, + ["vw_prop_vw_dia_char_q_a"] = true, + ["vw_prop_vw_door_bath_01a"] = true, + ["vw_prop_vw_door_dd_01a"] = true, + ["vw_prop_vw_door_ddl_01a"] = true, + ["vw_prop_vw_door_lounge_01a"] = true, + ["vw_prop_vw_door_sd_01a"] = true, + ["vw_prop_vw_door_slide_01a"] = true, + ["vw_prop_vw_elecbox_01a"] = true, + ["vw_prop_vw_ex_pe_01a"] = true, + ["vw_prop_vw_garage_coll_01a"] = true, + ["vw_prop_vw_garagedoor_01a"] = true, + ["vw_prop_vw_headset_01a"] = true, + ["vw_prop_vw_hrt_char_02a"] = true, + ["vw_prop_vw_hrt_char_03a"] = true, + ["vw_prop_vw_hrt_char_04a"] = true, + ["vw_prop_vw_hrt_char_05a"] = true, + ["vw_prop_vw_hrt_char_06a"] = true, + ["vw_prop_vw_hrt_char_07a"] = true, + ["vw_prop_vw_hrt_char_08a"] = true, + ["vw_prop_vw_hrt_char_09a"] = true, + ["vw_prop_vw_hrt_char_10a"] = true, + ["vw_prop_vw_hrt_char_a_a"] = true, + ["vw_prop_vw_hrt_char_j_a"] = true, + ["vw_prop_vw_hrt_char_k_a"] = true, + ["vw_prop_vw_hrt_char_q_a"] = true, + ["vw_prop_vw_ice_bucket_01a"] = true, + ["vw_prop_vw_ice_bucket_02a"] = true, + ["vw_prop_vw_jackpot_off"] = true, + ["vw_prop_vw_jackpot_on"] = true, + ["vw_prop_vw_jo_char_01a"] = true, + ["vw_prop_vw_jo_char_02a"] = true, + ["vw_prop_vw_key_cabinet_01a"] = true, + ["vw_prop_vw_key_card_01a"] = true, + ["vw_prop_vw_lamp_01"] = true, + ["vw_prop_vw_lrggate_05a"] = true, + ["vw_prop_vw_luckylight_off"] = true, + ["vw_prop_vw_luckylight_on"] = true, + ["vw_prop_vw_luckywheel_01a"] = true, + ["vw_prop_vw_luckywheel_02a"] = true, + ["vw_prop_vw_lux_card_01a"] = true, + ["vw_prop_vw_marker_01a"] = true, + ["vw_prop_vw_marker_02a"] = true, + ["vw_prop_vw_monitor_01"] = true, + ["vw_prop_vw_offchair_01"] = true, + ["vw_prop_vw_offchair_02"] = true, + ["vw_prop_vw_offchair_03"] = true, + ["vw_prop_vw_panel_off_door_01"] = true, + ["vw_prop_vw_panel_off_frame_01"] = true, + ["vw_prop_vw_ped_business_01a"] = true, + ["vw_prop_vw_ped_epsilon_01a"] = true, + ["vw_prop_vw_ped_hillbilly_01a"] = true, + ["vw_prop_vw_ped_hooker_01a"] = true, + ["vw_prop_vw_plant_int_03a"] = true, + ["vw_prop_vw_planter_01"] = true, + ["vw_prop_vw_planter_02"] = true, + ["vw_prop_vw_player_01a"] = true, + ["vw_prop_vw_pogo_gold_01a"] = true, + ["vw_prop_vw_radiomast_01a"] = true, + ["vw_prop_vw_roof_door_01a"] = true, + ["vw_prop_vw_roof_door_02a"] = true, + ["vw_prop_vw_safedoor_office2a_l"] = true, + ["vw_prop_vw_safedoor_office2a_r"] = true, + ["vw_prop_vw_slot_wheel_04a"] = true, + ["vw_prop_vw_slot_wheel_04b"] = true, + ["vw_prop_vw_slot_wheel_08a"] = true, + ["vw_prop_vw_slot_wheel_08b"] = true, + ["vw_prop_vw_spd_char_02a"] = true, + ["vw_prop_vw_spd_char_03a"] = true, + ["vw_prop_vw_spd_char_04a"] = true, + ["vw_prop_vw_spd_char_05a"] = true, + ["vw_prop_vw_spd_char_06a"] = true, + ["vw_prop_vw_spd_char_07a"] = true, + ["vw_prop_vw_spd_char_08a"] = true, + ["vw_prop_vw_spd_char_09a"] = true, + ["vw_prop_vw_spd_char_10a"] = true, + ["vw_prop_vw_spd_char_a_a"] = true, + ["vw_prop_vw_spd_char_j_a"] = true, + ["vw_prop_vw_spd_char_k_a"] = true, + ["vw_prop_vw_spd_char_q_a"] = true, + ["vw_prop_vw_table_01a"] = true, + ["vw_prop_vw_table_casino_short_01"] = true, + ["vw_prop_vw_table_casino_short_02"] = true, + ["vw_prop_vw_table_casino_tall_01"] = true, + ["vw_prop_vw_trailer_monitor_01"] = true, + ["vw_prop_vw_tray_01a"] = true, + ["vw_prop_vw_trolly_01a"] = true, + ["vw_prop_vw_tv_rt_01a"] = true, + ["vw_prop_vw_v_blueprt_01a"] = true, + ["vw_prop_vw_v_brochure_01a"] = true, + ["vw_prop_vw_valet_01a"] = true, + ["vw_prop_vw_wallart_01a"] = true, + ["vw_prop_vw_wallart_02a"] = true, + ["vw_prop_vw_wallart_03a"] = true, + ["vw_prop_vw_wallart_04a"] = true, + ["vw_prop_vw_wallart_05a"] = true, + ["vw_prop_vw_wallart_06a"] = true, + ["vw_prop_vw_wallart_07a"] = true, + ["vw_prop_vw_wallart_08a"] = true, + ["vw_prop_vw_wallart_09a"] = true, + ["vw_prop_vw_wallart_100a"] = true, + ["vw_prop_vw_wallart_101a"] = true, + ["vw_prop_vw_wallart_102a"] = true, + ["vw_prop_vw_wallart_103a"] = true, + ["vw_prop_vw_wallart_104a"] = true, + ["vw_prop_vw_wallart_105a"] = true, + ["vw_prop_vw_wallart_106a"] = true, + ["vw_prop_vw_wallart_107a"] = true, + ["vw_prop_vw_wallart_108a"] = true, + ["vw_prop_vw_wallart_109a"] = true, + ["vw_prop_vw_wallart_10a"] = true, + ["vw_prop_vw_wallart_110a"] = true, + ["vw_prop_vw_wallart_111a"] = true, + ["vw_prop_vw_wallart_112a"] = true, + ["vw_prop_vw_wallart_113a"] = true, + ["vw_prop_vw_wallart_114a"] = true, + ["vw_prop_vw_wallart_115a"] = true, + ["vw_prop_vw_wallart_116a"] = true, + ["vw_prop_vw_wallart_117a"] = true, + ["vw_prop_vw_wallart_118a"] = true, + ["vw_prop_vw_wallart_11a"] = true, + ["vw_prop_vw_wallart_123a"] = true, + ["vw_prop_vw_wallart_124a"] = true, + ["vw_prop_vw_wallart_125a"] = true, + ["vw_prop_vw_wallart_126a"] = true, + ["vw_prop_vw_wallart_127a"] = true, + ["vw_prop_vw_wallart_128a"] = true, + ["vw_prop_vw_wallart_129a"] = true, + ["vw_prop_vw_wallart_12a"] = true, + ["vw_prop_vw_wallart_130a"] = true, + ["vw_prop_vw_wallart_131a"] = true, + ["vw_prop_vw_wallart_132a"] = true, + ["vw_prop_vw_wallart_133a"] = true, + ["vw_prop_vw_wallart_134a"] = true, + ["vw_prop_vw_wallart_135a"] = true, + ["vw_prop_vw_wallart_136a"] = true, + ["vw_prop_vw_wallart_137a"] = true, + ["vw_prop_vw_wallart_138a"] = true, + ["vw_prop_vw_wallart_139a"] = true, + ["vw_prop_vw_wallart_140a"] = true, + ["vw_prop_vw_wallart_141a"] = true, + ["vw_prop_vw_wallart_142a"] = true, + ["vw_prop_vw_wallart_143a"] = true, + ["vw_prop_vw_wallart_144a"] = true, + ["vw_prop_vw_wallart_145a"] = true, + ["vw_prop_vw_wallart_146a"] = true, + ["vw_prop_vw_wallart_147a"] = true, + ["vw_prop_vw_wallart_14a"] = true, + ["vw_prop_vw_wallart_150a"] = true, + ["vw_prop_vw_wallart_151a"] = true, + ["vw_prop_vw_wallart_151b"] = true, + ["vw_prop_vw_wallart_151c"] = true, + ["vw_prop_vw_wallart_151d"] = true, + ["vw_prop_vw_wallart_151e"] = true, + ["vw_prop_vw_wallart_151f"] = true, + ["vw_prop_vw_wallart_152a"] = true, + ["vw_prop_vw_wallart_153a"] = true, + ["vw_prop_vw_wallart_154a"] = true, + ["vw_prop_vw_wallart_155a"] = true, + ["vw_prop_vw_wallart_156a"] = true, + ["vw_prop_vw_wallart_157a"] = true, + ["vw_prop_vw_wallart_158a"] = true, + ["vw_prop_vw_wallart_159a"] = true, + ["vw_prop_vw_wallart_15a"] = true, + ["vw_prop_vw_wallart_160a"] = true, + ["vw_prop_vw_wallart_161a"] = true, + ["vw_prop_vw_wallart_162a"] = true, + ["vw_prop_vw_wallart_163a"] = true, + ["vw_prop_vw_wallart_164a"] = true, + ["vw_prop_vw_wallart_165a"] = true, + ["vw_prop_vw_wallart_166a"] = true, + ["vw_prop_vw_wallart_167a"] = true, + ["vw_prop_vw_wallart_168a"] = true, + ["vw_prop_vw_wallart_169a"] = true, + ["vw_prop_vw_wallart_16a"] = true, + ["vw_prop_vw_wallart_170a"] = true, + ["vw_prop_vw_wallart_171a"] = true, + ["vw_prop_vw_wallart_172a"] = true, + ["vw_prop_vw_wallart_173a"] = true, + ["vw_prop_vw_wallart_174a"] = true, + ["vw_prop_vw_wallart_17a"] = true, + ["vw_prop_vw_wallart_18a"] = true, + ["vw_prop_vw_wallart_19a"] = true, + ["vw_prop_vw_wallart_20a"] = true, + ["vw_prop_vw_wallart_21a"] = true, + ["vw_prop_vw_wallart_22a"] = true, + ["vw_prop_vw_wallart_23a"] = true, + ["vw_prop_vw_wallart_24a"] = true, + ["vw_prop_vw_wallart_25a"] = true, + ["vw_prop_vw_wallart_26a"] = true, + ["vw_prop_vw_wallart_28a"] = true, + ["vw_prop_vw_wallart_29a"] = true, + ["vw_prop_vw_wallart_30a"] = true, + ["vw_prop_vw_wallart_31a"] = true, + ["vw_prop_vw_wallart_32a"] = true, + ["vw_prop_vw_wallart_33a"] = true, + ["vw_prop_vw_wallart_34a"] = true, + ["vw_prop_vw_wallart_35a"] = true, + ["vw_prop_vw_wallart_36a"] = true, + ["vw_prop_vw_wallart_37a"] = true, + ["vw_prop_vw_wallart_38a"] = true, + ["vw_prop_vw_wallart_39a"] = true, + ["vw_prop_vw_wallart_40a"] = true, + ["vw_prop_vw_wallart_41a"] = true, + ["vw_prop_vw_wallart_42a"] = true, + ["vw_prop_vw_wallart_43a"] = true, + ["vw_prop_vw_wallart_44a"] = true, + ["vw_prop_vw_wallart_46a"] = true, + ["vw_prop_vw_wallart_47a"] = true, + ["vw_prop_vw_wallart_48a"] = true, + ["vw_prop_vw_wallart_49a"] = true, + ["vw_prop_vw_wallart_50a"] = true, + ["vw_prop_vw_wallart_51a"] = true, + ["vw_prop_vw_wallart_52a"] = true, + ["vw_prop_vw_wallart_53a"] = true, + ["vw_prop_vw_wallart_54a_01a"] = true, + ["vw_prop_vw_wallart_55a"] = true, + ["vw_prop_vw_wallart_56a"] = true, + ["vw_prop_vw_wallart_57a"] = true, + ["vw_prop_vw_wallart_58a"] = true, + ["vw_prop_vw_wallart_59a"] = true, + ["vw_prop_vw_wallart_60a"] = true, + ["vw_prop_vw_wallart_61a"] = true, + ["vw_prop_vw_wallart_62a"] = true, + ["vw_prop_vw_wallart_63a"] = true, + ["vw_prop_vw_wallart_64a"] = true, + ["vw_prop_vw_wallart_65a"] = true, + ["vw_prop_vw_wallart_66a"] = true, + ["vw_prop_vw_wallart_67a"] = true, + ["vw_prop_vw_wallart_68a"] = true, + ["vw_prop_vw_wallart_69a"] = true, + ["vw_prop_vw_wallart_70a"] = true, + ["vw_prop_vw_wallart_71a"] = true, + ["vw_prop_vw_wallart_72a"] = true, + ["vw_prop_vw_wallart_73a"] = true, + ["vw_prop_vw_wallart_74a"] = true, + ["vw_prop_vw_wallart_75a"] = true, + ["vw_prop_vw_wallart_76a"] = true, + ["vw_prop_vw_wallart_77a"] = true, + ["vw_prop_vw_wallart_78a"] = true, + ["vw_prop_vw_wallart_79a"] = true, + ["vw_prop_vw_wallart_80a"] = true, + ["vw_prop_vw_wallart_81a"] = true, + ["vw_prop_vw_wallart_82a"] = true, + ["vw_prop_vw_wallart_83a"] = true, + ["vw_prop_vw_wallart_84a"] = true, + ["vw_prop_vw_wallart_85a"] = true, + ["vw_prop_vw_wallart_86a"] = true, + ["vw_prop_vw_wallart_87a"] = true, + ["vw_prop_vw_wallart_88a"] = true, + ["vw_prop_vw_wallart_89a"] = true, + ["vw_prop_vw_wallart_90a"] = true, + ["vw_prop_vw_wallart_91a"] = true, + ["vw_prop_vw_wallart_92a"] = true, + ["vw_prop_vw_wallart_93a"] = true, + ["vw_prop_vw_wallart_94a"] = true, + ["vw_prop_vw_wallart_95a"] = true, + ["vw_prop_vw_wallart_96a"] = true, + ["vw_prop_vw_wallart_97a"] = true, + ["vw_prop_vw_wallart_98a"] = true, + ["vw_prop_vw_wallart_99a"] = true, + ["vw_prop_vw_watch_case_01b"] = true, + ["vw_prop_vw_whousedoor_01a"] = true, + ["w_am_baseball"] = true, + ["w_am_brfcase"] = true, + ["w_am_case"] = true, + ["w_am_digiscanner"] = true, + ["w_am_fire_exting"] = true, + ["w_am_flare"] = true, + ["w_am_jerrycan"] = true, + ["w_am_jerrycan_sf"] = true, + ["w_ar_advancedrifle"] = true, + ["w_ar_advancedrifle_luxe"] = true, + ["w_ar_advancedrifle_luxe_mag1"] = true, + ["w_ar_advancedrifle_luxe_mag2"] = true, + ["w_ar_advancedrifle_mag1"] = true, + ["w_ar_advancedrifle_mag2"] = true, + ["w_ar_assaultrifle"] = true, + ["w_ar_assaultrifle_boxmag"] = true, + ["w_ar_assaultrifle_boxmag_luxe"] = true, + ["w_ar_assaultrifle_luxe"] = true, + ["w_ar_assaultrifle_luxe_mag1"] = true, + ["w_ar_assaultrifle_luxe_mag2"] = true, + ["w_ar_assaultrifle_mag1"] = true, + ["w_ar_assaultrifle_mag2"] = true, + ["w_ar_assaultrifle_smg"] = true, + ["w_ar_assaultrifle_smg_mag1"] = true, + ["w_ar_assaultrifle_smg_mag2"] = true, + ["w_ar_assaultriflemk2"] = true, + ["w_ar_assaultriflemk2_mag_ap"] = true, + ["w_ar_assaultriflemk2_mag_fmj"] = true, + ["w_ar_assaultriflemk2_mag_inc"] = true, + ["w_ar_assaultriflemk2_mag_tr"] = true, + ["w_ar_assaultriflemk2_mag1"] = true, + ["w_ar_assaultriflemk2_mag2"] = true, + ["w_ar_bp_mk2_barrel1"] = true, + ["w_ar_bp_mk2_barrel2"] = true, + ["w_ar_bullpuprifle"] = true, + ["w_ar_bullpuprifle_luxe"] = true, + ["w_ar_bullpuprifle_luxe_mag1"] = true, + ["w_ar_bullpuprifle_luxe_mag2"] = true, + ["w_ar_bullpuprifle_mag1"] = true, + ["w_ar_bullpuprifle_mag2"] = true, + ["w_ar_bullpuprifleh4"] = true, + ["w_ar_bullpuprifleh4_mag1"] = true, + ["w_ar_bullpuprifleh4_mag2"] = true, + ["w_ar_bullpuprifleh4_sight"] = true, + ["w_ar_bullpupriflemk2"] = true, + ["w_ar_bullpupriflemk2_camo_ind1"] = true, + ["w_ar_bullpupriflemk2_camo1"] = true, + ["w_ar_bullpupriflemk2_camo10"] = true, + ["w_ar_bullpupriflemk2_camo2"] = true, + ["w_ar_bullpupriflemk2_camo3"] = true, + ["w_ar_bullpupriflemk2_camo4"] = true, + ["w_ar_bullpupriflemk2_camo5"] = true, + ["w_ar_bullpupriflemk2_camo6"] = true, + ["w_ar_bullpupriflemk2_camo7"] = true, + ["w_ar_bullpupriflemk2_camo8"] = true, + ["w_ar_bullpupriflemk2_camo9"] = true, + ["w_ar_bullpupriflemk2_mag_ap"] = true, + ["w_ar_bullpupriflemk2_mag_fmj"] = true, + ["w_ar_bullpupriflemk2_mag_inc"] = true, + ["w_ar_bullpupriflemk2_mag_tr"] = true, + ["w_ar_bullpupriflemk2_mag1"] = true, + ["w_ar_bullpupriflemk2_mag2"] = true, + ["w_ar_carbinerifle"] = true, + ["w_ar_carbinerifle_boxmag"] = true, + ["w_ar_carbinerifle_boxmag_luxe"] = true, + ["w_ar_carbinerifle_luxe"] = true, + ["w_ar_carbinerifle_luxe_mag1"] = true, + ["w_ar_carbinerifle_luxe_mag2"] = true, + ["w_ar_carbinerifle_mag1"] = true, + ["w_ar_carbinerifle_mag2"] = true, + ["w_ar_carbineriflemk2"] = true, + ["w_ar_carbineriflemk2_camo_ind1"] = true, + ["w_ar_carbineriflemk2_camo1"] = true, + ["w_ar_carbineriflemk2_camo10"] = true, + ["w_ar_carbineriflemk2_camo2"] = true, + ["w_ar_carbineriflemk2_camo3"] = true, + ["w_ar_carbineriflemk2_camo4"] = true, + ["w_ar_carbineriflemk2_camo5"] = true, + ["w_ar_carbineriflemk2_camo6"] = true, + ["w_ar_carbineriflemk2_camo7"] = true, + ["w_ar_carbineriflemk2_camo8"] = true, + ["w_ar_carbineriflemk2_camo9"] = true, + ["w_ar_carbineriflemk2_mag_ap"] = true, + ["w_ar_carbineriflemk2_mag_fmj"] = true, + ["w_ar_carbineriflemk2_mag_inc"] = true, + ["w_ar_carbineriflemk2_mag_tr"] = true, + ["w_ar_carbineriflemk2_mag1"] = true, + ["w_ar_carbineriflemk2_mag2"] = true, + ["w_ar_heavyrifleh"] = true, + ["w_ar_heavyrifleh_sight"] = true, + ["w_ar_musket"] = true, + ["w_ar_railgun"] = true, + ["w_ar_railgun_mag1"] = true, + ["w_ar_sc_barrel_1"] = true, + ["w_ar_sc_barrel_2"] = true, + ["w_ar_specialcarbine"] = true, + ["w_ar_specialcarbine_boxmag"] = true, + ["w_ar_specialcarbine_boxmag_luxe"] = true, + ["w_ar_specialcarbine_luxe"] = true, + ["w_ar_specialcarbine_luxe_mag1"] = true, + ["w_ar_specialcarbine_luxe_mag2"] = true, + ["w_ar_specialcarbine_mag1"] = true, + ["w_ar_specialcarbine_mag2"] = true, + ["w_ar_specialcarbinemk2"] = true, + ["w_ar_specialcarbinemk2_camo_ind"] = true, + ["w_ar_specialcarbinemk2_camo1"] = true, + ["w_ar_specialcarbinemk2_camo10"] = true, + ["w_ar_specialcarbinemk2_camo2"] = true, + ["w_ar_specialcarbinemk2_camo3"] = true, + ["w_ar_specialcarbinemk2_camo4"] = true, + ["w_ar_specialcarbinemk2_camo5"] = true, + ["w_ar_specialcarbinemk2_camo6"] = true, + ["w_ar_specialcarbinemk2_camo7"] = true, + ["w_ar_specialcarbinemk2_camo8"] = true, + ["w_ar_specialcarbinemk2_camo9"] = true, + ["w_ar_specialcarbinemk2_mag_ap"] = true, + ["w_ar_specialcarbinemk2_mag_fmj"] = true, + ["w_ar_specialcarbinemk2_mag_inc"] = true, + ["w_ar_specialcarbinemk2_mag_tr"] = true, + ["w_ar_specialcarbinemk2_mag1"] = true, + ["w_ar_specialcarbinemk2_mag2"] = true, + ["w_ar_srifle"] = true, + ["w_arena_airmissile_01a"] = true, + ["w_at_afgrip_2"] = true, + ["w_at_ar_afgrip"] = true, + ["w_at_ar_afgrip_luxe"] = true, + ["w_at_ar_barrel_1"] = true, + ["w_at_ar_barrel_2"] = true, + ["w_at_ar_flsh"] = true, + ["w_at_ar_flsh_luxe"] = true, + ["w_at_ar_flsh_pdluxe"] = true, + ["w_at_ar_supp"] = true, + ["w_at_ar_supp_02"] = true, + ["w_at_ar_supp_luxe"] = true, + ["w_at_ar_supp_luxe_02"] = true, + ["w_at_armk2_camo_ind1"] = true, + ["w_at_armk2_camo1"] = true, + ["w_at_armk2_camo10"] = true, + ["w_at_armk2_camo2"] = true, + ["w_at_armk2_camo3"] = true, + ["w_at_armk2_camo4"] = true, + ["w_at_armk2_camo5"] = true, + ["w_at_armk2_camo6"] = true, + ["w_at_armk2_camo7"] = true, + ["w_at_armk2_camo8"] = true, + ["w_at_armk2_camo9"] = true, + ["w_at_cr_barrel_1"] = true, + ["w_at_cr_barrel_2"] = true, + ["w_at_heavysnipermk2_camo_ind1"] = true, + ["w_at_heavysnipermk2_camo1"] = true, + ["w_at_heavysnipermk2_camo10"] = true, + ["w_at_heavysnipermk2_camo2"] = true, + ["w_at_heavysnipermk2_camo3"] = true, + ["w_at_heavysnipermk2_camo4"] = true, + ["w_at_heavysnipermk2_camo5"] = true, + ["w_at_heavysnipermk2_camo6"] = true, + ["w_at_heavysnipermk2_camo7"] = true, + ["w_at_heavysnipermk2_camo8"] = true, + ["w_at_heavysnipermk2_camo9"] = true, + ["w_at_hrh_camo1"] = true, + ["w_at_mg_barrel_1"] = true, + ["w_at_mg_barrel_2"] = true, + ["w_at_muzzle_1"] = true, + ["w_at_muzzle_2"] = true, + ["w_at_muzzle_3"] = true, + ["w_at_muzzle_4"] = true, + ["w_at_muzzle_5"] = true, + ["w_at_muzzle_6"] = true, + ["w_at_muzzle_7"] = true, + ["w_at_muzzle_8"] = true, + ["w_at_muzzle_8_xm17"] = true, + ["w_at_muzzle_9"] = true, + ["w_at_pi_comp_1"] = true, + ["w_at_pi_comp_2"] = true, + ["w_at_pi_comp_3"] = true, + ["w_at_pi_flsh"] = true, + ["w_at_pi_flsh_2"] = true, + ["w_at_pi_flsh_luxe"] = true, + ["w_at_pi_flsh_pdluxe"] = true, + ["w_at_pi_rail_1"] = true, + ["w_at_pi_rail_2"] = true, + ["w_at_pi_snsmk2_flsh_1"] = true, + ["w_at_pi_supp"] = true, + ["w_at_pi_supp_2"] = true, + ["w_at_pi_supp_luxe"] = true, + ["w_at_pi_supp_luxe_2"] = true, + ["w_at_railcover_01"] = true, + ["w_at_sb_barrel_1"] = true, + ["w_at_sb_barrel_2"] = true, + ["w_at_scope_large"] = true, + ["w_at_scope_large_luxe"] = true, + ["w_at_scope_macro"] = true, + ["w_at_scope_macro_02_luxe"] = true, + ["w_at_scope_macro_2"] = true, + ["w_at_scope_macro_2_mk2"] = true, + ["w_at_scope_macro_luxe"] = true, + ["w_at_scope_max"] = true, + ["w_at_scope_max_luxe"] = true, + ["w_at_scope_medium"] = true, + ["w_at_scope_medium_2"] = true, + ["w_at_scope_medium_luxe"] = true, + ["w_at_scope_nv"] = true, + ["w_at_scope_small"] = true, + ["w_at_scope_small_02a_luxe"] = true, + ["w_at_scope_small_2"] = true, + ["w_at_scope_small_luxe"] = true, + ["w_at_scope_small_mk2"] = true, + ["w_at_sights_1"] = true, + ["w_at_sights_smg"] = true, + ["w_at_smgmk2_camo_ind1"] = true, + ["w_at_smgmk2_camo1"] = true, + ["w_at_smgmk2_camo10"] = true, + ["w_at_smgmk2_camo2"] = true, + ["w_at_smgmk2_camo3"] = true, + ["w_at_smgmk2_camo4"] = true, + ["w_at_smgmk2_camo5"] = true, + ["w_at_smgmk2_camo6"] = true, + ["w_at_smgmk2_camo7"] = true, + ["w_at_smgmk2_camo8"] = true, + ["w_at_smgmk2_camo9"] = true, + ["w_at_sr_barrel_1"] = true, + ["w_at_sr_barrel_2"] = true, + ["w_at_sr_supp"] = true, + ["w_at_sr_supp_2"] = true, + ["w_at_sr_supp_luxe"] = true, + ["w_at_sr_supp3"] = true, + ["w_battle_airmissile_01"] = true, + ["w_ch_jerrycan"] = true, + ["w_ex_apmine"] = true, + ["w_ex_arena_landmine_01b"] = true, + ["w_ex_birdshat"] = true, + ["w_ex_grenadefrag"] = true, + ["w_ex_grenadesmoke"] = true, + ["w_ex_molotov"] = true, + ["w_ex_pe"] = true, + ["w_ex_pipebomb"] = true, + ["w_ex_snowball"] = true, + ["w_ex_vehiclegrenade"] = true, + ["w_ex_vehiclemine"] = true, + ["w_ex_vehiclemissile_1"] = true, + ["w_ex_vehiclemissile_2"] = true, + ["w_ex_vehiclemissile_3"] = true, + ["w_ex_vehiclemissile_4"] = true, + ["w_ex_vehiclemortar"] = true, + ["w_lr_40mm"] = true, + ["w_lr_compactgl"] = true, + ["w_lr_compactgl_mag1"] = true, + ["w_lr_compactml"] = true, + ["w_lr_compactml_mag1"] = true, + ["w_lr_firework"] = true, + ["w_lr_firework_rocket"] = true, + ["w_lr_grenadelauncher"] = true, + ["w_lr_homing"] = true, + ["w_lr_homing_rocket"] = true, + ["w_lr_ml_40mm"] = true, + ["w_lr_rpg"] = true, + ["w_lr_rpg_rocket"] = true, + ["w_me_bat"] = true, + ["w_me_battleaxe"] = true, + ["w_me_bottle"] = true, + ["w_me_crowbar"] = true, + ["w_me_dagger"] = true, + ["w_me_flashlight"] = true, + ["w_me_flashlight_flash"] = true, + ["w_me_gclub"] = true, + ["w_me_hammer"] = true, + ["w_me_hatchet"] = true, + ["w_me_knife_01"] = true, + ["w_me_knuckle"] = true, + ["w_me_knuckle_02"] = true, + ["w_me_knuckle_bg"] = true, + ["w_me_knuckle_dlr"] = true, + ["w_me_knuckle_dmd"] = true, + ["w_me_knuckle_ht"] = true, + ["w_me_knuckle_lv"] = true, + ["w_me_knuckle_pc"] = true, + ["w_me_knuckle_slg"] = true, + ["w_me_knuckle_vg"] = true, + ["w_me_machette_lr"] = true, + ["w_me_nightstick"] = true, + ["w_me_poolcue"] = true, + ["w_me_stonehatchet"] = true, + ["w_me_switchblade"] = true, + ["w_me_switchblade_b"] = true, + ["w_me_switchblade_g"] = true, + ["w_me_wrench"] = true, + ["w_mg_combatmg"] = true, + ["w_mg_combatmg_luxe"] = true, + ["w_mg_combatmg_luxe_mag1"] = true, + ["w_mg_combatmg_luxe_mag2"] = true, + ["w_mg_combatmg_mag1"] = true, + ["w_mg_combatmg_mag2"] = true, + ["w_mg_combatmgmk2"] = true, + ["w_mg_combatmgmk2_camo_ind1"] = true, + ["w_mg_combatmgmk2_camo1"] = true, + ["w_mg_combatmgmk2_camo10"] = true, + ["w_mg_combatmgmk2_camo2"] = true, + ["w_mg_combatmgmk2_camo3"] = true, + ["w_mg_combatmgmk2_camo4"] = true, + ["w_mg_combatmgmk2_camo5"] = true, + ["w_mg_combatmgmk2_camo6"] = true, + ["w_mg_combatmgmk2_camo7"] = true, + ["w_mg_combatmgmk2_camo8"] = true, + ["w_mg_combatmgmk2_camo9"] = true, + ["w_mg_combatmgmk2_mag_ap"] = true, + ["w_mg_combatmgmk2_mag_fmj"] = true, + ["w_mg_combatmgmk2_mag_inc"] = true, + ["w_mg_combatmgmk2_mag_tr"] = true, + ["w_mg_combatmgmk2_mag1"] = true, + ["w_mg_combatmgmk2_mag2"] = true, + ["w_mg_mg"] = true, + ["w_mg_mg_luxe"] = true, + ["w_mg_mg_luxe_mag1"] = true, + ["w_mg_mg_luxe_mag2"] = true, + ["w_mg_mg_mag1"] = true, + ["w_mg_mg_mag2"] = true, + ["w_mg_minigun"] = true, + ["w_mg_sminigun"] = true, + ["w_pi_appistol"] = true, + ["w_pi_appistol_luxe"] = true, + ["w_pi_appistol_mag1"] = true, + ["w_pi_appistol_mag1_luxe"] = true, + ["w_pi_appistol_mag2"] = true, + ["w_pi_appistol_mag2_luxe"] = true, + ["w_pi_appistol_sts"] = true, + ["w_pi_ceramic_mag1"] = true, + ["w_pi_ceramic_pistol"] = true, + ["w_pi_ceramic_supp"] = true, + ["w_pi_combatpistol"] = true, + ["w_pi_combatpistol_luxe"] = true, + ["w_pi_combatpistol_luxe_mag1"] = true, + ["w_pi_combatpistol_luxe_mag2"] = true, + ["w_pi_combatpistol_mag1"] = true, + ["w_pi_combatpistol_mag2"] = true, + ["w_pi_flaregun"] = true, + ["w_pi_flaregun_mag1"] = true, + ["w_pi_flaregun_shell"] = true, + ["w_pi_heavypistol"] = true, + ["w_pi_heavypistol_luxe"] = true, + ["w_pi_heavypistol_luxe_mag1"] = true, + ["w_pi_heavypistol_luxe_mag2"] = true, + ["w_pi_heavypistol_mag1"] = true, + ["w_pi_heavypistol_mag2"] = true, + ["w_pi_pistol"] = true, + ["w_pi_pistol_luxe"] = true, + ["w_pi_pistol_luxe_mag1"] = true, + ["w_pi_pistol_luxe_mag2"] = true, + ["w_pi_pistol_mag1"] = true, + ["w_pi_pistol_mag2"] = true, + ["w_pi_pistol50"] = true, + ["w_pi_pistol50_luxe"] = true, + ["w_pi_pistol50_mag1"] = true, + ["w_pi_pistol50_mag1_luxe"] = true, + ["w_pi_pistol50_mag2"] = true, + ["w_pi_pistol50_mag2_luxe"] = true, + ["w_pi_pistolmk2"] = true, + ["w_pi_pistolmk2_camo_ind1"] = true, + ["w_pi_pistolmk2_camo_sl_ind1"] = true, + ["w_pi_pistolmk2_camo1"] = true, + ["w_pi_pistolmk2_camo10"] = true, + ["w_pi_pistolmk2_camo2"] = true, + ["w_pi_pistolmk2_camo3"] = true, + ["w_pi_pistolmk2_camo4"] = true, + ["w_pi_pistolmk2_camo5"] = true, + ["w_pi_pistolmk2_camo6"] = true, + ["w_pi_pistolmk2_camo7"] = true, + ["w_pi_pistolmk2_camo8"] = true, + ["w_pi_pistolmk2_camo9"] = true, + ["w_pi_pistolmk2_mag_fmj"] = true, + ["w_pi_pistolmk2_mag_hp"] = true, + ["w_pi_pistolmk2_mag_inc"] = true, + ["w_pi_pistolmk2_mag_tr"] = true, + ["w_pi_pistolmk2_mag1"] = true, + ["w_pi_pistolmk2_mag2"] = true, + ["w_pi_pistolmk2_slide_camo1"] = true, + ["w_pi_pistolmk2_slide_camo10"] = true, + ["w_pi_pistolmk2_slide_camo2"] = true, + ["w_pi_pistolmk2_slide_camo3"] = true, + ["w_pi_pistolmk2_slide_camo4"] = true, + ["w_pi_pistolmk2_slide_camo5"] = true, + ["w_pi_pistolmk2_slide_camo6"] = true, + ["w_pi_pistolmk2_slide_camo7"] = true, + ["w_pi_pistolmk2_slide_camo8"] = true, + ["w_pi_pistolmk2_slide_camo9"] = true, + ["w_pi_raygun"] = true, + ["w_pi_raygun_ev"] = true, + ["w_pi_revolver"] = true, + ["w_pi_revolver_b"] = true, + ["w_pi_revolver_g"] = true, + ["w_pi_revolver_mag1"] = true, + ["w_pi_revolvermk2"] = true, + ["w_pi_revolvermk2_camo_ind"] = true, + ["w_pi_revolvermk2_camo1"] = true, + ["w_pi_revolvermk2_camo10"] = true, + ["w_pi_revolvermk2_camo2"] = true, + ["w_pi_revolvermk2_camo3"] = true, + ["w_pi_revolvermk2_camo4"] = true, + ["w_pi_revolvermk2_camo5"] = true, + ["w_pi_revolvermk2_camo6"] = true, + ["w_pi_revolvermk2_camo7"] = true, + ["w_pi_revolvermk2_camo8"] = true, + ["w_pi_revolvermk2_camo9"] = true, + ["w_pi_revolvermk2_mag1"] = true, + ["w_pi_revolvermk2_mag2"] = true, + ["w_pi_revolvermk2_mag3"] = true, + ["w_pi_revolvermk2_mag4"] = true, + ["w_pi_revolvermk2_mag5"] = true, + ["w_pi_singleshot"] = true, + ["w_pi_singleshot_shell"] = true, + ["w_pi_singleshoth4"] = true, + ["w_pi_singleshoth4_shell"] = true, + ["w_pi_sns_pistol"] = true, + ["w_pi_sns_pistol_luxe"] = true, + ["w_pi_sns_pistol_luxe_mag1"] = true, + ["w_pi_sns_pistol_luxe_mag2"] = true, + ["w_pi_sns_pistol_mag1"] = true, + ["w_pi_sns_pistol_mag2"] = true, + ["w_pi_sns_pistolmk2"] = true, + ["w_pi_sns_pistolmk2_camo_ind1"] = true, + ["w_pi_sns_pistolmk2_camo1"] = true, + ["w_pi_sns_pistolmk2_camo10"] = true, + ["w_pi_sns_pistolmk2_camo2"] = true, + ["w_pi_sns_pistolmk2_camo3"] = true, + ["w_pi_sns_pistolmk2_camo4"] = true, + ["w_pi_sns_pistolmk2_camo5"] = true, + ["w_pi_sns_pistolmk2_camo6"] = true, + ["w_pi_sns_pistolmk2_camo7"] = true, + ["w_pi_sns_pistolmk2_camo8"] = true, + ["w_pi_sns_pistolmk2_camo9"] = true, + ["w_pi_sns_pistolmk2_mag_fmj"] = true, + ["w_pi_sns_pistolmk2_mag_hp"] = true, + ["w_pi_sns_pistolmk2_mag_inc"] = true, + ["w_pi_sns_pistolmk2_mag_tr"] = true, + ["w_pi_sns_pistolmk2_mag1"] = true, + ["w_pi_sns_pistolmk2_mag2"] = true, + ["w_pi_sns_pistolmk2_sl_camo_ind1"] = true, + ["w_pi_sns_pistolmk2_sl_camo1"] = true, + ["w_pi_sns_pistolmk2_sl_camo10"] = true, + ["w_pi_sns_pistolmk2_sl_camo2"] = true, + ["w_pi_sns_pistolmk2_sl_camo3"] = true, + ["w_pi_sns_pistolmk2_sl_camo4"] = true, + ["w_pi_sns_pistolmk2_sl_camo5"] = true, + ["w_pi_sns_pistolmk2_sl_camo6"] = true, + ["w_pi_sns_pistolmk2_sl_camo7"] = true, + ["w_pi_sns_pistolmk2_sl_camo8"] = true, + ["w_pi_sns_pistolmk2_sl_camo9"] = true, + ["w_pi_stungun"] = true, + ["w_pi_vintage_pistol"] = true, + ["w_pi_vintage_pistol_mag1"] = true, + ["w_pi_vintage_pistol_mag2"] = true, + ["w_pi_wep1_gun"] = true, + ["w_pi_wep1_mag1"] = true, + ["w_pi_wep2_gun"] = true, + ["w_pi_wep2_gun_mag1"] = true, + ["w_sb_assaultsmg"] = true, + ["w_sb_assaultsmg_luxe"] = true, + ["w_sb_assaultsmg_luxe_mag1"] = true, + ["w_sb_assaultsmg_luxe_mag2"] = true, + ["w_sb_assaultsmg_mag1"] = true, + ["w_sb_assaultsmg_mag2"] = true, + ["w_sb_compactsmg"] = true, + ["w_sb_compactsmg_boxmag"] = true, + ["w_sb_compactsmg_mag1"] = true, + ["w_sb_compactsmg_mag2"] = true, + ["w_sb_gusenberg"] = true, + ["w_sb_gusenberg_mag1"] = true, + ["w_sb_gusenberg_mag2"] = true, + ["w_sb_microsmg"] = true, + ["w_sb_microsmg_las"] = true, + ["w_sb_microsmg_luxe"] = true, + ["w_sb_microsmg_mag1"] = true, + ["w_sb_microsmg_mag1_luxe"] = true, + ["w_sb_microsmg_mag2"] = true, + ["w_sb_microsmg_mag2_luxe"] = true, + ["w_sb_minismg"] = true, + ["w_sb_minismg_mag1"] = true, + ["w_sb_minismg_mag2"] = true, + ["w_sb_pdw"] = true, + ["w_sb_pdw_boxmag"] = true, + ["w_sb_pdw_mag1"] = true, + ["w_sb_pdw_mag2"] = true, + ["w_sb_smg"] = true, + ["w_sb_smg_boxmag"] = true, + ["w_sb_smg_boxmag_luxe"] = true, + ["w_sb_smg_luxe"] = true, + ["w_sb_smg_luxe_mag1"] = true, + ["w_sb_smg_luxe_mag2"] = true, + ["w_sb_smg_mag1"] = true, + ["w_sb_smg_mag2"] = true, + ["w_sb_smgmk2"] = true, + ["w_sb_smgmk2_mag_fmj"] = true, + ["w_sb_smgmk2_mag_hp"] = true, + ["w_sb_smgmk2_mag_inc"] = true, + ["w_sb_smgmk2_mag_tr"] = true, + ["w_sb_smgmk2_mag1"] = true, + ["w_sb_smgmk2_mag2"] = true, + ["w_sg_assaultshotgun"] = true, + ["w_sg_assaultshotgun_mag1"] = true, + ["w_sg_assaultshotgun_mag2"] = true, + ["w_sg_bullpupshotgun"] = true, + ["w_sg_doublebarrel"] = true, + ["w_sg_doublebarrel_mag1"] = true, + ["w_sg_heavyshotgun"] = true, + ["w_sg_heavyshotgun_boxmag"] = true, + ["w_sg_heavyshotgun_mag1"] = true, + ["w_sg_heavyshotgun_mag2"] = true, + ["w_sg_pumpshotgun"] = true, + ["w_sg_pumpshotgun_chs"] = true, + ["w_sg_pumpshotgun_luxe"] = true, + ["w_sg_pumpshotgunh4"] = true, + ["w_sg_pumpshotgunh4_mag1"] = true, + ["w_sg_pumpshotgunmk2"] = true, + ["w_sg_pumpshotgunmk2_camo_ind1"] = true, + ["w_sg_pumpshotgunmk2_camo1"] = true, + ["w_sg_pumpshotgunmk2_camo10"] = true, + ["w_sg_pumpshotgunmk2_camo2"] = true, + ["w_sg_pumpshotgunmk2_camo3"] = true, + ["w_sg_pumpshotgunmk2_camo4"] = true, + ["w_sg_pumpshotgunmk2_camo5"] = true, + ["w_sg_pumpshotgunmk2_camo6"] = true, + ["w_sg_pumpshotgunmk2_camo7"] = true, + ["w_sg_pumpshotgunmk2_camo8"] = true, + ["w_sg_pumpshotgunmk2_camo9"] = true, + ["w_sg_pumpshotgunmk2_mag_ap"] = true, + ["w_sg_pumpshotgunmk2_mag_exp"] = true, + ["w_sg_pumpshotgunmk2_mag_hp"] = true, + ["w_sg_pumpshotgunmk2_mag_inc"] = true, + ["w_sg_pumpshotgunmk2_mag1"] = true, + ["w_sg_sawnoff"] = true, + ["w_sg_sawnoff_luxe"] = true, + ["w_sg_sweeper"] = true, + ["w_sg_sweeper_mag1"] = true, + ["w_smug_airmissile_01b"] = true, + ["w_smug_airmissile_02"] = true, + ["w_smug_bomb_01"] = true, + ["w_smug_bomb_02"] = true, + ["w_smug_bomb_03"] = true, + ["w_smug_bomb_04"] = true, + ["w_sr_heavysniper"] = true, + ["w_sr_heavysniper_mag1"] = true, + ["w_sr_heavysnipermk2"] = true, + ["w_sr_heavysnipermk2_mag_ap"] = true, + ["w_sr_heavysnipermk2_mag_ap2"] = true, + ["w_sr_heavysnipermk2_mag_fmj"] = true, + ["w_sr_heavysnipermk2_mag_inc"] = true, + ["w_sr_heavysnipermk2_mag1"] = true, + ["w_sr_heavysnipermk2_mag2"] = true, + ["w_sr_marksmanrifle"] = true, + ["w_sr_marksmanrifle_luxe"] = true, + ["w_sr_marksmanrifle_luxe_mag1"] = true, + ["w_sr_marksmanrifle_luxe_mag2"] = true, + ["w_sr_marksmanrifle_mag1"] = true, + ["w_sr_marksmanrifle_mag2"] = true, + ["w_sr_marksmanriflemk2"] = true, + ["w_sr_marksmanriflemk2_camo_ind"] = true, + ["w_sr_marksmanriflemk2_camo1"] = true, + ["w_sr_marksmanriflemk2_camo10"] = true, + ["w_sr_marksmanriflemk2_camo2"] = true, + ["w_sr_marksmanriflemk2_camo3"] = true, + ["w_sr_marksmanriflemk2_camo4"] = true, + ["w_sr_marksmanriflemk2_camo5"] = true, + ["w_sr_marksmanriflemk2_camo6"] = true, + ["w_sr_marksmanriflemk2_camo7"] = true, + ["w_sr_marksmanriflemk2_camo8"] = true, + ["w_sr_marksmanriflemk2_camo9"] = true, + ["w_sr_marksmanriflemk2_mag_ap"] = true, + ["w_sr_marksmanriflemk2_mag_fmj"] = true, + ["w_sr_marksmanriflemk2_mag_inc"] = true, + ["w_sr_marksmanriflemk2_mag_tr"] = true, + ["w_sr_marksmanriflemk2_mag1"] = true, + ["w_sr_marksmanriflemk2_mag2"] = true, + ["w_sr_mr_mk2_barrel_1"] = true, + ["w_sr_mr_mk2_barrel_2"] = true, + ["w_sr_sniperrifle"] = true, + ["w_sr_sniperrifle_luxe"] = true, + ["w_sr_sniperrifle_mag1"] = true, + ["w_sr_sniperrifle_mag1_luxe"] = true, + ["watercooler_bottle001"] = true, + ["winerow"] = true, + ["xm_attach_geom_lighting_hangar_a"] = true, + ["xm_attach_geom_lighting_hangar_b"] = true, + ["xm_attach_geom_lighting_hangar_c"] = true, + ["xm_base_cia_chair_conf"] = true, + ["xm_base_cia_data_desks"] = true, + ["xm_base_cia_desk1"] = true, + ["xm_base_cia_lamp_ceiling_01"] = true, + ["xm_base_cia_lamp_ceiling_01b"] = true, + ["xm_base_cia_lamp_ceiling_02a"] = true, + ["xm_base_cia_lamp_floor_01a"] = true, + ["xm_base_cia_lamp_floor_01b"] = true, + ["xm_base_cia_seats_long"] = true, + ["xm_base_cia_server_01"] = true, + ["xm_base_cia_server_02"] = true, + ["xm_base_cia_serverh_01_rp"] = true, + ["xm_base_cia_serverh_02_rp"] = true, + ["xm_base_cia_serverh_03_rp"] = true, + ["xm_base_cia_serverhsml_01_rp"] = true, + ["xm_base_cia_serverhub_01"] = true, + ["xm_base_cia_serverhub_02"] = true, + ["xm_base_cia_serverhub_02_proxy"] = true, + ["xm_base_cia_serverhub_03"] = true, + ["xm_base_cia_serverhubsml_01"] = true, + ["xm_base_cia_servermed_01"] = true, + ["xm_base_cia_serverp_01_rp"] = true, + ["xm_base_cia_serverport_01"] = true, + ["xm_base_cia_serversml_01"] = true, + ["xm_base_cia_servertall_01"] = true, + ["xm_int_lev_cmptower_case_01"] = true, + ["xm_int_lev_scuba_gear"] = true, + ["xm_int_lev_silo_doorlight_01"] = true, + ["xm_int_lev_silo_keypad_01"] = true, + ["xm_int_lev_sub_chair_01"] = true, + ["xm_int_lev_sub_chair_02"] = true, + ["xm_int_lev_sub_doorl"] = true, + ["xm_int_lev_sub_doorr"] = true, + ["xm_int_lev_sub_hatch"] = true, + ["xm_int_lev_xm17_base_door"] = true, + ["xm_int_lev_xm17_base_door_02"] = true, + ["xm_int_lev_xm17_base_doorframe"] = true, + ["xm_int_lev_xm17_base_doorframe_02"] = true, + ["xm_int_lev_xm17_base_lockup"] = true, + ["xm_int_prop_tinsel_aven_01a"] = true, + ["xm_int_prop_tinsel_truck_carmod"] = true, + ["xm_int_prop_tinsel_truck_command"] = true, + ["xm_int_prop_tinsel_truck_gunmod"] = true, + ["xm_int_prop_tinsel_truck_living"] = true, + ["xm_int_prop_tinsel_truck_main"] = true, + ["xm_lab_chairarm_02"] = true, + ["xm_lab_chairarm_03"] = true, + ["xm_lab_chairarm_11"] = true, + ["xm_lab_chairarm_12"] = true, + ["xm_lab_chairarm_24"] = true, + ["xm_lab_chairarm_25"] = true, + ["xm_lab_chairarm_26"] = true, + ["xm_lab_chairstool_12"] = true, + ["xm_lab_easychair_01"] = true, + ["xm_lab_sofa_01"] = true, + ["xm_lab_sofa_02"] = true, + ["xm_mp_h_stn_chairarm_13"] = true, + ["xm_prop_agt_cia_door_el_02_l"] = true, + ["xm_prop_agt_cia_door_el_02_r"] = true, + ["xm_prop_agt_cia_door_el_l"] = true, + ["xm_prop_agt_cia_door_el_r"] = true, + ["xm_prop_agt_door_01"] = true, + ["xm_prop_auto_salvage_elegy"] = true, + ["xm_prop_auto_salvage_infernus2"] = true, + ["xm_prop_auto_salvage_stromberg"] = true, + ["xm_prop_base_blast_door_01"] = true, + ["xm_prop_base_blast_door_01a"] = true, + ["xm_prop_base_blast_door_02_l"] = true, + ["xm_prop_base_blast_door_02_r"] = true, + ["xm_prop_base_blast_door_02a"] = true, + ["xm_prop_base_cabinet_door_01"] = true, + ["xm_prop_base_computer_01"] = true, + ["xm_prop_base_computer_02"] = true, + ["xm_prop_base_computer_03"] = true, + ["xm_prop_base_computer_04"] = true, + ["xm_prop_base_computer_06"] = true, + ["xm_prop_base_computer_08"] = true, + ["xm_prop_base_crew_emblem"] = true, + ["xm_prop_base_door_02"] = true, + ["xm_prop_base_door_04"] = true, + ["xm_prop_base_doorlamp_lock"] = true, + ["xm_prop_base_doorlamp_unlock"] = true, + ["xm_prop_base_fence_01"] = true, + ["xm_prop_base_fence_02"] = true, + ["xm_prop_base_hanger_glass"] = true, + ["xm_prop_base_hanger_lift"] = true, + ["xm_prop_base_heavy_door_01"] = true, + ["xm_prop_base_jet_01"] = true, + ["xm_prop_base_jet_01_static"] = true, + ["xm_prop_base_jet_02"] = true, + ["xm_prop_base_jet_02_static"] = true, + ["xm_prop_base_rail_cart_01a"] = true, + ["xm_prop_base_rail_cart_01b"] = true, + ["xm_prop_base_rail_cart_01c"] = true, + ["xm_prop_base_rail_cart_01d"] = true, + ["xm_prop_base_silo_lamp_01a"] = true, + ["xm_prop_base_silo_lamp_01b"] = true, + ["xm_prop_base_silo_lamp_01c"] = true, + ["xm_prop_base_silo_platform_01a"] = true, + ["xm_prop_base_silo_platform_01b"] = true, + ["xm_prop_base_silo_platform_01c"] = true, + ["xm_prop_base_silo_platform_01d"] = true, + ["xm_prop_base_slide_door"] = true, + ["xm_prop_base_staff_desk_01"] = true, + ["xm_prop_base_staff_desk_02"] = true, + ["xm_prop_base_tower_lampa"] = true, + ["xm_prop_base_tripod_lampa"] = true, + ["xm_prop_base_tripod_lampb"] = true, + ["xm_prop_base_tripod_lampc"] = true, + ["xm_prop_base_tunnel_hang_lamp"] = true, + ["xm_prop_base_tunnel_hang_lamp2"] = true, + ["xm_prop_base_wall_lampa"] = true, + ["xm_prop_base_wall_lampb"] = true, + ["xm_prop_base_work_station_01"] = true, + ["xm_prop_base_work_station_03"] = true, + ["xm_prop_body_bag"] = true, + ["xm_prop_cannon_room_door"] = true, + ["xm_prop_cannon_room_door_02"] = true, + ["xm_prop_control_panel_tunnel"] = true, + ["xm_prop_crates_pistols_01a"] = true, + ["xm_prop_crates_rifles_01a"] = true, + ["xm_prop_crates_rifles_02a"] = true, + ["xm_prop_crates_rifles_03a"] = true, + ["xm_prop_crates_rifles_04a"] = true, + ["xm_prop_crates_sam_01a"] = true, + ["xm_prop_crates_weapon_mix_01a"] = true, + ["xm_prop_facility_door_01"] = true, + ["xm_prop_facility_door_02"] = true, + ["xm_prop_facility_glass_01b"] = true, + ["xm_prop_facility_glass_01c"] = true, + ["xm_prop_facility_glass_01d"] = true, + ["xm_prop_facility_glass_01e"] = true, + ["xm_prop_facility_glass_01f"] = true, + ["xm_prop_facility_glass_01g"] = true, + ["xm_prop_facility_glass_01h"] = true, + ["xm_prop_facility_glass_01i"] = true, + ["xm_prop_facility_glass_01j"] = true, + ["xm_prop_facility_glass_01l"] = true, + ["xm_prop_facility_glass_01n"] = true, + ["xm_prop_facility_glass_01o"] = true, + ["xm_prop_gr_console_01"] = true, + ["xm_prop_iaa_base_door_01"] = true, + ["xm_prop_iaa_base_door_02"] = true, + ["xm_prop_iaa_base_elevator"] = true, + ["xm_prop_int_avenger_door_01a"] = true, + ["xm_prop_int_hanger_collision"] = true, + ["xm_prop_int_studiolo_colfix"] = true, + ["xm_prop_lab_barrier01"] = true, + ["xm_prop_lab_barrier02"] = true, + ["xm_prop_lab_booth_glass01"] = true, + ["xm_prop_lab_booth_glass02"] = true, + ["xm_prop_lab_booth_glass03"] = true, + ["xm_prop_lab_booth_glass04"] = true, + ["xm_prop_lab_booth_glass05"] = true, + ["xm_prop_lab_ceiling_lampa"] = true, + ["xm_prop_lab_ceiling_lampb"] = true, + ["xm_prop_lab_ceiling_lampb_group3"] = true, + ["xm_prop_lab_ceiling_lampb_group3l"] = true, + ["xm_prop_lab_ceiling_lampb_group5"] = true, + ["xm_prop_lab_cyllight002"] = true, + ["xm_prop_lab_cyllight01"] = true, + ["xm_prop_lab_desk_01"] = true, + ["xm_prop_lab_desk_02"] = true, + ["xm_prop_lab_door01_dna_l"] = true, + ["xm_prop_lab_door01_dna_r"] = true, + ["xm_prop_lab_door01_l"] = true, + ["xm_prop_lab_door01_lbth_l"] = true, + ["xm_prop_lab_door01_lbth_r"] = true, + ["xm_prop_lab_door01_r"] = true, + ["xm_prop_lab_door01_stack_l"] = true, + ["xm_prop_lab_door01_stack_r"] = true, + ["xm_prop_lab_door01_star_l"] = true, + ["xm_prop_lab_door01_star_r"] = true, + ["xm_prop_lab_door02_r"] = true, + ["xm_prop_lab_doorframe01"] = true, + ["xm_prop_lab_doorframe02"] = true, + ["xm_prop_lab_floor_lampa"] = true, + ["xm_prop_lab_lamp_wall_b"] = true, + ["xm_prop_lab_partition01"] = true, + ["xm_prop_lab_strip_lighta"] = true, + ["xm_prop_lab_strip_lightb"] = true, + ["xm_prop_lab_strip_lightbl"] = true, + ["xm_prop_lab_tube_lampa"] = true, + ["xm_prop_lab_tube_lampa_group3"] = true, + ["xm_prop_lab_tube_lampa_group6_g"] = true, + ["xm_prop_lab_tube_lampa_group6_p"] = true, + ["xm_prop_lab_tube_lampa_group6_r"] = true, + ["xm_prop_lab_tube_lampa_group6_y"] = true, + ["xm_prop_lab_tube_lampb"] = true, + ["xm_prop_lab_tube_lampb_group3"] = true, + ["xm_prop_lab_wall_lampa"] = true, + ["xm_prop_lab_wall_lampb"] = true, + ["xm_prop_moderncrate_xplv_01"] = true, + ["xm_prop_orbital_cannon_table"] = true, + ["xm_prop_out_hanger_lift"] = true, + ["xm_prop_rsply_crate04a"] = true, + ["xm_prop_rsply_crate04b"] = true, + ["xm_prop_sam_turret_01"] = true, + ["xm_prop_silo_elev_door01_l"] = true, + ["xm_prop_silo_elev_door01_r"] = true, + ["xm_prop_smug_crate_s_medical"] = true, + ["xm_prop_staff_screens_01"] = true, + ["xm_prop_tunnel_fan_01"] = true, + ["xm_prop_tunnel_fan_02"] = true, + ["xm_prop_vancrate_01a"] = true, + ["xm_prop_x17_add_door_01"] = true, + ["xm_prop_x17_avengerchair"] = true, + ["xm_prop_x17_avengerchair_02"] = true, + ["xm_prop_x17_b_glasses_01"] = true, + ["xm_prop_x17_bag_01a"] = true, + ["xm_prop_x17_bag_01b"] = true, + ["xm_prop_x17_bag_01c"] = true, + ["xm_prop_x17_bag_01d"] = true, + ["xm_prop_x17_bag_med_01a"] = true, + ["xm_prop_x17_barge_01"] = true, + ["xm_prop_x17_barge_col_01"] = true, + ["xm_prop_x17_barge_col_02"] = true, + ["xm_prop_x17_book_bogdan"] = true, + ["xm_prop_x17_boxwood_01"] = true, + ["xm_prop_x17_bunker_door"] = true, + ["xm_prop_x17_cctv_01a"] = true, + ["xm_prop_x17_chest_closed"] = true, + ["xm_prop_x17_chest_open"] = true, + ["xm_prop_x17_clicker_01"] = true, + ["xm_prop_x17_coffee_jug"] = true, + ["xm_prop_x17_computer_01"] = true, + ["xm_prop_x17_computer_02"] = true, + ["xm_prop_x17_corp_offchair"] = true, + ["xm_prop_x17_corpse_01"] = true, + ["xm_prop_x17_corpse_02"] = true, + ["xm_prop_x17_corpse_03"] = true, + ["xm_prop_x17_cover_01"] = true, + ["xm_prop_x17_desk_cover_01a"] = true, + ["xm_prop_x17_filecab_01a"] = true, + ["xm_prop_x17_flight_rec_01a"] = true, + ["xm_prop_x17_harddisk_01a"] = true, + ["xm_prop_x17_hatch_d_l_27m"] = true, + ["xm_prop_x17_hatch_d_r_27m"] = true, + ["xm_prop_x17_hatch_lights"] = true, + ["xm_prop_x17_l_door_frame_01"] = true, + ["xm_prop_x17_l_door_glass_01"] = true, + ["xm_prop_x17_l_door_glass_op_01"] = true, + ["xm_prop_x17_l_frame_01"] = true, + ["xm_prop_x17_l_frame_02"] = true, + ["xm_prop_x17_l_frame_03"] = true, + ["xm_prop_x17_l_glass_01"] = true, + ["xm_prop_x17_l_glass_02"] = true, + ["xm_prop_x17_l_glass_03"] = true, + ["xm_prop_x17_labvats"] = true, + ["xm_prop_x17_lap_top_01"] = true, + ["xm_prop_x17_laptop_agent14_01"] = true, + ["xm_prop_x17_laptop_avon"] = true, + ["xm_prop_x17_laptop_lester_01"] = true, + ["xm_prop_x17_laptop_mrsr"] = true, + ["xm_prop_x17_ld_case_01"] = true, + ["xm_prop_x17_lectern_01"] = true, + ["xm_prop_x17_mine_01a"] = true, + ["xm_prop_x17_mine_02a"] = true, + ["xm_prop_x17_mine_03a"] = true, + ["xm_prop_x17_note_paper_01a"] = true, + ["xm_prop_x17_osphatch_27m"] = true, + ["xm_prop_x17_osphatch_40m"] = true, + ["xm_prop_x17_osphatch_col"] = true, + ["xm_prop_x17_osphatch_op_27m"] = true, + ["xm_prop_x17_para_sp_s"] = true, + ["xm_prop_x17_phone_01"] = true, + ["xm_prop_x17_pillar"] = true, + ["xm_prop_x17_pillar_02"] = true, + ["xm_prop_x17_pillar_03"] = true, + ["xm_prop_x17_powerbox_01"] = true, + ["xm_prop_x17_res_pctower"] = true, + ["xm_prop_x17_rig_osphatch"] = true, + ["xm_prop_x17_screens_01a"] = true, + ["xm_prop_x17_screens_02a"] = true, + ["xm_prop_x17_screens_02a_01"] = true, + ["xm_prop_x17_screens_02a_02"] = true, + ["xm_prop_x17_screens_02a_03"] = true, + ["xm_prop_x17_screens_02a_04"] = true, + ["xm_prop_x17_screens_02a_05"] = true, + ["xm_prop_x17_screens_02a_06"] = true, + ["xm_prop_x17_screens_02a_07"] = true, + ["xm_prop_x17_screens_02a_08"] = true, + ["xm_prop_x17_scuba_tank"] = true, + ["xm_prop_x17_seat_cover_01a"] = true, + ["xm_prop_x17_sec_panel_01"] = true, + ["xm_prop_x17_server_farm_cctv_01"] = true, + ["xm_prop_x17_shamal_crash"] = true, + ["xm_prop_x17_shovel_01a"] = true, + ["xm_prop_x17_shovel_01b"] = true, + ["xm_prop_x17_silo_01_col"] = true, + ["xm_prop_x17_silo_01a"] = true, + ["xm_prop_x17_silo_door_l_01a"] = true, + ["xm_prop_x17_silo_door_r_01a"] = true, + ["xm_prop_x17_silo_open_01a"] = true, + ["xm_prop_x17_silo_rocket_01"] = true, + ["xm_prop_x17_skin_osphatch"] = true, + ["xm_prop_x17_sub"] = true, + ["xm_prop_x17_sub_al_lamp_off"] = true, + ["xm_prop_x17_sub_al_lamp_on"] = true, + ["xm_prop_x17_sub_alarm_lamp"] = true, + ["xm_prop_x17_sub_damage"] = true, + ["xm_prop_x17_sub_extra"] = true, + ["xm_prop_x17_sub_lampa_large_blue"] = true, + ["xm_prop_x17_sub_lampa_large_white"] = true, + ["xm_prop_x17_sub_lampa_large_yel"] = true, + ["xm_prop_x17_sub_lampa_small_blue"] = true, + ["xm_prop_x17_sub_lampa_small_white"] = true, + ["xm_prop_x17_sub_lampa_small_yel"] = true, + ["xm_prop_x17_tablet_01"] = true, + ["xm_prop_x17_tem_control_01"] = true, + ["xm_prop_x17_tool_draw_01a"] = true, + ["xm_prop_x17_torpedo_case_01"] = true, + ["xm_prop_x17_trail_01a"] = true, + ["xm_prop_x17_trail_02a"] = true, + ["xm_prop_x17_tv_ceiling_01"] = true, + ["xm_prop_x17_tv_ceiling_scn_01"] = true, + ["xm_prop_x17_tv_ceiling_scn_02"] = true, + ["xm_prop_x17_tv_flat_01"] = true, + ["xm_prop_x17_tv_flat_02"] = true, + ["xm_prop_x17_tv_scrn_01"] = true, + ["xm_prop_x17_tv_scrn_02"] = true, + ["xm_prop_x17_tv_scrn_03"] = true, + ["xm_prop_x17_tv_scrn_04"] = true, + ["xm_prop_x17_tv_scrn_05"] = true, + ["xm_prop_x17_tv_scrn_06"] = true, + ["xm_prop_x17_tv_scrn_07"] = true, + ["xm_prop_x17_tv_scrn_08"] = true, + ["xm_prop_x17_tv_scrn_09"] = true, + ["xm_prop_x17_tv_scrn_10"] = true, + ["xm_prop_x17_tv_scrn_11"] = true, + ["xm_prop_x17_tv_scrn_12"] = true, + ["xm_prop_x17_tv_scrn_13"] = true, + ["xm_prop_x17_tv_scrn_14"] = true, + ["xm_prop_x17_tv_scrn_15"] = true, + ["xm_prop_x17_tv_scrn_16"] = true, + ["xm_prop_x17_tv_scrn_17"] = true, + ["xm_prop_x17_tv_scrn_18"] = true, + ["xm_prop_x17_tv_scrn_19"] = true, + ["xm_prop_x17_tv_stand_01a"] = true, + ["xm_prop_x17_tv_wall"] = true, + ["xm_prop_x17_xmas_tree_int"] = true, + ["xm_prop_x17dlc_monitor_wall_01a"] = true, + ["xm_prop_x17dlc_rep_sign_01a"] = true, + ["xm_prop_xm_gunlocker_01a"] = true, + ["xm_prop_xm17_wayfinding"] = true, + ["xm_screen_1"] = true, + ["xs_arenalights_arenastruc"] = true, + ["xs_arenalights_atlantis_spin"] = true, + ["xs_arenalights_track_atlantis"] = true, + ["xs_arenalights_track_dyst01"] = true, + ["xs_arenalights_track_dyst02"] = true, + ["xs_arenalights_track_dyst03"] = true, + ["xs_arenalights_track_dyst04"] = true, + ["xs_arenalights_track_dyst05"] = true, + ["xs_arenalights_track_dyst06"] = true, + ["xs_arenalights_track_dyst07"] = true, + ["xs_arenalights_track_dyst08"] = true, + ["xs_arenalights_track_dyst09"] = true, + ["xs_arenalights_track_dyst10"] = true, + ["xs_arenalights_track_dyst11"] = true, + ["xs_arenalights_track_dyst12"] = true, + ["xs_arenalights_track_dyst13"] = true, + ["xs_arenalights_track_dyst14"] = true, + ["xs_arenalights_track_dyst15"] = true, + ["xs_arenalights_track_dyst16"] = true, + ["xs_arenalights_track_evening"] = true, + ["xs_arenalights_track_hell"] = true, + ["xs_arenalights_track_midday"] = true, + ["xs_arenalights_track_morning"] = true, + ["xs_arenalights_track_night"] = true, + ["xs_arenalights_track_saccharine"] = true, + ["xs_arenalights_track_sandstorm"] = true, + ["xs_arenalights_track_sfnight"] = true, + ["xs_arenalights_track_storm"] = true, + ["xs_arenalights_track_toxic"] = true, + ["xs_combined_dyst_03_brdg01"] = true, + ["xs_combined_dyst_03_brdg02"] = true, + ["xs_combined_dyst_03_build_a"] = true, + ["xs_combined_dyst_03_build_b"] = true, + ["xs_combined_dyst_03_build_c"] = true, + ["xs_combined_dyst_03_build_d"] = true, + ["xs_combined_dyst_03_build_e"] = true, + ["xs_combined_dyst_03_build_f"] = true, + ["xs_combined_dyst_03_jumps"] = true, + ["xs_combined_dyst_05_props01"] = true, + ["xs_combined_dyst_05_props02"] = true, + ["xs_combined_dyst_06_build_01"] = true, + ["xs_combined_dyst_06_build_02"] = true, + ["xs_combined_dyst_06_build_03"] = true, + ["xs_combined_dyst_06_build_04"] = true, + ["xs_combined_dyst_06_plane"] = true, + ["xs_combined_dyst_06_roads"] = true, + ["xs_combined_dyst_06_rocks"] = true, + ["xs_combined_dyst_fence_04"] = true, + ["xs_combined_dyst_neon_04"] = true, + ["xs_combined_dyst_pipes_04"] = true, + ["xs_combined_dyst_planeb_04"] = true, + ["xs_combined_dystopian_14_brdg01"] = true, + ["xs_combined_dystopian_14_brdg02"] = true, + ["xs_combined_set_dyst_01_build_01"] = true, + ["xs_combined_set_dyst_01_build_02"] = true, + ["xs_combined_set_dyst_01_build_03"] = true, + ["xs_combined_set_dyst_01_build_04"] = true, + ["xs_combined_set_dyst_01_build_05"] = true, + ["xs_combined_set_dyst_01_build_06"] = true, + ["xs_combined_set_dyst_01_build_07"] = true, + ["xs_combined_set_dyst_01_build_08"] = true, + ["xs_combined_set_dyst_01_build_09"] = true, + ["xs_combined_set_dyst_01_build_10"] = true, + ["xs_combined_set_dyst_01_build_11"] = true, + ["xs_combined_set_dyst_01_build_12"] = true, + ["xs_combined2_dyst_07_boatsafety"] = true, + ["xs_combined2_dyst_07_build_a"] = true, + ["xs_combined2_dyst_07_build_b"] = true, + ["xs_combined2_dyst_07_build_c"] = true, + ["xs_combined2_dyst_07_build_d"] = true, + ["xs_combined2_dyst_07_build_e"] = true, + ["xs_combined2_dyst_07_build_f"] = true, + ["xs_combined2_dyst_07_build_g"] = true, + ["xs_combined2_dyst_07_cabin"] = true, + ["xs_combined2_dyst_07_hull"] = true, + ["xs_combined2_dyst_07_rear_hull"] = true, + ["xs_combined2_dyst_07_shipdecals"] = true, + ["xs_combined2_dyst_07_shipdetails"] = true, + ["xs_combined2_dyst_07_shipdetails2"] = true, + ["xs_combined2_dyst_07_turret"] = true, + ["xs_combined2_dyst_08_build_01"] = true, + ["xs_combined2_dyst_08_pipes_01"] = true, + ["xs_combined2_dyst_08_pipes_02"] = true, + ["xs_combined2_dyst_08_ramp"] = true, + ["xs_combined2_dyst_08_towers"] = true, + ["xs_combined2_dyst_barrier_01_09"] = true, + ["xs_combined2_dyst_barrier_01b_09"] = true, + ["xs_combined2_dyst_bridge_01"] = true, + ["xs_combined2_dyst_build_01a_09"] = true, + ["xs_combined2_dyst_build_01b_09"] = true, + ["xs_combined2_dyst_build_01c_09"] = true, + ["xs_combined2_dyst_build_02a_09"] = true, + ["xs_combined2_dyst_build_02b_09"] = true, + ["xs_combined2_dyst_build_02c_09"] = true, + ["xs_combined2_dyst_glue_09"] = true, + ["xs_combined2_dyst_longbuild_a_09"] = true, + ["xs_combined2_dyst_longbuild_b_09"] = true, + ["xs_combined2_dyst_longbuild_c_09"] = true, + ["xs_combined2_dyst_pipea_09"] = true, + ["xs_combined2_dyst_pipeb_09"] = true, + ["xs_combined2_dystdecal_10"] = true, + ["xs_combined2_dystplane_10"] = true, + ["xs_combined2_dystplaneb_10"] = true, + ["xs_combined2_terrain_dystopian_08"] = true, + ["xs_combined2_wallglue_10"] = true, + ["xs_p_para_bag_arena_s"] = true, + ["xs_prop_ar_buildingx_01a_sf"] = true, + ["xs_prop_ar_gate_01a_sf"] = true, + ["xs_prop_ar_pipe_01a_sf"] = true, + ["xs_prop_ar_pipe_conn_01a_sf"] = true, + ["xs_prop_ar_planter_c_01a_sf"] = true, + ["xs_prop_ar_planter_c_02a_sf"] = true, + ["xs_prop_ar_planter_c_03a_sf"] = true, + ["xs_prop_ar_planter_m_01a_sf"] = true, + ["xs_prop_ar_planter_m_30a_sf"] = true, + ["xs_prop_ar_planter_m_30b_sf"] = true, + ["xs_prop_ar_planter_m_60a_sf"] = true, + ["xs_prop_ar_planter_m_60b_sf"] = true, + ["xs_prop_ar_planter_m_90a_sf"] = true, + ["xs_prop_ar_planter_s_01a_sf"] = true, + ["xs_prop_ar_planter_s_180a_sf"] = true, + ["xs_prop_ar_planter_s_45a_sf"] = true, + ["xs_prop_ar_planter_s_90a_sf"] = true, + ["xs_prop_ar_planter_xl_01a_sf"] = true, + ["xs_prop_ar_stand_thick_01a_sf"] = true, + ["xs_prop_ar_tower_01a_sf"] = true, + ["xs_prop_ar_tunnel_01a"] = true, + ["xs_prop_ar_tunnel_01a_sf"] = true, + ["xs_prop_ar_tunnel_01a_wl"] = true, + ["xs_prop_arena_1bay_01a"] = true, + ["xs_prop_arena_2bay_01a"] = true, + ["xs_prop_arena_3bay_01a"] = true, + ["xs_prop_arena_adj_hloop"] = true, + ["xs_prop_arena_adj_hloop_sf"] = true, + ["xs_prop_arena_adj_hloop_wl"] = true, + ["xs_prop_arena_airmissile_01a"] = true, + ["xs_prop_arena_arrow_01a"] = true, + ["xs_prop_arena_arrow_01a_sf"] = true, + ["xs_prop_arena_arrow_01a_wl"] = true, + ["xs_prop_arena_bag_01"] = true, + ["xs_prop_arena_barrel_01a"] = true, + ["xs_prop_arena_barrel_01a_sf"] = true, + ["xs_prop_arena_barrel_01a_wl"] = true, + ["xs_prop_arena_bigscreen_01"] = true, + ["xs_prop_arena_bollard_rising_01a"] = true, + ["xs_prop_arena_bollard_rising_01a_sf"] = true, + ["xs_prop_arena_bollard_rising_01a_wl"] = true, + ["xs_prop_arena_bollard_rising_01b"] = true, + ["xs_prop_arena_bollard_rising_01b_sf"] = true, + ["xs_prop_arena_bollard_rising_01b_wl"] = true, + ["xs_prop_arena_bollard_side_01a"] = true, + ["xs_prop_arena_bollard_side_01a_sf"] = true, + ["xs_prop_arena_bollard_side_01a_wl"] = true, + ["xs_prop_arena_bomb_l"] = true, + ["xs_prop_arena_bomb_m"] = true, + ["xs_prop_arena_bomb_s"] = true, + ["xs_prop_arena_box_test"] = true, + ["xs_prop_arena_building_01a"] = true, + ["xs_prop_arena_car_wall_01a"] = true, + ["xs_prop_arena_car_wall_02a"] = true, + ["xs_prop_arena_car_wall_03a"] = true, + ["xs_prop_arena_cash_pile_l"] = true, + ["xs_prop_arena_cash_pile_m"] = true, + ["xs_prop_arena_cash_pile_s"] = true, + ["xs_prop_arena_champ_closed"] = true, + ["xs_prop_arena_champ_open"] = true, + ["xs_prop_arena_clipboard_01a"] = true, + ["xs_prop_arena_clipboard_01b"] = true, + ["xs_prop_arena_clipboard_paper"] = true, + ["xs_prop_arena_confetti_cannon"] = true, + ["xs_prop_arena_crate_01a"] = true, + ["xs_prop_arena_drone_01"] = true, + ["xs_prop_arena_drone_02"] = true, + ["xs_prop_arena_fence_01a"] = true, + ["xs_prop_arena_fence_01a_sf"] = true, + ["xs_prop_arena_fence_01a_wl"] = true, + ["xs_prop_arena_finish_line"] = true, + ["xs_prop_arena_flipper_large_01a"] = true, + ["xs_prop_arena_flipper_large_01a_sf"] = true, + ["xs_prop_arena_flipper_large_01a_wl"] = true, + ["xs_prop_arena_flipper_small_01a"] = true, + ["xs_prop_arena_flipper_small_01a_sf"] = true, + ["xs_prop_arena_flipper_small_01a_wl"] = true, + ["xs_prop_arena_flipper_xl_01a"] = true, + ["xs_prop_arena_flipper_xl_01a_sf"] = true, + ["xs_prop_arena_flipper_xl_01a_wl"] = true, + ["xs_prop_arena_gaspole_01"] = true, + ["xs_prop_arena_gaspole_02"] = true, + ["xs_prop_arena_gaspole_03"] = true, + ["xs_prop_arena_gaspole_04"] = true, + ["xs_prop_arena_gate_01a"] = true, + ["xs_prop_arena_goal"] = true, + ["xs_prop_arena_goal_sf"] = true, + ["xs_prop_arena_i_flag_green"] = true, + ["xs_prop_arena_i_flag_pink"] = true, + ["xs_prop_arena_i_flag_purple"] = true, + ["xs_prop_arena_i_flag_red"] = true, + ["xs_prop_arena_i_flag_white"] = true, + ["xs_prop_arena_i_flag_yellow"] = true, + ["xs_prop_arena_industrial_a"] = true, + ["xs_prop_arena_industrial_b"] = true, + ["xs_prop_arena_industrial_c"] = true, + ["xs_prop_arena_industrial_d"] = true, + ["xs_prop_arena_industrial_e"] = true, + ["xs_prop_arena_jump_02b"] = true, + ["xs_prop_arena_jump_l_01a"] = true, + ["xs_prop_arena_jump_l_01a_sf"] = true, + ["xs_prop_arena_jump_l_01a_wl"] = true, + ["xs_prop_arena_jump_m_01a"] = true, + ["xs_prop_arena_jump_m_01a_sf"] = true, + ["xs_prop_arena_jump_m_01a_wl"] = true, + ["xs_prop_arena_jump_s_01a"] = true, + ["xs_prop_arena_jump_s_01a_sf"] = true, + ["xs_prop_arena_jump_s_01a_wl"] = true, + ["xs_prop_arena_jump_xl_01a"] = true, + ["xs_prop_arena_jump_xl_01a_sf"] = true, + ["xs_prop_arena_jump_xl_01a_wl"] = true, + ["xs_prop_arena_jump_xs_01a"] = true, + ["xs_prop_arena_jump_xs_01a_sf"] = true, + ["xs_prop_arena_jump_xs_01a_wl"] = true, + ["xs_prop_arena_jump_xxl_01a"] = true, + ["xs_prop_arena_jump_xxl_01a_sf"] = true, + ["xs_prop_arena_jump_xxl_01a_wl"] = true, + ["xs_prop_arena_landmine_01a"] = true, + ["xs_prop_arena_landmine_01a_sf"] = true, + ["xs_prop_arena_landmine_01c"] = true, + ["xs_prop_arena_landmine_01c_sf"] = true, + ["xs_prop_arena_landmine_01c_wl"] = true, + ["xs_prop_arena_landmine_03a"] = true, + ["xs_prop_arena_landmine_03a_sf"] = true, + ["xs_prop_arena_landmine_03a_wl"] = true, + ["xs_prop_arena_lights_ceiling_l_a"] = true, + ["xs_prop_arena_lights_ceiling_l_c"] = true, + ["xs_prop_arena_lights_tube_l_a"] = true, + ["xs_prop_arena_lights_tube_l_b"] = true, + ["xs_prop_arena_lights_wall_l_a"] = true, + ["xs_prop_arena_lights_wall_l_c"] = true, + ["xs_prop_arena_lights_wall_l_d"] = true, + ["xs_prop_arena_oil_jack_01a"] = true, + ["xs_prop_arena_oil_jack_02a"] = true, + ["xs_prop_arena_overalls_01a"] = true, + ["xs_prop_arena_pipe_bend_01a"] = true, + ["xs_prop_arena_pipe_bend_01b"] = true, + ["xs_prop_arena_pipe_bend_01c"] = true, + ["xs_prop_arena_pipe_bend_02a"] = true, + ["xs_prop_arena_pipe_bend_02b"] = true, + ["xs_prop_arena_pipe_bend_02c"] = true, + ["xs_prop_arena_pipe_end_01a"] = true, + ["xs_prop_arena_pipe_end_02a"] = true, + ["xs_prop_arena_pipe_machine_01a"] = true, + ["xs_prop_arena_pipe_machine_02a"] = true, + ["xs_prop_arena_pipe_ramp_01a"] = true, + ["xs_prop_arena_pipe_straight_01a"] = true, + ["xs_prop_arena_pipe_straight_01b"] = true, + ["xs_prop_arena_pipe_straight_02a"] = true, + ["xs_prop_arena_pipe_straight_02b"] = true, + ["xs_prop_arena_pipe_straight_02c"] = true, + ["xs_prop_arena_pipe_straight_02d"] = true, + ["xs_prop_arena_pipe_track_c_01a"] = true, + ["xs_prop_arena_pipe_track_c_01b"] = true, + ["xs_prop_arena_pipe_track_c_01c"] = true, + ["xs_prop_arena_pipe_track_c_01d"] = true, + ["xs_prop_arena_pipe_track_s_01a"] = true, + ["xs_prop_arena_pipe_track_s_01b"] = true, + ["xs_prop_arena_pipe_transition_01a"] = true, + ["xs_prop_arena_pipe_transition_01b"] = true, + ["xs_prop_arena_pipe_transition_01c"] = true, + ["xs_prop_arena_pipe_transition_02a"] = true, + ["xs_prop_arena_pipe_transition_02b"] = true, + ["xs_prop_arena_pit_double_01a_sf"] = true, + ["xs_prop_arena_pit_double_01a_wl"] = true, + ["xs_prop_arena_pit_double_01b"] = true, + ["xs_prop_arena_pit_double_01b_sf"] = true, + ["xs_prop_arena_pit_double_01b_wl"] = true, + ["xs_prop_arena_pit_fire_01a"] = true, + ["xs_prop_arena_pit_fire_01a_sf"] = true, + ["xs_prop_arena_pit_fire_01a_wl"] = true, + ["xs_prop_arena_pit_fire_02a"] = true, + ["xs_prop_arena_pit_fire_02a_sf"] = true, + ["xs_prop_arena_pit_fire_02a_wl"] = true, + ["xs_prop_arena_pit_fire_03a"] = true, + ["xs_prop_arena_pit_fire_03a_sf"] = true, + ["xs_prop_arena_pit_fire_03a_wl"] = true, + ["xs_prop_arena_pit_fire_04a"] = true, + ["xs_prop_arena_pit_fire_04a_sf"] = true, + ["xs_prop_arena_pit_fire_04a_wl"] = true, + ["xs_prop_arena_planning_rt_01"] = true, + ["xs_prop_arena_podium_01a"] = true, + ["xs_prop_arena_podium_02a"] = true, + ["xs_prop_arena_podium_03a"] = true, + ["xs_prop_arena_pressure_plate_01a"] = true, + ["xs_prop_arena_pressure_plate_01a_sf"] = true, + ["xs_prop_arena_pressure_plate_01a_wl"] = true, + ["xs_prop_arena_roulette"] = true, + ["xs_prop_arena_screen_tv_01"] = true, + ["xs_prop_arena_showerdoor_s"] = true, + ["xs_prop_arena_spikes_01a"] = true, + ["xs_prop_arena_spikes_01a_sf"] = true, + ["xs_prop_arena_spikes_02a"] = true, + ["xs_prop_arena_spikes_02a_sf"] = true, + ["xs_prop_arena_startgate_01a"] = true, + ["xs_prop_arena_startgate_01a_sf"] = true, + ["xs_prop_arena_station_01a"] = true, + ["xs_prop_arena_station_02a"] = true, + ["xs_prop_arena_stickynote_01a"] = true, + ["xs_prop_arena_tablet_drone_01"] = true, + ["xs_prop_arena_telescope_01"] = true, + ["xs_prop_arena_torque_wrench_01a"] = true, + ["xs_prop_arena_tower_01a"] = true, + ["xs_prop_arena_tower_02a"] = true, + ["xs_prop_arena_tower_04a"] = true, + ["xs_prop_arena_trophy_double_01a"] = true, + ["xs_prop_arena_trophy_double_01b"] = true, + ["xs_prop_arena_trophy_double_01c"] = true, + ["xs_prop_arena_trophy_single_01a"] = true, + ["xs_prop_arena_trophy_single_01b"] = true, + ["xs_prop_arena_trophy_single_01c"] = true, + ["xs_prop_arena_turntable_01a"] = true, + ["xs_prop_arena_turntable_01a_sf"] = true, + ["xs_prop_arena_turntable_01a_wl"] = true, + ["xs_prop_arena_turntable_02a"] = true, + ["xs_prop_arena_turntable_02a_sf"] = true, + ["xs_prop_arena_turntable_02a_wl"] = true, + ["xs_prop_arena_turntable_03a"] = true, + ["xs_prop_arena_turntable_03a_sf"] = true, + ["xs_prop_arena_turntable_03a_wl"] = true, + ["xs_prop_arena_turntable_b_01a"] = true, + ["xs_prop_arena_turntable_b_01a_sf"] = true, + ["xs_prop_arena_turntable_b_01a_wl"] = true, + ["xs_prop_arena_turret_01a"] = true, + ["xs_prop_arena_turret_01a_sf"] = true, + ["xs_prop_arena_turret_01a_wl"] = true, + ["xs_prop_arena_turret_post_01a"] = true, + ["xs_prop_arena_turret_post_01a_sf"] = true, + ["xs_prop_arena_turret_post_01a_wl"] = true, + ["xs_prop_arena_turret_post_01b_wl"] = true, + ["xs_prop_arena_wall_01a"] = true, + ["xs_prop_arena_wall_01b"] = true, + ["xs_prop_arena_wall_01c"] = true, + ["xs_prop_arena_wall_02a"] = true, + ["xs_prop_arena_wall_02a_sf"] = true, + ["xs_prop_arena_wall_02a_wl"] = true, + ["xs_prop_arena_wall_02b_wl"] = true, + ["xs_prop_arena_wall_02c_wl"] = true, + ["xs_prop_arena_wall_rising_01a"] = true, + ["xs_prop_arena_wall_rising_01a_sf"] = true, + ["xs_prop_arena_wall_rising_01a_wl"] = true, + ["xs_prop_arena_wall_rising_02a"] = true, + ["xs_prop_arena_wall_rising_02a_sf"] = true, + ["xs_prop_arena_wall_rising_02a_wl"] = true, + ["xs_prop_arena_wedge_01a"] = true, + ["xs_prop_arena_wedge_01a_sf"] = true, + ["xs_prop_arena_wedge_01a_wl"] = true, + ["xs_prop_arena_whiteboard_eraser"] = true, + ["xs_prop_arenaped"] = true, + ["xs_prop_arrow_tyre_01a"] = true, + ["xs_prop_arrow_tyre_01a_sf"] = true, + ["xs_prop_arrow_tyre_01a_wl"] = true, + ["xs_prop_arrow_tyre_01b"] = true, + ["xs_prop_arrow_tyre_01b_sf"] = true, + ["xs_prop_arrow_tyre_01b_wl"] = true, + ["xs_prop_barrier_10m_01a"] = true, + ["xs_prop_barrier_15m_01a"] = true, + ["xs_prop_barrier_5m_01a"] = true, + ["xs_prop_beer_bottle_wl"] = true, + ["xs_prop_burger_meat_wl"] = true, + ["xs_prop_can_tunnel_wl"] = true, + ["xs_prop_can_wl"] = true, + ["xs_prop_chips_tube_wl"] = true, + ["xs_prop_chopstick_wl"] = true, + ["xs_prop_gate_tyre_01a_wl"] = true, + ["xs_prop_hamburgher_wl"] = true, + ["xs_prop_lplate_01a_wl"] = true, + ["xs_prop_lplate_bend_01a_wl"] = true, + ["xs_prop_lplate_wall_01a_wl"] = true, + ["xs_prop_lplate_wall_01b_wl"] = true, + ["xs_prop_lplate_wall_01c_wl"] = true, + ["xs_prop_nacho_wl"] = true, + ["xs_prop_plastic_bottle_wl"] = true, + ["xs_prop_scifi_01_lights_set"] = true, + ["xs_prop_scifi_02_lights_"] = true, + ["xs_prop_scifi_03_lights_set"] = true, + ["xs_prop_scifi_04_lights_set"] = true, + ["xs_prop_scifi_05_lights_set"] = true, + ["xs_prop_scifi_06_lights_set"] = true, + ["xs_prop_scifi_07_lights_set"] = true, + ["xs_prop_scifi_08_lights_set"] = true, + ["xs_prop_scifi_09_lights_set"] = true, + ["xs_prop_scifi_10_lights_set"] = true, + ["xs_prop_scifi_11_lights_set"] = true, + ["xs_prop_scifi_12_lights_set"] = true, + ["xs_prop_scifi_13_lights_set"] = true, + ["xs_prop_scifi_14_lights_set"] = true, + ["xs_prop_scifi_15_lights_set"] = true, + ["xs_prop_scifi_16_lights_set"] = true, + ["xs_prop_track_slowdown"] = true, + ["xs_prop_track_slowdown_t1"] = true, + ["xs_prop_track_slowdown_t2"] = true, + ["xs_prop_trinket_bag_01a"] = true, + ["xs_prop_trinket_cup_01a"] = true, + ["xs_prop_trinket_mug_01a"] = true, + ["xs_prop_trinket_republican_01a"] = true, + ["xs_prop_trinket_robot_01a"] = true, + ["xs_prop_trinket_skull_01a"] = true, + ["xs_prop_trophy_bandito_01a"] = true, + ["xs_prop_trophy_carfire_01a"] = true, + ["xs_prop_trophy_carstack_01a"] = true, + ["xs_prop_trophy_champ_01a"] = true, + ["xs_prop_trophy_cup_01a"] = true, + ["xs_prop_trophy_drone_01a"] = true, + ["xs_prop_trophy_firepit_01a"] = true, + ["xs_prop_trophy_flags_01a"] = true, + ["xs_prop_trophy_flipper_01a"] = true, + ["xs_prop_trophy_goldbag_01a"] = true, + ["xs_prop_trophy_imperator_01a"] = true, + ["xs_prop_trophy_mines_01a"] = true, + ["xs_prop_trophy_pegasus_01a"] = true, + ["xs_prop_trophy_presents_01a"] = true, + ["xs_prop_trophy_rc_01a"] = true, + ["xs_prop_trophy_shunt_01a"] = true, + ["xs_prop_trophy_spinner_01a"] = true, + ["xs_prop_trophy_telescope_01a"] = true, + ["xs_prop_trophy_tower_01a"] = true, + ["xs_prop_trophy_wrench_01a"] = true, + ["xs_prop_vipl_lights_ceiling_l_d"] = true, + ["xs_prop_vipl_lights_ceiling_l_e"] = true, + ["xs_prop_vipl_lights_floor"] = true, + ["xs_prop_wall_tyre_01a"] = true, + ["xs_prop_wall_tyre_end_01a"] = true, + ["xs_prop_wall_tyre_l_01a"] = true, + ["xs_prop_wall_tyre_start_01a"] = true, + ["xs_prop_waste_10_lightset"] = true, + ["xs_prop_wastel_01_lightset"] = true, + ["xs_prop_wastel_02_lightset"] = true, + ["xs_prop_wastel_03_lightset"] = true, + ["xs_prop_wastel_04_lightset"] = true, + ["xs_prop_wastel_05_lightset"] = true, + ["xs_prop_wastel_06_lightset"] = true, + ["xs_prop_wastel_07_lightset"] = true, + ["xs_prop_wastel_08_lightset"] = true, + ["xs_prop_wastel_09_lightset"] = true, + ["xs_prop_x18_axel_stand_01a"] = true, + ["xs_prop_x18_bench_grinder_01a"] = true, + ["xs_prop_x18_bench_vice_01a"] = true, + ["xs_prop_x18_car_jack_01a"] = true, + ["xs_prop_x18_carlift"] = true, + ["xs_prop_x18_drill_01a"] = true, + ["xs_prop_x18_engine_hoist_02a"] = true, + ["xs_prop_x18_flatbed_ramp"] = true, + ["xs_prop_x18_garagedoor01"] = true, + ["xs_prop_x18_garagedoor02"] = true, + ["xs_prop_x18_hangar_lamp_led_a"] = true, + ["xs_prop_x18_hangar_lamp_led_b"] = true, + ["xs_prop_x18_hangar_lamp_wall_a"] = true, + ["xs_prop_x18_hangar_lamp_wall_b"] = true, + ["xs_prop_x18_hangar_light_a"] = true, + ["xs_prop_x18_hangar_light_b"] = true, + ["xs_prop_x18_hangar_light_b_l1"] = true, + ["xs_prop_x18_hangar_light_c"] = true, + ["xs_prop_x18_impact_driver_01a"] = true, + ["xs_prop_x18_lathe_01a"] = true, + ["xs_prop_x18_prop_welder_01a"] = true, + ["xs_prop_x18_speeddrill_01c"] = true, + ["xs_prop_x18_strut_compressor_01a"] = true, + ["xs_prop_x18_tool_box_01a"] = true, + ["xs_prop_x18_tool_box_01b"] = true, + ["xs_prop_x18_tool_box_02a"] = true, + ["xs_prop_x18_tool_box_02b"] = true, + ["xs_prop_x18_tool_cabinet_01a"] = true, + ["xs_prop_x18_tool_cabinet_01b"] = true, + ["xs_prop_x18_tool_cabinet_01c"] = true, + ["xs_prop_x18_tool_chest_01a"] = true, + ["xs_prop_x18_tool_draw_01a"] = true, + ["xs_prop_x18_tool_draw_01b"] = true, + ["xs_prop_x18_tool_draw_01c"] = true, + ["xs_prop_x18_tool_draw_01d"] = true, + ["xs_prop_x18_tool_draw_01e"] = true, + ["xs_prop_x18_tool_draw_01x"] = true, + ["xs_prop_x18_tool_draw_drink"] = true, + ["xs_prop_x18_tool_draw_rc_cab"] = true, + ["xs_prop_x18_torque_wrench_01a"] = true, + ["xs_prop_x18_transmission_lift_01a"] = true, + ["xs_prop_x18_vip_greeenlight"] = true, + ["xs_prop_x18_wheel_balancer_01a"] = true, + ["xs_propint2_barrier_01"] = true, + ["xs_propint2_building_01"] = true, + ["xs_propint2_building_02"] = true, + ["xs_propint2_building_03"] = true, + ["xs_propint2_building_04"] = true, + ["xs_propint2_building_05"] = true, + ["xs_propint2_building_05b"] = true, + ["xs_propint2_building_06"] = true, + ["xs_propint2_building_07"] = true, + ["xs_propint2_building_08"] = true, + ["xs_propint2_building_base_01"] = true, + ["xs_propint2_building_base_02"] = true, + ["xs_propint2_building_base_03"] = true, + ["xs_propint2_centreline"] = true, + ["xs_propint2_hanging_01"] = true, + ["xs_propint2_path_cover_1"] = true, + ["xs_propint2_path_med_r"] = true, + ["xs_propint2_path_short_r"] = true, + ["xs_propint2_platform_01"] = true, + ["xs_propint2_platform_02"] = true, + ["xs_propint2_platform_03"] = true, + ["xs_propint2_platform_cover_1"] = true, + ["xs_propint2_ramp_large"] = true, + ["xs_propint2_ramp_large_2"] = true, + ["xs_propint2_set_scifi_01"] = true, + ["xs_propint2_set_scifi_01_ems"] = true, + ["xs_propint2_set_scifi_02"] = true, + ["xs_propint2_set_scifi_02_ems"] = true, + ["xs_propint2_set_scifi_03"] = true, + ["xs_propint2_set_scifi_03_ems"] = true, + ["xs_propint2_set_scifi_04"] = true, + ["xs_propint2_set_scifi_04_ems"] = true, + ["xs_propint2_set_scifi_05"] = true, + ["xs_propint2_set_scifi_05_ems"] = true, + ["xs_propint2_set_scifi_06"] = true, + ["xs_propint2_set_scifi_06_ems"] = true, + ["xs_propint2_set_scifi_07"] = true, + ["xs_propint2_set_scifi_07_ems"] = true, + ["xs_propint2_set_scifi_08"] = true, + ["xs_propint2_set_scifi_08_ems"] = true, + ["xs_propint2_set_scifi_09"] = true, + ["xs_propint2_set_scifi_09_ems"] = true, + ["xs_propint2_set_scifi_10"] = true, + ["xs_propint2_set_scifi_10_ems"] = true, + ["xs_propint2_stand_01"] = true, + ["xs_propint2_stand_01_ring"] = true, + ["xs_propint2_stand_02"] = true, + ["xs_propint2_stand_02_ring"] = true, + ["xs_propint2_stand_03"] = true, + ["xs_propint2_stand_03_ring"] = true, + ["xs_propint2_stand_thick_01"] = true, + ["xs_propint2_stand_thick_01_ring"] = true, + ["xs_propint2_stand_thin_01"] = true, + ["xs_propint2_stand_thin_01_ring"] = true, + ["xs_propint2_stand_thin_02"] = true, + ["xs_propint2_stand_thin_02_ring"] = true, + ["xs_propint2_stand_thin_03"] = true, + ["xs_propint3_set_waste_03_licencep"] = true, + ["xs_propint3_waste_01_bottles"] = true, + ["xs_propint3_waste_01_garbage_a"] = true, + ["xs_propint3_waste_01_garbage_b"] = true, + ["xs_propint3_waste_01_jumps"] = true, + ["xs_propint3_waste_01_neon"] = true, + ["xs_propint3_waste_01_plates"] = true, + ["xs_propint3_waste_01_rim"] = true, + ["xs_propint3_waste_01_statues"] = true, + ["xs_propint3_waste_01_trees"] = true, + ["xs_propint3_waste_02_garbage_a"] = true, + ["xs_propint3_waste_02_garbage_b"] = true, + ["xs_propint3_waste_02_garbage_c"] = true, + ["xs_propint3_waste_02_plates"] = true, + ["xs_propint3_waste_02_rims"] = true, + ["xs_propint3_waste_02_statues"] = true, + ["xs_propint3_waste_02_tires"] = true, + ["xs_propint3_waste_02_trees"] = true, + ["xs_propint3_waste_03_bikerim"] = true, + ["xs_propint3_waste_03_bluejump"] = true, + ["xs_propint3_waste_03_firering"] = true, + ["xs_propint3_waste_03_mascottes"] = true, + ["xs_propint3_waste_03_redjump"] = true, + ["xs_propint3_waste_03_siderim"] = true, + ["xs_propint3_waste_03_tirerim"] = true, + ["xs_propint3_waste_03_tires"] = true, + ["xs_propint3_waste_03_trees"] = true, + ["xs_propint3_waste_04_firering"] = true, + ["xs_propint3_waste_04_rims"] = true, + ["xs_propint3_waste_04_statues"] = true, + ["xs_propint3_waste_04_tires"] = true, + ["xs_propint3_waste_04_trees"] = true, + ["xs_propint3_waste_05_goals"] = true, + ["xs_propint3_waste_05_tires"] = true, + ["xs_propint3_waste04_wall"] = true, + ["xs_propint4_waste_06_burgers"] = true, + ["xs_propint4_waste_06_garbage"] = true, + ["xs_propint4_waste_06_neon"] = true, + ["xs_propint4_waste_06_plates"] = true, + ["xs_propint4_waste_06_rim"] = true, + ["xs_propint4_waste_06_statue"] = true, + ["xs_propint4_waste_06_tire"] = true, + ["xs_propint4_waste_06_trees"] = true, + ["xs_propint4_waste_07_licence"] = true, + ["xs_propint4_waste_07_neon"] = true, + ["xs_propint4_waste_07_props"] = true, + ["xs_propint4_waste_07_props02"] = true, + ["xs_propint4_waste_07_rims"] = true, + ["xs_propint4_waste_07_statue_team"] = true, + ["xs_propint4_waste_07_tires"] = true, + ["xs_propint4_waste_07_trees"] = true, + ["xs_propint4_waste_08_garbage"] = true, + ["xs_propint4_waste_08_plates"] = true, + ["xs_propint4_waste_08_rim"] = true, + ["xs_propint4_waste_08_statue"] = true, + ["xs_propint4_waste_08_trees"] = true, + ["xs_propint4_waste_09_bikerim"] = true, + ["xs_propint4_waste_09_cans"] = true, + ["xs_propint4_waste_09_intube"] = true, + ["xs_propint4_waste_09_lollywall"] = true, + ["xs_propint4_waste_09_loops"] = true, + ["xs_propint4_waste_09_rim"] = true, + ["xs_propint4_waste_09_tire"] = true, + ["xs_propint4_waste_09_trees"] = true, + ["xs_propint4_waste_10_garbage"] = true, + ["xs_propint4_waste_10_plates"] = true, + ["xs_propint4_waste_10_statues"] = true, + ["xs_propint4_waste_10_tires"] = true, + ["xs_propint4_waste_10_trees"] = true, + ["xs_propint5_waste_01_ground"] = true, + ["xs_propint5_waste_01_ground_d"] = true, + ["xs_propint5_waste_02_ground"] = true, + ["xs_propint5_waste_02_ground_d"] = true, + ["xs_propint5_waste_03_ground"] = true, + ["xs_propint5_waste_03_ground_d"] = true, + ["xs_propint5_waste_04_ground"] = true, + ["xs_propint5_waste_04_ground_d"] = true, + ["xs_propint5_waste_05_ground"] = true, + ["xs_propint5_waste_05_ground_d"] = true, + ["xs_propint5_waste_05_ground_line"] = true, + ["xs_propint5_waste_06_ground"] = true, + ["xs_propint5_waste_06_ground_d"] = true, + ["xs_propint5_waste_07_ground"] = true, + ["xs_propint5_waste_07_ground_d"] = true, + ["xs_propint5_waste_08_ground"] = true, + ["xs_propint5_waste_08_ground_d"] = true, + ["xs_propint5_waste_09_ground"] = true, + ["xs_propint5_waste_09_ground_cut"] = true, + ["xs_propint5_waste_09_ground_d"] = true, + ["xs_propint5_waste_10_ground"] = true, + ["xs_propint5_waste_10_ground_d"] = true, + ["xs_propint5_waste_border"] = true, + ["xs_propintarena_bulldozer"] = true, + ["xs_propintarena_edge_wrap_01a"] = true, + ["xs_propintarena_edge_wrap_01b"] = true, + ["xs_propintarena_edge_wrap_01c"] = true, + ["xs_propintarena_lamps_01a"] = true, + ["xs_propintarena_lamps_01b"] = true, + ["xs_propintarena_lamps_01c"] = true, + ["xs_propintarena_pit_high"] = true, + ["xs_propintarena_pit_low"] = true, + ["xs_propintarena_pit_mid"] = true, + ["xs_propintarena_speakers_01a"] = true, + ["xs_propintarena_structure_c_01a"] = true, + ["xs_propintarena_structure_c_01ald"] = true, + ["xs_propintarena_structure_c_01b"] = true, + ["xs_propintarena_structure_c_01bld"] = true, + ["xs_propintarena_structure_c_01c"] = true, + ["xs_propintarena_structure_c_02a"] = true, + ["xs_propintarena_structure_c_02ald"] = true, + ["xs_propintarena_structure_c_02b"] = true, + ["xs_propintarena_structure_c_02c"] = true, + ["xs_propintarena_structure_c_03a"] = true, + ["xs_propintarena_structure_c_04a"] = true, + ["xs_propintarena_structure_c_04b"] = true, + ["xs_propintarena_structure_c_04c"] = true, + ["xs_propintarena_structure_f_01a"] = true, + ["xs_propintarena_structure_f_02a"] = true, + ["xs_propintarena_structure_f_02b"] = true, + ["xs_propintarena_structure_f_02c"] = true, + ["xs_propintarena_structure_f_02d"] = true, + ["xs_propintarena_structure_f_02e"] = true, + ["xs_propintarena_structure_f_03a"] = true, + ["xs_propintarena_structure_f_03b"] = true, + ["xs_propintarena_structure_f_03c"] = true, + ["xs_propintarena_structure_f_03d"] = true, + ["xs_propintarena_structure_f_03e"] = true, + ["xs_propintarena_structure_f_04a"] = true, + ["xs_propintarena_structure_guide"] = true, + ["xs_propintarena_structure_l_01a"] = true, + ["xs_propintarena_structure_l_02a"] = true, + ["xs_propintarena_structure_l_03a"] = true, + ["xs_propintarena_structure_s_01a"] = true, + ["xs_propintarena_structure_s_01ald"] = true, + ["xs_propintarena_structure_s_01amc"] = true, + ["xs_propintarena_structure_s_02a"] = true, + ["xs_propintarena_structure_s_02ald"] = true, + ["xs_propintarena_structure_s_02b"] = true, + ["xs_propintarena_structure_s_03a"] = true, + ["xs_propintarena_structure_s_03ald"] = true, + ["xs_propintarena_structure_s_04a"] = true, + ["xs_propintarena_structure_s_04ald"] = true, + ["xs_propintarena_structure_s_05a"] = true, + ["xs_propintarena_structure_s_05ald"] = true, + ["xs_propintarena_structure_s_05b"] = true, + ["xs_propintarena_structure_s_06a"] = true, + ["xs_propintarena_structure_s_06b"] = true, + ["xs_propintarena_structure_s_06c"] = true, + ["xs_propintarena_structure_s_07a"] = true, + ["xs_propintarena_structure_s_07ald"] = true, + ["xs_propintarena_structure_s_07b"] = true, + ["xs_propintarena_structure_s_08a"] = true, + ["xs_propintarena_structure_t_01a"] = true, + ["xs_propintarena_structure_t_01b"] = true, + ["xs_propintarena_tiptruck"] = true, + ["xs_propintarena_wall_no_pit"] = true, + ["xs_propintxmas_clubdance_2018"] = true, + ["xs_propintxmas_cluboffice_2018"] = true, + ["xs_propintxmas_terror_2018"] = true, + ["xs_propintxmas_tree_2018"] = true, + ["xs_propintxmas_vip_decs"] = true, + ["xs_terrain_dyst_ground_04"] = true, + ["xs_terrain_dyst_ground_07"] = true, + ["xs_terrain_dyst_rocks_04"] = true, + ["xs_terrain_dystopian_03"] = true, + ["xs_terrain_dystopian_08"] = true, + ["xs_terrain_dystopian_12"] = true, + ["xs_terrain_dystopian_17"] = true, + ["xs_terrain_plant_arena_01_01"] = true, + ["xs_terrain_plant_arena_01_02"] = true, + ["xs_terrain_prop_weeddry_nxg01"] = true, + ["xs_terrain_prop_weeddry_nxg02"] = true, + ["xs_terrain_prop_weeddry_nxg02b"] = true, + ["xs_terrain_prop_weeddry_nxg03"] = true, + ["xs_terrain_prop_weeddry_nxg04"] = true, + ["xs_terrain_rock_arena_1_01"] = true, + ["xs_terrain_rockline_arena_1_01"] = true, + ["xs_terrain_rockline_arena_1_02"] = true, + ["xs_terrain_rockline_arena_1_03"] = true, + ["xs_terrain_rockline_arena_1_04"] = true, + ["xs_terrain_rockline_arena_1_05"] = true, + ["xs_terrain_rockline_arena_1_06"] = true, + ["xs_terrain_rockpile_1_01_small"] = true, + ["xs_terrain_rockpile_1_02_small"] = true, + ["xs_terrain_rockpile_1_03_small"] = true, + ["xs_terrain_rockpile_arena_1_01"] = true, + ["xs_terrain_rockpile_arena_1_02"] = true, + ["xs_terrain_rockpile_arena_1_03"] = true, + ["xs_terrain_set_dyst_01_grnd"] = true, + ["xs_terrain_set_dyst_02_detail"] = true, + ["xs_terrain_set_dystopian_02"] = true, + ["xs_terrain_set_dystopian_05"] = true, + ["xs_terrain_set_dystopian_05_line"] = true, + ["xs_terrain_set_dystopian_06"] = true, + ["xs_terrain_set_dystopian_09"] = true, + ["xs_terrain_set_dystopian_10"] = true, + ["xs_wasteland_pitstop"] = true, + ["xs_wasteland_pitstop_aniem"] = true, + ["xs_x18intvip_vip_light_dummy"] = true, + ["xs3_prop_int_xmas_tree_01"] = true, + ["zprop_bin_01a_old"] = true, +} \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/fxmanifest.lua b/resources/[ps]/ps-objectspawner/fxmanifest.lua new file mode 100644 index 0000000..bf80e9a --- /dev/null +++ b/resources/[ps]/ps-objectspawner/fxmanifest.lua @@ -0,0 +1,20 @@ +fx_version 'cerulean' +game 'gta5' + +author 'Project Sloth team' +description 'Object Spawner' +version '0.0.1' + +lua54 'yes' + +client_scripts { "client/*.lua" } +server_scripts { + '@oxmysql/lib/MySQL.lua', + "server/*.lua", +} + +ui_page "html/index.html" + +files({ + "html/*", +}) \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/html/index.css b/resources/[ps]/ps-objectspawner/html/index.css new file mode 100644 index 0000000..48474d9 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/html/index.css @@ -0,0 +1 @@ +*{margin:0;padding:0}:root{--ps-primary: #00ffbf;--ps-primary-hover: #1b7c6d;--ps-secondary: #444444;--ps-bg: #292929}html,body{height:100%;width:100%}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-thumb{border-radius:2px;background-color:#3c3c3c}input[type=number].svelte-uz7u3m::-webkit-inner-spin-button,input[type=number].svelte-uz7u3m::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.item.svelte-p6s7xt{cursor:default;height:var(--height, 42px);line-height:var(--height, 42px);padding:var(--itemPadding, 0 20px);color:var(--itemColor, inherit);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.groupHeader.svelte-p6s7xt{text-transform:var(--groupTitleTextTransform, uppercase)}.groupItem.svelte-p6s7xt{padding-left:var(--groupItemPaddingLeft, 40px)}.item.svelte-p6s7xt:active{background:var(--itemActiveBackground, #b9daff)}.item.active.svelte-p6s7xt{background:var(--itemIsActiveBG, #007aff);color:var(--itemIsActiveColor, #fff)}.item.notSelectable.svelte-p6s7xt{color:var(--itemIsNotSelectableColor, #999)}.item.first.svelte-p6s7xt{border-radius:var(--itemFirstBorderRadius, 4px 4px 0 0)}.item.hover.svelte-p6s7xt:not(.active){background:var(--itemHoverBG, #e7f2ff);color:var(--itemHoverColor, inherit)}.listContainer.svelte-1c5cwwd{box-shadow:var(--listShadow, 0 2px 3px 0 rgba(44, 62, 80, .24));border-radius:var(--listBorderRadius, 4px);max-height:var(--listMaxHeight, 250px);overflow-y:auto;background:var(--listBackground, #fff);border:var(--listBorder, none);position:var(--listPosition, absolute);z-index:var(--listZIndex, 2);width:100%;left:var(--listLeft, 0);right:var(--listRight, 0)}.virtualList.svelte-1c5cwwd{height:var(--virtualListHeight, 200px)}.listGroupTitle.svelte-1c5cwwd{color:var(--groupTitleColor, #8f8f8f);cursor:default;font-size:var(--groupTitleFontSize, 12px);font-weight:var(--groupTitleFontWeight, 600);height:var(--height, 42px);line-height:var(--height, 42px);padding:var(--groupTitlePadding, 0 20px);text-overflow:ellipsis;overflow-x:hidden;white-space:nowrap;text-transform:var(--groupTitleTextTransform, uppercase)}.empty.svelte-1c5cwwd{text-align:var(--listEmptyTextAlign, center);padding:var(--listEmptyPadding, 20px 0);color:var(--listEmptyColor, #78848f)}.selection.svelte-1plzgc3{text-overflow:ellipsis;overflow-x:hidden;white-space:nowrap}.multiSelectItem.svelte-7b9r5m.svelte-7b9r5m{background:var(--multiItemBG, #ebedef);margin:var(--multiItemMargin, 5px 5px 0 0);border-radius:var(--multiItemBorderRadius, 16px);height:var(--multiItemHeight, 32px);line-height:var(--multiItemHeight, 32px);display:flex;cursor:default;padding:var(--multiItemPadding, 0 10px 0 15px);max-width:100%}.multiSelectItem_label.svelte-7b9r5m.svelte-7b9r5m{margin:var(--multiLabelMargin, 0 5px 0 0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multiSelectItem.svelte-7b9r5m.svelte-7b9r5m:hover,.multiSelectItem.active.svelte-7b9r5m.svelte-7b9r5m{background-color:var(--multiItemActiveBG, #006fff);color:var(--multiItemActiveColor, #fff)}.multiSelectItem.disabled.svelte-7b9r5m.svelte-7b9r5m:hover{background:var(--multiItemDisabledHoverBg, #ebedef);color:var(--multiItemDisabledHoverColor, #c1c6cc)}.multiSelectItem_clear.svelte-7b9r5m.svelte-7b9r5m{border-radius:var(--multiClearRadius, 50%);background:var(--multiClearBG, #52616f);min-width:var(--multiClearWidth, 16px);max-width:var(--multiClearWidth, 16px);height:var(--multiClearHeight, 16px);position:relative;top:var(--multiClearTop, 8px);text-align:var(--multiClearTextAlign, center);padding:var(--multiClearPadding, 1px)}.multiSelectItem_clear.svelte-7b9r5m.svelte-7b9r5m:hover,.active.svelte-7b9r5m .multiSelectItem_clear.svelte-7b9r5m{background:var(--multiClearHoverBG, #fff)}.multiSelectItem_clear.svelte-7b9r5m:hover svg.svelte-7b9r5m,.active.svelte-7b9r5m .multiSelectItem_clear svg.svelte-7b9r5m{fill:var(--multiClearHoverFill, #006fff)}.multiSelectItem_clear.svelte-7b9r5m svg.svelte-7b9r5m{fill:var(--multiClearFill, #ebedef);vertical-align:top}svelte-virtual-list-viewport.svelte-1drb4jk{position:relative;overflow-y:auto;-webkit-overflow-scrolling:touch;display:block}svelte-virtual-list-contents.svelte-1drb4jk,svelte-virtual-list-row.svelte-1drb4jk{display:block}svelte-virtual-list-row.svelte-1drb4jk{overflow:hidden}.selectContainer.svelte-o7a0bj.svelte-o7a0bj{--internalPadding:0 16px;border:var(--border, 1px solid #d8dbdf);border-radius:var(--borderRadius, 3px);box-sizing:border-box;height:var(--height, 42px);position:relative;display:flex;align-items:center;padding:var(--padding, var(--internalPadding));background:var(--background, #fff);margin:var(--margin, 0)}.selectContainer.svelte-o7a0bj input.svelte-o7a0bj{cursor:default;border:none;color:var(--inputColor, #3f4f5f);height:var(--height, 42px);line-height:var(--height, 42px);padding:var(--inputPadding, var(--padding, var(--internalPadding)));width:100%;background:transparent;font-size:var(--inputFontSize, 14px);letter-spacing:var(--inputLetterSpacing, -.08px);position:absolute;left:var(--inputLeft, 0);margin:var(--inputMargin, 0)}.selectContainer.svelte-o7a0bj input.svelte-o7a0bj::placeholder{color:var(--placeholderColor, #78848f);opacity:var(--placeholderOpacity, 1)}.selectContainer.svelte-o7a0bj input.svelte-o7a0bj:focus{outline:none}.selectContainer.svelte-o7a0bj.svelte-o7a0bj:hover{border-color:var(--borderHoverColor, #b2b8bf)}.selectContainer.focused.svelte-o7a0bj.svelte-o7a0bj{border-color:var(--borderFocusColor, #006fe8)}.selectContainer.disabled.svelte-o7a0bj.svelte-o7a0bj{background:var(--disabledBackground, #ebedef);border-color:var(--disabledBorderColor, #ebedef);color:var(--disabledColor, #c1c6cc)}.selectContainer.disabled.svelte-o7a0bj input.svelte-o7a0bj::placeholder{color:var(--disabledPlaceholderColor, #c1c6cc);opacity:var(--disabledPlaceholderOpacity, 1)}.selectedItem.svelte-o7a0bj.svelte-o7a0bj{line-height:var(--height, 42px);height:var(--height, 42px);overflow-x:hidden;padding:var(--selectedItemPadding, 0 20px 0 0)}.selectedItem.svelte-o7a0bj.svelte-o7a0bj:focus{outline:none}.clearSelect.svelte-o7a0bj.svelte-o7a0bj{position:absolute;right:var(--clearSelectRight, 10px);top:var(--clearSelectTop, 11px);bottom:var(--clearSelectBottom, 11px);width:var(--clearSelectWidth, 20px);color:var(--clearSelectColor, #c5cacf);flex:none!important}.clearSelect.svelte-o7a0bj.svelte-o7a0bj:hover{color:var(--clearSelectHoverColor, #2c3e50)}.selectContainer.focused.svelte-o7a0bj .clearSelect.svelte-o7a0bj{color:var(--clearSelectFocusColor, #3f4f5f)}.indicator.svelte-o7a0bj.svelte-o7a0bj{position:absolute;right:var(--indicatorRight, 10px);top:var(--indicatorTop, 11px);width:var(--indicatorWidth, 20px);height:var(--indicatorHeight, 20px);color:var(--indicatorColor, #c5cacf)}.indicator.svelte-o7a0bj svg.svelte-o7a0bj{display:inline-block;fill:var(--indicatorFill, currentcolor);line-height:1;stroke:var(--indicatorStroke, currentcolor);stroke-width:0}.spinner.svelte-o7a0bj.svelte-o7a0bj{position:absolute;right:var(--spinnerRight, 10px);top:var(--spinnerLeft, 11px);width:var(--spinnerWidth, 20px);height:var(--spinnerHeight, 20px);color:var(--spinnerColor, #51ce6c);animation:svelte-o7a0bj-rotate .75s linear infinite}.spinner_icon.svelte-o7a0bj.svelte-o7a0bj{display:block;height:100%;transform-origin:center center;width:100%;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;-webkit-transform:none}.spinner_path.svelte-o7a0bj.svelte-o7a0bj{stroke-dasharray:90;stroke-linecap:round}.multiSelect.svelte-o7a0bj.svelte-o7a0bj{display:flex;padding:var(--multiSelectPadding, 0 35px 0 16px);height:auto;flex-wrap:wrap;align-items:stretch}.multiSelect.svelte-o7a0bj>.svelte-o7a0bj{flex:1 1 50px}.selectContainer.multiSelect.svelte-o7a0bj input.svelte-o7a0bj{padding:var(--multiSelectInputPadding, 0);position:relative;margin:var(--multiSelectInputMargin, 0)}.hasError.svelte-o7a0bj.svelte-o7a0bj{border:var(--errorBorder, 1px solid #ff2d55);background:var(--errorBackground, #fff)}.a11yText.svelte-o7a0bj.svelte-o7a0bj{z-index:9999;border:0px;clip:rect(1px,1px,1px,1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0;white-space:nowrap}@keyframes svelte-o7a0bj-rotate{to{transform:rotate(360deg)}}.themed.svelte-yby23k{--background: #292929;--listBackground: #292929;--itemIsActiveBG: var(--ps-primary);--itemIsActiveColor: black;--itemHoverBG: var(--ps-primary-hover);--border: #171717;--placeholderColor: #ffffff;--inputColor: #ffffff;--inputFontSize: 1rem;--clearSelectFocusColor: var(--ps-primary);--clearSelectColor: var(--ps-primary);--clearSelectHoverColor: var(--ps-primary);--listEmptyColor: #ffffff}.selectContainer>*{cursor:pointer!important}.listItem>*{cursor:pointer!important}.listContainer{z-index:3!important}.chrome-input.svelte-10bqplu{-webkit-appearance:none;outline:none}.active.svelte-3cetiw{color:#000;background-color:var(--ps-primary)!important}.hover.svelte-3cetiw:hover{background-color:var(--ps-primary-hover)}.drag-bar.svelte-u84uy3.svelte-u84uy3{user-select:none;cursor:grab}.drag-bar.svelte-u84uy3.svelte-u84uy3:active{cursor:grabbing}.drag-bar.svelte-u84uy3 svg.svelte-u84uy3{opacity:.2;transition:opacity .2s}.drag-bar.svelte-u84uy3:hover svg.svelte-u84uy3{opacity:1}*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}*{--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgba(59, 130, 246, .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}::moz-focus-inner{border-style:none;padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}body{margin:0;font-family:inherit;line-height:inherit}button,input{font-family:inherit;font-size:100%;line-height:1.15;margin:0;padding:0;line-height:inherit;color:inherit}button{text-transform:none;background-color:transparent;background-image:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button,[role=button]{cursor:pointer}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}input::placeholder{opacity:1;color:#9ca3af}input::webkit-input-placeholder{opacity:1;color:#9ca3af}input::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder{opacity:1;color:#9ca3af}input::-ms-input-placeholder{opacity:1;color:#9ca3af}p{margin:0}svg{display:block;vertical-align:middle}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-dark-300{--tw-bg-opacity: 1;background-color:rgba(45,45,45,var(--tw-bg-opacity))}.bg-dark-100{--tw-bg-opacity: 1;background-color:rgba(60,60,60,var(--tw-bg-opacity))}.bg-dark-700{--tw-bg-opacity: 1;background-color:rgba(27,27,27,var(--tw-bg-opacity))}.bg-\[var\(--ps-primary\)\]{background-color:var(--ps-primary)}.hover\:bg-\[var\(--ps-primary-hover\)\]:hover{background-color:var(--ps-primary-hover)}.bg-\[\#292929\]{--tw-bg-opacity: 1;background-color:rgba(41,41,41,var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.hover\:bg-green-600:hover{--tw-bg-opacity: 1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.dark .dark\:bg-gray-700{--tw-bg-opacity: 1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.bg-\[var\(--ps-bg\)\]{background-color:var(--ps-bg)}.bg-dark-200{--tw-bg-opacity: 1;background-color:rgba(50,50,50,var(--tw-bg-opacity))}.border-gray-600{--tw-border-opacity: 1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.focus\:border-gray-400:focus{--tw-border-opacity: 1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\!border-\[var\(--ps-primary\)\]{border-color:var(--ps-primary)!important}.hover\:border-\[var\(--ps-primary-hover\)\]:hover,.border-\[var\(--ps-primary-hover\)\]{border-color:var(--ps-primary-hover)}.border-gray-300{--tw-border-opacity: 1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.dark .dark\:border-gray-600{--tw-border-opacity: 1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.dark .dark\:focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.rounded-lg{border-radius:.5rem}.rounded{border-radius:.25rem}.rounded-sm{border-radius:.125rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border,.border-1{border-width:1px}.focus\:border-1:focus{border-width:1px}.border-r{border-right-width:1px}.border-l{border-left-width:1px}.border-b-3,.hover\:border-b-3:hover{border-bottom-width:3px}.cursor-pointer{cursor:pointer}.block{display:block}.flex{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.grid{display:-ms-grid;display:grid}.flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.items-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-5{height:1.25rem}.h-10{height:2.5rem}.h-full{height:100%}.h-\[550px\]{height:550px}.h-82{height:20.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-base{font-size:1rem;line-height:1.5rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.my-auto{margin-top:auto;margin-bottom:auto}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-25{margin-left:6.25rem;margin-right:6.25rem}.-mt-3{margin-top:-.75rem}.mb-2{margin-bottom:.5rem}.mb-5{margin-bottom:1.25rem}.mt-\[10\%\]{margin-top:10%}.mt-4{margin-top:1rem}.ml-5{margin-left:1.25rem}.mr-5{margin-right:1.25rem}.min-h-screen{min-height:100vh}.min-h-94{min-height:23.5rem}.min-w-100{min-width:25rem}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.overflow-y-auto{overflow-y:auto}.p-5{padding:1.25rem}.p-2{padding:.5rem}.p-1{padding:.25rem}.p-\[0\.35rem\]{padding:.35rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.pb-1{padding-bottom:.25rem}.pl-3{padding-left:.75rem}.dark .dark\:placeholder-gray-400::-webkit-input-placeholder{--tw-placeholder-opacity: 1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.dark .dark\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.dark .dark\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity: 1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.dark .dark\:placeholder-gray-400::-ms-input-placeholder{--tw-placeholder-opacity: 1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.dark .dark\:placeholder-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.placeholder-white::-webkit-input-placeholder{--tw-placeholder-opacity: 1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity: 1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white::-ms-input-placeholder{--tw-placeholder-opacity: 1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white::placeholder{--tw-placeholder-opacity: 1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.tab\.name,.tab,.tab\.content{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.relative{position:relative}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0/.1),0 8px 10px -6px rgb(0 0 0/.1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);-webkit-box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:ring-3:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);-webkit-box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);-webkit-box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[\#2bbca6\]:focus{--tw-ring-opacity: 1;--tw-ring-color: rgba(43, 188, 166, var(--tw-ring-opacity))}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgba(59, 130, 246, var(--tw-ring-opacity))}.dark .dark\:focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgba(59, 130, 246, var(--tw-ring-opacity))}.focus\:ring-\[var\(--ps-primary\)\]:focus{--tw-ring-color: var(--ps-primary)}.ring-blue-200{--tw-ring-opacity: 1;--tw-ring-color: rgba(191, 219, 254, var(--tw-ring-opacity))}.text-center{text-align:center}.text-white{--tw-text-opacity: 1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-black{--tw-text-opacity: 1;color:rgba(0,0,0,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgba(17,24,39,var(--tw-text-opacity))}.dark .dark\:text-white{--tw-text-opacity: 1;color:rgba(255,255,255,var(--tw-text-opacity))}.truncate{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}.uppercase{text-transform:uppercase}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.w-20{width:5rem}.w-full{width:100%}.w-\[820px\]{width:820px}.w-30{width:7.5rem}.w-15{width:3.75rem}.w-25{width:6.25rem}.w-35{width:8.75rem}.gap-2{grid-gap:.5rem;gap:.5rem}.gap-5{grid-gap:1.25rem;gap:1.25rem}.gap-1{grid-gap:.25rem;gap:.25rem}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))} diff --git a/resources/[ps]/ps-objectspawner/html/index.html b/resources/[ps]/ps-objectspawner/html/index.html new file mode 100644 index 0000000..28fba34 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/html/index.html @@ -0,0 +1,16 @@ + + + + + + + Svelte Template + + + + + +
        + + + \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/html/index.js b/resources/[ps]/ps-objectspawner/html/index.js new file mode 100644 index 0000000..3f9a95a --- /dev/null +++ b/resources/[ps]/ps-objectspawner/html/index.js @@ -0,0 +1,11 @@ +var Ei=Object.defineProperty;var Qt=Object.getOwnPropertySymbols;var Fi=Object.prototype.hasOwnProperty,Vi=Object.prototype.propertyIsEnumerable;var Zt=(n,e,t)=>e in n?Ei(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,Mt=(n,e)=>{for(var t in e||(e={}))Fi.call(e,t)&&Zt(n,t,e[t]);if(Qt)for(var t of Qt(e))Vi.call(e,t)&&Zt(n,t,e[t]);return n};const Ni=function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))i(l);new MutationObserver(l=>{for(const s of l)if(s.type==="childList")for(const r of s.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&i(r)}).observe(document,{childList:!0,subtree:!0});function t(l){const s={};return l.integrity&&(s.integrity=l.integrity),l.referrerpolicy&&(s.referrerPolicy=l.referrerpolicy),l.crossorigin==="use-credentials"?s.credentials="include":l.crossorigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function i(l){if(l.ep)return;l.ep=!0;const s=t(l);fetch(l.href,s)}};Ni();function Y(){}const Kn=n=>n;function _t(n,e){for(const t in e)n[t]=e[t];return n}function Yn(n){return n()}function xt(){return Object.create(null)}function ke(n){n.forEach(Yn)}function gt(n){return typeof n=="function"}function ce(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}function Di(n){return Object.keys(n).length===0}function Bi(n,...e){if(n==null)return Y;const t=n.subscribe(...e);return t.unsubscribe?()=>t.unsubscribe():t}function ut(n,e,t){n.$$.on_destroy.push(Bi(e,t))}function Pi(n,e,t,i){if(n){const l=Xn(n,e,t,i);return n[0](l)}}function Xn(n,e,t,i){return n[1]&&i?_t(t.ctx.slice(),n[1](i(e))):t.ctx}function Gi(n,e,t,i){if(n[2]&&i){const l=n[2](i(t));if(e.dirty===void 0)return l;if(typeof l=="object"){const s=[],r=Math.max(e.dirty.length,l.length);for(let o=0;o32){const e=[],t=n.ctx.length/32;for(let i=0;iwindow.performance.now():()=>Date.now(),Pt=Qn?n=>requestAnimationFrame(n):Y;const Ue=new Set;function Zn(n){Ue.forEach(e=>{e.c(n)||(Ue.delete(e),e.f())}),Ue.size!==0&&Pt(Zn)}function Ji(n){let e;return Ue.size===0&&Pt(Zn),{promise:new Promise(t=>{Ue.add(e={c:n,f:t})}),abort(){Ue.delete(e)}}}function I(n,e){n.appendChild(e)}function xn(n){if(!n)return document;const e=n.getRootNode?n.getRootNode():n.ownerDocument;return e&&e.host?e:n.ownerDocument}function Ki(n){const e=T("style");return Yi(xn(n),e),e.sheet}function Yi(n,e){I(n.head||n,e)}function G(n,e,t){n.insertBefore(e,t||null)}function N(n){n.parentNode.removeChild(n)}function Ze(n,e){for(let t=0;tn.removeEventListener(e,t,i)}function Xi(n){return function(e){return e.preventDefault(),n.call(this,e)}}function y(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function $t(n,e){const t=Object.getOwnPropertyDescriptors(n.__proto__);for(const i in e)e[i]==null?n.removeAttribute(i):i==="style"?n.style.cssText=e[i]:i==="__value"?n.value=n[i]=e[i]:t[i]&&t[i].set?n[i]=e[i]:y(n,i,e[i])}function Et(n,e,t){e in n?n[e]=typeof n[e]=="boolean"&&t===""?!0:t:y(n,e,t)}function $n(n){return n===""?null:+n}function Qi(n){return Array.from(n.childNodes)}function Ce(n,e){e=""+e,n.wholeText!==e&&(n.data=e)}function qe(n,e){n.value=e==null?"":e}function Re(n,e,t,i){t===null?n.style.removeProperty(e):n.style.setProperty(e,t,i?"important":"")}let tt;function Zi(){if(tt===void 0){tt=!1;try{typeof window!="undefined"&&window.parent&&window.parent.document}catch{tt=!0}}return tt}function xi(n,e){getComputedStyle(n).position==="static"&&(n.style.position="relative");const i=T("iframe");i.setAttribute("style","display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;"),i.setAttribute("aria-hidden","true"),i.tabIndex=-1;const l=Zi();let s;return l?(i.src="data:text/html, + + diff --git a/resources/[ps]/ps-objectspawner/svelte-source/package.json b/resources/[ps]/ps-objectspawner/svelte-source/package.json new file mode 100644 index 0000000..0934432 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/package.json @@ -0,0 +1,28 @@ +{ + "name": "svelte-source", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --host", + "build": "vite build", + "preview": "vite preview --host", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.44", + "@tsconfig/svelte": "^2.0.1", + "html-minifier": "^4.0.0", + "svelte": "^3.48.0", + "svelte-check": "^2.7.1", + "svelte-preprocess": "^4.10.6", + "tslib": "^2.4.0", + "typescript": "^4.6.4", + "vite": "^2.9.9", + "vite-plugin-windicss": "^1.8.4", + "windicss": "^3.5.4" + }, + "dependencies": { + "svelte-select": "^4.4.7" + } +} diff --git a/resources/[ps]/ps-objectspawner/svelte-source/pnpm-lock.yaml b/resources/[ps]/ps-objectspawner/svelte-source/pnpm-lock.yaml new file mode 100644 index 0000000..b35a199 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/pnpm-lock.yaml @@ -0,0 +1,1017 @@ +lockfileVersion: 5.4 + +specifiers: + '@sveltejs/vite-plugin-svelte': ^1.0.0-next.44 + '@tsconfig/svelte': ^2.0.1 + html-minifier: ^4.0.0 + svelte: ^3.48.0 + svelte-check: ^2.7.1 + svelte-preprocess: ^4.10.6 + svelte-select: ^4.4.7 + tslib: ^2.4.0 + typescript: ^4.6.4 + vite: ^2.9.9 + vite-plugin-windicss: ^1.8.4 + windicss: ^3.5.4 + +dependencies: + svelte-select: 4.4.7 + +devDependencies: + '@sveltejs/vite-plugin-svelte': 1.0.0-next.44_svelte@3.48.0+vite@2.9.9 + '@tsconfig/svelte': 2.0.1 + html-minifier: 4.0.0 + svelte: 3.48.0 + svelte-check: 2.7.1_svelte@3.48.0 + svelte-preprocess: 4.10.6_wwvk7nlptlrqo2czohjtk6eiqm + tslib: 2.4.0 + typescript: 4.6.4 + vite: 2.9.9 + vite-plugin-windicss: 1.8.4_vite@2.9.9 + windicss: 3.5.4 + +packages: + + /@antfu/utils/0.5.2: + resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} + dev: true + + /@jridgewell/resolve-uri/3.0.7: + resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.13: + resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} + dev: true + + /@jridgewell/trace-mapping/0.3.13: + resolution: {integrity: sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==} + dependencies: + '@jridgewell/resolve-uri': 3.0.7 + '@jridgewell/sourcemap-codec': 1.4.13 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@rollup/pluginutils/4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@sveltejs/vite-plugin-svelte/1.0.0-next.44_svelte@3.48.0+vite@2.9.9: + resolution: {integrity: sha512-n+sssEWbzykPS447FmnNyU5GxEhrBPDVd0lxNZnxRGz9P6651LjjwAnISKr3CKgT9v8IybP8VD0n2i5XzbqExg==} + engines: {node: ^14.13.1 || >= 16} + peerDependencies: + diff-match-patch: ^1.0.5 + svelte: ^3.44.0 + vite: ^2.9.0 + peerDependenciesMeta: + diff-match-patch: + optional: true + dependencies: + '@rollup/pluginutils': 4.2.1 + debug: 4.3.4 + deepmerge: 4.2.2 + kleur: 4.1.4 + magic-string: 0.26.2 + svelte: 3.48.0 + svelte-hmr: 0.14.11_svelte@3.48.0 + vite: 2.9.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@tsconfig/svelte/2.0.1: + resolution: {integrity: sha512-aqkICXbM1oX5FfgZd2qSSAGdyo/NRxjWCamxoyi3T8iVQnzGge19HhDYzZ6NrVOW7bhcWNSq9XexWFtMzbB24A==} + dev: true + + /@types/node/17.0.34: + resolution: {integrity: sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA==} + dev: true + + /@types/pug/2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /@types/sass/1.43.1: + resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} + dependencies: + '@types/node': 17.0.34 + dev: true + + /@windicss/config/1.8.4: + resolution: {integrity: sha512-i4fFGFfZoRess6WMkauykHC3PFd9xKYVx7lSuLfMK7sgo6x3+l4dY42GbsWMHyLqH1sTMfyt1LgfXSIKYJozSA==} + dependencies: + debug: 4.3.4 + jiti: 1.13.0 + windicss: 3.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@windicss/plugin-utils/1.8.4: + resolution: {integrity: sha512-DqJVwAfzlgd8nYSNlmhXOey32pI8UwH7QiOWdFS/AR2O/q9oLDGHDn97Its/kZdfoyhi8ylwZNP2Pk0H7cihhQ==} + dependencies: + '@antfu/utils': 0.5.2 + '@windicss/config': 1.8.4 + debug: 4.3.4 + fast-glob: 3.2.11 + magic-string: 0.26.2 + micromatch: 4.0.5 + windicss: 3.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case/3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /clean-css/4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /es6-promise/3.3.1: + resolution: {integrity: sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=} + dev: true + + /esbuild-android-64/0.14.39: + resolution: {integrity: sha512-EJOu04p9WgZk0UoKTqLId9VnIsotmI/Z98EXrKURGb3LPNunkeffqQIkjS2cAvidh+OK5uVrXaIP229zK6GvhQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.14.39: + resolution: {integrity: sha512-+twajJqO7n3MrCz9e+2lVOnFplRsaGRwsq1KL/uOy7xK7QdRSprRQcObGDeDZUZsacD5gUkk6OiHiYp6RzU3CA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.14.39: + resolution: {integrity: sha512-ImT6eUw3kcGcHoUxEcdBpi6LfTRWaV6+qf32iYYAfwOeV+XaQ/Xp5XQIBiijLeo+LpGci9M0FVec09nUw41a5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.14.39: + resolution: {integrity: sha512-/fcQ5UhE05OiT+bW5v7/up1bDsnvaRZPJxXwzXsMRrr7rZqPa85vayrD723oWMT64dhrgWeA3FIneF8yER0XTw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.14.39: + resolution: {integrity: sha512-oMNH8lJI4wtgN5oxuFP7BQ22vgB/e3Tl5Woehcd6i2r6F3TszpCnNl8wo2d/KvyQ4zvLvCWAlRciumhQg88+kQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.14.39: + resolution: {integrity: sha512-1GHK7kwk57ukY2yI4ILWKJXaxfr+8HcM/r/JKCGCPziIVlL+Wi7RbJ2OzMcTKZ1HpvEqCTBT/J6cO4ZEwW4Ypg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.14.39: + resolution: {integrity: sha512-g97Sbb6g4zfRLIxHgW2pc393DjnkTRMeq3N1rmjDUABxpx8SjocK4jLen+/mq55G46eE2TA0MkJ4R3SpKMu7dg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.14.39: + resolution: {integrity: sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.14.39: + resolution: {integrity: sha512-t0Hn1kWVx5UpCzAJkKRfHeYOLyFnXwYynIkK54/h3tbMweGI7dj400D1k0Vvtj2u1P+JTRT9tx3AjtLEMmfVBQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.14.39: + resolution: {integrity: sha512-23pc8MlD2D6Px1mV8GMglZlKgwgNKAO8gsgsLLcXWSs9lQsCYkIlMo/2Ycfo5JrDIbLdwgP8D2vpfH2KcBqrDQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.14.39: + resolution: {integrity: sha512-epwlYgVdbmkuRr5n4es3B+yDI0I2e/nxhKejT9H0OLxFAlMkeQZxSpxATpDc9m8NqRci6Kwyb/SfmD1koG2Zuw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.14.39: + resolution: {integrity: sha512-W/5ezaq+rQiQBThIjLMNjsuhPHg+ApVAdTz2LvcuesZFMsJoQAW2hutoyg47XxpWi7aEjJGrkS26qCJKhRn3QQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.14.39: + resolution: {integrity: sha512-IS48xeokcCTKeQIOke2O0t9t14HPvwnZcy+5baG13Z1wxs9ZrC5ig5ypEQQh4QMKxURD5TpCLHw2W42CLuVZaA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.14.39: + resolution: {integrity: sha512-zEfunpqR8sMomqXhNTFEKDs+ik7HC01m3M60MsEjZOqaywHu5e5682fMsqOlZbesEAAaO9aAtRBsU7CHnSZWyA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.14.39: + resolution: {integrity: sha512-Uo2suJBSIlrZCe4E0k75VDIFJWfZy+bOV6ih3T4MVMRJh1lHJ2UyGoaX4bOxomYN3t+IakHPyEoln1+qJ1qYaA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.14.39: + resolution: {integrity: sha512-secQU+EpgUPpYjJe3OecoeGKVvRMLeKUxSMGHnK+aK5uQM3n1FPXNJzyz1LHFOo0WOyw+uoCxBYdM4O10oaCAA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.14.39: + resolution: {integrity: sha512-qHq0t5gePEDm2nqZLb+35p/qkaXVS7oIe32R0ECh2HOdiXXkj/1uQI9IRogGqKkK+QjDG+DhwiUw7QoHur/Rwg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.14.39: + resolution: {integrity: sha512-XPjwp2OgtEX0JnOlTgT6E5txbRp6Uw54Isorm3CwOtloJazeIWXuiwK0ONJBVb/CGbiCpS7iP2UahGgd2p1x+Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.14.39: + resolution: {integrity: sha512-E2wm+5FwCcLpKsBHRw28bSYQw0Ikxb7zIMxw3OPAkiaQhLVr3dnVO8DofmbWhhf6b97bWzg37iSZ45ZDpLw7Ow==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.14.39: + resolution: {integrity: sha512-sBZQz5D+Gd0EQ09tZRnz/PpVdLwvp/ufMtJ1iDFYddDaPpZXKqPyaxfYBLs3ueiaksQ26GGa7sci0OqFzNs7KA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.14.39: + resolution: {integrity: sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.39 + esbuild-android-arm64: 0.14.39 + esbuild-darwin-64: 0.14.39 + esbuild-darwin-arm64: 0.14.39 + esbuild-freebsd-64: 0.14.39 + esbuild-freebsd-arm64: 0.14.39 + esbuild-linux-32: 0.14.39 + esbuild-linux-64: 0.14.39 + esbuild-linux-arm: 0.14.39 + esbuild-linux-arm64: 0.14.39 + esbuild-linux-mips64le: 0.14.39 + esbuild-linux-ppc64le: 0.14.39 + esbuild-linux-riscv64: 0.14.39 + esbuild-linux-s390x: 0.14.39 + esbuild-netbsd-64: 0.14.39 + esbuild-openbsd-64: 0.14.39 + esbuild-sunos-64: 0.14.39 + esbuild-windows-32: 0.14.39 + esbuild-windows-64: 0.14.39 + esbuild-windows-arm64: 0.14.39 + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /fast-glob/3.2.11: + resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /html-minifier/4.0.0: + resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} + engines: {node: '>=6'} + hasBin: true + dependencies: + camel-case: 3.0.0 + clean-css: 4.2.4 + commander: 2.20.3 + he: 1.2.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 3.15.5 + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /jiti/1.13.0: + resolution: {integrity: sha512-/n9mNxZj/HDSrincJ6RP+L+yXbpnB8FybySBa+IjIaoH9FIxBbrbRT5XUbe8R7zuVM2AQqNMNDDqz0bzx3znOQ==} + hasBin: true + dev: true + + /kleur/4.1.4: + resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + engines: {node: '>=6'} + dev: true + + /kolorist/1.5.1: + resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==} + dev: true + + /lower-case/1.1.4: + resolution: {integrity: sha1-miyr0bno4K6ZOkv31YdcOcQujqw=} + dev: true + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string/0.26.2: + resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /no-case/2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + dependencies: + lower-case: 1.1.4 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + dependencies: + wrappy: 1.0.2 + dev: true + + /param-case/2.1.1: + resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} + dependencies: + no-case: 2.3.2 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /relateurl/0.2.7: + resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} + engines: {node: '>= 0.10'} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve/1.22.0: + resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup/2.73.0: + resolution: {integrity: sha512-h/UngC3S4Zt28mB3g0+2YCMegT5yoftnQplwzPqGZcKvlld5e+kT/QRmJiL+qxGyZKOYpgirWGdLyEO1b0dpLQ==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /sander/0.5.1: + resolution: {integrity: sha1-dB4kXiMfB8r7b98PEzrfohalAq0=} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /sorcery/0.10.0: + resolution: {integrity: sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=} + hasBin: true + dependencies: + buffer-crc32: 0.2.13 + minimist: 1.2.6 + sander: 0.5.1 + sourcemap-codec: 1.4.8 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-check/2.7.1_svelte@3.48.0: + resolution: {integrity: sha512-vHVu2+SQ6ibt77iTQaq2oiOjBgGL48qqcg0ZdEOsP5pPOjgeyR9QbnaEdzdBs9nsVYBc/42haKtzb2uFqS8GVw==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.13 + chokidar: 3.5.3 + fast-glob: 3.2.11 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 3.48.0 + svelte-preprocess: 4.10.6_wwvk7nlptlrqo2czohjtk6eiqm + typescript: 4.6.4 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr/0.14.11_svelte@3.48.0: + resolution: {integrity: sha512-R9CVfX6DXxW1Kn45Jtmx+yUe+sPhrbYSUp7TkzbW0jI5fVPn6lsNG9NEs5dFg5qRhFNAoVdRw5qQDLALNKhwbQ==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.48.0 + dev: true + + /svelte-preprocess/4.10.6_wwvk7nlptlrqo2czohjtk6eiqm: + resolution: {integrity: sha512-I2SV1w/AveMvgIQlUF/ZOO3PYVnhxfcpNyGt8pxpUVhPfyfL/CZBkkw/KPfuFix5FJ9TnnNYMhACK3DtSaYVVQ==} + engines: {node: '>= 9.11.2'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + '@types/sass': 1.43.1 + detect-indent: 6.1.0 + magic-string: 0.25.9 + sorcery: 0.10.0 + strip-indent: 3.0.0 + svelte: 3.48.0 + typescript: 4.6.4 + dev: true + + /svelte-select/4.4.7: + resolution: {integrity: sha512-fIf9Z8rPI6F8naHZ9wjXT0Pv5gLyhdHAFkHFJnCfVVfELE8e82uOoF0xEVQP6Kir+b4Q5yOvNAzZ61WbSU6A0A==} + dev: false + + /svelte/3.48.0: + resolution: {integrity: sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==} + engines: {node: '>= 8'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: true + + /typescript/4.6.4: + resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /uglify-js/3.15.5: + resolution: {integrity: sha512-hNM5q5GbBRB5xB+PMqVRcgYe4c8jbyZ1pzZhS6jbq54/4F2gFK869ZheiE5A8/t+W5jtTNpWef/5Q9zk639FNQ==} + engines: {node: '>=0.8.0'} + hasBin: true + dev: true + + /upper-case/1.1.3: + resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} + dev: true + + /vite-plugin-windicss/1.8.4_vite@2.9.9: + resolution: {integrity: sha512-LSZAO8BZn3x406GRbYX5t5ONXXJVdqiQtN1qrznLA/Dy5/NzZVhfcrL6N1qEYYO7HsCDT4pLAjTzObvDnM9Y8A==} + peerDependencies: + vite: ^2.0.1 + dependencies: + '@windicss/plugin-utils': 1.8.4 + debug: 4.3.4 + kolorist: 1.5.1 + vite: 2.9.9 + windicss: 3.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /vite/2.9.9: + resolution: {integrity: sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew==} + engines: {node: '>=12.2.0'} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + dependencies: + esbuild: 0.14.39 + postcss: 8.4.14 + resolve: 1.22.0 + rollup: 2.73.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /windicss/3.5.4: + resolution: {integrity: sha512-x2Iu0a69dtNiKHMkR886lx0WKbZI5GqvXyvGBCJ2VA6rcjKYjnzCA/Ljd6hNQBfqlkSum8J+qAVcCfLzQFI4rQ==} + engines: {node: '>= 12'} + hasBin: true + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + dev: true diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/App.svelte b/resources/[ps]/ps-objectspawner/svelte-source/src/App.svelte new file mode 100644 index 0000000..ab5ace6 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/App.svelte @@ -0,0 +1,76 @@ + + +{#if $isOpen || debug} +
        +
        +
        + + + +
        +
        + {#each tabArray as tab, i} + handleClick(i)} active={tab.name == activeTab.name}/> + {/each} +
        +
        + {#each tabArray as tab} + {#if activeTab.name == tab.name } + + {/if} + {/each} +
        +
        +
        +{/if} + + diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/button.svelte b/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/button.svelte new file mode 100644 index 0000000..d7ccf34 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/button.svelte @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/number-input.svelte b/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/number-input.svelte new file mode 100644 index 0000000..bc357f3 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/number-input.svelte @@ -0,0 +1,61 @@ + + + +
        + + + handleInputUpdate(e)}/> + + +
        + + + \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/select.svelte b/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/select.svelte new file mode 100644 index 0000000..c1fc9e3 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/components/atoms/select.svelte @@ -0,0 +1,45 @@ + + +
        + + + \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/components/panels/create.svelte b/resources/[ps]/ps-objectspawner/svelte-source/src/components/panels/create.svelte new file mode 100644 index 0000000..6613878 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/components/panels/create.svelte @@ -0,0 +1,47 @@ + + + +
        +
        +

        Name

        + +
        +
        +

        Select Object

        + currentType = val}/> +
        +
        \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/components/panels/manage.svelte b/resources/[ps]/ps-objectspawner/svelte-source/src/components/panels/manage.svelte new file mode 100644 index 0000000..49fbe58 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/components/panels/manage.svelte @@ -0,0 +1,68 @@ + + +
        +
        +
        +

        Name

        +
        +
        +

        Object

        +
        +
        +

        Cords (x,y,z)

        +
        +
        +
        + {#each $spawnedObjectList as record (record.id)} +
        handleItemClick(record)}> +
        +

        {record.name}

        +
        +
        +

        {record.model}

        +
        +
        +

        ( {record.coords.x.toFixed(2)}, {record.coords.y.toFixed(2)}, {record.coords.z.toFixed(2)} )

        +
        +
        + {/each} +
        +
        +
        +
        + + \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/main.ts b/resources/[ps]/ps-objectspawner/svelte-source/src/main.ts new file mode 100644 index 0000000..ea23846 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/main.ts @@ -0,0 +1,8 @@ +import App from './App.svelte' +import 'virtual:windi.css' + +const app = new App({ + target: document.getElementById('app') +}) + +export default app \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/stores/debugStore.ts b/resources/[ps]/ps-objectspawner/svelte-source/src/stores/debugStore.ts new file mode 100644 index 0000000..5ff73f0 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/stores/debugStore.ts @@ -0,0 +1,2 @@ +const debugMode: boolean = import.meta.env.DEV; +export default debugMode; \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/stores/objectStore.ts b/resources/[ps]/ps-objectspawner/svelte-source/src/stores/objectStore.ts new file mode 100644 index 0000000..4260958 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/stores/objectStore.ts @@ -0,0 +1,87 @@ +import { writable } from 'svelte/store' +import type { Writable } from 'svelte/store'; +import { fetchNui } from '../utils/eventHandler'; +import type { creatableObject, createdMessageData, deleteMessageData, loadMessageData, spawnObject } from '../types/types'; + +interface propObjectStateType { + isOpen: Writable + objectList: Writable> + objectTypes: Writable> + spawnedObjectList: Writable> +} + +const store = () => { + + const propObjectState: propObjectStateType = { + isOpen: writable(false), + objectList: writable([]), + objectTypes: writable([]), + spawnedObjectList: writable([]), + }; + + const methods = { + closeMenu() { + propObjectState.isOpen.set(false); + fetchNui('close'); + }, + handleKeyUp(data) { + if (data.key == "Escape") { + methods.closeMenu() + } + }, + receiveOpenMessage() { + propObjectState.isOpen.set(true); + }, + receiveCreatedMessage(data: createdMessageData) { + propObjectState.spawnedObjectList.update((list) => { + list = [...list, data.newSpawnedObject]; + return list; + }) + }, + receiveDeleteMessage(data: deleteMessageData) { + propObjectState.spawnedObjectList.update((objectList) => { + return objectList.filter((item) => item.id != data.id); + }) + }, + receiveLoadMessage(data: loadMessageData) { + let objects: Array<{ value: string }> = []; + let objectTypes: Array<{ value: string }> = []; + let spawnedObjectList: Array = []; + + for (const [key, value] of Object.entries(data.objects)) { + if (value) { + objects.push({ value: key }); + } + } + + for (const name of data.objectTypes) { + objectTypes.push({ value: name as string }); + } + + for (const item of Object.values(data.spawnedObjects)) { + spawnedObjectList.push(item); + } + + propObjectState.isOpen.set(true); + propObjectState.objectList.set(objects); + propObjectState.objectTypes.set(objectTypes); + propObjectState.spawnedObjectList.set(spawnedObjectList || []); + }, + spawnObject(objectData: creatableObject) { + propObjectState.isOpen.set(false); + fetchNui("spawn", { + name: objectData.name, + object: objectData.object, + type: objectData.type, + distance: objectData.distance, + }) + }, + }; + + return { + ...propObjectState, + ...methods + } +} + +export default store(); \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/types/types.ts b/resources/[ps]/ps-objectspawner/svelte-source/src/types/types.ts new file mode 100644 index 0000000..1347247 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/types/types.ts @@ -0,0 +1,36 @@ +export interface spawnObject { + coords: { + x: number, + y: number, + z: number, + } + id: number + model: string + name: string + options: { [key: string]: any } + type: string +} + +export interface creatableObject { + name: string + object: string + distance: number + type: string +} + +export interface loadMessageData { + action: string + objects: { [key: string]: boolean } + objectTypes: Array + spawnedObjects: { [key: string]: spawnObject } +} + +export interface deleteMessageData { + action: string + id: number +} + +export interface createdMessageData { + action: string + newSpawnedObject: spawnObject +} \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/utils/eventHandler.ts b/resources/[ps]/ps-objectspawner/svelte-source/src/utils/eventHandler.ts new file mode 100644 index 0000000..d7fabf2 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/utils/eventHandler.ts @@ -0,0 +1,50 @@ +import { onMount, onDestroy } from "svelte"; +import ObjectStore from '../stores/objectStore'; +import type { createdMessageData, deleteMessageData, loadMessageData } from '../types/types'; + +interface nuiMessage { + data: { + action: string, + [key: string]: any, + }, +} + +export function EventHandler() { + function handleEvents(event: nuiMessage) { + switch (event.data.action) { + case "created": + ObjectStore.receiveCreatedMessage(event.data as createdMessageData); + break; + case "delete": + ObjectStore.receiveDeleteMessage(event.data as deleteMessageData); + break; + case "open": + ObjectStore.receiveOpenMessage(); + break; + case "load": + ObjectStore.receiveLoadMessage(event.data as loadMessageData); + break; + } + } + + onMount(() => window.addEventListener("message", handleEvents)); + onDestroy(() => window.removeEventListener("message", handleEvents)); +} + +export async function fetchNui(eventName: string, data: unknown = {}) { + const options = { + method: "post", + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + body: JSON.stringify(data), + }; + + const resourceName: string = "ps-objectspawner"; + + try { + const resp = await fetch(`https://${resourceName}/${eventName}`, options); + return await resp.json(); + } catch(err) { + } +} \ No newline at end of file diff --git a/resources/[ps]/ps-objectspawner/svelte-source/src/vite-env.d.ts b/resources/[ps]/ps-objectspawner/svelte-source/src/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/resources/[ps]/ps-objectspawner/svelte-source/svelte.config.js b/resources/[ps]/ps-objectspawner/svelte-source/svelte.config.js new file mode 100644 index 0000000..3630bb3 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/svelte.config.js @@ -0,0 +1,7 @@ +import sveltePreprocess from 'svelte-preprocess' + +export default { + // Consult https://github.com/sveltejs/svelte-preprocess + // for more information about preprocessors + preprocess: sveltePreprocess() +} diff --git a/resources/[ps]/ps-objectspawner/svelte-source/tsconfig.json b/resources/[ps]/ps-objectspawner/svelte-source/tsconfig.json new file mode 100644 index 0000000..96bfd81 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "resolveJsonModule": true, + "baseUrl": ".", + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true + }, + "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/resources/[ps]/ps-objectspawner/svelte-source/tsconfig.node.json b/resources/[ps]/ps-objectspawner/svelte-source/tsconfig.node.json new file mode 100644 index 0000000..e993792 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/tsconfig.node.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "composite": true, + "module": "esnext", + "moduleResolution": "node" + }, + "include": ["vite.config.ts"] +} diff --git a/resources/[ps]/ps-objectspawner/svelte-source/vite.config.ts b/resources/[ps]/ps-objectspawner/svelte-source/vite.config.ts new file mode 100644 index 0000000..d81504e --- /dev/null +++ b/resources/[ps]/ps-objectspawner/svelte-source/vite.config.ts @@ -0,0 +1,41 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' +import WindiCSS from 'vite-plugin-windicss' +import { minify } from "html-minifier"; + +const minifyHtml = () => { + return { + name: 'html-transform', + transformIndexHtml(html) { + return minify(html, { + collapseWhitespace: true, + }); + }, + }; +}; + +export default defineConfig(({ mode }) => { + const isProduction = mode === 'production'; + + return { + plugins: [WindiCSS(), svelte(), + isProduction && minifyHtml(), + // isProduction && viteCompression({algorithm: "brotliCompress", ext:".bz"}) + ], + base: './', // fivem nui needs to have local dir reference + build: { + minify: isProduction, + emptyOutDir: true, + outDir: '../html', + assetsDir: './', + rollupOptions: { + output: { + // By not having hashes in the name, you don't have to update the manifest, yay! + entryFileNames: `[name].js`, + chunkFileNames: `[name].js`, + assetFileNames: `[name].[ext]` + } + } + }, + }; +}); diff --git a/resources/[ps]/ps-objectspawner/yarn.lock b/resources/[ps]/ps-objectspawner/yarn.lock new file mode 100644 index 0000000..84b6cf5 --- /dev/null +++ b/resources/[ps]/ps-objectspawner/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@neodrag/svelte@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@neodrag/svelte/-/svelte-1.2.3.tgz#e61668b7c9036e091612d9d546f63445e95b1ac4" + integrity sha512-+OMidMflSWLxPq0m0xyEozaqq5MPzFukZo6cEx4Hp/inHmuHjbDMfUkGDd/g+MpVFgzkqPDGrTS6JnXVGA2d9Q== diff --git a/resources/[ps]/ps-realtor/.DS_Store b/resources/[ps]/ps-realtor/.DS_Store new file mode 100644 index 0000000..d7b9692 Binary files /dev/null and b/resources/[ps]/ps-realtor/.DS_Store differ diff --git a/resources/[ps]/ps-realtor/.gitattributes b/resources/[ps]/ps-realtor/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/resources/[ps]/ps-realtor/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/resources/[ps]/ps-realtor/.github/ISSUE_TEMPLATE/bug_report.md b/resources/[ps]/ps-realtor/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..891c617 --- /dev/null +++ b/resources/[ps]/ps-realtor/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/resources/[ps]/ps-realtor/.gitignore b/resources/[ps]/ps-realtor/.gitignore new file mode 100644 index 0000000..cf84d2a --- /dev/null +++ b/resources/[ps]/ps-realtor/.gitignore @@ -0,0 +1 @@ +/.DS_Store/ \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/LICENSE b/resources/[ps]/ps-realtor/LICENSE new file mode 100644 index 0000000..0b012b2 --- /dev/null +++ b/resources/[ps]/ps-realtor/LICENSE @@ -0,0 +1,458 @@ +Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) +https://creativecommons.org/licenses/by-nc-sa/4.0/ + +This is a human-readable summary of (and not a substitute for) the license. Disclaimer. + +You are free to: + +Share — copy and redistribute the material in any medium or format +Adapt — remix, transform, and build upon the material + +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: +Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. + +NonCommercial — You may not use the material for commercial purposes. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +Notices: +You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/resources/[ps]/ps-realtor/README.md b/resources/[ps]/ps-realtor/README.md new file mode 100644 index 0000000..2ae3ae2 --- /dev/null +++ b/resources/[ps]/ps-realtor/README.md @@ -0,0 +1,14 @@ +# ps-realtor + +`/housing` command + +# Dependency +1. [ps-housing](https://github.com/Project-Sloth/ps-housing) - go over ps-housing and read the README. +2. [ox_lib](https://github.com/overextended/ox_lib/releases) - Use the latest release. If you do not use the latest release, MAKE SURE TO BUILD THE UI. Find their docs [here](https://overextended.dev/ox_lib#building-the-ui) + +# Preview +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/24e4018a-cb97-42b0-81df-3b0236c7e2dc) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/4d8ece54-ace1-4ffc-b8fb-90274bc94e72) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/188d259c-4c0f-4c91-905c-bf9b826cc518) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/9e033984-45f2-449d-ba6c-bb8742ac08bd) +![image](https://github.com/Project-Sloth/ps-realtor/assets/82112471/0dd078b8-a941-4316-b9e1-26c696023139) diff --git a/resources/[ps]/ps-realtor/client/client.lua b/resources/[ps]/ps-realtor/client/client.lua new file mode 100644 index 0000000..5498480 --- /dev/null +++ b/resources/[ps]/ps-realtor/client/client.lua @@ -0,0 +1,353 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +PropertiesTable = {} + +local showBlipsForSale = false +local showBlipsOwned = false + +local blipsForSale = {} +local blipsOwned = {} + +local UIOpen = false + +local tabletObj = nil +local tabletDict = "amb@code_human_in_bus_passenger_idles@female@tablet@base" +local tabletAnim = "base" +local tabletProp = Config.AnimationProp +local tabletBone = 60309 +local tabletOffset = vector3(0.03, 0.002, -0.0) +local tabletRot = vector3(10.0, 160.0, 0.0) + +local function doAnimation() + if not UIOpen then return end + -- Animation + RequestAnimDict(tabletDict) + while not HasAnimDictLoaded(tabletDict) do Citizen.Wait(100) end + -- Model + RequestModel(tabletProp) + while not HasModelLoaded(tabletProp) do Citizen.Wait(100) end + + local plyPed = PlayerPedId() + tabletObj = CreateObject(tabletProp, 0.0, 0.0, 0.0, true, true, false) + local tabletBoneIndex = GetPedBoneIndex(plyPed, tabletBone) + + AttachEntityToEntity(tabletObj, plyPed, tabletBoneIndex, tabletOffset.x, tabletOffset.y, tabletOffset.z, tabletRot.x, tabletRot.y, tabletRot.z, true, false, false, false, 2, true) + SetModelAsNoLongerNeeded(tabletProp) + + CreateThread(function() + while UIOpen do + Wait(0) + if not IsEntityPlayingAnim(plyPed, tabletDict, tabletAnim, 3) then + TaskPlayAnim(plyPed, tabletDict, tabletAnim, 3.0, 3.0, -1, 49, 0, 0, 0, 0) + end + end + + + ClearPedSecondaryTask(plyPed) + Citizen.Wait(250) + DetachEntity(tabletObj, true, false) + DeleteEntity(tabletObj) + end) +end + +RegisterNetEvent('QBCore:Server:UpdateObject', function() + if source ~= '' then return false end + QBCore = exports['qb-core']:GetCoreObject() +end) + +local function toggleUI(bool) + UIOpen = bool + SetNuiFocus(bool, bool) + SendNUIMessage({ + action = "setVisible", + data = bool + }) + + if Config.PlayAnimation then + doAnimation() + end +end + +RegisterNUICallback("hideUI", function() + toggleUI(false) +end) + +local function setRealtor(jobInfo) + if jobInfo.name == Config.RealtorJobName then + SendNUIMessage({ + action = "setRealtorGrade", + data = jobInfo.grade.level + }) + else + SendNUIMessage({ + action = "setRealtorGrade", + data = -1 + }) + end +end +RegisterNetEvent("QBCore:Client:OnJobUpdate", setRealtor) + +AddEventHandler('QBCore:Client:OnPlayerLoaded', function() + SendNUIMessage({ + action = "setConfig", + data = Config.RealtorPerms + }) + local PlayerData = QBCore.Functions.GetPlayerData() + setRealtor(PlayerData.job) +end) + +--this was mainly used for dev +AddEventHandler("onResourceStart", function(resName) + if (GetCurrentResourceName() == resName) then + Wait(2000) + SendNUIMessage({ + action = "setConfig", + data = Config.RealtorPerms + }) + + local PlayerData = QBCore.Functions.GetPlayerData() + setRealtor(PlayerData.job) + end +end) + +if Config.UseCommand then + RegisterCommand("housing", function() + local PlayerData = QBCore.Functions.GetPlayerData() + if not PlayerData.metadata["isdead"] and not PlayerData.metadata["inlaststand"] and not PlayerData.metadata["ishandcuffed"] and not IsPauseMenuActive() then + toggleUI(not UIOpen) + end + end, false) +end + +RegisterNetEvent('ps-realtor:client:toggleUI', function() + local PlayerData = QBCore.Functions.GetPlayerData() + if not PlayerData.metadata["isdead"] and not PlayerData.metadata["inlaststand"] and not PlayerData.metadata["ishandcuffed"] and not IsPauseMenuActive() then + toggleUI(not UIOpen) + end +end) + +-- Callbacks +RegisterNUICallback("setWaypoint", function (data, cb) + lib.notify({ description = 'Waypoint was set!' , type = 'success'}) + SetNewWaypoint(data.x, data.y) + cb("ok") +end) + +RegisterNUICallback("updatePropertyData", function(data, cb) + local property_id = data.property_id + local newData = data.data + local changeType = data.type + + if changeType == 'UpdateShell' then + local currentShells = exports['ps-housing']:GetShells() + local shellName = currentShells[newData.shell].hash + + if not IsModelInCdimage(shellName) then + lib.notify({ description = 'The Interior '..newData.shell..' does not exist!', type = 'error'}) + return + end + end + + TriggerServerEvent("ps-realtor:server:updateProperty", changeType, property_id, newData) + cb("ok") +end) + +RegisterNUICallback("addTenantToApartment", function(data, cb) + TriggerServerEvent("ps-realtor:server:addTenantToApartment", data) + cb("ok") +end) + +RegisterNUICallback("getNames", function(data, cb) + if not data then return end + local names = lib.callback.await("ps-realtor:server:getNames",source, data) + cb(names) +end) + +RegisterNUICallback("startZonePlacement", function (data, cb) + cb(1) + SetNuiFocus(false, false) + + local type = data.type + local property_id = data.property_id + + local newDataPromise = promise.new() + ZoneThread(type, newDataPromise) + local newData = Citizen.Await(newDataPromise) + if not newData then return end + + if type == "door" then + type = "UpdateDoor" + elseif type == "garage" then + type = "UpdateGarage" + SendNUIMessage({ + action = "garageMade", + data = { + x = newData.x, + y = newData.y, + z = newData.z, + h = newData.heading, + length = 3.0, + width = 5.0, + } + }) + end + + local streetHash = GetStreetNameAtCoord(newData.x, newData.y, newData.z) + local street = GetStreetNameFromHashKey(streetHash) + + local regionHash = GetNameOfZone(newData.x, newData.y, newData.z) + local region = GetLabelText(regionHash) + + if type == "UpdateGarage" then + local data = { + garage = newData, + street = street, + region = region, + } + TriggerServerEvent("ps-realtor:server:updateProperty", type, property_id, data) + else + local data = { + door = newData, + street = street, + region = region, + } + TriggerServerEvent("ps-realtor:server:updateProperty", type, property_id, data) + end +end) + + +local function setHide(bool) + SendNUIMessage({ + action = "setTempHide", + data = bool + }) + SetNuiFocus(not bool, not bool) +end + +-- For the zone placement. At some point I will make a proper system but its not a big deal, it works. +function ZoneThread(type, promise) + local findingZone = true + + -- default for door + local length = 2.0 + local width = 1.0 + local zoff = 2.0 + local height = 2.5 + + if type == "garage" then + lib.notify({description="Best to get in a vehicle to see how the zone would look.", type="error"}) + + length = 3.0 + width = 5.0 + end + + CreateThread(function() + while findingZone do + cache.ped = PlayerPedId() + local coords = GetEntityCoords(cache.ped) + local x = coords.x + local y = coords.y + local z = coords.z + local heading = GetEntityHeading(cache.ped) + DrawMarker(43, x, y, z + zoff, 0.0, 0.0, 0.0, 0.0, 180.0, -heading, length, width, height, 255, 0, 0, 50, false, false, 2, nil, nil, false) + if IsDisabledControlJustPressed(0, 38) then -- E + findingZone = false + setHide(false) + local newData = { + x = x, + y = y, + z = z, + h = heading, + } + promise:resolve(newData) + end + if IsDisabledControlJustPressed(0, 104) then -- H + findingZone = false + setHide(false) + promise:resolve(false) + end + Wait(0) + DisableControlAction(0, 199, true) -- P + DisableControlAction(0, 200, true) -- ESC + DisableControlAction(0, 104, true) -- H + end + end) +end + +RegisterNUICallback("getBlipBooleans", function (_, cb) + cb({ + showBlipsForSale = showBlipsForSale, + showBlipsOwned = showBlipsOwned, + }) +end) + +RegisterNUICallback("showBlipsForSale", function (bool, cb) + if bool then + showBlipsForSale = true + CreateBlipsOnMap("forSale") + else + showBlipsForSale = false + RemoveBlipsOnMap("forSale") + end + cb(1) +end) + +RegisterNUICallback("showBlipsOwned", function (bool, cb) + if bool then + showBlipsOwned = true + CreateBlipsOnMap("owned") + else + showBlipsOwned = false + RemoveBlipsOnMap("owned") + end + cb(1) +end) + +function CreateBlipsOnMap(type) + if type ~= "forSale" and type ~= "owned" then return end + local blipsTable = type == "forSale" and blipsForSale or blipsOwned + local nameType = type == "forSale" and "Property For Sale" or "Owned Property" + + RemoveBlipsOnMap(type) + for k, data in pairs(PropertiesTable) do + if not data.apartment then + local isForSale = data.for_sale + local owner = data.owner + + local coords = data.door_data + local blipName = '('..nameType..')' .. ' ' .. data.street .. ' ' .. data.property_id + if type == "forSale" and isForSale then + local blip = CreateBlip(coords, blipName) + blipsTable[#blipsTable + 1] = blip + elseif type == "owned" and (owner and not isForSale) then + local blip = CreateBlip(coords, blipName, false, 0) + blipsTable[#blipsTable + 1] = blip + end + end + end +end + +function CreateBlip(coords, blipName, sale, price) + local blip = AddBlipForCoord(coords.x, coords.y, coords.z) + SetBlipSprite(blip, 375) + SetBlipDisplay(blip, 4) + SetBlipScale(blip, 0.7) + SetBlipColour(blip, 2) + SetBlipAsShortRange(blip, true) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(blipName) + EndTextCommandSetBlipName(blip) + return blip +end + +function RemoveBlipsOnMap(type) + if type == "forSale" then + for k, v in pairs(blipsForSale) do + RemoveBlip(v) + end + elseif type == "owned" then + for k, v in pairs(blipsOwned) do + RemoveBlip(v) + end + end +end diff --git a/resources/[ps]/ps-realtor/client/createProperty.lua b/resources/[ps]/ps-realtor/client/createProperty.lua new file mode 100644 index 0000000..4526f45 --- /dev/null +++ b/resources/[ps]/ps-realtor/client/createProperty.lua @@ -0,0 +1,132 @@ +CreateProperty = { + creating = false, + street = "", + region = "", + description = "", + for_sale = 1, + price = 0, + shell = "", + door_data = nil, + garage_data = nil, + + StartCreating = function(self) + self.creating = true + end, + + CancelCreating = function(self) + self.creating = false + self.description = "" + self.for_sale = false + self.price = 0 + self.shell = "" + self.door_data = nil + self.garage_data = nil + self.creating = false + end, + + SetTextFields = function(self, data) + self.description = data.description + self.for_sale = data.for_sale + self.price = data.price + self.shell = data.shell + end, + + PlacingZone = function(self, type) + local zoneDataPromise = promise.new() + ZoneThread(type, zoneDataPromise) + local zoneData = Citizen.Await(zoneDataPromise) + if not zoneData then return end + zoneData.x = math.floor(zoneData.x* 100) / 100 + zoneData.y = math.floor(zoneData.y* 100) / 100 + zoneData.z = math.floor(zoneData.z* 100) / 100 + zoneData.h = math.floor(zoneData.h* 100) / 100 + if type == "door" then + self.door_data = zoneData + self.door_data.locked = false + self.door_data.length = 1.5 + self.door_data.width = 2.2 + SendNUIMessage({ + action = "createdDoor", + data = true + }) + lib.notify({ description = 'Door was set!', type = 'success'}) + elseif type == "garage" then + self.garage_data = zoneData + + self.garage_data.length = 3.0 + self.garage_data.width = 5.0 + + SendNUIMessage({ + action = "createdGarage", + data = true + }) + lib.notify({ description = 'Garage was set!', type = 'success'}) + end + + + local streetHash = GetStreetNameAtCoord(zoneData.x, zoneData.y, zoneData.z) + self.street = GetStreetNameFromHashKey(streetHash) + + local regionHash = GetNameOfZone(zoneData.x, zoneData.y, zoneData.z) + self.region = GetLabelText(regionHash) + + end, + + RemoveGarage = function(self) + self.garage_data = nil + SendNUIMessage({ + action = "createdGarage", + data = nil + }) + lib.notify({ description = 'Garage was removed!', type = 'error'}) + end, + + CreateProperty = function(self) + local data = { + street = self.street, + region = self.region, + description = self.description, + for_sale = self.for_sale, + price = self.price, + shell = self.shell, + door_data = self.door_data, + garage_data = self.garage_data, + } + + TriggerServerEvent("ps-realtor:server:registerProperty", data) + lib.notify({ description = 'Property was created!', type = 'success'}) + self:CancelCreating() + end, +} + +RegisterNUICallback("create:startCreating", function(data, cb) + CreateProperty:StartCreating() + cb("ok") +end) + +RegisterNUICallback("create:cancelCreating", function(data, cb) + CreateProperty:CancelCreating() + cb("ok") +end) + +RegisterNUICallback("create:setTextFields", function(data, cb) + CreateProperty:SetTextFields(data) + cb("ok") +end) + +RegisterNUICallback("create:confirmListing", function(data, cb) + CreateProperty:CreateProperty() + cb("ok") +end) + +RegisterNUICallback("create:createZone", function(data, cb) + local type = data.type + SetNuiFocus(false, false) + CreateProperty:PlacingZone(type) + cb("ok") +end) + +RegisterNUICallback("create:removeGarage", function(data, cb) + CreateProperty:RemoveGarage() + cb("ok") +end) diff --git a/resources/[ps]/ps-realtor/client/sync.lua b/resources/[ps]/ps-realtor/client/sync.lua new file mode 100644 index 0000000..9f3c8da --- /dev/null +++ b/resources/[ps]/ps-realtor/client/sync.lua @@ -0,0 +1,82 @@ +local PSHousing = exports['ps-housing'] + +function InitialiseData() + -- Get properties + local properties = PSHousing:GetProperties() + + PropertiesTable = {} + for _, property in pairs(properties) do + PropertiesTable[#PropertiesTable+1] = property.propertyData + end + + local apartments = PSHousing:GetApartments() + + local ApartmentsTable = {} + + for _, apartment in pairs(apartments) do + ApartmentsTable[#ApartmentsTable+1] = apartment + end + + SendNUIMessage({ + action = "setShells", + data = exports['ps-housing']:GetShells() + }) + + SendNUIMessage({ + action = "setProperties", + data = PropertiesTable + }) + + SendNUIMessage({ + action = "setApartments", + data = ApartmentsTable + }) +end + +AddEventHandler('ps-housing:client:initialisedProperties', function() + InitialiseData() +end) + +AddEventHandler('ps-housing:client:updatedProperty', function(property_id) + local property = exports['ps-housing']:GetProperty(property_id) + + for i = 1, #PropertiesTable do + if PropertiesTable[i].property_id == property_id then + PropertiesTable[i] = property.propertyData + break + end + end + + SendNUIMessage({ + action = "updateProperty", + data = property.propertyData + }) +end) + +--old is the old player apartment location, new is the new location +-- both have to be updated +AddEventHandler("ps-housing:client:updateApartment", function(old, new) + + local oldApt = PSHousing:GetApartment(old) + + SendNUIMessage({ + action = "updateApartment", + data = oldApt + }) + + local newApt = PSHousing:GetApartment(new) + + SendNUIMessage({ + action = "updateApartment", + data = newApt + }) +end) + +RegisterNetEvent('ps-housing:client:addProperty', function(propertyData) + PropertiesTable[#PropertiesTable+1] = propertyData + + SendNUIMessage({ + action = "updateProperty", -- if it cant find the property it will add it + data = propertyData + }) +end) \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/fxmanifest.lua b/resources/[ps]/ps-realtor/fxmanifest.lua new file mode 100644 index 0000000..84f7967 --- /dev/null +++ b/resources/[ps]/ps-realtor/fxmanifest.lua @@ -0,0 +1,31 @@ +fx_version 'cerulean' + +game "gta5" + +author "Xirvin & Project Sloth" +version '0.0.5' + +lua54 'yes' + + +ui_page 'html/index.html' +-- ui_page 'https://localhost:3000/' --for dev + +shared_script { + '@ox_lib/init.lua', + "shared/**", +} + +server_script { + "server/**", +} + +client_script { + 'client/**', +} + + + +files { + 'html/**', +} diff --git a/resources/[ps]/ps-realtor/html/images/House.png b/resources/[ps]/ps-realtor/html/images/House.png new file mode 100644 index 0000000..c375a84 Binary files /dev/null and b/resources/[ps]/ps-realtor/html/images/House.png differ diff --git a/resources/[ps]/ps-realtor/html/images/apt-card-img.png b/resources/[ps]/ps-realtor/html/images/apt-card-img.png new file mode 100644 index 0000000..12e3fbb Binary files /dev/null and b/resources/[ps]/ps-realtor/html/images/apt-card-img.png differ diff --git a/resources/[ps]/ps-realtor/html/images/apts-bg.png b/resources/[ps]/ps-realtor/html/images/apts-bg.png new file mode 100644 index 0000000..6279d23 Binary files /dev/null and b/resources/[ps]/ps-realtor/html/images/apts-bg.png differ diff --git a/resources/[ps]/ps-realtor/html/images/discord-emoji.png b/resources/[ps]/ps-realtor/html/images/discord-emoji.png new file mode 100644 index 0000000..7cb3366 Binary files /dev/null and b/resources/[ps]/ps-realtor/html/images/discord-emoji.png differ diff --git a/resources/[ps]/ps-realtor/html/images/property-card-img.png b/resources/[ps]/ps-realtor/html/images/property-card-img.png new file mode 100644 index 0000000..8fc8400 Binary files /dev/null and b/resources/[ps]/ps-realtor/html/images/property-card-img.png differ diff --git a/resources/[ps]/ps-realtor/html/images/user-location-pin.png b/resources/[ps]/ps-realtor/html/images/user-location-pin.png new file mode 100644 index 0000000..bf84e18 Binary files /dev/null and b/resources/[ps]/ps-realtor/html/images/user-location-pin.png differ diff --git a/resources/[ps]/ps-realtor/html/index.css b/resources/[ps]/ps-realtor/html/index.css new file mode 100644 index 0000000..bcafc02 --- /dev/null +++ b/resources/[ps]/ps-realtor/html/index.css @@ -0,0 +1 @@ +.realtor-menu-base{display:flex;flex-direction:row;overflow:hidden}.realtor-menu-base>.left-column{width:20%;padding:1.3vw .3vw;border-right:.1px solid var(--light-border-color);background-color:var(--light-border-color-half-opaque);display:flex;flex-direction:column;justify-content:space-between}.realtor-menu-base>.right-column{width:80%;height:100%;padding:1.3vw}.tab-wrapper{margin:.35vw .2vw}.tab-wrapper>.each-tab{display:flex;flex-direction:row;padding:.5vw;border-radius:.2vw;cursor:pointer;line-height:1vw;vertical-align:middle}.tab-wrapper>.each-tab>i{width:2vw;padding-top:.05vw;text-align:center}.tab-wrapper>.each-tab>p{font-size:.75vw}.tab-wrapper>.each-tab-selected{background-color:var(--blue-color)}.tab-wrapper>.discord-wrapper{padding:.25vw;border-radius:.2vw;background-color:#333;border:1px solid var(--light-border-color);margin-top:.5vw;padding:.7vw 0;display:flex;flex-direction:column;justify-content:space-evenly;align-items:center}.tab-wrapper>.discord-wrapper>.discord-emoji{width:1.3vw}.tab-wrapper>.discord-wrapper>.discord-text{margin:.75vw 0;text-align:center;width:70%}.tab-wrapper>.discord-wrapper>.discord-text>.bold-text{font-weight:600}.tab-wrapper>.discord-wrapper>.discord-text>.small-text{font-size:.6vw;opacity:.8;margin-top:.2vw}.tab-wrapper>.discord-wrapper>.visit-discord-btn{border-radius:6vw;color:var(--black-color);background-color:var(--white-color);width:-moz-fit-content;width:fit-content;padding:.2vw .8vw;font-size:.7vw;font-weight:600}:root{--light-border-color-half-opaque: rgba(255, 255, 255, .05);--light-border-color: rgba(255, 255, 255, .1);--light-border-color-2: rgba(255, 255, 255, .2);--less-light-border-color: rgba(255, 255, 255, .3);--light-border-color-6: rgba(255, 255, 255, .6);--light-border-color-8: rgba(255, 255, 255, .8);--white-color: rgba(255, 255, 255, 1);--black-color: rgba(0, 0, 0, 1);--black-two-opaque-color: rgba(0, 0, 0, .2);--black-opaque-color-3: rgba(0, 0, 0, .3);--tile-color: rgba(36, 36, 36, 1);--footer-color: rgb(28, 28, 28);--blue-color: #0078D4;--green-color: rgba(34, 197, 94, 1);--red-color: rgba(220, 38, 38, 1);--circle-color: rgba(75, 75, 75, 1)}.dropdown{display:flex;flex-direction:row;font-size:.9vw;z-index:1;position:absolute}.dropdown>label{margin:0 .2vw;color:var(--light-text)}.dropdown-wrapper{display:flex;flex-direction:column;min-width:6vw;width:-moz-fit-content;width:fit-content;background:linear-gradient(0deg,#242424,#242424),linear-gradient(0deg,rgba(255,255,255,.1),rgba(255,255,255,.1));border:1px solid rgba(255,255,255,.1);color:var(--app-name);border-radius:.2vw}.select-wrapper{width:auto;height:1.7vw;display:flex;flex-direction:row;justify-content:space-between;padding-left:.2vw;padding-right:.3vw;cursor:pointer}.select-wrapper-selected-value{font-size:.7vw;padding:.25vw;margin-right:.2vw;display:flex;flex-direction:row}.select-wrapper-selected-value>.inside-label{color:var(--less-light-border-color);margin-right:.3vw}.select-wrapper-selected-value>.selected-value-text{padding-top:.05vw}.dropdown-chevron{text-align:center;font-size:.5vw;margin-top:.6vw;color:var(--less-light-border-color)}.options-wrapper{width:100%}.options-wrapper>.no-items-found{font-size:.7vw;padding:.17vw .6vw}.option-child{cursor:pointer;padding:.17vw .8vw .17vw .45vw;min-height:1.7vw;border-radius:.2vw;font-size:.7vw}.option-child>p{display:flex;flex-direction:row}.option-child>p>.icon{font-size:.65vw;padding-top:.35vw;margin-left:.5vw}.option-child:hover{background-color:var(--black-two-opaque-color)}.large-footer-modal{display:flex;overflow:hidden!important;border-radius:.2vw;position:absolute;outline:none;z-index:999999;opacity:1;left:60%;top:50%;transform:translate(-50%,-50%);transition:all .3s linear}.large-footer-modal-dialog{width:33vw;height:35vw;display:flex;position:relative}.large-footer-modal-content{display:flex;position:relative;flex-direction:column;width:100%;pointer-events:auto;background-color:var(--tile-color);box-shadow:0 4px 2px #00000040,inset 0 1px #ffffff26;background-clip:padding-box;border-radius:.2vw;outline:none;border:.08px solid var(--light-border-color)}.large-footer-modal-body{position:relative;display:flex;flex-direction:column;justify-content:space-between;font-size:.8vw;font-weight:300}.large-footer-modal-body>.header{display:flex;flex-direction:row;justify-content:space-between;height:2.1vw;padding:.4vw;border-bottom:.1px solid var(--light-border-color)}.large-footer-modal-body>.header>.heading-title-wrapper{display:flex;flex-direction:row;padding:.2vw}.large-footer-modal-body>.header>.heading-title-wrapper>.info-icon{margin-right:.5vw;color:var(--blue-color);font-size:.75vw}.large-footer-modal-body>.header>.heading-title-wrapper>p{font-size:.7vw;font-weight:600;margin-top:-.15vw}.large-footer-modal-body>.header>div>.close-icon{color:var(--less-light-border-color);padding-right:.2vw;cursor:pointer}.large-footer-modal-body>.large-footer-modal-body-data{display:flex;flex-direction:column;height:30.5vw;padding:1.2vw 1.8vw}.large-footer-modal-body>.large-footer-modal-footer{background-color:var(--footer-color);height:2.3vw}*{margin:0;padding:0}::-webkit-scrollbar{width:.2vw}::-webkit-scrollbar-track{box-shadow:inset 0 0 4px gray;border-radius:.2vw}::-webkit-scrollbar-thumb{background:rgba(191,219,254,.5);border-radius:.2vw}::-webkit-scrollbar-thumb:hover{background:rgba(191,219,254,.5)}.green{color:var(--green-color)}.red{color:var(--red-color)}.form-row-wrapper{display:flex;flex-direction:column;justify-content:left;margin-bottom:.7vw}.form-row-wrapper>.label{font-size:.6vw;font-weight:500;margin-bottom:.2vw}.form-row-wrapper>.action-row{display:flex;flex-direction:row}.form-row-wrapper>.action-row>button:not(:first-child),.form-row-wrapper>.action-row>div:not(:first-child),.form-row-wrapper>.action-row>input:not(:first-child){margin-left:.4vw}.form-row-wrapper>.image-tiles-wrapper{margin-top:1vw;width:15vw;display:flex;flex-direction:row;flex-wrap:wrap;row-gap:.3vw}.form-row-wrapper>.image-tiles-wrapper>div>img,.form-row-wrapper>.image-tiles-wrapper>div{width:4vw;height:2vw;border-radius:.3vw;background-color:var(--light-border-color)}.form-row-wrapper>.image-tiles-wrapper>div:not(:first-child){margin-left:.4vw}.form-row-wrapper>.image-tiles-wrapper>div:nth-child(4n){margin-left:0}.form-row-wrapper>.action-row>.regular-button{padding:.2vw .6vw;border-radius:.15vw;background-color:var(--blue-color);font-size:.6vw;font-weight:500}.form-row-wrapper>.action-row>.disable-button{padding:.2vw .6vw;border-radius:.15vw;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:1px solid var(--light-border-color-2);font-size:.6vw;font-weight:500}.form-row-wrapper>.action-row>input{padding:.35vw .55vw;border-radius:.15vw;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:1px solid var(--light-border-color-2);color:var(--light-border-color-6);font-size:.5vw;font-weight:600;width:15vw}.form-row-wrapper>.action-row>textarea{padding:.35vw .55vw;border-radius:.15vw;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:1px solid var(--light-border-color-2);color:var(--light-border-color-6);font-size:.5vw;font-weight:600;width:15vw}.properties-base{display:flex;flex-direction:column;height:100%;padding:.5vw}.properties-base>.search-wrapper{border-radius:.6vw}.properties-base>.search-wrapper>img{border-radius:.6vw;position:relative;text-align:center;width:100%;height:12vw}.properties-base>.search-wrapper>.search-data{position:absolute;top:13%;left:41%;z-index:99999;text-align:center;font-weight:600;font-size:.9vw}.properties-base>.search-wrapper>.search-data>.light-text{font-size:.7vw}.properties-base>.search-wrapper>.search-data>.search-bar{position:relative;margin-top:.7vw}.properties-base>.search-wrapper>.search-data>.search-bar>input{box-shadow:0 4px 4px #0000001a;border-radius:.15vw;width:25vw;padding:.2vw .5vw;font-weight:500;font-size:.6vw;color:#000}.properties-base>.search-wrapper>.search-data>.search-bar>i{position:absolute;color:#0009;left:95%;font-size:.6vw;padding:.4vw .2vw}.properties-base>.properties-heading-wrapper{margin:.3vw 0;font-size:.75vw}.properties-base>.properties-heading-wrapper>.heading{margin:.5vw 0}.properties-base>.properties-heading-wrapper>.filters-wrapper{margin:.7vw 0 .5vw;display:flex;flex-direction:row}.properties-base>.property-listing-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;row-gap:.7vw;height:-moz-fit-content;height:fit-content;max-height:100%;overflow-y:auto;overflow-x:hidden}.property-card-wrapper{width:10.3vw;min-height:12.5vw;max-height:-moz-fit-content;max-height:fit-content;margin-right:1vw;border-radius:.2vw;box-shadow:0 4px 4px #00000040;background-color:var(--light-border-color-2);display:flex;flex-direction:column}.property-card-wrapper:nth-child(4n){margin-right:0}.property-card-wrapper>img{height:45%}.property-card-wrapper>.property-card-details{height:55%;display:flex;flex-direction:column;padding:.3vw .6vw}.property-card-wrapper>.property-card-details>.property-name,.property-card-wrapper>.property-card-details>.property-cost{font-size:.55vw;font-weight:600;color:var(--white-color);padding:.08vw 0}.property-card-wrapper>.property-card-details>.property-address{font-size:.5vw;font-weight:500;color:var(--light-border-color-8)}.property-card-wrapper>.property-card-details>.property-details{margin-top:.3vw;font-size:.38vw;letter-spacing:.4px;font-weight:400;color:var(--white-color);width:90%;display:flex;flex-direction:row;flex-wrap:wrap;row-gap:.3vw}.property-card-wrapper>.property-card-details>.property-details>.each-tile{border-radius:.1vw;min-width:2vw;width:-moz-fit-content;width:fit-content;padding:.22vw .15vw .15vw;margin-right:.2vw;text-align:center;background-color:var(--tile-color);display:flex;flex-direction:row}.property-card-wrapper>.property-card-details>.property-details>.each-tile>i{color:var(--less-light-border-color);margin-right:.15vw;padding-top:.08vw}.card-hover-button{align-self:center;background-color:var(--blue-color);color:var(--white-color);width:100%;padding-top:.05vw;padding-bottom:.05vw;border-radius:.2vw;font-size:.6vw;font-weight:500}.large-footer-modal-body>.large-footer-modal-body-data>img{height:12vw;border-radius:.3vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property{display:flex;flex-direction:row;margin-top:1.5vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.left-column{height:14.5vw;width:70%;border-right:.1px solid var(--light-border-color);overflow-y:auto}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.left-column>.property-name{font-size:.8vw;font-weight:600}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.left-column>.property-info{margin-top:.5vw;width:75%;font-size:.65vw;font-weight:500;color:var(--light-border-color-8)}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.left-column>.gallery-image-wrapper{margin-top:1vw;display:flex;flex-direction:row;flex-wrap:wrap;row-gap:.5vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.left-column>.gallery-image-wrapper>img{border-radius:.3vw;width:9vw;margin-right:.8vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column{height:14.5vw;width:30%;padding-left:1.3vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column>.title{font-size:.8vw;font-weight:600;margin-bottom:.8vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column>.waypoint{background-color:var(--blue-color);color:var(--white-color);width:100%;border-radius:.1vw;padding:.2vw 0;font-size:.7vw;display:flex;flex-direction:row;justify-content:center}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column>.waypoint>i{padding-top:.2vw;margin-right:.5vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column>.waypoint>p{font-weight:500}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column>.tiles-wrapper{margin-top:.75vw;font-size:.5vw;letter-spacing:.4px;font-weight:400;color:var(--white-color);width:90%;display:flex;flex-direction:row;flex-wrap:wrap;row-gap:.3vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column>.tiles-wrapper>.each-tile{border-radius:.1vw;min-width:2.5vw;width:-moz-fit-content;width:fit-content;padding:.25vw;margin-right:.07vw;text-align:center;display:flex;flex-direction:row;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:.1px solid var(--light-border-color-2)}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-property>.right-column>.tiles-wrapper>.each-tile>i{color:var(--light-border-color-6);font-weight:700;margin-right:.15vw;padding-top:.15vw}.large-footer-modal-body>.large-footer-modal-footer{padding:.55vw 1vw;display:flex;flex-direction:row;justify-content:flex-end}.large-footer-modal-body>.large-footer-modal-footer>button{border-radius:.1vw;width:-moz-fit-content;width:fit-content;font-size:.5vw;font-weight:600;padding:.15vw .5vw;text-align:center;display:flex;flex-direction:row;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:.1px solid var(--light-border-color-2)}.manage-property-modal-dialog{height:40vw}.manage-property-large-footer-modal-body-data{padding:1.2vw 1vw!important;height:35.5vw!important;overflow-y:auto}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property{display:flex;flex-direction:row;margin-top:.1vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.left-column{height:28.2vw;width:30%;display:flex;flex-direction:column;justify-content:left}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.left-column>.heading{font-size:.65vw;font-weight:600}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.left-column>.info{font-size:.6vw;font-weight:400;margin-top:.3vw;margin-right:.2vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column{height:14.5vw;width:70%;padding-left:.5vw;margin-left:1vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column>.title{font-size:.8vw;font-weight:600;margin-bottom:.8vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column>.waypoint{background-color:var(--blue-color);color:var(--white-color);width:100%;border-radius:.1vw;padding:.2vw 0;font-size:.7vw;display:flex;flex-direction:row;justify-content:center}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column>.waypoint>i{padding-top:.2vw;margin-right:.5vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column>.waypoint>p{font-weight:500}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column>.tiles-wrapper{margin-top:.75vw;font-size:.5vw;letter-spacing:.4px;font-weight:400;color:var(--white-color);width:90%;display:flex;flex-direction:row;flex-wrap:wrap;row-gap:.3vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column>.tiles-wrapper>.each-tile{border-radius:.1vw;min-width:2.5vw;width:-moz-fit-content;width:fit-content;padding:.3vw;margin-right:.2vw;text-align:center;display:flex;flex-direction:row;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:.1px solid var(--light-border-color-2)}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-manage-property>.right-column>.tiles-wrapper>.each-tile>i{color:var(--light-border-color-6);font-weight:700;margin-right:.15vw;padding-top:.15vw}.large-footer-modal-body>.large-footer-modal-footer-manage-property{background-color:var(--footer-color);height:2.3vw;padding:.55vw 1vw;display:flex;flex-direction:row;justify-content:flex-end}.large-footer-modal-body>.large-footer-modal-footer-manage-property>.delete-button{border-radius:.1vw;width:-moz-fit-content;width:fit-content;font-size:.5vw;font-weight:600;padding:.15vw .5vw;text-align:center;display:flex;flex-direction:row;background-color:var(--red-color)}.apartments-base{display:flex;flex-direction:column;padding:.2vw;height:100%}.apartments-base>.heading{font-size:.75vw}.apartments-base>.apartment-listing-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;row-gap:1vw;margin-top:.8vw;overflow-y:auto;overflow-x:hidden}.apartment-card-wrapper{width:10.5vw;height:15.5vw;margin-right:1vw;border-radius:.2vw;box-shadow:0 4px 4px #00000040;background-color:var(--light-border-color-2);display:flex;flex-direction:column}.apartment-card-wrapper:nth-child(4n){margin-right:0}.apartment-card-wrapper>img{height:60%}.apartment-card-wrapper>.details{display:flex;flex-direction:column;margin-top:.3vw;padding:.6vw}.apartment-card-wrapper>.details>.heading{font-size:.7vw;font-weight:600}.apartment-card-wrapper>.details>.info{font-size:.6vw;font-weight:500;color:var(--light-border-color-8)}.apartment-card-wrapper>.details>.location-tenants-info{display:flex;flex-direction:row;margin-top:.2vw}.apartment-card-wrapper>.details>.location-tenants-info>p{font-size:.45vw;font-weight:400;color:var(--light-border-color-8);padding-top:.1vw;margin-left:.3vw}.apartment-card-wrapper>.details>.select-apt-button{background-color:var(--blue-color);box-shadow:0 4px 4px #00000040;color:var(--white-color);border-radius:.2vw;width:99%;font-size:.7vw;font-weight:500;margin-top:.4vw;padding:.2vw}.selected-apartment-modal-dialog{height:40vw}.selected-apartment-large-footer-modal-body-data{padding:1.5vw 2.2vw!important;height:35.5vw!important}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment{display:flex;flex-direction:column}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>img{height:9vw;border-radius:.5vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper{height:3vw;margin-top:1vw;padding:.2vw 0;display:flex;flex-direction:row;justify-content:space-between}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.apt-details{display:flex;flex-direction:column}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.apt-details>.heading{font-size:.8vw;font-weight:600}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.apt-details>.tenant-count{font-size:.5vw;font-weight:500;color:var(--light-border-color-8);margin-top:.45vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.search-actions{display:flex;flex-direction:row;height:1.5vw;margin:auto 0}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.search-actions>button{padding:.2vw .6vw;border-radius:.15vw;background-color:var(--blue-color);font-size:.6vw;font-weight:500}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.search-actions>button>i{margin-right:.3vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.search-actions>.search-bar{position:relative;margin-right:.5vw;color:var(--light-border-color-6)}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.search-actions>.search-bar>input{border-radius:.15vw;width:9vw;padding:.25vw .5vw;font-weight:500;font-size:.6vw;color:var(--light-border-color-6);background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,rgba(255,255,255,.2),rgba(255,255,255,.2));border:.95px solid rgba(255,255,255,.2);box-shadow:0 3.8072197437286377px 3.8072197437286377px #0000001a}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.search-wrapper>.search-actions>.search-bar>i{position:absolute;color:var(--light-border-color-6);left:88%;font-size:.6vw;padding:.4vw .2vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>hr{background-color:var(--light-border-color-2);height:.1px;border:none;margin-top:.4vw}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.tenant-wrapper{height:20.2vw;overflow-y:auto}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.tenant-wrapper>.tenant-row{display:flex;flex-direction:row;height:3.5vw;border-bottom:.1px solid var(--light-border-color-2)}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.tenant-wrapper>.tenant-row>.img-wrapper{border-radius:50%;width:1.8vw;height:1.8vw;background-color:var(--circle-color);margin:auto .6vw auto 0}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.tenant-wrapper>.tenant-row>.tenant-details{display:flex;flex-direction:column;margin:auto 0}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.tenant-wrapper>.tenant-row>.tenant-details>.tenant-name{font-size:.6vw;font-weight:600}.large-footer-modal-body>.large-footer-modal-body-data>.data-details-selected-apartment>.tenant-wrapper>.tenant-row>.tenant-details>.tenant-status{font-size:.5vw;font-weight:500;color:var(--light-border-color-6)}.large-footer-modal-body>.large-footer-modal-footer-selected-apartment{background-color:var(--footer-color);height:2.3vw;padding:.55vw 1vw;display:flex;flex-direction:row;justify-content:flex-end}.large-footer-modal-body>.large-footer-modal-footer-selected-apartment>input{border-radius:.15vw;width:7.5vw;height:1.21vw;padding:.22vw .5vw;font-weight:500;font-size:.53vw;color:var(--light-border-color-6);background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,rgba(255,255,255,.2),rgba(255,255,255,.2));border:.95px solid rgba(255,255,255,.2);box-shadow:0 3.8072197437286377px 3.8072197437286377px #0000001a}.large-footer-modal-body>.large-footer-modal-footer-selected-apartment>.add-button{border-radius:.1vw;width:-moz-fit-content;width:fit-content;font-size:.5vw;font-weight:600;padding:.17vw .5vw;margin-left:.5vw;text-align:center;display:flex;flex-direction:row;background-color:var(--blue-color)}.no-new-properties-base{display:flex;flex-direction:column;align-items:center;position:absolute;left:60%;top:47%;transform:translate(-50%,-50%)}.no-new-properties-base>img{width:3vw;margin-bottom:.8vw}.no-new-properties-base>p{color:var(--white-color);font-size:.7vw}.no-new-properties-base>button{background-color:var(--blue-color);font-size:.6vw;font-weight:500;border-radius:.2vw;padding:.2vw .9vw;margin-top:.8vw}.list-new-property-form{margin:1vw;height:33vw;border-radius:.1vw;background:linear-gradient(0deg,#242424,#242424),linear-gradient(0deg,rgba(255,255,255,.1),rgba(255,255,255,.1));border-width:0px,1px,1px,1px;border-style:solid;border-color:var(--light-border-color)}.list-new-property-form>.header{display:flex;flex-direction:row;justify-content:space-between;height:2.1vw;border-bottom:.1px solid var(--light-border-color)}.list-new-property-form>.header>.heading-title-wrapper{display:flex;flex-direction:row;padding:.6vw}.list-new-property-form>.header>.heading-title-wrapper>.add-icon{margin-right:.5vw;color:var(--blue-color);font-size:.75vw;padding:.05vw .1vw}.list-new-property-form>.header>.heading-title-wrapper>p{font-size:.7vw;font-weight:600;margin-top:-.15vw}.list-new-property-form>.header>div>.chevron-icon{color:var(--less-light-border-color);padding:.6vw .6vw .2vw .2vw;font-size:.75vw}.list-new-property-form>.body-wrapper{padding:.7vw 1.2vw;display:flex;flex-direction:row;margin-top:.5vw;height:28.1vw}.list-new-property-form>.body-wrapper>.left-column{display:flex;flex-direction:column;width:30%}.list-new-property-form>.body-wrapper>.left-column>.title{font-size:.7vw;font-weight:600}.list-new-property-form>.body-wrapper>.left-column>.info{font-size:.6vw;font-weight:400;color:var(--white-color);margin-top:.3vw}.list-new-property-form>.list-new-property-form-footer{display:flex;flex-direction:row;justify-content:flex-end;background-color:var(--footer-color);height:2.3vw;padding:.55vw 1vw}.list-new-property-form>.list-new-property-form-footer>button{border-radius:.1vw;width:-moz-fit-content;width:fit-content;font-size:.5vw;font-weight:600;padding:.15vw .5vw;text-align:center;display:flex;flex-direction:row;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:.1px solid var(--light-border-color-2)}div.svelte-11k92at{position:absolute;left:0;top:0}main.svelte-1fnr7mh{position:absolute;left:0;top:0;z-index:100;-webkit-user-select:none;-moz-user-select:none;user-select:none;box-sizing:border-box;padding:0;margin:0;height:100vh;width:100vw}.form-dropdown.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr{display:flex;flex-direction:row;z-index:1;position:absolute}.form-dropdown.svelte-cmskyr>label.svelte-cmskyr.svelte-cmskyr{margin:0 .2vw;color:var(--light-text)}.form-dropdown-wrapper.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr{display:flex;flex-direction:column;min-width:10vw;width:-moz-fit-content;width:fit-content;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:1px solid var(--light-border-color-2);color:var(--app-name);border-radius:.1vw}.form-select-wrapper.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr{width:auto;display:flex;flex-direction:row;justify-content:space-between;padding-left:.2vw;padding-right:.3vw;cursor:pointer}.form-select-wrapper-selected-value.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr{font-size:.6vw;padding:.15vw .2vw .25vw;margin-right:.2vw;display:flex;flex-direction:row}.form-select-wrapper-selected-value.svelte-cmskyr>.form-inside-label.svelte-cmskyr.svelte-cmskyr{color:var(--less-light-border-color);margin-right:.3vw;padding-top:.055vw}.form-select-wrapper-selected-value.svelte-cmskyr>.form-selected-value-text.svelte-cmskyr.svelte-cmskyr{padding-top:.07vw}.form-dropdown-chevron.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr{text-align:center;font-size:.5vw;margin-top:.5vw;color:var(--less-light-border-color)}.form-options-wrapper.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr{width:100%;min-height:1vw;max-height:7vw;overflow-y:auto}.form-options-wrapper.svelte-cmskyr>.form-no-items-found.svelte-cmskyr.svelte-cmskyr{font-size:.5vw;padding:.1vw .6vw .4vw .7vw}.form-option-child.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr{cursor:pointer;padding:.17vw .8vw .17vw .7vw;min-height:1.7vw;border-radius:.2vw;font-size:.6vw}.form-option-child.svelte-cmskyr>p.svelte-cmskyr.svelte-cmskyr{display:flex;flex-direction:row;padding-top:.2vw}.form-option-child.svelte-cmskyr>p.svelte-cmskyr>.form-icon.svelte-cmskyr{font-size:.6vw;padding-top:.2vw;margin-left:.5vw}.form-option-child.svelte-cmskyr.svelte-cmskyr.svelte-cmskyr:hover{background-color:var(--black-two-opaque-color)}.set-not-set-wrapper.svelte-yzp4m3.svelte-yzp4m3{min-width:3vw;width:-moz-fit-content;width:fit-content;border-radius:.13vw;background:linear-gradient(0deg,#313131,#313131),linear-gradient(0deg,var(--light-border-color-2),var(--light-border-color-2));border:1px solid var(--light-border-color-2);padding:.3vw .5vw;font-size:.5vw;display:flex;flex-direction:row;text-align:center}.set-not-set-wrapper.svelte-yzp4m3>.left-value.svelte-yzp4m3{font-weight:400;color:var(--less-light-border-color)}.set-not-set-wrapper.svelte-yzp4m3>.right-value.svelte-yzp4m3{font-weight:500;color:var(--white-color);margin-left:.3vw}.set-not-set-wrapper.svelte-yzp4m3>.indicator.svelte-yzp4m3{font-size:.3vw;padding-top:.3vw;margin-right:.3vw}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.visible{visibility:visible}.invisible{visibility:hidden}.absolute{position:absolute}.relative{position:relative}.left-0{left:0px}.left-1\/2{left:50%}.left-4{left:1rem}.top-0{top:0px}.top-1\/2{top:50%}.z-10{z-index:10}.z-40{z-index:40}.z-\[1000\]{z-index:1000}.z-\[10\]{z-index:10}.z-\[11\]{z-index:11}.z-\[99999999999\]{z-index:99999999999}.m-1{margin:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.block{display:block}.flex{display:flex}.grid{display:grid}.aspect-square{aspect-ratio:1 / 1}.h-0{height:0px}.h-16{height:4rem}.h-2{height:.5rem}.h-\[20rem\]{height:20rem}.h-\[3rem\]{height:3rem}.h-\[5rem\]{height:5rem}.h-\[90\%\]{height:90%}.h-\[95\%\]{height:95%}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.max-h-\[65rem\]{max-height:65rem}.w-12{width:3rem}.w-16{width:4rem}.w-96{width:24rem}.w-\[100\%\]{width:100%}.w-\[20rem\]{width:20rem}.w-\[30\%\]{width:30%}.w-\[60\%\]{width:60%}.w-\[8rem\]{width:8rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.max-w-\[60\%\]{max-width:60%}.flex-shrink{flex-shrink:1}.flex-grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-8{gap:2rem}.gap-\[0rem\]{gap:0rem}.overflow-hidden{overflow:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-y-scroll{overflow-y:scroll}.border{border-width:1px}.bg-\[color\:var\(--color-primary\)\]{background-color:var(--color-primary)}.bg-\[color\:var\(--color-secondary\)\]{background-color:var(--color-secondary)}.bg-\[color\:var\(--color-tertiary\)\]{background-color:var(--color-tertiary)}.bg-\[rgba\(0\,0\,0\,0\.5\)\]{background-color:#00000080}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity))}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[1vw\]{padding-left:1vw;padding-right:1vw}.px-\[2rem\]{padding-left:2rem;padding-right:2rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-\[0\.5vw\]{padding-top:.5vw;padding-bottom:.5vw}.py-\[5rem\]{padding-top:5rem;padding-bottom:5rem}.pb-\[5rem\]{padding-bottom:5rem}.pb-\[8rem\]{padding-bottom:8rem}.pt-4{padding-top:1rem}.pt-\[2rem\]{padding-top:2rem}.pt-\[4rem\]{padding-top:4rem}.text-center{text-align:center}.align-middle{vertical-align:middle}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.text-\[color\:var\(--color-accent\)\]{color:var(--color-accent)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}*{margin:0;padding:0;font-family:Satoshi,sans-serif;color:#fff;-webkit-user-drag:none}*:focus{outline:none}button:hover{filter:brightness(1.1)}:root{font-size:62.5%;--color-primary: #131313;--color-secondary: #1f2528;--color-tertiary: #26343a;--color-accent: #00889E}html,body{height:100vh;width:100vw;font-size:1.6rem;overflow:hidden}::-webkit-scrollbar{width:0px;height:0px}.scroll-style-horizontal::-webkit-scrollbar{height:.5rem;width:100%}.scroll-style-vertical::-webkit-scrollbar{width:.5rem;height:100%}.scroll-style::-webkit-scrollbar-track{background:whtie}.scroll-style::-webkit-scrollbar-thumb{background:var(--color-accent);border-radius:1rem}input#slider[type=range]{height:1rem;-webkit-appearance:none;width:100%}input#slider[type=range]::-webkit-slider-runnable-track{width:100%;height:2rem;cursor:pointer;background:var(--color-secondary)}input#slider[type=range]::-webkit-slider-thumb{height:2rem;width:2rem;background:white;cursor:pointer;-webkit-appearance:none}.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:h-fit{height:-moz-fit-content;height:fit-content}@media (prefers-color-scheme: dark){.dark\:bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}} diff --git a/resources/[ps]/ps-realtor/html/index.html b/resources/[ps]/ps-realtor/html/index.html new file mode 100644 index 0000000..87189b2 --- /dev/null +++ b/resources/[ps]/ps-realtor/html/index.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + FIVEM + + + + +
        + + + diff --git a/resources/[ps]/ps-realtor/html/index.js b/resources/[ps]/ps-realtor/html/index.js new file mode 100644 index 0000000..8cde80e --- /dev/null +++ b/resources/[ps]/ps-realtor/html/index.js @@ -0,0 +1,22 @@ +const cn=function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&n(i)}).observe(document,{childList:!0,subtree:!0});function l(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerpolicy&&(o.referrerPolicy=r.referrerpolicy),r.crossorigin==="use-credentials"?o.credentials="include":r.crossorigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(r){if(r.ep)return;r.ep=!0;const o=l(r);fetch(r.href,o)}};cn();function ee(){}const zt=t=>t;function fn(t,e){for(const l in e)t[l]=e[l];return t}function Wl(t){return t()}function Yt(){return Object.create(null)}function We(t){t.forEach(Wl)}function Vt(t){return typeof t=="function"}function he(t,e){return t!=t?e==e:t!==e||t&&typeof t=="object"||typeof t=="function"}let At;function Ie(t,e){return At||(At=document.createElement("a")),At.href=e,t===At.href}function un(t){return Object.keys(t).length===0}function dn(t,...e){if(t==null)return ee;const l=t.subscribe(...e);return l.unsubscribe?()=>l.unsubscribe():l}function se(t,e,l){t.$$.on_destroy.push(dn(e,l))}function pn(t,e,l,n){if(t){const r=$l(t,e,l,n);return t[0](r)}}function $l(t,e,l,n){return t[1]&&n?fn(l.ctx.slice(),t[1](n(e))):l.ctx}function mn(t,e,l,n){if(t[2]&&n){const r=t[2](n(l));if(e.dirty===void 0)return r;if(typeof r=="object"){const o=[],i=Math.max(e.dirty.length,r.length);for(let c=0;c32){const e=[],l=t.ctx.length/32;for(let n=0;nwindow.performance.now():()=>Date.now(),Gt=Jl?t=>requestAnimationFrame(t):ee;const ut=new Set;function Ql(t){ut.forEach(e=>{e.c(t)||(ut.delete(e),e.f())}),ut.size!==0&&Gt(Ql)}function Zl(t){let e;return ut.size===0&&Gt(Ql),{promise:new Promise(l=>{ut.add(e={c:t,f:l})}),abort(){ut.delete(e)}}}function s(t,e){t.appendChild(e)}function Xl(t){if(!t)return document;const e=t.getRootNode?t.getRootNode():t.ownerDocument;return e&&e.host?e:t.ownerDocument}function hn(t){const e=d("style");return bn(Xl(t),e),e.sheet}function bn(t,e){return s(t.head||t,e),e.sheet}function C(t,e,l){t.insertBefore(e,l||null)}function E(t){t.parentNode&&t.parentNode.removeChild(t)}function qe(t,e){for(let l=0;lt.removeEventListener(e,l,n)}function u(t,e,l){l==null?t.removeAttribute(e):t.getAttribute(e)!==l&&t.setAttribute(e,l)}function xl(t){return t===""?null:+t}function vn(t){return Array.from(t.childNodes)}function re(t,e){e=""+e,t.data!==e&&(t.data=e)}function be(t,e){t.value=e==null?"":e}function Ge(t,e,l,n){l==null?t.style.removeProperty(e):t.style.setProperty(e,l,n?"important":"")}function en(t,e,{bubbles:l=!1,cancelable:n=!1}={}){const r=document.createEvent("CustomEvent");return r.initCustomEvent(t,l,n,e),r}function Zt(t,e){return new t(e)}const Rt=new Map;let Tt=0;function wn(t){let e=5381,l=t.length;for(;l--;)e=(e<<5)-e^t.charCodeAt(l);return e>>>0}function yn(t,e){const l={stylesheet:hn(e),rules:{}};return Rt.set(t,l),l}function Ot(t,e,l,n,r,o,i,c=0){const a=16.666/n;let f=`{ +`;for(let y=0;y<=1;y+=a){const k=e+(l-e)*o(y);f+=y*100+`%{${i(k,1-k)}} +`}const _=f+`100% {${i(l,1-l)}} +}`,p=`__svelte_${wn(_)}_${c}`,m=Xl(t),{stylesheet:g,rules:v}=Rt.get(m)||yn(m,t);v[p]||(v[p]=!0,g.insertRule(`@keyframes ${p} ${_}`,g.cssRules.length));const w=t.style.animation||"";return t.style.animation=`${w?`${w}, `:""}${p} ${n}ms linear ${r}ms 1 both`,Tt+=1,p}function Ht(t,e){const l=(t.style.animation||"").split(", "),n=l.filter(e?o=>o.indexOf(e)<0:o=>o.indexOf("__svelte")===-1),r=l.length-n.length;r&&(t.style.animation=n.join(", "),Tt-=r,Tt||kn())}function kn(){Gt(()=>{Tt||(Rt.forEach(t=>{const{ownerNode:e}=t.stylesheet;e&&E(e)}),Rt.clear())})}let St;function kt(t){St=t}function Ut(){if(!St)throw new Error("Function called outside component initialization");return St}function jt(t){Ut().$$.on_mount.push(t)}function Pn(t){Ut().$$.on_destroy.push(t)}function Kt(){const t=Ut();return(e,l,{cancelable:n=!1}={})=>{const r=t.$$.callbacks[e];if(r){const o=en(e,l,{cancelable:n});return r.slice().forEach(i=>{i.call(t,o)}),!o.defaultPrevented}return!0}}const at=[],lt=[];let dt=[];const It=[],Ln=Promise.resolve();let Ft=!1;function Sn(){Ft||(Ft=!0,Ln.then(tn))}function Je(t){dt.push(t)}function pt(t){It.push(t)}const Mt=new Set;let ot=0;function tn(){if(ot!==0)return;const t=St;do{try{for(;ott.indexOf(n)===-1?e.push(n):l.push(n)),l.forEach(n=>n()),dt=e}let yt;function ln(){return yt||(yt=Promise.resolve(),yt.then(()=>{yt=null})),yt}function Pt(t,e,l){t.dispatchEvent(en(`${e?"intro":"outro"}${l}`))}const Ct=new Set;let Xe;function je(){Xe={r:0,c:[],p:Xe}}function Ne(){Xe.r||We(Xe.c),Xe=Xe.p}function V(t,e){t&&t.i&&(Ct.delete(t),t.i(e))}function F(t,e,l,n){if(t&&t.o){if(Ct.has(t))return;Ct.add(t),Xe.c.push(()=>{Ct.delete(t),n&&(l&&t.d(1),n())}),t.o(e)}else n&&n()}const nn={duration:0};function rn(t,e,l){const n={direction:"in"};let r=e(t,l,n),o=!1,i,c,a=0;function f(){i&&Ht(t,i)}function _(){const{delay:m=0,duration:g=300,easing:v=zt,tick:w=ee,css:y}=r||nn;y&&(i=Ot(t,0,1,g,m,v,y,a++)),w(0,1);const k=Yl()+m,P=k+g;c&&c.abort(),o=!0,Je(()=>Pt(t,!0,"start")),c=Zl(b=>{if(o){if(b>=P)return w(1,0),Pt(t,!0,"end"),f(),o=!1;if(b>=k){const T=v((b-k)/g);w(T,1-T)}}return o})}let p=!1;return{start(){p||(p=!0,Ht(t),Vt(r)?(r=r(n),ln().then(_)):_())},invalidate(){p=!1},end(){o&&(f(),o=!1)}}}function mt(t,e,l,n){const r={direction:"both"};let o=e(t,l,r),i=n?0:1,c=null,a=null,f=null;function _(){f&&Ht(t,f)}function p(g,v){const w=g.b-i;return v*=Math.abs(w),{a:i,b:g.b,d:w,duration:v,start:g.start,end:g.start+v,group:g.group}}function m(g){const{delay:v=0,duration:w=300,easing:y=zt,tick:k=ee,css:P}=o||nn,b={start:Yl()+v,b:g};g||(b.group=Xe,Xe.r+=1),c||a?a=b:(P&&(_(),f=Ot(t,i,g,w,v,y,P)),g&&k(0,1),c=p(b,w),Je(()=>Pt(t,g,"start")),Zl(T=>{if(a&&T>a.start&&(c=p(a,w),a=null,Pt(t,c.b,"start"),P&&(_(),f=Ot(t,i,c.b,c.duration,0,y,o.css))),c){if(T>=c.end)k(i=c.b,1-i),Pt(t,c.b,"end"),a||(c.b?_():--c.group.r||We(c.group.c)),c=null;else if(T>=c.start){const O=T-c.start;i=c.a+c.d*y(O/c.duration),k(i,1-i)}}return!!(c||a)}))}return{run(g){Vt(o)?ln().then(()=>{o=o(r),m(g)}):m(g)},end(){_(),c=a=null}}}function gt(t,e,l){const n=t.$$.props[e];n!==void 0&&(t.$$.bound[n]=l,l(t.$$.ctx[n]))}function ge(t){t&&t.c()}function de(t,e,l,n){const{fragment:r,after_update:o}=t.$$;r&&r.m(e,l),n||Je(()=>{const i=t.$$.on_mount.map(Wl).filter(Vt);t.$$.on_destroy?t.$$.on_destroy.push(...i):We(i),t.$$.on_mount=[]}),o.forEach(Je)}function pe(t,e){const l=t.$$;l.fragment!==null&&(An(l.after_update),We(l.on_destroy),l.fragment&&l.fragment.d(e),l.on_destroy=l.fragment=null,l.ctx=[])}function Cn(t,e){t.$$.dirty[0]===-1&&(at.push(t),Sn(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{const v=g.length?g[0]:m;return f.ctx&&r(f.ctx[p],f.ctx[p]=v)&&(!f.skip_bound&&f.bound[p]&&f.bound[p](v),_&&Cn(t,p)),m}):[],f.update(),_=!0,We(f.before_update),f.fragment=n?n(f.ctx):!1,e.target){if(e.hydrate){const p=vn(e.target);f.fragment&&f.fragment.l(p),p.forEach(E)}else f.fragment&&f.fragment.c();e.intro&&V(t.$$.fragment),de(t,e.target,e.anchor,e.customElement),tn()}kt(a)}class Ee{$destroy(){pe(this,1),this.$destroy=ee}$on(e,l){if(!Vt(l))return ee;const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(l),()=>{const r=n.indexOf(l);r!==-1&&n.splice(r,1)}}$set(e){this.$$set&&!un(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function ze(t,e){const l=n=>{const{action:r,data:o}=n.data;r===t&&e(o)};jt(()=>window.addEventListener("message",l)),Pn(()=>window.removeEventListener("message",l))}const st=[];function xe(t,e=ee){let l;const n=new Set;function r(c){if(he(t,c)&&(t=c,l)){const a=!st.length;for(const f of n)f[1](),st.push(f,t);if(a){for(let f=0;f{n.delete(f),n.size===0&&l&&(l(),l=null)}}return{set:r,update:o,subscribe:i}}const Lt=xe(!1),qt=xe(!1),Bt=xe(""),He=xe([]),_t=xe([]),ct=xe([]),ht=xe(3),nt=xe(!1),Et=xe({manageProperty:1,changePropertyForSale:0,sellProperty:0,listNewProperty:2,deleteProperty:2,setApartments:2});let on=!1;qt.subscribe(t=>{on=t});let sn="";Bt.subscribe(t=>{sn=t});async function Ve(t,e={},l){if(on==!0&&l)return Promise.resolve(l||{});const n={method:"post",headers:{"Content-Type":"application/json; charset=UTF-8"},body:JSON.stringify(e)},r=window.GetParentResourceName?window.GetParentResourceName():sn;return await(await fetch(`https://${r}/${t}`,n)).json()}function Xt(t){let e,l;const n=t[2].default,r=pn(n,t,t[1],null);return{c(){e=d("main"),r&&r.c(),u(e,"class","svelte-1fnr7mh")},m(o,i){C(o,e,i),r&&r.m(e,null),l=!0},p(o,i){r&&r.p&&(!l||i&2)&&gn(r,n,o,o[1],l?mn(n,o[1],i,null):_n(o[1]),null)},i(o){l||(V(r,o),l=!0)},o(o){F(r,o),l=!1},d(o){o&&E(e),r&&r.d(o)}}}function Rn(t){let e,l,n=t[0]&&Xt(t);return{c(){n&&n.c(),e=Ye()},m(r,o){n&&n.m(r,o),C(r,e,o),l=!0},p(r,[o]){r[0]?n?(n.p(r,o),o&1&&V(n,1)):(n=Xt(r),n.c(),V(n,1),n.m(e.parentNode,e)):n&&(je(),F(n,1,1,()=>{n=null}),Ne())},i(r){l||(V(n),l=!0)},o(r){F(n),l=!1},d(r){n&&n.d(r),r&&E(e)}}}function Tn(t,e,l){let{$$slots:n={},$$scope:r}=e,o;return Lt.subscribe(i=>{l(0,o=i)}),ze("setVisible",i=>{Lt.set(i)}),jt(()=>{const i=c=>{o&&["Escape"].includes(c.code)&&(Ve("hideUI"),Lt.set(!1))};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)}),t.$$set=i=>{"$$scope"in i&&l(1,r=i.$$scope)},[o,r,n]}class Vn extends Ee{constructor(e){super(),Se(this,e,Tn,Rn,he,{})}}const jn=()=>!window.invokeNative,ft=(t,e=0)=>{if(jn())for(const l of t)setTimeout(()=>{window.dispatchEvent(new MessageEvent("message",{data:{action:l.action,data:l.data}}))},e)};function xt(t,e,l){const n=t.slice();return n[6]=e[l],n}function el(t,e,l){const n=t.slice();return n[9]=e[l],n}function tl(t){let e,l=t[1],n=[];for(let r=0;r{let f=Object.assign({},o);f.property_id=r.length+1,f.price=Math.floor(Math.random()*1e6),f.for_sale=Math.random()>.5?1:0;let _={x:Math.floor(Math.random()*1e6),y:Math.floor(Math.random()*1e6),z:Math.floor(Math.random()*1e6)};f.garage=Math.random()>.5?_:null,r=[...r,f],ft([{action:"setProperties",data:r}])}}]},{component:"Is Realtor",actions:[{name:"true",action:"setRealtor",data:!0},{name:"false",action:"setRealtor",data:!1}]}],()=>{l(0,n=!n)},f=>{if(f.custom==!0){f.customFunction();return}ft([{action:f.action,data:f.data}])}]}class Dn extends Ee{constructor(e){super(),Se(this,e,Mn,Nn,he,{})}}function On(t,e,l){let n,r,o,i,c,a,f;se(t,nt,g=>l(0,n=g)),se(t,_t,g=>l(1,r=g)),se(t,ct,g=>l(2,o=g)),se(t,He,g=>l(3,i=g)),se(t,Et,g=>l(4,c=g)),se(t,ht,g=>l(5,a=g)),se(t,Lt,g=>l(6,f=g));function _(g){g.key==="="&&Pe(Lt,f=!0,f)}return ze("setBrowserMode",g=>{qt.set(g),console.log("browser mode enabled"),g?window.addEventListener("keydown",_):window.removeEventListener("keydown",_)}),ze("setRealtorGrade",g=>{Pe(ht,a=g,a)}),ze("setConfig",g=>{Pe(Et,c=g,c)}),ze("setProperties",g=>{Pe(He,i=null,i),Pe(He,i=g,i)}),ze("updateProperty",g=>{const v=g.property_id,w=i.findIndex(y=>y.property_id===v);w!==-1?Pe(He,i[w]=g,i):i.push(g),Pe(He,i=[...i],i)}),ze("setApartments",g=>{Pe(ct,o=null,o),Pe(ct,o=g,o)}),ze("updateApartment",g=>{const v=g.apartmentData.label,w=o.findIndex(y=>y.apartmentData.label===v);w!==-1&&Pe(ct,o[w]=g,o),Pe(ct,o=[...o],o)}),ze("setShells",g=>{Pe(_t,r=g,r)}),ft([{action:"setVisible",data:!0}]),ft([{action:"setBrowserMode",data:!0}]),ze("setTempHide",g=>{Pe(nt,n=g,n)}),ft([{action:"setApartments",data:[{apartmentData:{imgs:[{label:"Outside",url:"https://cdn.discordapp.com/attachments/1102801782452785162/1106153553283784704/integrity.webp"}],label:"Integrity Way",door:{x:269.73,y:-640.75,width:1,h:249.07,z:42.02,length:1}},apartments:{1:!0}},{apartmentData:{imgs:[{label:"Outside",url:"https://cdn.discordapp.com/attachments/1102801782452785162/1106154069426458665/integrity_1.webp"}],label:"South Rockford Drive",door:{x:-667.02,y:-1105.24,width:1,h:242.32,z:14.63,length:1}},apartments:[]}]}]),ft([{action:"setShells",data:{Garage:{imgs:[{url:"https://i.postimg.cc/QCJr7nWT/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/CMG09d6x/garage.webp",label:"Garage"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-1465633100,label:"Garage"},"House 3":{imgs:[{url:"https://i.postimg.cc/HLbdwtRd/angle1.webp",label:"Angle 1"},{url:"https://i.postimg.cc/C1YYmqpD/angle2.webp",label:"Angle 2"},{url:"https://i.postimg.cc/26wYJSCt/entry.webp",label:"Entrance"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-944672758,label:"House 3"},Store:{imgs:[{url:"https://i.postimg.cc/wBmZJbCj/room-1.webp",label:"Room 1"},{url:"https://i.postimg.cc/vBwjvtyL/room-2.webp",label:"Room 2"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-1894535671,label:"Store"},"Standard Motel":{imgs:[{url:"https://i.postimg.cc/q7PQTJZk/motel.webp",label:"Motel"}],doorOffset:{y:-2.3,z:0,heading:90,width:1.5,x:-.5},hash:150799162,label:"Standard Motel"},"Modern Hotel":{imgs:[{url:"https://i.postimg.cc/BQ7T3ZXd/angle-1.webp",label:"Angle 1"},{url:"https://i.postimg.cc/SxXWx09j/angle-2.webp",label:"Angle 2"}],doorOffset:{y:4.35,z:0,heading:179.79,width:2,x:4.98},hash:1926141467,label:"Modern Hotel"},"2 Floor House":{imgs:[{url:"https://i.postimg.cc/TPfgqKS5/bathroom.webp",label:"Bathroom"},{url:"https://i.postimg.cc/9Mf9KvcW/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/MHMQKVcN/floor2.webp",label:"Floor 2"},{url:"https://i.postimg.cc/B6wF0Mv2/kitchen.webp",label:"Kitchen"},{url:"https://i.postimg.cc/MHCjcHVT/livingroom.webp",label:"Living Room"},{url:"https://i.postimg.cc/zXhgswYR/room1.webp",label:"Room 1"},{url:"https://i.postimg.cc/fWpdq2pN/room2.webp",label:"Room 2"},{url:"https://i.postimg.cc/TP0mkRM7/room3.webp",label:"Room 3"},{url:"https://i.postimg.cc/dV8Gy2WK/room3dresser.webp",label:"Room 3 Dresser"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-1034449271,label:"2 Floor House"},Trailer:{imgs:[{url:"https://i.postimg.cc/L5xHq67P/entranceandkitchen.webp",label:"Entrance and Kitchen"},{url:"https://i.postimg.cc/05n5XcQN/main.webp",label:"Main"},{url:"https://i.postimg.cc/qM7JPyhx/room1.webp",label:"Room"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:2076152142,label:"Trailer"},"House 2":{imgs:[{url:"https://i.postimg.cc/251Brg1T/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/TwmLWmqD/hallway.webp",label:"Hallway"},{url:"https://i.postimg.cc/QMvKtS5D/kitchen.webp",label:"Kitchen"},{url:"https://i.postimg.cc/3NTyjRnb/mainarea.webp",label:"Main Area"},{url:"https://i.postimg.cc/mkyPmsnZ/room.webp",label:"Room"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-1065164752,label:"House 2"},Office:{imgs:[{url:"https://i.postimg.cc/LXddbMtP/entry.webp",label:"Entance"},{url:"https://i.postimg.cc/L5RcmB06/office.webp",label:"Office"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:444575403,label:"Office"},"Apartment 2 Unfurnished":{imgs:[{url:"https://i.postimg.cc/4404Tn6C/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/MKj6Zx5n/kitchen.webp",label:"Kitchen"},{url:"https://i.postimg.cc/qvVkzYDj/livingroom.webp",label:"Living Room"}],doorOffset:{y:-6.5,z:-1,heading:358.5,width:1.5,x:4.69},hash:-886563882,label:"Apartment 2 Unfurnished"},"House 4":{imgs:[{url:"https://i.postimg.cc/FzC7MZhw/bathroom.webp",label:"Bathroom"},{url:"https://i.postimg.cc/9XLRwWy1/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/cLnrzw25/kitchen.webp",label:"Kitchen"},{url:"https://i.postimg.cc/8CgjgsVk/livingroom.webp",label:"Living Room"},{url:"https://i.postimg.cc/CLtRJmPq/room1.webp",label:"Room 1"},{url:"https://i.postimg.cc/YSNjrkp6/room2.webp",label:"Room 2"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-775821472,label:"House 4"},"House 1":{imgs:[{url:"https://i.postimg.cc/Df96DdYt/bathroom.webp",label:"Bathroom"},{url:"https://i.postimg.cc/Pr1ykpgN/diningroom.webp",label:"Dining Room"},{url:"https://i.postimg.cc/HLk95SV7/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/CxYNMM07/kitchen.webp",label:"Kitchen"},{url:"https://i.postimg.cc/P54MCGrj/livingroom.webp",label:"Living Room"},{url:"https://i.postimg.cc/FKCgxjLC/room1.webp",label:"Room 1"},{url:"https://i.postimg.cc/sXBPHvPj/room2.webp",label:"Room 2"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:1094270725,label:"House 1"},Container:{imgs:[{url:"https://i.postimg.cc/PxK48W5q/container.webp",label:"Container"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-927040141,label:"Container"},Warehouse:{imgs:[{url:"https://i.postimg.cc/m2gnVrvq/angle1.webp",label:"Angle 1"},{url:"https://i.postimg.cc/sDHNLry2/angle2.webp",label:"Angle 2"}],doorOffset:{y:0,z:0,heading:0,width:2,x:0},hash:-2113727952,label:"Warehouse"},"Apartment Unfurnished":{imgs:[{url:"https://i.postimg.cc/3NstF2PQ/bathroom.webp",label:"Bathroom"},{url:"https://i.postimg.cc/WpdjSjQ5/bedroom.webp",label:"Bedroom"},{url:"https://i.postimg.cc/QNvDywDh/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/nhJJHmMW/kitchen.webp",label:"Kitchen"},{url:"https://i.postimg.cc/ZK3mtHY3/livingroom.webp",label:"Living Room"}],doorOffset:{y:-10.25,z:0,heading:0,width:1.5,x:1.44},hash:276092861,label:"Apartment Unfurnished"},"Apartment Furnished":{imgs:[{url:"https://i.postimg.cc/g2PYn8XR/bathroom.webp",label:"Bathroom"},{url:"https://i.postimg.cc/zBMN5gYy/Bedroom.webp",label:"Bedroom"},{url:"https://i.postimg.cc/MTXwhYNk/entry.webp",label:"Entrance"},{url:"https://i.postimg.cc/GtyCpmbq/Kitchen-and-Dining.webp",label:"Kitchen and Dining"},{url:"https://i.postimg.cc/ThvX5vwG/living-room-1.webp",label:"Living Room Angle 1"},{url:"https://i.postimg.cc/dQkkCR1S/living-room-2.webp",label:"Living Room Angle 2"}],doorOffset:{y:-10.25,z:0,heading:0,width:1.5,x:1.44},hash:1205338731,label:"Apartment Furnished"}}}]),[]}class Hn extends Ee{constructor(e){super(),Se(this,e,On,null,he,{})}}function In(t){const e=t-1;return e*e*e+1}function bt(t,{delay:e=0,duration:l=400,easing:n=zt}={}){const r=+getComputedStyle(t).opacity;return{delay:e,duration:l,easing:n,css:o=>`opacity: ${o*r}`}}function an(t,{delay:e=0,duration:l=400,easing:n=In,x:r=0,y:o=0,opacity:i=0}={}){const c=getComputedStyle(t),a=+c.opacity,f=c.transform==="none"?"":c.transform,_=a*(1-i),[p,m]=Qt(r),[g,v]=Qt(o);return{delay:e,duration:l,easing:n,css:(w,y)=>` + transform: ${f} translate(${(1-w)*p}${m}, ${(1-w)*g}${v}); + opacity: ${a-_*y}`}}function Fn(t){let e,l;return{c(){e=d("img"),Ie(e.src,l="images/property-card-img.png")||u(e,"src",l),u(e,"alt","Default Property Card Image")},m(n,r){C(n,e,r)},p:ee,d(n){n&&E(e)}}}function Bn(t){let e,l;return{c(){e=d("img"),Ie(e.src,l=t[2].extra_imgs[0]?t[2].extra_imgs[0].url:t[3][t[2].shell].imgs[0].url)||u(e,"src",l),u(e,"alt","")},m(n,r){C(n,e,r)},p(n,r){r&12&&!Ie(e.src,l=n[2].extra_imgs[0]?n[2].extra_imgs[0].url:n[3][n[2].shell].imgs[0].url)&&u(e,"src",l)},d(n){n&&E(e)}}}function rl(t){let e;return{c(){e=d("div"),e.innerHTML=` + Til salg`,u(e,"class","each-tile")},m(l,n){C(l,e,n)},d(l){l&&E(e)}}}function zn(t){var _e;let e,l,n,r,o,i,c,a,f=t[2].street?t[2].street+" - ":t[2].apartment?t[2].apartment+" - ":"",_,p,m=t[2].property_id+"",g,v,w,y=(t[2].region?t[2].region:"")+"",k,P,b,T=((_e=t[2].price)==null?void 0:_e.toLocaleString())+"",O,Q,$,A,W,K,G,Z,ie=(t[3][t[2].shell]?t[3][t[2].shell].imgs.length:0)+"",L,R,D,te,ae,le=t[2].shell+"",J,me,j,X,M,q=t[2].garage_data&&Object.keys(t[2].garage_data).length>0?"Ja":"Nej",ce,N,ne;function ue(S,H){return(S[2].extra_imgs[0]?S[2].extra_imgs[0].url:S[3][S[2].shell].imgs[0].url)?Bn:Fn}let oe=ue(t),U=oe(t),I=t[4]>=0&&t[2].for_sale&&rl();return{c(){e=d("div"),l=d("div"),U.c(),n=h(),r=d("button"),r.textContent="Se ejendom",i=h(),c=d("div"),a=d("p"),_=z(f),p=h(),g=z(m),v=h(),w=d("p"),k=z(y),P=h(),b=d("p"),O=z(T),Q=z(",-"),$=h(),A=d("div"),I&&I.c(),W=h(),K=d("div"),G=d("i"),Z=z(` + Galleri: `),L=z(ie),R=h(),D=d("div"),te=d("i"),ae=h(),J=z(le),me=h(),j=d("div"),X=d("i"),M=z(` + Garage: `),ce=z(q),u(r,"class","invisible h-0 w-fit absolute px-[1vw] py-[0.5vw] group-hover:visible group-hover:h-fit card-hover-button"),u(l,"class","w-full h-fit grid place-items-center relative"),u(a,"class","property-name"),u(w,"class","property-address"),u(b,"class","property-cost"),u(G,"class","fas fa-image"),u(K,"class","each-tile"),u(te,"class","fas fa-house-chimney"),u(D,"class","each-tile"),u(X,"class","fas fa-truck-front"),u(j,"class","each-tile"),u(A,"class","property-details"),u(c,"class","property-card-details"),u(e,"id",t[1]),u(e,"class","property-card-wrapper group")},m(S,H){C(S,e,H),s(e,l),U.m(l,null),s(l,n),s(l,r),s(e,i),s(e,c),s(c,a),s(a,_),s(a,p),s(a,g),s(c,v),s(c,w),s(w,k),s(c,P),s(c,b),s(b,O),s(b,Q),s(c,$),s(c,A),I&&I.m(A,null),s(A,W),s(A,K),s(K,G),s(K,Z),s(K,L),s(A,R),s(A,D),s(D,te),s(D,ae),s(D,J),s(A,me),s(A,j),s(j,X),s(j,M),s(j,ce),N||(ne=Y(r,"click",t[5]),N=!0)},p(S,[H]){var fe;oe===(oe=ue(S))&&U?U.p(S,H):(U.d(1),U=oe(S),U&&(U.c(),U.m(l,n))),H&4&&f!==(f=S[2].street?S[2].street+" - ":S[2].apartment?S[2].apartment+" - ":"")&&re(_,f),H&4&&m!==(m=S[2].property_id+"")&&re(g,m),H&4&&y!==(y=(S[2].region?S[2].region:"")+"")&&re(k,y),H&4&&T!==(T=((fe=S[2].price)==null?void 0:fe.toLocaleString())+"")&&re(O,T),S[4]>=0&&S[2].for_sale?I||(I=rl(),I.c(),I.m(A,W)):I&&(I.d(1),I=null),H&12&&ie!==(ie=(S[3][S[2].shell]?S[3][S[2].shell].imgs.length:0)+"")&&re(L,ie),H&4&&le!==(le=S[2].shell+"")&&re(J,le),H&4&&q!==(q=S[2].garage_data&&Object.keys(S[2].garage_data).length>0?"Ja":"Nej")&&re(ce,q),H&2&&u(e,"id",S[1])},i(S){o||Je(()=>{o=rn(r,an,{y:10,duration:250}),o.start()})},o:ee,d(S){S&&E(e),U.d(),I&&I.d(),N=!1,ne()}}}function Gn(t,e,l){let n,r;se(t,_t,f=>l(3,n=f)),se(t,ht,f=>l(4,r=f));let{id:o="property-card-1",property:i=null,selectedProperty:c=null}=e;const a=()=>l(0,c=i);return t.$$set=f=>{"id"in f&&l(1,o=f.id),"property"in f&&l(2,i=f.property),"selectedProperty"in f&&l(0,c=f.selectedProperty)},[c,o,i,n,r,a]}class Un extends Ee{constructor(e){super(),Se(this,e,Gn,zn,he,{id:1,property:2,selectedProperty:0})}}function il(t,e,l){const n=t.slice();return n[10]=e[l],n}function ol(t){let e,l,n;return{c(){e=d("label"),l=z(t[2]),n=z(":"),u(e,"for","dd")},m(r,o){C(r,e,o),s(e,l),s(e,n)},p(r,o){o&4&&re(l,r[2])},d(r){r&&E(e)}}}function Kn(t){let e;return{c(){e=d("div")},m(l,n){C(l,e,n)},p:ee,d(l){l&&E(e)}}}function qn(t){var c;let e,l=((c=t[4])==null?void 0:c.trim())!=="",n,r,o,i=l&&sl(t);return{c(){e=d("div"),i&&i.c(),n=h(),r=d("p"),o=z(t[0]),u(r,"class","selected-value-text"),u(e,"class","select-wrapper-selected-value")},m(a,f){C(a,e,f),i&&i.m(e,null),s(e,n),s(e,r),s(r,o)},p(a,f){var _;f&16&&(l=((_=a[4])==null?void 0:_.trim())!==""),l?i?i.p(a,f):(i=sl(a),i.c(),i.m(e,n)):i&&(i.d(1),i=null),f&1&&re(o,a[0])},d(a){a&&E(e),i&&i.d()}}}function sl(t){let e,l;return{c(){e=d("p"),l=z(t[4]),u(e,"class","inside-label")},m(n,r){C(n,e,r),s(e,l)},p(n,r){r&16&&re(l,n[4])},d(n){n&&E(e)}}}function al(t){let e;function l(o,i){return o[1].length<1?$n:Wn}let n=l(t),r=n(t);return{c(){e=d("div"),r.c(),u(e,"class","options-wrapper")},m(o,i){C(o,e,i),r.m(e,null)},p(o,i){n===(n=l(o))&&r?r.p(o,i):(r.d(1),r=n(o),r&&(r.c(),r.m(e,null)))},d(o){o&&E(e),r.d()}}}function Wn(t){let e,l=t[1],n=[];for(let r=0;r{p(g)};return t.$$set=g=>{"dropdownValues"in g&&l(1,r=g.dropdownValues),"label"in g&&l(2,o=g.label),"selectedValue"in g&&l(0,i=g.selectedValue),"id"in g&&l(3,c=g.id),"insideLabel"in g&&l(4,a=g.insideLabel)},[i,r,o,c,a,f,_,p,m]}class Dt extends Ee{constructor(e){super(),Se(this,e,Yn,Jn,he,{dropdownValues:1,label:2,selectedValue:0,id:3,insideLabel:4})}}function ul(t,e,l){const n=t.slice();return n[9]=e[l],n}function dl(t){var et;let e,l,n,r,o,i,c,a,f,_,p,m,g,v,w,y,k=t[0].street?t[0].street+" - ":t[0].apartment?t[0].apartment+" - ":"",P,b,T=t[0].property_id+"",O,Q,$,A=t[0].description+"",W,K,G,Z=t[0].shell,ie,L,R,D=((et=t[0].price)==null?void 0:et.toLocaleString())+"",te,ae,le,J,me,j,X,M,q,ce,N=(t[2][t[0].shell]?t[2][t[0].shell].imgs.length:0)+"",ne,ue,oe,U,I,_e=t[0].shell+"",S,H,fe,Me,Qe,De=t[0].garage_data&&Object.keys(t[0].garage_data).length>0?"Ja":"Nej",rt,$e,Oe,Ae,Fe,Ze,Ue=gl(t),ve=t[3]>=0&&t[0].for_sale&&_l(),Le=t[3]>=t[4].manageProperty&&hl(t);return{c(){e=d("div"),l=d("div"),n=d("div"),r=d("div"),o=d("div"),i=d("div"),i.innerHTML=` +

        Ejendomsinformation

        `,c=h(),a=d("div"),a.innerHTML='',f=h(),_=d("div"),p=d("img"),g=h(),v=d("div"),w=d("div"),y=d("p"),P=z(k),b=h(),O=z(T),Q=h(),$=d("p"),W=z(A),K=h(),G=d("div"),Ue.c(),ie=h(),L=d("div"),R=d("p"),te=z(D),ae=z(",-"),le=h(),J=d("button"),J.innerHTML=` +

        S\xE6t GPS

        `,me=h(),j=d("div"),ve&&ve.c(),X=h(),M=d("div"),q=d("i"),ce=z(` + Galleri: `),ne=z(N),ue=h(),oe=d("div"),U=d("i"),I=h(),S=z(_e),H=h(),fe=d("div"),Me=d("i"),Qe=z(` + Garage: `),rt=z(De),$e=h(),Le&&Le.c(),u(i,"class","heading-title-wrapper"),u(o,"class","header"),Ie(p.src,m="images/apts-bg.png")||u(p,"src",m),u(p,"alt","Apartments Background"),u(y,"class","property-name"),u($,"class","property-info"),u(G,"class","gallery-image-wrapper"),u(w,"class","left-column"),u(R,"class","title"),u(J,"class","waypoint"),u(q,"class","fas fa-image"),u(M,"class","each-tile"),u(U,"class","fas fa-house-chimney"),u(oe,"class","each-tile"),u(Me,"class","fas fa-truck-front"),u(fe,"class","each-tile"),u(j,"class","tiles-wrapper"),u(L,"class","right-column"),u(v,"class","data-details-property"),u(_,"class","large-footer-modal-body-data"),u(r,"class","modal-body large-footer-modal-body"),u(n,"class","modal-content large-footer-modal-content"),u(l,"class","modal-dialog large-footer-modal-dialog"),u(e,"class","modal large-footer-modal"),u(e,"tabindex","-1"),u(e,"aria-hidden","true")},m(x,we){C(x,e,we),s(e,l),s(l,n),s(n,r),s(r,o),s(o,i),s(o,c),s(o,a),s(r,f),s(r,_),s(_,p),s(_,g),s(_,v),s(v,w),s(w,y),s(y,P),s(y,b),s(y,O),s(w,Q),s(w,$),s($,W),s(w,K),s(w,G),Ue.m(G,null),s(v,ie),s(v,L),s(L,R),s(R,te),s(R,ae),s(L,le),s(L,J),s(L,me),s(L,j),ve&&ve.m(j,null),s(j,X),s(j,M),s(M,q),s(M,ce),s(M,ne),s(j,ue),s(j,oe),s(oe,U),s(oe,I),s(oe,S),s(j,H),s(j,fe),s(fe,Me),s(fe,Qe),s(fe,rt),s(r,$e),Le&&Le.m(r,null),Ae=!0,Fe||(Ze=[Y(a,"click",t[6]),Y(J,"click",t[7])],Fe=!0)},p(x,we){var Ke;(!Ae||we&1)&&k!==(k=x[0].street?x[0].street+" - ":x[0].apartment?x[0].apartment+" - ":"")&&re(P,k),(!Ae||we&1)&&T!==(T=x[0].property_id+"")&&re(O,T),(!Ae||we&1)&&A!==(A=x[0].description+"")&&re(W,A),we&1&&he(Z,Z=x[0].shell)?(Ue.d(1),Ue=gl(x),Ue.c(),Ue.m(G,null)):Ue.p(x,we),(!Ae||we&1)&&D!==(D=((Ke=x[0].price)==null?void 0:Ke.toLocaleString())+"")&&re(te,D),x[3]>=0&&x[0].for_sale?ve||(ve=_l(),ve.c(),ve.m(j,X)):ve&&(ve.d(1),ve=null),(!Ae||we&5)&&N!==(N=(x[2][x[0].shell]?x[2][x[0].shell].imgs.length:0)+"")&&re(ne,N),(!Ae||we&1)&&_e!==(_e=x[0].shell+"")&&re(S,_e),(!Ae||we&1)&&De!==(De=x[0].garage_data&&Object.keys(x[0].garage_data).length>0?"Ja":"Nej")&&re(rt,De),x[3]>=x[4].manageProperty?Le?Le.p(x,we):(Le=hl(x),Le.c(),Le.m(r,null)):Le&&(Le.d(1),Le=null)},i(x){Ae||(Je(()=>{!Ae||(Oe||(Oe=mt(e,bt,{duration:100},!0)),Oe.run(1))}),Ae=!0)},o(x){Oe||(Oe=mt(e,bt,{duration:100},!1)),Oe.run(0),Ae=!1},d(x){x&&E(e),Ue.d(x),ve&&ve.d(),Le&&Le.d(),x&&Oe&&Oe.end(),Fe=!1,We(Ze)}}}function pl(t){let e,l;return{c(){e=d("img"),Ie(e.src,l=t[9].url)||u(e,"src",l),u(e,"alt","Detaljer p\xE5 den valgte ejendom")},m(n,r){C(n,e,r)},p:ee,d(n){n&&E(e)}}}function ml(t){let e,l=t[5](),n=[];for(let r=0;r
        + Til salg`,u(e,"class","each-tile")},m(l,n){C(l,e,n)},d(l){l&&E(e)}}}function hl(t){let e,l,n,r;return{c(){e=d("div"),l=d("button"),l.textContent="Administrer ejendom",u(e,"class","large-footer-modal-footer")},m(o,i){C(o,e,i),s(e,l),n||(r=Y(l,"click",t[8]),n=!0)},p:ee,d(o){o&&E(e),n=!1,r()}}}function Qn(t){let e,l,n=t[0]&&dl(t);return{c(){n&&n.c(),e=Ye()},m(r,o){n&&n.m(r,o),C(r,e,o),l=!0},p(r,[o]){r[0]?n?(n.p(r,o),o&1&&V(n,1)):(n=dl(r),n.c(),V(n,1),n.m(e.parentNode,e)):n&&(je(),F(n,1,1,()=>{n=null}),Ne())},i(r){l||(V(n),l=!0)},o(r){F(n),l=!1},d(r){n&&n.d(r),r&&E(e)}}}function Zn(t,e,l){let n,r,o;se(t,_t,m=>l(2,n=m)),se(t,ht,m=>l(3,r=m)),se(t,Et,m=>l(4,o=m));let{selectedProperty:i=null,manageProperty:c=!1}=e;function a(){let m=i.extra_imgs;const g=i.shell;return m=[...m,...n[g].imgs],m}const f=()=>l(0,i=null),_=()=>Ve("setWaypoint",i.door_data),p=()=>l(1,c=!0);return t.$$set=m=>{"selectedProperty"in m&&l(0,i=m.selectedProperty),"manageProperty"in m&&l(1,c=m.manageProperty)},[i,c,n,r,o,a,f,_,p]}class Xn extends Ee{constructor(e){super(),Se(this,e,Zn,Qn,he,{selectedProperty:0,manageProperty:1})}}function bl(t,e,l){const n=t.slice();return n[10]=e[l],n}function vl(t){let e,l,n;return{c(){e=d("label"),l=z(t[2]),n=z(":"),u(e,"for","dd"),u(e,"class","svelte-cmskyr")},m(r,o){C(r,e,o),s(e,l),s(e,n)},p(r,o){o&4&&re(l,r[2])},d(r){r&&E(e)}}}function xn(t){let e;return{c(){e=d("div")},m(l,n){C(l,e,n)},p:ee,d(l){l&&E(e)}}}function er(t){var c;let e,l=((c=t[4])==null?void 0:c.trim())!=="",n,r,o,i=l&&wl(t);return{c(){e=d("div"),i&&i.c(),n=h(),r=d("p"),o=z(t[0]),u(r,"class","form-selected-value-text svelte-cmskyr"),u(e,"class","form-select-wrapper-selected-value svelte-cmskyr")},m(a,f){C(a,e,f),i&&i.m(e,null),s(e,n),s(e,r),s(r,o)},p(a,f){var _;f&16&&(l=((_=a[4])==null?void 0:_.trim())!==""),l?i?i.p(a,f):(i=wl(a),i.c(),i.m(e,n)):i&&(i.d(1),i=null),f&1&&re(o,a[0])},d(a){a&&E(e),i&&i.d()}}}function wl(t){let e,l;return{c(){e=d("p"),l=z(t[4]),u(e,"class","form-inside-label svelte-cmskyr")},m(n,r){C(n,e,r),s(e,l)},p(n,r){r&16&&re(l,n[4])},d(n){n&&E(e)}}}function yl(t){let e;function l(o,i){return o[1].length<1?lr:tr}let n=l(t),r=n(t);return{c(){e=d("div"),r.c(),u(e,"class","form-options-wrapper svelte-cmskyr")},m(o,i){C(o,e,i),r.m(e,null)},p(o,i){n===(n=l(o))&&r?r.p(o,i):(r.d(1),r=n(o),r&&(r.c(),r.m(e,null)))},d(o){o&&E(e),r.d()}}}function tr(t){let e,l=t[1],n=[];for(let r=0;r{p(g)};return t.$$set=g=>{"dropdownValues"in g&&l(1,r=g.dropdownValues),"label"in g&&l(2,o=g.label),"selectedValue"in g&&l(0,i=g.selectedValue),"id"in g&&l(3,c=g.id),"insideLabel"in g&&l(4,a=g.insideLabel)},[i,r,o,c,a,f,_,p,m]}class Wt extends Ee{constructor(e){super(),Se(this,e,rr,nr,he,{dropdownValues:1,label:2,selectedValue:0,id:3,insideLabel:4})}}function ir(t){let e,l,n,r,o,i,c,a,f;return{c(){e=d("div"),l=d("i"),r=h(),o=d("p"),i=z(t[3]),c=h(),a=d("p"),f=z(t[0]),u(l,"class",n="fas fa-circle "+(t[1]?"green":"red")+" indicator svelte-yzp4m3"),u(o,"class","left-value svelte-yzp4m3"),u(a,"class","right-value svelte-yzp4m3"),u(e,"class","set-not-set-wrapper svelte-yzp4m3"),u(e,"id",t[2])},m(_,p){C(_,e,p),s(e,l),s(e,r),s(e,o),s(o,i),s(e,c),s(e,a),s(a,f)},p(_,[p]){p&2&&n!==(n="fas fa-circle "+(_[1]?"green":"red")+" indicator svelte-yzp4m3")&&u(l,"class",n),p&8&&re(i,_[3]),p&1&&re(f,_[0]),p&4&&u(e,"id",_[2])},i:ee,o:ee,d(_){_&&E(e)}}}function or(t,e,l){let{leftValue:n="Sat",rightValue:r="",good:o=!0,id:i="status-indicator"}=e,c="";return jt(()=>{(r==null?void 0:r.trim())!==""?l(3,c=n+": "):l(3,c=n)}),t.$$set=a=>{"leftValue"in a&&l(4,n=a.leftValue),"rightValue"in a&&l(0,r=a.rightValue),"good"in a&&l(1,o=a.good),"id"in a&&l(2,i=a.id)},[r,o,i,c,n]}class vt extends Ee{constructor(e){super(),Se(this,e,or,ir,he,{leftValue:4,rightValue:0,good:1,id:2})}}function Ll(t,e,l){const n=t.slice();return n[39]=e[l],n[38]=l,n}function Sl(t){let e,l,n,r,o,i,c,a,f;return o=new vt({props:{leftValue:t[1].for_sale?"Set":"Not Set",rightValue:t[13],good:t[1].for_sale}}),a=new Wt({props:{dropdownValues:t[12],label:"",insideLabel:"Change: ",selectedValue:t[13]}}),a.$on("selected-dropdown",t[22]),{c(){e=d("div"),l=d("p"),l.textContent="S\xE6lg ejendom",n=h(),r=d("div"),ge(o.$$.fragment),i=h(),c=d("div"),ge(a.$$.fragment),u(l,"class","label"),Ge(c,"margin-left","0.5vw"),u(r,"class","action-row"),u(e,"id","sell-property"),u(e,"class","form-row-wrapper")},m(_,p){C(_,e,p),s(e,l),s(e,n),s(e,r),de(o,r,null),s(r,i),s(r,c),de(a,c,null),f=!0},p(_,p){const m={};p[0]&2&&(m.leftValue=_[1].for_sale?"Set":"Not Set"),p[0]&2&&(m.good=_[1].for_sale),o.$set(m)},i(_){f||(V(o.$$.fragment,_),V(a.$$.fragment,_),f=!0)},o(_){F(o.$$.fragment,_),F(a.$$.fragment,_),f=!1},d(_){_&&E(e),pe(o),pe(a)}}}function El(t){var p,m;let e,l,n,r,o,i,c,a,f,_;return o=new vt({props:{leftValue:((p=t[2])==null?void 0:p.trim())!==""?"Sat":"Ikke sat",rightValue:"",good:((m=t[2])==null?void 0:m.trim())!==""}}),{c(){e=d("div"),l=d("p"),l.textContent="F\xE6rdigg\xF8r salg",n=h(),r=d("div"),ge(o.$$.fragment),i=h(),c=d("input"),u(l,"class","label"),u(c,"type","text"),u(c,"placeholder","ID: 34343434343"),Ge(c,"width","10vw"),u(r,"class","action-row"),u(e,"id","finalize-sell-property"),u(e,"class","form-row-wrapper")},m(g,v){C(g,e,v),s(e,l),s(e,n),s(e,r),de(o,r,null),s(r,i),s(r,c),be(c,t[2]),a=!0,f||(_=[Y(c,"input",t[23]),Y(c,"keyup",t[24])],f=!0)},p(g,v){var y,k;const w={};v[0]&4&&(w.leftValue=((y=g[2])==null?void 0:y.trim())!==""?"Sat":"Ikke sat"),v[0]&4&&(w.good=((k=g[2])==null?void 0:k.trim())!==""),o.$set(w),v[0]&4&&c.value!==g[2]&&be(c,g[2])},i(g){a||(V(o.$$.fragment,g),a=!0)},o(g){F(o.$$.fragment,g),a=!1},d(g){g&&E(e),pe(o),f=!1,We(_)}}}function Al(t){let e,l,n,r;return{c(){e=d("div"),l=d("img"),r=h(),Ie(l.src,n=t[39].url)||u(l,"src",n),u(l,"alt","")},m(o,i){C(o,e,i),s(e,l),s(e,r)},p(o,i){i[0]&64&&!Ie(l.src,n=o[39].url)&&u(l,"src",n)},d(o){o&&E(e)}}}function Cl(t){let e,l,n;return{c(){e=d("button"),e.textContent="Slet ejendom",u(e,"class","delete-button")},m(r,o){C(r,e,o),l||(n=Y(e,"click",t[20]),l=!0)},p:ee,d(r){r&&E(e),l=!1,n()}}}function sr(t){let e,l,n,r,o,i,c,a,f,_,p,m,g,v,w,y,k,P,b,T,O,Q,$,A,W,K,G,Z,ie,L,R,D,te,ae,le,J,me,j,X,M,q,ce,N,ne,ue,oe,U,I,_e,S,H,fe,Me,Qe,De,rt,$e,Oe,Ae,Fe,Ze,Ue,ve,Le,et,x,we,Ke,wt,Nt,$t,ye=t[9]>=t[10].changePropertyForSale&&Sl(t),ke=t[9]>=t[10].sellProperty&&t[1].for_sale==1&&El(t);te=new Wt({props:{dropdownValues:Object.keys(t[11]),label:"",id:"manage-dd-shell",selectedValue:t[5],insideLabel:"Type: "}}),te.$on("selected-dropdown",t[29]);let it=t[6],Ce=[];for(let B=0;B=t[10].deleteProperty&&Cl(t);return{c(){e=d("div"),l=d("div"),n=d("div"),r=d("div"),o=d("div"),i=d("div"),i.innerHTML=` +

        Administrer ejendom

        `,c=h(),a=d("div"),a.innerHTML='',f=h(),_=d("div"),p=d("div"),m=d("div"),m.innerHTML=`

        Nuv\xE6rrende beskrivelse

        +

        Kan \xE6ndres efter oprettelse!

        `,g=h(),v=d("div"),ye&&ye.c(),w=h(),ke&&ke.c(),y=h(),k=d("div"),P=d("p"),P.textContent="Administrer beskrivelse",b=h(),T=d("div"),O=d("textarea"),Q=h(),$=d("div"),A=d("p"),A.textContent="Administrer pris",W=h(),K=d("div"),G=d("input"),Z=h(),ie=d("div"),L=d("p"),L.textContent="Administrer interi\xF8r",R=h(),D=d("div"),ge(te.$$.fragment),ae=h(),le=d("div"),J=d("p"),J.textContent="Tilf\xF8j billede",me=h(),j=d("div"),X=d("input"),M=h(),q=d("input"),ce=h(),N=d("button"),N.textContent="Tilf\xF8j",ne=h(),ue=d("div");for(let B=0;B=B[10].changePropertyForSale?ye?(ye.p(B,Re),Re[0]&1536&&V(ye,1)):(ye=Sl(B),ye.c(),V(ye,1),ye.m(v,w)):ye&&(je(),F(ye,1,1,()=>{ye=null}),Ne()),B[9]>=B[10].sellProperty&&B[1].for_sale==1?ke?(ke.p(B,Re),Re[0]&1538&&V(ke,1)):(ke=El(B),ke.c(),V(ke,1),ke.m(v,y)):ke&&(je(),F(ke,1,1,()=>{ke=null}),Ne()),Re[0]&8&&be(O,B[3]),Re[0]&16&&G.value!==B[4]&&be(G,B[4]);const tt={};if(Re[0]&2048&&(tt.dropdownValues=Object.keys(B[11])),Re[0]&32&&(tt.selectedValue=B[5]),te.$set(tt),Re[0]&128&&X.value!==B[7]&&be(X,B[7]),Re[0]&256&&q.value!==B[8]&&be(q,B[8]),Re[0]&64){it=B[6];let Be;for(Be=0;Be=B[10].deleteProperty?Te?Te.p(B,Re):(Te=Cl(B),Te.c(),Te.m(we,null)):Te&&(Te.d(1),Te=null)},i(B){wt||(V(ye),V(ke),V(te.$$.fragment,B),V(H.$$.fragment,B),V(Ze.$$.fragment,B),Je(()=>{!wt||(Ke||(Ke=mt(e,bt,{duration:100},!0)),Ke.run(1))}),wt=!0)},o(B){F(ye),F(ke),F(te.$$.fragment,B),F(H.$$.fragment,B),F(Ze.$$.fragment,B),Ke||(Ke=mt(e,bt,{duration:100},!1)),Ke.run(0),wt=!1},d(B){B&&E(e),ye&&ye.d(),ke&&ke.d(),pe(te),qe(Ce,B),pe(H),pe(Ze),Te&&Te.d(),B&&Ke&&Ke.end(),Nt=!1,We($t)}}}function ar(t,e,l){var ce;let n,r,o,i,c;se(t,nt,N=>l(35,n=N)),se(t,He,N=>l(36,r=N)),se(t,ht,N=>l(9,o=N)),se(t,Et,N=>l(10,i=N)),se(t,_t,N=>l(11,c=N));const a=Kt();let{manageProperty:f=!1,selectedProperty:_=null}=e;const p=r.findIndex(N=>N.property_id===_.property_id);let m=["Til salg","Ikke til salg"],g=_.for_sale?m[0]:m[1];function v(N){const ne=N===m[0];Ve("updatePropertyData",{type:"UpdateForSale",property_id:_.property_id,data:{forsale:ne}}),Pe(He,r[p].for_sale=ne?1:0,r),l(1,_.for_sale=ne?1:0,_)}let w=_.owner?_.owner:"",y=(ce=_.description)!=null?ce:"",k=_.price,P=_.shell;function b(N,ne,ue,oe){Ve("updatePropertyData",{type:N,property_id:_.property_id,data:ne}),Pe(He,r[p][ue]=oe,r),l(1,_[ue]=oe,_)}let T=_.door_data.length>0,O=_.garage_data?!!_.garage_data.x:!1;function Q(N){Ve("startZonePlacement",{type:N,property_id:_.property_id}).then(()=>{Pe(nt,n=!0,n)})}let $=_.extra_imgs,A="",W="";function K(){l(6,$=[...$,{label:A,url:W}]),l(7,A=""),l(8,W=""),b("UpdateImages",{imgs:$},"extra_imgs",$)}function G(){a("delete-property",_)}const Z=()=>l(0,f=!1),ie=N=>v(N.detail);function L(){w=this.value,l(2,w)}const R=()=>b("UpdateOwner",{targetSrc:w},"owner",w);function D(){y=this.value,l(3,y)}const te=()=>b("UpdateDescription",{description:y},"description",y);function ae(){k=this.value,l(4,k)}const le=()=>b("UpdatePrice",{price:k},"price",k),J=N=>{l(5,P=N.detail),b("UpdateShell",{shell:P},"shell",P)};function me(){A=this.value,l(7,A)}function j(){W=this.value,l(8,W)}const X=()=>Q("door"),M=()=>Q("garage"),q=()=>b("UpdateGarage",{},"garage_data",null);return t.$$set=N=>{"manageProperty"in N&&l(0,f=N.manageProperty),"selectedProperty"in N&&l(1,_=N.selectedProperty)},[f,_,w,y,k,P,$,A,W,o,i,c,m,g,v,b,T,O,Q,K,G,Z,ie,L,R,D,te,ae,le,J,me,j,X,M,q]}class cr extends Ee{constructor(e){super(),Se(this,e,ar,sr,he,{manageProperty:0,selectedProperty:1},null,[-1,-1])}}function Rl(t,e,l){const n=t.slice();return n[27]=e[l],n[29]=l,n}function Tl(t){let e,l,n;function r(i){t[17](i)}let o={id:"property-card-"+t[29],property:t[27]};return t[4]!==void 0&&(o.selectedProperty=t[4]),e=new Un({props:o}),lt.push(()=>gt(e,"selectedProperty",r)),{c(){ge(e.$$.fragment)},m(i,c){de(e,i,c),n=!0},p(i,c){const a={};c&64&&(a.property=i[27]),!l&&c&16&&(l=!0,a.selectedProperty=i[4],pt(()=>l=!1)),e.$set(a)},i(i){n||(V(e.$$.fragment,i),n=!0)},o(i){F(e.$$.fragment,i),n=!1},d(i){pe(e,i)}}}function Vl(t){let e,l,n=t[6],r=[];for(let i=0;iF(r[i],1,1,()=>{r[i]=null});return{c(){e=d("div");for(let i=0;igt(e,"manageProperty",r)),e.$on("delete-property",t[21]),{c(){ge(e.$$.fragment)},m(i,c){de(e,i,c),n=!0},p(i,c){const a={};c&16&&(a.selectedProperty=i[4]),!l&&c&32&&(l=!0,a.manageProperty=i[5],pt(()=>l=!1)),e.$set(a)},i(i){n||(V(e.$$.fragment,i),n=!0)},o(i){F(e.$$.fragment,i),n=!1},d(i){pe(e,i)}}}function ur(t){let e,l,n,r;function o(a){t[18](a)}function i(a){t[19](a)}let c={};return t[4]!==void 0&&(c.selectedProperty=t[4]),t[5]!==void 0&&(c.manageProperty=t[5]),e=new Xn({props:c}),lt.push(()=>gt(e,"selectedProperty",o)),lt.push(()=>gt(e,"manageProperty",i)),{c(){ge(e.$$.fragment)},m(a,f){de(e,a,f),r=!0},p(a,f){const _={};!l&&f&16&&(l=!0,_.selectedProperty=a[4],pt(()=>l=!1)),!n&&f&32&&(n=!0,_.manageProperty=a[5],pt(()=>n=!1)),e.$set(_)},i(a){r||(V(e.$$.fragment,a),r=!0)},o(a){F(e.$$.fragment,a),r=!1},d(a){pe(e,a)}}}function dr(t){let e,l,n,r,o,i,c,a,f,_,p,m,g,v,w,y,k,P,b,T,O,Q,$,A,W,K,G,Z,ie=t[7],L,R,D,te,ae,le;O=new Dt({props:{dropdownValues:t[8],label:"",selectedValue:t[1],id:"high-low-dd"}}),O.$on("selected-dropdown",t[14]),A=new Dt({props:{dropdownValues:t[9],label:"",selectedValue:t[2],id:"for-sale-dd"}}),A.$on("selected-dropdown",t[15]),G=new Dt({props:{dropdownValues:t[10],label:"",selectedValue:t[3],insideLabel:"Type: ",id:"type-dd"}}),G.$on("selected-dropdown",t[16]);let J=Vl(t);const me=[ur,fr],j=[];function X(M,q){return M[4]&&!M[5]?0:M[4]&&M[5]?1:-1}return~(R=X(t))&&(D=j[R]=me[R](t)),{c(){e=d("div"),l=d("div"),n=d("img"),o=h(),i=d("div"),c=d("p"),c.textContent="Find din n\xE6ste dr\xF8mmebolig!",a=h(),f=d("p"),f.textContent="Alt fra huse og lejigheder, til garager, varehuse og meget mere!",_=h(),p=d("div"),m=d("input"),g=h(),v=d("i"),w=h(),y=d("div"),k=d("p"),k.textContent="Alle ejendomme p\xE5 markedet",P=h(),b=d("div"),T=d("div"),ge(O.$$.fragment),Q=h(),$=d("div"),ge(A.$$.fragment),W=h(),K=d("div"),ge(G.$$.fragment),Z=h(),J.c(),L=h(),D&&D.c(),Ie(n.src,r="images/apts-bg.png")||u(n,"src",r),u(n,"alt","Apartments Background"),u(f,"class","light-text"),u(m,"type","text"),u(m,"placeholder","S\xF8g blandt ejendomme"),u(v,"class","fas fa-magnifying-glass"),u(p,"class","search-bar"),u(i,"class","search-data"),u(l,"class","search-wrapper"),u(k,"class","heading"),Ge($,"margin-left","7vw"),Ge(K,"margin-left","7vw"),u(b,"class","filters-wrapper"),u(y,"class","properties-heading-wrapper"),u(e,"class","properties-base")},m(M,q){C(M,e,q),s(e,l),s(l,n),s(l,o),s(l,i),s(i,c),s(i,a),s(i,f),s(i,_),s(i,p),s(p,m),be(m,t[0]),s(p,g),s(p,v),s(e,w),s(e,y),s(y,k),s(y,P),s(y,b),s(b,T),de(O,T,null),s(b,Q),s(b,$),de(A,$,null),s(b,W),s(b,K),de(G,K,null),s(e,Z),J.m(e,null),s(e,L),~R&&j[R].m(e,null),te=!0,ae||(le=Y(m,"input",t[13]),ae=!0)},p(M,[q]){q&1&&m.value!==M[0]&&be(m,M[0]);const ce={};q&2&&(ce.selectedValue=M[1]),O.$set(ce);const N={};q&4&&(N.selectedValue=M[2]),A.$set(N);const ne={};q&8&&(ne.selectedValue=M[3]),G.$set(ne),q&128&&he(ie,ie=M[7])?(je(),F(J,1,1,ee),Ne(),J=Vl(M),J.c(),V(J,1),J.m(e,L)):J.p(M,q);let ue=R;R=X(M),R===ue?~R&&j[R].p(M,q):(D&&(je(),F(j[ue],1,1,()=>{j[ue]=null}),Ne()),~R?(D=j[R],D?D.p(M,q):(D=j[R]=me[R](M),D.c()),V(D,1),D.m(e,null)):D=null)},i(M){te||(V(O.$$.fragment,M),V(A.$$.fragment,M),V(G.$$.fragment,M),V(J),V(D),te=!0)},o(M){F(O.$$.fragment,M),F(A.$$.fragment,M),F(G.$$.fragment,M),F(J),F(D),te=!1},d(M){M&&E(e),pe(O),pe(A),pe(G),J.d(M),~R&&j[R].d(),ae=!1,le()}}}function pr(t,e,l){let n;se(t,He,L=>l(7,n=L));const r=["H\xF8j til lav","Lav til h\xF8j"];let o=r[0];const i=["Til salg","Alle ejendomme"];let c=i[0];const a=["Huse","Lejligheder"];let f=a[0],_=null,p=!1,m="",g=[];He.subscribe(L=>{L&&v()});function v(){l(6,g=[]),setTimeout(()=>{let L=n;L=y(L),L=P(L),L=k(L),l(6,g=w(L))},1)}function w(L){return f===a[1]||(L=L.filter(R=>!R.apartment)),L}function y(L){return c===i[1]||(L=L.filter(R=>R.for_sale)),L}function k(L){return m.length<1||(L=L.filter(R=>{var j;const D=R.street?R.street.toLowerCase().includes(m.toLowerCase()):!1,te=R.region?R.region.toLowerCase().includes(m.toLowerCase()):!1,ae=R.description.toLowerCase().includes(m.toLowerCase()),le=R.shell.toLowerCase().includes(m.toLowerCase()),J=R.apartment?R.apartment.toLowerCase().includes(m.toLowerCase()):!1,me=(j=R.property_id.toString().includes(m.toLowerCase()))!=null?j:!1;return D||ae||le||te||J||me})),L}function P(L){return o===r[1]?L=L.sort((R,D)=>R.price-D.price):L=L.sort((R,D)=>D.price-R.price),L}function b(L,R){L==="high-low"&&l(1,o=R),L==="for-sale"&&l(2,c=R),L==="type"&&l(3,f=R),v()}function T(L){const R=L.detail;if(R==null)return;Ve("updatePropertyData",{type:"DeleteProperty",property_id:_.property_id,data:{}});const D=n.findIndex(te=>te.property_id===R.property_id);n.splice(D,1),l(5,p=!1),l(4,_=null),v()}function O(){m=this.value,l(0,m)}const Q=L=>b("high-low",L.detail),$=L=>b("for-sale",L.detail),A=L=>b("type",L.detail);function W(L){_=L,l(4,_)}function K(L){_=L,l(4,_)}function G(L){p=L,l(5,p)}function Z(L){p=L,l(5,p)}const ie=L=>T(L);return t.$$.update=()=>{t.$$.dirty&1&&(m||(m==null?void 0:m.trim())==="")&&v()},[m,o,c,f,_,p,g,n,r,i,a,b,T,O,Q,$,A,W,K,G,Z,ie]}class mr extends Ee{constructor(e){super(),Se(this,e,pr,dr,he,{})}}function gr(t){let e,l,n,r,o,i,c=t[4].label+"",a,f,_,p,m,g,v,w,y,k=(t[3].length||0)+"",P,b,T,O,Q,$,A;return{c(){var W,K;e=d("div"),l=d("img"),r=h(),o=d("div"),i=d("p"),a=z(c),f=h(),_=d("p"),_.textContent="Legion Square",p=h(),m=d("div"),g=d("img"),w=h(),y=d("p"),P=z(k),b=z(" Globale lejere"),T=h(),O=d("button"),O.textContent="V\xE6lg ejendom",Ie(l.src,n=(K=(W=t[4].imgs)==null?void 0:W[0])==null?void 0:K.url)||u(l,"src",n),u(l,"alt","Apartment Thumbnail"),u(i,"class","heading"),u(_,"class","info"),Ie(g.src,v="images/user-location-pin.png")||u(g,"src",v),u(g,"alt","User Location Icon"),u(m,"class","location-tenants-info"),u(O,"class","select-apt-button"),u(o,"class","details"),u(e,"class","apartment-card-wrapper"),u(e,"id",t[2])},m(W,K){C(W,e,K),s(e,l),s(e,r),s(e,o),s(o,i),s(i,a),s(o,f),s(o,_),s(o,p),s(o,m),s(m,g),s(m,w),s(m,y),s(y,P),s(y,b),s(o,T),s(o,O),$||(A=Y(e,"click",t[7]),$=!0)},p(W,[K]){var G,Z;K&16&&!Ie(l.src,n=(Z=(G=W[4].imgs)==null?void 0:G[0])==null?void 0:Z.url)&&u(l,"src",n),K&16&&c!==(c=W[4].label+"")&&re(a,c),K&8&&k!==(k=(W[3].length||0)+"")&&re(P,k),K&4&&u(e,"id",W[2])},i(W){Q||Je(()=>{Q=rn(e,an,{y:10,duration:250}),Q.start()})},o:ee,d(W){W&&E(e),$=!1,A()}}}function _r(t,e,l){let n;se(t,He,p=>l(6,n=p));let{selectedApartment:r=null}=e,{apartment:o=null}=e,{id:i="apt-card-0"}=e,c,a=[],f;const _=()=>l(0,r=o);return t.$$set=p=>{"selectedApartment"in p&&l(0,r=p.selectedApartment),"apartment"in p&&l(1,o=p.apartment),"id"in p&&l(2,i=p.id)},t.$$.update=()=>{if(t.$$.dirty&2&&l(4,c=(o==null?void 0:o.apartmentData)||{}),t.$$.dirty&106&&o){l(5,f=o==null?void 0:o.apartmentData.label);const p=n.filter(m=>m.apartment===f).map(m=>m.owner);p.length!==0&&p[0]!==void 0?Ve("getNames",p).then(m=>{l(3,a=m),l(4,c.currentTenants=a.length,c)}):l(4,c.currentTenants=0,c)}},[r,o,i,a,c,f,n,_]}class hr extends Ee{constructor(e){super(),Se(this,e,_r,gr,he,{selectedApartment:0,apartment:1,id:2})}}function jl(t,e,l){const n=t.slice();return n[10]=e[l],n}function Nl(t){let e,l,n,r,o,i,c,a,f,_,p,m,g,v,w,y,k,P=t[0].apartmentData.label+"",b,T,O,Q=t[2].length.toLocaleString()+"",$,A,W,K,G,Z,ie,L,R,D,te,ae,le,J,me,j,X,M,q,ce,N,ne,ue,oe=t[2],U=[];for(let I=0;I
        +

        Lejlighedsinformation

        `,c=h(),a=d("div"),a.innerHTML='',f=h(),_=d("div"),p=d("div"),m=d("img"),v=h(),w=d("div"),y=d("div"),k=d("p"),b=z(P),T=h(),O=d("p"),$=z(Q),A=z(" lejere"),W=h(),K=d("div"),G=d("div"),Z=d("input"),ie=h(),L=d("i"),R=h(),D=d("button"),D.innerHTML='S\xE6t GPS',te=h(),ae=d("hr"),le=h(),J=d("div");for(let I=0;I{!N||(ce||(ce=mt(e,bt,{duration:100},!0)),ce.run(1))}),N=!0)},o(I){ce||(ce=mt(e,bt,{duration:100},!1)),ce.run(0),N=!1},d(I){I&&E(e),qe(U,I),I&&ce&&ce.end(),ne=!1,We(ue)}}}function Ml(t){let e,l,n,r,o,i=t[10]+"",c,a,f,_;return{c(){e=d("div"),l=d("div"),n=h(),r=d("div"),o=d("p"),c=z(i),a=h(),f=d("p"),f.textContent="Nuv\xE6rrende lejer",_=h(),u(l,"class","img-wrapper"),u(o,"class","tenant-name"),u(f,"class","tenant-status"),u(r,"class","tenant-details"),u(e,"class","tenant-row")},m(p,m){C(p,e,m),s(e,l),s(e,n),s(e,r),s(r,o),s(o,c),s(r,a),s(r,f),s(e,_)},p(p,m){m&4&&i!==(i=p[10]+"")&&re(c,i)},d(p){p&&E(e)}}}function br(t){let e,l,n=t[0]!==null&&Nl(t);return{c(){n&&n.c(),e=Ye()},m(r,o){n&&n.m(r,o),C(r,e,o),l=!0},p(r,[o]){r[0]!==null?n?(n.p(r,o),o&1&&V(n,1)):(n=Nl(r),n.c(),V(n,1),n.m(e.parentNode,e)):n&&(je(),F(n,1,1,()=>{n=null}),Ne())},i(r){l||(V(n),l=!0)},o(r){F(n),l=!1},d(r){n&&n.d(r),r&&E(e)}}}function vr(t,e,l){let n;se(t,He,g=>l(9,n=g));let{selectedApartment:r=null}=e,o=[],i=[],c="",a=null;jt(()=>{const g=r.apartmentData.label,v=n.filter(w=>w.apartment===g).map(w=>w.owner);if(v.length===0||v[0]===void 0){l(2,i=[]);return}Ve("getNames",v).then(w=>{l(5,o=w)})});function f(){Ve("addTenantToApartment",{apartment:r.apartmentData.label,targetSrc:a}),l(0,r=null)}const _=()=>l(0,r=null);function p(){c=this.value,l(1,c)}function m(){a=this.value,l(3,a)}return t.$$set=g=>{"selectedApartment"in g&&l(0,r=g.selectedApartment)},t.$$.update=()=>{t.$$.dirty&34&&(c.length>0?l(2,i=o.filter(g=>g.toLowerCase().includes(c.toLowerCase()))||[]):l(2,i=o||[]))},[r,c,i,a,f,o,_,p,m]}class wr extends Ee{constructor(e){super(),Se(this,e,vr,br,he,{selectedApartment:0})}}function Dl(t,e,l){const n=t.slice();return n[4]=e[l],n[6]=l,n}function Ol(t){let e,l,n;function r(i){t[2](i)}let o={apartment:t[4],id:"apt-card-"+t[6]};return t[0]!==void 0&&(o.selectedApartment=t[0]),e=new hr({props:o}),lt.push(()=>gt(e,"selectedApartment",r)),{c(){ge(e.$$.fragment)},m(i,c){de(e,i,c),n=!0},p(i,c){const a={};c&2&&(a.apartment=i[4]),!l&&c&1&&(l=!0,a.selectedApartment=i[0],pt(()=>l=!1)),e.$set(a)},i(i){n||(V(e.$$.fragment,i),n=!0)},o(i){F(e.$$.fragment,i),n=!1},d(i){pe(e,i)}}}function Hl(t){let e,l,n=t[1],r=[];for(let i=0;iF(r[i],1,1,()=>{r[i]=null});return{c(){e=d("div");for(let i=0;igt(e,"selectedApartment",r)),{c(){ge(e.$$.fragment)},m(i,c){de(e,i,c),n=!0},p(i,c){const a={};!l&&c&1&&(l=!0,a.selectedApartment=i[0],pt(()=>l=!1)),e.$set(a)},i(i){n||(V(e.$$.fragment,i),n=!0)},o(i){F(e.$$.fragment,i),n=!1},d(i){pe(e,i)}}}function yr(t){let e,l,n,r=t[1],o,i,c=Hl(t),a=t[0]&&Il(t);return{c(){e=d("div"),l=d("div"),l.textContent="Alle lejligheder",n=h(),c.c(),o=h(),a&&a.c(),u(l,"class","heading"),u(e,"class","apartments-base")},m(f,_){C(f,e,_),s(e,l),s(e,n),c.m(e,null),s(e,o),a&&a.m(e,null),i=!0},p(f,[_]){_&2&&he(r,r=f[1])?(je(),F(c,1,1,ee),Ne(),c=Hl(f),c.c(),V(c,1),c.m(e,o)):c.p(f,_),f[0]?a?(a.p(f,_),_&1&&V(a,1)):(a=Il(f),a.c(),V(a,1),a.m(e,null)):a&&(je(),F(a,1,1,()=>{a=null}),Ne())},i(f){i||(V(c),V(a),i=!0)},o(f){F(c),F(a),i=!1},d(f){f&&E(e),c.d(f),a&&a.d()}}}function kr(t,e,l){let n;se(t,ct,c=>l(1,n=c));let r=null;function o(c){r=c,l(0,r)}function i(c){r=c,l(0,r)}return t.$$.update=()=>{t.$$.dirty&1&&r&&console.log("apartment selected: ",r)},[r,n,o,i]}class Pr extends Ee{constructor(e){super(),Se(this,e,kr,yr,he,{})}}function Lr(t){let e,l,n,r,o,i,c,a,f,_,p,m,g,v,w=t[3]?"Fjern":"Placer",y,k,P,b,T,O,Q,$,A,W=t[5]?"Fjern garage":"Placer garage",K,G,Z,ie,L,R,D,te,ae,le,J,me,j,X,M,q,ce,N,ne,ue,oe,U,I,_e;m=new vt({props:{leftValue:"Door",rightValue:t[3]?"Sat":"Ikke sat",good:t[3]}}),Q=new vt({props:{leftValue:"Garage",rightValue:t[5]?"Sat":"Ikke sat",good:t[5]}}),ne=new Wt({props:{dropdownValues:Object.keys(t[7]),label:"",id:"new-listing-dd-shell-type",selectedValue:t[2],insideLabel:"Type: "}}),ne.$on("selected-dropdown",t[18]);let S=t[6]&&Fl(t);return{c(){e=d("div"),l=d("div"),l.innerHTML=`
        +

        S\xE6t ny ejendom til salg

        +
        `,n=h(),r=d("div"),o=d("div"),o.innerHTML=`

        Ejendomsinformationer

        + +

        Husk at udfylde alt!

        `,i=h(),c=d("div"),a=d("div"),f=d("p"),f.textContent="D\xF8r",_=h(),p=d("div"),ge(m.$$.fragment),g=h(),v=d("button"),y=z(w),k=h(),P=d("div"),b=d("p"),b.textContent="Garage",T=h(),O=d("div"),ge(Q.$$.fragment),$=h(),A=d("button"),K=z(W),G=h(),Z=d("div"),ie=d("p"),ie.textContent="Beskrivelse",L=h(),R=d("div"),D=d("textarea"),te=h(),ae=d("div"),le=d("p"),le.textContent="Pris",J=h(),me=d("div"),j=d("input"),X=h(),M=d("div"),q=d("p"),q.textContent="Interi\xF8r",ce=h(),N=d("div"),ge(ne.$$.fragment),ue=h(),oe=d("div"),S&&S.c(),u(l,"class","header"),u(o,"class","left-column"),u(f,"class","label"),u(v,"class","regular-button"),u(p,"class","action-row"),u(a,"id","door-creation"),u(a,"class","form-row-wrapper"),u(b,"class","label"),u(A,"class","regular-button"),u(O,"class","action-row"),u(P,"id","garage-creation"),u(P,"class","form-row-wrapper"),u(ie,"class","label"),u(D,"rows","5"),u(D,"placeholder","Skriv en lidt om ejendommen her..,"),u(R,"class","action-row"),u(Z,"id","description"),u(Z,"class","form-row-wrapper"),u(le,"class","label"),u(j,"type","number"),u(j,"placeholder","10000000,-"),u(me,"class","action-row"),u(ae,"id","price"),u(ae,"class","form-row-wrapper"),u(q,"class","label"),u(N,"class","action-row"),u(M,"id","shell-type"),u(M,"class","form-row-wrapper"),u(c,"class","right-column"),u(r,"class","body-wrapper"),u(oe,"class","list-new-property-form-footer"),u(e,"class","list-new-property-form")},m(H,fe){C(H,e,fe),s(e,l),s(e,n),s(e,r),s(r,o),s(r,i),s(r,c),s(c,a),s(a,f),s(a,_),s(a,p),de(m,p,null),s(p,g),s(p,v),s(v,y),s(c,k),s(c,P),s(P,b),s(P,T),s(P,O),de(Q,O,null),s(O,$),s(O,A),s(A,K),s(c,G),s(c,Z),s(Z,ie),s(Z,L),s(Z,R),s(R,D),be(D,t[0]),s(c,te),s(c,ae),s(ae,le),s(ae,J),s(ae,me),s(me,j),be(j,t[1]),s(c,X),s(c,M),s(M,q),s(M,ce),s(M,N),de(ne,N,null),s(e,ue),s(e,oe),S&&S.m(oe,null),U=!0,I||(_e=[Y(v,"click",t[14]),Y(A,"click",t[15]),Y(D,"input",t[16]),Y(j,"input",t[17])],I=!0)},p(H,fe){const Me={};fe&8&&(Me.rightValue=H[3]?"Sat":"Ikke sat"),fe&8&&(Me.good=H[3]),m.$set(Me),(!U||fe&8)&&w!==(w=H[3]?"Fjern":"Placer")&&re(y,w);const Qe={};fe&32&&(Qe.rightValue=H[5]?"Sat":"Ikke sat"),fe&32&&(Qe.good=H[5]),Q.$set(Qe),(!U||fe&32)&&W!==(W=H[5]?"Fjern garage":"Placer garage")&&re(K,W),fe&1&&be(D,H[0]),fe&2&&xl(j.value)!==H[1]&&be(j,H[1]);const De={};fe&128&&(De.dropdownValues=Object.keys(H[7])),fe&4&&(De.selectedValue=H[2]),ne.$set(De),H[6]?S?S.p(H,fe):(S=Fl(H),S.c(),S.m(oe,null)):S&&(S.d(1),S=null)},i(H){U||(V(m.$$.fragment,H),V(Q.$$.fragment,H),V(ne.$$.fragment,H),U=!0)},o(H){F(m.$$.fragment,H),F(Q.$$.fragment,H),F(ne.$$.fragment,H),U=!1},d(H){H&&E(e),pe(m),pe(Q),pe(ne),S&&S.d(),I=!1,We(_e)}}}function Sr(t){let e,l,n,r,o,i,c,a,f;return{c(){e=d("div"),l=d("img"),r=h(),o=d("p"),o.textContent="Du har ikke sat nogle ejendomme til salg endnu!",i=h(),c=d("button"),c.textContent="Tilf\xF8j ny ejendom",Ie(l.src,n="images/House.png")||u(l,"src",n),u(l,"alt","House Icon"),u(e,"class","no-new-properties-base")},m(_,p){C(_,e,p),s(e,l),s(e,r),s(e,o),s(e,i),s(e,c),a||(f=Y(c,"click",t[13]),a=!0)},p:ee,i:ee,o:ee,d(_){_&&E(e),a=!1,f()}}}function Fl(t){let e,l,n;return{c(){e=d("button"),e.textContent="Opret ejendom"},m(r,o){C(r,e,o),l||(n=Y(e,"click",t[11]),l=!0)},p:ee,d(r){r&&E(e),l=!1,n()}}}function Er(t){let e,l,n,r;const o=[Sr,Lr],i=[];function c(a,f){return a[8].length<=0&&!a[4]?0:1}return e=c(t),l=i[e]=o[e](t),{c(){l.c(),n=Ye()},m(a,f){i[e].m(a,f),C(a,n,f),r=!0},p(a,[f]){let _=e;e=c(a),e===_?i[e].p(a,f):(je(),F(i[_],1,1,()=>{i[_]=null}),Ne(),l=i[e],l?l.p(a,f):(l=i[e]=o[e](a),l.c()),V(l,1),l.m(n.parentNode,n))},i(a){r||(V(l),r=!0)},o(a){F(l),r=!1},d(a){i[e].d(a),a&&E(n)}}}function Ar(t,e,l){let n,r,o;se(t,_t,A=>l(7,n=A)),se(t,nt,A=>l(19,r=A)),se(t,He,A=>l(20,o=A));let i=o,c=!1,a="",f=!0,_=0,p=Object.keys(n)[0],m=null,g=null,v=!1;ze("createdDoor",A=>{l(3,m=A)}),ze("createdGarage",A=>{l(5,g=A)});function w(A){Ve("create:createZone",{type:A}),Pe(nt,r=!0,r)}function y(){Ve("create:removeGarage",{})}function k(){Ve("create:confirmListing"),l(4,c=!1),l(0,a=""),l(12,f=!0),l(1,_=0),l(2,p=Object.keys(n)[0]),l(3,m=null),l(5,g=null)}const P=()=>l(4,c=!c),b=()=>w("door"),T=()=>g?y():w("garage");function O(){a=this.value,l(0,a)}function Q(){_=xl(this.value),l(1,_)}const $=A=>l(2,p=A.detail);return t.$$.update=()=>{t.$$.dirty&4111&&(l(6,v=a.length>0&&_>0&&p.length>0&&m),Ve("create:setTextFields",{description:a,for_sale:f,price:_,shell:p}))},[a,_,p,m,c,g,v,n,i,w,y,k,f,P,b,T,O,Q,$]}class Cr extends Ee{constructor(e){super(),Se(this,e,Ar,Er,he,{})}}function Bl(t,e,l){const n=t.slice();return n[8]=e[l],n}function zl(t,e,l){const n=t.slice();return n[8]=e[l],n}function Gl(t){let e,l,n,r,o=t[8].name+"",i,c,a,f,_;function p(){return t[5](t[8])}return{c(){e=d("div"),l=d("i"),n=h(),r=d("p"),i=z(o),c=h(),u(l,"class",t[8].icon),u(e,"class",a="each-tab "+(t[0].name===t[8].name?"each-tab-selected":""))},m(m,g){C(m,e,g),s(e,l),s(e,n),s(e,r),s(r,i),s(e,c),f||(_=Y(e,"click",p),f=!0)},p(m,g){t=m,g&1&&a!==(a="each-tab "+(t[0].name===t[8].name?"each-tab-selected":""))&&u(e,"class",a)},d(m){m&&E(e),f=!1,_()}}}function Ul(t){let e,l,n,r,o=t[8].name+"",i,c,a,f,_;function p(){return t[6](t[8])}return{c(){e=d("div"),l=d("i"),n=h(),r=d("p"),i=z(o),c=h(),u(l,"class",t[8].icon),u(e,"class",a="each-tab "+(t[0].name===t[8].name?"each-tab-selected":""))},m(m,g){C(m,e,g),s(e,l),s(e,n),s(e,r),s(r,i),s(e,c),f||(_=Y(e,"click",p),f=!0)},p(m,g){t=m,g&1&&a!==(a="each-tab "+(t[0].name===t[8].name?"each-tab-selected":""))&&u(e,"class",a)},d(m){m&&E(e),f=!1,_()}}}function Rr(t){let e,l,n,r,o,i,c,a,f,_,p=t[2],m=[];for(let k=0;k{pe(b,1)}),Ne()}w?(f=Zt(w,y()),ge(f.$$.fragment),V(f.$$.fragment,1),de(f,a,null)):f=null}(!_||P&2)&&Ge(e,"opacity",k[1]?"0":"1")},i(k){_||(f&&V(f.$$.fragment,k),_=!0)},o(k){f&&F(f.$$.fragment,k),_=!1},d(k){k&&E(e),qe(m,k),qe(v,k),f&&pe(f)}}}function Tr(t,e,l){let n,r;se(t,Et,p=>l(7,n=p)),se(t,nt,p=>l(1,r=p));let o=[{name:"Ejendomme",icon:"fas fa-home",component:mr}];ht.subscribe(p=>{p>=n.setApartments&&o.push({name:"Lejligheder",icon:"fas fa-building",component:Pr}),p>=n.listNewProperty&&o.push({name:"S\xE6t ejendom til salg",icon:"fas fa-plus-circle",component:Cr})});let i=o[0];function c(p){l(0,i=p),p.name.toLocaleLowerCase()==="logout"&&Ve("hideUI",{})}return[i,r,o,c,[{name:"Luk",icon:"fas fa-arrow-right-from-bracket",component:""}],p=>c(p),p=>c(p)]}class Vr extends Ee{constructor(e){super(),Se(this,e,Tr,Rr,he,{})}}function Kl(t){let e;return{c(){e=d("div"),e.innerHTML=`

        Tryk E for at bekr\xE6fte

        +

        Tryk H for at annullere

        `,u(e,"class","absolute top-1/2 left-4 h-fit bg-[color:var(--color-primary)] w-fit px-6 p-4 flex-col flex gap-4 items-center justify-center text-2xl font-bold")},m(l,n){C(l,e,n)},d(l){l&&E(e)}}}function jr(t){let e,l,n,r;e=new Vr({});let o=t[0]&&Kl();return{c(){ge(e.$$.fragment),l=h(),o&&o.c(),n=Ye()},m(i,c){de(e,i,c),C(i,l,c),o&&o.m(i,c),C(i,n,c),r=!0},p(i,c){i[0]?o||(o=Kl(),o.c(),o.m(n.parentNode,n)):o&&(o.d(1),o=null)},i(i){r||(V(e.$$.fragment,i),r=!0)},o(i){F(e.$$.fragment,i),r=!1},d(i){pe(e,i),i&&E(l),o&&o.d(i),i&&E(n)}}}function ql(t){let e,l;return e=new Dn({}),{c(){ge(e.$$.fragment)},m(n,r){de(e,n,r),l=!0},i(n){l||(V(e.$$.fragment,n),l=!0)},o(n){F(e.$$.fragment,n),l=!1},d(n){pe(e,n)}}}function Nr(t){let e,l,n,r,o,i;e=new Vn({props:{$$slots:{default:[jr]},$$scope:{ctx:t}}}),n=new Hn({});let c=t[1]&&ql();return{c(){ge(e.$$.fragment),l=h(),ge(n.$$.fragment),r=h(),c&&c.c(),o=Ye()},m(a,f){de(e,a,f),C(a,l,f),de(n,a,f),C(a,r,f),c&&c.m(a,f),C(a,o,f),i=!0},p(a,[f]){const _={};f&9&&(_.$$scope={dirty:f,ctx:a}),e.$set(_),a[1]?c?f&2&&V(c,1):(c=ql(),c.c(),V(c,1),c.m(o.parentNode,o)):c&&(je(),F(c,1,1,()=>{c=null}),Ne())},i(a){i||(V(e.$$.fragment,a),V(n.$$.fragment,a),V(c),i=!0)},o(a){F(e.$$.fragment,a),F(n.$$.fragment,a),F(c),i=!1},d(a){pe(e,a),a&&E(l),pe(n,a),a&&E(r),c&&c.d(a),a&&E(o)}}}function Mr(t,e,l){let n,r,o;return se(t,Bt,i=>l(2,n=i)),se(t,nt,i=>l(0,r=i)),se(t,qt,i=>l(1,o=i)),Pe(Bt,n="ps-realtor",n),[r,o]}class Dr extends Ee{constructor(e){super(),Se(this,e,Mr,Nr,he,{})}}new Dr({target:document.getElementById("app")}); diff --git a/resources/[ps]/ps-realtor/pull_request_template.md b/resources/[ps]/ps-realtor/pull_request_template.md new file mode 100644 index 0000000..15670b1 --- /dev/null +++ b/resources/[ps]/ps-realtor/pull_request_template.md @@ -0,0 +1,15 @@ +# Overview +*Provide a brief overview of the purpose of this pull request* + +# Details +*Provide details on the change you are making, why they are necessary, and any information that will help with understanding.* + +# UI Changes / Functionality +*Include a before and after screenshot/recording if applicable. Short recordings showing that your changes work are helpful, but optional.* + +# Testing Steps +*Provide a list of repro steps on how to test that your changes are valid.* + +- [ ] Did you test the changes you made? +- [ ] Did you test core functionality of the script to ensure your changes do not regress other areas? +- [ ] Did you test your changes in multiplayer to ensure it works correctly on all clients? diff --git a/resources/[ps]/ps-realtor/server/server.lua b/resources/[ps]/ps-realtor/server/server.lua new file mode 100644 index 0000000..e5eadaf --- /dev/null +++ b/resources/[ps]/ps-realtor/server/server.lua @@ -0,0 +1,71 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +RegisterNetEvent('QBCore:Server:UpdateObject', function() + if source ~= '' then return false end + QBCore = exports['qb-core']:GetCoreObject() +end) + +RegisterNetEvent("ps-realtor:server:updateProperty", function(type, property_id, data) + -- Job check + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local PlayerData = Player.PlayerData + if not PlayerData.job.name == Config.RealtorJobName then return false end + + data.realtorSrc = src + -- Update property + TriggerEvent("ps-housing:server:updateProperty", type, property_id, data) +end) + +RegisterNetEvent("ps-realtor:server:registerProperty", function(data) + -- Job check + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local PlayerData = Player.PlayerData + if not PlayerData.job.name == Config.RealtorJobName then return false end + + data.realtorSrc = src + -- Register property + TriggerEvent("ps-housing:server:registerProperty", data) +end) + +RegisterNetEvent("ps-realtor:server:addTenantToApartment", function(data) + -- Job check + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local PlayerData = Player.PlayerData + if not PlayerData.job.name == Config.RealtorJobName then return false end + + data.realtorSrc = src + -- Add tenant + TriggerEvent("ps-housing:server:addTenantToApartment", data) +end) + +lib.callback.register("ps-realtor:server:getNames", function (source, data) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + local PlayerData = Player.PlayerData + if not PlayerData.job.name == Config.RealtorJobName then return false end + + local names = {} + for i = 1, #data do + local target = QBCore.Functions.GetPlayerByCitizenId(data[i]) or QBCore.Functions.GetOfflinePlayerByCitizenId(data[i]) + if target then + names[#names+1] = target.PlayerData.charinfo.firstname .. " " .. target.PlayerData.charinfo.lastname + else + names[#names+1] = "Unknown" + end + end + + return names +end) + +if Config.UseItem then + QBCore.Functions.CreateUseableItem(Config.ItemName, function(source, item) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + if Player.Functions.GetItemByName(item.name) ~= nil then + TriggerClientEvent("ps-realtor:client:toggleUI", src) + end + end) +end diff --git a/resources/[ps]/ps-realtor/shared/config.lua b/resources/[ps]/ps-realtor/shared/config.lua new file mode 100644 index 0000000..1ad2520 --- /dev/null +++ b/resources/[ps]/ps-realtor/shared/config.lua @@ -0,0 +1,31 @@ +Config = Config or {} + +-- Set your Real Estate here +Config.RealtorJobName = "realestate" + +-- Set this value to true if you want to use the command to open the Housing Menu(Realtor Menu) +Config.UseCommand = true + +-- Set this value to TRUE if you want to use the Config.ItemName as a usable Item to open the Housing Menu(Realtor Menu) +Config.UseItem = true + +--Set this value to FALSE if u DON'T want to play the tablet animation when using /housing or the usable item +Config.PlayAnimation = true + +--Change this to whatever prop u want to use for the animation +Config.AnimationProp = 'prop_cs_tablet' + +Config.ItemName = "tablet" -- Item name to make it usable. +-- Change the uniqueness and the usability inside qb-core -> items.lua to TRUE +-- add this item to a shop or anything else! + +--Commisions is handled in ps-housing config. + +Config.RealtorPerms = { + manageProperty = 1, --minimum grade to manage property | default 1 + changePropertyForSale = 0, --minimum grade to list property | default 0 + sellProperty = 0, --minimum grade to sell property | default 0 + listNewProperty = 2, --minimum grade to list property | default 2 + deleteProperty = 2, --minimum grade to delete property | default 2 + setApartments = 2, --minimum grade to set apartments for players | default 2 +} diff --git a/resources/[ps]/ps-realtor/ui/.gitignore b/resources/[ps]/ps-realtor/ui/.gitignore new file mode 100644 index 0000000..ea65588 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/.gitignore @@ -0,0 +1,4 @@ +/node_modules/ + + +.DS_Store diff --git a/resources/[ps]/ps-realtor/ui/.prettierrc b/resources/[ps]/ps-realtor/ui/.prettierrc new file mode 100644 index 0000000..6582e97 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/.prettierrc @@ -0,0 +1,6 @@ +{ + "tabWidth": 4, + "useTabs": true, + "semi": false, + "singleQuote": true +} diff --git a/resources/[ps]/ps-realtor/ui/README.md b/resources/[ps]/ps-realtor/ui/README.md new file mode 100644 index 0000000..22f360f --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/README.md @@ -0,0 +1,44 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + `vite dev` and `vite build` wouldn't work in a SvelteKit environment, for example. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/resources/[ps]/ps-realtor/ui/css/apartments/apartment-card.css b/resources/[ps]/ps-realtor/ui/css/apartments/apartment-card.css new file mode 100644 index 0000000..8708f01 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/apartments/apartment-card.css @@ -0,0 +1,71 @@ +.apartment-card-wrapper { + width: 10.5vw; + height: 15.5vw; + + margin-right: 1vw; + + border-radius: 0.2vw; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); + background-color: var(--light-border-color-2); + + display: flex; + flex-direction: column; +} + +.apartment-card-wrapper:nth-child(4n) { + margin-right: 0; +} + +.apartment-card-wrapper > img { + height: 60%; +} + +.apartment-card-wrapper > .details { + display: flex; + flex-direction: column; + + margin-top: 0.3vw; + padding: 0.6vw; +} + +.apartment-card-wrapper > .details > .heading { + font-size: 0.7vw; + font-weight: 600; +} + +.apartment-card-wrapper > .details > .info { + font-size: 0.6vw; + font-weight: 500; + color: var(--light-border-color-8); +} + +.apartment-card-wrapper > .details > .location-tenants-info { + display: flex; + flex-direction: row; + margin-top: 0.2vw; +} + +.apartment-card-wrapper > .details > .location-tenants-info > p { + font-size: 0.45vw; + font-weight: 400; + color: var(--light-border-color-8); + + padding-top: 0.1vw; + margin-left: 0.3vw; +} + +.apartment-card-wrapper > .details > .select-apt-button { + background-color: var(--blue-color); + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); + + color: var(--white-color); + + border-radius: 0.2vw; + width: 99%; + + font-size: 0.7vw; + font-weight: 500; + + margin-top: 0.4vw; + padding: 0.2vw; +} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/apartments/apartments.css b/resources/[ps]/ps-realtor/ui/css/apartments/apartments.css new file mode 100644 index 0000000..e901db3 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/apartments/apartments.css @@ -0,0 +1,24 @@ +.apartments-base { + display: flex; + flex-direction: column; + + padding: 0.2vw; + height: 100%; +} + +.apartments-base > .heading { + font-size: 0.75vw; +} + +.apartments-base > .apartment-listing-wrapper { + display: flex; + flex-direction: row; + flex-wrap: wrap; + + row-gap: 1vw; + + margin-top: 0.8vw; + + overflow-y: auto; + overflow-x: hidden; +} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/apartments/selected-apartment.css b/resources/[ps]/ps-realtor/ui/css/apartments/selected-apartment.css new file mode 100644 index 0000000..db61aa3 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/apartments/selected-apartment.css @@ -0,0 +1,187 @@ + .selected-apartment-modal-dialog { + height: 40vw; + /* overflow-y: auto; */ + } + .selected-apartment-large-footer-modal-body-data { + padding: 1.5vw 2.2vw !important; + height: 35.5vw !important; + /* overflow-y: auto; */ + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment { + display: flex; + flex-direction: column; + } + + /*** body **/ + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > img { + height: 9vw; + border-radius: 0.5vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper { + height: 3vw; + margin-top: 1vw; + padding: 0.2vw 0; + + display: flex; + flex-direction: row; + justify-content: space-between; + /* border: 0.1px solid red */ + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .apt-details { + display: flex; + flex-direction: column; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .apt-details > .heading { + font-size: 0.8vw; + font-weight: 600; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .apt-details > .tenant-count { + font-size: 0.5vw; + font-weight: 500; + color: var(--light-border-color-8); + margin-top: 0.45vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .search-actions { + display: flex; + flex-direction: row; + + height: 1.5vw; + margin: auto 0; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .search-actions > button { + padding: 0.2vw 0.6vw; + border-radius: 0.15vw; + + background-color: var(--blue-color); + font-size: 0.6vw; + font-weight: 500; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .search-actions > button > i { + margin-right: 0.3vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .search-actions > .search-bar { + position: relative; + margin-right: 0.5vw; + + color: var(--light-border-color-6); + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .search-actions > .search-bar > input { + border-radius: 0.15vw; + width: 9vw; + + padding: 0.25vw 0.5vw; + font-weight: 500; + font-size: 0.6vw; + color: var(--light-border-color-6); + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2)); + border: 0.95px solid rgba(255, 255, 255, 0.2); + box-shadow: 0px 3.8072197437286377px 3.8072197437286377px 0px rgba(0, 0, 0, 0.1); + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .search-wrapper > .search-actions > .search-bar > i { + position: absolute; + + color: var(--light-border-color-6); + left: 88%; + font-size: 0.6vw; + + padding: 0.4vw 0.2vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > hr { + background-color: var(--light-border-color-2); + height: 0.1px; + border: none; + + margin-top: 0.4vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .tenant-wrapper { + height: 20.2vw; + + overflow-y: auto; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .tenant-wrapper > .tenant-row { + display: flex; + flex-direction: row; + + height: 3.5vw; + + border-bottom: 0.1px solid var(--light-border-color-2); + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .tenant-wrapper > .tenant-row > .img-wrapper { + border-radius: 50%; + + width: 1.8vw; + height: 1.8vw; + + background-color: var(--circle-color); + + margin: auto 0.6vw auto 0; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .tenant-wrapper > .tenant-row > .tenant-details { + display: flex; + flex-direction: column; + + margin: auto 0; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .tenant-wrapper > .tenant-row > .tenant-details > .tenant-name { + font-size: 0.6vw; + font-weight: 600; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-selected-apartment > .tenant-wrapper > .tenant-row > .tenant-details > .tenant-status { + font-size: 0.5vw; + font-weight: 500; + color: var(--light-border-color-6); + } + + + /** footer **/ + .large-footer-modal-body > .large-footer-modal-footer-selected-apartment { + background-color: var(--footer-color); + height: 2.3vw; + + padding: 0.55vw 1vw; + + display: flex; + flex-direction: row; + justify-content: flex-end; + } + .large-footer-modal-body > .large-footer-modal-footer-selected-apartment > input { + border-radius: 0.15vw; + width: 7.5vw; + height: 1.21vw; + + padding: 0.22vw 0.5vw; + font-weight: 500; + font-size: 0.53vw; + color: var(--light-border-color-6); + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2)); + border: 0.95px solid rgba(255, 255, 255, 0.2); + box-shadow: 0px 3.8072197437286377px 3.8072197437286377px 0px rgba(0, 0, 0, 0.1); + } + .large-footer-modal-body > .large-footer-modal-footer-selected-apartment > .add-button { + border-radius: 0.1vw; + + width: fit-content; + + font-size: 0.5vw; + font-weight: 600; + + padding: 0.17vw 0.5vw; + margin-left: 0.5vw; + text-align: center; + + display: flex; + flex-direction: row; + + background-color: var(--blue-color); + } \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/colors.css b/resources/[ps]/ps-realtor/ui/css/colors.css new file mode 100644 index 0000000..b3ef24b --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/colors.css @@ -0,0 +1,25 @@ +:root { + --light-border-color-half-opaque: rgba(255, 255, 255, 0.05); + --light-border-color: rgba(255, 255, 255, 0.1); + --light-border-color-2: rgba(255, 255, 255, 0.2); + --less-light-border-color: rgba(255, 255, 255, 0.3); + --light-border-color-6: rgba(255, 255, 255, 0.6); + --light-border-color-8: rgba(255, 255, 255, 0.8); + --white-color: rgba(255, 255, 255, 1); + + --black-color: rgba(0, 0, 0, 1); + --black-two-opaque-color: rgba(0, 0, 0, 0.2); + --black-opaque-color-3: rgba(0, 0, 0, 0.3); + + --tile-color: rgba(36, 36, 36, 1); + + --footer-color: rgb(28, 28, 28); + + --blue-color: #0078D4; + + --green-color: rgba(34, 197, 94, 1); + + --red-color: rgba(220, 38, 38, 1); + + --circle-color: rgba(75, 75, 75, 1); +} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/form-row-wrapper.css b/resources/[ps]/ps-realtor/ui/css/form-row-wrapper.css new file mode 100644 index 0000000..1886a7a --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/form-row-wrapper.css @@ -0,0 +1,92 @@ +.form-row-wrapper { + display: flex; + flex-direction: column; + justify-content: left; + + margin-bottom: 0.7vw; +} + +.form-row-wrapper > .label { + font-size: 0.6vw; + font-weight: 500; + margin-bottom: 0.2vw; +} + +.form-row-wrapper > .action-row { + display: flex; + flex-direction: row; +} +.form-row-wrapper > .action-row > button:not(:first-child), .form-row-wrapper > .action-row > div:not(:first-child), .form-row-wrapper > .action-row > input:not(:first-child) { + margin-left: 0.4vw; +} + +.form-row-wrapper > .image-tiles-wrapper { + margin-top: 1vw; + width: 15vw; + + display: flex; + flex-direction: row; + flex-wrap: wrap; + + row-gap: 0.3vw; +} +.form-row-wrapper > .image-tiles-wrapper > div > img, .form-row-wrapper > .image-tiles-wrapper > div { + width: 4vw; + height: 2vw; + border-radius: 0.3vw; + background-color: var(--light-border-color); +} +.form-row-wrapper > .image-tiles-wrapper > div:not(:first-child) { + margin-left: 0.4vw; +} +.form-row-wrapper > .image-tiles-wrapper > div:nth-child(4n) { + margin-left: 0; +} + +.form-row-wrapper > .action-row > .regular-button { + padding: 0.2vw 0.6vw; + border-radius: 0.15vw; + + background-color: var(--blue-color); + font-size: 0.6vw; + font-weight: 500; +} + +.form-row-wrapper > .action-row > .disable-button { + padding: 0.2vw 0.6vw; + border-radius: 0.15vw; + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, var(--light-border-color-2), var(--light-border-color-2)); + border: 1px solid var(--light-border-color-2); + + font-size: 0.6vw; + font-weight: 500; +} + +.form-row-wrapper > .action-row > input { + padding: 0.35vw 0.55vw; + border-radius: 0.15vw; + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, var(--light-border-color-2), var(--light-border-color-2)); + border: 1px solid var(--light-border-color-2); + + color: var(--light-border-color-6); + font-size: 0.5vw; + font-weight: 600; + + width: 15vw; +} + +.form-row-wrapper > .action-row > textarea { + padding: 0.35vw 0.55vw; + border-radius: 0.15vw; + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, var(--light-border-color-2), var(--light-border-color-2)); + border: 1px solid var(--light-border-color-2); + + color: var(--light-border-color-6); + font-size: 0.5vw; + font-weight: 600; + + width: 15vw; +} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/generic-components.css b/resources/[ps]/ps-realtor/ui/css/generic-components.css new file mode 100644 index 0000000..372ba40 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/generic-components.css @@ -0,0 +1,209 @@ +/** ARRAY DROPDOWN - start **/ +.dropdown { + display: flex; + flex-direction: row; + font-size: 0.9vw; + + z-index: 1; + + position: absolute; +} + +.dropdown > label { + margin: 0 0.2vw; + color: var(--light-text); +} + +.dropdown-wrapper { + display: flex; + flex-direction: column; + + min-width: 6vw; + width: fit-content; + /* padding: 0 0.2vw; */ + + background: linear-gradient(0deg, #242424, #242424), linear-gradient(0deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.1)); + border: 1px solid rgba(255, 255, 255, 0.1); + + color: var(--app-name); + border-radius: 0.2vw; + } + + .select-wrapper { + width: auto; + height: 1.7vw; + + display: flex; + flex-direction: row; + justify-content: space-between; + padding-left: 0.2vw; + padding-right: 0.3vw; + + cursor: pointer; + } + + .select-wrapper-selected-value { + font-size: 0.7vw; + padding: 0.25vw; + margin-right: 0.2vw; + + display: flex; + flex-direction: row; + } + .select-wrapper-selected-value > .inside-label { + color: var(--less-light-border-color); + margin-right: 0.3vw; + } + .select-wrapper-selected-value > .selected-value-text { + padding-top: 0.05vw; + } + + .dropdown-chevron { + text-align: center; + font-size: 0.5vw; + margin-top: 0.6vw; + + color: var(--less-light-border-color); + } + + .options-wrapper { + width: 100%; + } + + .options-wrapper > .no-items-found { + font-size: 0.7vw; + padding: 0.17vw 0.6vw 0.17vw 0.6vw; + } + + .option-child { + cursor: pointer; + + padding: 0.17vw 0.8vw 0.17vw 0.45vw; + min-height: 1.7vw; + border-radius: 0.2vw; + font-size: 0.7vw; + } + + .option-child > p { + display: flex; + flex-direction: row; + } + .option-child > p > .icon { + font-size: 0.65vw; + padding-top: 0.35vw; + margin-left: 0.5vw; + } + + .option-child:hover { + background-color: var(--black-two-opaque-color); + } + + /** ARRAY DROPDOWN - end **/ + + /** LARGE MODAL WITH FOOTER - start **/ + .large-footer-modal { + display: flex; + overflow: hidden !important; + border-radius: 0.2vw; + + position: absolute; + outline: none; + z-index: 999999; + opacity: 1; + + left: 60%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + transition: all 0.3s linear; + } + + .large-footer-modal-dialog { + /* min-height: 8vw; */ + width: 33vw; + height: 35vw; + display: flex; + position: relative; + } + + .large-footer-modal-content { + display: flex; + position: relative; + flex-direction: column; + + width: 100%; + pointer-events: auto; + + background-color: var(--tile-color); + box-shadow: 0px 4px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.15); + background-clip: padding-box; + border-radius: 0.2vw; + + outline: none; + border: 0.08px solid var(--light-border-color); + } + + .large-footer-modal-body { + position: relative; + + display: flex; + flex-direction: column; + justify-content: space-between; + + font-size: 0.8vw; + font-weight: 300; + /* border: 0.08px solid var(--light-border-color); */ + } + + /** HEADER - start **/ + .large-footer-modal-body > .header { + display: flex; + flex-direction: row; + justify-content: space-between; + + height: 2.1vw; + padding: 0.4vw; + border-bottom: 0.1px solid var(--light-border-color); + } + + .large-footer-modal-body > .header > .heading-title-wrapper { + display: flex; + flex-direction: row; + padding: 0.2vw; + } + .large-footer-modal-body > .header > .heading-title-wrapper > .info-icon { + margin-right: 0.5vw; + color: var(--blue-color); + font-size: 0.75vw; + } + .large-footer-modal-body > .header > .heading-title-wrapper > p { + font-size: 0.7vw; + font-weight: 600; + margin-top: -0.15vw; + } + .large-footer-modal-body > .header > div > .close-icon { + color: var(--less-light-border-color); + padding-right: 0.2vw; + cursor: pointer; + } + /** HEADER - end **/ + + /** BODY - start **/ + .large-footer-modal-body > .large-footer-modal-body-data { + display: flex; + flex-direction: column; + + height: 30.5vw; + padding: 1.2vw 1.8vw; + } + + + /** BODY - end **/ + + /** FOOTER - start **/ + .large-footer-modal-body > .large-footer-modal-footer { + background-color: var(--footer-color); + height: 2.3vw; + } + /** FOOTER - end **/ + /** LARGE MODAL WITH FOOTER - end **/ \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/global.css b/resources/[ps]/ps-realtor/ui/css/global.css new file mode 100644 index 0000000..3b39f1a --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/global.css @@ -0,0 +1,33 @@ +* { + margin: 0; + padding: 0; + } + +::-webkit-scrollbar { + width: 0.2vw; +} + + /* Track */ + ::-webkit-scrollbar-track { + box-shadow: inset 0 0 4px grey; + border-radius: 0.2vw; + } + + /* Handle */ + ::-webkit-scrollbar-thumb { + background: rgba(191, 219, 254, 0.5); + border-radius: 0.2vw; + } + + /* Handle on hover */ + ::-webkit-scrollbar-thumb:hover { + background: rgba(191, 219, 254, 0.5); + } + + .green { + color: var(--green-color); + } + + .red { + color: var(--red-color); + } \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/list-properties/list-new-properties-base.css b/resources/[ps]/ps-realtor/ui/css/list-properties/list-new-properties-base.css new file mode 100644 index 0000000..f34e148 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/list-properties/list-new-properties-base.css @@ -0,0 +1,144 @@ +/** NO NEW PROPERTIES - start **/ + +.no-new-properties-base { + display: flex; + flex-direction: column; + + align-items: center; + + position: absolute; + left: 60%; + top: 47%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.no-new-properties-base > img { + width: 3vw; + + margin-bottom: 0.8vw; +} + +.no-new-properties-base > p { + color: var(--white-color); + font-size: 0.7vw; +} + +.no-new-properties-base > button { + background-color: var(--blue-color); + font-size: 0.6vw; + font-weight: 500; + + border-radius: 0.2vw; + + padding: 0.2vw 0.9vw; + margin-top: 0.8vw; +} +/** NO NEW PROPERTIES - end **/ + +/** LIST NEW PROPERTY FORM - start **/ +.list-new-property-form { + margin: 1vw; + + height: 33vw; + border-radius: 0.1vw; + + background: linear-gradient(0deg, #242424, #242424), linear-gradient(0deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.1)); + + border-width: 0px, 1px, 1px, 1px; + border-style: solid; + border-color: var(--light-border-color); +} + +.list-new-property-form > .header { + display: flex; + flex-direction: row; + justify-content: space-between; + + height: 2.1vw; + /* padding: 0.4vw; */ + border-bottom: 0.1px solid var(--light-border-color); + } + + .list-new-property-form > .header > .heading-title-wrapper { + display: flex; + flex-direction: row; + padding: 0.6vw; + } + .list-new-property-form > .header > .heading-title-wrapper > .add-icon { + margin-right: 0.5vw; + color: var(--blue-color); + font-size: 0.75vw; + padding: 0.05vw 0.1vw; + } + .list-new-property-form > .header > .heading-title-wrapper > p { + font-size: 0.7vw; + font-weight: 600; + margin-top: -0.15vw; + } + .list-new-property-form > .header > div > .chevron-icon { + color: var(--less-light-border-color); + padding: 0.6vw 0.6vw 0.2vw 0.2vw; + font-size: 0.75vw; + } + + .list-new-property-form > .body-wrapper { + padding: 0.7vw 1.2vw; + + display: flex; + flex-direction: row; + + margin-top: 0.5vw; + height: 28.1vw; + } + + .list-new-property-form > .body-wrapper > .left-column { + display: flex; + flex-direction: column; + + width: 30%; + } + .list-new-property-form > .body-wrapper > .left-column > .title { + font-size: 0.7vw; + font-weight: 600; + } + .list-new-property-form > .body-wrapper > .left-column > .info { + font-size: 0.6vw; + font-weight: 400; + + color: var(--white-color); + + margin-top: 0.3vw; + } + + /* .list-new-property-form > .body-wrapper > .right-column { + + } */ + + .list-new-property-form > .list-new-property-form-footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + + background-color: var(--footer-color); + height: 2.3vw; + padding: 0.55vw 1vw; + } + .list-new-property-form > .list-new-property-form-footer > button { + border-radius: 0.1vw; + + width: fit-content; + + font-size: 0.5vw; + font-weight: 600; + + padding: 0.15vw 0.5vw; + text-align: center; + + display: flex; + flex-direction: row; + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, var(--light-border-color-2), var(--light-border-color-2)); + border: 0.1px solid var(--light-border-color-2); + } +/** LIST NEW PROPERTY FORM - end **/ \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/master.css b/resources/[ps]/ps-realtor/ui/css/master.css new file mode 100644 index 0000000..455ec92 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/master.css @@ -0,0 +1,16 @@ +@import './realtor-menu.css'; +@import './colors.css'; +@import './generic-components.css'; +@import './global.css'; +@import './form-row-wrapper.css'; + +@import './properties/properties.css'; +@import './properties/property-card.css'; +@import './properties/property-details-modal.css'; +@import './properties/manage-property-modal.css'; + +@import './apartments/apartments.css'; +@import './apartments/apartment-card.css'; +@import './apartments//selected-apartment.css'; + +@import './list-properties/list-new-properties-base.css'; \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/properties/manage-property-modal.css b/resources/[ps]/ps-realtor/ui/css/properties/manage-property-modal.css new file mode 100644 index 0000000..35f6088 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/properties/manage-property-modal.css @@ -0,0 +1,140 @@ +.manage-property-modal-dialog { + height: 40vw; +} + .manage-property-large-footer-modal-body-data { + padding: 1.2vw 1vw !important; + height: 35.5vw !important; + overflow-y: auto; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property { + display: flex; + flex-direction: row; + + margin-top: 0.1vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .left-column { + height: 28.2vw; + width: 30%; + /* border-right: 0.1px solid var(--light-border-color); */ + + display: flex; + flex-direction: column; + justify-content: left; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .left-column > .heading { + font-size: 0.65vw; + font-weight: 600; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .left-column > .info { + font-size: 0.6vw; + font-weight: 400; + margin-top: 0.3vw; + margin-right: 0.2vw; + } + + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column { + height: 14.5vw; + width: 70%; + + padding-left: 0.5vw; + margin-left: 1vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column > .title { + font-size: 0.8vw; + font-weight: 600; + + margin-bottom: 0.8vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column > .waypoint { + background-color: var(--blue-color); + color: var(--white-color); + + width: 100%; + border-radius: 0.1vw; + padding: 0.2vw 0; + + font-size: 0.7vw; + + display: flex; + flex-direction: row; + justify-content: center; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column > .waypoint > i { + padding-top: 0.2vw; + margin-right: 0.5vw; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column > .waypoint > p { + font-weight: 500; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column > .tiles-wrapper { + margin-top: 0.75vw; + + font-size: 0.5vw; + letter-spacing: 0.4px; + font-weight: 400; + color: var(--white-color); + + width: 90%; + + display: flex; + flex-direction: row; + flex-wrap: wrap; + + row-gap: 0.3vw; +} +.large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column > .tiles-wrapper > .each-tile { + border-radius: 0.1vw; + + min-width: 2.5vw; + width: fit-content; + + padding: 0.3vw; + margin-right: 0.2vw; + text-align: center; + + display: flex; + flex-direction: row; + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, var(--light-border-color-2), var(--light-border-color-2)); + border: 0.1px solid var(--light-border-color-2); +} + +.large-footer-modal-body > .large-footer-modal-body-data > .data-details-manage-property > .right-column > .tiles-wrapper > .each-tile > i { + color: var(--light-border-color-6); + font-weight: 700; + margin-right: 0.15vw; + padding-top: 0.15vw; +} + +.large-footer-modal-body > .large-footer-modal-footer-manage-property { + background-color: var(--footer-color); + height: 2.3vw; + + padding: 0.55vw 1vw; + + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.large-footer-modal-body > .large-footer-modal-footer-manage-property > .delete-button { + border-radius: 0.1vw; + + width: fit-content; + + font-size: 0.5vw; + font-weight: 600; + + padding: 0.15vw 0.5vw; + text-align: center; + + display: flex; + flex-direction: row; + + background-color: var(--red-color); +} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/properties/properties.css b/resources/[ps]/ps-realtor/ui/css/properties/properties.css new file mode 100644 index 0000000..f7d08d6 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/properties/properties.css @@ -0,0 +1,103 @@ +.properties-base { + display: flex; + flex-direction: column; + height: 100%; + padding: 0.5vw; +} + +/** SEARCH - start **/ +.properties-base > .search-wrapper { + border-radius: 0.6vw; +} + +.properties-base > .search-wrapper > img { + border-radius: 0.6vw; + position: relative; + text-align: center; + + width: 100%; + height: 12vw; +} + +.properties-base > .search-wrapper > .search-data { + position: absolute; + + top: 13%; + left: 41%; + + z-index: 99999; + text-align: center; + + font-weight: 600; + font-size: 0.9vw; +} + +.properties-base > .search-wrapper > .search-data > .light-text { + font-size: 0.7vw; +} + +.properties-base > .search-wrapper > .search-data > .search-bar { + position: relative; + margin-top: 0.7vw; +} + +.properties-base > .search-wrapper > .search-data > .search-bar > input { + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.1); + + border-radius: 0.15vw; + width: 25vw; + + padding: 0.2vw 0.5vw; + font-weight: 500; + font-size: 0.6vw; + color: rgba(0, 0, 0, 1); +} + +.properties-base > .search-wrapper > .search-data > .search-bar > i { + position: absolute; + + color: rgba(0, 0, 0, 0.6); + left: 95%; + font-size: 0.6vw; + + padding: 0.4vw 0.2vw; +} +/** SEARCH - end **/ + +/** properties list heading -start **/ +.properties-base > .properties-heading-wrapper { + margin: 0.3vw 0; + + font-size: 0.75vw; +} + +.properties-base > .properties-heading-wrapper > .heading { + margin: 0.5vw 0; +} + +.properties-base > .properties-heading-wrapper > .filters-wrapper { + margin: 0.7vw 0 0.5vw 0; + + display: flex; + flex-direction: row; +} + +/* .properties-base > .properties-heading-wrapper > .filters-wrapper > div { + margin-right: 0.5vw; +} */ +/** properties list heading - end **/ + +/** PROPERTY - LISTING WRAPPER - start **/ +.properties-base > .property-listing-wrapper { + display: flex; + flex-direction: row; + flex-wrap: wrap; + + row-gap: 0.7vw; + + height: fit-content; + max-height: 100%; + overflow-y: auto; + overflow-x: hidden; +} +/** PROPERTY - LISTING WRAPPER - end **/ \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/properties/property-card.css b/resources/[ps]/ps-realtor/ui/css/properties/property-card.css new file mode 100644 index 0000000..f1bdb62 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/properties/property-card.css @@ -0,0 +1,99 @@ +.property-card-wrapper { + width: 10.3vw; + min-height: 12.5vw; + + max-height: fit-content; + + margin-right: 1vw; + + border-radius: 0.2vw; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); + background-color: var(--light-border-color-2); + + display: flex; + flex-direction: column; +} + +.property-card-wrapper:nth-child(4n) { + margin-right: 0; +} + +.property-card-wrapper > img { + height: 45%; +} + +.property-card-wrapper > .property-card-details { + height: 55%; + + display: flex; + flex-direction: column; + + padding: 0.3vw 0.6vw; +} + +.property-card-wrapper > .property-card-details > .property-name, .property-card-wrapper > .property-card-details > .property-cost { + font-size: 0.55vw; + font-weight: 600; + color: var(--white-color); + padding: 0.08vw 0; +} + +.property-card-wrapper > .property-card-details > .property-address { + font-size: 0.5vw; + font-weight: 500; + color: var(--light-border-color-8); +} + +.property-card-wrapper > .property-card-details > .property-details { + margin-top: 0.3vw; + font-size: 0.38vw; + letter-spacing: 0.4px; + font-weight: 400; + color: var(--white-color); + + width: 90%; + + display: flex; + flex-direction: row; + flex-wrap: wrap; + + row-gap: 0.3vw; +} + +.property-card-wrapper > .property-card-details > .property-details > .each-tile { + border-radius: 0.1vw; + + min-width: 2vw; + width: fit-content; + + padding: 0.22vw 0.15vw 0.15vw 0.15vw; + margin-right: 0.2vw; + text-align: center; + + background-color: var(--tile-color); + + display: flex; + flex-direction: row; +} + +.property-card-wrapper > .property-card-details > .property-details > .each-tile > i { + color: var(--less-light-border-color); + margin-right: 0.15vw; + padding-top: 0.08vw; +} + +/** CARD HOVER BUTTON - start **/ +.card-hover-button { + align-self: center; + background-color: var(--blue-color); + color: var(--white-color); + + width: 100%; + padding-top: 0.05vw; + padding-bottom: 0.05vw; + border-radius: 0.2vw; + + font-size: 0.6vw; + font-weight: 500; +} +/** CARD HOVER - end **/ \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/properties/property-details-modal.css b/resources/[ps]/ps-realtor/ui/css/properties/property-details-modal.css new file mode 100644 index 0000000..498f1fd --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/properties/property-details-modal.css @@ -0,0 +1,152 @@ +.large-footer-modal-body > .large-footer-modal-body-data > img { + height: 12vw; + border-radius: 0.3vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property { + display: flex; + flex-direction: row; + + margin-top: 1.5vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .left-column { + height: 14.5vw; + width: 70%; + border-right: 0.1px solid var(--light-border-color); + + overflow-y: auto; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .left-column > .property-name { + font-size: 0.8vw; + font-weight: 600; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .left-column > .property-info { + margin-top: 0.5vw; + width: 75%; + + font-size: 0.65vw; + font-weight: 500; + + color: var(--light-border-color-8); + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .left-column > .gallery-image-wrapper { + margin-top: 1vw; + + display: flex; + flex-direction: row; + flex-wrap: wrap; + + row-gap: 0.5vw; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .left-column > .gallery-image-wrapper > img { + border-radius: 0.3vw; + + width: 9vw; + margin-right: 0.8vw; + } + + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column { + height: 14.5vw; + width: 30%; + + padding-left: 1.3vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column > .title { + font-size: 0.8vw; + font-weight: 600; + + margin-bottom: 0.8vw; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column > .waypoint { + background-color: var(--blue-color); + color: var(--white-color); + + width: 100%; + border-radius: 0.1vw; + padding: 0.2vw 0; + + font-size: 0.7vw; + + display: flex; + flex-direction: row; + justify-content: center; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column > .waypoint > i { + padding-top: 0.2vw; + margin-right: 0.5vw; + } + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column > .waypoint > p { + font-weight: 500; + } + + .large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column > .tiles-wrapper { + margin-top: 0.75vw; + + font-size: 0.5vw; + letter-spacing: 0.4px; + font-weight: 400; + color: var(--white-color); + + width: 90%; + + display: flex; + flex-direction: row; + flex-wrap: wrap; + + row-gap: 0.3vw; +} +.large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column > .tiles-wrapper > .each-tile { + border-radius: 0.1vw; + + min-width: 2.5vw; + width: fit-content; + + padding: 0.25vw; + margin-right: 0.07vw; + text-align: center; + + display: flex; + flex-direction: row; + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, var(--light-border-color-2), var(--light-border-color-2)); + border: 0.1px solid var(--light-border-color-2); +} + +.large-footer-modal-body > .large-footer-modal-body-data > .data-details-property > .right-column > .tiles-wrapper > .each-tile > i { + color: var(--light-border-color-6); + font-weight: 700; + margin-right: 0.15vw; + padding-top: 0.15vw; +} + +.large-footer-modal-body > .large-footer-modal-footer { + padding: 0.55vw 1vw; + + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.large-footer-modal-body > .large-footer-modal-footer > button { + border-radius: 0.1vw; + + width: fit-content; + + font-size: 0.5vw; + font-weight: 600; + + padding: 0.15vw 0.5vw; + text-align: center; + + display: flex; + flex-direction: row; + + background: linear-gradient(0deg, #313131, #313131), linear-gradient(0deg, var(--light-border-color-2), var(--light-border-color-2)); + border: 0.1px solid var(--light-border-color-2); +} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/css/realtor-menu.css b/resources/[ps]/ps-realtor/ui/css/realtor-menu.css new file mode 100644 index 0000000..4481694 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/css/realtor-menu.css @@ -0,0 +1,104 @@ +.realtor-menu-base { + display: flex; + flex-direction: row; + + overflow: hidden; +} + +.realtor-menu-base > .left-column { + width: 20%; + padding: 1.3vw 0.3vw; + + border-right: 0.1px solid var(--light-border-color); + background-color: var(--light-border-color-half-opaque); + + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.realtor-menu-base > .right-column { + width: 80%; + height: 100%; + padding: 1.3vw; +} + + +/** TAB WRAPPER - start **/ +.tab-wrapper { + margin: 0.35vw 0.2vw; + } + .tab-wrapper > .each-tab { + display: flex; + flex-direction: row; + + padding: 0.5vw; + border-radius: 0.2vw; + cursor: pointer; + + line-height: 1vw; + vertical-align: middle; + } + + .tab-wrapper > .each-tab > i { + width: 2vw; + padding-top: 0.05vw; + + text-align: center; + } + + .tab-wrapper > .each-tab > p { + font-size: 0.75vw; + } + + .tab-wrapper > .each-tab-selected { + background-color: var(--blue-color); + } + + + .tab-wrapper > .discord-wrapper { + padding: 0.25vw; + border-radius: 0.2vw; + + background-color: #333333; + border: 1px solid var(--light-border-color); + + margin-top: 0.5vw; + padding: 0.7vw 0; + + display: flex; + flex-direction: column; + justify-content: space-evenly; + + align-items: center; + } + + .tab-wrapper > .discord-wrapper > .discord-emoji { + width: 1.3vw; + } + + .tab-wrapper > .discord-wrapper > .discord-text { + margin: 0.75vw 0; + text-align: center; + width: 70%; + } + .tab-wrapper > .discord-wrapper > .discord-text > .bold-text { + font-weight: 600; + } + .tab-wrapper > .discord-wrapper > .discord-text > .small-text { + font-size: 0.6vw; + opacity: 0.8; + margin-top: 0.2vw; + } + + .tab-wrapper > .discord-wrapper > .visit-discord-btn { + border-radius: 6vw; + color: var(--black-color); + background-color: var(--white-color); + + width: fit-content; + padding: 0.2vw 0.8vw; + font-size: 0.7vw; + font-weight: 600; + } + /** TAB WRAPPER - end **/ \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/index.html b/resources/[ps]/ps-realtor/ui/index.html new file mode 100644 index 0000000..937c42c --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + FIVEM + + +
        + + + diff --git a/resources/[ps]/ps-realtor/ui/package-lock.json b/resources/[ps]/ps-realtor/ui/package-lock.json new file mode 100644 index 0000000..e92cc8e --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/package-lock.json @@ -0,0 +1,3322 @@ +{ + "name": "would_you_rather", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "would_you_rather", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "1.0.0-next.49", + "@tsconfig/svelte": "^3.0.0", + "autoprefixer": "^10.4.7", + "postcss": "^8.4.14", + "svelte": ">=3.49.0", + "svelte-check": "^2.7.2", + "svelte-preprocess": "^4.10.7", + "tailwindcss": "^3.1.2", + "tslib": "^2.4.0", + "typescript": "^4.7.3", + "vite": ">=2.9.16" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "1.0.0-next.49", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", + "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", + "kleur": "^4.1.4", + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" + }, + "engines": { + "node": "^14.13.1 || >= 16" + }, + "peerDependencies": { + "diff-match-patch": "^1.0.5", + "svelte": "^3.44.0", + "vite": "^2.9.0" + }, + "peerDependenciesMeta": { + "diff-match-patch": { + "optional": true + } + } + }, + "node_modules/@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/@types/sass": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==", + "deprecated": "This is a stub types definition. sass provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "sass": "*" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.500", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", + "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/immutable": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", + "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "2.77.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", + "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sass": { + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + }, + "bin": { + "sorcery": "bin/index.js" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "3.59.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz", + "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz", + "integrity": "sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.24.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": ">=3.19.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 9.11.2" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.16.tgz", + "integrity": "sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": ">=2.59.0 <2.78.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + } + }, + "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, + "@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "dev": true, + "optional": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@sveltejs/vite-plugin-svelte": { + "version": "1.0.0-next.49", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", + "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", + "kleur": "^4.1.4", + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" + } + }, + "@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", + "dev": true + }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "@types/sass": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==", + "dev": true, + "requires": { + "sass": "*" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "requires": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.500", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", + "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", + "dev": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "requires": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": 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 + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "immutable": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", + "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "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==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "dev": true + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, + "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 + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true + }, + "postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.77.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", + "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "sass": { + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svelte": { + "version": "3.59.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz", + "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==", + "dev": true + }, + "svelte-check": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz", + "integrity": "sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + } + }, + "svelte-hmr": { + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", + "dev": true, + "requires": {} + }, + "svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "requires": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vite": { + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.16.tgz", + "integrity": "sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==", + "dev": true, + "requires": { + "esbuild": "^0.14.27", + "fsevents": "~2.3.2", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": ">=2.59.0 <2.78.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true + } + } +} diff --git a/resources/[ps]/ps-realtor/ui/package.json b/resources/[ps]/ps-realtor/ui/package.json new file mode 100644 index 0000000..759393b --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/package.json @@ -0,0 +1,24 @@ +{ + "name": "would_you_rather", + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "1.0.0-next.49", + "@tsconfig/svelte": "^3.0.0", + "autoprefixer": "^10.4.7", + "postcss": "^8.4.14", + "svelte": ">=3.49.0", + "svelte-check": "^2.7.2", + "svelte-preprocess": "^4.10.7", + "tailwindcss": "^3.1.2", + "tslib": "^2.4.0", + "typescript": "^4.7.3", + "vite": ">=2.9.16" + } +} diff --git a/resources/[ps]/ps-realtor/ui/pnpm-lock.yaml b/resources/[ps]/ps-realtor/ui/pnpm-lock.yaml new file mode 100644 index 0000000..373c70e --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/pnpm-lock.yaml @@ -0,0 +1,1176 @@ +lockfileVersion: '6.0' + +devDependencies: + '@sveltejs/vite-plugin-svelte': + specifier: 1.0.0-next.49 + version: 1.0.0-next.49(svelte@3.49.0)(vite@2.9.16) + '@tsconfig/svelte': + specifier: ^3.0.0 + version: 3.0.0 + autoprefixer: + specifier: ^10.4.7 + version: 10.4.7(postcss@8.4.14) + postcss: + specifier: ^8.4.14 + version: 8.4.14 + svelte: + specifier: '>=3.49.0' + version: 3.49.0 + svelte-check: + specifier: ^2.7.2 + version: 2.7.2(postcss@8.4.14)(svelte@3.49.0) + svelte-preprocess: + specifier: ^4.10.7 + version: 4.10.7(postcss@8.4.14)(svelte@3.49.0)(typescript@4.7.3) + tailwindcss: + specifier: ^3.1.2 + version: 3.1.2(postcss@8.4.14) + tslib: + specifier: ^2.4.0 + version: 2.4.0 + typescript: + specifier: ^4.7.3 + version: 4.7.3 + vite: + specifier: '>=2.9.16' + version: 2.9.16 + +packages: + + /@esbuild/linux-loong64@0.14.54: + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@sveltejs/vite-plugin-svelte@1.0.0-next.49(svelte@3.49.0)(vite@2.9.16): + resolution: {integrity: sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==} + engines: {node: ^14.13.1 || >= 16} + peerDependencies: + diff-match-patch: ^1.0.5 + svelte: ^3.44.0 + vite: ^2.9.0 + peerDependenciesMeta: + diff-match-patch: + optional: true + dependencies: + '@rollup/pluginutils': 4.2.1 + debug: 4.3.4 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.26.7 + svelte: 3.49.0 + svelte-hmr: 0.14.12(svelte@3.49.0) + vite: 2.9.16 + transitivePeerDependencies: + - supports-color + dev: true + + /@tsconfig/svelte@3.0.0: + resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==} + dev: true + + /@types/pug@2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /@types/sass@1.45.0: + resolution: {integrity: sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==} + deprecated: This is a stub types definition. sass provides its own type definitions, so you do not need this installed. + dependencies: + sass: 1.66.1 + dev: true + + /acorn-node@1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /autoprefixer@10.4.7(postcss@8.4.14): + resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001522 + fraction.js: 4.2.1 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001522 + electron-to-chromium: 1.4.500 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite@1.0.30001522: + resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: true + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detective@5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + acorn-node: 1.8.2 + defined: 1.0.1 + minimist: 1.2.8 + dev: true + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /electron-to-chromium@1.4.500: + resolution: {integrity: sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==} + dev: true + + /es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + + /esbuild-android-64@0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64@0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64@0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64@0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64@0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64@0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32@0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64@0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64@0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm@0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le@0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le@0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64@0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x@0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64@0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64@0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64@0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32@0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64@0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64@0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild@0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fraction.js@4.2.1: + resolution: {integrity: sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /immutable@4.3.3: + resolution: {integrity: sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-import@14.1.0(postcss@8.4.14): + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + dev: true + + /postcss-js@4.0.1(postcss@8.4.14): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.14 + dev: true + + /postcss-load-config@3.1.4(postcss@8.4.14): + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.14 + yaml: 1.10.2 + dev: true + + /postcss-nested@5.0.6(postcss@8.4.14): + resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.14 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@2.77.3: + resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /sander@0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.11 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /sass@1.66.1: + resolution: {integrity: sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.3 + source-map-js: 1.0.2 + dev: true + + /sorcery@0.10.0: + resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} + hasBin: true + dependencies: + buffer-crc32: 0.2.13 + minimist: 1.2.8 + sander: 0.5.1 + sourcemap-codec: 1.4.8 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-check@2.7.2(postcss@8.4.14)(svelte@3.49.0): + resolution: {integrity: sha512-TuVX4YtXHbRM8sVuK5Jk+mKWdm3f0d6hvAC6qCTp8yUszGZewpEBCo2V5fRWZCiz+0J4OCiDHOS+DFMxv39rJA==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + chokidar: 3.5.3 + fast-glob: 3.3.1 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 3.49.0 + svelte-preprocess: 4.10.7(postcss@8.4.14)(svelte@3.49.0)(typescript@4.7.3) + typescript: 4.7.3 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr@0.14.12(svelte@3.49.0): + resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.49.0 + dev: true + + /svelte-preprocess@4.10.7(postcss@8.4.14)(svelte@3.49.0)(typescript@4.7.3): + resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} + engines: {node: '>= 9.11.2'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + '@types/sass': 1.45.0 + detect-indent: 6.1.0 + magic-string: 0.25.9 + postcss: 8.4.14 + sorcery: 0.10.0 + strip-indent: 3.0.0 + svelte: 3.49.0 + typescript: 4.7.3 + dev: true + + /svelte@3.49.0: + resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==} + engines: {node: '>= 8'} + dev: true + + /tailwindcss@3.1.2(postcss@8.4.14): + resolution: {integrity: sha512-yJ6L5s1U5AeS5g7HHy212zdQfjwD426FBfm59pet/JsyneuZuD4C2W7PpJEg4ppisiB21uLqtNagv8KXury3+Q==} + engines: {node: '>=12.13.0'} + hasBin: true + peerDependencies: + postcss: ^8.0.9 + dependencies: + arg: 5.0.2 + chokidar: 3.5.3 + color-name: 1.1.4 + detective: 5.2.1 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + lilconfig: 2.1.0 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.14 + postcss-import: 14.1.0(postcss@8.4.14) + postcss-js: 4.0.1(postcss@8.4.14) + postcss-load-config: 3.1.4(postcss@8.4.14) + postcss-nested: 5.0.6(postcss@8.4.14) + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.4 + transitivePeerDependencies: + - ts-node + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: true + + /typescript@4.7.3: + resolution: {integrity: sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /vite@2.9.16: + resolution: {integrity: sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==} + engines: {node: '>=12.2.0'} + hasBin: true + peerDependencies: + less: '*' + sass: '*' + stylus: '*' + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + dependencies: + esbuild: 0.14.54 + postcss: 8.4.14 + resolve: 1.22.4 + rollup: 2.77.3 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true diff --git a/resources/[ps]/ps-realtor/ui/postcss.config.js b/resources/[ps]/ps-realtor/ui/postcss.config.js new file mode 100644 index 0000000..d175d1e --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/postcss.config.js @@ -0,0 +1,7 @@ +import tailwind from 'tailwindcss'; +import autoprefixer from 'autoprefixer'; +import tailwindConfig from './tailwind.config.cjs'; + +export default { + plugins: [tailwind(tailwindConfig), autoprefixer], +} diff --git a/resources/[ps]/ps-realtor/ui/public/images/House.png b/resources/[ps]/ps-realtor/ui/public/images/House.png new file mode 100644 index 0000000..c375a84 Binary files /dev/null and b/resources/[ps]/ps-realtor/ui/public/images/House.png differ diff --git a/resources/[ps]/ps-realtor/ui/public/images/apt-card-img.png b/resources/[ps]/ps-realtor/ui/public/images/apt-card-img.png new file mode 100644 index 0000000..12e3fbb Binary files /dev/null and b/resources/[ps]/ps-realtor/ui/public/images/apt-card-img.png differ diff --git a/resources/[ps]/ps-realtor/ui/public/images/apts-bg.png b/resources/[ps]/ps-realtor/ui/public/images/apts-bg.png new file mode 100644 index 0000000..6279d23 Binary files /dev/null and b/resources/[ps]/ps-realtor/ui/public/images/apts-bg.png differ diff --git a/resources/[ps]/ps-realtor/ui/public/images/discord-emoji.png b/resources/[ps]/ps-realtor/ui/public/images/discord-emoji.png new file mode 100644 index 0000000..7cb3366 Binary files /dev/null and b/resources/[ps]/ps-realtor/ui/public/images/discord-emoji.png differ diff --git a/resources/[ps]/ps-realtor/ui/public/images/property-card-img.png b/resources/[ps]/ps-realtor/ui/public/images/property-card-img.png new file mode 100644 index 0000000..8fc8400 Binary files /dev/null and b/resources/[ps]/ps-realtor/ui/public/images/property-card-img.png differ diff --git a/resources/[ps]/ps-realtor/ui/public/images/user-location-pin.png b/resources/[ps]/ps-realtor/ui/public/images/user-location-pin.png new file mode 100644 index 0000000..bf84e18 Binary files /dev/null and b/resources/[ps]/ps-realtor/ui/public/images/user-location-pin.png differ diff --git a/resources/[ps]/ps-realtor/ui/src/App.svelte b/resources/[ps]/ps-realtor/ui/src/App.svelte new file mode 100644 index 0000000..fd3caab --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/App.svelte @@ -0,0 +1,27 @@ + + + + + + + {#if $TEMP_HIDE} +
        +

        Tryk E for at bekræfte

        +

        Tryk H for at annullere

        +
        + {/if} +
        + + + +{#if $browserMode} + +{/if} diff --git a/resources/[ps]/ps-realtor/ui/src/Tailwind.css b/resources/[ps]/ps-realtor/ui/src/Tailwind.css new file mode 100644 index 0000000..3019e1c --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/Tailwind.css @@ -0,0 +1,79 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +* { + margin: 0; + padding: 0; + font-family: 'Satoshi', sans-serif; + color: #fff; + -webkit-user-drag: none; +} + +*:focus { + outline: none; +} + +button:hover { + filter: brightness(1.1); +} + +:root { + font-size: 62.5%; + --color-primary: #131313; + --color-secondary: #1f2528; + --color-tertiary: #26343a; + --color-accent: #00889E; +} + +html, body { +height: 100vh; +width: 100vw; +font-size: 1.6rem; +overflow: hidden; +} + +::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +.scroll-style-horizontal::-webkit-scrollbar { + height: 0.5rem; + width: 100%; +} + +.scroll-style-vertical::-webkit-scrollbar { + width: 0.5rem; + height: 100%; +} + +.scroll-style::-webkit-scrollbar-track { + background: whtie; +} + +.scroll-style::-webkit-scrollbar-thumb { + background: var(--color-accent); + border-radius: 1rem; +} + +input#slider[type='range'] { + height: 1rem; + -webkit-appearance: none; + width: 100%; +} + +input#slider[type='range']::-webkit-slider-runnable-track { + width: 100%; + height: 2rem; + cursor: pointer; + background: var(--color-secondary); +} + +input#slider[type='range']::-webkit-slider-thumb { + height: 2rem; + width: 2rem; + background: white; + cursor: pointer; + -webkit-appearance: none; +} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/src/components/ApartmentCard.svelte b/resources/[ps]/ps-realtor/ui/src/components/ApartmentCard.svelte new file mode 100644 index 0000000..d9ea24d --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/components/ApartmentCard.svelte @@ -0,0 +1,44 @@ + + + + + diff --git a/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal.svelte b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal.svelte new file mode 100644 index 0000000..ec7acb4 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal.svelte @@ -0,0 +1,54 @@ + + +{#if selectedApartment !== null} +
        +
        +

        +

        + Lejlighedsinformation +

        + +

        + +

        + {selectedApartment.apartmentData.label} +

        + +
        +
        + + + + + +
        + +
        +
        +
        +{/if} diff --git a/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/CurrentTenants.svelte b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/CurrentTenants.svelte new file mode 100644 index 0000000..fe259b1 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/CurrentTenants.svelte @@ -0,0 +1,54 @@ + + +
        +

        Nuværrende lejere

        + + + +
        + + {#each tenantsResult as tenant} +
        +

        {tenant}

        +
        + {/each} +
        +
        diff --git a/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/EditOptions.svelte b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/EditOptions.svelte new file mode 100644 index 0000000..d37574f --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/EditOptions.svelte @@ -0,0 +1,46 @@ + + + + +{#if selectedApartment !== null} +
        +

        Tilføj ny lejer

        +
        + + +
        + {#if areYouSure} +

        Er du sikker?

        +
        + + +
        + {/if} +
        +{/if} \ No newline at end of file diff --git a/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/Information.svelte b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/Information.svelte new file mode 100644 index 0000000..73cd210 --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/components/ApartmentModal/Information.svelte @@ -0,0 +1,21 @@ + + +{#if selectedApartment} +
        + +
        +{/if} diff --git a/resources/[ps]/ps-realtor/ui/src/components/Apartments.svelte b/resources/[ps]/ps-realtor/ui/src/components/Apartments.svelte new file mode 100644 index 0000000..582bf9f --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/components/Apartments.svelte @@ -0,0 +1,27 @@ + + +{#if selectedApartment} + +{/if} +{#key $APARTMENTS} +
        + +
        + {#each $APARTMENTS as apartment, i} + + {/each} +
        +
        +{/key} diff --git a/resources/[ps]/ps-realtor/ui/src/components/CreateCard.svelte b/resources/[ps]/ps-realtor/ui/src/components/CreateCard.svelte new file mode 100644 index 0000000..054a65e --- /dev/null +++ b/resources/[ps]/ps-realtor/ui/src/components/CreateCard.svelte @@ -0,0 +1,139 @@ + + +
        + + +
        +

        Beskrivelse

        +